@utoo/web 1.5.4 → 1.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/loaderWorkerInline.js +1 -1
- package/esm/threadWorkerInline.js +1 -1
- package/esm/utoo/index.js +23 -23
- package/esm/utoo/index_bg.wasm +0 -0
- package/esm/workerInline.js +1 -1
- package/package.json +1 -1
package/esm/workerInline.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default "data:application/javascript;base64,LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgd29ya2VySW5saW5lLmpzLkxJQ0VOU0UudHh0ICovCiFmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LGZhY3Rvcnkpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sZmFjdG9yeSk7ZWxzZXt2YXIgYT1mYWN0b3J5KCk7Zm9yKHZhciBpIGluIGEpKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnJvb3QpW2ldPWFbaV19fShzZWxmLCgpPT4oKCk9PnsidXNlIHN0cmljdCI7dmFyIF9fd2VicGFja19tb2R1bGVzX189eyIuL3NyYy91dG9vL2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHtBeTooKT0+X193YmdfaW5pdCxGczooKT0+RnMsSDI6KCk9PkJ1aWxkT3B0aW9ucyxMbzooKT0+Z2V0V2FzbU1vZHVsZSxNTTooKT0+UHJvamVjdCxNaDooKT0+Z2V0V2FzbU1lbW9yeSxuMjooKT0+cmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIsekQ6KCk9PmluaXRMb2dGaWx0ZXJ9KTtjbGFzcyBCdWlsZE9wdGlvbnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19idWlsZG9wdGlvbnNfZnJlZShwdHIsMCl9Z2V0IGNvbmZpZygpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uYnVpbGRvcHRpb25zX2NvbmZpZyh0aGlzLl9fd2JnX3B0cikpfWNvbnN0cnVjdG9yKCl7Y29uc3QgcmV0PXdhc20uYnVpbGRvcHRpb25zX25ldygpO3JldHVybiB0aGlzLl9fd2JnX3B0cj1yZXQ+Pj4wLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9c2V0IGNvbmZpZyh2YWwpe3dhc20uYnVpbGRvcHRpb25zX3NldF9jb25maWcodGhpcy5fX3diZ19wdHIsYWRkSGVhcE9iamVjdCh2YWwpKX1nZXQgY2xlYW51cCgpe3JldHVybiAwIT09d2FzbS5fX3diZ19nZXRfYnVpbGRvcHRpb25zX2NsZWFudXAodGhpcy5fX3diZ19wdHIpfXNldCBjbGVhbnVwKGFyZzApe3dhc20uX193Ymdfc2V0X2J1aWxkb3B0aW9uc19jbGVhbnVwKHRoaXMuX193YmdfcHRyLGFyZzApfX1TeW1ib2wuZGlzcG9zZSYmKEJ1aWxkT3B0aW9ucy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUJ1aWxkT3B0aW9ucy5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2NyZWF0ZXN5bmNhY2Nlc3NoYW5kbGVvcHRpb25zX2ZyZWUocHRyLDApfX1TeW1ib2wuZGlzcG9zZSYmKENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Q3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnMucHJvdG90eXBlLmZyZWUpO2NsYXNzIERpckVudHJ5e3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShEaXJFbnRyeS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixEaXJFbnRyeUZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian10b0pTT04oKXtyZXR1cm57bmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLnR5cGV9fXRvU3RyaW5nKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxEaXJFbnRyeUZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19kaXJlbnRyeV9mcmVlKHB0ciwwKX1nZXQgbmFtZSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X2RpcmVudHJ5X25hbWUocmV0cHRyLHRoaXMuX193YmdfcHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWdldCB0eXBlKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X2RpcmVudHJ5X3R5cGUodGhpcy5fX3diZ19wdHIpO3JldHVybiBfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlW3JldF19c2V0IG5hbWUoYXJnMCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChhcmcwLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uX193Ymdfc2V0X2RpcmVudHJ5X25hbWUodGhpcy5fX3diZ19wdHIscHRyMCxsZW4wKX1zZXQgdHlwZShhcmcwKXt3YXNtLl9fd2JnX3NldF9kaXJlbnRyeV90eXBlKHRoaXMuX193YmdfcHRyLChfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlLmluZGV4T2YoYXJnMCkrMXx8MyktMSl9fWZ1bmN0aW9uIEVSUl9BQk9SVCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0FCT1JUKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfSU5WQUxJRF9TVEFURSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0lOVkFMSURfU1RBVEUocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9LRVlfQUxSRUFEWV9FWElTVFMoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9LRVlfQUxSRUFEWV9FWElTVFMocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9OT1RfQUxMT1dFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX05PVF9BTExPV0VEKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfTk9UX0ZPVU5EKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfTk9UX0ZPVU5EKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRUQoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9LRVlfQUxSRUFEWV9FWElTVFMocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9RVU9UQV9FWENFRURFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX1FVT1RBX0VYQ0VFREVEKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfVFlQRV9NSVNNQVRDSCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX1RZUEVfTUlTTUFUQ0gocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fVN5bWJvbC5kaXNwb3NlJiYoRGlyRW50cnkucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1EaXJFbnRyeS5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgRnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEZzRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2ZzX2ZyZWUocHRyLDApfXN0YXRpYyBjb3B5RmlsZShzcmMsZHN0KXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHNyYyx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGRzdCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX2NvcHlGaWxlKHB0cjAsbGVuMCxwdHIxLGxlbjEpKX1zdGF0aWMgY29weUZpbGVTeW5jKHNyYyxkc3Qpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChzcmMsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU4scHRyMT1wYXNzU3RyaW5nVG9XYXNtMChkc3Qsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jb3B5RmlsZVN5bmMocmV0cHRyLHB0cjAsbGVuMCxwdHIxLGxlbjEpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIGNyZWF0ZURpcihwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19jcmVhdGVEaXIocHRyMCxsZW4wKSl9c3RhdGljIGNyZWF0ZURpckFsbChwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19jcmVhdGVEaXJBbGwocHRyMCxsZW4wKSl9c3RhdGljIGNyZWF0ZURpckFsbFN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jcmVhdGVEaXJBbGxTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIGNyZWF0ZURpclN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jcmVhdGVEaXJTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIG1ldGFkYXRhKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX21ldGFkYXRhKHB0cjAsbGVuMCkpfXN0YXRpYyBtZXRhZGF0YVN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19tZXRhZGF0YVN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzgsITApKXRocm93IHRha2VPYmplY3QocjEpO3JldHVybiBNZXRhZGF0YS5fX3dyYXAocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlYWQocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVhZChwdHIwLGxlbjApKX1zdGF0aWMgcmVhZERpcihwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkRGlyKHB0cjAsbGVuMCkpfXN0YXRpYyByZWFkRGlyU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX3JlYWREaXJTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApLHIyPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis4LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMTIsITApKXRocm93IHRha2VPYmplY3QocjIpO3ZhciB2Mj1nZXRBcnJheUpzVmFsdWVGcm9tV2FzbTAocjAscjEpLnNsaWNlKCk7cmV0dXJuIHdhc20uX193YmluZGdlbl9leHBvcnQ0KHIwLDQqcjEsNCksdjJ9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgcmVhZFN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZWFkU3luYyhyZXRwdHIscHRyMCxsZW4wKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrOCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMSk7cmV0dXJuIHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlYWRUb1N0cmluZyhwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkVG9TdHJpbmcocHRyMCxsZW4wKSl9c3RhdGljIHJlbW92ZURpcihwYXRoLHJlY3Vyc2l2ZSl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVtb3ZlRGlyKHB0cjAsbGVuMCxyZWN1cnNpdmUpKX1zdGF0aWMgcmVtb3ZlRGlyU3luYyhwYXRoLHJlY3Vyc2l2ZSl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZW1vdmVEaXJTeW5jKHJldHB0cixwdHIwLGxlbjAscmVjdXJzaXZlKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIwKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fXN0YXRpYyByZW1vdmVGaWxlKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3JlbW92ZUZpbGUocHRyMCxsZW4wKSl9c3RhdGljIHJlbW92ZUZpbGVTeW5jKHBhdGgpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfcmVtb3ZlRmlsZVN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgd3JpdGUocGF0aCxjb250ZW50KXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc193cml0ZShwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjb250ZW50KSkpfXN0YXRpYyB3cml0ZVN0cmluZyhwYXRoLGNvbnRlbnQpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGNvbnRlbnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc193cml0ZVN0cmluZyhwdHIwLGxlbjAscHRyMSxsZW4xKSl9c3RhdGljIHdyaXRlU3luYyhwYXRoLGNvbnRlbnQpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfd3JpdGVTeW5jKHJldHB0cixwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjb250ZW50KSk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX19U3ltYm9sLmRpc3Bvc2UmJihGcy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUZzLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBNZXRhZGF0YXtzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoTWV0YWRhdGEucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsTWV0YWRhdGFGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9dG9KU09OKCl7cmV0dXJue2ZpbGVfc2l6ZTp0aGlzLmZpbGVfc2l6ZSx0eXBlOnRoaXMudHlwZX19dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyl9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLE1ldGFkYXRhRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX21ldGFkYXRhX2ZyZWUocHRyLDApfWdldCBmaWxlX3NpemUoKXtjb25zdCByZXQ9d2FzbS5fX3diZ19nZXRfbWV0YWRhdGFfZmlsZV9zaXplKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gQmlnSW50LmFzVWludE4oNjQscmV0KX1nZXQgdHlwZSgpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF9tZXRhZGF0YV90eXBlKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gX193YmluZGdlbl9lbnVtX0RpckVudHJ5VHlwZVtyZXRdfXNldCBmaWxlX3NpemUoYXJnMCl7d2FzbS5fX3diZ19zZXRfbWV0YWRhdGFfZmlsZV9zaXplKHRoaXMuX193YmdfcHRyLGFyZzApfXNldCB0eXBlKGFyZzApe3dhc20uX193Ymdfc2V0X21ldGFkYXRhX3R5cGUodGhpcy5fX3diZ19wdHIsKF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGUuaW5kZXhPZihhcmcwKSsxfHwzKS0xKX19U3ltYm9sLmRpc3Bvc2UmJihNZXRhZGF0YS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPU1ldGFkYXRhLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBQcm9qZWN0e19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxQcm9qZWN0RmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3Byb2plY3RfZnJlZShwdHIsMCl9c3RhdGljIGJ1aWxkKG9wdGlvbnMpe19hc3NlcnRDbGFzcyhvcHRpb25zLEJ1aWxkT3B0aW9ucyk7dmFyIHB0cjA9b3B0aW9ucy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfYnVpbGQocHRyMCkpfXN0YXRpYyBnZXQgY3dkKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5wcm9qZWN0X2N3ZChyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19c3RhdGljIGRlcHMocmVnaXN0cnksY29uY3VycmVuY3kpe3ZhciBwdHIwPWlzTGlrZU5vbmUocmVnaXN0cnkpPzA6cGFzc1N0cmluZ1RvV2FzbTAocmVnaXN0cnksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2RlcHMocHRyMCxsZW4wLGlzTGlrZU5vbmUoY29uY3VycmVuY3kpPzQyOTQ5NjcyOTc6Y29uY3VycmVuY3k+Pj4wKSl9c3RhdGljIGVudHJ5cG9pbnRzU3Vic2NyaWJlKGNvbmZpZyxjYWxsYmFjayl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2VudHJ5cG9pbnRzU3Vic2NyaWJlKGFkZEhlYXBPYmplY3QoY29uZmlnKSxhZGRIZWFwT2JqZWN0KGNhbGxiYWNrKSkpfXN0YXRpYyBnemlwKGZpbGVzKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfZ3ppcChhZGRIZWFwT2JqZWN0KGZpbGVzKSkpfXN0YXRpYyBobXJFdmVudHMoaWRlbnRpZmllcixjYWxsYmFjayl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChpZGVudGlmaWVyLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9obXJFdmVudHMocHRyMCxsZW4wLGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKSl9c3RhdGljIGluaXQodGhyZWFkX3VybCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMCh0aHJlYWRfdXJsLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20ucHJvamVjdF9pbml0KHB0cjAsbGVuMCl9c3RhdGljIGluc3RhbGwocGFja2FnZV9sb2NrLG1heF9jb25jdXJyZW50X2Rvd25sb2Fkcyl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYWNrYWdlX2xvY2ssd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2luc3RhbGwocHRyMCxsZW4wLGlzTGlrZU5vbmUobWF4X2NvbmN1cnJlbnRfZG93bmxvYWRzKT80Mjk0OTY3Mjk3Om1heF9jb25jdXJyZW50X2Rvd25sb2Fkcz4+PjApKX1zdGF0aWMgc2V0Q3dkKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLnByb2plY3Rfc2V0Q3dkKHB0cjAsbGVuMCl9c3RhdGljIHNpZ01kNShjb250ZW50KXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3Rfc2lnTWQ1KGFkZEhlYXBPYmplY3QoY29udGVudCkpKX1zdGF0aWMgdXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbl9tcyxjYWxsYmFjayl7d2FzbS5wcm9qZWN0X3VwZGF0ZUluZm9TdWJzY3JpYmUoYWdncmVnYXRpb25fbXMsYWRkSGVhcE9iamVjdChjYWxsYmFjaykpfXN0YXRpYyB3cml0ZUFsbFRvRGlzayhjYWxsYmFjayl7d2FzbS5wcm9qZWN0X3dyaXRlQWxsVG9EaXNrKGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKX19U3ltYm9sLmRpc3Bvc2UmJihQcm9qZWN0LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09UHJvamVjdC5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgUm9vdFRhc2t7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFJvb3RUYXNrLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFJvb3RUYXNrRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxSb290VGFza0ZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19yb290dGFza19mcmVlKHB0ciwwKX19U3ltYm9sLmRpc3Bvc2UmJihSb290VGFzay5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVJvb3RUYXNrLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXYXNtVGFza01lc3NhZ2V7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXYXNtVGFza01lc3NhZ2VGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdhc21UYXNrTWVzc2FnZUZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ193YXNtdGFza21lc3NhZ2VfZnJlZShwdHIsMCl9Z2V0IHRhc2tJZCgpe3JldHVybiB3YXNtLl9fd2JnX2dldF93YXNtdGFza21lc3NhZ2VfdGFza0lkKHRoaXMuX193YmdfcHRyKT4+PjB9c2V0IHRhc2tJZChhcmcwKXt3YXNtLl9fd2JnX3NldF93YXNtdGFza21lc3NhZ2VfdGFza0lkKHRoaXMuX193YmdfcHRyLGFyZzApfWdldCBkYXRhKCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS53YXNtdGFza21lc3NhZ2VfZGF0YSh0aGlzLl9fd2JnX3B0cikpfX1TeW1ib2wuZGlzcG9zZSYmKFdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgV2ViV29ya2VyQ3JlYXRpb257c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFdlYldvcmtlckNyZWF0aW9uLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFdlYldvcmtlckNyZWF0aW9uRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxXZWJXb3JrZXJDcmVhdGlvbkZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9mcmVlKHB0ciwwKX1nZXQgb3B0aW9ucygpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJjcmVhdGlvbl9vcHRpb25zKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gV2ViV29ya2VyT3B0aW9ucy5fX3dyYXAocmV0KX1zZXQgb3B0aW9ucyhhcmcwKXtfYXNzZXJ0Q2xhc3MoYXJnMCxXZWJXb3JrZXJPcHRpb25zKTt2YXIgcHRyMD1hcmcwLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193Ymdfc2V0X3dlYndvcmtlcmNyZWF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIscHRyMCl9fVN5bWJvbC5kaXNwb3NlJiYoV2ViV29ya2VyQ3JlYXRpb24ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1XZWJXb3JrZXJDcmVhdGlvbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgV2ViV29ya2VyT3B0aW9uc3tzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyT3B0aW9ucy5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXZWJXb3JrZXJPcHRpb25zRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxXZWJXb3JrZXJPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcm9wdGlvbnNfZnJlZShwdHIsMCl9Z2V0IGN3ZCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X3dlYndvcmtlcm9wdGlvbnNfY3dkKHJldHB0cix0aGlzLl9fd2JnX3B0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1nZXQgZmlsZW5hbWUoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJvcHRpb25zX2ZpbGVuYW1lKHJldHB0cix0aGlzLl9fd2JnX3B0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1zZXQgY3dkKGFyZzApe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAoYXJnMCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJvcHRpb25zX2N3ZCh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfXNldCBmaWxlbmFtZShhcmcwKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGFyZzAsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5fX3diZ19zZXRfd2Vid29ya2Vyb3B0aW9uc19maWxlbmFtZSh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfX1TeW1ib2wuZGlzcG9zZSYmKFdlYldvcmtlck9wdGlvbnMucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1XZWJXb3JrZXJPcHRpb25zLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXZWJXb3JrZXJUZXJtaW5hdGlvbntzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsV2ViV29ya2VyVGVybWluYXRpb25GaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdlYldvcmtlclRlcm1pbmF0aW9uRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcnRlcm1pbmF0aW9uX2ZyZWUocHRyLDApfWdldCBvcHRpb25zKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X3dlYndvcmtlcnRlcm1pbmF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIpO3JldHVybiBXZWJXb3JrZXJPcHRpb25zLl9fd3JhcChyZXQpfWdldCB3b3JrZXJJZCgpe3JldHVybiB3YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl93b3JrZXJJZCh0aGlzLl9fd2JnX3B0cik+Pj4wfXNldCBvcHRpb25zKGFyZzApe19hc3NlcnRDbGFzcyhhcmcwLFdlYldvcmtlck9wdGlvbnMpO3ZhciBwdHIwPWFyZzAuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VydGVybWluYXRpb25fb3B0aW9ucyh0aGlzLl9fd2JnX3B0cixwdHIwKX1zZXQgd29ya2VySWQoYXJnMCl7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VydGVybWluYXRpb25fd29ya2VySWQodGhpcy5fX3diZ19wdHIsYXJnMCl9fWZ1bmN0aW9uIGdldFdhc21NZW1vcnkoKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmdldFdhc21NZW1vcnkoKSl9ZnVuY3Rpb24gZ2V0V2FzbU1vZHVsZSgpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uZ2V0V2FzbU1vZHVsZSgpKX1mdW5jdGlvbiBpbml0TG9nRmlsdGVyKGZpbHRlcil7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChmaWx0ZXIsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5pbml0TG9nRmlsdGVyKHB0cjAsbGVuMCl9ZnVuY3Rpb24gaW5pdF9wYWNrKCl7d2FzbS5pbml0X3BhY2soKX1mdW5jdGlvbiByZWN2VGFza01lc3NhZ2VJbldvcmtlcih3b3JrZXJfaWQpe3JldHVybiB0YWtlT2JqZWN0KHdhc20ucmVjdlRhc2tNZXNzYWdlSW5Xb3JrZXIod29ya2VyX2lkKSl9ZnVuY3Rpb24gcmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIoY3JlYXRvcix0ZXJtaW5hdG9yKXt3YXNtLnJlZ2lzdGVyV29ya2VyU2NoZWR1bGVyKGFkZEhlYXBPYmplY3QoY3JlYXRvciksYWRkSGVhcE9iamVjdCh0ZXJtaW5hdG9yKSl9ZnVuY3Rpb24gc2VuZFRhc2tNZXNzYWdlKG1lc3NhZ2Upe3JldHVybiB0YWtlT2JqZWN0KHdhc20uc2VuZFRhc2tNZXNzYWdlKGFkZEhlYXBPYmplY3QobWVzc2FnZSkpKX1mdW5jdGlvbiB3YXNtX3RocmVhZF9lbnRyeV9wb2ludChwdHIpe3dhc20ud2FzbV90aHJlYWRfZW50cnlfcG9pbnQocHRyKX1mdW5jdGlvbiB3b3JrZXJDcmVhdGVkKHdvcmtlcl9pZCl7d2FzbS53b3JrZXJDcmVhdGVkKHdvcmtlcl9pZCl9ZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KXtjb25zdCBpbXBvcnQwPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl84YzRlNDNmZTc0NTU5ZDczOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfMGJjODQ4MmM2ZTM1MDhhZTpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZGVidWdTdHJpbmcoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzAwOTVhNzNiOGIxNTZmNzY6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGdldE9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9pc19udWxsX2FjMzRmNTAwMzk5MTc1OWE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIG51bGw9PT1nZXRPYmplY3QoYXJnMCl9LF9fd2JnX19fd2JpbmRnZW5faXNfb2JqZWN0XzVhZThlNTg4MGYyYzFmYmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgdmFsPWdldE9iamVjdChhcmcwKTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHZhbCYmbnVsbCE9PXZhbH0sX193YmdfX193YmluZGdlbl9pc191bmRlZmluZWRfOWU0ZDkyNTM0YzQyZDc3ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gdm9pZCAwPT09Z2V0T2JqZWN0KGFyZzApfSxfX3diZ19fX3diaW5kZ2VuX21lbW9yeV9iZDFmYmNmMjFmYmVmM2M4OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbS5tZW1vcnkpfSxfX3diZ19fX3diaW5kZ2VuX21vZHVsZV9mNmI4MDUyZDc5YzFjYzE2OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbU1vZHVsZSl9LF9fd2JnX19fd2JpbmRnZW5fbnVtYmVyX2dldF84ZmY0MjU1NTE2Y2NhZDNlOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3Qgb2JqPWdldE9iamVjdChhcmcxKSxyZXQ9Im51bWJlciI9PXR5cGVvZiBvYmo/b2JqOnZvaWQgMDtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRGbG9hdDY0KGFyZzArOCxpc0xpa2VOb25lKHJldCk/MDpyZXQsITApLGdldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArMCwhaXNMaWtlTm9uZShyZXQpLCEwKX0sX193YmdfX193YmluZGdlbl9yZXRocm93XzA1NTI1YzU2N2YxNTQ0NzI6ZnVuY3Rpb24oYXJnMCl7dGhyb3cgdGFrZU9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0XzcyZmI2OTYyMDJjNTY3Mjk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBvYmo9Z2V0T2JqZWN0KGFyZzEpLHJldD0ic3RyaW5nIj09dHlwZW9mIG9iaj9vYmo6dm9pZCAwO3ZhciBwdHIxPWlzTGlrZU5vbmUocmV0KT8wOnBhc3NTdHJpbmdUb1dhc20wKHJldCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX3Rocm93X2JlMjg5ZDUwMzRlZDI3MWI6ZnVuY3Rpb24oYXJnMCxhcmcxKXt0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpfSxfX3diZ19fd2JnX2NiX3VucmVmX2Q5Yjg3ZmY3OTgyZTNiMjE6ZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLl93YmdfY2JfdW5yZWYoKX0sX193YmdfYWJvcnRfMmYwNTg0ZTAzZThlMzk1MDpmdW5jdGlvbihhcmcwKXtnZXRPYmplY3QoYXJnMCkuYWJvcnQoKX0sX193YmdfYWJvcnRfZDU0OWI5MmQzYzY2NWRlMTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5hYm9ydChnZXRPYmplY3QoYXJnMSkpfSxfX3diZ19hcHBlbmRfYTk5MmNjYzM3YWE2MmRjNDpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe2dldE9iamVjdChhcmcwKS5hcHBlbmQoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpfSxhcmd1bWVudHMpfSxfX3diZ19hcnJheUJ1ZmZlcl8wNWNlMWFmMjNlOTA2NGU4OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5hcnJheUJ1ZmZlcigpKX0sX193YmdfYXJyYXlCdWZmZXJfYmI1NDA3NjE2NjAwNmMzOTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuYXJyYXlCdWZmZXIoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2FzeW5jXzc5ZjJhNjFmOWQwYjMxY2Y6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGdldE9iamVjdChhcmcwKS5hc3luY30sX193YmdfYnVmZmVyXzdiNWY1M2U0NjU1N2Q4ZjE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmJ1ZmZlcil9LF9fd2JnX2NhbGxfMzg5ZWZlMjg0MzVhOTM4ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19jYWxsXzQ3MDhlMGMxM2JkYzhlOTU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfY2hhbmdlZEhhbmRsZV8xMjM2OTZlYWVhZmYzMmQ3OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHJldD1nZXRPYmplY3QoYXJnMCkuY2hhbmdlZEhhbmRsZTtyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19jbGVhclRpbWVvdXRfN2E0MmI0OTc4NGFlYTY0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChjbGVhclRpbWVvdXQodGFrZU9iamVjdChhcmcwKSkpfSxfX3diZ19jbG9zZV80YmEzMTIyNTNjNDI0MzQyOmZ1bmN0aW9uKGFyZzApe2dldE9iamVjdChhcmcwKS5jbG9zZSgpfSxfX3diZ19jbG9zZV84M2ZiODA5YWNhM2RlN2Y5OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jbG9zZSgpKX0sX193YmdfY3JlYXRlT2JqZWN0VVJMXzkxODE4NWRiNmExMGEwYzg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBwdHIxPXBhc3NTdHJpbmdUb1dhc20wKFVSTC5jcmVhdGVPYmplY3RVUkwoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxhcmd1bWVudHMpfSxfX3diZ19jcmVhdGVXcml0YWJsZV84MGJjNWRlMzc0NDQ4YjQyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jcmVhdGVXcml0YWJsZSgpKX0sX193YmdfZGF0YV81MzMwZGE1MDMxMmQwYmMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5kYXRhKX0sX193YmdfZGVidWdfNDZhOTM5OTVmYzZmODgyMDpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLmRlYnVnKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2RlYnVnX2E0MDk5ZmExMmRiNmNkNjE6ZnVuY3Rpb24oYXJnMCl7Y29uc29sZS5kZWJ1ZyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19kaXJlbnRyeV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRGlyRW50cnkuX193cmFwKGFyZzApKX0sX193YmdfZG9uZV81N2IzOWVjZDlhZGRmZTgxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuZG9uZX0sX193YmdfZW50cmllc18wNGE0Yjk4MjM1MWE3MTdmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5lbnRyaWVzKCkpfSxfX3diZ19lcnJvcl83NTM0YjhlOWEzNmYxYWI0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7bGV0IGRlZmVycmVkMF8wLGRlZmVycmVkMF8xO3RyeXtkZWZlcnJlZDBfMD1hcmcwLGRlZmVycmVkMF8xPWFyZzEsY29uc29sZS5lcnJvcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDBfMCxkZWZlcnJlZDBfMSwxKX19LF9fd2JnX2Vycm9yXzc5NGQwZmZjOWQwMGQ1YzM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5lcnJvcihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSxnZXRPYmplY3QoYXJnMykpfSxfX3diZ19lcnJvcl85YTdmZTNmOTMyMDM0Y2RlOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuZXJyb3IoZ2V0T2JqZWN0KGFyZzApKX0sX193YmdfZXZhbF8zZjBiOWYwY2JhZjQ1YTM0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcmV0PWV2YWwoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpO3JldHVybiBhZGRIZWFwT2JqZWN0KHJldCl9LGFyZ3VtZW50cyl9LF9fd2JnX2ZldGNoXzc0YTNlODRlYmQyYzlhMGU6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZmV0Y2goZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX2ZldGNoX2FmYjZhNGI2Y2FjZjg3NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZmV0Y2goZ2V0T2JqZWN0KGFyZzEpKSl9LF9fd2JnX2ZsdXNoXzIyYjc4NTA2MDU5MmNhNWY6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLmZsdXNoKCl9LGFyZ3VtZW50cyl9LF9fd2JnX2Zyb21fYmRkZDY0ZTdkNWZmNjk0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5mcm9tKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19nZXREaXJlY3RvcnlIYW5kbGVfODdjZThjYTUzY2Y0ZDhkYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5SGFuZGxlKGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19nZXREaXJlY3RvcnlfYjY2YWUzZTc5ZjkwMjk4MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5KCkpfSxfX3diZ19nZXRGaWxlSGFuZGxlX2ZmNGFiOTE3YjQ1YWZmYjM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmdldEZpbGVIYW5kbGUoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKSl9LF9fd2JnX2dldEZpbGVfMTE1MzU0ZmM5NTBlZGM4ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RmlsZSgpKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzgwNTc4YjJmZjJhMDkzYmE6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGdldE9iamVjdChhcmcwKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2dldF85Yjk0ZDczZTYyMjFmNzVjOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApW2FyZzE+Pj4wXSl9LF9fd2JnX2dldF9iM2VkM2FkNGJlMmJjOGFjOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUmVmbGVjdC5nZXQoZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19oYXNfZDRlNTMyMzg5NjZjMTJiNjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBSZWZsZWN0LmhhcyhnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfaGVhZGVyc181OWEyOTM4ZGI5ZjgwOTg1OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5oZWFkZXJzKX0sX193YmdfaW5mb18xNDhkMDQzODQwNTgyMDEyOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuaW5mbyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19pbmZvXzllNjAyY2YxMGM1YzY5MGI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5pbmZvKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2luc3RhbmNlb2ZfRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVfMTUwNmIzZDAxNzc5OWQ0ODpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9Eb21FeGNlcHRpb25fOTljMTc3MTkzZTU1NGI3NTpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBET01FeGNlcHRpb259Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZV81NmExNjcwMzlkNjE0NTQ4OmZ1bmN0aW9uKGFyZzApe2xldCByZXN1bHQ7dHJ5e3Jlc3VsdD1nZXRPYmplY3QoYXJnMClpbnN0YW5jZW9mIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGV9Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfUmVzcG9uc2VfZWUxZDU0ZDc5YWU0MTk3NzpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBSZXNwb25zZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzliOTA3NTkzNWM3NDcwN2M6ZnVuY3Rpb24oYXJnMCl7bGV0IHJlc3VsdDt0cnl7cmVzdWx0PWdldE9iamVjdChhcmcwKWluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaXNBcnJheV9kMzE0YmI5OGZjZjA4MzMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdChhcmcwKSl9LF9fd2JnX2l0ZXJhdG9yXzZmZjY1NjBjYTE1NjhlNTU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChTeW1ib2wuaXRlcmF0b3IpfSxfX3diZ19raW5kXzkwNzY5ZDZjMTZmYWVhZmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS5raW5kO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUhhbmRsZUtpbmQuaW5kZXhPZihyZXQpKzF8fDMpLTF9LF9fd2JnX2xlbmd0aF8zMmVkOWEyNzlhY2QwNTRjOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubGVuZ3RofSxfX3diZ19sZW5ndGhfMzVhN2JhY2U0MGYzNmVhYzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmxlbmd0aH0sX193YmdfbWVzc2FnZV8wYjJiMDI5OGEyMzFiMGQ0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubWVzc2FnZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19tZXRhZGF0YV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoTWV0YWRhdGEuX193cmFwKGFyZzApKX0sX193YmdfbmFtZV8yNDI3NTNlNTExMGNkNzU2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubmFtZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19uYXZpZ2F0b3JfNDQ3ODkzMWYzMmViY2E1NzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmF2aWdhdG9yKX0sX193YmdfbmV3XzM2MTMwOGIyMzU2Y2VjZDA6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgT2JqZWN0KX0sX193YmdfbmV3XzNlYjM2YWUyNDFmZTZmNDQ6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQXJyYXkpfSxfX3diZ19uZXdfNGY4ZjNjMTIzZTQ3NDM1ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBXb3JrZXIoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3XzY0Mjg0YmQ0ODdmOWQyMzk6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgSGVhZGVycyl9LGFyZ3VtZW50cyl9LF9fd2JnX25ld183MmM2MjdiYTgwZGUxYzIxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBJbnQzMkFycmF5KGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19uZXdfOGE2ZjIzOGE2ZWNlODZlYTpmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBFcnJvcil9LF9fd2JnX25ld184ZWM1ODAxYjM5ZDZmODYyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBGaWxlU3lzdGVtT2JzZXJ2ZXIoZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX25ld19iNWQ5ZTJmYjM4OWZlZjkxOmZ1bmN0aW9uKGFyZzAsYXJnMSl7dHJ5e3ZhciBzdGF0ZTA9e2E6YXJnMCxiOmFyZzF9O2NvbnN0IHJldD1uZXcgUHJvbWlzZSgoYXJnMCxhcmcxKT0+e2NvbnN0IGE9c3RhdGUwLmE7c3RhdGUwLmE9MDt0cnl7cmV0dXJuIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8zNzE0KGEsc3RhdGUwLmIsYXJnMCxhcmcxKX1maW5hbGx5e3N0YXRlMC5hPWF9fSk7cmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KX1maW5hbGx5e3N0YXRlMC5hPXN0YXRlMC5iPTB9fSxfX3diZ19uZXdfYjk0OWU3ZjU2MTUwYTVkMTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBBYm9ydENvbnRyb2xsZXIpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfZGQyYjY4MGM4YmY2YWUyOTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgVWludDhBcnJheShnZXRPYmplY3QoYXJnMCkpKX0sX193YmdfbmV3X2Zyb21fc2xpY2VfYTNkMjYyOWRjMTgyNjc4NDpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBVaW50OEFycmF5KGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxfX3diZ19uZXdfbm9fYXJnc18xYzdjODQyZjA4ZDAwZWJiOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEZ1bmN0aW9uKGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpKSl9LF9fd2JnX25ld193aXRoX2xlbmd0aF9hMmMzOWNiZTg4ZmQ4ZmYxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBVaW50OEFycmF5KGFyZzA+Pj4wKSl9LF9fd2JnX25ld193aXRoX29wdGlvbnNfMTQ1YWZiYTkyMmFkMzcwMzpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IFdvcmtlcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3X3dpdGhfc3RyX2FuZF9pbml0X2E2MWNiYzZiZGVmMjE2MTQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBSZXF1ZXN0KGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfd2l0aF9zdHJfc2VxdWVuY2VfY2VhMmMwNTcxZDZkYzZhYjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQmxvYihnZXRPYmplY3QoYXJnMCkpKX0sYXJndW1lbnRzKX0sX193YmdfbmV4dF8wYTVlMGY4YWY5ODE0NmFhOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5uZXh0KCkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXh0XzM0ODJmNTRjNDllOGFmMTk6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm5leHQoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25leHRfNDE4ZjgwZDhmNTMwMzIzMzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmV4dCl9LF9fd2JnX25vd18wZGM0OTIwYTQ3Y2Y3MjgwOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubm93KCl9LF9fd2JnX25vd19hM2FmOWEyZjRiYmFhNGQxOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LF9fd2JnX29ic2VydmVfMzIyMzViNWU2MTk1ZDRhYjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm9ic2VydmUoZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ19vZl9kZGMwOTQyYjBkY2UxNmExOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5vZihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ19wYXJzZV83MDg0NjFhMWZlZGRmYjM4OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoSlNPTi5wYXJzZShnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19wZXJmb3JtYW5jZV82YWRjM2I4OTllNDQ4YTIzOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5wZXJmb3JtYW5jZSl9LF9fd2JnX3Bvc3RNZXNzYWdlXzIwNDFmNGU5MGFmNjEzMTg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucG9zdE1lc3NhZ2UoZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfcG9zdE1lc3NhZ2VfNzcxZWYzMjkzYTI4YmJhYzpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5wb3N0TWVzc2FnZShnZXRPYmplY3QoYXJnMSkpfSxhcmd1bWVudHMpfSxfX3diZ19wcm90b3R5cGVzZXRjYWxsX2JkY2RjYzU4NDJlNGQ3N2Q6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe1VpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpfSxfX3diZ19wdXNoXzhmZmRjYjIwNjMzNDBiYTU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLnB1c2goZ2V0T2JqZWN0KGFyZzEpKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfMGFhMGE5MjdmNzhmNWQ5ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucXVldWVNaWNyb3Rhc2spfSxfX3diZ19xdWV1ZU1pY3JvdGFza181YmI1MzY5ODJmNzhhNTZmOmZ1bmN0aW9uKGFyZzApe3F1ZXVlTWljcm90YXNrKGdldE9iamVjdChhcmcwKSl9LF9fd2JnX3JhbmRvbV85MTIyODRkYmY2MzZmMjY5OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9LF9fd2JnX3JlbGF0aXZlUGF0aENvbXBvbmVudHNfYmM0ODI0MDNjYjZkN2VhOTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucmVsYXRpdmVQYXRoQ29tcG9uZW50cyl9LF9fd2JnX3JlbW92ZUVudHJ5X2M0ZWZmZmRkMzE4YjUxYTE6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnJlbW92ZUVudHJ5KGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19yZXNvbHZlXzAwMmM0YjdkOWQ4ZjZiNjQ6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUHJvbWlzZS5yZXNvbHZlKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19yb290dGFza19uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUm9vdFRhc2suX193cmFwKGFyZzApKX0sX193Ymdfc2V0VGltZW91dF82MzAwODYxMzY0NGIwN2FmOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2V0VGltZW91dChnZXRPYmplY3QoYXJnMSksYXJnMikpfSxhcmd1bWVudHMpfSxfX3diZ19zZXRUaW1lb3V0XzdiYjM0Mjk2NjJhYjFlNzA6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChzZXRUaW1lb3V0KGdldE9iamVjdChhcmcwKSxhcmcxKSl9LF9fd2JnX3NldF9hdF9lNDUzY2YzZjRiZTllMmQ5OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmF0PWFyZzF9LF9fd2JnX3NldF9ib2R5XzlhN2UwMGFmZTNjZmUyNDQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuYm9keT1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF9jYWNoZV8zMTVhM2VkNzczYTQxNTQzOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmNhY2hlPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q2FjaGVbYXJnMV19LF9fd2JnX3NldF9jcmVhdGVfMWY5MDJjNTkzNmFkZGU3ZDpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVhdGU9MCE9PWFyZzF9LF9fd2JnX3NldF9jcmVhdGVfYzk1ZGRjYTAxOGZhYzljZTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVhdGU9MCE9PWFyZzF9LF9fd2JnX3NldF9jcmVkZW50aWFsc19jNGE1OGQyZTA1ZWYyNGZiOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmNyZWRlbnRpYWxzPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q3JlZGVudGlhbHNbYXJnMV19LF9fd2JnX3NldF9mNDNlNTc3YWVhOTQ0NjViOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtnZXRPYmplY3QoYXJnMClbYXJnMT4+PjBdPXRha2VPYmplY3QoYXJnMil9LF9fd2JnX3NldF9oZWFkZXJzX2NmYzVmNGIyYzFmMjA1NDk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuaGVhZGVycz1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF9tZXRob2RfYzNlMjAzNzVmNWFlN2ZhYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApLm1ldGhvZD1nZXRTdHJpbmdGcm9tV2FzbTAoYXJnMSxhcmcyKX0sX193Ymdfc2V0X21vZGVfYjEzNjQyYzMxMjY0ODIwMjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5tb2RlPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0TW9kZVthcmcxXX0sX193Ymdfc2V0X25hbWVfNDliOWVjYmE3ZjU4ZjJlNTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApLm5hbWU9Z2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMil9LF9fd2JnX3NldF9vbm1lc3NhZ2VfNmVkNDEwNTBlNGE1Y2VlMjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5vbm1lc3NhZ2U9Z2V0T2JqZWN0KGFyZzEpfSxfX3diZ19zZXRfcmVjdXJzaXZlXzY1ZWQwN2RmODkyYjQ4ODU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucmVjdXJzaXZlPTAhPT1hcmcxfSxfX3diZ19zZXRfcmVjdXJzaXZlX2Y1ZDM0MTYwOTgzMjgxMTA6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucmVjdXJzaXZlPTAhPT1hcmcxfSxfX3diZ19zZXRfc2lnbmFsX2YyZDNmODU5OTI0ODg5NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuc2lnbmFsPWdldE9iamVjdChhcmcxKX0sX193Ymdfc2V0X3R5cGVfZTEyN2YyNmI3OGQ3OGJmYzpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS50eXBlPV9fd2JpbmRnZW5fZW51bV9Xb3JrZXJUeXBlW2FyZzFdfSxfX3diZ19zaWduYWxfZDEyODVlY2FiNGViYzVhZDpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2lnbmFsKX0sX193Ymdfc2l6ZV9lMDVkMzFjYzYwNDk4MTVmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuc2l6ZX0sX193Ymdfc2xpY2VfNTY2YTE1ZjMyMTRmYTUyZTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5zbGljZShhcmcxLGFyZzIsZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpKX0sYXJndW1lbnRzKX0sX193Ymdfc3RhY2tfMGVkNzVkNjg1NzViMGYzYzpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZ2V0T2JqZWN0KGFyZzEpLnN0YWNrLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO2dldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArNCxsZW4xLCEwKSxnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzAscHRyMSwhMCl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfMTI4MzcxNjdhZDkzNTExNjpmdW5jdGlvbigpe2NvbnN0IHJldD12b2lkIDA9PT1fX3dlYnBhY2tfcmVxdWlyZV9fLmc/bnVsbDpfX3dlYnBhY2tfcmVxdWlyZV9fLmc7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTX2U2MjhlODlhYjNiMWM5NWY6ZnVuY3Rpb24oKXtjb25zdCByZXQ9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzP251bGw6Z2xvYmFsVGhpcztyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfU0VMRl9hNjIxZDNkZmJiNjBkMGNlOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj9udWxsOnNlbGY7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV19mODcyN2YwY2Y4ODhlMGJkOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93P251bGw6d2luZG93O3JldHVybiBpc0xpa2VOb25lKHJldCk/MDphZGRIZWFwT2JqZWN0KHJldCl9LF9fd2JnX3N0YXR1c184OWQ3ZTgwM2RiOTExZWU3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuc3RhdHVzfSxfX3diZ19zdG9yYWdlX2MwMDJiNTNiYzQ4ODMyOTk6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnN0b3JhZ2UpfSxfX3diZ19zdHJpbmdpZnlfOGQxY2M2ZmYzODNlOGJhZTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChKU09OLnN0cmluZ2lmeShnZXRPYmplY3QoYXJnMCkpKX0sYXJndW1lbnRzKX0sX193Ymdfc3ViYXJyYXlfYTk2ZTFmZWYxN2VkMjNjYjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnN1YmFycmF5KGFyZzE+Pj4wLGFyZzI+Pj4wKSl9LF9fd2JnX3RoZW5fMGQ5ZmUyYzdiMTg1N2QzMjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnRoZW4oZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ190aGVuX2I5ZTdiM2I1ZjFhOWUxYjU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudGhlbihnZXRPYmplY3QoYXJnMSkpKX0sX193YmdfdG9TdHJpbmdfOTY0ZmY3ZmU2ZWNhODM2MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudG9TdHJpbmcoKSl9LF9fd2JnX3RydW5jYXRlX2RjNjYxZmRjYjAwNjJmYTc6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkudHJ1bmNhdGUoYXJnMT4+PjApfSxhcmd1bWVudHMpfSxfX3diZ190eXBlXzAzZGZlNDYyMTczNWU1Mjg6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS50eXBlO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUNoYW5nZVJlY29yZFR5cGUuaW5kZXhPZihyZXQpKzF8fDcpLTF9LF9fd2JnX3VybF9jNDg0YzI2YjFmYmY1MTI2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkudXJsLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO2dldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArNCxsZW4xLCEwKSxnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzAscHRyMSwhMCl9LF9fd2JnX3ZhbHVlXzA1NDYyNTViNDE1ZTk2YzE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnZhbHVlKX0sX193YmdfdmFsdWVfZmU2ZWUzNGFmNWRjM2RjZTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudmFsdWUpfSxfX3diZ193YWl0QXN5bmNfYTU4YjIxMzRiZmYzOWMzZTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoQXRvbWljcy53YWl0QXN5bmMoZ2V0T2JqZWN0KGFyZzApLGFyZzE+Pj4wLGFyZzIpKX0sX193Ymdfd2FpdEFzeW5jX2MwYTM5YTdkMzMxOGQ5MWU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBdG9taWNzLndhaXRBc3luYyl9LF9fd2JnX3dhcm5fYTQwYjk3MTQ2N2IyMTljNzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLndhcm4oZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMiksZ2V0T2JqZWN0KGFyZzMpKX0sX193Ymdfd2Fybl9mN2FlMWIyZTY2Y2NiOTMwOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUud2FybihnZXRPYmplY3QoYXJnMCkpfSxfX3diZ193YXNtdGFza21lc3NhZ2VfbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdhc21UYXNrTWVzc2FnZS5fX3dyYXAoYXJnMCkpfSxfX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoV2ViV29ya2VyQ3JlYXRpb24uX193cmFwKGFyZzApKX0sX193Ymdfd2Vid29ya2VydGVybWluYXRpb25fbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdlYldvcmtlclRlcm1pbmF0aW9uLl9fd3JhcChhcmcwKSl9LF9fd2JnX3dyaXRlXzJkNTkzMzdjYzQ5NjkxOWQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGdldE9iamVjdChhcmcwKS53cml0ZShnZXRBcnJheVU4RnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKX0sYXJndW1lbnRzKX0sX193Ymdfd3JpdGVfMzdmNWE2MmEyNGRhNjYyZjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS53cml0ZShnZXRPYmplY3QoYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDE6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlQ2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTYxLF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MDgxNikpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMjpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VNdXRDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MTA1NSxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkxOTApKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDM6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkyMDQsX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzcwOTg4KSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5MjA0LF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MDk4OCkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNTpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VNdXRDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8xOTIwNCxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzEwMjQpKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDY6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkyMDQsX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5MTkwKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGFyZzApfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwODpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDk6ZnVuY3Rpb24oYXJnMCxhcmcxKXt2YXIgdjA9Z2V0QXJyYXlKc1ZhbHVlRnJvbVdhc20wKGFyZzAsYXJnMSkuc2xpY2UoKTt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChhcmcwLDQqYXJnMSw0KTtyZXR1cm4gYWRkSGVhcE9iamVjdCh2MCl9LF9fd2JpbmRnZW5fbGlua18wYjFmNzZkMjM1ZmQyYjg2OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHZhbD0ib25tZXNzYWdlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgbGV0IFtpYSwgaW5kZXgsIHZhbHVlXSA9IGV2LmRhdGE7XG4gICAgICAgICAgICAgICAgaWEgPSBuZXcgSW50MzJBcnJheShpYS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBBdG9taWNzLndhaXQoaWEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAiLHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAodm9pZCAwPT09VVJMLmNyZWF0ZU9iamVjdFVSTD8iZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCIrZW5jb2RlVVJJQ29tcG9uZW50KHZhbCk6VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdmFsXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWY6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApKX0sX193YmluZGdlbl9vYmplY3RfZHJvcF9yZWY6ZnVuY3Rpb24oYXJnMCl7dGFrZU9iamVjdChhcmcwKX0sbWVtb3J5Om1lbW9yeXx8bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDoxMDI1LG1heGltdW06NjU1MzYsc2hhcmVkOiEwfSl9O3JldHVybntfX3Byb3RvX186bnVsbCwiLi9pbmRleF9iZy5qcyI6aW1wb3J0MH19ZnVuY3Rpb24gX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5MTkwKGFyZzAsYXJnMSl7d2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkxOTAoYXJnMCxhcmcxKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzA4MTYoYXJnMCxhcmcxLGFyZzIpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzcwODE2KGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzA5ODgoYXJnMCxhcmcxLGFyZzIpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzcwOTg4KGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzEwMjQoYXJnMCxhcmcxLGFyZzIpe3RyeXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MTAyNChhcmcwLGFyZzEsYWRkQm9ycm93ZWRPYmplY3QoYXJnMikpfWZpbmFsbHl7aGVhcFtzdGFja19wb2ludGVyKytdPXZvaWQgMH19ZnVuY3Rpb24gX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzM3MTQoYXJnMCxhcmcxLGFyZzIsYXJnMyl7d2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMzcxNChhcmcwLGFyZzEsYWRkSGVhcE9iamVjdChhcmcyKSxhZGRIZWFwT2JqZWN0KGFyZzMpKX1TeW1ib2wuZGlzcG9zZSYmKFdlYldvcmtlclRlcm1pbmF0aW9uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09V2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlLmZyZWUpO2NvbnN0IF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGU9WyJmaWxlIiwiZGlyZWN0b3J5Il0sX193YmluZGdlbl9lbnVtX0ZpbGVTeXN0ZW1DaGFuZ2VSZWNvcmRUeXBlPVsiYXBwZWFyZWQiLCJkaXNhcHBlYXJlZCIsImVycm9yZWQiLCJtb2RpZmllZCIsIm1vdmVkIiwidW5rbm93biJdLF9fd2JpbmRnZW5fZW51bV9GaWxlU3lzdGVtSGFuZGxlS2luZD1bImZpbGUiLCJkaXJlY3RvcnkiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdENhY2hlPVsiZGVmYXVsdCIsIm5vLXN0b3JlIiwicmVsb2FkIiwibm8tY2FjaGUiLCJmb3JjZS1jYWNoZSIsIm9ubHktaWYtY2FjaGVkIl0sX193YmluZGdlbl9lbnVtX1JlcXVlc3RDcmVkZW50aWFscz1bIm9taXQiLCJzYW1lLW9yaWdpbiIsImluY2x1ZGUiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdE1vZGU9WyJzYW1lLW9yaWdpbiIsIm5vLWNvcnMiLCJjb3JzIiwibmF2aWdhdGUiXSxfX3diaW5kZ2VuX2VudW1fV29ya2VyVHlwZT1bImNsYXNzaWMiLCJtb2R1bGUiXSxCdWlsZE9wdGlvbnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2J1aWxkb3B0aW9uc19mcmVlKHB0cj4+PjAsMSkpLENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19jcmVhdGVzeW5jYWNjZXNzaGFuZGxlb3B0aW9uc19mcmVlKHB0cj4+PjAsMSkpLERpckVudHJ5RmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19kaXJlbnRyeV9mcmVlKHB0cj4+PjAsMSkpLEZzRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19mc19mcmVlKHB0cj4+PjAsMSkpLE1ldGFkYXRhRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19tZXRhZGF0YV9mcmVlKHB0cj4+PjAsMSkpLFByb2plY3RGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3Byb2plY3RfZnJlZShwdHI+Pj4wLDEpKSxSb290VGFza0ZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfcm9vdHRhc2tfZnJlZShwdHI+Pj4wLDEpKSxXYXNtVGFza01lc3NhZ2VGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3dhc210YXNrbWVzc2FnZV9mcmVlKHB0cj4+PjAsMSkpLFdlYldvcmtlckNyZWF0aW9uRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9mcmVlKHB0cj4+PjAsMSkpLFdlYldvcmtlck9wdGlvbnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3dlYndvcmtlcm9wdGlvbnNfZnJlZShwdHI+Pj4wLDEpKSxXZWJXb3JrZXJUZXJtaW5hdGlvbkZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfd2Vid29ya2VydGVybWluYXRpb25fZnJlZShwdHI+Pj4wLDEpKTtmdW5jdGlvbiBhZGRIZWFwT2JqZWN0KG9iail7aGVhcF9uZXh0PT09aGVhcC5sZW5ndGgmJmhlYXAucHVzaChoZWFwLmxlbmd0aCsxKTtjb25zdCBpZHg9aGVhcF9uZXh0O3JldHVybiBoZWFwX25leHQ9aGVhcFtpZHhdLGhlYXBbaWR4XT1vYmosaWR4fWZ1bmN0aW9uIF9hc3NlcnRDbGFzcyhpbnN0YW5jZSxrbGFzcyl7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIGtsYXNzKSl0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGluc3RhbmNlIG9mICR7a2xhc3MubmFtZX1gKX1mdW5jdGlvbiBhZGRCb3Jyb3dlZE9iamVjdChvYmope2lmKDE9PXN0YWNrX3BvaW50ZXIpdGhyb3cgbmV3IEVycm9yKCJvdXQgb2YganMgc3RhY2siKTtyZXR1cm4gaGVhcFstLXN0YWNrX3BvaW50ZXJdPW9iaixzdGFja19wb2ludGVyfWNvbnN0IENMT1NVUkVfRFRPUlM9InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoc3RhdGU9PnN0YXRlLmR0b3Ioc3RhdGUuYSxzdGF0ZS5iKSk7ZnVuY3Rpb24gZGVidWdTdHJpbmcodmFsKXtjb25zdCB0eXBlPXR5cGVvZiB2YWw7aWYoIm51bWJlciI9PXR5cGV8fCJib29sZWFuIj09dHlwZXx8bnVsbD09dmFsKXJldHVybmAke3ZhbH1gO2lmKCJzdHJpbmciPT10eXBlKXJldHVybmAiJHt2YWx9ImA7aWYoInN5bWJvbCI9PXR5cGUpe2NvbnN0IGRlc2NyaXB0aW9uPXZhbC5kZXNjcmlwdGlvbjtyZXR1cm4gbnVsbD09ZGVzY3JpcHRpb24/IlN5bWJvbCI6YFN5bWJvbCgke2Rlc2NyaXB0aW9ufSlgfWlmKCJmdW5jdGlvbiI9PXR5cGUpe2NvbnN0IG5hbWU9dmFsLm5hbWU7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuYW1lJiZuYW1lLmxlbmd0aD4wP2BGdW5jdGlvbigke25hbWV9KWA6IkZ1bmN0aW9uIn1pZihBcnJheS5pc0FycmF5KHZhbCkpe2NvbnN0IGxlbmd0aD12YWwubGVuZ3RoO2xldCBkZWJ1Zz0iWyI7bGVuZ3RoPjAmJihkZWJ1Zys9ZGVidWdTdHJpbmcodmFsWzBdKSk7Zm9yKGxldCBpPTE7aTxsZW5ndGg7aSsrKWRlYnVnKz0iLCAiK2RlYnVnU3RyaW5nKHZhbFtpXSk7cmV0dXJuIGRlYnVnKz0iXSIsZGVidWd9Y29uc3QgYnVpbHRJbk1hdGNoZXM9L1xbb2JqZWN0IChbXlxdXSspXF0vLmV4ZWModG9TdHJpbmcuY2FsbCh2YWwpKTtsZXQgY2xhc3NOYW1lO2lmKCEoYnVpbHRJbk1hdGNoZXMmJmJ1aWx0SW5NYXRjaGVzLmxlbmd0aD4xKSlyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpO2lmKGNsYXNzTmFtZT1idWlsdEluTWF0Y2hlc1sxXSwiT2JqZWN0Ij09Y2xhc3NOYW1lKXRyeXtyZXR1cm4iT2JqZWN0KCIrSlNPTi5zdHJpbmdpZnkodmFsKSsiKSJ9Y2F0Y2goXyl7cmV0dXJuIk9iamVjdCJ9cmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yP2Ake3ZhbC5uYW1lfTogJHt2YWwubWVzc2FnZX1cbiR7dmFsLnN0YWNrfWA6Y2xhc3NOYW1lfWZ1bmN0aW9uIGRyb3BPYmplY3QoaWR4KXtpZHg8MTMyfHwoaGVhcFtpZHhdPWhlYXBfbmV4dCxoZWFwX25leHQ9aWR4KX1mdW5jdGlvbiBnZXRBcnJheUpzVmFsdWVGcm9tV2FzbTAocHRyLGxlbil7cHRyPj4+PTA7Y29uc3QgbWVtPWdldERhdGFWaWV3TWVtb3J5MCgpLHJlc3VsdD1bXTtmb3IobGV0IGk9cHRyO2k8cHRyKzQqbGVuO2krPTQpcmVzdWx0LnB1c2godGFrZU9iamVjdChtZW0uZ2V0VWludDMyKGksITApKSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRBcnJheVU4RnJvbVdhc20wKHB0cixsZW4pe3JldHVybiBwdHI+Pj49MCxnZXRVaW50OEFycmF5TWVtb3J5MCgpLnN1YmFycmF5KHB0ci8xLHB0ci8xK2xlbil9bGV0IGNhY2hlZERhdGFWaWV3TWVtb3J5MD1udWxsO2Z1bmN0aW9uIGdldERhdGFWaWV3TWVtb3J5MCgpe3JldHVybiBudWxsIT09Y2FjaGVkRGF0YVZpZXdNZW1vcnkwJiZjYWNoZWREYXRhVmlld01lbW9yeTAuYnVmZmVyPT09d2FzbS5tZW1vcnkuYnVmZmVyfHwoY2FjaGVkRGF0YVZpZXdNZW1vcnkwPW5ldyBEYXRhVmlldyh3YXNtLm1lbW9yeS5idWZmZXIpKSxjYWNoZWREYXRhVmlld01lbW9yeTB9ZnVuY3Rpb24gZ2V0U3RyaW5nRnJvbVdhc20wKHB0cixsZW4pe3JldHVybiBkZWNvZGVUZXh0KHB0cj4+Pj0wLGxlbil9bGV0IGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwPW51bGw7ZnVuY3Rpb24gZ2V0VWludDhBcnJheU1lbW9yeTAoKXtyZXR1cm4gbnVsbCE9PWNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwJiZjYWNoZWRVaW50OEFycmF5TWVtb3J5MC5idWZmZXI9PT13YXNtLm1lbW9yeS5idWZmZXJ8fChjYWNoZWRVaW50OEFycmF5TWVtb3J5MD1uZXcgVWludDhBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpKSxjYWNoZWRVaW50OEFycmF5TWVtb3J5MH1mdW5jdGlvbiBnZXRPYmplY3QoaWR4KXtyZXR1cm4gaGVhcFtpZHhdfWZ1bmN0aW9uIGhhbmRsZUVycm9yKGYsYXJncyl7dHJ5e3JldHVybiBmLmFwcGx5KHRoaXMsYXJncyl9Y2F0Y2goZSl7d2FzbS5fX3diaW5kZ2VuX2V4cG9ydDMoYWRkSGVhcE9iamVjdChlKSl9fWxldCBoZWFwPW5ldyBBcnJheSgxMjgpLmZpbGwodm9pZCAwKTtoZWFwLnB1c2godm9pZCAwLG51bGwsITAsITEpO2xldCBoZWFwX25leHQ9aGVhcC5sZW5ndGg7ZnVuY3Rpb24gaXNMaWtlTm9uZSh4KXtyZXR1cm4gbnVsbD09eH1mdW5jdGlvbiBtYWtlQ2xvc3VyZShhcmcwLGFyZzEsZHRvcixmKXtjb25zdCBzdGF0ZT17YTphcmcwLGI6YXJnMSxjbnQ6MSxkdG9yfSxyZWFsPSguLi5hcmdzKT0+e3N0YXRlLmNudCsrO3RyeXtyZXR1cm4gZihzdGF0ZS5hLHN0YXRlLmIsLi4uYXJncyl9ZmluYWxseXtyZWFsLl93YmdfY2JfdW5yZWYoKX19O3JldHVybiByZWFsLl93YmdfY2JfdW5yZWY9KCk9PnswPT09LS1zdGF0ZS5jbnQmJihzdGF0ZS5kdG9yKHN0YXRlLmEsc3RhdGUuYiksc3RhdGUuYT0wLENMT1NVUkVfRFRPUlMudW5yZWdpc3RlcihzdGF0ZSkpfSxDTE9TVVJFX0RUT1JTLnJlZ2lzdGVyKHJlYWwsc3RhdGUsc3RhdGUpLHJlYWx9ZnVuY3Rpb24gbWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLGR0b3IsZil7Y29uc3Qgc3RhdGU9e2E6YXJnMCxiOmFyZzEsY250OjEsZHRvcn0scmVhbD0oLi4uYXJncyk9PntzdGF0ZS5jbnQrKztjb25zdCBhPXN0YXRlLmE7c3RhdGUuYT0wO3RyeXtyZXR1cm4gZihhLHN0YXRlLmIsLi4uYXJncyl9ZmluYWxseXtzdGF0ZS5hPWEscmVhbC5fd2JnX2NiX3VucmVmKCl9fTtyZXR1cm4gcmVhbC5fd2JnX2NiX3VucmVmPSgpPT57MD09PS0tc3RhdGUuY250JiYoc3RhdGUuZHRvcihzdGF0ZS5hLHN0YXRlLmIpLHN0YXRlLmE9MCxDTE9TVVJFX0RUT1JTLnVucmVnaXN0ZXIoc3RhdGUpKX0sQ0xPU1VSRV9EVE9SUy5yZWdpc3RlcihyZWFsLHN0YXRlLHN0YXRlKSxyZWFsfWZ1bmN0aW9uIHBhc3NTdHJpbmdUb1dhc20wKGFyZyxtYWxsb2MscmVhbGxvYyl7aWYodm9pZCAwPT09cmVhbGxvYyl7Y29uc3QgYnVmPWNhY2hlZFRleHRFbmNvZGVyLmVuY29kZShhcmcpLHB0cj1tYWxsb2MoYnVmLmxlbmd0aCwxKT4+PjA7cmV0dXJuIGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyLHB0citidWYubGVuZ3RoKS5zZXQoYnVmKSxXQVNNX1ZFQ1RPUl9MRU49YnVmLmxlbmd0aCxwdHJ9bGV0IGxlbj1hcmcubGVuZ3RoLHB0cj1tYWxsb2MobGVuLDEpPj4+MDtjb25zdCBtZW09Z2V0VWludDhBcnJheU1lbW9yeTAoKTtsZXQgb2Zmc2V0PTA7Zm9yKDtvZmZzZXQ8bGVuO29mZnNldCsrKXtjb25zdCBjb2RlPWFyZy5jaGFyQ29kZUF0KG9mZnNldCk7aWYoY29kZT4xMjcpYnJlYWs7bWVtW3B0citvZmZzZXRdPWNvZGV9aWYob2Zmc2V0IT09bGVuKXswIT09b2Zmc2V0JiYoYXJnPWFyZy5zbGljZShvZmZzZXQpKSxwdHI9cmVhbGxvYyhwdHIsbGVuLGxlbj1vZmZzZXQrMyphcmcubGVuZ3RoLDEpPj4+MDtjb25zdCB2aWV3PWdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyK29mZnNldCxwdHIrbGVuKTtvZmZzZXQrPWNhY2hlZFRleHRFbmNvZGVyLmVuY29kZUludG8oYXJnLHZpZXcpLndyaXR0ZW4scHRyPXJlYWxsb2MocHRyLGxlbixvZmZzZXQsMSk+Pj4wfXJldHVybiBXQVNNX1ZFQ1RPUl9MRU49b2Zmc2V0LHB0cn1sZXQgc3RhY2tfcG9pbnRlcj0xMjg7ZnVuY3Rpb24gdGFrZU9iamVjdChpZHgpe2NvbnN0IHJldD1nZXRPYmplY3QoaWR4KTtyZXR1cm4gZHJvcE9iamVjdChpZHgpLHJldH1sZXQgY2FjaGVkVGV4dERlY29kZXI9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSk6dm9pZCAwO2NhY2hlZFRleHREZWNvZGVyJiZjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoKTtjb25zdCBNQVhfU0FGQVJJX0RFQ09ERV9CWVRFUz0yMTQ2NDM1MDcyO2xldCBudW1CeXRlc0RlY29kZWQ9MDtmdW5jdGlvbiBkZWNvZGVUZXh0KHB0cixsZW4pe3JldHVybiBudW1CeXRlc0RlY29kZWQrPWxlbixudW1CeXRlc0RlY29kZWQ+PU1BWF9TQUZBUklfREVDT0RFX0JZVEVTJiYoY2FjaGVkVGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMCxmYXRhbDohMH0pLGNhY2hlZFRleHREZWNvZGVyLmRlY29kZSgpLG51bUJ5dGVzRGVjb2RlZD1sZW4pLGNhY2hlZFRleHREZWNvZGVyLmRlY29kZShnZXRVaW50OEFycmF5TWVtb3J5MCgpLnNsaWNlKHB0cixwdHIrbGVuKSl9Y29uc3QgY2FjaGVkVGV4dEVuY29kZXI9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RW5jb2Rlcj9uZXcgVGV4dEVuY29kZXI6dm9pZCAwO2NhY2hlZFRleHRFbmNvZGVyJiYoY2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlSW50bz1mdW5jdGlvbihhcmcsdmlldyl7Y29uc3QgYnVmPWNhY2hlZFRleHRFbmNvZGVyLmVuY29kZShhcmcpO3JldHVybiB2aWV3LnNldChidWYpLHtyZWFkOmFyZy5sZW5ndGgsd3JpdHRlbjpidWYubGVuZ3RofX0pO2xldCBXQVNNX1ZFQ1RPUl9MRU49MCx3YXNtTW9kdWxlLHdhc207ZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpe2lmKHdhc209aW5zdGFuY2UuZXhwb3J0cyx3YXNtTW9kdWxlPW1vZHVsZSxjYWNoZWREYXRhVmlld01lbW9yeTA9bnVsbCxjYWNoZWRVaW50OEFycmF5TWVtb3J5MD1udWxsLHZvaWQgMCE9PXRocmVhZF9zdGFja19zaXplJiYoIm51bWJlciIhPXR5cGVvZiB0aHJlYWRfc3RhY2tfc2l6ZXx8MD09PXRocmVhZF9zdGFja19zaXplfHx0aHJlYWRfc3RhY2tfc2l6ZSU2NTUzNiE9MCkpdGhyb3ciaW52YWxpZCBzdGFjayBzaXplIjtyZXR1cm4gd2FzbS5fX3diaW5kZ2VuX3N0YXJ0KHRocmVhZF9zdGFja19zaXplKSx3YXNtfWFzeW5jIGZ1bmN0aW9uIF9fd2JnX2xvYWQobW9kdWxlLGltcG9ydHMpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBSZXNwb25zZSYmbW9kdWxlIGluc3RhbmNlb2YgUmVzcG9uc2Upe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyl0cnl7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKG1vZHVsZSxpbXBvcnRzKX1jYXRjaChlKXtpZighKG1vZHVsZS5vayYmZnVuY3Rpb24gZXhwZWN0ZWRSZXNwb25zZVR5cGUodHlwZSl7c3dpdGNoKHR5cGUpe2Nhc2UiYmFzaWMiOmNhc2UiY29ycyI6Y2FzZSJkZWZhdWx0IjpyZXR1cm4hMH1yZXR1cm4hMX0obW9kdWxlLnR5cGUpKXx8ImFwcGxpY2F0aW9uL3dhc20iPT09bW9kdWxlLmhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiKSl0aHJvdyBlO2NvbnNvbGUud2FybigiYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nYCBmYWlsZWQgYmVjYXVzZSB5b3VyIHNlcnZlciBkb2VzIG5vdCBzZXJ2ZSBXYXNtIHdpdGggYGFwcGxpY2F0aW9uL3dhc21gIE1JTUUgdHlwZS4gRmFsbGluZyBiYWNrIHRvIGBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZWAgd2hpY2ggaXMgc2xvd2VyLiBPcmlnaW5hbCBlcnJvcjpcbiIsZSl9Y29uc3QgYnl0ZXM9YXdhaXQgbW9kdWxlLmFycmF5QnVmZmVyKCk7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ5dGVzLGltcG9ydHMpfXtjb25zdCBpbnN0YW5jZT1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2R1bGUsaW1wb3J0cyk7cmV0dXJuIGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2U/e2luc3RhbmNlLG1vZHVsZX06aW5zdGFuY2V9fWZ1bmN0aW9uIGluaXRTeW5jKG1vZHVsZSxtZW1vcnkpe2lmKHZvaWQgMCE9PXdhc20pcmV0dXJuIHdhc207bGV0IHRocmVhZF9zdGFja19zaXplO3ZvaWQgMCE9PW1vZHVsZSYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZSxtZW1vcnksdGhyZWFkX3N0YWNrX3NpemV9PW1vZHVsZSk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIGBpbml0U3luYygpYDsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKTtjb25zdCBpbXBvcnRzPV9fd2JnX2dldF9pbXBvcnRzKG1lbW9yeSk7bW9kdWxlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlfHwobW9kdWxlPW5ldyBXZWJBc3NlbWJseS5Nb2R1bGUobW9kdWxlKSk7cmV0dXJuIF9fd2JnX2ZpbmFsaXplX2luaXQobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG1vZHVsZSxpbXBvcnRzKSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpfWFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQobW9kdWxlX29yX3BhdGgsbWVtb3J5KXtpZih2b2lkIDAhPT13YXNtKXJldHVybiB3YXNtO2xldCB0aHJlYWRfc3RhY2tfc2l6ZTt2b2lkIDAhPT1tb2R1bGVfb3JfcGF0aCYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGVfb3JfcGF0aCk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlX29yX3BhdGgsbWVtb3J5LHRocmVhZF9zdGFja19zaXplfT1tb2R1bGVfb3JfcGF0aCk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKSx2b2lkIDA9PT1tb2R1bGVfb3JfcGF0aCYmKG1vZHVsZV9vcl9wYXRoPW5ldyBVUkwoX193ZWJwYWNrX3JlcXVpcmVfXygiLi9zcmMvdXRvby9pbmRleF9iZy53YXNtIiksX193ZWJwYWNrX3JlcXVpcmVfXy5iKSk7Y29uc3QgaW1wb3J0cz1fX3diZ19nZXRfaW1wb3J0cyhtZW1vcnkpOygic3RyaW5nIj09dHlwZW9mIG1vZHVsZV9vcl9wYXRofHwiZnVuY3Rpb24iPT10eXBlb2YgUmVxdWVzdCYmbW9kdWxlX29yX3BhdGggaW5zdGFuY2VvZiBSZXF1ZXN0fHwiZnVuY3Rpb24iPT10eXBlb2YgVVJMJiZtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkmJihtb2R1bGVfb3JfcGF0aD1mZXRjaChtb2R1bGVfb3JfcGF0aCkpO2NvbnN0e2luc3RhbmNlLG1vZHVsZX09YXdhaXQgX193YmdfbG9hZChhd2FpdCBtb2R1bGVfb3JfcGF0aCxpbXBvcnRzKTtyZXR1cm4gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpfX0sIi4vc3JjL3V0b28vaW5kZXhfYmcud2FzbSIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fLnArIjJmNGJlNDdjMDE4YjVlMDM4MDdjLndhc20ifX0sX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpe3ZhciBjYWNoZWRNb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtpZih2b2lkIDAhPT1jYWNoZWRNb2R1bGUpcmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO3ZhciBtb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXT17ZXhwb3J0czp7fX07cmV0dXJuIF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSxtb2R1bGUuZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKSxtb2R1bGUuZXhwb3J0c31fX3dlYnBhY2tfcmVxdWlyZV9fLm09X193ZWJwYWNrX21vZHVsZXNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fLmQ9KGV4cG9ydHMsZGVmaW5pdGlvbik9Pntmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKV9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLGtleSkmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cyxrZXkpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxrZXkse2VudW1lcmFibGU6ITAsZ2V0OmRlZmluaXRpb25ba2V5XX0pfSxfX3dlYnBhY2tfcmVxdWlyZV9fLmc9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaChlKXtpZigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93fX0oKSxfX3dlYnBhY2tfcmVxdWlyZV9fLm89KG9iaixwcm9wKT0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKSwoKCk9Pnt2YXIgc2NyaXB0VXJsO19fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzJiYoc2NyaXB0VXJsPV9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbisiIik7dmFyIGRvY3VtZW50PV9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtpZighc2NyaXB0VXJsJiZkb2N1bWVudCYmKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJiJTQ1JJUFQiPT09ZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkmJihzY3JpcHRVcmw9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLCFzY3JpcHRVcmwpKXt2YXIgc2NyaXB0cz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7aWYoc2NyaXB0cy5sZW5ndGgpZm9yKHZhciBpPXNjcmlwdHMubGVuZ3RoLTE7aT4tMSYmKCFzY3JpcHRVcmx8fCEvXmh0dHAocz8pOi8udGVzdChzY3JpcHRVcmwpKTspc2NyaXB0VXJsPXNjcmlwdHNbaS0tXS5zcmN9aWYoIXNjcmlwdFVybCl0aHJvdyBuZXcgRXJyb3IoIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyIik7c2NyaXB0VXJsPXNjcmlwdFVybC5yZXBsYWNlKC9eYmxvYjovLCIiKS5yZXBsYWNlKC8jLiokLywiIikucmVwbGFjZSgvXD8uKiQvLCIiKS5yZXBsYWNlKC9cL1teXC9dKyQvLCIvIiksX193ZWJwYWNrX3JlcXVpcmVfXy5wPXNjcmlwdFVybH0pKCksX193ZWJwYWNrX3JlcXVpcmVfXy5iPXNlbGYubG9jYXRpb24rIiI7dmFyIF9fd2VicGFja19leHBvcnRzX189e307Y29uc3QgcHJveHlNYXJrZXI9U3ltYm9sKCJDb21saW5rLnByb3h5IiksY3JlYXRlRW5kcG9pbnQ9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50IikscmVsZWFzZVByb3h5PVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxmaW5hbGl6ZXI9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLHRocm93TWFya2VyPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxpc09iamVjdD12YWw9PiJvYmplY3QiPT10eXBlb2YgdmFsJiZudWxsIT09dmFsfHwiZnVuY3Rpb24iPT10eXBlb2YgdmFsLHByb3h5VHJhbnNmZXJIYW5kbGVyPXtjYW5IYW5kbGU6dmFsPT5pc09iamVjdCh2YWwpJiZ2YWxbcHJveHlNYXJrZXJdLHNlcmlhbGl6ZShvYmope2NvbnN0e3BvcnQxLHBvcnQyfT1uZXcgTWVzc2FnZUNoYW5uZWw7cmV0dXJuIGV4cG9zZShvYmoscG9ydDEpLFtwb3J0MixbcG9ydDJdXX0sZGVzZXJpYWxpemU6cG9ydD0+KHBvcnQuc3RhcnQoKSx3cmFwKHBvcnQpKX0sdGhyb3dUcmFuc2ZlckhhbmRsZXI9e2NhbkhhbmRsZTp2YWx1ZT0+aXNPYmplY3QodmFsdWUpJiZ0aHJvd01hcmtlciBpbiB2YWx1ZSxzZXJpYWxpemUoe3ZhbHVlfSl7bGV0IHNlcmlhbGl6ZWQ7cmV0dXJuIHNlcmlhbGl6ZWQ9dmFsdWUgaW5zdGFuY2VvZiBFcnJvcj97aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTp2YWx1ZS5tZXNzYWdlLG5hbWU6dmFsdWUubmFtZSxzdGFjazp2YWx1ZS5zdGFja319Ontpc0Vycm9yOiExLHZhbHVlfSxbc2VyaWFsaXplZCxbXV19LGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQpe2lmKHNlcmlhbGl6ZWQuaXNFcnJvcil0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihzZXJpYWxpemVkLnZhbHVlLm1lc3NhZ2UpLHNlcmlhbGl6ZWQudmFsdWUpO3Rocm93IHNlcmlhbGl6ZWQudmFsdWV9fSx0cmFuc2ZlckhhbmRsZXJzPW5ldyBNYXAoW1sicHJveHkiLHByb3h5VHJhbnNmZXJIYW5kbGVyXSxbInRocm93Iix0aHJvd1RyYW5zZmVySGFuZGxlcl1dKTtmdW5jdGlvbiBpc0FsbG93ZWRPcmlnaW4oYWxsb3dlZE9yaWdpbnMsb3JpZ2luKXtmb3IoY29uc3QgYWxsb3dlZE9yaWdpbiBvZiBhbGxvd2VkT3JpZ2lucyl7aWYob3JpZ2luPT09YWxsb3dlZE9yaWdpbnx8IioiPT09YWxsb3dlZE9yaWdpbilyZXR1cm4hMDtpZihhbGxvd2VkT3JpZ2luIGluc3RhbmNlb2YgUmVnRXhwJiZhbGxvd2VkT3JpZ2luLnRlc3Qob3JpZ2luKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBleHBvc2Uob2JqLGVwPWdsb2JhbFRoaXMsYWxsb3dlZE9yaWdpbnM9WyIqIl0pe2VwLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGNhbGxiYWNrKGV2KXtpZighZXZ8fCFldi5kYXRhKXJldHVybjtpZighaXNBbGxvd2VkT3JpZ2luKGFsbG93ZWRPcmlnaW5zLGV2Lm9yaWdpbikpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtldi5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO2NvbnN0e2lkLHR5cGUscGF0aH09T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0sZXYuZGF0YSksYXJndW1lbnRMaXN0PShldi5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChmcm9tV2lyZVZhbHVlKTtsZXQgcmV0dXJuVmFsdWU7dHJ5e2NvbnN0IHBhcmVudD1wYXRoLnNsaWNlKDAsLTEpLnJlZHVjZSgob2JqLHByb3ApPT5vYmpbcHJvcF0sb2JqKSxyYXdWYWx1ZT1wYXRoLnJlZHVjZSgob2JqLHByb3ApPT5vYmpbcHJvcF0sb2JqKTtzd2l0Y2godHlwZSl7Y2FzZSJHRVQiOnJldHVyblZhbHVlPXJhd1ZhbHVlO2JyZWFrO2Nhc2UiU0VUIjpwYXJlbnRbcGF0aC5zbGljZSgtMSlbMF1dPWZyb21XaXJlVmFsdWUoZXYuZGF0YS52YWx1ZSkscmV0dXJuVmFsdWU9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6cmV0dXJuVmFsdWU9cmF3VmFsdWUuYXBwbHkocGFyZW50LGFyZ3VtZW50TGlzdCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOnJldHVyblZhbHVlPXByb3h5KG5ldyByYXdWYWx1ZSguLi5hcmd1bWVudExpc3QpKTticmVhaztjYXNlIkVORFBPSU5UIjp7Y29uc3R7cG9ydDEscG9ydDJ9PW5ldyBNZXNzYWdlQ2hhbm5lbDtleHBvc2Uob2JqLHBvcnQyKSxyZXR1cm5WYWx1ZT10cmFuc2Zlcihwb3J0MSxbcG9ydDFdKX1icmVhaztjYXNlIlJFTEVBU0UiOnJldHVyblZhbHVlPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2godmFsdWUpe3JldHVyblZhbHVlPXt2YWx1ZSxbdGhyb3dNYXJrZXJdOjB9fVByb21pc2UucmVzb2x2ZShyZXR1cm5WYWx1ZSkuY2F0Y2godmFsdWU9Pih7dmFsdWUsW3Rocm93TWFya2VyXTowfSkpLnRoZW4ocmV0dXJuVmFsdWU9Pntjb25zdFt3aXJlVmFsdWUsdHJhbnNmZXJhYmxlc109dG9XaXJlVmFsdWUocmV0dXJuVmFsdWUpO2VwLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx3aXJlVmFsdWUpLHtpZH0pLHRyYW5zZmVyYWJsZXMpLCJSRUxFQVNFIj09PXR5cGUmJihlcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixjYWxsYmFjayksY2xvc2VFbmRQb2ludChlcCksZmluYWxpemVyIGluIG9iaiYmImZ1bmN0aW9uIj09dHlwZW9mIG9ialtmaW5hbGl6ZXJdJiZvYmpbZmluYWxpemVyXSgpKX0pLmNhdGNoKGVycm9yPT57Y29uc3Rbd2lyZVZhbHVlLHRyYW5zZmVyYWJsZXNdPXRvV2lyZVZhbHVlKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbdGhyb3dNYXJrZXJdOjB9KTtlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sd2lyZVZhbHVlKSx7aWR9KSx0cmFuc2ZlcmFibGVzKX0pfSksZXAuc3RhcnQmJmVwLnN0YXJ0KCl9ZnVuY3Rpb24gaXNNZXNzYWdlUG9ydChlbmRwb2ludCl7cmV0dXJuIk1lc3NhZ2VQb3J0Ij09PWVuZHBvaW50LmNvbnN0cnVjdG9yLm5hbWV9ZnVuY3Rpb24gY2xvc2VFbmRQb2ludChlbmRwb2ludCl7aXNNZXNzYWdlUG9ydChlbmRwb2ludCkmJmVuZHBvaW50LmNsb3NlKCl9ZnVuY3Rpb24gd3JhcChlcCx0YXJnZXQpe2NvbnN0IHBlbmRpbmdMaXN0ZW5lcnM9bmV3IE1hcDtyZXR1cm4gZXAuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShldil7Y29uc3R7ZGF0YX09ZXY7aWYoIWRhdGF8fCFkYXRhLmlkKXJldHVybjtjb25zdCByZXNvbHZlcj1wZW5kaW5nTGlzdGVuZXJzLmdldChkYXRhLmlkKTtpZihyZXNvbHZlcil0cnl7cmVzb2x2ZXIoZGF0YSl9ZmluYWxseXtwZW5kaW5nTGlzdGVuZXJzLmRlbGV0ZShkYXRhLmlkKX19KSxjcmVhdGVQcm94eShlcCxwZW5kaW5nTGlzdGVuZXJzLFtdLHRhcmdldCl9ZnVuY3Rpb24gdGhyb3dJZlByb3h5UmVsZWFzZWQoaXNSZWxlYXNlZCl7aWYoaXNSZWxlYXNlZCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHJlbGVhc2VFbmRwb2ludChlcCl7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsbmV3IE1hcCx7dHlwZToiUkVMRUFTRSJ9KS50aGVuKCgpPT57Y2xvc2VFbmRQb2ludChlcCl9KX1jb25zdCBwcm94eUNvdW50ZXI9bmV3IFdlYWtNYXAscHJveHlGaW5hbGl6ZXJzPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZXA9Pntjb25zdCBuZXdDb3VudD0ocHJveHlDb3VudGVyLmdldChlcCl8fDApLTE7cHJveHlDb3VudGVyLnNldChlcCxuZXdDb3VudCksMD09PW5ld0NvdW50JiZyZWxlYXNlRW5kcG9pbnQoZXApfSk7ZnVuY3Rpb24gcmVnaXN0ZXJQcm94eShwcm94eSxlcCl7Y29uc3QgbmV3Q291bnQ9KHByb3h5Q291bnRlci5nZXQoZXApfHwwKSsxO3Byb3h5Q291bnRlci5zZXQoZXAsbmV3Q291bnQpLHByb3h5RmluYWxpemVycyYmcHJveHlGaW5hbGl6ZXJzLnJlZ2lzdGVyKHByb3h5LGVwLHByb3h5KX1mdW5jdGlvbiB1bnJlZ2lzdGVyUHJveHkocHJveHkpe3Byb3h5RmluYWxpemVycyYmcHJveHlGaW5hbGl6ZXJzLnVucmVnaXN0ZXIocHJveHkpfWZ1bmN0aW9uIGNyZWF0ZVByb3h5KGVwLHBlbmRpbmdMaXN0ZW5lcnMscGF0aD1bXSx0YXJnZXQ9ZnVuY3Rpb24oKXt9KXtsZXQgaXNQcm94eVJlbGVhc2VkPSExO2NvbnN0IHByb3h5PW5ldyBQcm94eSh0YXJnZXQse2dldChfdGFyZ2V0LHByb3Ape2lmKHRocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCkscHJvcD09PXJlbGVhc2VQcm94eSlyZXR1cm4oKT0+e3VucmVnaXN0ZXJQcm94eShwcm94eSkscmVsZWFzZUVuZHBvaW50KGVwKSxwZW5kaW5nTGlzdGVuZXJzLmNsZWFyKCksaXNQcm94eVJlbGVhc2VkPSEwfTtpZigidGhlbiI9PT1wcm9wKXtpZigwPT09cGF0aC5sZW5ndGgpcmV0dXJue3RoZW46KCk9PnByb3h5fTtjb25zdCByPXJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyx7dHlwZToiR0VUIixwYXRoOnBhdGgubWFwKHA9PnAudG9TdHJpbmcoKSl9KS50aGVuKGZyb21XaXJlVmFsdWUpO3JldHVybiByLnRoZW4uYmluZChyKX1yZXR1cm4gY3JlYXRlUHJveHkoZXAscGVuZGluZ0xpc3RlbmVycyxbLi4ucGF0aCxwcm9wXSl9LHNldChfdGFyZ2V0LHByb3AscmF3VmFsdWUpe3Rocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCk7Y29uc3RbdmFsdWUsdHJhbnNmZXJhYmxlc109dG9XaXJlVmFsdWUocmF3VmFsdWUpO3JldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLHBlbmRpbmdMaXN0ZW5lcnMse3R5cGU6IlNFVCIscGF0aDpbLi4ucGF0aCxwcm9wXS5tYXAocD0+cC50b1N0cmluZygpKSx2YWx1ZX0sdHJhbnNmZXJhYmxlcykudGhlbihmcm9tV2lyZVZhbHVlKX0sYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxyYXdBcmd1bWVudExpc3Qpe3Rocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCk7Y29uc3QgbGFzdD1wYXRoW3BhdGgubGVuZ3RoLTFdO2lmKGxhc3Q9PT1jcmVhdGVFbmRwb2ludClyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGZyb21XaXJlVmFsdWUpO2lmKCJiaW5kIj09PWxhc3QpcmV0dXJuIGNyZWF0ZVByb3h5KGVwLHBlbmRpbmdMaXN0ZW5lcnMscGF0aC5zbGljZSgwLC0xKSk7Y29uc3RbYXJndW1lbnRMaXN0LHRyYW5zZmVyYWJsZXNdPXByb2Nlc3NBcmd1bWVudHMocmF3QXJndW1lbnRMaXN0KTtyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLHt0eXBlOiJBUFBMWSIscGF0aDpwYXRoLm1hcChwPT5wLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdH0sdHJhbnNmZXJhYmxlcykudGhlbihmcm9tV2lyZVZhbHVlKX0sY29uc3RydWN0KF90YXJnZXQscmF3QXJndW1lbnRMaXN0KXt0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpO2NvbnN0W2FyZ3VtZW50TGlzdCx0cmFuc2ZlcmFibGVzXT1wcm9jZXNzQXJndW1lbnRzKHJhd0FyZ3VtZW50TGlzdCk7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyx7dHlwZToiQ09OU1RSVUNUIixwYXRoOnBhdGgubWFwKHA9PnAudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0fSx0cmFuc2ZlcmFibGVzKS50aGVuKGZyb21XaXJlVmFsdWUpfX0pO3JldHVybiByZWdpc3RlclByb3h5KHByb3h5LGVwKSxwcm94eX1mdW5jdGlvbiBteUZsYXQoYXJyKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxhcnIpfWZ1bmN0aW9uIHByb2Nlc3NBcmd1bWVudHMoYXJndW1lbnRMaXN0KXtjb25zdCBwcm9jZXNzZWQ9YXJndW1lbnRMaXN0Lm1hcCh0b1dpcmVWYWx1ZSk7cmV0dXJuW3Byb2Nlc3NlZC5tYXAodj0+dlswXSksbXlGbGF0KHByb2Nlc3NlZC5tYXAodj0+dlsxXSkpXX1jb25zdCB0cmFuc2ZlckNhY2hlPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHRyYW5zZmVyKG9iaix0cmFuc2ZlcnMpe3JldHVybiB0cmFuc2ZlckNhY2hlLnNldChvYmosdHJhbnNmZXJzKSxvYmp9ZnVuY3Rpb24gcHJveHkob2JqKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihvYmose1twcm94eU1hcmtlcl06ITB9KX1mdW5jdGlvbiB3aW5kb3dFbmRwb2ludCh3LGNvbnRleHQ9Z2xvYmFsVGhpcyx0YXJnZXRPcmlnaW49IioiKXtyZXR1cm57cG9zdE1lc3NhZ2U6KG1zZyx0cmFuc2ZlcmFibGVzKT0+dy5wb3N0TWVzc2FnZShtc2csdGFyZ2V0T3JpZ2luLHRyYW5zZmVyYWJsZXMpLGFkZEV2ZW50TGlzdGVuZXI6Y29udGV4dC5hZGRFdmVudExpc3RlbmVyLmJpbmQoY29udGV4dCkscmVtb3ZlRXZlbnRMaXN0ZW5lcjpjb250ZXh0LnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChjb250ZXh0KX19ZnVuY3Rpb24gdG9XaXJlVmFsdWUodmFsdWUpe2Zvcihjb25zdFtuYW1lLGhhbmRsZXJdb2YgdHJhbnNmZXJIYW5kbGVycylpZihoYW5kbGVyLmNhbkhhbmRsZSh2YWx1ZSkpe2NvbnN0W3NlcmlhbGl6ZWRWYWx1ZSx0cmFuc2ZlcmFibGVzXT1oYW5kbGVyLnNlcmlhbGl6ZSh2YWx1ZSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lLHZhbHVlOnNlcmlhbGl6ZWRWYWx1ZX0sdHJhbnNmZXJhYmxlc119cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlfSx0cmFuc2ZlckNhY2hlLmdldCh2YWx1ZSl8fFtdXX1mdW5jdGlvbiBmcm9tV2lyZVZhbHVlKHZhbHVlKXtzd2l0Y2godmFsdWUudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gdHJhbnNmZXJIYW5kbGVycy5nZXQodmFsdWUubmFtZSkuZGVzZXJpYWxpemUodmFsdWUudmFsdWUpO2Nhc2UiUkFXIjpyZXR1cm4gdmFsdWUudmFsdWV9fWZ1bmN0aW9uIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyxtc2csdHJhbnNmZXJzKXtyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+e2NvbnN0IGlkPWdlbmVyYXRlVVVJRCgpO3BlbmRpbmdMaXN0ZW5lcnMuc2V0KGlkLHJlc29sdmUpLGVwLnN0YXJ0JiZlcC5zdGFydCgpLGVwLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkfSxtc2cpLHRyYW5zZmVycyl9KX1mdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfXZhciBXb3JrZXJNZXNzYWdlVHlwZTshZnVuY3Rpb24oV29ya2VyTWVzc2FnZVR5cGUpe1dvcmtlck1lc3NhZ2VUeXBlW1dvcmtlck1lc3NhZ2VUeXBlLkluaXRDb25uZWN0aW9uPTE0NjQ2NjQwNjRdPSJJbml0Q29ubmVjdGlvbiIsV29ya2VyTWVzc2FnZVR5cGVbV29ya2VyTWVzc2FnZVR5cGUuUmVxdWVzdEZvcms9MTQ2NDY2NDA2NV09IlJlcXVlc3RGb3JrIn0oV29ya2VyTWVzc2FnZVR5cGV8fChXb3JrZXJNZXNzYWdlVHlwZT17fSkpO2NvbnN0IEhhbmRTaGFrZT1Xb3JrZXJNZXNzYWdlVHlwZS5Jbml0Q29ubmVjdGlvbixGb3JrPVdvcmtlck1lc3NhZ2VUeXBlLlJlcXVlc3RGb3JrO3ZhciBTV01lc3NhZ2VUeXBlOyFmdW5jdGlvbihTV01lc3NhZ2VUeXBlKXtTV01lc3NhZ2VUeXBlW1NXTWVzc2FnZVR5cGUuSGFuZFNoYWtlPTEzOTgyMTA1NjBdPSJIYW5kU2hha2UiLFNXTWVzc2FnZVR5cGVbU1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQaW5nPTEzOTgyMTA1NjFdPSJIZWFydGJlYXRQaW5nIixTV01lc3NhZ2VUeXBlW1NXTWVzc2FnZVR5cGUuSGVhcnRiZWF0UG9uZz0xMzk4MjEwNTYyXT0iSGVhcnRiZWF0UG9uZyJ9KFNXTWVzc2FnZVR5cGV8fChTV01lc3NhZ2VUeXBlPXt9KSk7Y29uc3QgU2VydmljZVdvcmtlckhhbmRTaGFrZT1TV01lc3NhZ2VUeXBlLkhhbmRTaGFrZSxTZXJ2aWNlV29ya2VySGVhcnRiZWF0UGluZz1TV01lc3NhZ2VUeXBlLkhlYXJ0YmVhdFBpbmcsU2VydmljZVdvcmtlckhlYXJ0YmVhdFBvbmc9U1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQb25nO3ZhciB1dG9vPV9fd2VicGFja19yZXF1aXJlX18oIi4vc3JjL3V0b28vaW5kZXguanMiKTtmdW5jdGlvbiBjcmVhdGVXb3JrZXJGcm9tRGF0YVVyaShkYXRhVXJpLG9wdGlvbnMpe2NvbnN0IGlkeD1kYXRhVXJpLmluZGV4T2YoIjtiYXNlNjQsIik7aWYoLTE9PT1pZHgpcmV0dXJuIG5ldyBXb3JrZXIoZGF0YVVyaSxvcHRpb25zKTtjb25zdCBiYXNlNjQ9ZGF0YVVyaS5zbGljZShpZHgrOCksY29kZT1hdG9iKGJhc2U2NCksYmxvYj1uZXcgQmxvYihbY29kZV0se3R5cGU6ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQifSk7cmV0dXJuIG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxvcHRpb25zKX1sZXQgbmV4dFdvcmtlcklkPTA7Y29uc3QgbG9hZGVyV29ya2Vycz17fSxydW5Mb2FkZXJXb3JrZXJQb29sPWFzeW5jKHByb2plY3RDd2QsbG9hZGVyV29ya2VyVXJsLGxvYWRlcnNJbXBvcnRNYXApPT57KDAsdXRvby5uMikoYXN5bmMgY3JlYXRpb249Pntjb25zdHtvcHRpb25zOntmaWxlbmFtZSxjd2R9fT1jcmVhdGlvbjtuZXh0V29ya2VySWQrPTE7Y29uc3Qgd29ya2VySWQ9bmV4dFdvcmtlcklkLHdvcmtlcj1sb2FkZXJXb3JrZXJVcmwuc3RhcnRzV2l0aCgiZGF0YToiKT9jcmVhdGVXb3JrZXJGcm9tRGF0YVVyaShsb2FkZXJXb3JrZXJVcmwse25hbWU6ZmlsZW5hbWV9KTpuZXcgV29ya2VyKGxvYWRlcldvcmtlclVybCx7bmFtZTpmaWxlbmFtZX0pO2xldCBmaW5hbEN3ZD1jd2QsZmluYWxGaWxlbmFtZT1maWxlbmFtZTtpZihwcm9qZWN0Q3dkKXtjb25zdCBzZXA9Ii8iO2xldCBwQ3dkPXByb2plY3RDd2QuZW5kc1dpdGgoc2VwKT9wcm9qZWN0Q3dkLnNsaWNlKDAsLTEpOnByb2plY3RDd2Q7aWYocEN3ZC5zdGFydHNXaXRoKHNlcCl8fChwQ3dkPXNlcCtwQ3dkKSxjd2Quc3RhcnRzV2l0aChzZXApKWZpbmFsQ3dkPWN3ZDtlbHNle2xldCBjQ3dkPWN3ZDsiLiIhPT1jQ3dkJiYiLi8iIT09Y0N3ZHx8KGNDd2Q9IiIpLGZpbmFsQ3dkPWNDd2Q/YCR7cEN3ZH0ke3NlcH0ke2NDd2R9YDpwQ3dkfWlmKGZpbGVuYW1lLnN0YXJ0c1dpdGgoc2VwKSlmaW5hbEZpbGVuYW1lPWZpbGVuYW1lO2Vsc2V7bGV0IGZOYW1lPWZpbGVuYW1lO2ZOYW1lLnN0YXJ0c1dpdGgoIi4vIikmJihmTmFtZT1mTmFtZS5zbGljZSgyKSksZmluYWxGaWxlbmFtZT1gJHtwQ3dkfSR7c2VwfSR7Zk5hbWV9YH19d29ya2VyLnBvc3RNZXNzYWdlKFsoMCx1dG9vLkxvKSgpLCgwLHV0b28uTWgpKCkse3dvcmtlckRhdGE6e2N3ZDpmaW5hbEN3ZCxwcm9qZWN0Um9vdDpwcm9qZWN0Q3dkLHRocmVhZElkOndvcmtlcklkfSxsb2FkZXJBc3NldHM6e2ltcG9ydE1hcHM6bnVsbCE9bG9hZGVyc0ltcG9ydE1hcD9sb2FkZXJzSW1wb3J0TWFwOnt9LGVudHJ5cG9pbnQ6ZmluYWxGaWxlbmFtZX19XSk7KGxvYWRlcldvcmtlcnNbZmlsZW5hbWVdfHwobG9hZGVyV29ya2Vyc1tmaWxlbmFtZV09bmV3IE1hcCkpLnNldCh3b3JrZXJJZCx3b3JrZXIpfSx0ZXJtaW5hdGlvbj0+e2NvbnN0e3dvcmtlcklkLG9wdGlvbnN9PXRlcm1pbmF0aW9uLGVudHJ5cG9pbnQ9b3B0aW9ucy5maWxlbmFtZSx3b3JrZXJzPWxvYWRlcldvcmtlcnNbZW50cnlwb2ludF07aWYod29ya2Vycyl7Y29uc3Qgd29ya2VyPXdvcmtlcnMuZ2V0KHdvcmtlcklkKTt3b3JrZXImJih3b3JrZXIudGVybWluYXRlKCksd29ya2Vycy5kZWxldGUod29ya2VySWQpKX19KX07Y2xhc3MgSW50ZXJuYWxFbmRwb2ludHtjb25zdHJ1Y3Rvcigpe3RoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkPSExLHRoaXMuaG1yUm9vdFRhc2tzPW5ldyBNYXB9YXN5bmMgbW91bnQob3B0KXt2YXIgX2E7dGhpcy5vcHRpb25zPW9wdDtjb25zdHtjd2Qsd2FzbVVybCx0aHJlYWRXb3JrZXJVcmwsbG9nRmlsdGVyfT1vcHQ7bnVsbCE9PShfYT10aGlzLndhc21Jbml0KSYmdm9pZCAwIT09X2F8fCh0aGlzLndhc21Jbml0PSgwLHV0b28uQXkpKHdhc21VcmwpKSxhd2FpdCB0aGlzLndhc21Jbml0O2NvbnN0IGZpbHRlcj1sb2dGaWx0ZXJ8fCJwYWNrX2NvcmU9aW5mbyxwYWNrX2FwaT1pbmZvLHV0b29fd2FzbT1pbmZvLHV0b29fcnVib3Jpc3Q9aW5mbyI7KDAsdXRvby56RCkoZmlsdGVyKTtjb25zdCBhYnNvbHV0ZUN3ZD1jd2Quc3RhcnRzV2l0aCgiLyIpP2N3ZDoiLyIrY3dkO3V0b28uTU0uaW5pdCh0aHJlYWRXb3JrZXJVcmx8fCIiKSx1dG9vLk1NLnNldEN3ZChhYnNvbHV0ZUN3ZCl9YXN5bmMgZGVwcyhvcHRpb25zKXt2YXIgX2EsX2I7YXdhaXQgdGhpcy53YXNtSW5pdDtjb25zdCByZWdpc3RyeT1udWxsIT09KF9hPW51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVnaXN0cnkpJiZ2b2lkIDAhPT1fYT9fYTp2b2lkIDAsY29uY3VycmVuY3k9bnVsbCE9PShfYj1udWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLmNvbmN1cnJlbmN5KSYmdm9pZCAwIT09X2I/X2I6dm9pZCAwO3JldHVybiBhd2FpdCB1dG9vLk1NLmRlcHMocmVnaXN0cnksY29uY3VycmVuY3kpfWFzeW5jIGluc3RhbGwocGFja2FnZUxvY2ssb3B0aW9ucyl7dmFyIF9hO2F3YWl0IHRoaXMud2FzbUluaXQ7Y29uc3QgY29uY3VycmVuY3k9bnVsbCE9PShfYT1udWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLm1heENvbmN1cnJlbnREb3dubG9hZHMpJiZ2b2lkIDAhPT1fYT9fYTp2b2lkIDA7YXdhaXQgdXRvby5NTS5pbnN0YWxsKHBhY2thZ2VMb2NrLGNvbmN1cnJlbmN5KX1hc3luYyBidWlsZChvcHRpb25zKXt2YXIgX2EsX2IsX2M7YXdhaXQgdGhpcy53YXNtSW5pdCwobnVsbD09PShfYT10aGlzLm9wdGlvbnMpfHx2b2lkIDA9PT1fYT92b2lkIDA6X2EubG9hZGVyV29ya2VyVXJsKSYmIXRoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkJiYocnVuTG9hZGVyV29ya2VyUG9vbCh0aGlzLm9wdGlvbnMuY3dkLHRoaXMub3B0aW9ucy5sb2FkZXJXb3JrZXJVcmwsbnVsbD09PShfYj10aGlzLm9wdGlvbnMpfHx2b2lkIDA9PT1fYj92b2lkIDA6X2IubG9hZGVyc0ltcG9ydE1hcCksdGhpcy5sb2FkZXJXb3JrZXJQb29sSW5pdGlhbGl6ZWQ9ITApO2NvbnN0IGJ1aWxkT3B0aW9ucz1uZXcgdXRvby5IMjtyZXR1cm4gYnVpbGRPcHRpb25zLmNsZWFudXA9bnVsbCE9PShfYz1udWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLmNsZWFudXApJiZ2b2lkIDAhPT1fYyYmX2MsKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMuY29uZmlnKSYmKGJ1aWxkT3B0aW9ucy5jb25maWc9b3B0aW9ucy5jb25maWcpLGF3YWl0IHV0b28uTU0uYnVpbGQoYnVpbGRPcHRpb25zKX1hc3luYyBkZXYoY29uZmlnLG9uVXBkYXRlKXt2YXIgX2EsX2I7KG51bGw9PT0oX2E9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09X2E/dm9pZCAwOl9hLmxvYWRlcldvcmtlclVybCkmJiF0aGlzLmxvYWRlcldvcmtlclBvb2xJbml0aWFsaXplZCYmKHJ1bkxvYWRlcldvcmtlclBvb2wodGhpcy5vcHRpb25zLmN3ZCx0aGlzLm9wdGlvbnMubG9hZGVyV29ya2VyVXJsLG51bGw9PT0oX2I9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09X2I/dm9pZCAwOl9iLmxvYWRlcnNJbXBvcnRNYXApLHRoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkPSEwKSx0aGlzLnJvb3RUYXNrPWF3YWl0IHV0b28uTU0uZW50cnlwb2ludHNTdWJzY3JpYmUoY29uZmlnLHJlc3VsdD0+e251bGw9PW9uVXBkYXRlfHxvblVwZGF0ZShyZXN1bHQpfSl9YXN5bmMgcmVhZEZpbGUocGF0aCxlbmNvZGluZyl7bGV0IHJldDtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCwidXRmOCIhPT1lbmNvZGluZz9hd2FpdCB1dG9vLkZzLnJlYWQocGF0aCk6KHJldD1hd2FpdCB1dG9vLkZzLnJlYWRUb1N0cmluZyhwYXRoKSxyZXQpfWFzeW5jIHdyaXRlRmlsZShwYXRoLGNvbnRlbnQsX2VuY29kaW5nKXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCwic3RyaW5nIj09dHlwZW9mIGNvbnRlbnQ/YXdhaXQgdXRvby5Gcy53cml0ZVN0cmluZyhwYXRoLGNvbnRlbnQpOmF3YWl0IHV0b28uRnMud3JpdGUocGF0aCxjb250ZW50KX1hc3luYyBjb3B5RmlsZShzcmMsZHN0KXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCxhd2FpdCB1dG9vLkZzLmNvcHlGaWxlKHNyYyxkc3QpfWFzeW5jIHN0YXQocGF0aCl7YXdhaXQgdGhpcy53YXNtSW5pdDtjb25zdCBqc29uPShhd2FpdCB1dG9vLkZzLm1ldGFkYXRhKHBhdGgpKS50b0pTT04oKTtyZXR1cm57dHlwZTpqc29uLnR5cGUsc2l6ZTpOdW1iZXIoanNvbi5maWxlX3NpemUpfX1hc3luYyByZWFkZGlyKHBhdGgsb3B0aW9ucyl7YXdhaXQgdGhpcy53YXNtSW5pdDtyZXR1cm4obnVsbD09b3B0aW9uc3x8b3B0aW9ucy5yZWN1cnNpdmUsYXdhaXQgdXRvby5Gcy5yZWFkRGlyKHBhdGgpKS5tYXAoZT0+e2NvbnN0IGRpcj1lLnRvSlNPTigpO3JldHVybntuYW1lOmRpci5uYW1lLHR5cGU6ZGlyLnR5cGV9fSl9YXN5bmMgbWtkaXIocGF0aCxvcHRpb25zKXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCwobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpP2F3YWl0IHV0b28uRnMuY3JlYXRlRGlyQWxsKHBhdGgpOmF3YWl0IHV0b28uRnMuY3JlYXRlRGlyKHBhdGgpfWFzeW5jIHJtKHBhdGgsb3B0aW9ucyl7c3dpdGNoKGF3YWl0IHRoaXMud2FzbUluaXQsKGF3YWl0IHV0b28uRnMubWV0YWRhdGEocGF0aCkpLnRvSlNPTigpLnR5cGUpe2Nhc2UiZmlsZSI6cmV0dXJuIGF3YWl0IHV0b28uRnMucmVtb3ZlRmlsZShwYXRoKTtjYXNlImRpcmVjdG9yeSI6cmV0dXJuIGF3YWl0IHV0b28uRnMucmVtb3ZlRGlyKHBhdGgsISEobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpKX19YXN5bmMgcm1kaXIocGF0aCxvcHRpb25zKXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCxhd2FpdCB1dG9vLkZzLnJlbW92ZURpcihwYXRoLCEhKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVjdXJzaXZlKSl9YXN5bmMgZ3ppcChmaWxlcyl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsYXdhaXQgdXRvby5NTS5nemlwKGZpbGVzKX1hc3luYyBzaWdNZDUoY29udGVudCl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsYXdhaXQgdXRvby5NTS5zaWdNZDUoY29udGVudCl9YXN5bmMgaG1yU3Vic2NyaWJlKGlkZW50aWZpZXIsY2FsbGJhY2spe2NvbnN0IHJvb3RUYXNrPWF3YWl0IHV0b28uTU0uaG1yRXZlbnRzKGlkZW50aWZpZXIsY2FsbGJhY2spO3RoaXMuaG1yUm9vdFRhc2tzLnNldChpZGVudGlmaWVyLHJvb3RUYXNrKX11cGRhdGVJbmZvU3Vic2NyaWJlKGFnZ3JlZ2F0aW9uTXMsY2FsbGJhY2spe3V0b28uTU0udXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbk1zLGNhbGxiYWNrKX19Y29uc3QgaW50ZXJuYWxFbmRwb2ludD1uZXcgSW50ZXJuYWxFbmRwb2ludCxDb25uZWN0ZWRQb3J0cz1uZXcgU2V0O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9Pntjb25zdCBwb3J0PWUucG9ydHNbMF07ZS5kYXRhIT09V29ya2VyTWVzc2FnZVR5cGUuSW5pdENvbm5lY3Rpb258fENvbm5lY3RlZFBvcnRzLmhhcyhwb3J0KXx8KGV4cG9zZShpbnRlcm5hbEVuZHBvaW50LHBvcnQpLENvbm5lY3RlZFBvcnRzLmFkZChwb3J0KSl9KSxfX3dlYnBhY2tfZXhwb3J0c19fPV9fd2VicGFja19leHBvcnRzX18uZGVmYXVsdCxfX3dlYnBhY2tfZXhwb3J0c19ffSkoKSk7";
|
|
1
|
+
export default "data:application/javascript;base64,LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgd29ya2VySW5saW5lLmpzLkxJQ0VOU0UudHh0ICovCiFmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LGZhY3Rvcnkpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sZmFjdG9yeSk7ZWxzZXt2YXIgYT1mYWN0b3J5KCk7Zm9yKHZhciBpIGluIGEpKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnJvb3QpW2ldPWFbaV19fShzZWxmLCgpPT4oKCk9PnsidXNlIHN0cmljdCI7dmFyIF9fd2VicGFja19tb2R1bGVzX189eyIuL3NyYy91dG9vL2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pe19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHtBeTooKT0+X193YmdfaW5pdCxGczooKT0+RnMsSDI6KCk9PkJ1aWxkT3B0aW9ucyxMbzooKT0+Z2V0V2FzbU1vZHVsZSxNTTooKT0+UHJvamVjdCxNaDooKT0+Z2V0V2FzbU1lbW9yeSxuMjooKT0+cmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIsekQ6KCk9PmluaXRMb2dGaWx0ZXJ9KTtjbGFzcyBCdWlsZE9wdGlvbnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19idWlsZG9wdGlvbnNfZnJlZShwdHIsMCl9Z2V0IGNvbmZpZygpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uYnVpbGRvcHRpb25zX2NvbmZpZyh0aGlzLl9fd2JnX3B0cikpfWNvbnN0cnVjdG9yKCl7Y29uc3QgcmV0PXdhc20uYnVpbGRvcHRpb25zX25ldygpO3JldHVybiB0aGlzLl9fd2JnX3B0cj1yZXQ+Pj4wLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9c2V0IGNvbmZpZyh2YWwpe3dhc20uYnVpbGRvcHRpb25zX3NldF9jb25maWcodGhpcy5fX3diZ19wdHIsYWRkSGVhcE9iamVjdCh2YWwpKX1nZXQgY2xlYW51cCgpe3JldHVybiAwIT09d2FzbS5fX3diZ19nZXRfYnVpbGRvcHRpb25zX2NsZWFudXAodGhpcy5fX3diZ19wdHIpfXNldCBjbGVhbnVwKGFyZzApe3dhc20uX193Ymdfc2V0X2J1aWxkb3B0aW9uc19jbGVhbnVwKHRoaXMuX193YmdfcHRyLGFyZzApfX1TeW1ib2wuZGlzcG9zZSYmKEJ1aWxkT3B0aW9ucy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUJ1aWxkT3B0aW9ucy5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2NyZWF0ZXN5bmNhY2Nlc3NoYW5kbGVvcHRpb25zX2ZyZWUocHRyLDApfX1TeW1ib2wuZGlzcG9zZSYmKENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Q3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnMucHJvdG90eXBlLmZyZWUpO2NsYXNzIERpckVudHJ5e3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShEaXJFbnRyeS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixEaXJFbnRyeUZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian10b0pTT04oKXtyZXR1cm57bmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLnR5cGV9fXRvU3RyaW5nKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxEaXJFbnRyeUZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19kaXJlbnRyeV9mcmVlKHB0ciwwKX1nZXQgbmFtZSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X2RpcmVudHJ5X25hbWUocmV0cHRyLHRoaXMuX193YmdfcHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWdldCB0eXBlKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X2RpcmVudHJ5X3R5cGUodGhpcy5fX3diZ19wdHIpO3JldHVybiBfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlW3JldF19c2V0IG5hbWUoYXJnMCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChhcmcwLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uX193Ymdfc2V0X2RpcmVudHJ5X25hbWUodGhpcy5fX3diZ19wdHIscHRyMCxsZW4wKX1zZXQgdHlwZShhcmcwKXt3YXNtLl9fd2JnX3NldF9kaXJlbnRyeV90eXBlKHRoaXMuX193YmdfcHRyLChfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlLmluZGV4T2YoYXJnMCkrMXx8MyktMSl9fWZ1bmN0aW9uIEVSUl9BQk9SVCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0FCT1JUKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfSU5WQUxJRF9TVEFURSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0lOVkFMSURfU1RBVEUocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9LRVlfQUxSRUFEWV9FWElTVFMoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9LRVlfQUxSRUFEWV9FWElTVFMocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9OT1RfQUxMT1dFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX05PVF9BTExPV0VEKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfTk9UX0ZPVU5EKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfTk9UX0ZPVU5EKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRUQoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9LRVlfQUxSRUFEWV9FWElTVFMocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9RVU9UQV9FWENFRURFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX1FVT1RBX0VYQ0VFREVEKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfVFlQRV9NSVNNQVRDSCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX1RZUEVfTUlTTUFUQ0gocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fVN5bWJvbC5kaXNwb3NlJiYoRGlyRW50cnkucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1EaXJFbnRyeS5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgRnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEZzRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2ZzX2ZyZWUocHRyLDApfXN0YXRpYyBjb3B5RmlsZShzcmMsZHN0KXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHNyYyx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGRzdCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX2NvcHlGaWxlKHB0cjAsbGVuMCxwdHIxLGxlbjEpKX1zdGF0aWMgY29weUZpbGVTeW5jKHNyYyxkc3Qpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChzcmMsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU4scHRyMT1wYXNzU3RyaW5nVG9XYXNtMChkc3Qsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jb3B5RmlsZVN5bmMocmV0cHRyLHB0cjAsbGVuMCxwdHIxLGxlbjEpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIGNyZWF0ZURpcihwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19jcmVhdGVEaXIocHRyMCxsZW4wKSl9c3RhdGljIGNyZWF0ZURpckFsbChwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19jcmVhdGVEaXJBbGwocHRyMCxsZW4wKSl9c3RhdGljIGNyZWF0ZURpckFsbFN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jcmVhdGVEaXJBbGxTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIGNyZWF0ZURpclN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jcmVhdGVEaXJTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIG1ldGFkYXRhKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX21ldGFkYXRhKHB0cjAsbGVuMCkpfXN0YXRpYyBtZXRhZGF0YVN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19tZXRhZGF0YVN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzgsITApKXRocm93IHRha2VPYmplY3QocjEpO3JldHVybiBNZXRhZGF0YS5fX3dyYXAocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlYWQocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVhZChwdHIwLGxlbjApKX1zdGF0aWMgcmVhZERpcihwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkRGlyKHB0cjAsbGVuMCkpfXN0YXRpYyByZWFkRGlyU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX3JlYWREaXJTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApLHIyPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis4LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMTIsITApKXRocm93IHRha2VPYmplY3QocjIpO3ZhciB2Mj1nZXRBcnJheUpzVmFsdWVGcm9tV2FzbTAocjAscjEpLnNsaWNlKCk7cmV0dXJuIHdhc20uX193YmluZGdlbl9leHBvcnQ0KHIwLDQqcjEsNCksdjJ9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgcmVhZFN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZWFkU3luYyhyZXRwdHIscHRyMCxsZW4wKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrOCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMSk7cmV0dXJuIHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlYWRUb1N0cmluZyhwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkVG9TdHJpbmcocHRyMCxsZW4wKSl9c3RhdGljIHJlbW92ZURpcihwYXRoLHJlY3Vyc2l2ZSl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVtb3ZlRGlyKHB0cjAsbGVuMCxyZWN1cnNpdmUpKX1zdGF0aWMgcmVtb3ZlRGlyU3luYyhwYXRoLHJlY3Vyc2l2ZSl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZW1vdmVEaXJTeW5jKHJldHB0cixwdHIwLGxlbjAscmVjdXJzaXZlKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIwKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fXN0YXRpYyByZW1vdmVGaWxlKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3JlbW92ZUZpbGUocHRyMCxsZW4wKSl9c3RhdGljIHJlbW92ZUZpbGVTeW5jKHBhdGgpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfcmVtb3ZlRmlsZVN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgd3JpdGUocGF0aCxjb250ZW50KXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc193cml0ZShwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjb250ZW50KSkpfXN0YXRpYyB3cml0ZVN0cmluZyhwYXRoLGNvbnRlbnQpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGNvbnRlbnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc193cml0ZVN0cmluZyhwdHIwLGxlbjAscHRyMSxsZW4xKSl9c3RhdGljIHdyaXRlU3luYyhwYXRoLGNvbnRlbnQpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfd3JpdGVTeW5jKHJldHB0cixwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjb250ZW50KSk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX19U3ltYm9sLmRpc3Bvc2UmJihGcy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUZzLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBNZXRhZGF0YXtzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoTWV0YWRhdGEucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsTWV0YWRhdGFGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9dG9KU09OKCl7cmV0dXJue2ZpbGVfc2l6ZTp0aGlzLmZpbGVfc2l6ZSx0eXBlOnRoaXMudHlwZX19dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyl9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLE1ldGFkYXRhRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX21ldGFkYXRhX2ZyZWUocHRyLDApfWdldCBmaWxlX3NpemUoKXtjb25zdCByZXQ9d2FzbS5fX3diZ19nZXRfbWV0YWRhdGFfZmlsZV9zaXplKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gQmlnSW50LmFzVWludE4oNjQscmV0KX1nZXQgdHlwZSgpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF9tZXRhZGF0YV90eXBlKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gX193YmluZGdlbl9lbnVtX0RpckVudHJ5VHlwZVtyZXRdfXNldCBmaWxlX3NpemUoYXJnMCl7d2FzbS5fX3diZ19zZXRfbWV0YWRhdGFfZmlsZV9zaXplKHRoaXMuX193YmdfcHRyLGFyZzApfXNldCB0eXBlKGFyZzApe3dhc20uX193Ymdfc2V0X21ldGFkYXRhX3R5cGUodGhpcy5fX3diZ19wdHIsKF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGUuaW5kZXhPZihhcmcwKSsxfHwzKS0xKX19U3ltYm9sLmRpc3Bvc2UmJihNZXRhZGF0YS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPU1ldGFkYXRhLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBQcm9qZWN0e19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxQcm9qZWN0RmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3Byb2plY3RfZnJlZShwdHIsMCl9c3RhdGljIGJ1aWxkKG9wdGlvbnMpe19hc3NlcnRDbGFzcyhvcHRpb25zLEJ1aWxkT3B0aW9ucyk7dmFyIHB0cjA9b3B0aW9ucy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfYnVpbGQocHRyMCkpfXN0YXRpYyBnZXQgY3dkKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5wcm9qZWN0X2N3ZChyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19c3RhdGljIGRlcHMocmVnaXN0cnksY29uY3VycmVuY3kpe3ZhciBwdHIwPWlzTGlrZU5vbmUocmVnaXN0cnkpPzA6cGFzc1N0cmluZ1RvV2FzbTAocmVnaXN0cnksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2RlcHMocHRyMCxsZW4wLGlzTGlrZU5vbmUoY29uY3VycmVuY3kpPzQyOTQ5NjcyOTc6Y29uY3VycmVuY3k+Pj4wKSl9c3RhdGljIGVudHJ5cG9pbnRzU3Vic2NyaWJlKGNvbmZpZyxjYWxsYmFjayl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2VudHJ5cG9pbnRzU3Vic2NyaWJlKGFkZEhlYXBPYmplY3QoY29uZmlnKSxhZGRIZWFwT2JqZWN0KGNhbGxiYWNrKSkpfXN0YXRpYyBnemlwKGZpbGVzKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfZ3ppcChhZGRIZWFwT2JqZWN0KGZpbGVzKSkpfXN0YXRpYyBobXJFdmVudHMoaWRlbnRpZmllcixjYWxsYmFjayl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChpZGVudGlmaWVyLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9obXJFdmVudHMocHRyMCxsZW4wLGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKSl9c3RhdGljIGluaXQodGhyZWFkX3VybCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMCh0aHJlYWRfdXJsLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20ucHJvamVjdF9pbml0KHB0cjAsbGVuMCl9c3RhdGljIGluc3RhbGwocGFja2FnZV9sb2NrLG1heF9jb25jdXJyZW50X2Rvd25sb2Fkcyl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYWNrYWdlX2xvY2ssd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2luc3RhbGwocHRyMCxsZW4wLGlzTGlrZU5vbmUobWF4X2NvbmN1cnJlbnRfZG93bmxvYWRzKT80Mjk0OTY3Mjk3Om1heF9jb25jdXJyZW50X2Rvd25sb2Fkcz4+PjApKX1zdGF0aWMgc2V0Q3dkKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLnByb2plY3Rfc2V0Q3dkKHB0cjAsbGVuMCl9c3RhdGljIHNpZ01kNShjb250ZW50KXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3Rfc2lnTWQ1KGFkZEhlYXBPYmplY3QoY29udGVudCkpKX1zdGF0aWMgdXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbl9tcyxjYWxsYmFjayl7d2FzbS5wcm9qZWN0X3VwZGF0ZUluZm9TdWJzY3JpYmUoYWdncmVnYXRpb25fbXMsYWRkSGVhcE9iamVjdChjYWxsYmFjaykpfXN0YXRpYyB3cml0ZUFsbFRvRGlzayhjYWxsYmFjayl7d2FzbS5wcm9qZWN0X3dyaXRlQWxsVG9EaXNrKGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKX19U3ltYm9sLmRpc3Bvc2UmJihQcm9qZWN0LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09UHJvamVjdC5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgUm9vdFRhc2t7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFJvb3RUYXNrLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFJvb3RUYXNrRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxSb290VGFza0ZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19yb290dGFza19mcmVlKHB0ciwwKX19U3ltYm9sLmRpc3Bvc2UmJihSb290VGFzay5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVJvb3RUYXNrLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXYXNtVGFza01lc3NhZ2V7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXYXNtVGFza01lc3NhZ2VGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdhc21UYXNrTWVzc2FnZUZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ193YXNtdGFza21lc3NhZ2VfZnJlZShwdHIsMCl9Z2V0IHRhc2tJZCgpe3JldHVybiB3YXNtLl9fd2JnX2dldF93YXNtdGFza21lc3NhZ2VfdGFza0lkKHRoaXMuX193YmdfcHRyKT4+PjB9c2V0IHRhc2tJZChhcmcwKXt3YXNtLl9fd2JnX3NldF93YXNtdGFza21lc3NhZ2VfdGFza0lkKHRoaXMuX193YmdfcHRyLGFyZzApfWdldCBkYXRhKCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS53YXNtdGFza21lc3NhZ2VfZGF0YSh0aGlzLl9fd2JnX3B0cikpfX1TeW1ib2wuZGlzcG9zZSYmKFdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgV2ViV29ya2VyQ3JlYXRpb257c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFdlYldvcmtlckNyZWF0aW9uLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFdlYldvcmtlckNyZWF0aW9uRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxXZWJXb3JrZXJDcmVhdGlvbkZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9mcmVlKHB0ciwwKX1nZXQgb3B0aW9ucygpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJjcmVhdGlvbl9vcHRpb25zKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gV2ViV29ya2VyT3B0aW9ucy5fX3dyYXAocmV0KX1zZXQgb3B0aW9ucyhhcmcwKXtfYXNzZXJ0Q2xhc3MoYXJnMCxXZWJXb3JrZXJPcHRpb25zKTt2YXIgcHRyMD1hcmcwLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193Ymdfc2V0X3dlYndvcmtlcmNyZWF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIscHRyMCl9fVN5bWJvbC5kaXNwb3NlJiYoV2ViV29ya2VyQ3JlYXRpb24ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1XZWJXb3JrZXJDcmVhdGlvbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgV2ViV29ya2VyT3B0aW9uc3tzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyT3B0aW9ucy5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXZWJXb3JrZXJPcHRpb25zRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxXZWJXb3JrZXJPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcm9wdGlvbnNfZnJlZShwdHIsMCl9Z2V0IGN3ZCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X3dlYndvcmtlcm9wdGlvbnNfY3dkKHJldHB0cix0aGlzLl9fd2JnX3B0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1nZXQgZmlsZW5hbWUoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJvcHRpb25zX2ZpbGVuYW1lKHJldHB0cix0aGlzLl9fd2JnX3B0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1zZXQgY3dkKGFyZzApe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAoYXJnMCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJvcHRpb25zX2N3ZCh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfXNldCBmaWxlbmFtZShhcmcwKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGFyZzAsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5fX3diZ19zZXRfd2Vid29ya2Vyb3B0aW9uc19maWxlbmFtZSh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfX1TeW1ib2wuZGlzcG9zZSYmKFdlYldvcmtlck9wdGlvbnMucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1XZWJXb3JrZXJPcHRpb25zLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXZWJXb3JrZXJUZXJtaW5hdGlvbntzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsV2ViV29ya2VyVGVybWluYXRpb25GaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdlYldvcmtlclRlcm1pbmF0aW9uRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcnRlcm1pbmF0aW9uX2ZyZWUocHRyLDApfWdldCBvcHRpb25zKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X3dlYndvcmtlcnRlcm1pbmF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIpO3JldHVybiBXZWJXb3JrZXJPcHRpb25zLl9fd3JhcChyZXQpfWdldCB3b3JrZXJJZCgpe3JldHVybiB3YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl93b3JrZXJJZCh0aGlzLl9fd2JnX3B0cik+Pj4wfXNldCBvcHRpb25zKGFyZzApe19hc3NlcnRDbGFzcyhhcmcwLFdlYldvcmtlck9wdGlvbnMpO3ZhciBwdHIwPWFyZzAuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VydGVybWluYXRpb25fb3B0aW9ucyh0aGlzLl9fd2JnX3B0cixwdHIwKX1zZXQgd29ya2VySWQoYXJnMCl7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VydGVybWluYXRpb25fd29ya2VySWQodGhpcy5fX3diZ19wdHIsYXJnMCl9fWZ1bmN0aW9uIGdldFdhc21NZW1vcnkoKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmdldFdhc21NZW1vcnkoKSl9ZnVuY3Rpb24gZ2V0V2FzbU1vZHVsZSgpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uZ2V0V2FzbU1vZHVsZSgpKX1mdW5jdGlvbiBpbml0TG9nRmlsdGVyKGZpbHRlcil7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChmaWx0ZXIsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5pbml0TG9nRmlsdGVyKHB0cjAsbGVuMCl9ZnVuY3Rpb24gaW5pdF9wYWNrKCl7d2FzbS5pbml0X3BhY2soKX1mdW5jdGlvbiByZWN2VGFza01lc3NhZ2VJbldvcmtlcih3b3JrZXJfaWQpe3JldHVybiB0YWtlT2JqZWN0KHdhc20ucmVjdlRhc2tNZXNzYWdlSW5Xb3JrZXIod29ya2VyX2lkKSl9ZnVuY3Rpb24gcmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIoY3JlYXRvcix0ZXJtaW5hdG9yKXt3YXNtLnJlZ2lzdGVyV29ya2VyU2NoZWR1bGVyKGFkZEhlYXBPYmplY3QoY3JlYXRvciksYWRkSGVhcE9iamVjdCh0ZXJtaW5hdG9yKSl9ZnVuY3Rpb24gc2VuZFRhc2tNZXNzYWdlKG1lc3NhZ2Upe3JldHVybiB0YWtlT2JqZWN0KHdhc20uc2VuZFRhc2tNZXNzYWdlKGFkZEhlYXBPYmplY3QobWVzc2FnZSkpKX1mdW5jdGlvbiB3YXNtX3RocmVhZF9lbnRyeV9wb2ludChwdHIpe3dhc20ud2FzbV90aHJlYWRfZW50cnlfcG9pbnQocHRyKX1mdW5jdGlvbiB3b3JrZXJDcmVhdGVkKHdvcmtlcl9pZCl7d2FzbS53b3JrZXJDcmVhdGVkKHdvcmtlcl9pZCl9ZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KXtjb25zdCBpbXBvcnQwPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl84YzRlNDNmZTc0NTU5ZDczOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfMGJjODQ4MmM2ZTM1MDhhZTpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZGVidWdTdHJpbmcoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzAwOTVhNzNiOGIxNTZmNzY6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGdldE9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9pc19udWxsX2FjMzRmNTAwMzk5MTc1OWE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIG51bGw9PT1nZXRPYmplY3QoYXJnMCl9LF9fd2JnX19fd2JpbmRnZW5faXNfb2JqZWN0XzVhZThlNTg4MGYyYzFmYmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgdmFsPWdldE9iamVjdChhcmcwKTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHZhbCYmbnVsbCE9PXZhbH0sX193YmdfX193YmluZGdlbl9pc191bmRlZmluZWRfOWU0ZDkyNTM0YzQyZDc3ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gdm9pZCAwPT09Z2V0T2JqZWN0KGFyZzApfSxfX3diZ19fX3diaW5kZ2VuX21lbW9yeV9iZDFmYmNmMjFmYmVmM2M4OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbS5tZW1vcnkpfSxfX3diZ19fX3diaW5kZ2VuX21vZHVsZV9mNmI4MDUyZDc5YzFjYzE2OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbU1vZHVsZSl9LF9fd2JnX19fd2JpbmRnZW5fbnVtYmVyX2dldF84ZmY0MjU1NTE2Y2NhZDNlOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3Qgb2JqPWdldE9iamVjdChhcmcxKSxyZXQ9Im51bWJlciI9PXR5cGVvZiBvYmo/b2JqOnZvaWQgMDtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRGbG9hdDY0KGFyZzArOCxpc0xpa2VOb25lKHJldCk/MDpyZXQsITApLGdldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArMCwhaXNMaWtlTm9uZShyZXQpLCEwKX0sX193YmdfX193YmluZGdlbl9yZXRocm93XzA1NTI1YzU2N2YxNTQ0NzI6ZnVuY3Rpb24oYXJnMCl7dGhyb3cgdGFrZU9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0XzcyZmI2OTYyMDJjNTY3Mjk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBvYmo9Z2V0T2JqZWN0KGFyZzEpLHJldD0ic3RyaW5nIj09dHlwZW9mIG9iaj9vYmo6dm9pZCAwO3ZhciBwdHIxPWlzTGlrZU5vbmUocmV0KT8wOnBhc3NTdHJpbmdUb1dhc20wKHJldCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX3Rocm93X2JlMjg5ZDUwMzRlZDI3MWI6ZnVuY3Rpb24oYXJnMCxhcmcxKXt0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpfSxfX3diZ19fd2JnX2NiX3VucmVmX2Q5Yjg3ZmY3OTgyZTNiMjE6ZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLl93YmdfY2JfdW5yZWYoKX0sX193YmdfYWJvcnRfMmYwNTg0ZTAzZThlMzk1MDpmdW5jdGlvbihhcmcwKXtnZXRPYmplY3QoYXJnMCkuYWJvcnQoKX0sX193YmdfYWJvcnRfZDU0OWI5MmQzYzY2NWRlMTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5hYm9ydChnZXRPYmplY3QoYXJnMSkpfSxfX3diZ19hcHBlbmRfYTk5MmNjYzM3YWE2MmRjNDpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe2dldE9iamVjdChhcmcwKS5hcHBlbmQoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpfSxhcmd1bWVudHMpfSxfX3diZ19hcnJheUJ1ZmZlcl8wNWNlMWFmMjNlOTA2NGU4OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5hcnJheUJ1ZmZlcigpKX0sX193YmdfYXJyYXlCdWZmZXJfYmI1NDA3NjE2NjAwNmMzOTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuYXJyYXlCdWZmZXIoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2FzeW5jXzc5ZjJhNjFmOWQwYjMxY2Y6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGdldE9iamVjdChhcmcwKS5hc3luY30sX193YmdfYnVmZmVyXzdiNWY1M2U0NjU1N2Q4ZjE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmJ1ZmZlcil9LF9fd2JnX2NhbGxfMzg5ZWZlMjg0MzVhOTM4ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19jYWxsXzQ3MDhlMGMxM2JkYzhlOTU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfY2hhbmdlZEhhbmRsZV8xMjM2OTZlYWVhZmYzMmQ3OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHJldD1nZXRPYmplY3QoYXJnMCkuY2hhbmdlZEhhbmRsZTtyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19jbGVhclRpbWVvdXRfN2E0MmI0OTc4NGFlYTY0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChjbGVhclRpbWVvdXQodGFrZU9iamVjdChhcmcwKSkpfSxfX3diZ19jbG9zZV80YmEzMTIyNTNjNDI0MzQyOmZ1bmN0aW9uKGFyZzApe2dldE9iamVjdChhcmcwKS5jbG9zZSgpfSxfX3diZ19jbG9zZV84M2ZiODA5YWNhM2RlN2Y5OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jbG9zZSgpKX0sX193YmdfY3JlYXRlT2JqZWN0VVJMXzkxODE4NWRiNmExMGEwYzg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBwdHIxPXBhc3NTdHJpbmdUb1dhc20wKFVSTC5jcmVhdGVPYmplY3RVUkwoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxhcmd1bWVudHMpfSxfX3diZ19jcmVhdGVXcml0YWJsZV84MGJjNWRlMzc0NDQ4YjQyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jcmVhdGVXcml0YWJsZSgpKX0sX193YmdfZGF0YV81MzMwZGE1MDMxMmQwYmMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5kYXRhKX0sX193YmdfZGVidWdfNDZhOTM5OTVmYzZmODgyMDpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLmRlYnVnKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2RlYnVnX2E0MDk5ZmExMmRiNmNkNjE6ZnVuY3Rpb24oYXJnMCl7Y29uc29sZS5kZWJ1ZyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19kaXJlbnRyeV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRGlyRW50cnkuX193cmFwKGFyZzApKX0sX193YmdfZG9uZV81N2IzOWVjZDlhZGRmZTgxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuZG9uZX0sX193YmdfZW50cmllc18wNGE0Yjk4MjM1MWE3MTdmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5lbnRyaWVzKCkpfSxfX3diZ19lcnJvcl83NTM0YjhlOWEzNmYxYWI0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7bGV0IGRlZmVycmVkMF8wLGRlZmVycmVkMF8xO3RyeXtkZWZlcnJlZDBfMD1hcmcwLGRlZmVycmVkMF8xPWFyZzEsY29uc29sZS5lcnJvcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDBfMCxkZWZlcnJlZDBfMSwxKX19LF9fd2JnX2Vycm9yXzc5NGQwZmZjOWQwMGQ1YzM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5lcnJvcihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSxnZXRPYmplY3QoYXJnMykpfSxfX3diZ19lcnJvcl85YTdmZTNmOTMyMDM0Y2RlOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuZXJyb3IoZ2V0T2JqZWN0KGFyZzApKX0sX193YmdfZXZhbF8zZjBiOWYwY2JhZjQ1YTM0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcmV0PWV2YWwoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpO3JldHVybiBhZGRIZWFwT2JqZWN0KHJldCl9LGFyZ3VtZW50cyl9LF9fd2JnX2ZldGNoXzc0YTNlODRlYmQyYzlhMGU6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZmV0Y2goZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX2ZldGNoX2FmYjZhNGI2Y2FjZjg3NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZmV0Y2goZ2V0T2JqZWN0KGFyZzEpKSl9LF9fd2JnX2ZsdXNoXzIyYjc4NTA2MDU5MmNhNWY6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLmZsdXNoKCl9LGFyZ3VtZW50cyl9LF9fd2JnX2Zyb21fYmRkZDY0ZTdkNWZmNjk0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5mcm9tKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19nZXREaXJlY3RvcnlIYW5kbGVfODdjZThjYTUzY2Y0ZDhkYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5SGFuZGxlKGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19nZXREaXJlY3RvcnlfYjY2YWUzZTc5ZjkwMjk4MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5KCkpfSxfX3diZ19nZXRGaWxlSGFuZGxlX2ZmNGFiOTE3YjQ1YWZmYjM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmdldEZpbGVIYW5kbGUoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKSl9LF9fd2JnX2dldEZpbGVfMTE1MzU0ZmM5NTBlZGM4ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RmlsZSgpKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzgwNTc4YjJmZjJhMDkzYmE6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGdldE9iamVjdChhcmcwKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2dldF85Yjk0ZDczZTYyMjFmNzVjOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApW2FyZzE+Pj4wXSl9LF9fd2JnX2dldF9iM2VkM2FkNGJlMmJjOGFjOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUmVmbGVjdC5nZXQoZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19oYXNfZDRlNTMyMzg5NjZjMTJiNjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBSZWZsZWN0LmhhcyhnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfaGVhZGVyc181OWEyOTM4ZGI5ZjgwOTg1OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5oZWFkZXJzKX0sX193YmdfaW5mb18xNDhkMDQzODQwNTgyMDEyOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuaW5mbyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19pbmZvXzllNjAyY2YxMGM1YzY5MGI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5pbmZvKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2luc3RhbmNlb2ZfRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVfMTUwNmIzZDAxNzc5OWQ0ODpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9Eb21FeGNlcHRpb25fOTljMTc3MTkzZTU1NGI3NTpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBET01FeGNlcHRpb259Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZV81NmExNjcwMzlkNjE0NTQ4OmZ1bmN0aW9uKGFyZzApe2xldCByZXN1bHQ7dHJ5e3Jlc3VsdD1nZXRPYmplY3QoYXJnMClpbnN0YW5jZW9mIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGV9Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfUmVzcG9uc2VfZWUxZDU0ZDc5YWU0MTk3NzpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBSZXNwb25zZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzliOTA3NTkzNWM3NDcwN2M6ZnVuY3Rpb24oYXJnMCl7bGV0IHJlc3VsdDt0cnl7cmVzdWx0PWdldE9iamVjdChhcmcwKWluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaXNBcnJheV9kMzE0YmI5OGZjZjA4MzMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdChhcmcwKSl9LF9fd2JnX2l0ZXJhdG9yXzZmZjY1NjBjYTE1NjhlNTU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChTeW1ib2wuaXRlcmF0b3IpfSxfX3diZ19raW5kXzkwNzY5ZDZjMTZmYWVhZmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS5raW5kO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUhhbmRsZUtpbmQuaW5kZXhPZihyZXQpKzF8fDMpLTF9LF9fd2JnX2xlbmd0aF8zMmVkOWEyNzlhY2QwNTRjOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubGVuZ3RofSxfX3diZ19sZW5ndGhfMzVhN2JhY2U0MGYzNmVhYzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmxlbmd0aH0sX193YmdfbWVzc2FnZV8wYjJiMDI5OGEyMzFiMGQ0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubWVzc2FnZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19tZXRhZGF0YV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoTWV0YWRhdGEuX193cmFwKGFyZzApKX0sX193YmdfbmFtZV8yNDI3NTNlNTExMGNkNzU2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubmFtZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19uYXZpZ2F0b3JfNDQ3ODkzMWYzMmViY2E1NzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmF2aWdhdG9yKX0sX193YmdfbmV3XzM2MTMwOGIyMzU2Y2VjZDA6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgT2JqZWN0KX0sX193YmdfbmV3XzNlYjM2YWUyNDFmZTZmNDQ6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQXJyYXkpfSxfX3diZ19uZXdfNGY4ZjNjMTIzZTQ3NDM1ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBXb3JrZXIoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3XzY0Mjg0YmQ0ODdmOWQyMzk6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgSGVhZGVycyl9LGFyZ3VtZW50cyl9LF9fd2JnX25ld183MmM2MjdiYTgwZGUxYzIxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBJbnQzMkFycmF5KGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19uZXdfOGE2ZjIzOGE2ZWNlODZlYTpmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBFcnJvcil9LF9fd2JnX25ld184ZWM1ODAxYjM5ZDZmODYyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBGaWxlU3lzdGVtT2JzZXJ2ZXIoZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX25ld19iNWQ5ZTJmYjM4OWZlZjkxOmZ1bmN0aW9uKGFyZzAsYXJnMSl7dHJ5e3ZhciBzdGF0ZTA9e2E6YXJnMCxiOmFyZzF9O2NvbnN0IHJldD1uZXcgUHJvbWlzZSgoYXJnMCxhcmcxKT0+e2NvbnN0IGE9c3RhdGUwLmE7c3RhdGUwLmE9MDt0cnl7cmV0dXJuIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8zNzE2KGEsc3RhdGUwLmIsYXJnMCxhcmcxKX1maW5hbGx5e3N0YXRlMC5hPWF9fSk7cmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KX1maW5hbGx5e3N0YXRlMC5hPXN0YXRlMC5iPTB9fSxfX3diZ19uZXdfYjk0OWU3ZjU2MTUwYTVkMTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBBYm9ydENvbnRyb2xsZXIpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfZGQyYjY4MGM4YmY2YWUyOTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgVWludDhBcnJheShnZXRPYmplY3QoYXJnMCkpKX0sX193YmdfbmV3X2Zyb21fc2xpY2VfYTNkMjYyOWRjMTgyNjc4NDpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBVaW50OEFycmF5KGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxfX3diZ19uZXdfbm9fYXJnc18xYzdjODQyZjA4ZDAwZWJiOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEZ1bmN0aW9uKGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpKSl9LF9fd2JnX25ld193aXRoX2xlbmd0aF9hMmMzOWNiZTg4ZmQ4ZmYxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBVaW50OEFycmF5KGFyZzA+Pj4wKSl9LF9fd2JnX25ld193aXRoX29wdGlvbnNfMTQ1YWZiYTkyMmFkMzcwMzpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IFdvcmtlcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3X3dpdGhfc3RyX2FuZF9pbml0X2E2MWNiYzZiZGVmMjE2MTQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBSZXF1ZXN0KGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfd2l0aF9zdHJfc2VxdWVuY2VfY2VhMmMwNTcxZDZkYzZhYjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQmxvYihnZXRPYmplY3QoYXJnMCkpKX0sYXJndW1lbnRzKX0sX193YmdfbmV4dF8wYTVlMGY4YWY5ODE0NmFhOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5uZXh0KCkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXh0XzM0ODJmNTRjNDllOGFmMTk6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm5leHQoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25leHRfNDE4ZjgwZDhmNTMwMzIzMzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmV4dCl9LF9fd2JnX25vd18wZGM0OTIwYTQ3Y2Y3MjgwOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubm93KCl9LF9fd2JnX25vd19hM2FmOWEyZjRiYmFhNGQxOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LF9fd2JnX29ic2VydmVfMzIyMzViNWU2MTk1ZDRhYjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm9ic2VydmUoZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ19vZl9kZGMwOTQyYjBkY2UxNmExOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5vZihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ19wYXJzZV83MDg0NjFhMWZlZGRmYjM4OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoSlNPTi5wYXJzZShnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19wZXJmb3JtYW5jZV82YWRjM2I4OTllNDQ4YTIzOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5wZXJmb3JtYW5jZSl9LF9fd2JnX3Bvc3RNZXNzYWdlXzIwNDFmNGU5MGFmNjEzMTg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucG9zdE1lc3NhZ2UoZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfcG9zdE1lc3NhZ2VfNzcxZWYzMjkzYTI4YmJhYzpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5wb3N0TWVzc2FnZShnZXRPYmplY3QoYXJnMSkpfSxhcmd1bWVudHMpfSxfX3diZ19wcm90b3R5cGVzZXRjYWxsX2JkY2RjYzU4NDJlNGQ3N2Q6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe1VpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpfSxfX3diZ19wdXNoXzhmZmRjYjIwNjMzNDBiYTU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLnB1c2goZ2V0T2JqZWN0KGFyZzEpKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfMGFhMGE5MjdmNzhmNWQ5ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucXVldWVNaWNyb3Rhc2spfSxfX3diZ19xdWV1ZU1pY3JvdGFza181YmI1MzY5ODJmNzhhNTZmOmZ1bmN0aW9uKGFyZzApe3F1ZXVlTWljcm90YXNrKGdldE9iamVjdChhcmcwKSl9LF9fd2JnX3JhbmRvbV85MTIyODRkYmY2MzZmMjY5OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9LF9fd2JnX3JlbGF0aXZlUGF0aENvbXBvbmVudHNfYmM0ODI0MDNjYjZkN2VhOTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucmVsYXRpdmVQYXRoQ29tcG9uZW50cyl9LF9fd2JnX3JlbW92ZUVudHJ5X2M0ZWZmZmRkMzE4YjUxYTE6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnJlbW92ZUVudHJ5KGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19yZXNvbHZlXzAwMmM0YjdkOWQ4ZjZiNjQ6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUHJvbWlzZS5yZXNvbHZlKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19yb290dGFza19uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUm9vdFRhc2suX193cmFwKGFyZzApKX0sX193Ymdfc2V0VGltZW91dF82MzAwODYxMzY0NGIwN2FmOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2V0VGltZW91dChnZXRPYmplY3QoYXJnMSksYXJnMikpfSxhcmd1bWVudHMpfSxfX3diZ19zZXRUaW1lb3V0XzdiYjM0Mjk2NjJhYjFlNzA6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChzZXRUaW1lb3V0KGdldE9iamVjdChhcmcwKSxhcmcxKSl9LF9fd2JnX3NldF9hdF9lNDUzY2YzZjRiZTllMmQ5OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmF0PWFyZzF9LF9fd2JnX3NldF9ib2R5XzlhN2UwMGFmZTNjZmUyNDQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuYm9keT1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF9jYWNoZV8zMTVhM2VkNzczYTQxNTQzOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmNhY2hlPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q2FjaGVbYXJnMV19LF9fd2JnX3NldF9jcmVhdGVfMWY5MDJjNTkzNmFkZGU3ZDpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVhdGU9MCE9PWFyZzF9LF9fd2JnX3NldF9jcmVhdGVfYzk1ZGRjYTAxOGZhYzljZTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVhdGU9MCE9PWFyZzF9LF9fd2JnX3NldF9jcmVkZW50aWFsc19jNGE1OGQyZTA1ZWYyNGZiOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmNyZWRlbnRpYWxzPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q3JlZGVudGlhbHNbYXJnMV19LF9fd2JnX3NldF9mNDNlNTc3YWVhOTQ0NjViOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtnZXRPYmplY3QoYXJnMClbYXJnMT4+PjBdPXRha2VPYmplY3QoYXJnMil9LF9fd2JnX3NldF9oZWFkZXJzX2NmYzVmNGIyYzFmMjA1NDk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuaGVhZGVycz1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF9tZXRob2RfYzNlMjAzNzVmNWFlN2ZhYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApLm1ldGhvZD1nZXRTdHJpbmdGcm9tV2FzbTAoYXJnMSxhcmcyKX0sX193Ymdfc2V0X21vZGVfYjEzNjQyYzMxMjY0ODIwMjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5tb2RlPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0TW9kZVthcmcxXX0sX193Ymdfc2V0X25hbWVfNDliOWVjYmE3ZjU4ZjJlNTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApLm5hbWU9Z2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMil9LF9fd2JnX3NldF9vbm1lc3NhZ2VfNmVkNDEwNTBlNGE1Y2VlMjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5vbm1lc3NhZ2U9Z2V0T2JqZWN0KGFyZzEpfSxfX3diZ19zZXRfcmVjdXJzaXZlXzY1ZWQwN2RmODkyYjQ4ODU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucmVjdXJzaXZlPTAhPT1hcmcxfSxfX3diZ19zZXRfcmVjdXJzaXZlX2Y1ZDM0MTYwOTgzMjgxMTA6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucmVjdXJzaXZlPTAhPT1hcmcxfSxfX3diZ19zZXRfc2lnbmFsX2YyZDNmODU5OTI0ODg5NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuc2lnbmFsPWdldE9iamVjdChhcmcxKX0sX193Ymdfc2V0X3R5cGVfZTEyN2YyNmI3OGQ3OGJmYzpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS50eXBlPV9fd2JpbmRnZW5fZW51bV9Xb3JrZXJUeXBlW2FyZzFdfSxfX3diZ19zaWduYWxfZDEyODVlY2FiNGViYzVhZDpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2lnbmFsKX0sX193Ymdfc2l6ZV9lMDVkMzFjYzYwNDk4MTVmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuc2l6ZX0sX193Ymdfc2xpY2VfNTY2YTE1ZjMyMTRmYTUyZTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5zbGljZShhcmcxLGFyZzIsZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpKX0sYXJndW1lbnRzKX0sX193Ymdfc3RhY2tfMGVkNzVkNjg1NzViMGYzYzpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZ2V0T2JqZWN0KGFyZzEpLnN0YWNrLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO2dldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArNCxsZW4xLCEwKSxnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzAscHRyMSwhMCl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfMTI4MzcxNjdhZDkzNTExNjpmdW5jdGlvbigpe2NvbnN0IHJldD12b2lkIDA9PT1fX3dlYnBhY2tfcmVxdWlyZV9fLmc/bnVsbDpfX3dlYnBhY2tfcmVxdWlyZV9fLmc7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTX2U2MjhlODlhYjNiMWM5NWY6ZnVuY3Rpb24oKXtjb25zdCByZXQ9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzP251bGw6Z2xvYmFsVGhpcztyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfU0VMRl9hNjIxZDNkZmJiNjBkMGNlOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj9udWxsOnNlbGY7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV19mODcyN2YwY2Y4ODhlMGJkOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93P251bGw6d2luZG93O3JldHVybiBpc0xpa2VOb25lKHJldCk/MDphZGRIZWFwT2JqZWN0KHJldCl9LF9fd2JnX3N0YXR1c184OWQ3ZTgwM2RiOTExZWU3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuc3RhdHVzfSxfX3diZ19zdG9yYWdlX2MwMDJiNTNiYzQ4ODMyOTk6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnN0b3JhZ2UpfSxfX3diZ19zdHJpbmdpZnlfOGQxY2M2ZmYzODNlOGJhZTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChKU09OLnN0cmluZ2lmeShnZXRPYmplY3QoYXJnMCkpKX0sYXJndW1lbnRzKX0sX193Ymdfc3ViYXJyYXlfYTk2ZTFmZWYxN2VkMjNjYjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnN1YmFycmF5KGFyZzE+Pj4wLGFyZzI+Pj4wKSl9LF9fd2JnX3RoZW5fMGQ5ZmUyYzdiMTg1N2QzMjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnRoZW4oZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ190aGVuX2I5ZTdiM2I1ZjFhOWUxYjU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudGhlbihnZXRPYmplY3QoYXJnMSkpKX0sX193YmdfdG9TdHJpbmdfOTY0ZmY3ZmU2ZWNhODM2MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudG9TdHJpbmcoKSl9LF9fd2JnX3RydW5jYXRlX2RjNjYxZmRjYjAwNjJmYTc6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkudHJ1bmNhdGUoYXJnMT4+PjApfSxhcmd1bWVudHMpfSxfX3diZ190eXBlXzAzZGZlNDYyMTczNWU1Mjg6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS50eXBlO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUNoYW5nZVJlY29yZFR5cGUuaW5kZXhPZihyZXQpKzF8fDcpLTF9LF9fd2JnX3VybF9jNDg0YzI2YjFmYmY1MTI2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkudXJsLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO2dldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArNCxsZW4xLCEwKSxnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzAscHRyMSwhMCl9LF9fd2JnX3ZhbHVlXzA1NDYyNTViNDE1ZTk2YzE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnZhbHVlKX0sX193YmdfdmFsdWVfZmU2ZWUzNGFmNWRjM2RjZTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudmFsdWUpfSxfX3diZ193YWl0QXN5bmNfYTU4YjIxMzRiZmYzOWMzZTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoQXRvbWljcy53YWl0QXN5bmMoZ2V0T2JqZWN0KGFyZzApLGFyZzE+Pj4wLGFyZzIpKX0sX193Ymdfd2FpdEFzeW5jX2MwYTM5YTdkMzMxOGQ5MWU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBdG9taWNzLndhaXRBc3luYyl9LF9fd2JnX3dhcm5fYTQwYjk3MTQ2N2IyMTljNzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLndhcm4oZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMiksZ2V0T2JqZWN0KGFyZzMpKX0sX193Ymdfd2Fybl9mN2FlMWIyZTY2Y2NiOTMwOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUud2FybihnZXRPYmplY3QoYXJnMCkpfSxfX3diZ193YXNtdGFza21lc3NhZ2VfbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdhc21UYXNrTWVzc2FnZS5fX3dyYXAoYXJnMCkpfSxfX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoV2ViV29ya2VyQ3JlYXRpb24uX193cmFwKGFyZzApKX0sX193Ymdfd2Vid29ya2VydGVybWluYXRpb25fbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdlYldvcmtlclRlcm1pbmF0aW9uLl9fd3JhcChhcmcwKSl9LF9fd2JnX3dyaXRlXzJkNTkzMzdjYzQ5NjkxOWQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGdldE9iamVjdChhcmcwKS53cml0ZShnZXRBcnJheVU4RnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKX0sYXJndW1lbnRzKX0sX193Ymdfd3JpdGVfMzdmNWE2MmEyNGRhNjYyZjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS53cml0ZShnZXRPYmplY3QoYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDE6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlQ2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTYxLF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MDYzMSkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMjpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VNdXRDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MTA1NixfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkxOTQpKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDM6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkyMDgsX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzcwOTg5KSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5MjA4LF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MDk4OSkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNTpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VNdXRDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8xOTIwOCxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzEwMjUpKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDY6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkyMDgsX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5MTk0KSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGFyZzApfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwODpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDk6ZnVuY3Rpb24oYXJnMCxhcmcxKXt2YXIgdjA9Z2V0QXJyYXlKc1ZhbHVlRnJvbVdhc20wKGFyZzAsYXJnMSkuc2xpY2UoKTt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChhcmcwLDQqYXJnMSw0KTtyZXR1cm4gYWRkSGVhcE9iamVjdCh2MCl9LF9fd2JpbmRnZW5fbGlua18wYjFmNzZkMjM1ZmQyYjg2OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHZhbD0ib25tZXNzYWdlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgbGV0IFtpYSwgaW5kZXgsIHZhbHVlXSA9IGV2LmRhdGE7XG4gICAgICAgICAgICAgICAgaWEgPSBuZXcgSW50MzJBcnJheShpYS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBBdG9taWNzLndhaXQoaWEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAiLHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAodm9pZCAwPT09VVJMLmNyZWF0ZU9iamVjdFVSTD8iZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCIrZW5jb2RlVVJJQ29tcG9uZW50KHZhbCk6VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdmFsXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWY6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApKX0sX193YmluZGdlbl9vYmplY3RfZHJvcF9yZWY6ZnVuY3Rpb24oYXJnMCl7dGFrZU9iamVjdChhcmcwKX0sbWVtb3J5Om1lbW9yeXx8bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDoxMDI1LG1heGltdW06NjU1MzYsc2hhcmVkOiEwfSl9O3JldHVybntfX3Byb3RvX186bnVsbCwiLi9pbmRleF9iZy5qcyI6aW1wb3J0MH19ZnVuY3Rpb24gX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5MTk0KGFyZzAsYXJnMSl7d2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTkxOTQoYXJnMCxhcmcxKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzA2MzEoYXJnMCxhcmcxLGFyZzIpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzcwNjMxKGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzA5ODkoYXJnMCxhcmcxLGFyZzIpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzcwOTg5KGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzEwMjUoYXJnMCxhcmcxLGFyZzIpe3RyeXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83MTAyNShhcmcwLGFyZzEsYWRkQm9ycm93ZWRPYmplY3QoYXJnMikpfWZpbmFsbHl7aGVhcFtzdGFja19wb2ludGVyKytdPXZvaWQgMH19ZnVuY3Rpb24gX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzM3MTYoYXJnMCxhcmcxLGFyZzIsYXJnMyl7d2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMzcxNihhcmcwLGFyZzEsYWRkSGVhcE9iamVjdChhcmcyKSxhZGRIZWFwT2JqZWN0KGFyZzMpKX1TeW1ib2wuZGlzcG9zZSYmKFdlYldvcmtlclRlcm1pbmF0aW9uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09V2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlLmZyZWUpO2NvbnN0IF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGU9WyJmaWxlIiwiZGlyZWN0b3J5Il0sX193YmluZGdlbl9lbnVtX0ZpbGVTeXN0ZW1DaGFuZ2VSZWNvcmRUeXBlPVsiYXBwZWFyZWQiLCJkaXNhcHBlYXJlZCIsImVycm9yZWQiLCJtb2RpZmllZCIsIm1vdmVkIiwidW5rbm93biJdLF9fd2JpbmRnZW5fZW51bV9GaWxlU3lzdGVtSGFuZGxlS2luZD1bImZpbGUiLCJkaXJlY3RvcnkiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdENhY2hlPVsiZGVmYXVsdCIsIm5vLXN0b3JlIiwicmVsb2FkIiwibm8tY2FjaGUiLCJmb3JjZS1jYWNoZSIsIm9ubHktaWYtY2FjaGVkIl0sX193YmluZGdlbl9lbnVtX1JlcXVlc3RDcmVkZW50aWFscz1bIm9taXQiLCJzYW1lLW9yaWdpbiIsImluY2x1ZGUiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdE1vZGU9WyJzYW1lLW9yaWdpbiIsIm5vLWNvcnMiLCJjb3JzIiwibmF2aWdhdGUiXSxfX3diaW5kZ2VuX2VudW1fV29ya2VyVHlwZT1bImNsYXNzaWMiLCJtb2R1bGUiXSxCdWlsZE9wdGlvbnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2J1aWxkb3B0aW9uc19mcmVlKHB0cj4+PjAsMSkpLENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19jcmVhdGVzeW5jYWNjZXNzaGFuZGxlb3B0aW9uc19mcmVlKHB0cj4+PjAsMSkpLERpckVudHJ5RmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19kaXJlbnRyeV9mcmVlKHB0cj4+PjAsMSkpLEZzRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19mc19mcmVlKHB0cj4+PjAsMSkpLE1ldGFkYXRhRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19tZXRhZGF0YV9mcmVlKHB0cj4+PjAsMSkpLFByb2plY3RGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3Byb2plY3RfZnJlZShwdHI+Pj4wLDEpKSxSb290VGFza0ZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfcm9vdHRhc2tfZnJlZShwdHI+Pj4wLDEpKSxXYXNtVGFza01lc3NhZ2VGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3dhc210YXNrbWVzc2FnZV9mcmVlKHB0cj4+PjAsMSkpLFdlYldvcmtlckNyZWF0aW9uRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9mcmVlKHB0cj4+PjAsMSkpLFdlYldvcmtlck9wdGlvbnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3dlYndvcmtlcm9wdGlvbnNfZnJlZShwdHI+Pj4wLDEpKSxXZWJXb3JrZXJUZXJtaW5hdGlvbkZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfd2Vid29ya2VydGVybWluYXRpb25fZnJlZShwdHI+Pj4wLDEpKTtmdW5jdGlvbiBhZGRIZWFwT2JqZWN0KG9iail7aGVhcF9uZXh0PT09aGVhcC5sZW5ndGgmJmhlYXAucHVzaChoZWFwLmxlbmd0aCsxKTtjb25zdCBpZHg9aGVhcF9uZXh0O3JldHVybiBoZWFwX25leHQ9aGVhcFtpZHhdLGhlYXBbaWR4XT1vYmosaWR4fWZ1bmN0aW9uIF9hc3NlcnRDbGFzcyhpbnN0YW5jZSxrbGFzcyl7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIGtsYXNzKSl0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGluc3RhbmNlIG9mICR7a2xhc3MubmFtZX1gKX1mdW5jdGlvbiBhZGRCb3Jyb3dlZE9iamVjdChvYmope2lmKDE9PXN0YWNrX3BvaW50ZXIpdGhyb3cgbmV3IEVycm9yKCJvdXQgb2YganMgc3RhY2siKTtyZXR1cm4gaGVhcFstLXN0YWNrX3BvaW50ZXJdPW9iaixzdGFja19wb2ludGVyfWNvbnN0IENMT1NVUkVfRFRPUlM9InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoc3RhdGU9PnN0YXRlLmR0b3Ioc3RhdGUuYSxzdGF0ZS5iKSk7ZnVuY3Rpb24gZGVidWdTdHJpbmcodmFsKXtjb25zdCB0eXBlPXR5cGVvZiB2YWw7aWYoIm51bWJlciI9PXR5cGV8fCJib29sZWFuIj09dHlwZXx8bnVsbD09dmFsKXJldHVybmAke3ZhbH1gO2lmKCJzdHJpbmciPT10eXBlKXJldHVybmAiJHt2YWx9ImA7aWYoInN5bWJvbCI9PXR5cGUpe2NvbnN0IGRlc2NyaXB0aW9uPXZhbC5kZXNjcmlwdGlvbjtyZXR1cm4gbnVsbD09ZGVzY3JpcHRpb24/IlN5bWJvbCI6YFN5bWJvbCgke2Rlc2NyaXB0aW9ufSlgfWlmKCJmdW5jdGlvbiI9PXR5cGUpe2NvbnN0IG5hbWU9dmFsLm5hbWU7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuYW1lJiZuYW1lLmxlbmd0aD4wP2BGdW5jdGlvbigke25hbWV9KWA6IkZ1bmN0aW9uIn1pZihBcnJheS5pc0FycmF5KHZhbCkpe2NvbnN0IGxlbmd0aD12YWwubGVuZ3RoO2xldCBkZWJ1Zz0iWyI7bGVuZ3RoPjAmJihkZWJ1Zys9ZGVidWdTdHJpbmcodmFsWzBdKSk7Zm9yKGxldCBpPTE7aTxsZW5ndGg7aSsrKWRlYnVnKz0iLCAiK2RlYnVnU3RyaW5nKHZhbFtpXSk7cmV0dXJuIGRlYnVnKz0iXSIsZGVidWd9Y29uc3QgYnVpbHRJbk1hdGNoZXM9L1xbb2JqZWN0IChbXlxdXSspXF0vLmV4ZWModG9TdHJpbmcuY2FsbCh2YWwpKTtsZXQgY2xhc3NOYW1lO2lmKCEoYnVpbHRJbk1hdGNoZXMmJmJ1aWx0SW5NYXRjaGVzLmxlbmd0aD4xKSlyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpO2lmKGNsYXNzTmFtZT1idWlsdEluTWF0Y2hlc1sxXSwiT2JqZWN0Ij09Y2xhc3NOYW1lKXRyeXtyZXR1cm4iT2JqZWN0KCIrSlNPTi5zdHJpbmdpZnkodmFsKSsiKSJ9Y2F0Y2goXyl7cmV0dXJuIk9iamVjdCJ9cmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yP2Ake3ZhbC5uYW1lfTogJHt2YWwubWVzc2FnZX1cbiR7dmFsLnN0YWNrfWA6Y2xhc3NOYW1lfWZ1bmN0aW9uIGRyb3BPYmplY3QoaWR4KXtpZHg8MTMyfHwoaGVhcFtpZHhdPWhlYXBfbmV4dCxoZWFwX25leHQ9aWR4KX1mdW5jdGlvbiBnZXRBcnJheUpzVmFsdWVGcm9tV2FzbTAocHRyLGxlbil7cHRyPj4+PTA7Y29uc3QgbWVtPWdldERhdGFWaWV3TWVtb3J5MCgpLHJlc3VsdD1bXTtmb3IobGV0IGk9cHRyO2k8cHRyKzQqbGVuO2krPTQpcmVzdWx0LnB1c2godGFrZU9iamVjdChtZW0uZ2V0VWludDMyKGksITApKSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRBcnJheVU4RnJvbVdhc20wKHB0cixsZW4pe3JldHVybiBwdHI+Pj49MCxnZXRVaW50OEFycmF5TWVtb3J5MCgpLnN1YmFycmF5KHB0ci8xLHB0ci8xK2xlbil9bGV0IGNhY2hlZERhdGFWaWV3TWVtb3J5MD1udWxsO2Z1bmN0aW9uIGdldERhdGFWaWV3TWVtb3J5MCgpe3JldHVybiBudWxsIT09Y2FjaGVkRGF0YVZpZXdNZW1vcnkwJiZjYWNoZWREYXRhVmlld01lbW9yeTAuYnVmZmVyPT09d2FzbS5tZW1vcnkuYnVmZmVyfHwoY2FjaGVkRGF0YVZpZXdNZW1vcnkwPW5ldyBEYXRhVmlldyh3YXNtLm1lbW9yeS5idWZmZXIpKSxjYWNoZWREYXRhVmlld01lbW9yeTB9ZnVuY3Rpb24gZ2V0U3RyaW5nRnJvbVdhc20wKHB0cixsZW4pe3JldHVybiBkZWNvZGVUZXh0KHB0cj4+Pj0wLGxlbil9bGV0IGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwPW51bGw7ZnVuY3Rpb24gZ2V0VWludDhBcnJheU1lbW9yeTAoKXtyZXR1cm4gbnVsbCE9PWNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwJiZjYWNoZWRVaW50OEFycmF5TWVtb3J5MC5idWZmZXI9PT13YXNtLm1lbW9yeS5idWZmZXJ8fChjYWNoZWRVaW50OEFycmF5TWVtb3J5MD1uZXcgVWludDhBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpKSxjYWNoZWRVaW50OEFycmF5TWVtb3J5MH1mdW5jdGlvbiBnZXRPYmplY3QoaWR4KXtyZXR1cm4gaGVhcFtpZHhdfWZ1bmN0aW9uIGhhbmRsZUVycm9yKGYsYXJncyl7dHJ5e3JldHVybiBmLmFwcGx5KHRoaXMsYXJncyl9Y2F0Y2goZSl7d2FzbS5fX3diaW5kZ2VuX2V4cG9ydDMoYWRkSGVhcE9iamVjdChlKSl9fWxldCBoZWFwPW5ldyBBcnJheSgxMjgpLmZpbGwodm9pZCAwKTtoZWFwLnB1c2godm9pZCAwLG51bGwsITAsITEpO2xldCBoZWFwX25leHQ9aGVhcC5sZW5ndGg7ZnVuY3Rpb24gaXNMaWtlTm9uZSh4KXtyZXR1cm4gbnVsbD09eH1mdW5jdGlvbiBtYWtlQ2xvc3VyZShhcmcwLGFyZzEsZHRvcixmKXtjb25zdCBzdGF0ZT17YTphcmcwLGI6YXJnMSxjbnQ6MSxkdG9yfSxyZWFsPSguLi5hcmdzKT0+e3N0YXRlLmNudCsrO3RyeXtyZXR1cm4gZihzdGF0ZS5hLHN0YXRlLmIsLi4uYXJncyl9ZmluYWxseXtyZWFsLl93YmdfY2JfdW5yZWYoKX19O3JldHVybiByZWFsLl93YmdfY2JfdW5yZWY9KCk9PnswPT09LS1zdGF0ZS5jbnQmJihzdGF0ZS5kdG9yKHN0YXRlLmEsc3RhdGUuYiksc3RhdGUuYT0wLENMT1NVUkVfRFRPUlMudW5yZWdpc3RlcihzdGF0ZSkpfSxDTE9TVVJFX0RUT1JTLnJlZ2lzdGVyKHJlYWwsc3RhdGUsc3RhdGUpLHJlYWx9ZnVuY3Rpb24gbWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLGR0b3IsZil7Y29uc3Qgc3RhdGU9e2E6YXJnMCxiOmFyZzEsY250OjEsZHRvcn0scmVhbD0oLi4uYXJncyk9PntzdGF0ZS5jbnQrKztjb25zdCBhPXN0YXRlLmE7c3RhdGUuYT0wO3RyeXtyZXR1cm4gZihhLHN0YXRlLmIsLi4uYXJncyl9ZmluYWxseXtzdGF0ZS5hPWEscmVhbC5fd2JnX2NiX3VucmVmKCl9fTtyZXR1cm4gcmVhbC5fd2JnX2NiX3VucmVmPSgpPT57MD09PS0tc3RhdGUuY250JiYoc3RhdGUuZHRvcihzdGF0ZS5hLHN0YXRlLmIpLHN0YXRlLmE9MCxDTE9TVVJFX0RUT1JTLnVucmVnaXN0ZXIoc3RhdGUpKX0sQ0xPU1VSRV9EVE9SUy5yZWdpc3RlcihyZWFsLHN0YXRlLHN0YXRlKSxyZWFsfWZ1bmN0aW9uIHBhc3NTdHJpbmdUb1dhc20wKGFyZyxtYWxsb2MscmVhbGxvYyl7aWYodm9pZCAwPT09cmVhbGxvYyl7Y29uc3QgYnVmPWNhY2hlZFRleHRFbmNvZGVyLmVuY29kZShhcmcpLHB0cj1tYWxsb2MoYnVmLmxlbmd0aCwxKT4+PjA7cmV0dXJuIGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyLHB0citidWYubGVuZ3RoKS5zZXQoYnVmKSxXQVNNX1ZFQ1RPUl9MRU49YnVmLmxlbmd0aCxwdHJ9bGV0IGxlbj1hcmcubGVuZ3RoLHB0cj1tYWxsb2MobGVuLDEpPj4+MDtjb25zdCBtZW09Z2V0VWludDhBcnJheU1lbW9yeTAoKTtsZXQgb2Zmc2V0PTA7Zm9yKDtvZmZzZXQ8bGVuO29mZnNldCsrKXtjb25zdCBjb2RlPWFyZy5jaGFyQ29kZUF0KG9mZnNldCk7aWYoY29kZT4xMjcpYnJlYWs7bWVtW3B0citvZmZzZXRdPWNvZGV9aWYob2Zmc2V0IT09bGVuKXswIT09b2Zmc2V0JiYoYXJnPWFyZy5zbGljZShvZmZzZXQpKSxwdHI9cmVhbGxvYyhwdHIsbGVuLGxlbj1vZmZzZXQrMyphcmcubGVuZ3RoLDEpPj4+MDtjb25zdCB2aWV3PWdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyK29mZnNldCxwdHIrbGVuKTtvZmZzZXQrPWNhY2hlZFRleHRFbmNvZGVyLmVuY29kZUludG8oYXJnLHZpZXcpLndyaXR0ZW4scHRyPXJlYWxsb2MocHRyLGxlbixvZmZzZXQsMSk+Pj4wfXJldHVybiBXQVNNX1ZFQ1RPUl9MRU49b2Zmc2V0LHB0cn1sZXQgc3RhY2tfcG9pbnRlcj0xMjg7ZnVuY3Rpb24gdGFrZU9iamVjdChpZHgpe2NvbnN0IHJldD1nZXRPYmplY3QoaWR4KTtyZXR1cm4gZHJvcE9iamVjdChpZHgpLHJldH1sZXQgY2FjaGVkVGV4dERlY29kZXI9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSk6dm9pZCAwO2NhY2hlZFRleHREZWNvZGVyJiZjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoKTtjb25zdCBNQVhfU0FGQVJJX0RFQ09ERV9CWVRFUz0yMTQ2NDM1MDcyO2xldCBudW1CeXRlc0RlY29kZWQ9MDtmdW5jdGlvbiBkZWNvZGVUZXh0KHB0cixsZW4pe3JldHVybiBudW1CeXRlc0RlY29kZWQrPWxlbixudW1CeXRlc0RlY29kZWQ+PU1BWF9TQUZBUklfREVDT0RFX0JZVEVTJiYoY2FjaGVkVGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMCxmYXRhbDohMH0pLGNhY2hlZFRleHREZWNvZGVyLmRlY29kZSgpLG51bUJ5dGVzRGVjb2RlZD1sZW4pLGNhY2hlZFRleHREZWNvZGVyLmRlY29kZShnZXRVaW50OEFycmF5TWVtb3J5MCgpLnNsaWNlKHB0cixwdHIrbGVuKSl9Y29uc3QgY2FjaGVkVGV4dEVuY29kZXI9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RW5jb2Rlcj9uZXcgVGV4dEVuY29kZXI6dm9pZCAwO2NhY2hlZFRleHRFbmNvZGVyJiYoY2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlSW50bz1mdW5jdGlvbihhcmcsdmlldyl7Y29uc3QgYnVmPWNhY2hlZFRleHRFbmNvZGVyLmVuY29kZShhcmcpO3JldHVybiB2aWV3LnNldChidWYpLHtyZWFkOmFyZy5sZW5ndGgsd3JpdHRlbjpidWYubGVuZ3RofX0pO2xldCBXQVNNX1ZFQ1RPUl9MRU49MCx3YXNtTW9kdWxlLHdhc207ZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpe2lmKHdhc209aW5zdGFuY2UuZXhwb3J0cyx3YXNtTW9kdWxlPW1vZHVsZSxjYWNoZWREYXRhVmlld01lbW9yeTA9bnVsbCxjYWNoZWRVaW50OEFycmF5TWVtb3J5MD1udWxsLHZvaWQgMCE9PXRocmVhZF9zdGFja19zaXplJiYoIm51bWJlciIhPXR5cGVvZiB0aHJlYWRfc3RhY2tfc2l6ZXx8MD09PXRocmVhZF9zdGFja19zaXplfHx0aHJlYWRfc3RhY2tfc2l6ZSU2NTUzNiE9MCkpdGhyb3ciaW52YWxpZCBzdGFjayBzaXplIjtyZXR1cm4gd2FzbS5fX3diaW5kZ2VuX3N0YXJ0KHRocmVhZF9zdGFja19zaXplKSx3YXNtfWFzeW5jIGZ1bmN0aW9uIF9fd2JnX2xvYWQobW9kdWxlLGltcG9ydHMpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBSZXNwb25zZSYmbW9kdWxlIGluc3RhbmNlb2YgUmVzcG9uc2Upe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyl0cnl7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKG1vZHVsZSxpbXBvcnRzKX1jYXRjaChlKXtpZighKG1vZHVsZS5vayYmZnVuY3Rpb24gZXhwZWN0ZWRSZXNwb25zZVR5cGUodHlwZSl7c3dpdGNoKHR5cGUpe2Nhc2UiYmFzaWMiOmNhc2UiY29ycyI6Y2FzZSJkZWZhdWx0IjpyZXR1cm4hMH1yZXR1cm4hMX0obW9kdWxlLnR5cGUpKXx8ImFwcGxpY2F0aW9uL3dhc20iPT09bW9kdWxlLmhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiKSl0aHJvdyBlO2NvbnNvbGUud2FybigiYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nYCBmYWlsZWQgYmVjYXVzZSB5b3VyIHNlcnZlciBkb2VzIG5vdCBzZXJ2ZSBXYXNtIHdpdGggYGFwcGxpY2F0aW9uL3dhc21gIE1JTUUgdHlwZS4gRmFsbGluZyBiYWNrIHRvIGBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZWAgd2hpY2ggaXMgc2xvd2VyLiBPcmlnaW5hbCBlcnJvcjpcbiIsZSl9Y29uc3QgYnl0ZXM9YXdhaXQgbW9kdWxlLmFycmF5QnVmZmVyKCk7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ5dGVzLGltcG9ydHMpfXtjb25zdCBpbnN0YW5jZT1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2R1bGUsaW1wb3J0cyk7cmV0dXJuIGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2U/e2luc3RhbmNlLG1vZHVsZX06aW5zdGFuY2V9fWZ1bmN0aW9uIGluaXRTeW5jKG1vZHVsZSxtZW1vcnkpe2lmKHZvaWQgMCE9PXdhc20pcmV0dXJuIHdhc207bGV0IHRocmVhZF9zdGFja19zaXplO3ZvaWQgMCE9PW1vZHVsZSYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZSxtZW1vcnksdGhyZWFkX3N0YWNrX3NpemV9PW1vZHVsZSk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIGBpbml0U3luYygpYDsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKTtjb25zdCBpbXBvcnRzPV9fd2JnX2dldF9pbXBvcnRzKG1lbW9yeSk7bW9kdWxlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlfHwobW9kdWxlPW5ldyBXZWJBc3NlbWJseS5Nb2R1bGUobW9kdWxlKSk7cmV0dXJuIF9fd2JnX2ZpbmFsaXplX2luaXQobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG1vZHVsZSxpbXBvcnRzKSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpfWFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQobW9kdWxlX29yX3BhdGgsbWVtb3J5KXtpZih2b2lkIDAhPT13YXNtKXJldHVybiB3YXNtO2xldCB0aHJlYWRfc3RhY2tfc2l6ZTt2b2lkIDAhPT1tb2R1bGVfb3JfcGF0aCYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGVfb3JfcGF0aCk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlX29yX3BhdGgsbWVtb3J5LHRocmVhZF9zdGFja19zaXplfT1tb2R1bGVfb3JfcGF0aCk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKSx2b2lkIDA9PT1tb2R1bGVfb3JfcGF0aCYmKG1vZHVsZV9vcl9wYXRoPW5ldyBVUkwoX193ZWJwYWNrX3JlcXVpcmVfXygiLi9zcmMvdXRvby9pbmRleF9iZy53YXNtIiksX193ZWJwYWNrX3JlcXVpcmVfXy5iKSk7Y29uc3QgaW1wb3J0cz1fX3diZ19nZXRfaW1wb3J0cyhtZW1vcnkpOygic3RyaW5nIj09dHlwZW9mIG1vZHVsZV9vcl9wYXRofHwiZnVuY3Rpb24iPT10eXBlb2YgUmVxdWVzdCYmbW9kdWxlX29yX3BhdGggaW5zdGFuY2VvZiBSZXF1ZXN0fHwiZnVuY3Rpb24iPT10eXBlb2YgVVJMJiZtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkmJihtb2R1bGVfb3JfcGF0aD1mZXRjaChtb2R1bGVfb3JfcGF0aCkpO2NvbnN0e2luc3RhbmNlLG1vZHVsZX09YXdhaXQgX193YmdfbG9hZChhd2FpdCBtb2R1bGVfb3JfcGF0aCxpbXBvcnRzKTtyZXR1cm4gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpfX0sIi4vc3JjL3V0b28vaW5kZXhfYmcud2FzbSIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fLnArIjI1NDFjNzcwOTc3MmY0NDdiNjYzLndhc20ifX0sX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpe3ZhciBjYWNoZWRNb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtpZih2b2lkIDAhPT1jYWNoZWRNb2R1bGUpcmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO3ZhciBtb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXT17ZXhwb3J0czp7fX07cmV0dXJuIF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSxtb2R1bGUuZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKSxtb2R1bGUuZXhwb3J0c31fX3dlYnBhY2tfcmVxdWlyZV9fLm09X193ZWJwYWNrX21vZHVsZXNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fLmQ9KGV4cG9ydHMsZGVmaW5pdGlvbik9Pntmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKV9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLGtleSkmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cyxrZXkpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxrZXkse2VudW1lcmFibGU6ITAsZ2V0OmRlZmluaXRpb25ba2V5XX0pfSxfX3dlYnBhY2tfcmVxdWlyZV9fLmc9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaChlKXtpZigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93fX0oKSxfX3dlYnBhY2tfcmVxdWlyZV9fLm89KG9iaixwcm9wKT0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKSwoKCk9Pnt2YXIgc2NyaXB0VXJsO19fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzJiYoc2NyaXB0VXJsPV9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbisiIik7dmFyIGRvY3VtZW50PV9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtpZighc2NyaXB0VXJsJiZkb2N1bWVudCYmKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJiJTQ1JJUFQiPT09ZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkmJihzY3JpcHRVcmw9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLCFzY3JpcHRVcmwpKXt2YXIgc2NyaXB0cz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7aWYoc2NyaXB0cy5sZW5ndGgpZm9yKHZhciBpPXNjcmlwdHMubGVuZ3RoLTE7aT4tMSYmKCFzY3JpcHRVcmx8fCEvXmh0dHAocz8pOi8udGVzdChzY3JpcHRVcmwpKTspc2NyaXB0VXJsPXNjcmlwdHNbaS0tXS5zcmN9aWYoIXNjcmlwdFVybCl0aHJvdyBuZXcgRXJyb3IoIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyIik7c2NyaXB0VXJsPXNjcmlwdFVybC5yZXBsYWNlKC9eYmxvYjovLCIiKS5yZXBsYWNlKC8jLiokLywiIikucmVwbGFjZSgvXD8uKiQvLCIiKS5yZXBsYWNlKC9cL1teXC9dKyQvLCIvIiksX193ZWJwYWNrX3JlcXVpcmVfXy5wPXNjcmlwdFVybH0pKCksX193ZWJwYWNrX3JlcXVpcmVfXy5iPXNlbGYubG9jYXRpb24rIiI7dmFyIF9fd2VicGFja19leHBvcnRzX189e307Y29uc3QgcHJveHlNYXJrZXI9U3ltYm9sKCJDb21saW5rLnByb3h5IiksY3JlYXRlRW5kcG9pbnQ9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50IikscmVsZWFzZVByb3h5PVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxmaW5hbGl6ZXI9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLHRocm93TWFya2VyPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxpc09iamVjdD12YWw9PiJvYmplY3QiPT10eXBlb2YgdmFsJiZudWxsIT09dmFsfHwiZnVuY3Rpb24iPT10eXBlb2YgdmFsLHByb3h5VHJhbnNmZXJIYW5kbGVyPXtjYW5IYW5kbGU6dmFsPT5pc09iamVjdCh2YWwpJiZ2YWxbcHJveHlNYXJrZXJdLHNlcmlhbGl6ZShvYmope2NvbnN0e3BvcnQxLHBvcnQyfT1uZXcgTWVzc2FnZUNoYW5uZWw7cmV0dXJuIGV4cG9zZShvYmoscG9ydDEpLFtwb3J0MixbcG9ydDJdXX0sZGVzZXJpYWxpemU6cG9ydD0+KHBvcnQuc3RhcnQoKSx3cmFwKHBvcnQpKX0sdGhyb3dUcmFuc2ZlckhhbmRsZXI9e2NhbkhhbmRsZTp2YWx1ZT0+aXNPYmplY3QodmFsdWUpJiZ0aHJvd01hcmtlciBpbiB2YWx1ZSxzZXJpYWxpemUoe3ZhbHVlfSl7bGV0IHNlcmlhbGl6ZWQ7cmV0dXJuIHNlcmlhbGl6ZWQ9dmFsdWUgaW5zdGFuY2VvZiBFcnJvcj97aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTp2YWx1ZS5tZXNzYWdlLG5hbWU6dmFsdWUubmFtZSxzdGFjazp2YWx1ZS5zdGFja319Ontpc0Vycm9yOiExLHZhbHVlfSxbc2VyaWFsaXplZCxbXV19LGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQpe2lmKHNlcmlhbGl6ZWQuaXNFcnJvcil0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihzZXJpYWxpemVkLnZhbHVlLm1lc3NhZ2UpLHNlcmlhbGl6ZWQudmFsdWUpO3Rocm93IHNlcmlhbGl6ZWQudmFsdWV9fSx0cmFuc2ZlckhhbmRsZXJzPW5ldyBNYXAoW1sicHJveHkiLHByb3h5VHJhbnNmZXJIYW5kbGVyXSxbInRocm93Iix0aHJvd1RyYW5zZmVySGFuZGxlcl1dKTtmdW5jdGlvbiBpc0FsbG93ZWRPcmlnaW4oYWxsb3dlZE9yaWdpbnMsb3JpZ2luKXtmb3IoY29uc3QgYWxsb3dlZE9yaWdpbiBvZiBhbGxvd2VkT3JpZ2lucyl7aWYob3JpZ2luPT09YWxsb3dlZE9yaWdpbnx8IioiPT09YWxsb3dlZE9yaWdpbilyZXR1cm4hMDtpZihhbGxvd2VkT3JpZ2luIGluc3RhbmNlb2YgUmVnRXhwJiZhbGxvd2VkT3JpZ2luLnRlc3Qob3JpZ2luKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBleHBvc2Uob2JqLGVwPWdsb2JhbFRoaXMsYWxsb3dlZE9yaWdpbnM9WyIqIl0pe2VwLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGNhbGxiYWNrKGV2KXtpZighZXZ8fCFldi5kYXRhKXJldHVybjtpZighaXNBbGxvd2VkT3JpZ2luKGFsbG93ZWRPcmlnaW5zLGV2Lm9yaWdpbikpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtldi5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO2NvbnN0e2lkLHR5cGUscGF0aH09T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0sZXYuZGF0YSksYXJndW1lbnRMaXN0PShldi5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChmcm9tV2lyZVZhbHVlKTtsZXQgcmV0dXJuVmFsdWU7dHJ5e2NvbnN0IHBhcmVudD1wYXRoLnNsaWNlKDAsLTEpLnJlZHVjZSgob2JqLHByb3ApPT5vYmpbcHJvcF0sb2JqKSxyYXdWYWx1ZT1wYXRoLnJlZHVjZSgob2JqLHByb3ApPT5vYmpbcHJvcF0sb2JqKTtzd2l0Y2godHlwZSl7Y2FzZSJHRVQiOnJldHVyblZhbHVlPXJhd1ZhbHVlO2JyZWFrO2Nhc2UiU0VUIjpwYXJlbnRbcGF0aC5zbGljZSgtMSlbMF1dPWZyb21XaXJlVmFsdWUoZXYuZGF0YS52YWx1ZSkscmV0dXJuVmFsdWU9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6cmV0dXJuVmFsdWU9cmF3VmFsdWUuYXBwbHkocGFyZW50LGFyZ3VtZW50TGlzdCk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOnJldHVyblZhbHVlPXByb3h5KG5ldyByYXdWYWx1ZSguLi5hcmd1bWVudExpc3QpKTticmVhaztjYXNlIkVORFBPSU5UIjp7Y29uc3R7cG9ydDEscG9ydDJ9PW5ldyBNZXNzYWdlQ2hhbm5lbDtleHBvc2Uob2JqLHBvcnQyKSxyZXR1cm5WYWx1ZT10cmFuc2Zlcihwb3J0MSxbcG9ydDFdKX1icmVhaztjYXNlIlJFTEVBU0UiOnJldHVyblZhbHVlPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2godmFsdWUpe3JldHVyblZhbHVlPXt2YWx1ZSxbdGhyb3dNYXJrZXJdOjB9fVByb21pc2UucmVzb2x2ZShyZXR1cm5WYWx1ZSkuY2F0Y2godmFsdWU9Pih7dmFsdWUsW3Rocm93TWFya2VyXTowfSkpLnRoZW4ocmV0dXJuVmFsdWU9Pntjb25zdFt3aXJlVmFsdWUsdHJhbnNmZXJhYmxlc109dG9XaXJlVmFsdWUocmV0dXJuVmFsdWUpO2VwLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx3aXJlVmFsdWUpLHtpZH0pLHRyYW5zZmVyYWJsZXMpLCJSRUxFQVNFIj09PXR5cGUmJihlcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixjYWxsYmFjayksY2xvc2VFbmRQb2ludChlcCksZmluYWxpemVyIGluIG9iaiYmImZ1bmN0aW9uIj09dHlwZW9mIG9ialtmaW5hbGl6ZXJdJiZvYmpbZmluYWxpemVyXSgpKX0pLmNhdGNoKGVycm9yPT57Y29uc3Rbd2lyZVZhbHVlLHRyYW5zZmVyYWJsZXNdPXRvV2lyZVZhbHVlKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbdGhyb3dNYXJrZXJdOjB9KTtlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sd2lyZVZhbHVlKSx7aWR9KSx0cmFuc2ZlcmFibGVzKX0pfSksZXAuc3RhcnQmJmVwLnN0YXJ0KCl9ZnVuY3Rpb24gaXNNZXNzYWdlUG9ydChlbmRwb2ludCl7cmV0dXJuIk1lc3NhZ2VQb3J0Ij09PWVuZHBvaW50LmNvbnN0cnVjdG9yLm5hbWV9ZnVuY3Rpb24gY2xvc2VFbmRQb2ludChlbmRwb2ludCl7aXNNZXNzYWdlUG9ydChlbmRwb2ludCkmJmVuZHBvaW50LmNsb3NlKCl9ZnVuY3Rpb24gd3JhcChlcCx0YXJnZXQpe2NvbnN0IHBlbmRpbmdMaXN0ZW5lcnM9bmV3IE1hcDtyZXR1cm4gZXAuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShldil7Y29uc3R7ZGF0YX09ZXY7aWYoIWRhdGF8fCFkYXRhLmlkKXJldHVybjtjb25zdCByZXNvbHZlcj1wZW5kaW5nTGlzdGVuZXJzLmdldChkYXRhLmlkKTtpZihyZXNvbHZlcil0cnl7cmVzb2x2ZXIoZGF0YSl9ZmluYWxseXtwZW5kaW5nTGlzdGVuZXJzLmRlbGV0ZShkYXRhLmlkKX19KSxjcmVhdGVQcm94eShlcCxwZW5kaW5nTGlzdGVuZXJzLFtdLHRhcmdldCl9ZnVuY3Rpb24gdGhyb3dJZlByb3h5UmVsZWFzZWQoaXNSZWxlYXNlZCl7aWYoaXNSZWxlYXNlZCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHJlbGVhc2VFbmRwb2ludChlcCl7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsbmV3IE1hcCx7dHlwZToiUkVMRUFTRSJ9KS50aGVuKCgpPT57Y2xvc2VFbmRQb2ludChlcCl9KX1jb25zdCBwcm94eUNvdW50ZXI9bmV3IFdlYWtNYXAscHJveHlGaW5hbGl6ZXJzPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZXA9Pntjb25zdCBuZXdDb3VudD0ocHJveHlDb3VudGVyLmdldChlcCl8fDApLTE7cHJveHlDb3VudGVyLnNldChlcCxuZXdDb3VudCksMD09PW5ld0NvdW50JiZyZWxlYXNlRW5kcG9pbnQoZXApfSk7ZnVuY3Rpb24gcmVnaXN0ZXJQcm94eShwcm94eSxlcCl7Y29uc3QgbmV3Q291bnQ9KHByb3h5Q291bnRlci5nZXQoZXApfHwwKSsxO3Byb3h5Q291bnRlci5zZXQoZXAsbmV3Q291bnQpLHByb3h5RmluYWxpemVycyYmcHJveHlGaW5hbGl6ZXJzLnJlZ2lzdGVyKHByb3h5LGVwLHByb3h5KX1mdW5jdGlvbiB1bnJlZ2lzdGVyUHJveHkocHJveHkpe3Byb3h5RmluYWxpemVycyYmcHJveHlGaW5hbGl6ZXJzLnVucmVnaXN0ZXIocHJveHkpfWZ1bmN0aW9uIGNyZWF0ZVByb3h5KGVwLHBlbmRpbmdMaXN0ZW5lcnMscGF0aD1bXSx0YXJnZXQ9ZnVuY3Rpb24oKXt9KXtsZXQgaXNQcm94eVJlbGVhc2VkPSExO2NvbnN0IHByb3h5PW5ldyBQcm94eSh0YXJnZXQse2dldChfdGFyZ2V0LHByb3Ape2lmKHRocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCkscHJvcD09PXJlbGVhc2VQcm94eSlyZXR1cm4oKT0+e3VucmVnaXN0ZXJQcm94eShwcm94eSkscmVsZWFzZUVuZHBvaW50KGVwKSxwZW5kaW5nTGlzdGVuZXJzLmNsZWFyKCksaXNQcm94eVJlbGVhc2VkPSEwfTtpZigidGhlbiI9PT1wcm9wKXtpZigwPT09cGF0aC5sZW5ndGgpcmV0dXJue3RoZW46KCk9PnByb3h5fTtjb25zdCByPXJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyx7dHlwZToiR0VUIixwYXRoOnBhdGgubWFwKHA9PnAudG9TdHJpbmcoKSl9KS50aGVuKGZyb21XaXJlVmFsdWUpO3JldHVybiByLnRoZW4uYmluZChyKX1yZXR1cm4gY3JlYXRlUHJveHkoZXAscGVuZGluZ0xpc3RlbmVycyxbLi4ucGF0aCxwcm9wXSl9LHNldChfdGFyZ2V0LHByb3AscmF3VmFsdWUpe3Rocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCk7Y29uc3RbdmFsdWUsdHJhbnNmZXJhYmxlc109dG9XaXJlVmFsdWUocmF3VmFsdWUpO3JldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLHBlbmRpbmdMaXN0ZW5lcnMse3R5cGU6IlNFVCIscGF0aDpbLi4ucGF0aCxwcm9wXS5tYXAocD0+cC50b1N0cmluZygpKSx2YWx1ZX0sdHJhbnNmZXJhYmxlcykudGhlbihmcm9tV2lyZVZhbHVlKX0sYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxyYXdBcmd1bWVudExpc3Qpe3Rocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCk7Y29uc3QgbGFzdD1wYXRoW3BhdGgubGVuZ3RoLTFdO2lmKGxhc3Q9PT1jcmVhdGVFbmRwb2ludClyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGZyb21XaXJlVmFsdWUpO2lmKCJiaW5kIj09PWxhc3QpcmV0dXJuIGNyZWF0ZVByb3h5KGVwLHBlbmRpbmdMaXN0ZW5lcnMscGF0aC5zbGljZSgwLC0xKSk7Y29uc3RbYXJndW1lbnRMaXN0LHRyYW5zZmVyYWJsZXNdPXByb2Nlc3NBcmd1bWVudHMocmF3QXJndW1lbnRMaXN0KTtyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLHt0eXBlOiJBUFBMWSIscGF0aDpwYXRoLm1hcChwPT5wLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdH0sdHJhbnNmZXJhYmxlcykudGhlbihmcm9tV2lyZVZhbHVlKX0sY29uc3RydWN0KF90YXJnZXQscmF3QXJndW1lbnRMaXN0KXt0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpO2NvbnN0W2FyZ3VtZW50TGlzdCx0cmFuc2ZlcmFibGVzXT1wcm9jZXNzQXJndW1lbnRzKHJhd0FyZ3VtZW50TGlzdCk7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyx7dHlwZToiQ09OU1RSVUNUIixwYXRoOnBhdGgubWFwKHA9PnAudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0fSx0cmFuc2ZlcmFibGVzKS50aGVuKGZyb21XaXJlVmFsdWUpfX0pO3JldHVybiByZWdpc3RlclByb3h5KHByb3h5LGVwKSxwcm94eX1mdW5jdGlvbiBteUZsYXQoYXJyKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxhcnIpfWZ1bmN0aW9uIHByb2Nlc3NBcmd1bWVudHMoYXJndW1lbnRMaXN0KXtjb25zdCBwcm9jZXNzZWQ9YXJndW1lbnRMaXN0Lm1hcCh0b1dpcmVWYWx1ZSk7cmV0dXJuW3Byb2Nlc3NlZC5tYXAodj0+dlswXSksbXlGbGF0KHByb2Nlc3NlZC5tYXAodj0+dlsxXSkpXX1jb25zdCB0cmFuc2ZlckNhY2hlPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHRyYW5zZmVyKG9iaix0cmFuc2ZlcnMpe3JldHVybiB0cmFuc2ZlckNhY2hlLnNldChvYmosdHJhbnNmZXJzKSxvYmp9ZnVuY3Rpb24gcHJveHkob2JqKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihvYmose1twcm94eU1hcmtlcl06ITB9KX1mdW5jdGlvbiB3aW5kb3dFbmRwb2ludCh3LGNvbnRleHQ9Z2xvYmFsVGhpcyx0YXJnZXRPcmlnaW49IioiKXtyZXR1cm57cG9zdE1lc3NhZ2U6KG1zZyx0cmFuc2ZlcmFibGVzKT0+dy5wb3N0TWVzc2FnZShtc2csdGFyZ2V0T3JpZ2luLHRyYW5zZmVyYWJsZXMpLGFkZEV2ZW50TGlzdGVuZXI6Y29udGV4dC5hZGRFdmVudExpc3RlbmVyLmJpbmQoY29udGV4dCkscmVtb3ZlRXZlbnRMaXN0ZW5lcjpjb250ZXh0LnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChjb250ZXh0KX19ZnVuY3Rpb24gdG9XaXJlVmFsdWUodmFsdWUpe2Zvcihjb25zdFtuYW1lLGhhbmRsZXJdb2YgdHJhbnNmZXJIYW5kbGVycylpZihoYW5kbGVyLmNhbkhhbmRsZSh2YWx1ZSkpe2NvbnN0W3NlcmlhbGl6ZWRWYWx1ZSx0cmFuc2ZlcmFibGVzXT1oYW5kbGVyLnNlcmlhbGl6ZSh2YWx1ZSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lLHZhbHVlOnNlcmlhbGl6ZWRWYWx1ZX0sdHJhbnNmZXJhYmxlc119cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlfSx0cmFuc2ZlckNhY2hlLmdldCh2YWx1ZSl8fFtdXX1mdW5jdGlvbiBmcm9tV2lyZVZhbHVlKHZhbHVlKXtzd2l0Y2godmFsdWUudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gdHJhbnNmZXJIYW5kbGVycy5nZXQodmFsdWUubmFtZSkuZGVzZXJpYWxpemUodmFsdWUudmFsdWUpO2Nhc2UiUkFXIjpyZXR1cm4gdmFsdWUudmFsdWV9fWZ1bmN0aW9uIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyxtc2csdHJhbnNmZXJzKXtyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+e2NvbnN0IGlkPWdlbmVyYXRlVVVJRCgpO3BlbmRpbmdMaXN0ZW5lcnMuc2V0KGlkLHJlc29sdmUpLGVwLnN0YXJ0JiZlcC5zdGFydCgpLGVwLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkfSxtc2cpLHRyYW5zZmVycyl9KX1mdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfXZhciBXb3JrZXJNZXNzYWdlVHlwZTshZnVuY3Rpb24oV29ya2VyTWVzc2FnZVR5cGUpe1dvcmtlck1lc3NhZ2VUeXBlW1dvcmtlck1lc3NhZ2VUeXBlLkluaXRDb25uZWN0aW9uPTE0NjQ2NjQwNjRdPSJJbml0Q29ubmVjdGlvbiIsV29ya2VyTWVzc2FnZVR5cGVbV29ya2VyTWVzc2FnZVR5cGUuUmVxdWVzdEZvcms9MTQ2NDY2NDA2NV09IlJlcXVlc3RGb3JrIn0oV29ya2VyTWVzc2FnZVR5cGV8fChXb3JrZXJNZXNzYWdlVHlwZT17fSkpO2NvbnN0IEhhbmRTaGFrZT1Xb3JrZXJNZXNzYWdlVHlwZS5Jbml0Q29ubmVjdGlvbixGb3JrPVdvcmtlck1lc3NhZ2VUeXBlLlJlcXVlc3RGb3JrO3ZhciBTV01lc3NhZ2VUeXBlOyFmdW5jdGlvbihTV01lc3NhZ2VUeXBlKXtTV01lc3NhZ2VUeXBlW1NXTWVzc2FnZVR5cGUuSGFuZFNoYWtlPTEzOTgyMTA1NjBdPSJIYW5kU2hha2UiLFNXTWVzc2FnZVR5cGVbU1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQaW5nPTEzOTgyMTA1NjFdPSJIZWFydGJlYXRQaW5nIixTV01lc3NhZ2VUeXBlW1NXTWVzc2FnZVR5cGUuSGVhcnRiZWF0UG9uZz0xMzk4MjEwNTYyXT0iSGVhcnRiZWF0UG9uZyJ9KFNXTWVzc2FnZVR5cGV8fChTV01lc3NhZ2VUeXBlPXt9KSk7Y29uc3QgU2VydmljZVdvcmtlckhhbmRTaGFrZT1TV01lc3NhZ2VUeXBlLkhhbmRTaGFrZSxTZXJ2aWNlV29ya2VySGVhcnRiZWF0UGluZz1TV01lc3NhZ2VUeXBlLkhlYXJ0YmVhdFBpbmcsU2VydmljZVdvcmtlckhlYXJ0YmVhdFBvbmc9U1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQb25nO3ZhciB1dG9vPV9fd2VicGFja19yZXF1aXJlX18oIi4vc3JjL3V0b28vaW5kZXguanMiKTtmdW5jdGlvbiBjcmVhdGVXb3JrZXJGcm9tRGF0YVVyaShkYXRhVXJpLG9wdGlvbnMpe2NvbnN0IGlkeD1kYXRhVXJpLmluZGV4T2YoIjtiYXNlNjQsIik7aWYoLTE9PT1pZHgpcmV0dXJuIG5ldyBXb3JrZXIoZGF0YVVyaSxvcHRpb25zKTtjb25zdCBiYXNlNjQ9ZGF0YVVyaS5zbGljZShpZHgrOCksY29kZT1hdG9iKGJhc2U2NCksYmxvYj1uZXcgQmxvYihbY29kZV0se3R5cGU6ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQifSk7cmV0dXJuIG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxvcHRpb25zKX1sZXQgbmV4dFdvcmtlcklkPTA7Y29uc3QgbG9hZGVyV29ya2Vycz17fSxydW5Mb2FkZXJXb3JrZXJQb29sPWFzeW5jKHByb2plY3RDd2QsbG9hZGVyV29ya2VyVXJsLGxvYWRlcnNJbXBvcnRNYXApPT57KDAsdXRvby5uMikoYXN5bmMgY3JlYXRpb249Pntjb25zdHtvcHRpb25zOntmaWxlbmFtZSxjd2R9fT1jcmVhdGlvbjtuZXh0V29ya2VySWQrPTE7Y29uc3Qgd29ya2VySWQ9bmV4dFdvcmtlcklkLHdvcmtlcj1sb2FkZXJXb3JrZXJVcmwuc3RhcnRzV2l0aCgiZGF0YToiKT9jcmVhdGVXb3JrZXJGcm9tRGF0YVVyaShsb2FkZXJXb3JrZXJVcmwse25hbWU6ZmlsZW5hbWV9KTpuZXcgV29ya2VyKGxvYWRlcldvcmtlclVybCx7bmFtZTpmaWxlbmFtZX0pO2xldCBmaW5hbEN3ZD1jd2QsZmluYWxGaWxlbmFtZT1maWxlbmFtZTtpZihwcm9qZWN0Q3dkKXtjb25zdCBzZXA9Ii8iO2xldCBwQ3dkPXByb2plY3RDd2QuZW5kc1dpdGgoc2VwKT9wcm9qZWN0Q3dkLnNsaWNlKDAsLTEpOnByb2plY3RDd2Q7aWYocEN3ZC5zdGFydHNXaXRoKHNlcCl8fChwQ3dkPXNlcCtwQ3dkKSxjd2Quc3RhcnRzV2l0aChzZXApKWZpbmFsQ3dkPWN3ZDtlbHNle2xldCBjQ3dkPWN3ZDsiLiIhPT1jQ3dkJiYiLi8iIT09Y0N3ZHx8KGNDd2Q9IiIpLGZpbmFsQ3dkPWNDd2Q/YCR7cEN3ZH0ke3NlcH0ke2NDd2R9YDpwQ3dkfWlmKGZpbGVuYW1lLnN0YXJ0c1dpdGgoc2VwKSlmaW5hbEZpbGVuYW1lPWZpbGVuYW1lO2Vsc2V7bGV0IGZOYW1lPWZpbGVuYW1lO2ZOYW1lLnN0YXJ0c1dpdGgoIi4vIikmJihmTmFtZT1mTmFtZS5zbGljZSgyKSksZmluYWxGaWxlbmFtZT1gJHtwQ3dkfSR7c2VwfSR7Zk5hbWV9YH19d29ya2VyLnBvc3RNZXNzYWdlKFsoMCx1dG9vLkxvKSgpLCgwLHV0b28uTWgpKCkse3dvcmtlckRhdGE6e2N3ZDpmaW5hbEN3ZCxwcm9qZWN0Um9vdDpwcm9qZWN0Q3dkLHRocmVhZElkOndvcmtlcklkfSxsb2FkZXJBc3NldHM6e2ltcG9ydE1hcHM6bnVsbCE9bG9hZGVyc0ltcG9ydE1hcD9sb2FkZXJzSW1wb3J0TWFwOnt9LGVudHJ5cG9pbnQ6ZmluYWxGaWxlbmFtZX19XSk7KGxvYWRlcldvcmtlcnNbZmlsZW5hbWVdfHwobG9hZGVyV29ya2Vyc1tmaWxlbmFtZV09bmV3IE1hcCkpLnNldCh3b3JrZXJJZCx3b3JrZXIpfSx0ZXJtaW5hdGlvbj0+e2NvbnN0e3dvcmtlcklkLG9wdGlvbnN9PXRlcm1pbmF0aW9uLGVudHJ5cG9pbnQ9b3B0aW9ucy5maWxlbmFtZSx3b3JrZXJzPWxvYWRlcldvcmtlcnNbZW50cnlwb2ludF07aWYod29ya2Vycyl7Y29uc3Qgd29ya2VyPXdvcmtlcnMuZ2V0KHdvcmtlcklkKTt3b3JrZXImJih3b3JrZXIudGVybWluYXRlKCksd29ya2Vycy5kZWxldGUod29ya2VySWQpKX19KX07Y2xhc3MgSW50ZXJuYWxFbmRwb2ludHtjb25zdHJ1Y3Rvcigpe3RoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkPSExLHRoaXMuaG1yUm9vdFRhc2tzPW5ldyBNYXB9YXN5bmMgbW91bnQob3B0KXt2YXIgX2E7dGhpcy5vcHRpb25zPW9wdDtjb25zdHtjd2Qsd2FzbVVybCx0aHJlYWRXb3JrZXJVcmwsbG9nRmlsdGVyfT1vcHQ7bnVsbCE9PShfYT10aGlzLndhc21Jbml0KSYmdm9pZCAwIT09X2F8fCh0aGlzLndhc21Jbml0PSgwLHV0b28uQXkpKHdhc21VcmwpKSxhd2FpdCB0aGlzLndhc21Jbml0O2NvbnN0IGZpbHRlcj1sb2dGaWx0ZXJ8fCJwYWNrX2NvcmU9aW5mbyxwYWNrX2FwaT1pbmZvLHV0b29fd2FzbT1pbmZvLHV0b29fcnVib3Jpc3Q9aW5mbyI7KDAsdXRvby56RCkoZmlsdGVyKTtjb25zdCBhYnNvbHV0ZUN3ZD1jd2Quc3RhcnRzV2l0aCgiLyIpP2N3ZDoiLyIrY3dkO3V0b28uTU0uaW5pdCh0aHJlYWRXb3JrZXJVcmx8fCIiKSx1dG9vLk1NLnNldEN3ZChhYnNvbHV0ZUN3ZCl9YXN5bmMgZGVwcyhvcHRpb25zKXt2YXIgX2EsX2I7YXdhaXQgdGhpcy53YXNtSW5pdDtjb25zdCByZWdpc3RyeT1udWxsIT09KF9hPW51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVnaXN0cnkpJiZ2b2lkIDAhPT1fYT9fYTp2b2lkIDAsY29uY3VycmVuY3k9bnVsbCE9PShfYj1udWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLmNvbmN1cnJlbmN5KSYmdm9pZCAwIT09X2I/X2I6dm9pZCAwO3JldHVybiBhd2FpdCB1dG9vLk1NLmRlcHMocmVnaXN0cnksY29uY3VycmVuY3kpfWFzeW5jIGluc3RhbGwocGFja2FnZUxvY2ssb3B0aW9ucyl7dmFyIF9hO2F3YWl0IHRoaXMud2FzbUluaXQ7Y29uc3QgY29uY3VycmVuY3k9bnVsbCE9PShfYT1udWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLm1heENvbmN1cnJlbnREb3dubG9hZHMpJiZ2b2lkIDAhPT1fYT9fYTp2b2lkIDA7YXdhaXQgdXRvby5NTS5pbnN0YWxsKHBhY2thZ2VMb2NrLGNvbmN1cnJlbmN5KX1hc3luYyBidWlsZChvcHRpb25zKXt2YXIgX2EsX2IsX2M7YXdhaXQgdGhpcy53YXNtSW5pdCwobnVsbD09PShfYT10aGlzLm9wdGlvbnMpfHx2b2lkIDA9PT1fYT92b2lkIDA6X2EubG9hZGVyV29ya2VyVXJsKSYmIXRoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkJiYocnVuTG9hZGVyV29ya2VyUG9vbCh0aGlzLm9wdGlvbnMuY3dkLHRoaXMub3B0aW9ucy5sb2FkZXJXb3JrZXJVcmwsbnVsbD09PShfYj10aGlzLm9wdGlvbnMpfHx2b2lkIDA9PT1fYj92b2lkIDA6X2IubG9hZGVyc0ltcG9ydE1hcCksdGhpcy5sb2FkZXJXb3JrZXJQb29sSW5pdGlhbGl6ZWQ9ITApO2NvbnN0IGJ1aWxkT3B0aW9ucz1uZXcgdXRvby5IMjtyZXR1cm4gYnVpbGRPcHRpb25zLmNsZWFudXA9bnVsbCE9PShfYz1udWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLmNsZWFudXApJiZ2b2lkIDAhPT1fYyYmX2MsKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMuY29uZmlnKSYmKGJ1aWxkT3B0aW9ucy5jb25maWc9b3B0aW9ucy5jb25maWcpLGF3YWl0IHV0b28uTU0uYnVpbGQoYnVpbGRPcHRpb25zKX1hc3luYyBkZXYoY29uZmlnLG9uVXBkYXRlKXt2YXIgX2EsX2I7KG51bGw9PT0oX2E9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09X2E/dm9pZCAwOl9hLmxvYWRlcldvcmtlclVybCkmJiF0aGlzLmxvYWRlcldvcmtlclBvb2xJbml0aWFsaXplZCYmKHJ1bkxvYWRlcldvcmtlclBvb2wodGhpcy5vcHRpb25zLmN3ZCx0aGlzLm9wdGlvbnMubG9hZGVyV29ya2VyVXJsLG51bGw9PT0oX2I9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09X2I/dm9pZCAwOl9iLmxvYWRlcnNJbXBvcnRNYXApLHRoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkPSEwKSx0aGlzLnJvb3RUYXNrPWF3YWl0IHV0b28uTU0uZW50cnlwb2ludHNTdWJzY3JpYmUoY29uZmlnLHJlc3VsdD0+e251bGw9PW9uVXBkYXRlfHxvblVwZGF0ZShyZXN1bHQpfSl9YXN5bmMgcmVhZEZpbGUocGF0aCxlbmNvZGluZyl7bGV0IHJldDtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCwidXRmOCIhPT1lbmNvZGluZz9hd2FpdCB1dG9vLkZzLnJlYWQocGF0aCk6KHJldD1hd2FpdCB1dG9vLkZzLnJlYWRUb1N0cmluZyhwYXRoKSxyZXQpfWFzeW5jIHdyaXRlRmlsZShwYXRoLGNvbnRlbnQsX2VuY29kaW5nKXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCwic3RyaW5nIj09dHlwZW9mIGNvbnRlbnQ/YXdhaXQgdXRvby5Gcy53cml0ZVN0cmluZyhwYXRoLGNvbnRlbnQpOmF3YWl0IHV0b28uRnMud3JpdGUocGF0aCxjb250ZW50KX1hc3luYyBjb3B5RmlsZShzcmMsZHN0KXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCxhd2FpdCB1dG9vLkZzLmNvcHlGaWxlKHNyYyxkc3QpfWFzeW5jIHN0YXQocGF0aCl7YXdhaXQgdGhpcy53YXNtSW5pdDtjb25zdCBqc29uPShhd2FpdCB1dG9vLkZzLm1ldGFkYXRhKHBhdGgpKS50b0pTT04oKTtyZXR1cm57dHlwZTpqc29uLnR5cGUsc2l6ZTpOdW1iZXIoanNvbi5maWxlX3NpemUpfX1hc3luYyByZWFkZGlyKHBhdGgsb3B0aW9ucyl7YXdhaXQgdGhpcy53YXNtSW5pdDtyZXR1cm4obnVsbD09b3B0aW9uc3x8b3B0aW9ucy5yZWN1cnNpdmUsYXdhaXQgdXRvby5Gcy5yZWFkRGlyKHBhdGgpKS5tYXAoZT0+e2NvbnN0IGRpcj1lLnRvSlNPTigpO3JldHVybntuYW1lOmRpci5uYW1lLHR5cGU6ZGlyLnR5cGV9fSl9YXN5bmMgbWtkaXIocGF0aCxvcHRpb25zKXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCwobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpP2F3YWl0IHV0b28uRnMuY3JlYXRlRGlyQWxsKHBhdGgpOmF3YWl0IHV0b28uRnMuY3JlYXRlRGlyKHBhdGgpfWFzeW5jIHJtKHBhdGgsb3B0aW9ucyl7c3dpdGNoKGF3YWl0IHRoaXMud2FzbUluaXQsKGF3YWl0IHV0b28uRnMubWV0YWRhdGEocGF0aCkpLnRvSlNPTigpLnR5cGUpe2Nhc2UiZmlsZSI6cmV0dXJuIGF3YWl0IHV0b28uRnMucmVtb3ZlRmlsZShwYXRoKTtjYXNlImRpcmVjdG9yeSI6cmV0dXJuIGF3YWl0IHV0b28uRnMucmVtb3ZlRGlyKHBhdGgsISEobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpKX19YXN5bmMgcm1kaXIocGF0aCxvcHRpb25zKXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCxhd2FpdCB1dG9vLkZzLnJlbW92ZURpcihwYXRoLCEhKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVjdXJzaXZlKSl9YXN5bmMgZ3ppcChmaWxlcyl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsYXdhaXQgdXRvby5NTS5nemlwKGZpbGVzKX1hc3luYyBzaWdNZDUoY29udGVudCl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsYXdhaXQgdXRvby5NTS5zaWdNZDUoY29udGVudCl9YXN5bmMgaG1yU3Vic2NyaWJlKGlkZW50aWZpZXIsY2FsbGJhY2spe2NvbnN0IHJvb3RUYXNrPWF3YWl0IHV0b28uTU0uaG1yRXZlbnRzKGlkZW50aWZpZXIsY2FsbGJhY2spO3RoaXMuaG1yUm9vdFRhc2tzLnNldChpZGVudGlmaWVyLHJvb3RUYXNrKX11cGRhdGVJbmZvU3Vic2NyaWJlKGFnZ3JlZ2F0aW9uTXMsY2FsbGJhY2spe3V0b28uTU0udXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbk1zLGNhbGxiYWNrKX19Y29uc3QgaW50ZXJuYWxFbmRwb2ludD1uZXcgSW50ZXJuYWxFbmRwb2ludCxDb25uZWN0ZWRQb3J0cz1uZXcgU2V0O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9Pntjb25zdCBwb3J0PWUucG9ydHNbMF07ZS5kYXRhIT09V29ya2VyTWVzc2FnZVR5cGUuSW5pdENvbm5lY3Rpb258fENvbm5lY3RlZFBvcnRzLmhhcyhwb3J0KXx8KGV4cG9zZShpbnRlcm5hbEVuZHBvaW50LHBvcnQpLENvbm5lY3RlZFBvcnRzLmFkZChwb3J0KSl9KSxfX3dlYnBhY2tfZXhwb3J0c19fPV9fd2VicGFja19leHBvcnRzX18uZGVmYXVsdCxfX3dlYnBhY2tfZXhwb3J0c19ffSkoKSk7";
|