Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥暴君爱人@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiQ2xhc3NUYWJcIixcInBhdGhcIjpcIkNsYXNzVGFiXCIsXCJydWxlXCI6XCJjb25zdCBDbGFzc1RhYiA9IGZ1bmN0aW9uKGNsYXNzQXJyYXksIHBhcmFtcykge1xcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHBhcmFtcylcXG4gICAgdGhpcy5hcnIgPSBjbGFzc0FycmF5Lm1hcCh2ID0+IHRoaXMuaW5pdCh2KSlcXG4gICAgdGhpcy5zaWduID0gJyQnICsgUUlOR19USVRMRSArICdfJyArICh0aGlzLm5hbWUgfHwgJycpICsgJ18nXFxuICAgIHRoaXMuY29sb3IgPSB0aGlzLmNvbG9yIHx8ICcjMTJiNjY4J1xcbiAgICB0aGlzLmJvdW5kYXJ5ID0gdGhpcy5ib3VuZGFyeSB8fCAnYmxhbmtfYmxvY2snXFxufVxcbkNsYXNzVGFiLnByb3RvdHlwZSA9IHtcXG4gICAgY29uc3RydWN0b3I6IENsYXNzVGFiLFxcbiAgICBsb2FkKGVsKSB7XFxuICAgICAgICBsZXQgZm9sZGVkID0gdGhpcy5mb2xkICYmIGdldFZhcignZm9sZF8nICsgdGhpcy5zaWduLCAnJylcXG4gICAgICAgIGlmICh0aGlzLmFyci5sZW5ndGggPiAxICYmIHRoaXMuZm9sZCkgZWwucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKGZvbGRlZCA/ICfilrYnIDogJ+KWvCcpLmZvbnRjb2xvcignIzA0OWVmZicpLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2lnbiwgZm9sZGVkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignZm9sZF8nICsgc2lnbiwgeyAnJzogJ1QnLCAnVCc6ICcnIH0gW2ZvbGRlZF0pXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgfSwgdGhpcy5zaWduLCBmb2xkZWQpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG4gICAgICAgIH0pXFxuICAgICAgICBsZXQgYXJyID0gZm9sZGVkID8gW3RoaXMuYXJyWzBdXSA6IHRoaXMuYXJyXFxuICAgICAgICBhcnIuZm9yRWFjaCgodikgPT4ge1xcbiAgICAgICAgICAgIGxldCB7IGlkLCBjbGFzc19uYW1lLCBjbGFzc191cmwgfSA9IHYsXFxuICAgICAgICAgICAgc2VsZWN0ZWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmdldENsYXNzKGlkKSlcXG4gICAgICAgICAgICBjbGFzc19uYW1lLmZvckVhY2goKG5hbWUsIGkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGNsYXNzX3VybFtpXSxcXG4gICAgICAgICAgICAgICAgICAgIG5vdyA9IEpTT04uc3RyaW5naWZ5KHsgbmFtZTogbmFtZSwgdXJsOiB1cmwgfSlcXG4gICAgICAgICAgICAgICAgZWwucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogc2VsZWN0ZWQgPT0gbm93ID8gJ+KAnOKAnOKAneKAnScgKyBuYW1lLmZvbnRjb2xvcih0aGlzLmNvbG9yKS5ib2xkKCkgOiBuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBzZWxlY3RlZCA9PSBub3cgPyAnaGlrZXI6Ly9lbXB0eScgOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChzaWduLCBpZCwgbm93KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKHNpZ24gKyBpZCwgbm93KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2lnbiwgaWQsIG5vdyksXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBlbC5wdXNoKHsgY29sX3R5cGU6IHRoaXMuYm91bmRhcnkgfSlcXG4gICAgICAgIH0pXFxuICAgIH0sXFxuICAgIGluaXQoY2xhc3NPYmplY3QpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NPYmplY3QuY2xhc3NfbmFtZSA9PSAnc3RyaW5nJylcXG4gICAgICAgICAgICBjbGFzc09iamVjdC5jbGFzc19uYW1lID0gY2xhc3NPYmplY3QuY2xhc3NfbmFtZS5zcGxpdCgnJicpXFxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzT2JqZWN0LmNsYXNzX3VybCA9PSAnc3RyaW5nJylcXG4gICAgICAgICAgICBjbGFzc09iamVjdC5jbGFzc191cmwgPSBjbGFzc09iamVjdC5jbGFzc191cmwuc3BsaXQoJyYnKS5tYXAoKHYpID0+IHYudHJpbSgpKVxcbiAgICAgICAgcmV0dXJuIGNsYXNzT2JqZWN0XFxuICAgIH0sXFxuICAgIHB1c2goY2xhc3NPYmplY3QpIHtcXG4gICAgICAgIHRoaXMuYXJyLnB1c2godGhpcy5pbml0KGNsYXNzT2JqZWN0KSlcXG4gICAgfSxcXG4gICAgZ2V0Q2xhc3MoaWQpIHtcXG4gICAgICAgIGxldCBkZWZhdWx0Q2xhc3MgPSB0aGlzLmFyci5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PSBpZClcXG4gICAgICAgIGRlZmF1bHRDbGFzcyA9IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRDbGFzcyA/IHtcXG4gICAgICAgICAgICBuYW1lOiBkZWZhdWx0Q2xhc3MuY2xhc3NfbmFtZVswXSxcXG4gICAgICAgICAgICB1cmw6IGRlZmF1bHRDbGFzcy5jbGFzc191cmxbMF1cXG4gICAgICAgIH0gOiB7IG5hbWU6ICAnY2Fubm90IGZpbmQgaWQ6ICcgKyBpZCArICcgaW4gY2xhc3NUYWI6ICcgKyB0aGlzLnNpZ24sIHVybDogJyd9KVxcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZ2V0VmFyKHRoaXMuc2lnbiArIGlkLCBkZWZhdWx0Q2xhc3MpKVxcbiAgICB9LFxcbiAgICBzZXRVcmwodXJsKSB7XFxuICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoL1xcXFwkXFxcXHsoW159XSopXFxcXH0vZywgKF8sIGlkKSA9PiB0aGlzLmdldENsYXNzKGlkKS51cmwpXFxuICAgIH1cXG59XFxuLy8g55Sf5oiQ5aS06YOo5YiG57G7XFxuY29uc3QgZnlBbGwgPSBSVUxFLnVybC5pbmNsdWRlcygnZnlBbGwnKVxcbmxldCB0YWJIZWFkZXIgPSBbXVxcbmlmIChSVUxFLmNsYXNzX25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeWNsYXNzJyxcXG4gICAgY2xhc3NfbmFtZTogUlVMRS5jbGFzc19uYW1lLFxcbiAgICBjbGFzc191cmw6IFJVTEUuY2xhc3NfdXJsXFxufSlcXG5pZiAoUlVMRS5hcmVhX25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeWFyZWEnLFxcbiAgICBjbGFzc19uYW1lOiBSVUxFLmFyZWFfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiBSVUxFLmFyZWFfdXJsXFxufSlcXG5pZiAoUlVMRS55ZWFyX25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeXllYXInLFxcbiAgICBjbGFzc19uYW1lOiBSVUxFLnllYXJfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiBSVUxFLnllYXJfdXJsXFxufSlcXG5pZiAoUlVMRS5zb3J0X25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeXNvcnQnLFxcbiAgICBjbGFzc19uYW1lOiBSVUxFLnNvcnRfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiBSVUxFLnNvcnRfdXJsXFxufSlcXG50YWJIZWFkZXIgPSBuZXcgQ2xhc3NUYWIodGFiSGVhZGVyLCB7IG5hbWU6IFJVTEUudGl0bGUsIGZvbGQ6IHJlYWRGaWxlKCd0YWJGb2xkJyksIH0pXFxuXCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuiuvue9rlwiLFwicGF0aFwiOlwiQ29uZmlnXCIsXCJydWxlXCI6XCJqczpcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICdjbGVhck15VmFyKFxcXCJzb3J0RmxhZ1xcXCIpO3JlZnJlc2hQYWdlKCknKVxcbnNldFBhZ2VUaXRsZSgn4pqZIOi9u+WQiOmbhuiuvue9riDimpknKVxcbmNvbnN0IFFJTkdfVElUTEUgPSBnZXRNeVZhcignbXlDb2xsZWN0aW9uJyksXFxuICAgIHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKVxcbmxldCBkYXRhID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSkodHJ1ZSksXFxuICAgIGVsID0gW3tcXG4gICAgICAgIHRpdGxlOiAnPGI+IOa4hemZpOe8k+WtmO+8jOeri+WNs+abtOaWsCA8c21hbGw+IO+8iOWfuuS6jui/nOeoi+S7k+W6k++8jOayoeS6i+WIq+eCue+8iScsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVybCkgPT4ge1xcbiAgICAgICAgICAgIGlmKGZpbGVFeGlzdCh1cmwpKXtcXG4gICAgICAgICAgICAgICAgZGVsZXRlRmlsZSh1cmwpXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKCdodHRwczovL2dpdGxhYi5jb20vRHJlYW1Pek8vRHJlYW1Pek8vLS9yYXcvbWFpbi9KTScsIHVybClcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXF1aXJlRG93bmxvYWQoJ2h0dHBzOi8vZ2l0bGFiLmNvbS9EcmVhbU96Ty9EcmVhbU96Ty8tL3Jhdy9tYWluL0pNJywgdXJsKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcbiAgICAgICAgICAgIGJhY2soZmFsc2UpXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suabtOaWsCdcXG4gICAgICAgIH0sIHVybCksXFxuICAgICAgICBpbWc6ICdoaWtlcjovL2ltYWdlcy9pY29uNCcsXFxuICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcidcXG4gICAgfV0sXFxuICAgIHVwZGF0ZUludGVydmFsID0gcmVhZEZpbGUoJ3VwZGF0ZUludGVydmFsJykgfHwgJzEnLFxcbiAgICBuZXdXaW5kb3cgPSByZWFkRmlsZSgnbmV3V2luZG93JyksXFxuICAgIHRhYkZvbGQgPSByZWFkRmlsZSgndGFiRm9sZCcpLFxcbiAgICBkaXNhYmxlQ3VzdG9tID0gcmVhZEZpbGUoJ2Rpc2FibGVDdXN0b20nKSxcXG4gICAgZWRpdE1vZGUgPSBkaXNhYmxlQ3VzdG9tID8gJ+WvvOWFpea1t+mYlCcgOiBnZXRNeVZhcignZWRpdE1vZGUnLCAn5ZCv55SoL+emgeeUqCcpXFxuXFxuZWwucHVzaCh7XFxuICAgIHRpdGxlOiAnICDwn5KhIOabtOaWsOmikeeOhzogJyArICh1cGRhdGVJbnRlcnZhbCA9PSAwID8gJ+aJi+WKqCcgOiB1cGRhdGVJbnRlcnZhbCArICflpKknKSArICcgICcsXFxuICAgIHVybDogJCh1cGRhdGVJbnRlcnZhbCwgJ+i+k+WFpeabtOaWsOmXtOmalO+8iOWkqe+8ie+8jOS4ujDliJnmiYvliqjmm7TmlrBcXFxcbuacrOWcsOaWh+S7tumTvuaOpeaXoOaViCcpLmlucHV0KCgpID0+IHtcXG4gICAgICAgIGlucHV0ID0gcGFyc2VJbnQoaW5wdXQpXFxuICAgICAgICBpZihOdW1iZXIuaXNOYU4oaW5wdXQpKSBpbnB1dCA9IDFcXG4gICAgICAgIGVsc2UgaWYoaW5wdXQgPCAxKSBpbnB1dCA9IDBcXG4gICAgICAgIHNhdmVGaWxlKCd1cGRhdGVJbnRlcnZhbCcsIGlucHV0LnRvU3RyaW5nKCkpXFxuICAgICAgICByZWZyZXNoUGFnZSgpXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxufSwge1xcbiAgICB0aXRsZTogJyAg8J+WpSDni6znq4vpppbpobU6ICcgKyAobmV3V2luZG93ID8gJ+aYrycgOiAn5ZCmJykgKyAnICAnLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG5ld1dpbmRvdykgPT4ge1xcbiAgICAgICAgc2F2ZUZpbGUoJ25ld1dpbmRvdycsIG5ld1dpbmRvdyA/ICcnIDogJzEnKVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKVxcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICB9LCBuZXdXaW5kb3cpLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxufSwge1xcbiAgICB0aXRsZTogJyAg8J+SoCDliIbnsbvmipjlj6A6ICcgKyAodGFiRm9sZCA/ICfmmK8nIDogJ+WQpicpICsgJyAgJyxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh0YWJGb2xkKSA9PiB7XFxuICAgICAgICBzYXZlRmlsZSgndGFiRm9sZCcsIHRhYkZvbGQgPyAnJyA6ICcxJylcXG4gICAgICAgIHJlZnJlc2hQYWdlKClcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSwgdGFiRm9sZCksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG59LCB7XFxuICAgIHRpdGxlOiAnICDwn5K8IOWkh+S7veaBouWkjSAgJyxcXG4gICAgdXJsOiAkKFsn5aSH5Lu9JywgJ+aBouWkjSddLCAxKS5zZWxlY3QoKFFJTkdfVElUTEUsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pID0+IHtcXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJylcXG4gICAgICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCdmaWxlOi8vJykpXFxuICAgICAgICAgICAgdXJsID0gJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJ1xcbiAgICAgICAgZWxzZSBpZih1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKSB1cmwgPSAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgIGlmIChpbnB1dCA9PSAn5aSH5Lu9JykgcmV0dXJuICQoJ2hpa2VyOi8vZmlsZXMvdG1wLycgKyBRSU5HX1RJVExFICsgJ19iYWNrdXAuanNvbicsICfovpPlhaXlpIfku73ot6/lvoQnKVxcbiAgICAgICAgICAgIC5pbnB1dCgodXJsLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHJlcXVlc3QodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgPSByZWFkRmlsZSgnY3VzdG9tRGF0YScpXFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShpbnB1dCwgSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJ2YWw6IHVwZGF0ZUludGVydmFsLFxcbiAgICAgICAgICAgICAgICAgICAgbmV3V2luZG93OiBuZXdXaW5kb3csXFxuICAgICAgICAgICAgICAgICAgICB0YWJGb2xkOiB0YWJGb2xkLFxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUN1c3RvbTogZGlzYWJsZUN1c3RvbSxcXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGE6IGN1c3RvbURhdGEsXFxuICAgICAgICAgICAgICAgICAgICBydWxlczogcnVsZXNcXG4gICAgICAgICAgICAgICAgfSkpXFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LlpIfku73vvIzms6jmhI/oi6Xku5PlupPkuLrlrZDpobXpnaLliJnkuI3lpIfku70nXFxuICAgICAgICAgICAgfSwgdXJsLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKVxcbiAgICAgICAgZWxzZSByZXR1cm4gJCgnaGlrZXI6Ly9maWxlcy90bXAvJyArIFFJTkdfVElUTEUgKyAnX2JhY2t1cC5qc29uJywgJ+i+k+WFpeWkh+S7vei3r+W+hCcpLmlucHV0KCh1cmwpID0+IHtcXG4gICAgICAgICAgICBsZXQgeyB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tLCBjdXN0b21EYXRhLCBydWxlcyB9ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSlcXG4gICAgICAgICAgICBzYXZlRmlsZSgndXBkYXRlSW50ZXJ2YWwnLCB1cGRhdGVJbnRlcnZhbClcXG4gICAgICAgICAgICBzYXZlRmlsZSgnbmV3V2luZG93JywgbmV3V2luZG93KVxcbiAgICAgICAgICAgIHNhdmVGaWxlKCd0YWJGb2xkJywgdGFiRm9sZClcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsIGRpc2FibGVDdXN0b20pXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBjdXN0b21EYXRhKVxcbiAgICAgICAgICAgIGlmKHJ1bGVzKSB3cml0ZUZpbGUodXJsLCBydWxlcylcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suaBouWkje+8jOWmguaenOS4jeaDs+WQjOatpei/nOeoi+S7k+W6k++8jOWPr+S7peiuvue9ruabtOaWsOmikeeOh+S4uuaJi+WKqCdcXG4gICAgICAgIH0sIHVybClcXG4gICAgfSwgUUlOR19USVRMRSwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG59LCB7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcIiM2NjY2NjZcXFwiPjxzbWFsbD7nibnliKvpuKPosKLvvIzlsI/nqIvluo/mj5DkvpvogIXvvJpcXFxcbicgK1xcbiAgICAgICAgZGF0YS5yZWR1Y2UoKHNlbGYsIHYpID0+IHYuYXV0aG9yID8gc2VsZi5jb25jYXQodi5hdXRob3Iuc3BsaXQoJyYnKSkgOiBzZWxmLCBbXSlcXG4gICAgICAgIC5maWx0ZXIoKHYsIGksIGFycikgPT4gdiAmJiBhcnIuaW5kZXhPZih2KSA9PSBpKS5qb2luKCfjgIEnKSxcXG4gICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KVxcblxcbmVsLnB1c2goeyBjb2xfdHlwZTogJ2xpbmUnIH0sIHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgJ/Cfk50nLnNtYWxsKCkgKyAnJm5ic3Ag6L275ZCI6ZuG6Ieq5a6a5LmJICZuYnNwJy5ib2xkKCkuZm9udGNvbG9yKCcjNzU3NTc1JykgKyAoZGlzYWJsZUN1c3RvbSA/ICfinYwnIDogJ+KtlScpLnNtYWxsKCksXFxuICAgIHVybDogJChbKGRpc2FibGVDdXN0b20gPyAn5ZCv55SoJyA6ICfnpoHnlKgnKSArICflkIjpm4boh6rlrprkuYknLCAn5riF6Zmk6Ieq5a6a5LmJ5pWw5o2uJ10sIDEpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBpZiAoaW5wdXQgPT0gJ+a4hemZpOiHquWumuS5ieaVsOaNricpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKCdjdXN0b21EYXRhJylcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gJ+WQr+eUqOWQiOmbhuiHquWumuS5iScpIHtcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsICcnKVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsICcxJylcXG4gICAgICAgICAgICBpbnB1dCArPSAnXFxcXG7lsI/nqIvluo/lkK/nlKgv56aB55So44CB6YeN5paw5o6S5bqP562J5pON5L2c5Z2H5LiN5Lya5L2T546w5Zyo6aaW6aG15bCP56iL5bqP5YiX6KGo5LitJ1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5beyJyArIGlucHV0XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICBleHRyYTogeyBsaW5lVmlzaWJsZTogZmFsc2UgfVxcbn0pO1xcbihkaXNhYmxlQ3VzdG9tID8gWyflr7zlhaXmtbfpmJQnXSA6IFsn5ZCv55SoL+emgeeUqCcsICfph43mlrDmjpLluo8nLCAn5pu05pS55Zu+5qCHJywgJ+WvvOWFpea1t+mYlCddKS5mb3JFYWNoKCh2KSA9PiB7XFxuICAgIGVsLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHYgPT0gZWRpdE1vZGUgPyAn4oCc4oCc4oCd4oCdJyArIHYuYm9sZCgpLmZvbnRjb2xvcignIzEyYjY2OCcpIDogdixcXG4gICAgICAgIHVybDogdiA9PSBlZGl0TW9kZSA/ICdoaWtlcjovL2VtcHR5JyA6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHYpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcignZWRpdE1vZGUnLCB2KVxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgIH0sIHYpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICB9KVxcbn0pO1xcbmlmKGVkaXRNb2RlID09ICflr7zlhaXmtbfpmJQnKSBlbC5wdXNoKHtcXG4gICAgdGl0bGU6ICflhajpg6jlr7zlhaUnLFxcbiAgICB1cmw6ICfmtbfpmJTop4bnlYzvv6Vob21lX3J1bGVfdXJs77+lJyArICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpID8gdXJsIDogJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJyksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgIGV4dHJhOiB7IGxpbmVWaXNpYmxlOiBmYWxzZSB9XFxufSk7XFxuKGRpc2FibGVDdXN0b20gPyBkYXRhIDogSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpKS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgIGxldCBkID0geyB0aXRsZTogdi50aXRsZSwgaW1nOiBkYXRhW2ldLmljb24gfVxcbiAgICBzd2l0Y2ggKGVkaXRNb2RlKSB7XFxuICAgICAgICBjYXNlICflkK/nlKgv56aB55SoJzpcXG4gICAgICAgICAgICBkLnRpdGxlID0gKHYudmlzaWJsZSA/ICfwn5+iICAnIDogJ/CflLQgICcpICsgZC50aXRsZVxcbiAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXG4gICAgICAgICAgICAgICAgcnVsZXNbaV0udmlzaWJsZSA9ICFydWxlc1tpXS52aXNpYmxlXFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkocnVsZXMpKVxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgICAgIH0sIGkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGNhc2UgJ+mHjeaWsOaOkuW6jyc6XFxuICAgICAgICAgICAgbGV0IHNvcnRGbGFnID0gcGFyc2VJbnQoZ2V0TXlWYXIoJ3NvcnRGbGFnJywgJy0xJykpXFxuICAgICAgICAgICAgZC50aXRsZSA9IChzb3J0RmxhZyA9PSBpID8gJ/CflIMgICcgOiAnJykgKyBkLnRpdGxlXFxuICAgICAgICAgICAgaWYgKHNvcnRGbGFnID09IC0xKVxcbiAgICAgICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdzb3J0RmxhZycsIGkudG9TdHJpbmcoKSlcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mAieaLqeimgeenu+WKqOWIsOeahOS9jee9ridcXG4gICAgICAgICAgICAgICAgfSwgaSlcXG4gICAgICAgICAgICBlbHNlXFxuICAgICAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgob2xkSW5kZXgsIG5ld0luZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZXMuc3BsaWNlKG9sZEluZGV4LCAxKVswXSlcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkocnVsZXMpKVxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3NvcnRGbGFnJywgJy0xJylcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgICAgICAgICB9LCBzb3J0RmxhZywgaSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICAgICAgY2FzZSAn5pu05pS55Zu+5qCHJzpcXG4gICAgICAgICAgICBkLnVybCA9ICQodi5pY29uIHx8ICcnLCAn6L6T5YWl5paw5Zu+5qCH5Zyw5Z2A5oiW6aKc6Imy5Luj56CB77yaJykuaW5wdXQoKGkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dClcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLmljb24gPSBpbnB1dFxcbiAgICAgICAgICAgICAgICBlbHNlXFxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnVsZXNbaV0uaWNvblxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgICAgICB9LCBpKVxcbiAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICBjYXNlICflr7zlhaXmtbfpmJQnOlxcbiAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSk9PntcXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBnZXRNeVZhcignbXlDb2xsZWN0aW9uJykpKHRydWUpXFxuICAgICAgICAgICAgICAgIHJldHVybiAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YVtpXSkpXFxuICAgICAgICAgICAgfSwgaSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICB9XFxuICAgIGVsLnB1c2goZClcXG59KVxcbnNldFJlc3VsdChlbClcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumhtemdoui9veWFpVwiLFwicGF0aFwiOlwiZnJhbWVMb2FkXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBRSU5HX1RJVExFID0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpXFxubGV0IG15Q29sbGVjdGlvbl9lbCA9IFtdLFxcbiAgICB7IFJVTEUsIGlzSW5kZXgsIHBhZ2VUaXRsZSB9ID0gTVlfUEFSQU1TLFxcbiAgICB0aGlzUlVMRSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9JyArIFFJTkdfVElUTEUpKCkuZmluZCgodikgPT4gdi50aXRsZSA9PSBSVUxFLnRpdGxlKVxcbmlmIChpc0luZGV4KSB7XFxuICAgIFJVTEUgPSB0aGlzUlVMRVxcbn0gZWxzZSB7XFxuICAgIFJVTEUucGFnZXMgPSB0aGlzUlVMRS5wYWdlc1xcbn1cXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9wcmVGdW5jP3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL3VybFBhcnNlP3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcblxcbmlmIChpc0luZGV4KSB7XFxuICAgIGlmIChNWV9QQUdFID09IDEpIHtcXG4gICAgICAgIC8vIOWKoOi9vUNsYXNzVGFi57uE5Lu2XFxuICAgICAgICBldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9DbGFzc1RhYj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXG4gICAgICAgIHRhYkhlYWRlci5sb2FkKG15Q29sbGVjdGlvbl9lbClcXG4gICAgICAgIGlmIChSVUxFLnNlYXJjaF91cmwpIG15Q29sbGVjdGlvbl9lbC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIuaQnOS9oOaDs+imgeeahC4uLlxcXCIsXFxuICAgICAgICAgICAgdXJsOiAnXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIitpbnB1dCcsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgcnVsZXM6ICQudG9TdHJpbmcoKFFJTkdfVElUTEUsIHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFKSgpXFxuICAgICAgICAgICAgICAgICAgICBydWxlcyA9IFtydWxlcy5maW5kKCh2KSA9PiB2LnRpdGxlID09IHRpdGxlKV1cXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShydWxlcylcXG4gICAgICAgICAgICAgICAgfSwgUUlOR19USVRMRSwgUlVMRS50aXRsZSksXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignc2VhcmNoS2V5JyxpbnB1dClcXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIH0pXFxuICAgICAgICBNWV9SVUxFLmNsYXNzX3VybCA9IHRhYkhlYWRlci5nZXRDbGFzcyhmeUFsbCA/ICdmeUFsbCcgOiAnZnljbGFzcycpLnVybFxcbiAgICAgICAgTVlfUlVMRS5hcmVhX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5YXJlYScpLnVybFxcbiAgICAgICAgTVlfUlVMRS55ZWFyX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5eWVhcicpLnVybFxcbiAgICAgICAgTVlfUlVMRS5zb3J0X3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5c29ydCcpLnVybFxcbiAgICB9XFxuICAgIC8vIOWkhOeQhk1ZX1JVTEVcXG4gICAgTVlfUlVMRS51cmwgPSBSVUxFLnVybFxcbiAgICBNWV9SVUxFLmNvbF90eXBlID0gUlVMRS5jb2xfdHlwZVxcbiAgICBNWV9SVUxFLmRldGFpbF9jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxuICAgIE1ZX1JVTEUuZmluZF9ydWxlID0gUlVMRS5maW5kX3J1bGVcXG4gICAgTVlfUlVMRS5kZXRhaWxfZmluZF9ydWxlID0gUlVMRS5kZXRhaWxfZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUucGFyYW1zID0ge31cXG59IGVsc2Uge1xcbiAgICBNWV9SVUxFLnVybCA9IE1ZX1BBUkFNUy51cmxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxuICAgIE1ZX1JVTEUuZmluZF9ydWxlID0gUlVMRS5kZXRhaWxfZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUucGFyYW1zID0gUlVMRS5wYXJhbXNcXG59XFxuTVlfUlVMRS5wYWdlcyA9IFJVTEUucGFnZXNcXG5NWV9SVUxFLnBhZ2VMaXN0ID0gSlNPTi5wYXJzZShNWV9SVUxFLnBhZ2VzIHx8ICdbXScpXFxuTVlfUlVMRS50aXRsZSA9IFJVTEUudGl0bGVcXG5cXG5pZiAoIWlzSW5kZXgpIHtcXG4gICAgaWYgKHBhZ2VUaXRsZSkgc2V0UGFnZVRpdGxlKHBhZ2VUaXRsZSlcXG4gICAgc2V0TGFzdENoYXB0ZXJSdWxlKHRoaXNSVUxFLmxhc3RfY2hhcHRlcl9ydWxlKVxcbiAgICBNWV9QQVJBTVMgPSBNWV9SVUxFLnBhcmFtc1xcbn1cXG4vLyDpooTlpITnkIblubbliJ3lp4vljJZjb25maWdcXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxuICAgIGxldCBsb2FkZWQgPSBnZXRNeVZhcihNWV9SVUxFLnRpdGxlICsgXFxcIkBwcmVcXFwiKVxcbiAgICBpZiAoIWxvYWRlZCB8fCBpc0luZGV4KSB7XFxuICAgICAgICBldmFsKHRoaXNSVUxFLnByZVJ1bGUpXFxuICAgICAgICBwdXRNeVZhcihNWV9SVUxFLnRpdGxlICsgXFxcIkBwcmVcXFwiLCBcXFwiMVxcXCIpXFxuICAgIH1cXG59XFxubGV0IF9jZmcgPSBnZXRNeVZhcignaW5pdENvbmZpZycsICd7fScpXFxuaWYgKF9jZmcgJiYgX2NmZy5sZW5ndGggPiAwKSB7XFxuICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoX2NmZylcXG59XFxuXFxuLy8g5q2j5paH6Kej5p6Q6YCa55So5Y+Y6YePXFxubGV0IGFzc2lnbkxhenlSdWxlID0gJC50b1N0cmluZygoUUlOR19USVRMRSwgdGl0bGUsIHVybCkgPT4ge1xcbiAgICBsZXQgUlVMRSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9XFxcIiArIFFJTkdfVElUTEUpKCkuZmluZCgodikgPT4gdi50aXRsZSA9PSB0aXRsZSlcXG4gICAgcmV0dXJuIHsgdGl0bGU6dGl0bGUsIHVybDogdXJsLCBwYWdlczogUlVMRS5wYWdlcywgcGFnZUxpc3Q6IEpTT04ucGFyc2UoUlVMRS5wYWdlcyB8fCAnW10nKSB9XFxufSwgUUlOR19USVRMRSwgTVlfUlVMRS50aXRsZSwgTVlfUlVMRS51cmwpXFxuZnVuY3Rpb24gZ2VuTXlSdWxlKCkge1xcbiAgICBsZXQgcnVsZSA9IE9iamVjdC5hc3NpZ24oe30sIE1ZX1JVTEUpXFxuICAgIGRlbGV0ZSBydWxlLmxhc3RfY2hhcHRlcl9ydWxlXFxuICAgIGRlbGV0ZSBydWxlLnByZVJ1bGVcXG4gICAgZGVsZXRlIHJ1bGUucGFnZUxpc3RcXG4gICAgZGVsZXRlIHJ1bGUucGFnZXNcXG4gICAgcmV0dXJuIHJ1bGVcXG59XFxuZnVuY3Rpb24gcnVuQ29kZShydWxlKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcbiAgICAgICAgcmV0dXJuIGNvZGUgPyBldmFsKGNvZGUpIDogcnVsZVxcbiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBydWxlIH1cXG59XFxuZnVuY3Rpb24gZ2VuRXhVcmwodXJsKSB7XFxuICAgIHVybCA9IHVybC5zcGxpdCgnOycpXFxuICAgIHJldHVybiB1cmwuc2hpZnQoKSArICc7JyArIHBhcmFtSGFuZGxlKHVybCwgdGhpc1JVTEUudWEsIE1ZX1JVTEUudXJsKVxcbn1cXG4vLyDmraPmlofop6PmnpBcXG5pZiAoTVlfUlVMRS5maW5kX3J1bGUuc3RhcnRzV2l0aCgnanM6JykpIHtcXG4gICAgc2V0UmVzdWx0ID0gZnVuY3Rpb24oZWwsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpIHtcXG4gICAgICAgIHBhcmFtMSA9IENBTExCQUNLX0tFWVxcbiAgICAgICAgcGFyYW0yID0gTVlfUlVMRVxcbiAgICAgICAgcGFyYW0zID0gTVlfVFlQRVxcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZWwuZGF0YSkpIGVsID0gZWwuZGF0YVxcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobXlDb2xsZWN0aW9uX2VsLCBlbC5tYXAoKHYpID0+IHtcXG4gICAgICAgICAgICBpZighdi5leHRyYSkgdi5leHRyYSA9IHt9XFxuICAgICAgICAgICAgdi5jb2xfdHlwZSA9IHYuY29sX3R5cGUgfHwgTVlfUlVMRS5jb2xfdHlwZVxcbiAgICAgICAgICAgIGxldCBNWV9fUlVMRSA9IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgcGFyYW1zOiB2LmV4dHJhIH0pXFxuXFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2LnVybCAhPSAnc3RyaW5nJyB8fCBbJ3J1bGUnLCAncGljcycsICd0b2FzdCcsICdpbnB1dCcsICdjb25maXJtJywgJ2NvcHknLCAnZWRpdEZpbGUnLCAneDUnLCAneDVXZWJWaWV3JywgJ3g1UGxheScsICd3ZWInLCAnc2VsZWN0JywgJ3g1UnVsZScsICd3ZWJSdWxlJywgJ2Rvd25sb2FkJywgJ3NoYXJlJ10uZmluZCgodnYpID0+IHYudXJsLnN0YXJ0c1dpdGgodnYgKyAnOi8vJykpIHx8IFsneDVfd2Vidmlld19zaW5nbGUnLCAnaW5wdXQnXS5maW5kKCh2dikgPT4gdi5jb2xfdHlwZSA9PSB2dikpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYudXJsLmluY2x1ZGVzKCdAcnVsZT0nKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgW18sIHVybCwgcnVsZV0gPSB2LnVybC5tYXRjaCgvXihbXFxcXHNcXFxcU10qPylAcnVsZT0oW1xcXFxzXFxcXFNdKikkLylcXG4gICAgICAgICAgICAgICAgdi51cmwgPSB1cmxcXG4gICAgICAgICAgICAgICAgTVlfX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHJ1bGVcXG4gICAgICAgICAgICAgICAgTVlfX1JVTEUuZGV0YWlsX2NvbF90eXBlID0gTVlfUlVMRS5jb2xfdHlwZVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodi51cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKSB7XFxuICAgICAgICAgICAgICAgIGlmICh2LnVybC5pbmNsdWRlcygncnVsZT0nKSB8fCB2LmV4dHJhLnJ1bGUpXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdlxcbiAgICAgICAgICAgICAgICBsZXQgW18sIHBhdGgsIGZsYWcsIHBhcmFtc10gPSB2LnVybC5tYXRjaCgvXmhpa2VyOlxcXFwvXFxcXC9wYWdlXFxcXC8oLis/KSgjLio/KT8oPzpcXFxcPyguKikpPyQvKSxcXG4gICAgICAgICAgICAgICAgICAgIHN1YlBhZ2UgPSBNWV9SVUxFLnBhZ2VMaXN0LmZpbmQoKHYpID0+IHYucGF0aCA9PSBwYXRoKSxcXG4gICAgICAgICAgICAgICAgICAgIHN1YlVybCA9IChwYXJhbXMgfHwgJycpLnNwbGl0KCcmJykuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCd1cmw9JykpXFxuICAgICAgICAgICAgICAgIHYudXJsID0gKHN1YlVybCA/IHN1YlVybC5zbGljZSg0KS5yZXBsYWNlKC/vvJ/vvJ8vZywgJz8nKS5yZXBsYWNlKC/vvIbvvIYvZywgJyYnKSA6ICh2LmV4dHJhIHx8IHt9KS51cmwpIHx8ICdoaWtlcjovL2VtcHR5JyArIGZsYWcgKyAnPycgKyAocGFyYW1zIHx8ICcnKVxcbiAgICAgICAgICAgICAgICBNWV9fUlVMRS5kZXRhaWxfZmluZF9ydWxlID0gc3ViUGFnZS5ydWxlXFxuICAgICAgICAgICAgICAgIE1ZX19SVUxFLmRldGFpbF9jb2xfdHlwZSA9IHN1YlBhZ2UuY29sX3R5cGVcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYudXJsLmluY2x1ZGVzKCdAbGF6eVJ1bGU9JykpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlSW5kZXggPSB2LnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgdi51cmwgPSB2LnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6XFxcXG5pZihNWV9SVUxFKU9iamVjdC5hc3NpZ24oTVlfUlVMRSwgJyArIGFzc2lnbkxhenlSdWxlICsgJyk7JyArIHYudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgICAgICAgICByZXR1cm4gdlxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbmRleCkge1xcbiAgICAgICAgICAgICAgICBpZiAoIU1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSB8fCAvaGlrZXI6XFxcXC9cXFxcLyg/IWVtcHR5LiskKS8udGVzdCh2LnVybCkpIHJldHVybiB2XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdi5leHRyYSA9IE9iamVjdC5hc3NpZ24oe30sIHYuZXh0cmEsIHtcXG4gICAgICAgICAgICAgICAgdXJsOiBnZW5FeFVybCh2LnVybCksXFxuICAgICAgICAgICAgICAgIFJVTEU6IE1ZX19SVUxFLFxcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgdi50aXRsZVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgdi51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxuICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgIH0pKVxcbiAgICAgICAgbWV0aG9kX3NldFJlc3VsdC5pbnZva2UoamF2YUNvbnRleHQsIG15Q29sbGVjdGlvbl9lbCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcXG4gICAgfVxcbiAgICBzZXRIb21lUmVzdWx0ID0gc2V0UmVzdWx0XFxuICAgIHNldFNlYXJjaFJlc3VsdCA9IHNldFJlc3VsdFxcblxcbiAgICBldmFsKE1ZX1JVTEUuZmluZF9ydWxlLnNsaWNlKDMpKVxcbn0gZWxzZSB7XFxuICAgIGxldCBbXywgZmluZFJ1bGUsIGRldGFpbEZpbmRSdWxlXSA9IE1ZX1JVTEUuZmluZF9ydWxlLm1hdGNoKC9eKFtcXFxcc1xcXFxTXSo/KSg/Oj09PihbXFxcXHNcXFxcU10qKSk/JC8pXFxuICAgIGZpbmRSdWxlID0gZmluZFJ1bGUuc3BsaXQoJzsnKVxcbiAgICBwYXJzZURvbUZvckFycmF5KGdldFJlc0NvZGUoKSwgZmluZFJ1bGUuc2hpZnQoKSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xcbiAgICAgICAgbGV0IFt0aXRsZSwgaW1nLCBkZXNjLCB1cmxdID0gZmluZFJ1bGUubWFwKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAnKicpIHJldHVybiAnJ1xcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB2ID0gKGkgPT0gMSB8fCBpID09IDMpID9cXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbShkYXRhLCB2KSA6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEb21Gb3JIdG1sKGRhdGEsIHYpXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAzKSB2ID0gcnVuQ29kZSh2KVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gJycgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHJlcyA9IHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLCB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYywgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBNWV9SVUxFLmNvbF90eXBlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgaWYgKHJlcy51cmwpIHtcXG4gICAgICAgICAgICBpZiAocmVzLnVybC5pbmNsdWRlcygnQGxhenlSdWxlPScpKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZUluZGV4ID0gcmVzLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgcmVzLnVybCA9IHJlcy51cmwuc2xpY2UoMCwgcmVJbmRleCkgKyAnLmpzOlxcXFxuaWYoTVlfUlVMRSlPYmplY3QuYXNzaWduKE1ZX1JVTEUsICcgKyBhc3NpZ25MYXp5UnVsZSArICcpOycgKyByZXMudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgICAgIH0gZWxzZSAgaWYgKGRldGFpbEZpbmRSdWxlKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5leHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgZGV0YWlsX2ZpbmRfcnVsZTogZGV0YWlsRmluZFJ1bGUgfSksXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgdGl0bGVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTVlfUlVMRS5kZXRhaWxfZmluZF9ydWxlKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5leHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IGdlbk15UnVsZSgpLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBpc0luZGV4ICYmIHRpdGxlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmVzLnVybCA9ICdoaWtlcjovL3BhZ2UvZnJhbWVMb2FkP3J1bGU9JyArIFFJTkdfVElUTEVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBteUNvbGxlY3Rpb25fZWwucHVzaChyZXMpXFxuICAgIH0pXFxuICAgIHNldFJlc3VsdChteUNvbGxlY3Rpb25fZWwpXFxufVxcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pWw5o2u6L295YWlXCIsXCJwYXRoXCI6XCJkYXRhTG9hZFwiLFwicnVsZVwiOlwiJC5leHBvcnRzID0gZnVuY3Rpb24oc2hvd0FsbCkge1xcbiAgICBsZXQgdXJsID0gZ2V0TXlWYXIoJ3JlbW90ZVVybCcpLFxcbiAgICAgICAgZGF0YSA9IFtdXFxuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XFxuICAgICAgICAvLyDlpoLmnpzkuLrmnKzlnLDmlofku7bliJnkuI3ov5vooYznvJPlrZhcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IG9yaURhdGEgPSBmZXRjaCh1cmwpXFxuICAgICAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdoaWtlcjovL3BhZ2UvJykpXFxuICAgICAgICAgICAgICAgIG9yaURhdGEgPSBKU09OLnBhcnNlKG9yaURhdGEpLnJ1bGVcXG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShvcmlEYXRhKVxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIC8vIOiOt+WPlui/nOeoi+aVsOaNru+8jOajgOafpemXtOmalOm7mOiupOS4gOWkqVxcbiAgICAgICAgbGV0IGludGVydmFsID0gcGFyc2VJbnQocmVhZEZpbGUoJ3VwZGF0ZUludGVydmFsJykgfHwgJzEnKSxcXG4gICAgICAgICAgICBvbGREYXRhID0gZmV0Y2goJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJyksXFxuICAgICAgICAgICAgcmVtb3RlRGF0YSA9IFtdXFxuICAgICAgICBpZihpbnRlcnZhbCA9PSAwKSBpbnRlcnZhbCA9IC0xXFxuICAgICAgICB0cnkgeyByZW1vdGVEYXRhID0gSlNPTi5wYXJzZShmZXRjaENhY2hlKHVybCwgMTY4ICogaW50ZXJ2YWwsIHt0aW1lb3V0OjUwMDAwfSkpIH0gY2F0Y2goZSkge31cXG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KHJlbW90ZURhdGEpKSByZW1vdGVEYXRhID0gW11cXG4gICAgICAgIGlmIChyZW1vdGVEYXRhLmxlbmd0aCA8IDMpIHtcXG4gICAgICAgICAgICBsb2coJ+acquiOt+WPluWIsOaVsOaNricpXFxuICAgICAgICAgICAgaWYgKG9sZERhdGEpIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9saWJzLycgKyBtZDUodXJsKSArICcuanMnLCBvbGREYXRhKVxcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKG9sZERhdGEgfHwgJ1tdJylcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbG9nKCflt7Lojrflj5bliLDmlbDmja4nKVxcbiAgICAgICAgICAgIGRhdGEgPSByZW1vdGVEYXRhXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZGF0YSA9IGRhdGEuZmlsdGVyKCh2KSA9PiB7IHJldHVybiB2LnRpdGxlICE9IGdldE15VmFyKCdteUNvbGxlY3Rpb24nKSAmJiAhKHYuYXV0aG9yIHx8ICcnKS5pbmNsdWRlcygn6L275ZCI6ZuG55Sf5oiQ5ZmoJykgfSlcXG4gICAgaWYgKHJlYWRGaWxlKCdkaXNhYmxlQ3VzdG9tJykpIHJldHVybiBkYXRhXFxuICAgIGVsc2UgeyAvLyDlhpnlhaXoh6rlrprkuYnmlbDmja5cXG4gICAgICAgIGxldCBjdXN0b21EYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpLFxcbiAgICAgICAgICAgIHJld3JpdGVEYXRhID0gW11cXG4gICAgICAgIGN1c3RvbURhdGEgPSBjdXN0b21EYXRhLnJlZHVjZSgoc2VsZiwgdikgPT4ge1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGRhdGEuZmluZEluZGV4KCh2dikgPT4gdi50aXRsZSA9PSB2di50aXRsZSlcXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xcbiAgICAgICAgICAgICAgICBzZWxmLnB1c2godilcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBkYXRhLnNwbGljZShpbmRleCwgMSlbMF1cXG4gICAgICAgICAgICAgICAgaWYgKHNob3dBbGwgfHwgdi52aXNpYmxlKVxcbiAgICAgICAgICAgICAgICAgICAgcmV3cml0ZURhdGEucHVzaChPYmplY3QuYXNzaWduKHJ1bGUsIHYpKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gc2VsZlxcbiAgICAgICAgfSwgW10pXFxuICAgICAgICBkYXRhLmZvckVhY2goKHYpID0+IGN1c3RvbURhdGEucHVzaCh7IHRpdGxlOiB2LnRpdGxlLCB2aXNpYmxlOiB0cnVlIH0pKVxcbiAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShjdXN0b21EYXRhKSlcXG4gICAgICAgIHJldHVybiByZXdyaXRlRGF0YS5jb25jYXQoZGF0YSlcXG4gICAgfVxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWHveaVsOmHjeWGmVwiLFwicGF0aFwiOlwicHJlRnVuY1wiLFwicnVsZVwiOlwiLy8g6Ziy5q2icmVxdWlyZeWkmuasoei/kOihjFxcbmxldCByQ2FjaGUgPSB7fVxcbnJlcXVpcmUgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkge1xcbiAgICBpZiAoIXBhcmFtMCB8fCByQ2FjaGVbcGFyYW0wXSAhPSBudWxsKSB7XFxuICAgICAgICByZXR1cm5cXG4gICAgfVxcbiAgICByQ2FjaGVbcGFyYW0wXSA9IDFcXG4gICAgcGFyYW0yID0gcGFyYW0yIHx8IDBcXG4gICAgcGFyYW0zID0gTVlfVElDS0VUXFxuICAgIHBhcmFtNCA9IGV2YWxcXG4gICAgcmV0dXJuIG1ldGhvZF9yZXF1aXJlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXFxufVxcbnJlcXVpcmVDYWNoZSA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpIHtcXG4gICAgaWYgKCFwYXJhbTAgfHwgckNhY2hlW3BhcmFtMF0gIT0gbnVsbCkge1xcbiAgICAgICAgcmV0dXJuXFxuICAgIH1cXG4gICAgckNhY2hlW3BhcmFtMF0gPSAxXFxuICAgIHBhcmFtMyA9IHBhcmFtMyB8fCAwXFxuICAgIHBhcmFtNCA9IE1ZX1RJQ0tFVFxcbiAgICBwYXJhbTUgPSBldmFsXFxuICAgIHJldHVybiBtZXRob2RfcmVxdWlyZUNhY2hlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcXG59XFxucmMgPSByZXF1aXJlQ2FjaGVcXG5cXG4vLyDmnIDmlrDnq6DoioLop4TliJnms6jlhaXpooTlpITnkIbku6PnoIFcXG5zZXRMYXN0Q2hhcHRlclJ1bGUgPSBmdW5jdGlvbihwYXJhbTApIHtcXG4gICAgaWYgKCFwYXJhbTApIHJldHVyblxcbiAgICBpZiAocGFyYW0wLnN0YXJ0c1dpdGgoXFxcImpzOlxcXCIpICYmIHRoaXNSVUxFLnByZVJ1bGUpIHtcXG4gICAgICAgIHBhcmFtMCA9ICdqczpcXFxcbnRyeXtldmFsKEpTT04ucGFyc2UoZmV0Y2goXFxcImhpa2VyOi8vcGFnZS9wcmVGdW5jP3J1bGU9JyArIFFJTkdfVElUTEUgKyAnXFxcIikpLnJ1bGUpO1xcXFxcXG4gICAgICAgICAgICBldmFsKGJhc2U2NERlY29kZShcXFwiJyArIGJhc2U2NEVuY29kZSh0aGlzUlVMRS5wcmVSdWxlKSArICdcXFwiKSk7XFxcXFxcbiAgICAgICAgICAgIGxldCBfY2ZnID0gZ2V0TXlWYXIoXFxcImluaXRDb25maWdcXFwiLCBcXFwie31cXFwiKTtcXFxcXFxuICAgICAgICAgICAgaWYgKF9jZmcgJiYgX2NmZy5sZW5ndGg+MCkge2NvbmZpZyA9IEpTT04ucGFyc2UoX2NmZyl9fWNhdGNoKGUpe2xvZyhlLm1lc3NhZ2UpfVxcXFxuOycgK1xcbiAgICAgICAgICAgIHBhcmFtMC5zbGljZSgzKVxcbiAgICB9XFxuICAgIG1ldGhvZF9zZXRMYXN0Q2hhcHRlclJ1bGUuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTApO1xcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumTvuaOpeWkhOeQhlwiLFwicGF0aFwiOlwidXJsUGFyc2VcIixcInJ1bGVcIjpcIi8vIOmmlumhtemTvuaOpeabv+aNouWIhuexu1xcbmZ1bmN0aW9uIGluZGV4VXJsKHBhcmFtKSB7XFxuICAgIGZ1bmN0aW9uIHJ1bkNvZGUocnVsZSkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcbiAgICAgICAgICAgIHJldHVybiBjb2RlID8gZXZhbChjb2RlKSA6IHJ1bGVcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIHJ1bGUgfVxcbiAgICB9XFxuICAgIGxldCB7IFJVTEUsIHBhZ2VOdW0sIFFJTkdfVElUTEUgfSA9IEpTT04ucGFyc2UocGFyYW0uc3BsaXQoJyMjIycpWzFdKVxcbiAgICBSVUxFID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoUlVMRSkpXFxuICAgIHBhZ2VOdW0gPSBwYXJzZUludChwYWdlTnVtKVxcbiAgICBsZXQgdXJsID0gUlVMRS51cmxcXG5cXG4gICAgZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvQ2xhc3NUYWI/cnVsZT0nICsgUUlOR19USVRMRSkpLnJ1bGUpXFxuICAgIHVybCA9IHRhYkhlYWRlci5zZXRVcmwoZnlBbGwgPyB1cmwucmVwbGFjZSgvZnlBbGwvZywgJyQke2Z5QWxsfScpIDogdXJsLnJlcGxhY2UoL2Z5KGNsYXNzfGFyZWF8eWVhcnxzb3J0KS9nLCAnJCR7ZnkkMX0nKSlcXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL2Z5cGFnZSg/OkAoLT9cXFxcZCspQCk/KD86XFxcXCooXFxcXGQrKUApPy9nLCAoXywgc3RhcnQsIHNwYWNlKSA9PiBwYXJzZUludChzdGFydCB8fCAwKSArIDEgKyAocGFnZU51bSAtIDEpICogcGFyc2VJbnQoc3BhY2UgfHwgMSkpXFxuICAgIHVybCA9IC9eKFtcXFxcc1xcXFxTXSo/KSg/OlxcXFxbZmlyc3RQYWdlPShbXFxcXHNcXFxcU10qPylcXFxcXSk/KD86KFxcXFwuanM6W1xcXFxzXFxcXFNdKj8pKT8kLy5leGVjKHVybClcXG4gICAgaWYgKHBhZ2VOdW0gPT0gMSAmJiB1cmxbMl0pIHVybFsxXSA9IHVybFsyXVxcbiAgICBpZiAodXJsWzNdICYmICF1cmxbMV0uaW5jbHVkZXMoJy5qczonKSkgdXJsWzFdICs9IHVybFszXVxcbiAgICByZXR1cm4gcnVuQ29kZSh1cmxbMV0pXFxufVxcbmZ1bmN0aW9uIHBhcmFtSGFuZGxlKHVybFBhcmFtLCB1YSwgdXJsVG1wKSB7XFxuICAgIGxldCBjaGFyc2V0LCBwYXJhbVRtcFxcbiAgICB0cnkgeyAvLyDpk77mjqXnmoTnvJbnoIHjgIFVQeWSjFJlZmVyZXLlupTor6XmmK/pppblhYjnu6fmib/pppbpobXpk77mjqVcXG4gICAgICAgIFssICwgY2hhcnNldCwgcGFyYW1UbXBdID0gdXJsVG1wLnNwbGl0KCc7JylcXG4gICAgICAgIHBhcmFtVG1wID0gcGFyYW1UbXAubWF0Y2goL157KC4qKX0kLylbMV0uc3BsaXQoJyYmJylcXG4gICAgfSBjYXRjaCAoZSkgeyBwYXJhbVRtcCA9IFtdIH1cXG4gICAgbGV0IFVzZXJBZ2VudCA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSksXFxuICAgICAgICBSZWZlcmVyID0gcGFyYW1UbXAuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKVxcbiAgICB1cmxQYXJhbVswXSA9IHVybFBhcmFtWzBdIHx8ICdHRVQnXFxuICAgIHVybFBhcmFtWzFdID0gdXJsUGFyYW1bMV0gfHwgY2hhcnNldCB8fCAnVVRGLTgnXFxuICAgIHRyeSB7XFxuICAgICAgICB1cmxQYXJhbVsyXSA9IHVybFBhcmFtWzJdLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxuICAgIH0gY2F0Y2ggKGUpIHsgdXJsUGFyYW1bMl0gPSBbXSB9XFxuICAgIC8vIOa3u+WKoOWFqOWxgFVB5ZKM5LiK57qnUmVmZXJlclxcbiAgICBpZiAoIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSkpIHtcXG4gICAgICAgIGlmIChVc2VyQWdlbnQpIHVybFBhcmFtWzJdLnB1c2goVXNlckFnZW50KVxcbiAgICAgICAgZWxzZSBpZiAodWEgPT0gJ3BjJylcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBQQ19VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcPy8sICfvvJ/vvJ8nKSlcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdtb2JpbGUnKVxcbiAgICAgICAgICAgIHVybFBhcmFtWzJdLnB1c2goJ1VzZXItQWdlbnRAJyArIE1PQklMRV9VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcPy8sICfvvJ/vvJ8nKSlcXG4gICAgfVxcbiAgICBpZiAoUmVmZXJlciAmJiAhdXJsUGFyYW1bMl0uc29tZSgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKSlcXG4gICAgICAgIHVybFBhcmFtWzJdLnB1c2goUmVmZXJlcilcXG4gICAgdXJsUGFyYW1bMl0gPSAneycgKyB1cmxQYXJhbVsyXS5qb2luKCcmJicpICsgJ30nXFxuICAgIHJldHVybiB1cmxQYXJhbS5qb2luKCc7JylcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuoznuqdb5LiAXVwiLFwicGF0aFwiOlwiZWp0b29sXCIsXCJydWxlXCI6XCJmdW5jdGlvbiBjb3ZlcijmoIfpopgsIOS9nOiAhSwg5YiG57G7LCDnirbmgIEsIOeroOiKgiwg5pu05pawLCDnroDku4ss5bCB6Z2i5Zu+54mHLHRydWVfdXJsLCBoYXNMaW5lKSB7XFxyXFxudmFyIOagh+mimCwg5L2c6ICFLCDliIbnsbssIOeKtuaAgSwg56ug6IqCLCDmm7TmlrAsIOeugOS7iyzlsIHpnaLlm77niYcsdHJ1ZV91cmwsIGhhc0xpbmU7XFxyXFxuXFx0dHJ5IHtcXHJcXG5cXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdHRpdGxlOiAn4oCY4oCY4oCZ4oCZPHNtYWxsPjxmb250IGNvbG9yPVxcXCIjRkE3Mjk4XFxcIj4nK+S9nOiAhS5zbGljZSgwLDE1KStcXFwiJm5ic3A7XFxcIivnirbmgIErJzwvZm9udD48L3NtYWxsPicrJ+KAmOKAmOKAmeKAmTxzbWFsbD48Zm9udCBjb2xvcj1cXFwiI0IxNUJGRlxcXCI+JytcXFwiXFxcXG5cXFwiK+WIhuexuysnPC9mb250Pjwvc21hbGw+Jysn4oCY4oCY4oCZ4oCZPHNtYWxsPjxmb250IGNvbG9yPVxcXCIjRjE3QzY3XFxcIj4nK1xcXCJcXFxcblxcXCIr56ug6IqCK1xcXCImbmJzcDtcXFwiK+abtOaWsCsnPC9mb250Pjwvc21hbGw+JyxcXHJcXG5cXHRcXHRcXHRkZXNjOifigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcIiM1MjQzM0RcXFwiPicgK+eugOS7iysgJzwvc21hbGw+JyxcXHJcXG5cXHRcXHRcXHRwaWNfdXJsOiAg5bCB6Z2i5Zu+54mHLFxcclxcblxcdFxcdFxcdHVybDogdHJ1ZV91cmwsXFxyXFxuXFx0XFx0XFx0Y29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcclxcblxcdFxcdH0pO1xcblxcdFxcdGQucHVzaCh7XFxyXFxuXFx0XFx0XFx0Y29sX3R5cGU6ICdsaW5lX2JsYW5rJyxcXHJcXG5cXHRcXHR9KTtcXG5cXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdGNvbF90eXBlOiAnbGluZScsXFxyXFxuXFx0XFx0fSk7XFxyXFxuXFx0XFx0aWYgKGhhc0xpbmUpIHtcXHJcXG5cXHRcXHRcXHRpdGVtLmV4dHJhID0ge1xcclxcblxcdFxcdFxcdFxcdGxpbmVWaXNpYmxlOiBmYWxzZVxcclxcblxcdFxcdFxcdH1cXHJcXG5cXHRcXHR9XFxyXFxuXFx0XFx0ZC5wdXNoKGl0ZW0pO1xcclxcblxcdH0gY2F0Y2ggKGUpIHt9XFxyXFxufVxcclxcbmZ1bmN0aW9uIGNoYXB0ZXIodGl0bGUscGljX3VybCxjaGFwdGVyTGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyVXJsLCBkZWZhdWx0T3JkZXIsIGhhc0xpbmUsZG93bmxvYWRsYXp5KSB7XFxyXFxuXFx0dmFyIGxpc3QgPSBjaGFwdGVyTGlzdDtcXHJcXG5cXHR2YXIgb3JpZ2luYWwgPSBbe1xcclxcblxcdFxcdHVybDogTVlfVVJMLFxcclxcblxcdFxcdG9yZGVyOiBkZWZhdWx0T3JkZXJcXHJcXG5cXHR9XTtcXHJcXG5cXHQhZmlsZUV4aXN0KCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpID8gKHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShvcmlnaW5hbCkpKSA6IDA7XFxyXFxuXFx0dmFyIGxvZyA9IEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykpO1xcclxcblxcdGZvciAodmFyIGkgaW4gbG9nKSB7XFxyXFxuXFx0XFx0aWYgKGxvZ1tpXS51cmwgPT0gTVlfVVJMKSB7XFxyXFxuXFx0XFx0XFx0dmFyIG5vdyA9IGk7XFxyXFxuXFx0XFx0XFx0dmFyIG9yZGVyID0gbG9nW2ldLm9yZGVyO1xcclxcblxcdFxcdFxcdGJyZWFrO1xcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFx0XFx0XFx0dmFyIG5vdyA9ICcnO1xcclxcblxcdFxcdFxcdHZhciBvcmRlciA9IGRlZmF1bHRPcmRlcjtcXHJcXG5cXHRcXHR9XFxyXFxuXFx0fVxcclxcblxcdGxldCBvcmRlckl0ZW0gPSB7XFxyXFxuXFx0XFx0dGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxzdHJvbmc+PGZvbnQgY29sb3I9XFxcIiMwOThBQzFcXFwiPicgKyAn56ug6IqC5o6S5bqP4oeFJyArICc8L2ZvbnQ+PC9zdHJvbmc+JyxcXHJcXG5cXHRcXHR1cmw6IE1ZX1VSTCArIGBAbGF6eVJ1bGU9LmpzOnZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTt2YXIgbm93PSdgICsgbm93ICsgYCc7aWYobm93IT0nJyl7dmFyIG5vdz1wYXJzZUludChub3cpO3ZhciBvcmRlcj1sb2dbbm93XS5vcmRlcn1lbHNle3ZhciBub3c9cGFyc2VJbnQobG9nLmxlbmd0aCk7dmFyIG9yZGVyPWAgKyBkZWZhdWx0T3JkZXIgKyBgO2xvZy5wdXNoKHt1cmw6aW5wdXQsb3JkZXI6b3JkZXJ9KTt9aWYobG9nW25vd10ub3JkZXIpe2xvZ1tub3ddLm9yZGVyPTA7fWVsc2V7bG9nW25vd10ub3JkZXI9MTt9O3dyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShsb2cpKTtyZWZyZXNoUGFnZSgpOydoaWtlcjovL2VtcHR5J2AsXFxyXFxuXFx0XFx0Y29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcclxcblxcdH1cXHJcXG5cXHRpZiAoaGFzTGluZSkge1xcclxcblxcdFxcdG9yZGVySXRlbS50aXRsZSA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxzdHJvbmc+PGZvbnQgY29sb3I9XFxcIiMwOThBQzFcXFwiPicgKyAn6ZuG5pWw5o6S5bqP4oeFJyArICc8L2ZvbnQ+PC9zdHJvbmc+JztcXHJcXG5cXHRcXHRvcmRlckl0ZW0uY29sX3R5cGUgPSBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXHJcXG5cXHR9XFxyXFxuXFx0bGV0IGNoYXB0ZXJMaXN0cyA9IGxpc3QubWFwKChpdGVtKT0+KHtcXHJcXG5cXHRcXHR0aXRsZTogcGRmaChpdGVtLFxcXCJhJiZUZXh0XFxcIiksXFxyXFxuXFx0XFx0dXJsOiBwZChpdGVtLFxcXCJhJiZocmVmXFxcIiksXFxyXFxuXFx0fSkpO1xcclxcbmQucHVzaCh7XFxyXFxuXFx0dGl0bGU6ICfigJjigJjigJnigJk8c3Ryb25nPjxmb250IGNvbG9yPSBcXFwiIzA5OEFDMVxcXCI+JyArIFxcXCLkuIvovb3mvKvnlLtcXFwiICsgJzwvZnJvbnQ+PC9zdHJvbmc+JyxcXHJcXG5cXHR1cmw6IFxcXCJoaWtlcjovL3BhZ2UvZG93bmxvYWQudmlldyNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSMjbm9SZWZyZXNoIz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhlxcXCIsXFxyXFxuXFx0Y29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXHJcXG5cXHRleHRyYToge1xcclxcblxcdFxcdGNoYXB0ZXJMaXN0OiBjaGFwdGVyTGlzdHMsXFxyXFxuXFx0XFx0aW5mbzp7XFxyXFxuXFx0XFx0XFx0Ym9va05hbWU6IHRpdGxlLFxcclxcblxcdFxcdFxcdHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcclxcblxcdFxcdFxcdGJvb2tUb3BQaWM6IHBpY191cmwsXFxyXFxuXFx0XFx0XFx0cGFyc2VDb2RlOiBkb3dubG9hZGxhenlcXHJcXG5cXHRcXHR9LFxcclxcblxcdFxcdGRlZmF1bHRWaWV3OlxcXCIxXFxcIlxcclxcblxcdH1cXHJcXG59KTtcXHJcXG5cXHRkLnB1c2goe1xcclxcblxcdFxcdHRpdGxlOiAn4oCY4oCY4oCZ4oCZPHN0cm9uZz48Zm9udCBjb2xvcj0gXFxcIiMwOThBQzFcXFwiPicgKyBcXFwi5pys5Zyw5Lmm5p62XFxcIiArICc8L2Zyb250Pjwvc3Ryb25nPicsXFxyXFxuXFx0XFx0dXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01haW4udmlldz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhlxcXCIsXFxyXFxuXFx0XFx0Y29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXHJcXG5cXHR9KTsgIFxcclxcblxcdGQucHVzaChvcmRlckl0ZW0pO1xcclxcblxcdGQucHVzaCh7Y29sX3R5cGU6ICdsaW5lJ30pO1xcdFxcclxcblxcdHZhciBsaXN0ID0gb3JkZXIgPyBsaXN0IDogbGlzdC5yZXZlcnNlKCk7XFxuXFx0aWYoIWxpc3R8fGxpc3Q9PVxcXCJcXFwiKXtcXHJcXG5cXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdHRpdGxlOiAn5q2k5ryr55S75bey5LiL5p62ISEnLFxcclxcblxcdFxcdFxcdGNvbF90eXBlOiAndGV4dF8xJyxcXHJcXG5cXHRcXHR9KTtcXHJcXG5cXHR9XFxuXFxyXFxuXFx0Zm9yICh2YXIgaSBpbiBsaXN0KSB7XFxyXFxuXFx0XFx0dHJ5IHtcXHJcXG5cXHRcXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiBwZGZoKGxpc3RbaV0sIGNoYXB0ZXJUaXRsZSksXFxyXFxuXFx0XFx0XFx0XFx0dXJsOiBwZChsaXN0W2ldLCBjaGFwdGVyVXJsKSArIGxhenksXFxyXFxuXFx0XFx0XFx0XFx0Y29sX3R5cGU6ICd0ZXh0XzMnXFxyXFxuXFx0XFx0XFx0fSk7XFxyXFxuXFx0XFx0fWNhdGNoIChlKSB7fVxcclxcblxcdH1cXHJcXG59XFxyXFxuXFxyXFxuZnVuY3Rpb24gbGluZShsaW5lTGlzdCwgbGluZVRpdGxlUnVsZSwgdmFyS2V5KSB7XFxyXFxuXFx0bGV0IGxpc3QgPSBsaW5lTGlzdFxcclxcblxcdHZhcktleSA9IHZhcktleSA9PSBudWxsID8gKE1ZX1JVTEUudXJsICsgJyNsaW5lLWluZGV4Jyk6IHZhcktleTtcXHJcXG5cXHRhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKGtleUxpc3QpID0+IHtcXHJcXG5cXHRcXHRmb3IgKGxldCBpIGluIGtleUxpc3QpIHtjbGVhclZhcihrZXlMaXN0W2ldKX1cXHJcXG5cXHR9LCBbdmFyS2V5LCBNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJ10pKVxcclxcblxcdGxldCBsaW5lMFRpdGxlID0gJyc7XFxyXFxuXFx0dHJ5IHtcXHJcXG5cXHRcXHRsaW5lMFRpdGxlID0gcGRmaChsaXN0WzBdLCBsaW5lVGl0bGVSdWxlKS5yZXBsYWNlKFxcXCLnq6DoioLliJfooajvvJpcXFwiLFxcXCJcXFwiKTtcXHJcXG5cXHR9IGNhdGNoIChlKSB7fVxcclxcblxcdGxvZyhNWV9SVUxFLnRpdGxlICsgZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKVxcclxcblxcdGZvciAobGV0IGkgaW4gbGlzdCkge1xcclxcblxcdFxcdHRyeSB7XFxyXFxuXFx0XFx0XFx0bGV0IGxpbmVUaXRsZSA9IHBkZmgobGlzdFtpXSwgbGluZVRpdGxlUnVsZSkucmVwbGFjZShcXFwi56ug6IqC5YiX6KGo77yaXFxcIixcXFwiXFxcIik7XFxyXFxuXFx0XFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHR0aXRsZTogZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJyksIGxpbmUwVGl0bGUpID09PSBsaW5lVGl0bGUgPyBcXFwi5YiH5o2iOuKAmOKAmFxcXCIgKyBsaW5lVGl0bGUrXFxcIlxcXCI6bGluZVRpdGxlK1xcXCLigJjigJg65YiH5o2iXFxcIixcXHJcXG5cXHRcXHRcXHRcXHR1cmw6ICQoKS5sYXp5UnVsZSgodmFyS2V5LCBsaW5lSW5kZXgsIGxpbmVUaXRsZSkgPT4ge1xcclxcblxcdFxcdFxcdFxcdFxcdHB1dFZhcih2YXJLZXksIGxpbmVJbmRleC50b1N0cmluZygpKTtcXHJcXG5cXHRcXHRcXHRcXHRcXHRwdXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKTtcXHJcXG5cXHRcXHRcXHRcXHRcXHRsb2coTVlfUlVMRS50aXRsZSArIGdldFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpKSk7XFxyXFxuXFx0XFx0XFx0XFx0XFx0cmVmcmVzaFBhZ2UoKTtcXHJcXG5cXHRcXHRcXHRcXHRcXHRyZXR1cm4gXFxcInRvYXN0Oi8v5bey5YiH5o2i6IezXFxcIiArIGxpbmVUaXRsZTtcXHJcXG5cXHRcXHRcXHRcXHR9LCB2YXJLZXksIGksIGxpbmVUaXRsZSksXFxyXFxuXFx0XFx0XFx0XFx0Y29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXHJcXG5cXHRcXHRcXHR9KTtcXHJcXG5cXHRcXHR9IGNhdGNoIChlKSB7fVxcclxcblxcdH1cXHJcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuoznuqdb5LqMXVwiLFwicGF0aFwiOlwiY29taWNGdW5jdGlvbkZpbGUuanNcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGNvdmVyKGNvdmVyVGl0bGUsIGNvdmVyVGl0bGUxLCBjb3ZlclRpdGxlMiwgY292ZXJUaXRsZTMsIGNvdmVyRGVzYywgY292ZXJQaWMsIGNvdmVyVXJsLCBoYXNMaW5lKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBjb25zdCBDb2xvciA9IFxcXCIjMTlCODlEXFxcIjtcXG4gICAgICAgIHZhciBkZXNfZGVzYyA9IHBkZmgoaHRtbCwgY292ZXJEZXNjKS5yZXBsYWNlKCfnroDjgIDjgIDku4vvvJonLCAnJykucmVwbGFjZSgn5ryr55S7566A5LuL77yaJywgJycpO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcIiNGQTcyOThcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUpICsgJ1xcXFxuJyArICfigJjigJjigJnigJk8Pjxmb250IGNvbG9yPVxcXCIjNzM0MzM4XFxcIj4nICsgcGRmaChodG1sLCBjb3ZlclRpdGxlMSkgKyAnXFxcXG4nLFxcbiAgICAgICAgICAgIGRlc2M6ICfigJjigJjigJnigJk8Pjxmb250IGNvbG9yPVxcXCIjOTU0QTQ1XFxcIj4nICsgcGRmaChodG1sLCBjb3ZlclRpdGxlMikgKyAnXFxcXG4nICsgJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcIiM5NTRBNDVcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUzKSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwZChodG1sLCBjb3ZlclBpYyksXFxuICAgICAgICAgICAgdXJsOiBjb3ZlclVybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljX2JsdXInXFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICAvL3ZhciBqaiA9IGdldFZhcihcXFwiampzXFxcIiwgXFxcIuaUtui1t1xcXCIpO1xcbiAgICAgICAgLy92YXIgamp1cmwgPSAnaGlrZXI6Ly9lbXB0eUBsYXp5UnVsZT0uanM6Z2V0VmFyKFxcXCJqanNcXFwiKSA9PSBcXFwi5pS26LW3XFxcIj9wdXRWYXIoXFxcImpqc1xcXCIsXFxcIuWxleW8gFxcXCIpOnB1dFZhcihcXFwiampzXFxcIixcXFwi5pS26LW3XFxcIik7XFxcImhpa2VyOi8vZW1wdHlcXFwiJztcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfnroDku4sgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFwiY29sb3I6IzE5Qjg5RFxcXCI+5bGV5byAPjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+JyxcXG4gICAgICAgICAgICBpbWc6IFxcXCJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vbW9yZS8xOTcucG5nXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGpqaWQsIGRlY2lkLCBkZXNfZGVzYykgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoZ2V0VmFyKFxcXCJqanNcXFwiLCBcXFwi5pS26LW3XFxcIikgPT0gXFxcIuaUtui1t1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiampzXFxcIiwgXFxcIuWxleW8gFxcXCIpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGpqaWRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn566A5LuLIDxzbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiMxOUI4OURcXFwiPuaUtui1tz48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U2l6ZTogMTQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZGVjaWRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM4MDgwODBcXFwiPicgKyBkZXNfZGVzYyArICcuLi48L3NwYW4+J1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiampzXFxcIiwgXFxcIuaUtui1t1xcXCIpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGpqaWRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn566A5LuLIDxzbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiMxOUI4OURcXFwiPuWxleW8gD48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U2l6ZTogMTQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZGVjaWRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM4MDgwODBcXFwiPicgKyBkZXNfZGVzYy5zdWJzdHIoMCwgMzApICsgJy4uLjwvc3Bhbj4nXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgfSwgTVlfUlVMRSArIFxcXCJfamppZFxcXCIsIE1ZX1JVTEUgKyBcXFwiX2RlY2lkXFxcIiwgZGVzX2Rlc2MpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfUlVMRSArIFxcXCJfamppZFxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFwiY29sb3I6IzgwODA4MFxcXCI+JyArIGRlc19kZXNjLnN1YnN0cigwLCAzMCkgKyAnLi4uPC9zcGFuPicsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXG4gICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFICsgXFxcIl9kZWNpZFxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICAgICAgfSlcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICAgICAgfSlcXG4gICAgfSBjYXRjaCAoZSkge31cXG59XFxuXFxuZnVuY3Rpb24gZG93bihUaXRsZSwgY2hhcHRlclBpYywgbGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyTGluZSwgZG93bmxvYWRsYXp5KSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZG9MaXN0ID0gbGlzdC5tYXAoKGl0ZW0pID0+ICh7XFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwgY2hhcHRlclRpdGxlKSxcXG4gICAgICAgICAgICB1cmw6IHBkKGl0ZW0sIGNoYXB0ZXJMaW5lKSxcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICMxYWFkMTlcXFwiPuS4i+i9vea8q+eUu/CflLk8L3NwYW4+PC9iPicsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBkb0xpc3QsXFxuICAgICAgICAgICAgICAgIGluZm86IHtcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tOYW1lOiBwZGZoKGh0bWwsIFRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgYm9va1RvcFBpYzogcGQoaHRtbCwgY2hhcHRlclBpYyksXFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNvZGU6IGRvd25sb2FkbGF6eVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcIjFcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXG4gICAgICAgIH0pO1xcbiAgICB9IGNhdGNoIChlKSB7fVxcbn1cXG5cXG5mdW5jdGlvbiBjaGFwdGVyKGNoYXB0ZXJMaXN0LCBjaGFwdGVyVGl0bGUsIGNoYXB0ZXJVcmwsIGRlZmF1bHRPcmRlciwgaGFzTGluZSkge1xcbiAgICB2YXIgbGlzdCA9IGNoYXB0ZXJMaXN0O1xcbiAgICB2YXIgb3JpZ2luYWwgPSBbe1xcbiAgICAgICAgdXJsOiBNWV9VUkwsXFxuICAgICAgICBvcmRlcjogZGVmYXVsdE9yZGVyXFxuICAgIH1dO1xcbiAgICAhZmlsZUV4aXN0KCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpID8gKHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShvcmlnaW5hbCkpKSA6IDA7XFxuICAgIHZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTtcXG4gICAgZm9yICh2YXIgaSBpbiBsb2cpIHtcXG4gICAgICAgIGlmIChsb2dbaV0udXJsID09IE1ZX1VSTCkge1xcbiAgICAgICAgICAgIHZhciBub3cgPSBpO1xcbiAgICAgICAgICAgIHZhciBvcmRlciA9IGxvZ1tpXS5vcmRlcjtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdmFyIG5vdyA9ICcnO1xcbiAgICAgICAgICAgIHZhciBvcmRlciA9IGRlZmF1bHRPcmRlcjtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgb3JkZXJJdGVtID0ge1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxmb250IGNvbG9yPVxcXCIjZjM3MzM1XFxcIj4nICsgJ+eroOiKguaOkuW6j+KHhScgKyAnPC9mb250PicsXFxuICAgICAgICB1cmw6IE1ZX1VSTCArIGBAbGF6eVJ1bGU9LmpzOnZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTt2YXIgbm93PSdgICsgbm93ICsgYCc7aWYobm93IT0nJyl7dmFyIG5vdz1wYXJzZUludChub3cpO3ZhciBvcmRlcj1sb2dbbm93XS5vcmRlcn1lbHNle3ZhciBub3c9cGFyc2VJbnQobG9nLmxlbmd0aCk7dmFyIG9yZGVyPWAgKyBkZWZhdWx0T3JkZXIgKyBgO2xvZy5wdXNoKHt1cmw6aW5wdXQsb3JkZXI6b3JkZXJ9KTt9aWYobG9nW25vd10ub3JkZXIpe2xvZ1tub3ddLm9yZGVyPTA7fWVsc2V7bG9nW25vd10ub3JkZXI9MTt9O3dyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShsb2cpKTtyZWZyZXNoUGFnZSgpOydoaWtlcjovL2VtcHR5J2AsXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH1cXG4gICAgaWYgKGhhc0xpbmUpIHtcXG4gICAgICAgIG9yZGVySXRlbS50aXRsZSA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxmb250IGNvbG9yPVxcXCIjZjM3MzM1XFxcIj4nICsgJ+mbhuaVsOaOkuW6j+KHhScgKyAnPC9mb250Pic7XFxuICAgICAgICBvcmRlckl0ZW0uY29sX3R5cGUgPSBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgfVxcbiAgICBkLnB1c2gob3JkZXJJdGVtKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnbGluZSdcXG4gICAgfSk7XFxuXFxuICAgIHZhciBsaXN0ID0gb3JkZXIgPyBsaXN0IDogbGlzdC5yZXZlcnNlKCk7XFxuICAgIGZvciAobGV0IGkgaW4gbGlzdCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChsaXN0W2ldLCBjaGFwdGVyVGl0bGUpLFxcbiAgICAgICAgICAgICAgICB1cmw6IHBkKGxpc3RbaV0sIGNoYXB0ZXJVcmwpICsgbGF6eSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHBkZmgobGlzdFswXSwgY2hhcHRlclRpdGxlKS5sZW5ndGggPiA2ID8gJ3RleHRfMicgOiAndGV4dF8zJyxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gbGluZShsaW5lTGlzdCwgbGluZVRpdGxlUnVsZSwgdmFyS2V5KSB7XFxuICAgIGxldCBsaXN0ID0gbGluZUxpc3RcXG4gICAgdmFyS2V5ID0gdmFyS2V5ID09IG51bGwgPyAoTVlfUlVMRS51cmwgKyAnI2xpbmUtaW5kZXgnKSA6IHZhcktleTtcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChrZXlMaXN0KSA9PiB7XFxuICAgICAgICBmb3IgKGxldCBpIGluIGtleUxpc3QpIHtcXG4gICAgICAgICAgICBjbGVhclZhcihrZXlMaXN0W2ldKVxcbiAgICAgICAgfVxcblxcbiAgICB9LCBbdmFyS2V5LCBNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJ10pKVxcbiAgICBsZXQgbGluZTBUaXRsZSA9ICcnXFxuICAgIHRyeSB7XFxuICAgICAgICBsaW5lMFRpdGxlID0gcGRmaChsaXN0WzBdLCBsaW5lVGl0bGVSdWxlKTtcXG4gICAgfSBjYXRjaCAoZSkge31cXG4gICAgbG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpXFxuICAgIGZvciAobGV0IGkgaW4gbGlzdCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgbGluZVRpdGxlID0gcGRmaChsaXN0W2ldLCBsaW5lVGl0bGVSdWxlKTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJyksIGxpbmUwVGl0bGUpID09PSBsaW5lVGl0bGUgPyBcXFwi5YiH5o2iOuKAmOKAmFxcXCIgKyBsaW5lVGl0bGUgKyBcXFwiXFxcIiA6IGxpbmVUaXRsZSArIFxcXCLigJjigJg65YiH5o2iXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKHZhcktleSwgbGluZUluZGV4LCBsaW5lVGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcih2YXJLZXksIGxpbmVJbmRleC50b1N0cmluZygpKVxcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKE1ZX1JVTEUudXJsKVxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJyksIGxpbmVUaXRsZSlcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhNWV9SVUxFLnRpdGxlICsgZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKVxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIh+aNouiHs1xcXCIgKyBsaW5lVGl0bGVcXG4gICAgICAgICAgICAgICAgfSwgdmFyS2V5LCBpLCBsaW5lVGl0bGUpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgfVxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxuICAgICAgICAgICAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6QW+WMhV1cIixcInBhdGhcIjpcImJ6anNcIixcInJ1bGVcIjpcInZhciDmvKvnlLvop6PmnpAgPSAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgdmFyIGlkID0gdHJ1ZTtcXG4gICAgdmFyIGNvZGUgPSByZXF1ZXN0KGlucHV0KVxcbiAgICB2YXIgcGljcyA9IFtdO1xcbiAgICB2YXIgdG9fUmVwZWF0ID0gZmFsc2U7XFxuXFxuXFxuICAgIHdoaWxlIChpZCkge1xcbiAgICAgICAgcGRmYShjb2RlLCBcXFwiLmNoYXB0ZXItbWFpbiYmYW1wLWltZ1xcXCIpXFxuICAgICAgICAgICAgLmZvckVhY2goZGF0YSA9PiBwaWNzLnB1c2gocGRmaChkYXRhLCBcXFwiYW1wLWltZyYmc3JjXFxcIikgKyAnQFJlZmVyZXI9aHR0cHM6Ly9jbi5iYW96aW1oLmNvbS8nKSk7XFxuICAgICAgICB2YXIgbmV4dF9QYWdlID0gcGRmaChjb2RlLCBcXFwiLm5leHRfY2hhcHRlciwtMSYmSHRtbFxcXCIpXFxuICAgICAgICBpZiAobmV4dF9QYWdlLmluY2x1ZGVzKCfkuIvkuIDpobUnKSkge1xcbiAgICAgICAgICAgIGNvZGUgPSByZXF1ZXN0KHBkZmgobmV4dF9QYWdlLCBcXFwiYSYmaHJlZlxcXCIpKVxcbiAgICAgICAgICAgIHRvX1JlcGVhdCA9IHRydWU7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlkID0gZmFsc2U7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgLy/ljrvpmaTph43lpI3lm77niYdcXG4gICAgaWYgKHRvX1JlcGVhdCkge1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaWNzLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgd2hpbGUgKHBpY3MuaW5kZXhPZihwaWNzW2ldLCBpICsgMSkgIT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgcGljcy5zcGxpY2UocGljcy5pbmRleE9mKHBpY3NbaV0sIGkgKyAxKSwgMSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIiArIHBpY3Muam9pbihcXFwiJiZcXFwiKTtcXG59KVxcblxcbmxldCBsYXp5ID0gYEBsYXp5UnVsZT0uanM6YCArIOa8q+eUu+ino+aekDtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWKqOaAgVvkuoxdXCIsXCJwYXRoXCI6XCJkdGZsXCIsXCJydWxlXCI6XCJjb25zdCBlbXB0eSA9IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcblxcbnRyeSB7XFxuICAgIHZhciBjYXRlZ29yaWVzID0gcGRmYShodG1sLCDlpKfnsbvlrprkvY0pLmNvbmNhdChwZGZhKGh0bWwsIOaLvOaOpeWIhuexuykpXFxufSBjYXRjaCAoZSkge1xcbiAgICB2YXIgY2F0ZWdvcmllcyA9IHBkZmEoaHRtbCwg5aSn57G75a6a5L2NKVxcbn1cXG5cXG5sZXQgaW5pdF9jYXRlID0gW11cXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcXG4gICAgaW5pdF9jYXRlLnB1c2goXFxcIjBcXFwiKVxcbn1cXG5cXG5jb25zdCBmb2xkID0gZ2V0VmFyKE1ZX1JVTEUuZ3JvdXAsIFxcXCIxXFxcIilcXG5jb25zdCBjYXRlX3RlbXBfanNvbiA9IGdldFZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShpbml0X2NhdGUpKVxcbmNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoY2F0ZV90ZW1wX2pzb24pXFxuXFxuaWYgKHBhcnNlSW50KHBhZ2UpID09PSAxKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZm9sZCA9PT0gJzEnID8gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI0ZGMDAwMFxcXCI+4oioPC9zcGFuPjwvYj4nIDogJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogIzFhYWQxOVxcXCI+4oinPC9zcGFuPjwvYj4nLFxcbiAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGZvbGQpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS5ncm91cCwgZm9sZCA9PT0gJzEnID8gJzAnIDogJzEnKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgZm9sZCksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICB9KVxcblxcblxcbiAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcbiAgICAgICAgbGV0IHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NKTtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0ZW0sIOWIhuexu+agh+mimClcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICcgKyDliIbnsbvpopzoibIgKyAnXFxcIj4nICsgdGl0bGUgKyAnPC9zcGFuPjwvYj4nIDogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGQoaXRlbSwg5YiG57G76ZO+5o6lKSArICcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3X2NhdGUgPSBbXVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXAuZm9yRWFjaCgoY2F0ZSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NhdGUucHVzaChpbmRleCA9PT0gMCA/IHBhcmFtcy5rZXkudG9TdHJpbmcoKSA6IFxcXCIwXFxcIilcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShuZXdfY2F0ZSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKE1ZX1JVTEUudXJsLCBpbnB1dClcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZm9sZCA9PT0gJzEnKSB7XFxuICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXRlbSwg5YiG57G75qCH6aKYKVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogJyArIOWIhuexu+minOiJsiArICdcXFwiPicgKyB0aXRsZSArICc8L3NwYW4+PC9iPicgOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJChwZChpdGVtLCDliIbnsbvpk77mjqUpICsgJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShwYXJhbXMuY2F0ZV90ZW1wKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS51cmwsIGlucHV0KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfSlcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliqjmgIFb5LiAXVwiLFwicGF0aFwiOlwiY2F0ZWdvcmllcy1oZWFkZXJcIixcInJ1bGVcIjpcImNvbnN0IHN5bWJvbE1hcCA9IHtcXG4gICAgLy8gY2hlY2tQYXJhbXM6IFN5bWJvbCgnY2hlY2tQYXJhbXMnKSxcXG4gICAgbUxheW91dDogU3ltYm9sKCdtTGF5b3V0JyksXFxuICAgIHRydWVfdXJsOiBTeW1ib2woJ3RydWVfdXJsJyksXFxuICAgIG1QYWdlOiBTeW1ib2woJ21QYWdlJyksXFxuICAgIHNyYzogU3ltYm9sKCdzcmMnKSxcXG4gICAgcnVsZU9iakxpc3Q6IFN5bWJvbCgncnVsZU9iakxpc3QnKSxcXG4gICAgbUZvbGQ6IFN5bWJvbCgnbUZvbGQnKSxcXG4gICAgbUZvbGRJbm5lckVuYWJsZTogU3ltYm9sKCdtRm9sZElubmVyRW5hYmxlJyksXFxuICAgIG1Gb2xkSW5kZXg6IFN5bWJvbCgnbUZvbGRJbmRleCcpLFxcbiAgICBtRm9sZExheW91dDogU3ltYm9sKCdtRm9sZExheW91dCcpLFxcbiAgICBtQ29sb3I6IFN5bWJvbCgnbUNvbG9yJyksXFxuICAgIG1UYWc6IFN5bWJvbCgnbVRhZycpLFxcbn1cXG5cXG5mdW5jdGlvbiBDYXRlZ29yaWVzSGVhZGVyKGNvbG9yKSB7XFxuICAgIC8vICd1c2Ugc3RyaWN0JztcXG4gICAgLy8gLi4uXFxuICAgIC8vIHRoaXNbc3ltYm9sTWFwLmxpc3RSdWxlXSA9IFtdXFxuICAgIC8vIHRoaXNbc3ltYm9sTWFwLnN1Ykxpc3RSdWxlXSA9IFtdXFxuICAgIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gPSBjb2xvciB8fCBcXFwiI0ZBNzI5OFxcXCI7XFxuICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XSA9IFtdXFxuICAgIHRoaXMuVkFSTUFQID0ge1xcbiAgICAgICAgQ0FURUdPUlk6IFxcXCJoZWFkZXIuY2F0ZWdvcnlcXFwiLFxcbiAgICAgICAgVVJMOiBcXFwiaGVhZGVyLnVybFxcXCIsXFxuICAgICAgICBGT0xEOiBcXFwiaGVhZGVyLmZvbGRcXFwiLFxcbiAgICB9XFxuICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XSA9IHtcXG4gICAgICAgIGluamVjdEluZGV4OiAxXFxuICAgIH1cXG4gICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gPSAxXFxufVxcblxcbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcmllc0hlYWRlci5wcm90b3R5cGUsIHtcXG4gICAgLy8gT3ZlcnJpZGUg5p6E6YCg5pa55rOV77yM55u45b2T5LqOIGZ1bmN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICguLi4pID0+IHsuLi5977yMbmV3IGZ1bmN0aW9uKCkg55qE5pe25YCZ5Lya6Ieq5Yqo5omn6KGMXFxuICAgIGNvbnN0cnVjdG9yOiBDYXRlZ29yaWVzSGVhZGVyLFxcbiAgICAvLyDlrprkuYnnp4HmnInmlrnms5VcXG4gICAgVkVSU0lPTjogMjAyMTEyMDExOTAwLFxcbiAgICBjaGVja1BhcmFtcygpIHtcXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAubUxheW91dF0pIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+iwg+eUqCBsYXlvdXQoZCkg5Lyg5YWl5b2T5YmN55WM6Z2iXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghKHRoaXNbc3ltYm9sTWFwLnNyY10gfHwgdGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+36LCD55SoIHRydWVVcmwodXJsKSDkvKDlhaXlvZPliY3liIbnsbvnmoTpk77mjqXmiJbosIPnlKggaHRtbChtSHRtbCkg5Lyg5YWl5b2T5YmN5YiG57G76aG16Z2i55qE5rqQ56CBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAubVBhZ2VdKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fosIPnlKggcGFnZShtUGFnZSkg5Lyg5YWl5b2T5YmN6aG15pWwXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoIDwgMSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+36LCD55So55u45YWz5pa55rOV5Lyg5YWl5a6a5L2N6KeE5YiZXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAubUZvbGRdKSB7XFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzAnXFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGxheW91dChtTGF5b3V0KSB7XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XSA9IG1MYXlvdXRcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIHRydWVVcmwodXJsKSB7XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC50cnVlX3VybF0gPSB1cmxcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIHBhZ2UobVBhZ2UpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgKG1QYWdlKSA9PT0gJ3N0cmluZycpIHtcXG4gICAgICAgICAgICBtUGFnZSA9IHBhcnNlSW50KG1QYWdlKVxcbiAgICAgICAgfVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubVBhZ2VdID0gbVBhZ2VcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIGh0bWwobVNyYykge1xcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAuc3JjXSA9IG1TcmNcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIGxpc3QocnVsZSkge1xcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJsaXN0KHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gW3t9XVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLmxpc3RSdWxlID0gcnVsZVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSA9IHJ1bGVcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIHN1Ykxpc3QocnVsZSkge1xcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJzdWJMaXN0KHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0gfHwgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgJiYgIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10pKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7flhYjosIPnlKggbGlzdChydWxlKSDmiJYg5LiA57qn5YiG57G7KHJ1bGUpIOWumuS9jeS4gOe6p+WIhuexu1xcXCIpXFxuICAgICAgICB9XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0uc3ViTGlzdFJ1bGUgPSBydWxlXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+WtkOWIhuexuyddID0gcnVsZVxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgdGl0bGUocnVsZSkge1xcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJ0aXRsZShydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdIHx8ICghdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLmxpc3RSdWxlICYmICF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+S4gOe6p+WIhuexuyddKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35YWI6LCD55SoIGxpc3QocnVsZSkg5oiWIOS4gOe6p+WIhuexuyhydWxlKSDlrprkvY3kuIDnuqfliIbnsbtcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnRpdGxlUnVsZSA9IHJ1bGVcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5YiG57G75qCH6aKYJ10gPSB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0udGl0bGVSdWxlXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICB1cmwocnVsZSkge1xcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJ1cmwocnVsZSkgYWRkKHJ1bGVPYmopIOWPquiDveS6jOmAieS4gO+8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS51cmxSdWxlID0gcnVsZVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfliIbnsbvpk77mjqUnXSA9IHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS51cmxSdWxlXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICAvKipcXG4gICAgICog5piv5ZCm5byA5ZCv5oqY5Y+g5Yqf6IO9XFxuICAgICAqXFxuICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUg6KGo56S65byA5ZCv77yMZmFsc2Ug6KGo56S656aB55SoXFxuICAgICAqIEByZXR1cm5zIHtDYXRlZ29yaWVzSGVhZGVyfVxcbiAgICAgKi9cXG4gICAgZm9sZElubmVyKGVuYWJsZWQpIHtcXG4gICAgICAgIGlmICghKHR5cGVvZiAoZW5hYmxlZCkgPT09ICdib29sZWFuJykpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+S8oOWFpSB0cnVlIOaIliBmYWxzZSDooajnpLrlvIDlkK/miJblhbPpl63mipjlj6Dlip/og73vvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbm5lckVuYWJsZV0gPSBlbmFibGVkXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICAvKipcXG4gICAgICog5LuO56ysIGluZGV4IOihjOW8gOWni+aKmOWPoFxcbiAgICAgKlxcbiAgICAgKiBAcGFyYW0gaW5kZXgg5byA5aeL5oqY5Y+g55qE6KGM5pWwXFxuICAgICAqIEByZXR1cm5zIHtDYXRlZ29yaWVzSGVhZGVyfVxcbiAgICAgKi9cXG4gICAgZm9sZEluZGV4KGluZGV4KSB7XFxuICAgICAgICBpZiAoISh0eXBlb2YgKGluZGV4KSA9PT0gJ251bWJlcicpKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLlvIDlp4vmipjlj6DooYzor7fkvKDlhaXmlbDlrZfvvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGluZGV4IDwgMSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5byA5aeL5oqY5Y+g6KGM6K+35Lyg5YWl5aSn5LqOIDAg55qE5pW05pWw77yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5kZXhdID0gaW5kZXggfHwgMTtcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIC8qKlxcbiAgICAgKiDmipjlj6DmjInpkq7nmoTnlYzpnaJcXG4gICAgICpcXG4gICAgICogQHBhcmFtIGxheW91dCDkuI4gZC5wdXNoIOe7k+aehOS4gOiHtO+8jFxcbiAgICAgKiAgICAgICAg5L6L77yaeyB0aXRsZTpcXFwi5qCH6aKYMVxcXCIsIHVybDpcXFwieHh4XFxcIiwgY29sX3R5cGU6XFxcInNjcm9sbF9idXR0b25cXFwiIH07XFxuICAgICAqICAgICAgICDlj4LmlbDph4fnlKjlj6/pgInopobnm5bmqKHlvI/vvIzkuI3lhpnnmoTlj4LmlbDliJnkvb/nlKjpu5jorqQ7XFxuICAgICAqICAgICAgICDmr5TlpoLkvKDlhaUgeyBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIiB977yM6YKj5pyA57uI57uT5p6c5bCx5pivIHsgdGl0bGU6XFxcIuagh+mimDFcXFwiLCB1cmw6XFxcInh4eFxcXCIsIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiIH1cXG4gICAgICogQHJldHVybnMge0NhdGVnb3JpZXNIZWFkZXJ9XFxuICAgICAqL1xcbiAgICBmb2xkTGF5b3V0KGxheW91dCkge1xcbiAgICAgICAgaWYgKHR5cGVvZiBsYXlvdXQgPT09ICdvYmplY3QnKSB7XFxuICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhsYXlvdXQpXFxuICAgICAgICAgICAgbGV0IGluamVjdEluZGV4ID0gbGF5b3V0LmluamVjdEluZGV4IHx8IGxheW91dFsn5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGMJ11cXG4gICAgICAgICAgICBpZiAobGF5b3V0LnRpdGxlIHx8IGxheW91dC51cmwgfHwgbGF5b3V0LmNvbF90eXBlIHx8IGluamVjdEluZGV4KSB7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXVxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdW2tleV0gPSBsYXlvdXRba2V5XTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl5q2j56Gu55qE5oqY5Y+g55WM6Z2i5YWD57Sg77yBXFxcIilcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8gaW5qZWN0SW5kZXgg5oqY5Y+g5oyJ6ZKu5o+S5YWl56ysIGluamVjdEluZGV4IOihjFxcbiAgICAgICAgICAgIGlmIChpbmplY3RJbmRleCkge1xcbiAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgKGluamVjdEluZGV4KSA9PT0gJ251bWJlcicpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuaKmOWPoOaMiemSruaPkuWFpeihjOivt+S8oOWFpeaVsOWtl++8gVxcXCIpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdEluZGV4IDwgMSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLmipjlj6DmjInpkq7mj5LlhaXooYzor7fkvKDlhaXlpKfkuo4gMCDnmoTmlbTmlbDvvIFcXFwiKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChpbmplY3RJbmRleCA+IHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5kZXhdKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuaKmOWPoOaMiemSruaPkuWFpeihjOS4jeW+l+Wkp+S6juaYvuekuuaKmOWPoOihjOaVsO+8geivt+iwg+eUqCAuZm9sZEluZGV4KGluZGV4KSDmiJYgLuesrOWHoOihjOW8gOWni+aKmOWPoChpbmRleCkg5Lyg5YWl5q2j56Gu55qE5pi+56S65oqY5Y+g6KGM5pWwXFxcIilcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0uaW5qZWN0SW5kZXggPSBpbmplY3RJbmRleCB8fCAxO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fkvKDlhaXmraPnoa7nmoTmipjlj6DnlYzpnaLlhYPntKDvvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIC8vIOW9k+WJjeaYr+WQpuaKmOWPoFxcbiAgICBmb2xkKGlzRm9sZCkge1xcbiAgICAgICAgaWYgKHR5cGVvZiAoaXNGb2xkKSA9PT0gJ3N0cmluZycpIHtcXG4gICAgICAgICAgICBpc0ZvbGQgPSBpc0ZvbGQgPT09ICcxJ1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGlzRm9sZCkge1xcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9ICcxJztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzAnO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgY29sb3IobUNvbG9yKSB7XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tQ29sb3JdID0gbUNvbG9yXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICB0YWcobVRhZykge1xcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubVRhZ10gPSBtVGFnXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBhZGQocnVsZU9iaikge1xcbiAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KHJ1bGVPYmopKVxcbiAgICAgICAgaWYgKHJ1bGVPYmouY29uc3RydWN0b3IgPT09IEFycmF5KSB7XFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmNvbmNhdChydWxlT2JqKVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ucHVzaChydWxlT2JqKVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGV2YWxKU1J1bGUoaXRlbSwganNSdWxlKSB7XFxuICAgICAgICBsZXQgcnVsZSA9IGpzUnVsZS5yZXBsYWNlKFxcXCJAanM6XFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICBydWxlID0gcnVsZS50cmltKClcXG4gICAgICAgIC8vIGxvZygkLnN0cmluZ2lmeShydWxlKSlcXG4gICAgICAgIGxldCBpbnB1dCA9IGl0ZW1cXG4gICAgICAgIGlmIChydWxlLnN0YXJ0c1dpdGgoXFxcIihcXFwiKSkge1xcbiAgICAgICAgICAgIGV2YWwoJ3Jlc3VsdCA9ICcgKyBydWxlKVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiDov5jljp/miJAgJC50b1N0cmluZyguLi4pIOeahOacgOe7iOe7k+aenO+8jOi+vuWIsOacgOe7iOWkhOeQhuaWueW8j+i3n+S4iumdoueahCBpZiDkuIDoh7TnmoTnm67nmoRcXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBldmFsKCdyZXN1bHQgPSAnICsgJygoKSA9PiB7JyArIHJ1bGUgKyAnfSkoKScpXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gKHJlc3VsdCB8fCAnJylcXG4gICAgfSxcXG4gICAgZ2V0VGl0bGUoc3JjLCBjYXRlZ29yeSkge1xcbiAgICAgICAgbGV0IHRpdGxlID0gJydcXG4gICAgICAgIGxldCB0aXRsZVJ1bGUgPSBjYXRlZ29yeS50aXRsZVJ1bGUgfHwgJ2EmJlRleHQnXFxuICAgICAgICBpZiAodGl0bGVSdWxlLnN0YXJ0c1dpdGgoXFxcIkBqczpcXFwiKSkge1xcbiAgICAgICAgICAgIHRpdGxlID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdGl0bGVSdWxlKVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbChzcmMsIHRpdGxlUnVsZSlcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aXRsZSB8fCBcXFwiXFxcIjtcXG4gICAgfSxcXG4gICAgZ2V0VXJsKHNyYywgY2F0ZWdvcnkpIHtcXG4gICAgICAgIGxldCB1cmwgPSAnJ1xcbiAgICAgICAgbGV0IHVybFJ1bGUgPSBjYXRlZ29yeS51cmxSdWxlIHx8ICdhJiZocmVmJ1xcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxSdWxlID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgIGxldCBtVXJsUnVsZSA9IHVybFJ1bGUucnVsZSB8fCB1cmxSdWxlWyfop6PmnpDop4TliJknXSB8fCAnYSYmaHJlZic7XFxuICAgICAgICAgICAgaWYgKG1VcmxSdWxlLnN0YXJ0c1dpdGgoXFxcIkBqczpcXFwiKSkge1xcbiAgICAgICAgICAgICAgICB1cmwgPSB0aGlzLmV2YWxKU1J1bGUoc3JjLCBtVXJsUnVsZSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlID0gcGFyc2VEb207XFxuICAgICAgICAgICAgICAgIGlmICh1cmxSdWxlLnBhcnNlT3B0aW9uKSB7XFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHVybFJ1bGUucGFyc2VPcHRpb24pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwYXJzZURvbVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGRcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwYXJzZURvbUZvckh0bWxcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBkZmhcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tRm9ySHRtbDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxSdWxlW1xcXCLop6PmnpDmlrnms5VcXFwiXSkge1xcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh1cmxSdWxlW1xcXCLop6PmnpDmlrnms5VcXFwiXSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBhcnNlRG9tXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwZFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb207XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBhcnNlRG9tRm9ySHRtbFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGRmaFxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb21Gb3JIdG1sO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlKHNyYywgbVVybFJ1bGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodXJsUnVsZS5kZWFsVXJsKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHVybFJ1bGUuZGVhbFVybCh1cmwpXFxuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxSdWxlWyfkuozmrKHlpITnkIYnXSkge1xcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmxSdWxlWyfkuozmrKHlpITnkIYnXSh1cmwpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpZiAodXJsUnVsZS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdXJsUnVsZSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gcGFyc2VEb20oc3JjLCB1cmxSdWxlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdXJsIHx8IFxcXCJcXFwiO1xcbiAgICB9LFxcbiAgICBidWlsZCgpIHtcXG4gICAgICAgIC8vIOajgOa1i+aYr+WQpuS8oOWFpemcgOimgeeahOWPguaVsFxcbiAgICAgICAgdGhpcy5jaGVja1BhcmFtcygpXFxuICAgICAgICAvLyDmr4/kuIDkuKrliIbnsbvnmoTllK/kuIDmoIfor4ZcXG4gICAgICAgIGxldCBtVGFnID0gdGhpc1tzeW1ib2xNYXAubVRhZ10gfHwgXFxcIlxcXCJcXG4gICAgICAgIC8v57+76aG1IOmcgOimgeagueaNruWunumZheabv+aNolxcbiAgICAgICAgY29uc3QgaHRtbCA9IHRoaXNbc3ltYm9sTWFwLnNyY10gfHwgcmVxdWVzdCh0aGlzW3N5bWJvbE1hcC50cnVlX3VybF0pXFxuICAgICAgICBjb25zdCBlbXB0eSA9IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgLy/ojrflj5bliJfooahcXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLm1hcChydWxlT2JqID0+IHtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IFtdXFxuICAgICAgICAgICAgbGV0IGxpc3RSdWxlID0gcnVsZU9iai5saXN0UnVsZSB8fCBydWxlT2JqW1xcXCLkuIDnuqfliIbnsbtcXFwiXVxcbiAgICAgICAgICAgIGlmIChsaXN0UnVsZS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KGxpc3RSdWxlKSlcXG4gICAgICAgICAgICAgICAgbGlzdCA9IHRoaXMuZXZhbEpTUnVsZShodG1sLCBsaXN0UnVsZSlcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsaXN0ID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCBsaXN0UnVsZSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8gbG9nKGxpc3QpXFxuICAgICAgICAgICAgbGlzdC5tYXAoY2F0ZWdvcnkgPT4ge1xcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgbGlzdDogY2F0ZWdvcnksXFxuICAgICAgICAgICAgICAgICAgICBzdWJMaXN0UnVsZTogcnVsZU9iai5zdWJMaXN0UnVsZSB8fCBydWxlT2JqW1xcXCLlrZDliIbnsbtcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlUnVsZTogcnVsZU9iai50aXRsZVJ1bGUgfHwgcnVsZU9ialtcXFwi5YiG57G75qCH6aKYXFxcIl0sXFxuICAgICAgICAgICAgICAgICAgICB1cmxSdWxlOiBydWxlT2JqLnVybFJ1bGUgfHwgcnVsZU9ialtcXFwi5YiG57G76ZO+5o6lXFxcIl0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9KVxcblxcbiAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KGNhdGVnb3JpZXMpKVxcblxcbiAgICAgICAgbGV0IGluaXRfY2F0ZSA9IFtdXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcXG4gICAgICAgICAgICBpbml0X2NhdGUucHVzaChcXFwiMFxcXCIpXFxuICAgICAgICB9XFxuXFxuICAgICAgICBjb25zdCBjYXRlX3RlbXBfanNvbiA9IGdldE15VmFyKG1UYWcgKyB0aGlzLlZBUk1BUC5DQVRFR09SWSwgSlNPTi5zdHJpbmdpZnkoaW5pdF9jYXRlKSlcXG4gICAgICAgIGNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoY2F0ZV90ZW1wX2pzb24pXFxuXFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAubVBhZ2VdID09PSAxKSB7XFxuXFxuICAgICAgICAgICAgY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeSwgaW5kZXgpID0+IHtcXG5cXG4gICAgICAgICAgICAgICAgLy8g5oqY5Y+gIFVJXFxuICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5tRm9sZElubmVyRW5hYmxlXSAmJiB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0uaW5qZWN0SW5kZXggPT09IChpbmRleCsxKSkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRMYXlvdXQgPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS50aXRsZSB8fCAodGhpc1tzeW1ib2xNYXAubUZvbGRdID09PSAnMScgPyAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjRkYwMDAwXFxcIj7iiKg8L3NwYW4+PC9iPicgOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjMWFhZDE5XFxcIj7iiKc8L3NwYW4+PC9iPicpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLnVybCB8fCAkKFxcXCJoaWtlcjovL2VtcHR5I25vSGlzdG9yeSNcXFwiKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy5tVGFnICsgcGFyYW1zLlZBUk1BUC5GT0xELCBnZXRNeVZhcihwYXJhbXMubVRhZyArIHBhcmFtcy5WQVJNQVAuRk9MRCwgcGFyYW1zLmlzRm9sZCkgPT09ICcxJyA/ICcwJyA6ICcxJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGFnOiBtVGFnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZvbGQ6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSTUFQOiB0aGlzLlZBUk1BUFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0uY29sX3R5cGUgfHwgXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaChmb2xkTGF5b3V0KVxcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgIC8v5YW35L2T5YiX6KGo5LiL55qE5YiG57G7XFxuICAgICAgICAgICAgICAgIGxldCBzdWJfY2F0ZWdvcmllcyA9IFtdO1xcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuc3ViTGlzdFJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHRoaXMuZXZhbEpTUnVsZShjYXRlZ29yeS5saXN0LCBjYXRlZ29yeS5zdWJMaXN0UnVsZSlcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzID0gcGFyc2VEb21Gb3JBcnJheShjYXRlZ29yeS5saXN0LCBjYXRlZ29yeS5zdWJMaXN0UnVsZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5kZXhdIHx8IDEpKSB7XFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLmdldFRpdGxlKGl0ZW0sIGNhdGVnb3J5KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmdldFVybChpdGVtLCBjYXRlZ29yeSlcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxmb250IGNvbG9yPScgKyB0aGlzW3N5bWJvbE1hcC5tQ29sb3JdICsgJz4nICsgdGl0bGUgKyAnIDwvZm9udD48L2I+JyA6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3X2NhdGUgPSBbXVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5pbmRleCA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXAuZm9yRWFjaCgoY2F0ZSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NhdGUucHVzaChpbmRleCA9PT0gMCA/IHBhcmFtcy5rZXkudG9TdHJpbmcoKSA6IFxcXCIwXFxcIilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5DQVRFR09SWSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmluZGV4ID09PSAwID8gbmV3X2NhdGUgOiBwYXJhbXMuY2F0ZV90ZW1wKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy50YWcgKyBwYXJhbXMuVkFSTUFQLlVSTCwgaW5wdXQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUk1BUDogdGhpcy5WQVJNQVAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IG1UYWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXNbc3ltYm9sTWFwLm1QYWdlXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1tzeW1ib2xNYXAubUZvbGRdID09PSAnMCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbSwgY2F0ZWdvcnkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuZ2V0VXJsKGl0ZW0sIGNhdGVnb3J5KVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZToga2V5LnRvU3RyaW5nKCkgPT09IGNhdGVfdGVtcFtpbmRleF0gPyAn4oCc4oCc4oCd4oCdPGI+PGZvbnQgY29sb3I9JyArIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gKyAnPicgKyB0aXRsZSArICcgPC9mb250PjwvYj4nIDogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy5jYXRlX3RlbXApKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuVVJMLCBpbnB1dClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSTUFQOiB0aGlzLlZBUk1BUCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogbVRhZyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpc1tzeW1ib2xNYXAubVBhZ2VdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9LFxcblxcbiAgICDnlYzpnaIobGF5b3V0KSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQobGF5b3V0KVxcbiAgICB9LFxcbiAgICDliIbnsbvpk77mjqUodHJ1ZVVybCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMudHJ1ZVVybCh0cnVlVXJsKTtcXG4gICAgfSxcXG4gICAg6aG156CBKHBhZ2UpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UocGFnZSk7XFxuICAgIH0sXFxuICAgIOa6kOeggShodG1sKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5odG1sKGh0bWwpO1xcbiAgICB9LFxcbiAgICDlrprkvY3kuIDnuqfliIbnsbsobGlzdCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdChsaXN0KTtcXG4gICAgfSxcXG4gICAg5a6a5L2N5a2Q5YiG57G7KHN1Ykxpc3QpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnN1Ykxpc3Qoc3ViTGlzdCk7XFxuICAgIH0sXFxuICAgIOWumuS9jeWIhuexu+agh+mimCh0aXRsZSkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMudGl0bGUodGl0bGUpO1xcbiAgICB9LFxcbiAgICDlrprkvY3liIbnsbvpk77mjqUodXJsKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy51cmwodXJsKTtcXG4gICAgfSxcXG4gICAg5byA5ZCv5YaF572u5oqY5Y+g5Yqf6IO9KCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZElubmVyKHRydWUpO1xcbiAgICB9LFxcbiAgICDlhbPpl63lhoXnva7mipjlj6Dlip/og70oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkSW5uZXIoZmFsc2UpO1xcbiAgICB9LFxcbiAgICDnrKzlh6DooYzlvIDlp4vmipjlj6AoaW5kZXgpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGRJbmRleChpbmRleCk7XFxuICAgIH0sXFxuICAgIOaKmOWPoOaMiemSruagt+W8jyhsYXlvdXQpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGRMYXlvdXQobGF5b3V0KVxcbiAgICB9LFxcbiAgICDmipjlj6AoZm9sZCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZChmb2xkKTtcXG4gICAgfSxcXG4gICAg6YCJ5Lit55qE5YiG57G76aKc6ImyKGNvbG9yKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5jb2xvcihjb2xvcik7XFxuICAgIH0sXFxuICAgIOWUr+S4gOagh+ivhihtVGFnKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy50YWcobVRhZylcXG4gICAgfSxcXG4gICAg5re75Yqg5YiG57G75a6a5L2NKHJ1bGVPYmopIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmFkZChydWxlT2JqKTtcXG4gICAgfSxcXG4gICAg5byA5aeL5omT6YCg5YiG57G7KCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGQoKTtcXG4gICAgfSxcXG5cXG59KVxcbiQuZXhwb3J0cyA9IG5ldyBDYXRlZ29yaWVzSGVhZGVyKCk7XFxuJC5leHBvcnRzXFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpk77mjqXlpITnkIZb5LqMXVwiLFwicGF0aFwiOlwidXJsLXByb2Nlc3NvclwiLFwicnVsZVwiOlwiLyoqXFxuICog5pys5Zyw572R6aG15o+S5Lu26ZO+5o6lIGhpa2VyOi8vZmlsZXMvcnVsZXMvanMvVXJsUHJvY2Vzc29yLmpzXFxuICog5a2Q6aG16Z2i6ZO+5o6lIGhpa2VyOi8vcGFnZS91cmwtcHJvY2Vzc29yXFxuICog6YGT6ZW/5LuT5bqT6ZO+5o6lIGh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDlcXG4gKiDnoIHkupEgR2l0ZWUg6ZO+5o6lIGh0dHBzOi8vZ2l0ZWUuY29tL3JlYm9ybjAvSGlrZXJSdWxlcy9yYXcvbWFzdGVyL3BsdWdpbnMvVXJsUHJvY2Vzc29yLmpzXFxuICovXFxuZnVuY3Rpb24gVXJsUHJvY2Vzc29yKCkge1xcbiAgICB0aGlzLnBhcmFtcyA9IHt9XFxuICAgIHRoaXMucmVnZXhNYXAgPSBbXFxuICAgICAgICB7XFxuICAgICAgICAgICAgcmVnOiAnKHZvZHR5cGV8dmlkZW90KVxcXFxcXFxcL1xcXFxcXFxcdysnLFxcbiAgICAgICAgICAgIGV4ZWM6ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLy1cXFxcZCsuaHRtbC8sICctJyArIHRoaXMucGFyYW1zLnBhZ2UgKyAnLmh0bWwnKVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLygodm9kdHlwZXx2aWRlb3QpXFxcXC9cXFxcdyspLmh0bWwvLCAnJDEtJyArIHRoaXMucGFyYW1zLnBhZ2UgKyAnLmh0bWwnKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICB7XFxuICAgICAgICAgICAgcmVnOiAnXFxcXFxcXFwvP1tcXFxcXFxcXHdcXFxcXFxcXGRdKy0uKj8tLio/LS4qPy0uKj8tLio/LS4qPy0uKj8tXFxcXFxcXFxkKi0tLVxcXFxcXFxcZCouaHRtbCcsXFxuICAgICAgICAgICAgZXhlYzogKCkgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXGQqKC0tLS5odG1sKS8sIHRoaXMucGFyYW1zLnBhZ2UgKyAnJDEnKVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLygtLS1cXFxcZCsuaHRtbCkvLCB0aGlzLnBhcmFtcy5wYWdlICsgJyQxJyk7IC8vIOaLvOaOpemhteeggVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICB7XFxuICAgICAgICAgICAgcmVnOiAnKChcXFxcXFxcXC92b2RcXFxcXFxcXC9zaG93KT8oXFxcXFxcXFwvYXJlYVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9ieVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9pZFxcXFxcXFxcL1xcXFxcXFxcZCspPyhcXFxcXFxcXC9sZXR0ZXJcXFxcXFxcXC9bXFxcXFxcXFx3XFxcXFxcXFxkJV0rKT8pKFxcXFxcXFxcL3BhZ2VcXFxcXFxcXC9cXFxcXFxcXGQrKT8oXFxcXFxcXFwveWVhclxcXFxcXFxcL1xcXFxcXFxcZCspP1xcXFxcXFxcLmh0bWwnLFxcbiAgICAgICAgICAgIGV4ZWM6ICgpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlZ0V4cCA9IC8oKFxcXFwvdm9kXFxcXC9zaG93KT8oXFxcXC9hcmVhXFxcXC9bXFxcXHdcXFxcZCVdKyk/KFxcXFwvYnlcXFxcL1tcXFxcd1xcXFxkJV0rKT8oXFxcXC9pZFxcXFwvXFxcXGQrKT8oXFxcXC9sZXR0ZXJcXFxcL1tcXFxcd1xcXFxkJV0rKT8pKFxcXFwvcGFnZVxcXFwvXFxcXGQrKT8oXFxcXC95ZWFyXFxcXC9cXFxcZCspP1xcXFwuaHRtbC9cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocmVnRXhwLCAnJDEnICsgKFxcXCIvcGFnZS9cXFwiICsgdGhpcy5wYXJhbXMucGFnZSkgKyAnJDgnICsgXFxcIi5odG1sXFxcIilcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIF1cXG59XFxuXFxuT2JqZWN0LmFzc2lnbihVcmxQcm9jZXNzb3IucHJvdG90eXBlLCB7XFxuICAgIGNvbnN0cnVjdG9yOiBVcmxQcm9jZXNzb3IsXFxuICAgIGNoZWNrUGFyYW1zKCkge1xcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy51cmwpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+WFiOiwg+eUqCAuYmFzZVVybCh1cmwpIOS8oOWFpemTvuaOpei/m+ihjOWIneWni+WMliFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5wYWdlKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7flhYjosIPnlKggLnBhZ2UocGFnZSkg5Lyg5YWl6aG156CB6L+b6KGM5Yid5aeL5YyWIVxcXCIpXFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGJhc2VVcmwodXJsKXtcXG4gICAgICAgIHRoaXMucGFyYW1zLnVybCA9IHVybFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgcGFnZShwYWdlKXtcXG4gICAgICAgIHRoaXMucGFyYW1zLnBhZ2UgPSBwYWdlXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBhZGRFeHRyYShyZWdFeHApIHtcXG4gICAgICAgIGlmIChyZWdFeHAuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XFxuICAgICAgICAgICAgdGhpcy5yZWdleE1hcCA9IHRoaXMucmVnZXhNYXAuY29uY2F0KHJlZ0V4cClcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhpcy5yZWdleE1hcC5wdXNoKHJlZ0V4cClcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBkZWJ1ZygpIHtcXG4gICAgICAgIHRoaXMucGFyYW1zLmRlYnVnID0gdHJ1ZVxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGV4ZWMoKSB7XFxuICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKClcXG4gICAgICAgIGxldCB0cnVlX3VybCA9ICcnXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVnZXhNYXAubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICBsZXQgcmVnT2JqID0gdGhpcy5yZWdleE1hcFtpXTtcXG4gICAgICAgICAgICBsZXQgdXJsRXhwID0gcmVnT2JqLnJlZztcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybEV4cCA9PT0gJ3N0cmluZycpIHtcXG4gICAgICAgICAgICAgICAgdXJsRXhwID0gbmV3IFJlZ0V4cCh1cmxFeHApXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh1cmxFeHAudGVzdCh0aGlzLnBhcmFtcy51cmwpKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5kZWJ1Zykge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKHVybEV4cC50b1N0cmluZygpKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRydWVfdXJsID0gcmVnT2JqLmV4ZWMoKTtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRydWVfdXJsKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWVfdXJsO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIOiOt+WPluWkhOeQhue7k+aenCgpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmV4ZWMoKVxcbiAgICB9LFxcbiAgICDpk77mjqUodXJsKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsKHVybClcXG4gICAgfSxcXG4gICAg6aG156CBKHBhZ2UpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UocGFnZSlcXG4gICAgfSxcXG4gICAg5o+S5YWl5paw5aSE55CG6KeE5YiZKHJlZ0V4cCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXh0cmEocmVnRXhwKVxcbiAgICB9LFxcbiAgICDosIPor5XmqKHlvI8oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1ZygpO1xcbiAgICB9XFxufSlcXG4kLmV4cG9ydHM9bmV3IFVybFByb2Nlc3NvcigpXFxuJC5leHBvcnRzXFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuIDnuqdcIixcInBhdGhcIjpcInlqdG9vbFwiLFwicnVsZVwiOlwiZnVuY3Rpb24gY29udmVydDEoc3RyKSB7XFxuICAgIGxldCBjID0gc3RyLnNwbGl0KFxcXCI7XFxcIilcXG4gICAgcmV0dXJuIHtcXG4gICAgICAgIOWIl+ihqDogY1swXSxcXG4gICAgICAgIOagh+mimDogY1sxXSxcXG4gICAgICAgIOWbvueJhzogY1syXSxcXG4gICAgICAgIOaPj+i/sDogY1szXSxcXG4gICAgICAgIOmTvuaOpTogY1s0XVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIG1lcmdlKHNvdXJjZSwgdGFyZ2V0KSB7XFxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKVxcbiAgICBmb3IgKGxldCBpIGluIGtleXMpIHtcXG4gICAgICAgIHRhcmdldFtrZXlzW2ldXSA9IHNvdXJjZVtrZXlzW2ldXVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIOS4gOe6pyhvYmopIHtcXG4gICAgdmFyIGQgPSBbXTtcXG4gICAgaWYgKCQudHlwZShvYmopID09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICBvYmogPSBjb252ZXJ0MShvYmopXFxuICAgIH1cXG4gICAgaWYgKG9iai7op4TliJkpIHtcXG4gICAgICAgIGxldCBjID0gY29udmVydDEob2JqLuinhOWImSlcXG4gICAgICAgIG1lcmdlKGMsIG9iailcXG4gICAgfVxcbiAgICBsZXQgYXJyID0gcGRmYShnZXRSZXNDb2RlKCksIG9iai7liJfooagpO1xcbiAgICAgICBpZiAob2JqLuWIl+ihqOWkhOeQhiAhPSBudWxsKSB7XFxuICAgICAgICAgICAgYXJyID0gb2JqLumTvuaOpeWkhOeQhihhcnIpXFxuICAgICAgICB9XFxuICAgIGZvciAobGV0IGl0IG9mIGFycikge1xcbiAgICAgICAgbGV0IHVybCA9IHBkKGl0LCBvYmou6ZO+5o6lKVxcbiAgICAgICAgaWYgKG9iai7pk77mjqXlpITnkIYgIT0gbnVsbCkge1xcbiAgICAgICAgICAgIHVybCA9IG9iai7pk77mjqXlpITnkIYodXJsKVxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHBpYyA9IHBkKGl0LCBvYmou5Zu+54mHKVxcbiAgICAgICAgaWYgKG9iai7lm77niYflpITnkIYgIT0gbnVsbCkge1xcbiAgICAgICAgICAgIHBpYyA9IG9iai7lm77niYflpITnkIYocGljKVxcbiAgICAgICAgfVxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgb2JqLuagh+mimCksXFxuICAgICAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IG9iai7mj4/ov7AgPyBwZGZoKGl0LCBvYmou5o+P6L+wKSA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpY1xcbiAgICAgICAgfSk7XFxuXFxuICAgIH1cXG4gICAgc2V0UmVzdWx0KGQpO1xcbn1cXG52YXIgdG9vbCA9IHtcXG4gICAg5LiA57qnOiDkuIDnuqdcXG59XFxuJC5leHBvcnRzID0gdG9vbFwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LiA57qnW+S6jF1cIixcInBhdGhcIjpcInlpamlcIixcInJ1bGVcIjpcImZ1bmN0aW9uIOS4gOe6pygpIHt9O1xcclxcbk9iamVjdC5hc3NpZ24o5LiA57qnLnByb3RvdHlwZSwge1xcclxcblxcdGNvbnN0cnVjdG9yOiDkuIDnuqcsXFxyXFxuXFx0dGVzdCgpIHt9LFxcclxcblxcdOiOt+WPlua6kOeggSh1cmwsIGhlYWRlcikge3JldHVybiBmZXRjaCh0cnVlX3VybCwge2hlYWRlcnM6IGhlYWRlciB8fCB7J1VzZXItQWdlbnQnOiBQQ19VQX19KSB9LC8vIOm7mOiupOe7n+S4gOS9v+eUqE1PQklMRV9VQVxcclxcblxcdOaQnOe0ouahhuaetihwYWdlKSB7XFxyXFxuXFx0XFx0aWYgKHBhZ2UgPT0gJzEnKSB7XFxuLypcXHJcXG5cXHRcXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiBcXFwi5pCc57Si5pys6KeE5YiZXFxcIixcXHJcXG5cXHRcXHRcXHRcXHR1cmw6IFxcXCInaGlrZXI6Ly9zZWFyY2g/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImcz0nK2lucHV0XFxcIixcXHJcXG5cXHRcXHRcXHRcXHRkZXNjOiBcXFwiIFxcXCIsXFxyXFxuXFx0XFx0XFx0XFx0Y29sX3R5cGU6IFxcXCJpbnB1dFxcXCJcXHJcXG5cXHRcXHRcXHR9KTtcXG4qL1xcclxcblxcdFxcdH1cXHJcXG5cXHR9LFxcclxcblxcdOiOt+WPlumTvuaOpShwYWdlLCByZWdleCkge1xcclxcblxcdFxcdGxldCB0cnVlX3VybCA9IGdldE15VmFyKCdoZWFkZXIudXJsJywgTVlfVVJMKTtcXHJcXG5cXHRcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoY29uZmlnLumTvuaOpeWkhOeQhuW3peWFt+S+nei1lilcXHJcXG5cXHRcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDknKVxcclxcblxcdFxcdC8vbGV0IOmTvuaOpeWkhOeQhuW3peWFtyA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL3VybC1wcm9jZXNzb3InKVxcclxcblxcdFxcdGxldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDknKVxcclxcblxcdFxcdHRydWVfdXJsID0g6ZO+5o6l5aSE55CG5bel5YW3XFxyXFxuXFx0XFx0XFx0LumTvuaOpSh0cnVlX3VybClcXHJcXG5cXHRcXHRcXHQu6aG156CBKHBhZ2UpXFxyXFxuXFx0XFx0XFx0LuaPkuWFpeaWsOWkhOeQhuinhOWImShyZWdleCB8fCBbXSlcXHJcXG5cXHRcXHRcXHQu6I635Y+W5aSE55CG57uT5p6cKCk7XFxyXFxuXFx0XFx0cmV0dXJuIHRydWVfdXJsO1xcclxcblxcdH0sXFxyXFxuXFx05omT6YCg5YiG57G7KHJ1bGVMaXN0KSB7XFxyXFxuXFx0XFx0Ly8gIGxldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZShjb25maWcu5Yqo5oCB5YiG57G75L6d6LWWKVxcclxcblxcdFxcdC8vbGV0IGh0bWxDYXRlZ29yaWVzID0gcmVxdWlyZUNhY2hlKCdodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yNzA1JylcXHJcXG5cXHRcXHRpZiAoIXJ1bGVMaXN0KSB7XFxyXFxuXFx0XFx0XFx0bGV0IOWIhuexu+WumuS9jSA9IFt7XFxyXFxuXFx0XFx0XFx0XFx0XFx05LiA57qn5YiG57G7OiDkuIDnuqflrprkvY1BLFxcclxcblxcdFxcdFxcdFxcdFxcdOWtkOWIhuexuzog57uf5LiA5a6a5L2NQiB8fCDkuIDnuqflrprkvY1CLFxcclxcblxcdFxcdFxcdFxcdFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuIDnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcclxcblxcdFxcdFxcdH1dXFxyXFxuXFx0XFx0XFx0aWYgKOS6jOe6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5LqM57qn5a6a5L2NQikpIHtcXHJcXG5cXHRcXHRcXHRcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05LiA57qn5YiG57G7OiDkuoznuqflrprkvY1BLFxcclxcblxcdFxcdFxcdFxcdFxcdFxcdOWtkOWIhuexuzog57uf5LiA5a6a5L2NQiB8fCDkuoznuqflrprkvY1CLFxcclxcblxcdFxcdFxcdFxcdFxcdFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuoznuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcclxcblxcdFxcdFxcdFxcdH0pXFxyXFxuXFx0XFx0XFx0fVxcclxcblxcdFxcdFxcdGlmICjkuInnuqflrprkvY1BICYmICjnu5/kuIDlrprkvY1CIHx8IOS4iee6p+WumuS9jUIpKSB7XFxyXFxuXFx0XFx0XFx0XFx05YiG57G75a6a5L2NLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdFxcdFxcdOS4gOe6p+WIhuexuzog5LiJ57qn5a6a5L2NQSxcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5LiJ57qn5a6a5L2NQixcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTliIbnsbvpk77mjqU6IHvkuozmrKHlpITnkIYodXJsKSB7dHJ5IHtyZXR1cm4g5LiJ57qn5aSE55CGQyh1cmwpfSBjYXRjaCAoZSkge3JldHVybiB1cmx9fX1cXHJcXG5cXHRcXHRcXHRcXHR9KVxcclxcblxcdFxcdFxcdH1cXHJcXG5cXHRcXHRcXHRpZiAo5Zub57qn5a6a5L2NQSAmJiAo57uf5LiA5a6a5L2NQiB8fCDlm5vnuqflrprkvY1CKSkge1xcclxcblxcdFxcdFxcdFxcdOWIhuexu+WumuS9jS5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTkuIDnuqfliIbnsbs6IOWbm+e6p+WumuS9jUEsXFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOWbm+e6p+WumuS9jUIsXFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05YiG57G76ZO+5o6lOiB75LqM5qyh5aSE55CGKHVybCkge3RyeSB7cmV0dXJuIOWbm+e6p+WkhOeQhkModXJsKX0gY2F0Y2ggKGUpIHtyZXR1cm4gdXJsfX19XFxyXFxuXFx0XFx0XFx0XFx0fSlcXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFx0XFx0XFx0cnVsZUxpc3QgPSDliIbnsbvlrprkvY07XFxyXFxuXFx0XFx0fVxcclxcblxcdFxcdC8vICcwJyDkuLrpu5jorqTkuI3mipjlj6DvvIwnMScg5Li66buY6K6k5oqY5Y+gXFxyXFxuXFx0XFx0Y29uc3Qg5b2T5YmN5oqY5Y+g54q25oCBID0gZ2V0TXlWYXIoJ2hlYWRlci5mb2xkJywgJzAnKVxcclxcblxcdFxcdC8vIOW8leWFpeWKqOaAgeWIhuexu+S+nei1llxcclxcblxcdFxcdGxldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZSgnaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MjcwNScpXFxyXFxuXFx0XFx0dmFyIGdldFJhbmdlQ29sb3JzID0gZnVuY3Rpb24oKSB7XFxyXFxuXFx0XFx0XFx0cmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO1xcclxcblxcdFxcdH0gLy8g6ZqP5py66YCJ5Lit55qE5YiG57G76aKc6ImyXFxyXFxuXFx0XFx0dmFyIGNvbG91cjtcXHJcXG5cXHRcXHRpZiAo5YiG57G76aKc6ImyICE9PSAnJykge1xcclxcblxcdFxcdFxcdGNvbG91ciA9IOWIhuexu+minOiJslxcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFx0XFx0XFx0Y29sb3VyID0gZ2V0UmFuZ2VDb2xvcnMoKVxcclxcblxcdFxcdH1cXHJcXG5cXHRcXHRodG1sQ2F0ZWdvcmllcy7nlYzpnaIoZClcXHJcXG5cXHRcXHRcXHQvLy7liIbnsbvpk77mjqUodHJ1ZV91cmwpXFxyXFxuXFx0XFx0XFx0Lua6kOeggShodG1sKVxcclxcblxcdFxcdFxcdC7pobXnoIEocGFnZSlcXHJcXG5cXHRcXHRcXHQu5re75Yqg5YiG57G75a6a5L2NKHJ1bGVMaXN0KVxcclxcblxcdFxcdFxcdC7lvIDlkK/lhoXnva7mipjlj6Dlip/og70oKSAvLyDlv4XpobtcXHJcXG5cXHRcXHRcXHQu5oqY5Y+gKOW9k+WJjeaKmOWPoOeKtuaAgSkgLy8g5b+F6aG7XFxyXFxuXFx0XFx0XFx0LuaKmOWPoOaMiemSruagt+W8jyh7XFxyXFxuXFx0XFx0XFx0XFx0dGl0bGU6IOW9k+WJjeaKmOWPoOeKtuaAgSA9PSBcXFwiMVxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdPGJpZz48Yj48Zm9udCBjb2xvcj0nIzU5NTlBQic+XFxcIiArIOWKqOaAgee8qeWwjyArIFxcXCI8L2ZvbnQ+PC9iPjwvYmlnPlxcXCIgOiBcXFwi4oCc4oCc4oCd4oCdPGJpZz48Yj48Zm9udCBjb2xvcj0nI0Y3NUQ1OSc+XFxcIiArIOWKqOaAgeaJqeWxlSArIFxcXCI8L2ZvbnQ+PC9iPjwvYmlnPlxcXCJcXHJcXG5cXHRcXHRcXHR9KSAvLyDlj6/pgIlcXHJcXG5cXHRcXHRcXHQvLyAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKDIpIC8vIOWPr+mAiVxcclxcblxcdFxcdFxcdC8vIC7mipjlj6DmjInpkq7moLflvI8oeyDmipjlj6DmjInpkq7mj5LlhaXooYw6IDIgfSkgIC8vIOWPr+mAie+8jOS9huW/hemhu+WFiOiwg+eUqCAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKGluZGV4Ke+8jOeEtuWQjuWGjeS8oOWFpSB7IOaKmOWPoOaMiemSruaPkuWFpeihjDogaW5kZXggfVxcclxcblxcdFxcdFxcdC7pgInkuK3nmoTliIbnsbvpopzoibIoY29sb3VyKVxcclxcblxcdFxcdFxcdC7lvIDlp4vmiZPpgKDliIbnsbsoKTtcXHJcXG5cXHR9LFxcclxcblxcclxcblxcdOeUn+aIkOeJh+WNlShkLGh0bWwpIHtcXHJcXG5cXHJcXG5cXHRcXHR2YXIg5YiX6KGoXFxyXFxuXFx0XFx0dmFyIOagh+mimFxcclxcblxcdFxcdHZhciDmj4/ov7BcXHJcXG5cXHRcXHR2YXIg5Zu+54mHXFxyXFxuXFx0XFx0dmFyIOmTvuaOpVxcclxcblxcclxcblxcdFxcdGlmICjmoYbmnrbnsbvlnosgPT09ICdteXVpLXZvZGxpc3QnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJy5teXVpLXZvZGxpc3QmJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnaDQmJlRleHQnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICcucGljLXRhZ3x8LnBpYy10ZXh0JiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnLmxhenlsb2FkJiZkYXRhLW9yaWdpbmFsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0XFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3bXl1aS12b2RsaXN0JylcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJyNkYXRhX2xpc3QnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJyNkYXRhX2xpc3QmJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICdlbSYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJ2ltZyYmZGF0YS1zcmNsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0XFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3ZGF0YV9saXN0JylcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ2ZlZC1saXN0LXRpdGxlJykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICcuZmVkLWxpc3QtaW5mbyYmbGknO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICcuZmVkLWxpc3QtdGl0bGUmJlRleHQnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICcuZmVkLXRleHQtY2VudGVyJiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnYSYmZGF0YS1vcmlnaW5hbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdFxcdC8vbG9nKCfmoYbmnrbnsbvlnovCty5mZWQtbGlzdC1pbmZvJylcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ2l0ZW0nKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJ2JvZHkmJi5pdGVtJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnaW1nJiZhbHQnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICdwJiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnaW1nJiZzcmNsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdtb2R1bGUtaXRlbXMnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJy5tb2R1bGUtaXRlbXMmJi5tb2R1bGUtaXRlbSc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnLm1vZHVsZS1pdGVtLXRleHQmJlRleHQnO1xcclxcblxcdFxcdFxcdOWbvueJhyA9ICdpbWd8fC5sYXp5JiZkYXRhLXNyYyc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAncGFjay15a3BhY2snKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJ2JvZHkmJi5wYWNrLXlrcGFjayc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnc3BhbiwtMSYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJy5lY2xhenkmJmRhdGEtb3JpZ2luYWwnO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ3N0dWktdm9kbGlzdCcpIHtcXHJcXG5cXHRcXHRcXHTliJfooaggPSAnLnN0dWktdm9kbGlzdCYmbGknO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxyXFxuXFx0XFx0XFx05o+P6L+wID0gJy5waWMtdGV4dCYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJy5sYXp5bG9hZHx8YSYmZGF0YS1vcmlnaW5hbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAndm9kbGlzdCcpIHtcXHJcXG5cXHRcXHRcXHTliJfooaggPSAnLnZvZGxpc3QmJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICdhJiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnLmxhenlsb2FkJiZkYXRhLW9yaWdpbmFsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICfmtYvor5UnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJ2JvZHkmJmEnO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICdib2R5JiZhJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnYm9keSYmYSc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJ2JvZHkmJmEnO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9ICdib2R5JiZhJztcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJycpIHtcXHJcXG5cXHRcXHRcXHTliJfooaggPSDmoYbmnrbliJfooag7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0g5qGG5p625qCH6aKYO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9IOahhuaetuaPj+i/sDtcXHJcXG5cXHRcXHRcXHTlm77niYcgPSDmoYbmnrblm77niYc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0g5qGG5p626ZO+5o6lO1xcclxcblxcdFxcdH1cXHJcXG5cXHRcXHRsZXQgbGlzdCA9IHBkZmEoaHRtbCwg5YiX6KGoKTtcXHJcXG5cXHRcXHRmb3IgKGxldCBrIGluIGxpc3QpIHtcXHJcXG5cXHRcXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiBwZGZoKGxpc3Rba10sIOagh+mimCksXFxyXFxuXFx0XFx0XFx0XFx0ZGVzYzogcGRmaChsaXN0W2tdLCDmj4/ov7ApLFxcclxcblxcdFxcdFxcdFxcdGltZzogcGQobGlzdFtrXSwg5Zu+54mHKSArICdAUmVmZXJlcj0nLFxcclxcblxcdFxcdFxcdFxcdHVybDogcGQobGlzdFtrXSwg6ZO+5o6lKStcXFwiI2ltbWVyc2l2ZVRoZW1lI1xcXCIsXFxyXFxuXFx0XFx0XFx0fSk7XFxyXFxuXFx0XFx0fVxcclxcblxcdFxcdGQucHVzaCh7XFxyXFxuXFx0XFx0XFx0Y29sX3R5cGU6ICdiaWdfYmlnX2JsYW5rX2Jsb2NrJyxcXHJcXG5cXHRcXHR9KTtcXHJcXG5cXHR9XFxyXFxufSlcXHJcXG5cXHJcXG4kLmV4cG9ydHMgPSBuZXcg5LiA57qnKCk7XFxyXFxuJC5leHBvcnRzXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlh73mlbDnu4Tku7ZcIixcInBhdGhcIjpcInFzXCIsXCJydWxlXCI6XCJmdW5jdGlvbiDkvJjljJbot6/nur/nq6DoioLmlbDmja4o5aSa6Lev57q/5ZCmLCDmupDmlbDmja4sIOi3r+e6v+WIl+ihqCwg6Lev57q/5ZCNLCDpgInpm4bmgLvliJfooagsIOmAiembhuWIl+ihqCwg6ZuG5ZCNLCDpm4Z1cmwsIOWJjee8gCwg5qCH6aKYLCDlm77niYcpIHtcXG5cXG4gICAgLy/lvZPlpJrot6/nur/lkKYg6YCJ6ZuG5oC75YiX6KGo5Li656m6XFxuICAgIC8v5pyA57uI6L+U5ZueIFt7dGl0bGU6ICfot6/nur/lkI0nLGxpc3Q6IFt7dGl0bGU6J+mAiembhuWQjScsdXJsOifpgInpm4Z1cmwnLC4uLn1dLHNqc3M6J+S4i+i9vei1hOaWmSd9LC4uLi5dXFxuICAgIC8v6YCJ6ZuG5YiX6KGoIOesrOS4gOmhueaYr2Nzc+mAieaLqeWZqO+8jOS5i+WQjuWPr+S7peeUqCTliIblibLmt7vliqDopoHliKDpmaTnq6DoioLlkI1cXG5cXG5cXG4gICAgdmFyIOeroOiKgmpzb24gPSBbXTtcXG4gICAgdmFyIOWNlei3r+e6v+eroOiKgiA9ICfnq6DoioLliJfooagnXFxuXFxuICAgIHZhciDliJfooajlkI0gPSBbXTtcXG4gICAgaWYgKCHlpJrot6/nur/lkKYpIHtcXG5cXG4gICAgICAgIOWIl+ihqOWQjS5wdXNoKOWNlei3r+e6v+eroOiKgilcXG5cXG4gICAgfSBlbHNlIHtcXG5cXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDot6/nur/liJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgICAgIOWIl+ihqOWQjS5wdXNoKHBkZmgoZGF0YSwg6Lev57q/5ZCNKSlcXG4gICAgICAgIH0pO1xcblxcbiAgICB9XFxuXFxuICAgIHZhciDpm4bmlbDnu4QgPSBbXTtcXG5cXG5cXG52YXIg5o6S6Zmk56ug6IqCID0gW107XFxuaWYo6YCJ6ZuG5YiX6KGoLmluY2x1ZGVzKCckJykpe1xcbuaOkumZpOeroOiKgiA9IOmAiembhuWIl+ihqC5zcGxpdCgnJCcpXFxu6YCJ6ZuG5YiX6KGoID0g5o6S6Zmk56ug6IqCLnNoaWZ0KClcXG59XFxuXFxuICAgIGlmICgh5aSa6Lev57q/5ZCmKSB7XFxuICAgICAgICDpm4bmlbDnu4QucHVzaChwZGZhKOa6kOaVsOaNriwg6YCJ6ZuG5YiX6KGoKSlcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDpgInpm4bmgLvliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgICAgIOmbhuaVsOe7hC5wdXNoKHBkZmEoZGF0YSwg6YCJ6ZuG5YiX6KGoKSlcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxuXFxuICAgIGZvciAobGV0IGkgaW4g6ZuG5pWw57uEKSB7XFxuXFxuICAgICAgICB2YXIgZG9MaXN0ID0gW107XFxuXFxu5o6S6Zmk56ug6IqCLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICB2YXIg5qCH6K+GaWQgPSDpm4bmlbDnu4RbaV0uZmluZEluZGV4KOi/lOWbniA9PiDov5Tlm54uaW5kZXhPZihkYXRhKSAhPSAtMSk7XFxuICAgIGlmICjmoIfor4ZpZCAhPSAtMSkge1xcbiAgICAgIOmbhuaVsOe7hFtpXS5zcGxpY2Uo5qCH6K+GaWQsIDEpXFxuICAgIH07XFxuICB9KTtcXG5cXG4gICAgICAgIGZvciAobGV0IGl0IG9mIOmbhuaVsOe7hFtpXSkge1xcbiAgICAgICAgICAgIHZhciBkb0xpc3R1cmwgPSBwZGZoKGl0LCDpm4Z1cmwpXFxuICAgICAgICAgICAgZG9MaXN0dXJsID0gZG9MaXN0dXJsLmluY2x1ZGVzKFxcXCJodHRwXFxcIikgPyBkb0xpc3R1cmwgOiDliY3nvIAgKyBkb0xpc3R1cmxcXG4gICAgICAgICAgICBkb0xpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGl0LCDpm4blkI0pLFxcbiAgICAgICAgICAgICAgICB1cmw6IGRvTGlzdHVybFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgYm9va05hbWUgPSAh5aSa6Lev57q/5ZCmID8g5qCH6aKYIDog5qCH6aKYICsgJy0nICsg5YiX6KGo5ZCNW2ldXFxuXFxuICAgICAgICDnq6DoioJqc29uLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiDliJfooajlkI1baV0sXFxuICAgICAgICAgICAgbGlzdDogZG9MaXN0LFxcbiAgICAgICAgICAgIHNqc3M6IHtcXG4gICAgICAgICAgICAgICAgY2hhcHRlckxpc3Q6IGRvTGlzdCxcXG4gICAgICAgICAgICAgICAgaW5mbzoge1xcbiAgICAgICAgICAgICAgICAgICAgYm9va05hbWU6IGJvb2tOYW1lLCAvL+a8q+eUu+WQjeensCxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgYm9va1RvcFBpYzog5Zu+54mHLFxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VDb2RlOiDmvKvnlLvop6PmnpAsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3OiBcXFwiMVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICB9XFxuICAgIHJldHVybiDnq6DoioJqc29uXFxufVxcblxcblxcbmZ1bmN0aW9uIOa3u+WKoOWktOmDqOWIl+ihqChkLCDmoIfpopgsIOWbvueJhywg5o+P6L+wLCDkvZzogIUsIOaXtumXtCwg5YiG57G7LOmhtVVSTCkge1xcblxcbiAgICDmoIfpopggPSAh5qCH6aKYID8gJycgOiDmoIfpopggKyAnXFxcXG4nXFxuICAgIOWbvueJhyA9ICHlm77niYcgPyAnJyA6IOWbvueJh1xcbiAgICDmj4/ov7AgPSAh5o+P6L+wID8gJycgOiDmj4/ov7AucmVwbGFjZShcXFwi5pu05paw6Iez77yaXFxcIiwgJycpXFxuXFxuICAgIOS9nOiAhSA9ICHkvZzogIUgPyAnJyA6ICdcXFxcbicgKyDkvZzogIVcXG4gICAg5pe26Ze0ID0gIeaXtumXtCA/ICcnIDogJ1xcXFxuJyArIOaXtumXtFxcbiAgICDliIbnsbsgPSAh5YiG57G7ID8gJycgOiAnXFxcXG4nICsg5YiG57G7XFxuXFxuXFxuICAgIHZhciDlpLTpg6h0aXRsZSA9IFsn4oCY4oCY4oCZ4oCZPGI+JywnPC9iPiA8c21hbGw+PGZvbnQgY29sb3I9I0ZBNzI5OD4nLCc8L2ZvbnQ+JywnPC9zbWFsbD4nXVxcbiAgICB2YXIg5aS06YOoZGVzYyA9IFsn4oCY4oCY4oCZ4oCZPGZvbnQgY29sb3I9I2Y4ZWNjOT4nLCc8L2ZvbnQ+J11cXG5cXG5cXG5cXG4gICAg5aS06YOodGl0bGUgPSDlpLTpg6h0aXRsZVswXSvmoIfpopgr5aS06YOodGl0bGVbMV0r5o+P6L+wK+WktOmDqHRpdGxlWzJdK+S9nOiAhSvlpLTpg6h0aXRsZVszXVxcblxcbiAgICDlpLTpg6hkZXNjID0g5aS06YOoZGVzY1swXSvml7bpl7Qr5YiG57G7K+WktOmDqGRlc2NbMV1cXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiDlpLTpg6h0aXRsZSxcXG4gICAgICAgIGRlc2M6IOWktOmDqGRlc2MsXFxuICAgICAgICBwaWNfdXJsOiDlm77niYcsXFxuICAgICAgICB1cmw6IOmhtVVSTCArIFxcXCIjbm9IaXN0b3J5I1xcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljX2JsdXInXFxuICAgIH0pO1xcblxcbn1cXG5cXG5cXG5mdW5jdGlvbiDmt7vliqDnroDku4soZCwg5pWw5o2u5rqQLCDpobVVUkwsIOWbvueJhykge1xcbiAgICAvL+iOt+WPluaVsOaNrlxcbiAgICB2YXIg566A5LuL5YaF5a65ID0g5pWw5o2u5rqQXFxuICAgIOeugOS7i+WGheWuuSA9IOeugOS7i+WGheWuuS5yZXBsYWNlKFxcXCLnroDku4vvvJpcXFwiLCBcXFwiXFxcIikucmVwbGFjZShcXFwi5LuL57uNOlxcXCIsIFxcXCJcXFwiKS5yZXBsYWNlKFxcXCLmvKvnlLtcXFwiLCBcXFwiXFxcIikucmVwbGFjZShcXFwi4oCm4oCmXFxcIiwgXFxcIlxcXCIpLnJlcGxhY2UoXFxcIueugOS7i1xcXCIsIFxcXCJcXFwiKVxcblxcbiAgICB2YXIg566A5LuL5YaF5a655pS2O1xcbiAgICBpZiAo566A5LuL5YaF5a65Lmxlbmd0aCA+IDQ1KSB7XFxuICAgICAgICDnroDku4vlhoXlrrnmlLYgPSDnroDku4vlhoXlrrkuc3Vic3RyKDAsIDQ1KSArICcuLi4nXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICDnroDku4vlhoXlrrnmlLYgPSDnroDku4vlhoXlrrkgKyAnLi4uJ1xcbiAgICB9XFxuXFxuICAgIC8v5Zu+5qCH6I635Y+WXFxuICAgIGlmICgh5Zu+54mHKSB7XFxuICAgICAgICDlm77niYcgPSAnaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL3EvMTA3LnBuZydcXG4gICAgfVxcblxcbiAgICAvL+mhtVVSTCDojrflj5ZcXG4gICAgaWYgKCHpobVVUkwpIHtcXG4gICAgICAgIOmhtVVSTCA9IE1ZX1JVTEUudGl0bGVcXG4gICAgfVxcblxcbiAgICAvL+agh+mimOS4jueugOS7i+agt+W8j1xcbiAgICB2YXIgbXp0ZXh0ID0gXFxcIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxzbWFsbD7nroDku4s8L3NtYWxsPjxicj5cXFwiXFxuICAgIHZhciBidHRpdGxlID0gJzxmb250IGNvbG9yPVxcXCIjMDk4QUMxXFxcIj7mvKvnlLvnroDku4sgIDwvZm9udD48c21hbGw+PHNtYWxsPjxmb250IGNvbG9yPVxcXCIjZjQ3OTgzXFxcIj7nroDku4vmlLY+PC9mb250Pjwvc21hbGw+PC9zbWFsbD4nXFxuXFxuICAgIC8v5bGV5byA5LiO5pS257yp5pON5L2cXFxuICAgIHZhciBqaiA9IGdldFZhcijpobVVUkwgKyBcXFwi566A5LuL5pS2XFxcIiwgXFxcIuW3suaUtui1t1xcXCIpO1xcbiAgICB2YXIgamp1cmwgPSAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCjnroDku4vlhoXlrrksIOeugOS7i+WGheWuueaUtiwg5pS2LCDmlLblhoXlrrksIOW9k+WJjVVSTCkgPT4ge1xcbiAgICAgICAgdmFyIGpzYmwgPSDlvZPliY1VUkwgKyBcXFwi566A5LuL5pS2XFxcIjtcXG4gICAgICAgIHZhciBqaiA9IGdldFZhcijlvZPliY1VUkwgKyBcXFwi566A5LuL5pS2XFxcIiwgXFxcIuW3suaUtui1t1xcXCIpO1xcbiAgICAgICAgamogPSBqaiA9PSBcXFwi5bey5pS26LW3XFxcIiA/IFxcXCLlsZXlvIBcXFwiIDogXFxcIuW3suaUtui1t1xcXCI7XFxuICAgICAgICBwdXRWYXIoanNibCwgamopXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDog5b2T5YmNVVJMICsgXFxcIl9idFxcXCJcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRpdGxlOiDmlLYucmVwbGFjZShcXFwi566A5LuL5pS2XFxcIiwgamopXFxuICAgICAgICB9KVxcblxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IOW9k+WJjVVSTCArIFxcXCJfbXpcXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aXRsZTogamogPT0gXFxcIuW3suaUtui1t1xcXCIgPyDmlLblhoXlrrkucmVwbGFjZShcXFwi566A5LuLXFxcIiwg566A5LuL5YaF5a655pS2KSA6IOaUtuWGheWuuS5yZXBsYWNlKFxcXCLnroDku4tcXFwiLCDnroDku4vlhoXlrrkpXFxuICAgICAgICB9KVxcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCDnroDku4vlhoXlrrksIOeugOS7i+WGheWuueaUtiwgYnR0aXRsZSwgbXp0ZXh0LCDpobVVUkwpXFxuXFxuXFxuICAgIC8v5qCH6aKYXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogYnR0aXRsZS5yZXBsYWNlKFxcXCLnroDku4vmlLZcXFwiLCBqaiksXFxuICAgICAgICB1cmw6IGpqdXJsLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgcGljX3VybDog5Zu+54mHLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl9idFxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuICAgIC8v566A5LuLXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogamogPT0gXFxcIuW3suaUtui1t1xcXCIgPyBtenRleHQucmVwbGFjZShcXFwi566A5LuLXFxcIiwg566A5LuL5YaF5a655pS2KSA6IG16dGV4dC5yZXBsYWNlKFxcXCLnroDku4tcXFwiLCDnroDku4vlhoXlrrkpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl9telxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxufVxcblxcbmZ1bmN0aW9uIOa3u+WKoOWIl+ihqOeroOiKgihkLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwsIOWbvueJhykge1xcblxcblxcbiAgICAvL2TkuI7lpJbnlYxk77yM5Li65ZCM5YaF5a2Y5Zyw5Z2A77yM5LiN55So6L+U5ZueXFxuICAgIC8v5qCH6aKY5pWw5o2uICDljbPmoIfpopjlkI3lrZdcXG4gICAgLy/liJfooajmlbDmja7lv4XpobvmmK9KU09OICDmoLzlvI/mmK9be3RpdGxlOicnLHVybDonJyx9LC4uLi4uXSAg5LiUdXJs5b+F6aG75pyJ5YmN57yAXFxuXFxuICAgIC8v5Zu+5qCH6I635Y+WXFxuICAgIGlmICgh5Zu+54mHKSB7XFxuICAgICAgICDlm77niYcgPSAnaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL3EvMTgucG5nJ1xcbiAgICB9XFxuXFxuICAgIC8v6aG1VVJMIOiOt+WPllxcbiAgICBpZiAoIemhtVVSTCkge1xcbiAgICAgICAg6aG1VVJMID0gTVlfUlVMRS50aXRsZVxcbiAgICB9XFxuXFxuICAgIC8v5qCH6aKY5ZCNXFxuICAgIHZhciDmoIfpopjlkI0gPSAnPGI+6Lev57q/PC9iPiAgPHNtYWxsPjxzbWFsbD48Zm9udCBjb2xvcj0jZjk5MDZmPuaOkuW6jyA+PC9mb250Pjwvc21hbGw+PC9zbWFsbD4nXFxuXFxuXFxuICAgIHZhciDmjpLluo8gPSBnZXRWYXIo6aG1VVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsIFxcXCLmraPluo9cXFwiKTtcXG4gICAgdmFyIOaPkOekuiA9IOaOkuW6jyA9PSAn5YCS5bqPJyA/ICfmraPluo8nIDogJ+WAkuW6jyc7XFxuXFxuICAgIHZhciDmjpLluo91cmwgPSAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCjmoIfpopjlkI0sIOagh+mimOaVsOaNriwg5YiX6KGo5pWw5o2uLCDop6PmnpDku6PnoIEsIOmhtVVSTCkgPT4ge1xcbiAgICAgICAgdmFyIOaOkuW6jyA9IGdldFZhcijpobVVUkwgKyBcXFwi56ug6IqC5o6S5bqPXFxcIiwgXFxcIuato+W6j1xcXCIpO1xcbiAgICAgICAgdmFyIOaPkOekuiA9IOaOkuW6jyA9PSAn5YCS5bqPJyA/ICfmraPluo8nIDogJ+WAkuW6jyc7XFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl/mjpLluo9cXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aXRsZTog5qCH6aKY5ZCNLnJlcGxhY2UoJ+i3r+e6vycsIOagh+mimOaVsOaNrikucmVwbGFjZSgn5o6S5bqPJywg5o+Q56S6KVxcbiAgICAgICAgfSlcXG5cXG5cXG4gICAgICAgIGlmICjmj5DnpLogPT0gJ+WAkuW6jycpIHtcXG4gICAgICAgICAgICDliJfooajmlbDmja4ucmV2ZXJzZSgpXFxuICAgICAgICB9XFxuICAgICAgICDliJfooajmlbDmja4uZm9yRWFjaChmdW5jdGlvbihkYXRhLCBzc2lkKSB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxcbiAgICAgICAgICAgICAgICB1cmw6IGRhdGEudXJsICsg6Kej5p6Q5Luj56CBLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf6YCJ6ZuGXFxcIiArIHNzaWRcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSk7XFxuXFxuXFxuICAgICAgICBwdXRWYXIo6aG1VVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsIOaPkOekuilcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwg5qCH6aKY5ZCNLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwpXFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTog5qCH6aKY5ZCNLnJlcGxhY2UoJ+i3r+e6vycsIOagh+mimOaVsOaNrikucmVwbGFjZSgn5o6S5bqPJywg5o6S5bqPKSxcXG4gICAgICAgIHBpY191cmw6IOWbvueJhyxcXG4gICAgICAgIHVybDog5o6S5bqPdXJsLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl/mjpLluo9cXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBpZiAo5o6S5bqPID09ICflgJLluo8nKSB7XFxuICAgICAgICDliJfooajmlbDmja4ucmV2ZXJzZSgpXFxuICAgIH1cXG5cXG4gICAg5YiX6KGo5pWw5o2uLmZvckVhY2goZnVuY3Rpb24oZGF0YSwgaWQpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCArIOino+aekOS7o+eggSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf6YCJ6ZuGXFxcIiArIGlkXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0pO1xcblxcbn1cXG5cXG5cXG5mdW5jdGlvbiDmt7vliqDpmLLmraLnvZHpobUo6aG5dXJsLCBVQSkge1xcblxcbiAgICAvL+S4iue6p+i3s+i9rOWIsOW9k+WJjemhteeahOmTvuaOpeW/hemhu+aYr2hpa2VyOi8vZW1wdHnvvJvkuI3nhLbkuIDliLfmlrDov5jmmK/kvJrph43lpI3liqDovb1cXG4gICAgLy9VQSAnJ+aIlmZhbHNl5oiWJ+aJi+acuicg6buY6K6k5piv5omL5py656uvIDsg55S16ISRICdQQydcXG5cXG4gICAgdmFyIOWIt+aWsOmHjeWkjSA9IE1ZX1JVTEUudGl0bGUgKyBcXFwi572R6aG15rqQ56CBXFxcIlxcbiAgICB2YXIgcGPpk77mjqUgPSDpobl1cmwucmVwbGFjZShcXFwibS5cXFwiLCBcXFwid3d3LlxcXCIpXFxuICAgIHZhciDmiYvmnLrpk77mjqUgPSDpobl1cmwucmVwbGFjZShcXFwid3d3LlxcXCIsIFxcXCJtLlxcXCIpXFxuXFxuICAgIHZhciBjb2RlO1xcbiAgICBpZiAoZ2V0VmFyKOWIt+aWsOmHjeWkjSwgXFxcImZhbHNlXFxcIikgPT0gXFxcImZhbHNlXFxcIikge1xcblxcbiAgICAgICAgY29kZSA9IFVBID09ICdQQycgPyBmZXRjaChwY+mTvuaOpSkgOiByZXF1ZXN0KOaJi+acuumTvuaOpSk7XFxuICAgICAgICBwdXRWYXIo5Yi35paw6YeN5aSNLCBnZXRQYXJhbSgndXJsJykgKyBcXFwi77+lJu+/pVxcXCIgKyBjb2RlKVxcblxcbiAgICB9IGVsc2Uge1xcblxcbiAgICAgICAgdmFyIHBtID0gZ2V0VmFyKOWIt+aWsOmHjeWkjSkuc3BsaXQoXFxcIu+/pSbvv6VcXFwiKVxcbiAgICAgICAgaWYgKHBtWzBdID09IGdldFBhcmFtKCd1cmwnKSkge1xcbiAgICAgICAgICAgIGNvZGUgPSBwbVsxXVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBjb2RlID0gVUEgPT0gJ1BDJyA/IGZldGNoKHBj6ZO+5o6lKSA6IHJlcXVlc3Qo5omL5py66ZO+5o6lKTtcXG4gICAgICAgICAgICBwdXRWYXIo5Yi35paw6YeN5aSNLCBnZXRQYXJhbSgndXJsJykgKyBcXFwi77+lJu+/pVxcXCIgKyBjb2RlKVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBjb2RlXFxufVxcblxcblxcbmZ1bmN0aW9uIOa3u+WKoOmAieaLqei3r+e6vyhkLCDot6/nur/mlbDmja4sIOmhtVVSTCwg5aSa6Lev57q/5ZCmKSB7XFxuXFxuICAgIC8v6Lev57q/5pWw5o2uIOagvOW8j1t7dGl0bGU6J+i3r+e6v+WQjSd9LC4uLi5dXFxuICAgIC8v5aSa6Lev57q/5ZCmICBmYWxzZSDliJnkuI3lkK/nlKjpgInmi6not6/nur/vvJt0cnVlIOWImeWQr+eUqFxcblxcbiAgICB2YXIg6YCJ5oup5YiX6KGoID0gZ2V0SXRlbSjpobVVUkwgKyBcXFwi6YCJ5oup5YiX6KGoXFxcIiwgXFxcIjBcXFwiKVxcblxcbiAgICBpZiAo5aSa6Lev57q/5ZCmKSB7XFxuXFxuICAgICAgICB2YXIg6Lev57q/6YCJ5LitID0gJ+KAmOKAmOKAmeKAmTxmb250IGNvbG9yPSMwOThBQzE+6YCJ5LitPC9mb250PidcXG5cXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJjigJjigJnigJnwn5OWPGZvbnQgY29sb3I9XFxcIiNGQTcyOThcXFwiPiDlm77mupDliJfooag8L2ZvbnQ+IO+8micsXFxuICAgICAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/ngrnmiJHlubLllaXlkaJcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nXFxuICAgICAgICB9KTtcXG5cXG5cXG4gICAgICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxuXFxuICAgICAgICAgICAgdmFyIGpqdXJsID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgo6aG1VVJMLGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0o6aG1VVJMICsgJ+mAieaLqeWIl+ihqCcsaWQrJycpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSzpobVVUkwsaWQpO1xcblxcbiAgICAgICAgICAgIHZhciDmoIfpopjlkI0gPSBpZCA9PSDpgInmi6nliJfooaggPyDot6/nur/pgInkuK0ucmVwbGFjZSgn6YCJ5LitJywgZGF0YS50aXRsZSkgOiBkYXRhLnRpdGxlO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiDmoIfpopjlkI0sXFxuICAgICAgICAgICAgICAgIHVybDogamp1cmwsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf6Lev57q/XFxcIiArIGlkXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcblxcbiAgICB9XFxuICAgIHJldHVybiDpgInmi6nliJfooahcXG59XFxuXFxuXFxuZnVuY3Rpb24g5re75Yqg6YCJ5oup5LiL6L29KGQsIOi3r+e6v+aVsOaNriwg5aSa6Lev57q/5ZCmKSB7XFxuXFxuICAgIC8v6Lev57q/5pWw5o2uIOagvOW8j1t7dGl0bGU6J+i3r+e6v+WQjScsc2pzczon5LiL6L296LWE5paZ5L+h5oGvJ30sLi4uLl1cXG4gICAgLy/lpJrot6/nur/lkKYgIGZhbHNlIOWImeWPquacieKRoOS4quS4i+i9vSDmoIfpopjkuLog54K55Ye75LiL6L2977ybdHJ1ZSDliJnlpJrkuKrkuIvovb1cXG5cXG5pZijlpJrot6/nur/lkKYpe1xcblxcbmQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmfCfk6U8Zm9udCBjb2xvcj1cXFwiI2Y0Nzk4M1xcXCI+IOS4i+i9vTwvZm9udD4g77yaJyxcXG4gICAgICAgIHVybDogXFxcInRvYXN0Oi8v54K55oiR5bmy5ZWl5ZGiXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG4gICAgfSk7XFxuXFxufVxcblxcbiAgICDot6/nur/mlbDmja4uZm9yRWFjaChmdW5jdGlvbihkYXRhLCBpZCkge1xcblxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZS5pbmNsdWRlcygn56ug6IqC5YiX6KGoJykgPyAn54K55Ye75LiL6L29JyA6IGRhdGEudGl0bGUsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjI25vSGlzdG9yeSM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIYnLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgZXh0cmE6IGRhdGEuc2pzc1xcbiAgICAgICAgfSk7XFxuICAgIH0pO1xcblxcbiAgICBpZiAo5aSa6Lev57q/5ZCmKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiQ1NT6YCJ5oup5Zmo5qih54mIXCIsXCJwYXRoXCI6XCJlandiLmpzXCIsXCJydWxlXCI6XCJmdW5jdGlvbiDkuIDnuqco5YiX6KGoLCDmoIfpopgsIOWbvueJhywg6ZuG5pWwLCDpk77mjqUsIOiuv+mXruWktCkge1xcbiAgICDorr/pl67lpLQgPSAh6K6/6Zeu5aS0ID8gJycgOiDorr/pl67lpLRcXG4gICAgdmFyIGQgPSBbXTtcXG4gICAgdmFyIGNvZGUgPSBnZXRDb2RlKClcXG4gICAgcGRmYShjb2RlLCDliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCDmoIfpopgpLFxcbiAgICAgICAgICAgIGRlc2M6IHBkZmgoZGF0YSwg6ZuG5pWwKSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwZChkYXRhLCDlm77niYcpICsgXFxcIkBSZWZlcmVyPVxcXCIgKyDorr/pl67lpLQsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eSNpbW1lcnNpdmVUaGVtZSMnLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibW92aWVfM1xcXCIsXFxuZXh0cmE6IHtcXG4gICAgICAgICAgICBuYW1lOiBwZGZoKGRhdGEsIOagh+mimCksXFxuICAgICAgICAgICAgdXJsOiBwZChkYXRhLCDpk77mjqUpLFxcbiAgICAgICAgICAgIHF6OiBNWV9IT01FXFxuICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG59XFxuXFxuXFxuXFxuZnVuY3Rpb24g5pCc57SiKOWIl+ihqCwg5qCH6aKYLCDpk77mjqUsIOaPj+i/sCwg6K+m5oOFLCDlm77niYcsIOiuv+mXruWktCkge1xcbiAgICB2YXIgZCA9IFtdO1xcbiAgICDorr/pl67lpLQgPSAh6K6/6Zeu5aS0ID8gJycgOiDorr/pl67lpLRcXG4gICAgcGRmYShnZXRSZXNDb2RlKCksIOWIl+ihqCkuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsIOagh+mimCksXFxuICAgICAgICAgICAgZGVzYzogcGRmaChkYXRhLCDmj4/ov7ApLFxcbiAgICAgICAgICAgIHBpY191cmw6IHBkKGRhdGEsIOWbvueJhykgKyBcXFwiQFJlZmVyZXI9XFxcIiArIOiuv+mXruWktCxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5I2ltbWVyc2l2ZVRoZW1lIycsXFxuICAgICAgICAgICAgY29udGVudDogcGRmaChkYXRhLCDor6bmg4UpLFxcblxcbmV4dHJhOiB7XFxuICAgICAgICAgICAgbmFtZTogcGRmaChkYXRhLCDmoIfpopgpLFxcbiAgICAgICAgICAgIHVybDogcGQoZGF0YSwg6ZO+5o6lKSxcXG4gICAgICAgICAgICBxejogTVlfSE9NRVxcbiAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxufVxcblxcblxcblxcblxcbmZ1bmN0aW9uIOacgOaWsCjpgInmi6nlmagsIFVBKSB7XFxuICAgIGlmIChVQSA9PSBcXFwiUENcXFwiKSB7XFxuICAgICAgICB2YXIgY29kZSA9IGZldGNoKGdldFBhcmFtKCd1cmwnKS5yZXBsYWNlKFxcXCJtLlxcXCIsIFxcXCJ3d3cuXFxcIikpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdmFyIGNvZGUgPSByZXF1ZXN0KGdldFBhcmFtKCd1cmwnKS5yZXBsYWNlKFxcXCJ3d3cuXFxcIiwgXFxcIm0uXFxcIikpO1xcbiAgICB9XFxuICAgIHNldFJlc3VsdChwZGZoKGNvZGUsIOmAieaLqeWZqCkpXFxufVxcblxcblxcblxcbmV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJoaWtlcjovL3BhZ2UvcXM/cnVsZT3ogZrmvKvwn5SuXFxcIikpLnJ1bGUpXFxuXFxuZnVuY3Rpb24g5LqM57qnKOWktOmDqOWIl+ihqCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg6K6/6Zeu5aS0LCDkvZzogIUsIOaXtumXtCwg5YiG57G7LCDnroDku4ssIOWkmui3r+e6v+WQpiwg6Lev57q/5YiX6KGoLCDot6/nur/lkI0sIOmAiembhuaAu+WIl+ihqCwg6YCJ6ZuG5YiX6KGoLCDpm4blkI0sIOmbhnVybCwg5ryr55S76Kej5p6QLOW9k+WJjVVSTCzlvZPliY3pobXlkI0s5YmN57yALFVBLOmYsumHjei9veWQpikge1xcbiAgICB2YXIgZCA9IFtdO1xcblxcbi8v5aS06YOo5YiX6KGoICDliJnpu5jorqTkvb/nlKggY29kZSDmnaXkvZzkuLrlpLTpg6jliJfooajmlbDmja5cXG4vL+Wkmui3r+e6v+WQpiAgdHJ1ZSDliJnkvb/nlKjlpJrot6/nur/vvJtmYWxzZSDliJnkvb/nlKjnq6Dot6/nur9cXG4vL1VBICDkuI3loavliJnkvb/nlKjmiYvmnLrnq68gICdQQyfliJnmiYvmnLrnq69cXG5cXG5pZiAo5b2T5YmN6aG15ZCNKSB7XFxuICAgIHNldFBhZ2VUaXRsZSjlvZPliY3pobXlkI0pXFxufVxcblxcbmlmKOmYsumHjei9veWQpil7XFxuLy/nvZHpobXlhoXlrrkr6Ziy5q2i6YeN5ouJXFxuICAgIHZhciBjb2RlID0g5re75Yqg6Ziy5q2i572R6aG1KOW9k+WJjVVSTCwgVUEpXFxufWVsc2V7XFxuICAgIHZhciBjb2RlID0gZ2V0Q29kZSgpXFxufVxcbiAgICBcXG5cXG4gICAgLy/lpLTpg6jliJfooajmlbDmja5cXG4gICAgdmFyIOWktOmDqCA9ICHlpLTpg6jliJfooaggPyBjb2RlIDogcGRmYShjb2RlLCDlpLTpg6jliJfooagpWzBdO1xcbiAgICDmoIfpopggPSBwZGZoKOWktOmDqCwg5qCH6aKYKVxcbiAgICDlm77niYcgPSBwZGZoKOWktOmDqCwg5Zu+54mHKVxcbiAgICBpZiAo5Zu+54mHKSB7XFxuICAgICAgICDlm77niYcgPSDlm77niYcuaW5jbHVkZXMoJ2h0dHAnKSA/IOWbvueJhyA6IOWJjee8gCArIOWbvueJh1xcbiAgICAgICAgaWYgKCHorr/pl67lpLQpIHt9IGVsc2UgaWYgKOiuv+mXruWktC5zdWJzdHIoMCwgMSkgPT0gJ0AnKSB7XFxuICAgICAgICAgICAg5Zu+54mHID0g5Zu+54mHICsg6K6/6Zeu5aS0XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIOWbvueJhyA9IOWbvueJhyArIFxcXCJAUmVmZXJlcj1cXFwiICsg6K6/6Zeu5aS0XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgXFxu5o+P6L+wID0g5o+P6L+wLmluY2x1ZGVzKCckJykgPyDmj4/ov7Auc3BsaXQoJyQnKVsxXSArIHBkZmgo5aS06YOoLCDmj4/ov7Auc3BsaXQoJyQnKVswXSkgOiBwZGZoKOWktOmDqCwg5o+P6L+wKVxcblxcbuS9nOiAhSA9IOS9nOiAhS5pbmNsdWRlcygnJCcpID8g5L2c6ICFLnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5L2c6ICFLnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOS9nOiAhSlcXG4gICAgXFxu5pe26Ze0ID0g5pe26Ze0LmluY2x1ZGVzKCckJykgPyDml7bpl7Quc3BsaXQoJyQnKVsxXSArIHBkZmgo5aS06YOoLCDml7bpl7Quc3BsaXQoJyQnKVswXSkgOiBwZGZoKOWktOmDqCwg5pe26Ze0KVxcblxcbuWIhuexuyA9IOWIhuexuy5pbmNsdWRlcygnJCcpID8g5YiG57G7LnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5YiG57G7LnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOWIhuexuylcXG5cXG4gICAgXFxuICAgIC8v5aS06YOo5YiX6KGoXFxuICAgIOa3u+WKoOWktOmDqOWIl+ihqChkLCDmoIfpopgsIOWbvueJhywg5o+P6L+wLCDkvZzogIUsIOaXtumXtCwg5YiG57G7LOW9k+WJjVVSTClcXG4gICAgXFxuICAgIC8v6Lev57q/5ZCN5LiO6YCJ6ZuG5pWw5o2uXFxuICAgIHZhciDnq6DoioJqc29uID0g5LyY5YyW6Lev57q/56ug6IqC5pWw5o2uKOWkmui3r+e6v+WQpiwgY29kZSwg6Lev57q/5YiX6KGoLOi3r+e6v+WQjSzpgInpm4bmgLvliJfooags6YCJ6ZuG5YiX6KGoLOmbhuWQjSzpm4Z1cmws5YmN57yALOW9k+WJjemhteWQjSzlm77niYcpXFxuXFxuICAgIC8v566A5LuLXFxuICAgIOa3u+WKoOeugOS7iyhkLCBwZGZoKGNvZGUsIOeugOS7iyksIOW9k+WJjVVSTCwgJycpXFxuXFxuICAgLy/lvZPmsqHmnInnq6DoioLlhoXlrrnvvIzlsLHkuI3mmL7npLpcXG4gICAgaWYgKOeroOiKgmpzb24ubGVuZ3RoID4gMCkge1xcblxcbiAgICAgICAgLy/ot6/nur/pgInmi6lcXG4gICAgICAgIHZhciDpgInmi6nliJfooaggPSDmt7vliqDpgInmi6not6/nur8oZCwg56ug6IqCanNvbiwg5b2T5YmNVVJMLCDlpJrot6/nur/lkKYpXFxuXFxuICAgICAgICAvL+mAieaLqeS4i+i9vVxcbiAgICAgICAg5re75Yqg6YCJ5oup5LiL6L29KGQsIOeroOiKgmpzb24s5aSa6Lev57q/5ZCmKVxcblxcbiAgICAgICAgLy/mjpLluo/kuI7pgInpm4ZcXG4gICAgICAgIHZhciBsYXp5ID0gYEBsYXp5UnVsZT0uanM6YCArIOa8q+eUu+ino+aekDtcXG4gICAgICAgIOa3u+WKoOWIl+ihqOeroOiKgihkLCDnq6DoioJqc29uW+mAieaLqeWIl+ihqF0udGl0bGUsIOeroOiKgmpzb25b6YCJ5oup5YiX6KGoXS5saXN0LCBsYXp5LCDlvZPliY1VUkwsICcnKVxcblxcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxvbmdfdGV4dFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHNldFJlc3VsdChkKVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS6jOe6p+WIl+ihqFwiLFwicGF0aFwiOlwiZWpsYlwiLFwicnVsZVwiOlwidmFyIHRhYnMgPSBbXVxcbnZhciBsaXN0cyA9IFtdXFxudmFyIGFydHMgPSBwZGZhKGh0bWwsIOe6v+i3ryk7XFxuYXJ0cy5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcbiAgICB0YWJzLnB1c2gocGRmaChkYXRhLCDnur/ot6/lkI0pKVxcbn0pXFxudmFyIGNvbnRzID0gcGRmYShodG1sLCDpgInpm4YpO1xcbmNvbnRzLmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxuICAgIGxpc3RzLnB1c2gocGRmYShkYXRhLCDpgInpm4bliJfooagpKVxcbn0pXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJNeVZhcihcXFwibGlzdHNcXFwiKTtcXG59KSk7XFxuc3RvcmFnZTAucHV0TXlWYXIoXFxcImxpc3RzXFxcIiwgbGlzdHMpO1xcbnZhciBsaXN0ID0gbGlzdHNbZ2V0TXlWYXIoTVlfVVJMLCAnMCcpXTtcXG52YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsICcjMWFhZDE5XFxcIj7mraPluo8nKTtcXG52YXIg5o+Q56S6ID0g5o6S5bqPID09ICcjRkYwMDAwXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFwiPuato+W6jycgOiAnI0ZGMDAwMFxcXCI+5YCS5bqPJztcXG52YXIg5o6S5bqP5ZCNID0gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjrmjpLluo88L3NwYW4+PC9iPidcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogJyArIOaOkuW6jyArICc8L3NwYW4+PC9iPicsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgo5o6S5bqP5ZCNLCBsYXp5KSA9PiB7XFxuICAgICAgICB2YXIgbGlzdHMgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwibGlzdHNcXFwiKTtcXG4gICAgICAgIHZhciDnq6DoioIgPSBsaXN0c1tnZXRNeVZhcihNWV9VUkwsICcwJyldO1xcbiAgICAgICAgdmFyIOaOkuW6jyA9IGdldE15VmFyKE1ZX1VSTCArIFxcXCLnq6DoioLmjpLluo9cXFwiLCAnIzFhYWQxOVxcXCI+5q2j5bqPJyk7XFxuICAgICAgICB2YXIg5o+Q56S6ID0g5o6S5bqPID09ICcjRkYwMDAwXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFwiPuato+W6jycgOiAnI0ZGMDAwMFxcXCI+5YCS5bqPJztcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBNWV9VUkwgKyBcXFwiX+aOkuW6j1xcXCJcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRpdGxlOiDmjpLluo/lkI0ucmVwbGFjZSgn5o6S5bqPJywg5o+Q56S6KVxcbiAgICAgICAgfSlcXG4gICAgICAgIGlmICjmjpLluo8gPT0gJyMxYWFkMTlcXFwiPuato+W6jycpIHtcXG4gICAgICAgICAgICDnq6DoioIucmV2ZXJzZSgpXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgY3AgPSDnq6DoioIubWFwKChkYXRhLCBzc2lkKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgoZGF0YSwgJ2EmJlRleHQnKSxcXG4gICAgICAgICAgICAgICAgdXJsOiBwZChkYXRhLCAnYSYmaHJlZicpICsgbGF6eSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzInLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFwiX+mAiembhlxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9KTtcXG4gICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhNWV9VUkwgKyBcXFwiX+mAiembhlxcXCIpO1xcbiAgICAgICAgYWRkSXRlbUJlZm9yZShNWV9VUkwgKyBcXFwiZm9vdGVyXFxcIiwgY3ApO1xcbiAgICAgICAgcHV0TXlWYXIoTVlfVVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsIOaPkOekuilcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwg5o6S5bqP5ZCNLCBsYXp5KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBNWV9VUkwgKyBcXFwiX+aOkuW6j1xcXCJcXG4gICAgfVxcbn0pXFxudGFicy5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldE15VmFyKE1ZX1VSTCwgJzAnKSA9PSBpZCA/ICfigJzigJwnICsgZGF0YSArICfigJ3igJ0nIDogZGF0YSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgo57q/6LevLCBsYXp5LCBpZCkgPT4ge1xcbiAgICAgICAgICAgIHZhciBsaXN0cyA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJsaXN0c1xcXCIpO1xcbiAgICAgICAgICAgIHZhciDmjpLluo8gPSBnZXRNeVZhcihNWV9VUkwgKyBcXFwi56ug6IqC5o6S5bqPXFxcIiwgJyMxYWFkMTlcXFwiPuato+W6jycpO1xcbiAgICAgICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFwiPuWAkuW6jycgPyAnIzFhYWQxOVxcXCI+5q2j5bqPJyA6ICcjRkYwMDAwXFxcIj7lgJLluo8nO1xcblxcbiAgICAgICAgICAgIOe6v+i3ry5mb3JFYWNoKChkYXRhLCB4bGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGlkID09IHhsaWQgPyAn4oCc4oCcJyArIGRhdGEgKyAn4oCd4oCdJyA6IGRhdGEsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNWV9VUkwgKyBcXFwiX+e6v+i3r1xcXCIgKyB4bGlkXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfVVJMLCBpZClcXG4gICAgICAgICAgICB2YXIg56ug6IqCID0gbGlzdHNbZ2V0TXlWYXIoTVlfVVJMLCAnMCcpXTtcXG4gICAgICAgICAgICBpZiAo5o6S5bqPID09ICcjRkYwMDAwXFxcIj7lgJLluo8nKSB7XFxuICAgICAgICAgICAgICAgIOeroOiKgi5yZXZlcnNlKClcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGNwID0g56ug6IqCLm1hcCgoZGF0YSwgc3NpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgoZGF0YSwgJ2EmJlRleHQnKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogcGQoZGF0YSwgJ2EmJmhyZWYnKSArIGxhenksXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfMicsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfVVJMICsgXFxcIl/pgInpm4ZcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKE1ZX1VSTCArIFxcXCJf6YCJ6ZuGXFxcIik7XFxuICAgICAgICAgICAgYWRkSXRlbUJlZm9yZShNWV9VUkwgKyBcXFwiZm9vdGVyXFxcIiwgY3ApO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIH0sIHRhYnMsIGxhenksIGlkKSxcXG4gICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogTVlfVVJMICsgXFxcIl/nur/ot69cXFwiICsgaWRcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufSlcXG5cXG5pZiAo5o6S5bqPID09ICcjRkYwMDAwXFxcIj7lgJLluo8nKSB7XFxuICAgIGxpc3QucmV2ZXJzZSgpXFxufVxcbmxpc3QuZm9yRWFjaCgoZGF0YSwgaWQpID0+IHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsICdhJiZUZXh0JyksXFxuICAgICAgICB1cmw6IHBkKGRhdGEsICdhJiZocmVmJykgKyBsYXp5LFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzInLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBjbHM6IE1ZX1VSTCArIFxcXCJf6YCJ6ZuGXFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59KVxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiYmlnX2JsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBNWV9VUkwgKyBcXFwiZm9vdGVyXFxcIlxcbiAgICB9XFxufSk7XCJ9XSxcInBhcmFtc1wiOlwie1xcXCJSVUxFXFxcIjp7XFxcImFyZWFfdXJsXFxcIjpcXFwiXFxcIixcXFwiY2xhc3NfdXJsXFxcIjpcXFwiNVxcXCIsXFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcImRldGFpbF9jb2xfdHlwZVxcXCI6XFxcInRleHRfMlxcXCIsXFxcImRldGFpbF9maW5kX3J1bGVcXFwiOlxcXCJqczpcXFxcbnZhciBkID0gW107XFxcXG52YXIgaHRtbCA9IGdldFJlc0NvZGUoKTtcXFxcbnZhciBsaXN0ID0gcGRmYShodG1sLCBcXFxcXFxcIi5jYXRhbG9nX2xpc3QmJmFcXFxcXFxcIikucmV2ZXJzZSgpO1xcXFxuXFxcXG5mdW5jdGlvbiBwbGF5ZXIoVXJsKSB7XFxcXG4gICAgcmV0dXJuICQoVXJsKS5sYXp5UnVsZSgoKSA9PiB7XFxcXG4gICAgICAgIHZhciBodG1sID0gZmV0Y2goaW5wdXQpO1xcXFxuICAgICAgICB2YXIgY29kZSA9IHBkZmgoaHRtbCwgXFxcXFxcXCJib2R5JiZzY3JpcHQmJkh0bWxcXFxcXFxcIik7XFxcXG4gICAgICAgIGV2YWwoY29kZSk7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiArIG5ld0ltZ3Muam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxuICAgIH0pXFxcXG59XFxcXG5cXFxcbnZhciBkZXRhaWxfaW1nID0gcGRmaChodG1sLCBcXFxcXFxcIi5jb21pY19jb3ZlciYmZGF0YS1vcmlnaW5hbFxcXFxcXFwiKTtcXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IHBkZmgoaHRtbCwgXFxcXFxcXCIubGFzdF90aW1lX2NoYXB0ZXImJnNwYW4mJlRleHRcXFxcXFxcIiksXFxcXG4gICAgZGVzYzogcGRmaChodG1sLCBcXFxcXFxcIi5kZXRhaWxfd3JhcCYmVGV4dFxcXFxcXFwiKSxcXFxcbiAgICBpbWc6IGRldGFpbF9pbWcsXFxcXG4gICAgdXJsOiBkZXRhaWxfaW1nICsgXFxcXFxcXCIjLmpwZ1xcXFxcXFwiLFxcXFxuICAgIGNvbF90eXBlOiAnbW92aWVfMV9sZWZ0X3BpYydcXFxcbn0pO1xcXFxuXFxcXG5pZiAoaHRtbC5pbmNsdWRlcyhcXFxcXFxcIuWKoOi9veabtOWkmlxcXFxcXFwiKSkge1xcXFxuICAgIHZhciBpZCA9IHBkZmgoaHRtbCwgXFxcXFxcXCIubW9yZUNvbW1lbnQmJmRhdGEtaWRcXFxcXFxcIik7XFxcXG4gICAgdmFyIGxpc3QyID0gSlNPTi5wYXJzZShwb3N0KGNvbmZpZy5kb21haW4gKyBcXFxcXFxcImJvb2tjaGFwdGVyL1xcXFxcXFwiLCB7XFxcXG4gICAgICAgIGJvZHk6IHtcXFxcbiAgICAgICAgICAgIGlkOiBpZCxcXFxcbiAgICAgICAgICAgIGlkMjogXFxcXFxcXCIxXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pKS5yZXZlcnNlKCk7XFxcXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Mi5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICB2YXIgbDIgPSBsaXN0MltpXTtcXFxcbiAgICAgICAgdmFyIFVybCA9IE1ZX1VSTCArIGwyLmNoYXB0ZXJpZCArIFxcXFxcXFwiLmh0bWxcXFxcXFxcIjtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBsMi5jaGFwdGVybmFtZSxcXFxcbiAgICAgICAgICAgIHVybDogcGxheWVyKFVybClcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogcGRmaChsaXN0W2ldLCBcXFxcXFxcInAmJlRleHRcXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogcGxheWVyKHBhcnNlRG9tKGxpc3RbaV0sIFxcXFxcXFwiYSYmaHJlZlxcXFxcXFwiKSlcXFxcbiAgICB9KTtcXFxcbn1cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6ICc8YnI+JyxcXFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCdcXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGQpO1xcXCIsXFxcImZpbmRfcnVsZVxcXCI6XFxcImpzOlxcXFxudmFyIGQgPSBbXTtcXFxcbnRyeSB7XFxcXG4gICAgdmFyIGNvbnRzID0gSlNPTi5wYXJzZShnZXRSZXNDb2RlKCkpO1xcXFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udHMubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgdmFyIGxpc3QgPSBjb250c1tpXTtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBsaXN0Lm5hbWUsXFxcXG4gICAgICAgICAgICBkZXNjOiBsaXN0LnJlbWFya3MsXFxcXG4gICAgICAgICAgICBpbWc6IGxpc3QuaW1ndXJsLFxcXFxuICAgICAgICAgICAgdXJsOiBjb25maWcuZG9tYWluICsgbGlzdC5pZCArIFxcXFxcXFwiL1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbn0gY2F0Y2ggKGUpIHt9XFxcXG5zZXRSZXN1bHQoZCk7XFxcIixcXFwiZmlyc3RIZWFkZXJcXFwiOlxcXCJjbGFzc1xcXCIsXFxcImdyb3VwXFxcIjpcXFwi4pGg6L275ZCI6ZuGXFxcIixcXFwicGFyYW1zXFxcIjp7fSxcXFwicHJveHlcXFwiOlxcXCJcXFwiLFxcXCJzb3J0X3VybFxcXCI6XFxcIlxcXCIsXFxcInRpdGxlXFxcIjpcXFwi5LiD5aSV5ryr55S7XFxcIixcXFwidWFcXFwiOlxcXCJhdXRvXFxcIixcXFwidXJsXFxcIjpcXFwiaHR0cDovL20ucWl4aW1oMS5jb20vcmFua2RhdGEucGhwP3BhZ2VfbnVtPWZ5cGFnZSZ0eXBlPWZ5Y2xhc3M7cG9zdDs7e1JlZmVyZXJAaHR0cDovL20ucWl4aW1oMS5jb20vfVxcXCIsXFxcInZlcnNpb25cXFwiOjAsXFxcInllYXJfdXJsXFxcIjpcXFwiXFxcIn0sXFxcInBhZ2VUaXRsZVxcXCI6XFxcIuaatOWQm+eIseS6ulxcXCIsXFxcInVybFxcXCI6XFxcImh0dHA6Ly9tLnFpeGltaDEuY29tLzI1MTM0LztHRVQ7VVRGLTg7e1VzZXItQWdlbnRATW96aWxsYS81LjAgKExpbnV477yb77ybIEFuZHJvaWQgMTHvvJvvvJsgTWkgMTAgUHJvKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE1MiBNb2JpbGUgU2FmYXJpLzUzNy4zNiYmUmVmZXJlckBodHRwOi8vbS5xaXhpbWgxLmNvbS99XFxcIn1cIixcInNhdmVkXCI6ZmFsc2UsXCJ0aXRsZVwiOlwi6IGa5ryr8J+UrlwiLFwidmVyc2lvblwiOjAsXCJ1cmxcIjpcImh0dHA6Ly9tLnFpeGltaDEuY29tLzI1MTM0LztHRVQ7VVRGLTg7e1VzZXItQWdlbnRATW96aWxsYS81LjAgKExpbnV477yb77ybIEFuZHJvaWQgMTHvvJvvvJsgTWkgMTAgUHJvKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE1MiBNb2JpbGUgU2FmYXJpLzUzNy4zNiYmUmVmZXJlckBodHRwOi8vbS5xaXhpbWgxLmNvbS99XCIsXCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwiZmluZF9ydWxlXCI6XCJqczpcXG5jb25zdCBRSU5HX1RJVExFID0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpXFxubGV0IG15Q29sbGVjdGlvbl9lbCA9IFtdLFxcbiAgICB7IFJVTEUsIGlzSW5kZXgsIHBhZ2VUaXRsZSB9ID0gTVlfUEFSQU1TLFxcbiAgICB0aGlzUlVMRSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9JyArIFFJTkdfVElUTEUpKCkuZmluZCgodikgPT4gdi50aXRsZSA9PSBSVUxFLnRpdGxlKVxcbmlmIChpc0luZGV4KSB7XFxuICAgIFJVTEUgPSB0aGlzUlVMRVxcbn0gZWxzZSB7XFxuICAgIFJVTEUucGFnZXMgPSB0aGlzUlVMRS5wYWdlc1xcbn1cXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9wcmVGdW5jP3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL3VybFBhcnNlP3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcblxcbmlmIChpc0luZGV4KSB7XFxuICAgIGlmIChNWV9QQUdFID09IDEpIHtcXG4gICAgICAgIC8vIOWKoOi9vUNsYXNzVGFi57uE5Lu2XFxuICAgICAgICBldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9DbGFzc1RhYj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXG4gICAgICAgIHRhYkhlYWRlci5sb2FkKG15Q29sbGVjdGlvbl9lbClcXG4gICAgICAgIGlmIChSVUxFLnNlYXJjaF91cmwpIG15Q29sbGVjdGlvbl9lbC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIuaQnOS9oOaDs+imgeeahC4uLlxcXCIsXFxuICAgICAgICAgICAgdXJsOiAnXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIitpbnB1dCcsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgcnVsZXM6ICQudG9TdHJpbmcoKFFJTkdfVElUTEUsIHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFKSgpXFxuICAgICAgICAgICAgICAgICAgICBydWxlcyA9IFtydWxlcy5maW5kKCh2KSA9PiB2LnRpdGxlID09IHRpdGxlKV1cXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShydWxlcylcXG4gICAgICAgICAgICAgICAgfSwgUUlOR19USVRMRSwgUlVMRS50aXRsZSksXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignc2VhcmNoS2V5JyxpbnB1dClcXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIH0pXFxuICAgICAgICBNWV9SVUxFLmNsYXNzX3VybCA9IHRhYkhlYWRlci5nZXRDbGFzcyhmeUFsbCA/ICdmeUFsbCcgOiAnZnljbGFzcycpLnVybFxcbiAgICAgICAgTVlfUlVMRS5hcmVhX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5YXJlYScpLnVybFxcbiAgICAgICAgTVlfUlVMRS55ZWFyX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5eWVhcicpLnVybFxcbiAgICAgICAgTVlfUlVMRS5zb3J0X3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5c29ydCcpLnVybFxcbiAgICB9XFxuICAgIC8vIOWkhOeQhk1ZX1JVTEVcXG4gICAgTVlfUlVMRS51cmwgPSBSVUxFLnVybFxcbiAgICBNWV9SVUxFLmNvbF90eXBlID0gUlVMRS5jb2xfdHlwZVxcbiAgICBNWV9SVUxFLmRldGFpbF9jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxuICAgIE1ZX1JVTEUuZmluZF9ydWxlID0gUlVMRS5maW5kX3J1bGVcXG4gICAgTVlfUlVMRS5kZXRhaWxfZmluZF9ydWxlID0gUlVMRS5kZXRhaWxfZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUucGFyYW1zID0ge31cXG59IGVsc2Uge1xcbiAgICBNWV9SVUxFLnVybCA9IE1ZX1BBUkFNUy51cmxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxuICAgIE1ZX1JVTEUuZmluZF9ydWxlID0gUlVMRS5kZXRhaWxfZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUucGFyYW1zID0gUlVMRS5wYXJhbXNcXG59XFxuTVlfUlVMRS5wYWdlcyA9IFJVTEUucGFnZXNcXG5NWV9SVUxFLnBhZ2VMaXN0ID0gSlNPTi5wYXJzZShNWV9SVUxFLnBhZ2VzIHx8ICdbXScpXFxuTVlfUlVMRS50aXRsZSA9IFJVTEUudGl0bGVcXG5cXG5pZiAoIWlzSW5kZXgpIHtcXG4gICAgaWYgKHBhZ2VUaXRsZSkgc2V0UGFnZVRpdGxlKHBhZ2VUaXRsZSlcXG4gICAgc2V0TGFzdENoYXB0ZXJSdWxlKHRoaXNSVUxFLmxhc3RfY2hhcHRlcl9ydWxlKVxcbiAgICBNWV9QQVJBTVMgPSBNWV9SVUxFLnBhcmFtc1xcbn1cXG4vLyDpooTlpITnkIblubbliJ3lp4vljJZjb25maWdcXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxuICAgIGxldCBsb2FkZWQgPSBnZXRNeVZhcihNWV9SVUxFLnRpdGxlICsgXFxcIkBwcmVcXFwiKVxcbiAgICBpZiAoIWxvYWRlZCB8fCBpc0luZGV4KSB7XFxuICAgICAgICBldmFsKHRoaXNSVUxFLnByZVJ1bGUpXFxuICAgICAgICBwdXRNeVZhcihNWV9SVUxFLnRpdGxlICsgXFxcIkBwcmVcXFwiLCBcXFwiMVxcXCIpXFxuICAgIH1cXG59XFxubGV0IF9jZmcgPSBnZXRNeVZhcignaW5pdENvbmZpZycsICd7fScpXFxuaWYgKF9jZmcgJiYgX2NmZy5sZW5ndGggPiAwKSB7XFxuICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoX2NmZylcXG59XFxuXFxuLy8g5q2j5paH6Kej5p6Q6YCa55So5Y+Y6YePXFxubGV0IGFzc2lnbkxhenlSdWxlID0gJC50b1N0cmluZygoUUlOR19USVRMRSwgdGl0bGUsIHVybCkgPT4ge1xcbiAgICBsZXQgUlVMRSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9XFxcIiArIFFJTkdfVElUTEUpKCkuZmluZCgodikgPT4gdi50aXRsZSA9PSB0aXRsZSlcXG4gICAgcmV0dXJuIHsgdGl0bGU6dGl0bGUsIHVybDogdXJsLCBwYWdlczogUlVMRS5wYWdlcywgcGFnZUxpc3Q6IEpTT04ucGFyc2UoUlVMRS5wYWdlcyB8fCAnW10nKSB9XFxufSwgUUlOR19USVRMRSwgTVlfUlVMRS50aXRsZSwgTVlfUlVMRS51cmwpXFxuZnVuY3Rpb24gZ2VuTXlSdWxlKCkge1xcbiAgICBsZXQgcnVsZSA9IE9iamVjdC5hc3NpZ24oe30sIE1ZX1JVTEUpXFxuICAgIGRlbGV0ZSBydWxlLmxhc3RfY2hhcHRlcl9ydWxlXFxuICAgIGRlbGV0ZSBydWxlLnByZVJ1bGVcXG4gICAgZGVsZXRlIHJ1bGUucGFnZUxpc3RcXG4gICAgZGVsZXRlIHJ1bGUucGFnZXNcXG4gICAgcmV0dXJuIHJ1bGVcXG59XFxuZnVuY3Rpb24gcnVuQ29kZShydWxlKSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcbiAgICAgICAgcmV0dXJuIGNvZGUgPyBldmFsKGNvZGUpIDogcnVsZVxcbiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBydWxlIH1cXG59XFxuZnVuY3Rpb24gZ2VuRXhVcmwodXJsKSB7XFxuICAgIHVybCA9IHVybC5zcGxpdCgnOycpXFxuICAgIHJldHVybiB1cmwuc2hpZnQoKSArICc7JyArIHBhcmFtSGFuZGxlKHVybCwgdGhpc1JVTEUudWEsIE1ZX1JVTEUudXJsKVxcbn1cXG4vLyDmraPmlofop6PmnpBcXG5pZiAoTVlfUlVMRS5maW5kX3J1bGUuc3RhcnRzV2l0aCgnanM6JykpIHtcXG4gICAgc2V0UmVzdWx0ID0gZnVuY3Rpb24oZWwsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpIHtcXG4gICAgICAgIHBhcmFtMSA9IENBTExCQUNLX0tFWVxcbiAgICAgICAgcGFyYW0yID0gTVlfUlVMRVxcbiAgICAgICAgcGFyYW0zID0gTVlfVFlQRVxcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZWwuZGF0YSkpIGVsID0gZWwuZGF0YVxcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobXlDb2xsZWN0aW9uX2VsLCBlbC5tYXAoKHYpID0+IHtcXG4gICAgICAgICAgICBpZighdi5leHRyYSkgdi5leHRyYSA9IHt9XFxuICAgICAgICAgICAgdi5jb2xfdHlwZSA9IHYuY29sX3R5cGUgfHwgTVlfUlVMRS5jb2xfdHlwZVxcbiAgICAgICAgICAgIGxldCBNWV9fUlVMRSA9IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgcGFyYW1zOiB2LmV4dHJhIH0pXFxuXFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2LnVybCAhPSAnc3RyaW5nJyB8fCBbJ3J1bGUnLCAncGljcycsICd0b2FzdCcsICdpbnB1dCcsICdjb25maXJtJywgJ2NvcHknLCAnZWRpdEZpbGUnLCAneDUnLCAneDVXZWJWaWV3JywgJ3g1UGxheScsICd3ZWInLCAnc2VsZWN0JywgJ3g1UnVsZScsICd3ZWJSdWxlJywgJ2Rvd25sb2FkJywgJ3NoYXJlJ10uZmluZCgodnYpID0+IHYudXJsLnN0YXJ0c1dpdGgodnYgKyAnOi8vJykpIHx8IFsneDVfd2Vidmlld19zaW5nbGUnLCAnaW5wdXQnXS5maW5kKCh2dikgPT4gdi5jb2xfdHlwZSA9PSB2dikpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYudXJsLmluY2x1ZGVzKCdAcnVsZT0nKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgW18sIHVybCwgcnVsZV0gPSB2LnVybC5tYXRjaCgvXihbXFxcXHNcXFxcU10qPylAcnVsZT0oW1xcXFxzXFxcXFNdKikkLylcXG4gICAgICAgICAgICAgICAgdi51cmwgPSB1cmxcXG4gICAgICAgICAgICAgICAgTVlfX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHJ1bGVcXG4gICAgICAgICAgICAgICAgTVlfX1JVTEUuZGV0YWlsX2NvbF90eXBlID0gTVlfUlVMRS5jb2xfdHlwZVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodi51cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKSB7XFxuICAgICAgICAgICAgICAgIGlmICh2LnVybC5pbmNsdWRlcygncnVsZT0nKSB8fCB2LmV4dHJhLnJ1bGUpXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdlxcbiAgICAgICAgICAgICAgICBsZXQgW18sIHBhdGgsIGZsYWcsIHBhcmFtc10gPSB2LnVybC5tYXRjaCgvXmhpa2VyOlxcXFwvXFxcXC9wYWdlXFxcXC8oLis/KSgjLio/KT8oPzpcXFxcPyguKikpPyQvKSxcXG4gICAgICAgICAgICAgICAgICAgIHN1YlBhZ2UgPSBNWV9SVUxFLnBhZ2VMaXN0LmZpbmQoKHYpID0+IHYucGF0aCA9PSBwYXRoKSxcXG4gICAgICAgICAgICAgICAgICAgIHN1YlVybCA9IChwYXJhbXMgfHwgJycpLnNwbGl0KCcmJykuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCd1cmw9JykpXFxuICAgICAgICAgICAgICAgIHYudXJsID0gKHN1YlVybCA/IHN1YlVybC5zbGljZSg0KS5yZXBsYWNlKC/vvJ/vvJ8vZywgJz8nKS5yZXBsYWNlKC/vvIbvvIYvZywgJyYnKSA6ICh2LmV4dHJhIHx8IHt9KS51cmwpIHx8ICdoaWtlcjovL2VtcHR5JyArIGZsYWcgKyAnPycgKyAocGFyYW1zIHx8ICcnKVxcbiAgICAgICAgICAgICAgICBNWV9fUlVMRS5kZXRhaWxfZmluZF9ydWxlID0gc3ViUGFnZS5ydWxlXFxuICAgICAgICAgICAgICAgIE1ZX19SVUxFLmRldGFpbF9jb2xfdHlwZSA9IHN1YlBhZ2UuY29sX3R5cGVcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYudXJsLmluY2x1ZGVzKCdAbGF6eVJ1bGU9JykpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlSW5kZXggPSB2LnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgdi51cmwgPSB2LnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6XFxcXG5pZihNWV9SVUxFKU9iamVjdC5hc3NpZ24oTVlfUlVMRSwgJyArIGFzc2lnbkxhenlSdWxlICsgJyk7JyArIHYudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgICAgICAgICByZXR1cm4gdlxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbmRleCkge1xcbiAgICAgICAgICAgICAgICBpZiAoIU1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSB8fCAvaGlrZXI6XFxcXC9cXFxcLyg/IWVtcHR5LiskKS8udGVzdCh2LnVybCkpIHJldHVybiB2XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdi5leHRyYSA9IE9iamVjdC5hc3NpZ24oe30sIHYuZXh0cmEsIHtcXG4gICAgICAgICAgICAgICAgdXJsOiBnZW5FeFVybCh2LnVybCksXFxuICAgICAgICAgICAgICAgIFJVTEU6IE1ZX19SVUxFLFxcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgdi50aXRsZVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgdi51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxuICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgIH0pKVxcbiAgICAgICAgbWV0aG9kX3NldFJlc3VsdC5pbnZva2UoamF2YUNvbnRleHQsIG15Q29sbGVjdGlvbl9lbCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcXG4gICAgfVxcbiAgICBzZXRIb21lUmVzdWx0ID0gc2V0UmVzdWx0XFxuICAgIHNldFNlYXJjaFJlc3VsdCA9IHNldFJlc3VsdFxcblxcbiAgICBldmFsKE1ZX1JVTEUuZmluZF9ydWxlLnNsaWNlKDMpKVxcbn0gZWxzZSB7XFxuICAgIGxldCBbXywgZmluZFJ1bGUsIGRldGFpbEZpbmRSdWxlXSA9IE1ZX1JVTEUuZmluZF9ydWxlLm1hdGNoKC9eKFtcXFxcc1xcXFxTXSo/KSg/Oj09PihbXFxcXHNcXFxcU10qKSk/JC8pXFxuICAgIGZpbmRSdWxlID0gZmluZFJ1bGUuc3BsaXQoJzsnKVxcbiAgICBwYXJzZURvbUZvckFycmF5KGdldFJlc0NvZGUoKSwgZmluZFJ1bGUuc2hpZnQoKSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xcbiAgICAgICAgbGV0IFt0aXRsZSwgaW1nLCBkZXNjLCB1cmxdID0gZmluZFJ1bGUubWFwKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAnKicpIHJldHVybiAnJ1xcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB2ID0gKGkgPT0gMSB8fCBpID09IDMpID9cXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbShkYXRhLCB2KSA6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEb21Gb3JIdG1sKGRhdGEsIHYpXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAzKSB2ID0gcnVuQ29kZSh2KVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gJycgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHJlcyA9IHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLCB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYywgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBNWV9SVUxFLmNvbF90eXBlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgaWYgKHJlcy51cmwpIHtcXG4gICAgICAgICAgICBpZiAocmVzLnVybC5pbmNsdWRlcygnQGxhenlSdWxlPScpKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZUluZGV4ID0gcmVzLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgcmVzLnVybCA9IHJlcy51cmwuc2xpY2UoMCwgcmVJbmRleCkgKyAnLmpzOlxcXFxuaWYoTVlfUlVMRSlPYmplY3QuYXNzaWduKE1ZX1JVTEUsICcgKyBhc3NpZ25MYXp5UnVsZSArICcpOycgKyByZXMudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgICAgIH0gZWxzZSAgaWYgKGRldGFpbEZpbmRSdWxlKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5leHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgZGV0YWlsX2ZpbmRfcnVsZTogZGV0YWlsRmluZFJ1bGUgfSksXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgdGl0bGVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTVlfUlVMRS5kZXRhaWxfZmluZF9ydWxlKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5leHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IGdlbk15UnVsZSgpLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBpc0luZGV4ICYmIHRpdGxlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmVzLnVybCA9ICdoaWtlcjovL3BhZ2UvZnJhbWVMb2FkP3J1bGU9JyArIFFJTkdfVElUTEVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBteUNvbGxlY3Rpb25fZWwucHVzaChyZXMpXFxuICAgIH0pXFxuICAgIHNldFJlc3VsdChteUNvbGxlY3Rpb25fZWwpXFxufVxcblwiLFwiZ3JvdXBcIjpcIuKRoOi9u+WQiOmbhlwiLFwidWFcIjpcImF1dG9cIixcInByZVJ1bGVcIjpcInB1dE15VmFyKCdteUNvbGxlY3Rpb24nLCBNWV9SVUxFLnRpdGxlKVxcbnB1dE15VmFyKCdyZW1vdGVVcmwnLCAnaGlrZXI6Ly9maWxlcy8vcnVsZXMvVHovSk0nKVxcbi8vIFxcbi8qXFxuKi9cIixcInBhZ2VzXCI6XCJbe1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMVxcXCIsXFxcIm5hbWVcXFwiOlxcXCJDbGFzc1RhYlxcXCIsXFxcInBhdGhcXFwiOlxcXCJDbGFzc1RhYlxcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBDbGFzc1RhYiA9IGZ1bmN0aW9uKGNsYXNzQXJyYXksIHBhcmFtcykge1xcXFxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgcGFyYW1zKVxcXFxuICAgIHRoaXMuYXJyID0gY2xhc3NBcnJheS5tYXAodiA9PiB0aGlzLmluaXQodikpXFxcXG4gICAgdGhpcy5zaWduID0gJyQnICsgUUlOR19USVRMRSArICdfJyArICh0aGlzLm5hbWUgfHwgJycpICsgJ18nXFxcXG4gICAgdGhpcy5jb2xvciA9IHRoaXMuY29sb3IgfHwgJyMxMmI2NjgnXFxcXG4gICAgdGhpcy5ib3VuZGFyeSA9IHRoaXMuYm91bmRhcnkgfHwgJ2JsYW5rX2Jsb2NrJ1xcXFxufVxcXFxuQ2xhc3NUYWIucHJvdG90eXBlID0ge1xcXFxuICAgIGNvbnN0cnVjdG9yOiBDbGFzc1RhYixcXFxcbiAgICBsb2FkKGVsKSB7XFxcXG4gICAgICAgIGxldCBmb2xkZWQgPSB0aGlzLmZvbGQgJiYgZ2V0VmFyKCdmb2xkXycgKyB0aGlzLnNpZ24sICcnKVxcXFxuICAgICAgICBpZiAodGhpcy5hcnIubGVuZ3RoID4gMSAmJiB0aGlzLmZvbGQpIGVsLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKGZvbGRlZCA/ICfilrYnIDogJ+KWvCcpLmZvbnRjb2xvcignIzA0OWVmZicpLFxcXFxuICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChzaWduLCBmb2xkZWQpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2ZvbGRfJyArIHNpZ24sIHsgJyc6ICdUJywgJ1QnOiAnJyB9IFtmb2xkZWRdKVxcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgICAgIH0sIHRoaXMuc2lnbiwgZm9sZGVkKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgbGV0IGFyciA9IGZvbGRlZCA/IFt0aGlzLmFyclswXV0gOiB0aGlzLmFyclxcXFxuICAgICAgICBhcnIuZm9yRWFjaCgodikgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IHsgaWQsIGNsYXNzX25hbWUsIGNsYXNzX3VybCB9ID0gdixcXFxcbiAgICAgICAgICAgIHNlbGVjdGVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRDbGFzcyhpZCkpXFxcXG4gICAgICAgICAgICBjbGFzc19uYW1lLmZvckVhY2goKG5hbWUsIGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gY2xhc3NfdXJsW2ldLFxcXFxuICAgICAgICAgICAgICAgICAgICBub3cgPSBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IG5hbWUsIHVybDogdXJsIH0pXFxcXG4gICAgICAgICAgICAgICAgZWwucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzZWxlY3RlZCA9PSBub3cgPyAn4oCc4oCc4oCd4oCdJyArIG5hbWUuZm9udGNvbG9yKHRoaXMuY29sb3IpLmJvbGQoKSA6IG5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc2VsZWN0ZWQgPT0gbm93ID8gJ2hpa2VyOi8vZW1wdHknIDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2lnbiwgaWQsIG5vdykgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKHNpZ24gKyBpZCwgbm93KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2lnbiwgaWQsIG5vdyksXFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbiAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIGVsLnB1c2goeyBjb2xfdHlwZTogdGhpcy5ib3VuZGFyeSB9KVxcXFxuICAgICAgICB9KVxcXFxuICAgIH0sXFxcXG4gICAgaW5pdChjbGFzc09iamVjdCkge1xcXFxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzT2JqZWN0LmNsYXNzX25hbWUgPT0gJ3N0cmluZycpXFxcXG4gICAgICAgICAgICBjbGFzc09iamVjdC5jbGFzc19uYW1lID0gY2xhc3NPYmplY3QuY2xhc3NfbmFtZS5zcGxpdCgnJicpXFxcXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NPYmplY3QuY2xhc3NfdXJsID09ICdzdHJpbmcnKVxcXFxuICAgICAgICAgICAgY2xhc3NPYmplY3QuY2xhc3NfdXJsID0gY2xhc3NPYmplY3QuY2xhc3NfdXJsLnNwbGl0KCcmJykubWFwKCh2KSA9PiB2LnRyaW0oKSlcXFxcbiAgICAgICAgcmV0dXJuIGNsYXNzT2JqZWN0XFxcXG4gICAgfSxcXFxcbiAgICBwdXNoKGNsYXNzT2JqZWN0KSB7XFxcXG4gICAgICAgIHRoaXMuYXJyLnB1c2godGhpcy5pbml0KGNsYXNzT2JqZWN0KSlcXFxcbiAgICB9LFxcXFxuICAgIGdldENsYXNzKGlkKSB7XFxcXG4gICAgICAgIGxldCBkZWZhdWx0Q2xhc3MgPSB0aGlzLmFyci5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PSBpZClcXFxcbiAgICAgICAgZGVmYXVsdENsYXNzID0gSlNPTi5zdHJpbmdpZnkoZGVmYXVsdENsYXNzID8ge1xcXFxuICAgICAgICAgICAgbmFtZTogZGVmYXVsdENsYXNzLmNsYXNzX25hbWVbMF0sXFxcXG4gICAgICAgICAgICB1cmw6IGRlZmF1bHRDbGFzcy5jbGFzc191cmxbMF1cXFxcbiAgICAgICAgfSA6IHsgbmFtZTogICdjYW5ub3QgZmluZCBpZDogJyArIGlkICsgJyBpbiBjbGFzc1RhYjogJyArIHRoaXMuc2lnbiwgdXJsOiAnJ30pXFxcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFZhcih0aGlzLnNpZ24gKyBpZCwgZGVmYXVsdENsYXNzKSlcXFxcbiAgICB9LFxcXFxuICAgIHNldFVybCh1cmwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cXFxcXFxcXCRcXFxcXFxcXHsoW159XSopXFxcXFxcXFx9L2csIChfLCBpZCkgPT4gdGhpcy5nZXRDbGFzcyhpZCkudXJsKVxcXFxuICAgIH1cXFxcbn1cXFxcbi8vIOeUn+aIkOWktOmDqOWIhuexu1xcXFxuY29uc3QgZnlBbGwgPSBSVUxFLnVybC5pbmNsdWRlcygnZnlBbGwnKVxcXFxubGV0IHRhYkhlYWRlciA9IFtdXFxcXG5pZiAoUlVMRS5jbGFzc19uYW1lKSB0YWJIZWFkZXIucHVzaCh7XFxcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeWNsYXNzJyxcXFxcbiAgICBjbGFzc19uYW1lOiBSVUxFLmNsYXNzX25hbWUsXFxcXG4gICAgY2xhc3NfdXJsOiBSVUxFLmNsYXNzX3VybFxcXFxufSlcXFxcbmlmIChSVUxFLmFyZWFfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcXFxuICAgIGlkOiBmeUFsbCA/ICdmeUFsbCcgOiAnZnlhcmVhJyxcXFxcbiAgICBjbGFzc19uYW1lOiBSVUxFLmFyZWFfbmFtZSxcXFxcbiAgICBjbGFzc191cmw6IFJVTEUuYXJlYV91cmxcXFxcbn0pXFxcXG5pZiAoUlVMRS55ZWFyX25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXFxcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5eWVhcicsXFxcXG4gICAgY2xhc3NfbmFtZTogUlVMRS55ZWFyX25hbWUsXFxcXG4gICAgY2xhc3NfdXJsOiBSVUxFLnllYXJfdXJsXFxcXG59KVxcXFxuaWYgKFJVTEUuc29ydF9uYW1lKSB0YWJIZWFkZXIucHVzaCh7XFxcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeXNvcnQnLFxcXFxuICAgIGNsYXNzX25hbWU6IFJVTEUuc29ydF9uYW1lLFxcXFxuICAgIGNsYXNzX3VybDogUlVMRS5zb3J0X3VybFxcXFxufSlcXFxcbnRhYkhlYWRlciA9IG5ldyBDbGFzc1RhYih0YWJIZWFkZXIsIHsgbmFtZTogUlVMRS50aXRsZSwgZm9sZDogcmVhZEZpbGUoJ3RhYkZvbGQnKSwgfSlcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJpY29uXzJfcm91bmRcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6K6+572uXFxcIixcXFwicGF0aFxcXCI6XFxcIkNvbmZpZ1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJ2NsZWFyTXlWYXIoXFxcXFxcXCJzb3J0RmxhZ1xcXFxcXFwiKTtyZWZyZXNoUGFnZSgpJylcXFxcbnNldFBhZ2VUaXRsZSgn4pqZIOi9u+WQiOmbhuiuvue9riDimpknKVxcXFxuY29uc3QgUUlOR19USVRMRSA9IGdldE15VmFyKCdteUNvbGxlY3Rpb24nKSxcXFxcbiAgICB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJylcXFxcbmxldCBkYXRhID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSkodHJ1ZSksXFxcXG4gICAgZWwgPSBbe1xcXFxuICAgICAgICB0aXRsZTogJzxiPiDmuIXpmaTnvJPlrZjvvIznq4vljbPmm7TmlrAgPHNtYWxsPiDvvIjln7rkuo7ov5znqIvku5PlupPvvIzmsqHkuovliKvngrnvvIknLFxcXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHVybCkgPT4ge1xcXFxuICAgICAgICAgICAgaWYoZmlsZUV4aXN0KHVybCkpe1xcXFxuICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUodXJsKVxcXFxuICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKCdodHRwczovL2dpdGxhYi5jb20vRHJlYW1Pek8vRHJlYW1Pek8vLS9yYXcvbWFpbi9KTScsIHVybClcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKCdodHRwczovL2dpdGxhYi5jb20vRHJlYW1Pek8vRHJlYW1Pek8vLS9yYXcvbWFpbi9KTScsIHVybClcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKVxcXFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suabtOaWsCdcXFxcbiAgICAgICAgfSwgdXJsKSxcXFxcbiAgICAgICAgaW1nOiAnaGlrZXI6Ly9pbWFnZXMvaWNvbjQnLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcidcXFxcbiAgICB9XSxcXFxcbiAgICB1cGRhdGVJbnRlcnZhbCA9IHJlYWRGaWxlKCd1cGRhdGVJbnRlcnZhbCcpIHx8ICcxJyxcXFxcbiAgICBuZXdXaW5kb3cgPSByZWFkRmlsZSgnbmV3V2luZG93JyksXFxcXG4gICAgdGFiRm9sZCA9IHJlYWRGaWxlKCd0YWJGb2xkJyksXFxcXG4gICAgZGlzYWJsZUN1c3RvbSA9IHJlYWRGaWxlKCdkaXNhYmxlQ3VzdG9tJyksXFxcXG4gICAgZWRpdE1vZGUgPSBkaXNhYmxlQ3VzdG9tID8gJ+WvvOWFpea1t+mYlCcgOiBnZXRNeVZhcignZWRpdE1vZGUnLCAn5ZCv55SoL+emgeeUqCcpXFxcXG5cXFxcbmVsLnB1c2goe1xcXFxuICAgIHRpdGxlOiAnICDwn5KhIOabtOaWsOmikeeOhzogJyArICh1cGRhdGVJbnRlcnZhbCA9PSAwID8gJ+aJi+WKqCcgOiB1cGRhdGVJbnRlcnZhbCArICflpKknKSArICcgICcsXFxcXG4gICAgdXJsOiAkKHVwZGF0ZUludGVydmFsLCAn6L6T5YWl5pu05paw6Ze06ZqU77yI5aSp77yJ77yM5Li6MOWImeaJi+WKqOabtOaWsFxcXFxcXFxcbuacrOWcsOaWh+S7tumTvuaOpeaXoOaViCcpLmlucHV0KCgpID0+IHtcXFxcbiAgICAgICAgaW5wdXQgPSBwYXJzZUludChpbnB1dClcXFxcbiAgICAgICAgaWYoTnVtYmVyLmlzTmFOKGlucHV0KSkgaW5wdXQgPSAxXFxcXG4gICAgICAgIGVsc2UgaWYoaW5wdXQgPCAxKSBpbnB1dCA9IDBcXFxcbiAgICAgICAgc2F2ZUZpbGUoJ3VwZGF0ZUludGVydmFsJywgaW5wdXQudG9TdHJpbmcoKSlcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKVxcXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcXFxufSwge1xcXFxuICAgIHRpdGxlOiAnICDwn5alIOeLrOeri+mmlumhtTogJyArIChuZXdXaW5kb3cgPyAn5pivJyA6ICflkKYnKSArICcgICcsXFxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChuZXdXaW5kb3cpID0+IHtcXFxcbiAgICAgICAgc2F2ZUZpbGUoJ25ld1dpbmRvdycsIG5ld1dpbmRvdyA/ICcnIDogJzEnKVxcXFxuICAgICAgICByZWZyZXNoUGFnZSgpXFxcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9LCBuZXdXaW5kb3cpLFxcXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJyAg8J+SoCDliIbnsbvmipjlj6A6ICcgKyAodGFiRm9sZCA/ICfmmK8nIDogJ+WQpicpICsgJyAgJyxcXFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHRhYkZvbGQpID0+IHtcXFxcbiAgICAgICAgc2F2ZUZpbGUoJ3RhYkZvbGQnLCB0YWJGb2xkID8gJycgOiAnMScpXFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKClcXFxcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgIH0sIHRhYkZvbGQpLFxcXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJyAg8J+SvCDlpIfku73mgaLlpI0gICcsXFxcXG4gICAgdXJsOiAkKFsn5aSH5Lu9JywgJ+aBouWkjSddLCAxKS5zZWxlY3QoKFFJTkdfVElUTEUsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pID0+IHtcXFxcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKVxcXFxuICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdoaWtlcjovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKVxcXFxuICAgICAgICAgICAgdXJsID0gJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJ1xcXFxuICAgICAgICBlbHNlIGlmKHVybC5zdGFydHNXaXRoKCdoaWtlcjovL3BhZ2UvJykpIHVybCA9ICdoaWtlcjovL2VtcHR5J1xcXFxuICAgICAgICBpZiAoaW5wdXQgPT0gJ+Wkh+S7vScpIHJldHVybiAkKCdoaWtlcjovL2ZpbGVzL3RtcC8nICsgUUlOR19USVRMRSArICdfYmFja3VwLmpzb24nLCAn6L6T5YWl5aSH5Lu96Lev5b6EJylcXFxcbiAgICAgICAgICAgIC5pbnB1dCgodXJsLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gcmVxdWVzdCh1cmwpLFxcXFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhID0gcmVhZEZpbGUoJ2N1c3RvbURhdGEnKVxcXFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShpbnB1dCwgSlNPTi5zdHJpbmdpZnkoe1xcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJbnRlcnZhbDogdXBkYXRlSW50ZXJ2YWwsXFxcXG4gICAgICAgICAgICAgICAgICAgIG5ld1dpbmRvdzogbmV3V2luZG93LFxcXFxuICAgICAgICAgICAgICAgICAgICB0YWJGb2xkOiB0YWJGb2xkLFxcXFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQ3VzdG9tOiBkaXNhYmxlQ3VzdG9tLFxcXFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhOiBjdXN0b21EYXRhLFxcXFxuICAgICAgICAgICAgICAgICAgICBydWxlczogcnVsZXNcXFxcbiAgICAgICAgICAgICAgICB9KSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5aSH5Lu977yM5rOo5oSP6Iul5LuT5bqT5Li65a2Q6aG16Z2i5YiZ5LiN5aSH5Lu9J1xcXFxuICAgICAgICAgICAgfSwgdXJsLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKVxcXFxuICAgICAgICBlbHNlIHJldHVybiAkKCdoaWtlcjovL2ZpbGVzL3RtcC8nICsgUUlOR19USVRMRSArICdfYmFja3VwLmpzb24nLCAn6L6T5YWl5aSH5Lu96Lev5b6EJykuaW5wdXQoKHVybCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IHsgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSwgY3VzdG9tRGF0YSwgcnVsZXMgfSA9IEpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpXFxcXG4gICAgICAgICAgICBzYXZlRmlsZSgndXBkYXRlSW50ZXJ2YWwnLCB1cGRhdGVJbnRlcnZhbClcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKCduZXdXaW5kb3cnLCBuZXdXaW5kb3cpXFxcXG4gICAgICAgICAgICBzYXZlRmlsZSgndGFiRm9sZCcsIHRhYkZvbGQpXFxcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsIGRpc2FibGVDdXN0b20pXFxcXG4gICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIGN1c3RvbURhdGEpXFxcXG4gICAgICAgICAgICBpZihydWxlcykgd3JpdGVGaWxlKHVybCwgcnVsZXMpXFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpXFxcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5oGi5aSN77yM5aaC5p6c5LiN5oOz5ZCM5q2l6L+c56iL5LuT5bqT77yM5Y+v5Lul6K6+572u5pu05paw6aKR546H5Li65omL5YqoJ1xcXFxuICAgICAgICB9LCB1cmwpXFxcXG4gICAgfSwgUUlOR19USVRMRSwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSksXFxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcXFxufSwge1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcXFxcXCIjNjY2NjY2XFxcXFxcXCI+PHNtYWxsPueJueWIq+m4o+iwou+8jOWwj+eoi+W6j+aPkOS+m+iAhe+8mlxcXFxcXFxcbicgK1xcXFxuICAgICAgICBkYXRhLnJlZHVjZSgoc2VsZiwgdikgPT4gdi5hdXRob3IgPyBzZWxmLmNvbmNhdCh2LmF1dGhvci5zcGxpdCgnJicpKSA6IHNlbGYsIFtdKVxcXFxuICAgICAgICAuZmlsdGVyKCh2LCBpLCBhcnIpID0+IHYgJiYgYXJyLmluZGV4T2YodikgPT0gaSkuam9pbign44CBJyksXFxcXG4gICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcXFxufSlcXFxcblxcXFxuZWwucHVzaCh7IGNvbF90eXBlOiAnbGluZScgfSwge1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICfwn5OdJy5zbWFsbCgpICsgJyZuYnNwIOi9u+WQiOmbhuiHquWumuS5iSAmbmJzcCcuYm9sZCgpLmZvbnRjb2xvcignIzc1NzU3NScpICsgKGRpc2FibGVDdXN0b20gPyAn4p2MJyA6ICfirZUnKS5zbWFsbCgpLFxcXFxuICAgIHVybDogJChbKGRpc2FibGVDdXN0b20gPyAn5ZCv55SoJyA6ICfnpoHnlKgnKSArICflkIjpm4boh6rlrprkuYknLCAn5riF6Zmk6Ieq5a6a5LmJ5pWw5o2uJ10sIDEpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgIGlmIChpbnB1dCA9PSAn5riF6Zmk6Ieq5a6a5LmJ5pWw5o2uJykge1xcXFxuICAgICAgICAgICAgZGVsZXRlRmlsZSgnY3VzdG9tRGF0YScpXFxcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gJ+WQr+eUqOWQiOmbhuiHquWumuS5iScpIHtcXFxcbiAgICAgICAgICAgIHNhdmVGaWxlKCdkaXNhYmxlQ3VzdG9tJywgJycpXFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsICcxJylcXFxcbiAgICAgICAgICAgIGlucHV0ICs9ICdcXFxcXFxcXG7lsI/nqIvluo/lkK/nlKgv56aB55So44CB6YeN5paw5o6S5bqP562J5pON5L2c5Z2H5LiN5Lya5L2T546w5Zyo6aaW6aG15bCP56iL5bqP5YiX6KGo5LitJ1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5beyJyArIGlucHV0XFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXFxcbiAgICBleHRyYTogeyBsaW5lVmlzaWJsZTogZmFsc2UgfVxcXFxufSk7XFxcXG4oZGlzYWJsZUN1c3RvbSA/IFsn5a+85YWl5rW36ZiUJ10gOiBbJ+WQr+eUqC/npoHnlKgnLCAn6YeN5paw5o6S5bqPJywgJ+abtOaUueWbvuaghycsICflr7zlhaXmtbfpmJQnXSkuZm9yRWFjaCgodikgPT4ge1xcXFxuICAgIGVsLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogdiA9PSBlZGl0TW9kZSA/ICfigJzigJzigJ3igJ0nICsgdi5ib2xkKCkuZm9udGNvbG9yKCcjMTJiNjY4JykgOiB2LFxcXFxuICAgICAgICB1cmw6IHYgPT0gZWRpdE1vZGUgPyAnaGlrZXI6Ly9lbXB0eScgOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh2KSA9PiB7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcignZWRpdE1vZGUnLCB2KVxcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgIH0sIHYpLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG4gICAgfSlcXFxcbn0pO1xcXFxuaWYoZWRpdE1vZGUgPT0gJ+WvvOWFpea1t+mYlCcpIGVsLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn5YWo6YOo5a+85YWlJyxcXFxcbiAgICB1cmw6ICfmtbfpmJTop4bnlYzvv6Vob21lX3J1bGVfdXJs77+lJyArICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpID8gdXJsIDogJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJyksXFxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXFxcbiAgICBleHRyYTogeyBsaW5lVmlzaWJsZTogZmFsc2UgfVxcXFxufSk7XFxcXG4oZGlzYWJsZUN1c3RvbSA/IGRhdGEgOiBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJykpLmZvckVhY2goKHYsIGkpID0+IHtcXFxcbiAgICBsZXQgZCA9IHsgdGl0bGU6IHYudGl0bGUsIGltZzogZGF0YVtpXS5pY29uIH1cXFxcbiAgICBzd2l0Y2ggKGVkaXRNb2RlKSB7XFxcXG4gICAgICAgIGNhc2UgJ+WQr+eUqC/npoHnlKgnOlxcXFxuICAgICAgICAgICAgZC50aXRsZSA9ICh2LnZpc2libGUgPyAn8J+foiAgJyA6ICfwn5S0ICAnKSArIGQudGl0bGVcXFxcbiAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKVxcXFxuICAgICAgICAgICAgICAgIHJ1bGVzW2ldLnZpc2libGUgPSAhcnVsZXNbaV0udmlzaWJsZVxcXFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkocnVsZXMpKVxcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgICAgIH0sIGkpXFxcXG4gICAgICAgICAgICBicmVha1xcXFxuICAgICAgICBjYXNlICfph43mlrDmjpLluo8nOlxcXFxuICAgICAgICAgICAgbGV0IHNvcnRGbGFnID0gcGFyc2VJbnQoZ2V0TXlWYXIoJ3NvcnRGbGFnJywgJy0xJykpXFxcXG4gICAgICAgICAgICBkLnRpdGxlID0gKHNvcnRGbGFnID09IGkgPyAn8J+UgyAgJyA6ICcnKSArIGQudGl0bGVcXFxcbiAgICAgICAgICAgIGlmIChzb3J0RmxhZyA9PSAtMSlcXFxcbiAgICAgICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3NvcnRGbGFnJywgaS50b1N0cmluZygpKVxcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mAieaLqeimgeenu+WKqOWIsOeahOS9jee9ridcXFxcbiAgICAgICAgICAgICAgICB9LCBpKVxcXFxuICAgICAgICAgICAgZWxzZVxcXFxuICAgICAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgob2xkSW5kZXgsIG5ld0luZGV4KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKVxcXFxuICAgICAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGVzLnNwbGljZShvbGRJbmRleCwgMSlbMF0pXFxcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkocnVsZXMpKVxcXFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcignc29ydEZsYWcnLCAnLTEnKVxcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgICAgICAgICAgICAgIH0sIHNvcnRGbGFnLCBpKVxcXFxuICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgY2FzZSAn5pu05pS55Zu+5qCHJzpcXFxcbiAgICAgICAgICAgIGQudXJsID0gJCh2Lmljb24gfHwgJycsICfovpPlhaXmlrDlm77moIflnLDlnYDmiJbpopzoibLku6PnoIHvvJonKS5pbnB1dCgoaSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKVxcXFxuICAgICAgICAgICAgICAgIGlmIChpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXNbaV0uaWNvbiA9IGlucHV0XFxcXG4gICAgICAgICAgICAgICAgZWxzZVxcXFxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcnVsZXNbaV0uaWNvblxcXFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkocnVsZXMpKVxcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgICAgIH0sIGkpXFxcXG4gICAgICAgICAgICBicmVha1xcXFxuICAgICAgICBjYXNlICflr7zlhaXmtbfpmJQnOlxcXFxuICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKT0+e1xcXFxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpKSh0cnVlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YVtpXSkpXFxcXG4gICAgICAgICAgICB9LCBpKVxcXFxuICAgICAgICAgICAgYnJlYWtcXFxcbiAgICB9XFxcXG4gICAgZWwucHVzaChkKVxcXFxufSlcXFxcbnNldFJlc3VsdChlbClcXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumhtemdoui9veWFpVxcXCIsXFxcInBhdGhcXFwiOlxcXCJmcmFtZUxvYWRcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBRSU5HX1RJVExFID0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpXFxcXG5sZXQgbXlDb2xsZWN0aW9uX2VsID0gW10sXFxcXG4gICAgeyBSVUxFLCBpc0luZGV4LCBwYWdlVGl0bGUgfSA9IE1ZX1BBUkFNUyxcXFxcbiAgICB0aGlzUlVMRSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9JyArIFFJTkdfVElUTEUpKCkuZmluZCgodikgPT4gdi50aXRsZSA9PSBSVUxFLnRpdGxlKVxcXFxuaWYgKGlzSW5kZXgpIHtcXFxcbiAgICBSVUxFID0gdGhpc1JVTEVcXFxcbn0gZWxzZSB7XFxcXG4gICAgUlVMRS5wYWdlcyA9IHRoaXNSVUxFLnBhZ2VzXFxcXG59XFxcXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9wcmVGdW5jP3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcXFxuZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvdXJsUGFyc2U/cnVsZT0nICsgUUlOR19USVRMRSkpLnJ1bGUpXFxcXG5cXFxcbmlmIChpc0luZGV4KSB7XFxcXG4gICAgaWYgKE1ZX1BBR0UgPT0gMSkge1xcXFxuICAgICAgICAvLyDliqDovb1DbGFzc1RhYue7hOS7tlxcXFxuICAgICAgICBldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9DbGFzc1RhYj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXFxcbiAgICAgICAgdGFiSGVhZGVyLmxvYWQobXlDb2xsZWN0aW9uX2VsKVxcXFxuICAgICAgICBpZiAoUlVMRS5zZWFyY2hfdXJsKSBteUNvbGxlY3Rpb25fZWwucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLmkJzntKJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlc2M6IFxcXFxcXFwi5pCc5L2g5oOz6KaB55qELi4uXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICdcXFxcXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcXFxcXCIraW5wdXQnLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBydWxlczogJC50b1N0cmluZygoUUlOR19USVRMRSwgdGl0bGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSkoKVxcXFxuICAgICAgICAgICAgICAgICAgICBydWxlcyA9IFtydWxlcy5maW5kKCh2KSA9PiB2LnRpdGxlID09IHRpdGxlKV1cXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVzKVxcXFxuICAgICAgICAgICAgICAgIH0sIFFJTkdfVElUTEUsIFJVTEUudGl0bGUpLFxcXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXFxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogXFxcXFxcXCJwdXRNeVZhcignc2VhcmNoS2V5JyxpbnB1dClcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCIsXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIE1ZX1JVTEUuY2xhc3NfdXJsID0gdGFiSGVhZGVyLmdldENsYXNzKGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeWNsYXNzJykudXJsXFxcXG4gICAgICAgIE1ZX1JVTEUuYXJlYV91cmwgPSBmeUFsbCA/IE1ZX1JVTEUuY2xhc3NfdXJsIDogdGFiSGVhZGVyLmdldENsYXNzKCdmeWFyZWEnKS51cmxcXFxcbiAgICAgICAgTVlfUlVMRS55ZWFyX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5eWVhcicpLnVybFxcXFxuICAgICAgICBNWV9SVUxFLnNvcnRfdXJsID0gZnlBbGwgPyBNWV9SVUxFLmNsYXNzX3VybCA6IHRhYkhlYWRlci5nZXRDbGFzcygnZnlzb3J0JykudXJsXFxcXG4gICAgfVxcXFxuICAgIC8vIOWkhOeQhk1ZX1JVTEVcXFxcbiAgICBNWV9SVUxFLnVybCA9IFJVTEUudXJsXFxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuY29sX3R5cGVcXFxcbiAgICBNWV9SVUxFLmRldGFpbF9jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxcXG4gICAgTVlfUlVMRS5maW5kX3J1bGUgPSBSVUxFLmZpbmRfcnVsZVxcXFxuICAgIE1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IFJVTEUuZGV0YWlsX2ZpbmRfcnVsZVxcXFxuICAgIE1ZX1JVTEUucGFyYW1zID0ge31cXFxcbn0gZWxzZSB7XFxcXG4gICAgTVlfUlVMRS51cmwgPSBNWV9QQVJBTVMudXJsXFxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxcXG4gICAgTVlfUlVMRS5maW5kX3J1bGUgPSBSVUxFLmRldGFpbF9maW5kX3J1bGVcXFxcbiAgICBNWV9SVUxFLnBhcmFtcyA9IFJVTEUucGFyYW1zXFxcXG59XFxcXG5NWV9SVUxFLnBhZ2VzID0gUlVMRS5wYWdlc1xcXFxuTVlfUlVMRS5wYWdlTGlzdCA9IEpTT04ucGFyc2UoTVlfUlVMRS5wYWdlcyB8fCAnW10nKVxcXFxuTVlfUlVMRS50aXRsZSA9IFJVTEUudGl0bGVcXFxcblxcXFxuaWYgKCFpc0luZGV4KSB7XFxcXG4gICAgaWYgKHBhZ2VUaXRsZSkgc2V0UGFnZVRpdGxlKHBhZ2VUaXRsZSlcXFxcbiAgICBzZXRMYXN0Q2hhcHRlclJ1bGUodGhpc1JVTEUubGFzdF9jaGFwdGVyX3J1bGUpXFxcXG4gICAgTVlfUEFSQU1TID0gTVlfUlVMRS5wYXJhbXNcXFxcbn1cXFxcbi8vIOmihOWkhOeQhuW5tuWIneWni+WMlmNvbmZpZ1xcXFxuaWYgKE1ZX1BBR0UgPT0gMSkge1xcXFxuICAgIGxldCBsb2FkZWQgPSBnZXRNeVZhcihNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCJAcHJlXFxcXFxcXCIpXFxcXG4gICAgaWYgKCFsb2FkZWQgfHwgaXNJbmRleCkge1xcXFxuICAgICAgICBldmFsKHRoaXNSVUxFLnByZVJ1bGUpXFxcXG4gICAgICAgIHB1dE15VmFyKE1ZX1JVTEUudGl0bGUgKyBcXFxcXFxcIkBwcmVcXFxcXFxcIiwgXFxcXFxcXCIxXFxcXFxcXCIpXFxcXG4gICAgfVxcXFxufVxcXFxubGV0IF9jZmcgPSBnZXRNeVZhcignaW5pdENvbmZpZycsICd7fScpXFxcXG5pZiAoX2NmZyAmJiBfY2ZnLmxlbmd0aCA+IDApIHtcXFxcbiAgICBjb25maWcgPSBKU09OLnBhcnNlKF9jZmcpXFxcXG59XFxcXG5cXFxcbi8vIOato+aWh+ino+aekOmAmueUqOWPmOmHj1xcXFxubGV0IGFzc2lnbkxhenlSdWxlID0gJC50b1N0cmluZygoUUlOR19USVRMRSwgdGl0bGUsIHVybCkgPT4ge1xcXFxuICAgIGxldCBSVUxFID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9XFxcXFxcXCIgKyBRSU5HX1RJVExFKSgpLmZpbmQoKHYpID0+IHYudGl0bGUgPT0gdGl0bGUpXFxcXG4gICAgcmV0dXJuIHsgdGl0bGU6dGl0bGUsIHVybDogdXJsLCBwYWdlczogUlVMRS5wYWdlcywgcGFnZUxpc3Q6IEpTT04ucGFyc2UoUlVMRS5wYWdlcyB8fCAnW10nKSB9XFxcXG59LCBRSU5HX1RJVExFLCBNWV9SVUxFLnRpdGxlLCBNWV9SVUxFLnVybClcXFxcbmZ1bmN0aW9uIGdlbk15UnVsZSgpIHtcXFxcbiAgICBsZXQgcnVsZSA9IE9iamVjdC5hc3NpZ24oe30sIE1ZX1JVTEUpXFxcXG4gICAgZGVsZXRlIHJ1bGUubGFzdF9jaGFwdGVyX3J1bGVcXFxcbiAgICBkZWxldGUgcnVsZS5wcmVSdWxlXFxcXG4gICAgZGVsZXRlIHJ1bGUucGFnZUxpc3RcXFxcbiAgICBkZWxldGUgcnVsZS5wYWdlc1xcXFxuICAgIHJldHVybiBydWxlXFxcXG59XFxcXG5mdW5jdGlvbiBydW5Db2RlKHJ1bGUpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcXFxuICAgICAgICByZXR1cm4gY29kZSA/IGV2YWwoY29kZSkgOiBydWxlXFxcXG4gICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gcnVsZSB9XFxcXG59XFxcXG5mdW5jdGlvbiBnZW5FeFVybCh1cmwpIHtcXFxcbiAgICB1cmwgPSB1cmwuc3BsaXQoJzsnKVxcXFxuICAgIHJldHVybiB1cmwuc2hpZnQoKSArICc7JyArIHBhcmFtSGFuZGxlKHVybCwgdGhpc1JVTEUudWEsIE1ZX1JVTEUudXJsKVxcXFxufVxcXFxuLy8g5q2j5paH6Kej5p6QXFxcXG5pZiAoTVlfUlVMRS5maW5kX3J1bGUuc3RhcnRzV2l0aCgnanM6JykpIHtcXFxcbiAgICBzZXRSZXN1bHQgPSBmdW5jdGlvbihlbCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykge1xcXFxuICAgICAgICBwYXJhbTEgPSBDQUxMQkFDS19LRVlcXFxcbiAgICAgICAgcGFyYW0yID0gTVlfUlVMRVxcXFxuICAgICAgICBwYXJhbTMgPSBNWV9UWVBFXFxcXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVsLmRhdGEpKSBlbCA9IGVsLmRhdGFcXFxcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobXlDb2xsZWN0aW9uX2VsLCBlbC5tYXAoKHYpID0+IHtcXFxcbiAgICAgICAgICAgIGlmKCF2LmV4dHJhKSB2LmV4dHJhID0ge31cXFxcbiAgICAgICAgICAgIHYuY29sX3R5cGUgPSB2LmNvbF90eXBlIHx8IE1ZX1JVTEUuY29sX3R5cGVcXFxcbiAgICAgICAgICAgIGxldCBNWV9fUlVMRSA9IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgcGFyYW1zOiB2LmV4dHJhIH0pXFxcXG5cXFxcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygdi51cmwgIT0gJ3N0cmluZycgfHwgWydydWxlJywgJ3BpY3MnLCAndG9hc3QnLCAnaW5wdXQnLCAnY29uZmlybScsICdjb3B5JywgJ2VkaXRGaWxlJywgJ3g1JywgJ3g1V2ViVmlldycsICd4NVBsYXknLCAnd2ViJywgJ3NlbGVjdCcsICd4NVJ1bGUnLCAnd2ViUnVsZScsICdkb3dubG9hZCcsICdzaGFyZSddLmZpbmQoKHZ2KSA9PiB2LnVybC5zdGFydHNXaXRoKHZ2ICsgJzovLycpKSB8fCBbJ3g1X3dlYnZpZXdfc2luZ2xlJywgJ2lucHV0J10uZmluZCgodnYpID0+IHYuY29sX3R5cGUgPT0gdnYpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodi51cmwuaW5jbHVkZXMoJ0BydWxlPScpKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IFtfLCB1cmwsIHJ1bGVdID0gdi51cmwubWF0Y2goL14oW1xcXFxcXFxcc1xcXFxcXFxcU10qPylAcnVsZT0oW1xcXFxcXFxcc1xcXFxcXFxcU10qKSQvKVxcXFxuICAgICAgICAgICAgICAgIHYudXJsID0gdXJsXFxcXG4gICAgICAgICAgICAgICAgTVlfX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHJ1bGVcXFxcbiAgICAgICAgICAgICAgICBNWV9fUlVMRS5kZXRhaWxfY29sX3R5cGUgPSBNWV9SVUxFLmNvbF90eXBlXFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYudXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vcGFnZS8nKSkge1xcXFxuICAgICAgICAgICAgICAgIGlmICh2LnVybC5pbmNsdWRlcygncnVsZT0nKSB8fCB2LmV4dHJhLnJ1bGUpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2XFxcXG4gICAgICAgICAgICAgICAgbGV0IFtfLCBwYXRoLCBmbGFnLCBwYXJhbXNdID0gdi51cmwubWF0Y2goL15oaWtlcjpcXFxcXFxcXC9cXFxcXFxcXC9wYWdlXFxcXFxcXFwvKC4rPykoIy4qPyk/KD86XFxcXFxcXFw/KC4qKSk/JC8pLFxcXFxuICAgICAgICAgICAgICAgICAgICBzdWJQYWdlID0gTVlfUlVMRS5wYWdlTGlzdC5maW5kKCh2KSA9PiB2LnBhdGggPT0gcGF0aCksXFxcXG4gICAgICAgICAgICAgICAgICAgIHN1YlVybCA9IChwYXJhbXMgfHwgJycpLnNwbGl0KCcmJykuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCd1cmw9JykpXFxcXG4gICAgICAgICAgICAgICAgdi51cmwgPSAoc3ViVXJsID8gc3ViVXJsLnNsaWNlKDQpLnJlcGxhY2UoL++8n++8ny9nLCAnPycpLnJlcGxhY2UoL++8hu+8hi9nLCAnJicpIDogKHYuZXh0cmEgfHwge30pLnVybCkgfHwgJ2hpa2VyOi8vZW1wdHknICsgZmxhZyArICc/JyArIChwYXJhbXMgfHwgJycpXFxcXG4gICAgICAgICAgICAgICAgTVlfX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHN1YlBhZ2UucnVsZVxcXFxuICAgICAgICAgICAgICAgIE1ZX19SVUxFLmRldGFpbF9jb2xfdHlwZSA9IHN1YlBhZ2UuY29sX3R5cGVcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodi51cmwuaW5jbHVkZXMoJ0BsYXp5UnVsZT0nKSkge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZUluZGV4ID0gdi51cmwuaW5kZXhPZignLmpzOicpXFxcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgdi51cmwgPSB2LnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6XFxcXFxcXFxuaWYoTVlfUlVMRSlPYmplY3QuYXNzaWduKE1ZX1JVTEUsICcgKyBhc3NpZ25MYXp5UnVsZSArICcpOycgKyB2LnVybC5zbGljZShyZUluZGV4ICsgNClcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdlxcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0luZGV4KSB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCFNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUgfHwgL2hpa2VyOlxcXFxcXFxcL1xcXFxcXFxcLyg/IWVtcHR5LiskKS8udGVzdCh2LnVybCkpIHJldHVybiB2XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB2XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB2LmV4dHJhID0gT2JqZWN0LmFzc2lnbih7fSwgdi5leHRyYSwge1xcXFxuICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodi51cmwpLFxcXFxuICAgICAgICAgICAgICAgIFJVTEU6IE1ZX19SVUxFLFxcXFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB2LnRpdGxlXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgdi51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxcXG4gICAgICAgICAgICByZXR1cm4gdlxcXFxuICAgICAgICB9KSlcXFxcbiAgICAgICAgbWV0aG9kX3NldFJlc3VsdC5pbnZva2UoamF2YUNvbnRleHQsIG15Q29sbGVjdGlvbl9lbCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcXFxcbiAgICB9XFxcXG4gICAgc2V0SG9tZVJlc3VsdCA9IHNldFJlc3VsdFxcXFxuICAgIHNldFNlYXJjaFJlc3VsdCA9IHNldFJlc3VsdFxcXFxuXFxcXG4gICAgZXZhbChNWV9SVUxFLmZpbmRfcnVsZS5zbGljZSgzKSlcXFxcbn0gZWxzZSB7XFxcXG4gICAgbGV0IFtfLCBmaW5kUnVsZSwgZGV0YWlsRmluZFJ1bGVdID0gTVlfUlVMRS5maW5kX3J1bGUubWF0Y2goL14oW1xcXFxcXFxcc1xcXFxcXFxcU10qPykoPzo9PT4oW1xcXFxcXFxcc1xcXFxcXFxcU10qKSk/JC8pXFxcXG4gICAgZmluZFJ1bGUgPSBmaW5kUnVsZS5zcGxpdCgnOycpXFxcXG4gICAgcGFyc2VEb21Gb3JBcnJheShnZXRSZXNDb2RlKCksIGZpbmRSdWxlLnNoaWZ0KCkpLmZvckVhY2goKGRhdGEpID0+IHtcXFxcbiAgICAgICAgbGV0IFt0aXRsZSwgaW1nLCBkZXNjLCB1cmxdID0gZmluZFJ1bGUubWFwKCh2LCBpKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gJyonKSByZXR1cm4gJydcXFxcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB2ID0gKGkgPT0gMSB8fCBpID09IDMpID9cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRG9tKGRhdGEsIHYpIDpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRG9tRm9ySHRtbChkYXRhLCB2KVxcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAzKSB2ID0gcnVuQ29kZSh2KVxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdlxcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuICcnIH1cXFxcbiAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgcmVzID0ge1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSwgdXJsOiB1cmwsXFxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYywgaW1nOiBpbWcsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IE1ZX1JVTEUuY29sX3R5cGVcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHJlcy51cmwpIHtcXFxcbiAgICAgICAgICAgIGlmIChyZXMudXJsLmluY2x1ZGVzKCdAbGF6eVJ1bGU9JykpIHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVJbmRleCA9IHJlcy51cmwuaW5kZXhPZignLmpzOicpXFxcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgcmVzLnVybCA9IHJlcy51cmwuc2xpY2UoMCwgcmVJbmRleCkgKyAnLmpzOlxcXFxcXFxcbmlmKE1ZX1JVTEUpT2JqZWN0LmFzc2lnbihNWV9SVUxFLCAnICsgYXNzaWduTGF6eVJ1bGUgKyAnKTsnICsgcmVzLnVybC5zbGljZShyZUluZGV4ICsgNClcXFxcbiAgICAgICAgICAgIH0gZWxzZSAgaWYgKGRldGFpbEZpbmRSdWxlKSB7XFxcXG4gICAgICAgICAgICAgICAgcmVzLmV4dHJhID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGdlbkV4VXJsKHVybCksXFxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgZGV0YWlsX2ZpbmRfcnVsZTogZGV0YWlsRmluZFJ1bGUgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB0aXRsZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXMuZXh0cmEgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgUlVMRTogZ2VuTXlSdWxlKCksXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB0aXRsZVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIG15Q29sbGVjdGlvbl9lbC5wdXNoKHJlcylcXFxcbiAgICB9KVxcXFxuICAgIHNldFJlc3VsdChteUNvbGxlY3Rpb25fZWwpXFxcXG59XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmlbDmja7ovb3lhaVcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZGF0YUxvYWRcXFwiLFxcXCJydWxlXFxcIjpcXFwiJC5leHBvcnRzID0gZnVuY3Rpb24oc2hvd0FsbCkge1xcXFxuICAgIGxldCB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJyksXFxcXG4gICAgICAgIGRhdGEgPSBbXVxcXFxuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XFxcXG4gICAgICAgIC8vIOWmguaenOS4uuacrOWcsOaWh+S7tuWImeS4jei/m+ihjOe8k+WtmFxcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IG9yaURhdGEgPSBmZXRjaCh1cmwpXFxcXG4gICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vcGFnZS8nKSlcXFxcbiAgICAgICAgICAgICAgICBvcmlEYXRhID0gSlNPTi5wYXJzZShvcmlEYXRhKS5ydWxlXFxcXG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShvcmlEYXRhKVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIC8vIOiOt+WPlui/nOeoi+aVsOaNru+8jOajgOafpemXtOmalOm7mOiupOS4gOWkqVxcXFxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBwYXJzZUludChyZWFkRmlsZSgndXBkYXRlSW50ZXJ2YWwnKSB8fCAnMScpLFxcXFxuICAgICAgICAgICAgb2xkRGF0YSA9IGZldGNoKCdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcXFxuICAgICAgICAgICAgcmVtb3RlRGF0YSA9IFtdXFxcXG4gICAgICAgIGlmKGludGVydmFsID09IDApIGludGVydmFsID0gLTFcXFxcbiAgICAgICAgdHJ5IHsgcmVtb3RlRGF0YSA9IEpTT04ucGFyc2UoZmV0Y2hDYWNoZSh1cmwsIDE2OCAqIGludGVydmFsLCB7dGltZW91dDo1MDAwMH0pKSB9IGNhdGNoKGUpIHt9XFxcXG4gICAgICAgIGlmKCFBcnJheS5pc0FycmF5KHJlbW90ZURhdGEpKSByZW1vdGVEYXRhID0gW11cXFxcbiAgICAgICAgaWYgKHJlbW90ZURhdGEubGVuZ3RoIDwgMykge1xcXFxuICAgICAgICAgICAgbG9nKCfmnKrojrflj5bliLDmlbDmja4nKVxcXFxuICAgICAgICAgICAgaWYgKG9sZERhdGEpIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9saWJzLycgKyBtZDUodXJsKSArICcuanMnLCBvbGREYXRhKVxcXFxuICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2Uob2xkRGF0YSB8fCAnW10nKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgbG9nKCflt7Lojrflj5bliLDmlbDmja4nKVxcXFxuICAgICAgICAgICAgZGF0YSA9IHJlbW90ZURhdGFcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBkYXRhID0gZGF0YS5maWx0ZXIoKHYpID0+IHsgcmV0dXJuIHYudGl0bGUgIT0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpICYmICEodi5hdXRob3IgfHwgJycpLmluY2x1ZGVzKCfovbvlkIjpm4bnlJ/miJDlmagnKSB9KVxcXFxuICAgIGlmIChyZWFkRmlsZSgnZGlzYWJsZUN1c3RvbScpKSByZXR1cm4gZGF0YVxcXFxuICAgIGVsc2UgeyAvLyDlhpnlhaXoh6rlrprkuYnmlbDmja5cXFxcbiAgICAgICAgbGV0IGN1c3RvbURhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJyksXFxcXG4gICAgICAgICAgICByZXdyaXRlRGF0YSA9IFtdXFxcXG4gICAgICAgIGN1c3RvbURhdGEgPSBjdXN0b21EYXRhLnJlZHVjZSgoc2VsZiwgdikgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gZGF0YS5maW5kSW5kZXgoKHZ2KSA9PiB2LnRpdGxlID09IHZ2LnRpdGxlKVxcXFxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcXFxcbiAgICAgICAgICAgICAgICBzZWxmLnB1c2godilcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IGRhdGEuc3BsaWNlKGluZGV4LCAxKVswXVxcXFxuICAgICAgICAgICAgICAgIGlmIChzaG93QWxsIHx8IHYudmlzaWJsZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV3cml0ZURhdGEucHVzaChPYmplY3QuYXNzaWduKHJ1bGUsIHYpKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgcmV0dXJuIHNlbGZcXFxcbiAgICAgICAgfSwgW10pXFxcXG4gICAgICAgIGRhdGEuZm9yRWFjaCgodikgPT4gY3VzdG9tRGF0YS5wdXNoKHsgdGl0bGU6IHYudGl0bGUsIHZpc2libGU6IHRydWUgfSkpXFxcXG4gICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tRGF0YSkpXFxcXG4gICAgICAgIHJldHVybiByZXdyaXRlRGF0YS5jb25jYXQoZGF0YSlcXFxcbiAgICB9XFxcXG59XFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlh73mlbDph43lhplcXFwiLFxcXCJwYXRoXFxcIjpcXFwicHJlRnVuY1xcXCIsXFxcInJ1bGVcXFwiOlxcXCIvLyDpmLLmraJyZXF1aXJl5aSa5qyh6L+Q6KGMXFxcXG5sZXQgckNhY2hlID0ge31cXFxcbnJlcXVpcmUgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkge1xcXFxuICAgIGlmICghcGFyYW0wIHx8IHJDYWNoZVtwYXJhbTBdICE9IG51bGwpIHtcXFxcbiAgICAgICAgcmV0dXJuXFxcXG4gICAgfVxcXFxuICAgIHJDYWNoZVtwYXJhbTBdID0gMVxcXFxuICAgIHBhcmFtMiA9IHBhcmFtMiB8fCAwXFxcXG4gICAgcGFyYW0zID0gTVlfVElDS0VUXFxcXG4gICAgcGFyYW00ID0gZXZhbFxcXFxuICAgIHJldHVybiBtZXRob2RfcmVxdWlyZS5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVxcXFxufVxcXFxucmVxdWlyZUNhY2hlID0gZnVuY3Rpb24ocGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkge1xcXFxuICAgIGlmICghcGFyYW0wIHx8IHJDYWNoZVtwYXJhbTBdICE9IG51bGwpIHtcXFxcbiAgICAgICAgcmV0dXJuXFxcXG4gICAgfVxcXFxuICAgIHJDYWNoZVtwYXJhbTBdID0gMVxcXFxuICAgIHBhcmFtMyA9IHBhcmFtMyB8fCAwXFxcXG4gICAgcGFyYW00ID0gTVlfVElDS0VUXFxcXG4gICAgcGFyYW01ID0gZXZhbFxcXFxuICAgIHJldHVybiBtZXRob2RfcmVxdWlyZUNhY2hlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcXFxcbn1cXFxcbnJjID0gcmVxdWlyZUNhY2hlXFxcXG5cXFxcbi8vIOacgOaWsOeroOiKguinhOWImeazqOWFpemihOWkhOeQhuS7o+eggVxcXFxuc2V0TGFzdENoYXB0ZXJSdWxlID0gZnVuY3Rpb24ocGFyYW0wKSB7XFxcXG4gICAgaWYgKCFwYXJhbTApIHJldHVyblxcXFxuICAgIGlmIChwYXJhbTAuc3RhcnRzV2l0aChcXFxcXFxcImpzOlxcXFxcXFwiKSAmJiB0aGlzUlVMRS5wcmVSdWxlKSB7XFxcXG4gICAgICAgIHBhcmFtMCA9ICdqczpcXFxcXFxcXG50cnl7ZXZhbChKU09OLnBhcnNlKGZldGNoKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3ByZUZ1bmM/cnVsZT0nICsgUUlOR19USVRMRSArICdcXFxcXFxcIikpLnJ1bGUpO1xcXFxcXFxcXFxcXG4gICAgICAgICAgICBldmFsKGJhc2U2NERlY29kZShcXFxcXFxcIicgKyBiYXNlNjRFbmNvZGUodGhpc1JVTEUucHJlUnVsZSkgKyAnXFxcXFxcXCIpKTtcXFxcXFxcXFxcXFxuICAgICAgICAgICAgbGV0IF9jZmcgPSBnZXRNeVZhcihcXFxcXFxcImluaXRDb25maWdcXFxcXFxcIiwgXFxcXFxcXCJ7fVxcXFxcXFwiKTtcXFxcXFxcXFxcXFxuICAgICAgICAgICAgaWYgKF9jZmcgJiYgX2NmZy5sZW5ndGg+MCkge2NvbmZpZyA9IEpTT04ucGFyc2UoX2NmZyl9fWNhdGNoKGUpe2xvZyhlLm1lc3NhZ2UpfVxcXFxcXFxcbjsnICtcXFxcbiAgICAgICAgICAgIHBhcmFtMC5zbGljZSgzKVxcXFxuICAgIH1cXFxcbiAgICBtZXRob2Rfc2V0TGFzdENoYXB0ZXJSdWxlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wKTtcXFxcbn1cXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumTvuaOpeWkhOeQhlxcXCIsXFxcInBhdGhcXFwiOlxcXCJ1cmxQYXJzZVxcXCIsXFxcInJ1bGVcXFwiOlxcXCIvLyDpppbpobXpk77mjqXmm7/mjaLliIbnsbtcXFxcbmZ1bmN0aW9uIGluZGV4VXJsKHBhcmFtKSB7XFxcXG4gICAgZnVuY3Rpb24gcnVuQ29kZShydWxlKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcXFxuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPyBldmFsKGNvZGUpIDogcnVsZVxcXFxuICAgICAgICB9IGNhdGNoIChlKSB7IHJldHVybiBydWxlIH1cXFxcbiAgICB9XFxcXG4gICAgbGV0IHsgUlVMRSwgcGFnZU51bSwgUUlOR19USVRMRSB9ID0gSlNPTi5wYXJzZShwYXJhbS5zcGxpdCgnIyMjJylbMV0pXFxcXG4gICAgUlVMRSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKFJVTEUpKVxcXFxuICAgIHBhZ2VOdW0gPSBwYXJzZUludChwYWdlTnVtKVxcXFxuICAgIGxldCB1cmwgPSBSVUxFLnVybFxcXFxuXFxcXG4gICAgZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvQ2xhc3NUYWI/cnVsZT0nICsgUUlOR19USVRMRSkpLnJ1bGUpXFxcXG4gICAgdXJsID0gdGFiSGVhZGVyLnNldFVybChmeUFsbCA/IHVybC5yZXBsYWNlKC9meUFsbC9nLCAnJCR7ZnlBbGx9JykgOiB1cmwucmVwbGFjZSgvZnkoY2xhc3N8YXJlYXx5ZWFyfHNvcnQpL2csICckJHtmeSQxfScpKVxcXFxuICAgIHVybCA9IHVybC5yZXBsYWNlKC9meXBhZ2UoPzpAKC0/XFxcXFxcXFxkKylAKT8oPzpcXFxcXFxcXCooXFxcXFxcXFxkKylAKT8vZywgKF8sIHN0YXJ0LCBzcGFjZSkgPT4gcGFyc2VJbnQoc3RhcnQgfHwgMCkgKyAxICsgKHBhZ2VOdW0gLSAxKSAqIHBhcnNlSW50KHNwYWNlIHx8IDEpKVxcXFxuICAgIHVybCA9IC9eKFtcXFxcXFxcXHNcXFxcXFxcXFNdKj8pKD86XFxcXFxcXFxbZmlyc3RQYWdlPShbXFxcXFxcXFxzXFxcXFxcXFxTXSo/KVxcXFxcXFxcXSk/KD86KFxcXFxcXFxcLmpzOltcXFxcXFxcXHNcXFxcXFxcXFNdKj8pKT8kLy5leGVjKHVybClcXFxcbiAgICBpZiAocGFnZU51bSA9PSAxICYmIHVybFsyXSkgdXJsWzFdID0gdXJsWzJdXFxcXG4gICAgaWYgKHVybFszXSAmJiAhdXJsWzFdLmluY2x1ZGVzKCcuanM6JykpIHVybFsxXSArPSB1cmxbM11cXFxcbiAgICByZXR1cm4gcnVuQ29kZSh1cmxbMV0pXFxcXG59XFxcXG5mdW5jdGlvbiBwYXJhbUhhbmRsZSh1cmxQYXJhbSwgdWEsIHVybFRtcCkge1xcXFxuICAgIGxldCBjaGFyc2V0LCBwYXJhbVRtcFxcXFxuICAgIHRyeSB7IC8vIOmTvuaOpeeahOe8lueggeOAgVVB5ZKMUmVmZXJlcuW6lOivpeaYr+mmluWFiOe7p+aJv+mmlumhtemTvuaOpVxcXFxuICAgICAgICBbLCAsIGNoYXJzZXQsIHBhcmFtVG1wXSA9IHVybFRtcC5zcGxpdCgnOycpXFxcXG4gICAgICAgIHBhcmFtVG1wID0gcGFyYW1UbXAubWF0Y2goL157KC4qKX0kLylbMV0uc3BsaXQoJyYmJylcXFxcbiAgICB9IGNhdGNoIChlKSB7IHBhcmFtVG1wID0gW10gfVxcXFxuICAgIGxldCBVc2VyQWdlbnQgPSBwYXJhbVRtcC5maW5kKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1VzZXItQWdlbnRAJykpLFxcXFxuICAgICAgICBSZWZlcmVyID0gcGFyYW1UbXAuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKVxcXFxuICAgIHVybFBhcmFtWzBdID0gdXJsUGFyYW1bMF0gfHwgJ0dFVCdcXFxcbiAgICB1cmxQYXJhbVsxXSA9IHVybFBhcmFtWzFdIHx8IGNoYXJzZXQgfHwgJ1VURi04J1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIHVybFBhcmFtWzJdID0gdXJsUGFyYW1bMl0ubWF0Y2goL157KC4qKX0kLylbMV0uc3BsaXQoJyYmJylcXFxcbiAgICB9IGNhdGNoIChlKSB7IHVybFBhcmFtWzJdID0gW10gfVxcXFxuICAgIC8vIOa3u+WKoOWFqOWxgFVB5ZKM5LiK57qnUmVmZXJlclxcXFxuICAgIGlmICghdXJsUGFyYW1bMl0uc29tZSgodikgPT4gdi5zdGFydHNXaXRoKCdVc2VyLUFnZW50QCcpKSkge1xcXFxuICAgICAgICBpZiAoVXNlckFnZW50KSB1cmxQYXJhbVsyXS5wdXNoKFVzZXJBZ2VudClcXFxcbiAgICAgICAgZWxzZSBpZiAodWEgPT0gJ3BjJylcXFxcbiAgICAgICAgICAgIHVybFBhcmFtWzJdLnB1c2goJ1VzZXItQWdlbnRAJyArIFBDX1VBLnJlcGxhY2UoLzsvZywgJ++8m++8mycpLnJlcGxhY2UoL1xcXFxcXFxcPy8sICfvvJ/vvJ8nKSlcXFxcbiAgICAgICAgZWxzZSBpZiAodWEgPT0gJ21vYmlsZScpXFxcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBNT0JJTEVfVUEucmVwbGFjZSgvOy9nLCAn77yb77ybJykucmVwbGFjZSgvXFxcXFxcXFw/LywgJ++8n++8nycpKVxcXFxuICAgIH1cXFxcbiAgICBpZiAoUmVmZXJlciAmJiAhdXJsUGFyYW1bMl0uc29tZSgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKSlcXFxcbiAgICAgICAgdXJsUGFyYW1bMl0ucHVzaChSZWZlcmVyKVxcXFxuICAgIHVybFBhcmFtWzJdID0gJ3snICsgdXJsUGFyYW1bMl0uam9pbignJiYnKSArICd9J1xcXFxuICAgIHJldHVybiB1cmxQYXJhbS5qb2luKCc7JylcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuoznuqdb5LiAXVxcXCIsXFxcInBhdGhcXFwiOlxcXCJlanRvb2xcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24gY292ZXIo5qCH6aKYLCDkvZzogIUsIOWIhuexuywg54q25oCBLCDnq6DoioIsIOabtOaWsCwg566A5LuLLOWwgemdouWbvueJhyx0cnVlX3VybCwgaGFzTGluZSkge1xcXFxyXFxcXG52YXIg5qCH6aKYLCDkvZzogIUsIOWIhuexuywg54q25oCBLCDnq6DoioIsIOabtOaWsCwg566A5LuLLOWwgemdouWbvueJhyx0cnVlX3VybCwgaGFzTGluZTtcXFxcclxcXFxuXFxcXHR0cnkge1xcXFxyXFxcXG5cXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dGl0bGU6ICfigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcXFxcXCIjRkE3Mjk4XFxcXFxcXCI+JyvkvZzogIUuc2xpY2UoMCwxNSkrXFxcXFxcXCImbmJzcDtcXFxcXFxcIivnirbmgIErJzwvZm9udD48L3NtYWxsPicrJ+KAmOKAmOKAmeKAmTxzbWFsbD48Zm9udCBjb2xvcj1cXFxcXFxcIiNCMTVCRkZcXFxcXFxcIj4nK1xcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIr5YiG57G7Kyc8L2ZvbnQ+PC9zbWFsbD4nKyfigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcXFxcXCIjRjE3QzY3XFxcXFxcXCI+JytcXFxcXFxcIlxcXFxcXFxcblxcXFxcXFwiK+eroOiKgitcXFxcXFxcIiZuYnNwO1xcXFxcXFwiK+abtOaWsCsnPC9mb250Pjwvc21hbGw+JyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0ZGVzYzon4oCY4oCY4oCZ4oCZPHNtYWxsPjxmb250IGNvbG9yPVxcXFxcXFwiIzUyNDMzRFxcXFxcXFwiPicgK+eugOS7iysgJzwvc21hbGw+JyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0cGljX3VybDogIOWwgemdouWbvueJhyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dXJsOiB0cnVlX3VybCxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcXFxyXFxcXG5cXFxcdFxcXFx0fSk7XFxcXG5cXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sX3R5cGU6ICdsaW5lX2JsYW5rJyxcXFxcclxcXFxuXFxcXHRcXFxcdH0pO1xcXFxuXFxcXHRcXFxcdGQucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiAnbGluZScsXFxcXHJcXFxcblxcXFx0XFxcXHR9KTtcXFxcclxcXFxuXFxcXHRcXFxcdGlmIChoYXNMaW5lKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGl0ZW0uZXh0cmEgPSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0bGluZVZpc2libGU6IGZhbHNlXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdGQucHVzaChpdGVtKTtcXFxcclxcXFxuXFxcXHR9IGNhdGNoIChlKSB7fVxcXFxyXFxcXG59XFxcXHJcXFxcbmZ1bmN0aW9uIGNoYXB0ZXIodGl0bGUscGljX3VybCxjaGFwdGVyTGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyVXJsLCBkZWZhdWx0T3JkZXIsIGhhc0xpbmUsZG93bmxvYWRsYXp5KSB7XFxcXHJcXFxcblxcXFx0dmFyIGxpc3QgPSBjaGFwdGVyTGlzdDtcXFxcclxcXFxuXFxcXHR2YXIgb3JpZ2luYWwgPSBbe1xcXFxyXFxcXG5cXFxcdFxcXFx0dXJsOiBNWV9VUkwsXFxcXHJcXFxcblxcXFx0XFxcXHRvcmRlcjogZGVmYXVsdE9yZGVyXFxcXHJcXFxcblxcXFx0fV07XFxcXHJcXFxcblxcXFx0IWZpbGVFeGlzdCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSA/ICh3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpKSkgOiAwO1xcXFxyXFxcXG5cXFxcdHZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTtcXFxcclxcXFxuXFxcXHRmb3IgKHZhciBpIGluIGxvZykge1xcXFxyXFxcXG5cXFxcdFxcXFx0aWYgKGxvZ1tpXS51cmwgPT0gTVlfVVJMKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHZhciBub3cgPSBpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR2YXIgb3JkZXIgPSBsb2dbaV0ub3JkZXI7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGJyZWFrO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dmFyIG5vdyA9ICcnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR2YXIgb3JkZXIgPSBkZWZhdWx0T3JkZXI7XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG5cXFxcdGxldCBvcmRlckl0ZW0gPSB7XFxcXHJcXFxcblxcXFx0XFxcXHR0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ1cXFxcXFxcIiArICc8c3Ryb25nPjxmb250IGNvbG9yPVxcXFxcXFwiIzA5OEFDMVxcXFxcXFwiPicgKyAn56ug6IqC5o6S5bqP4oeFJyArICc8L2ZvbnQ+PC9zdHJvbmc+JyxcXFxcclxcXFxuXFxcXHRcXFxcdHVybDogTVlfVVJMICsgYEBsYXp5UnVsZT0uanM6dmFyIGxvZyA9IEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykpO3ZhciBub3c9J2AgKyBub3cgKyBgJztpZihub3chPScnKXt2YXIgbm93PXBhcnNlSW50KG5vdyk7dmFyIG9yZGVyPWxvZ1tub3ddLm9yZGVyfWVsc2V7dmFyIG5vdz1wYXJzZUludChsb2cubGVuZ3RoKTt2YXIgb3JkZXI9YCArIGRlZmF1bHRPcmRlciArIGA7bG9nLnB1c2goe3VybDppbnB1dCxvcmRlcjpvcmRlcn0pO31pZihsb2dbbm93XS5vcmRlcil7bG9nW25vd10ub3JkZXI9MDt9ZWxzZXtsb2dbbm93XS5vcmRlcj0xO307d3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycsIEpTT04uc3RyaW5naWZ5KGxvZykpO3JlZnJlc2hQYWdlKCk7J2hpa2VyOi8vZW1wdHknYCxcXFxcclxcXFxuXFxcXHRcXFxcdGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXFxcclxcXFxuXFxcXHR9XFxcXHJcXFxcblxcXFx0aWYgKGhhc0xpbmUpIHtcXFxcclxcXFxuXFxcXHRcXFxcdG9yZGVySXRlbS50aXRsZSA9IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyAnPHN0cm9uZz48Zm9udCBjb2xvcj1cXFxcXFxcIiMwOThBQzFcXFxcXFxcIj4nICsgJ+mbhuaVsOaOkuW6j+KHhScgKyAnPC9mb250Pjwvc3Ryb25nPic7XFxcXHJcXFxcblxcXFx0XFxcXHRvcmRlckl0ZW0uY29sX3R5cGUgPSBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIlxcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxuXFxcXHRsZXQgY2hhcHRlckxpc3RzID0gbGlzdC5tYXAoKGl0ZW0pPT4oe1xcXFxyXFxcXG5cXFxcdFxcXFx0dGl0bGU6IHBkZmgoaXRlbSxcXFxcXFxcImEmJlRleHRcXFxcXFxcIiksXFxcXHJcXFxcblxcXFx0XFxcXHR1cmw6IHBkKGl0ZW0sXFxcXFxcXCJhJiZocmVmXFxcXFxcXCIpLFxcXFxyXFxcXG5cXFxcdH0pKTtcXFxcclxcXFxuZC5wdXNoKHtcXFxcclxcXFxuXFxcXHR0aXRsZTogJ+KAmOKAmOKAmeKAmTxzdHJvbmc+PGZvbnQgY29sb3I9IFxcXFxcXFwiIzA5OEFDMVxcXFxcXFwiPicgKyBcXFxcXFxcIuS4i+i9vea8q+eUu1xcXFxcXFwiICsgJzwvZnJvbnQ+PC9zdHJvbmc+JyxcXFxcclxcXFxuXFxcXHR1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjI25vUmVmcmVzaCM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRjb2xfdHlwZTogXFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCIsXFxcXHJcXFxcblxcXFx0ZXh0cmE6IHtcXFxcclxcXFxuXFxcXHRcXFxcdGNoYXB0ZXJMaXN0OiBjaGFwdGVyTGlzdHMsXFxcXHJcXFxcblxcXFx0XFxcXHRpbmZvOntcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ym9va05hbWU6IHRpdGxlLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ym9va1RvcFBpYzogcGljX3VybCxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0cGFyc2VDb2RlOiBkb3dubG9hZGxhenlcXFxcclxcXFxuXFxcXHRcXFxcdH0sXFxcXHJcXFxcblxcXFx0XFxcXHRkZWZhdWx0VmlldzpcXFxcXFxcIjFcXFxcXFxcIlxcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxufSk7XFxcXHJcXFxcblxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdHRpdGxlOiAn4oCY4oCY4oCZ4oCZPHN0cm9uZz48Zm9udCBjb2xvcj0gXFxcXFxcXCIjMDk4QUMxXFxcXFxcXCI+JyArIFxcXFxcXFwi5pys5Zyw5Lmm5p62XFxcXFxcXCIgKyAnPC9mcm9udD48L3N0cm9uZz4nLFxcXFxyXFxcXG5cXFxcdFxcXFx0dXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9NYWluLnZpZXc/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdGNvbF90eXBlOiBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcclxcXFxuXFxcXHR9KTsgIFxcXFxyXFxcXG5cXFxcdGQucHVzaChvcmRlckl0ZW0pO1xcXFxyXFxcXG5cXFxcdGQucHVzaCh7Y29sX3R5cGU6ICdsaW5lJ30pO1xcXFx0XFxcXHJcXFxcblxcXFx0dmFyIGxpc3QgPSBvcmRlciA/IGxpc3QgOiBsaXN0LnJldmVyc2UoKTtcXFxcblxcXFx0aWYoIWxpc3R8fGxpc3Q9PVxcXFxcXFwiXFxcXFxcXCIpe1xcXFxyXFxcXG5cXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dGl0bGU6ICfmraTmvKvnlLvlt7LkuIvmnrYhIScsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiAndGV4dF8xJyxcXFxcclxcXFxuXFxcXHRcXFxcdH0pO1xcXFxyXFxcXG5cXFxcdH1cXFxcblxcXFxyXFxcXG5cXFxcdGZvciAodmFyIGkgaW4gbGlzdCkge1xcXFxyXFxcXG5cXFxcdFxcXFx0dHJ5IHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHR0aXRsZTogcGRmaChsaXN0W2ldLCBjaGFwdGVyVGl0bGUpLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHVybDogcGQobGlzdFtpXSwgY2hhcHRlclVybCkgKyBsYXp5LFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiAndGV4dF8zJ1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR9KTtcXFxcclxcXFxuXFxcXHRcXFxcdH1jYXRjaCAoZSkge31cXFxcclxcXFxuXFxcXHR9XFxcXHJcXFxcbn1cXFxcclxcXFxuXFxcXHJcXFxcbmZ1bmN0aW9uIGxpbmUobGluZUxpc3QsIGxpbmVUaXRsZVJ1bGUsIHZhcktleSkge1xcXFxyXFxcXG5cXFxcdGxldCBsaXN0ID0gbGluZUxpc3RcXFxcclxcXFxuXFxcXHR2YXJLZXkgPSB2YXJLZXkgPT0gbnVsbCA/IChNWV9SVUxFLnVybCArICcjbGluZS1pbmRleCcpOiB2YXJLZXk7XFxcXHJcXFxcblxcXFx0YWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChrZXlMaXN0KSA9PiB7XFxcXHJcXFxcblxcXFx0XFxcXHRmb3IgKGxldCBpIGluIGtleUxpc3QpIHtjbGVhclZhcihrZXlMaXN0W2ldKX1cXFxcclxcXFxuXFxcXHR9LCBbdmFyS2V5LCBNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJ10pKVxcXFxyXFxcXG5cXFxcdGxldCBsaW5lMFRpdGxlID0gJyc7XFxcXHJcXFxcblxcXFx0dHJ5IHtcXFxcclxcXFxuXFxcXHRcXFxcdGxpbmUwVGl0bGUgPSBwZGZoKGxpc3RbMF0sIGxpbmVUaXRsZVJ1bGUpLnJlcGxhY2UoXFxcXFxcXCLnq6DoioLliJfooajvvJpcXFxcXFxcIixcXFxcXFxcIlxcXFxcXFwiKTtcXFxcclxcXFxuXFxcXHR9IGNhdGNoIChlKSB7fVxcXFxyXFxcXG5cXFxcdGxvZyhNWV9SVUxFLnRpdGxlICsgZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKVxcXFxyXFxcXG5cXFxcdGZvciAobGV0IGkgaW4gbGlzdCkge1xcXFxyXFxcXG5cXFxcdFxcXFx0dHJ5IHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0bGV0IGxpbmVUaXRsZSA9IHBkZmgobGlzdFtpXSwgbGluZVRpdGxlUnVsZSkucmVwbGFjZShcXFxcXFxcIueroOiKguWIl+ihqO+8mlxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHRpdGxlOiBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZTBUaXRsZSkgPT09IGxpbmVUaXRsZSA/IFxcXFxcXFwi5YiH5o2iOuKAmOKAmFxcXFxcXFwiICsgbGluZVRpdGxlK1xcXFxcXFwiXFxcXFxcXCI6bGluZVRpdGxlK1xcXFxcXFwi4oCY4oCYOuWIh+aNolxcXFxcXFwiLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHVybDogJCgpLmxhenlSdWxlKCh2YXJLZXksIGxpbmVJbmRleCwgbGluZVRpdGxlKSA9PiB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRwdXRWYXIodmFyS2V5LCBsaW5lSW5kZXgudG9TdHJpbmcoKSk7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRwdXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKTtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdGxvZyhNWV9SVUxFLnRpdGxlICsgZ2V0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKTtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdHJlZnJlc2hQYWdlKCk7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRyZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+W3suWIh+aNouiHs1xcXFxcXFwiICsgbGluZVRpdGxlO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdH0sIHZhcktleSwgaSwgbGluZVRpdGxlKSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR9KTtcXFxcclxcXFxuXFxcXHRcXFxcdH0gY2F0Y2ggKGUpIHt9XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5LqM57qnW+S6jF1cXFwiLFxcXCJwYXRoXFxcIjpcXFwiY29taWNGdW5jdGlvbkZpbGUuanNcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24gY292ZXIoY292ZXJUaXRsZSwgY292ZXJUaXRsZTEsIGNvdmVyVGl0bGUyLCBjb3ZlclRpdGxlMywgY292ZXJEZXNjLCBjb3ZlclBpYywgY292ZXJVcmwsIGhhc0xpbmUpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBjb25zdCBDb2xvciA9IFxcXFxcXFwiIzE5Qjg5RFxcXFxcXFwiO1xcXFxuICAgICAgICB2YXIgZGVzX2Rlc2MgPSBwZGZoKGh0bWwsIGNvdmVyRGVzYykucmVwbGFjZSgn566A44CA44CA5LuL77yaJywgJycpLnJlcGxhY2UoJ+a8q+eUu+eugOS7i++8micsICcnKTtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFxcXFxcIiNGQTcyOThcXFxcXFxcIj4nICsgcGRmaChodG1sLCBjb3ZlclRpdGxlKSArICdcXFxcXFxcXG4nICsgJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcXFxcXCIjNzM0MzM4XFxcXFxcXCI+JyArIHBkZmgoaHRtbCwgY292ZXJUaXRsZTEpICsgJ1xcXFxcXFxcbicsXFxcXG4gICAgICAgICAgICBkZXNjOiAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFxcXFxcIiM5NTRBNDVcXFxcXFxcIj4nICsgcGRmaChodG1sLCBjb3ZlclRpdGxlMikgKyAnXFxcXFxcXFxuJyArICfigJjigJjigJnigJk8Pjxmb250IGNvbG9yPVxcXFxcXFwiIzk1NEE0NVxcXFxcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUzKSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IHBkKGh0bWwsIGNvdmVyUGljKSxcXFxcbiAgICAgICAgICAgIHVybDogY292ZXJVcmwsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljX2JsdXInXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgLy92YXIgamogPSBnZXRWYXIoXFxcXFxcXCJqanNcXFxcXFxcIiwgXFxcXFxcXCLmlLbotbdcXFxcXFxcIik7XFxcXG4gICAgICAgIC8vdmFyIGpqdXJsID0gJ2hpa2VyOi8vZW1wdHlAbGF6eVJ1bGU9LmpzOmdldFZhcihcXFxcXFxcImpqc1xcXFxcXFwiKSA9PSBcXFxcXFxcIuaUtui1t1xcXFxcXFwiP3B1dFZhcihcXFxcXFxcImpqc1xcXFxcXFwiLFxcXFxcXFwi5bGV5byAXFxcXFxcXCIpOnB1dFZhcihcXFxcXFxcImpqc1xcXFxcXFwiLFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpO1xcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiJztcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn566A5LuLIDxzbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojMTlCODlEXFxcXFxcXCI+5bGV5byAPjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+JyxcXFxcbiAgICAgICAgICAgIGltZzogXFxcXFxcXCJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vbW9yZS8xOTcucG5nXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoamppZCwgZGVjaWQsIGRlc19kZXNjKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGdldFZhcihcXFxcXFxcImpqc1xcXFxcXFwiLCBcXFxcXFxcIuaUtui1t1xcXFxcXFwiKSA9PSBcXFxcXFxcIuaUtui1t1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcImpqc1xcXFxcXFwiLCBcXFxcXFxcIuWxleW8gFxcXFxcXFwiKTtcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGpqaWRcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+eugOS7iyA8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzE5Qjg5RFxcXFxcXFwiPuaUtui1tz48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFNpemU6IDE0LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkZWNpZFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojODA4MDgwXFxcXFxcXCI+JyArIGRlc19kZXNjICsgJy4uLjwvc3Bhbj4nXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFxcXFxcImpqc1xcXFxcXFwiLCBcXFxcXFxcIuaUtui1t1xcXFxcXFwiKTtcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGpqaWRcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+eugOS7iyA8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzE5Qjg5RFxcXFxcXFwiPuWxleW8gD48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFNpemU6IDE0LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkZWNpZFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojODA4MDgwXFxcXFxcXCI+JyArIGRlc19kZXNjLnN1YnN0cigwLCAzMCkgKyAnLi4uPC9zcGFuPidcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICB9LCBNWV9SVUxFICsgXFxcXFxcXCJfamppZFxcXFxcXFwiLCBNWV9SVUxFICsgXFxcXFxcXCJfZGVjaWRcXFxcXFxcIiwgZGVzX2Rlc2MpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFICsgXFxcXFxcXCJfamppZFxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzgwODA4MFxcXFxcXFwiPicgKyBkZXNfZGVzYy5zdWJzdHIoMCwgMzApICsgJy4uLjwvc3Bhbj4nLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXFxcbiAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogMyxcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfUlVMRSArIFxcXFxcXFwiX2RlY2lkXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgIH0pXFxcXG4gICAgfSBjYXRjaCAoZSkge31cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZG93bihUaXRsZSwgY2hhcHRlclBpYywgbGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyTGluZSwgZG93bmxvYWRsYXp5KSB7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IGRvTGlzdCA9IGxpc3QubWFwKChpdGVtKSA9PiAoe1xcXFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwgY2hhcHRlclRpdGxlKSxcXFxcbiAgICAgICAgICAgIHVybDogcGQoaXRlbSwgY2hhcHRlckxpbmUpLFxcXFxuICAgICAgICB9KSk7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICMxYWFkMTlcXFxcXFxcIj7kuIvovb3mvKvnlLvwn5S5PC9zcGFuPjwvYj4nLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9SZWZyZXNoIz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyTGlzdDogZG9MaXN0LFxcXFxuICAgICAgICAgICAgICAgIGluZm86IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9va05hbWU6IHBkZmgoaHRtbCwgVGl0bGUpLFxcXFxuICAgICAgICAgICAgICAgICAgICBydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9va1RvcFBpYzogcGQoaHRtbCwgY2hhcHRlclBpYyksXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQ29kZTogZG93bmxvYWRsYXp5XFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcXFxcXCIxXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGNoYXB0ZXIoY2hhcHRlckxpc3QsIGNoYXB0ZXJUaXRsZSwgY2hhcHRlclVybCwgZGVmYXVsdE9yZGVyLCBoYXNMaW5lKSB7XFxcXG4gICAgdmFyIGxpc3QgPSBjaGFwdGVyTGlzdDtcXFxcbiAgICB2YXIgb3JpZ2luYWwgPSBbe1xcXFxuICAgICAgICB1cmw6IE1ZX1VSTCxcXFxcbiAgICAgICAgb3JkZXI6IGRlZmF1bHRPcmRlclxcXFxuICAgIH1dO1xcXFxuICAgICFmaWxlRXhpc3QoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykgPyAod3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycsIEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsKSkpIDogMDtcXFxcbiAgICB2YXIgbG9nID0gSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSk7XFxcXG4gICAgZm9yICh2YXIgaSBpbiBsb2cpIHtcXFxcbiAgICAgICAgaWYgKGxvZ1tpXS51cmwgPT0gTVlfVVJMKSB7XFxcXG4gICAgICAgICAgICB2YXIgbm93ID0gaTtcXFxcbiAgICAgICAgICAgIHZhciBvcmRlciA9IGxvZ1tpXS5vcmRlcjtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdmFyIG5vdyA9ICcnO1xcXFxuICAgICAgICAgICAgdmFyIG9yZGVyID0gZGVmYXVsdE9yZGVyO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGxldCBvcmRlckl0ZW0gPSB7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgJzxmb250IGNvbG9yPVxcXFxcXFwiI2YzNzMzNVxcXFxcXFwiPicgKyAn56ug6IqC5o6S5bqP4oeFJyArICc8L2ZvbnQ+JyxcXFxcbiAgICAgICAgdXJsOiBNWV9VUkwgKyBgQGxhenlSdWxlPS5qczp2YXIgbG9nID0gSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSk7dmFyIG5vdz0nYCArIG5vdyArIGAnO2lmKG5vdyE9Jycpe3ZhciBub3c9cGFyc2VJbnQobm93KTt2YXIgb3JkZXI9bG9nW25vd10ub3JkZXJ9ZWxzZXt2YXIgbm93PXBhcnNlSW50KGxvZy5sZW5ndGgpO3ZhciBvcmRlcj1gICsgZGVmYXVsdE9yZGVyICsgYDtsb2cucHVzaCh7dXJsOmlucHV0LG9yZGVyOm9yZGVyfSk7fWlmKGxvZ1tub3ddLm9yZGVyKXtsb2dbbm93XS5vcmRlcj0wO31lbHNle2xvZ1tub3ddLm9yZGVyPTE7fTt3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkobG9nKSk7cmVmcmVzaFBhZ2UoKTsnaGlrZXI6Ly9lbXB0eSdgLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgfVxcXFxuICAgIGlmIChoYXNMaW5lKSB7XFxcXG4gICAgICAgIG9yZGVySXRlbS50aXRsZSA9IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyAnPGZvbnQgY29sb3I9XFxcXFxcXCIjZjM3MzM1XFxcXFxcXCI+JyArICfpm4bmlbDmjpLluo/ih4UnICsgJzwvZm9udD4nO1xcXFxuICAgICAgICBvcmRlckl0ZW0uY29sX3R5cGUgPSBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxuICAgIH1cXFxcbiAgICBkLnB1c2gob3JkZXJJdGVtKTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgfSk7XFxcXG5cXFxcbiAgICB2YXIgbGlzdCA9IG9yZGVyID8gbGlzdCA6IGxpc3QucmV2ZXJzZSgpO1xcXFxuICAgIGZvciAobGV0IGkgaW4gbGlzdCkge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChsaXN0W2ldLCBjaGFwdGVyVGl0bGUpLFxcXFxuICAgICAgICAgICAgICAgIHVybDogcGQobGlzdFtpXSwgY2hhcHRlclVybCkgKyBsYXp5LFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBwZGZoKGxpc3RbMF0sIGNoYXB0ZXJUaXRsZSkubGVuZ3RoID4gNiA/ICd0ZXh0XzInIDogJ3RleHRfMycsXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGxpbmUobGluZUxpc3QsIGxpbmVUaXRsZVJ1bGUsIHZhcktleSkge1xcXFxuICAgIGxldCBsaXN0ID0gbGluZUxpc3RcXFxcbiAgICB2YXJLZXkgPSB2YXJLZXkgPT0gbnVsbCA/IChNWV9SVUxFLnVybCArICcjbGluZS1pbmRleCcpIDogdmFyS2V5O1xcXFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoa2V5TGlzdCkgPT4ge1xcXFxuICAgICAgICBmb3IgKGxldCBpIGluIGtleUxpc3QpIHtcXFxcbiAgICAgICAgICAgIGNsZWFyVmFyKGtleUxpc3RbaV0pXFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgIH0sIFt2YXJLZXksIE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnXSkpXFxcXG4gICAgbGV0IGxpbmUwVGl0bGUgPSAnJ1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxpbmUwVGl0bGUgPSBwZGZoKGxpc3RbMF0sIGxpbmVUaXRsZVJ1bGUpO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgbG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpXFxcXG4gICAgZm9yIChsZXQgaSBpbiBsaXN0KSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgbGluZVRpdGxlID0gcGRmaChsaXN0W2ldLCBsaW5lVGl0bGVSdWxlKTtcXFxcbiAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGdldFZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpLCBsaW5lMFRpdGxlKSA9PT0gbGluZVRpdGxlID8gXFxcXFxcXCLliIfmjaI64oCY4oCYXFxcXFxcXCIgKyBsaW5lVGl0bGUgKyBcXFxcXFxcIlxcXFxcXFwiIDogbGluZVRpdGxlICsgXFxcXFxcXCLigJjigJg65YiH5o2iXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKHZhcktleSwgbGluZUluZGV4LCBsaW5lVGl0bGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKHZhcktleSwgbGluZUluZGV4LnRvU3RyaW5nKCkpXFxcXG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZyhNWV9SVUxFLnVybClcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJyksIGxpbmVUaXRsZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKClcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LliIfmjaLoh7NcXFxcXFxcIiArIGxpbmVUaXRsZVxcXFxuICAgICAgICAgICAgICAgIH0sIHZhcktleSwgaSwgbGluZVRpdGxlKSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJ1xcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgfVxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcXFxuICAgICAgICAgICAgfSk7XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6Kej5p6QW+WMhV1cXFwiLFxcXCJwYXRoXFxcIjpcXFwiYnpqc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJ2YXIg5ryr55S76Kej5p6QID0gJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgdmFyIGlkID0gdHJ1ZTtcXFxcbiAgICB2YXIgY29kZSA9IHJlcXVlc3QoaW5wdXQpXFxcXG4gICAgdmFyIHBpY3MgPSBbXTtcXFxcbiAgICB2YXIgdG9fUmVwZWF0ID0gZmFsc2U7XFxcXG5cXFxcblxcXFxuICAgIHdoaWxlIChpZCkge1xcXFxuICAgICAgICBwZGZhKGNvZGUsIFxcXFxcXFwiLmNoYXB0ZXItbWFpbiYmYW1wLWltZ1xcXFxcXFwiKVxcXFxuICAgICAgICAgICAgLmZvckVhY2goZGF0YSA9PiBwaWNzLnB1c2gocGRmaChkYXRhLCBcXFxcXFxcImFtcC1pbWcmJnNyY1xcXFxcXFwiKSArICdAUmVmZXJlcj1odHRwczovL2NuLmJhb3ppbWguY29tLycpKTtcXFxcbiAgICAgICAgdmFyIG5leHRfUGFnZSA9IHBkZmgoY29kZSwgXFxcXFxcXCIubmV4dF9jaGFwdGVyLC0xJiZIdG1sXFxcXFxcXCIpXFxcXG4gICAgICAgIGlmIChuZXh0X1BhZ2UuaW5jbHVkZXMoJ+S4i+S4gOmhtScpKSB7XFxcXG4gICAgICAgICAgICBjb2RlID0gcmVxdWVzdChwZGZoKG5leHRfUGFnZSwgXFxcXFxcXCJhJiZocmVmXFxcXFxcXCIpKVxcXFxuICAgICAgICAgICAgdG9fUmVwZWF0ID0gdHJ1ZTtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGlkID0gZmFsc2U7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL+WOu+mZpOmHjeWkjeWbvueJh1xcXFxuICAgIGlmICh0b19SZXBlYXQpIHtcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaWNzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICB3aGlsZSAocGljcy5pbmRleE9mKHBpY3NbaV0sIGkgKyAxKSAhPSAtMSkge1xcXFxuICAgICAgICAgICAgICAgIHBpY3Muc3BsaWNlKHBpY3MuaW5kZXhPZihwaWNzW2ldLCBpICsgMSksIDEpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG5cXFxcbiAgICByZXR1cm4gXFxcXFxcXCJwaWNzOi8vXFxcXFxcXCIgKyBwaWNzLmpvaW4oXFxcXFxcXCImJlxcXFxcXFwiKTtcXFxcbn0pXFxcXG5cXFxcbmxldCBsYXp5ID0gYEBsYXp5UnVsZT0uanM6YCArIOa8q+eUu+ino+aekDtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLliqjmgIFb5LqMXVxcXCIsXFxcInBhdGhcXFwiOlxcXCJkdGZsXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IGVtcHR5ID0gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcblxcXFxudHJ5IHtcXFxcbiAgICB2YXIgY2F0ZWdvcmllcyA9IHBkZmEoaHRtbCwg5aSn57G75a6a5L2NKS5jb25jYXQocGRmYShodG1sLCDmi7zmjqXliIbnsbspKVxcXFxufSBjYXRjaCAoZSkge1xcXFxuICAgIHZhciBjYXRlZ29yaWVzID0gcGRmYShodG1sLCDlpKfnsbvlrprkvY0pXFxcXG59XFxcXG5cXFxcbmxldCBpbml0X2NhdGUgPSBbXVxcXFxuXFxcXG5mb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcXFxcbiAgICBpbml0X2NhdGUucHVzaChcXFxcXFxcIjBcXFxcXFxcIilcXFxcbn1cXFxcblxcXFxuY29uc3QgZm9sZCA9IGdldFZhcihNWV9SVUxFLmdyb3VwLCBcXFxcXFxcIjFcXFxcXFxcIilcXFxcbmNvbnN0IGNhdGVfdGVtcF9qc29uID0gZ2V0VmFyKE1ZX1JVTEUudGl0bGUsIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpXFxcXG5jb25zdCBjYXRlX3RlbXAgPSBKU09OLnBhcnNlKGNhdGVfdGVtcF9qc29uKVxcXFxuXFxcXG5pZiAocGFyc2VJbnQocGFnZSkgPT09IDEpIHtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogZm9sZCA9PT0gJzEnID8gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNGRjAwMDBcXFxcXFxcIj7iiKg8L3NwYW4+PC9iPicgOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogIzFhYWQxOVxcXFxcXFwiPuKIpzwvc3Bhbj48L2I+JyxcXFxcbiAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGZvbGQpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLmdyb3VwLCBmb2xkID09PSAnMScgPyAnMCcgOiAnMScpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIH0sIGZvbGQpLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgIH0pXFxcXG5cXFxcblxcXFxuICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XFxcXG4gICAgICAgIGxldCBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jSk7XFxcXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xcXFxuICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdGVtLCDliIbnsbvmoIfpopgpXFxcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICcgKyDliIbnsbvpopzoibIgKyAnXFxcXFxcXCI+JyArIHRpdGxlICsgJzwvc3Bhbj48L2I+JyA6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGQoaXRlbSwg5YiG57G76ZO+5o6lKSArICcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdfY2F0ZSA9IFtdXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NhdGUucHVzaChpbmRleCA9PT0gMCA/IHBhcmFtcy5rZXkudG9TdHJpbmcoKSA6IFxcXFxcXFwiMFxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShuZXdfY2F0ZSkpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS51cmwsIGlucHV0KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImJsYW5rX2Jsb2NrXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKGZvbGQgPT09ICcxJykge1xcXFxuICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdGVtLCDliIbnsbvmoIfpopgpXFxcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICcgKyDliIbnsbvpopzoibIgKyAnXFxcXFxcXCI+JyArIHRpdGxlICsgJzwvc3Bhbj48L2I+JyA6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGQoaXRlbSwg5YiG57G76ZO+5o6lKSArICcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS50aXRsZSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoTVlfUlVMRS51cmwsIGlucHV0KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImJsYW5rX2Jsb2NrXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSlcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLliqjmgIFb5LiAXVxcXCIsXFxcInBhdGhcXFwiOlxcXCJjYXRlZ29yaWVzLWhlYWRlclxcXCIsXFxcInJ1bGVcXFwiOlxcXCJjb25zdCBzeW1ib2xNYXAgPSB7XFxcXG4gICAgLy8gY2hlY2tQYXJhbXM6IFN5bWJvbCgnY2hlY2tQYXJhbXMnKSxcXFxcbiAgICBtTGF5b3V0OiBTeW1ib2woJ21MYXlvdXQnKSxcXFxcbiAgICB0cnVlX3VybDogU3ltYm9sKCd0cnVlX3VybCcpLFxcXFxuICAgIG1QYWdlOiBTeW1ib2woJ21QYWdlJyksXFxcXG4gICAgc3JjOiBTeW1ib2woJ3NyYycpLFxcXFxuICAgIHJ1bGVPYmpMaXN0OiBTeW1ib2woJ3J1bGVPYmpMaXN0JyksXFxcXG4gICAgbUZvbGQ6IFN5bWJvbCgnbUZvbGQnKSxcXFxcbiAgICBtRm9sZElubmVyRW5hYmxlOiBTeW1ib2woJ21Gb2xkSW5uZXJFbmFibGUnKSxcXFxcbiAgICBtRm9sZEluZGV4OiBTeW1ib2woJ21Gb2xkSW5kZXgnKSxcXFxcbiAgICBtRm9sZExheW91dDogU3ltYm9sKCdtRm9sZExheW91dCcpLFxcXFxuICAgIG1Db2xvcjogU3ltYm9sKCdtQ29sb3InKSxcXFxcbiAgICBtVGFnOiBTeW1ib2woJ21UYWcnKSxcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gQ2F0ZWdvcmllc0hlYWRlcihjb2xvcikge1xcXFxuICAgIC8vICd1c2Ugc3RyaWN0JztcXFxcbiAgICAvLyAuLi5cXFxcbiAgICAvLyB0aGlzW3N5bWJvbE1hcC5saXN0UnVsZV0gPSBbXVxcXFxuICAgIC8vIHRoaXNbc3ltYm9sTWFwLnN1Ykxpc3RSdWxlXSA9IFtdXFxcXG4gICAgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSA9IGNvbG9yIHx8IFxcXFxcXFwiI0ZBNzI5OFxcXFxcXFwiO1xcXFxuICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XSA9IFtdXFxcXG4gICAgdGhpcy5WQVJNQVAgPSB7XFxcXG4gICAgICAgIENBVEVHT1JZOiBcXFxcXFxcImhlYWRlci5jYXRlZ29yeVxcXFxcXFwiLFxcXFxuICAgICAgICBVUkw6IFxcXFxcXFwiaGVhZGVyLnVybFxcXFxcXFwiLFxcXFxuICAgICAgICBGT0xEOiBcXFxcXFxcImhlYWRlci5mb2xkXFxcXFxcXCIsXFxcXG4gICAgfVxcXFxuICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XSA9IHtcXFxcbiAgICAgICAgaW5qZWN0SW5kZXg6IDFcXFxcbiAgICB9XFxcXG4gICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gPSAxXFxcXG59XFxcXG5cXFxcbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcmllc0hlYWRlci5wcm90b3R5cGUsIHtcXFxcbiAgICAvLyBPdmVycmlkZSDmnoTpgKDmlrnms5XvvIznm7jlvZPkuo4gZnVuY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gKC4uLikgPT4gey4uLn3vvIxuZXcgZnVuY3Rpb24oKSDnmoTml7blgJnkvJroh6rliqjmiafooYxcXFxcbiAgICBjb25zdHJ1Y3RvcjogQ2F0ZWdvcmllc0hlYWRlcixcXFxcbiAgICAvLyDlrprkuYnnp4HmnInmlrnms5VcXFxcbiAgICBWRVJTSU9OOiAyMDIxMTIwMTE5MDAsXFxcXG4gICAgY2hlY2tQYXJhbXMoKSB7XFxcXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAubUxheW91dF0pIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+iwg+eUqCBsYXlvdXQoZCkg5Lyg5YWl5b2T5YmN55WM6Z2iXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKCEodGhpc1tzeW1ib2xNYXAuc3JjXSB8fCB0aGlzW3N5bWJvbE1hcC50cnVlX3VybF0pKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fosIPnlKggdHJ1ZVVybCh1cmwpIOS8oOWFpeW9k+WJjeWIhuexu+eahOmTvuaOpeaIluiwg+eUqCBodG1sKG1IdG1sKSDkvKDlhaXlvZPliY3liIbnsbvpobXpnaLnmoTmupDnoIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLm1QYWdlXSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi6K+36LCD55SoIHBhZ2UobVBhZ2UpIOS8oOWFpeW9k+WJjemhteaVsFxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoIDwgMSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi6K+36LCD55So55u45YWz5pa55rOV5Lyg5YWl5a6a5L2N6KeE5YiZXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5tRm9sZF0pIHtcXFxcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9ICcwJ1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICBsYXlvdXQobUxheW91dCkge1xcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XSA9IG1MYXlvdXRcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIHRydWVVcmwodXJsKSB7XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnRydWVfdXJsXSA9IHVybFxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgcGFnZShtUGFnZSkge1xcXFxuICAgICAgICBpZiAodHlwZW9mIChtUGFnZSkgPT09ICdzdHJpbmcnKSB7XFxcXG4gICAgICAgICAgICBtUGFnZSA9IHBhcnNlSW50KG1QYWdlKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1QYWdlXSA9IG1QYWdlXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBodG1sKG1TcmMpIHtcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAuc3JjXSA9IG1TcmNcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIGxpc3QocnVsZSkge1xcXFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcImxpc3QocnVsZSkgYWRkKHJ1bGVPYmopIOWPquiDveS6jOmAieS4gO+8gVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XSA9IFt7fV1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLmxpc3RSdWxlID0gcnVsZVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+S4gOe6p+WIhuexuyddID0gcnVsZVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgc3ViTGlzdChydWxlKSB7XFxcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwic3ViTGlzdChydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0gfHwgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgJiYgIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10pKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7flhYjosIPnlKggbGlzdChydWxlKSDmiJYg5LiA57qn5YiG57G7KHJ1bGUpIOWumuS9jeS4gOe6p+WIhuexu1xcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5zdWJMaXN0UnVsZSA9IHJ1bGVcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyflrZDliIbnsbsnXSA9IHJ1bGVcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIHRpdGxlKHJ1bGUpIHtcXFxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPiAxKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCJ0aXRsZShydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0gfHwgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgJiYgIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10pKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7flhYjosIPnlKggbGlzdChydWxlKSDmiJYg5LiA57qn5YiG57G7KHJ1bGUpIOWumuS9jeS4gOe6p+WIhuexu1xcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS50aXRsZVJ1bGUgPSBydWxlXFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5YiG57G75qCH6aKYJ10gPSB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0udGl0bGVSdWxlXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICB1cmwocnVsZSkge1xcXFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDEpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcInVybChydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0gfHwgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgJiYgIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10pKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7flhYjosIPnlKggbGlzdChydWxlKSDmiJYg5LiA57qn5YiG57G7KHJ1bGUpIOWumuS9jeS4gOe6p+WIhuexu1xcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS51cmxSdWxlID0gcnVsZVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+WIhuexu+mTvuaOpSddID0gdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnVybFJ1bGVcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIC8qKlxcXFxuICAgICAqIOaYr+WQpuW8gOWQr+aKmOWPoOWKn+iDvVxcXFxuICAgICAqXFxcXG4gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSDooajnpLrlvIDlkK/vvIxmYWxzZSDooajnpLrnpoHnlKhcXFxcbiAgICAgKiBAcmV0dXJucyB7Q2F0ZWdvcmllc0hlYWRlcn1cXFxcbiAgICAgKi9cXFxcbiAgICBmb2xkSW5uZXIoZW5hYmxlZCkge1xcXFxuICAgICAgICBpZiAoISh0eXBlb2YgKGVuYWJsZWQpID09PSAnYm9vbGVhbicpKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fkvKDlhaUgdHJ1ZSDmiJYgZmFsc2Ug6KGo56S65byA5ZCv5oiW5YWz6Zet5oqY5Y+g5Yqf6IO977yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbm5lckVuYWJsZV0gPSBlbmFibGVkXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICAvKipcXFxcbiAgICAgKiDku47nrKwgaW5kZXgg6KGM5byA5aeL5oqY5Y+gXFxcXG4gICAgICpcXFxcbiAgICAgKiBAcGFyYW0gaW5kZXgg5byA5aeL5oqY5Y+g55qE6KGM5pWwXFxcXG4gICAgICogQHJldHVybnMge0NhdGVnb3JpZXNIZWFkZXJ9XFxcXG4gICAgICovXFxcXG4gICAgZm9sZEluZGV4KGluZGV4KSB7XFxcXG4gICAgICAgIGlmICghKHR5cGVvZiAoaW5kZXgpID09PSAnbnVtYmVyJykpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuW8gOWni+aKmOWPoOihjOivt+S8oOWFpeaVsOWtl++8gVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmIChpbmRleCA8IDEpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuW8gOWni+aKmOWPoOihjOivt+S8oOWFpeWkp+S6jiAwIOeahOaVtOaVsO+8gVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5kZXhdID0gaW5kZXggfHwgMTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIC8qKlxcXFxuICAgICAqIOaKmOWPoOaMiemSrueahOeVjOmdolxcXFxuICAgICAqXFxcXG4gICAgICogQHBhcmFtIGxheW91dCDkuI4gZC5wdXNoIOe7k+aehOS4gOiHtO+8jFxcXFxuICAgICAqICAgICAgICDkvovvvJp7IHRpdGxlOlxcXFxcXFwi5qCH6aKYMVxcXFxcXFwiLCB1cmw6XFxcXFxcXCJ4eHhcXFxcXFxcIiwgY29sX3R5cGU6XFxcXFxcXCJzY3JvbGxfYnV0dG9uXFxcXFxcXCIgfTtcXFxcbiAgICAgKiAgICAgICAg5Y+C5pWw6YeH55So5Y+v6YCJ6KaG55uW5qih5byP77yM5LiN5YaZ55qE5Y+C5pWw5YiZ5L2/55So6buY6K6kO1xcXFxuICAgICAqICAgICAgICDmr5TlpoLkvKDlhaUgeyBjb2xfdHlwZTpcXFxcXFxcInRleHRfMVxcXFxcXFwiIH3vvIzpgqPmnIDnu4jnu5PmnpzlsLHmmK8geyB0aXRsZTpcXFxcXFxcIuagh+mimDFcXFxcXFxcIiwgdXJsOlxcXFxcXFwieHh4XFxcXFxcXCIsIGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCIgfVxcXFxuICAgICAqIEByZXR1cm5zIHtDYXRlZ29yaWVzSGVhZGVyfVxcXFxuICAgICAqL1xcXFxuICAgIGZvbGRMYXlvdXQobGF5b3V0KSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgbGF5b3V0ID09PSAnb2JqZWN0Jykge1xcXFxuICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhsYXlvdXQpXFxcXG4gICAgICAgICAgICBsZXQgaW5qZWN0SW5kZXggPSBsYXlvdXQuaW5qZWN0SW5kZXggfHwgbGF5b3V0Wyfmipjlj6DmjInpkq7mj5LlhaXooYwnXVxcXFxuICAgICAgICAgICAgaWYgKGxheW91dC50aXRsZSB8fCBsYXlvdXQudXJsIHx8IGxheW91dC5jb2xfdHlwZSB8fCBpbmplY3RJbmRleCkge1xcXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldXFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XVtrZXldID0gbGF5b3V0W2tleV07XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fkvKDlhaXmraPnoa7nmoTmipjlj6DnlYzpnaLlhYPntKDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIC8vIGluamVjdEluZGV4IOaKmOWPoOaMiemSruaPkuWFpeesrCBpbmplY3RJbmRleCDooYxcXFxcbiAgICAgICAgICAgIGlmIChpbmplY3RJbmRleCkge1xcXFxuICAgICAgICAgICAgICAgIGlmICghKHR5cGVvZiAoaW5qZWN0SW5kZXgpID09PSAnbnVtYmVyJykpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGM6K+35Lyg5YWl5pWw5a2X77yBXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGlmIChpbmplY3RJbmRleCA8IDEpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGM6K+35Lyg5YWl5aSn5LqOIDAg55qE5pW05pWw77yBXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGlmIChpbmplY3RJbmRleCA+IHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5kZXhdKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuaKmOWPoOaMiemSruaPkuWFpeihjOS4jeW+l+Wkp+S6juaYvuekuuaKmOWPoOihjOaVsO+8geivt+iwg+eUqCAuZm9sZEluZGV4KGluZGV4KSDmiJYgLuesrOWHoOihjOW8gOWni+aKmOWPoChpbmRleCkg5Lyg5YWl5q2j56Gu55qE5pi+56S65oqY5Y+g6KGM5pWwXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS5pbmplY3RJbmRleCA9IGluamVjdEluZGV4IHx8IDE7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fkvKDlhaXmraPnoa7nmoTmipjlj6DnlYzpnaLlhYPntKDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIC8vIOW9k+WJjeaYr+WQpuaKmOWPoFxcXFxuICAgIGZvbGQoaXNGb2xkKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgKGlzRm9sZCkgPT09ICdzdHJpbmcnKSB7XFxcXG4gICAgICAgICAgICBpc0ZvbGQgPSBpc0ZvbGQgPT09ICcxJ1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmIChpc0ZvbGQpIHtcXFxcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9ICcxJztcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9ICcwJztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgY29sb3IobUNvbG9yKSB7XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gPSBtQ29sb3JcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIHRhZyhtVGFnKSB7XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1UYWddID0gbVRhZ1xcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgYWRkKHJ1bGVPYmopIHtcXFxcbiAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KHJ1bGVPYmopKVxcXFxuICAgICAgICBpZiAocnVsZU9iai5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcXFxcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XSA9IHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5jb25jYXQocnVsZU9iailcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5wdXNoKHJ1bGVPYmopXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBldmFsSlNSdWxlKGl0ZW0sIGpzUnVsZSkge1xcXFxuICAgICAgICBsZXQgcnVsZSA9IGpzUnVsZS5yZXBsYWNlKFxcXFxcXFwiQGpzOlxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKVxcXFxuICAgICAgICBydWxlID0gcnVsZS50cmltKClcXFxcbiAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KHJ1bGUpKVxcXFxuICAgICAgICBsZXQgaW5wdXQgPSBpdGVtXFxcXG4gICAgICAgIGlmIChydWxlLnN0YXJ0c1dpdGgoXFxcXFxcXCIoXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICBldmFsKCdyZXN1bHQgPSAnICsgcnVsZSlcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIC8qKlxcXFxuICAgICAgICAgICAgICog6L+Y5Y6f5oiQICQudG9TdHJpbmcoLi4uKSDnmoTmnIDnu4jnu5PmnpzvvIzovr7liLDmnIDnu4jlpITnkIbmlrnlvI/ot5/kuIrpnaLnmoQgaWYg5LiA6Ie055qE55uu55qEXFxcXG4gICAgICAgICAgICAgKi9cXFxcbiAgICAgICAgICAgIGV2YWwoJ3Jlc3VsdCA9ICcgKyAnKCgpID0+IHsnICsgcnVsZSArICd9KSgpJylcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gKHJlc3VsdCB8fCAnJylcXFxcbiAgICB9LFxcXFxuICAgIGdldFRpdGxlKHNyYywgY2F0ZWdvcnkpIHtcXFxcbiAgICAgICAgbGV0IHRpdGxlID0gJydcXFxcbiAgICAgICAgbGV0IHRpdGxlUnVsZSA9IGNhdGVnb3J5LnRpdGxlUnVsZSB8fCAnYSYmVGV4dCdcXFxcbiAgICAgICAgaWYgKHRpdGxlUnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgdGl0bGUgPSB0aGlzLmV2YWxKU1J1bGUoc3JjLCB0aXRsZVJ1bGUpXFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbChzcmMsIHRpdGxlUnVsZSlcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGl0bGUgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICB9LFxcXFxuICAgIGdldFVybChzcmMsIGNhdGVnb3J5KSB7XFxcXG4gICAgICAgIGxldCB1cmwgPSAnJ1xcXFxuICAgICAgICBsZXQgdXJsUnVsZSA9IGNhdGVnb3J5LnVybFJ1bGUgfHwgJ2EmJmhyZWYnXFxcXG4gICAgICAgIGlmICh0eXBlb2YgdXJsUnVsZSA9PT0gJ29iamVjdCcpIHtcXFxcbiAgICAgICAgICAgIGxldCBtVXJsUnVsZSA9IHVybFJ1bGUucnVsZSB8fCB1cmxSdWxlWyfop6PmnpDop4TliJknXSB8fCAnYSYmaHJlZic7XFxcXG4gICAgICAgICAgICBpZiAobVVybFJ1bGUuc3RhcnRzV2l0aChcXFxcXFxcIkBqczpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICB1cmwgPSB0aGlzLmV2YWxKU1J1bGUoc3JjLCBtVXJsUnVsZSk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGxldCBwYXJzZSA9IHBhcnNlRG9tO1xcXFxuICAgICAgICAgICAgICAgIGlmICh1cmxSdWxlLnBhcnNlT3B0aW9uKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodXJsUnVsZS5wYXJzZU9wdGlvbikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBhcnNlRG9tXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGRcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBhcnNlRG9tRm9ySHRtbFxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBkZmhcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tRm9ySHRtbDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsUnVsZVtcXFxcXFxcIuino+aekOaWueazlVxcXFxcXFwiXSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHVybFJ1bGVbXFxcXFxcXCLop6PmnpDmlrnms5VcXFxcXFxcIl0pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCJwYXJzZURvbVxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBkXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCJwYXJzZURvbUZvckh0bWxcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCJwZGZoXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbUZvckh0bWw7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb207XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgdXJsID0gcGFyc2Uoc3JjLCBtVXJsUnVsZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAodXJsUnVsZS5kZWFsVXJsKSB7XFxcXG4gICAgICAgICAgICAgICAgdXJsID0gdXJsUnVsZS5kZWFsVXJsKHVybClcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsUnVsZVsn5LqM5qyh5aSE55CGJ10pIHtcXFxcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmxSdWxlWyfkuozmrKHlpITnkIYnXSh1cmwpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBpZiAodXJsUnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHVybFJ1bGUpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICB1cmwgPSBwYXJzZURvbShzcmMsIHVybFJ1bGUpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB1cmwgfHwgXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICB9LFxcXFxuICAgIGJ1aWxkKCkge1xcXFxuICAgICAgICAvLyDmo4DmtYvmmK/lkKbkvKDlhaXpnIDopoHnmoTlj4LmlbBcXFxcbiAgICAgICAgdGhpcy5jaGVja1BhcmFtcygpXFxcXG4gICAgICAgIC8vIOavj+S4gOS4quWIhuexu+eahOWUr+S4gOagh+ivhlxcXFxuICAgICAgICBsZXQgbVRhZyA9IHRoaXNbc3ltYm9sTWFwLm1UYWddIHx8IFxcXFxcXFwiXFxcXFxcXCJcXFxcbiAgICAgICAgLy/nv7vpobUg6ZyA6KaB5qC55o2u5a6e6ZmF5pu/5o2iXFxcXG4gICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzW3N5bWJvbE1hcC5zcmNdIHx8IHJlcXVlc3QodGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdKVxcXFxuICAgICAgICBjb25zdCBlbXB0eSA9IFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgIC8v6I635Y+W5YiX6KGoXFxcXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubWFwKHJ1bGVPYmogPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBbXVxcXFxuICAgICAgICAgICAgbGV0IGxpc3RSdWxlID0gcnVsZU9iai5saXN0UnVsZSB8fCBydWxlT2JqW1xcXFxcXFwi5LiA57qn5YiG57G7XFxcXFxcXCJdXFxcXG4gICAgICAgICAgICBpZiAobGlzdFJ1bGUuc3RhcnRzV2l0aChcXFxcXFxcIkBqczpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkobGlzdFJ1bGUpKVxcXFxuICAgICAgICAgICAgICAgIGxpc3QgPSB0aGlzLmV2YWxKU1J1bGUoaHRtbCwgbGlzdFJ1bGUpXFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGxpc3QgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsIGxpc3RSdWxlKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgLy8gbG9nKGxpc3QpXFxcXG4gICAgICAgICAgICBsaXN0Lm1hcChjYXRlZ29yeSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGlzdDogY2F0ZWdvcnksXFxcXG4gICAgICAgICAgICAgICAgICAgIHN1Ykxpc3RSdWxlOiBydWxlT2JqLnN1Ykxpc3RSdWxlIHx8IHJ1bGVPYmpbXFxcXFxcXCLlrZDliIbnsbtcXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlUnVsZTogcnVsZU9iai50aXRsZVJ1bGUgfHwgcnVsZU9ialtcXFxcXFxcIuWIhuexu+agh+mimFxcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsUnVsZTogcnVsZU9iai51cmxSdWxlIHx8IHJ1bGVPYmpbXFxcXFxcXCLliIbnsbvpk77mjqVcXFxcXFxcIl0sXFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICB9KVxcXFxuXFxcXG4gICAgICAgIC8vIGxvZygkLnN0cmluZ2lmeShjYXRlZ29yaWVzKSlcXFxcblxcXFxuICAgICAgICBsZXQgaW5pdF9jYXRlID0gW11cXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XFxcXG4gICAgICAgICAgICBpbml0X2NhdGUucHVzaChcXFxcXFxcIjBcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgIGNvbnN0IGNhdGVfdGVtcF9qc29uID0gZ2V0TXlWYXIobVRhZyArIHRoaXMuVkFSTUFQLkNBVEVHT1JZLCBKU09OLnN0cmluZ2lmeShpbml0X2NhdGUpKVxcXFxuICAgICAgICBjb25zdCBjYXRlX3RlbXAgPSBKU09OLnBhcnNlKGNhdGVfdGVtcF9qc29uKVxcXFxuXFxcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5tUGFnZV0gPT09IDEpIHtcXFxcblxcXFxuICAgICAgICAgICAgY2F0ZWdvcmllcy5mb3JFYWNoKChjYXRlZ29yeSwgaW5kZXgpID0+IHtcXFxcblxcXFxuICAgICAgICAgICAgICAgIC8vIOaKmOWPoCBVSVxcXFxuICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5tRm9sZElubmVyRW5hYmxlXSAmJiB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0uaW5qZWN0SW5kZXggPT09IChpbmRleCsxKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZExheW91dCA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0udGl0bGUgfHwgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9PT0gJzEnID8gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICNGRjAwMDBcXFxcXFxcIj7iiKg8L3NwYW4+PC9iPicgOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogIzFhYWQxOVxcXFxcXFwiPuKIpzwvc3Bhbj48L2I+JyksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS51cmwgfHwgJChcXFxcXFxcImhpa2VyOi8vZW1wdHkjbm9IaXN0b3J5I1xcXFxcXFwiKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLm1UYWcgKyBwYXJhbXMuVkFSTUFQLkZPTEQsIGdldE15VmFyKHBhcmFtcy5tVGFnICsgcGFyYW1zLlZBUk1BUC5GT0xELCBwYXJhbXMuaXNGb2xkKSA9PT0gJzEnID8gJzAnIDogJzEnKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGFnOiBtVGFnLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9sZDogdGhpc1tzeW1ib2xNYXAubUZvbGRdLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUk1BUDogdGhpcy5WQVJNQVBcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS5jb2xfdHlwZSB8fCBcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKGZvbGRMYXlvdXQpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgLy/lhbfkvZPliJfooajkuIvnmoTliIbnsbtcXFxcbiAgICAgICAgICAgICAgICBsZXQgc3ViX2NhdGVnb3JpZXMgPSBbXTtcXFxcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuc3ViTGlzdFJ1bGUuc3RhcnRzV2l0aChcXFxcXFxcIkBqczpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSB0aGlzLmV2YWxKU1J1bGUoY2F0ZWdvcnkubGlzdCwgY2F0ZWdvcnkuc3ViTGlzdFJ1bGUpXFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSBwYXJzZURvbUZvckFycmF5KGNhdGVnb3J5Lmxpc3QsIGNhdGVnb3J5LnN1Ykxpc3RSdWxlKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5kZXhdIHx8IDEpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtLCBjYXRlZ29yeSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmdldFVybChpdGVtLCBjYXRlZ29yeSlcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxmb250IGNvbG9yPScgKyB0aGlzW3N5bWJvbE1hcC5tQ29sb3JdICsgJz4nICsgdGl0bGUgKyAnIDwvZm9udD48L2I+JyA6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW11cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5pbmRleCA9PT0gMCkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcC5mb3JFYWNoKChjYXRlLCBpbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFxcXFxcIjBcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy5pbmRleCA9PT0gMCA/IG5ld19jYXRlIDogcGFyYW1zLmNhdGVfdGVtcCkpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy50YWcgKyBwYXJhbXMuVkFSTUFQLlVSTCwgaW5wdXQpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSTUFQOiB0aGlzLlZBUk1BUCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBtVGFnLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpc1tzeW1ib2xNYXAubVBhZ2VdLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImJsYW5rX2Jsb2NrXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzW3N5bWJvbE1hcC5tRm9sZF0gPT09ICcwJykge1xcXFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbSwgY2F0ZWdvcnkpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5nZXRVcmwoaXRlbSwgY2F0ZWdvcnkpXFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/ICfigJzigJzigJ3igJ08Yj48Zm9udCBjb2xvcj0nICsgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSArICc+JyArIHRpdGxlICsgJyA8L2ZvbnQ+PC9iPicgOiB0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy50YWcgKyBwYXJhbXMuVkFSTUFQLkNBVEVHT1JZLCBKU09OLnN0cmluZ2lmeShwYXJhbXMuY2F0ZV90ZW1wKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuVVJMLCBpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJNQVA6IHRoaXMuVkFSTUFQLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IG1UYWcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzW3N5bWJvbE1hcC5tUGFnZV0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYmxhbmtfYmxvY2tcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG5cXFxcbiAgICDnlYzpnaIobGF5b3V0KSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dChsYXlvdXQpXFxcXG4gICAgfSxcXFxcbiAgICDliIbnsbvpk77mjqUodHJ1ZVVybCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy50cnVlVXJsKHRydWVVcmwpO1xcXFxuICAgIH0sXFxcXG4gICAg6aG156CBKHBhZ2UpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZShwYWdlKTtcXFxcbiAgICB9LFxcXFxuICAgIOa6kOeggShodG1sKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmh0bWwoaHRtbCk7XFxcXG4gICAgfSxcXFxcbiAgICDlrprkvY3kuIDnuqfliIbnsbsobGlzdCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5saXN0KGxpc3QpO1xcXFxuICAgIH0sXFxcXG4gICAg5a6a5L2N5a2Q5YiG57G7KHN1Ykxpc3QpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViTGlzdChzdWJMaXN0KTtcXFxcbiAgICB9LFxcXFxuICAgIOWumuS9jeWIhuexu+agh+mimCh0aXRsZSkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy50aXRsZSh0aXRsZSk7XFxcXG4gICAgfSxcXFxcbiAgICDlrprkvY3liIbnsbvpk77mjqUodXJsKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnVybCh1cmwpO1xcXFxuICAgIH0sXFxcXG4gICAg5byA5ZCv5YaF572u5oqY5Y+g5Yqf6IO9KCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkSW5uZXIodHJ1ZSk7XFxcXG4gICAgfSxcXFxcbiAgICDlhbPpl63lhoXnva7mipjlj6Dlip/og70oKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGRJbm5lcihmYWxzZSk7XFxcXG4gICAgfSxcXFxcbiAgICDnrKzlh6DooYzlvIDlp4vmipjlj6AoaW5kZXgpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZEluZGV4KGluZGV4KTtcXFxcbiAgICB9LFxcXFxuICAgIOaKmOWPoOaMiemSruagt+W8jyhsYXlvdXQpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZExheW91dChsYXlvdXQpXFxcXG4gICAgfSxcXFxcbiAgICDmipjlj6AoZm9sZCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkKGZvbGQpO1xcXFxuICAgIH0sXFxcXG4gICAg6YCJ5Lit55qE5YiG57G76aKc6ImyKGNvbG9yKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yKGNvbG9yKTtcXFxcbiAgICB9LFxcXFxuICAgIOWUr+S4gOagh+ivhihtVGFnKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnRhZyhtVGFnKVxcXFxuICAgIH0sXFxcXG4gICAg5re75Yqg5YiG57G75a6a5L2NKHJ1bGVPYmopIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKHJ1bGVPYmopO1xcXFxuICAgIH0sXFxcXG4gICAg5byA5aeL5omT6YCg5YiG57G7KCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xcXFxuICAgIH0sXFxcXG5cXFxcbn0pXFxcXG4kLmV4cG9ydHMgPSBuZXcgQ2F0ZWdvcmllc0hlYWRlcigpO1xcXFxuJC5leHBvcnRzXFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLpk77mjqXlpITnkIZb5LqMXVxcXCIsXFxcInBhdGhcXFwiOlxcXCJ1cmwtcHJvY2Vzc29yXFxcIixcXFwicnVsZVxcXCI6XFxcIi8qKlxcXFxuICog5pys5Zyw572R6aG15o+S5Lu26ZO+5o6lIGhpa2VyOi8vZmlsZXMvcnVsZXMvanMvVXJsUHJvY2Vzc29yLmpzXFxcXG4gKiDlrZDpobXpnaLpk77mjqUgaGlrZXI6Ly9wYWdlL3VybC1wcm9jZXNzb3JcXFxcbiAqIOmBk+mVv+S7k+W6k+mTvuaOpSBodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yODQ5XFxcXG4gKiDnoIHkupEgR2l0ZWUg6ZO+5o6lIGh0dHBzOi8vZ2l0ZWUuY29tL3JlYm9ybjAvSGlrZXJSdWxlcy9yYXcvbWFzdGVyL3BsdWdpbnMvVXJsUHJvY2Vzc29yLmpzXFxcXG4gKi9cXFxcbmZ1bmN0aW9uIFVybFByb2Nlc3NvcigpIHtcXFxcbiAgICB0aGlzLnBhcmFtcyA9IHt9XFxcXG4gICAgdGhpcy5yZWdleE1hcCA9IFtcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgICAgcmVnOiAnKHZvZHR5cGV8dmlkZW90KVxcXFxcXFxcXFxcXFxcXFwvXFxcXFxcXFxcXFxcXFxcXHcrJyxcXFxcbiAgICAgICAgICAgIGV4ZWM6ICgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8tXFxcXFxcXFxkKy5odG1sLywgJy0nICsgdGhpcy5wYXJhbXMucGFnZSArICcuaHRtbCcpXFxcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oKHZvZHR5cGV8dmlkZW90KVxcXFxcXFxcL1xcXFxcXFxcdyspLmh0bWwvLCAnJDEtJyArIHRoaXMucGFyYW1zLnBhZ2UgKyAnLmh0bWwnKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LFxcXFxuICAgICAgICB7XFxcXG4gICAgICAgICAgICByZWc6ICdcXFxcXFxcXFxcXFxcXFxcLz9bXFxcXFxcXFxcXFxcXFxcXHdcXFxcXFxcXFxcXFxcXFxcZF0rLS4qPy0uKj8tLio/LS4qPy0uKj8tLio/LS4qPy1cXFxcXFxcXFxcXFxcXFxcZCotLS1cXFxcXFxcXFxcXFxcXFxcZCouaHRtbCcsXFxcXG4gICAgICAgICAgICBleGVjOiAoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcXFxkKigtLS0uaHRtbCkvLCB0aGlzLnBhcmFtcy5wYWdlICsgJyQxJylcXFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLygtLS1cXFxcXFxcXGQrLmh0bWwpLywgdGhpcy5wYXJhbXMucGFnZSArICckMScpOyAvLyDmi7zmjqXpobXnoIFcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgICAgcmVnOiAnKChcXFxcXFxcXFxcXFxcXFxcL3ZvZFxcXFxcXFxcXFxcXFxcXFwvc2hvdyk/KFxcXFxcXFxcXFxcXFxcXFwvYXJlYVxcXFxcXFxcXFxcXFxcXFwvW1xcXFxcXFxcXFxcXFxcXFx3XFxcXFxcXFxcXFxcXFxcXGQlXSspPyhcXFxcXFxcXFxcXFxcXFxcL2J5XFxcXFxcXFxcXFxcXFxcXC9bXFxcXFxcXFxcXFxcXFxcXHdcXFxcXFxcXFxcXFxcXFxcZCVdKyk/KFxcXFxcXFxcXFxcXFxcXFwvaWRcXFxcXFxcXFxcXFxcXFxcL1xcXFxcXFxcXFxcXFxcXFxkKyk/KFxcXFxcXFxcXFxcXFxcXFwvbGV0dGVyXFxcXFxcXFxcXFxcXFxcXC9bXFxcXFxcXFxcXFxcXFxcXHdcXFxcXFxcXFxcXFxcXFxcZCVdKyk/KShcXFxcXFxcXFxcXFxcXFxcL3BhZ2VcXFxcXFxcXFxcXFxcXFxcL1xcXFxcXFxcXFxcXFxcXFxkKyk/KFxcXFxcXFxcXFxcXFxcXFwveWVhclxcXFxcXFxcXFxcXFxcXFwvXFxcXFxcXFxcXFxcXFxcXGQrKT9cXFxcXFxcXFxcXFxcXFxcLmh0bWwnLFxcXFxuICAgICAgICAgICAgZXhlYzogKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCByZWdFeHAgPSAvKChcXFxcXFxcXC92b2RcXFxcXFxcXC9zaG93KT8oXFxcXFxcXFwvYXJlYVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9ieVxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPyhcXFxcXFxcXC9pZFxcXFxcXFxcL1xcXFxcXFxcZCspPyhcXFxcXFxcXC9sZXR0ZXJcXFxcXFxcXC9bXFxcXFxcXFx3XFxcXFxcXFxkJV0rKT8pKFxcXFxcXFxcL3BhZ2VcXFxcXFxcXC9cXFxcXFxcXGQrKT8oXFxcXFxcXFwveWVhclxcXFxcXFxcL1xcXFxcXFxcZCspP1xcXFxcXFxcLmh0bWwvXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShyZWdFeHAsICckMScgKyAoXFxcXFxcXCIvcGFnZS9cXFxcXFxcIiArIHRoaXMucGFyYW1zLnBhZ2UpICsgJyQ4JyArIFxcXFxcXFwiLmh0bWxcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIF1cXFxcbn1cXFxcblxcXFxuT2JqZWN0LmFzc2lnbihVcmxQcm9jZXNzb3IucHJvdG90eXBlLCB7XFxcXG4gICAgY29uc3RydWN0b3I6IFVybFByb2Nlc3NvcixcXFxcbiAgICBjaGVja1BhcmFtcygpIHtcXFxcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy51cmwpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCAuYmFzZVVybCh1cmwpIOS8oOWFpemTvuaOpei/m+ihjOWIneWni+WMliFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXMucGFyYW1zLnBhZ2UpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCAucGFnZShwYWdlKSDkvKDlhaXpobXnoIHov5vooYzliJ3lp4vljJYhXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGJhc2VVcmwodXJsKXtcXFxcbiAgICAgICAgdGhpcy5wYXJhbXMudXJsID0gdXJsXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBwYWdlKHBhZ2Upe1xcXFxuICAgICAgICB0aGlzLnBhcmFtcy5wYWdlID0gcGFnZVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgYWRkRXh0cmEocmVnRXhwKSB7XFxcXG4gICAgICAgIGlmIChyZWdFeHAuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XFxcXG4gICAgICAgICAgICB0aGlzLnJlZ2V4TWFwID0gdGhpcy5yZWdleE1hcC5jb25jYXQocmVnRXhwKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdGhpcy5yZWdleE1hcC5wdXNoKHJlZ0V4cClcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGRlYnVnKCkge1xcXFxuICAgICAgICB0aGlzLnBhcmFtcy5kZWJ1ZyA9IHRydWVcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBleGVjKCkge1xcXFxuICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKClcXFxcbiAgICAgICAgbGV0IHRydWVfdXJsID0gJydcXFxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlZ2V4TWFwLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVnT2JqID0gdGhpcy5yZWdleE1hcFtpXTtcXFxcbiAgICAgICAgICAgIGxldCB1cmxFeHAgPSByZWdPYmoucmVnO1xcXFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxFeHAgPT09ICdzdHJpbmcnKSB7XFxcXG4gICAgICAgICAgICAgICAgdXJsRXhwID0gbmV3IFJlZ0V4cCh1cmxFeHApXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAodXJsRXhwLnRlc3QodGhpcy5wYXJhbXMudXJsKSkge1xcXFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5kZWJ1Zykge1xcXFxuICAgICAgICAgICAgICAgICAgICBsb2codXJsRXhwLnRvU3RyaW5nKCkpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHRydWVfdXJsID0gcmVnT2JqLmV4ZWMoKTtcXFxcbiAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodHJ1ZV91cmwpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0cnVlX3VybDtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy51cmxcXFxcbiAgICAgICAgfVxcXFxuICAgIH0sXFxcXG4gICAg6I635Y+W5aSE55CG57uT5p6cKCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5leGVjKClcXFxcbiAgICB9LFxcXFxuICAgIOmTvuaOpSh1cmwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybCh1cmwpXFxcXG4gICAgfSxcXFxcbiAgICDpobXnoIEocGFnZSkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlKHBhZ2UpXFxcXG4gICAgfSxcXFxcbiAgICDmj5LlhaXmlrDlpITnkIbop4TliJkocmVnRXhwKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEV4dHJhKHJlZ0V4cClcXFxcbiAgICB9LFxcXFxuICAgIOiwg+ivleaooeW8jygpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVidWcoKTtcXFxcbiAgICB9XFxcXG59KVxcXFxuJC5leHBvcnRzPW5ldyBVcmxQcm9jZXNzb3IoKVxcXFxuJC5leHBvcnRzXFxcXG5cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuIDnuqdcXFwiLFxcXCJwYXRoXFxcIjpcXFwieWp0b29sXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIGNvbnZlcnQxKHN0cikge1xcXFxuICAgIGxldCBjID0gc3RyLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVxcXFxuICAgIHJldHVybiB7XFxcXG4gICAgICAgIOWIl+ihqDogY1swXSxcXFxcbiAgICAgICAg5qCH6aKYOiBjWzFdLFxcXFxuICAgICAgICDlm77niYc6IGNbMl0sXFxcXG4gICAgICAgIOaPj+i/sDogY1szXSxcXFxcbiAgICAgICAg6ZO+5o6lOiBjWzRdXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBtZXJnZShzb3VyY2UsIHRhcmdldCkge1xcXFxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKVxcXFxuICAgIGZvciAobGV0IGkgaW4ga2V5cykge1xcXFxuICAgICAgICB0YXJnZXRba2V5c1tpXV0gPSBzb3VyY2Vba2V5c1tpXV1cXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIOS4gOe6pyhvYmopIHtcXFxcbiAgICB2YXIgZCA9IFtdO1xcXFxuICAgIGlmICgkLnR5cGUob2JqKSA9PSBcXFxcXFxcInN0cmluZ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgIG9iaiA9IGNvbnZlcnQxKG9iailcXFxcbiAgICB9XFxcXG4gICAgaWYgKG9iai7op4TliJkpIHtcXFxcbiAgICAgICAgbGV0IGMgPSBjb252ZXJ0MShvYmou6KeE5YiZKVxcXFxuICAgICAgICBtZXJnZShjLCBvYmopXFxcXG4gICAgfVxcXFxuICAgIGxldCBhcnIgPSBwZGZhKGdldFJlc0NvZGUoKSwgb2JqLuWIl+ihqCk7XFxcXG4gICAgICAgaWYgKG9iai7liJfooajlpITnkIYgIT0gbnVsbCkge1xcXFxuICAgICAgICAgICAgYXJyID0gb2JqLumTvuaOpeWkhOeQhihhcnIpXFxcXG4gICAgICAgIH1cXFxcbiAgICBmb3IgKGxldCBpdCBvZiBhcnIpIHtcXFxcbiAgICAgICAgbGV0IHVybCA9IHBkKGl0LCBvYmou6ZO+5o6lKVxcXFxuICAgICAgICBpZiAob2JqLumTvuaOpeWkhOeQhiAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgICB1cmwgPSBvYmou6ZO+5o6l5aSE55CGKHVybClcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcGljID0gcGQoaXQsIG9iai7lm77niYcpXFxcXG4gICAgICAgIGlmIChvYmou5Zu+54mH5aSE55CGICE9IG51bGwpIHtcXFxcbiAgICAgICAgICAgIHBpYyA9IG9iai7lm77niYflpITnkIYocGljKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgb2JqLuagh+mimCksXFxcXG4gICAgICAgICAgICB1cmw6IHVybCxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZGVzYzogb2JqLuaPj+i/sCA/IHBkZmgoaXQsIG9iai7mj4/ov7ApIDogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpY1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgIH1cXFxcbiAgICBzZXRSZXN1bHQoZCk7XFxcXG59XFxcXG52YXIgdG9vbCA9IHtcXFxcbiAgICDkuIDnuqc6IOS4gOe6p1xcXFxufVxcXFxuJC5leHBvcnRzID0gdG9vbFxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS4gOe6p1vkuoxdXFxcIixcXFwicGF0aFxcXCI6XFxcInlpamlcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24g5LiA57qnKCkge307XFxcXHJcXFxcbk9iamVjdC5hc3NpZ24o5LiA57qnLnByb3RvdHlwZSwge1xcXFxyXFxcXG5cXFxcdGNvbnN0cnVjdG9yOiDkuIDnuqcsXFxcXHJcXFxcblxcXFx0dGVzdCgpIHt9LFxcXFxyXFxcXG5cXFxcdOiOt+WPlua6kOeggSh1cmwsIGhlYWRlcikge3JldHVybiBmZXRjaCh0cnVlX3VybCwge2hlYWRlcnM6IGhlYWRlciB8fCB7J1VzZXItQWdlbnQnOiBQQ19VQX19KSB9LC8vIOm7mOiupOe7n+S4gOS9v+eUqE1PQklMRV9VQVxcXFxyXFxcXG5cXFxcdOaQnOe0ouahhuaetihwYWdlKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRpZiAocGFnZSA9PSAnMScpIHtcXFxcbi8qXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGQucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0dGl0bGU6IFxcXFxcXFwi5pCc57Si5pys6KeE5YiZXFxcXFxcXCIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0dXJsOiBcXFxcXFxcIidoaWtlcjovL3NlYXJjaD9ydWxlPVxcXFxcXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXFxcXFwiJnM9JytpbnB1dFxcXFxcXFwiLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGRlc2M6IFxcXFxcXFwiIFxcXFxcXFwiLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiBcXFxcXFxcImlucHV0XFxcXFxcXCJcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fSk7XFxcXG4qL1xcXFxyXFxcXG5cXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdH0sXFxcXHJcXFxcblxcXFx06I635Y+W6ZO+5o6lKHBhZ2UsIHJlZ2V4KSB7XFxcXHJcXFxcblxcXFx0XFxcXHRsZXQgdHJ1ZV91cmwgPSBnZXRNeVZhcignaGVhZGVyLnVybCcsIE1ZX1VSTCk7XFxcXHJcXFxcblxcXFx0XFxcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoY29uZmlnLumTvuaOpeWkhOeQhuW3peWFt+S+nei1lilcXFxcclxcXFxuXFxcXHRcXFxcdC8vbGV0IOmTvuaOpeWkhOeQhuW3peWFtyA9IHJlcXVpcmVDYWNoZSgnaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Mjg0OScpXFxcXHJcXFxcblxcXFx0XFxcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS91cmwtcHJvY2Vzc29yJylcXFxcclxcXFxuXFxcXHRcXFxcdGxldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDknKVxcXFxyXFxcXG5cXFxcdFxcXFx0dHJ1ZV91cmwgPSDpk77mjqXlpITnkIblt6XlhbdcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LumTvuaOpSh0cnVlX3VybClcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LumhteeggShwYWdlKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5o+S5YWl5paw5aSE55CG6KeE5YiZKHJlZ2V4IHx8IFtdKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu6I635Y+W5aSE55CG57uT5p6cKCk7XFxcXHJcXFxcblxcXFx0XFxcXHRyZXR1cm4gdHJ1ZV91cmw7XFxcXHJcXFxcblxcXFx0fSxcXFxcclxcXFxuXFxcXHTmiZPpgKDliIbnsbsocnVsZUxpc3QpIHtcXFxcclxcXFxuXFxcXHRcXFxcdC8vICBsZXQgaHRtbENhdGVnb3JpZXMgPSByZXF1aXJlQ2FjaGUoY29uZmlnLuWKqOaAgeWIhuexu+S+nei1lilcXFxcclxcXFxuXFxcXHRcXFxcdC8vbGV0IGh0bWxDYXRlZ29yaWVzID0gcmVxdWlyZUNhY2hlKCdodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yNzA1JylcXFxcclxcXFxuXFxcXHRcXFxcdGlmICghcnVsZUxpc3QpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0bGV0IOWIhuexu+WumuS9jSA9IFt7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTkuIDnuqfliIbnsbs6IOS4gOe6p+WumuS9jUEsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5LiA57qn5a6a5L2NQixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuIDnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR9XVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRpZiAo5LqM57qn5a6a5L2NQSAmJiAo57uf5LiA5a6a5L2NQiB8fCDkuoznuqflrprkvY1CKSkge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+WumuS9jS5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05LiA57qn5YiG57G7OiDkuoznuqflrprkvY1BLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5LqM57qn5a6a5L2NQixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05YiG57G76ZO+5o6lOiB75LqM5qyh5aSE55CGKHVybCkge3RyeSB7cmV0dXJuIOS6jOe6p+WkhOeQhkModXJsKX0gY2F0Y2ggKGUpIHtyZXR1cm4gdXJsfX19XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0fSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRpZiAo5LiJ57qn5a6a5L2NQSAmJiAo57uf5LiA5a6a5L2NQiB8fCDkuInnuqflrprkvY1CKSkge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+WumuS9jS5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05LiA57qn5YiG57G7OiDkuInnuqflrprkvY1BLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5LiJ57qn5a6a5L2NQixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05YiG57G76ZO+5o6lOiB75LqM5qyh5aSE55CGKHVybCkge3RyeSB7cmV0dXJuIOS4iee6p+WkhOeQhkModXJsKX0gY2F0Y2ggKGUpIHtyZXR1cm4gdXJsfX19XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0fSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRpZiAo5Zub57qn5a6a5L2NQSAmJiAo57uf5LiA5a6a5L2NQiB8fCDlm5vnuqflrprkvY1CKSkge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+WumuS9jS5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05LiA57qn5YiG57G7OiDlm5vnuqflrprkvY1BLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5Zub57qn5a6a5L2NQixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05YiG57G76ZO+5o6lOiB75LqM5qyh5aSE55CGKHVybCkge3RyeSB7cmV0dXJuIOWbm+e6p+WkhOeQhkModXJsKX0gY2F0Y2ggKGUpIHtyZXR1cm4gdXJsfX19XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0fSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRydWxlTGlzdCA9IOWIhuexu+WumuS9jTtcXFxcclxcXFxuXFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdC8vICcwJyDkuLrpu5jorqTkuI3mipjlj6DvvIwnMScg5Li66buY6K6k5oqY5Y+gXFxcXHJcXFxcblxcXFx0XFxcXHRjb25zdCDlvZPliY3mipjlj6DnirbmgIEgPSBnZXRNeVZhcignaGVhZGVyLmZvbGQnLCAnMCcpXFxcXHJcXFxcblxcXFx0XFxcXHQvLyDlvJXlhaXliqjmgIHliIbnsbvkvp3otZZcXFxcclxcXFxuXFxcXHRcXFxcdGxldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZSgnaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MjcwNScpXFxcXHJcXFxcblxcXFx0XFxcXHR2YXIgZ2V0UmFuZ2VDb2xvcnMgPSBmdW5jdGlvbigpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0cmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSAvLyDpmo/mnLrpgInkuK3nmoTliIbnsbvpopzoibJcXFxcclxcXFxuXFxcXHRcXFxcdHZhciBjb2xvdXI7XFxcXHJcXFxcblxcXFx0XFxcXHRpZiAo5YiG57G76aKc6ImyICE9PSAnJykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xvdXIgPSDliIbnsbvpopzoibJcXFxcclxcXFxuXFxcXHRcXFxcdH0gZWxzZSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGNvbG91ciA9IGdldFJhbmdlQ29sb3JzKClcXFxcclxcXFxuXFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdGh0bWxDYXRlZ29yaWVzLueVjOmdoihkKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQvLy7liIbnsbvpk77mjqUodHJ1ZV91cmwpXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7mupDnoIEoaHRtbClcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LumhteeggShwYWdlKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5re75Yqg5YiG57G75a6a5L2NKHJ1bGVMaXN0KVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5byA5ZCv5YaF572u5oqY5Y+g5Yqf6IO9KCkgLy8g5b+F6aG7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7mipjlj6Ao5b2T5YmN5oqY5Y+g54q25oCBKSAvLyDlv4XpobtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LuaKmOWPoOaMiemSruagt+W8jyh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0dGl0bGU6IOW9k+WJjeaKmOWPoOeKtuaAgSA9PSBcXFxcXFxcIjFcXFxcXFxcIiA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdPGJpZz48Yj48Zm9udCBjb2xvcj0nIzU5NTlBQic+XFxcXFxcXCIgKyDliqjmgIHnvKnlsI8gKyBcXFxcXFxcIjwvZm9udD48L2I+PC9iaWc+XFxcXFxcXCIgOiBcXFxcXFxcIuKAnOKAnOKAneKAnTxiaWc+PGI+PGZvbnQgY29sb3I9JyNGNzVENTknPlxcXFxcXFwiICsg5Yqo5oCB5omp5bGVICsgXFxcXFxcXCI8L2ZvbnQ+PC9iPjwvYmlnPlxcXFxcXFwiXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH0pIC8vIOWPr+mAiVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQvLyAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKDIpIC8vIOWPr+mAiVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQvLyAu5oqY5Y+g5oyJ6ZKu5qC35byPKHsg5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGMOiAyIH0pICAvLyDlj6/pgInvvIzkvYblv4XpobvlhYjosIPnlKggLuesrOWHoOihjOW8gOWni+aKmOWPoChpbmRleCnvvIznhLblkI7lho3kvKDlhaUgeyDmipjlj6DmjInpkq7mj5LlhaXooYw6IGluZGV4IH1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LumAieS4reeahOWIhuexu+minOiJsihjb2xvdXIpXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7lvIDlp4vmiZPpgKDliIbnsbsoKTtcXFxcclxcXFxuXFxcXHR9LFxcXFxyXFxcXG5cXFxcclxcXFxuXFxcXHTnlJ/miJDniYfljZUoZCxodG1sKSB7XFxcXHJcXFxcblxcXFxyXFxcXG5cXFxcdFxcXFx0dmFyIOWIl+ihqFxcXFxyXFxcXG5cXFxcdFxcXFx0dmFyIOagh+mimFxcXFxyXFxcXG5cXFxcdFxcXFx0dmFyIOaPj+i/sFxcXFxyXFxcXG5cXFxcdFxcXFx0dmFyIOWbvueJh1xcXFxyXFxcXG5cXFxcdFxcXFx0dmFyIOmTvuaOpVxcXFxyXFxcXG5cXFxcclxcXFxuXFxcXHRcXFxcdGlmICjmoYbmnrbnsbvlnosgPT09ICdteXVpLXZvZGxpc3QnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcubXl1aS12b2RsaXN0JiZsaSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdoNCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICcucGljLXRhZ3x8LnBpYy10ZXh0JiZUZXh0JztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05Zu+54mHID0gJy5sYXp5bG9hZCYmZGF0YS1vcmlnaW5hbCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3bXl1aS12b2RsaXN0JylcXFxcclxcXFxuXFxcXHRcXFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAnI2RhdGFfbGlzdCcpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0gJyNkYXRhX2xpc3QmJmxpJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05o+P6L+wID0gJ2VtJiZUZXh0JztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05Zu+54mHID0gJ2ltZyYmZGF0YS1zcmNsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQvL2xvZygn5qGG5p6257G75Z6LwrdkYXRhX2xpc3QnKVxcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdmZWQtbGlzdC10aXRsZScpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0gJy5mZWQtbGlzdC1pbmZvJiZsaSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICcuZmVkLWxpc3QtdGl0bGUmJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnLmZlZC10ZXh0LWNlbnRlciYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdhJiZkYXRhLW9yaWdpbmFsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQvL2xvZygn5qGG5p6257G75Z6LwrcuZmVkLWxpc3QtaW5mbycpXFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ2l0ZW0nKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICdib2R5JiYuaXRlbSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdpbWcmJmFsdCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICdwJiZUZXh0JztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05Zu+54mHID0gJ2ltZyYmc3JjbCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAnbW9kdWxlLWl0ZW1zJykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTliJfooaggPSAnLm1vZHVsZS1pdGVtcyYmLm1vZHVsZS1pdGVtJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05o+P6L+wID0gJy5tb2R1bGUtaXRlbS10ZXh0JiZUZXh0JztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05Zu+54mHID0gJ2ltZ3x8LmxhenkmJmRhdGEtc3JjJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdwYWNrLXlrcGFjaycpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0gJ2JvZHkmJi5wYWNrLXlrcGFjayc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICdzcGFuLC0xJiZUZXh0JztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05Zu+54mHID0gJy5lY2xhenkmJmRhdGEtb3JpZ2luYWwnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ3N0dWktdm9kbGlzdCcpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0gJy5zdHVpLXZvZGxpc3QmJmxpJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05o+P6L+wID0gJy5waWMtdGV4dCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICcubGF6eWxvYWR8fGEmJmRhdGEtb3JpZ2luYWwnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ3ZvZGxpc3QnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcudm9kbGlzdCYmbGknO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnYSYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICcubGF6eWxvYWQmJmRhdGEtb3JpZ2luYWwnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ+a1i+ivlScpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0gJ2JvZHkmJmEnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnYm9keSYmYSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICdib2R5JiZhJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05Zu+54mHID0gJ2JvZHkmJmEnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYm9keSYmYSc7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJycpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0g5qGG5p625YiX6KGoO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSDmoYbmnrbmoIfpopg7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9IOahhuaetuaPj+i/sDtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05Zu+54mHID0g5qGG5p625Zu+54mHO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSDmoYbmnrbpk77mjqU7XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHRsZXQgbGlzdCA9IHBkZmEoaHRtbCwg5YiX6KGoKTtcXFxcclxcXFxuXFxcXHRcXFxcdGZvciAobGV0IGsgaW4gbGlzdCkge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHRpdGxlOiBwZGZoKGxpc3Rba10sIOagh+mimCksXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0ZGVzYzogcGRmaChsaXN0W2tdLCDmj4/ov7ApLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGltZzogcGQobGlzdFtrXSwg5Zu+54mHKSArICdAUmVmZXJlcj0nLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHVybDogcGQobGlzdFtrXSwg6ZO+5o6lKStcXFxcXFxcIiNpbW1lcnNpdmVUaGVtZSNcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ2JpZ19iaWdfYmxhbmtfYmxvY2snLFxcXFxyXFxcXG5cXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG59KVxcXFxyXFxcXG5cXFxcclxcXFxuJC5leHBvcnRzID0gbmV3IOS4gOe6pygpO1xcXFxyXFxcXG4kLmV4cG9ydHNcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlh73mlbDnu4Tku7ZcXFwiLFxcXCJwYXRoXFxcIjpcXFwicXNcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24g5LyY5YyW6Lev57q/56ug6IqC5pWw5o2uKOWkmui3r+e6v+WQpiwg5rqQ5pWw5o2uLCDot6/nur/liJfooagsIOi3r+e6v+WQjSwg6YCJ6ZuG5oC75YiX6KGoLCDpgInpm4bliJfooagsIOmbhuWQjSwg6ZuGdXJsLCDliY3nvIAsIOagh+mimCwg5Zu+54mHKSB7XFxcXG5cXFxcbiAgICAvL+W9k+Wkmui3r+e6v+WQpiDpgInpm4bmgLvliJfooajkuLrnqbpcXFxcbiAgICAvL+acgOe7iOi/lOWbniBbe3RpdGxlOiAn6Lev57q/5ZCNJyxsaXN0OiBbe3RpdGxlOifpgInpm4blkI0nLHVybDon6YCJ6ZuGdXJsJywuLi59XSxzanNzOifkuIvovb3otYTmlpknfSwuLi4uXVxcXFxuICAgIC8v6YCJ6ZuG5YiX6KGoIOesrOS4gOmhueaYr2Nzc+mAieaLqeWZqO+8jOS5i+WQjuWPr+S7peeUqCTliIblibLmt7vliqDopoHliKDpmaTnq6DoioLlkI1cXFxcblxcXFxuXFxcXG4gICAgdmFyIOeroOiKgmpzb24gPSBbXTtcXFxcbiAgICB2YXIg5Y2V6Lev57q/56ug6IqCID0gJ+eroOiKguWIl+ihqCdcXFxcblxcXFxuICAgIHZhciDliJfooajlkI0gPSBbXTtcXFxcbiAgICBpZiAoIeWkmui3r+e6v+WQpikge1xcXFxuXFxcXG4gICAgICAgIOWIl+ihqOWQjS5wdXNoKOWNlei3r+e6v+eroOiKgilcXFxcblxcXFxuICAgIH0gZWxzZSB7XFxcXG5cXFxcbiAgICAgICAgcGRmYSjmupDmlbDmja4sIOi3r+e6v+WIl+ihqCkuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxcXG4gICAgICAgICAgICDliJfooajlkI0ucHVzaChwZGZoKGRhdGEsIOi3r+e6v+WQjSkpXFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgdmFyIOmbhuaVsOe7hCA9IFtdO1xcXFxuXFxcXG5cXFxcbnZhciDmjpLpmaTnq6DoioIgPSBbXTtcXFxcbmlmKOmAiembhuWIl+ihqC5pbmNsdWRlcygnJCcpKXtcXFxcbuaOkumZpOeroOiKgiA9IOmAiembhuWIl+ihqC5zcGxpdCgnJCcpXFxcXG7pgInpm4bliJfooaggPSDmjpLpmaTnq6DoioIuc2hpZnQoKVxcXFxufVxcXFxuXFxcXG4gICAgaWYgKCHlpJrot6/nur/lkKYpIHtcXFxcbiAgICAgICAg6ZuG5pWw57uELnB1c2gocGRmYSjmupDmlbDmja4sIOmAiembhuWIl+ihqCkpXFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgcGRmYSjmupDmlbDmja4sIOmAiembhuaAu+WIl+ihqCkuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxcXG4gICAgICAgICAgICDpm4bmlbDnu4QucHVzaChwZGZhKGRhdGEsIOmAiembhuWIl+ihqCkpXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcblxcXFxuXFxcXG4gICAgZm9yIChsZXQgaSBpbiDpm4bmlbDnu4QpIHtcXFxcblxcXFxuICAgICAgICB2YXIgZG9MaXN0ID0gW107XFxcXG5cXFxcbuaOkumZpOeroOiKgi5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcXFxcbiAgICB2YXIg5qCH6K+GaWQgPSDpm4bmlbDnu4RbaV0uZmluZEluZGV4KOi/lOWbniA9PiDov5Tlm54uaW5kZXhPZihkYXRhKSAhPSAtMSk7XFxcXG4gICAgaWYgKOagh+ivhmlkICE9IC0xKSB7XFxcXG4gICAgICDpm4bmlbDnu4RbaV0uc3BsaWNlKOagh+ivhmlkLCAxKVxcXFxuICAgIH07XFxcXG4gIH0pO1xcXFxuXFxcXG4gICAgICAgIGZvciAobGV0IGl0IG9mIOmbhuaVsOe7hFtpXSkge1xcXFxuICAgICAgICAgICAgdmFyIGRvTGlzdHVybCA9IHBkZmgoaXQsIOmbhnVybClcXFxcbiAgICAgICAgICAgIGRvTGlzdHVybCA9IGRvTGlzdHVybC5pbmNsdWRlcyhcXFxcXFxcImh0dHBcXFxcXFxcIikgPyBkb0xpc3R1cmwgOiDliY3nvIAgKyBkb0xpc3R1cmxcXFxcbiAgICAgICAgICAgIGRvTGlzdC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwg6ZuG5ZCNKSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6IGRvTGlzdHVybFxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgIHZhciBib29rTmFtZSA9ICHlpJrot6/nur/lkKYgPyDmoIfpopggOiDmoIfpopggKyAnLScgKyDliJfooajlkI1baV1cXFxcblxcXFxuICAgICAgICDnq6DoioJqc29uLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IOWIl+ihqOWQjVtpXSxcXFxcbiAgICAgICAgICAgIGxpc3Q6IGRvTGlzdCxcXFxcbiAgICAgICAgICAgIHNqc3M6IHtcXFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyTGlzdDogZG9MaXN0LFxcXFxuICAgICAgICAgICAgICAgIGluZm86IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9va05hbWU6IGJvb2tOYW1lLCAvL+a8q+eUu+WQjeensCxcXFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZU5hbWU6IE1ZX1JVTEUudGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tUb3BQaWM6IOWbvueJhyxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VDb2RlOiDmvKvnlLvop6PmnpAsXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcXFxcXCIxXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSlcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIOeroOiKgmpzb25cXFxcbn1cXFxcblxcXFxuXFxcXG5mdW5jdGlvbiDmt7vliqDlpLTpg6jliJfooagoZCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg5L2c6ICFLCDml7bpl7QsIOWIhuexuyzpobVVUkwpIHtcXFxcblxcXFxuICAgIOagh+mimCA9ICHmoIfpopggPyAnJyA6IOagh+mimCArICdcXFxcXFxcXG4nXFxcXG4gICAg5Zu+54mHID0gIeWbvueJhyA/ICcnIDog5Zu+54mHXFxcXG4gICAg5o+P6L+wID0gIeaPj+i/sCA/ICcnIDog5o+P6L+wLnJlcGxhY2UoXFxcXFxcXCLmm7TmlrDoh7PvvJpcXFxcXFxcIiwgJycpXFxcXG5cXFxcbiAgICDkvZzogIUgPSAh5L2c6ICFID8gJycgOiAnXFxcXFxcXFxuJyArIOS9nOiAhVxcXFxuICAgIOaXtumXtCA9ICHml7bpl7QgPyAnJyA6ICdcXFxcXFxcXG4nICsg5pe26Ze0XFxcXG4gICAg5YiG57G7ID0gIeWIhuexuyA/ICcnIDogJ1xcXFxcXFxcbicgKyDliIbnsbtcXFxcblxcXFxuXFxcXG4gICAgdmFyIOWktOmDqHRpdGxlID0gWyfigJjigJjigJnigJk8Yj4nLCc8L2I+IDxzbWFsbD48Zm9udCBjb2xvcj0jRkE3Mjk4PicsJzwvZm9udD4nLCc8L3NtYWxsPiddXFxcXG4gICAgdmFyIOWktOmDqGRlc2MgPSBbJ+KAmOKAmOKAmeKAmTxmb250IGNvbG9yPSNmOGVjYzk+JywnPC9mb250PiddXFxcXG5cXFxcblxcXFxuXFxcXG4gICAg5aS06YOodGl0bGUgPSDlpLTpg6h0aXRsZVswXSvmoIfpopgr5aS06YOodGl0bGVbMV0r5o+P6L+wK+WktOmDqHRpdGxlWzJdK+S9nOiAhSvlpLTpg6h0aXRsZVszXVxcXFxuXFxcXG4gICAg5aS06YOoZGVzYyA9IOWktOmDqGRlc2NbMF0r5pe26Ze0K+WIhuexuyvlpLTpg6hkZXNjWzFdXFxcXG5cXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTog5aS06YOodGl0bGUsXFxcXG4gICAgICAgIGRlc2M6IOWktOmDqGRlc2MsXFxcXG4gICAgICAgIHBpY191cmw6IOWbvueJhyxcXFxcbiAgICAgICAgdXJsOiDpobVVUkwgKyBcXFxcXFxcIiNub0hpc3RvcnkjXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiAnbW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1cidcXFxcbiAgICB9KTtcXFxcblxcXFxufVxcXFxuXFxcXG5cXFxcbmZ1bmN0aW9uIOa3u+WKoOeugOS7iyhkLCDmlbDmja7mupAsIOmhtVVSTCwg5Zu+54mHKSB7XFxcXG4gICAgLy/ojrflj5bmlbDmja5cXFxcbiAgICB2YXIg566A5LuL5YaF5a65ID0g5pWw5o2u5rqQXFxcXG4gICAg566A5LuL5YaF5a65ID0g566A5LuL5YaF5a65LnJlcGxhY2UoXFxcXFxcXCLnroDku4vvvJpcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikucmVwbGFjZShcXFxcXFxcIuS7i+e7jTpcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikucmVwbGFjZShcXFxcXFxcIua8q+eUu1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS5yZXBsYWNlKFxcXFxcXFwi4oCm4oCmXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoXFxcXFxcXCLnroDku4tcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIilcXFxcblxcXFxuICAgIHZhciDnroDku4vlhoXlrrnmlLY7XFxcXG4gICAgaWYgKOeugOS7i+WGheWuuS5sZW5ndGggPiA0NSkge1xcXFxuICAgICAgICDnroDku4vlhoXlrrnmlLYgPSDnroDku4vlhoXlrrkuc3Vic3RyKDAsIDQ1KSArICcuLi4nXFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAg566A5LuL5YaF5a655pS2ID0g566A5LuL5YaF5a65ICsgJy4uLidcXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL+Wbvuagh+iOt+WPllxcXFxuICAgIGlmICgh5Zu+54mHKSB7XFxcXG4gICAgICAgIOWbvueJhyA9ICdodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vcS8xMDcucG5nJ1xcXFxuICAgIH1cXFxcblxcXFxuICAgIC8v6aG1VVJMIOiOt+WPllxcXFxuICAgIGlmICgh6aG1VVJMKSB7XFxcXG4gICAgICAgIOmhtVVSTCA9IE1ZX1JVTEUudGl0bGVcXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL+agh+mimOS4jueugOS7i+agt+W8j1xcXFxuICAgIHZhciBtenRleHQgPSBcXFxcXFxcIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxzbWFsbD7nroDku4s8L3NtYWxsPjxicj5cXFxcXFxcIlxcXFxuICAgIHZhciBidHRpdGxlID0gJzxmb250IGNvbG9yPVxcXFxcXFwiIzA5OEFDMVxcXFxcXFwiPua8q+eUu+eugOS7iyAgPC9mb250PjxzbWFsbD48c21hbGw+PGZvbnQgY29sb3I9XFxcXFxcXCIjZjQ3OTgzXFxcXFxcXCI+566A5LuL5pS2PjwvZm9udD48L3NtYWxsPjwvc21hbGw+J1xcXFxuXFxcXG4gICAgLy/lsZXlvIDkuI7mlLbnvKnmk43kvZxcXFxcbiAgICB2YXIgamogPSBnZXRWYXIo6aG1VVJMICsgXFxcXFxcXCLnroDku4vmlLZcXFxcXFxcIiwgXFxcXFxcXCLlt7LmlLbotbdcXFxcXFxcIik7XFxcXG4gICAgdmFyIGpqdXJsID0gJChcXFxcXFxcIiNub0xvYWRpbmcjXFxcXFxcXCIpLmxhenlSdWxlKCjnroDku4vlhoXlrrksIOeugOS7i+WGheWuueaUtiwg5pS2LCDmlLblhoXlrrksIOW9k+WJjVVSTCkgPT4ge1xcXFxuICAgICAgICB2YXIganNibCA9IOW9k+WJjVVSTCArIFxcXFxcXFwi566A5LuL5pS2XFxcXFxcXCI7XFxcXG4gICAgICAgIHZhciBqaiA9IGdldFZhcijlvZPliY1VUkwgKyBcXFxcXFxcIueugOS7i+aUtlxcXFxcXFwiLCBcXFxcXFxcIuW3suaUtui1t1xcXFxcXFwiKTtcXFxcbiAgICAgICAgamogPSBqaiA9PSBcXFxcXFxcIuW3suaUtui1t1xcXFxcXFwiID8gXFxcXFxcXCLlsZXlvIBcXFxcXFxcIiA6IFxcXFxcXFwi5bey5pS26LW3XFxcXFxcXCI7XFxcXG4gICAgICAgIHB1dFZhcihqc2JsLCBqailcXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiDlvZPliY1VUkwgKyBcXFxcXFxcIl9idFxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgdGl0bGU6IOaUti5yZXBsYWNlKFxcXFxcXFwi566A5LuL5pS2XFxcXFxcXCIsIGpqKVxcXFxuICAgICAgICB9KVxcXFxuXFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDog5b2T5YmNVVJMICsgXFxcXFxcXCJfbXpcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgIHRpdGxlOiBqaiA9PSBcXFxcXFxcIuW3suaUtui1t1xcXFxcXFwiID8g5pS25YaF5a65LnJlcGxhY2UoXFxcXFxcXCLnroDku4tcXFxcXFxcIiwg566A5LuL5YaF5a655pS2KSA6IOaUtuWGheWuuS5yZXBsYWNlKFxcXFxcXFwi566A5LuLXFxcXFxcXCIsIOeugOS7i+WGheWuuSlcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSwg566A5LuL5YaF5a65LCDnroDku4vlhoXlrrnmlLYsIGJ0dGl0bGUsIG16dGV4dCwg6aG1VVJMKVxcXFxuXFxcXG5cXFxcbiAgICAvL+agh+mimFxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBidHRpdGxlLnJlcGxhY2UoXFxcXFxcXCLnroDku4vmlLZcXFxcXFxcIiwgamopLFxcXFxuICAgICAgICB1cmw6IGpqdXJsLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICAgICAgcGljX3VybDog5Zu+54mHLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX2J0XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgLy/nroDku4tcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogamogPT0gXFxcXFxcXCLlt7LmlLbotbdcXFxcXFxcIiA/IG16dGV4dC5yZXBsYWNlKFxcXFxcXFwi566A5LuLXFxcXFxcXCIsIOeugOS7i+WGheWuueaUtikgOiBtenRleHQucmVwbGFjZShcXFxcXFxcIueugOS7i1xcXFxcXFwiLCDnroDku4vlhoXlrrkpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFxcXFxcIl9telxcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcblxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiDmt7vliqDliJfooajnq6DoioIoZCwg5qCH6aKY5pWw5o2uLCDliJfooajmlbDmja4sIOino+aekOS7o+eggSwg6aG1VVJMLCDlm77niYcpIHtcXFxcblxcXFxuXFxcXG4gICAgLy9k5LiO5aSW55WMZO+8jOS4uuWQjOWGheWtmOWcsOWdgO+8jOS4jeeUqOi/lOWbnlxcXFxuICAgIC8v5qCH6aKY5pWw5o2uICDljbPmoIfpopjlkI3lrZdcXFxcbiAgICAvL+WIl+ihqOaVsOaNruW/hemhu+aYr0pTT04gIOagvOW8j+aYr1t7dGl0bGU6JycsdXJsOicnLH0sLi4uLi5dICDkuJR1cmzlv4XpobvmnInliY3nvIBcXFxcblxcXFxuICAgIC8v5Zu+5qCH6I635Y+WXFxcXG4gICAgaWYgKCHlm77niYcpIHtcXFxcbiAgICAgICAg5Zu+54mHID0gJ2h0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9xLzE4LnBuZydcXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL+mhtVVSTCDojrflj5ZcXFxcbiAgICBpZiAoIemhtVVSTCkge1xcXFxuICAgICAgICDpobVVUkwgPSBNWV9SVUxFLnRpdGxlXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgLy/moIfpopjlkI1cXFxcbiAgICB2YXIg5qCH6aKY5ZCNID0gJzxiPui3r+e6vzwvYj4gIDxzbWFsbD48c21hbGw+PGZvbnQgY29sb3I9I2Y5OTA2Zj7mjpLluo8gPjwvZm9udD48L3NtYWxsPjwvc21hbGw+J1xcXFxuXFxcXG5cXFxcbiAgICB2YXIg5o6S5bqPID0gZ2V0VmFyKOmhtVVSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsIFxcXFxcXFwi5q2j5bqPXFxcXFxcXCIpO1xcXFxuICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJ+WAkuW6jycgPyAn5q2j5bqPJyA6ICflgJLluo8nO1xcXFxuXFxcXG4gICAgdmFyIOaOkuW6j3VybCA9ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgo5qCH6aKY5ZCNLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwpID0+IHtcXFxcbiAgICAgICAgdmFyIOaOkuW6jyA9IGdldFZhcijpobVVUkwgKyBcXFxcXFxcIueroOiKguaOkuW6j1xcXFxcXFwiLCBcXFxcXFxcIuato+W6j1xcXFxcXFwiKTtcXFxcbiAgICAgICAgdmFyIOaPkOekuiA9IOaOkuW6jyA9PSAn5YCS5bqPJyA/ICfmraPluo8nIDogJ+WAkuW6jyc7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJf5o6S5bqPXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICB0aXRsZTog5qCH6aKY5ZCNLnJlcGxhY2UoJ+i3r+e6vycsIOagh+mimOaVsOaNrikucmVwbGFjZSgn5o6S5bqPJywg5o+Q56S6KVxcXFxuICAgICAgICB9KVxcXFxuXFxcXG5cXFxcbiAgICAgICAgaWYgKOaPkOekuiA9PSAn5YCS5bqPJykge1xcXFxuICAgICAgICAgICAg5YiX6KGo5pWw5o2uLnJldmVyc2UoKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIOWIl+ihqOaVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIHNzaWQpIHtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogZGF0YS51cmwgKyDop6PmnpDku6PnoIEsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiICsgc3NpZFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuXFxcXG4gICAgICAgIHB1dFZhcijpobVVUkwgKyBcXFxcXFxcIueroOiKguaOkuW6j1xcXFxcXFwiLCDmj5DnpLopXFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgIH0sIOagh+mimOWQjSwg5qCH6aKY5pWw5o2uLCDliJfooajmlbDmja4sIOino+aekOS7o+eggSwg6aG1VVJMKVxcXFxuXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IOagh+mimOWQjS5yZXBsYWNlKCfot6/nur8nLCDmoIfpopjmlbDmja4pLnJlcGxhY2UoJ+aOkuW6jycsIOaOkuW6jyksXFxcXG4gICAgICAgIHBpY191cmw6IOWbvueJhyxcXFxcbiAgICAgICAgdXJsOiDmjpLluo91cmwsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX+aOkuW6j1xcXFxcXFwiXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcblxcXFxuICAgIGlmICjmjpLluo8gPT0gJ+WAkuW6jycpIHtcXFxcbiAgICAgICAg5YiX6KGo5pWw5o2uLnJldmVyc2UoKVxcXFxuICAgIH1cXFxcblxcXFxuICAgIOWIl+ihqOaVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcXFxcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwgKyDop6PmnpDku6PnoIEsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiICsgaWRcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSk7XFxcXG5cXFxcbn1cXFxcblxcXFxuXFxcXG5mdW5jdGlvbiDmt7vliqDpmLLmraLnvZHpobUo6aG5dXJsLCBVQSkge1xcXFxuXFxcXG4gICAgLy/kuIrnuqfot7PovazliLDlvZPliY3pobXnmoTpk77mjqXlv4XpobvmmK9oaWtlcjovL2VtcHR577yb5LiN54S25LiA5Yi35paw6L+Y5piv5Lya6YeN5aSN5Yqg6L29XFxcXG4gICAgLy9VQSAnJ+aIlmZhbHNl5oiWJ+aJi+acuicg6buY6K6k5piv5omL5py656uvIDsg55S16ISRICdQQydcXFxcblxcXFxuICAgIHZhciDliLfmlrDph43lpI0gPSBNWV9SVUxFLnRpdGxlICsgXFxcXFxcXCLnvZHpobXmupDnoIFcXFxcXFxcIlxcXFxuICAgIHZhciBwY+mTvuaOpSA9IOmhuXVybC5yZXBsYWNlKFxcXFxcXFwibS5cXFxcXFxcIiwgXFxcXFxcXCJ3d3cuXFxcXFxcXCIpXFxcXG4gICAgdmFyIOaJi+acuumTvuaOpSA9IOmhuXVybC5yZXBsYWNlKFxcXFxcXFwid3d3LlxcXFxcXFwiLCBcXFxcXFxcIm0uXFxcXFxcXCIpXFxcXG5cXFxcbiAgICB2YXIgY29kZTtcXFxcbiAgICBpZiAoZ2V0VmFyKOWIt+aWsOmHjeWkjSwgXFxcXFxcXCJmYWxzZVxcXFxcXFwiKSA9PSBcXFxcXFxcImZhbHNlXFxcXFxcXCIpIHtcXFxcblxcXFxuICAgICAgICBjb2RlID0gVUEgPT0gJ1BDJyA/IGZldGNoKHBj6ZO+5o6lKSA6IHJlcXVlc3Qo5omL5py66ZO+5o6lKTtcXFxcbiAgICAgICAgcHV0VmFyKOWIt+aWsOmHjeWkjSwgZ2V0UGFyYW0oJ3VybCcpICsgXFxcXFxcXCLvv6Um77+lXFxcXFxcXCIgKyBjb2RlKVxcXFxuXFxcXG4gICAgfSBlbHNlIHtcXFxcblxcXFxuICAgICAgICB2YXIgcG0gPSBnZXRWYXIo5Yi35paw6YeN5aSNKS5zcGxpdChcXFxcXFxcIu+/pSbvv6VcXFxcXFxcIilcXFxcbiAgICAgICAgaWYgKHBtWzBdID09IGdldFBhcmFtKCd1cmwnKSkge1xcXFxuICAgICAgICAgICAgY29kZSA9IHBtWzFdXFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBjb2RlID0gVUEgPT0gJ1BDJyA/IGZldGNoKHBj6ZO+5o6lKSA6IHJlcXVlc3Qo5omL5py66ZO+5o6lKTtcXFxcbiAgICAgICAgICAgIHB1dFZhcijliLfmlrDph43lpI0sIGdldFBhcmFtKCd1cmwnKSArIFxcXFxcXFwi77+lJu+/pVxcXFxcXFwiICsgY29kZSlcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gY29kZVxcXFxufVxcXFxuXFxcXG5cXFxcbmZ1bmN0aW9uIOa3u+WKoOmAieaLqei3r+e6vyhkLCDot6/nur/mlbDmja4sIOmhtVVSTCwg5aSa6Lev57q/5ZCmKSB7XFxcXG5cXFxcbiAgICAvL+i3r+e6v+aVsOaNriDmoLzlvI9be3RpdGxlOifot6/nur/lkI0nfSwuLi4uXVxcXFxuICAgIC8v5aSa6Lev57q/5ZCmICBmYWxzZSDliJnkuI3lkK/nlKjpgInmi6not6/nur/vvJt0cnVlIOWImeWQr+eUqFxcXFxuXFxcXG4gICAgdmFyIOmAieaLqeWIl+ihqCA9IGdldEl0ZW0o6aG1VVJMICsgXFxcXFxcXCLpgInmi6nliJfooahcXFxcXFxcIiwgXFxcXFxcXCIwXFxcXFxcXCIpXFxcXG5cXFxcbiAgICBpZiAo5aSa6Lev57q/5ZCmKSB7XFxcXG5cXFxcbiAgICAgICAgdmFyIOi3r+e6v+mAieS4rSA9ICfigJjigJjigJnigJk8Zm9udCBjb2xvcj0jMDk4QUMxPumAieS4rTwvZm9udD4nXFxcXG5cXFxcblxcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfigJjigJjigJnigJnwn5OWPGZvbnQgY29sb3I9XFxcXFxcXCIjRkE3Mjk4XFxcXFxcXCI+IOWbvua6kOWIl+ihqDwvZm9udD4g77yaJyxcXFxcbiAgICAgICAgICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+eCueaIkeW5suWVpeWRolxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbidcXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcblxcXFxuICAgICAgICDot6/nur/mlbDmja4uZm9yRWFjaChmdW5jdGlvbihkYXRhLCBpZCkge1xcXFxuXFxcXG4gICAgICAgICAgICB2YXIgamp1cmwgPSAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKOmhtVVSTCxpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0o6aG1VVJMICsgJ+mAieaLqeWIl+ihqCcsaWQrJycpO1xcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9LOmhtVVSTCxpZCk7XFxcXG5cXFxcbiAgICAgICAgICAgIHZhciDmoIfpopjlkI0gPSBpZCA9PSDpgInmi6nliJfooaggPyDot6/nur/pgInkuK0ucmVwbGFjZSgn6YCJ5LitJywgZGF0YS50aXRsZSkgOiBkYXRhLnRpdGxlO1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTog5qCH6aKY5ZCNLFxcXFxuICAgICAgICAgICAgICAgIHVybDogamp1cmwsXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX+i3r+e6v1xcXFxcXFwiICsgaWRcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSk7XFxcXG5cXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIOmAieaLqeWIl+ihqFxcXFxufVxcXFxuXFxcXG5cXFxcbmZ1bmN0aW9uIOa3u+WKoOmAieaLqeS4i+i9vShkLCDot6/nur/mlbDmja4sIOWkmui3r+e6v+WQpikge1xcXFxuXFxcXG4gICAgLy/ot6/nur/mlbDmja4g5qC85byPW3t0aXRsZTon6Lev57q/5ZCNJyxzanNzOifkuIvovb3otYTmlpnkv6Hmga8nfSwuLi4uXVxcXFxuICAgIC8v5aSa6Lev57q/5ZCmICBmYWxzZSDliJnlj6rmnInikaDkuKrkuIvovb0g5qCH6aKY5Li6IOeCueWHu+S4i+i9ve+8m3RydWUg5YiZ5aSa5Liq5LiL6L29XFxcXG5cXFxcbmlmKOWkmui3r+e6v+WQpil7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZ8J+TpTxmb250IGNvbG9yPVxcXFxcXFwiI2Y0Nzk4M1xcXFxcXFwiPiDkuIvovb08L2ZvbnQ+IO+8micsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+eCueaIkeW5suWVpeWRolxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG4gICAgfSk7XFxcXG5cXFxcbn1cXFxcblxcXFxuICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxcXG5cXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLmluY2x1ZGVzKCfnq6DoioLliJfooagnKSA/ICfngrnlh7vkuIvovb0nIDogZGF0YS50aXRsZSxcXFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9SZWZyZXNoIyNub0hpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJyxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgICAgICBleHRyYTogZGF0YS5zanNzXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgaWYgKOWkmui3r+e6v+WQpikge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcblxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIkNTU+mAieaLqeWZqOaooeeJiFxcXCIsXFxcInBhdGhcXFwiOlxcXCJlandiLmpzXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIOS4gOe6pyjliJfooagsIOagh+mimCwg5Zu+54mHLCDpm4bmlbAsIOmTvuaOpSwg6K6/6Zeu5aS0KSB7XFxcXG4gICAg6K6/6Zeu5aS0ID0gIeiuv+mXruWktCA/ICcnIDog6K6/6Zeu5aS0XFxcXG4gICAgdmFyIGQgPSBbXTtcXFxcbiAgICB2YXIgY29kZSA9IGdldENvZGUoKVxcXFxuICAgIHBkZmEoY29kZSwg5YiX6KGoKS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsIOagh+mimCksXFxcXG4gICAgICAgICAgICBkZXNjOiBwZGZoKGRhdGEsIOmbhuaVsCksXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwZChkYXRhLCDlm77niYcpICsgXFxcXFxcXCJAUmVmZXJlcj1cXFxcXFxcIiArIOiuv+mXruWktCxcXFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHkjaW1tZXJzaXZlVGhlbWUjJyxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcIm1vdmllXzNcXFxcXFxcIixcXFxcbmV4dHJhOiB7XFxcXG4gICAgICAgICAgICBuYW1lOiBwZGZoKGRhdGEsIOagh+mimCksXFxcXG4gICAgICAgICAgICB1cmw6IHBkKGRhdGEsIOmTvuaOpSksXFxcXG4gICAgICAgICAgICBxejogTVlfSE9NRVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0pO1xcXFxuICAgIHNldFJlc3VsdChkKTtcXFxcbn1cXFxcblxcXFxuXFxcXG5cXFxcbmZ1bmN0aW9uIOaQnOe0oijliJfooagsIOagh+mimCwg6ZO+5o6lLCDmj4/ov7AsIOivpuaDhSwg5Zu+54mHLCDorr/pl67lpLQpIHtcXFxcbiAgICB2YXIgZCA9IFtdO1xcXFxuICAgIOiuv+mXruWktCA9ICHorr/pl67lpLQgPyAnJyA6IOiuv+mXruWktFxcXFxuICAgIHBkZmEoZ2V0UmVzQ29kZSgpLCDliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXFxcbiAgICAgICAgICAgIGRlc2M6IHBkZmgoZGF0YSwg5o+P6L+wKSxcXFxcbiAgICAgICAgICAgIHBpY191cmw6IHBkKGRhdGEsIOWbvueJhykgKyBcXFxcXFxcIkBSZWZlcmVyPVxcXFxcXFwiICsg6K6/6Zeu5aS0LFxcXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eSNpbW1lcnNpdmVUaGVtZSMnLFxcXFxuICAgICAgICAgICAgY29udGVudDogcGRmaChkYXRhLCDor6bmg4UpLFxcXFxuXFxcXG5leHRyYToge1xcXFxuICAgICAgICAgICAgbmFtZTogcGRmaChkYXRhLCDmoIfpopgpLFxcXFxuICAgICAgICAgICAgdXJsOiBwZChkYXRhLCDpk77mjqUpLFxcXFxuICAgICAgICAgICAgcXo6IE1ZX0hPTUVcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9KTtcXFxcbiAgICBzZXRSZXN1bHQoZCk7XFxcXG59XFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcbmZ1bmN0aW9uIOacgOaWsCjpgInmi6nlmagsIFVBKSB7XFxcXG4gICAgaWYgKFVBID09IFxcXFxcXFwiUENcXFxcXFxcIikge1xcXFxuICAgICAgICB2YXIgY29kZSA9IGZldGNoKGdldFBhcmFtKCd1cmwnKS5yZXBsYWNlKFxcXFxcXFwibS5cXFxcXFxcIiwgXFxcXFxcXCJ3d3cuXFxcXFxcXCIpKTtcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICB2YXIgY29kZSA9IHJlcXVlc3QoZ2V0UGFyYW0oJ3VybCcpLnJlcGxhY2UoXFxcXFxcXCJ3d3cuXFxcXFxcXCIsIFxcXFxcXFwibS5cXFxcXFxcIikpO1xcXFxuICAgIH1cXFxcbiAgICBzZXRSZXN1bHQocGRmaChjb2RlLCDpgInmi6nlmagpKVxcXFxufVxcXFxuXFxcXG5cXFxcblxcXFxuZXZhbChKU09OLnBhcnNlKHJlcXVlc3QoXFxcXFxcXCJoaWtlcjovL3BhZ2UvcXM/cnVsZT3ogZrmvKvwn5SuXFxcXFxcXCIpKS5ydWxlKVxcXFxuXFxcXG5mdW5jdGlvbiDkuoznuqco5aS06YOo5YiX6KGoLCDmoIfpopgsIOWbvueJhywg5o+P6L+wLCDorr/pl67lpLQsIOS9nOiAhSwg5pe26Ze0LCDliIbnsbssIOeugOS7iywg5aSa6Lev57q/5ZCmLCDot6/nur/liJfooagsIOi3r+e6v+WQjSwg6YCJ6ZuG5oC75YiX6KGoLCDpgInpm4bliJfooagsIOmbhuWQjSwg6ZuGdXJsLCDmvKvnlLvop6PmnpAs5b2T5YmNVVJMLOW9k+WJjemhteWQjSzliY3nvIAsVUEs6Ziy6YeN6L295ZCmKSB7XFxcXG4gICAgdmFyIGQgPSBbXTtcXFxcblxcXFxuLy/lpLTpg6jliJfooaggIOWImem7mOiupOS9v+eUqCBjb2RlIOadpeS9nOS4uuWktOmDqOWIl+ihqOaVsOaNrlxcXFxuLy/lpJrot6/nur/lkKYgIHRydWUg5YiZ5L2/55So5aSa6Lev57q/77ybZmFsc2Ug5YiZ5L2/55So56ug6Lev57q/XFxcXG4vL1VBICDkuI3loavliJnkvb/nlKjmiYvmnLrnq68gICdQQyfliJnmiYvmnLrnq69cXFxcblxcXFxuaWYgKOW9k+WJjemhteWQjSkge1xcXFxuICAgIHNldFBhZ2VUaXRsZSjlvZPliY3pobXlkI0pXFxcXG59XFxcXG5cXFxcbmlmKOmYsumHjei9veWQpil7XFxcXG4vL+e9kemhteWGheWuuSvpmLLmraLph43mi4lcXFxcbiAgICB2YXIgY29kZSA9IOa3u+WKoOmYsuatoue9kemhtSjlvZPliY1VUkwsIFVBKVxcXFxufWVsc2V7XFxcXG4gICAgdmFyIGNvZGUgPSBnZXRDb2RlKClcXFxcbn1cXFxcbiAgICBcXFxcblxcXFxuICAgIC8v5aS06YOo5YiX6KGo5pWw5o2uXFxcXG4gICAgdmFyIOWktOmDqCA9ICHlpLTpg6jliJfooaggPyBjb2RlIDogcGRmYShjb2RlLCDlpLTpg6jliJfooagpWzBdO1xcXFxuICAgIOagh+mimCA9IHBkZmgo5aS06YOoLCDmoIfpopgpXFxcXG4gICAg5Zu+54mHID0gcGRmaCjlpLTpg6gsIOWbvueJhylcXFxcbiAgICBpZiAo5Zu+54mHKSB7XFxcXG4gICAgICAgIOWbvueJhyA9IOWbvueJhy5pbmNsdWRlcygnaHR0cCcpID8g5Zu+54mHIDog5YmN57yAICsg5Zu+54mHXFxcXG4gICAgICAgIGlmICgh6K6/6Zeu5aS0KSB7fSBlbHNlIGlmICjorr/pl67lpLQuc3Vic3RyKDAsIDEpID09ICdAJykge1xcXFxuICAgICAgICAgICAg5Zu+54mHID0g5Zu+54mHICsg6K6/6Zeu5aS0XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICDlm77niYcgPSDlm77niYcgKyBcXFxcXFxcIkBSZWZlcmVyPVxcXFxcXFwiICsg6K6/6Zeu5aS0XFxcXG4gICAgICAgIH1cXFxcbiAgICB9XFxcXG4gICAgXFxcXG7mj4/ov7AgPSDmj4/ov7AuaW5jbHVkZXMoJyQnKSA/IOaPj+i/sC5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOaPj+i/sC5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDmj4/ov7ApXFxcXG5cXFxcbuS9nOiAhSA9IOS9nOiAhS5pbmNsdWRlcygnJCcpID8g5L2c6ICFLnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5L2c6ICFLnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOS9nOiAhSlcXFxcbiAgICBcXFxcbuaXtumXtCA9IOaXtumXtC5pbmNsdWRlcygnJCcpID8g5pe26Ze0LnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5pe26Ze0LnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOaXtumXtClcXFxcblxcXFxu5YiG57G7ID0g5YiG57G7LmluY2x1ZGVzKCckJykgPyDliIbnsbsuc3BsaXQoJyQnKVsxXSArIHBkZmgo5aS06YOoLCDliIbnsbsuc3BsaXQoJyQnKVswXSkgOiBwZGZoKOWktOmDqCwg5YiG57G7KVxcXFxuXFxcXG4gICAgXFxcXG4gICAgLy/lpLTpg6jliJfooahcXFxcbiAgICDmt7vliqDlpLTpg6jliJfooagoZCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg5L2c6ICFLCDml7bpl7QsIOWIhuexuyzlvZPliY1VUkwpXFxcXG4gICAgXFxcXG4gICAgLy/ot6/nur/lkI3kuI7pgInpm4bmlbDmja5cXFxcbiAgICB2YXIg56ug6IqCanNvbiA9IOS8mOWMlui3r+e6v+eroOiKguaVsOaNrijlpJrot6/nur/lkKYsIGNvZGUsIOi3r+e6v+WIl+ihqCzot6/nur/lkI0s6YCJ6ZuG5oC75YiX6KGoLOmAiembhuWIl+ihqCzpm4blkI0s6ZuGdXJsLOWJjee8gCzlvZPliY3pobXlkI0s5Zu+54mHKVxcXFxuXFxcXG4gICAgLy/nroDku4tcXFxcbiAgICDmt7vliqDnroDku4soZCwgcGRmaChjb2RlLCDnroDku4spLCDlvZPliY1VUkwsICcnKVxcXFxuXFxcXG4gICAvL+W9k+ayoeacieeroOiKguWGheWuue+8jOWwseS4jeaYvuekulxcXFxuICAgIGlmICjnq6DoioJqc29uLmxlbmd0aCA+IDApIHtcXFxcblxcXFxuICAgICAgICAvL+i3r+e6v+mAieaLqVxcXFxuICAgICAgICB2YXIg6YCJ5oup5YiX6KGoID0g5re75Yqg6YCJ5oup6Lev57q/KGQsIOeroOiKgmpzb24sIOW9k+WJjVVSTCwg5aSa6Lev57q/5ZCmKVxcXFxuXFxcXG4gICAgICAgIC8v6YCJ5oup5LiL6L29XFxcXG4gICAgICAgIOa3u+WKoOmAieaLqeS4i+i9vShkLCDnq6DoioJqc29uLOWkmui3r+e6v+WQpilcXFxcblxcXFxuICAgICAgICAvL+aOkuW6j+S4jumAiembhlxcXFxuICAgICAgICB2YXIgbGF6eSA9IGBAbGF6eVJ1bGU9LmpzOmAgKyDmvKvnlLvop6PmnpA7XFxcXG4gICAgICAgIOa3u+WKoOWIl+ihqOeroOiKgihkLCDnq6DoioJqc29uW+mAieaLqeWIl+ihqF0udGl0bGUsIOeroOiKgmpzb25b6YCJ5oup5YiX6KGoXS5saXN0LCBsYXp5LCDlvZPliY1VUkwsICcnKVxcXFxuXFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJsb25nX3RleHRcXFxcXFxcIlxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KGQpXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5LqM57qn5YiX6KGoXFxcIixcXFwicGF0aFxcXCI6XFxcImVqbGJcXFwiLFxcXCJydWxlXFxcIjpcXFwidmFyIHRhYnMgPSBbXVxcXFxudmFyIGxpc3RzID0gW11cXFxcbnZhciBhcnRzID0gcGRmYShodG1sLCDnur/ot68pO1xcXFxuYXJ0cy5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcXFxuICAgIHRhYnMucHVzaChwZGZoKGRhdGEsIOe6v+i3r+WQjSkpXFxcXG59KVxcXFxudmFyIGNvbnRzID0gcGRmYShodG1sLCDpgInpm4YpO1xcXFxuY29udHMuZm9yRWFjaCgoZGF0YSwgaWQpID0+IHtcXFxcbiAgICBsaXN0cy5wdXNoKHBkZmEoZGF0YSwg6YCJ6ZuG5YiX6KGoKSlcXFxcbn0pXFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcImxpc3RzXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxuc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJsaXN0c1xcXFxcXFwiLCBsaXN0cyk7XFxcXG52YXIgbGlzdCA9IGxpc3RzW2dldE15VmFyKE1ZX1VSTCwgJzAnKV07XFxcXG52YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcXFxcXCLnq6DoioLmjpLluo9cXFxcXFxcIiwgJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nKTtcXFxcbnZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nIDogJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nO1xcXFxudmFyIOaOkuW6j+WQjSA9ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOuaOkuW6jzwvc3Bhbj48L2I+J1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogJyArIOaOkuW6jyArICc8L3NwYW4+PC9iPicsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKOaOkuW6j+WQjSwgbGF6eSkgPT4ge1xcXFxuICAgICAgICB2YXIgbGlzdHMgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcImxpc3RzXFxcXFxcXCIpO1xcXFxuICAgICAgICB2YXIg56ug6IqCID0gbGlzdHNbZ2V0TXlWYXIoTVlfVVJMLCAnMCcpXTtcXFxcbiAgICAgICAgdmFyIOaOkuW6jyA9IGdldE15VmFyKE1ZX1VSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsICcjMWFhZDE5XFxcXFxcXCI+5q2j5bqPJyk7XFxcXG4gICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nIDogJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXFxcXFwiX+aOkuW6j1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgdGl0bGU6IOaOkuW6j+WQjS5yZXBsYWNlKCfmjpLluo8nLCDmj5DnpLopXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIGlmICjmjpLluo8gPT0gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nKSB7XFxcXG4gICAgICAgICAgICDnq6DoioIucmV2ZXJzZSgpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGNwID0g56ug6IqCLm1hcCgoZGF0YSwgc3NpZCkgPT4ge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCAnYSYmVGV4dCcpLFxcXFxuICAgICAgICAgICAgICAgIHVybDogcGQoZGF0YSwgJ2EmJmhyZWYnKSArIGxhenksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzInLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogTVlfVVJMICsgXFxcXFxcXCJf6YCJ6ZuGXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKE1ZX1VSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiKTtcXFxcbiAgICAgICAgYWRkSXRlbUJlZm9yZShNWV9VUkwgKyBcXFxcXFxcImZvb3RlclxcXFxcXFwiLCBjcCk7XFxcXG4gICAgICAgIHB1dE15VmFyKE1ZX1VSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsIOaPkOekuilcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSwg5o6S5bqP5ZCNLCBsYXp5KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBNWV9VUkwgKyBcXFxcXFxcIl/mjpLluo9cXFxcXFxcIlxcXFxuICAgIH1cXFxcbn0pXFxcXG50YWJzLmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGdldE15VmFyKE1ZX1VSTCwgJzAnKSA9PSBpZCA/ICfigJzigJwnICsgZGF0YSArICfigJ3igJ0nIDogZGF0YSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKOe6v+i3rywgbGF6eSwgaWQpID0+IHtcXFxcbiAgICAgICAgICAgIHZhciBsaXN0cyA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwibGlzdHNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB2YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcXFxcXCLnq6DoioLmjpLluo9cXFxcXFxcIiwgJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nKTtcXFxcbiAgICAgICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nIDogJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nO1xcXFxuXFxcXG4gICAgICAgICAgICDnur/ot68uZm9yRWFjaCgoZGF0YSwgeGxpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaWQgPT0geGxpZCA/ICfigJzigJwnICsgZGF0YSArICfigJ3igJ0nIDogZGF0YSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNWV9VUkwgKyBcXFxcXFxcIl/nur/ot69cXFxcXFxcIiArIHhsaWRcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX1VSTCwgaWQpXFxcXG4gICAgICAgICAgICB2YXIg56ug6IqCID0gbGlzdHNbZ2V0TXlWYXIoTVlfVVJMLCAnMCcpXTtcXFxcbiAgICAgICAgICAgIGlmICjmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nKSB7XFxcXG4gICAgICAgICAgICAgICAg56ug6IqCLnJldmVyc2UoKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IGNwID0g56ug6IqCLm1hcCgoZGF0YSwgc3NpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsICdhJiZUZXh0JyksXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogcGQoZGF0YSwgJ2EmJmhyZWYnKSArIGxhenksXFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF8yJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfVVJMICsgXFxcXFxcXCJf6YCJ6ZuGXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhNWV9VUkwgKyBcXFxcXFxcIl/pgInpm4ZcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBhZGRJdGVtQmVmb3JlKE1ZX1VSTCArIFxcXFxcXFwiZm9vdGVyXFxcXFxcXCIsIGNwKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICB9LCB0YWJzLCBsYXp5LCBpZCksXFxcXG4gICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXFxcXFwiX+e6v+i3r1xcXFxcXFwiICsgaWRcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxufSlcXFxcblxcXFxuaWYgKOaOkuW6jyA9PSAnI0ZGMDAwMFxcXFxcXFwiPuWAkuW6jycpIHtcXFxcbiAgICBsaXN0LnJldmVyc2UoKVxcXFxufVxcXFxubGlzdC5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsICdhJiZUZXh0JyksXFxcXG4gICAgICAgIHVybDogcGQoZGF0YSwgJ2EmJmhyZWYnKSArIGxhenksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8yJyxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIGNsczogTVlfVVJMICsgXFxcXFxcXCJf6YCJ6ZuGXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxufSlcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiYmlnX2JsYW5rX2Jsb2NrXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXFxcXFwiZm9vdGVyXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFwifV1cIixcInByb3h5XCI6XCJcIn0iLCJwaWNVcmwiOiJodHRwczovL3AzLmJ5dGVpbWcuY29tL3Rvcy1jbi1pLThndTM3cjlkZWgvZGFiMTg2Njc2ZTVlNGMxMDljZjc4ZDJmYWQ2ZWUxYjN+bm9vcC53ZWJwIiwidGl0bGUiOiLmmrTlkJvniLHkuroifQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement