@utoo/web 1.5.7 → 1.5.8
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 +28 -25
- 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,LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgd29ya2VySW5saW5lLmpzLkxJQ0VOU0UudHh0ICovCiFmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LGZhY3Rvcnkpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sZmFjdG9yeSk7ZWxzZXt2YXIgYT1mYWN0b3J5KCk7Zm9yKHZhciBpIGluIGEpKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnJvb3QpW2ldPWFbaV19fShzZWxmLCgpPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17Ii4vY2xpL21vY2tzL2Vudi5qcyIobW9kdWxlKXttb2R1bGUuZXhwb3J0cz17fX0sIi4vc3JjL3V0b28vaW5kZXguanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHtBeTooKT0+X193YmdfaW5pdCxGczooKT0+RnMsSDI6KCk9PkJ1aWxkT3B0aW9ucyxMbzooKT0+Z2V0V2FzbU1vZHVsZSxNTTooKT0+UHJvamVjdCxNaDooKT0+Z2V0V2FzbU1lbW9yeSxuMjooKT0+cmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIsekQ6KCk9PmluaXRMb2dGaWx0ZXJ9KTt2YXIgZW52X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygiLi9jbGkvbW9ja3MvZW52LmpzIiksZW52X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdD1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZW52X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pO2NsYXNzIEJ1aWxkT3B0aW9uc3tfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsQnVpbGRPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2J1aWxkb3B0aW9uc19mcmVlKHB0ciwwKX1nZXQgY29uZmlnKCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5idWlsZG9wdGlvbnNfY29uZmlnKHRoaXMuX193YmdfcHRyKSl9Y29uc3RydWN0b3IoKXtjb25zdCByZXQ9d2FzbS5idWlsZG9wdGlvbnNfbmV3KCk7cmV0dXJuIHRoaXMuX193YmdfcHRyPXJldD4+PjAsQnVpbGRPcHRpb25zRmluYWxpemF0aW9uLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31zZXQgY29uZmlnKHZhbCl7d2FzbS5idWlsZG9wdGlvbnNfc2V0X2NvbmZpZyh0aGlzLl9fd2JnX3B0cixhZGRIZWFwT2JqZWN0KHZhbCkpfWdldCBjbGVhbnVwKCl7cmV0dXJuIDAhPT13YXNtLl9fd2JnX2dldF9idWlsZG9wdGlvbnNfY2xlYW51cCh0aGlzLl9fd2JnX3B0cil9c2V0IGNsZWFudXAoYXJnMCl7d2FzbS5fX3diZ19zZXRfYnVpbGRvcHRpb25zX2NsZWFudXAodGhpcy5fX3diZ19wdHIsYXJnMCl9fVN5bWJvbC5kaXNwb3NlJiYoQnVpbGRPcHRpb25zLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09QnVpbGRPcHRpb25zLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBDcmVhdGVTeW5jQWNjZXNzSGFuZGxlT3B0aW9uc3tfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnNGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfY3JlYXRlc3luY2FjY2Vzc2hhbmRsZW9wdGlvbnNfZnJlZShwdHIsMCl9fVN5bWJvbC5kaXNwb3NlJiYoQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnMucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1DcmVhdGVTeW5jQWNjZXNzSGFuZGxlT3B0aW9ucy5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgRGlyRW50cnl7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKERpckVudHJ5LnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLERpckVudHJ5RmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfXRvSlNPTigpe3JldHVybntuYW1lOnRoaXMubmFtZSx0eXBlOnRoaXMudHlwZX19dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyl9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLERpckVudHJ5RmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2RpcmVudHJ5X2ZyZWUocHRyLDApfWdldCBuYW1lKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5fX3diZ19nZXRfZGlyZW50cnlfbmFtZShyZXRwdHIsdGhpcy5fX3diZ19wdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19Z2V0IHR5cGUoKXtjb25zdCByZXQ9d2FzbS5fX3diZ19nZXRfZGlyZW50cnlfdHlwZSh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGVbcmV0XX1zZXQgbmFtZShhcmcwKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGFyZzAsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5fX3diZ19zZXRfZGlyZW50cnlfbmFtZSh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfXNldCB0eXBlKGFyZzApe3dhc20uX193Ymdfc2V0X2RpcmVudHJ5X3R5cGUodGhpcy5fX3diZ19wdHIsKF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGUuaW5kZXhPZihhcmcwKSsxfHwzKS0xKX19ZnVuY3Rpb24gRVJSX0FCT1JUKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfQUJPUlQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9JTlZBTElEX1NUQVRFKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfSU5WQUxJRF9TVEFURShyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19ZnVuY3Rpb24gRVJSX0tFWV9BTFJFQURZX0VYSVNUUygpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0tFWV9BTFJFQURZX0VYSVNUUyhyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19ZnVuY3Rpb24gRVJSX05PVF9BTExPV0VEKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfTk9UX0FMTE9XRUQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9OT1RfRk9VTkQoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9OT1RfRk9VTkQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9OT19NT0RJRklDQVRJT05fQUxMT1dFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0tFWV9BTFJFQURZX0VYSVNUUyhyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19ZnVuY3Rpb24gRVJSX1FVT1RBX0VYQ0VFREVEKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfUVVPVEFfRVhDRUVERUQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9UWVBFX01JU01BVENIKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfVFlQRV9NSVNNQVRDSChyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19U3ltYm9sLmRpc3Bvc2UmJihEaXJFbnRyeS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPURpckVudHJ5LnByb3RvdHlwZS5mcmVlKTtjbGFzcyBGc3tfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsRnNGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfZnNfZnJlZShwdHIsMCl9c3RhdGljIGNvcHlGaWxlKHNyYyxkc3Qpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAoc3JjLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOLHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZHN0LHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfY29weUZpbGUocHRyMCxsZW4wLHB0cjEsbGVuMSkpfXN0YXRpYyBjb3B5RmlsZVN5bmMoc3JjLGRzdCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHNyYyx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGRzdCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX2NvcHlGaWxlU3luYyhyZXRwdHIscHRyMCxsZW4wLHB0cjEsbGVuMSk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgY3JlYXRlRGlyKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX2NyZWF0ZURpcihwdHIwLGxlbjApKX1zdGF0aWMgY3JlYXRlRGlyQWxsKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX2NyZWF0ZURpckFsbChwdHIwLGxlbjApKX1zdGF0aWMgY3JlYXRlRGlyQWxsU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX2NyZWF0ZURpckFsbFN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgY3JlYXRlRGlyU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX2NyZWF0ZURpclN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgbWV0YWRhdGEocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfbWV0YWRhdGEocHRyMCxsZW4wKSl9c3RhdGljIG1ldGFkYXRhU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX21ldGFkYXRhU3luYyhyZXRwdHIscHRyMCxsZW4wKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrOCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMSk7cmV0dXJuIE1ldGFkYXRhLl9fd3JhcChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgcmVhZChwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkKHB0cjAsbGVuMCkpfXN0YXRpYyByZWFkRGlyKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3JlYWREaXIocHRyMCxsZW4wKSl9c3RhdGljIHJlYWREaXJTeW5jKHBhdGgpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfcmVhZERpclN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkscjI9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzgsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cisxMiwhMCkpdGhyb3cgdGFrZU9iamVjdChyMik7dmFyIHYyPWdldEFycmF5SnNWYWx1ZUZyb21XYXNtMChyMCxyMSkuc2xpY2UoKTtyZXR1cm4gd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQocjAsNCpyMSw0KSx2Mn1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fXN0YXRpYyByZWFkU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX3JlYWRTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis4LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIxKTtyZXR1cm4gdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgcmVhZFRvU3RyaW5nKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3JlYWRUb1N0cmluZyhwdHIwLGxlbjApKX1zdGF0aWMgcmVtb3ZlRGlyKHBhdGgscmVjdXJzaXZlKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZW1vdmVEaXIocHRyMCxsZW4wLHJlY3Vyc2l2ZSkpfXN0YXRpYyByZW1vdmVEaXJTeW5jKHBhdGgscmVjdXJzaXZlKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX3JlbW92ZURpclN5bmMocmV0cHRyLHB0cjAsbGVuMCxyZWN1cnNpdmUpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlbW92ZUZpbGUocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVtb3ZlRmlsZShwdHIwLGxlbjApKX1zdGF0aWMgcmVtb3ZlRmlsZVN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZW1vdmVGaWxlU3luYyhyZXRwdHIscHRyMCxsZW4wKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIwKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fXN0YXRpYyB3cml0ZShwYXRoLGNvbnRlbnQpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3dyaXRlKHB0cjAsbGVuMCxhZGRIZWFwT2JqZWN0KGNvbnRlbnQpKSl9c3RhdGljIHdyaXRlU3RyaW5nKHBhdGgsY29udGVudCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOLHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoY29udGVudCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3dyaXRlU3RyaW5nKHB0cjAsbGVuMCxwdHIxLGxlbjEpKX1zdGF0aWMgd3JpdGVTeW5jKHBhdGgsY29udGVudCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc193cml0ZVN5bmMocmV0cHRyLHB0cjAsbGVuMCxhZGRIZWFwT2JqZWN0KGNvbnRlbnQpKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIwKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fX1TeW1ib2wuZGlzcG9zZSYmKEZzLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09RnMucHJvdG90eXBlLmZyZWUpO2NsYXNzIE1ldGFkYXRhe3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShNZXRhZGF0YS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixNZXRhZGF0YUZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian10b0pTT04oKXtyZXR1cm57ZmlsZV9zaXplOnRoaXMuZmlsZV9zaXplLHR5cGU6dGhpcy50eXBlfX10b1N0cmluZygpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKX1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsTWV0YWRhdGFGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfbWV0YWRhdGFfZnJlZShwdHIsMCl9Z2V0IGZpbGVfc2l6ZSgpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF9tZXRhZGF0YV9maWxlX3NpemUodGhpcy5fX3diZ19wdHIpO3JldHVybiBCaWdJbnQuYXNVaW50Tig2NCxyZXQpfWdldCB0eXBlKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X21ldGFkYXRhX3R5cGUodGhpcy5fX3diZ19wdHIpO3JldHVybiBfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlW3JldF19c2V0IGZpbGVfc2l6ZShhcmcwKXt3YXNtLl9fd2JnX3NldF9tZXRhZGF0YV9maWxlX3NpemUodGhpcy5fX3diZ19wdHIsYXJnMCl9c2V0IHR5cGUoYXJnMCl7d2FzbS5fX3diZ19zZXRfbWV0YWRhdGFfdHlwZSh0aGlzLl9fd2JnX3B0ciwoX193YmluZGdlbl9lbnVtX0RpckVudHJ5VHlwZS5pbmRleE9mKGFyZzApKzF8fDMpLTEpfX1TeW1ib2wuZGlzcG9zZSYmKE1ldGFkYXRhLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09TWV0YWRhdGEucHJvdG90eXBlLmZyZWUpO2NsYXNzIFByb2plY3R7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFByb2plY3RGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfcHJvamVjdF9mcmVlKHB0ciwwKX1zdGF0aWMgYnVpbGQob3B0aW9ucyl7X2Fzc2VydENsYXNzKG9wdGlvbnMsQnVpbGRPcHRpb25zKTt2YXIgcHRyMD1vcHRpb25zLl9fZGVzdHJveV9pbnRvX3JhdygpO3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9idWlsZChwdHIwKSl9c3RhdGljIGdldCBjd2QoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLnByb2plY3RfY3dkKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1zdGF0aWMgZGVwcyhyZWdpc3RyeSxjb25jdXJyZW5jeSl7dmFyIHB0cjA9aXNMaWtlTm9uZShyZWdpc3RyeSk/MDpwYXNzU3RyaW5nVG9XYXNtMChyZWdpc3RyeSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfZGVwcyhwdHIwLGxlbjAsaXNMaWtlTm9uZShjb25jdXJyZW5jeSk/NDI5NDk2NzI5Nzpjb25jdXJyZW5jeT4+PjApKX1zdGF0aWMgZW50cnlwb2ludHNTdWJzY3JpYmUoY29uZmlnLGNhbGxiYWNrKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfZW50cnlwb2ludHNTdWJzY3JpYmUoYWRkSGVhcE9iamVjdChjb25maWcpLGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKSl9c3RhdGljIGd6aXAoZmlsZXMpe3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9nemlwKGFkZEhlYXBPYmplY3QoZmlsZXMpKSl9c3RhdGljIGhtckV2ZW50cyhpZGVudGlmaWVyLGNhbGxiYWNrKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGlkZW50aWZpZXIsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2htckV2ZW50cyhwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjYWxsYmFjaykpKX1zdGF0aWMgaW5pdCh0aHJlYWRfdXJsKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHRocmVhZF91cmwsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5wcm9qZWN0X2luaXQocHRyMCxsZW4wKX1zdGF0aWMgaW5zdGFsbChwYWNrYWdlX2xvY2ssbWF4X2NvbmN1cnJlbnRfZG93bmxvYWRzKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhY2thZ2VfbG9jayx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfaW5zdGFsbChwdHIwLGxlbjAsaXNMaWtlTm9uZShtYXhfY29uY3VycmVudF9kb3dubG9hZHMpPzQyOTQ5NjcyOTc6bWF4X2NvbmN1cnJlbnRfZG93bmxvYWRzPj4+MCkpfXN0YXRpYyBzZXRDd2QocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20ucHJvamVjdF9zZXRDd2QocHRyMCxsZW4wKX1zdGF0aWMgc2lnTWQ1KGNvbnRlbnQpe3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9zaWdNZDUoYWRkSGVhcE9iamVjdChjb250ZW50KSkpfXN0YXRpYyB1cGRhdGVJbmZvU3Vic2NyaWJlKGFnZ3JlZ2F0aW9uX21zLGNhbGxiYWNrKXt3YXNtLnByb2plY3RfdXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbl9tcyxhZGRIZWFwT2JqZWN0KGNhbGxiYWNrKSl9c3RhdGljIHdyaXRlQWxsVG9EaXNrKGNhbGxiYWNrKXt3YXNtLnByb2plY3Rfd3JpdGVBbGxUb0Rpc2soYWRkSGVhcE9iamVjdChjYWxsYmFjaykpfX1TeW1ib2wuZGlzcG9zZSYmKFByb2plY3QucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Qcm9qZWN0LnByb3RvdHlwZS5mcmVlKTtjbGFzcyBSb290VGFza3tzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoUm9vdFRhc2sucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsUm9vdFRhc2tGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFJvb3RUYXNrRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3Jvb3R0YXNrX2ZyZWUocHRyLDApfX1TeW1ib2wuZGlzcG9zZSYmKFJvb3RUYXNrLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Um9vdFRhc2sucHJvdG90eXBlLmZyZWUpO2NsYXNzIFdhc21UYXNrTWVzc2FnZXtzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2FzbVRhc2tNZXNzYWdlLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFdhc21UYXNrTWVzc2FnZUZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsV2FzbVRhc2tNZXNzYWdlRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dhc210YXNrbWVzc2FnZV9mcmVlKHB0ciwwKX1nZXQgdGFza0lkKCl7cmV0dXJuIHdhc20uX193YmdfZ2V0X3dhc210YXNrbWVzc2FnZV90YXNrSWQodGhpcy5fX3diZ19wdHIpPj4+MH1zZXQgdGFza0lkKGFyZzApe3dhc20uX193Ymdfc2V0X3dhc210YXNrbWVzc2FnZV90YXNrSWQodGhpcy5fX3diZ19wdHIsYXJnMCl9Z2V0IGRhdGEoKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLndhc210YXNrbWVzc2FnZV9kYXRhKHRoaXMuX193YmdfcHRyKSl9fVN5bWJvbC5kaXNwb3NlJiYoV2FzbVRhc2tNZXNzYWdlLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09V2FzbVRhc2tNZXNzYWdlLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXZWJXb3JrZXJDcmVhdGlvbntzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyQ3JlYXRpb24ucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsV2ViV29ya2VyQ3JlYXRpb25GaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdlYldvcmtlckNyZWF0aW9uRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcmNyZWF0aW9uX2ZyZWUocHRyLDApfWdldCBvcHRpb25zKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X3dlYndvcmtlcmNyZWF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIpO3JldHVybiBXZWJXb3JrZXJPcHRpb25zLl9fd3JhcChyZXQpfXNldCBvcHRpb25zKGFyZzApe19hc3NlcnRDbGFzcyhhcmcwLFdlYldvcmtlck9wdGlvbnMpO3ZhciBwdHIwPWFyZzAuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VyY3JlYXRpb25fb3B0aW9ucyh0aGlzLl9fd2JnX3B0cixwdHIwKX19U3ltYm9sLmRpc3Bvc2UmJihXZWJXb3JrZXJDcmVhdGlvbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVdlYldvcmtlckNyZWF0aW9uLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXZWJXb3JrZXJPcHRpb25ze3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShXZWJXb3JrZXJPcHRpb25zLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFdlYldvcmtlck9wdGlvbnNGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdlYldvcmtlck9wdGlvbnNGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193Ymdfd2Vid29ya2Vyb3B0aW9uc19mcmVlKHB0ciwwKX1nZXQgY3dkKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5fX3diZ19nZXRfd2Vid29ya2Vyb3B0aW9uc19jd2QocmV0cHRyLHRoaXMuX193YmdfcHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWdldCBmaWxlbmFtZSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X3dlYndvcmtlcm9wdGlvbnNfZmlsZW5hbWUocmV0cHRyLHRoaXMuX193YmdfcHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fXNldCBjd2QoYXJnMCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChhcmcwLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uX193Ymdfc2V0X3dlYndvcmtlcm9wdGlvbnNfY3dkKHRoaXMuX193YmdfcHRyLHB0cjAsbGVuMCl9c2V0IGZpbGVuYW1lKGFyZzApe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAoYXJnMCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJvcHRpb25zX2ZpbGVuYW1lKHRoaXMuX193YmdfcHRyLHB0cjAsbGVuMCl9fVN5bWJvbC5kaXNwb3NlJiYoV2ViV29ya2VyT3B0aW9ucy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVdlYldvcmtlck9wdGlvbnMucHJvdG90eXBlLmZyZWUpO2NsYXNzIFdlYldvcmtlclRlcm1pbmF0aW9ue3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShXZWJXb3JrZXJUZXJtaW5hdGlvbi5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXZWJXb3JrZXJUZXJtaW5hdGlvbkZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsV2ViV29ya2VyVGVybWluYXRpb25GaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193Ymdfd2Vid29ya2VydGVybWluYXRpb25fZnJlZShwdHIsMCl9Z2V0IG9wdGlvbnMoKXtjb25zdCByZXQ9d2FzbS5fX3diZ19nZXRfd2Vid29ya2VydGVybWluYXRpb25fb3B0aW9ucyh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIFdlYldvcmtlck9wdGlvbnMuX193cmFwKHJldCl9Z2V0IHdvcmtlcklkKCl7cmV0dXJuIHdhc20uX193YmdfZ2V0X3dlYndvcmtlcnRlcm1pbmF0aW9uX3dvcmtlcklkKHRoaXMuX193YmdfcHRyKT4+PjB9c2V0IG9wdGlvbnMoYXJnMCl7X2Fzc2VydENsYXNzKGFyZzAsV2ViV29ya2VyT3B0aW9ucyk7dmFyIHB0cjA9YXJnMC5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl9vcHRpb25zKHRoaXMuX193YmdfcHRyLHB0cjApfXNldCB3b3JrZXJJZChhcmcwKXt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl93b3JrZXJJZCh0aGlzLl9fd2JnX3B0cixhcmcwKX19ZnVuY3Rpb24gZ2V0V2FzbU1lbW9yeSgpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uZ2V0V2FzbU1lbW9yeSgpKX1mdW5jdGlvbiBnZXRXYXNtTW9kdWxlKCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5nZXRXYXNtTW9kdWxlKCkpfWZ1bmN0aW9uIGluaXRMb2dGaWx0ZXIoZmlsdGVyKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGZpbHRlcix3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmluaXRMb2dGaWx0ZXIocHRyMCxsZW4wKX1mdW5jdGlvbiBpbml0X3BhY2soKXt3YXNtLmluaXRfcGFjaygpfWZ1bmN0aW9uIHJlY3ZUYXNrTWVzc2FnZUluV29ya2VyKHdvcmtlcl9pZCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5yZWN2VGFza01lc3NhZ2VJbldvcmtlcih3b3JrZXJfaWQpKX1mdW5jdGlvbiByZWdpc3RlcldvcmtlclNjaGVkdWxlcihjcmVhdG9yLHRlcm1pbmF0b3Ipe3dhc20ucmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIoYWRkSGVhcE9iamVjdChjcmVhdG9yKSxhZGRIZWFwT2JqZWN0KHRlcm1pbmF0b3IpKX1mdW5jdGlvbiBzZW5kVGFza01lc3NhZ2UobWVzc2FnZSl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5zZW5kVGFza01lc3NhZ2UoYWRkSGVhcE9iamVjdChtZXNzYWdlKSkpfWZ1bmN0aW9uIHdhc21fdGhyZWFkX2VudHJ5X3BvaW50KHB0cil7d2FzbS53YXNtX3RocmVhZF9lbnRyeV9wb2ludChwdHIpfWZ1bmN0aW9uIHdvcmtlckNyZWF0ZWQod29ya2VyX2lkKXt3YXNtLndvcmtlckNyZWF0ZWQod29ya2VyX2lkKX1TeW1ib2wuZGlzcG9zZSYmKFdlYldvcmtlclRlcm1pbmF0aW9uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09V2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlLmZyZWUpO2NvbnN0IF9fdXRvb1JlYWRDdXN0b21TZWN0aW9uPWZ1bmN0aW9uIHJlYWRDdXN0b21TZWN0aW9uKHdhc21Nb2R1bGUsbWVtb3J5LG5hbWVQdHIsbmFtZUxlbmd0aCx0YXJnZXRQdHIsdGFyZ2V0TGVuZ3RoKXtjb25zdCBuYW1lQnl0ZXM9bmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcixuYW1lUHRyLG5hbWVMZW5ndGgpLHNlY3Rpb25OYW1lPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkobmFtZUJ5dGVzKSksc2VjdGlvbnM9V2ViQXNzZW1ibHkuTW9kdWxlLmN1c3RvbVNlY3Rpb25zKHdhc21Nb2R1bGUsc2VjdGlvbk5hbWUpO2lmKDA9PT1zZWN0aW9ucy5sZW5ndGgpcmV0dXJuIDA7Y29uc3Qgc2VjdGlvbj1zZWN0aW9uc1swXSxuZWVkPXNlY3Rpb24uYnl0ZUxlbmd0aDtyZXR1cm4gdGFyZ2V0TGVuZ3RoPG5lZWR8fG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIsdGFyZ2V0UHRyLG5lZWQpLnNldChuZXcgVWludDhBcnJheShzZWN0aW9uKSksbmVlZH07ZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KXtjb25zdCBpbXBvcnQwPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl84YzRlNDNmZTc0NTU5ZDczOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfMGJjODQ4MmM2ZTM1MDhhZTpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZGVidWdTdHJpbmcoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzAwOTVhNzNiOGIxNTZmNzY6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGdldE9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9pc19udWxsX2FjMzRmNTAwMzk5MTc1OWE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIG51bGw9PT1nZXRPYmplY3QoYXJnMCl9LF9fd2JnX19fd2JpbmRnZW5faXNfb2JqZWN0XzVhZThlNTg4MGYyYzFmYmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgdmFsPWdldE9iamVjdChhcmcwKTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHZhbCYmbnVsbCE9PXZhbH0sX193YmdfX193YmluZGdlbl9pc191bmRlZmluZWRfOWU0ZDkyNTM0YzQyZDc3ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gdm9pZCAwPT09Z2V0T2JqZWN0KGFyZzApfSxfX3diZ19fX3diaW5kZ2VuX21lbW9yeV9iZDFmYmNmMjFmYmVmM2M4OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbS5tZW1vcnkpfSxfX3diZ19fX3diaW5kZ2VuX21vZHVsZV9mNmI4MDUyZDc5YzFjYzE2OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbU1vZHVsZSl9LF9fd2JnX19fd2JpbmRnZW5fbnVtYmVyX2dldF84ZmY0MjU1NTE2Y2NhZDNlOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3Qgb2JqPWdldE9iamVjdChhcmcxKSxyZXQ9Im51bWJlciI9PXR5cGVvZiBvYmo/b2JqOnZvaWQgMDtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRGbG9hdDY0KGFyZzArOCxpc0xpa2VOb25lKHJldCk/MDpyZXQsITApLGdldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArMCwhaXNMaWtlTm9uZShyZXQpLCEwKX0sX193YmdfX193YmluZGdlbl9yZXRocm93XzA1NTI1YzU2N2YxNTQ0NzI6ZnVuY3Rpb24oYXJnMCl7dGhyb3cgdGFrZU9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0XzcyZmI2OTYyMDJjNTY3Mjk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBvYmo9Z2V0T2JqZWN0KGFyZzEpLHJldD0ic3RyaW5nIj09dHlwZW9mIG9iaj9vYmo6dm9pZCAwO3ZhciBwdHIxPWlzTGlrZU5vbmUocmV0KT8wOnBhc3NTdHJpbmdUb1dhc20wKHJldCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX3Rocm93X2JlMjg5ZDUwMzRlZDI3MWI6ZnVuY3Rpb24oYXJnMCxhcmcxKXt0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpfSxfX3diZ19fd2JnX2NiX3VucmVmX2Q5Yjg3ZmY3OTgyZTNiMjE6ZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLl93YmdfY2JfdW5yZWYoKX0sX193YmdfYWJvcnRfMmYwNTg0ZTAzZThlMzk1MDpmdW5jdGlvbihhcmcwKXtnZXRPYmplY3QoYXJnMCkuYWJvcnQoKX0sX193YmdfYWJvcnRfZDU0OWI5MmQzYzY2NWRlMTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5hYm9ydChnZXRPYmplY3QoYXJnMSkpfSxfX3diZ19hcHBlbmRfYTk5MmNjYzM3YWE2MmRjNDpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe2dldE9iamVjdChhcmcwKS5hcHBlbmQoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpfSxhcmd1bWVudHMpfSxfX3diZ19hcnJheUJ1ZmZlcl8wNWNlMWFmMjNlOTA2NGU4OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5hcnJheUJ1ZmZlcigpKX0sX193YmdfYXJyYXlCdWZmZXJfYmI1NDA3NjE2NjAwNmMzOTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuYXJyYXlCdWZmZXIoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2FzeW5jXzc5ZjJhNjFmOWQwYjMxY2Y6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGdldE9iamVjdChhcmcwKS5hc3luY30sX193YmdfYnVmZmVyXzdiNWY1M2U0NjU1N2Q4ZjE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmJ1ZmZlcil9LF9fd2JnX2NhbGxfMzg5ZWZlMjg0MzVhOTM4ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19jYWxsXzQ3MDhlMGMxM2JkYzhlOTU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfY2hhbmdlZEhhbmRsZV8xMjM2OTZlYWVhZmYzMmQ3OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHJldD1nZXRPYmplY3QoYXJnMCkuY2hhbmdlZEhhbmRsZTtyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19jbGVhclRpbWVvdXRfN2E0MmI0OTc4NGFlYTY0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChjbGVhclRpbWVvdXQodGFrZU9iamVjdChhcmcwKSkpfSxfX3diZ19jbG9zZV80YmEzMTIyNTNjNDI0MzQyOmZ1bmN0aW9uKGFyZzApe2dldE9iamVjdChhcmcwKS5jbG9zZSgpfSxfX3diZ19jbG9zZV84M2ZiODA5YWNhM2RlN2Y5OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jbG9zZSgpKX0sX193YmdfY3JlYXRlT2JqZWN0VVJMXzkxODE4NWRiNmExMGEwYzg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBwdHIxPXBhc3NTdHJpbmdUb1dhc20wKFVSTC5jcmVhdGVPYmplY3RVUkwoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxhcmd1bWVudHMpfSxfX3diZ19jcmVhdGVXcml0YWJsZV84MGJjNWRlMzc0NDQ4YjQyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jcmVhdGVXcml0YWJsZSgpKX0sX193YmdfZGF0YV81MzMwZGE1MDMxMmQwYmMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5kYXRhKX0sX193YmdfZGVidWdfNDZhOTM5OTVmYzZmODgyMDpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLmRlYnVnKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2RlYnVnX2E0MDk5ZmExMmRiNmNkNjE6ZnVuY3Rpb24oYXJnMCl7Y29uc29sZS5kZWJ1ZyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19kaXJlbnRyeV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRGlyRW50cnkuX193cmFwKGFyZzApKX0sX193YmdfZG9uZV81N2IzOWVjZDlhZGRmZTgxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuZG9uZX0sX193YmdfZW50cmllc18wNGE0Yjk4MjM1MWE3MTdmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5lbnRyaWVzKCkpfSxfX3diZ19lcnJvcl83NTM0YjhlOWEzNmYxYWI0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7bGV0IGRlZmVycmVkMF8wLGRlZmVycmVkMF8xO3RyeXtkZWZlcnJlZDBfMD1hcmcwLGRlZmVycmVkMF8xPWFyZzEsY29uc29sZS5lcnJvcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDBfMCxkZWZlcnJlZDBfMSwxKX19LF9fd2JnX2Vycm9yXzc5NGQwZmZjOWQwMGQ1YzM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5lcnJvcihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSxnZXRPYmplY3QoYXJnMykpfSxfX3diZ19lcnJvcl85YTdmZTNmOTMyMDM0Y2RlOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuZXJyb3IoZ2V0T2JqZWN0KGFyZzApKX0sX193YmdfZXZhbF8zZjBiOWYwY2JhZjQ1YTM0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcmV0PWV2YWwoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpO3JldHVybiBhZGRIZWFwT2JqZWN0KHJldCl9LGFyZ3VtZW50cyl9LF9fd2JnX2ZldGNoXzc0YTNlODRlYmQyYzlhMGU6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZmV0Y2goZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX2ZldGNoX2FmYjZhNGI2Y2FjZjg3NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZmV0Y2goZ2V0T2JqZWN0KGFyZzEpKSl9LF9fd2JnX2ZsdXNoXzIyYjc4NTA2MDU5MmNhNWY6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLmZsdXNoKCl9LGFyZ3VtZW50cyl9LF9fd2JnX2Zyb21fYmRkZDY0ZTdkNWZmNjk0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5mcm9tKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19nZXREaXJlY3RvcnlIYW5kbGVfODdjZThjYTUzY2Y0ZDhkYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5SGFuZGxlKGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19nZXREaXJlY3RvcnlfYjY2YWUzZTc5ZjkwMjk4MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5KCkpfSxfX3diZ19nZXRGaWxlSGFuZGxlX2ZmNGFiOTE3YjQ1YWZmYjM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmdldEZpbGVIYW5kbGUoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKSl9LF9fd2JnX2dldEZpbGVfMTE1MzU0ZmM5NTBlZGM4ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RmlsZSgpKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzgwNTc4YjJmZjJhMDkzYmE6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGdldE9iamVjdChhcmcwKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2dldFRpbWVfMWUzY2QxMzkxYzVjMzk5NTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmdldFRpbWUoKX0sX193YmdfZ2V0VGltZXpvbmVPZmZzZXRfODE3NzZkMTBhNGVjMThhODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmdldFRpbWV6b25lT2Zmc2V0KCl9LF9fd2JnX2dldF85Yjk0ZDczZTYyMjFmNzVjOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApW2FyZzE+Pj4wXSl9LF9fd2JnX2dldF9iM2VkM2FkNGJlMmJjOGFjOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUmVmbGVjdC5nZXQoZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19oYXNfZDRlNTMyMzg5NjZjMTJiNjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBSZWZsZWN0LmhhcyhnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfaGVhZGVyc181OWEyOTM4ZGI5ZjgwOTg1OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5oZWFkZXJzKX0sX193YmdfaW5mb18xNDhkMDQzODQwNTgyMDEyOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuaW5mbyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19pbmZvXzllNjAyY2YxMGM1YzY5MGI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5pbmZvKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2luc3RhbmNlb2ZfRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVfMTUwNmIzZDAxNzc5OWQ0ODpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9Eb21FeGNlcHRpb25fOTljMTc3MTkzZTU1NGI3NTpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBET01FeGNlcHRpb259Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZV81NmExNjcwMzlkNjE0NTQ4OmZ1bmN0aW9uKGFyZzApe2xldCByZXN1bHQ7dHJ5e3Jlc3VsdD1nZXRPYmplY3QoYXJnMClpbnN0YW5jZW9mIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGV9Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfUmVzcG9uc2VfZWUxZDU0ZDc5YWU0MTk3NzpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBSZXNwb25zZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzliOTA3NTkzNWM3NDcwN2M6ZnVuY3Rpb24oYXJnMCl7bGV0IHJlc3VsdDt0cnl7cmVzdWx0PWdldE9iamVjdChhcmcwKWluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaXNBcnJheV9kMzE0YmI5OGZjZjA4MzMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdChhcmcwKSl9LF9fd2JnX2l0ZXJhdG9yXzZmZjY1NjBjYTE1NjhlNTU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChTeW1ib2wuaXRlcmF0b3IpfSxfX3diZ19raW5kXzkwNzY5ZDZjMTZmYWVhZmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS5raW5kO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUhhbmRsZUtpbmQuaW5kZXhPZihyZXQpKzF8fDMpLTF9LF9fd2JnX2xlbmd0aF8zMmVkOWEyNzlhY2QwNTRjOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubGVuZ3RofSxfX3diZ19sZW5ndGhfMzVhN2JhY2U0MGYzNmVhYzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmxlbmd0aH0sX193YmdfbWVzc2FnZV8wYjJiMDI5OGEyMzFiMGQ0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubWVzc2FnZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19tZXRhZGF0YV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoTWV0YWRhdGEuX193cmFwKGFyZzApKX0sX193YmdfbmFtZV8yNDI3NTNlNTExMGNkNzU2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubmFtZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19uYXZpZ2F0b3JfNDQ3ODkzMWYzMmViY2E1NzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmF2aWdhdG9yKX0sX193YmdfbmV3XzBfNzNhZmMzNWViNTQ0ZTUzOTpmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBEYXRlKX0sX193YmdfbmV3XzI0NWNkNWM0OTE1N2U2MDI6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IERhdGUoZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX25ld18zNjEzMDhiMjM1NmNlY2QwOmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IE9iamVjdCl9LF9fd2JnX25ld18zZWIzNmFlMjQxZmU2ZjQ0OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEFycmF5KX0sX193YmdfbmV3XzRmOGYzYzEyM2U0NzQzNTg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgV29ya2VyKGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25ld182NDI4NGJkNDg3ZjlkMjM5OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEhlYWRlcnMpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfNzJjNjI3YmE4MGRlMWMyMTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgSW50MzJBcnJheShnZXRPYmplY3QoYXJnMCkpKX0sX193YmdfbmV3XzhhNmYyMzhhNmVjZTg2ZWE6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgRXJyb3IpfSxfX3diZ19uZXdfOGVjNTgwMWIzOWQ2Zjg2MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgRmlsZVN5c3RlbU9ic2VydmVyKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19uZXdfYjVkOWUyZmIzODlmZWY5MTpmdW5jdGlvbihhcmcwLGFyZzEpe3RyeXt2YXIgc3RhdGUwPXthOmFyZzAsYjphcmcxfTtjb25zdCByZXQ9bmV3IFByb21pc2UoKGFyZzAsYXJnMSk9Pntjb25zdCBhPXN0YXRlMC5hO3N0YXRlMC5hPTA7dHJ5e3JldHVybiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMzM3MShhLHN0YXRlMC5iLGFyZzAsYXJnMSl9ZmluYWxseXtzdGF0ZTAuYT1hfX0pO3JldHVybiBhZGRIZWFwT2JqZWN0KHJldCl9ZmluYWxseXtzdGF0ZTAuYT1zdGF0ZTAuYj0wfX0sX193YmdfbmV3X2I5NDllN2Y1NjE1MGE1ZDE6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQWJvcnRDb250cm9sbGVyKX0sYXJndW1lbnRzKX0sX193YmdfbmV3X2RkMmI2ODBjOGJmNmFlMjk6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IFVpbnQ4QXJyYXkoZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX25ld19mcm9tX3NsaWNlX2EzZDI2MjlkYzE4MjY3ODQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgVWludDhBcnJheShnZXRBcnJheVU4RnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sX193YmdfbmV3X25vX2FyZ3NfMWM3Yzg0MmYwOGQwMGViYjpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBGdW5jdGlvbihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxfX3diZ19uZXdfd2l0aF9sZW5ndGhfYTJjMzljYmU4OGZkOGZmMTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgVWludDhBcnJheShhcmcwPj4+MCkpfSxfX3diZ19uZXdfd2l0aF9vcHRpb25zXzE0NWFmYmE5MjJhZDM3MDM6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBXb3JrZXIoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSksZ2V0T2JqZWN0KGFyZzIpKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25ld193aXRoX3N0cl9hbmRfaW5pdF9hNjFjYmM2YmRlZjIxNjE0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgUmVxdWVzdChnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3X3dpdGhfc3RyX3NlcXVlbmNlX2NlYTJjMDU3MWQ2ZGM2YWI6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEJsb2IoZ2V0T2JqZWN0KGFyZzApKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25leHRfMGE1ZTBmOGFmOTgxNDZhYTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmV4dCgpKX0sYXJndW1lbnRzKX0sX193YmdfbmV4dF8zNDgyZjU0YzQ5ZThhZjE5OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5uZXh0KCkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXh0XzQxOGY4MGQ4ZjUzMDMyMzM6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm5leHQpfSxfX3diZ19ub3dfMGRjNDkyMGE0N2NmNzI4MDpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLm5vdygpfSxfX3diZ19ub3dfYTNhZjlhMmY0YmJhYTRkMTpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfSxfX3diZ19vYnNlcnZlXzMyMjM1YjVlNjE5NWQ0YWI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5vYnNlcnZlKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sX193Ymdfb2ZfZGRjMDk0MmIwZGNlMTZhMTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoQXJyYXkub2YoZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sX193YmdfcGFyc2VfNzA4NDYxYTFmZWRkZmIzODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KEpTT04ucGFyc2UoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmdfcGVyZm9ybWFuY2VfNmFkYzNiODk5ZTQ0OGEyMzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucGVyZm9ybWFuY2UpfSxfX3diZ19wb3N0TWVzc2FnZV8yMDQxZjRlOTBhZjYxMzE4OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnBvc3RNZXNzYWdlKGdldE9iamVjdChhcmcxKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3Bvc3RNZXNzYWdlXzc3MWVmMzI5M2EyOGJiYWM6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucG9zdE1lc3NhZ2UoZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfcHJvdG90eXBlc2V0Y2FsbF9iZGNkY2M1ODQyZTRkNzdkOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChnZXRBcnJheVU4RnJvbVdhc20wKGFyZzAsYXJnMSksZ2V0T2JqZWN0KGFyZzIpKX0sX193YmdfcHVzaF84ZmZkY2IyMDYzMzQwYmE1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGdldE9iamVjdChhcmcwKS5wdXNoKGdldE9iamVjdChhcmcxKSl9LF9fd2JnX3F1ZXVlTWljcm90YXNrXzBhYTBhOTI3Zjc4ZjVkOTg6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnF1ZXVlTWljcm90YXNrKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfNWJiNTM2OTgyZjc4YTU2ZjpmdW5jdGlvbihhcmcwKXtxdWV1ZU1pY3JvdGFzayhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19yYW5kb21fOTEyMjg0ZGJmNjM2ZjI2OTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpfSxfX3diZ19yZWxhdGl2ZVBhdGhDb21wb25lbnRzX2JjNDgyNDAzY2I2ZDdlYTk6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnJlbGF0aXZlUGF0aENvbXBvbmVudHMpfSxfX3diZ19yZW1vdmVFbnRyeV9jNGVmZmZkZDMxOGI1MWExOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyLGFyZzMpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5yZW1vdmVFbnRyeShnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMSxhcmcyKSxnZXRPYmplY3QoYXJnMykpKX0sX193YmdfcmVzb2x2ZV8wMDJjNGI3ZDlkOGY2YjY0OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFByb21pc2UucmVzb2x2ZShnZXRPYmplY3QoYXJnMCkpKX0sX193Ymdfcm9vdHRhc2tfbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFJvb3RUYXNrLl9fd3JhcChhcmcwKSl9LF9fd2JnX3NldFRpbWVvdXRfNjMwMDg2MTM2NDRiMDdhZjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnNldFRpbWVvdXQoZ2V0T2JqZWN0KGFyZzEpLGFyZzIpKX0sYXJndW1lbnRzKX0sX193Ymdfc2V0VGltZW91dF83YmIzNDI5NjYyYWIxZTcwOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3Qoc2V0VGltZW91dChnZXRPYmplY3QoYXJnMCksYXJnMSkpfSxfX3diZ19zZXRfYXRfZTQ1M2NmM2Y0YmU5ZTJkOTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5hdD1hcmcxfSxfX3diZ19zZXRfYm9keV85YTdlMDBhZmUzY2ZlMjQ0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmJvZHk9Z2V0T2JqZWN0KGFyZzEpfSxfX3diZ19zZXRfY2FjaGVfMzE1YTNlZDc3M2E0MTU0MzpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jYWNoZT1fX3diaW5kZ2VuX2VudW1fUmVxdWVzdENhY2hlW2FyZzFdfSxfX3diZ19zZXRfY3JlYXRlXzFmOTAyYzU5MzZhZGRlN2Q6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuY3JlYXRlPTAhPT1hcmcxfSxfX3diZ19zZXRfY3JlYXRlX2M5NWRkY2EwMThmYWM5Y2U6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuY3JlYXRlPTAhPT1hcmcxfSxfX3diZ19zZXRfY3JlZGVudGlhbHNfYzRhNThkMmUwNWVmMjRmYjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVkZW50aWFscz1fX3diaW5kZ2VuX2VudW1fUmVxdWVzdENyZWRlbnRpYWxzW2FyZzFdfSxfX3diZ19zZXRfZjQzZTU3N2FlYTk0NDY1YjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApW2FyZzE+Pj4wXT10YWtlT2JqZWN0KGFyZzIpfSxfX3diZ19zZXRfaGVhZGVyc19jZmM1ZjRiMmMxZjIwNTQ5OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmhlYWRlcnM9Z2V0T2JqZWN0KGFyZzEpfSxfX3diZ19zZXRfbWV0aG9kX2MzZTIwMzc1ZjVhZTdmYWM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe2dldE9iamVjdChhcmcwKS5tZXRob2Q9Z2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMil9LF9fd2JnX3NldF9tb2RlX2IxMzY0MmMzMTI2NDgyMDI6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkubW9kZT1fX3diaW5kZ2VuX2VudW1fUmVxdWVzdE1vZGVbYXJnMV19LF9fd2JnX3NldF9uYW1lXzQ5YjllY2JhN2Y1OGYyZTU6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe2dldE9iamVjdChhcmcwKS5uYW1lPWdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpfSxfX3diZ19zZXRfb25tZXNzYWdlXzZlZDQxMDUwZTRhNWNlZTI6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkub25tZXNzYWdlPWdldE9iamVjdChhcmcxKX0sX193Ymdfc2V0X3JlY3Vyc2l2ZV82NWVkMDdkZjg5MmI0ODg1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnJlY3Vyc2l2ZT0wIT09YXJnMX0sX193Ymdfc2V0X3JlY3Vyc2l2ZV9mNWQzNDE2MDk4MzI4MTEwOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnJlY3Vyc2l2ZT0wIT09YXJnMX0sX193Ymdfc2V0X3NpZ25hbF9mMmQzZjg1OTkyNDg4OTZkOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnNpZ25hbD1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF90eXBlX2UxMjdmMjZiNzhkNzhiZmM6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkudHlwZT1fX3diaW5kZ2VuX2VudW1fV29ya2VyVHlwZVthcmcxXX0sX193Ymdfc2lnbmFsX2QxMjg1ZWNhYjRlYmM1YWQ6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnNpZ25hbCl9LF9fd2JnX3NpemVfZTA1ZDMxY2M2MDQ5ODE1ZjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLnNpemV9LF9fd2JnX3NsaWNlXzU2NmExNWYzMjE0ZmE1MmU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyxhcmc0KXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2xpY2UoYXJnMSxhcmcyLGdldFN0cmluZ0Zyb21XYXNtMChhcmczLGFyZzQpKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3N0YWNrXzBlZDc1ZDY4NTc1YjBmM2M6ZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGdldE9iamVjdChhcmcxKS5zdGFjayx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzEyODM3MTY3YWQ5MzUxMTY6ZnVuY3Rpb24oKXtjb25zdCByZXQ9dm9pZCAwPT09X193ZWJwYWNrX3JlcXVpcmVfXy5nP251bGw6X193ZWJwYWNrX3JlcXVpcmVfXy5nO3JldHVybiBpc0xpa2VOb25lKHJldCk/MDphZGRIZWFwT2JqZWN0KHJldCl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfVEhJU19lNjI4ZTg5YWIzYjFjOTVmOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsVGhpcz9udWxsOmdsb2JhbFRoaXM7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfYTYyMWQzZGZiYjYwZDBjZTpmdW5jdGlvbigpe2NvbnN0IHJldD0idW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/bnVsbDpzZWxmO3JldHVybiBpc0xpa2VOb25lKHJldCk/MDphZGRIZWFwT2JqZWN0KHJldCl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9XSU5ET1dfZjg3MjdmMGNmODg4ZTBiZDpmdW5jdGlvbigpe2NvbnN0IHJldD0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9udWxsOndpbmRvdztyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19zdGF0dXNfODlkN2U4MDNkYjkxMWVlNzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLnN0YXR1c30sX193Ymdfc3RvcmFnZV9jMDAyYjUzYmM0ODgzMjk5OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5zdG9yYWdlKX0sX193Ymdfc3RyaW5naWZ5XzhkMWNjNmZmMzgzZThiYWU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoSlNPTi5zdHJpbmdpZnkoZ2V0T2JqZWN0KGFyZzApKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3N1YmFycmF5X2E5NmUxZmVmMTdlZDIzY2I6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5zdWJhcnJheShhcmcxPj4+MCxhcmcyPj4+MCkpfSxfX3diZ190aGVuXzBkOWZlMmM3YjE4NTdkMzI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS50aGVuKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sX193YmdfdGhlbl9iOWU3YjNiNWYxYTllMWI1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnRoZW4oZ2V0T2JqZWN0KGFyZzEpKSl9LF9fd2JnX3RvU3RyaW5nXzk2NGZmN2ZlNmVjYTgzNjI6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnRvU3RyaW5nKCkpfSxfX3diZ190cnVuY2F0ZV9kYzY2MWZkY2IwMDYyZmE3OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnRydW5jYXRlKGFyZzE+Pj4wKX0sYXJndW1lbnRzKX0sX193YmdfdHlwZV8wM2RmZTQ2MjE3MzVlNTI4OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHJldD1nZXRPYmplY3QoYXJnMCkudHlwZTtyZXR1cm4oX193YmluZGdlbl9lbnVtX0ZpbGVTeXN0ZW1DaGFuZ2VSZWNvcmRUeXBlLmluZGV4T2YocmV0KSsxfHw3KS0xfSxfX3diZ191cmxfYzQ4NGMyNmIxZmJmNTEyNjpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZ2V0T2JqZWN0KGFyZzEpLnVybCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ192YWx1ZV8wNTQ2MjU1YjQxNWU5NmMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS52YWx1ZSl9LF9fd2JnX3ZhbHVlX2ZlNmVlMzRhZjVkYzNkY2U6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnZhbHVlKX0sX193Ymdfd2FpdEFzeW5jX2E1OGIyMTM0YmZmMzljM2U6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KEF0b21pY3Mud2FpdEFzeW5jKGdldE9iamVjdChhcmcwKSxhcmcxPj4+MCxhcmcyKSl9LF9fd2JnX3dhaXRBc3luY19jMGEzOWE3ZDMzMThkOTFlOmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoQXRvbWljcy53YWl0QXN5bmMpfSxfX3diZ193YXJuX2E0MGI5NzE0NjdiMjE5Yzc6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS53YXJuKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX3dhcm5fZjdhZTFiMmU2NmNjYjkzMDpmdW5jdGlvbihhcmcwKXtjb25zb2xlLndhcm4oZ2V0T2JqZWN0KGFyZzApKX0sX193Ymdfd2FzbXRhc2ttZXNzYWdlX25ldzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChXYXNtVGFza01lc3NhZ2UuX193cmFwKGFyZzApKX0sX193Ymdfd2Vid29ya2VyY3JlYXRpb25fbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdlYldvcmtlckNyZWF0aW9uLl9fd3JhcChhcmcwKSl9LF9fd2JnX3dlYndvcmtlcnRlcm1pbmF0aW9uX25ldzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChXZWJXb3JrZXJUZXJtaW5hdGlvbi5fX3dyYXAoYXJnMCkpfSxfX3diZ193cml0ZV8yZDU5MzM3Y2M0OTY5MTlkOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyLGFyZzMpe3JldHVybiBnZXRPYmplY3QoYXJnMCkud3JpdGUoZ2V0QXJyYXlVOEZyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3dyaXRlXzM3ZjVhNjJhMjRkYTY2MmY6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkud3JpdGUoZ2V0T2JqZWN0KGFyZzEpKSl9LGFyZ3VtZW50cyl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAxOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzIzNTUzLF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83NTQ5NCkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMjpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8yMzU1MyxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMjcxKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAzOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzIzNTUzLF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83NTQ5NCkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNDpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VNdXRDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8yMzU1MyxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzU1MzApKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMjM1NTMsX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzIzNTM5KSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzc1NTYxLF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8yMzUzOSkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChhcmcwKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDg6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA5OmZ1bmN0aW9uKGFyZzAsYXJnMSl7dmFyIHYwPWdldEFycmF5SnNWYWx1ZUZyb21XYXNtMChhcmcwLGFyZzEpLnNsaWNlKCk7d2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoYXJnMCw0KmFyZzEsNCk7cmV0dXJuIGFkZEhlYXBPYmplY3QodjApfSxfX3diaW5kZ2VuX2xpbmtfMGIxZjc2ZDIzNWZkMmI4NjpmdW5jdGlvbihhcmcwKXtjb25zdCB2YWw9Im9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIGxldCBbaWEsIGluZGV4LCB2YWx1ZV0gPSBldi5kYXRhO1xuICAgICAgICAgICAgICAgIGlhID0gbmV3IEludDMyQXJyYXkoaWEuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gQXRvbWljcy53YWl0KGlhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgIixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKHZvaWQgMD09PVVSTC5jcmVhdGVPYmplY3RVUkw/ImRhdGE6YXBwbGljYXRpb24vamF2YXNjcmlwdCwiK2VuY29kZVVSSUNvbXBvbmVudCh2YWwpOlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3ZhbF0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KSksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47Z2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCs0LGxlbjEsITApLGdldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArMCxwdHIxLCEwKX0sX193YmluZGdlbl9vYmplY3RfY2xvbmVfcmVmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKSl9LF9fd2JpbmRnZW5fb2JqZWN0X2Ryb3BfcmVmOmZ1bmN0aW9uKGFyZzApe3Rha2VPYmplY3QoYXJnMCl9LG1lbW9yeTptZW1vcnl8fG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6MTAyNSxtYXhpbXVtOjY1NTM2LHNoYXJlZDohMH0pfTtyZXR1cm57X19wcm90b19fOm51bGwsIi4vaW5kZXhfYmcuanMiOmltcG9ydDAsZW52OntfX3Byb3RvX186bnVsbCwuLi5lbnZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyxyZWFkX2N1c3RvbV9zZWN0aW9uOihuYW1lUHRyLG5hbWVMZW5ndGgsdGFyZ2V0UHRyLHRhcmdldExlbmd0aCk9Pl9fdXRvb1JlYWRDdXN0b21TZWN0aW9uKHdhc21Nb2R1bGUsd2FzbS5tZW1vcnksbmFtZVB0cixuYW1lTGVuZ3RoLHRhcmdldFB0cix0YXJnZXRMZW5ndGgpfX19ZnVuY3Rpb24gX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzIzNTM5KGFyZzAsYXJnMSl7d2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMjM1MzkoYXJnMCxhcmcxKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzU0OTQoYXJnMCxhcmcxLGFyZzIpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzc1NDk0KGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMjcxKGFyZzAsYXJnMSxhcmcyKXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8yNzEoYXJnMCxhcmcxLGFkZEhlYXBPYmplY3QoYXJnMikpfWZ1bmN0aW9uIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83NTUzMChhcmcwLGFyZzEsYXJnMil7dHJ5e3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzc1NTMwKGFyZzAsYXJnMSxhZGRCb3Jyb3dlZE9iamVjdChhcmcyKSl9ZmluYWxseXtoZWFwW3N0YWNrX3BvaW50ZXIrK109dm9pZCAwfX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMzM3MShhcmcwLGFyZzEsYXJnMixhcmczKXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8zMzcxKGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpLGFkZEhlYXBPYmplY3QoYXJnMykpfWNvbnN0IF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGU9WyJmaWxlIiwiZGlyZWN0b3J5Il0sX193YmluZGdlbl9lbnVtX0ZpbGVTeXN0ZW1DaGFuZ2VSZWNvcmRUeXBlPVsiYXBwZWFyZWQiLCJkaXNhcHBlYXJlZCIsImVycm9yZWQiLCJtb2RpZmllZCIsIm1vdmVkIiwidW5rbm93biJdLF9fd2JpbmRnZW5fZW51bV9GaWxlU3lzdGVtSGFuZGxlS2luZD1bImZpbGUiLCJkaXJlY3RvcnkiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdENhY2hlPVsiZGVmYXVsdCIsIm5vLXN0b3JlIiwicmVsb2FkIiwibm8tY2FjaGUiLCJmb3JjZS1jYWNoZSIsIm9ubHktaWYtY2FjaGVkIl0sX193YmluZGdlbl9lbnVtX1JlcXVlc3RDcmVkZW50aWFscz1bIm9taXQiLCJzYW1lLW9yaWdpbiIsImluY2x1ZGUiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdE1vZGU9WyJzYW1lLW9yaWdpbiIsIm5vLWNvcnMiLCJjb3JzIiwibmF2aWdhdGUiXSxfX3diaW5kZ2VuX2VudW1fV29ya2VyVHlwZT1bImNsYXNzaWMiLCJtb2R1bGUiXSxCdWlsZE9wdGlvbnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2J1aWxkb3B0aW9uc19mcmVlKHB0cj4+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/e2luc3RhbmNlLG1vZHVsZX06aW5zdGFuY2V9fWZ1bmN0aW9uIGluaXRTeW5jKG1vZHVsZSxtZW1vcnkpe2lmKHZvaWQgMCE9PXdhc20pcmV0dXJuIHdhc207bGV0IHRocmVhZF9zdGFja19zaXplO3ZvaWQgMCE9PW1vZHVsZSYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZSxtZW1vcnksdGhyZWFkX3N0YWNrX3NpemV9PW1vZHVsZSk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIGBpbml0U3luYygpYDsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKTtjb25zdCBpbXBvcnRzPV9fd2JnX2dldF9pbXBvcnRzKG1lbW9yeSk7bW9kdWxlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlfHwobW9kdWxlPW5ldyBXZWJBc3NlbWJseS5Nb2R1bGUobW9kdWxlKSk7cmV0dXJuIF9fd2JnX2ZpbmFsaXplX2luaXQobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG1vZHVsZSxpbXBvcnRzKSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpfWFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQobW9kdWxlX29yX3BhdGgsbWVtb3J5KXtpZih2b2lkIDAhPT13YXNtKXJldHVybiB3YXNtO2xldCB0aHJlYWRfc3RhY2tfc2l6ZTt2b2lkIDAhPT1tb2R1bGVfb3JfcGF0aCYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGVfb3JfcGF0aCk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlX29yX3BhdGgsbWVtb3J5LHRocmVhZF9zdGFja19zaXplfT1tb2R1bGVfb3JfcGF0aCk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKSx2b2lkIDA9PT1tb2R1bGVfb3JfcGF0aCYmKG1vZHVsZV9vcl9wYXRoPW5ldyBVUkwoX193ZWJwYWNrX3JlcXVpcmVfXygiLi9zcmMvdXRvby9pbmRleF9iZy53YXNtIiksX193ZWJwYWNrX3JlcXVpcmVfXy5iKSk7Y29uc3QgaW1wb3J0cz1fX3diZ19nZXRfaW1wb3J0cyhtZW1vcnkpOygic3RyaW5nIj09dHlwZW9mIG1vZHVsZV9vcl9wYXRofHwiZnVuY3Rpb24iPT10eXBlb2YgUmVxdWVzdCYmbW9kdWxlX29yX3BhdGggaW5zdGFuY2VvZiBSZXF1ZXN0fHwiZnVuY3Rpb24iPT10eXBlb2YgVVJMJiZtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkmJihtb2R1bGVfb3JfcGF0aD1mZXRjaChtb2R1bGVfb3JfcGF0aCkpO2NvbnN0e2luc3RhbmNlLG1vZHVsZX09YXdhaXQgX193YmdfbG9hZChhd2FpdCBtb2R1bGVfb3JfcGF0aCxpbXBvcnRzKTtyZXR1cm4gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSxtb2R1bGUsdGhyZWFkX3N0YWNrX3NpemUpfX0sIi4vc3JjL3V0b28vaW5kZXhfYmcud2FzbSIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9X193ZWJwYWNrX3JlcXVpcmVfXy5wKyIyM2ViNDNhMjI5OGM4MTQwZmM4ZC53YXNtIn19LF9fd2VicGFja19tb2R1bGVfY2FjaGVfXz17fTtmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKXt2YXIgY2FjaGVkTW9kdWxlPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07aWYodm9pZCAwIT09Y2FjaGVkTW9kdWxlKXJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0czt2YXIgbW9kdWxlPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF09e2V4cG9ydHM6e319O3JldHVybiBfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsbW9kdWxlLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyksbW9kdWxlLmV4cG9ydHN9X193ZWJwYWNrX3JlcXVpcmVfXy5tPV9fd2VicGFja19tb2R1bGVzX18sX193ZWJwYWNrX3JlcXVpcmVfXy5uPW1vZHVsZT0+e3ZhciBnZXR0ZXI9bW9kdWxlJiZtb2R1bGUuX19lc01vZHVsZT8oKT0+bW9kdWxlLmRlZmF1bHQ6KCk9Pm1vZHVsZTtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlcix7YTpnZXR0ZXJ9KSxnZXR0ZXJ9LF9fd2VicGFja19yZXF1aXJlX18uZD0oZXhwb3J0cyxkZWZpbml0aW9uKT0+e2Zvcih2YXIga2V5IGluIGRlZmluaXRpb24pX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sa2V5KSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLGtleSkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLGtleSx7ZW51bWVyYWJsZTohMCxnZXQ6ZGVmaW5pdGlvbltrZXldfSl9LF9fd2VicGFja19yZXF1aXJlX18uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLF9fd2VicGFja19yZXF1aXJlX18ubz0ob2JqLHByb3ApPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLHByb3ApLCgoKT0+e3ZhciBzY3JpcHRVcmw7X193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMmJihzY3JpcHRVcmw9X193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uKyIiKTt2YXIgZG9jdW1lbnQ9X193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O2lmKCFzY3JpcHRVcmwmJmRvY3VtZW50JiYoZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmIlNDUklQVCI9PT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnRhZ05hbWUudG9VcHBlckNhc2UoKSYmKHNjcmlwdFVybD1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksIXNjcmlwdFVybCkpe3ZhciBzY3JpcHRzPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTtpZihzY3JpcHRzLmxlbmd0aClmb3IodmFyIGk9c2NyaXB0cy5sZW5ndGgtMTtpPi0xJiYoIXNjcmlwdFVybHx8IS9eaHR0cChzPyk6Ly50ZXN0KHNjcmlwdFVybCkpOylzY3JpcHRVcmw9c2NyaXB0c1tpLS1dLnNyY31pZighc2NyaXB0VXJsKXRocm93IG5ldyBFcnJvcigiQXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTtzY3JpcHRVcmw9c2NyaXB0VXJsLnJlcGxhY2UoL15ibG9iOi8sIiIpLnJlcGxhY2UoLyMuKiQvLCIiKS5yZXBsYWNlKC9cPy4qJC8sIiIpLnJlcGxhY2UoL1wvW15cL10rJC8sIi8iKSxfX3dlYnBhY2tfcmVxdWlyZV9fLnA9c2NyaXB0VXJsfSkoKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmI9c2VsZi5sb2NhdGlvbisiIjt2YXIgX193ZWJwYWNrX2V4cG9ydHNfXz17fTtyZXR1cm4oKCk9PnsidXNlIHN0cmljdCI7Y29uc3QgcHJveHlNYXJrZXI9U3ltYm9sKCJDb21saW5rLnByb3h5IiksY3JlYXRlRW5kcG9pbnQ9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50IikscmVsZWFzZVByb3h5PVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxmaW5hbGl6ZXI9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLHRocm93TWFya2VyPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxpc09iamVjdD12YWw9PiJvYmplY3QiPT10eXBlb2YgdmFsJiZudWxsIT09dmFsfHwiZnVuY3Rpb24iPT10eXBlb2YgdmFsLHByb3h5VHJhbnNmZXJIYW5kbGVyPXtjYW5IYW5kbGU6dmFsPT5pc09iamVjdCh2YWwpJiZ2YWxbcHJveHlNYXJrZXJdLHNlcmlhbGl6ZShvYmope2NvbnN0e3BvcnQxLHBvcnQyfT1uZXcgTWVzc2FnZUNoYW5uZWw7cmV0dXJuIGV4cG9zZShvYmoscG9ydDEpLFtwb3J0MixbcG9ydDJdXX0sZGVzZXJpYWxpemU6cG9ydD0+KHBvcnQuc3RhcnQoKSxmdW5jdGlvbiB3cmFwKGVwLHRhcmdldCl7Y29uc3QgcGVuZGluZ0xpc3RlbmVycz1uZXcgTWFwO3JldHVybiBlcC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBoYW5kbGVNZXNzYWdlKGV2KXtjb25zdHtkYXRhfT1ldjtpZighZGF0YXx8IWRhdGEuaWQpcmV0dXJuO2NvbnN0IHJlc29sdmVyPXBlbmRpbmdMaXN0ZW5lcnMuZ2V0KGRhdGEuaWQpO2lmKHJlc29sdmVyKXRyeXtyZXNvbHZlcihkYXRhKX1maW5hbGx5e3BlbmRpbmdMaXN0ZW5lcnMuZGVsZXRlKGRhdGEuaWQpfX0pLGNyZWF0ZVByb3h5KGVwLHBlbmRpbmdMaXN0ZW5lcnMsW10sdGFyZ2V0KX0ocG9ydCkpfSx0cmFuc2ZlckhhbmRsZXJzPW5ldyBNYXAoW1sicHJveHkiLHByb3h5VHJhbnNmZXJIYW5kbGVyXSxbInRocm93Iix7Y2FuSGFuZGxlOnZhbHVlPT5pc09iamVjdCh2YWx1ZSkmJnRocm93TWFya2VyIGluIHZhbHVlLHNlcmlhbGl6ZSh7dmFsdWV9KXtsZXQgc2VyaWFsaXplZDtyZXR1cm4gc2VyaWFsaXplZD12YWx1ZSBpbnN0YW5jZW9mIEVycm9yP3tpc0Vycm9yOiEwLHZhbHVlOnttZXNzYWdlOnZhbHVlLm1lc3NhZ2UsbmFtZTp2YWx1ZS5uYW1lLHN0YWNrOnZhbHVlLnN0YWNrfX06e2lzRXJyb3I6ITEsdmFsdWV9LFtzZXJpYWxpemVkLFtdXX0sZGVzZXJpYWxpemUoc2VyaWFsaXplZCl7aWYoc2VyaWFsaXplZC5pc0Vycm9yKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHNlcmlhbGl6ZWQudmFsdWUubWVzc2FnZSksc2VyaWFsaXplZC52YWx1ZSk7dGhyb3cgc2VyaWFsaXplZC52YWx1ZX19XV0pO2Z1bmN0aW9uIGV4cG9zZShvYmosZXA9Z2xvYmFsVGhpcyxhbGxvd2VkT3JpZ2lucz1bIioiXSl7ZXAuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gY2FsbGJhY2soZXYpe2lmKCFldnx8IWV2LmRhdGEpcmV0dXJuO2lmKCFmdW5jdGlvbiBpc0FsbG93ZWRPcmlnaW4oYWxsb3dlZE9yaWdpbnMsb3JpZ2luKXtmb3IoY29uc3QgYWxsb3dlZE9yaWdpbiBvZiBhbGxvd2VkT3JpZ2lucyl7aWYob3JpZ2luPT09YWxsb3dlZE9yaWdpbnx8IioiPT09YWxsb3dlZE9yaWdpbilyZXR1cm4hMDtpZihhbGxvd2VkT3JpZ2luIGluc3RhbmNlb2YgUmVnRXhwJiZhbGxvd2VkT3JpZ2luLnRlc3Qob3JpZ2luKSlyZXR1cm4hMH1yZXR1cm4hMX0oYWxsb3dlZE9yaWdpbnMsZXYub3JpZ2luKSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oYEludmFsaWQgb3JpZ2luICcke2V2Lm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7Y29uc3R7aWQsdHlwZSxwYXRofT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxldi5kYXRhKSxhcmd1bWVudExpc3Q9KGV2LmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGZyb21XaXJlVmFsdWUpO2xldCByZXR1cm5WYWx1ZTt0cnl7Y29uc3QgcGFyZW50PXBhdGguc2xpY2UoMCwtMSkucmVkdWNlKChvYmoscHJvcCk9Pm9ialtwcm9wXSxvYmopLHJhd1ZhbHVlPXBhdGgucmVkdWNlKChvYmoscHJvcCk9Pm9ialtwcm9wXSxvYmopO3N3aXRjaCh0eXBlKXtjYXNlIkdFVCI6cmV0dXJuVmFsdWU9cmF3VmFsdWU7YnJlYWs7Y2FzZSJTRVQiOnBhcmVudFtwYXRoLnNsaWNlKC0xKVswXV09ZnJvbVdpcmVWYWx1ZShldi5kYXRhLnZhbHVlKSxyZXR1cm5WYWx1ZT0hMDticmVhaztjYXNlIkFQUExZIjpyZXR1cm5WYWx1ZT1yYXdWYWx1ZS5hcHBseShwYXJlbnQsYXJndW1lbnRMaXN0KTticmVhaztjYXNlIkNPTlNUUlVDVCI6cmV0dXJuVmFsdWU9ZnVuY3Rpb24gcHJveHkob2JqKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihvYmose1twcm94eU1hcmtlcl06ITB9KX0obmV3IHJhd1ZhbHVlKC4uLmFyZ3VtZW50TGlzdCkpO2JyZWFrO2Nhc2UiRU5EUE9JTlQiOntjb25zdHtwb3J0MSxwb3J0Mn09bmV3IE1lc3NhZ2VDaGFubmVsO2V4cG9zZShvYmoscG9ydDIpLHJldHVyblZhbHVlPWZ1bmN0aW9uIHRyYW5zZmVyKG9iaix0cmFuc2ZlcnMpe3JldHVybiB0cmFuc2ZlckNhY2hlLnNldChvYmosdHJhbnNmZXJzKSxvYmp9KHBvcnQxLFtwb3J0MV0pfWJyZWFrO2Nhc2UiUkVMRUFTRSI6cmV0dXJuVmFsdWU9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaCh2YWx1ZSl7cmV0dXJuVmFsdWU9e3ZhbHVlLFt0aHJvd01hcmtlcl06MH19UHJvbWlzZS5yZXNvbHZlKHJldHVyblZhbHVlKS5jYXRjaCh2YWx1ZT0+KHt2YWx1ZSxbdGhyb3dNYXJrZXJdOjB9KSkudGhlbihyZXR1cm5WYWx1ZT0+e2NvbnN0W3dpcmVWYWx1ZSx0cmFuc2ZlcmFibGVzXT10b1dpcmVWYWx1ZShyZXR1cm5WYWx1ZSk7ZXAucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHdpcmVWYWx1ZSkse2lkfSksdHJhbnNmZXJhYmxlcyksIlJFTEVBU0UiPT09dHlwZSYmKGVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGNhbGxiYWNrKSxjbG9zZUVuZFBvaW50KGVwKSxmaW5hbGl6ZXIgaW4gb2JqJiYiZnVuY3Rpb24iPT10eXBlb2Ygb2JqW2ZpbmFsaXplcl0mJm9ialtmaW5hbGl6ZXJdKCkpfSkuY2F0Y2goZXJyb3I9Pntjb25zdFt3aXJlVmFsdWUsdHJhbnNmZXJhYmxlc109dG9XaXJlVmFsdWUoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFt0aHJvd01hcmtlcl06MH0pO2VwLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx3aXJlVmFsdWUpLHtpZH0pLHRyYW5zZmVyYWJsZXMpfSl9KSxlcC5zdGFydCYmZXAuc3RhcnQoKX1mdW5jdGlvbiBjbG9zZUVuZFBvaW50KGVuZHBvaW50KXsoZnVuY3Rpb24gaXNNZXNzYWdlUG9ydChlbmRwb2ludCl7cmV0dXJuIk1lc3NhZ2VQb3J0Ij09PWVuZHBvaW50LmNvbnN0cnVjdG9yLm5hbWV9KShlbmRwb2ludCkmJmVuZHBvaW50LmNsb3NlKCl9ZnVuY3Rpb24gdGhyb3dJZlByb3h5UmVsZWFzZWQoaXNSZWxlYXNlZCl7aWYoaXNSZWxlYXNlZCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHJlbGVhc2VFbmRwb2ludChlcCl7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsbmV3IE1hcCx7dHlwZToiUkVMRUFTRSJ9KS50aGVuKCgpPT57Y2xvc2VFbmRQb2ludChlcCl9KX1jb25zdCBwcm94eUNvdW50ZXI9bmV3IFdlYWtNYXAscHJveHlGaW5hbGl6ZXJzPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZXA9Pntjb25zdCBuZXdDb3VudD0ocHJveHlDb3VudGVyLmdldChlcCl8fDApLTE7cHJveHlDb3VudGVyLnNldChlcCxuZXdDb3VudCksMD09PW5ld0NvdW50JiZyZWxlYXNlRW5kcG9pbnQoZXApfSk7ZnVuY3Rpb24gY3JlYXRlUHJveHkoZXAscGVuZGluZ0xpc3RlbmVycyxwYXRoPVtdLHRhcmdldD1mdW5jdGlvbigpe30pe2xldCBpc1Byb3h5UmVsZWFzZWQ9ITE7Y29uc3QgcHJveHk9bmV3IFByb3h5KHRhcmdldCx7Z2V0KF90YXJnZXQscHJvcCl7aWYodGhyb3dJZlByb3h5UmVsZWFzZWQoaXNQcm94eVJlbGVhc2VkKSxwcm9wPT09cmVsZWFzZVByb3h5KXJldHVybigpPT57IWZ1bmN0aW9uIHVucmVnaXN0ZXJQcm94eShwcm94eSl7cHJveHlGaW5hbGl6ZXJzJiZwcm94eUZpbmFsaXplcnMudW5yZWdpc3Rlcihwcm94eSl9KHByb3h5KSxyZWxlYXNlRW5kcG9pbnQoZXApLHBlbmRpbmdMaXN0ZW5lcnMuY2xlYXIoKSxpc1Byb3h5UmVsZWFzZWQ9ITB9O2lmKCJ0aGVuIj09PXByb3Ape2lmKDA9PT1wYXRoLmxlbmd0aClyZXR1cm57dGhlbjooKT0+cHJveHl9O2NvbnN0IHI9cmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLHt0eXBlOiJHRVQiLHBhdGg6cGF0aC5tYXAocD0+cC50b1N0cmluZygpKX0pLnRoZW4oZnJvbVdpcmVWYWx1ZSk7cmV0dXJuIHIudGhlbi5iaW5kKHIpfXJldHVybiBjcmVhdGVQcm94eShlcCxwZW5kaW5nTGlzdGVuZXJzLFsuLi5wYXRoLHByb3BdKX0sc2V0KF90YXJnZXQscHJvcCxyYXdWYWx1ZSl7dGhyb3dJZlByb3h5UmVsZWFzZWQoaXNQcm94eVJlbGVhc2VkKTtjb25zdFt2YWx1ZSx0cmFuc2ZlcmFibGVzXT10b1dpcmVWYWx1ZShyYXdWYWx1ZSk7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyx7dHlwZToiU0VUIixwYXRoOlsuLi5wYXRoLHByb3BdLm1hcChwPT5wLnRvU3RyaW5nKCkpLHZhbHVlfSx0cmFuc2ZlcmFibGVzKS50aGVuKGZyb21XaXJlVmFsdWUpfSxhcHBseShfdGFyZ2V0LF90aGlzQXJnLHJhd0FyZ3VtZW50TGlzdCl7dGhyb3dJZlByb3h5UmVsZWFzZWQoaXNQcm94eVJlbGVhc2VkKTtjb25zdCBsYXN0PXBhdGhbcGF0aC5sZW5ndGgtMV07aWYobGFzdD09PWNyZWF0ZUVuZHBvaW50KXJldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLHBlbmRpbmdMaXN0ZW5lcnMse3R5cGU6IkVORFBPSU5UIn0pLnRoZW4oZnJvbVdpcmVWYWx1ZSk7aWYoImJpbmQiPT09bGFzdClyZXR1cm4gY3JlYXRlUHJveHkoZXAscGVuZGluZ0xpc3RlbmVycyxwYXRoLnNsaWNlKDAsLTEpKTtjb25zdFthcmd1bWVudExpc3QsdHJhbnNmZXJhYmxlc109cHJvY2Vzc0FyZ3VtZW50cyhyYXdBcmd1bWVudExpc3QpO3JldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLHBlbmRpbmdMaXN0ZW5lcnMse3R5cGU6IkFQUExZIixwYXRoOnBhdGgubWFwKHA9PnAudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0fSx0cmFuc2ZlcmFibGVzKS50aGVuKGZyb21XaXJlVmFsdWUpfSxjb25zdHJ1Y3QoX3RhcmdldCxyYXdBcmd1bWVudExpc3Qpe3Rocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCk7Y29uc3RbYXJndW1lbnRMaXN0LHRyYW5zZmVyYWJsZXNdPXByb2Nlc3NBcmd1bWVudHMocmF3QXJndW1lbnRMaXN0KTtyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6cGF0aC5tYXAocD0+cC50b1N0cmluZygpKSxhcmd1bWVudExpc3R9LHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSl9fSk7cmV0dXJuIGZ1bmN0aW9uIHJlZ2lzdGVyUHJveHkocHJveHksZXApe2NvbnN0IG5ld0NvdW50PShwcm94eUNvdW50ZXIuZ2V0KGVwKXx8MCkrMTtwcm94eUNvdW50ZXIuc2V0KGVwLG5ld0NvdW50KSxwcm94eUZpbmFsaXplcnMmJnByb3h5RmluYWxpemVycy5yZWdpc3Rlcihwcm94eSxlcCxwcm94eSl9KHByb3h5LGVwKSxwcm94eX1mdW5jdGlvbiBwcm9jZXNzQXJndW1lbnRzKGFyZ3VtZW50TGlzdCl7Y29uc3QgcHJvY2Vzc2VkPWFyZ3VtZW50TGlzdC5tYXAodG9XaXJlVmFsdWUpO3JldHVybltwcm9jZXNzZWQubWFwKHY9PnZbMF0pLChhcnI9cHJvY2Vzc2VkLm1hcCh2PT52WzFdKSxBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGFycikpXTt2YXIgYXJyfWNvbnN0IHRyYW5zZmVyQ2FjaGU9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gdG9XaXJlVmFsdWUodmFsdWUpe2Zvcihjb25zdFtuYW1lLGhhbmRsZXJdb2YgdHJhbnNmZXJIYW5kbGVycylpZihoYW5kbGVyLmNhbkhhbmRsZSh2YWx1ZSkpe2NvbnN0W3NlcmlhbGl6ZWRWYWx1ZSx0cmFuc2ZlcmFibGVzXT1oYW5kbGVyLnNlcmlhbGl6ZSh2YWx1ZSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lLHZhbHVlOnNlcmlhbGl6ZWRWYWx1ZX0sdHJhbnNmZXJhYmxlc119cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlfSx0cmFuc2ZlckNhY2hlLmdldCh2YWx1ZSl8fFtdXX1mdW5jdGlvbiBmcm9tV2lyZVZhbHVlKHZhbHVlKXtzd2l0Y2godmFsdWUudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gdHJhbnNmZXJIYW5kbGVycy5nZXQodmFsdWUubmFtZSkuZGVzZXJpYWxpemUodmFsdWUudmFsdWUpO2Nhc2UiUkFXIjpyZXR1cm4gdmFsdWUudmFsdWV9fWZ1bmN0aW9uIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyxtc2csdHJhbnNmZXJzKXtyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+e2NvbnN0IGlkPWZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpe3JldHVybiBuZXcgQXJyYXkoNCkuZmlsbCgwKS5tYXAoKCk9Pk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikudG9TdHJpbmcoMTYpKS5qb2luKCItIil9KCk7cGVuZGluZ0xpc3RlbmVycy5zZXQoaWQscmVzb2x2ZSksZXAuc3RhcnQmJmVwLnN0YXJ0KCksZXAucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7aWR9LG1zZyksdHJhbnNmZXJzKX0pfXZhciBXb3JrZXJNZXNzYWdlVHlwZTshZnVuY3Rpb24oV29ya2VyTWVzc2FnZVR5cGUpe1dvcmtlck1lc3NhZ2VUeXBlW1dvcmtlck1lc3NhZ2VUeXBlLkluaXRDb25uZWN0aW9uPTE0NjQ2NjQwNjRdPSJJbml0Q29ubmVjdGlvbiIsV29ya2VyTWVzc2FnZVR5cGVbV29ya2VyTWVzc2FnZVR5cGUuUmVxdWVzdEZvcms9MTQ2NDY2NDA2NV09IlJlcXVlc3RGb3JrIn0oV29ya2VyTWVzc2FnZVR5cGV8fChXb3JrZXJNZXNzYWdlVHlwZT17fSkpO1dvcmtlck1lc3NhZ2VUeXBlLkluaXRDb25uZWN0aW9uLFdvcmtlck1lc3NhZ2VUeXBlLlJlcXVlc3RGb3JrO3ZhciBTV01lc3NhZ2VUeXBlOyFmdW5jdGlvbihTV01lc3NhZ2VUeXBlKXtTV01lc3NhZ2VUeXBlW1NXTWVzc2FnZVR5cGUuSGFuZFNoYWtlPTEzOTgyMTA1NjBdPSJIYW5kU2hha2UiLFNXTWVzc2FnZVR5cGVbU1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQaW5nPTEzOTgyMTA1NjFdPSJIZWFydGJlYXRQaW5nIixTV01lc3NhZ2VUeXBlW1NXTWVzc2FnZVR5cGUuSGVhcnRiZWF0UG9uZz0xMzk4MjEwNTYyXT0iSGVhcnRiZWF0UG9uZyJ9KFNXTWVzc2FnZVR5cGV8fChTV01lc3NhZ2VUeXBlPXt9KSk7U1dNZXNzYWdlVHlwZS5IYW5kU2hha2UsU1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQaW5nLFNXTWVzc2FnZVR5cGUuSGVhcnRiZWF0UG9uZzt2YXIgdXRvbz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuL3NyYy91dG9vL2luZGV4LmpzIik7bGV0IG5leHRXb3JrZXJJZD0wO2NvbnN0IGxvYWRlcldvcmtlcnM9e30scnVuTG9hZGVyV29ya2VyUG9vbD1hc3luYyhwcm9qZWN0Q3dkLGxvYWRlcldvcmtlclVybCxsb2FkZXJzSW1wb3J0TWFwKT0+eygwLHV0b28ubjIpKGFzeW5jIGNyZWF0aW9uPT57Y29uc3R7b3B0aW9uczp7ZmlsZW5hbWUsY3dkfX09Y3JlYXRpb247bmV4dFdvcmtlcklkKz0xO2NvbnN0IHdvcmtlcklkPW5leHRXb3JrZXJJZCx3b3JrZXI9bG9hZGVyV29ya2VyVXJsLnN0YXJ0c1dpdGgoImRhdGE6Iik/ZnVuY3Rpb24gY3JlYXRlV29ya2VyRnJvbURhdGFVcmkoZGF0YVVyaSxvcHRpb25zKXtjb25zdCBpZHg9ZGF0YVVyaS5pbmRleE9mKCI7YmFzZTY0LCIpO2lmKC0xPT09aWR4KXJldHVybiBuZXcgV29ya2VyKGRhdGFVcmksb3B0aW9ucyk7Y29uc3QgYmFzZTY0PWRhdGFVcmkuc2xpY2UoaWR4KzgpLGNvZGU9YXRvYihiYXNlNjQpLGJsb2I9bmV3IEJsb2IoW2NvZGVdLHt0eXBlOiJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pO3JldHVybiBuZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYiksb3B0aW9ucyl9KGxvYWRlcldvcmtlclVybCx7bmFtZTpmaWxlbmFtZX0pOm5ldyBXb3JrZXIobG9hZGVyV29ya2VyVXJsLHtuYW1lOmZpbGVuYW1lfSk7bGV0IGZpbmFsQ3dkPWN3ZCxmaW5hbEZpbGVuYW1lPWZpbGVuYW1lO2lmKHByb2plY3RDd2Qpe2NvbnN0IHNlcD0iLyI7bGV0IHBDd2Q9cHJvamVjdEN3ZC5lbmRzV2l0aChzZXApP3Byb2plY3RDd2Quc2xpY2UoMCwtMSk6cHJvamVjdEN3ZDtpZihwQ3dkLnN0YXJ0c1dpdGgoc2VwKXx8KHBDd2Q9c2VwK3BDd2QpLGN3ZC5zdGFydHNXaXRoKHNlcCkpZmluYWxDd2Q9Y3dkO2Vsc2V7bGV0IGNDd2Q9Y3dkOyIuIiE9PWNDd2QmJiIuLyIhPT1jQ3dkfHwoY0N3ZD0iIiksZmluYWxDd2Q9Y0N3ZD9gJHtwQ3dkfSR7c2VwfSR7Y0N3ZH1gOnBDd2R9aWYoZmlsZW5hbWUuc3RhcnRzV2l0aChzZXApKWZpbmFsRmlsZW5hbWU9ZmlsZW5hbWU7ZWxzZXtsZXQgZk5hbWU9ZmlsZW5hbWU7Zk5hbWUuc3RhcnRzV2l0aCgiLi8iKSYmKGZOYW1lPWZOYW1lLnNsaWNlKDIpKSxmaW5hbEZpbGVuYW1lPWAke3BDd2R9JHtzZXB9JHtmTmFtZX1gfX13b3JrZXIucG9zdE1lc3NhZ2UoWygwLHV0b28uTG8pKCksKDAsdXRvby5NaCkoKSx7d29ya2VyRGF0YTp7Y3dkOmZpbmFsQ3dkLHByb2plY3RSb290OnByb2plY3RDd2QsdGhyZWFkSWQ6d29ya2VySWR9LGxvYWRlckFzc2V0czp7aW1wb3J0TWFwczpudWxsIT1sb2FkZXJzSW1wb3J0TWFwP2xvYWRlcnNJbXBvcnRNYXA6e30sZW50cnlwb2ludDpmaW5hbEZpbGVuYW1lfX1dKTsobG9hZGVyV29ya2Vyc1tmaWxlbmFtZV18fChsb2FkZXJXb3JrZXJzW2ZpbGVuYW1lXT1uZXcgTWFwKSkuc2V0KHdvcmtlcklkLHdvcmtlcil9LHRlcm1pbmF0aW9uPT57Y29uc3R7d29ya2VySWQsb3B0aW9uc309dGVybWluYXRpb24sZW50cnlwb2ludD1vcHRpb25zLmZpbGVuYW1lLHdvcmtlcnM9bG9hZGVyV29ya2Vyc1tlbnRyeXBvaW50XTtpZih3b3JrZXJzKXtjb25zdCB3b3JrZXI9d29ya2Vycy5nZXQod29ya2VySWQpO3dvcmtlciYmKHdvcmtlci50ZXJtaW5hdGUoKSx3b3JrZXJzLmRlbGV0ZSh3b3JrZXJJZCkpfX0pfTtjb25zdCBpbnRlcm5hbEVuZHBvaW50PW5ldyBjbGFzcyBJbnRlcm5hbEVuZHBvaW50e2NvbnN0cnVjdG9yKCl7dGhpcy5sb2FkZXJXb3JrZXJQb29sSW5pdGlhbGl6ZWQ9ITEsdGhpcy5obXJSb290VGFza3M9bmV3IE1hcH1hc3luYyBtb3VudChvcHQpe3ZhciBfYTt0aGlzLm9wdGlvbnM9b3B0O2NvbnN0e2N3ZCx3YXNtVXJsLHRocmVhZFdvcmtlclVybCxsb2dGaWx0ZXJ9PW9wdDtudWxsIT09KF9hPXRoaXMud2FzbUluaXQpJiZ2b2lkIDAhPT1fYXx8KHRoaXMud2FzbUluaXQ9KDAsdXRvby5BeSkod2FzbVVybCkpLGF3YWl0IHRoaXMud2FzbUluaXQ7Y29uc3QgZmlsdGVyPWxvZ0ZpbHRlcnx8InBhY2tfY29yZT1pbmZvLHBhY2tfYXBpPWluZm8sdXRvb193YXNtPWluZm8sdXRvb19ydWJvcmlzdD1pbmZvIjsoMCx1dG9vLnpEKShmaWx0ZXIpO2NvbnN0IGFic29sdXRlQ3dkPWN3ZC5zdGFydHNXaXRoKCIvIik/Y3dkOiIvIitjd2Q7dXRvby5NTS5pbml0KHRocmVhZFdvcmtlclVybHx8IiIpLHV0b28uTU0uc2V0Q3dkKGFic29sdXRlQ3dkKX1hc3luYyBkZXBzKG9wdGlvbnMpe3ZhciBfYSxfYjthd2FpdCB0aGlzLndhc21Jbml0O2NvbnN0IHJlZ2lzdHJ5PW51bGwhPT0oX2E9bnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWdpc3RyeSkmJnZvaWQgMCE9PV9hP19hOnZvaWQgMCxjb25jdXJyZW5jeT1udWxsIT09KF9iPW51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMuY29uY3VycmVuY3kpJiZ2b2lkIDAhPT1fYj9fYjp2b2lkIDA7cmV0dXJuIGF3YWl0IHV0b28uTU0uZGVwcyhyZWdpc3RyeSxjb25jdXJyZW5jeSl9YXN5bmMgaW5zdGFsbChwYWNrYWdlTG9jayxvcHRpb25zKXt2YXIgX2E7YXdhaXQgdGhpcy53YXNtSW5pdDtjb25zdCBjb25jdXJyZW5jeT1udWxsIT09KF9hPW51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMubWF4Q29uY3VycmVudERvd25sb2FkcykmJnZvaWQgMCE9PV9hP19hOnZvaWQgMDthd2FpdCB1dG9vLk1NLmluc3RhbGwocGFja2FnZUxvY2ssY29uY3VycmVuY3kpfWFzeW5jIGJ1aWxkKG9wdGlvbnMpe3ZhciBfYSxfYixfYzthd2FpdCB0aGlzLndhc21Jbml0LChudWxsPT09KF9hPXRoaXMub3B0aW9ucyl8fHZvaWQgMD09PV9hP3ZvaWQgMDpfYS5sb2FkZXJXb3JrZXJVcmwpJiYhdGhpcy5sb2FkZXJXb3JrZXJQb29sSW5pdGlhbGl6ZWQmJihydW5Mb2FkZXJXb3JrZXJQb29sKHRoaXMub3B0aW9ucy5jd2QsdGhpcy5vcHRpb25zLmxvYWRlcldvcmtlclVybCxudWxsPT09KF9iPXRoaXMub3B0aW9ucyl8fHZvaWQgMD09PV9iP3ZvaWQgMDpfYi5sb2FkZXJzSW1wb3J0TWFwKSx0aGlzLmxvYWRlcldvcmtlclBvb2xJbml0aWFsaXplZD0hMCk7Y29uc3QgYnVpbGRPcHRpb25zPW5ldyB1dG9vLkgyO3JldHVybiBidWlsZE9wdGlvbnMuY2xlYW51cD1udWxsIT09KF9jPW51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMuY2xlYW51cCkmJnZvaWQgMCE9PV9jJiZfYywobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5jb25maWcpJiYoYnVpbGRPcHRpb25zLmNvbmZpZz1vcHRpb25zLmNvbmZpZyksYXdhaXQgdXRvby5NTS5idWlsZChidWlsZE9wdGlvbnMpfWFzeW5jIGRldihjb25maWcsb25VcGRhdGUpe3ZhciBfYSxfYjsobnVsbD09PShfYT10aGlzLm9wdGlvbnMpfHx2b2lkIDA9PT1fYT92b2lkIDA6X2EubG9hZGVyV29ya2VyVXJsKSYmIXRoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkJiYocnVuTG9hZGVyV29ya2VyUG9vbCh0aGlzLm9wdGlvbnMuY3dkLHRoaXMub3B0aW9ucy5sb2FkZXJXb3JrZXJVcmwsbnVsbD09PShfYj10aGlzLm9wdGlvbnMpfHx2b2lkIDA9PT1fYj92b2lkIDA6X2IubG9hZGVyc0ltcG9ydE1hcCksdGhpcy5sb2FkZXJXb3JrZXJQb29sSW5pdGlhbGl6ZWQ9ITApLHRoaXMucm9vdFRhc2s9YXdhaXQgdXRvby5NTS5lbnRyeXBvaW50c1N1YnNjcmliZShjb25maWcscmVzdWx0PT57bnVsbD09b25VcGRhdGV8fG9uVXBkYXRlKHJlc3VsdCl9KX1hc3luYyByZWFkRmlsZShwYXRoLGVuY29kaW5nKXtsZXQgcmV0O3JldHVybiBhd2FpdCB0aGlzLndhc21Jbml0LCJ1dGY4IiE9PWVuY29kaW5nP2F3YWl0IHV0b28uRnMucmVhZChwYXRoKToocmV0PWF3YWl0IHV0b28uRnMucmVhZFRvU3RyaW5nKHBhdGgpLHJldCl9YXN5bmMgd3JpdGVGaWxlKHBhdGgsY29udGVudCxfZW5jb2Rpbmcpe3JldHVybiBhd2FpdCB0aGlzLndhc21Jbml0LCJzdHJpbmciPT10eXBlb2YgY29udGVudD9hd2FpdCB1dG9vLkZzLndyaXRlU3RyaW5nKHBhdGgsY29udGVudCk6YXdhaXQgdXRvby5Gcy53cml0ZShwYXRoLGNvbnRlbnQpfWFzeW5jIGNvcHlGaWxlKHNyYyxkc3Qpe3JldHVybiBhd2FpdCB0aGlzLndhc21Jbml0LGF3YWl0IHV0b28uRnMuY29weUZpbGUoc3JjLGRzdCl9YXN5bmMgc3RhdChwYXRoKXthd2FpdCB0aGlzLndhc21Jbml0O2NvbnN0IGpzb249KGF3YWl0IHV0b28uRnMubWV0YWRhdGEocGF0aCkpLnRvSlNPTigpO3JldHVybnt0eXBlOmpzb24udHlwZSxzaXplOk51bWJlcihqc29uLmZpbGVfc2l6ZSl9fWFzeW5jIHJlYWRkaXIocGF0aCxvcHRpb25zKXthd2FpdCB0aGlzLndhc21Jbml0O3JldHVybihudWxsPT1vcHRpb25zfHxvcHRpb25zLnJlY3Vyc2l2ZSxhd2FpdCB1dG9vLkZzLnJlYWREaXIocGF0aCkpLm1hcChlPT57Y29uc3QgZGlyPWUudG9KU09OKCk7cmV0dXJue25hbWU6ZGlyLm5hbWUsdHlwZTpkaXIudHlwZX19KX1hc3luYyBta2RpcihwYXRoLG9wdGlvbnMpe3JldHVybiBhd2FpdCB0aGlzLndhc21Jbml0LChudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLnJlY3Vyc2l2ZSk/YXdhaXQgdXRvby5Gcy5jcmVhdGVEaXJBbGwocGF0aCk6YXdhaXQgdXRvby5Gcy5jcmVhdGVEaXIocGF0aCl9YXN5bmMgcm0ocGF0aCxvcHRpb25zKXtzd2l0Y2goYXdhaXQgdGhpcy53YXNtSW5pdCwoYXdhaXQgdXRvby5Gcy5tZXRhZGF0YShwYXRoKSkudG9KU09OKCkudHlwZSl7Y2FzZSJmaWxlIjpyZXR1cm4gYXdhaXQgdXRvby5Gcy5yZW1vdmVGaWxlKHBhdGgpO2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gYXdhaXQgdXRvby5Gcy5yZW1vdmVEaXIocGF0aCwhIShudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLnJlY3Vyc2l2ZSkpfX1hc3luYyBybWRpcihwYXRoLG9wdGlvbnMpe3JldHVybiBhd2FpdCB0aGlzLndhc21Jbml0LGF3YWl0IHV0b28uRnMucmVtb3ZlRGlyKHBhdGgsISEobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpKX1hc3luYyBnemlwKGZpbGVzKXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCxhd2FpdCB1dG9vLk1NLmd6aXAoZmlsZXMpfWFzeW5jIHNpZ01kNShjb250ZW50KXtyZXR1cm4gYXdhaXQgdGhpcy53YXNtSW5pdCxhd2FpdCB1dG9vLk1NLnNpZ01kNShjb250ZW50KX1hc3luYyBobXJTdWJzY3JpYmUoaWRlbnRpZmllcixjYWxsYmFjayl7Y29uc3Qgcm9vdFRhc2s9YXdhaXQgdXRvby5NTS5obXJFdmVudHMoaWRlbnRpZmllcixjYWxsYmFjayk7dGhpcy5obXJSb290VGFza3Muc2V0KGlkZW50aWZpZXIscm9vdFRhc2spfXVwZGF0ZUluZm9TdWJzY3JpYmUoYWdncmVnYXRpb25NcyxjYWxsYmFjayl7dXRvby5NTS51cGRhdGVJbmZvU3Vic2NyaWJlKGFnZ3JlZ2F0aW9uTXMsY2FsbGJhY2spfX0sQ29ubmVjdGVkUG9ydHM9bmV3IFNldDtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9Pntjb25zdCBwb3J0PWUucG9ydHNbMF07ZS5kYXRhIT09V29ya2VyTWVzc2FnZVR5cGUuSW5pdENvbm5lY3Rpb258fENvbm5lY3RlZFBvcnRzLmhhcyhwb3J0KXx8KGV4cG9zZShpbnRlcm5hbEVuZHBvaW50LHBvcnQpLENvbm5lY3RlZFBvcnRzLmFkZChwb3J0KSl9KX0pKCksX193ZWJwYWNrX2V4cG9ydHNfXz1fX3dlYnBhY2tfZXhwb3J0c19fLmRlZmF1bHQsX193ZWJwYWNrX2V4cG9ydHNfX30pKCkpOw==";
|
|
1
|
+
export default "data:application/javascript;base64,LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgd29ya2VySW5saW5lLmpzLkxJQ0VOU0UudHh0ICovCiFmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LGZhY3Rvcnkpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sZmFjdG9yeSk7ZWxzZXt2YXIgYT1mYWN0b3J5KCk7Zm9yKHZhciBpIGluIGEpKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnJvb3QpW2ldPWFbaV19fShzZWxmLCgpPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17Ii4vY2xpL21vY2tzL2Vudi5qcyIobW9kdWxlKXttb2R1bGUuZXhwb3J0cz17fX0sIi4vc3JjL3V0b28vaW5kZXguanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHtBeTooKT0+X193YmdfaW5pdCxGczooKT0+RnMsSDI6KCk9PkJ1aWxkT3B0aW9ucyxMbzooKT0+Z2V0V2FzbU1vZHVsZSxNTTooKT0+UHJvamVjdCxNaDooKT0+Z2V0V2FzbU1lbW9yeSxuMjooKT0+cmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIsekQ6KCk9PmluaXRMb2dGaWx0ZXJ9KTt2YXIgZW52X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygiLi9jbGkvbW9ja3MvZW52LmpzIiksZW52X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdD1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZW52X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pO2NsYXNzIEJ1aWxkT3B0aW9uc3tfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsQnVpbGRPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2J1aWxkb3B0aW9uc19mcmVlKHB0ciwwKX1nZXQgY29uZmlnKCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5idWlsZG9wdGlvbnNfY29uZmlnKHRoaXMuX193YmdfcHRyKSl9Y29uc3RydWN0b3IoKXtjb25zdCByZXQ9d2FzbS5idWlsZG9wdGlvbnNfbmV3KCk7cmV0dXJuIHRoaXMuX193YmdfcHRyPXJldD4+PjAsQnVpbGRPcHRpb25zRmluYWxpemF0aW9uLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31zZXQgY29uZmlnKHZhbCl7d2FzbS5idWlsZG9wdGlvbnNfc2V0X2NvbmZpZyh0aGlzLl9fd2JnX3B0cixhZGRIZWFwT2JqZWN0KHZhbCkpfWdldCBjbGVhbnVwKCl7cmV0dXJuIDAhPT13YXNtLl9fd2JnX2dldF9idWlsZG9wdGlvbnNfY2xlYW51cCh0aGlzLl9fd2JnX3B0cil9c2V0IGNsZWFudXAoYXJnMCl7d2FzbS5fX3diZ19zZXRfYnVpbGRvcHRpb25zX2NsZWFudXAodGhpcy5fX3diZ19wdHIsYXJnMCl9fVN5bWJvbC5kaXNwb3NlJiYoQnVpbGRPcHRpb25zLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09QnVpbGRPcHRpb25zLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBDcmVhdGVTeW5jQWNjZXNzSGFuZGxlT3B0aW9uc3tfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnNGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfY3JlYXRlc3luY2FjY2Vzc2hhbmRsZW9wdGlvbnNfZnJlZShwdHIsMCl9fVN5bWJvbC5kaXNwb3NlJiYoQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnMucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1DcmVhdGVTeW5jQWNjZXNzSGFuZGxlT3B0aW9ucy5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgRGlyRW50cnl7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKERpckVudHJ5LnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLERpckVudHJ5RmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfXRvSlNPTigpe3JldHVybntuYW1lOnRoaXMubmFtZSx0eXBlOnRoaXMudHlwZX19dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyl9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLERpckVudHJ5RmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2RpcmVudHJ5X2ZyZWUocHRyLDApfWdldCBuYW1lKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5fX3diZ19nZXRfZGlyZW50cnlfbmFtZShyZXRwdHIsdGhpcy5fX3diZ19wdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19Z2V0IHR5cGUoKXtjb25zdCByZXQ9d2FzbS5fX3diZ19nZXRfZGlyZW50cnlfdHlwZSh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGVbcmV0XX1zZXQgbmFtZShhcmcwKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGFyZzAsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5fX3diZ19zZXRfZGlyZW50cnlfbmFtZSh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfXNldCB0eXBlKGFyZzApe3dhc20uX193Ymdfc2V0X2RpcmVudHJ5X3R5cGUodGhpcy5fX3diZ19wdHIsKF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGUuaW5kZXhPZihhcmcwKSsxfHwzKS0xKX19ZnVuY3Rpb24gRVJSX0FCT1JUKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfQUJPUlQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9JTlZBTElEX1NUQVRFKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfSU5WQUxJRF9TVEFURShyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19ZnVuY3Rpb24gRVJSX0tFWV9BTFJFQURZX0VYSVNUUygpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0tFWV9BTFJFQURZX0VYSVNUUyhyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19ZnVuY3Rpb24gRVJSX05PVF9BTExPV0VEKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfTk9UX0FMTE9XRUQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9OT1RfRk9VTkQoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9OT1RfRk9VTkQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9OT19NT0RJRklDQVRJT05fQUxMT1dFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0tFWV9BTFJFQURZX0VYSVNUUyhyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19ZnVuY3Rpb24gRVJSX1FVT1RBX0VYQ0VFREVEKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfUVVPVEFfRVhDRUVERUQocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9UWVBFX01JU01BVENIKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfVFlQRV9NSVNNQVRDSChyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19U3ltYm9sLmRpc3Bvc2UmJihEaXJFbnRyeS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPURpckVudHJ5LnByb3RvdHlwZS5mcmVlKTtjbGFzcyBGc3tfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsRnNGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfZnNfZnJlZShwdHIsMCl9c3RhdGljIGNvcHlGaWxlKHNyYyxkc3Qpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAoc3JjLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOLHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZHN0LHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfY29weUZpbGUocHRyMCxsZW4wLHB0cjEsbGVuMSkpfXN0YXRpYyBjb3B5RmlsZVN5bmMoc3JjLGRzdCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHNyYyx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGRzdCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX2NvcHlGaWxlU3luYyhyZXRwdHIscHRyMCxsZW4wLHB0cjEsbGVuMSk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgY3JlYXRlRGlyKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX2NyZWF0ZURpcihwdHIwLGxlbjApKX1zdGF0aWMgY3JlYXRlRGlyQWxsKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX2NyZWF0ZURpckFsbChwdHIwLGxlbjApKX1zdGF0aWMgY3JlYXRlRGlyQWxsU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX2NyZWF0ZURpckFsbFN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgY3JlYXRlRGlyU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX2NyZWF0ZURpclN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgbWV0YWRhdGEocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfbWV0YWRhdGEocHRyMCxsZW4wKSl9c3RhdGljIG1ldGFkYXRhU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX21ldGFkYXRhU3luYyhyZXRwdHIscHRyMCxsZW4wKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrOCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMSk7cmV0dXJuIE1ldGFkYXRhLl9fd3JhcChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgcmVhZChwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkKHB0cjAsbGVuMCkpfXN0YXRpYyByZWFkRGlyKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3JlYWREaXIocHRyMCxsZW4wKSl9c3RhdGljIHJlYWREaXJTeW5jKHBhdGgpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfcmVhZERpclN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkscjI9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzgsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cisxMiwhMCkpdGhyb3cgdGFrZU9iamVjdChyMik7dmFyIHYyPWdldEFycmF5SnNWYWx1ZUZyb21XYXNtMChyMCxyMSkuc2xpY2UoKTtyZXR1cm4gd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQocjAsNCpyMSw0KSx2Mn1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fXN0YXRpYyByZWFkU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX3JlYWRTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis4LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIxKTtyZXR1cm4gdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgcmVhZFRvU3RyaW5nKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3JlYWRUb1N0cmluZyhwdHIwLGxlbjApKX1zdGF0aWMgcmVtb3ZlRGlyKHBhdGgscmVjdXJzaXZlKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZW1vdmVEaXIocHRyMCxsZW4wLHJlY3Vyc2l2ZSkpfXN0YXRpYyByZW1vdmVEaXJTeW5jKHBhdGgscmVjdXJzaXZlKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX3JlbW92ZURpclN5bmMocmV0cHRyLHB0cjAsbGVuMCxyZWN1cnNpdmUpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlbW92ZUZpbGUocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVtb3ZlRmlsZShwdHIwLGxlbjApKX1zdGF0aWMgcmVtb3ZlRmlsZVN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZW1vdmVGaWxlU3luYyhyZXRwdHIscHRyMCxsZW4wKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIwKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fXN0YXRpYyB3cml0ZShwYXRoLGNvbnRlbnQpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3dyaXRlKHB0cjAsbGVuMCxhZGRIZWFwT2JqZWN0KGNvbnRlbnQpKSl9c3RhdGljIHdyaXRlU3RyaW5nKHBhdGgsY29udGVudCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOLHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoY29udGVudCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3dyaXRlU3RyaW5nKHB0cjAsbGVuMCxwdHIxLGxlbjEpKX1zdGF0aWMgd3JpdGVTeW5jKHBhdGgsY29udGVudCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc193cml0ZVN5bmMocmV0cHRyLHB0cjAsbGVuMCxhZGRIZWFwT2JqZWN0KGNvbnRlbnQpKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIwKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fX1TeW1ib2wuZGlzcG9zZSYmKEZzLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09RnMucHJvdG90eXBlLmZyZWUpO2NsYXNzIE1ldGFkYXRhe3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShNZXRhZGF0YS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixNZXRhZGF0YUZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian10b0pTT04oKXtyZXR1cm57ZmlsZV9zaXplOnRoaXMuZmlsZV9zaXplLHR5cGU6dGhpcy50eXBlfX10b1N0cmluZygpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKX1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsTWV0YWRhdGFGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfbWV0YWRhdGFfZnJlZShwdHIsMCl9Z2V0IGZpbGVfc2l6ZSgpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF9tZXRhZGF0YV9maWxlX3NpemUodGhpcy5fX3diZ19wdHIpO3JldHVybiBCaWdJbnQuYXNVaW50Tig2NCxyZXQpfWdldCB0eXBlKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X21ldGFkYXRhX3R5cGUodGhpcy5fX3diZ19wdHIpO3JldHVybiBfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlW3JldF19c2V0IGZpbGVfc2l6ZShhcmcwKXt3YXNtLl9fd2JnX3NldF9tZXRhZGF0YV9maWxlX3NpemUodGhpcy5fX3diZ19wdHIsYXJnMCl9c2V0IHR5cGUoYXJnMCl7d2FzbS5fX3diZ19zZXRfbWV0YWRhdGFfdHlwZSh0aGlzLl9fd2JnX3B0ciwoX193YmluZGdlbl9lbnVtX0RpckVudHJ5VHlwZS5pbmRleE9mKGFyZzApKzF8fDMpLTEpfX1TeW1ib2wuZGlzcG9zZSYmKE1ldGFkYXRhLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09TWV0YWRhdGEucHJvdG90eXBlLmZyZWUpO2NsYXNzIFByb2plY3R7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFByb2plY3RGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193YmdfcHJvamVjdF9mcmVlKHB0ciwwKX1zdGF0aWMgYnVpbGQob3B0aW9ucyl7X2Fzc2VydENsYXNzKG9wdGlvbnMsQnVpbGRPcHRpb25zKTt2YXIgcHRyMD1vcHRpb25zLl9fZGVzdHJveV9pbnRvX3JhdygpO3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9idWlsZChwdHIwKSl9c3RhdGljIGdldCBjd2QoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLnByb2plY3RfY3dkKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1zdGF0aWMgZGVwcyhyZWdpc3RyeSxjb25jdXJyZW5jeSl7dmFyIHB0cjA9aXNMaWtlTm9uZShyZWdpc3RyeSk/MDpwYXNzU3RyaW5nVG9XYXNtMChyZWdpc3RyeSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfZGVwcyhwdHIwLGxlbjAsaXNMaWtlTm9uZShjb25jdXJyZW5jeSk/NDI5NDk2NzI5Nzpjb25jdXJyZW5jeT4+PjApKX1zdGF0aWMgZW50cnlwb2ludHNTdWJzY3JpYmUoY29uZmlnLGNhbGxiYWNrKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfZW50cnlwb2ludHNTdWJzY3JpYmUoYWRkSGVhcE9iamVjdChjb25maWcpLGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKSl9c3RhdGljIGd6aXAoZmlsZXMpe3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9nemlwKGFkZEhlYXBPYmplY3QoZmlsZXMpKSl9c3RhdGljIGhtckV2ZW50cyhpZGVudGlmaWVyLGNhbGxiYWNrKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGlkZW50aWZpZXIsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2htckV2ZW50cyhwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjYWxsYmFjaykpKX1zdGF0aWMgaW5pdCh0aHJlYWRfdXJsKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHRocmVhZF91cmwsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5wcm9qZWN0X2luaXQocHRyMCxsZW4wKX1zdGF0aWMgaW5zdGFsbChwYWNrYWdlX2xvY2ssbWF4X2NvbmN1cnJlbnRfZG93bmxvYWRzKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhY2thZ2VfbG9jayx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfaW5zdGFsbChwdHIwLGxlbjAsaXNMaWtlTm9uZShtYXhfY29uY3VycmVudF9kb3dubG9hZHMpPzQyOTQ5NjcyOTc6bWF4X2NvbmN1cnJlbnRfZG93bmxvYWRzPj4+MCkpfXN0YXRpYyBzZXRDd2QocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20ucHJvamVjdF9zZXRDd2QocHRyMCxsZW4wKX1zdGF0aWMgc2lnTWQ1KGNvbnRlbnQpe3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9zaWdNZDUoYWRkSGVhcE9iamVjdChjb250ZW50KSkpfXN0YXRpYyB1cGRhdGVJbmZvU3Vic2NyaWJlKGFnZ3JlZ2F0aW9uX21zLGNhbGxiYWNrKXt3YXNtLnByb2plY3RfdXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbl9tcyxhZGRIZWFwT2JqZWN0KGNhbGxiYWNrKSl9c3RhdGljIHdyaXRlQWxsVG9EaXNrKGNhbGxiYWNrKXt3YXNtLnByb2plY3Rfd3JpdGVBbGxUb0Rpc2soYWRkSGVhcE9iamVjdChjYWxsYmFjaykpfX1TeW1ib2wuZGlzcG9zZSYmKFByb2plY3QucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Qcm9qZWN0LnByb3RvdHlwZS5mcmVlKTtjbGFzcyBSb290VGFza3tzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoUm9vdFRhc2sucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsUm9vdFRhc2tGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFJvb3RUYXNrRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3Jvb3R0YXNrX2ZyZWUocHRyLDApfX1TeW1ib2wuZGlzcG9zZSYmKFJvb3RUYXNrLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Um9vdFRhc2sucHJvdG90eXBlLmZyZWUpO2NsYXNzIFdhc21UYXNrTWVzc2FnZXtzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2FzbVRhc2tNZXNzYWdlLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFdhc21UYXNrTWVzc2FnZUZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsV2FzbVRhc2tNZXNzYWdlRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dhc210YXNrbWVzc2FnZV9mcmVlKHB0ciwwKX1nZXQgdGFza0lkKCl7cmV0dXJuIHdhc20uX193YmdfZ2V0X3dhc210YXNrbWVzc2FnZV90YXNrSWQodGhpcy5fX3diZ19wdHIpPj4+MH1zZXQgdGFza0lkKGFyZzApe3dhc20uX193Ymdfc2V0X3dhc210YXNrbWVzc2FnZV90YXNrSWQodGhpcy5fX3diZ19wdHIsYXJnMCl9Z2V0IGRhdGEoKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLndhc210YXNrbWVzc2FnZV9kYXRhKHRoaXMuX193YmdfcHRyKSl9fVN5bWJvbC5kaXNwb3NlJiYoV2FzbVRhc2tNZXNzYWdlLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09V2FzbVRhc2tNZXNzYWdlLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXZWJXb3JrZXJDcmVhdGlvbntzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyQ3JlYXRpb24ucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsV2ViV29ya2VyQ3JlYXRpb25GaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdlYldvcmtlckNyZWF0aW9uRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcmNyZWF0aW9uX2ZyZWUocHRyLDApfWdldCBvcHRpb25zKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X3dlYndvcmtlcmNyZWF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIpO3JldHVybiBXZWJXb3JrZXJPcHRpb25zLl9fd3JhcChyZXQpfXNldCBvcHRpb25zKGFyZzApe19hc3NlcnRDbGFzcyhhcmcwLFdlYldvcmtlck9wdGlvbnMpO3ZhciBwdHIwPWFyZzAuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VyY3JlYXRpb25fb3B0aW9ucyh0aGlzLl9fd2JnX3B0cixwdHIwKX19U3ltYm9sLmRpc3Bvc2UmJihXZWJXb3JrZXJDcmVhdGlvbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVdlYldvcmtlckNyZWF0aW9uLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXZWJXb3JrZXJPcHRpb25ze3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShXZWJXb3JrZXJPcHRpb25zLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFdlYldvcmtlck9wdGlvbnNGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdlYldvcmtlck9wdGlvbnNGaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193Ymdfd2Vid29ya2Vyb3B0aW9uc19mcmVlKHB0ciwwKX1nZXQgY3dkKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5fX3diZ19nZXRfd2Vid29ya2Vyb3B0aW9uc19jd2QocmV0cHRyLHRoaXMuX193YmdfcHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWdldCBmaWxlbmFtZSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X3dlYndvcmtlcm9wdGlvbnNfZmlsZW5hbWUocmV0cHRyLHRoaXMuX193YmdfcHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fXNldCBjd2QoYXJnMCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChhcmcwLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uX193Ymdfc2V0X3dlYndvcmtlcm9wdGlvbnNfY3dkKHRoaXMuX193YmdfcHRyLHB0cjAsbGVuMCl9c2V0IGZpbGVuYW1lKGFyZzApe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAoYXJnMCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJvcHRpb25zX2ZpbGVuYW1lKHRoaXMuX193YmdfcHRyLHB0cjAsbGVuMCl9fVN5bWJvbC5kaXNwb3NlJiYoV2ViV29ya2VyT3B0aW9ucy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVdlYldvcmtlck9wdGlvbnMucHJvdG90eXBlLmZyZWUpO2NsYXNzIFdlYldvcmtlclRlcm1pbmF0aW9ue3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShXZWJXb3JrZXJUZXJtaW5hdGlvbi5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXZWJXb3JrZXJUZXJtaW5hdGlvbkZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBwdHI9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsV2ViV29ya2VyVGVybWluYXRpb25GaW5hbGl6YXRpb24udW5yZWdpc3Rlcih0aGlzKSxwdHJ9ZnJlZSgpe2NvbnN0IHB0cj10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193Ymdfd2Vid29ya2VydGVybWluYXRpb25fZnJlZShwdHIsMCl9Z2V0IG9wdGlvbnMoKXtjb25zdCByZXQ9d2FzbS5fX3diZ19nZXRfd2Vid29ya2VyY3JlYXRpb25fb3B0aW9ucyh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIFdlYldvcmtlck9wdGlvbnMuX193cmFwKHJldCl9Z2V0IHdvcmtlcklkKCl7cmV0dXJuIHdhc20uX193YmdfZ2V0X3dlYndvcmtlcnRlcm1pbmF0aW9uX3dvcmtlcklkKHRoaXMuX193YmdfcHRyKT4+PjB9c2V0IG9wdGlvbnMoYXJnMCl7X2Fzc2VydENsYXNzKGFyZzAsV2ViV29ya2VyT3B0aW9ucyk7dmFyIHB0cjA9YXJnMC5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJjcmVhdGlvbl9vcHRpb25zKHRoaXMuX193YmdfcHRyLHB0cjApfXNldCB3b3JrZXJJZChhcmcwKXt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl93b3JrZXJJZCh0aGlzLl9fd2JnX3B0cixhcmcwKX19ZnVuY3Rpb24gZ2V0V2FzbU1lbW9yeSgpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uZ2V0V2FzbU1lbW9yeSgpKX1mdW5jdGlvbiBnZXRXYXNtTW9kdWxlKCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5nZXRXYXNtTW9kdWxlKCkpfWZ1bmN0aW9uIGluaXRMb2dGaWx0ZXIoZmlsdGVyKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGZpbHRlcix3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmluaXRMb2dGaWx0ZXIocHRyMCxsZW4wKX1mdW5jdGlvbiBpbml0X3BhY2soKXt3YXNtLmluaXRfcGFjaygpfWZ1bmN0aW9uIHJlY3ZUYXNrTWVzc2FnZUluV29ya2VyKHdvcmtlcl9pZCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5yZWN2VGFza01lc3NhZ2VJbldvcmtlcih3b3JrZXJfaWQpKX1mdW5jdGlvbiByZWdpc3RlcldvcmtlclNjaGVkdWxlcihjcmVhdG9yLHRlcm1pbmF0b3Ipe3dhc20ucmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIoYWRkSGVhcE9iamVjdChjcmVhdG9yKSxhZGRIZWFwT2JqZWN0KHRlcm1pbmF0b3IpKX1mdW5jdGlvbiBzZW5kVGFza01lc3NhZ2UobWVzc2FnZSl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5zZW5kVGFza01lc3NhZ2UoYWRkSGVhcE9iamVjdChtZXNzYWdlKSkpfWZ1bmN0aW9uIHdhc21fdGhyZWFkX2VudHJ5X3BvaW50KHB0cil7d2FzbS53YXNtX3RocmVhZF9lbnRyeV9wb2ludChwdHIpfWZ1bmN0aW9uIHdvcmtlckNyZWF0ZWQod29ya2VyX2lkKXt3YXNtLndvcmtlckNyZWF0ZWQod29ya2VyX2lkKX1TeW1ib2wuZGlzcG9zZSYmKFdlYldvcmtlclRlcm1pbmF0aW9uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09V2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlLmZyZWUpO2NvbnN0IF9fdXRvb1JlYWRDdXN0b21TZWN0aW9uPWZ1bmN0aW9uIHJlYWRDdXN0b21TZWN0aW9uKHdhc21Nb2R1bGUsbWVtb3J5LG5hbWVQdHIsbmFtZUxlbmd0aCx0YXJnZXRQdHIsdGFyZ2V0TGVuZ3RoKXtjb25zdCBuYW1lQnl0ZXM9bmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcixuYW1lUHRyLG5hbWVMZW5ndGgpLHNlY3Rpb25OYW1lPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkobmFtZUJ5dGVzKSksc2VjdGlvbnM9V2ViQXNzZW1ibHkuTW9kdWxlLmN1c3RvbVNlY3Rpb25zKHdhc21Nb2R1bGUsc2VjdGlvbk5hbWUpO2lmKDA9PT1zZWN0aW9ucy5sZW5ndGgpcmV0dXJuIDA7Y29uc3Qgc2VjdGlvbj1zZWN0aW9uc1swXSxuZWVkPXNlY3Rpb24uYnl0ZUxlbmd0aDtyZXR1cm4gdGFyZ2V0TGVuZ3RoPG5lZWR8fG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIsdGFyZ2V0UHRyLG5lZWQpLnNldChuZXcgVWludDhBcnJheShzZWN0aW9uKSksbmVlZH07ZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KXtjb25zdCBpbXBvcnQwPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl84YzRlNDNmZTc0NTU5ZDczOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfMGJjODQ4MmM2ZTM1MDhhZTpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZGVidWdTdHJpbmcoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzAwOTVhNzNiOGIxNTZmNzY6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGdldE9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9pc19udWxsX2FjMzRmNTAwMzk5MTc1OWE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIG51bGw9PT1nZXRPYmplY3QoYXJnMCl9LF9fd2JnX19fd2JpbmRnZW5faXNfb2JqZWN0XzVhZThlNTg4MGYyYzFmYmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgdmFsPWdldE9iamVjdChhcmcwKTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHZhbCYmbnVsbCE9PXZhbH0sX193YmdfX193YmluZGdlbl9pc191bmRlZmluZWRfOWU0ZDkyNTM0YzQyZDc3ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gdm9pZCAwPT09Z2V0T2JqZWN0KGFyZzApfSxfX3diZ19fX3diaW5kZ2VuX21lbW9yeV9iZDFmYmNmMjFmYmVmM2M4OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbS5tZW1vcnkpfSxfX3diZ19fX3diaW5kZ2VuX21vZHVsZV9mNmI4MDUyZDc5YzFjYzE2OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbU1vZHVsZSl9LF9fd2JnX19fd2JpbmRnZW5fbnVtYmVyX2dldF84ZmY0MjU1NTE2Y2NhZDNlOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3Qgb2JqPWdldE9iamVjdChhcmcxKSxyZXQ9Im51bWJlciI9PXR5cGVvZiBvYmo/b2JqOnZvaWQgMDtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRGbG9hdDY0KGFyZzArOCxpc0xpa2VOb25lKHJldCk/MDpyZXQsITApLGdldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArMCwhaXNMaWtlTm9uZShyZXQpLCEwKX0sX193YmdfX193YmluZGdlbl9yZXRocm93XzA1NTI1YzU2N2YxNTQ0NzI6ZnVuY3Rpb24oYXJnMCl7dGhyb3cgdGFrZU9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0XzcyZmI2OTYyMDJjNTY3Mjk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBvYmo9Z2V0T2JqZWN0KGFyZzEpLHJldD0ic3RyaW5nIj09dHlwZW9mIG9iaj9vYmo6dm9pZCAwO3ZhciBwdHIxPWlzTGlrZU5vbmUocmV0KT8wOnBhc3NTdHJpbmdUb1dhc20wKHJldCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX3Rocm93X2JlMjg5ZDUwMzRlZDI3MWI6ZnVuY3Rpb24oYXJnMCxhcmcxKXt0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpfSxfX3diZ19fd2JnX2NiX3VucmVmX2Q5Yjg3ZmY3OTgyZTNiMjE6ZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLl93YmdfY2JfdW5yZWYoKX0sX193YmdfYWJvcnRfMmYwNTg0ZTAzZThlMzk1MDpmdW5jdGlvbihhcmcwKXtnZXRPYmplY3QoYXJnMCkuYWJvcnQoKX0sX193YmdfYWJvcnRfZDU0OWI5MmQzYzY2NWRlMTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5hYm9ydChnZXRPYmplY3QoYXJnMSkpfSxfX3diZ19hcHBlbmRfYTk5MmNjYzM3YWE2MmRjNDpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe2dldE9iamVjdChhcmcwKS5hcHBlbmQoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpfSxhcmd1bWVudHMpfSxfX3diZ19hcnJheUJ1ZmZlcl8wNWNlMWFmMjNlOTA2NGU4OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5hcnJheUJ1ZmZlcigpKX0sX193YmdfYXJyYXlCdWZmZXJfYmI1NDA3NjE2NjAwNmMzOTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuYXJyYXlCdWZmZXIoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2FzeW5jXzc5ZjJhNjFmOWQwYjMxY2Y6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGdldE9iamVjdChhcmcwKS5hc3luY30sX193YmdfYnVmZmVyXzdiNWY1M2U0NjU1N2Q4ZjE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmJ1ZmZlcil9LF9fd2JnX2NhbGxfMzg5ZWZlMjg0MzVhOTM4ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19jYWxsXzQ3MDhlMGMxM2JkYzhlOTU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfY2hhbmdlZEhhbmRsZV8xMjM2OTZlYWVhZmYzMmQ3OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHJldD1nZXRPYmplY3QoYXJnMCkuY2hhbmdlZEhhbmRsZTtyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19jbGVhclRpbWVvdXRfN2E0MmI0OTc4NGFlYTY0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChjbGVhclRpbWVvdXQodGFrZU9iamVjdChhcmcwKSkpfSxfX3diZ19jbG9zZV80YmEzMTIyNTNjNDI0MzQyOmZ1bmN0aW9uKGFyZzApe2dldE9iamVjdChhcmcwKS5jbG9zZSgpfSxfX3diZ19jbG9zZV84M2ZiODA5YWNhM2RlN2Y5OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jbG9zZSgpKX0sX193YmdfY3JlYXRlT2JqZWN0VVJMXzkxODE4NWRiNmExMGEwYzg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBwdHIxPXBhc3NTdHJpbmdUb1dhc20wKFVSTC5jcmVhdGVPYmplY3RVUkwoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxhcmd1bWVudHMpfSxfX3diZ19jcmVhdGVXcml0YWJsZV84MGJjNWRlMzc0NDQ4YjQyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jcmVhdGVXcml0YWJsZSgpKX0sX193YmdfZGF0YV81MzMwZGE1MDMxMmQwYmMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5kYXRhKX0sX193YmdfZGVidWdfNDZhOTM5OTVmYzZmODgyMDpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLmRlYnVnKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2RlYnVnX2E0MDk5ZmExMmRiNmNkNjE6ZnVuY3Rpb24oYXJnMCl7Y29uc29sZS5kZWJ1ZyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19kaXJlbnRyeV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRGlyRW50cnkuX193cmFwKGFyZzApKX0sX193YmdfZG9uZV81N2IzOWVjZDlhZGRmZTgxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuZG9uZX0sX193YmdfZW50cmllc18wNGE0Yjk4MjM1MWE3MTdmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5lbnRyaWVzKCkpfSxfX3diZ19lcnJvcl83NTM0YjhlOWEzNmYxYWI0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7bGV0IGRlZmVycmVkMF8wLGRlZmVycmVkMF8xO3RyeXtkZWZlcnJlZDBfMD1hcmcwLGRlZmVycmVkMF8xPWFyZzEsY29uc29sZS5lcnJvcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDBfMCxkZWZlcnJlZDBfMSwxKX19LF9fd2JnX2Vycm9yXzc5NGQwZmZjOWQwMGQ1YzM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5lcnJvcihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSxnZXRPYmplY3QoYXJnMykpfSxfX3diZ19lcnJvcl85YTdmZTNmOTMyMDM0Y2RlOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuZXJyb3IoZ2V0T2JqZWN0KGFyZzApKX0sX193YmdfZXZhbF8zZjBiOWYwY2JhZjQ1YTM0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcmV0PWV2YWwoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpO3JldHVybiBhZGRIZWFwT2JqZWN0KHJldCl9LGFyZ3VtZW50cyl9LF9fd2JnX2ZldGNoXzc0YTNlODRlYmQyYzlhMGU6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZmV0Y2goZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX2ZldGNoX2FmYjZhNGI2Y2FjZjg3NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZmV0Y2goZ2V0T2JqZWN0KGFyZzEpKSl9LF9fd2JnX2ZsdXNoXzIyYjc4NTA2MDU5MmNhNWY6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLmZsdXNoKCl9LGFyZ3VtZW50cyl9LF9fd2JnX2Zyb21fYmRkZDY0ZTdkNWZmNjk0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5mcm9tKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19nZXREaXJlY3RvcnlIYW5kbGVfODdjZThjYTUzY2Y0ZDhkYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5SGFuZGxlKGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19nZXREaXJlY3RvcnlfYjY2YWUzZTc5ZjkwMjk4MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5KCkpfSxfX3diZ19nZXRGaWxlSGFuZGxlX2ZmNGFiOTE3YjQ1YWZmYjM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmdldEZpbGVIYW5kbGUoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKSl9LF9fd2JnX2dldEZpbGVfMTE1MzU0ZmM5NTBlZGM4ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RmlsZSgpKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzgwNTc4YjJmZjJhMDkzYmE6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGdldE9iamVjdChhcmcwKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2dldFRpbWVfMWUzY2QxMzkxYzVjMzk5NTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmdldFRpbWUoKX0sX193YmdfZ2V0VGltZXpvbmVPZmZzZXRfODE3NzZkMTBhNGVjMThhODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmdldFRpbWV6b25lT2Zmc2V0KCl9LF9fd2JnX2dldF85Yjk0ZDczZTYyMjFmNzVjOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApW2FyZzE+Pj4wXSl9LF9fd2JnX2dldF9iM2VkM2FkNGJlMmJjOGFjOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUmVmbGVjdC5nZXQoZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19oYXNfZDRlNTMyMzg5NjZjMTJiNjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBSZWZsZWN0LmhhcyhnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfaGVhZGVyc181OWEyOTM4ZGI5ZjgwOTg1OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5oZWFkZXJzKX0sX193YmdfaW5mb18xNDhkMDQzODQwNTgyMDEyOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuaW5mbyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19pbmZvXzllNjAyY2YxMGM1YzY5MGI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5pbmZvKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2luc3RhbmNlb2ZfRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVfMTUwNmIzZDAxNzc5OWQ0ODpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9Eb21FeGNlcHRpb25fOTljMTc3MTkzZTU1NGI3NTpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBET01FeGNlcHRpb259Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZV81NmExNjcwMzlkNjE0NTQ4OmZ1bmN0aW9uKGFyZzApe2xldCByZXN1bHQ7dHJ5e3Jlc3VsdD1nZXRPYmplY3QoYXJnMClpbnN0YW5jZW9mIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGV9Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfUmVzcG9uc2VfZWUxZDU0ZDc5YWU0MTk3NzpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBSZXNwb25zZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzliOTA3NTkzNWM3NDcwN2M6ZnVuY3Rpb24oYXJnMCl7bGV0IHJlc3VsdDt0cnl7cmVzdWx0PWdldE9iamVjdChhcmcwKWluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaXNBcnJheV9kMzE0YmI5OGZjZjA4MzMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdChhcmcwKSl9LF9fd2JnX2l0ZXJhdG9yXzZmZjY1NjBjYTE1NjhlNTU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChTeW1ib2wuaXRlcmF0b3IpfSxfX3diZ19raW5kXzkwNzY5ZDZjMTZmYWVhZmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS5raW5kO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUhhbmRsZUtpbmQuaW5kZXhPZihyZXQpKzF8fDMpLTF9LF9fd2JnX2xlbmd0aF8zMmVkOWEyNzlhY2QwNTRjOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubGVuZ3RofSxfX3diZ19sZW5ndGhfMzVhN2JhY2U0MGYzNmVhYzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmxlbmd0aH0sX193YmdfbWVzc2FnZV8wYjJiMDI5OGEyMzFiMGQ0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubWVzc2FnZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19tZXRhZGF0YV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoTWV0YWRhdGEuX193cmFwKGFyZzApKX0sX193YmdfbmFtZV8yNDI3NTNlNTExMGNkNzU2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubmFtZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19uYXZpZ2F0b3JfNDQ3ODkzMWYzMmViY2E1NzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmF2aWdhdG9yKX0sX193YmdfbmV3XzBfNzNhZmMzNWViNTQ0ZTUzOTpmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBEYXRlKX0sX193YmdfbmV3XzI0NWNkNWM0OTE1N2U2MDI6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IERhdGUoZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX25ld18zNjEzMDhiMjM1NmNlY2QwOmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IE9iamVjdCl9LF9fd2JnX25ld18zZWIzNmFlMjQxZmU2ZjQ0OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEFycmF5KX0sX193YmdfbmV3XzRmOGYzYzEyM2U0NzQzNTg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgV29ya2VyKGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25ld182NDI4NGJkNDg3ZjlkMjM5OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEhlYWRlcnMpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfNzJjNjI3YmE4MGRlMWMyMTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgSW50MzJBcnJheShnZXRPYmplY3QoYXJnMCkpKX0sX193YmdfbmV3XzhhNmYyMzhhNmVjZTg2ZWE6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgRXJyb3IpfSxfX3diZ19uZXdfOGVjNTgwMWIzOWQ2Zjg2MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgRmlsZVN5c3RlbU9ic2VydmVyKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19uZXdfYjVkOWUyZmIzODlmZWY5MTpmdW5jdGlvbihhcmcwLGFyZzEpe3RyeXt2YXIgc3RhdGUwPXthOmFyZzAsYjphcmcxfTtjb25zdCByZXQ9bmV3IFByb21pc2UoKGFyZzAsYXJnMSk9Pntjb25zdCBhPXN0YXRlMC5hO3N0YXRlMC5hPTA7dHJ5e3JldHVybiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNTYwMyhhLHN0YXRlMC5iLGFyZzAsYXJnMSl9ZmluYWxseXtzdGF0ZTAuYT1hfX0pO3JldHVybiBhZGRIZWFwT2JqZWN0KHJldCl9ZmluYWxseXtzdGF0ZTAuYT1zdGF0ZTAuYj0wfX0sX193YmdfbmV3X2I5NDllN2Y1NjE1MGE1ZDE6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQWJvcnRDb250cm9sbGVyKX0sYXJndW1lbnRzKX0sX193YmdfbmV3X2RkMmI2ODBjOGJmNmFlMjk6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IFVpbnQ4QXJyYXkoZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX25ld19mcm9tX3NsaWNlX2EzZDI2MjlkYzE4MjY3ODQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgVWludDhBcnJheShnZXRBcnJheVU4RnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sX193YmdfbmV3X25vX2FyZ3NfMWM3Yzg0MmYwOGQwMGViYjpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBGdW5jdGlvbihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxfX3diZ19uZXdfd2l0aF9sZW5ndGhfYTJjMzljYmU4OGZkOGZmMTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgVWludDhBcnJheShhcmcwPj4+MCkpfSxfX3diZ19uZXdfd2l0aF9vcHRpb25zXzE0NWFmYmE5MjJhZDM3MDM6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBXb3JrZXIoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSksZ2V0T2JqZWN0KGFyZzIpKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25ld193aXRoX3N0cl9hbmRfaW5pdF9hNjFjYmM2YmRlZjIxNjE0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgUmVxdWVzdChnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3X3dpdGhfc3RyX3NlcXVlbmNlX2NlYTJjMDU3MWQ2ZGM2YWI6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEJsb2IoZ2V0T2JqZWN0KGFyZzApKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25leHRfMGE1ZTBmOGFmOTgxNDZhYTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmV4dCgpKX0sYXJndW1lbnRzKX0sX193YmdfbmV4dF8zNDgyZjU0YzQ5ZThhZjE5OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5uZXh0KCkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXh0XzQxOGY4MGQ4ZjUzMDMyMzM6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm5leHQpfSxfX3diZ19ub3dfMGRjNDkyMGE0N2NmNzI4MDpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLm5vdygpfSxfX3diZ19ub3dfYTNhZjlhMmY0YmJhYTRkMTpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfSxfX3diZ19vYnNlcnZlXzMyMjM1YjVlNjE5NWQ0YWI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5vYnNlcnZlKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sX193Ymdfb2ZfZGRjMDk0MmIwZGNlMTZhMTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoQXJyYXkub2YoZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sX193YmdfcGFyc2VfNzA4NDYxYTFmZWRkZmIzODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KEpTT04ucGFyc2UoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmdfcGVyZm9ybWFuY2VfNmFkYzNiODk5ZTQ0OGEyMzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucGVyZm9ybWFuY2UpfSxfX3diZ19wb3N0TWVzc2FnZV8yMDQxZjRlOTBhZjYxMzE4OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnBvc3RNZXNzYWdlKGdldE9iamVjdChhcmcxKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3Bvc3RNZXNzYWdlXzc3MWVmMzI5M2EyOGJiYWM6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucG9zdE1lc3NhZ2UoZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfcHJvdG90eXBlc2V0Y2FsbF9iZGNkY2M1ODQyZTRkNzdkOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChnZXRBcnJheVU4RnJvbVdhc20wKGFyZzAsYXJnMSksZ2V0T2JqZWN0KGFyZzIpKX0sX193YmdfcHVzaF84ZmZkY2IyMDYzMzQwYmE1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGdldE9iamVjdChhcmcwKS5wdXNoKGdldE9iamVjdChhcmcxKSl9LF9fd2JnX3F1ZXVlTWljcm90YXNrXzBhYTBhOTI3Zjc4ZjVkOTg6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnF1ZXVlTWljcm90YXNrKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfNWJiNTM2OTgyZjc4YTU2ZjpmdW5jdGlvbihhcmcwKXtxdWV1ZU1pY3JvdGFzayhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19yYW5kb21fOTEyMjg0ZGJmNjM2ZjI2OTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpfSxfX3diZ19yZWxhdGl2ZVBhdGhDb21wb25lbnRzX2JjNDgyNDAzY2I2ZDdlYTk6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnJlbGF0aXZlUGF0aENvbXBvbmVudHMpfSxfX3diZ19yZW1vdmVFbnRyeV9jNGVmZmZkZDMxOGI1MWExOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyLGFyZzMpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5yZW1vdmVFbnRyeShnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMSxhcmcyKSxnZXRPYmplY3QoYXJnMykpKX0sX193YmdfcmVzb2x2ZV8wMDJjNGI3ZDlkOGY2YjY0OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFByb21pc2UucmVzb2x2ZShnZXRPYmplY3QoYXJnMCkpKX0sX193Ymdfcm9vdHRhc2tfbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFJvb3RUYXNrLl9fd3JhcChhcmcwKSl9LF9fd2JnX3NldFRpbWVvdXRfNjMwMDg2MTM2NDRiMDdhZjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnNldFRpbWVvdXQoZ2V0T2JqZWN0KGFyZzEpLGFyZzIpKX0sYXJndW1lbnRzKX0sX193Ymdfc2V0VGltZW91dF83YmIzNDI5NjYyYWIxZTcwOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3Qoc2V0VGltZW91dChnZXRPYmplY3QoYXJnMCksYXJnMSkpfSxfX3diZ19zZXRfYXRfZTQ1M2NmM2Y0YmU5ZTJkOTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5hdD1hcmcxfSxfX3diZ19zZXRfYm9keV85YTdlMDBhZmUzY2ZlMjQ0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmJvZHk9Z2V0T2JqZWN0KGFyZzEpfSxfX3diZ19zZXRfY2FjaGVfMzE1YTNlZDc3M2E0MTU0MzpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jYWNoZT1fX3diaW5kZ2VuX2VudW1fUmVxdWVzdENhY2hlW2FyZzFdfSxfX3diZ19zZXRfY3JlYXRlXzFmOTAyYzU5MzZhZGRlN2Q6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuY3JlYXRlPTAhPT1hcmcxfSxfX3diZ19zZXRfY3JlYXRlX2M5NWRkY2EwMThmYWM5Y2U6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuY3JlYXRlPTAhPT1hcmcxfSxfX3diZ19zZXRfY3JlZGVudGlhbHNfYzRhNThkMmUwNWVmMjRmYjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVkZW50aWFscz1fX3diaW5kZ2VuX2VudW1fUmVxdWVzdENyZWRlbnRpYWxzW2FyZzFdfSxfX3diZ19zZXRfZjQzZTU3N2FlYTk0NDY1YjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApW2FyZzE+Pj4wXT10YWtlT2JqZWN0KGFyZzIpfSxfX3diZ19zZXRfaGVhZGVyc19jZmM1ZjRiMmMxZjIwNTQ5OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmhlYWRlcnM9Z2V0T2JqZWN0KGFyZzEpfSxfX3diZ19zZXRfbWV0aG9kX2MzZTIwMzc1ZjVhZTdmYWM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe2dldE9iamVjdChhcmcwKS5tZXRob2Q9Z2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMil9LF9fd2JnX3NldF9tb2RlX2IxMzY0MmMzMTI2NDgyMDI6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkubW9kZT1fX3diaW5kZ2VuX2VudW1fUmVxdWVzdE1vZGVbYXJnMV19LF9fd2JnX3NldF9uYW1lXzQ5YjllY2JhN2Y1OGYyZTU6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe2dldE9iamVjdChhcmcwKS5uYW1lPWdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpfSxfX3diZ19zZXRfb25tZXNzYWdlXzZlZDQxMDUwZTRhNWNlZTI6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkub25tZXNzYWdlPWdldE9iamVjdChhcmcxKX0sX193Ymdfc2V0X3JlY3Vyc2l2ZV82NWVkMDdkZjg5MmI0ODg1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnJlY3Vyc2l2ZT0wIT09YXJnMX0sX193Ymdfc2V0X3JlY3Vyc2l2ZV9mNWQzNDE2MDk4MzI4MTEwOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnJlY3Vyc2l2ZT0wIT09YXJnMX0sX193Ymdfc2V0X3NpZ25hbF9mMmQzZjg1OTkyNDg4OTZkOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnNpZ25hbD1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF90eXBlX2UxMjdmMjZiNzhkNzhiZmM6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkudHlwZT1fX3diaW5kZ2VuX2VudW1fV29ya2VyVHlwZVthcmcxXX0sX193Ymdfc2lnbmFsX2QxMjg1ZWNhYjRlYmM1YWQ6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnNpZ25hbCl9LF9fd2JnX3NpemVfZTA1ZDMxY2M2MDQ5ODE1ZjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLnNpemV9LF9fd2JnX3NsaWNlXzU2NmExNWYzMjE0ZmE1MmU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyxhcmc0KXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2xpY2UoYXJnMSxhcmcyLGdldFN0cmluZ0Zyb21XYXNtMChhcmczLGFyZzQpKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3N0YWNrXzBlZDc1ZDY4NTc1YjBmM2M6ZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGdldE9iamVjdChhcmcxKS5zdGFjayx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzEyODM3MTY3YWQ5MzUxMTY6ZnVuY3Rpb24oKXtjb25zdCByZXQ9dm9pZCAwPT09X193ZWJwYWNrX3JlcXVpcmVfXy5nP251bGw6X193ZWJwYWNrX3JlcXVpcmVfXy5nO3JldHVybiBpc0xpa2VOb25lKHJldCk/MDphZGRIZWFwT2JqZWN0KHJldCl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfVEhJU19lNjI4ZTg5YWIzYjFjOTVmOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsVGhpcz9udWxsOmdsb2JhbFRoaXM7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfYTYyMWQzZGZiYjYwZDBjZTpmdW5jdGlvbigpe2NvbnN0IHJldD0idW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/bnVsbDpzZWxmO3JldHVybiBpc0xpa2VOb25lKHJldCk/MDphZGRIZWFwT2JqZWN0KHJldCl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9XSU5ET1dfZjg3MjdmMGNmODg4ZTBiZDpmdW5jdGlvbigpe2NvbnN0IHJldD0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9udWxsOndpbmRvdztyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19zdGF0dXNfODlkN2U4MDNkYjkxMWVlNzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLnN0YXR1c30sX193Ymdfc3RvcmFnZV9jMDAyYjUzYmM0ODgzMjk5OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5zdG9yYWdlKX0sX193Ymdfc3RyaW5naWZ5XzhkMWNjNmZmMzgzZThiYWU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoSlNPTi5zdHJpbmdpZnkoZ2V0T2JqZWN0KGFyZzApKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3N1YmFycmF5X2E5NmUxZmVmMTdlZDIzY2I6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5zdWJhcnJheShhcmcxPj4+MCxhcmcyPj4+MCkpfSxfX3diZ190aGVuXzBkOWZlMmM3YjE4NTdkMzI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS50aGVuKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sX193YmdfdGhlbl9iOWU3YjNiNWYxYTllMWI1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnRoZW4oZ2V0T2JqZWN0KGFyZzEpKSl9LF9fd2JnX3RvU3RyaW5nXzk2NGZmN2ZlNmVjYTgzNjI6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnRvU3RyaW5nKCkpfSxfX3diZ190cnVuY2F0ZV9kYzY2MWZkY2IwMDYyZmE3OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLnRydW5jYXRlKGFyZzE+Pj4wKX0sYXJndW1lbnRzKX0sX193YmdfdHlwZV8wM2RmZTQ2MjE3MzVlNTI4OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHJldD1nZXRPYmplY3QoYXJnMCkudHlwZTtyZXR1cm4oX193YmluZGdlbl9lbnVtX0ZpbGVTeXN0ZW1DaGFuZ2VSZWNvcmRUeXBlLmluZGV4T2YocmV0KSsxfHw3KS0xfSxfX3diZ191cmxfYzQ4NGMyNmIxZmJmNTEyNjpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZ2V0T2JqZWN0KGFyZzEpLnVybCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ192YWx1ZV8wNTQ2MjU1YjQxNWU5NmMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS52YWx1ZSl9LF9fd2JnX3ZhbHVlX2ZlNmVlMzRhZjVkYzNkY2U6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnZhbHVlKX0sX193Ymdfd2FpdEFzeW5jX2E1OGIyMTM0YmZmMzljM2U6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KEF0b21pY3Mud2FpdEFzeW5jKGdldE9iamVjdChhcmcwKSxhcmcxPj4+MCxhcmcyKSl9LF9fd2JnX3dhaXRBc3luY19jMGEzOWE3ZDMzMThkOTFlOmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoQXRvbWljcy53YWl0QXN5bmMpfSxfX3diZ193YXJuX2E0MGI5NzE0NjdiMjE5Yzc6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS53YXJuKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX3dhcm5fZjdhZTFiMmU2NmNjYjkzMDpmdW5jdGlvbihhcmcwKXtjb25zb2xlLndhcm4oZ2V0T2JqZWN0KGFyZzApKX0sX193Ymdfd2FzbXRhc2ttZXNzYWdlX25ldzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChXYXNtVGFza01lc3NhZ2UuX193cmFwKGFyZzApKX0sX193Ymdfd2Vid29ya2VyY3JlYXRpb25fbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdlYldvcmtlckNyZWF0aW9uLl9fd3JhcChhcmcwKSl9LF9fd2JnX3dlYndvcmtlcnRlcm1pbmF0aW9uX25ldzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChXZWJXb3JrZXJUZXJtaW5hdGlvbi5fX3dyYXAoYXJnMCkpfSxfX3diZ193cml0ZV8yZDU5MzM3Y2M0OTY5MTlkOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyLGFyZzMpe3JldHVybiBnZXRPYmplY3QoYXJnMCkud3JpdGUoZ2V0QXJyYXlVOEZyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSl9LGFyZ3VtZW50cyl9LF9fd2JnX3dyaXRlXzM3ZjVhNjJhMjRkYTY2MmY6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkud3JpdGUoZ2V0T2JqZWN0KGFyZzEpKSl9LGFyZ3VtZW50cyl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAxOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZUNsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3Mjc2MyxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTczNzEzKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAyOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3NDY4OSxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTc0NjE5KSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAzOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3NDY4OSxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTc0NjE5KSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3NDc1MSxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTc0NzE1KSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3NDg0MSxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTc0ODIyKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzQ2OTAwLF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV80Njg4MSkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChhcmcwKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDg6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA5OmZ1bmN0aW9uKGFyZzAsYXJnMSl7dmFyIHYwPWdldEFycmF5SnNWYWx1ZUZyb21XYXNtMChhcmcwLGFyZzEpLnNsaWNlKCk7d2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoYXJnMCw0KmFyZzEsNCk7cmV0dXJuIGFkZEhlYXBPYmplY3QodjApfSxfX3diaW5kZ2VuX2xpbmtfMGIxZjc2ZDIzNWZkMmI4NjpmdW5jdGlvbihhcmcwKXtjb25zdCB2YWw9Im9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIGxldCBbaWEsIGluZGV4LCB2YWx1ZV0gPSBldi5kYXRhO1xuICAgICAgICAgICAgICAgIGlhID0gbmV3IEludDMyQXJyYXkoaWEuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gQXRvbWljcy53YWl0KGlhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgIixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKHZvaWQgMD09PVVSTC5jcmVhdGVPYmplY3RVUkw/ImRhdGE6YXBwbGljYXRpb24vamF2YXNjcmlwdCwiK2VuY29kZVVSSUNvbXBvbmVudCh2YWwpOlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3ZhbF0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KSksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47Z2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCs0LGxlbjEsITApLGdldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArMCxwdHIxLCEwKX0sX193YmluZGdlbl9vYmplY3RfY2xvbmVfcmVmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKSl9LF9fd2JpbmRnZW5fb2JqZWN0X2Ryb3BfcmVmOmZ1bmN0aW9uKGFyZzApe3Rha2VPYmplY3QoYXJnMCl9LG1lbW9yeTptZW1vcnl8fG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6MTAyNSxtYXhpbXVtOjY1NTM2LHNoYXJlZDohMH0pfTtyZXR1cm57X19wcm90b19fOm51bGwsIi4vaW5kZXhfYmcuanMiOmltcG9ydDAsZW52OntfX3Byb3RvX186bnVsbCwuLi5lbnZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyxyZWFkX2N1c3RvbV9zZWN0aW9uOihuYW1lUHRyLG5hbWVMZW5ndGgsdGFyZ2V0UHRyLHRhcmdldExlbmd0aCk9Pl9fdXRvb1JlYWRDdXN0b21TZWN0aW9uKHdhc21Nb2R1bGUsd2FzbS5tZW1vcnksbmFtZVB0cixuYW1lTGVuZ3RoLHRhcmdldFB0cix0YXJnZXRMZW5ndGgpfX19ZnVuY3Rpb24gX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3NDgyMihhcmcwLGFyZzEpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3NDgyMihhcmcwLGFyZzEpfWZ1bmN0aW9uIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV80Njg4MShhcmcwLGFyZzEpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzQ2ODgxKGFyZzAsYXJnMSl9ZnVuY3Rpb24gX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE3MzcxMyhhcmcwLGFyZzEsYXJnMil7d2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTczNzEzKGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTc0NjE5KGFyZzAsYXJnMSxhcmcyKXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8xNzQ2MTkoYXJnMCxhcmcxLGFkZEhlYXBPYmplY3QoYXJnMikpfWZ1bmN0aW9uIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8xNzQ3MTUoYXJnMCxhcmcxLGFyZzIpe3RyeXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8xNzQ3MTUoYXJnMCxhcmcxLGFkZEJvcnJvd2VkT2JqZWN0KGFyZzIpKX1maW5hbGx5e2hlYXBbc3RhY2tfcG9pbnRlcisrXT12b2lkIDB9fWZ1bmN0aW9uIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV81NjAzKGFyZzAsYXJnMSxhcmcyLGFyZzMpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzU2MDMoYXJnMCxhcmcxLGFkZEhlYXBPYmplY3QoYXJnMiksYWRkSGVhcE9iamVjdChhcmczKSl9Y29uc3QgX193YmluZGdlbl9lbnVtX0RpckVudHJ5VHlwZT1bImZpbGUiLCJkaXJlY3RvcnkiXSxfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUNoYW5nZVJlY29yZFR5cGU9WyJhcHBlYXJlZCIsImRpc2FwcGVhcmVkIiwiZXJyb3JlZCIsIm1vZGlmaWVkIiwibW92ZWQiLCJ1bmtub3duIl0sX193YmluZGdlbl9lbnVtX0ZpbGVTeXN0ZW1IYW5kbGVLaW5kPVsiZmlsZSIsImRpcmVjdG9yeSJdLF9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q2FjaGU9WyJkZWZhdWx0Iiwibm8tc3RvcmUiLCJyZWxvYWQiLCJuby1jYWNoZSIsImZvcmNlLWNhY2hlIiwib25seS1pZi1jYWNoZWQiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdENyZWRlbnRpYWxzPVsib21pdCIsInNhbWUtb3JpZ2luIiwiaW5jbHVkZSJdLF9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0TW9kZT1bInNhbWUtb3JpZ2luIiwibm8tY29ycyIsImNvcnMiLCJuYXZpZ2F0ZSJdLF9fd2JpbmRnZW5fZW51bV9Xb3JrZXJUeXBlPVsiY2xhc3NpYyIsIm1vZHVsZSJdLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193YmdfYnVpbGRvcHRpb25zX2ZyZWUocHRyPj4+MCwxKSksQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2NyZWF0ZXN5bmNhY2Nlc3NoYW5kbGVvcHRpb25zX2ZyZWUocHRyPj4+MCwxKSksRGlyRW50cnlGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2RpcmVudHJ5X2ZyZWUocHRyPj4+MCwxKSksRnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2ZzX2ZyZWUocHRyPj4+MCwxKSksTWV0YWRhdGFGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX21ldGFkYXRhX2ZyZWUocHRyPj4+MCwxKSksUHJvamVjdEZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193YmdfcHJvamVjdF9mcmVlKHB0cj4+PjAsMSkpLFJvb3RUYXNrRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19yb290dGFza19mcmVlKHB0cj4+PjAsMSkpLFdhc21UYXNrTWVzc2FnZUZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfd2FzbXRhc2ttZXNzYWdlX2ZyZWUocHRyPj4+MCwxKSksV2ViV29ya2VyQ3JlYXRpb25GaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3dlYndvcmtlcmNyZWF0aW9uX2ZyZWUocHRyPj4+MCwxKSksV2ViV29ya2VyT3B0aW9uc0ZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfd2Vid29ya2Vyb3B0aW9uc19mcmVlKHB0cj4+PjAsMSkpLFdlYldvcmtlclRlcm1pbmF0aW9uRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ193ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl9mcmVlKHB0cj4+PjAsMSkpO2Z1bmN0aW9uIGFkZEhlYXBPYmplY3Qob2JqKXtoZWFwX25leHQ9PT1oZWFwLmxlbmd0aCYmaGVhcC5wdXNoKGhlYXAubGVuZ3RoKzEpO2NvbnN0IGlkeD1oZWFwX25leHQ7cmV0dXJuIGhlYXBfbmV4dD1oZWFwW2lkeF0saGVhcFtpZHhdPW9iaixpZHh9ZnVuY3Rpb24gX2Fzc2VydENsYXNzKGluc3RhbmNlLGtsYXNzKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2Yga2xhc3MpKXRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgJHtrbGFzcy5uYW1lfWApfWZ1bmN0aW9uIGFkZEJvcnJvd2VkT2JqZWN0KG9iail7aWYoMT09c3RhY2tfcG9pbnRlcil0aHJvdyBuZXcgRXJyb3IoIm91dCBvZiBqcyBzdGFjayIpO3JldHVybiBoZWFwWy0tc3RhY2tfcG9pbnRlcl09b2JqLHN0YWNrX3BvaW50ZXJ9Y29uc3QgQ0xPU1VSRV9EVE9SUz0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShzdGF0ZT0+c3RhdGUuZHRvcihzdGF0ZS5hLHN0YXRlLmIpKTtmdW5jdGlvbiBkZWJ1Z1N0cmluZyh2YWwpe2NvbnN0IHR5cGU9dHlwZW9mIHZhbDtpZigibnVtYmVyIj09dHlwZXx8ImJvb2xlYW4iPT10eXBlfHxudWxsPT12YWwpcmV0dXJuYCR7dmFsfWA7aWYoInN0cmluZyI9PXR5cGUpcmV0dXJuYCIke3ZhbH0iYDtpZigic3ltYm9sIj09dHlwZSl7Y29uc3QgZGVzY3JpcHRpb249dmFsLmRlc2NyaXB0aW9uO3JldHVybiBudWxsPT1kZXNjcmlwdGlvbj8iU3ltYm9sIjpgU3ltYm9sKCR7ZGVzY3JpcHRpb259KWB9aWYoImZ1bmN0aW9uIj09dHlwZSl7Y29uc3QgbmFtZT12YWwubmFtZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG5hbWUmJm5hbWUubGVuZ3RoPjA/YEZ1bmN0aW9uKCR7bmFtZX0pYDoiRnVuY3Rpb24ifWlmKEFycmF5LmlzQXJyYXkodmFsKSl7Y29uc3QgbGVuZ3RoPXZhbC5sZW5ndGg7bGV0IGRlYnVnPSJbIjtsZW5ndGg+MCYmKGRlYnVnKz1kZWJ1Z1N0cmluZyh2YWxbMF0pKTtmb3IobGV0IGk9MTtpPGxlbmd0aDtpKyspZGVidWcrPSIsICIrZGVidWdTdHJpbmcodmFsW2ldKTtyZXR1cm4gZGVidWcrPSJdIixkZWJ1Z31jb25zdCBidWlsdEluTWF0Y2hlcz0vXFtvYmplY3QgKFteXF1dKylcXS8uZXhlYyh0b1N0cmluZy5jYWxsKHZhbCkpO2xldCBjbGFzc05hbWU7aWYoIShidWlsdEluTWF0Y2hlcyYmYnVpbHRJbk1hdGNoZXMubGVuZ3RoPjEpKXJldHVybiB0b1N0cmluZy5jYWxsKHZhbCk7aWYoY2xhc3NOYW1lPWJ1aWx0SW5NYXRjaGVzWzFdLCJPYmplY3QiPT1jbGFzc05hbWUpdHJ5e3JldHVybiJPYmplY3QoIitKU09OLnN0cmluZ2lmeSh2YWwpKyIpIn1jYXRjaChfKXtyZXR1cm4iT2JqZWN0In1yZXR1cm4gdmFsIGluc3RhbmNlb2YgRXJyb3I/YCR7dmFsLm5hbWV9OiAke3ZhbC5tZXNzYWdlfVxuJHt2YWwuc3RhY2t9YDpjbGFzc05hbWV9ZnVuY3Rpb24gZHJvcE9iamVjdChpZHgpe2lkeDwxMzJ8fChoZWFwW2lkeF09aGVhcF9uZXh0LGhlYXBfbmV4dD1pZHgpfWZ1bmN0aW9uIGdldEFycmF5SnNWYWx1ZUZyb21XYXNtMChwdHIsbGVuKXtwdHI+Pj49MDtjb25zdCBtZW09Z2V0RGF0YVZpZXdNZW1vcnkwKCkscmVzdWx0PVtdO2ZvcihsZXQgaT1wdHI7aTxwdHIrNCpsZW47aSs9NClyZXN1bHQucHVzaCh0YWtlT2JqZWN0KG1lbS5nZXRVaW50MzIoaSwhMCkpKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldEFycmF5VThGcm9tV2FzbTAocHRyLGxlbil7cmV0dXJuIHB0cj4+Pj0wLGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyLzEscHRyLzErbGVuKX1sZXQgY2FjaGVkRGF0YVZpZXdNZW1vcnkwPW51bGw7ZnVuY3Rpb24gZ2V0RGF0YVZpZXdNZW1vcnkwKCl7cmV0dXJuIG51bGwhPT1jYWNoZWREYXRhVmlld01lbW9yeTAmJmNhY2hlZERhdGFWaWV3TWVtb3J5MC5idWZmZXI9PT13YXNtLm1lbW9yeS5idWZmZXJ8fChjYWNoZWREYXRhVmlld01lbW9yeTA9bmV3IERhdGFWaWV3KHdhc20ubWVtb3J5LmJ1ZmZlcikpLGNhY2hlZERhdGFWaWV3TWVtb3J5MH1mdW5jdGlvbiBnZXRTdHJpbmdGcm9tV2FzbTAocHRyLGxlbil7cmV0dXJuIGRlY29kZVRleHQocHRyPj4+PTAsbGVuKX1sZXQgY2FjaGVkVWludDhBcnJheU1lbW9yeTA9bnVsbDtmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpe3JldHVybiBudWxsIT09Y2FjaGVkVWludDhBcnJheU1lbW9yeTAmJmNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwLmJ1ZmZlcj09PXdhc20ubWVtb3J5LmJ1ZmZlcnx8KGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwPW5ldyBVaW50OEFycmF5KHdhc20ubWVtb3J5LmJ1ZmZlcikpLGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwfWZ1bmN0aW9uIGdldE9iamVjdChpZHgpe3JldHVybiBoZWFwW2lkeF19ZnVuY3Rpb24gaGFuZGxlRXJyb3IoZixhcmdzKXt0cnl7cmV0dXJuIGYuYXBwbHkodGhpcyxhcmdzKX1jYXRjaChlKXt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MyhhZGRIZWFwT2JqZWN0KGUpKX19bGV0IGhlYXA9bmV3IEFycmF5KDEyOCkuZmlsbCh2b2lkIDApO2hlYXAucHVzaCh2b2lkIDAsbnVsbCwhMCwhMSk7bGV0IGhlYXBfbmV4dD1oZWFwLmxlbmd0aDtmdW5jdGlvbiBpc0xpa2VOb25lKHgpe3JldHVybiBudWxsPT14fWZ1bmN0aW9uIG1ha2VDbG9zdXJlKGFyZzAsYXJnMSxkdG9yLGYpe2NvbnN0IHN0YXRlPXthOmFyZzAsYjphcmcxLGNudDoxLGR0b3J9LHJlYWw9KC4uLmFyZ3MpPT57c3RhdGUuY250Kys7dHJ5e3JldHVybiBmKHN0YXRlLmEsc3RhdGUuYiwuLi5hcmdzKX1maW5hbGx5e3JlYWwuX3diZ19jYl91bnJlZigpfX07cmV0dXJuIHJlYWwuX3diZ19jYl91bnJlZj0oKT0+ezA9PT0tLXN0YXRlLmNudCYmKHN0YXRlLmR0b3Ioc3RhdGUuYSxzdGF0ZS5iKSxzdGF0ZS5hPTAsQ0xPU1VSRV9EVE9SUy51bnJlZ2lzdGVyKHN0YXRlKSl9LENMT1NVUkVfRFRPUlMucmVnaXN0ZXIocmVhbCxzdGF0ZSxzdGF0ZSkscmVhbH1mdW5jdGlvbiBtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsZHRvcixmKXtjb25zdCBzdGF0ZT17YTphcmcwLGI6YXJnMSxjbnQ6MSxkdG9yfSxyZWFsPSguLi5hcmdzKT0+e3N0YXRlLmNudCsrO2NvbnN0IGE9c3RhdGUuYTtzdGF0ZS5hPTA7dHJ5e3JldHVybiBmKGEsc3RhdGUuYiwuLi5hcmdzKX1maW5hbGx5e3N0YXRlLmE9YSxyZWFsLl93YmdfY2JfdW5yZWYoKX19O3JldHVybiByZWFsLl93YmdfY2JfdW5yZWY9KCk9PnswPT09LS1zdGF0ZS5jbnQmJihzdGF0ZS5kdG9yKHN0YXRlLmEsc3RhdGUuYiksc3RhdGUuYT0wLENMT1NVUkVfRFRPUlMudW5yZWdpc3RlcihzdGF0ZSkpfSxDTE9TVVJFX0RUT1JTLnJlZ2lzdGVyKHJlYWwsc3RhdGUsc3RhdGUpLHJlYWx9ZnVuY3Rpb24gcGFzc1N0cmluZ1RvV2FzbTAoYXJnLG1hbGxvYyxyZWFsbG9jKXtpZih2b2lkIDA9PT1yZWFsbG9jKXtjb25zdCBidWY9Y2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZykscHRyPW1hbGxvYyhidWYubGVuZ3RoLDEpPj4+MDtyZXR1cm4gZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIscHRyK2J1Zi5sZW5ndGgpLnNldChidWYpLFdBU01fVkVDVE9SX0xFTj1idWYubGVuZ3RoLHB0cn1sZXQgbGVuPWFyZy5sZW5ndGgscHRyPW1hbGxvYyhsZW4sMSk+Pj4wO2NvbnN0IG1lbT1nZXRVaW50OEFycmF5TWVtb3J5MCgpO2xldCBvZmZzZXQ9MDtmb3IoO29mZnNldDxsZW47b2Zmc2V0Kyspe2NvbnN0IGNvZGU9YXJnLmNoYXJDb2RlQXQob2Zmc2V0KTtpZihjb2RlPjEyNylicmVhazttZW1bcHRyK29mZnNldF09Y29kZX1pZihvZmZzZXQhPT1sZW4pezAhPT1vZmZzZXQmJihhcmc9YXJnLnNsaWNlKG9mZnNldCkpLHB0cj1yZWFsbG9jKHB0cixsZW4sbGVuPW9mZnNldCszKmFyZy5sZW5ndGgsMSk+Pj4wO2NvbnN0IHZpZXc9Z2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIrb2Zmc2V0LHB0citsZW4pO29mZnNldCs9Y2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlSW50byhhcmcsdmlldykud3JpdHRlbixwdHI9cmVhbGxvYyhwdHIsbGVuLG9mZnNldCwxKT4+PjB9cmV0dXJuIFdBU01fVkVDVE9SX0xFTj1vZmZzZXQscHRyfWxldCBzdGFja19wb2ludGVyPTEyODtmdW5jdGlvbiB0YWtlT2JqZWN0KGlkeCl7Y29uc3QgcmV0PWdldE9iamVjdChpZHgpO3JldHVybiBkcm9wT2JqZWN0KGlkeCkscmV0fWxldCBjYWNoZWRUZXh0RGVjb2Rlcj0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITAsZmF0YWw6ITB9KTp2b2lkIDA7Y2FjaGVkVGV4dERlY29kZXImJmNhY2hlZFRleHREZWNvZGVyLmRlY29kZSgpO2NvbnN0IE1BWF9TQUZBUklfREVDT0RFX0JZVEVTPTIxNDY0MzUwNzI7bGV0IG51bUJ5dGVzRGVjb2RlZD0wO2Z1bmN0aW9uIGRlY29kZVRleHQocHRyLGxlbil7cmV0dXJuIG51bUJ5dGVzRGVjb2RlZCs9bGVuLG51bUJ5dGVzRGVjb2RlZD49TUFYX1NBRkFSSV9ERUNPREVfQllURVMmJihjYWNoZWRUZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSksY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKCksbnVtQnl0ZXNEZWNvZGVkPWxlbiksY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc2xpY2UocHRyLHB0citsZW4pKX1jb25zdCBjYWNoZWRUZXh0RW5jb2Rlcj0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHRFbmNvZGVyP25ldyBUZXh0RW5jb2Rlcjp2b2lkIDA7Y2FjaGVkVGV4dEVuY29kZXImJihjYWNoZWRUZXh0RW5jb2Rlci5lbmNvZGVJbnRvPWZ1bmN0aW9uKGFyZyx2aWV3KXtjb25zdCBidWY9Y2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZyk7cmV0dXJuIHZpZXcuc2V0KGJ1Zikse3JlYWQ6YXJnLmxlbmd0aCx3cml0dGVuOmJ1Zi5sZW5ndGh9fSk7bGV0IFdBU01fVkVDVE9SX0xFTj0wLHdhc21Nb2R1bGUsd2FzbTtmdW5jdGlvbiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLG1vZHVsZSx0aHJlYWRfc3RhY2tfc2l6ZSl7aWYod2FzbT1pbnN0YW5jZS5leHBvcnRzLHdhc21Nb2R1bGU9bW9kdWxlLGNhY2hlZERhdGFWaWV3TWVtb3J5MD1udWxsLGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwPW51bGwsdm9pZCAwIT09dGhyZWFkX3N0YWNrX3NpemUmJigibnVtYmVyIiE9dHlwZW9mIHRocmVhZF9zdGFja19zaXplfHwwPT09dGhyZWFkX3N0YWNrX3NpemV8fHRocmVhZF9zdGFja19zaXplJTY1NTM2IT0wKSl0aHJvdyJpbnZhbGlkIHN0YWNrIHNpemUiO3JldHVybiB3YXNtLl9fd2JpbmRnZW5fc3RhcnQodGhyZWFkX3N0YWNrX3NpemUpLHdhc219YXN5bmMgZnVuY3Rpb24gX193YmdfbG9hZChtb2R1bGUsaW1wb3J0cyl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFJlc3BvbnNlJiZtb2R1bGUgaW5zdGFuY2VvZiBSZXNwb25zZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKXRyeXtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobW9kdWxlLGltcG9ydHMpfWNhdGNoKGUpe2lmKCEobW9kdWxlLm9rJiZmdW5jdGlvbiBleHBlY3RlZFJlc3BvbnNlVHlwZSh0eXBlKXtzd2l0Y2godHlwZSl7Y2FzZSJiYXNpYyI6Y2FzZSJjb3JzIjpjYXNlImRlZmF1bHQiOnJldHVybiEwfXJldHVybiExfShtb2R1bGUudHlwZSkpfHwiYXBwbGljYXRpb24vd2FzbSI9PT1tb2R1bGUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpKXRocm93IGU7Y29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIixlKX1jb25zdCBieXRlcz1hd2FpdCBtb2R1bGUuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYnl0ZXMsaW1wb3J0cyl9e2NvbnN0IGluc3RhbmNlPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG1vZHVsZSxpbXBvcnRzKTtyZXR1cm4gaW5zdGFuY2UgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5JbnN0YW5jZT97aW5zdGFuY2UsbW9kdWxlfTppbnN0YW5jZX19ZnVuY3Rpb24gaW5pdFN5bmMobW9kdWxlLG1lbW9yeSl7aWYodm9pZCAwIT09d2FzbSlyZXR1cm4gd2FzbTtsZXQgdGhyZWFkX3N0YWNrX3NpemU7dm9pZCAwIT09bW9kdWxlJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZHVsZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlLG1lbW9yeSx0aHJlYWRfc3RhY2tfc2l6ZX09bW9kdWxlKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgYGluaXRTeW5jKClgOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpO2NvbnN0IGltcG9ydHM9X193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KTttb2R1bGUgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5Nb2R1bGV8fChtb2R1bGU9bmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShtb2R1bGUpKTtyZXR1cm4gX193YmdfZmluYWxpemVfaW5pdChuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobW9kdWxlLGltcG9ydHMpLG1vZHVsZSx0aHJlYWRfc3RhY2tfc2l6ZSl9YXN5bmMgZnVuY3Rpb24gX193YmdfaW5pdChtb2R1bGVfb3JfcGF0aCxtZW1vcnkpe2lmKHZvaWQgMCE9PXdhc20pcmV0dXJuIHdhc207bGV0IHRocmVhZF9zdGFja19zaXplO3ZvaWQgMCE9PW1vZHVsZV9vcl9wYXRoJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZHVsZV9vcl9wYXRoKT09PU9iamVjdC5wcm90b3R5cGU/KHttb2R1bGVfb3JfcGF0aCxtZW1vcnksdGhyZWFkX3N0YWNrX3NpemV9PW1vZHVsZV9vcl9wYXRoKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpLHZvaWQgMD09PW1vZHVsZV9vcl9wYXRoJiYobW9kdWxlX29yX3BhdGg9bmV3IFVSTChfX3dlYnBhY2tfcmVxdWlyZV9fKCIuL3NyYy91dG9vL2luZGV4X2JnLndhc20iKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmIpKTtjb25zdCBpbXBvcnRzPV9fd2JnX2dldF9pbXBvcnRzKG1lbW9yeSk7KCJzdHJpbmciPT10eXBlb2YgbW9kdWxlX29yX3BhdGh8fCJmdW5jdGlvbiI9PXR5cGVvZiBSZXF1ZXN0JiZtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFJlcXVlc3R8fCJmdW5jdGlvbiI9PXR5cGVvZiBVUkwmJm1vZHVsZV9vcl9wYXRoIGluc3RhbmNlb2YgVVJMKSYmKG1vZHVsZV9vcl9wYXRoPWZldGNoKG1vZHVsZV9vcl9wYXRoKSk7Y29uc3R7aW5zdGFuY2UsbW9kdWxlfT1hd2FpdCBfX3diZ19sb2FkKGF3YWl0IG1vZHVsZV9vcl9wYXRoLGltcG9ydHMpO3JldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLG1vZHVsZSx0aHJlYWRfc3RhY2tfc2l6ZSl9fSwiLi9zcmMvdXRvby9pbmRleF9iZy53YXNtIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fLnArIjhkYTY1OGE5Nzg3MjkzZDY2OTVhLndhc20ifX0sX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpe3ZhciBjYWNoZWRNb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtpZih2b2lkIDAhPT1jYWNoZWRNb2R1bGUpcmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO3ZhciBtb2R1bGU9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXT17ZXhwb3J0czp7fX07cmV0dXJuIF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSxtb2R1bGUuZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKSxtb2R1bGUuZXhwb3J0c31fX3dlYnBhY2tfcmVxdWlyZV9fLm09X193ZWJwYWNrX21vZHVsZXNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fLm49bW9kdWxlPT57dmFyIGdldHRlcj1tb2R1bGUmJm1vZHVsZS5fX2VzTW9kdWxlPygpPT5tb2R1bGUuZGVmYXVsdDooKT0+bW9kdWxlO3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLHthOmdldHRlcn0pLGdldHRlcn0sX193ZWJwYWNrX3JlcXVpcmVfXy5kPShleHBvcnRzLGRlZmluaXRpb24pPT57Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbilfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbixrZXkpJiYhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsa2V5KSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsa2V5LHtlbnVtZXJhYmxlOiEwLGdldDpkZWZpbml0aW9uW2tleV19KX0sX193ZWJwYWNrX3JlcXVpcmVfXy5nPWZ1bmN0aW9uKCl7aWYoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO3RyeXtyZXR1cm4gdGhpc3x8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7aWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuIHdpbmRvd319KCksX193ZWJwYWNrX3JlcXVpcmVfXy5vPShvYmoscHJvcCk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmoscHJvcCksKCgpPT57dmFyIHNjcmlwdFVybDtfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cyYmKHNjcmlwdFVybD1fX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24rIiIpO3ZhciBkb2N1bWVudD1fX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7aWYoIXNjcmlwdFVybCYmZG9jdW1lbnQmJihkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYiU0NSSVBUIj09PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpJiYoc2NyaXB0VXJsPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSwhc2NyaXB0VXJsKSl7dmFyIHNjcmlwdHM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2lmKHNjcmlwdHMubGVuZ3RoKWZvcih2YXIgaT1zY3JpcHRzLmxlbmd0aC0xO2k+LTEmJighc2NyaXB0VXJsfHwhL15odHRwKHM/KTovLnRlc3Qoc2NyaXB0VXJsKSk7KXNjcmlwdFVybD1zY3JpcHRzW2ktLV0uc3JjfWlmKCFzY3JpcHRVcmwpdGhyb3cgbmV3IEVycm9yKCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciIpO3NjcmlwdFVybD1zY3JpcHRVcmwucmVwbGFjZSgvXmJsb2I6LywiIikucmVwbGFjZSgvIy4qJC8sIiIpLnJlcGxhY2UoL1w/LiokLywiIikucmVwbGFjZSgvXC9bXlwvXSskLywiLyIpLF9fd2VicGFja19yZXF1aXJlX18ucD1zY3JpcHRVcmx9KSgpLF9fd2VicGFja19yZXF1aXJlX18uYj1zZWxmLmxvY2F0aW9uKyIiO3ZhciBfX3dlYnBhY2tfZXhwb3J0c19fPXt9O3JldHVybigoKT0+eyJ1c2Ugc3RyaWN0Ijtjb25zdCBwcm94eU1hcmtlcj1TeW1ib2woIkNvbWxpbmsucHJveHkiKSxjcmVhdGVFbmRwb2ludD1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxyZWxlYXNlUHJveHk9U3ltYm9sKCJDb21saW5rLnJlbGVhc2VQcm94eSIpLGZpbmFsaXplcj1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksdGhyb3dNYXJrZXI9U3ltYm9sKCJDb21saW5rLnRocm93biIpLGlzT2JqZWN0PXZhbD0+Im9iamVjdCI9PXR5cGVvZiB2YWwmJm51bGwhPT12YWx8fCJmdW5jdGlvbiI9PXR5cGVvZiB2YWwscHJveHlUcmFuc2ZlckhhbmRsZXI9e2NhbkhhbmRsZTp2YWw9PmlzT2JqZWN0KHZhbCkmJnZhbFtwcm94eU1hcmtlcl0sc2VyaWFsaXplKG9iail7Y29uc3R7cG9ydDEscG9ydDJ9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gZXhwb3NlKG9iaixwb3J0MSksW3BvcnQyLFtwb3J0Ml1dfSxkZXNlcmlhbGl6ZTpwb3J0PT4ocG9ydC5zdGFydCgpLGZ1bmN0aW9uIHdyYXAoZXAsdGFyZ2V0KXtjb25zdCBwZW5kaW5nTGlzdGVuZXJzPW5ldyBNYXA7cmV0dXJuIGVwLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UoZXYpe2NvbnN0e2RhdGF9PWV2O2lmKCFkYXRhfHwhZGF0YS5pZClyZXR1cm47Y29uc3QgcmVzb2x2ZXI9cGVuZGluZ0xpc3RlbmVycy5nZXQoZGF0YS5pZCk7aWYocmVzb2x2ZXIpdHJ5e3Jlc29sdmVyKGRhdGEpfWZpbmFsbHl7cGVuZGluZ0xpc3RlbmVycy5kZWxldGUoZGF0YS5pZCl9fSksY3JlYXRlUHJveHkoZXAscGVuZGluZ0xpc3RlbmVycyxbXSx0YXJnZXQpfShwb3J0KSl9LHRyYW5zZmVySGFuZGxlcnM9bmV3IE1hcChbWyJwcm94eSIscHJveHlUcmFuc2ZlckhhbmRsZXJdLFsidGhyb3ciLHtjYW5IYW5kbGU6dmFsdWU9PmlzT2JqZWN0KHZhbHVlKSYmdGhyb3dNYXJrZXIgaW4gdmFsdWUsc2VyaWFsaXplKHt2YWx1ZX0pe2xldCBzZXJpYWxpemVkO3JldHVybiBzZXJpYWxpemVkPXZhbHVlIGluc3RhbmNlb2YgRXJyb3I/e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dmFsdWUubWVzc2FnZSxuYW1lOnZhbHVlLm5hbWUsc3RhY2s6dmFsdWUuc3RhY2t9fTp7aXNFcnJvcjohMSx2YWx1ZX0sW3NlcmlhbGl6ZWQsW11dfSxkZXNlcmlhbGl6ZShzZXJpYWxpemVkKXtpZihzZXJpYWxpemVkLmlzRXJyb3IpdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3Ioc2VyaWFsaXplZC52YWx1ZS5tZXNzYWdlKSxzZXJpYWxpemVkLnZhbHVlKTt0aHJvdyBzZXJpYWxpemVkLnZhbHVlfX1dXSk7ZnVuY3Rpb24gZXhwb3NlKG9iaixlcD1nbG9iYWxUaGlzLGFsbG93ZWRPcmlnaW5zPVsiKiJdKXtlcC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBjYWxsYmFjayhldil7aWYoIWV2fHwhZXYuZGF0YSlyZXR1cm47aWYoIWZ1bmN0aW9uIGlzQWxsb3dlZE9yaWdpbihhbGxvd2VkT3JpZ2lucyxvcmlnaW4pe2Zvcihjb25zdCBhbGxvd2VkT3JpZ2luIG9mIGFsbG93ZWRPcmlnaW5zKXtpZihvcmlnaW49PT1hbGxvd2VkT3JpZ2lufHwiKiI9PT1hbGxvd2VkT3JpZ2luKXJldHVybiEwO2lmKGFsbG93ZWRPcmlnaW4gaW5zdGFuY2VvZiBSZWdFeHAmJmFsbG93ZWRPcmlnaW4udGVzdChvcmlnaW4pKXJldHVybiEwfXJldHVybiExfShhbGxvd2VkT3JpZ2lucyxldi5vcmlnaW4pKXJldHVybiB2b2lkIGNvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gJyR7ZXYub3JpZ2lufScgZm9yIGNvbWxpbmsgcHJveHlgKTtjb25zdHtpZCx0eXBlLHBhdGh9PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LGV2LmRhdGEpLGFyZ3VtZW50TGlzdD0oZXYuZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoZnJvbVdpcmVWYWx1ZSk7bGV0IHJldHVyblZhbHVlO3RyeXtjb25zdCBwYXJlbnQ9cGF0aC5zbGljZSgwLC0xKS5yZWR1Y2UoKG9iaixwcm9wKT0+b2JqW3Byb3BdLG9iaikscmF3VmFsdWU9cGF0aC5yZWR1Y2UoKG9iaixwcm9wKT0+b2JqW3Byb3BdLG9iaik7c3dpdGNoKHR5cGUpe2Nhc2UiR0VUIjpyZXR1cm5WYWx1ZT1yYXdWYWx1ZTticmVhaztjYXNlIlNFVCI6cGFyZW50W3BhdGguc2xpY2UoLTEpWzBdXT1mcm9tV2lyZVZhbHVlKGV2LmRhdGEudmFsdWUpLHJldHVyblZhbHVlPSEwO2JyZWFrO2Nhc2UiQVBQTFkiOnJldHVyblZhbHVlPXJhd1ZhbHVlLmFwcGx5KHBhcmVudCxhcmd1bWVudExpc3QpO2JyZWFrO2Nhc2UiQ09OU1RSVUNUIjpyZXR1cm5WYWx1ZT1mdW5jdGlvbiBwcm94eShvYmope3JldHVybiBPYmplY3QuYXNzaWduKG9iaix7W3Byb3h5TWFya2VyXTohMH0pfShuZXcgcmF3VmFsdWUoLi4uYXJndW1lbnRMaXN0KSk7YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxLHBvcnQyfT1uZXcgTWVzc2FnZUNoYW5uZWw7ZXhwb3NlKG9iaixwb3J0MikscmV0dXJuVmFsdWU9ZnVuY3Rpb24gdHJhbnNmZXIob2JqLHRyYW5zZmVycyl7cmV0dXJuIHRyYW5zZmVyQ2FjaGUuc2V0KG9iaix0cmFuc2ZlcnMpLG9ian0ocG9ydDEsW3BvcnQxXSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjpyZXR1cm5WYWx1ZT12b2lkIDA7YnJlYWs7ZGVmYXVsdDpyZXR1cm59fWNhdGNoKHZhbHVlKXtyZXR1cm5WYWx1ZT17dmFsdWUsW3Rocm93TWFya2VyXTowfX1Qcm9taXNlLnJlc29sdmUocmV0dXJuVmFsdWUpLmNhdGNoKHZhbHVlPT4oe3ZhbHVlLFt0aHJvd01hcmtlcl06MH0pKS50aGVuKHJldHVyblZhbHVlPT57Y29uc3Rbd2lyZVZhbHVlLHRyYW5zZmVyYWJsZXNdPXRvV2lyZVZhbHVlKHJldHVyblZhbHVlKTtlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sd2lyZVZhbHVlKSx7aWR9KSx0cmFuc2ZlcmFibGVzKSwiUkVMRUFTRSI9PT10eXBlJiYoZXAucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsY2FsbGJhY2spLGNsb3NlRW5kUG9pbnQoZXApLGZpbmFsaXplciBpbiBvYmomJiJmdW5jdGlvbiI9PXR5cGVvZiBvYmpbZmluYWxpemVyXSYmb2JqW2ZpbmFsaXplcl0oKSl9KS5jYXRjaChlcnJvcj0+e2NvbnN0W3dpcmVWYWx1ZSx0cmFuc2ZlcmFibGVzXT10b1dpcmVWYWx1ZSh7dmFsdWU6bmV3IFR5cGVFcnJvcigiVW5zZXJpYWxpemFibGUgcmV0dXJuIHZhbHVlIiksW3Rocm93TWFya2VyXTowfSk7ZXAucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHdpcmVWYWx1ZSkse2lkfSksdHJhbnNmZXJhYmxlcyl9KX0pLGVwLnN0YXJ0JiZlcC5zdGFydCgpfWZ1bmN0aW9uIGNsb3NlRW5kUG9pbnQoZW5kcG9pbnQpeyhmdW5jdGlvbiBpc01lc3NhZ2VQb3J0KGVuZHBvaW50KXtyZXR1cm4iTWVzc2FnZVBvcnQiPT09ZW5kcG9pbnQuY29uc3RydWN0b3IubmFtZX0pKGVuZHBvaW50KSYmZW5kcG9pbnQuY2xvc2UoKX1mdW5jdGlvbiB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1JlbGVhc2VkKXtpZihpc1JlbGVhc2VkKXRocm93IG5ldyBFcnJvcigiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlIil9ZnVuY3Rpb24gcmVsZWFzZUVuZHBvaW50KGVwKXtyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxuZXcgTWFwLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntjbG9zZUVuZFBvaW50KGVwKX0pfWNvbnN0IHByb3h5Q291bnRlcj1uZXcgV2Vha01hcCxwcm94eUZpbmFsaXplcnM9IkZpbmFsaXphdGlvblJlZ2lzdHJ5ImluIGdsb2JhbFRoaXMmJm5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShlcD0+e2NvbnN0IG5ld0NvdW50PShwcm94eUNvdW50ZXIuZ2V0KGVwKXx8MCktMTtwcm94eUNvdW50ZXIuc2V0KGVwLG5ld0NvdW50KSwwPT09bmV3Q291bnQmJnJlbGVhc2VFbmRwb2ludChlcCl9KTtmdW5jdGlvbiBjcmVhdGVQcm94eShlcCxwZW5kaW5nTGlzdGVuZXJzLHBhdGg9W10sdGFyZ2V0PWZ1bmN0aW9uKCl7fSl7bGV0IGlzUHJveHlSZWxlYXNlZD0hMTtjb25zdCBwcm94eT1uZXcgUHJveHkodGFyZ2V0LHtnZXQoX3RhcmdldCxwcm9wKXtpZih0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpLHByb3A9PT1yZWxlYXNlUHJveHkpcmV0dXJuKCk9PnshZnVuY3Rpb24gdW5yZWdpc3RlclByb3h5KHByb3h5KXtwcm94eUZpbmFsaXplcnMmJnByb3h5RmluYWxpemVycy51bnJlZ2lzdGVyKHByb3h5KX0ocHJveHkpLHJlbGVhc2VFbmRwb2ludChlcCkscGVuZGluZ0xpc3RlbmVycy5jbGVhcigpLGlzUHJveHlSZWxlYXNlZD0hMH07aWYoInRoZW4iPT09cHJvcCl7aWYoMD09PXBhdGgubGVuZ3RoKXJldHVybnt0aGVuOigpPT5wcm94eX07Y29uc3Qgcj1yZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLHBlbmRpbmdMaXN0ZW5lcnMse3R5cGU6IkdFVCIscGF0aDpwYXRoLm1hcChwPT5wLnRvU3RyaW5nKCkpfSkudGhlbihmcm9tV2lyZVZhbHVlKTtyZXR1cm4gci50aGVuLmJpbmQocil9cmV0dXJuIGNyZWF0ZVByb3h5KGVwLHBlbmRpbmdMaXN0ZW5lcnMsWy4uLnBhdGgscHJvcF0pfSxzZXQoX3RhcmdldCxwcm9wLHJhd1ZhbHVlKXt0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpO2NvbnN0W3ZhbHVlLHRyYW5zZmVyYWJsZXNdPXRvV2lyZVZhbHVlKHJhd1ZhbHVlKTtyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLHt0eXBlOiJTRVQiLHBhdGg6Wy4uLnBhdGgscHJvcF0ubWFwKHA9PnAudG9TdHJpbmcoKSksdmFsdWV9LHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSl9LGFwcGx5KF90YXJnZXQsX3RoaXNBcmcscmF3QXJndW1lbnRMaXN0KXt0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpO2NvbnN0IGxhc3Q9cGF0aFtwYXRoLmxlbmd0aC0xXTtpZihsYXN0PT09Y3JlYXRlRW5kcG9pbnQpcmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyx7dHlwZToiRU5EUE9JTlQifSkudGhlbihmcm9tV2lyZVZhbHVlKTtpZigiYmluZCI9PT1sYXN0KXJldHVybiBjcmVhdGVQcm94eShlcCxwZW5kaW5nTGlzdGVuZXJzLHBhdGguc2xpY2UoMCwtMSkpO2NvbnN0W2FyZ3VtZW50TGlzdCx0cmFuc2ZlcmFibGVzXT1wcm9jZXNzQXJndW1lbnRzKHJhd0FyZ3VtZW50TGlzdCk7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAscGVuZGluZ0xpc3RlbmVycyx7dHlwZToiQVBQTFkiLHBhdGg6cGF0aC5tYXAocD0+cC50b1N0cmluZygpKSxhcmd1bWVudExpc3R9LHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSl9LGNvbnN0cnVjdChfdGFyZ2V0LHJhd0FyZ3VtZW50TGlzdCl7dGhyb3dJZlByb3h5UmVsZWFzZWQoaXNQcm94eVJlbGVhc2VkKTtjb25zdFthcmd1bWVudExpc3QsdHJhbnNmZXJhYmxlc109cHJvY2Vzc0FyZ3VtZW50cyhyYXdBcmd1bWVudExpc3QpO3JldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLHBlbmRpbmdMaXN0ZW5lcnMse3R5cGU6IkNPTlNUUlVDVCIscGF0aDpwYXRoLm1hcChwPT5wLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdH0sdHJhbnNmZXJhYmxlcykudGhlbihmcm9tV2lyZVZhbHVlKX19KTtyZXR1cm4gZnVuY3Rpb24gcmVnaXN0ZXJQcm94eShwcm94eSxlcCl7Y29uc3QgbmV3Q291bnQ9KHByb3h5Q291bnRlci5nZXQoZXApfHwwKSsxO3Byb3h5Q291bnRlci5zZXQoZXAsbmV3Q291bnQpLHByb3h5RmluYWxpemVycyYmcHJveHlGaW5hbGl6ZXJzLnJlZ2lzdGVyKHByb3h5LGVwLHByb3h5KX0ocHJveHksZXApLHByb3h5fWZ1bmN0aW9uIHByb2Nlc3NBcmd1bWVudHMoYXJndW1lbnRMaXN0KXtjb25zdCBwcm9jZXNzZWQ9YXJndW1lbnRMaXN0Lm1hcCh0b1dpcmVWYWx1ZSk7cmV0dXJuW3Byb2Nlc3NlZC5tYXAodj0+dlswXSksKGFycj1wcm9jZXNzZWQubWFwKHY9PnZbMV0pLEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sYXJyKSldO3ZhciBhcnJ9Y29uc3QgdHJhbnNmZXJDYWNoZT1uZXcgV2Vha01hcDtmdW5jdGlvbiB0b1dpcmVWYWx1ZSh2YWx1ZSl7Zm9yKGNvbnN0W25hbWUsaGFuZGxlcl1vZiB0cmFuc2ZlckhhbmRsZXJzKWlmKGhhbmRsZXIuY2FuSGFuZGxlKHZhbHVlKSl7Y29uc3Rbc2VyaWFsaXplZFZhbHVlLHRyYW5zZmVyYWJsZXNdPWhhbmRsZXIuc2VyaWFsaXplKHZhbHVlKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWUsdmFsdWU6c2VyaWFsaXplZFZhbHVlfSx0cmFuc2ZlcmFibGVzXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWV9LHRyYW5zZmVyQ2FjaGUuZ2V0KHZhbHVlKXx8W11dfWZ1bmN0aW9uIGZyb21XaXJlVmFsdWUodmFsdWUpe3N3aXRjaCh2YWx1ZS50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiB0cmFuc2ZlckhhbmRsZXJzLmdldCh2YWx1ZS5uYW1lKS5kZXNlcmlhbGl6ZSh2YWx1ZS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiB2YWx1ZS52YWx1ZX19ZnVuY3Rpb24gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCxwZW5kaW5nTGlzdGVuZXJzLG1zZyx0cmFuc2ZlcnMpe3JldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlPT57Y29uc3QgaWQ9ZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX0oKTtwZW5kaW5nTGlzdGVuZXJzLnNldChpZCxyZXNvbHZlKSxlcC5zdGFydCYmZXAuc3RhcnQoKSxlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZH0sbXNnKSx0cmFuc2ZlcnMpfSl9dmFyIFdvcmtlck1lc3NhZ2VUeXBlOyFmdW5jdGlvbihXb3JrZXJNZXNzYWdlVHlwZSl7V29ya2VyTWVzc2FnZVR5cGVbV29ya2VyTWVzc2FnZVR5cGUuSW5pdENvbm5lY3Rpb249MTQ2NDY2NDA2NF09IkluaXRDb25uZWN0aW9uIixXb3JrZXJNZXNzYWdlVHlwZVtXb3JrZXJNZXNzYWdlVHlwZS5SZXF1ZXN0Rm9yaz0xNDY0NjY0MDY1XT0iUmVxdWVzdEZvcmsifShXb3JrZXJNZXNzYWdlVHlwZXx8KFdvcmtlck1lc3NhZ2VUeXBlPXt9KSk7V29ya2VyTWVzc2FnZVR5cGUuSW5pdENvbm5lY3Rpb24sV29ya2VyTWVzc2FnZVR5cGUuUmVxdWVzdEZvcms7dmFyIFNXTWVzc2FnZVR5cGU7IWZ1bmN0aW9uKFNXTWVzc2FnZVR5cGUpe1NXTWVzc2FnZVR5cGVbU1dNZXNzYWdlVHlwZS5IYW5kU2hha2U9MTM5ODIxMDU2MF09IkhhbmRTaGFrZSIsU1dNZXNzYWdlVHlwZVtTV01lc3NhZ2VUeXBlLkhlYXJ0YmVhdFBpbmc9MTM5ODIxMDU2MV09IkhlYXJ0YmVhdFBpbmciLFNXTWVzc2FnZVR5cGVbU1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQb25nPTEzOTgyMTA1NjJdPSJIZWFydGJlYXRQb25nIn0oU1dNZXNzYWdlVHlwZXx8KFNXTWVzc2FnZVR5cGU9e30pKTtTV01lc3NhZ2VUeXBlLkhhbmRTaGFrZSxTV01lc3NhZ2VUeXBlLkhlYXJ0YmVhdFBpbmcsU1dNZXNzYWdlVHlwZS5IZWFydGJlYXRQb25nO3ZhciB1dG9vPV9fd2VicGFja19yZXF1aXJlX18oIi4vc3JjL3V0b28vaW5kZXguanMiKTtsZXQgbmV4dFdvcmtlcklkPTA7Y29uc3QgbG9hZGVyV29ya2Vycz17fSxydW5Mb2FkZXJXb3JrZXJQb29sPWFzeW5jKHByb2plY3RDd2QsbG9hZGVyV29ya2VyVXJsLGxvYWRlcnNJbXBvcnRNYXApPT57KDAsdXRvby5uMikoYXN5bmMgY3JlYXRpb249Pntjb25zdHtvcHRpb25zOntmaWxlbmFtZSxjd2R9fT1jcmVhdGlvbjtuZXh0V29ya2VySWQrPTE7Y29uc3Qgd29ya2VySWQ9bmV4dFdvcmtlcklkLHdvcmtlcj1sb2FkZXJXb3JrZXJVcmwuc3RhcnRzV2l0aCgiZGF0YToiKT9mdW5jdGlvbiBjcmVhdGVXb3JrZXJGcm9tRGF0YVVyaShkYXRhVXJpLG9wdGlvbnMpe2NvbnN0IGlkeD1kYXRhVXJpLmluZGV4T2YoIjtiYXNlNjQsIik7aWYoLTE9PT1pZHgpcmV0dXJuIG5ldyBXb3JrZXIoZGF0YVVyaSxvcHRpb25zKTtjb25zdCBiYXNlNjQ9ZGF0YVVyaS5zbGljZShpZHgrOCksY29kZT1hdG9iKGJhc2U2NCksYmxvYj1uZXcgQmxvYihbY29kZV0se3R5cGU6ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQifSk7cmV0dXJuIG5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSxvcHRpb25zKX0obG9hZGVyV29ya2VyVXJsLHtuYW1lOmZpbGVuYW1lfSk6bmV3IFdvcmtlcihsb2FkZXJXb3JrZXJVcmwse25hbWU6ZmlsZW5hbWV9KTtsZXQgZmluYWxDd2Q9Y3dkLGZpbmFsRmlsZW5hbWU9ZmlsZW5hbWU7aWYocHJvamVjdEN3ZCl7Y29uc3Qgc2VwPSIvIjtsZXQgcEN3ZD1wcm9qZWN0Q3dkLmVuZHNXaXRoKHNlcCk/cHJvamVjdEN3ZC5zbGljZSgwLC0xKTpwcm9qZWN0Q3dkO2lmKHBDd2Quc3RhcnRzV2l0aChzZXApfHwocEN3ZD1zZXArcEN3ZCksY3dkLnN0YXJ0c1dpdGgoc2VwKSlmaW5hbEN3ZD1jd2Q7ZWxzZXtsZXQgY0N3ZD1jd2Q7Ii4iIT09Y0N3ZCYmIi4vIiE9PWNDd2R8fChjQ3dkPSIiKSxmaW5hbEN3ZD1jQ3dkP2Ake3BDd2R9JHtzZXB9JHtjQ3dkfWA6cEN3ZH1pZihmaWxlbmFtZS5zdGFydHNXaXRoKHNlcCkpZmluYWxGaWxlbmFtZT1maWxlbmFtZTtlbHNle2xldCBmTmFtZT1maWxlbmFtZTtmTmFtZS5zdGFydHNXaXRoKCIuLyIpJiYoZk5hbWU9Zk5hbWUuc2xpY2UoMikpLGZpbmFsRmlsZW5hbWU9YCR7cEN3ZH0ke3NlcH0ke2ZOYW1lfWB9fXdvcmtlci5wb3N0TWVzc2FnZShbKDAsdXRvby5MbykoKSwoMCx1dG9vLk1oKSgpLHt3b3JrZXJEYXRhOntjd2Q6ZmluYWxDd2QscHJvamVjdFJvb3Q6cHJvamVjdEN3ZCx0aHJlYWRJZDp3b3JrZXJJZH0sbG9hZGVyQXNzZXRzOntpbXBvcnRNYXBzOm51bGwhPWxvYWRlcnNJbXBvcnRNYXA/bG9hZGVyc0ltcG9ydE1hcDp7fSxlbnRyeXBvaW50OmZpbmFsRmlsZW5hbWV9fV0pOyhsb2FkZXJXb3JrZXJzW2ZpbGVuYW1lXXx8KGxvYWRlcldvcmtlcnNbZmlsZW5hbWVdPW5ldyBNYXApKS5zZXQod29ya2VySWQsd29ya2VyKX0sdGVybWluYXRpb249Pntjb25zdHt3b3JrZXJJZCxvcHRpb25zfT10ZXJtaW5hdGlvbixlbnRyeXBvaW50PW9wdGlvbnMuZmlsZW5hbWUsd29ya2Vycz1sb2FkZXJXb3JrZXJzW2VudHJ5cG9pbnRdO2lmKHdvcmtlcnMpe2NvbnN0IHdvcmtlcj13b3JrZXJzLmdldCh3b3JrZXJJZCk7d29ya2VyJiYod29ya2VyLnRlcm1pbmF0ZSgpLHdvcmtlcnMuZGVsZXRlKHdvcmtlcklkKSl9fSl9O2NvbnN0IGludGVybmFsRW5kcG9pbnQ9bmV3IGNsYXNzIEludGVybmFsRW5kcG9pbnR7Y29uc3RydWN0b3IoKXt0aGlzLmxvYWRlcldvcmtlclBvb2xJbml0aWFsaXplZD0hMSx0aGlzLmhtclJvb3RUYXNrcz1uZXcgTWFwfWFzeW5jIG1vdW50KG9wdCl7dmFyIF9hO3RoaXMub3B0aW9ucz1vcHQ7Y29uc3R7Y3dkLHdhc21VcmwsdGhyZWFkV29ya2VyVXJsLGxvZ0ZpbHRlcn09b3B0O251bGwhPT0oX2E9dGhpcy53YXNtSW5pdCkmJnZvaWQgMCE9PV9hfHwodGhpcy53YXNtSW5pdD0oMCx1dG9vLkF5KSh3YXNtVXJsKSksYXdhaXQgdGhpcy53YXNtSW5pdDtjb25zdCBmaWx0ZXI9bG9nRmlsdGVyfHwicGFja19jb3JlPWluZm8scGFja19hcGk9aW5mbyx1dG9vX3dhc209aW5mbyx1dG9vX3J1Ym9yaXN0PWluZm8iOygwLHV0b28uekQpKGZpbHRlcik7Y29uc3QgYWJzb2x1dGVDd2Q9Y3dkLnN0YXJ0c1dpdGgoIi8iKT9jd2Q6Ii8iK2N3ZDt1dG9vLk1NLmluaXQodGhyZWFkV29ya2VyVXJsfHwiIiksdXRvby5NTS5zZXRDd2QoYWJzb2x1dGVDd2QpfWFzeW5jIGRlcHMob3B0aW9ucyl7dmFyIF9hLF9iO2F3YWl0IHRoaXMud2FzbUluaXQ7Y29uc3QgcmVnaXN0cnk9bnVsbCE9PShfYT1udWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLnJlZ2lzdHJ5KSYmdm9pZCAwIT09X2E/X2E6dm9pZCAwLGNvbmN1cnJlbmN5PW51bGwhPT0oX2I9bnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5jb25jdXJyZW5jeSkmJnZvaWQgMCE9PV9iP19iOnZvaWQgMDtyZXR1cm4gYXdhaXQgdXRvby5NTS5kZXBzKHJlZ2lzdHJ5LGNvbmN1cnJlbmN5KX1hc3luYyBpbnN0YWxsKHBhY2thZ2VMb2NrLG9wdGlvbnMpe3ZhciBfYTthd2FpdCB0aGlzLndhc21Jbml0O2NvbnN0IGNvbmN1cnJlbmN5PW51bGwhPT0oX2E9bnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5tYXhDb25jdXJyZW50RG93bmxvYWRzKSYmdm9pZCAwIT09X2E/X2E6dm9pZCAwO2F3YWl0IHV0b28uTU0uaW5zdGFsbChwYWNrYWdlTG9jayxjb25jdXJyZW5jeSl9YXN5bmMgYnVpbGQob3B0aW9ucyl7dmFyIF9hLF9iLF9jO2F3YWl0IHRoaXMud2FzbUluaXQsKG51bGw9PT0oX2E9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09X2E/dm9pZCAwOl9hLmxvYWRlcldvcmtlclVybCkmJiF0aGlzLmxvYWRlcldvcmtlclBvb2xJbml0aWFsaXplZCYmKHJ1bkxvYWRlcldvcmtlclBvb2wodGhpcy5vcHRpb25zLmN3ZCx0aGlzLm9wdGlvbnMubG9hZGVyV29ya2VyVXJsLG51bGw9PT0oX2I9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09X2I/dm9pZCAwOl9iLmxvYWRlcnNJbXBvcnRNYXApLHRoaXMubG9hZGVyV29ya2VyUG9vbEluaXRpYWxpemVkPSEwKTtjb25zdCBidWlsZE9wdGlvbnM9bmV3IHV0b28uSDI7cmV0dXJuIGJ1aWxkT3B0aW9ucy5jbGVhbnVwPW51bGwhPT0oX2M9bnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5jbGVhbnVwKSYmdm9pZCAwIT09X2MmJl9jLChudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLmNvbmZpZykmJihidWlsZE9wdGlvbnMuY29uZmlnPW9wdGlvbnMuY29uZmlnKSxhd2FpdCB1dG9vLk1NLmJ1aWxkKGJ1aWxkT3B0aW9ucyl9YXN5bmMgZGV2KGNvbmZpZyxvblVwZGF0ZSl7dmFyIF9hLF9iOyhudWxsPT09KF9hPXRoaXMub3B0aW9ucyl8fHZvaWQgMD09PV9hP3ZvaWQgMDpfYS5sb2FkZXJXb3JrZXJVcmwpJiYhdGhpcy5sb2FkZXJXb3JrZXJQb29sSW5pdGlhbGl6ZWQmJihydW5Mb2FkZXJXb3JrZXJQb29sKHRoaXMub3B0aW9ucy5jd2QsdGhpcy5vcHRpb25zLmxvYWRlcldvcmtlclVybCxudWxsPT09KF9iPXRoaXMub3B0aW9ucyl8fHZvaWQgMD09PV9iP3ZvaWQgMDpfYi5sb2FkZXJzSW1wb3J0TWFwKSx0aGlzLmxvYWRlcldvcmtlclBvb2xJbml0aWFsaXplZD0hMCksdGhpcy5yb290VGFzaz1hd2FpdCB1dG9vLk1NLmVudHJ5cG9pbnRzU3Vic2NyaWJlKGNvbmZpZyxyZXN1bHQ9PntudWxsPT1vblVwZGF0ZXx8b25VcGRhdGUocmVzdWx0KX0pfWFzeW5jIHJlYWRGaWxlKHBhdGgsZW5jb2Rpbmcpe2xldCByZXQ7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsInV0ZjgiIT09ZW5jb2Rpbmc/YXdhaXQgdXRvby5Gcy5yZWFkKHBhdGgpOihyZXQ9YXdhaXQgdXRvby5Gcy5yZWFkVG9TdHJpbmcocGF0aCkscmV0KX1hc3luYyB3cml0ZUZpbGUocGF0aCxjb250ZW50LF9lbmNvZGluZyl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsInN0cmluZyI9PXR5cGVvZiBjb250ZW50P2F3YWl0IHV0b28uRnMud3JpdGVTdHJpbmcocGF0aCxjb250ZW50KTphd2FpdCB1dG9vLkZzLndyaXRlKHBhdGgsY29udGVudCl9YXN5bmMgY29weUZpbGUoc3JjLGRzdCl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsYXdhaXQgdXRvby5Gcy5jb3B5RmlsZShzcmMsZHN0KX1hc3luYyBzdGF0KHBhdGgpe2F3YWl0IHRoaXMud2FzbUluaXQ7Y29uc3QganNvbj0oYXdhaXQgdXRvby5Gcy5tZXRhZGF0YShwYXRoKSkudG9KU09OKCk7cmV0dXJue3R5cGU6anNvbi50eXBlLHNpemU6TnVtYmVyKGpzb24uZmlsZV9zaXplKX19YXN5bmMgcmVhZGRpcihwYXRoLG9wdGlvbnMpe2F3YWl0IHRoaXMud2FzbUluaXQ7cmV0dXJuKG51bGw9PW9wdGlvbnN8fG9wdGlvbnMucmVjdXJzaXZlLGF3YWl0IHV0b28uRnMucmVhZERpcihwYXRoKSkubWFwKGU9Pntjb25zdCBkaXI9ZS50b0pTT04oKTtyZXR1cm57bmFtZTpkaXIubmFtZSx0eXBlOmRpci50eXBlfX0pfWFzeW5jIG1rZGlyKHBhdGgsb3B0aW9ucyl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVjdXJzaXZlKT9hd2FpdCB1dG9vLkZzLmNyZWF0ZURpckFsbChwYXRoKTphd2FpdCB1dG9vLkZzLmNyZWF0ZURpcihwYXRoKX1hc3luYyBybShwYXRoLG9wdGlvbnMpe3N3aXRjaChhd2FpdCB0aGlzLndhc21Jbml0LChhd2FpdCB1dG9vLkZzLm1ldGFkYXRhKHBhdGgpKS50b0pTT04oKS50eXBlKXtjYXNlImZpbGUiOnJldHVybiBhd2FpdCB1dG9vLkZzLnJlbW92ZUZpbGUocGF0aCk7Y2FzZSJkaXJlY3RvcnkiOnJldHVybiBhd2FpdCB1dG9vLkZzLnJlbW92ZURpcihwYXRoLCEhKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVjdXJzaXZlKSl9fWFzeW5jIHJtZGlyKHBhdGgsb3B0aW9ucyl7cmV0dXJuIGF3YWl0IHRoaXMud2FzbUluaXQsYXdhaXQgdXRvby5Gcy5yZW1vdmVEaXIocGF0aCwhIShudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLnJlY3Vyc2l2ZSkpfWFzeW5jIGd6aXAoZmlsZXMpe3JldHVybiBhd2FpdCB0aGlzLndhc21Jbml0LGF3YWl0IHV0b28uTU0uZ3ppcChmaWxlcyl9YXN5bmMgc2lnTWQ1KGNvbnRlbnQpe3JldHVybiBhd2FpdCB0aGlzLndhc21Jbml0LGF3YWl0IHV0b28uTU0uc2lnTWQ1KGNvbnRlbnQpfWFzeW5jIGhtclN1YnNjcmliZShpZGVudGlmaWVyLGNhbGxiYWNrKXtjb25zdCByb290VGFzaz1hd2FpdCB1dG9vLk1NLmhtckV2ZW50cyhpZGVudGlmaWVyLGNhbGxiYWNrKTt0aGlzLmhtclJvb3RUYXNrcy5zZXQoaWRlbnRpZmllcixyb290VGFzayl9dXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbk1zLGNhbGxiYWNrKXt1dG9vLk1NLnVwZGF0ZUluZm9TdWJzY3JpYmUoYWdncmVnYXRpb25NcyxjYWxsYmFjayl9fSxDb25uZWN0ZWRQb3J0cz1uZXcgU2V0O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZT0+e2NvbnN0IHBvcnQ9ZS5wb3J0c1swXTtlLmRhdGEhPT1Xb3JrZXJNZXNzYWdlVHlwZS5Jbml0Q29ubmVjdGlvbnx8Q29ubmVjdGVkUG9ydHMuaGFzKHBvcnQpfHwoZXhwb3NlKGludGVybmFsRW5kcG9pbnQscG9ydCksQ29ubmVjdGVkUG9ydHMuYWRkKHBvcnQpKX0pfSkoKSxfX3dlYnBhY2tfZXhwb3J0c19fPV9fd2VicGFja19leHBvcnRzX18uZGVmYXVsdCxfX3dlYnBhY2tfZXhwb3J0c19ffSkoKSk7";
|