jiuyiUniapp/jiuyi2/unpackage/release/apk/zip/assets/uni-jsframework-vue3.js

2 lines
718 KiB
JavaScript

//{"version":"4.29","encode":"base64"}
dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fID0gRGF0ZS5ub3coKTt2YXIgZ2xvYmFsPXRoaXM7IHZhciBwcm9jZXNzPXtlbnY6e319OyB2YXIgc2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dDsKKCgpPT57dmFyIHB2PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgdnY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczt2YXIga2s9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxJaz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3ZhciBtdj0oZixvLGQpPT5vIGluIGY/cHYoZixvLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpkfSk6ZltvXT1kLF92PShmLG8pPT57Zm9yKHZhciBkIGluIG98fChvPXt9KSlray5jYWxsKG8sZCkmJm12KGYsZCxvW2RdKTtpZih2dilmb3IodmFyIGQgb2YgdnYobykpSWsuY2FsbChvLGQpJiZtdihmLGQsb1tkXSk7cmV0dXJuIGZ9O3ZhciBSaz0oZixvKT0+e2Zvcih2YXIgZCBpbiBvKXB2KGYsZCx7Z2V0Om9bZF0sZW51bWVyYWJsZTohMH0pfTt2YXIgWmE9T2JqZWN0LmZyZWV6ZTtmdW5jdGlvbiBaYyh7Z2V0Q3VycmVudFBhZ2VzOmYsdW5pOm8sVW5pU2hhcmVkOmQsVnVlOl8sVnVlU2hhcmVkOkN9KXt2YXIgYj1mdW5jdGlvbihnLHksSSxCZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFN0KCl7bGV0IEtlPWYoKSxYZT1LZS5sZW5ndGg7aWYoWGUpcmV0dXJuIEtlW1hlLTFdfWZ1bmN0aW9uIEd0KCl7bGV0IEtlPVN0KCk7aWYoS2UpcmV0dXJuIEtlLiR2bX1mdW5jdGlvbiBZdChLZSxYZSxodCl7aWYoSS5pc1N0cmluZyhLZSkpaHQ9WGUsWGU9S2UsS2U9R3QoKTtlbHNlIGlmKHR5cGVvZiBLZT09Im51bWJlciIpe2xldCBMbj1mKCkuZmluZChnbj0+Z24uJHBhZ2UuaWQ9PT1LZSk7TG4/S2U9TG4uJHZtOktlPUd0KCl9aWYoIUtlKXJldHVybjtpZihLZS5fX2NhbGxfaG9vaylyZXR1cm4gS2UuX19jYWxsX2hvb2soWGUsaHQpO2xldCBobj1LZS4kW1hlXTtyZXR1cm4gaG4mJnkuaW52b2tlQXJyYXlGbnMoaG4saHQpfWZ1bmN0aW9uIFIoS2UsWGUsaHQsaG4pe0kuaXNGdW5jdGlvbihYZSkmJkJlLmluamVjdEhvb2soS2UsWGUuYmluZChodCksaG4pfWZ1bmN0aW9uIE90KEtlLFhlLGh0KXt2YXIgaG4sTG47bGV0IGduPUtlLm1wVHlwZXx8aHQuJG1wVHlwZTtpZighKCFnbnx8Z249PT0iY29tcG9uZW50IikmJihPYmplY3Qua2V5cyhLZSkuZm9yRWFjaChBbj0+e2lmKHkuaXNVbmlMaWZlY3ljbGVIb29rKEFuLEtlW0FuXSwhMSkpe2xldCAkbj1LZVtBbl07SS5pc0FycmF5KCRuKT8kbi5mb3JFYWNoKHZyPT5SKEFuLHZyLGh0LFhlKSk6UihBbiwkbixodCxYZSl9fSksZ249PT0icGFnZSIpKXtYZS5fX2lzVmlzaWJsZT0hMDt0cnl7bGV0IEFuPVhlLmF0dHJzLl9fcGFnZVF1ZXJ5O1l0KGh0LHkuT05fTE9BRCxBbiksZGVsZXRlIFhlLmF0dHJzLl9fcGFnZVF1ZXJ5LCgoTG49aHQuJHBhZ2UpPT09bnVsbHx8TG49PT12b2lkIDA/dm9pZCAwOkxuLm9wZW5UeXBlKSE9PSJwcmVsb2FkUGFnZSImJll0KGh0LHkuT05fU0hPVyl9Y2F0Y2goQW4pe2NvbnNvbGUuZXJyb3IoQW4ubWVzc2FnZSt5LkxJTkVGRUVEK0FuLnN0YWNrKX19fWZ1bmN0aW9uIFVuKEtlLFhlKXtmdChYZSxLZS4kcmVuZGVyanMsS2VbIiQiK3kuUkVOREVSSlNfTU9EVUxFU10pfWZ1bmN0aW9uIGZ0KEtlLFhlLGh0PXt9KXtpZighSS5pc0FycmF5KFhlKSlyZXR1cm47bGV0IGhuPUtlLnVpZCxMbj1LZS4kd3hzTW9kdWxlc3x8KEtlLiR3eHNNb2R1bGVzPVtdKSxnbj1LZS5jdHg7WGUuZm9yRWFjaChBbj0+e2h0W0FuXSYmKGduW0FuXT1xKGhuLGh0W0FuXSxBbiksTG4ucHVzaChBbikpfSl9ZnVuY3Rpb24gcShLZSxYZSxodCl7bGV0IGhuPXt9O3JldHVybiBuZXcgUHJveHkoaG4se2dldChMbixnbil7cmV0dXJuIGhuW2duXXx8KGhuW2duXT1uZShLZSxYZSxodCxnbikpfX0pfWZ1bmN0aW9uIG5lKEtlLFhlLGh0LGhuKXtsZXQgTG49KCk9Pnt9LGduPSgpPT55LldYU19QUk9UT0NPTCtKU09OLnN0cmluZ2lmeShbS2UsWGUsaHQrIi4iK2huXSk7cmV0dXJuIG5ldyBQcm94eShMbix7Z2V0KEFuLCRuKXtyZXR1cm4gJG49PT0idG9KU09OIj9nbjpMblskbl18fChMblskbl09bmUoS2UsWGUsaHQrIi4iK2huLCRuKSl9LGFwcGx5KEFuLCRuLHZyKXtyZXR1cm4geS5XWFNfUFJPVE9DT0wrSlNPTi5zdHJpbmdpZnkoW0tlLFhlLGh0KyIuIitobixbLi4udnJdXSl9fSl9ZnVuY3Rpb24gc24oS2UsWGUpe2Z0KFhlLEtlLiR3eHMsS2VbIiQiK3kuV1hTX01PRFVMRVNdKX1mdW5jdGlvbiBsbihLZSxYZSxodCl7c24oS2UsWGUpLFVuKEtlLFhlKSxPdChLZSxYZSxodCl9ZnVuY3Rpb24gYm4oS2UsWGUsaHQpe3JldHVybiBLZVtYZV09aHR9ZnVuY3Rpb24gWm4oS2UsLi4uWGUpe2xldCBodD10aGlzW0tlXTtyZXR1cm4gaHQ/aHQoLi4uWGUpOihjb25zb2xlLmVycm9yKGBtZXRob2QgJHtLZX0gbm90IGZvdW5kYCksbnVsbCl9ZnVuY3Rpb24gd2koS2Upe3JldHVybiBmdW5jdGlvbihodCxobixMbil7aWYoIWhuKXRocm93IGh0O2xldCBnbj1LZS5faW5zdGFuY2U7aWYoIWdufHwhZ24ucHJveHkpdGhyb3cgaHQ7WXQoZ24ucHJveHkseS5PTl9FUlJPUixodCl9fWZ1bmN0aW9uIHpyKEtlLFhlKXtyZXR1cm4gS2U/Wy4uLm5ldyBTZXQoW10uY29uY2F0KEtlLFhlKSldOlhlfWZ1bmN0aW9uIEVuKEtlKXt5LlVuaUxpZmVjeWNsZUhvb2tzLmZvckVhY2goWGU9PntLZVtYZV09enJ9KX1sZXQgcXQsbW49IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IixNbj0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO3R5cGVvZiBhdG9iIT0iZnVuY3Rpb24iP3F0PWZ1bmN0aW9uKEtlKXtpZihLZT1TdHJpbmcoS2UpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhTW4udGVzdChLZSkpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXRvYicgb24gJ1dpbmRvdyc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIik7S2UrPSI9PSIuc2xpY2UoMi0oS2UubGVuZ3RoJjMpKTtmb3IodmFyIFhlLGh0PSIiLGhuLExuLGduPTA7Z248S2UubGVuZ3RoOylYZT1tbi5pbmRleE9mKEtlLmNoYXJBdChnbisrKSk8PDE4fG1uLmluZGV4T2YoS2UuY2hhckF0KGduKyspKTw8MTJ8KGhuPW1uLmluZGV4T2YoS2UuY2hhckF0KGduKyspKSk8PDZ8KExuPW1uLmluZGV4T2YoS2UuY2hhckF0KGduKyspKSksaHQrPWhuPT09NjQ/U3RyaW5nLmZyb21DaGFyQ29kZShYZT4+MTYmMjU1KTpMbj09PTY0P1N0cmluZy5mcm9tQ2hhckNvZGUoWGU+PjE2JjI1NSxYZT4+OCYyNTUpOlN0cmluZy5mcm9tQ2hhckNvZGUoWGU+PjE2JjI1NSxYZT4+OCYyNTUsWGUmMjU1KTtyZXR1cm4gaHR9OnF0PWF0b2I7ZnVuY3Rpb24gUm4oS2Upe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocXQoS2UpLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24oWGUpe3JldHVybiIlIisoIjAwIitYZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkuam9pbigiIikpfWZ1bmN0aW9uIHByKCl7bGV0IEtlPW8uZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixYZT1LZS5zcGxpdCgiLiIpO2lmKCFLZXx8WGUubGVuZ3RoIT09MylyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTtsZXQgaHQ7dHJ5e2h0PUpTT04ucGFyc2UoUm4oWGVbMV0pKX1jYXRjaChobil7dGhyb3cgbmV3IEVycm9yKCJcdTgzQjdcdTUzRDZcdTVGNTNcdTUyNERcdTc1MjhcdTYyMzdcdTRGRTFcdTYwNkZcdTUxRkFcdTk1MTlcdUZGMENcdThCRTZcdTdFQzZcdTk1MTlcdThCRUZcdTRGRTFcdTYwNkZcdTRFM0FcdUZGMUEiK2huLm1lc3NhZ2UpfXJldHVybiBodC50b2tlbkV4cGlyZWQ9aHQuZXhwKjFlMyxkZWxldGUgaHQuZXhwLGRlbGV0ZSBodC5pYXQsaHR9ZnVuY3Rpb24gQWkoS2Upe0tlLnVuaUlESGFzUm9sZT1mdW5jdGlvbihYZSl7bGV0e3JvbGU6aHR9PXByKCk7cmV0dXJuIGh0LmluZGV4T2YoWGUpPi0xfSxLZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oWGUpe2xldHtwZXJtaXNzaW9uOmh0fT1wcigpO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8aHQuaW5kZXhPZihYZSk+LTF9LEtlLnVuaUlEVG9rZW5WYWxpZD1mdW5jdGlvbigpe2xldHt0b2tlbkV4cGlyZWQ6WGV9PXByKCk7cmV0dXJuIFhlPkRhdGUubm93KCl9fWZ1bmN0aW9uIFhuKEtlKXtsZXQgWGU9S2UuX2NvbnRleHQuY29uZmlnO1hlLmVycm9ySGFuZGxlcj15Lmludm9rZUNyZWF0ZUVycm9ySGFuZGxlcihLZSx3aSksRW4oWGUub3B0aW9uTWVyZ2VTdHJhdGVnaWVzKTtsZXQgaHQ9WGUuZ2xvYmFsUHJvcGVydGllcztBaShodCksaHQuJHNldD1ibixodC4kYXBwbHlPcHRpb25zPWxuLGh0LiRjYWxsTWV0aG9kPVpuLHkuaW52b2tlQ3JlYXRlVnVlQXBwSG9vayhLZSl9cmV0dXJuIGcuaW5pdEFwcD1YbixnfSh7fSxkLEMsXyk7cmV0dXJuIGJ9ZnVuY3Rpb24gVXUoZix7bnZ1ZTpvLFVuaVNoYXJlZDpkLFZ1ZVNoYXJlZDpfLFZ1ZVJlYWN0aXZpdHk6Q30pe2xldCBiPXtwbGF0Zm9ybTpvLmNvbmZpZy5lbnYucGxhdGZvcm0sVW5pU2hhcmVkOmQsVnVlU2hhcmVkOl8sVnVlUmVhY3Rpdml0eTpDfTtyZXR1cm4gZihiLG8uZG9jdW1lbnQpfWZ1bmN0aW9uIHhrKHtzZXRUaW1lb3V0OmYsY2xlYXJUaW1lb3V0Om8sdW5pOmQsZ2V0Q3VycmVudFBhZ2VzOl8sVnVlOkMsd2VleDpiLHBsdXM6ZyxCcm9hZGNhc3RDaGFubmVsOnksVW5pVmlld0pTQnJpZGdlOkksVnVlU2hhcmVkOkJlLFVuaVNoYXJlZDpTdCxfX3VuaUNvbmZpZzpHdH0pe3ZhciBZdD1mdW5jdGlvbihSLE90LFVuKXsidXNlIHN0cmljdCI7bGV0IGZ0PVsibmF2aWdhdGUiLCJyZWRpcmVjdCIsInN3aXRjaFRhYiIsInJlTGF1bmNoIiwibmF2aWdhdGVCYWNrIl0scT1bInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0sbmU9WyJzbGlkZS1vdXQtcmlnaHQiLCJzbGlkZS1vdXQtbGVmdCIsInNsaWRlLW91dC10b3AiLCJzbGlkZS1vdXQtYm90dG9tIiwiZmFkZS1vdXQiLCJ6b29tLWluIiwiem9vbS1mYWRlLWluIiwicG9wLW91dCIsIm5vbmUiXSxzbj17aG92ZXJDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibmF2aWdhdG9yLWhvdmVyIn0sdXJsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibmF2aWdhdGUiLHZhbGlkYXRvcihFKXtyZXR1cm4gQm9vbGVhbih+ZnQuaW5kZXhPZihFKSl9fSxkZWx0YTp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxfSxob3ZlclN0YXJ0VGltZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1MH0saG92ZXJTdGF5VGltZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo2MDB9LGV4aXN0czp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saG92ZXJTdG9wUHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxhbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIiLHZhbGlkYXRvcihFKXtyZXR1cm4hRXx8cS5jb25jYXQobmUpLmluY2x1ZGVzKEUpfX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MzAwfX07ZnVuY3Rpb24gbG4oRSl7cmV0dXJuKCk9PntpZihFLm9wZW5UeXBlIT09Im5hdmlnYXRlQmFjayImJiFFLnVybCl7Y29uc29sZS5lcnJvcigiPG5hdmlnYXRvci8+IHNob3VsZCBoYXZlIHVybCBhdHRyaWJ1dGUgd2hlbiB1c2luZyBuYXZpZ2F0ZVRvLCByZWRpcmVjdFRvLCByZUxhdW5jaCBvciBzd2l0Y2hUYWIiKTtyZXR1cm59bGV0IHg9cGFyc2VJbnQoRS5hbmltYXRpb25EdXJhdGlvbik7c3dpdGNoKEUub3BlblR5cGUpe2Nhc2UibmF2aWdhdGUiOmQubmF2aWdhdGVUbyh7dXJsOkUudXJsLGFuaW1hdGlvblR5cGU6RS5hbmltYXRpb25UeXBlfHwicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjp4fSk7YnJlYWs7Y2FzZSJyZWRpcmVjdCI6ZC5yZWRpcmVjdFRvKHt1cmw6RS51cmwsZXhpc3RzOkUuZXhpc3RzfSk7YnJlYWs7Y2FzZSJzd2l0Y2hUYWIiOmQuc3dpdGNoVGFiKHt1cmw6RS51cmx9KTticmVhaztjYXNlInJlTGF1bmNoIjpkLnJlTGF1bmNoKHt1cmw6RS51cmx9KTticmVhaztjYXNlIm5hdmlnYXRlQmFjayI6ZC5uYXZpZ2F0ZUJhY2soe2RlbHRhOkUuZGVsdGEsYW5pbWF0aW9uVHlwZTpFLmFuaW1hdGlvblR5cGV8fCJwb3Atb3V0IixhbmltYXRpb25EdXJhdGlvbjp4fSk7YnJlYWt9fX1mdW5jdGlvbiBibihFKXtpZihFLmhvdmVyQ2xhc3MmJkUuaG92ZXJDbGFzcyE9PSJub25lIil7bGV0IHg9e2hvdmVyQ2xhc3M6RS5ob3ZlckNsYXNzfTtyZXR1cm4gT3QuaGFzT3duKEUsImhvdmVyU3RhcnRUaW1lIikmJih4LmhvdmVyU3RhcnRUaW1lPUUuaG92ZXJTdGFydFRpbWUpLE90Lmhhc093bihFLCJob3ZlclN0YXlUaW1lIikmJih4LmhvdmVyU3RheVRpbWU9RS5ob3ZlclN0YXlUaW1lKSxPdC5oYXNPd24oRSwiaG92ZXJTdG9wUHJvcGFnYXRpb24iKSYmKHguaG92ZXJTdG9wUHJvcGFnYXRpb249RS5ob3ZlclN0b3BQcm9wYWdhdGlvbikseH1yZXR1cm57fX1mdW5jdGlvbiBabihFLHgpe3JldHVybiBSLmNyZWF0ZUVsZW1lbnRWTm9kZSgidS10ZXh0IixPdC5leHRlbmQoe2FwcGVuZEFzVHJlZTohMH0seCksRSl9bGV0IHdpPVt7Im5hdmlnYXRvci1ob3ZlciI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMC4xKSIsb3BhY2l0eTouN319fV0senI9Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6Ik5hdmlnYXRvciIscHJvcHM6c24sc3R5bGVzOndpLHNldHVwKEUse3Nsb3RzOnh9KXtsZXQgej1sbihFKTtyZXR1cm4oKT0+Ui5jcmVhdGVWTm9kZSgidmlldyIsUi5tZXJnZVByb3BzKGJuKEUpLHtvbkNsaWNrOnp9KSxbeC5kZWZhdWx0JiZ4LmRlZmF1bHQoKV0pfX0pO2Z1bmN0aW9uIEVuKEUpe3JldHVybiBTeW1ib2woRSl9ZnVuY3Rpb24gcXQoKXtsZXQgRTt0cnl7RT1SLmdldEN1cnJlbnRJbnN0YW5jZSgpLnJvb3QucHJveHkuJHBhZ2UuaWR9Y2F0Y2goeCl7bGV0IHo9Zy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWQ7RT1pc05hTihOdW1iZXIoeikpP3o6TnVtYmVyKHopfXJldHVybiBFfWxldCBtbixNbixSbjtmdW5jdGlvbiBwcigpe3JldHVybiB0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmdHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJnR5cGVvZiBkb2N1bWVudD09Im9iamVjdCI/IndlYnZpZXciOiJ2OCJ9ZnVuY3Rpb24gQWkoKXtyZXR1cm4gbW4ud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkfWxldCBYbixLZSxYZT17fTtmdW5jdGlvbiBodChFKXtsZXQgeD1FLmRhdGEmJkUuZGF0YS5fX21lc3NhZ2U7aWYoIXh8fCF4Ll9fcGFnZSlyZXR1cm47bGV0IHo9eC5fX3BhZ2UsJD1YZVt6XTskJiYkKHgpLHgua2VlcHx8ZGVsZXRlIFhlW3pdfWZ1bmN0aW9uIGhuKEUseCl7cHIoKT09PSJ2OCI/Um4/KFhuJiZYbi5jbG9zZSgpLFhuPW5ldyBSbihBaSgpKSxYbi5vbm1lc3NhZ2U9aHQpOktlfHwoS2U9TW4ucmVxdWlyZU1vZHVsZSgiZ2xvYmFsRXZlbnQiKSxLZS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsaHQpKTp3aW5kb3cuX19wbHVzTWVzc2FnZT1odCxYZVtFXT14fWNsYXNzIExue2NvbnN0cnVjdG9yKHgpe3RoaXMud2Vidmlldz14fXNlbmRNZXNzYWdlKHgpe2xldCB6PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTp4fX0pKSwkPXRoaXMud2Vidmlldy5pZDtSbj9uZXcgUm4oJCkucG9zdE1lc3NhZ2Uoeik6bW4ud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcmJm1uLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KHosJCl9Y2xvc2UoKXt0aGlzLndlYnZpZXcuY2xvc2UoKX19ZnVuY3Rpb24gZ24oe2NvbnRleHQ6RT17fSx1cmw6eCxkYXRhOno9e30sc3R5bGU6JD17fSxvbk1lc3NhZ2U6SyxvbkNsb3NlOlh9KXtsZXQgY2U9R3QuZGFya21vZGU7bW49RS5wbHVzfHxnLE1uPUUud2VleHx8KHR5cGVvZiBiPT0ib2JqZWN0Ij9iOm51bGwpLFJuPUUuQnJvYWRjYXN0Q2hhbm5lbHx8KHR5cGVvZiB5PT0ib2JqZWN0Ij95Om51bGwpO2xldCBtZT17YXV0b0JhY2tCdXR0b246ITAsdGl0bGVTaXplOiIxN3B4In0sTmU9YHBhZ2Uke0RhdGUubm93KCl9YDskPU90LmV4dGVuZCh7fSwkKSwkLnRpdGxlTlZpZXchPT0hMSYmJC50aXRsZU5WaWV3IT09Im5vbmUiJiYoJC50aXRsZU5WaWV3PU90LmV4dGVuZChtZSwkLnRpdGxlTlZpZXcpKTtsZXQgRmU9e3RvcDowLGJvdHRvbTowLHVzaW5nQ29tcG9uZW50czp7fSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIixhbmltYXRpb25UeXBlOiJwb3AtaW4iLGFuaW1hdGlvbkR1cmF0aW9uOjIwMCx1bmlOVmlldzp7cGF0aDpgLyR7eH0uanNgLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDptbi5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07JD1PdC5leHRlbmQoRmUsJCk7bGV0IHBlPW1uLndlYnZpZXcuY3JlYXRlKCIiLE5lLCQse2V4dHJhczp7ZnJvbTpBaSgpLHJ1bnRpbWU6cHIoKSxkYXRhOk90LmV4dGVuZCh7fSx6LHtkYXJrbW9kZTpjZX0pLHVzZUdsb2JhbEV2ZW50OiFSbn19KTtyZXR1cm4gcGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLFgpLGhuKE5lLE1lPT57T3QuaXNGdW5jdGlvbihLKSYmSyhNZS5kYXRhKSxNZS5rZWVwfHxwZS5jbG9zZSgiYXV0byIpfSkscGUuc2hvdygkLmFuaW1hdGlvblR5cGUsJC5hbmltYXRpb25EdXJhdGlvbiksbmV3IExuKHBlKX1sZXQgQW49e2Zvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LCRuPUVuKCJ1bCIpO2Z1bmN0aW9uIHZyKCl7bGV0IEU9W107cmV0dXJuIFIucHJvdmlkZSgkbix7YWRkSGFuZGxlcih4KXtFLnB1c2goeCl9LHJlbW92ZUhhbmRsZXIoeCl7RS5zcGxpY2UoRS5pbmRleE9mKHgpLDEpfX0pLEV9bGV0IGFyPVIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJMYWJlbCIscHJvcHM6QW4sc3R5bGVzOltdLHNldHVwKEUse3Nsb3RzOnh9KXtsZXQgej1xdCgpLCQ9dnIoKSxLPVg9PntFLmZvcj9JLmVtaXQoYHVuaS1sYWJlbC1jbGljay0ke3p9LSR7RS5mb3J9YCxYLCEwKTokLmxlbmd0aCYmJFswXShYLCEwKX07cmV0dXJuKCk9PlIuY3JlYXRlVk5vZGUoInZpZXciLHtvbkNsaWNrOkt9LFt4LmRlZmF1bHQmJnguZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24gdmkoRSx4KXtXcihFLmlkLHgpLFIud2F0Y2goKCk9PkUuaWQsKHosJCk9Pnt4cigkLHgsITApLFdyKHoseCwhMCl9KSxSLm9uVW5tb3VudGVkKCgpPT57eHIoRS5pZCx4KX0pfWZ1bmN0aW9uIFdyKEUseCx6KXtsZXQgJD1xdCgpO3omJiFFfHwhT3QuaXNQbGFpbk9iamVjdCh4KXx8T2JqZWN0LmtleXMoeCkuZm9yRWFjaChLPT57ej9LLmluZGV4T2YoIkAiKSE9PTAmJksuaW5kZXhPZigidW5pLSIpIT09MCYmSS5vbihgdW5pLSR7S30tJHskfS0ke0V9YCx4W0tdKTpLLmluZGV4T2YoInVuaS0iKT09PTA/SS5vbihLLHhbS10pOkUmJkkub24oYHVuaS0ke0t9LSR7JH0tJHtFfWAseFtLXSl9KX1mdW5jdGlvbiB4cihFLHgseil7bGV0ICQ9cXQoKTt6JiYhRXx8IU90LmlzUGxhaW5PYmplY3QoeCl8fE9iamVjdC5rZXlzKHgpLmZvckVhY2goSz0+e3o/Sy5pbmRleE9mKCJAIikhPT0wJiZLLmluZGV4T2YoInVuaS0iKSE9PTAmJkkub2ZmKGB1bmktJHtLfS0keyR9LSR7RX1gLHhbS10pOksuaW5kZXhPZigidW5pLSIpPT09MD9JLm9mZihLLHhbS10pOkUmJkkub2ZmKGB1bmktJHtLfS0keyR9LSR7RX1gLHhbS10pfSl9ZnVuY3Rpb24gcm8oRSl7cmV0dXJuIE9iamVjdC5rZXlzKEUpLm1hcCh4PT5beCxFW3hdXSl9bGV0IFpvPVsiY2xhc3MiLCJzdHlsZSJdLHZhPS9eb25bQS1aXSsvLEhpPShFPXt9KT0+e2xldHtleGNsdWRlTGlzdGVuZXJzOng9ITEsZXhjbHVkZUtleXM6ej1bXX09RSwkPVIuZ2V0Q3VycmVudEluc3RhbmNlKCksSz1SLnNoYWxsb3dSZWYoe30pLFg9Ui5zaGFsbG93UmVmKHt9KSxjZT1SLnNoYWxsb3dSZWYoe30pLG1lPXouY29uY2F0KFpvKTtyZXR1cm4gJC5hdHRycz1SLnJlYWN0aXZlKCQuYXR0cnMpLFIud2F0Y2hFZmZlY3QoKCk9PntsZXQgTmU9cm8oJC5hdHRycykucmVkdWNlKChGZSxbcGUsTWVdKT0+KG1lLmluY2x1ZGVzKHBlKT9GZS5leGNsdWRlW3BlXT1NZTp2YS50ZXN0KHBlKT8oeHx8KEZlLmF0dHJzW3BlXT1NZSksRmUubGlzdGVuZXJzW3BlXT1NZSk6RmUuYXR0cnNbcGVdPU1lLEZlKSx7ZXhjbHVkZTp7fSxhdHRyczp7fSxsaXN0ZW5lcnM6e319KTtLLnZhbHVlPU5lLmF0dHJzLFgudmFsdWU9TmUubGlzdGVuZXJzLGNlLnZhbHVlPU5lLmV4Y2x1ZGV9KSx7JGF0dHJzOkssJGxpc3RlbmVyczpYLCRleGNsdWRlQXR0cnM6Y2V9fSxPbj17aWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJ1dHRvbi1ob3ZlciJ9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjcwfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG9wZW5UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxsb2FkaW5nOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0scGxhaW46e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sbXI9RW4oInVmIiksUXI9W3t1Yjp7IiI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLHBhZGRpbmdMZWZ0OiI1IixwYWRkaW5nUmlnaHQ6IjUiLG92ZXJmbG93OiJoaWRkZW4iLGNvbG9yOiIjMDAwMDAwIixiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgiLGJvcmRlclJhZGl1czoiNSIsYm9yZGVyU3R5bGU6InNvbGlkIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkYmRiZGIifX0sInViLXQiOnsiIjp7Y29sb3I6IiMwMDAwMDAiLGZvbnRTaXplOiIxOCIsdGV4dERlY29yYXRpb246Im5vbmUiLGxpbmVIZWlnaHQ6IjQ2In19LCJ1Yi1kIjp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9fSwidWItcCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiMwMDdhZmYiLGJvcmRlckNvbG9yOiIjMDA2MmNjIn19LCJ1Yi13Ijp7IiI6e2JhY2tncm91bmRDb2xvcjoiI2U2NDM0MCIsYm9yZGVyQ29sb3I6IiNiODM2MzMifX0sInViLWQtdCI6eyIiOntjb2xvcjoiIzAwMDAwMCJ9fSwidWItcC10Ijp7IiI6e2NvbG9yOiIjZmZmZmZmIn19LCJ1Yi13LXQiOnsiIjp7Y29sb3I6IiNmZmZmZmYifX0sInViLWQtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifX0sInViLXAtZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiM2M2FjZmMiLGJvcmRlckNvbG9yOiIjNGY4YWNhIn19LCJ1Yi13LWQiOnsiIjp7YmFja2dyb3VuZENvbG9yOiIjZWM4Yjg5Iixib3JkZXJDb2xvcjoiI2JkNmY2ZSJ9fSwidWItZC10LWQiOnsiIjp7Y29sb3I6IiNjY2NjY2MifX0sInViLXAtdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLXctdC1kIjp7IiI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifX0sInViLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItcC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1wbGFpbiI6eyIiOntjb2xvcjoiIzM1MzUzNSJ9fSwidWItcC10LXBsYWluIjp7IiI6e2NvbG9yOiIjMDA3YWZmIn19LCJ1Yi13LXQtcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAifX0sInViLWQtZC1wbGFpbiI6eyIiOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWQtcGxhaW4iOnsiIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItdy1kLXBsYWluIjp7IiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLWQtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXAtdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLXctdC1kLXBsYWluIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifX0sInViLW1pbmkiOnsiIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In19LCJ1Yi1sb2FkaW5nIjp7IiI6e3dpZHRoOiIxOCIsaGVpZ2h0OiIxOCIsbWFyZ2luUmlnaHQ6IjEwIn19LCJ1Yi1kLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1wLWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi13LWxvYWRpbmciOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiMzNTM1MzUifX0sInViLXAtbG9hZGluZy1wbGFpbiI6eyIiOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn19LCJ1Yi13LWxvYWRpbmctcGxhaW4iOnsiIjp7Y29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSwidWItZC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2RlZGVkZSJ9fSwidWItcC1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9fSwidWItdy1ob3ZlciI6eyIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2NlM2MzOSJ9fSwidWItZC10LWhvdmVyIjp7IiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuNikifX0sInViLXAtdC1ob3ZlciI6eyIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn19LCJ1Yi13LXQtaG92ZXIiOnsiIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9fSwidWItZC1ob3Zlci1wbGFpbiI6eyIiOntjb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixib3JkZXJDb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXAtaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX0sInViLXctaG92ZXItcGxhaW4iOnsiIjp7Y29sb3I6InJnYmEoMjMwLDY3LDY0LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifX19XSxtaT17ZGVmYXVsdDoiZCIscHJpbWFyeToicCIsd2FybjoidyJ9LEhuPVIuZGVmaW5lQ29tcG9uZW50KHtpbmhlcml0QXR0cnM6ITEsbmFtZToiQnV0dG9uIixwcm9wczpPdC5leHRlbmQoT24se3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifSxzaXplOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In19KSxzdHlsZXM6UXIsc2V0dXAoRSx7c2xvdHM6eCxhdHRyczp6fSl7bGV0eyRhdHRyczokLCRleGNsdWRlQXR0cnM6SywkbGlzdGVuZXJzOlh9PUhpKHtleGNsdWRlTGlzdGVuZXJzOiEwfSksY2U9RS50eXBlLG1lPVIucmVmKG51bGwpLE5lPVIuaW5qZWN0KG1yLCExKSxGZT0oYnQscWUpPT57bGV0IE10PVgudmFsdWUub25DbGlja3x8KCgpPT57fSk7aWYoRS5kaXNhYmxlZClyZXR1cm47TXQoYnQpO2xldCBkbj1FLmZvcm1UeXBlO2lmKGRuKXtpZighTmUpcmV0dXJuO2RuPT09InN1Ym1pdCI/TmUuc3VibWl0KGJ0KTpkbj09PSJyZXNldCImJk5lLnJlc2V0KGJ0KX19LHBlPWJ0PT57bGV0IHFlPSJ1Yi0iK21pW2NlXStidDtyZXR1cm4gRS5kaXNhYmxlZCYmKHFlKz0iLWQiKSxFLnBsYWluJiYocWUrPSItcGxhaW4iKSxFLnNpemU9PT0ibWluaSImJmJ0PT09Ii10IiYmKHFlKz0iIHViLW1pbmkiKSxxZX0sTWU9YnQ9PntpZihFLmRpc2FibGVkKXJldHVybiIiO2xldCBxZT0idWItIittaVtjZV0rYnQrIi1ob3ZlciI7cmV0dXJuIEUucGxhaW4mJihxZSs9Ii1wbGFpbiIpLHFlfSx1dD1SLmluamVjdCgkbiwhMSk7dXQmJih1dC5hZGRIYW5kbGVyKEZlKSxSLm9uQmVmb3JlVW5tb3VudCgoKT0+e3V0LnJlbW92ZUhhbmRsZXIoRmUpfSkpLHZpKEUseyJsYWJlbC1jbGljayI6RmV9KTtsZXQgX3Q9Ui5jb21wdXRlZCgoKT0+e2xldCBidD17fTtmb3IobGV0IHFlIGluIFgudmFsdWUpe2xldCBNdD1YLnZhbHVlW3FlXTtxZSE9PSJvbkNsaWNrIiYmKGJ0W3FlXT1NdCl9cmV0dXJuIGJ0fSksZW49KCk9PntpZigheC5kZWZhdWx0KXJldHVybltdO2xldCBidD14LmRlZmF1bHQoKTtyZXR1cm4gYnQubGVuZ3RoPT09MSYmYnRbMF0udHlwZT09PVIuVGV4dD9bWm4oYnRbMF0uY2hpbGRyZW4se2NsYXNzOiJ1Yi10ICIrcGUoIi10Iil9KV06YnR9O3JldHVybigpPT57bGV0IGJ0PU90LmV4dGVuZCh7fSxibihFKSx7aG92ZXJDbGFzczpNZSgiIil9LCQudmFsdWUsSy52YWx1ZSxfdC52YWx1ZSk7cmV0dXJuIFIuY3JlYXRlVk5vZGUoInZpZXciLFIubWVyZ2VQcm9wcyh7cmVmOm1lLGNsYXNzOlsidWIiLHBlKCIiKV0sb25DbGljazpGZX0sYnQpLFtFLmxvYWRpbmc/Ui5jcmVhdGVWTm9kZSgibG9hZGluZy1pbmRpY2F0b3IiLFIubWVyZ2VQcm9wcyh7Y2xhc3M6WyJ1Yi1sb2FkaW5nIixgdWItJHttaVtjZV19LWxvYWRpbmdgXX0se2Fycm93OiJmYWxzZSIsYW5pbWF0aW5nOiJ0cnVlIn0pLG51bGwpOm51bGwsLi4uZW4oKV0pfX19KSx5bz17c2NhbGVBcmVhOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19O2Z1bmN0aW9uIEdyKEUpe2xldCB4PVtdO3JldHVybiBPdC5pc0FycmF5KEUpJiZFLmZvckVhY2goej0+e1IuaXNWTm9kZSh6KT96LnR5cGU9PT1SLkZyYWdtZW50P3gucHVzaCguLi5Hcih6LmNoaWxkcmVuKSk6eC5wdXNoKHopOk90LmlzQXJyYXkoeikmJngucHVzaCguLi5Hcih6KSl9KSx4fWZ1bmN0aW9uIG1hKEUpe2xldCB4PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKCQpe3JldHVybiB4WyRdfHwoeFskXT1FKCQpKX19bGV0IENpPW1hKGZ1bmN0aW9uKEUpe2xldCB4PXt9LHo9LzsoPyFbXihdKlwpKS9nLCQ9LzooLispLztyZXR1cm4gRS5zcGxpdCh6KS5mb3JFYWNoKGZ1bmN0aW9uKEspe2lmKEspe2xldCBYPUsuc3BsaXQoJCk7WC5sZW5ndGg+MSYmKHhbWFswXS50cmltKCldPVhbMV0udHJpbSgpKX19KSx4fSksUW49RT0+bmV3IFByb21pc2UoKHgseik9PntpZighRSlyZXR1cm4geCh7d2lkdGg6MCxoZWlnaHQ6MCx0b3A6MCxsZWZ0OjB9KTtiLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QoRSwoe3NpemU6S30pPT57eChLKX0pfSksX3I9Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6Ik1vdmFibGVBcmVhIixwcm9wczp5byxzdHlsZXM6W3sidW5pLW1vdmFibGUtYXJlYSI6eyIiOntvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fV0sc2V0dXAoRSx7c2xvdHM6eH0pe2xldCB6PVIucmVmKDApLCQ9Ui5yZWYoMCksSz1SLnJlZigwKSxYPVIucmVmKDApLGNlPVIucmVmKCExKSxtZT1SLnJlZihudWxsKSxOZT1bXSxGZT1udWxsLHBlPXFlPT57RmU9cWV9LE1lPSgpPT5RbihtZS52YWx1ZSkudGhlbigoe3dpZHRoOnFlLGhlaWdodDpNdCx0b3A6ZG4sbGVmdDprbn0pPT57ei52YWx1ZT1xZSwkLnZhbHVlPU10LEsudmFsdWU9ZG4sWC52YWx1ZT1rbn0pLHV0PSgpPT57TWUoKS50aGVuKCgpPT57TmUuZm9yRWFjaChmdW5jdGlvbihxZSl7cWUuc2V0UGFyZW50KCl9KX0pfTtSLm9uTW91bnRlZCgoKT0+e2YoKCk9PntjZS52YWx1ZT0hMCx1dCgpfSwyMDApfSk7bGV0IF90PXtvblBhbnN0YXJ0KHFlKXtGZSYmRmUudG91Y2hzdGFydChxZSl9LG9uUGFubW92ZShxZSl7cWUuc3RvcFByb3BhZ2F0aW9uKCksRmUmJkZlLnRvdWNobW92ZShxZSl9LG9uUGFuZW5kKHFlKXtGZSYmRmUudG91Y2hlbmQocWUpLEZlPW51bGx9fSxlbj1xZT0+e05lLnB1c2gocWUpfSxidD1xZT0+e2xldCBNdD1OZS5pbmRleE9mKHFlKTtNdD49MCYmTmUuc3BsaWNlKE10LDEpfTtyZXR1cm4gUi5wcm92aWRlKCJfaXNNb3VudGVkIixjZSksUi5wcm92aWRlKCJwYXJlbnRTaXplIix7d2lkdGg6eixoZWlnaHQ6JCx0b3A6SyxsZWZ0Olh9KSxSLnByb3ZpZGUoImFkZE1vdmFibGVWaWV3Q29udGV4dCIsZW4pLFIucHJvdmlkZSgicmVtb3ZlTW92YWJsZVZpZXdDb250ZXh0IixidCksUi5wcm92aWRlKCJzZXRUb3VjaE1vdmFibGVWaWV3Q29udGV4dCIscGUpLCgpPT57bGV0IHFlPXguZGVmYXVsdCYmeC5kZWZhdWx0KCksTXQ9R3IocWUpO3JldHVybiBSLmNyZWF0ZVZOb2RlKCJ2aWV3IixSLm1lcmdlUHJvcHMoe3JlZjptZSxjbGFzczoidW5pLW1vdmFibGUtYXJlYSJ9LF90KSxbTXRdKX19fSk7ZnVuY3Rpb24gTGEoRSl7bGV0IHg9e307ZnVuY3Rpb24geihwZSxNZSl7eFtwZV0mJnhbcGVdKE1lKX1mdW5jdGlvbiAkKHBlLE1lKXt4W3BlXT1mdW5jdGlvbih1dCl7T3QuaXNGdW5jdGlvbihNZSkmJih1dC50b3VjaGVzPXV0LmNoYW5nZWRUb3VjaGVzLE1lKHV0KT09PSExJiZ1dC5zdG9wUHJvcGFnYXRpb24oKSl9fWxldCBLPTAsWD0wLGNlPTAsbWU9MCxOZT1mdW5jdGlvbihwZSxNZSx1dCxfdCl7aWYoRSh7dGFyZ2V0OnBlLnRhcmdldCxjdXJyZW50VGFyZ2V0OnBlLmN1cnJlbnRUYXJnZXQsc3RvcFByb3BhZ2F0aW9uOnBlLnN0b3BQcm9wYWdhdGlvbi5iaW5kKHBlKSx0b3VjaGVzOnBlLnRvdWNoZXMsY2hhbmdlZFRvdWNoZXM6cGUuY2hhbmdlZFRvdWNoZXMsZGV0YWlsOntzdGF0ZTpNZSx4OnV0LHk6X3QsZHg6dXQtSyxkeTpfdC1YLGRkeDp1dC1jZSxkZHk6X3QtbWUsdGltZVN0YW1wOnBlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX19KT09PSExKXJldHVybiExfSxGZT1udWxsO3JldHVybiAkKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihwZSl7aWYoIUZlKXJldHVybiBGZT1wZSxLPWNlPXBlLnRvdWNoZXNbMF0ucGFnZVgsWD1tZT1wZS50b3VjaGVzWzBdLnBhZ2VZLE5lKHBlLCJzdGFydCIsSyxYKX0pLCQoInRvdWNobW92ZSIsZnVuY3Rpb24ocGUpe2lmKEZlKXtsZXQgTWU9TmUocGUsIm1vdmUiLHBlLnRvdWNoZXNbMF0ucGFnZVgscGUudG91Y2hlc1swXS5wYWdlWSk7cmV0dXJuIGNlPXBlLnRvdWNoZXNbMF0ucGFnZVgsbWU9cGUudG91Y2hlc1swXS5wYWdlWSxNZX19KSwkKCJ0b3VjaGVuZCIsZnVuY3Rpb24ocGUpe2lmKEZlKXJldHVybiBGZT1udWxsLE5lKHBlLCJlbmQiLHBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLHBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZKX0pLHt0b3VjaHN0YXJ0OmZ1bmN0aW9uKHBlKXt6KCJ0b3VjaHN0YXJ0IixwZSl9LHRvdWNobW92ZTpmdW5jdGlvbihwZSl7eigidG91Y2htb3ZlIixwZSl9LHRvdWNoZW5kOmZ1bmN0aW9uKHBlKXt6KCJ0b3VjaGVuZCIscGUpfX19ZnVuY3Rpb24gZHIoRSx4KXtyZXR1cm4oeiwkKT0+e0UudmFsdWUmJngoeixYbyh6LEUudmFsdWUsJHx8e30pKX19ZnVuY3Rpb24gWG8oRSx4LHo9e30pe3JldHVybiB4PU1vKHgpLHt0eXBlOkUsdGltZVN0YW1wOkRhdGUubm93KCksdGFyZ2V0OngsY3VycmVudFRhcmdldDp4LGRldGFpbDp6fX1sZXQgQm89VW4uY2FjaGVTdHJpbmdGdW5jdGlvbihFPT5FLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK0Uuc2xpY2UoMSkpO2Z1bmN0aW9uIE1vKEUpe2xldHtvZmZzZXRMZWZ0Ongsb2Zmc2V0VG9wOnp9PUUsJD1FLmF0dHIsSz17fTtyZXR1cm4gT2JqZWN0LmtleXMoJHx8e30pLmZvckVhY2goWD0+e1guaW5kZXhPZigiZGF0YSIpPT09MCYmKEtbQm8oWC5yZXBsYWNlKCJkYXRhIiwiIikpXT0kW1hdKX0pLHtpZDokJiYkLmlkfHwiIixkYXRhc2V0Okssb2Zmc2V0TGVmdDp4fHwwLG9mZnNldFRvcDp6fHwwfX1mdW5jdGlvbiBjaShFLHgseil7cmV0dXJuIEU+eC16JiZFPHgren1mdW5jdGlvbiBUaShFLHgpe3JldHVybiBjaShFLDAseCl9ZnVuY3Rpb24gRW8oKXt9RW8ucHJvdG90eXBlLng9ZnVuY3Rpb24oRSl7cmV0dXJuIE1hdGguc3FydChFKX07ZnVuY3Rpb24gQ3IoRSx4KXt0aGlzLl9tPUUsdGhpcy5fZj0xZTMqeCx0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl92PTB9Q3IucHJvdG90eXBlLnNldFY9ZnVuY3Rpb24oRSx4KXtsZXQgej1NYXRoLnBvdyhNYXRoLnBvdyhFLDIpK01hdGgucG93KHgsMiksLjUpO3RoaXMuX3hfdj1FLHRoaXMuX3lfdj14LHRoaXMuX3hfYT0tdGhpcy5fZip0aGlzLl94X3Yveix0aGlzLl95X2E9LXRoaXMuX2YqdGhpcy5feV92L3osdGhpcy5fdD1NYXRoLmFicyhFL3RoaXMuX3hfYSl8fE1hdGguYWJzKHgvdGhpcy5feV9hKSx0aGlzLl9sYXN0RHQ9bnVsbCx0aGlzLl9zdGFydFRpbWU9bmV3IERhdGUoKS5nZXRUaW1lKCl9LENyLnByb3RvdHlwZS5zZXRTPWZ1bmN0aW9uKEUseCl7dGhpcy5feF9zPUUsdGhpcy5feV9zPXh9LENyLnByb3RvdHlwZS5zPWZ1bmN0aW9uKEUpe0U9PT12b2lkIDAmJihFPShuZXcgRGF0ZSgpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksRT50aGlzLl90JiYoRT10aGlzLl90LHRoaXMuX2xhc3REdD1FKTtsZXQgeD10aGlzLl94X3YqRSsuNSp0aGlzLl94X2EqTWF0aC5wb3coRSwyKSt0aGlzLl94X3Msej10aGlzLl95X3YqRSsuNSp0aGlzLl95X2EqTWF0aC5wb3coRSwyKSt0aGlzLl95X3M7cmV0dXJuKHRoaXMuX3hfYT4wJiZ4PHRoaXMuX2VuZFBvc2l0aW9uWHx8dGhpcy5feF9hPDAmJng+dGhpcy5fZW5kUG9zaXRpb25YKSYmKHg9dGhpcy5fZW5kUG9zaXRpb25YKSwodGhpcy5feV9hPjAmJno8dGhpcy5fZW5kUG9zaXRpb25ZfHx0aGlzLl95X2E8MCYmej50aGlzLl9lbmRQb3NpdGlvblkpJiYoej10aGlzLl9lbmRQb3NpdGlvblkpLHt4LHk6en19LENyLnByb3RvdHlwZS5kcz1mdW5jdGlvbihFKXtyZXR1cm4gRT09PXZvaWQgMCYmKEU9KG5ldyBEYXRlKCkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSxFPnRoaXMuX3QmJihFPXRoaXMuX3QpLHtkeDp0aGlzLl94X3YrdGhpcy5feF9hKkUsZHk6dGhpcy5feV92K3RoaXMuX3lfYSpFfX0sQ3IucHJvdG90eXBlLmRlbHRhPWZ1bmN0aW9uKCl7cmV0dXJue3g6LTEuNSpNYXRoLnBvdyh0aGlzLl94X3YsMikvdGhpcy5feF9hfHwwLHk6LTEuNSpNYXRoLnBvdyh0aGlzLl95X3YsMikvdGhpcy5feV9hfHwwfX0sQ3IucHJvdG90eXBlLmR0PWZ1bmN0aW9uKCl7cmV0dXJuLXRoaXMuX3hfdi90aGlzLl94X2F9LENyLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKCl7bGV0IEU9Y2kodGhpcy5zKCkueCx0aGlzLl9lbmRQb3NpdGlvblgpfHxjaSh0aGlzLnMoKS55LHRoaXMuX2VuZFBvc2l0aW9uWSl8fHRoaXMuX2xhc3REdD09PXRoaXMuX3Q7cmV0dXJuIHRoaXMuX2xhc3REdD1udWxsLEV9LENyLnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oRSx4KXt0aGlzLl9lbmRQb3NpdGlvblg9RSx0aGlzLl9lbmRQb3NpdGlvblk9eH0sQ3IucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKEUseCl7dGhpcy5fbT1FLHRoaXMuX2Y9MWUzKnh9O2Z1bmN0aW9uIEJyKEUseCx6KXt0aGlzLl9tPUUsdGhpcy5faz14LHRoaXMuX2M9eix0aGlzLl9zb2x1dGlvbj1udWxsLHRoaXMuX2VuZFBvc2l0aW9uPTAsdGhpcy5fc3RhcnRUaW1lPTB9QnIucHJvdG90eXBlLl9zb2x2ZT1mdW5jdGlvbihFLHgpe2xldCB6PXRoaXMuX2MsJD10aGlzLl9tLEs9dGhpcy5fayxYPXoqei00KiQqSztpZihYPT09MCl7bGV0IHBlPS16LygyKiQpLE1lPUUsdXQ9eC8ocGUqRSk7cmV0dXJue3g6ZnVuY3Rpb24oX3Qpe3JldHVybihNZSt1dCpfdCkqTWF0aC5wb3coTWF0aC5FLHBlKl90KX0sZHg6ZnVuY3Rpb24oX3Qpe2xldCBlbj1NYXRoLnBvdyhNYXRoLkUscGUqX3QpO3JldHVybiBwZSooTWUrdXQqX3QpKmVuK3V0KmVufX19aWYoWD4wKXtsZXQgcGU9KC16LU1hdGguc3FydChYKSkvKDIqJCksTWU9KC16K01hdGguc3FydChYKSkvKDIqJCksdXQ9KHgtcGUqRSkvKE1lLXBlKSxfdD1FLXV0O3JldHVybnt4OmZ1bmN0aW9uKGVuKXtsZXQgYnQscWU7cmV0dXJuIGVuPT09dGhpcy5fdCYmKGJ0PXRoaXMuX3Bvd0VSMVQscWU9dGhpcy5fcG93RVIyVCksdGhpcy5fdD1lbixidHx8KGJ0PXRoaXMuX3Bvd0VSMVQ9TWF0aC5wb3coTWF0aC5FLHBlKmVuKSkscWV8fChxZT10aGlzLl9wb3dFUjJUPU1hdGgucG93KE1hdGguRSxNZSplbikpLF90KmJ0K3V0KnFlfSxkeDpmdW5jdGlvbihlbil7bGV0IGJ0LHFlO3JldHVybiBlbj09PXRoaXMuX3QmJihidD10aGlzLl9wb3dFUjFULHFlPXRoaXMuX3Bvd0VSMlQpLHRoaXMuX3Q9ZW4sYnR8fChidD10aGlzLl9wb3dFUjFUPU1hdGgucG93KE1hdGguRSxwZSplbikpLHFlfHwocWU9dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsTWUqZW4pKSxfdCpwZSpidCt1dCpNZSpxZX19fWxldCBjZT1NYXRoLnNxcnQoNCokKksteip6KS8oMiokKSxtZT0tei8yKiQsTmU9RSxGZT0oeC1tZSpFKS9jZTtyZXR1cm57eDpmdW5jdGlvbihwZSl7cmV0dXJuIE1hdGgucG93KE1hdGguRSxtZSpwZSkqKE5lKk1hdGguY29zKGNlKnBlKStGZSpNYXRoLnNpbihjZSpwZSkpfSxkeDpmdW5jdGlvbihwZSl7bGV0IE1lPU1hdGgucG93KE1hdGguRSxtZSpwZSksdXQ9TWF0aC5jb3MoY2UqcGUpLF90PU1hdGguc2luKGNlKnBlKTtyZXR1cm4gTWUqKEZlKmNlKnV0LU5lKmNlKl90KSttZSpNZSooRmUqX3QrTmUqdXQpfX19LEJyLnByb3RvdHlwZS54PWZ1bmN0aW9uKEUpe3JldHVybiBFPT09dm9pZCAwJiYoRT0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHRoaXMuX3NvbHV0aW9uP3RoaXMuX2VuZFBvc2l0aW9uK3RoaXMuX3NvbHV0aW9uLngoRSk6MH0sQnIucHJvdG90eXBlLmR4PWZ1bmN0aW9uKEUpe3JldHVybiBFPT09dm9pZCAwJiYoRT0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHRoaXMuX3NvbHV0aW9uP3RoaXMuX3NvbHV0aW9uLmR4KEUpOjB9LEJyLnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oRSx4LHope2lmKHp8fCh6PW5ldyBEYXRlKCkuZ2V0VGltZSgpKSxFIT09dGhpcy5fZW5kUG9zaXRpb258fCFUaSh4LC4xKSl7eD14fHwwO2xldCAkPXRoaXMuX2VuZFBvc2l0aW9uO3RoaXMuX3NvbHV0aW9uJiYoVGkoeCwuMSkmJih4PXRoaXMuX3NvbHV0aW9uLmR4KCh6LXRoaXMuX3N0YXJ0VGltZSkvMWUzKSksJD10aGlzLl9zb2x1dGlvbi54KCh6LXRoaXMuX3N0YXJ0VGltZSkvMWUzKSxUaSh4LC4xKSYmKHg9MCksVGkoJCwuMSkmJigkPTApLCQrPXRoaXMuX2VuZFBvc2l0aW9uKSx0aGlzLl9zb2x1dGlvbiYmVGkoJC1FLC4xKSYmVGkoeCwuMSl8fCh0aGlzLl9lbmRQb3NpdGlvbj1FLHRoaXMuX3NvbHV0aW9uPXRoaXMuX3NvbHZlKCQtdGhpcy5fZW5kUG9zaXRpb24seCksdGhpcy5fc3RhcnRUaW1lPXopfX0sQnIucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24oRSl7dGhpcy5fc3RhcnRUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpLHRoaXMuX2VuZFBvc2l0aW9uPUUsdGhpcy5fc29sdXRpb249e3g6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gMH19fSxCci5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbihFKXtyZXR1cm4gRXx8KEU9bmV3IERhdGUoKS5nZXRUaW1lKCkpLGNpKHRoaXMueCgpLHRoaXMuX2VuZFBvc2l0aW9uLC4xKSYmVGkodGhpcy5keCgpLC4xKX0sQnIucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKEUseCx6KXt0aGlzLl9tPUUsdGhpcy5faz14LHRoaXMuX2M9eix0aGlzLmRvbmUoKXx8KHRoaXMuX3NvbHV0aW9uPXRoaXMuX3NvbHZlKHRoaXMueCgpLXRoaXMuX2VuZFBvc2l0aW9uLHRoaXMuZHgoKSksdGhpcy5fc3RhcnRUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpKX0sQnIucHJvdG90eXBlLnNwcmluZ0NvbnN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2t9LEJyLnByb3RvdHlwZS5kYW1waW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N9LEJyLnByb3RvdHlwZS5jb25maWd1cmF0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRSh6LCQpe3oucmVjb25maWd1cmUoMSwkLHouZGFtcGluZygpKX1mdW5jdGlvbiB4KHosJCl7ei5yZWNvbmZpZ3VyZSgxLHouc3ByaW5nQ29uc3RhbnQoKSwkKX1yZXR1cm5be2xhYmVsOiJTcHJpbmcgQ29uc3RhbnQiLHJlYWQ6dGhpcy5zcHJpbmdDb25zdGFudC5iaW5kKHRoaXMpLHdyaXRlOkUuYmluZCh0aGlzLHRoaXMpLG1pbjoxMDAsbWF4OjFlM30se2xhYmVsOiJEYW1waW5nIixyZWFkOnRoaXMuZGFtcGluZy5iaW5kKHRoaXMpLHdyaXRlOnguYmluZCh0aGlzLHRoaXMpLG1pbjoxLG1heDo1MDB9XX07ZnVuY3Rpb24gaW8oRSx4LHope3RoaXMuX3NwcmluZ1g9bmV3IEJyKEUseCx6KSx0aGlzLl9zcHJpbmdZPW5ldyBCcihFLHgseiksdGhpcy5fc3ByaW5nU2NhbGU9bmV3IEJyKEUseCx6KSx0aGlzLl9zdGFydFRpbWU9MH1pby5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKEUseCx6LCQpe2xldCBLPW5ldyBEYXRlKCkuZ2V0VGltZSgpO3RoaXMuX3NwcmluZ1guc2V0RW5kKEUsJCxLKSx0aGlzLl9zcHJpbmdZLnNldEVuZCh4LCQsSyksdGhpcy5fc3ByaW5nU2NhbGUuc2V0RW5kKHosJCxLKSx0aGlzLl9zdGFydFRpbWU9S30saW8ucHJvdG90eXBlLng9ZnVuY3Rpb24oKXtsZXQgRT0obmV3IERhdGUoKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTM7cmV0dXJue3g6dGhpcy5fc3ByaW5nWC54KEUpLHk6dGhpcy5fc3ByaW5nWS54KEUpLHNjYWxlOnRoaXMuX3NwcmluZ1NjYWxlLngoRSl9fSxpby5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe2xldCBFPW5ldyBEYXRlKCkuZ2V0VGltZSgpO3JldHVybiB0aGlzLl9zcHJpbmdYLmRvbmUoRSkmJnRoaXMuX3NwcmluZ1kuZG9uZShFKSYmdGhpcy5fc3ByaW5nU2NhbGUuZG9uZShFKX0saW8ucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKEUseCx6KXt0aGlzLl9zcHJpbmdYLnJlY29uZmlndXJlKEUseCx6KSx0aGlzLl9zcHJpbmdZLnJlY29uZmlndXJlKEUseCx6KSx0aGlzLl9zcHJpbmdTY2FsZS5yZWNvbmZpZ3VyZShFLHgseil9O2xldCBvbz17ZGlyZWN0aW9uOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJub25lIn0saW5lcnRpYTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LG91dE9mQm91bmRzOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0seDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSx5Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGRhbXBpbmc6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MjB9LGZyaWN0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzY2FsZU1pbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDouNX0sc2NhbGVNYXg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MTB9LHNjYWxlVmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sYW5pbWF0aW9uOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMH19O2Z1bmN0aW9uIGVpKEUseCl7cmV0dXJuKygoMWUzKkUtMWUzKngpLzFlMykudG9GaXhlZCgxKX1mdW5jdGlvbiBqaShFLHgseil7bGV0ICQ9e2lkOjAsY2FuY2VsbGVkOiExfSxLPWZ1bmN0aW9uKGNlKXtjZSYmY2UuaWQmJmFvKGNlLmlkKSxjZSYmKGNlLmNhbmNlbGxlZD0hMCl9O2Z1bmN0aW9uIFgoY2UsbWUsTmUsRmUpe2lmKCFjZXx8IWNlLmNhbmNlbGxlZCl7TmUobWUpO2xldCBwZT1tZS5kb25lKCk7cGV8fGNlLmNhbmNlbGxlZHx8KGNlLmlkPU9pKFguYmluZChudWxsLGNlLG1lLE5lLEZlKSkpLHBlJiZGZSYmRmUobWUpfX1yZXR1cm4gWCgkLEUseCx6KSx7Y2FuY2VsOksuYmluZChudWxsLCQpLG1vZGVsOkV9fWxldCB6aT0hMTtmdW5jdGlvbiBRbyhFKXt6aXx8KHppPSEwLE9pKGZ1bmN0aW9uKCl7RSgpLHppPSExfSkpfWZ1bmN0aW9uIE9pKEUpe3JldHVybiBmKEUsMTYpfWZ1bmN0aW9uIGFvKEUpe28oRSl9bGV0IGVhPWIucmVxdWlyZU1vZHVsZSgiYW5pbWF0aW9uIiksV2k9Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6Ik1vdmFibGVWaWV3Iixwcm9wczpvbyxlbWl0czpbImNoYW5nZSIsInNjYWxlIl0sc3R5bGVzOlt7InVuaS1tb3ZhYmxlLXZpZXciOnsiIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjBweCIsbGVmdDoiMHB4Iix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fV0sc2V0dXAoRSx7ZW1pdDp4LHNsb3RzOnp9KXtsZXQgJD1SLnJlZihudWxsKSxLPWRyKCQseCksWD1SLmluamVjdCgic2V0VG91Y2hNb3ZhYmxlVmlld0NvbnRleHQiLCgpPT57fSksY2U9am4oRSxLLCQsWCk7cmV0dXJuKCk9PntsZXQgbWU9e3ByZXZlbnRHZXN0dXJlOiEwfTtyZXR1cm4gUi5jcmVhdGVWTm9kZSgidmlldyIsUi5tZXJnZVByb3BzKHtyZWY6JCxvblRvdWNoc3RhcnQ6Y2UsY2xhc3M6InVuaS1tb3ZhYmxlLXZpZXciLHN0eWxlOiJ0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7In0sbWUpLFt6LmRlZmF1bHQmJnouZGVmYXVsdCgpXSl9fX0pO2Z1bmN0aW9uIGpuKEUseCx6LCQpe2xldCBLPVIuaW5qZWN0KCJfaXNNb3VudGVkIixSLnJlZighMSkpLFg9Ui5pbmplY3QoInBhcmVudFNpemUiLHt3aWR0aDpSLnJlZigwKSxoZWlnaHQ6Ui5yZWYoMCksdG9wOlIucmVmKDApLGxlZnQ6Ui5yZWYoMCl9KSxjZT1SLmluamVjdCgiYWRkTW92YWJsZVZpZXdDb250ZXh0IiwoKT0+e30pLG1lPVIuaW5qZWN0KCJyZW1vdmVNb3ZhYmxlVmlld0NvbnRleHQiLCgpPT57fSksTmU9e3RvdWNoc3RhcnQ6KCk9Pnt9LHRvdWNobW92ZTooKT0+e30sdG91Y2hlbmQ6KCk9Pnt9fTtmdW5jdGlvbiBGZShfZSl7cmV0dXJuIE51bWJlcihfZSl8fDB9ZnVuY3Rpb24gcGUoX2Upe3JldHVybiBfZT1OdW1iZXIoX2UpLGlzTmFOKF9lKT8xOl9lfWxldCBNZT1SLnJlZihGZShFLngpKSx1dD1SLnJlZihGZShFLnkpKSxfdD1SLnJlZihwZShOdW1iZXIoRS5zY2FsZVZhbHVlKSkpLGVuPVIucmVmKDApLGJ0PVIucmVmKDApLHFlPVIucmVmKDApLE10PVIucmVmKDApLGRuPVIucmVmKDApLGtuPVIucmVmKDApLEF0PW51bGwscm49bnVsbCxTbj17eDowLHk6MH0sYW49e3g6MCx5OjB9LGt0PTEsQ249MCxxbj0wLFNhPSExLGNyLGZvLE9vPW51bGwsd2E9bnVsbCxpaT17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9LEJpPW5ldyBFbyxQbz1uZXcgRW8seG49e2hpc3RvcnlYOlswLDBdLGhpc3RvcnlZOlswLDBdLGhpc3RvcnlUOlswLDBdfSxVYT1SLmNvbXB1dGVkKCgpPT57bGV0IF9lPU51bWJlcihFLmRhbXBpbmcpO3JldHVybiBpc05hTihfZSk/MjA6X2V9KSx0cz1SLmNvbXB1dGVkKCgpPT57bGV0IF9lPU51bWJlcihFLmZyaWN0aW9uKTtyZXR1cm4gaXNOYU4oX2UpfHxfZTw9MD8yOl9lfSksJG89Ui5jb21wdXRlZCgoKT0+e2xldCBfZT1OdW1iZXIoRS5zY2FsZU1pbik7cmV0dXJuIGlzTmFOKF9lKT8uNTpfZX0pLEFhPVIuY29tcHV0ZWQoKCk9PntsZXQgX2U9TnVtYmVyKEUuc2NhbGVNYXgpO3JldHVybiBpc05hTihfZSk/MTA6X2V9KSxrcj1SLmNvbXB1dGVkKCgpPT5FLmRpcmVjdGlvbj09PSJhbGwifHxFLmRpcmVjdGlvbj09PSJob3Jpem9udGFsIiksQ2E9Ui5jb21wdXRlZCgoKT0+RS5kaXJlY3Rpb249PT0iYWxsInx8RS5kaXJlY3Rpb249PT0idmVydGljYWwiKSxNaT1uZXcgaW8oMSw5Kk1hdGgucG93KFVhLnZhbHVlLDIpLzQwLFVhLnZhbHVlKSxobz1uZXcgQ3IoMSx0cy52YWx1ZSk7Ui53YXRjaCgoKT0+RS54LF9lPT57TWUudmFsdWU9RmUoX2UpfSksUi53YXRjaCgoKT0+RS55LF9lPT57dXQudmFsdWU9RmUoX2UpfSksUi53YXRjaCgoKT0+RS5zY2FsZVZhbHVlLF9lPT57X3QudmFsdWU9cGUoTnVtYmVyKF9lKSl9KSxSLndhdGNoKE1lLHNhKSxSLndhdGNoKHV0LFVyKSxSLndhdGNoKF90LG5yKSxSLndhdGNoKCRvLEhvKSxSLndhdGNoKEFhLEhvKTtmdW5jdGlvbiB0cigpe3JuJiZybi5jYW5jZWwoKSxBdCYmQXQuY2FuY2VsKCl9ZnVuY3Rpb24gc2EoX2Upe2lmKGtyLnZhbHVlKXtpZihfZSthbi54PT09Q24pcmV0dXJuIENuO0F0JiZBdC5jYW5jZWwoKSxIcihfZSthbi54LHV0LnZhbHVlK2FuLnksa3QpfXJldHVybiBfZX1mdW5jdGlvbiBVcihfZSl7aWYoQ2EudmFsdWUpe2lmKF9lK2FuLnk9PT1xbilyZXR1cm4gcW47QXQmJkF0LmNhbmNlbCgpLEhyKE1lLnZhbHVlK2FuLngsX2UrYW4ueSxrdCl9cmV0dXJuIF9lfWZ1bmN0aW9uIEhvKCl7aWYoIUUuc2NhbGUpcmV0dXJuITE7ZGkoa3QsITApfWZ1bmN0aW9uIG5yKF9lKXtyZXR1cm4gRS5zY2FsZT8oX2U9S3IoX2UpLGRpKF9lLCEwKSxfZSk6ITF9ZnVuY3Rpb24gR24oKXtFLmRpc2FibGVkfHwodHIoKSx4bi5oaXN0b3J5WD1bMCwwXSx4bi5oaXN0b3J5WT1bMCwwXSx4bi5oaXN0b3J5VD1bMCwwXSxrci52YWx1ZSYmKGNyPUNuKSxDYS52YWx1ZSYmKGZvPXFuKSxPbz1udWxsLHdhPW51bGwsU2E9ITApfWZ1bmN0aW9uIGdyKF9lKXtpZighRS5kaXNhYmxlZCYmU2Epe2xldCB4dD1DbixDdD1xbjtpZih3YT09PW51bGwmJih3YT1NYXRoLmFicyhfZS5kZXRhaWwuZHgvX2UuZGV0YWlsLmR5KT4xPyJodG91Y2htb3ZlIjoidnRvdWNobW92ZSIpLGtyLnZhbHVlJiYoeHQ9X2UuZGV0YWlsLmR4K2NyLHhuLmhpc3RvcnlYLnNoaWZ0KCkseG4uaGlzdG9yeVgucHVzaCh4dCksIUNhLnZhbHVlJiZPbz09PW51bGwmJihPbz1NYXRoLmFicyhfZS5kZXRhaWwuZHgvX2UuZGV0YWlsLmR5KTwxKSksQ2EudmFsdWUmJihDdD1fZS5kZXRhaWwuZHkrZm8seG4uaGlzdG9yeVkuc2hpZnQoKSx4bi5oaXN0b3J5WS5wdXNoKEN0KSwha3IudmFsdWUmJk9vPT09bnVsbCYmKE9vPU1hdGguYWJzKF9lLmRldGFpbC5keS9fZS5kZXRhaWwuZHgpPDEpKSx4bi5oaXN0b3J5VC5zaGlmdCgpLHhuLmhpc3RvcnlULnB1c2goX2UuZGV0YWlsLnRpbWVTdGFtcCksIU9vKXtsZXQgb249InRvdWNoIjt4dDxxZS52YWx1ZT9FLm91dE9mQm91bmRzPyhvbj0idG91Y2gtb3V0LW9mLWJvdW5kcyIseHQ9cWUudmFsdWUtQmkueChxZS52YWx1ZS14dCkpOnh0PXFlLnZhbHVlOnh0PmRuLnZhbHVlJiYoRS5vdXRPZkJvdW5kcz8ob249InRvdWNoLW91dC1vZi1ib3VuZHMiLHh0PWRuLnZhbHVlK0JpLngoeHQtZG4udmFsdWUpKTp4dD1kbi52YWx1ZSksQ3Q8TXQudmFsdWU/RS5vdXRPZkJvdW5kcz8ob249InRvdWNoLW91dC1vZi1ib3VuZHMiLEN0PU10LnZhbHVlLVBvLngoTXQudmFsdWUtQ3QpKTpDdD1NdC52YWx1ZTpDdD5rbi52YWx1ZSYmKEUub3V0T2ZCb3VuZHM/KG9uPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixDdD1rbi52YWx1ZStQby54KEN0LWtuLnZhbHVlKSk6Q3Q9a24udmFsdWUpLFFvKGZ1bmN0aW9uKCl7TGkoeHQsQ3Qsa3Qsb24pfSl9fX1mdW5jdGlvbiBnbygpe2lmKCFFLmRpc2FibGVkJiZTYSYmKFNhPSExLCFPbyYmIW9sKCJvdXQtb2YtYm91bmRzIikmJkUuaW5lcnRpYSkpe2xldCBfZT0xZTMqKHhuLmhpc3RvcnlYWzFdLXhuLmhpc3RvcnlYWzBdKS8oeG4uaGlzdG9yeVRbMV0teG4uaGlzdG9yeVRbMF0pLHh0PTFlMyooeG4uaGlzdG9yeVlbMV0teG4uaGlzdG9yeVlbMF0pLyh4bi5oaXN0b3J5VFsxXS14bi5oaXN0b3J5VFswXSk7aG8uc2V0VihfZSx4dCksaG8uc2V0UyhDbixxbik7bGV0IEN0PWhvLmRlbHRhKCkueCxvbj1oby5kZWx0YSgpLnksdG49Q3QrQ24sRmk9b24rcW47dG48cWUudmFsdWU/KHRuPXFlLnZhbHVlLEZpPXFuKyhxZS52YWx1ZS1Dbikqb24vQ3QpOnRuPmRuLnZhbHVlJiYodG49ZG4udmFsdWUsRmk9cW4rKGRuLnZhbHVlLUNuKSpvbi9DdCksRmk8TXQudmFsdWU/KEZpPU10LnZhbHVlLHRuPUNuKyhNdC52YWx1ZS1xbikqQ3Qvb24pOkZpPmtuLnZhbHVlJiYoRmk9a24udmFsdWUsdG49Q24rKGtuLnZhbHVlLXFuKSpDdC9vbiksaG8uc2V0RW5kKHRuLEZpKSxybj1qaShobyxmdW5jdGlvbigpe2xldCBrbz1oby5zKCksQm49a28ueCxEaT1rby55O0xpKEJuLERpLGt0LCJmcmljdGlvbiIpfSxmdW5jdGlvbigpe3JuLmNhbmNlbCgpfSl9fWZ1bmN0aW9uIFluKF9lLHh0KXtsZXQgQ3Q9ITE7cmV0dXJuIF9lPmRuLnZhbHVlPyhfZT1kbi52YWx1ZSxDdD0hMCk6X2U8cWUudmFsdWUmJihfZT1xZS52YWx1ZSxDdD0hMCkseHQ+a24udmFsdWU/KHh0PWtuLnZhbHVlLEN0PSEwKTp4dDxNdC52YWx1ZSYmKHh0PU10LnZhbHVlLEN0PSEwKSx7eDpfZSx5Onh0LG91dE9mQm91bmRzOkN0fX1mdW5jdGlvbiAkcigpe1NuLng9aWkubGVmdC1YLmxlZnQudmFsdWUsU24ueT1paS50b3AtWC50b3AudmFsdWV9ZnVuY3Rpb24gVGEoX2Upe19lPV9lfHxrdCxfZT1LcihfZSksYnQudmFsdWU9aWkuaGVpZ2h0L2t0LGVuLnZhbHVlPWlpLndpZHRoL2t0O2xldCB4dD1idC52YWx1ZSpfZSxDdD1lbi52YWx1ZSpfZTthbi54PShDdC1lbi52YWx1ZSkvMixhbi55PSh4dC1idC52YWx1ZSkvMn1mdW5jdGlvbiBucygpe2xldCBfZT0wLVNuLngrYW4ueCx4dD1YLndpZHRoLnZhbHVlLWVuLnZhbHVlLVNuLngtYW4ueDtxZS52YWx1ZT1NYXRoLm1pbihfZSx4dCksZG4udmFsdWU9TWF0aC5tYXgoX2UseHQpO2xldCBDdD0wLVNuLnkrYW4ueSxvbj1YLmhlaWdodC52YWx1ZS1idC52YWx1ZS1Tbi55LWFuLnk7TXQudmFsdWU9TWF0aC5taW4oQ3Qsb24pLGtuLnZhbHVlPU1hdGgubWF4KEN0LG9uKX1mdW5jdGlvbiBkaShfZSx4dCl7aWYoRS5zY2FsZSl7X2U9S3IoX2UpLFRhKF9lKSxucygpO2xldCBDdD1ZbihDbixxbiksb249Q3QueCx0bj1DdC55O3h0P0hyKG9uLHRuLF9lLCIiLCEwLCEwKTpRbyhmdW5jdGlvbigpe0xpKG9uLHRuLF9lLCIiLCEwLCEwKX0pfX1mdW5jdGlvbiBLcihfZSl7cmV0dXJuIF9lPU1hdGgubWF4KC41LCRvLnZhbHVlLF9lKSxfZT1NYXRoLm1pbigxMCxBYS52YWx1ZSxfZSksX2V9ZnVuY3Rpb24gSHIoX2UseHQsQ3Qsb24sdG4sRmkpe3RyKCksa3IudmFsdWV8fChfZT1DbiksQ2EudmFsdWV8fCh4dD1xbiksRS5zY2FsZXx8KEN0PWt0KTtsZXQga289WW4oX2UseHQpO2lmKF9lPWtvLngseHQ9a28ueSwhRS5hbmltYXRpb24pe0xpKF9lLHh0LEN0LG9uLHRuLEZpKTtyZXR1cm59TWkuX3NwcmluZ1guX3NvbHV0aW9uPW51bGwsTWkuX3NwcmluZ1kuX3NvbHV0aW9uPW51bGwsTWkuX3NwcmluZ1NjYWxlLl9zb2x1dGlvbj1udWxsLE1pLl9zcHJpbmdYLl9lbmRQb3NpdGlvbj1DbixNaS5fc3ByaW5nWS5fZW5kUG9zaXRpb249cW4sTWkuX3NwcmluZ1NjYWxlLl9lbmRQb3NpdGlvbj1rdCxNaS5zZXRFbmQoX2UseHQsQ3QsMSksQXQ9amkoTWksZnVuY3Rpb24oKXtsZXQgQm49TWkueCgpLERpPUJuLngsam89Qm4ueSxCcz1Cbi5zY2FsZTtMaShEaSxqbyxCcyxvbix0bixGaSl9LGZ1bmN0aW9uKCl7QXQuY2FuY2VsKCl9KX1mdW5jdGlvbiBvbChfZSl7bGV0IHh0PVluKENuLHFuKSxDdD14dC54LG9uPXh0LnksdG49eHQub3V0T2ZCb3VuZHM7cmV0dXJuIHRuJiZIcihDdCxvbixrdCxfZSksdG59ZnVuY3Rpb24gTGkoX2UseHQsQ3Qsb249IiIsdG4sRmkpe19lIT09bnVsbCYmX2UudG9TdHJpbmcoKSE9PSJOYU4iJiZ0eXBlb2YgX2U9PSJudW1iZXIifHwoX2U9Q258fDApLHh0IT09bnVsbCYmeHQudG9TdHJpbmcoKSE9PSJOYU4iJiZ0eXBlb2YgeHQ9PSJudW1iZXIifHwoeHQ9cW58fDApLF9lPU51bWJlcihfZS50b0ZpeGVkKDEpKSx4dD1OdW1iZXIoeHQudG9GaXhlZCgxKSksQ3Q9TnVtYmVyKEN0LnRvRml4ZWQoMSkpLENuPT09X2UmJnFuPT09eHR8fHRufHx4KCJjaGFuZ2UiLHt4OmVpKF9lLGFuLngpLHk6ZWkoeHQsYW4ueSksc291cmNlOm9ufSksRS5zY2FsZXx8KEN0PWt0KSxDdD1LcihDdCksQ3Q9K0N0LnRvRml4ZWQoMyksRmkmJkN0IT09a3QmJngoInNjYWxlIix7eDpfZSx5Onh0LHNjYWxlOkN0fSk7bGV0IGtvPWB0cmFuc2xhdGUoJHtfZX1weCwgJHt4dH1weCkgc2NhbGUoJHtDdH0pYDtlYS50cmFuc2l0aW9uKHoudmFsdWUse3N0eWxlczp7dHJhbnNmb3JtOmtvfSxkdXJhdGlvbjowLGRlbGF5OjB9KSxDbj1fZSxxbj14dCxrdD1DdH1mdW5jdGlvbiBObygpe3JldHVybiBRbih6LnZhbHVlKS50aGVuKF9lPT57aWk9X2V9KX1mdW5jdGlvbiBvaSgpe2lmKCFLLnZhbHVlKXJldHVybjt0cigpO2xldCBfZT1FLnNjYWxlP190LnZhbHVlOjE7JHIoKSxUYShfZSksbnMoKSxDbj1NZS52YWx1ZSthbi54LHFuPXV0LnZhbHVlK2FuLnk7bGV0IHh0PVluKENuLHFuKSxDdD14dC54LG9uPXh0Lnk7TGkoQ3Qsb24sX2UsIiIsITApfXJldHVybiBSLm9uTW91bnRlZCgoKT0+e05lPUxhKHh0PT57c3dpdGNoKHh0LmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6R24oKTticmVhaztjYXNlIm1vdmUiOmdyKHh0KTticmVhaztjYXNlImVuZCI6Z28oKX19KSxmKCgpPT57Tm8oKS50aGVuKCgpPT57b2koKX0pfSwxMDApLGhvLnJlY29uZmlndXJlKDEsdHMudmFsdWUpLE1pLnJlY29uZmlndXJlKDEsOSpNYXRoLnBvdyhVYS52YWx1ZSwyKS80MCxVYS52YWx1ZSk7bGV0IF9lPXtzZXRQYXJlbnQ6b2l9O2NlKF9lKSxSLm9uVW5tb3VudGVkKCgpPT57bWUoX2UpfSl9KSxSLm9uVW5tb3VudGVkKCgpPT57dHIoKX0pLCgpPT57JChOZSl9fWxldCBZcj0xNixUcj17YWN0aXZlQ29sb3I6VW4uUFJJTUFSWV9DT0xPUixiYWNrZ3JvdW5kQ29sb3I6IiNFQkVCRUIiLGFjdGl2ZU1vZGU6ImJhY2t3YXJkcyJ9LEJ0PXtwZXJjZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjAsdmFsaWRhdG9yKEUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KEUpKX19LGZvbnRTaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OllyfSxzaG93SW5mbzp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHN0cm9rZVdpZHRoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjYsdmFsaWRhdG9yKEUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KEUpKX19LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OlRyLmFjdGl2ZUNvbG9yfSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpUci5hY3RpdmVDb2xvcn0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OlRyLmJhY2tncm91bmRDb2xvcn0sYWN0aXZlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYWN0aXZlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpUci5hY3RpdmVNb2RlfSxkdXJhdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDozMCx2YWxpZGF0b3IoRSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoRSkpfX0sYm9yZGVyUmFkaXVzOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxUZT1beyJ1bmktcHJvZ3Jlc3MiOnsiIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn19LCJ1bmktcHJvZ3Jlc3MtYmFyIjp7IiI6e2ZsZXg6MX19LCJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9fSwidW5pLXByb2dyZXNzLWluZm8iOnsiIjp7bWFyZ2luTGVmdDoiMTVweCJ9fX1dLEZhPVIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQcm9ncmVzcyIscHJvcHM6QnQsc3R5bGVzOlRlLGVtaXRzOlsiYWN0aXZlZW5kIl0sc2V0dXAoRSx7ZW1pdDp4fSl7bGV0IHo9Ui5yZWYobnVsbCksJD1SLnJlZihudWxsKSxLPWRyKHoseCksWD1jbihFKTtyZXR1cm4gUi53YXRjaCgoKT0+WC5yZWFsUGVyY2VudCwoY2UsbWUpPT57WC5sYXN0UGVyY2VudD1tZXx8MCxzbyhYLEUsSyl9KSxSLm9uTW91bnRlZCgoKT0+e2YoKCk9PntRbigkLnZhbHVlKS50aGVuKCh7d2lkdGg6Y2V9KT0+e1gucHJvZ3Jlc3NXaWR0aD1jZXx8MCxzbyhYLEUsSyl9KX0sNTApfSksKCk9PntsZXR7c2hvd0luZm86Y2UsZm9udFNpemU6bWV9PUUse291dGVyQmFyU3R5bGU6TmUsaW5uZXJCYXJTdHlsZTpGZSxjdXJyZW50UGVyY2VudDpwZX09WDtyZXR1cm4gUi5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOnosY2xhc3M6InVuaS1wcm9ncmVzcyJ9LFtSLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6JCxzdHlsZTpOZSxjbGFzczoidW5pLXByb2dyZXNzLWJhciJ9LFtSLmNyZWF0ZVZOb2RlKCJkaXYiLHtzdHlsZTpGZSxjbGFzczoidW5pLXByb2dyZXNzLWlubmVyLWJhciJ9LG51bGwpXSksY2U/Wm4ocGUrIiUiLHtjbGFzczoidW5pLXByb2dyZXNzLWluZm8iLHN0eWxlOntmb250U2l6ZTptZX19KTpudWxsXSl9fX0pO2Z1bmN0aW9uIGNuKEUpe2xldCB4PVIucmVmKDApLHo9Ui5yZWYoMCksJD1SLmNvbXB1dGVkKCgpPT4oe2JhY2tncm91bmRDb2xvcjpFLmJhY2tncm91bmRDb2xvcixib3JkZXJSYWRpdXM6RS5ib3JkZXJSYWRpdXMsaGVpZ2h0OkUuc3Ryb2tlV2lkdGh9KSksSz1SLmNvbXB1dGVkKCgpPT57bGV0IG1lPUUuY29sb3IhPT1Uci5hY3RpdmVDb2xvciYmRS5hY3RpdmVDb2xvcj09PVRyLmFjdGl2ZUNvbG9yP0UuY29sb3I6RS5hY3RpdmVDb2xvcjtyZXR1cm57d2lkdGg6eC52YWx1ZSp6LnZhbHVlLzEwMCxoZWlnaHQ6RS5zdHJva2VXaWR0aCxiYWNrZ3JvdW5kQ29sb3I6bWUsYm9yZGVyUmFkaXVzOkUuYm9yZGVyUmFkaXVzfX0pLFg9Ui5jb21wdXRlZCgoKT0+e2xldCBtZT1wYXJzZUZsb2F0KEUucGVyY2VudCk7cmV0dXJuIG1lPDAmJihtZT0wKSxtZT4xMDAmJihtZT0xMDApLG1lfSk7cmV0dXJuIFIucmVhY3RpdmUoe291dGVyQmFyU3R5bGU6JCxpbm5lckJhclN0eWxlOksscmVhbFBlcmNlbnQ6WCxjdXJyZW50UGVyY2VudDp4LHN0cm9rZVRpbWVyOjAsbGFzdFBlcmNlbnQ6MCxwcm9ncmVzc1dpZHRoOnp9KX1mdW5jdGlvbiBzbyhFLHgseil7RS5zdHJva2VUaW1lciYmY2xlYXJJbnRlcnZhbChFLnN0cm9rZVRpbWVyKSx4LmFjdGl2ZT8oRS5jdXJyZW50UGVyY2VudD14LmFjdGl2ZU1vZGU9PT1Uci5hY3RpdmVNb2RlPzA6RS5sYXN0UGVyY2VudCxFLnN0cm9rZVRpbWVyPXNldEludGVydmFsKCgpPT57RS5jdXJyZW50UGVyY2VudCsxPkUucmVhbFBlcmNlbnQ/KEUuY3VycmVudFBlcmNlbnQ9RS5yZWFsUGVyY2VudCxFLnN0cm9rZVRpbWVyJiZjbGVhckludGVydmFsKEUuc3Ryb2tlVGltZXIpLHooImFjdGl2ZWVuZCIse30pKTpFLmN1cnJlbnRQZXJjZW50Kz0xfSxwYXJzZUZsb2F0KHguZHVyYXRpb24pKSk6RS5jdXJyZW50UGVyY2VudD1FLnJlYWxQZXJjZW50fWxldCBxcj17dmFsdWU6e3R5cGU6QXJyYXksZGVmYXVsdCgpe3JldHVybltdfSx2YWxpZGF0b3I6ZnVuY3Rpb24oRSl7cmV0dXJuIE90LmlzQXJyYXkoRSkmJkUuZmlsdGVyKHg9PnR5cGVvZiB4PT0ibnVtYmVyIikubGVuZ3RoPT09RS5sZW5ndGh9fSxpbmRpY2F0b3JTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saW5kaWNhdG9yQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0NsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sR2k9T3QuZXh0ZW5kKHt9LHFyLHtoZWlnaHQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0sbWFza1RvcFN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxtYXNrQm90dG9tU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSksTG89Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6IlBpY2tlclZpZXciLHByb3BzOkdpLGVtaXRzOlsiY2hhbmdlIiwidXBkYXRlOnZhbHVlIl0sc2V0dXAoRSx7c2xvdHM6eCxlbWl0Onp9KXtsZXQgJD1SLnJlZihudWxsKSxLPVlpKEUpLFg9ZHIoJCx6KSxjZT1bXSxtZT1GZT0+QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChjZS5maWx0ZXIocGU9PnBlLnR5cGUhPT1SLkNvbW1lbnQpLEZlKSxOZT1GZT0+Ui5jb21wdXRlZCh7Z2V0KCl7bGV0IHBlPW1lKEZlLnZub2RlKTtyZXR1cm4gSy52YWx1ZVtwZV18fDB9LHNldChwZSl7aWYoIUZlLmRhdGEuX2lzTW91bnRlZClyZXR1cm47bGV0IE1lPW1lKEZlLnZub2RlKTtpZihNZTwwKXJldHVybjtpZihLLnZhbHVlW01lXSE9PXBlKXtLLnZhbHVlW01lXT1wZTtsZXQgX3Q9Sy52YWx1ZS5tYXAoZW49PmVuKTt6KCJ1cGRhdGU6dmFsdWUiLF90KSxYKCJjaGFuZ2UiLHt2YWx1ZTpfdH0pfX19KTtyZXR1cm4gUi5wcm92aWRlKCJnZXRQaWNrZXJWaWV3Q29sdW1uIixOZSksUi5wcm92aWRlKCJwaWNrZXJWaWV3UHJvcHMiLEUpLCgpPT57bGV0IEZlPXguZGVmYXVsdCYmeC5kZWZhdWx0KCk7Y2U9R3IoRmUpO2xldCBwZT1FLmhlaWdodD97aGVpZ2h0OmAke3BhcnNlRmxvYXQoRS5oZWlnaHQpfXB4YH06e307cmV0dXJuIFIuY3JlYXRlVk5vZGUoInZpZXciLFIubWVyZ2VQcm9wcyh7cmVmOiQsY2xhc3M6InVuaS1waWNrZXItdmlldyIsc3R5bGU6cGV9LHtwcmV2ZW50R2VzdHVyZTohMH0pLFtSLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7Y2xhc3M6InVuaS1waWNrZXItdmlldy13cmFwcGVyIn0sW2NlXSldKX19LHN0eWxlczpbeyJ1bmktcGlja2VyLXZpZXciOnsiIjp7cG9zaXRpb246InJlbGF0aXZlIn19LCJ1bmktcGlja2VyLXZpZXctd3JhcHBlciI6eyIiOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJyb3ciLHBvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OjAsYm90dG9tOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9fX1dfSk7ZnVuY3Rpb24gWWkoRSl7bGV0IHg9Ui5yZWFjdGl2ZShbLi4uRS52YWx1ZV0pLHo9Ui5yZWFjdGl2ZSh7dmFsdWU6eH0pO3JldHVybiBSLndhdGNoKCgpPT5FLnZhbHVlLCQ9Pnt6LnZhbHVlLmxlbmd0aD0kLmxlbmd0aCxSLm5leHRUaWNrKCgpPT57JC5mb3JFYWNoKChLLFgpPT57SyE9PXoudmFsdWVbWF0mJnoudmFsdWUuc3BsaWNlKFgsMSxLKX0pfSl9KSx6fWxldCBQaT1iLnJlcXVpcmVNb2R1bGUoImRvbSIpLHVpPWIuY29uZmlnLmVudi5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpPT09ImFuZHJvaWQiO2Z1bmN0aW9uIGZpKEUpe3JldHVybiBPdC5leHRlbmQoe30sT3QuaXNTdHJpbmcoRSk/Q2koRSk6RSl9bGV0IGJyPXtsZW5ndGg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH19LE1yPVIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJQaWNrZXJWaWV3Q29sdW1uIixwcm9wczpicixkYXRhOigpPT4oe19pc01vdW50ZWQ6ITF9KSxzZXR1cChFLHtzbG90czp4fSl7bGV0IHo9Ui5nZXRDdXJyZW50SW5zdGFuY2UoKSwkPVIucmVmKG51bGwpLEs9Ui5yZWYobnVsbCksWD1SLnJlZihudWxsKSxjZT1SLnJlZihudWxsKSxtZT1SLmluamVjdCgicGlja2VyVmlld1Byb3BzIiksRmU9Ui5pbmplY3QoImdldFBpY2tlclZpZXdDb2x1bW4iKSh6KSxwZT1SLmNvbXB1dGVkKCgpPT5maShtZS5pbmRpY2F0b3JTdHlsZSkpLE1lPVIuY29tcHV0ZWQoKCk9PmZpKG1lLm1hc2tUb3BTdHlsZSkpLHV0PVIuY29tcHV0ZWQoKCk9PmZpKG1lLm1hc2tCb3R0b21TdHlsZSkpLF90PVIucmVmKDApO190LnZhbHVlPWxvKHBlLnZhbHVlKTtsZXQgZW49Ui5yZWYoMCk7ZW4udmFsdWU9cGFyc2VGbG9hdChtZS5oZWlnaHQpO2xldHtzZXRDdXJyZW50OmJ0LG9uU2Nyb2xsZW5kOnFlfT10aShFLEZlLEssX3QpLE10PSgpPT57bGV0IGtuLEF0O2YoKCk9PntQcm9taXNlLmFsbChbUW4oJC52YWx1ZSkudGhlbigoe2hlaWdodDpybn0pPT57a249ZW4udmFsdWU9cm59KSx1aSYmRS5sZW5ndGg/UW4oWC52YWx1ZSkudGhlbigoe2hlaWdodDpybn0pPT57QXQ9X3QudmFsdWU9cm4vcGFyc2VGbG9hdChFLmxlbmd0aCl9KTpRbihjZS52YWx1ZSkudGhlbigoe2hlaWdodDpybn0pPT57QXQ9X3QudmFsdWU9cm59KV0pLnRoZW4oKCk9PntrbiYmQXQ/ZigoKT0+e3ouZGF0YS5faXNNb3VudGVkPSEwLGJ0KEZlLnZhbHVlLCExLCEwKX0sNTApOk10KCl9KX0sNTApfTtSLm9uTW91bnRlZChNdCk7bGV0IGRuPWtuPT5rbj91aT9SLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6WCxzdHlsZToiZmxleC1kaXJlY3Rpb246Y29sdW1uOyJ9LFtrbl0pOmtuOm51bGw7cmV0dXJuKCk9PntsZXQga249eC5kZWZhdWx0JiZ4LmRlZmF1bHQoKSxBdD0oZW4udmFsdWUtX3QudmFsdWUpLzIscm49YCR7ZW4udmFsdWUtQXR9cHhgLFNuPXtzaG93U2Nyb2xsYmFyOiExLHNjcm9sbFRvQmVnaW46ITEsZGVjZWxlcmF0aW9uUmF0ZTouMyxzY3JvbGxZOiEwfTtyZXR1cm4gdWl8fChTbi5zY3JvbGxUb3A9RmUudmFsdWUqX3QudmFsdWUpLFIuY3JlYXRlVk5vZGUoInZpZXciLHtyZWY6JCxjbGFzczoidW5pLXBpY2tlci12aWV3LWNvbHVtbiJ9LFtSLmNyZWF0ZVZOb2RlKCJzY3JvbGwtdmlldyIsUi5tZXJnZVByb3BzKHtjbGFzczoidW5pLXBpY2tlci12aWV3LWdyb3VwIixzdHlsZToiZmxleC1kaXJlY3Rpb246Y29sdW1uOyIsb25TY3JvbGxlbmQ6cWV9LFNuKSxbUi5jcmVhdGVWTm9kZSgidmlldyIse3JlZjpLLGNsYXNzOiJ1bmktcGlja2VyLXZpZXctY29udGVudCIsc3R5bGU6e3BhZGRpbmdUb3A6YCR7QXR9cHhgLHBhZGRpbmdCb3R0b206YCR7QXR9cHhgfX0sW2RuKGtuKV0pXSksUi5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctbWFzayJ9LFtSLmNyZWF0ZVZOb2RlKCJ1LXNjYWxhYmxlIix7Y2xhc3M6InVuaS1waWNrZXItdmlldy1tYXNrIHVuaS1waWNrZXItdmlldy1tYXNrLXRvcCIsc3R5bGU6T3QuZXh0ZW5kKHt9LE1lLnZhbHVlLHtib3R0b206cm59KX0sbnVsbCksUi5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse2NsYXNzOiJ1bmktcGlja2VyLXZpZXctbWFzayB1bmktcGlja2VyLXZpZXctbWFzay1ib3R0b20iLHN0eWxlOk90LmV4dGVuZCh7fSx1dC52YWx1ZSx7dG9wOnJufSl9LG51bGwpXSksUi5jcmVhdGVWTm9kZSgidS1zY2FsYWJsZSIse3JlZjpjZSxjbGFzczoidW5pLXBpY2tlci12aWV3LWluZGljYXRvciIsc3R5bGU6T3QuZXh0ZW5kKHt9LHBlLnZhbHVlLHt0b3A6YCR7QXR9cHhgfSl9LG51bGwpXSl9fSxzdHlsZXM6W3sidW5pLXBpY2tlci12aWV3LWNvbHVtbiI6eyIiOntmbGV4OjEscG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJzdHJldGNoIixvdmVyZmxvdzoiaGlkZGVuIn19LCJ1bmktcGlja2VyLXZpZXctbWFzayI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLHBvaW50ZXJFdmVudHM6Im5vbmUifX0sInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCI6eyIiOntib3R0b206MCxiYWNrZ3JvdW5kSW1hZ2U6ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20scmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikpIn19LCJ1bmktcGlja2VyLXZpZXctbWFzay1ib3R0b20iOnsiIjp7dG9wOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gdG9wLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9fSwidW5pLXBpY2tlci12aWV3LWdyb3VwIjp7IiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OjAsYm90dG9tOjB9fSwidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiOnsiIjp7ZmxleERpcmVjdGlvbjoiY29sdW1uIixwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9fSwidW5pLXBpY2tlci12aWV3LWluZGljYXRvciI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLHRvcDowLGhlaWdodDoiMzRweCIscG9pbnRlckV2ZW50czoibm9uZSIsYm9yZGVyQ29sb3I6IiNlNWU1ZTUiLGJvcmRlclRvcFdpZHRoOiIxcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIxcHgifX19XX0pO2Z1bmN0aW9uIGxvKEUpe2xldCB6PShFLmhlaWdodHx8RS5saW5lSGVpZ2h0fHwiIikubWF0Y2goLygtP1tcZFwuXSspcHgvKSwkPTA7cmV0dXJuIHomJigkPXBhcnNlRmxvYXQoelsxXSkpLCR9ZnVuY3Rpb24gdGkoRSx4LHosJCl7bGV0IEs7ZnVuY3Rpb24gWChOZSxGZT0hMCl7UGkuc2Nyb2xsVG9FbGVtZW50KHoudmFsdWUse29mZnNldDpOZSokLnZhbHVlLGFuaW1hdGVkOkZlfSksRmUmJihLPURhdGUubm93KCkpfVIud2F0Y2goKCk9PkUubGVuZ3RoLCgpPT57ZigoKT0+e2NlKHgudmFsdWUsITAsITApfSwxNTApfSksUi53YXRjaCh4LE5lPT5YKE5lKSk7bGV0IGNlPShOZSxGZT0hMCxwZSk9Pnt4LnZhbHVlPT09TmUmJiFwZXx8KHgudmFsdWU9TmUsdWkmJlgoTmUsRmUpKX07cmV0dXJue3NldEN1cnJlbnQ6Y2Usb25TY3JvbGxlbmQ6TmU9PntpZihEYXRlLm5vdygpLUs8MzQwKXJldHVybjtsZXQgRmU9TmUuZGV0YWlsLmNvbnRlbnRPZmZzZXQueSxwZT1NYXRoLnJvdW5kKEZlLyQudmFsdWUpO0ZlJSQudmFsdWU/Y2UocGUsITAsITApOngudmFsdWU9cGV9fX1sZXQgcG49e1NFTEVDVE9SOiJzZWxlY3RvciIsTVVMVElTRUxFQ1RPUjoibXVsdGlTZWxlY3RvciIsVElNRToidGltZSIsREFURToiZGF0ZSJ9LHlyPXtZRUFSOiJ5ZWFyIixNT05USDoibW9udGgiLERBWToiZGF5In07ZnVuY3Rpb24gcWkoRSl7cmV0dXJuIEU+OT9FOmAwJHtFfWB9ZnVuY3Rpb24gUG4oRSx4KXtFPVN0cmluZyhFfHwiIik7bGV0IHo9bmV3IERhdGU7aWYoeD09PXBuLlRJTUUpe2xldCAkPUUuc3BsaXQoIjoiKTskLmxlbmd0aD09PTImJnouc2V0SG91cnMocGFyc2VJbnQoJFswXSkscGFyc2VJbnQoJFsxXSkpfWVsc2V7bGV0ICQ9RS5zcGxpdCgiLSIpOyQubGVuZ3RoPT09MyYmei5zZXRGdWxsWWVhcihwYXJzZUludCgkWzBdKSxwYXJzZUludChTdHJpbmcocGFyc2VGbG9hdCgkWzFdKS0xKSkscGFyc2VJbnQoJFsyXSkpfXJldHVybiB6fWZ1bmN0aW9uIF9pKEUpe2lmKEUubW9kZT09PXBuLlRJTUUpcmV0dXJuIjAwOjAwIjtpZihFLm1vZGU9PT1wbi5EQVRFKXtsZXQgeD1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCktMTAwO3N3aXRjaChFLmZpZWxkcyl7Y2FzZSB5ci5ZRUFSOnJldHVybiB4O2Nhc2UgeXIuTU9OVEg6cmV0dXJuIHgrIi0wMSI7ZGVmYXVsdDpyZXR1cm4geCsiLTAxLTAxIn19cmV0dXJuIiJ9ZnVuY3Rpb24gRm8oRSl7aWYoRS5tb2RlPT09cG4uVElNRSlyZXR1cm4iMjM6NTkiO2lmKEUubW9kZT09PXBuLkRBVEUpe2xldCB4PW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSsxMDA7c3dpdGNoKEUuZmllbGRzKXtjYXNlIHlyLllFQVI6cmV0dXJuIHg7Y2FzZSB5ci5NT05USDpyZXR1cm4geCsiLTEyIjtkZWZhdWx0OnJldHVybiB4KyItMTItMzEifX1yZXR1cm4iIn1sZXQgdGE9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHJhbmdlOnt0eXBlOkFycmF5LGRlZmF1bHQoKXtyZXR1cm5bXX19LHJhbmdlS2V5Ont0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx2YWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZyxBcnJheV0sZGVmYXVsdDowfSxtb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0OnBuLlNFTEVDVE9SLHZhbGlkYXRvcihFKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhwbikuaW5kZXhPZihFKT49MH19LGZpZWxkczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc3RhcnQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6X2l9LGVuZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpGb30sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfX0sTm49Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6IlBpY2tlciIscHJvcHM6dGEsZW1pdHM6WyJjaGFuZ2UiLCJjYW5jZWwiLCJjb2x1bW5jaGFuZ2UiXSxzZXR1cChFLHtzbG90czp4LGVtaXQ6en0pe2xldCAkPVIucmVmKG51bGwpLEs9ZHIoJCx6KSxYPVIucmVmKG51bGwpLGNlPVIucmVmKG51bGwpLG1lPSgpPT57bGV0IGJ0PUUudmFsdWU7c3dpdGNoKEUubW9kZSl7Y2FzZSBwbi5NVUxUSVNFTEVDVE9SOntPdC5pc0FycmF5KGJ0KXx8KGJ0PVtdKSxPdC5pc0FycmF5KFgudmFsdWUpfHwoWC52YWx1ZT1bXSk7bGV0IHFlPVgudmFsdWUubGVuZ3RoPU1hdGgubWF4KGJ0Lmxlbmd0aCxFLnJhbmdlLmxlbmd0aCk7Zm9yKGxldCBNdD0wO010PHFlO010Kyspe2xldCBkbj1OdW1iZXIoYnRbTXRdKSxrbj1OdW1iZXIoWC52YWx1ZVtNdF0pLEF0PWlzTmFOKGRuKT9pc05hTihrbik/MDprbjpkbjtYLnZhbHVlLnNwbGljZShNdCwxLEF0PDA/MDpBdCl9fWJyZWFrO2Nhc2UgcG4uVElNRTpjYXNlIHBuLkRBVEU6WC52YWx1ZT1TdHJpbmcoYnQpO2JyZWFrO2RlZmF1bHQ6e2xldCBxZT1OdW1iZXIoYnQpO1gudmFsdWU9cWU8MD8wOnFlO2JyZWFrfX19LE5lPWJ0PT57Y2UudmFsdWUmJmNlLnZhbHVlLnNlbmRNZXNzYWdlKGJ0KX0sRmU9YnQ9PntsZXQgcWU9e2V2ZW50OiJjYW5jZWwifTtjZS52YWx1ZT1nbih7dXJsOiJfX3VuaWFwcHBpY2tlciIsZGF0YTpidCxzdHlsZTp7dGl0bGVOVmlldzohMSxhbmltYXRpb25UeXBlOiJub25lIixhbmltYXRpb25EdXJhdGlvbjowLGJhY2tncm91bmQ6InJnYmEoMCwwLDAsMCkiLHBvcEdlc3R1cmU6Im5vbmUifSxvbk1lc3NhZ2U6TXQ9PntsZXQgZG49TXQuZXZlbnQ7aWYoZG49PT0iY3JlYXRlZCIpe05lKGJ0KTtyZXR1cm59aWYoZG49PT0iY29sdW1uY2hhbmdlIil7ZGVsZXRlIE10LmV2ZW50LEsoZG4sTXQpO3JldHVybn1xZT1NdH0sb25DbG9zZTooKT0+e2NlLnZhbHVlPW51bGw7bGV0IE10PXFlLmV2ZW50O2RlbGV0ZSBxZS5ldmVudCxNdCYmSyhNdCxxZSl9fSl9LHBlPWJ0PT57Zy5uYXRpdmVVSVtFLm1vZGU9PT1wbi5USU1FPyJwaWNrVGltZSI6InBpY2tEYXRlIl0ocWU9PntsZXQgTXQ9cWUuZGF0ZTtLKCJjaGFuZ2UiLHt2YWx1ZTpFLm1vZGU9PT1wbi5USU1FP2Ake3FpKE10LmdldEhvdXJzKCkpfToke3FpKE10LmdldE1pbnV0ZXMoKSl9YDpgJHtNdC5nZXRGdWxsWWVhcigpfS0ke3FpKE10LmdldE1vbnRoKCkrMSl9LSR7cWkoTXQuZ2V0RGF0ZSgpKX1gfSl9LCgpPT57SygiY2FuY2VsIix7fSl9LEUubW9kZT09PXBuLlRJTUU/e3RpbWU6UG4oRS52YWx1ZSxwbi5USU1FKX06e2RhdGU6UG4oRS52YWx1ZSxwbi5EQVRFKSxtaW5EYXRlOlBuKEUuc3RhcnQscG4uREFURSksbWF4RGF0ZTpQbihFLmVuZCxwbi5EQVRFKX0pfSxNZT1idD0+eyhidC5tb2RlPT09cG4uVElNRXx8YnQubW9kZT09PXBuLkRBVEUpJiYhYnQuZmllbGRzP3BlKCk6KGJ0LmZpZWxkcz1PYmplY3QudmFsdWVzKHlyKS5pbmNsdWRlcyhidC5maWVsZHMpP2J0LmZpZWxkczp5ci5EQVksRmUoYnQpKX0sdXQ9YnQ9PntFLmRpc2FibGVkfHxNZShPdC5leHRlbmQoe30sRSx7dmFsdWU6WC52YWx1ZSxsb2NhbGU6ZC5nZXRMb2NhbGUoKX0pKX0sX3Q9Ui5pbmplY3QobXIsITEpLGVuPXtzdWJtaXQ6KCk9PltFLm5hbWUsWC52YWx1ZV0scmVzZXQ6KCk9Pntzd2l0Y2goRS5tb2RlKXtjYXNlIHBuLlNFTEVDVE9SOlgudmFsdWU9MDticmVhaztjYXNlIHBuLk1VTFRJU0VMRUNUT1I6T3QuaXNBcnJheShFLnZhbHVlKSYmKFgudmFsdWU9RS52YWx1ZS5tYXAoYnQ9PjApKTticmVhaztjYXNlIHBuLkRBVEU6Y2FzZSBwbi5USU1FOlgudmFsdWU9IiI7YnJlYWt9fX07cmV0dXJuIF90JiYoX3QuYWRkRmllbGQoZW4pLFIub25CZWZvcmVVbm1vdW50KCgpPT5fdC5yZW1vdmVGaWVsZChlbikpKSxPYmplY3Qua2V5cyhFKS5mb3JFYWNoKGJ0PT57Ui53YXRjaCgoKT0+RVtidF0scWU9PntsZXQgTXQ9e307TXRbYnRdPXFlLE5lKE10KX0se2RlZXA6ITB9KX0pLFIud2F0Y2goKCk9PkUudmFsdWUsbWUse2RlZXA6ITB9KSxtZSgpLCgpPT5SLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOiQsb25DbGljazp1dH0sW3guZGVmYXVsdCYmeC5kZWZhdWx0KCldKX19KSxFcj17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxzcj1beyJ1bmktc2xpZGVyIjp7IiI6e2ZsZXg6MSxmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sInVuaS1zbGlkZXItd3JhcHBlciI6eyIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLGFsaWduSXRlbXM6ImNlbnRlciJ9fSwidW5pLXNsaWRlci10YXAtYXJlYSI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIscGFkZGluZ1RvcDoiMTQiLHBhZGRpbmdCb3R0b206IjE0In19LCJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIjp7IiI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLGJhY2tncm91bmRDb2xvcjoiI2U5ZTllOSIsaGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjUiLG1hcmdpblJpZ2h0OiIxNCIsbWFyZ2luTGVmdDoiMTQifX0sInVuaS1zbGlkZXItdHJhY2siOnsiIjp7aGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjYiLGJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiJ9fSwidW5pLXNsaWRlci10aHVtYiI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiMSIsd2lkdGg6IjI4IixoZWlnaHQ6IjI4Iixib3JkZXJSYWRpdXM6NTAsYm94U2hhZG93OiIwIDAgNHB4ICNlYmViZWIifX0sInVuaS1zbGlkZXItdmFsdWUiOnsiIjp7Y29sb3I6IiM4ODg4ODgiLGZvbnRTaXplOiIxNiIsd2lkdGg6IjMwIn19fV0sTHI9Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6IlVTbGlkZXIiLHByb3BzOkVyLHN0eWxlczpzcixzZXR1cChFLHtlbWl0Onh9KXtsZXQgej1SLnJlZihudWxsKSwkPVIucmVmKG51bGwpLEs9ZHIoeix4KSxYPVNyKEUpLGNlPWJpKEUsWCxLKTtyZXR1cm4gU28oRSxYKSxSLndhdGNoKCgpPT5FLnZhbHVlLG1lPT57WC5zbGlkZXJWYWx1ZT1OdW1iZXIobWUpfSksUi5vbk1vdW50ZWQoKCk9PntmKCgpPT57UW4oJC52YWx1ZSkudGhlbigoe3dpZHRoOm1lLGxlZnQ6TmV9KT0+e1guc2xpZGVyTGVmdD1OZSxYLnNsaWRlcldpZHRoPW1lfHwwLFguc2xpZGVyVmFsdWU9TnVtYmVyKEUudmFsdWUpfSl9LDEwMCl9KSwoKT0+e2xldHtzaG93VmFsdWU6bWV9PUUse3RyYWNrVGFwU3R5bGU6TmUsdHJhY2tTdHlsZTpGZSx0cmFja0FjdGl2ZVN0eWxlOnBlLHRodW1iU3R5bGU6TWUsc2xpZGVyVmFsdWU6dXR9PVg7cmV0dXJuIFIuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyIixyZWY6en0sW1IuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc2xpZGVyLXdyYXBwZXIifSxbUi5jcmVhdGVWTm9kZSgiZGl2IixSLm1lcmdlUHJvcHMoe2NsYXNzOiJ1bmktc2xpZGVyLXRhcC1hcmVhIixzdHlsZTpOZX0sY2UpLFtSLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci1oYW5kbGUtd3JhcHBlciIsc3R5bGU6RmUscmVmOiR9LFtSLmNyZWF0ZVZOb2RlKCJkaXYiLHtjbGFzczoidW5pLXNsaWRlci10cmFjayIsc3R5bGU6cGV9LG51bGwpXSksUi5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6InVuaS1zbGlkZXItdGh1bWIiLHN0eWxlOk1lfSxudWxsKV0pLG1lP1puKHV0KyIiLHtjbGFzczoidW5pLXNsaWRlci12YWx1ZSJ9KTpudWxsXSldKX19fSk7ZnVuY3Rpb24gU3IoRSl7bGV0IHg9Ui5yZWYoMCksej1SLnJlZigwKSwkPVIucmVmKDApLEs9KCk9PkUuYmFja2dyb3VuZENvbG9yIT09IiNlOWU5ZTkiP0UuYmFja2dyb3VuZENvbG9yOkUuY29sb3IhPT0iIzAwN2FmZiI/RS5jb2xvcjoiIzAwN2FmZiIsWD0oKT0+RS5hY3RpdmVDb2xvciE9PSIjMDA3YWZmIj9FLmFjdGl2ZUNvbG9yOkUuc2VsZWN0ZWRDb2xvciE9PSIjZTllOWU5Ij9FLnNlbGVjdGVkQ29sb3I6IiNlOWU5ZTkiLGNlPSgpPT57bGV0IEZlPU51bWJlcihFLm1heCkscGU9TnVtYmVyKEUubWluKTtyZXR1cm4oJC52YWx1ZS1wZSkvKEZlLXBlKSp6LnZhbHVlfSxtZT1OdW1iZXIoRS5ibG9ja1NpemUpLzI7cmV0dXJuIFIucmVhY3RpdmUoe3NsaWRlckxlZnQ6eCxzbGlkZXJXaWR0aDp6LHNsaWRlclZhbHVlOiQsc2xpZGVyVGh1bWJPZmZzZXQ6bWUsdHJhY2tUYXBTdHlsZTpSLmNvbXB1dGVkKCgpPT4oe3BhZGRpbmdUb3A6bWUscGFkZGluZ0JvdHRvbTptZX0pKSx0cmFja1N0eWxlOlIuY29tcHV0ZWQoKCk9Pih7YmFja2dyb3VuZENvbG9yOksoKSxtYXJnaW5MZWZ0Om1lLG1hcmdpblJpZ2h0Om1lfSkpLHRyYWNrQWN0aXZlU3R5bGU6Ui5jb21wdXRlZCgoKT0+KHtiYWNrZ3JvdW5kQ29sb3I6WCgpLHdpZHRoOmNlKCl9KSksdGh1bWJTdHlsZTpSLmNvbXB1dGVkKCgpPT4oe3dpZHRoOkUuYmxvY2tTaXplLGhlaWdodDpFLmJsb2NrU2l6ZSxiYWNrZ3JvdW5kQ29sb3I6RS5ibG9ja0NvbG9yLGxlZnQ6Y2UoKX0pKX0pfWZ1bmN0aW9uIGJpKEUseCx6KXtsZXQgJD1udWxsO2Z1bmN0aW9uIEsobWUsTmUpe0UuZGlzYWJsZWR8fChtZT09PSJtb3ZlIj8oWChOZSkseigiY2hhbmdpbmciLHt2YWx1ZTp4LnNsaWRlclZhbHVlfSkpOm1lPT09ImVuZCImJihYKE5lKSx6KCJjaGFuZ2UiLHt2YWx1ZTp4LnNsaWRlclZhbHVlfSkpKX1mdW5jdGlvbiBYKG1lKXttZS09eC5zbGlkZXJUaHVtYk9mZnNldCxtZTwwJiYobWU9MCksbWU+eC5zbGlkZXJXaWR0aCYmKG1lPXguc2xpZGVyV2lkdGgpO2xldCBOZT1OdW1iZXIoRS5tYXgpLEZlPU51bWJlcihFLm1pbikscGU9TnVtYmVyKEUuc3RlcCksTWU9bWUveC5zbGlkZXJXaWR0aCooTmUtRmUpO3BlPjAmJk1lPnBlJiZNZSVwZS9wZSE9PTA/TWUtPU1lJXBlOk1lPXBhcnNlSW50KE1lKyIiKSx4LnNsaWRlclZhbHVlPU1lK0ZlfXJldHVybntvblRvdWNoc3RhcnQobWUpe21lLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PTEmJiEkJiYoJD1tZSxLKCJzdGFydCIsbWUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgpKX0sb25Ub3VjaG1vdmUobWUpe21lLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PTEmJiQmJksoIm1vdmUiLG1lLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYKX0sb25Ub3VjaGVuZChtZSl7bWUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPT09MSYmJCYmKCQ9bnVsbCxLKCJlbmQiLG1lLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYKSl9fX1mdW5jdGlvbiBTbyhFLHgpe2xldCB6PVIuaW5qZWN0KG1yLCExKSwkPXtzdWJtaXQ6KCk9PntsZXQgSz1bIiIsbnVsbF07cmV0dXJuIEUubmFtZSYmKEtbMF09RS5uYW1lLEtbMV09eC5zbGlkZXJWYWx1ZSksS30scmVzZXQ6KCk9Pnt4LnNsaWRlclZhbHVlPU51bWJlcihFLnZhbHVlKX19O3omJih6LmFkZEZpZWxkKCQpLFIub25Vbm1vdW50ZWQoKCk9Pnt6LnJlbW92ZUZpZWxkKCQpfSkpfWxldCBOaT17bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6InN3aXRjaCJ9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn19LGtpPXtzd2l0Y2g6InN3aXRjaCIsY2hlY2tib3g6ImNoZWNrYm94In0sY289e3dpZHRoOjUyLGhlaWdodDozMn0sTT1SLmRlZmluZUNvbXBvbmVudCh7bmFtZToiU3dpdGNoIixwcm9wczpOaSxlbWl0czpbImNoYW5nZSJdLHNldHVwKEUse2VtaXQ6eH0pe2xldCB6PVIucmVmKG51bGwpLCQ9Ui5yZWYoRS5jaGVja2VkKSxLPVcoRSwkKSxYPWRyKHoseCk7Ui53YXRjaCgoKT0+RS5jaGVja2VkLG1lPT57JC52YWx1ZT1tZX0pO2xldCBjZT0obWUsTmUpPT57RS5kaXNhYmxlZHx8KCQudmFsdWU9bWUuZGV0YWlsP21lLmRldGFpbC52YWx1ZTohJC52YWx1ZSxYKCJjaGFuZ2UiLHt2YWx1ZTokLnZhbHVlfSkpfTtyZXR1cm4gSyYmKEsuYWRkSGFuZGxlcihjZSksUi5vbkJlZm9yZVVubW91bnQoKCk9PntLLnJlbW92ZUhhbmRsZXIoY2UpfSkpLHZpKEUseyJsYWJlbC1jbGljayI6Y2V9KSwoKT0+e2xldHtjb2xvcjptZSx0eXBlOk5lLGRpc2FibGVkOkZlfT1FO3JldHVybiBSLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6en0sW05lPT09a2kuc3dpdGNoP1IuY3JlYXRlVk5vZGUoImRjLXN3aXRjaCIsUi5tZXJnZVByb3BzKHtkYXRhVW5jVHlwZToidW5pLXN3aXRjaCJ9LHtvbkNoYW5nZTpjZX0se2NoZWNrZWQ6JC52YWx1ZSxjb2xvcjptZSxkaXNhYmxlZDpGZX0se3N0eWxlOmNvfSksbnVsbCk6bnVsbCxOZT09PWtpLmNoZWNrYm94P1IuY3JlYXRlVk5vZGUoUi5yZXNvbHZlQ29tcG9uZW50KCJjaGVja2JveCIpLFIubWVyZ2VQcm9wcyh7c3R5bGU6e2NvbG9yOm1lfX0se2NoZWNrZWQ6JC52YWx1ZSxkaXNhYmxlZDpGZX0se29uQ2xpY2s6Y2V9KSxudWxsKTpudWxsXSl9fX0pO2Z1bmN0aW9uIFcoRSx4KXtsZXQgej1SLmluamVjdChtciwhMSksJD1SLmluamVjdCgkbiwhMSksSz17c3VibWl0OigpPT57bGV0IFg9WyIiLG51bGxdO3JldHVybiBFLm5hbWUmJihYWzBdPUUubmFtZSxYWzFdPXgudmFsdWUpLFh9LHJlc2V0OigpPT57eC52YWx1ZT0hMX19O3JldHVybiB6JiYoei5hZGRGaWVsZChLKSxSLm9uVW5tb3VudGVkKCgpPT57ei5yZW1vdmVGaWVsZChLKX0pKSwkfWxldCBsZT17Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSwkZT1FbigidWNnIiksemU9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxhdD1beyJ1bmktY2hlY2tib3giOnsiIjp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifX0sInVuaS1jaGVja2JveC1pbnB1dCI6eyIiOntqdXN0aWZ5Q29udGVudDoiY2VudGVyIixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJTdHlsZToic29saWQiLGJhY2tncm91bmRDb2xvcjoiI2ZmZmZmZiIsYm9yZGVyUmFkaXVzOiIzIix3aWR0aDoiMjIiLGhlaWdodDoiMjIifX0sInVuaS1pY29uIjp7IiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjIiLG1hcmdpblRvcDoiMiIsY29sb3I6IiMwMDdhZmYifX0sInVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEifX0sInVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZC1iZWZvcmUiOnsiIjp7Y29sb3I6IiNhZGFkYWQifX0sInVuaS1jaGVja2JveC1zbG90Ijp7IiI6e2ZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiNSJ9fX1dLFF0PVIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJDaGVja2JveCIscHJvcHM6bGUsc3R5bGVzOmF0LHNldHVwKEUse3Nsb3RzOnh9KXtsZXQgej1SLnJlZihudWxsKSwkPVIucmVmKEUuY2hlY2tlZCksSz1SLnJlZihFLnZhbHVlKSxYPVIuY29tcHV0ZWQoKCk9PkUuZGlzYWJsZWQ/IiNhZGFkYWQiOkUuY29sb3IpLGNlPSgpPT57JC52YWx1ZT0hMX0sbWU9KE1lLHV0KT0+e0UuZGlzYWJsZWR8fCgkLnZhbHVlPSEkLnZhbHVlLE5lJiZOZS5jaGVja2JveENoYW5nZShNZSkpfSx7dW5pQ2hlY2tHcm91cDpOZSx1bmlMYWJlbDpGZX09SnQoJCxLLGNlKTtGZSYmKEZlLmFkZEhhbmRsZXIobWUpLFIub25CZWZvcmVVbm1vdW50KCgpPT57RmUucmVtb3ZlSGFuZGxlcihtZSl9KSksdmkoRSx7ImxhYmVsLWNsaWNrIjptZX0pLFIud2F0Y2goWygpPT5FLmNoZWNrZWQsKCk9PkUudmFsdWVdLChbTWUsdXRdKT0+eyQudmFsdWU9TWUsSy52YWx1ZT11dH0pO2xldCBwZT0oKT0+e2lmKCF4LmRlZmF1bHQpcmV0dXJuW107bGV0IE1lPXguZGVmYXVsdCgpO3JldHVybiBNZS5sZW5ndGg9PT0xJiZNZVswXS50eXBlPT09VGV4dD9bWm4oTWVbMF0uY2hpbGRyZW4se2NsYXNzOiJ1bmktY2hlY2tib3gtc2xvdCJ9KV06TWV9O3JldHVybigpPT5SLmNyZWF0ZVZOb2RlKCJkaXYiLFIubWVyZ2VQcm9wcyh7cmVmOnp9LHtkYXRhVW5jVHlwZToidW5pLWNoZWNrYm94In0se29uQ2xpY2s6bWUsY2xhc3M6InVuaS1jaGVja2JveCJ9KSxbUi5jcmVhdGVWTm9kZSgiZGl2Iix7Y2xhc3M6WyJ1bmktY2hlY2tib3gtaW5wdXQiLHsidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkIjpFLmRpc2FibGVkfV19LFskLnZhbHVlP1puKCJcdUVBMDgiLHtjbGFzczoidW5pLWljb24iLHN0eWxlOntjb2xvcjpYLnZhbHVlfX0pOm51bGxdKSwuLi5wZSgpXSl9fSk7ZnVuY3Rpb24gSnQoRSx4LHope2xldCAkPVIuY29tcHV0ZWQoKCk9Pih7Y2hlY2tib3hDaGVja2VkOkJvb2xlYW4oRS52YWx1ZSksdmFsdWU6eC52YWx1ZX0pKSxLPXtyZXNldDp6fSxYPVIuaW5qZWN0KCRlLCExKTtYJiZYLmFkZEZpZWxkKCQpO2xldCBjZT1SLmluamVjdChtciwhMSk7Y2UmJmNlLmFkZEZpZWxkKEspO2xldCBtZT1SLmluamVjdCgkbiwhMSk7cmV0dXJuIFIub25CZWZvcmVVbm1vdW50KCgpPT57WCYmWC5yZW1vdmVGaWVsZCgkKSxjZSYmY2UucmVtb3ZlRmllbGQoSyl9KSx7dW5pQ2hlY2tHcm91cDpYLHVuaUZvcm06Y2UsdW5pTGFiZWw6bWV9fWxldCBPcj1SLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQ2hlY2tib3hHcm91cCIscHJvcHM6emUsZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cChFLHtzbG90czp4LGVtaXQ6en0pe2xldCAkPVIucmVmKG51bGwpLEs9ZHIoJCx6KTtyZXR1cm4gSWkoRSxLKSwoKT0+Ui5jcmVhdGVWTm9kZSgiZGl2Iix7cmVmOiQsY2xhc3M6InVuaS1jaGVja2JveC1ncm91cCJ9LFt4LmRlZmF1bHQmJnguZGVmYXVsdCgpXSl9fSk7ZnVuY3Rpb24gSWkoRSx4KXtsZXQgej1bXSwkPSgpPT56LnJlZHVjZSgoWCxjZSk9PihjZS52YWx1ZS5jaGVja2JveENoZWNrZWQmJlgucHVzaChjZS52YWx1ZS52YWx1ZSksWCksbmV3IEFycmF5KTtSLnByb3ZpZGUoJGUse2FkZEZpZWxkKFgpe3oucHVzaChYKX0scmVtb3ZlRmllbGQoWCl7ei5zcGxpY2Uoei5pbmRleE9mKFgpLDEpfSxjaGVja2JveENoYW5nZShYKXt4KCJjaGFuZ2UiLHt2YWx1ZTokKCl9KX19KTtsZXQgSz1SLmluamVjdChtciwhMSk7cmV0dXJuIEsmJksuYWRkRmllbGQoe3N1Ym1pdDooKT0+e2xldCBYPVsiIixudWxsXTtyZXR1cm4gRS5uYW1lIT09IiImJihYWzBdPUUubmFtZSxYWzFdPSQoKSksWH19KSwkfWxldCBocj17Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxQcj1FbigidWNnIiksUmk9e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxFdD1beyJ1bmktcmFkaW8iOnsiIjp7YWxpZ25JdGVtczoiY2VudGVyIixmbGV4RGlyZWN0aW9uOiJyb3cifX0sInVuaS1yYWRpby1pbnB1dCI6eyIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsbWFyZ2luUmlnaHQ6IjUiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJSYWRpdXM6NTAsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIixvdXRsaW5lOjB9fSwidW5pLXJhZGlvLWlucHV0LWljb24iOnsiIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNCIsY29sb3I6IiNmZmZmZmYifX0sInVuaS1yYWRpby1pbnB1dC1kaXNhYmxlZCI6eyIiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixjb2xvcjoiI2FkYWRhZCJ9fSwidW5pLXJhZGlvLXNsb3QiOnsiIjp7Zm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiI1In19fV0sRHQ9Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6IlJhZGlvIixwcm9wczpocixzdHlsZXM6RXQsZW1pdHM6WyJjaGFuZ2UiXSxzZXR1cChFLHtzbG90czp4fSl7bGV0IHo9Ui5yZWYobnVsbCksJD1SLnJlZihFLmNoZWNrZWQpLEs9Ui5yZWYoRS52YWx1ZSksWD1SLmNvbXB1dGVkKCgpPT57bGV0IHV0PUUuZGlzYWJsZWQ/IiNhZGFkYWQiOkUuY29sb3I7cmV0dXJuICQudmFsdWU/e2JhY2tncm91bmRDb2xvcjp1dCxib3JkZXJDb2xvcjp1dH06e2JvcmRlckNvbG9yOiIjZDFkMWQxIn19KSxjZT0oKT0+eyQudmFsdWU9ITF9LHt1bmlDaGVja0dyb3VwOm1lLHVuaUxhYmVsOk5lLGZpZWxkOkZlfT1uaSgkLEssY2UpLHBlPSh1dCxfdCk9PntFLmRpc2FibGVkfHwkLnZhbHVlfHwoJC52YWx1ZT0hJC52YWx1ZSxtZSYmbWUucmFkaW9DaGFuZ2UodXQsRmUpKX07TmUmJihOZS5hZGRIYW5kbGVyKHBlKSxSLm9uQmVmb3JlVW5tb3VudCgoKT0+e05lLnJlbW92ZUhhbmRsZXIocGUpfSkpLHZpKEUseyJsYWJlbC1jbGljayI6cGV9KSxSLndhdGNoKFsoKT0+RS5jaGVja2VkLCgpPT5FLnZhbHVlXSwoW3V0LF90XSk9PnskLnZhbHVlPXV0LEsudmFsdWU9X3R9KTtsZXQgTWU9KCk9PntpZigheC5kZWZhdWx0KXJldHVybltdO2xldCB1dD14LmRlZmF1bHQoKTtyZXR1cm4gdXQubGVuZ3RoPT09MSYmdXRbMF0udHlwZT09PVRleHQ/W1puKHV0WzBdLmNoaWxkcmVuLHtjbGFzczoidW5pLXJhZGlvLXNsb3QifSldOnV0fTtyZXR1cm4oKT0+e2xldHtkaXNhYmxlZDp1dH09RTtyZXR1cm4gUi5jcmVhdGVWTm9kZSgiZGl2IixSLm1lcmdlUHJvcHMoe3JlZjp6fSx7ZGF0YVVuY1R5cGU6InVuaS1yYWRpbyJ9LHtvbkNsaWNrOnBlLGNsYXNzOiJ1bmktcmFkaW8ifSksW1IuY3JlYXRlVk5vZGUoImRpdiIse3N0eWxlOlgudmFsdWUsY2xhc3M6WyJ1bmktcmFkaW8taW5wdXQiLHsidW5pLXJhZGlvLWlucHV0LWRpc2FibGVkIjp1dH1dfSxbJC52YWx1ZT9abigiXHVFQTA4Iix7Y2xhc3M6InVuaS1yYWRpby1pbnB1dC1pY29uIn0pOm51bGxdKSwuLi5NZSgpXSl9fX0pO2Z1bmN0aW9uIG5pKEUseCx6KXtsZXQgJD1SLmNvbXB1dGVkKHtnZXQ6KCk9Pih7cmFkaW9DaGVja2VkOkJvb2xlYW4oRS52YWx1ZSksdmFsdWU6eC52YWx1ZX0pLHNldDooe3JhZGlvQ2hlY2tlZDpOZX0pPT57RS52YWx1ZT1OZX19KSxLPXtyZXNldDp6fSxYPVIuaW5qZWN0KFByLCExKTtYJiZYLmFkZEZpZWxkKCQpO2xldCBjZT1SLmluamVjdChtciwhMSk7Y2UmJmNlLmFkZEZpZWxkKEspO2xldCBtZT1SLmluamVjdCgkbiwhMSk7cmV0dXJuIFIub25CZWZvcmVVbm1vdW50KCgpPT57WCYmWC5yZW1vdmVGaWVsZCgkKSxjZSYmY2UucmVtb3ZlRmllbGQoSyl9KSx7dW5pQ2hlY2tHcm91cDpYLHVuaUZvcm06Y2UsdW5pTGFiZWw6bWUsZmllbGQ6JH19bGV0IHdvPVIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJSYWRpb0dyb3VwIixwcm9wczpSaSxlbWl0czpbImNoYW5nZSJdLHNldHVwKEUse3Nsb3RzOngsZW1pdDp6fSl7bGV0ICQ9Ui5yZWYobnVsbCksSz1kcigkLHopO3JldHVybiBBbyhFLEspLCgpPT5SLmNyZWF0ZVZOb2RlKCJkaXYiLHtyZWY6JH0sW3guZGVmYXVsdCYmeC5kZWZhdWx0KCldKX19KTtmdW5jdGlvbiBBbyhFLHgpe2xldCB6PVtdO1Iub25Nb3VudGVkKCgpPT57bWUoei5sZW5ndGgtMSl9KTtsZXQgJD0oKT0+e3ZhciBOZTtyZXR1cm4oTmU9ei5maW5kKEZlPT5GZS52YWx1ZS5yYWRpb0NoZWNrZWQpKT09bnVsbD92b2lkIDA6TmUudmFsdWUudmFsdWV9O1IucHJvdmlkZShQcix7YWRkRmllbGQoTmUpe3oucHVzaChOZSl9LHJlbW92ZUZpZWxkKE5lKXt6LnNwbGljZSh6LmluZGV4T2YoTmUpLDEpfSxyYWRpb0NoYW5nZShOZSxGZSl7bGV0IHBlPXouaW5kZXhPZihGZSk7bWUocGUsITApLHgoImNoYW5nZSIse3ZhbHVlOiQoKX0pfX0pO2xldCBLPVIuaW5qZWN0KG1yLCExKSxYPXtzdWJtaXQ6KCk9PntsZXQgTmU9WyIiLG51bGxdO3JldHVybiBFLm5hbWUhPT0iIiYmKE5lWzBdPUUubmFtZSxOZVsxXT0kKCkpLE5lfX07SyYmKEsuYWRkRmllbGQoWCksUi5vbkJlZm9yZVVubW91bnQoKCk9PntLLnJlbW92ZUZpZWxkKFgpfSkpO2Z1bmN0aW9uIGNlKE5lLEZlKXtOZS52YWx1ZT17cmFkaW9DaGVja2VkOkZlLHZhbHVlOk5lLnZhbHVlLnZhbHVlfX1mdW5jdGlvbiBtZShOZSxGZSl7ei5mb3JFYWNoKChwZSxNZSk9PntNZSE9PU5lJiZGZSYmY2UoeltNZV0sITEpfSl9cmV0dXJuIHp9bGV0IHNlPVsidS1pbnB1dCIsInUtdGV4dGFyZWEiXSxZPVIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJGb3JtIixlbWl0czpbInN1Ym1pdCIsInJlc2V0Il0sc2V0dXAoe30se3Nsb3RzOkUsZW1pdDp4fSl7bGV0IHo9Ui5yZWYobnVsbCksJD1kcih6LHgpLEs9W10sWDtyZXR1cm4gUi5wcm92aWRlKG1yLHthZGRGaWVsZChjZSl7Sy5wdXNoKGNlKX0scmVtb3ZlRmllbGQoY2Upe0suc3BsaWNlKEsuaW5kZXhPZihjZSksMSl9LHN1Ym1pdChjZSl7bGV0IG1lPXt9O1gmJlgobWUpO2xldCBOZT1LLnJlZHVjZSgoRmUscGUpPT57aWYocGUuc3VibWl0KXtsZXRbTWUsdXRdPXBlLnN1Ym1pdCgpO01lJiYoRmVbTWVdPXV0KX1yZXR1cm4gRmV9LE9iamVjdC5jcmVhdGUobnVsbCkpO09iamVjdC5hc3NpZ24obWUsTmUpLCQoInN1Ym1pdCIse3ZhbHVlOm1lfSl9LHJlc2V0KGNlKXtYJiZYKCksSy5mb3JFYWNoKG1lPT5tZS5yZXNldCYmbWUucmVzZXQoKSksJCgicmVzZXQiLGNlKX19KSwoKT0+e2xldCBjZT1FLmRlZmF1bHQmJkUuZGVmYXVsdCgpO3JldHVybiBYPWllKGNlKSxSLmNyZWF0ZVZOb2RlKCJ2aWV3Iix7cmVmOnp9LFtjZV0pfX19KTtmdW5jdGlvbiBpZShFKXtsZXQgeD1iLnJlcXVpcmVNb2R1bGUoInBsdXMiKSx6PSgkLEspPT57KEt8fEV8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKFgpe3NlLmluZGV4T2YoU3RyaW5nKFgudHlwZSkpPj0wJiZYLmVsJiZYLmVsLmF0dHImJlguZWwuYXR0ci5uYW1lJiYoJD8kW1guZWwuYXR0ci5uYW1lXT14LmdldFZhbHVlKFguZWwubm9kZUlkKTpYLmVsLnNldFZhbHVlKCIiKSksT3QuaXNBcnJheShYLmNoaWxkcmVuKSYmWC5jaGlsZHJlbiYmWC5jaGlsZHJlbi5sZW5ndGgmJnooJCxYLmNoaWxkcmVuKX0pfTtyZXR1cm4gen1sZXQgTGU9e3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MjN9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sbHQ9e3N1Y2Nlc3M6IiMwOWJiMDciLGluZm86IiMxMGFlZmYiLHdhcm46IiNmNzYyNjAiLHdhaXRpbmc6IiMxMGFlZmYiLHNhZmVfc3VjY2VzczoiIzA5YmIwNyIsc2FmZV93YXJuOiIjZmZiZTAwIixzdWNjZXNzX2NpcmNsZToiIzA5YmIwNyIsc3VjY2Vzc19ub19jaXJjbGU6IiMwOWJiMDciLHdhaXRpbmdfY2lyY2xlOiIjMTBhZWZmIixjaXJjbGU6IiNjOWM5YzkiLGRvd25sb2FkOiIjMDliYjA3IixpbmZvX2NpcmNsZToiIzA5YmIwNyIsY2FuY2VsOiIjZjQzNTMwIixzZWFyY2g6IiNiMmIyYjIiLGNsZWFyOiIjYjJiMmIyIn0sZm49e3N1Y2Nlc3M6Ilx1RUEwNiIsaW5mbzoiXHVFQTAzIix3YXJuOiJcdUVBMEIiLHdhaXRpbmc6Ilx1RUEwOSIsc2FmZV9zdWNjZXNzOiJcdUVBMDQiLHNhZmVfd2FybjoiXHVFQTA1IixzdWNjZXNzX2NpcmNsZToiXHVFQTA3IixzdWNjZXNzX25vX2NpcmNsZToiXHVFQTA4Iix3YWl0aW5nX2NpcmNsZToiXHVFQTBBIixjaXJjbGU6Ilx1RUEwMSIsZG93bmxvYWQ6Ilx1RUEwMiIsaW5mb19jaXJjbGU6Ilx1RUEwQyIsY2FuY2VsOiJcdUVBMEQiLHNlYXJjaDoiXHVFQTBFIixjbGVhcjoiXHVFQTBGIn0sTnI9W3sidW5pLWljb24iOnsiIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMifX19XSx3cj1SLmRlZmluZUNvbXBvbmVudCh7bmFtZToiSWNvbiIscHJvcHM6TGUsc3R5bGVzOk5yLHNldHVwKEUse30pe3JldHVybigpPT5abihmbltFLnR5cGVdLHtjbGFzczoidW5pLWljb24iLHN0eWxlOntjb2xvcjpFLmNvbG9yfHxsdFtFLnR5cGVdLGZvbnRTaXplOkUuc2l6ZX19KX19KSxKaT17aW5kaWNhdG9yRG90czp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHZlcnRpY2FsOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYXV0b3BsYXk6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjaXJjdWxhcjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGludGVydmFsOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjVlM30sZHVyYXRpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTAwfSxjdXJyZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGluZGljYXRvckNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJyZ2JhKDAsMCwwLC4zKSJ9LGluZGljYXRvckFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwMDAwIn0scHJldmlvdXNNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG5leHRNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGN1cnJlbnRJdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNraXBIaWRkZW5JdGVtTGF5b3V0Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZGlzcGxheU11bHRpcGxlSXRlbXM6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZVRvdWNoOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LEZyPWIuY29uZmlnLmVudi5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpPT09ImFuZHJvaWQiLHVvPVt7InVuaS1zd2lwZXIiOnsiIjp7cG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6IjE1MHB4In19LCJ1bmktc3dpcGVyLXNsaWRlciI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowfX0sInVuaS1zd2lwZXItZG90cyI6eyIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLGJvdHRvbToiMTAiLGhlaWdodDoiMTAifX19XSxDbz1SLmRlZmluZUNvbXBvbmVudCh7bmFtZToiU3dpcGVyIixwcm9wczpKaSxzdHlsZXM6dW8sZW1pdHM6WyJjaGFuZ2UiLCJ0cmFuc2l0aW9uIiwiYW5pbWF0aW9uZmluaXNoIl0sc2V0dXAoRSx7c2xvdHM6eCxlbWl0Onp9KXtsZXQgJD1SLnJlZihudWxsKSxLPVtdLFg9ZHIoJCx6KSxjZT1UbyhFKSxtZT1uYShjZSxFLEssWCk7cmV0dXJuIFIud2F0Y2goWygpPT5FLmN1cnJlbnQsKCk9PkUuY3VycmVudEl0ZW1JZF0sKFtOZSxGZV0pPT57bHIoY2UsRSxLKX0pLFIub25Nb3VudGVkKCgpPT57ZigoKT0+e1FuKCQudmFsdWUpLnRoZW4oKHt3aWR0aDpOZSxoZWlnaHQ6RmV9KT0+e2NlLnN3aXBlcldpZHRoPU5lLGNlLnN3aXBlckhlaWdodD1GZX0pfSw1MCl9KSwoKT0+e2xldCBOZT14LmRlZmF1bHQmJnguZGVmYXVsdCgpLHtpbmRpY2F0b3JTdHlsZTpGZSxjdXJyZW50U3luYzpwZX09Y2U7cmV0dXJuIEs9R3IoTmUpLFIuY3JlYXRlVk5vZGUoImRpdiIse3JlZjokLGNsYXNzOiJ1bmktc3dpcGVyIn0sW1IuY3JlYXRlVk5vZGUoInNsaWRlciIsUi5tZXJnZVByb3BzKHtjbGFzczoidW5pLXN3aXBlci1zbGlkZXIifSx7YXV0b1BsYXk6RS5hdXRvcGxheSxpbnRlcnZhbDpFLmludGVydmFsLGluZGV4OnBlLGtlZXBJbmRleDohMCxzaG93SW5kaWNhdG9yczpFLmluZGljYXRvckRvdHMsaW5maW5pdGU6RS5jaXJjdWxhcix2ZXJ0aWNhbDpFLnZlcnRpY2FsLHNjcm9sbGFibGU6IUUuZGlzYWJsZVRvdWNofSxtZSksW0ssUi5jcmVhdGVWTm9kZSgiaW5kaWNhdG9yIix7Y2xhc3M6InVuaS1zd2lwZXItZG90cyIsc3R5bGU6RmV9LG51bGwpXSldKX19fSk7ZnVuY3Rpb24gVG8oRSl7bGV0IHg9Ui5yZWYoMCksej1SLnJlZigwKSwkPVIucmVmKEUuY3VycmVudCksSz1SLnJlZigiYXV0b3BsYXkiKSxYPVIuY29tcHV0ZWQoKCk9Pih7aXRlbUNvbG9yOkUuaW5kaWNhdG9yQ29sb3IsaXRlbVNlbGVjdGVkQ29sb3I6RS5pbmRpY2F0b3JBY3RpdmVDb2xvcixpdGVtU2l6ZTo4LG9wYWNpdHk6RS5pbmRpY2F0b3JEb3RzPzE6MH0pKTtyZXR1cm4gUi5yZWFjdGl2ZSh7c3dpcGVyV2lkdGg6eCxzd2lwZXJIZWlnaHQ6eixpbmRpY2F0b3JTdHlsZTpYLGN1cnJlbnRTeW5jOiQsY3VycmVudENoYW5nZVNvdXJjZTpLfSl9ZnVuY3Rpb24gbmEoRSx4LHosJCl7bGV0IEs9MCxYPXBlPT57bGV0IE1lPXBlLmRldGFpbCx1dD14LnZlcnRpY2FsLF90PSh1dD9NZS5vZmZzZXRZUmF0aW86TWUub2Zmc2V0WFJhdGlvKXx8MDtpZigocGUuZHJhZ3x8cGUuZHJhZykmJihFLmN1cnJlbnRDaGFuZ2VTb3VyY2U9InRvdWNoIiksX3Q9PT0wKXtsZXQgZW49TWF0aC5hYnMoSyk7aWYoZW49PT0xKXJldHVybjtlbj4uNSYmKF90PTEpfUs9X3QsJCgidHJhbnNpdGlvbiIse2R4OnV0PzA6LUUuc3dpcGVyV2lkdGgqX3QsZHk6dXQ/LUUuc3dpcGVySGVpZ2h0Kl90OjB9KX0sY2U9cGU9PntsZXQgTWU9KCk9PnskKCJhbmltYXRpb25maW5pc2giLE5lKCkpLEUuY3VycmVudENoYW5nZVNvdXJjZT0iYXV0b3BsYXkifTtGcj9NZSgpOmYoTWUsNTApfSxtZT1wZT0+e090LmlzU3RyaW5nKHBlLmRldGFpbC5zb3VyY2UpJiYoRS5jdXJyZW50Q2hhbmdlU291cmNlPXBlLmRldGFpbC5zb3VyY2UpLEUuY3VycmVudFN5bmM9cGUuZGV0YWlsLmluZGV4LEs9MH07ZnVuY3Rpb24gTmUoKXtsZXQgcGU9TnVtYmVyKEUuY3VycmVudFN5bmMpLE1lPXpbcGVdfHx7fSx1dD1NZS5jb21wb25lbnRJbnN0YW5jZSYmTWUuY29tcG9uZW50SW5zdGFuY2UuaXRlbUlkfHwiIjtyZXR1cm57Y3VycmVudDpwZSxjdXJyZW50SXRlbUlkOnV0LHNvdXJjZTpFLmN1cnJlbnRDaGFuZ2VTb3VyY2V9fXJldHVybiBSLndhdGNoKCgpPT5FLmN1cnJlbnRTeW5jLHBlPT57JCgiY2hhbmdlIixOZSgpKX0pLHtvblNjcm9sbDpYLG9uU2Nyb2xsZW5kOmNlLG9uQ2hhbmdlOm1lfX1mdW5jdGlvbiBscihFLHgseil7bGV0ICQ9LTE7aWYoeC5jdXJyZW50SXRlbUlkKWZvcihsZXQgSz0wLFg9ejtLPFgubGVuZ3RoO0srKyl7bGV0IGNlPVhbS10uY29tcG9uZW50SW5zdGFuY2U7aWYoY2UmJmNlLml0ZW1JZD09PXguY3VycmVudEl0ZW1JZCl7JD1LO2JyZWFrfX0kPDAmJigkPU1hdGgucm91bmQoTnVtYmVyKHguY3VycmVudCkpfHwwKSwkPSQ8MD8wOiQsRS5jdXJyZW50U3luYyE9PSQmJihFLmN1cnJlbnRDaGFuZ2VTb3VyY2U9IiIsRS5jdXJyZW50U3luYz0kKX1sZXQgRHI9e2l0ZW1JZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LFhhPVIuZGVmaW5lQ29tcG9uZW50KHtuYW1lOiJTd2lwZXJJdGVtIixwcm9wczpEcixzZXR1cChFLHtzbG90czp4fSl7cmV0dXJuKCk9PlIuY3JlYXRlVk5vZGUoImRpdiIse2NsYXNzOiJ1bmktc3dpcGVyLWl0ZW0iLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX0sW3guZGVmYXVsdCYmeC5kZWZhdWx0KCldKX19KTt2YXIgUWE9L148KFstQS1aYS16MC05X10rKSgoPzpccytbYS16QS1aXzpdWy1hLXpBLVowLTlfOi5dKig/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqKFwvPyk+LyxyaT0vXjxcLyhbLUEtWmEtejAtOV9dKylbXj5dKj4vLFFzPS8oW2EtekEtWl86XVstYS16QS1aMC05XzouXSopKD86XHMqPVxzKig/Oig/OiIoKD86XFwufFteIl0pKikiKXwoPzonKCg/OlxcLnxbXiddKSopJyl8KFtePlxzXSspKSk/L2csZWw9aWEoImFyZWEsYmFzZSxiYXNlZm9udCxicixjb2wsZnJhbWUsaHIsaW1nLGlucHV0LGxpbmssbWV0YSxwYXJhbSxlbWJlZCxjb21tYW5kLGtleWdlbixzb3VyY2UsdHJhY2ssd2JyIiksdGw9aWEoImEsYWRkcmVzcyxhcnRpY2xlLGFwcGxldCxhc2lkZSxhdWRpbyxibG9ja3F1b3RlLGJ1dHRvbixjYW52YXMsY2VudGVyLGRkLGRlbCxkaXIsZGl2LGRsLGR0LGZpZWxkc2V0LGZpZ2NhcHRpb24sZmlndXJlLGZvb3Rlcixmb3JtLGZyYW1lc2V0LGgxLGgyLGgzLGg0LGg1LGg2LGhlYWRlcixoZ3JvdXAsaHIsaWZyYW1lLGlzaW5kZXgsbGksbWFwLG1lbnUsbm9mcmFtZXMsbm9zY3JpcHQsb2JqZWN0LG9sLG91dHB1dCxwLHByZSxzZWN0aW9uLHNjcmlwdCx0YWJsZSx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0cix1bCx2aWRlbyIpLG5sPWlhKCJhYmJyLGFjcm9ueW0sYXBwbGV0LGIsYmFzZWZvbnQsYmRvLGJpZyxicixidXR0b24sY2l0ZSxjb2RlLGRlbCxkZm4sZW0sZm9udCxpLGlmcmFtZSxpbWcsaW5wdXQsaW5zLGtiZCxsYWJlbCxtYXAsb2JqZWN0LHEscyxzYW1wLHNjcmlwdCxzZWxlY3Qsc21hbGwsc3BhbixzdHJpa2Usc3Ryb25nLHN1YixzdXAsdGV4dGFyZWEsdHQsdSx2YXIiKSxScz1pYSgiY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyIikscmE9aWEoImNoZWNrZWQsY29tcGFjdCxkZWNsYXJlLGRlZmVyLGRpc2FibGVkLGlzbWFwLG11bHRpcGxlLG5vaHJlZixub3Jlc2l6ZSxub3NoYWRlLG5vd3JhcCxyZWFkb25seSxzZWxlY3RlZCIpLHJsPWlhKCJzY3JpcHQsc3R5bGUiKTtmdW5jdGlvbiBlcihFLHgpe3ZhciB6LCQsSyxYPVtdLGNlPUU7Zm9yKFgubGFzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RoaXMubGVuZ3RoLTFdfTtFOyl7aWYoJD0hMCwhWC5sYXN0KCl8fCFybFtYLmxhc3QoKV0pe2lmKEUuaW5kZXhPZigiPCEtLSIpPT0wPyh6PUUuaW5kZXhPZigiLS0+Iiksej49MCYmKHguY29tbWVudCYmeC5jb21tZW50KEUuc3Vic3RyaW5nKDQseikpLEU9RS5zdWJzdHJpbmcoeiszKSwkPSExKSk6RS5pbmRleE9mKCI8LyIpPT0wPyhLPUUubWF0Y2gocmkpLEsmJihFPUUuc3Vic3RyaW5nKEtbMF0ubGVuZ3RoKSxLWzBdLnJlcGxhY2UocmksRmUpLCQ9ITEpKTpFLmluZGV4T2YoIjwiKT09MCYmKEs9RS5tYXRjaChRYSksSyYmKEU9RS5zdWJzdHJpbmcoS1swXS5sZW5ndGgpLEtbMF0ucmVwbGFjZShRYSxOZSksJD0hMSkpLCQpe3o9RS5pbmRleE9mKCI8Iik7dmFyIG1lPXo8MD9FOkUuc3Vic3RyaW5nKDAseik7RT16PDA/IiI6RS5zdWJzdHJpbmcoeikseC5jaGFycyYmeC5jaGFycyhtZSl9fWVsc2UgRT1FLnJlcGxhY2UobmV3IFJlZ0V4cCgiKFtcXHNcXFNdKj8pPC8iK1gubGFzdCgpKyJbXj5dKj4iKSxmdW5jdGlvbihwZSxNZSl7cmV0dXJuIE1lPU1lLnJlcGxhY2UoLzwhLS0oW1xzXFNdKj8pLS0+fDwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSQyIikseC5jaGFycyYmeC5jaGFycyhNZSksIiJ9KSxGZSgiIixYLmxhc3QoKSk7aWYoRT09Y2UpdGhyb3ciUGFyc2UgRXJyb3I6ICIrRTtjZT1FfUZlKCk7ZnVuY3Rpb24gTmUocGUsTWUsdXQsX3Qpe2lmKE1lPU1lLnRvTG93ZXJDYXNlKCksdGxbTWVdKWZvcig7WC5sYXN0KCkmJm5sW1gubGFzdCgpXTspRmUoIiIsWC5sYXN0KCkpO2lmKFJzW01lXSYmWC5sYXN0KCk9PU1lJiZGZSgiIixNZSksX3Q9ZWxbTWVdfHwhIV90LF90fHxYLnB1c2goTWUpLHguc3RhcnQpe3ZhciBlbj1bXTt1dC5yZXBsYWNlKFFzLGZ1bmN0aW9uKGJ0LHFlKXt2YXIgTXQ9YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTphcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOmFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06cmFbcWVdP3FlOiIiO2VuLnB1c2goe25hbWU6cWUsdmFsdWU6TXQsZXNjYXBlZDpNdC5yZXBsYWNlKC8oXnxbXlxcXSkiL2csJyQxXFwiJyl9KX0pLHguc3RhcnQmJnguc3RhcnQoTWUsZW4sX3QpfX1mdW5jdGlvbiBGZShwZSxNZSl7aWYoTWUpZm9yKHZhciB1dD1YLmxlbmd0aC0xO3V0Pj0wJiZYW3V0XSE9TWU7dXQtLSk7ZWxzZSB2YXIgdXQ9MDtpZih1dD49MCl7Zm9yKHZhciBfdD1YLmxlbmd0aC0xO190Pj11dDtfdC0tKXguZW5kJiZ4LmVuZChYW190XSk7WC5sZW5ndGg9dXR9fX1mdW5jdGlvbiBpYShFKXtmb3IodmFyIHg9e30sej1FLnNwbGl0KCIsIiksJD0wOyQ8ei5sZW5ndGg7JCsrKXhbelskXV09ITA7cmV0dXJuIHh9ZnVuY3Rpb24gRG8oRSl7cmV0dXJuIEUucmVwbGFjZSgvPFw/eG1sLipcPz5cbi8sIiIpLnJlcGxhY2UoLzwhZG9jdHlwZS4qPlxuLywiIikucmVwbGFjZSgvPCFET0NUWVBFLio+XG4vLCIiKX1mdW5jdGlvbiBLaShFKXtyZXR1cm4gRS5yZWR1Y2UoZnVuY3Rpb24oeCx6KXtsZXQgJD16LnZhbHVlLEs9ei5uYW1lO3JldHVybiAkLm1hdGNoKC8gLykmJlsic3R5bGUiLCJzcmMiXS5pbmRleE9mKEspPT09LTEmJigkPSQuc3BsaXQoIiAiKSkseFtLXT9BcnJheS5pc0FycmF5KHhbS10pP3hbS10ucHVzaCgkKTp4W0tdPVt4W0tdLCRdOnhbS109JCx4fSx7fSl9ZnVuY3Rpb24geHMoRSl7RT1EbyhFKTtsZXQgeD1bXSx6PXtub2RlOiJyb290IixjaGlsZHJlbjpbXX07cmV0dXJuIGVyKEUse3N0YXJ0OmZ1bmN0aW9uKCQsSyxYKXtsZXQgY2U9e25hbWU6JH07aWYoSy5sZW5ndGghPT0wJiYoY2UuYXR0cnM9S2koSykpLFgpe2xldCBtZT14WzBdfHx6O21lLmNoaWxkcmVufHwobWUuY2hpbGRyZW49W10pLG1lLmNoaWxkcmVuLnB1c2goY2UpfWVsc2UgeC51bnNoaWZ0KGNlKX0sZW5kOmZ1bmN0aW9uKCQpe2xldCBLPXguc2hpZnQoKTtpZihLLm5hbWUhPT0kJiZjb25zb2xlLmVycm9yKCJpbnZhbGlkIHN0YXRlOiBtaXNtYXRjaCBlbmQgdGFnIikseC5sZW5ndGg9PT0wKXouY2hpbGRyZW4ucHVzaChLKTtlbHNle2xldCBYPXhbMF07WC5jaGlsZHJlbnx8KFguY2hpbGRyZW49W10pLFguY2hpbGRyZW4ucHVzaChLKX19LGNoYXJzOmZ1bmN0aW9uKCQpe2xldCBLPXt0eXBlOiJ0ZXh0Iix0ZXh0OiR9O2lmKHgubGVuZ3RoPT09MCl6LmNoaWxkcmVuLnB1c2goSyk7ZWxzZXtsZXQgWD14WzBdO1guY2hpbGRyZW58fChYLmNoaWxkcmVuPVtdKSxYLmNoaWxkcmVuLnB1c2goSyl9fSxjb21tZW50OmZ1bmN0aW9uKCQpe2xldCBLPXtub2RlOiJjb21tZW50Iix0ZXh0OiR9LFg9eFswXTtYJiYoWC5jaGlsZHJlbnx8KFguY2hpbGRyZW49W10pLFguY2hpbGRyZW4ucHVzaChLKSl9fSksei5jaGlsZHJlbn1sZXQgaWw9e25vZGVzOnt0eXBlOltBcnJheSxTdHJpbmddLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYT0xNixEYT1SLmRlZmluZUNvbXBvbmVudCh7bmFtZToiUmljaFRleHQiLHByb3BzOmlsLHNldHVwKEUpe2xldCB4PVIuZ2V0Q3VycmVudEluc3RhbmNlKCk7cmV0dXJuKCk9PntsZXQgej1FLm5vZGVzO3JldHVybiBPdC5pc1N0cmluZyh6KSYmKHo9eHMoeikpLFIuY3JlYXRlVk5vZGUoInUtcmljaC10ZXh0Iix7dmFsdWU6Vm8oenx8W10seC5yb290LHtkZWZhdWx0Rm9udFNpemU6b2F9KX0sbnVsbCl9fX0pO2Z1bmN0aW9uIFZvKEUseCx6KXtsZXQgJD1bInNwYW4iLCJhIiwiaW1hZ2UiLCJpbWciXSxLPXtibG9ja3F1b3RlOk1lLGJyOmJ0LGRpdjpNZSxkbDpNZSxoMTpfdCgyKSxoMjpfdCgxLjUpLGgzOl90KDEuMTcpLGg0Ol90KDEpLGg1Ol90KC44MyksaDY6X3QoLjY3KSxocjpNZSxvbDpNZSxwOk1lLHN0cm9uZzplbix0YWJsZTpNZSx0Ym9keTpNZSx0Zm9vdDpNZSx0aGVhZDpNZSx1bDpNZX0sWD0vJihhbXB8Z3R8bHR8bmJzcHxxdW90fGFwb3MpOy9nLGNlPXthbXA6IiYiLGd0OiI+IixsdDoiPCIsbmJzcDoiICIscXVvdDonIicsYXBvczoiJyJ9LG1lPXt0eXBlOiJzcGFuIixfX3R5cGU6ImJyZWFrIixhdHRyOnt2YWx1ZTpgCmB9fSxOZT17X19ibG9jazohMCxfX2JyZWFrOiEwLGNoaWxkcmVuOltdfSxGZT1udWxsO2Z1bmN0aW9uIHBlKEF0KXtsZXQgcm49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihBdC5hdHRycyl7bGV0IFNuPShBdC5hdHRycy5jbGFzc3x8IiIpLnNwbGl0KCIgIik7T2JqZWN0LmFzc2lnbihybixSLnBhcnNlQ2xhc3NMaXN0KFNuLHgpLENpKEF0LmF0dHJzLnN0eWxlfHwiIikpfWlmKEF0Lm5hbWU9PT0iaW1nInx8QXQubmFtZT09PSJpbWFnZSIpe2xldCBTbj1BdC5hdHRycztybi53aWR0aD1ybi53aWR0aHx8U24ud2lkdGgscm4uaGVpZ2h0PXJuLmhlaWdodHx8U24uaGVpZ2h0fXJldHVybiBybn1mdW5jdGlvbiBNZShBdCl7cmV0dXJuIEF0Ll9fYmxvY2s9ITAsQXR9ZnVuY3Rpb24gdXQoQXQscm4pe3JldHVybiBBdC5zdHlsZSYmIUF0LnN0eWxlLmZvbnRTaXplJiYoQXQuc3R5bGUuZm9udFNpemU9ei5kZWZhdWx0Rm9udFNpemUqcm4pLE1lKGVuKEF0KSl9ZnVuY3Rpb24gX3QoQXQpe3JldHVybiBmdW5jdGlvbihybil7cmV0dXJuIHV0KHJuLEF0KX19ZnVuY3Rpb24gZW4oQXQpe3JldHVybiBBdC5zdHlsZSYmIUF0LnN0eWxlLmZvbnRXZWlnaHQmJihBdC5zdHlsZS5mb250V2VpZ2h0PSJib2xkIiksQXR9ZnVuY3Rpb24gYnQoQXQpe3JldHVybiBBdC5fX3ZhbHVlPSIgIixNZShBdCl9ZnVuY3Rpb24gcWUoQXQpe3JldHVybiBBdC5yZXBsYWNlKFgsZnVuY3Rpb24ocm4sU24pe3JldHVybiBjZVtTbl19KX1mdW5jdGlvbiBNdChBdCl7bGV0IHJuPShBdC5uYW1lfHwiIikudG9Mb3dlckNhc2UoKSxTbj1ybixhbj1LW3JuXTskLmluZGV4T2Yocm4pPT09LTEmJihybj0ic3BhbiIpLHJuPT09ImltZyImJihybj0iaW1hZ2UiKTtsZXQga3Q9e3R5cGU6cm4sX190eXBlOlNuLGF0dHI6T2JqZWN0LmNyZWF0ZShudWxsKX07cmV0dXJuKEF0LnR5cGU9PT0idGV4dCJ8fEF0LnRleHQpJiYoa3QuX192YWx1ZT1rdC5hdHRyLnZhbHVlPXFlKChBdC50ZXh0fHwiIikudHJpbSgpKSksQXQuYXR0cnMmJk9iamVjdC5rZXlzKEF0LmF0dHJzKS5mb3JFYWNoKENuPT57Q24hPT0iY2xhc3MiJiZDbiE9PSJzdHlsZSImJihrdC5hdHRyW0NuXT1BdC5hdHRyc1tDbl0pfSksa3Quc3R5bGU9cGUoQXQpLGFuJiZhbihrdCksKE5lLl9fYmxvY2t8fGt0Ll9fYmxvY2spJiYoRmV8fChOZS5jaGlsZHJlbi5wdXNoKG1lKSxGZT1bTmUsbWVdKSksTmU9a3QsKE5lLl9fdmFsdWV8fE5lLnR5cGU9PT0iaW1hZ2UiJiZOZS5hdHRyLnNyYykmJihGZT1udWxsKSxrdC5jaGlsZHJlbj1kbihBdC5jaGlsZHJlbiksTmU9a3QsTmUuX19ibG9jayYmTmUuc3R5bGUuaGVpZ2h0JiYhL14wKHB4KT8kLy50ZXN0KE5lLnN0eWxlLmhlaWdodCkmJihGZT1udWxsKSxrdH1mdW5jdGlvbiBkbihBdCl7cmV0dXJuIE90LmlzQXJyYXkoQXQpP0F0Lm1hcChybj0+TXQocm4pKTpbXX1sZXQga249ZG4oRSk7aWYoRmUpe2xldFtBdCxybl09RmUsU249QXQuY2hpbGRyZW4sYW49U24uaW5kZXhPZihybik7U24uc3BsaWNlKGFuLDEpfXJldHVybiBrbn1sZXQgX2E9e307ZnVuY3Rpb24gbXMoRSx4LHope2xldHthZHBpZDokLHdpZHRoOkt9PUUsWD0kKyItIitLLGNlPV9hW1hdO2lmKGNlJiZjZS5sZW5ndGg+MCl7eChjZS5zcGxpY2UoMCwxKVswXSk7cmV0dXJufWcuYWQuZ2V0QWRzKEUsbWU9PntsZXQgTmU9bWUuYWRzO3goTmUuc3BsaWNlKDAsMSlbMF0pLF9hW1hdPWNlP2NlLmNvbmNhdChOZSk6TmV9LG1lPT57eih7ZXJyQ29kZTptZS5jb2RlLGVyck1zZzptZS5tZXNzYWdlfSl9KX1sZXQgYmE9e2FkcGlkOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OiIifSxkYXRhOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY2hhbm5lbDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LHhpPXtsb2FkOiJsb2FkIixjbG9zZToiY2xvc2UiLGVycm9yOiJlcnJvciIsZG93bmxvYWRjaGFuZ2U6ImRvd25sb2FkY2hhbmdlIn0sVW89Ui5kZWZpbmVDb21wb25lbnQoe25hbWU6IkFkIixwcm9wczpiYSxlbWl0czpbeGkubG9hZCx4aS5jbG9zZSx4aS5lcnJvcix4aS5kb3dubG9hZGNoYW5nZV0sc2V0dXAoRSx7ZW1pdDp4fSl7bGV0IHo9Ui5yZWYobnVsbCksJD1kcih6LHgpLEs9VnIoKTtSLndhdGNoKCgpPT5FLmFkcGlkLGNlPT57YWEoSyxFLCQpfSksUi53YXRjaCgoKT0+RS5kYXRhLGNlPT57Sy5kYXRhPWNlfSksUi5vbk1vdW50ZWQoKCk9PntmKCgpPT57UW4oei52YWx1ZSkudGhlbigoe3dpZHRoOmNlfSk9PntLLndpZHRoPWNlPT09MD8tMTpjZSxhYShLLEUsJCl9KX0sNTApfSk7bGV0IFg9e29uRG93bmxvYWRjaGFuZ2UoY2UpeyQoeGkuZG93bmxvYWRjaGFuZ2UsY2UpfSxvbkRpc2xpa2UoY2UpeyQoeGkuY2xvc2UsY2UpfX07cmV0dXJuKCk9PlIuY3JlYXRlVk5vZGUoInUtYWQiLFIubWVyZ2VQcm9wcyh7cmVmOnp9LHtkYXRhOksuZGF0YSxyZW5kZXJpbmc6ITB9LFgpLG51bGwpfX0pO2Z1bmN0aW9uIFZyKEUpe2xldCB4PVIucmVmKCIiKTtyZXR1cm4gUi5yZWFjdGl2ZSh7d2lkdGg6MCxkYXRhOnh9KX1mdW5jdGlvbiBhYShFLHgseil7bXMoe2FkcGlkOnguYWRwaWQsd2lkdGg6RS53aWR0aH0sJD0+e0UuZGF0YT0kLHooeGkubG9hZCx7fSl9LCQ9Pnt6KHhpLmVycm9yLCQpfSl9bGV0IF9zPXt9O2Z1bmN0aW9uIFZhKEUseCx6LCQsSyl7bGV0IFg9RSsiLSIreCxjZT1fc1tYXTtpZihjZSYmY2UubGVuZ3RoPjApeyQoY2Uuc3BsaWNlKDAsMSlbMF0pO3JldHVybn1nLmFkLmdldERyYXdBZHMoe2FkcGlkOlN0cmluZyhFKSxjb3VudDozLHdpZHRoOnh9LG1lPT57bGV0IE5lPW1lLmFkczskKE5lLnNwbGljZSgwLDEpWzBdKSxfc1tYXT1jZT9jZS5jb25jYXQoTmUpOk5lfSxtZT0+e0soe2VyckNvZGU6bWUuY29kZSxlcnJNc2c6bWUubWVzc2FnZX0pfSl9bGV0IEpyPXthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sd2lkdGg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxaaT17bG9hZDoibG9hZCIsY2xvc2U6ImNsb3NlIixlcnJvcjoiZXJyb3IifSxicz1SLmRlZmluZUNvbXBvbmVudCh7bmFtZToiQWREcmF3Iixwcm9wczpKcixlbWl0czpbWmkubG9hZCxaaS5jbG9zZSxaaS5lcnJvcl0sc2V0dXAoRSx7ZW1pdDp4fSl7bGV0IHo9Ui5yZWYobnVsbCksJD1kcih6LHgpLEs9eWEoKTtSLndhdGNoKCgpPT5FLmFkcGlkLGNlPT57ZXMoSyxFLCQpfSksUi53YXRjaCgoKT0+RS5kYXRhLGNlPT57Sy5kYXRhPWNlfSk7bGV0IFg9e29uRGlzbGlrZShjZSl7JChaaS5jbG9zZSxjZSl9fTtyZXR1cm4gUi5vbk1vdW50ZWQoKCk9PntmKCgpPT57UW4oei52YWx1ZSkudGhlbigoe3dpZHRoOmNlLGhlaWdodDptZX0pPT57Sy53aWR0aD1jZT09PTA/LTE6Y2UsSy5oZWlnaHQ9bWU9PT0wPy0xOm1lLGVzKEssRSwkKX0pfSw1MCl9KSwoKT0+e2xldHtkYXRhOmNlfT1LO3JldHVybiBSLmNyZWF0ZVZOb2RlKCJ1LWFkLWRyYXciLFIubWVyZ2VQcm9wcyh7cmVmOnp9LHtkYXRhOmNlLHJlbmRlcmluZzohMH0sWCksbnVsbCl9fX0pO2Z1bmN0aW9uIHlhKEUpe2xldCB4PVIucmVmKCIiKTtyZXR1cm4gUi5yZWFjdGl2ZSh7d2lkdGg6MCxoZWlnaHQ6MCxkYXRhOnh9KX1mdW5jdGlvbiBlcyhFLHgseil7VmEoeC5hZHBpZCxFLndpZHRoLEUuaGVpZ2h0LCQ9PntFLmRhdGE9JCx6KFppLmxvYWQse30pfSwkPT57eihaaS5lcnJvciwkKX0pfXJldHVybntOYXZpZ2F0b3I6enIsTGFiZWw6YXIsQnV0dG9uOkhuLE1vdmFibGVBcmVhOl9yLE1vdmFibGVWaWV3OldpLFByb2dyZXNzOkZhLFBpY2tlclZpZXc6TG8sUGlja2VyVmlld0NvbHVtbjpNcixQaWNrZXI6Tm4sVVNsaWRlcjpMcixTd2l0Y2g6TSxDaGVja2JveDpRdCxDaGVja2JveEdyb3VwOk9yLFJhZGlvOkR0LFJhZGlvR3JvdXA6d28sRm9ybTpZLEljb246d3IsU3dpcGVyOkNvLFN3aXBlckl0ZW06WGEsUmljaFRleHQ6RGEsQWQ6VW8sQWREcmF3OmJzfX0oQyxCZSxTdCk7cmV0dXJuIFl0fWZ1bmN0aW9uIEJrKGYsbyl7bGV0e1VuaVNoYXJlZDpkLFZ1ZTpffT1vO2Z1bmN0aW9uIEMoZyx5LEkpe2xldCBCZT1nLiRbeV07cmV0dXJuIEJlJiZkLmludm9rZUFycmF5Rm5zKEJlLEkpfWxldCBiPWYuc2V0dXA7cmV0dXJuIGYuaW5oZXJpdEF0dHJzPSExLGYuc2V0dXA9KGcseSk9PntsZXR7YXR0cnM6e19fcGFnZUlkOkksX19wYWdlUGF0aDpCZSxfX3BhZ2VRdWVyeTpTdH19PXksR3Q9by5fX3VuaVJvdXRlcy5maW5kKE90PT5PdC5tZXRhLnJvdXRlPT09QmUpLFl0PV8uZ2V0Q3VycmVudEluc3RhbmNlKCksUj1ZdC5wcm94eTtpZihHdCYmKEd0Lm1ldGEuaXNTdWJOVnVlfHxNayhSLG8se19fcGFnZUlkOkksX19wYWdlUGF0aDpCZX0pKSxfLm9uTW91bnRlZCgoKT0+e18ubmV4dFRpY2soKCk9PntDKFIsZC5PTl9SRUFEWSl9KSxZdC5vblBhZ2VTY3JvbGwmJlIuJGVsLmFkZEV2ZW50KCJzY3JvbGwiLE90PT57T3Quc2Nyb2xsVG9wPU90LmRldGFpbC5zY3JvbGxUb3AsQyhSLGQuT05fUEFHRV9TQ1JPTEwsT3QpfSksWXQub25SZWFjaEJvdHRvbSYmUi4kZWwuYWRkRXZlbnQoInNjcm9sbHRvbG93ZXIiLE90PT57QyhSLGQuT05fUkVBQ0hfQk9UVE9NLE90KX0pfSksXy5vbkJlZm9yZVVubW91bnQoKCk9PntDKFIsZC5PTl9VTkxPQUQpfSksYilyZXR1cm4gYihTdCx5KX0sZn1mdW5jdGlvbiBNayhmLG8se19fcGFnZUlkOmQsX19wYWdlUGF0aDpffSl7bGV0IEM9by5nZXRDdXJyZW50UGFnZXMoKSxiPUNbQy5sZW5ndGgtMV07aWYoYiYmYi5fX3NldHVwKWIuX19zZXR1cChmLGIpO2Vsc2V7bGV0IGc9Ii8iK187cmV0dXJuIG8uX19yZWdpc3RlclBhZ2Uoe3VybDpnLHBhdGg6ZyxxdWVyeTp7fSxvcGVuVHlwZToibGF1bmNoIix3ZWJ2aWV3OntpZDpkKyIifSxudnVlUGFnZVZtOmZ9KX19dmFyIHljPXt9LGJ2O2Z1bmN0aW9uIHl2KGYpe2J2PWZ9dmFyICR1O2Z1bmN0aW9uIExrKGYpe2lmKCR1KXJldHVybiAkdTtsZXQgbz1uZXcgZi5FbWl0dGVyO3JldHVybiAkdT17b24oZCxfKXtyZXR1cm4gby5vbihkLF8pfSxvbmNlKGQsXyl7cmV0dXJuIG8ub25jZShkLF8pfSxvZmYoZCxfKXtyZXR1cm4gby5vZmYoZCxfKX0sZW1pdChkLC4uLl8pe3JldHVybiBvLmVtaXQoZCwuLi5fKX19LCR1fWZ1bmN0aW9uIEZrKGYpe3JldHVybihvLGQsXyk9PntsZXR7bnZ1ZTpDfT1kLGI9VXUoZixkKTtkLlZ1ZT1iLHljW29dPXtpbnN0YW5jZUlkOm8sY29uZmlnOkMuY29uZmlnLGRvY3VtZW50OkMuZG9jdW1lbnQsZGF0YTpffTtsZXR7Y3JlYXRlQXBwOmd9PWI7Yi5jcmVhdGVWdWVBcHA9Yi5jcmVhdGVBcHA9KHksSSk9PihkLl9fdW5pQ29uZmlnLnN0eWxlcz15LnN0eWxlc3x8W10sZyh5LEkpLnVzZShEayxvLGQpKSxiLmNyZWF0ZVBhZ2VBcHA9KHksSSk9PntCayh5LGQpO2xldCBCZT1JLiRzdG9yZTtkZWxldGUgSS4kc3RvcmU7bGV0IFN0PWcoeSxJKTtyZXR1cm4gQmUmJlN0LnVzZShCZSksU3QudXNlKFVrLGIsbyxkKX19fXZhciBEaz17aW5zdGFsbChmLG8sZCl7WmMoZCkuaW5pdEFwcChmKSxWayhmLG8sZCl9fTtmdW5jdGlvbiBWayhmLG8sZCl7bGV0e21vdW50Ol99PWYsQz15Y1tvXTtyZXR1cm4gZi5tb3VudD1iPT57bGV0IGc9Yj09PSIjYXBwIix5PUMuYXBwPV8oRXYoQy5kb2N1bWVudCx7aXNSb290Omd9KSk7cmV0dXJuIGcmJmQuX19yZWdpc3RlckFwcCh5KSx5fSxmfXZhciBVaz17aW5zdGFsbChmLG8sZCxfKXtsZXR7d2VleDpDLHBsdXM6YixCcm9hZGNhc3RDaGFubmVsOmcsVnVlU2hhcmVkOnksVW5pU2hhcmVkOkksZ2V0Q3VycmVudFBhZ2VzOkJlLHNldFRpbWVvdXQ6U3QsY2xlYXJUaW1lb3V0Okd0LF9fdW5pQ29uZmlnOll0fT1fO2YuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJHJlcXVpcmVOYXRpdmVQbHVnaW49Qy5yZXF1aXJlTW9kdWxlO2xldCBSPXhrKHt1bmk6YnYsVnVlOm8sd2VleDpDLHBsdXM6YixCcm9hZGNhc3RDaGFubmVsOmcsVW5pVmlld0pTQnJpZGdlOkxrKEkpLFZ1ZVNoYXJlZDp5LFVuaVNoYXJlZDpJLGdldEN1cnJlbnRQYWdlczpCZSxzZXRUaW1lb3V0OlN0LGNsZWFyVGltZW91dDpHdCxfX3VuaUNvbmZpZzpZdH0pO09iamVjdC5rZXlzKFIpLmZvckVhY2goT3Q9PntmLmNvbXBvbmVudChvLmh5cGhlbmF0ZShPdCksUltPdF0pfSksWmMoXykuaW5pdEFwcChmKSwkayhmLGQsXyl9fTtmdW5jdGlvbiAkayhmLG8se252dWU6ZH0pe2xldHtjb25maWc6e2NvbXBpbGVyT3B0aW9uczpffSxtb3VudDpDfT1mO18uaXNDdXN0b21FbGVtZW50PWc9PiEhZC5zdXBwb3J0cyhgQGNvbXBvbmVudC8ke2d9YCk7bGV0IGI9eWNbb107cmV0dXJuIGYubW91bnQ9Zz0+e2xldCB5PWc9PT0iI3Jvb3QiLEk9Yi5hcHA9QyhFdihiLmRvY3VtZW50LHtpc1Jvb3Q6eX0pKTtpZih5KXRyeXtkLmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJjcmVhdGVGaW5pc2gifSxbXSl9Y2F0Y2goQmUpe31yZXR1cm4gSX0sZn1mdW5jdGlvbiBFdihmLHtpc1Jvb3Q6b30pe2lmKG8pcmV0dXJuIGYuZG9jdW1lbnRFbGVtZW50O2xldCBkPWYuY3JlYXRlQ29tbWVudCgicm9vdCIpO3JldHVybiBmLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChkKSxkfWZ1bmN0aW9uIFN2KGYpe2xldCBvPXljW2ZdO2lmKG8mJm8uYXBwJiZvLmRvY3VtZW50KXt0cnl7by5hcHAuJC5hcHBDb250ZXh0LmFwcC51bm1vdW50KCksby5kb2N1bWVudC5kZXN0cm95KCl9Y2F0Y2goZCl7fWRlbGV0ZSBvLmRvY3VtZW50LGRlbGV0ZSBvLmFwcH1kZWxldGUgeWNbZl19ZnVuY3Rpb24gd3YoZil7bGV0IG89eWNbZl07aWYoIW98fCFvLmFwcClyZXR1cm4gbmV3IEVycm9yKGByZWZyZXNoSW5zdGFuY2U6IGluc3RhbmNlICR7Zn0gbm90IGZvdW5kIWApO28uZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246InJlZnJlc2hGaW5pc2gifSxbXSl9ZnVuY3Rpb24gSGsoZixvKXtsZXR7VW5pU2hhcmVkOmQsVnVlU2hhcmVkOl8sVnVlUmVhY3Rpdml0eTpDfT1mO3ZhciBiPWZ1bmN0aW9uKGcseSxJLEJlKXsidXNlIHN0cmljdCI7dmFyIFN0PVtdO2Z1bmN0aW9uIEd0KGEpe0kucGF1c2VUcmFja2luZygpO2Zvcih2YXIgYz1TdC5sZW5ndGg/U3RbU3QubGVuZ3RoLTFdLmNvbXBvbmVudDpudWxsLG09YyYmYy5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcix3PVl0KCksTj1hcmd1bWVudHMubGVuZ3RoLE89bmV3IEFycmF5KE4+MT9OLTE6MCksTD0xO0w8TjtMKyspT1tMLTFdPWFyZ3VtZW50c1tMXTtpZihtKWxuKG0sYywxMSxbYStPLm1hcChIPT57dmFyIGVlLENlO3JldHVybihDZT0oZWU9SC50b1N0cmluZyk9PW51bGw/dm9pZCAwOmVlLmNhbGwoSCkpIT1udWxsP0NlOkpTT04uc3RyaW5naWZ5KEgpfSkuam9pbigiIiksYyYmYy5wcm94eSx3Lm1hcChIPT57dmFye3Zub2RlOmVlfT1IO3JldHVybiJhdCA8Ii5jb25jYXQoSWEoYyxlZS50eXBlKSwiPiIpfSkuam9pbihgCmApLHddKTtlbHNle3ZhciBKPVsiW1Z1ZSB3YXJuXTogIi5jb25jYXQoYSksLi4uT107dy5sZW5ndGgmJkoucHVzaChgCmAsLi4uUih3KSksY29uc29sZS53YXJuKC4uLkopfUkucmVzZXRUcmFja2luZygpfWZ1bmN0aW9uIFl0KCl7dmFyIGE9U3RbU3QubGVuZ3RoLTFdO2lmKCFhKXJldHVybltdO2Zvcih2YXIgYz1bXTthOyl7dmFyIG09Y1swXTttJiZtLnZub2RlPT09YT9tLnJlY3Vyc2VDb3VudCsrOmMucHVzaCh7dm5vZGU6YSxyZWN1cnNlQ291bnQ6MH0pO3ZhciB3PWEuY29tcG9uZW50JiZhLmNvbXBvbmVudC5wYXJlbnQ7YT13JiZ3LnZub2RlfXJldHVybiBjfWZ1bmN0aW9uIFIoYSl7dmFyIGM9W107cmV0dXJuIGEuZm9yRWFjaCgobSx3KT0+e2MucHVzaCguLi53PT09MD9bXTpbYApgXSwuLi5PdChtKSl9KSxjfWZ1bmN0aW9uIE90KGEpe3Zhcnt2bm9kZTpjLHJlY3Vyc2VDb3VudDptfT1hLHc9bT4wPyIuLi4gKCIuY29uY2F0KG0sIiByZWN1cnNpdmUgY2FsbHMpIik6IiIsTj1jLmNvbXBvbmVudD9jLmNvbXBvbmVudC5wYXJlbnQ9PW51bGw6ITEsTz0iIGF0IDwiLmNvbmNhdChJYShjLmNvbXBvbmVudCxjLnR5cGUsTikpLEw9Ij4iK3c7cmV0dXJuIGMucHJvcHM/W08sLi4uVW4oYy5wcm9wcyksTF06W08rTF19ZnVuY3Rpb24gVW4oYSl7dmFyIGM9W10sbT1PYmplY3Qua2V5cyhhKTtyZXR1cm4gbS5zbGljZSgwLDMpLmZvckVhY2godz0+e2MucHVzaCguLi5mdCh3LGFbd10pKX0pLG0ubGVuZ3RoPjMmJmMucHVzaCgiIC4uLiIpLGN9ZnVuY3Rpb24gZnQoYSxjLG0pe3JldHVybiB5LmlzU3RyaW5nKGMpPyhjPUpTT04uc3RyaW5naWZ5KGMpLG0/YzpbIiIuY29uY2F0KGEsIj0iKS5jb25jYXQoYyldKTp0eXBlb2YgYz09Im51bWJlciJ8fHR5cGVvZiBjPT0iYm9vbGVhbiJ8fGM9PW51bGw/bT9jOlsiIi5jb25jYXQoYSwiPSIpLmNvbmNhdChjKV06SS5pc1JlZihjKT8oYz1mdChhLEkudG9SYXcoYy52YWx1ZSksITApLG0/YzpbIiIuY29uY2F0KGEsIj1SZWY8IiksYywiPiJdKTp5LmlzRnVuY3Rpb24oYyk/WyIiLmNvbmNhdChhLCI9Zm4iKS5jb25jYXQoYy5uYW1lPyI8Ii5jb25jYXQoYy5uYW1lLCI+Iik6IiIpXTooYz1JLnRvUmF3KGMpLG0/YzpbIiIuY29uY2F0KGEsIj0iKSxjXSl9ZnVuY3Rpb24gcShhLGMpe312YXIgbmU9e1NFVFVQX0ZVTkNUSU9OOjAsIjAiOiJTRVRVUF9GVU5DVElPTiIsUkVOREVSX0ZVTkNUSU9OOjEsIjEiOiJSRU5ERVJfRlVOQ1RJT04iLFdBVENIX0dFVFRFUjoyLCIyIjoiV0FUQ0hfR0VUVEVSIixXQVRDSF9DQUxMQkFDSzozLCIzIjoiV0FUQ0hfQ0FMTEJBQ0siLFdBVENIX0NMRUFOVVA6NCwiNCI6IldBVENIX0NMRUFOVVAiLE5BVElWRV9FVkVOVF9IQU5ETEVSOjUsIjUiOiJOQVRJVkVfRVZFTlRfSEFORExFUiIsQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVI6NiwiNiI6IkNPTVBPTkVOVF9FVkVOVF9IQU5ETEVSIixWTk9ERV9IT09LOjcsIjciOiJWTk9ERV9IT09LIixESVJFQ1RJVkVfSE9PSzo4LCI4IjoiRElSRUNUSVZFX0hPT0siLFRSQU5TSVRJT05fSE9PSzo5LCI5IjoiVFJBTlNJVElPTl9IT09LIixBUFBfRVJST1JfSEFORExFUjoxMCwiMTAiOiJBUFBfRVJST1JfSEFORExFUiIsQVBQX1dBUk5fSEFORExFUjoxMSwiMTEiOiJBUFBfV0FSTl9IQU5ETEVSIixGVU5DVElPTl9SRUY6MTIsIjEyIjoiRlVOQ1RJT05fUkVGIixBU1lOQ19DT01QT05FTlRfTE9BREVSOjEzLCIxMyI6IkFTWU5DX0NPTVBPTkVOVF9MT0FERVIiLFNDSEVEVUxFUjoxNCwiMTQiOiJTQ0hFRFVMRVIifSxzbj17c3A6InNlcnZlclByZWZldGNoIGhvb2siLGJjOiJiZWZvcmVDcmVhdGUgaG9vayIsYzoiY3JlYXRlZCBob29rIixibToiYmVmb3JlTW91bnQgaG9vayIsbToibW91bnRlZCBob29rIixidToiYmVmb3JlVXBkYXRlIGhvb2siLHU6InVwZGF0ZWQiLGJ1bToiYmVmb3JlVW5tb3VudCBob29rIix1bToidW5tb3VudGVkIGhvb2siLGE6ImFjdGl2YXRlZCBob29rIixkYToiZGVhY3RpdmF0ZWQgaG9vayIsZWM6ImVycm9yQ2FwdHVyZWQgaG9vayIscnRjOiJyZW5kZXJUcmFja2VkIGhvb2siLHJ0ZzoicmVuZGVyVHJpZ2dlcmVkIGhvb2siLFswXToic2V0dXAgZnVuY3Rpb24iLFsxXToicmVuZGVyIGZ1bmN0aW9uIixbMl06IndhdGNoZXIgZ2V0dGVyIixbM106IndhdGNoZXIgY2FsbGJhY2siLFs0XToid2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uIixbNV06Im5hdGl2ZSBldmVudCBoYW5kbGVyIixbNl06ImNvbXBvbmVudCBldmVudCBoYW5kbGVyIixbN106InZub2RlIGhvb2siLFs4XToiZGlyZWN0aXZlIGhvb2siLFs5XToidHJhbnNpdGlvbiBob29rIixbMTBdOiJhcHAgZXJyb3JIYW5kbGVyIixbMTFdOiJhcHAgd2FybkhhbmRsZXIiLFsxMl06InJlZiBmdW5jdGlvbiIsWzEzXToiYXN5bmMgY29tcG9uZW50IGxvYWRlciIsWzE0XToic2NoZWR1bGVyIGZsdXNoLiBUaGlzIGlzIGxpa2VseSBhIFZ1ZSBpbnRlcm5hbHMgYnVnLiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvY29yZSAuIn07ZnVuY3Rpb24gbG4oYSxjLG0sdyl7dHJ5e3JldHVybiB3P2EoLi4udyk6YSgpfWNhdGNoKE4pe1puKE4sYyxtKX19ZnVuY3Rpb24gYm4oYSxjLG0sdyl7aWYoeS5pc0Z1bmN0aW9uKGEpKXt2YXIgTj1sbihhLGMsbSx3KTtyZXR1cm4gTiYmeS5pc1Byb21pc2UoTikmJk4uY2F0Y2goSj0+e1puKEosYyxtKX0pLE59Zm9yKHZhciBPPVtdLEw9MDtMPGEubGVuZ3RoO0wrKylPLnB1c2goYm4oYVtMXSxjLG0sdykpO3JldHVybiBPfWZ1bmN0aW9uIFpuKGEsYyxtKXtpZihjJiZjLnZub2RlLGMpe2Zvcih2YXIgdz1jLnBhcmVudCxOPWMucHJveHksTz0iaHR0cHM6Ly92dWVqcy5vcmcvZXJyb3ItcmVmZXJlbmNlLyNydW50aW1lLSIuY29uY2F0KG0pO3c7KXt2YXIgTD13LmVjO2lmKEwpe2Zvcih2YXIgSj0wO0o8TC5sZW5ndGg7SisrKWlmKExbSl0oYSxOLE8pPT09ITEpcmV0dXJufXc9dy5wYXJlbnR9dmFyIEg9Yy5hcHBDb250ZXh0LmNvbmZpZy5lcnJvckhhbmRsZXI7aWYoSCl7bG4oSCxudWxsLDEwLFthLE4sT10pO3JldHVybn19d2koYSl9ZnVuY3Rpb24gd2koYSxjLG0pe2NvbnNvbGUuZXJyb3IoYSl9dmFyIHpyPSExLEVuPSExLHF0PVtdLG1uPTAsTW49W10sUm49bnVsbCxwcj0wLEFpPVByb21pc2UucmVzb2x2ZSgpLFhuPW51bGw7ZnVuY3Rpb24gS2UoYSl7dmFyIGM9WG58fEFpO3JldHVybiBhP2MudGhlbih0aGlzP2EuYmluZCh0aGlzKTphKTpjfWZ1bmN0aW9uIFhlKGEpe2Zvcih2YXIgYz1tbisxLG09cXQubGVuZ3RoO2M8bTspe3ZhciB3PWMrbT4+PjEsTj1xdFt3XSxPPXZyKE4pO088YXx8Tz09PWEmJk4ucHJlP2M9dysxOm09d31yZXR1cm4gY31mdW5jdGlvbiBodChhKXsoIXF0Lmxlbmd0aHx8IXF0LmluY2x1ZGVzKGEsenImJmEuYWxsb3dSZWN1cnNlP21uKzE6bW4pKSYmKGEuaWQ9PW51bGw/cXQucHVzaChhKTpxdC5zcGxpY2UoWGUoYS5pZCksMCxhKSxobigpKX1mdW5jdGlvbiBobigpeyF6ciYmIUVuJiYoRW49ITAsWG49QWkudGhlbih2aSkpfWZ1bmN0aW9uIExuKGEpe3ZhciBjPXF0LmluZGV4T2YoYSk7Yz5tbiYmcXQuc3BsaWNlKGMsMSl9ZnVuY3Rpb24gZ24oYSl7eS5pc0FycmF5KGEpP01uLnB1c2goLi4uYSk6KCFSbnx8IVJuLmluY2x1ZGVzKGEsYS5hbGxvd1JlY3Vyc2U/cHIrMTpwcikpJiZNbi5wdXNoKGEpLGhuKCl9ZnVuY3Rpb24gQW4oYSxjKXtmb3IodmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnpyP21uKzE6MDttPHF0Lmxlbmd0aDttKyspe3ZhciB3PXF0W21dO2lmKHcmJncucHJlKXtpZihhJiZ3LmlkIT09YS51aWQpY29udGludWU7cXQuc3BsaWNlKG0sMSksbS0tLHcoKX19fWZ1bmN0aW9uICRuKGEpe2lmKE1uLmxlbmd0aCl7dmFyIGM9Wy4uLm5ldyBTZXQoTW4pXS5zb3J0KChtLHcpPT52cihtKS12cih3KSk7aWYoTW4ubGVuZ3RoPTAsUm4pe1JuLnB1c2goLi4uYyk7cmV0dXJufWZvcihSbj1jLHByPTA7cHI8Um4ubGVuZ3RoO3ByKyspUm5bcHJdKCk7Um49bnVsbCxwcj0wfX12YXIgdnI9YT0+YS5pZD09bnVsbD8xLzA6YS5pZCxhcj0oYSxjKT0+e3ZhciBtPXZyKGEpLXZyKGMpO2lmKG09PT0wKXtpZihhLnByZSYmIWMucHJlKXJldHVybi0xO2lmKGMucHJlJiYhYS5wcmUpcmV0dXJuIDF9cmV0dXJuIG19O2Z1bmN0aW9uIHZpKGEpe0VuPSExLHpyPSEwLHF0LnNvcnQoYXIpO3ZhciBjPXkuTk9PUDt0cnl7Zm9yKG1uPTA7bW48cXQubGVuZ3RoO21uKyspe3ZhciBtPXF0W21uXTttJiZtLmFjdGl2ZSE9PSExJiZsbihtLG51bGwsMTQpfX1maW5hbGx5e21uPTAscXQubGVuZ3RoPTAsJG4oKSx6cj0hMSxYbj1udWxsLChxdC5sZW5ndGh8fE1uLmxlbmd0aCkmJnZpKCl9fXZhciBXcix4cj1bXTtmdW5jdGlvbiBybyhhLGMpe3ZhciBtLHc7aWYoV3I9YSxXcilXci5lbmFibGVkPSEwLHhyLmZvckVhY2goTz0+e3ZhcntldmVudDpMLGFyZ3M6Sn09TztyZXR1cm4gV3IuZW1pdChMLC4uLkopfSkseHI9W107ZWxzZSBpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LkhUTUxFbGVtZW50JiYhKCh3PShtPXdpbmRvdy5uYXZpZ2F0b3IpPT1udWxsP3ZvaWQgMDptLnVzZXJBZ2VudCk9PW51bGw/dm9pZCAwOncuaW5jbHVkZXMoImpzZG9tIikpKXt2YXIgTj1jLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189Yy5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9ffHxbXTtOLnB1c2goTz0+e3JvKE8sYyl9KSxzZXRUaW1lb3V0KCgpPT57V3J8fChjLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX189bnVsbCx4cj1bXSl9LDNlMyl9ZWxzZSB4cj1bXX1mdW5jdGlvbiBabyhhLGMpe2lmKCFhLmlzVW5tb3VudGVkKXtmb3IodmFyIG09YS52bm9kZS5wcm9wc3x8eS5FTVBUWV9PQkosdz1hcmd1bWVudHMubGVuZ3RoLE49bmV3IEFycmF5KHc+Mj93LTI6MCksTz0yO088dztPKyspTltPLTJdPWFyZ3VtZW50c1tPXTt2YXIgTD1OLEo9Yy5zdGFydHNXaXRoKCJ1cGRhdGU6IiksSD1KJiZjLnNsaWNlKDcpO2lmKEgmJkggaW4gbSl7dmFyIGVlPSIiLmNvbmNhdChIPT09Im1vZGVsVmFsdWUiPyJtb2RlbCI6SCwiTW9kaWZpZXJzIikse251bWJlcjpDZSx0cmltOkdlfT1tW2VlXXx8eS5FTVBUWV9PQko7R2UmJihMPU4ubWFwKGd0PT55LmlzU3RyaW5nKGd0KT9ndC50cmltKCk6Z3QpKSxDZSYmKEw9Ti5tYXAoeS5sb29zZVRvTnVtYmVyKSl9dmFyIGhlLERlPW1baGU9eS50b0hhbmRsZXJLZXkoYyldfHxtW2hlPXkudG9IYW5kbGVyS2V5KHkuY2FtZWxpemUoYykpXTshRGUmJkomJihEZT1tW2hlPXkudG9IYW5kbGVyS2V5KHkuaHlwaGVuYXRlKGMpKV0pLERlJiZibihEZSxhLDYsTCk7dmFyIGV0PW1baGUrIk9uY2UiXTtpZihldCl7aWYoIWEuZW1pdHRlZClhLmVtaXR0ZWQ9e307ZWxzZSBpZihhLmVtaXR0ZWRbaGVdKXJldHVybjthLmVtaXR0ZWRbaGVdPSEwLGJuKGV0LGEsNixMKX19fWZ1bmN0aW9uIHZhKGEsYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHc9Yy5lbWl0c0NhY2hlLE49dy5nZXQoYSk7aWYoTiE9PXZvaWQgMClyZXR1cm4gTjt2YXIgTz1hLmVtaXRzLEw9e30sSj0hMTtpZigheS5pc0Z1bmN0aW9uKGEpKXt2YXIgSD1lZT0+e3ZhciBDZT12YShlZSxjLCEwKTtDZSYmKEo9ITAseS5leHRlbmQoTCxDZSkpfTshbSYmYy5taXhpbnMubGVuZ3RoJiZjLm1peGlucy5mb3JFYWNoKEgpLGEuZXh0ZW5kcyYmSChhLmV4dGVuZHMpLGEubWl4aW5zJiZhLm1peGlucy5mb3JFYWNoKEgpfXJldHVybiFPJiYhSj8oeS5pc09iamVjdChhKSYmdy5zZXQoYSxudWxsKSxudWxsKTooeS5pc0FycmF5KE8pP08uZm9yRWFjaChlZT0+TFtlZV09bnVsbCk6eS5leHRlbmQoTCxPKSx5LmlzT2JqZWN0KGEpJiZ3LnNldChhLEwpLEwpfWZ1bmN0aW9uIEhpKGEsYyl7cmV0dXJuIWF8fCF5LmlzT24oYyk/ITE6KGM9Yy5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIiIpLHkuaGFzT3duKGEsY1swXS50b0xvd2VyQ2FzZSgpK2Muc2xpY2UoMSkpfHx5Lmhhc093bihhLHkuaHlwaGVuYXRlKGMpKXx8eS5oYXNPd24oYSxjKSl9dmFyIE9uPW51bGwsbXI9bnVsbDtmdW5jdGlvbiBRcihhKXt2YXIgYz1PbjtyZXR1cm4gT249YSxtcj1hJiZhLnR5cGUuX19zY29wZUlkfHxudWxsLGN9ZnVuY3Rpb24gbWkoYSl7bXI9YX1mdW5jdGlvbiBIbigpe21yPW51bGx9dmFyIHlvPWE9PkdyO2Z1bmN0aW9uIEdyKGEpe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpPbjtpZighY3x8YS5fbilyZXR1cm4gYTt2YXIgbT1mdW5jdGlvbigpe20uX2QmJiRyKC0xKTt2YXIgdz1RcihjKSxOO3RyeXtOPWEoLi4uYXJndW1lbnRzKX1maW5hbGx5e1FyKHcpLG0uX2QmJiRyKDEpfXJldHVybiBOfTtyZXR1cm4gbS5fbj0hMCxtLl9jPSEwLG0uX2Q9ITAsbX1mdW5jdGlvbiBtYSgpe31mdW5jdGlvbiBDaShhKXt2YXJ7dHlwZTpjLHZub2RlOm0scHJveHk6dyx3aXRoUHJveHk6Tixwcm9wczpPLHByb3BzT3B0aW9uczpbTF0sc2xvdHM6SixhdHRyczpILGVtaXQ6ZWUscmVuZGVyOkNlLHJlbmRlckNhY2hlOkdlLGRhdGE6aGUsc2V0dXBTdGF0ZTpEZSxjdHg6ZXQsaW5oZXJpdEF0dHJzOmd0fT1hLGR0LFZ0LEh0PVFyKGEpO3RyeXtpZihtLnNoYXBlRmxhZyY0KXt2YXIgYWU9Tnx8dyxrZT1hZTtkdD1CbihDZS5jYWxsKGtlLGFlLEdlLE8sRGUsaGUsZXQpKSxWdD1IfWVsc2V7dmFyIHdlPWM7ZHQ9Qm4od2UubGVuZ3RoPjE/d2UoTyx7YXR0cnM6SCxzbG90czpKLGVtaXQ6ZWV9KTp3ZShPLG51bGwpKSxWdD1jLnByb3BzP0g6X3IoSCl9fWNhdGNoKGkpe25yLmxlbmd0aD0wLFpuKGksYSwxKSxkdD1fZShVcil9dmFyIEhlPWR0O2lmKFZ0JiZndCE9PSExKXt2YXIgd3Q9T2JqZWN0LmtleXMoVnQpLHtzaGFwZUZsYWc6dHR9PUhlO3d0Lmxlbmd0aCYmdHQmKDF8NikmJihMJiZ3dC5zb21lKHkuaXNNb2RlbExpc3RlbmVyKSYmKFZ0PUxhKFZ0LEwpKSxIZT1vbihIZSxWdCkpfXJldHVybiBtLmRpcnMmJihIZT1vbihIZSksSGUuZGlycz1IZS5kaXJzP0hlLmRpcnMuY29uY2F0KG0uZGlycyk6bS5kaXJzKSxtLnRyYW5zaXRpb24mJihIZS50cmFuc2l0aW9uPW0udHJhbnNpdGlvbiksZHQ9SGUsUXIoSHQpLGR0fWZ1bmN0aW9uIFFuKGEpe2Zvcih2YXIgYyxtPTA7bTxhLmxlbmd0aDttKyspe3ZhciB3PWFbbV07aWYoS3Iodykpe2lmKHcudHlwZSE9PVVyfHx3LmNoaWxkcmVuPT09InYtaWYiKXtpZihjKXJldHVybjtjPXd9fWVsc2UgcmV0dXJufXJldHVybiBjfXZhciBfcj1hPT57dmFyIGM7Zm9yKHZhciBtIGluIGEpKG09PT0iY2xhc3MifHxtPT09InN0eWxlInx8eS5pc09uKG0pKSYmKChjfHwoYz17fSkpW21dPWFbbV0pO3JldHVybiBjfSxMYT0oYSxjKT0+e3ZhciBtPXt9O2Zvcih2YXIgdyBpbiBhKSgheS5pc01vZGVsTGlzdGVuZXIodyl8fCEody5zbGljZSg5KWluIGMpKSYmKG1bd109YVt3XSk7cmV0dXJuIG19O2Z1bmN0aW9uIGRyKGEsYyxtKXt2YXJ7cHJvcHM6dyxjaGlsZHJlbjpOLGNvbXBvbmVudDpPfT1hLHtwcm9wczpMLGNoaWxkcmVuOkoscGF0Y2hGbGFnOkh9PWMsZWU9Ty5lbWl0c09wdGlvbnM7aWYoYy5kaXJzfHxjLnRyYW5zaXRpb24pcmV0dXJuITA7aWYobSYmSD49MCl7aWYoSCYxMDI0KXJldHVybiEwO2lmKEgmMTYpcmV0dXJuIHc/WG8odyxMLGVlKTohIUw7aWYoSCY4KWZvcih2YXIgQ2U9Yy5keW5hbWljUHJvcHMsR2U9MDtHZTxDZS5sZW5ndGg7R2UrKyl7dmFyIGhlPUNlW0dlXTtpZihMW2hlXSE9PXdbaGVdJiYhSGkoZWUsaGUpKXJldHVybiEwfX1lbHNlIHJldHVybihOfHxKKSYmKCFKfHwhSi4kc3RhYmxlKT8hMDp3PT09TD8hMTp3P0w/WG8odyxMLGVlKTohMDohIUw7cmV0dXJuITF9ZnVuY3Rpb24gWG8oYSxjLG0pe3ZhciB3PU9iamVjdC5rZXlzKGMpO2lmKHcubGVuZ3RoIT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgTj0wO048dy5sZW5ndGg7TisrKXt2YXIgTz13W05dO2lmKGNbT10hPT1hW09dJiYhSGkobSxPKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBCbyhhLGMpe2Zvcih2YXJ7dm5vZGU6bSxwYXJlbnQ6d309YTt3Oyl7dmFyIE49dy5zdWJUcmVlO2lmKE4uc3VzcGVuc2UmJk4uc3VzcGVuc2UuYWN0aXZlQnJhbmNoPT09bSYmKE4uZWw9bS5lbCksTj09PW0pKG09dy52bm9kZSkuZWw9Yyx3PXcucGFyZW50O2Vsc2UgYnJlYWt9fXZhciBNbz0iY29tcG9uZW50cyIsY2k9ImRpcmVjdGl2ZXMiO2Z1bmN0aW9uIFRpKGEsYyl7cmV0dXJuIGlvKE1vLGEsITAsYyl8fGF9dmFyIEVvPVN5bWJvbC5mb3IoInYtbmRjIik7ZnVuY3Rpb24gQ3IoYSl7cmV0dXJuIHkuaXNTdHJpbmcoYSk/aW8oTW8sYSwhMSl8fGE6YXx8RW99ZnVuY3Rpb24gQnIoYSl7cmV0dXJuIGlvKGNpLGEpfWZ1bmN0aW9uIGlvKGEsYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHc9T258fF9uO2lmKHcpe3ZhciBOPXcudHlwZTtpZihhPT09TW8pe3ZhciBPPUhhKE4sITEpO2lmKE8mJihPPT09Y3x8Tz09PXkuY2FtZWxpemUoYyl8fE89PT15LmNhcGl0YWxpemUoeS5jYW1lbGl6ZShjKSkpKXJldHVybiBOfXZhciBMPW9vKHdbYV18fE5bYV0sYyl8fG9vKHcuYXBwQ29udGV4dFthXSxjKTtyZXR1cm4hTCYmbT9OOkx9fWZ1bmN0aW9uIG9vKGEsYyl7cmV0dXJuIGEmJihhW2NdfHxhW3kuY2FtZWxpemUoYyldfHxhW3kuY2FwaXRhbGl6ZSh5LmNhbWVsaXplKGMpKV0pfXZhciBlaT1hPT5hLl9faXNTdXNwZW5zZSxqaT0wLHppPXtuYW1lOiJTdXNwZW5zZSIsX19pc1N1c3BlbnNlOiEwLHByb2Nlc3MoYSxjLG0sdyxOLE8sTCxKLEgsZWUpe2lmKGE9PW51bGwpYW8oYyxtLHcsTixPLEwsSixILGVlKTtlbHNle2lmKE8mJk8uZGVwcz4wJiYhYS5zdXNwZW5zZS5pc0luRmFsbGJhY2spe2Muc3VzcGVuc2U9YS5zdXNwZW5zZSxjLnN1c3BlbnNlLnZub2RlPWMsYy5lbD1hLmVsO3JldHVybn1lYShhLGMsbSx3LE4sTCxKLEgsZWUpfX0saHlkcmF0ZTpqbixjcmVhdGU6V2ksbm9ybWFsaXplOllyfSxRbz16aTtmdW5jdGlvbiBPaShhLGMpe3ZhciBtPWEucHJvcHMmJmEucHJvcHNbY107eS5pc0Z1bmN0aW9uKG0pJiZtKCl9ZnVuY3Rpb24gYW8oYSxjLG0sdyxOLE8sTCxKLEgpe3ZhcntwOmVlLG86e2NyZWF0ZUVsZW1lbnQ6Q2V9fT1ILEdlPUNlKCJkaXYiKSxoZT1hLnN1c3BlbnNlPVdpKGEsTix3LGMsR2UsbSxPLEwsSixIKTtlZShudWxsLGhlLnBlbmRpbmdCcmFuY2g9YS5zc0NvbnRlbnQsR2UsbnVsbCx3LGhlLE8sTCksaGUuZGVwcz4wPyhPaShhLCJvblBlbmRpbmciKSxPaShhLCJvbkZhbGxiYWNrIiksZWUobnVsbCxhLnNzRmFsbGJhY2ssYyxtLHcsbnVsbCxPLEwpLFRlKGhlLGEuc3NGYWxsYmFjaykpOmhlLnJlc29sdmUoITEsITApfWZ1bmN0aW9uIGVhKGEsYyxtLHcsTixPLEwsSixIKXt2YXJ7cDplZSx1bTpDZSxvOntjcmVhdGVFbGVtZW50OkdlfX09SCxoZT1jLnN1c3BlbnNlPWEuc3VzcGVuc2U7aGUudm5vZGU9YyxjLmVsPWEuZWw7dmFyIERlPWMuc3NDb250ZW50LGV0PWMuc3NGYWxsYmFjayx7YWN0aXZlQnJhbmNoOmd0LHBlbmRpbmdCcmFuY2g6ZHQsaXNJbkZhbGxiYWNrOlZ0LGlzSHlkcmF0aW5nOkh0fT1oZTtpZihkdCloZS5wZW5kaW5nQnJhbmNoPURlLEhyKERlLGR0KT8oZWUoZHQsRGUsaGUuaGlkZGVuQ29udGFpbmVyLG51bGwsTixoZSxPLEwsSiksaGUuZGVwczw9MD9oZS5yZXNvbHZlKCk6VnQmJihIdHx8KGVlKGd0LGV0LG0sdyxOLG51bGwsTyxMLEopLFRlKGhlLGV0KSkpKTooaGUucGVuZGluZ0lkPWppKyssSHQ/KGhlLmlzSHlkcmF0aW5nPSExLGhlLmFjdGl2ZUJyYW5jaD1kdCk6Q2UoZHQsTixoZSksaGUuZGVwcz0wLGhlLmVmZmVjdHMubGVuZ3RoPTAsaGUuaGlkZGVuQ29udGFpbmVyPUdlKCJkaXYiKSxWdD8oZWUobnVsbCxEZSxoZS5oaWRkZW5Db250YWluZXIsbnVsbCxOLGhlLE8sTCxKKSxoZS5kZXBzPD0wP2hlLnJlc29sdmUoKTooZWUoZ3QsZXQsbSx3LE4sbnVsbCxPLEwsSiksVGUoaGUsZXQpKSk6Z3QmJkhyKERlLGd0KT8oZWUoZ3QsRGUsbSx3LE4saGUsTyxMLEopLGhlLnJlc29sdmUoITApKTooZWUobnVsbCxEZSxoZS5oaWRkZW5Db250YWluZXIsbnVsbCxOLGhlLE8sTCxKKSxoZS5kZXBzPD0wJiZoZS5yZXNvbHZlKCkpKTtlbHNlIGlmKGd0JiZIcihEZSxndCkpZWUoZ3QsRGUsbSx3LE4saGUsTyxMLEopLFRlKGhlLERlKTtlbHNlIGlmKE9pKGMsIm9uUGVuZGluZyIpLGhlLnBlbmRpbmdCcmFuY2g9RGUsRGUuc2hhcGVGbGFnJjUxMj9oZS5wZW5kaW5nSWQ9RGUuY29tcG9uZW50LnN1c3BlbnNlSWQ6aGUucGVuZGluZ0lkPWppKyssZWUobnVsbCxEZSxoZS5oaWRkZW5Db250YWluZXIsbnVsbCxOLGhlLE8sTCxKKSxoZS5kZXBzPD0wKWhlLnJlc29sdmUoKTtlbHNle3Zhcnt0aW1lb3V0OmFlLHBlbmRpbmdJZDprZX09aGU7YWU+MD9zZXRUaW1lb3V0KCgpPT57aGUucGVuZGluZ0lkPT09a2UmJmhlLmZhbGxiYWNrKGV0KX0sYWUpOmFlPT09MCYmaGUuZmFsbGJhY2soZXQpfX1mdW5jdGlvbiBXaShhLGMsbSx3LE4sTyxMLEosSCxlZSl7dmFyIENlPWFyZ3VtZW50cy5sZW5ndGg+MTAmJmFyZ3VtZW50c1sxMF0hPT12b2lkIDA/YXJndW1lbnRzWzEwXTohMSx7cDpHZSxtOmhlLHVtOkRlLG46ZXQsbzp7cGFyZW50Tm9kZTpndCxyZW1vdmU6ZHR9fT1lZSxWdCxIdD1GYShhKTtIdCYmKGM9PW51bGw/dm9pZCAwOmMucGVuZGluZ0JyYW5jaCkmJihWdD1jLnBlbmRpbmdJZCxjLmRlcHMrKyk7dmFyIGFlPWEucHJvcHM/eS50b051bWJlcihhLnByb3BzLnRpbWVvdXQpOnZvaWQgMCxrZT1PLHdlPXt2bm9kZTphLHBhcmVudDpjLHBhcmVudENvbXBvbmVudDptLG5hbWVzcGFjZTpMLGNvbnRhaW5lcjp3LGhpZGRlbkNvbnRhaW5lcjpOLGRlcHM6MCxwZW5kaW5nSWQ6amkrKyx0aW1lb3V0OnR5cGVvZiBhZT09Im51bWJlciI/YWU6LTEsYWN0aXZlQnJhbmNoOm51bGwscGVuZGluZ0JyYW5jaDpudWxsLGlzSW5GYWxsYmFjazohQ2UsaXNIeWRyYXRpbmc6Q2UsaXNVbm1vdW50ZWQ6ITEsZWZmZWN0czpbXSxyZXNvbHZlKCl7dmFyIEhlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTohMSx3dD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITEse3Zub2RlOnR0LGFjdGl2ZUJyYW5jaDppLHBlbmRpbmdCcmFuY2g6bCxwZW5kaW5nSWQ6aCxlZmZlY3RzOnYscGFyZW50Q29tcG9uZW50OkEsY29udGFpbmVyOlR9PXdlLGs9ITE7d2UuaXNIeWRyYXRpbmc/d2UuaXNIeWRyYXRpbmc9ITE6SGV8fChrPWkmJmwudHJhbnNpdGlvbiYmbC50cmFuc2l0aW9uLm1vZGU9PT0ib3V0LWluIixrJiYoaS50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9PntoPT09d2UucGVuZGluZ0lkJiYoaGUobCxULE89PT1rZT9ldChpKTpPLDApLGduKHYpKX0pLGkmJihndChpLmVsKSE9PXdlLmhpZGRlbkNvbnRhaW5lciYmKE89ZXQoaSkpLERlKGksQSx3ZSwhMCkpLGt8fGhlKGwsVCxPLDApKSxUZSh3ZSxsKSx3ZS5wZW5kaW5nQnJhbmNoPW51bGwsd2UuaXNJbkZhbGxiYWNrPSExO2Zvcih2YXIgRD13ZS5wYXJlbnQsaj0hMTtEOyl7aWYoRC5wZW5kaW5nQnJhbmNoKXtELmVmZmVjdHMucHVzaCguLi52KSxqPSEwO2JyZWFrfUQ9RC5wYXJlbnR9IWomJiFrJiZnbih2KSx3ZS5lZmZlY3RzPVtdLEh0JiZjJiZjLnBlbmRpbmdCcmFuY2gmJlZ0PT09Yy5wZW5kaW5nSWQmJihjLmRlcHMtLSxjLmRlcHM9PT0wJiYhd3QmJmMucmVzb2x2ZSgpKSxPaSh0dCwib25SZXNvbHZlIil9LGZhbGxiYWNrKEhlKXtpZighIXdlLnBlbmRpbmdCcmFuY2gpe3Zhcnt2bm9kZTp3dCxhY3RpdmVCcmFuY2g6dHQscGFyZW50Q29tcG9uZW50OmksY29udGFpbmVyOmwsbmFtZXNwYWNlOmh9PXdlO09pKHd0LCJvbkZhbGxiYWNrIik7dmFyIHY9ZXQodHQpLEE9KCk9Pnshd2UuaXNJbkZhbGxiYWNrfHwoR2UobnVsbCxIZSxsLHYsaSxudWxsLGgsSixIKSxUZSh3ZSxIZSkpfSxUPUhlLnRyYW5zaXRpb24mJkhlLnRyYW5zaXRpb24ubW9kZT09PSJvdXQtaW4iO1QmJih0dC50cmFuc2l0aW9uLmFmdGVyTGVhdmU9QSksd2UuaXNJbkZhbGxiYWNrPSEwLERlKHR0LGksbnVsbCwhMCksVHx8QSgpfX0sbW92ZShIZSx3dCx0dCl7d2UuYWN0aXZlQnJhbmNoJiZoZSh3ZS5hY3RpdmVCcmFuY2gsSGUsd3QsdHQpLHdlLmNvbnRhaW5lcj1IZX0sbmV4dCgpe3JldHVybiB3ZS5hY3RpdmVCcmFuY2gmJmV0KHdlLmFjdGl2ZUJyYW5jaCl9LHJlZ2lzdGVyRGVwKEhlLHd0KXt2YXIgdHQ9ISF3ZS5wZW5kaW5nQnJhbmNoO3R0JiZ3ZS5kZXBzKys7dmFyIGk9SGUudm5vZGUuZWw7SGUuYXN5bmNEZXAuY2F0Y2gobD0+e1puKGwsSGUsMCl9KS50aGVuKGw9PntpZighKEhlLmlzVW5tb3VudGVkfHx3ZS5pc1VubW91bnRlZHx8d2UucGVuZGluZ0lkIT09SGUuc3VzcGVuc2VJZCkpe0hlLmFzeW5jUmVzb2x2ZWQ9ITA7dmFye3Zub2RlOmh9PUhlO3JzKEhlLGwsITEpLGkmJihoLmVsPWkpO3ZhciB2PSFpJiZIZS5zdWJUcmVlLmVsO3d0KEhlLGgsZ3QoaXx8SGUuc3ViVHJlZS5lbCksaT9udWxsOmV0KEhlLnN1YlRyZWUpLHdlLEwsSCksdiYmZHQodiksQm8oSGUsaC5lbCksdHQmJi0td2UuZGVwcz09PTAmJndlLnJlc29sdmUoKX19KX0sdW5tb3VudChIZSx3dCl7d2UuaXNVbm1vdW50ZWQ9ITAsd2UuYWN0aXZlQnJhbmNoJiZEZSh3ZS5hY3RpdmVCcmFuY2gsbSxIZSx3dCksd2UucGVuZGluZ0JyYW5jaCYmRGUod2UucGVuZGluZ0JyYW5jaCxtLEhlLHd0KX19O3JldHVybiB3ZX1mdW5jdGlvbiBqbihhLGMsbSx3LE4sTyxMLEosSCl7dmFyIGVlPWMuc3VzcGVuc2U9V2koYyx3LG0sYS5wYXJlbnROb2RlLG8uY3JlYXRlRWxlbWVudCgiZGl2IiksbnVsbCxOLE8sTCxKLCEwKSxDZT1IKGEsZWUucGVuZGluZ0JyYW5jaD1jLnNzQ29udGVudCxtLGVlLE8sTCk7cmV0dXJuIGVlLmRlcHM9PT0wJiZlZS5yZXNvbHZlKCExLCEwKSxDZX1mdW5jdGlvbiBZcihhKXt2YXJ7c2hhcGVGbGFnOmMsY2hpbGRyZW46bX09YSx3PWMmMzI7YS5zc0NvbnRlbnQ9VHIodz9tLmRlZmF1bHQ6bSksYS5zc0ZhbGxiYWNrPXc/VHIobS5mYWxsYmFjayk6X2UoVXIpfWZ1bmN0aW9uIFRyKGEpe3ZhciBjO2lmKHkuaXNGdW5jdGlvbihhKSl7dmFyIG09WW4mJmEuX2M7bSYmKGEuX2Q9ITEsZ3IoKSksYT1hKCksbSYmKGEuX2Q9ITAsYz1HbixnbygpKX1pZih5LmlzQXJyYXkoYSkpe3ZhciB3PVFuKGEpO2E9d31yZXR1cm4gYT1CbihhKSxjJiYhYS5keW5hbWljQ2hpbGRyZW4mJihhLmR5bmFtaWNDaGlsZHJlbj1jLmZpbHRlcihOPT5OIT09YSkpLGF9ZnVuY3Rpb24gQnQoYSxjKXtjJiZjLnBlbmRpbmdCcmFuY2g/eS5pc0FycmF5KGEpP2MuZWZmZWN0cy5wdXNoKC4uLmEpOmMuZWZmZWN0cy5wdXNoKGEpOmduKGEpfWZ1bmN0aW9uIFRlKGEsYyl7YS5hY3RpdmVCcmFuY2g9Yztmb3IodmFye3Zub2RlOm0scGFyZW50Q29tcG9uZW50Ond9PWEsTj1jLmVsOyFOJiZjLmNvbXBvbmVudDspYz1jLmNvbXBvbmVudC5zdWJUcmVlLE49Yy5lbDttLmVsPU4sdyYmdy5zdWJUcmVlPT09bSYmKHcudm5vZGUuZWw9TixCbyh3LE4pKX1mdW5jdGlvbiBGYShhKXt2YXIgYztyZXR1cm4oKGM9YS5wcm9wcyk9PW51bGw/dm9pZCAwOmMuc3VzcGVuc2libGUpIT1udWxsJiZhLnByb3BzLnN1c3BlbnNpYmxlIT09ITF9dmFyIGNuPVN5bWJvbC5mb3IoInYtc2N4Iiksc289KCk9Pnt7dmFyIGE9RWEoY24pO3JldHVybiBhfX07ZnVuY3Rpb24gcXIoYSxjKXtyZXR1cm4gdWkoYSxudWxsLGMpfWZ1bmN0aW9uIEdpKGEsYyl7cmV0dXJuIHVpKGEsbnVsbCx7Zmx1c2g6InBvc3QifSl9ZnVuY3Rpb24gTG8oYSxjKXtyZXR1cm4gdWkoYSxudWxsLHtmbHVzaDoic3luYyJ9KX12YXIgWWk9e307ZnVuY3Rpb24gUGkoYSxjLG0pe3JldHVybiB1aShhLGMsbSl9ZnVuY3Rpb24gdWkoYSxjKXt2YXJ7aW1tZWRpYXRlOm0sZGVlcDp3LGZsdXNoOk4sb25jZTpPLG9uVHJhY2s6TCxvblRyaWdnZXI6Sn09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnkuRU1QVFlfT0JKO2lmKGMmJk8pe3ZhciBIPWM7Yz1mdW5jdGlvbigpe0goLi4uYXJndW1lbnRzKSx0dCgpfX12YXIgZWU9X24sQ2U9aT0+dz09PSEwP2k6TXIoaSx3PT09ITE/MTp2b2lkIDApLEdlLGhlPSExLERlPSExO2lmKEkuaXNSZWYoYSk/KEdlPSgpPT5hLnZhbHVlLGhlPUkuaXNTaGFsbG93KGEpKTpJLmlzUmVhY3RpdmUoYSk/KEdlPSgpPT5DZShhKSxoZT0hMCk6eS5pc0FycmF5KGEpPyhEZT0hMCxoZT1hLnNvbWUoaT0+SS5pc1JlYWN0aXZlKGkpfHxJLmlzU2hhbGxvdyhpKSksR2U9KCk9PmEubWFwKGk9PntpZihJLmlzUmVmKGkpKXJldHVybiBpLnZhbHVlO2lmKEkuaXNSZWFjdGl2ZShpKSlyZXR1cm4gQ2UoaSk7aWYoeS5pc0Z1bmN0aW9uKGkpKXJldHVybiBsbihpLGVlLDIpfSkpOnkuaXNGdW5jdGlvbihhKT9jP0dlPSgpPT5sbihhLGVlLDIpOkdlPSgpPT4oZ3QmJmd0KCksYm4oYSxlZSwzLFtkdF0pKTpHZT15Lk5PT1AsYyYmdyl7dmFyIGV0PUdlO0dlPSgpPT5NcihldCgpKX12YXIgZ3QsZHQ9aT0+e2d0PUhlLm9uU3RvcD0oKT0+e2xuKGksZWUsNCksZ3Q9SGUub25TdG9wPXZvaWQgMH19LFZ0O2lmKGcuaXNJblNTUkNvbXBvbmVudFNldHVwKWlmKGR0PXkuTk9PUCxjP20mJmJuKGMsZWUsMyxbR2UoKSxEZT9bXTp2b2lkIDAsZHRdKTpHZSgpLE49PT0ic3luYyIpe3ZhciBIdD1zbygpO1Z0PUh0Ll9fd2F0Y2hlckhhbmRsZXN8fChIdC5fX3dhdGNoZXJIYW5kbGVzPVtdKX1lbHNlIHJldHVybiB5Lk5PT1A7dmFyIGFlPURlP25ldyBBcnJheShhLmxlbmd0aCkuZmlsbChZaSk6WWksa2U9KCk9PntpZighKCFIZS5hY3RpdmV8fCFIZS5kaXJ0eSkpaWYoYyl7dmFyIGk9SGUucnVuKCk7KHd8fGhlfHwoRGU/aS5zb21lKChsLGgpPT55Lmhhc0NoYW5nZWQobCxhZVtoXSkpOnkuaGFzQ2hhbmdlZChpLGFlKSkpJiYoZ3QmJmd0KCksYm4oYyxlZSwzLFtpLGFlPT09WWk/dm9pZCAwOkRlJiZhZVswXT09PVlpP1tdOmFlLGR0XSksYWU9aSl9ZWxzZSBIZS5ydW4oKX07a2UuYWxsb3dSZWN1cnNlPSEhYzt2YXIgd2U7Tj09PSJzeW5jIj93ZT1rZTpOPT09InBvc3QiP3dlPSgpPT5rdChrZSxlZSYmZWUuc3VzcGVuc2UpOihrZS5wcmU9ITAsZWUmJihrZS5pZD1lZS51aWQpLHdlPSgpPT5odChrZSkpO3ZhciBIZT1uZXcgSS5SZWFjdGl2ZUVmZmVjdChHZSx5Lk5PT1Asd2UpLHd0PUkuZ2V0Q3VycmVudFNjb3BlKCksdHQ9KCk9PntIZS5zdG9wKCksd3QmJnkucmVtb3ZlKHd0LmVmZmVjdHMsSGUpfTtyZXR1cm4gYz9tP2tlKCk6YWU9SGUucnVuKCk6Tj09PSJwb3N0Ij9rdChIZS5ydW4uYmluZChIZSksZWUmJmVlLnN1c3BlbnNlKTpIZS5ydW4oKSxWdCYmVnQucHVzaCh0dCksdHR9ZnVuY3Rpb24gZmkoYSxjLG0pe3ZhciB3PXRoaXMucHJveHksTj15LmlzU3RyaW5nKGEpP2EuaW5jbHVkZXMoIi4iKT9icih3LGEpOigpPT53W2FdOmEuYmluZCh3LHcpLE87eS5pc0Z1bmN0aW9uKGMpP089YzooTz1jLmhhbmRsZXIsbT1jKTt2YXIgTD1oaSh0aGlzKSxKPXVpKE4sTy5iaW5kKHcpLG0pO3JldHVybiBMKCksSn1mdW5jdGlvbiBicihhLGMpe3ZhciBtPWMuc3BsaXQoIi4iKTtyZXR1cm4oKT0+e2Zvcih2YXIgdz1hLE49MDtOPG0ubGVuZ3RoJiZ3O04rKyl3PXdbbVtOXV07cmV0dXJuIHd9fWZ1bmN0aW9uIE1yKGEsYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOjAsdz1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZigheS5pc09iamVjdChhKXx8YS5fX3Zfc2tpcClyZXR1cm4gYTtpZihjJiZjPjApe2lmKG0+PWMpcmV0dXJuIGE7bSsrfWlmKHc9d3x8bmV3IFNldCx3LmhhcyhhKSlyZXR1cm4gYTtpZih3LmFkZChhKSxJLmlzUmVmKGEpKU1yKGEudmFsdWUsYyxtLHcpO2Vsc2UgaWYoeS5pc0FycmF5KGEpKWZvcih2YXIgTj0wO048YS5sZW5ndGg7TisrKU1yKGFbTl0sYyxtLHcpO2Vsc2UgaWYoeS5pc1NldChhKXx8eS5pc01hcChhKSlhLmZvckVhY2goTD0+e01yKEwsYyxtLHcpfSk7ZWxzZSBpZih5LmlzUGxhaW5PYmplY3QoYSkpZm9yKHZhciBPIGluIGEpTXIoYVtPXSxjLG0sdyk7cmV0dXJuIGF9ZnVuY3Rpb24gbG8oYSxjKXtpZihPbj09PW51bGwpcmV0dXJuIGE7Zm9yKHZhciBtPWthKE9uKXx8T24ucHJveHksdz1hLmRpcnN8fChhLmRpcnM9W10pLE49MDtOPGMubGVuZ3RoO04rKyl7dmFyW08sTCxKLEg9eS5FTVBUWV9PQkpdPWNbTl07TyYmKHkuaXNGdW5jdGlvbihPKSYmKE89e21vdW50ZWQ6Tyx1cGRhdGVkOk99KSxPLmRlZXAmJk1yKEwpLHcucHVzaCh7ZGlyOk8saW5zdGFuY2U6bSx2YWx1ZTpMLG9sZFZhbHVlOnZvaWQgMCxhcmc6Sixtb2RpZmllcnM6SH0pKX1yZXR1cm4gYX1mdW5jdGlvbiB0aShhLGMsbSx3KXtmb3IodmFyIE49YS5kaXJzLE89YyYmYy5kaXJzLEw9MDtMPE4ubGVuZ3RoO0wrKyl7dmFyIEo9TltMXTtPJiYoSi5vbGRWYWx1ZT1PW0xdLnZhbHVlKTt2YXIgSD1KLmRpclt3XTtIJiYoSS5wYXVzZVRyYWNraW5nKCksYm4oSCxtLDgsW2EuZWwsSixhLGNdKSxJLnJlc2V0VHJhY2tpbmcoKSl9fXZhciBwbj1TeW1ib2woIl9sZWF2ZUNiIikseXI9U3ltYm9sKCJfZW50ZXJDYiIpO2Z1bmN0aW9uIHFpKCl7dmFyIGE9e2lzTW91bnRlZDohMSxpc0xlYXZpbmc6ITEsaXNVbm1vdW50aW5nOiExLGxlYXZpbmdWTm9kZXM6bmV3IE1hcH07cmV0dXJuIEV0KCgpPT57YS5pc01vdW50ZWQ9ITB9KSx3bygoKT0+e2EuaXNVbm1vdW50aW5nPSEwfSksYX12YXIgUG49W0Z1bmN0aW9uLEFycmF5XSxfaT17bW9kZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4scGVyc2lzdGVkOkJvb2xlYW4sb25CZWZvcmVFbnRlcjpQbixvbkVudGVyOlBuLG9uQWZ0ZXJFbnRlcjpQbixvbkVudGVyQ2FuY2VsbGVkOlBuLG9uQmVmb3JlTGVhdmU6UG4sb25MZWF2ZTpQbixvbkFmdGVyTGVhdmU6UG4sb25MZWF2ZUNhbmNlbGxlZDpQbixvbkJlZm9yZUFwcGVhcjpQbixvbkFwcGVhcjpQbixvbkFmdGVyQXBwZWFyOlBuLG9uQXBwZWFyQ2FuY2VsbGVkOlBufSxGbz17bmFtZToiQmFzZVRyYW5zaXRpb24iLHByb3BzOl9pLHNldHVwKGEsYyl7dmFye3Nsb3RzOm19PWMsdz1wbygpLE49cWkoKTtyZXR1cm4oKT0+e3ZhciBPPW0uZGVmYXVsdCYmYmkobS5kZWZhdWx0KCksITApO2lmKCEoIU98fCFPLmxlbmd0aCkpe3ZhciBMPU9bMF07aWYoTy5sZW5ndGg+MSl7Zm9yKHZhciBKIG9mIE8paWYoSi50eXBlIT09VXIpe0w9SjticmVha319dmFyIEg9SS50b1JhdyhhKSx7bW9kZTplZX09SDtpZihOLmlzTGVhdmluZylyZXR1cm4gc3IoTCk7dmFyIENlPUxyKEwpO2lmKCFDZSlyZXR1cm4gc3IoTCk7dmFyIEdlPUVyKENlLEgsTix3KTtTcihDZSxHZSk7dmFyIGhlPXcuc3ViVHJlZSxEZT1oZSYmTHIoaGUpO2lmKERlJiZEZS50eXBlIT09VXImJiFIcihDZSxEZSkpe3ZhciBldD1FcihEZSxILE4sdyk7aWYoU3IoRGUsZXQpLGVlPT09Im91dC1pbiIpcmV0dXJuIE4uaXNMZWF2aW5nPSEwLGV0LmFmdGVyTGVhdmU9KCk9PntOLmlzTGVhdmluZz0hMSx3LnVwZGF0ZS5hY3RpdmUhPT0hMSYmKHcuZWZmZWN0LmRpcnR5PSEwLHcudXBkYXRlKCkpfSxzcihMKTtlZT09PSJpbi1vdXQiJiZDZS50eXBlIT09VXImJihldC5kZWxheUxlYXZlPShndCxkdCxWdCk9Pnt2YXIgSHQ9Tm4oTixEZSk7SHRbU3RyaW5nKERlLmtleSldPURlLGd0W3BuXT0oKT0+e2R0KCksZ3RbcG5dPXZvaWQgMCxkZWxldGUgR2UuZGVsYXllZExlYXZlfSxHZS5kZWxheWVkTGVhdmU9VnR9KX1yZXR1cm4gTH19fX0sdGE9Rm87ZnVuY3Rpb24gTm4oYSxjKXt2YXJ7bGVhdmluZ1ZOb2RlczptfT1hLHc9bS5nZXQoYy50eXBlKTtyZXR1cm4gd3x8KHc9T2JqZWN0LmNyZWF0ZShudWxsKSxtLnNldChjLnR5cGUsdykpLHd9ZnVuY3Rpb24gRXIoYSxjLG0sdyl7dmFye2FwcGVhcjpOLG1vZGU6TyxwZXJzaXN0ZWQ6TD0hMSxvbkJlZm9yZUVudGVyOkosb25FbnRlcjpILG9uQWZ0ZXJFbnRlcjplZSxvbkVudGVyQ2FuY2VsbGVkOkNlLG9uQmVmb3JlTGVhdmU6R2Usb25MZWF2ZTpoZSxvbkFmdGVyTGVhdmU6RGUsb25MZWF2ZUNhbmNlbGxlZDpldCxvbkJlZm9yZUFwcGVhcjpndCxvbkFwcGVhcjpkdCxvbkFmdGVyQXBwZWFyOlZ0LG9uQXBwZWFyQ2FuY2VsbGVkOkh0fT1jLGFlPVN0cmluZyhhLmtleSksa2U9Tm4obSxhKSx3ZT0odHQsaSk9Pnt0dCYmYm4odHQsdyw5LGkpfSxIZT0odHQsaSk9Pnt2YXIgbD1pWzFdO3dlKHR0LGkpLHkuaXNBcnJheSh0dCk/dHQuZXZlcnkoaD0+aC5sZW5ndGg8PTEpJiZsKCk6dHQubGVuZ3RoPD0xJiZsKCl9LHd0PXttb2RlOk8scGVyc2lzdGVkOkwsYmVmb3JlRW50ZXIodHQpe3ZhciBpPUo7aWYoIW0uaXNNb3VudGVkKWlmKE4paT1ndHx8SjtlbHNlIHJldHVybjt0dFtwbl0mJnR0W3BuXSghMCk7dmFyIGw9a2VbYWVdO2wmJkhyKGEsbCkmJmwuZWxbcG5dJiZsLmVsW3BuXSgpLHdlKGksW3R0XSl9LGVudGVyKHR0KXt2YXIgaT1ILGw9ZWUsaD1DZTtpZighbS5pc01vdW50ZWQpaWYoTilpPWR0fHxILGw9VnR8fGVlLGg9SHR8fENlO2Vsc2UgcmV0dXJuO3ZhciB2PSExLEE9dHRbeXJdPVQ9Pnt2fHwodj0hMCxUP3dlKGgsW3R0XSk6d2UobCxbdHRdKSx3dC5kZWxheWVkTGVhdmUmJnd0LmRlbGF5ZWRMZWF2ZSgpLHR0W3lyXT12b2lkIDApfTtpP0hlKGksW3R0LEFdKTpBKCl9LGxlYXZlKHR0LGkpe3ZhciBsPVN0cmluZyhhLmtleSk7aWYodHRbeXJdJiZ0dFt5cl0oITApLG0uaXNVbm1vdW50aW5nKXJldHVybiBpKCk7d2UoR2UsW3R0XSk7dmFyIGg9ITEsdj10dFtwbl09QT0+e2h8fChoPSEwLGkoKSxBP3dlKGV0LFt0dF0pOndlKERlLFt0dF0pLHR0W3BuXT12b2lkIDAsa2VbbF09PT1hJiZkZWxldGUga2VbbF0pfTtrZVtsXT1hLGhlP0hlKGhlLFt0dCx2XSk6digpfSxjbG9uZSh0dCl7cmV0dXJuIEVyKHR0LGMsbSx3KX19O3JldHVybiB3dH1mdW5jdGlvbiBzcihhKXtpZihNKGEpKXJldHVybiBhPW9uKGEpLGEuY2hpbGRyZW49bnVsbCxhfWZ1bmN0aW9uIExyKGEpe3JldHVybiBNKGEpP2EuY2hpbGRyZW4/YS5jaGlsZHJlblswXTp2b2lkIDA6YX1mdW5jdGlvbiBTcihhLGMpe2Euc2hhcGVGbGFnJjYmJmEuY29tcG9uZW50P1NyKGEuY29tcG9uZW50LnN1YlRyZWUsYyk6YS5zaGFwZUZsYWcmMTI4PyhhLnNzQ29udGVudC50cmFuc2l0aW9uPWMuY2xvbmUoYS5zc0NvbnRlbnQpLGEuc3NGYWxsYmFjay50cmFuc2l0aW9uPWMuY2xvbmUoYS5zc0ZhbGxiYWNrKSk6YS50cmFuc2l0aW9uPWN9ZnVuY3Rpb24gYmkoYSl7Zm9yKHZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMSxtPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLHc9W10sTj0wLE89MDtPPGEubGVuZ3RoO08rKyl7dmFyIEw9YVtPXSxKPW09PW51bGw/TC5rZXk6U3RyaW5nKG0pK1N0cmluZyhMLmtleSE9bnVsbD9MLmtleTpPKTtMLnR5cGU9PT10cj8oTC5wYXRjaEZsYWcmMTI4JiZOKyssdz13LmNvbmNhdChiaShMLmNoaWxkcmVuLGMsSikpKTooY3x8TC50eXBlIT09VXIpJiZ3LnB1c2goSiE9bnVsbD9vbihMLHtrZXk6Sn0pOkwpfWlmKE4+MSlmb3IodmFyIEg9MDtIPHcubGVuZ3RoO0grKyl3W0hdLnBhdGNoRmxhZz0tMjtyZXR1cm4gd31mdW5jdGlvbiBTbyhhLGMpe3JldHVybiB5LmlzRnVuY3Rpb24oYSk/KCgpPT55LmV4dGVuZCh7bmFtZTphLm5hbWV9LGMse3NldHVwOmF9KSkoKTphfXZhciBOaT1hPT4hIWEudHlwZS5fX2FzeW5jTG9hZGVyO2Z1bmN0aW9uIGtpKGEpe3kuaXNGdW5jdGlvbihhKSYmKGE9e2xvYWRlcjphfSk7dmFye2xvYWRlcjpjLGxvYWRpbmdDb21wb25lbnQ6bSxlcnJvckNvbXBvbmVudDp3LGRlbGF5Ok49MjAwLHRpbWVvdXQ6TyxzdXNwZW5zaWJsZTpMPSEwLG9uRXJyb3I6Sn09YSxIPW51bGwsZWUsQ2U9MCxHZT0oKT0+KENlKyssSD1udWxsLGhlKCkpLGhlPSgpPT57dmFyIERlO3JldHVybiBIfHwoRGU9SD1jKCkuY2F0Y2goZXQ9PntpZihldD1ldCBpbnN0YW5jZW9mIEVycm9yP2V0Om5ldyBFcnJvcihTdHJpbmcoZXQpKSxKKXJldHVybiBuZXcgUHJvbWlzZSgoZ3QsZHQpPT57dmFyIFZ0PSgpPT5ndChHZSgpKSxIdD0oKT0+ZHQoZXQpO0ooZXQsVnQsSHQsQ2UrMSl9KTt0aHJvdyBldH0pLnRoZW4oZXQ9PkRlIT09SCYmSD9IOihldCYmKGV0Ll9fZXNNb2R1bGV8fGV0W1N5bWJvbC50b1N0cmluZ1RhZ109PT0iTW9kdWxlIikmJihldD1ldC5kZWZhdWx0KSxlZT1ldCxldCkpKX07cmV0dXJuIFNvKHtuYW1lOiJBc3luY0NvbXBvbmVudFdyYXBwZXIiLF9fYXN5bmNMb2FkZXI6aGUsZ2V0IF9fYXN5bmNSZXNvbHZlZCgpe3JldHVybiBlZX0sc2V0dXAoKXt2YXIgRGU9X247aWYoZWUpcmV0dXJuKCk9PmNvKGVlLERlKTt2YXIgZXQ9SHQ9PntIPW51bGwsWm4oSHQsRGUsMTMpfTtpZihMJiZEZS5zdXNwZW5zZXx8Zy5pc0luU1NSQ29tcG9uZW50U2V0dXApcmV0dXJuIGhlKCkudGhlbihIdD0+KCk9PmNvKEh0LERlKSkuY2F0Y2goSHQ9PihldChIdCksKCk9Pnc/X2Uodyx7ZXJyb3I6SHR9KTpudWxsKSk7dmFyIGd0PUkucmVmKCExKSxkdD1JLnJlZigpLFZ0PUkucmVmKCEhTik7cmV0dXJuIE4mJnNldFRpbWVvdXQoKCk9PntWdC52YWx1ZT0hMX0sTiksTyE9bnVsbCYmc2V0VGltZW91dCgoKT0+e2lmKCFndC52YWx1ZSYmIWR0LnZhbHVlKXt2YXIgSHQ9bmV3IEVycm9yKCJBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICIuY29uY2F0KE8sIm1zLiIpKTtldChIdCksZHQudmFsdWU9SHR9fSxPKSxoZSgpLnRoZW4oKCk9PntndC52YWx1ZT0hMCxEZS5wYXJlbnQmJk0oRGUucGFyZW50LnZub2RlKSYmKERlLnBhcmVudC5lZmZlY3QuZGlydHk9ITAsaHQoRGUucGFyZW50LnVwZGF0ZSkpfSkuY2F0Y2goSHQ9PntldChIdCksZHQudmFsdWU9SHR9KSwoKT0+e2lmKGd0LnZhbHVlJiZlZSlyZXR1cm4gY28oZWUsRGUpO2lmKGR0LnZhbHVlJiZ3KXJldHVybiBfZSh3LHtlcnJvcjpkdC52YWx1ZX0pO2lmKG0mJiFWdC52YWx1ZSlyZXR1cm4gX2UobSl9fX0pfWZ1bmN0aW9uIGNvKGEsYyl7dmFye3JlZjptLHByb3BzOncsY2hpbGRyZW46TixjZTpPfT1jLnZub2RlLEw9X2UoYSx3LE4pO3JldHVybiBMLnJlZj1tLEwuY2U9TyxkZWxldGUgYy52bm9kZS5jZSxMfXZhciBNPWE9PmEudHlwZS5fX2lzS2VlcEFsaXZlLFc9e25hbWU6IktlZXBBbGl2ZSIsX19pc0tlZXBBbGl2ZTohMCxwcm9wczp7aW5jbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sZXhjbHVkZTpbU3RyaW5nLFJlZ0V4cCxBcnJheV0sbWF4OltTdHJpbmcsTnVtYmVyXX0sc2V0dXAoYSxjKXt2YXJ7c2xvdHM6bX09Yyx3PXBvKCksTj13LmN0eDtpZighTi5yZW5kZXJlcilyZXR1cm4oKT0+e3ZhciBhZT1tLmRlZmF1bHQmJm0uZGVmYXVsdCgpO3JldHVybiBhZSYmYWUubGVuZ3RoPT09MT9hZVswXTphZX07dmFyIE89bmV3IE1hcCxMPW5ldyBTZXQsSj1udWxsLEg9dy5zdXNwZW5zZSx7cmVuZGVyZXI6e3A6ZWUsbTpDZSx1bTpHZSxvOntjcmVhdGVFbGVtZW50OmhlfX19PU4sRGU9aGUoImRpdiIpO04uYWN0aXZhdGU9KGFlLGtlLHdlLEhlLHd0KT0+e3ZhciB0dD1hZS5jb21wb25lbnQ7Q2UoYWUsa2Usd2UsMCxIKSxlZSh0dC52bm9kZSxhZSxrZSx3ZSx0dCxILEhlLGFlLnNsb3RTY29wZUlkcyx3dCksa3QoKCk9Pnt0dC5pc0RlYWN0aXZhdGVkPSExLHR0LmEmJnkuaW52b2tlQXJyYXlGbnModHQuYSk7dmFyIGk9YWUucHJvcHMmJmFlLnByb3BzLm9uVm5vZGVNb3VudGVkO2kmJnpuKGksdHQucGFyZW50LGFlKX0sSCl9LE4uZGVhY3RpdmF0ZT1hZT0+e3ZhciBrZT1hZS5jb21wb25lbnQ7Q2UoYWUsRGUsbnVsbCwxLEgpLGt0KCgpPT57a2UuZGEmJnkuaW52b2tlQXJyYXlGbnMoa2UuZGEpO3ZhciB3ZT1hZS5wcm9wcyYmYWUucHJvcHMub25Wbm9kZVVubW91bnRlZDt3ZSYmem4od2Usa2UucGFyZW50LGFlKSxrZS5pc0RlYWN0aXZhdGVkPSEwfSxIKX07ZnVuY3Rpb24gZXQoYWUpe09yKGFlKSxHZShhZSx3LEgsITApfWZ1bmN0aW9uIGd0KGFlKXtPLmZvckVhY2goKGtlLHdlKT0+e3ZhciBIZT1IYShrZS50eXBlKTtIZSYmKCFhZXx8IWFlKEhlKSkmJmR0KHdlKX0pfWZ1bmN0aW9uIGR0KGFlKXt2YXIga2U9Ty5nZXQoYWUpOyFKfHwhSHIoa2UsSik/ZXQoa2UpOkomJk9yKEopLE8uZGVsZXRlKGFlKSxMLmRlbGV0ZShhZSl9UGkoKCk9PlthLmluY2x1ZGUsYS5leGNsdWRlXSxhZT0+e3ZhcltrZSx3ZV09YWU7a2UmJmd0KEhlPT4kZShrZSxIZSkpLHdlJiZndChIZT0+ISRlKHdlLEhlKSl9LHtmbHVzaDoicG9zdCIsZGVlcDohMH0pO3ZhciBWdD1udWxsLEh0PSgpPT57VnQhPW51bGwmJk8uc2V0KFZ0LElpKHcuc3ViVHJlZSkpfTtyZXR1cm4gRXQoSHQpLG5pKEh0KSx3bygoKT0+e08uZm9yRWFjaChhZT0+e3ZhcntzdWJUcmVlOmtlLHN1c3BlbnNlOndlfT13LEhlPUlpKGtlKTtpZihhZS50eXBlPT09SGUudHlwZSYmYWUua2V5PT09SGUua2V5KXtPcihIZSk7dmFyIHd0PUhlLmNvbXBvbmVudC5kYTt3dCYma3Qod3Qsd2UpO3JldHVybn1ldChhZSl9KX0pLCgpPT57aWYoVnQ9bnVsbCwhbS5kZWZhdWx0KXJldHVybiBudWxsO3ZhciBhZT1tLmRlZmF1bHQoKSxrZT1hZVswXTtpZihhZS5sZW5ndGg+MSlyZXR1cm4gSj1udWxsLGFlO2lmKCFLcihrZSl8fCEoa2Uuc2hhcGVGbGFnJjQpJiYhKGtlLnNoYXBlRmxhZyYxMjgpKXJldHVybiBKPW51bGwsa2U7dmFyIHdlPUlpKGtlKSxIZT13ZS50eXBlLHd0PUhhKE5pKHdlKT93ZS50eXBlLl9fYXN5bmNSZXNvbHZlZHx8e306SGUpLHtpbmNsdWRlOnR0LGV4Y2x1ZGU6aSxtYXg6bH09YTtpZih0dCYmKCF3dHx8ISRlKHR0LHd0KSl8fGkmJnd0JiYkZShpLHd0KSlyZXR1cm4gSj13ZSxrZTt2YXIgaD13ZS5rZXk9PW51bGw/SGU6d2Uua2V5LHY9Ty5nZXQoaCk7cmV0dXJuIHdlLmVsJiYod2U9b24od2UpLGtlLnNoYXBlRmxhZyYxMjgmJihrZS5zc0NvbnRlbnQ9d2UpKSxWdD1oLHY/KHdlLmVsPXYuZWwsd2UuY29tcG9uZW50PXYuY29tcG9uZW50LHdlLnRyYW5zaXRpb24mJlNyKHdlLHdlLnRyYW5zaXRpb24pLHdlLnNoYXBlRmxhZ3w9NTEyLEwuZGVsZXRlKGgpLEwuYWRkKGgpKTooTC5hZGQoaCksbCYmTC5zaXplPnBhcnNlSW50KGwsMTApJiZkdChMLnZhbHVlcygpLm5leHQoKS52YWx1ZSkpLHdlLnNoYXBlRmxhZ3w9MjU2LEo9d2UsZWkoa2UudHlwZSk/a2U6d2V9fX0sbGU9VztmdW5jdGlvbiAkZShhLGMpe3JldHVybiB5LmlzQXJyYXkoYSk/YS5zb21lKG09PiRlKG0sYykpOnkuaXNTdHJpbmcoYSk/YS5zcGxpdCgiLCIpLmluY2x1ZGVzKGMpOnkuaXNSZWdFeHAoYSk/YS50ZXN0KGMpOiExfWZ1bmN0aW9uIHplKGEsYyl7UXQoYSwiYSIsYyl9ZnVuY3Rpb24gYXQoYSxjKXtRdChhLCJkYSIsYyl9ZnVuY3Rpb24gUXQoYSxjKXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06X24sdz1hLl9fd2RjfHwoYS5fX3dkYz0oKT0+e2Zvcih2YXIgTz1tO087KXtpZihPLmlzRGVhY3RpdmF0ZWQpcmV0dXJuO089Ty5wYXJlbnR9cmV0dXJuIGEoKX0pO2lmKGhyKGMsdyxtKSxtKWZvcih2YXIgTj1tLnBhcmVudDtOJiZOLnBhcmVudDspTShOLnBhcmVudC52bm9kZSkmJkp0KHcsYyxtLE4pLE49Ti5wYXJlbnR9ZnVuY3Rpb24gSnQoYSxjLG0sdyl7dmFyIE49aHIoYyxhLHcsITApO0FvKCgpPT57eS5yZW1vdmUod1tjXSxOKX0sbSl9ZnVuY3Rpb24gT3IoYSl7YS5zaGFwZUZsYWcmPX4yNTYsYS5zaGFwZUZsYWcmPX41MTJ9ZnVuY3Rpb24gSWkoYSl7cmV0dXJuIGEuc2hhcGVGbGFnJjEyOD9hLnNzQ29udGVudDphfWZ1bmN0aW9uIGhyKGEsYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOl9uLHc9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2lmKG0pe2lmKEJlLmlzUm9vdEhvb2soYSkmJm0hPT1tLnJvb3QmJihtPW0ucm9vdCxCZS5pc1Jvb3RJbW1lZGlhdGVIb29rKGEpKSl7dmFyIE49bS5wcm94eTtibihjLmJpbmQoTiksbSxhLEJlLk9OX0xPQUQ9PT1hP1tOLiRwYWdlLm9wdGlvbnNdOltdKX12YXIgTz1tW2FdfHwobVthXT1bXSksTD1jLl9fd2VofHwoYy5fX3dlaD1mdW5jdGlvbigpe2lmKCFtLmlzVW5tb3VudGVkKXtJLnBhdXNlVHJhY2tpbmcoKTtmb3IodmFyIEo9aGkobSksSD1hcmd1bWVudHMubGVuZ3RoLGVlPW5ldyBBcnJheShIKSxDZT0wO0NlPEg7Q2UrKyllZVtDZV09YXJndW1lbnRzW0NlXTt2YXIgR2U9Ym4oYyxtLGEsZWUpO3JldHVybiBKKCksSS5yZXNldFRyYWNraW5nKCksR2V9fSk7cmV0dXJuIHc/Ty51bnNoaWZ0KEwpOk8ucHVzaChMKSxMfX12YXIgUHI9YT0+ZnVuY3Rpb24oYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOl9uO3JldHVybighZy5pc0luU1NSQ29tcG9uZW50U2V0dXB8fGE9PT0ic3AiKSYmaHIoYSxmdW5jdGlvbigpe3JldHVybiBjKC4uLmFyZ3VtZW50cyl9LG0pfSxSaT1QcigiYm0iKSxFdD1QcigibSIpLER0PVByKCJidSIpLG5pPVByKCJ1Iiksd289UHIoImJ1bSIpLEFvPVByKCJ1bSIpLHNlPVByKCJzcCIpLFk9UHIoInJ0ZyIpLGllPVByKCJydGMiKTtmdW5jdGlvbiBMZShhKXt2YXIgYz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06X247aHIoImVjIixhLGMpfWZ1bmN0aW9uIGx0KGEsYyxtLHcpe3ZhciBOLE89bSYmbVt3XTtpZih5LmlzQXJyYXkoYSl8fHkuaXNTdHJpbmcoYSkpe049bmV3IEFycmF5KGEubGVuZ3RoKTtmb3IodmFyIEw9MCxKPWEubGVuZ3RoO0w8SjtMKyspTltMXT1jKGFbTF0sTCx2b2lkIDAsTyYmT1tMXSl9ZWxzZSBpZih0eXBlb2YgYT09Im51bWJlciIpe049bmV3IEFycmF5KGEpO2Zvcih2YXIgSD0wO0g8YTtIKyspTltIXT1jKEgrMSxILHZvaWQgMCxPJiZPW0hdKX1lbHNlIGlmKHkuaXNPYmplY3QoYSkpaWYoYVtTeW1ib2wuaXRlcmF0b3JdKU49QXJyYXkuZnJvbShhLChEZSxldCk9PmMoRGUsZXQsdm9pZCAwLE8mJk9bZXRdKSk7ZWxzZXt2YXIgZWU9T2JqZWN0LmtleXMoYSk7Tj1uZXcgQXJyYXkoZWUubGVuZ3RoKTtmb3IodmFyIENlPTAsR2U9ZWUubGVuZ3RoO0NlPEdlO0NlKyspe3ZhciBoZT1lZVtDZV07TltDZV09YyhhW2hlXSxoZSxDZSxPJiZPW0NlXSl9fWVsc2UgTj1bXTtyZXR1cm4gbSYmKG1bd109TiksTn1mdW5jdGlvbiBmbihhLGMpe2Zvcih2YXIgbT1mdW5jdGlvbihOKXt2YXIgTz1jW05dO2lmKHkuaXNBcnJheShPKSlmb3IodmFyIEw9MDtMPE8ubGVuZ3RoO0wrKylhW09bTF0ubmFtZV09T1tMXS5mbjtlbHNlIE8mJihhW08ubmFtZV09Ty5rZXk/ZnVuY3Rpb24oKXt2YXIgSj1PLmZuKC4uLmFyZ3VtZW50cyk7cmV0dXJuIEomJihKLmtleT1PLmtleSksSn06Ty5mbil9LHc9MDt3PGMubGVuZ3RoO3crKyltKHcpO3JldHVybiBhfWZ1bmN0aW9uIE5yKGEsYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnt9LHc9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDAsTj1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOnZvaWQgMDtpZihPbi5pc0NFfHxPbi5wYXJlbnQmJk5pKE9uLnBhcmVudCkmJk9uLnBhcmVudC5pc0NFKXJldHVybiBjIT09ImRlZmF1bHQiJiYobS5uYW1lPWMpLF9lKCJzbG90IixtLHcmJncoKSk7dmFyIE89YVtjXTtPJiZPLl9jJiYoTy5fZD0hMSksZ3IoKTt2YXIgTD1PJiZ3cihPKG0pKSxKPWRpKHRyLHtrZXk6bS5rZXl8fEwmJkwua2V5fHwiXyIuY29uY2F0KGMpfSxMfHwodz93KCk6W10pLEwmJmEuXz09PTE/NjQ6LTIpO3JldHVybiFOJiZKLnNjb3BlSWQmJihKLnNsb3RTY29wZUlkcz1bSi5zY29wZUlkKyItcyJdKSxPJiZPLl9jJiYoTy5fZD0hMCksSn1mdW5jdGlvbiB3cihhKXtyZXR1cm4gYS5zb21lKGM9PktyKGMpPyEoYy50eXBlPT09VXJ8fGMudHlwZT09PXRyJiYhd3IoYy5jaGlsZHJlbikpOiEwKT9hOm51bGx9ZnVuY3Rpb24gSmkoYSxjKXt2YXIgbT17fTtmb3IodmFyIHcgaW4gYSltW2MmJi9bQS1aXS8udGVzdCh3KT8ib246Ii5jb25jYXQodyk6eS50b0hhbmRsZXJLZXkodyldPWFbd107cmV0dXJuIG19dmFyIEZyPWE9PmE/bGwoYSk/a2EoYSl8fGEucHJveHk6RnIoYS5wYXJlbnQpOm51bGwsdW89eS5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSx7JDphPT5hLCRlbDphPT5hLnZub2RlLmVsLCRkYXRhOmE9PmEuZGF0YSwkcHJvcHM6YT0+YS5wcm9wcywkYXR0cnM6YT0+YS5hdHRycywkc2xvdHM6YT0+YS5zbG90cywkcmVmczphPT5hLnJlZnMsJHBhcmVudDphPT5GcihhLnBhcmVudCksJHJvb3Q6YT0+RnIoYS5yb290KSwkZW1pdDphPT5hLmVtaXQsJG9wdGlvbnM6YT0+Vm8oYSksJGZvcmNlVXBkYXRlOmE9PmEuZnx8KGEuZj0oKT0+e2EuZWZmZWN0LmRpcnR5PSEwLGh0KGEudXBkYXRlKX0pLCRuZXh0VGljazphPT5hLm58fChhLm49S2UuYmluZChhLnByb3h5KSksJHdhdGNoOmE9PmZpLmJpbmQoYSl9KSxDbz0oYSxjKT0+YSE9PXkuRU1QVFlfT0JKJiYhYS5fX2lzU2NyaXB0U2V0dXAmJnkuaGFzT3duKGEsYyksVG89e2dldChhLGMpe3ZhcntfOm19PWEse2N0eDp3LHNldHVwU3RhdGU6TixkYXRhOk8scHJvcHM6TCxhY2Nlc3NDYWNoZTpKLHR5cGU6SCxhcHBDb250ZXh0OmVlfT1tLENlO2lmKGNbMF0hPT0iJCIpe3ZhciBHZT1KW2NdO2lmKEdlIT09dm9pZCAwKXN3aXRjaChHZSl7Y2FzZSAxOnJldHVybiBOW2NdO2Nhc2UgMjpyZXR1cm4gT1tjXTtjYXNlIDQ6cmV0dXJuIHdbY107Y2FzZSAzOnJldHVybiBMW2NdfWVsc2V7aWYoQ28oTixjKSlyZXR1cm4gSltjXT0xLE5bY107aWYoTyE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bihPLGMpKXJldHVybiBKW2NdPTIsT1tjXTtpZigoQ2U9bS5wcm9wc09wdGlvbnNbMF0pJiZ5Lmhhc093bihDZSxjKSlyZXR1cm4gSltjXT0zLExbY107aWYodyE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bih3LGMpKXJldHVybiBKW2NdPTQsd1tjXTtLaSYmKEpbY109MCl9fXZhciBoZT11b1tjXSxEZSxldDtpZihoZSlyZXR1cm4gYz09PSIkYXR0cnMiJiZJLnRyYWNrKG0sImdldCIsYyksaGUobSk7aWYoKERlPUguX19jc3NNb2R1bGVzKSYmKERlPURlW2NdKSlyZXR1cm4gRGU7aWYodyE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bih3LGMpKXJldHVybiBKW2NdPTQsd1tjXTtpZihldD1lZS5jb25maWcuZ2xvYmFsUHJvcGVydGllcyx5Lmhhc093bihldCxjKSlyZXR1cm4gZXRbY119LHNldChhLGMsbSl7dmFye186d309YSx7ZGF0YTpOLHNldHVwU3RhdGU6TyxjdHg6TH09dztyZXR1cm4gQ28oTyxjKT8oT1tjXT1tLCEwKTpOIT09eS5FTVBUWV9PQkomJnkuaGFzT3duKE4sYyk/KE5bY109bSwhMCk6eS5oYXNPd24ody5wcm9wcyxjKXx8Y1swXT09PSIkIiYmYy5zbGljZSgxKWluIHc/ITE6KExbY109bSwhMCl9LGhhcyhhLGMpe3ZhcntfOntkYXRhOm0sc2V0dXBTdGF0ZTp3LGFjY2Vzc0NhY2hlOk4sY3R4Ok8sYXBwQ29udGV4dDpMLHByb3BzT3B0aW9uczpKfX09YSxIO3JldHVybiEhTltjXXx8bSE9PXkuRU1QVFlfT0JKJiZ5Lmhhc093bihtLGMpfHxDbyh3LGMpfHwoSD1KWzBdKSYmeS5oYXNPd24oSCxjKXx8eS5oYXNPd24oTyxjKXx8eS5oYXNPd24odW8sYyl8fHkuaGFzT3duKEwuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsYyl9LGRlZmluZVByb3BlcnR5KGEsYyxtKXtyZXR1cm4gbS5nZXQhPW51bGw/YS5fLmFjY2Vzc0NhY2hlW2NdPTA6eS5oYXNPd24obSwidmFsdWUiKSYmdGhpcy5zZXQoYSxjLG0udmFsdWUsbnVsbCksUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShhLGMsbSl9fSxuYT15LmV4dGVuZCh7fSxUbyx7Z2V0KGEsYyl7aWYoYyE9PVN5bWJvbC51bnNjb3BhYmxlcylyZXR1cm4gVG8uZ2V0KGEsYyxhKX0saGFzKGEsYyl7dmFyIG09Y1swXSE9PSJfIiYmIXkuaXNHbG9iYWxseUFsbG93ZWQoYyk7cmV0dXJuIG19fSk7ZnVuY3Rpb24gbHIoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBEcigpe3JldHVybiBudWxsfWZ1bmN0aW9uIFhhKGEpe31mdW5jdGlvbiBRYShhKXt9ZnVuY3Rpb24gcmkoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBRcygpe31mdW5jdGlvbiBlbChhLGMpe3JldHVybiBudWxsfWZ1bmN0aW9uIHRsKCl7cmV0dXJuIFJzKCkuc2xvdHN9ZnVuY3Rpb24gbmwoKXtyZXR1cm4gUnMoKS5hdHRyc31mdW5jdGlvbiBScygpe3ZhciBhPXBvKCk7cmV0dXJuIGEuc2V0dXBDb250ZXh0fHwoYS5zZXR1cENvbnRleHQ9em8oYSkpfWZ1bmN0aW9uIHJhKGEpe3JldHVybiB5LmlzQXJyYXkoYSk/YS5yZWR1Y2UoKGMsbSk9PihjW21dPW51bGwsYykse30pOmF9ZnVuY3Rpb24gcmwoYSxjKXt2YXIgbT1yYShhKTtmb3IodmFyIHcgaW4gYylpZighdy5zdGFydHNXaXRoKCJfX3NraXAiKSl7dmFyIE49bVt3XTtOP3kuaXNBcnJheShOKXx8eS5pc0Z1bmN0aW9uKE4pP049bVt3XT17dHlwZTpOLGRlZmF1bHQ6Y1t3XX06Ti5kZWZhdWx0PWNbd106Tj09PW51bGwmJihOPW1bd109e2RlZmF1bHQ6Y1t3XX0pLE4mJmNbIl9fc2tpcF8iLmNvbmNhdCh3KV0mJihOLnNraXBGYWN0b3J5PSEwKX1yZXR1cm4gbX1mdW5jdGlvbiBlcihhLGMpe3JldHVybiFhfHwhYz9hfHxjOnkuaXNBcnJheShhKSYmeS5pc0FycmF5KGMpP2EuY29uY2F0KGMpOnkuZXh0ZW5kKHt9LHJhKGEpLHJhKGMpKX1mdW5jdGlvbiBpYShhLGMpe3ZhciBtPXt9LHc9ZnVuY3Rpb24oTyl7Yy5pbmNsdWRlcyhPKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KG0sTyx7ZW51bWVyYWJsZTohMCxnZXQ6KCk9PmFbT119KX07Zm9yKHZhciBOIGluIGEpdyhOKTtyZXR1cm4gbX1mdW5jdGlvbiBEbyhhKXt2YXIgYz1wbygpLG09YSgpO3JldHVybiAkYSgpLHkuaXNQcm9taXNlKG0pJiYobT1tLmNhdGNoKHc9Pnt0aHJvdyBoaShjKSx3fSkpLFttLCgpPT5oaShjKV19dmFyIEtpPSEwO2Z1bmN0aW9uIHhzKGEpe3ZhciBjPVZvKGEpLG09YS5wcm94eSx3PWEuY3R4O0tpPSExLGMuYmVmb3JlQ3JlYXRlJiZvYShjLmJlZm9yZUNyZWF0ZSxhLCJiYyIpO3ZhcntkYXRhOk4sY29tcHV0ZWQ6TyxtZXRob2RzOkwsd2F0Y2g6Sixwcm92aWRlOkgsaW5qZWN0OmVlLGNyZWF0ZWQ6Q2UsYmVmb3JlTW91bnQ6R2UsbW91bnRlZDpoZSxiZWZvcmVVcGRhdGU6RGUsdXBkYXRlZDpldCxhY3RpdmF0ZWQ6Z3QsZGVhY3RpdmF0ZWQ6ZHQsYmVmb3JlRGVzdHJveTpWdCxiZWZvcmVVbm1vdW50Okh0LGRlc3Ryb3llZDphZSx1bm1vdW50ZWQ6a2UscmVuZGVyOndlLHJlbmRlclRyYWNrZWQ6SGUscmVuZGVyVHJpZ2dlcmVkOnd0LGVycm9yQ2FwdHVyZWQ6dHQsc2VydmVyUHJlZmV0Y2g6aSxleHBvc2U6bCxpbmhlcml0QXR0cnM6aCxjb21wb25lbnRzOnYsZGlyZWN0aXZlczpBLGZpbHRlcnM6VH09YztpZihlZSYmaWwoZWUsdyksTClmb3IodmFyIGsgaW4gTCl7dmFyIEQ9TFtrXTt5LmlzRnVuY3Rpb24oRCkmJih3W2tdPUQuYmluZChtKSl9aWYoTil7dmFyIGo9Ti5jYWxsKG0sbSk7eS5pc09iamVjdChqKSYmKGEuZGF0YT1JLnJlYWN0aXZlKGopKX1pZihLaT0hMCxPKXt2YXIgWj1mdW5jdGlvbihudCl7dmFyIFB0PU9bbnRdLEl0PXkuaXNGdW5jdGlvbihQdCk/UHQuYmluZChtLG0pOnkuaXNGdW5jdGlvbihQdC5nZXQpP1B0LmdldC5iaW5kKG0sbSk6eS5OT09QLHVlPSF5LmlzRnVuY3Rpb24oUHQpJiZ5LmlzRnVuY3Rpb24oUHQuc2V0KT9QdC5zZXQuYmluZChtKTp5Lk5PT1AsT2U9ZGwoe2dldDpJdCxzZXQ6dWV9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodyxudCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5PZS52YWx1ZSxzZXQ6U2U9Pk9lLnZhbHVlPVNlfSl9O2Zvcih2YXIgZmUgaW4gTylaKGZlKX1pZihKKWZvcih2YXIgZ2UgaW4gSilEYShKW2dlXSx3LG0sZ2UpO2lmKEgpe3ZhciByZT15LmlzRnVuY3Rpb24oSCk/SC5jYWxsKG0pOkg7UmVmbGVjdC5vd25LZXlzKHJlKS5mb3JFYWNoKG50PT57ZXMobnQscmVbbnRdKX0pfUNlJiZvYShDZSxhLCJjIik7ZnVuY3Rpb24gdmUobnQsUHQpe3kuaXNBcnJheShQdCk/UHQuZm9yRWFjaChJdD0+bnQoSXQuYmluZChtKSkpOlB0JiZudChQdC5iaW5kKG0pKX1pZih2ZShSaSxHZSksdmUoRXQsaGUpLHZlKER0LERlKSx2ZShuaSxldCksdmUoemUsZ3QpLHZlKGF0LGR0KSx2ZShMZSx0dCksdmUoaWUsSGUpLHZlKFksd3QpLHZlKHdvLEh0KSx2ZShBbyxrZSksdmUoc2UsaSkseS5pc0FycmF5KGwpKWlmKGwubGVuZ3RoKXt2YXIgV2U9YS5leHBvc2VkfHwoYS5leHBvc2VkPXt9KTtsLmZvckVhY2gobnQ9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoV2UsbnQse2dldDooKT0+bVtudF0sc2V0OlB0PT5tW250XT1QdH0pfSl9ZWxzZSBhLmV4cG9zZWR8fChhLmV4cG9zZWQ9e30pO3dlJiZhLnJlbmRlcj09PXkuTk9PUCYmKGEucmVuZGVyPXdlKSxoIT1udWxsJiYoYS5pbmhlcml0QXR0cnM9aCksdiYmKGEuY29tcG9uZW50cz12KSxBJiYoYS5kaXJlY3RpdmVzPUEpO3ZhciBpdD1hLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMuJGFwcGx5T3B0aW9ucztpdCYmaXQoYyxhLG0pfWZ1bmN0aW9uIGlsKGEsYyl7eS5pc0FycmF5KGEpJiYoYT1VbyhhKSk7dmFyIG09ZnVuY3Rpb24oTil7dmFyIE89YVtOXSxMPXZvaWQgMDt5LmlzT2JqZWN0KE8pPyJkZWZhdWx0ImluIE8/TD1FYShPLmZyb218fE4sTy5kZWZhdWx0LCEwKTpMPUVhKE8uZnJvbXx8Tik6TD1FYShPKSxJLmlzUmVmKEwpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLE4se2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+TC52YWx1ZSxzZXQ6Sj0+TC52YWx1ZT1KfSk6Y1tOXT1MfTtmb3IodmFyIHcgaW4gYSltKHcpfWZ1bmN0aW9uIG9hKGEsYyxtKXtibih5LmlzQXJyYXkoYSk/YS5tYXAodz0+dy5iaW5kKGMucHJveHkpKTphLmJpbmQoYy5wcm94eSksYyxtKX1mdW5jdGlvbiBEYShhLGMsbSx3KXt2YXIgTj13LmluY2x1ZGVzKCIuIik/YnIobSx3KTooKT0+bVt3XTtpZih5LmlzU3RyaW5nKGEpKXt2YXIgTz1jW2FdO3kuaXNGdW5jdGlvbihPKSYmUGkoTixPKX1lbHNlIGlmKHkuaXNGdW5jdGlvbihhKSlQaShOLGEuYmluZChtKSk7ZWxzZSBpZih5LmlzT2JqZWN0KGEpKWlmKHkuaXNBcnJheShhKSlhLmZvckVhY2goSj0+RGEoSixjLG0sdykpO2Vsc2V7dmFyIEw9eS5pc0Z1bmN0aW9uKGEuaGFuZGxlcik/YS5oYW5kbGVyLmJpbmQobSk6Y1thLmhhbmRsZXJdO3kuaXNGdW5jdGlvbihMKSYmUGkoTixMLGEpfX1mdW5jdGlvbiBWbyhhKXt2YXIgYz1hLnR5cGUse21peGluczptLGV4dGVuZHM6d309Yyx7bWl4aW5zOk4sb3B0aW9uc0NhY2hlOk8sY29uZmlnOntvcHRpb25NZXJnZVN0cmF0ZWdpZXM6TH19PWEuYXBwQ29udGV4dCxKPU8uZ2V0KGMpLEg7cmV0dXJuIEo/SD1KOiFOLmxlbmd0aCYmIW0mJiF3P0g9YzooSD17fSxOLmxlbmd0aCYmTi5mb3JFYWNoKGVlPT5fYShILGVlLEwsITApKSxfYShILGMsTCkpLHkuaXNPYmplY3QoYykmJk8uc2V0KGMsSCksSH1mdW5jdGlvbiBfYShhLGMsbSl7dmFyIHc9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHttaXhpbnM6TixleHRlbmRzOk99PWM7TyYmX2EoYSxPLG0sITApLE4mJk4uZm9yRWFjaChIPT5fYShhLEgsbSwhMCkpO2Zvcih2YXIgTCBpbiBjKWlmKCEodyYmTD09PSJleHBvc2UiKSl7dmFyIEo9bXNbTF18fG0mJm1bTF07YVtMXT1KP0ooYVtMXSxjW0xdKTpjW0xdfXJldHVybiBhfXZhciBtcz17ZGF0YTpiYSxwcm9wczpfcyxlbWl0czpfcyxtZXRob2RzOmFhLGNvbXB1dGVkOmFhLGJlZm9yZUNyZWF0ZTpWcixjcmVhdGVkOlZyLGJlZm9yZU1vdW50OlZyLG1vdW50ZWQ6VnIsYmVmb3JlVXBkYXRlOlZyLHVwZGF0ZWQ6VnIsYmVmb3JlRGVzdHJveTpWcixiZWZvcmVVbm1vdW50OlZyLGRlc3Ryb3llZDpWcix1bm1vdW50ZWQ6VnIsYWN0aXZhdGVkOlZyLGRlYWN0aXZhdGVkOlZyLGVycm9yQ2FwdHVyZWQ6VnIsc2VydmVyUHJlZmV0Y2g6VnIsY29tcG9uZW50czphYSxkaXJlY3RpdmVzOmFhLHdhdGNoOlZhLHByb3ZpZGU6YmEsaW5qZWN0OnhpfTtmdW5jdGlvbiBiYShhLGMpe3JldHVybiBjP2E/ZnVuY3Rpb24oKXtyZXR1cm4geS5leHRlbmQoeS5pc0Z1bmN0aW9uKGEpP2EuY2FsbCh0aGlzLHRoaXMpOmEseS5pc0Z1bmN0aW9uKGMpP2MuY2FsbCh0aGlzLHRoaXMpOmMpfTpjOmF9ZnVuY3Rpb24geGkoYSxjKXtyZXR1cm4gYWEoVW8oYSksVW8oYykpfWZ1bmN0aW9uIFVvKGEpe2lmKHkuaXNBcnJheShhKSl7Zm9yKHZhciBjPXt9LG09MDttPGEubGVuZ3RoO20rKyljW2FbbV1dPWFbbV07cmV0dXJuIGN9cmV0dXJuIGF9ZnVuY3Rpb24gVnIoYSxjKXtyZXR1cm4gYT9bLi4ubmV3IFNldChbXS5jb25jYXQoYSxjKSldOmN9ZnVuY3Rpb24gYWEoYSxjKXtyZXR1cm4gYT95LmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGEsYyk6Y31mdW5jdGlvbiBfcyhhLGMpe3JldHVybiBhP3kuaXNBcnJheShhKSYmeS5pc0FycmF5KGMpP1suLi5uZXcgU2V0KFsuLi5hLC4uLmNdKV06eS5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxyYShhKSxyYShjIT1udWxsP2M6e30pKTpjfWZ1bmN0aW9uIFZhKGEsYyl7aWYoIWEpcmV0dXJuIGM7aWYoIWMpcmV0dXJuIGE7dmFyIG09eS5leHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSxhKTtmb3IodmFyIHcgaW4gYyltW3ddPVZyKGFbd10sY1t3XSk7cmV0dXJuIG19ZnVuY3Rpb24gSnIoKXtyZXR1cm57YXBwOm51bGwsY29uZmlnOntpc05hdGl2ZVRhZzp5Lk5PLHBlcmZvcm1hbmNlOiExLGdsb2JhbFByb3BlcnRpZXM6e30sb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOnt9LGVycm9ySGFuZGxlcjp2b2lkIDAsd2FybkhhbmRsZXI6dm9pZCAwLGNvbXBpbGVyT3B0aW9uczp7fX0sbWl4aW5zOltdLGNvbXBvbmVudHM6e30sZGlyZWN0aXZlczp7fSxwcm92aWRlczpPYmplY3QuY3JlYXRlKG51bGwpLG9wdGlvbnNDYWNoZTpuZXcgV2Vha01hcCxwcm9wc0NhY2hlOm5ldyBXZWFrTWFwLGVtaXRzQ2FjaGU6bmV3IFdlYWtNYXB9fXZhciBaaT0wO2Z1bmN0aW9uIGJzKGEsYyl7cmV0dXJuIGZ1bmN0aW9uKHcpe3ZhciBOPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsO3kuaXNGdW5jdGlvbih3KXx8KHc9eS5leHRlbmQoe30sdykpLE4hPW51bGwmJiF5LmlzT2JqZWN0KE4pJiYoTj1udWxsKTt2YXIgTz1KcigpLEw9bmV3IFdlYWtTZXQsSj0hMSxIPU8uYXBwPXtfdWlkOlppKyssX2NvbXBvbmVudDp3LF9wcm9wczpOLF9jb250YWluZXI6bnVsbCxfY29udGV4dDpPLF9pbnN0YW5jZTpudWxsLHZlcnNpb246Z2ksZ2V0IGNvbmZpZygpe3JldHVybiBPLmNvbmZpZ30sc2V0IGNvbmZpZyhlZSl7fSx1c2UoZWUpe2Zvcih2YXIgQ2U9YXJndW1lbnRzLmxlbmd0aCxHZT1uZXcgQXJyYXkoQ2U+MT9DZS0xOjApLGhlPTE7aGU8Q2U7aGUrKylHZVtoZS0xXT1hcmd1bWVudHNbaGVdO3JldHVybiBMLmhhcyhlZSl8fChlZSYmeS5pc0Z1bmN0aW9uKGVlLmluc3RhbGwpPyhMLmFkZChlZSksZWUuaW5zdGFsbChILC4uLkdlKSk6eS5pc0Z1bmN0aW9uKGVlKSYmKEwuYWRkKGVlKSxlZShILC4uLkdlKSkpLEh9LG1peGluKGVlKXtyZXR1cm4gTy5taXhpbnMuaW5jbHVkZXMoZWUpfHxPLm1peGlucy5wdXNoKGVlKSxIfSxjb21wb25lbnQoZWUsQ2Upe3JldHVybiBDZT8oTy5jb21wb25lbnRzW2VlXT1DZSxIKTpPLmNvbXBvbmVudHNbZWVdfSxkaXJlY3RpdmUoZWUsQ2Upe3JldHVybiBDZT8oTy5kaXJlY3RpdmVzW2VlXT1DZSxIKTpPLmRpcmVjdGl2ZXNbZWVdfSxtb3VudChlZSxDZSxHZSl7aWYoIUope3ZhciBoZT1fZSh3LE4pO3JldHVybiBoZS5hcHBDb250ZXh0PU8sR2U9PT0hMD9HZT0ic3ZnIjpHZT09PSExJiYoR2U9dm9pZCAwKSxDZSYmYz9jKGhlLGVlKTphKGhlLGVlLEdlKSxKPSEwLEguX2NvbnRhaW5lcj1lZSxlZS5fX3Z1ZV9hcHBfXz1ILEguX2luc3RhbmNlPWhlLmNvbXBvbmVudCxrYShoZS5jb21wb25lbnQpfHxoZS5jb21wb25lbnQucHJveHl9fSx1bm1vdW50KCl7SiYmKGEobnVsbCxILl9jb250YWluZXIpLGRlbGV0ZSBILl9jb250YWluZXIuX192dWVfYXBwX18pfSxwcm92aWRlKGVlLENlKXtyZXR1cm4gTy5wcm92aWRlc1tlZV09Q2UsSH0scnVuV2l0aENvbnRleHQoZWUpe3ZhciBDZT15YTt5YT1IO3RyeXtyZXR1cm4gZWUoKX1maW5hbGx5e3lhPUNlfX19O3JldHVybiBIfX12YXIgeWE9bnVsbDtmdW5jdGlvbiBlcyhhLGMpe2lmKF9uKXt2YXIgbT1fbi5wcm92aWRlcyx3PV9uLnBhcmVudCYmX24ucGFyZW50LnByb3ZpZGVzO3c9PT1tJiYobT1fbi5wcm92aWRlcz1PYmplY3QuY3JlYXRlKHcpKSxtW2FdPWMsX24udHlwZS5tcFR5cGU9PT0iYXBwIiYmX24uYXBwQ29udGV4dC5hcHAucHJvdmlkZShhLGMpfX1mdW5jdGlvbiBFYShhLGMpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx3PV9ufHxPbjtpZih3fHx5YSl7dmFyIE49dz93LnBhcmVudD09bnVsbD93LnZub2RlLmFwcENvbnRleHQmJncudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlczp3LnBhcmVudC5wcm92aWRlczp5YS5fY29udGV4dC5wcm92aWRlcztpZihOJiZhIGluIE4pcmV0dXJuIE5bYV07aWYoYXJndW1lbnRzLmxlbmd0aD4xKXJldHVybiBtJiZ5LmlzRnVuY3Rpb24oYyk/Yy5jYWxsKHcmJncucHJveHkpOmN9fWZ1bmN0aW9uIEUoKXtyZXR1cm4hIShfbnx8T258fHlhKX1mdW5jdGlvbiB4KGEsYyxtKXt2YXIgdz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsTj17fSxPPXt9O3kuZGVmKE8sTGksMSksYS5wcm9wc0RlZmF1bHRzPU9iamVjdC5jcmVhdGUobnVsbCksJChhLGMsTixPKTtmb3IodmFyIEwgaW4gYS5wcm9wc09wdGlvbnNbMF0pTCBpbiBOfHwoTltMXT12b2lkIDApO20/YS5wcm9wcz13P046SS5zaGFsbG93UmVhY3RpdmUoTik6YS50eXBlLnByb3BzP2EucHJvcHM9TjphLnByb3BzPU8sYS5hdHRycz1PfWZ1bmN0aW9uIHooYSxjLG0sdyl7dmFye3Byb3BzOk4sYXR0cnM6Tyx2bm9kZTp7cGF0Y2hGbGFnOkx9fT1hLEo9SS50b1JhdyhOKSxbSF09YS5wcm9wc09wdGlvbnMsZWU9ITE7aWYoKHd8fEw+MCkmJiEoTCYxNikpe2lmKEwmOClmb3IodmFyIENlPWEudm5vZGUuZHluYW1pY1Byb3BzLEdlPTA7R2U8Q2UubGVuZ3RoO0dlKyspe3ZhciBoZT1DZVtHZV07aWYoIUhpKGEuZW1pdHNPcHRpb25zLGhlKSl7dmFyIERlPWNbaGVdO2lmKEgpaWYoeS5oYXNPd24oTyxoZSkpRGUhPT1PW2hlXSYmKE9baGVdPURlLGVlPSEwKTtlbHNle3ZhciBldD15LmNhbWVsaXplKGhlKTtOW2V0XT1LKEgsSixldCxEZSxhLCExKX1lbHNlIERlIT09T1toZV0mJihPW2hlXT1EZSxlZT0hMCl9fX1lbHNleyQoYSxjLE4sTykmJihlZT0hMCk7dmFyIGd0O2Zvcih2YXIgZHQgaW4gSikoIWN8fCF5Lmhhc093bihjLGR0KSYmKChndD15Lmh5cGhlbmF0ZShkdCkpPT09ZHR8fCF5Lmhhc093bihjLGd0KSkpJiYoSD9tJiYobVtkdF0hPT12b2lkIDB8fG1bZ3RdIT09dm9pZCAwKSYmKE5bZHRdPUsoSCxKLGR0LHZvaWQgMCxhLCEwKSk6ZGVsZXRlIE5bZHRdKTtpZihPIT09Silmb3IodmFyIFZ0IGluIE8pKCFjfHwheS5oYXNPd24oYyxWdCkmJiEwKSYmKGRlbGV0ZSBPW1Z0XSxlZT0hMCl9ZWUmJkkudHJpZ2dlcihhLCJzZXQiLCIkYXR0cnMiKX1mdW5jdGlvbiAkKGEsYyxtLHcpe3ZhcltOLE9dPWEucHJvcHNPcHRpb25zLEw9ITEsSjtpZihjKXtmb3IodmFyIEggaW4gYylpZigheS5pc1Jlc2VydmVkUHJvcChIKSl7dmFyIGVlPWNbSF0sQ2U9dm9pZCAwO04mJnkuaGFzT3duKE4sQ2U9eS5jYW1lbGl6ZShIKSk/IU98fCFPLmluY2x1ZGVzKENlKT9tW0NlXT1lZTooSnx8KEo9e30pKVtDZV09ZWU6SGkoYS5lbWl0c09wdGlvbnMsSCl8fCghKEggaW4gdyl8fGVlIT09d1tIXSkmJih3W0hdPWVlLEw9ITApfX1pZihPKWZvcih2YXIgR2U9SS50b1JhdyhtKSxoZT1KfHx5LkVNUFRZX09CSixEZT0wO0RlPE8ubGVuZ3RoO0RlKyspe3ZhciBldD1PW0RlXTttW2V0XT1LKE4sR2UsZXQsaGVbZXRdLGEsIXkuaGFzT3duKGhlLGV0KSl9cmV0dXJuIEx9ZnVuY3Rpb24gSyhhLGMsbSx3LE4sTyl7dmFyIEw9YVttXTtpZihMIT1udWxsKXt2YXIgSj15Lmhhc093bihMLCJkZWZhdWx0Iik7aWYoSiYmdz09PXZvaWQgMCl7dmFyIEg9TC5kZWZhdWx0O2lmKEwudHlwZSE9PUZ1bmN0aW9uJiYhTC5za2lwRmFjdG9yeSYmeS5pc0Z1bmN0aW9uKEgpKXt2YXJ7cHJvcHNEZWZhdWx0czplZX09TjtpZihtIGluIGVlKXc9ZWVbbV07ZWxzZXt2YXIgQ2U9aGkoTik7dz1lZVttXT1ILmNhbGwobnVsbCxjKSxDZSgpfX1lbHNlIHc9SH1MWzBdJiYoTyYmIUo/dz0hMTpMWzFdJiYodz09PSIifHx3PT09eS5oeXBoZW5hdGUobSkpJiYodz0hMCkpfXJldHVybiB3fWZ1bmN0aW9uIFgoYSxjKXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsdz1jLnByb3BzQ2FjaGUsTj13LmdldChhKTtpZihOKXJldHVybiBOO3ZhciBPPWEucHJvcHMsTD17fSxKPVtdLEg9ITE7aWYoIXkuaXNGdW5jdGlvbihhKSl7dmFyIGVlPWFlPT57SD0hMDt2YXJba2Usd2VdPVgoYWUsYywhMCk7eS5leHRlbmQoTCxrZSksd2UmJkoucHVzaCguLi53ZSl9OyFtJiZjLm1peGlucy5sZW5ndGgmJmMubWl4aW5zLmZvckVhY2goZWUpLGEuZXh0ZW5kcyYmZWUoYS5leHRlbmRzKSxhLm1peGlucyYmYS5taXhpbnMuZm9yRWFjaChlZSl9aWYoIU8mJiFIKXJldHVybiB5LmlzT2JqZWN0KGEpJiZ3LnNldChhLHkuRU1QVFlfQVJSKSx5LkVNUFRZX0FSUjtpZih5LmlzQXJyYXkoTykpZm9yKHZhciBDZT0wO0NlPE8ubGVuZ3RoO0NlKyspe3ZhciBHZT15LmNhbWVsaXplKE9bQ2VdKTtjZShHZSkmJihMW0dlXT15LkVNUFRZX09CSil9ZWxzZSBpZihPKWZvcih2YXIgaGUgaW4gTyl7dmFyIERlPXkuY2FtZWxpemUoaGUpO2lmKGNlKERlKSl7dmFyIGV0PU9baGVdLGd0PUxbRGVdPXkuaXNBcnJheShldCl8fHkuaXNGdW5jdGlvbihldCk/e3R5cGU6ZXR9OnkuZXh0ZW5kKHt9LGV0KTtpZihndCl7dmFyIGR0PUZlKEJvb2xlYW4sZ3QudHlwZSksVnQ9RmUoU3RyaW5nLGd0LnR5cGUpO2d0WzBdPWR0Pi0xLGd0WzFdPVZ0PDB8fGR0PFZ0LChkdD4tMXx8eS5oYXNPd24oZ3QsImRlZmF1bHQiKSkmJkoucHVzaChEZSl9fX12YXIgSHQ9W0wsSl07cmV0dXJuIHkuaXNPYmplY3QoYSkmJncuc2V0KGEsSHQpLEh0fWZ1bmN0aW9uIGNlKGEpe3JldHVybiBhWzBdIT09IiQiJiYheS5pc1Jlc2VydmVkUHJvcChhKX1mdW5jdGlvbiBtZShhKXtpZihhPT09bnVsbClyZXR1cm4ibnVsbCI7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIGEubmFtZXx8IiI7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt2YXIgYz1hLmNvbnN0cnVjdG9yJiZhLmNvbnN0cnVjdG9yLm5hbWU7cmV0dXJuIGN8fCIifXJldHVybiIifWZ1bmN0aW9uIE5lKGEsYyl7cmV0dXJuIG1lKGEpPT09bWUoYyl9ZnVuY3Rpb24gRmUoYSxjKXtyZXR1cm4geS5pc0FycmF5KGMpP2MuZmluZEluZGV4KG09Pk5lKG0sYSkpOnkuaXNGdW5jdGlvbihjKSYmTmUoYyxhKT8wOi0xfXZhciBwZT1hPT5hWzBdPT09Il8ifHxhPT09IiRzdGFibGUiLE1lPWE9PnkuaXNBcnJheShhKT9hLm1hcChCbik6W0JuKGEpXSx1dD0oYSxjLG0pPT57aWYoYy5fbilyZXR1cm4gYzt2YXIgdz1HcihmdW5jdGlvbigpe3JldHVybiBNZShjKC4uLmFyZ3VtZW50cykpfSxtKTtyZXR1cm4gdy5fYz0hMSx3fSxfdD0oYSxjLG0pPT57dmFyIHc9YS5fY3R4O2Zvcih2YXIgTiBpbiBhKWlmKCFwZShOKSl7dmFyIE89YVtOXTt5LmlzRnVuY3Rpb24oTyk/Y1tOXT11dChOLE8sdyk6TyE9bnVsbCYmZnVuY3Rpb24oKXt2YXIgTD1NZShPKTtjW05dPSgpPT5MfSgpfX0sZW49KGEsYyk9Pnt2YXIgbT1NZShjKTthLnNsb3RzLmRlZmF1bHQ9KCk9Pm19LGJ0PShhLGMpPT57aWYoYS52bm9kZS5zaGFwZUZsYWcmMzIpe3ZhciBtPWMuXzttPyhhLnNsb3RzPUkudG9SYXcoYykseS5kZWYoYywiXyIsbSkpOl90KGMsYS5zbG90cz17fSl9ZWxzZSBhLnNsb3RzPXt9LGMmJmVuKGEsYyk7eS5kZWYoYS5zbG90cyxMaSwxKX0scWU9KGEsYyxtKT0+e3Zhcnt2bm9kZTp3LHNsb3RzOk59PWEsTz0hMCxMPXkuRU1QVFlfT0JKO2lmKHcuc2hhcGVGbGFnJjMyKXt2YXIgSj1jLl87Sj9tJiZKPT09MT9PPSExOih5LmV4dGVuZChOLGMpLCFtJiZKPT09MSYmZGVsZXRlIE4uXyk6KE89IWMuJHN0YWJsZSxfdChjLE4pKSxMPWN9ZWxzZSBjJiYoZW4oYSxjKSxMPXtkZWZhdWx0OjF9KTtpZihPKWZvcih2YXIgSCBpbiBOKSFwZShIKSYmTFtIXT09bnVsbCYmZGVsZXRlIE5bSF19O2Z1bmN0aW9uIE10KGEsYyxtLHcpe3ZhciBOPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZih5LmlzQXJyYXkoYSkpe2EuZm9yRWFjaCgoZ3QsZHQpPT5NdChndCxjJiYoeS5pc0FycmF5KGMpP2NbZHRdOmMpLG0sdyxOKSk7cmV0dXJufWlmKCEoTmkodykmJiFOKSl7dmFyIE89dy5zaGFwZUZsYWcmND9rYSh3LmNvbXBvbmVudCl8fHcuY29tcG9uZW50LnByb3h5OncuZWwsTD1OP251bGw6Tyx7aTpKLHI6SH09YSxlZT1jJiZjLnIsQ2U9Si5yZWZzPT09eS5FTVBUWV9PQko/Si5yZWZzPXt9OkoucmVmcyxHZT1KLnNldHVwU3RhdGU7aWYoZWUhPW51bGwmJmVlIT09SCYmKHkuaXNTdHJpbmcoZWUpPyhDZVtlZV09bnVsbCx5Lmhhc093bihHZSxlZSkmJihHZVtlZV09bnVsbCkpOkkuaXNSZWYoZWUpJiYoZWUudmFsdWU9bnVsbCkpLHkuaXNGdW5jdGlvbihIKSlsbihILEosMTIsW0wsQ2VdKTtlbHNle3ZhciBoZT15LmlzU3RyaW5nKEgpLERlPUkuaXNSZWYoSCk7aWYoaGV8fERlKXt2YXIgZXQ9KCk9PntpZihhLmYpe3ZhciBndD1oZT95Lmhhc093bihHZSxIKT9HZVtIXTpDZVtIXTpILnZhbHVlO04/eS5pc0FycmF5KGd0KSYmeS5yZW1vdmUoZ3QsTyk6eS5pc0FycmF5KGd0KT9ndC5pbmNsdWRlcyhPKXx8Z3QucHVzaChPKTpoZT8oQ2VbSF09W09dLHkuaGFzT3duKEdlLEgpJiYoR2VbSF09Q2VbSF0pKTooSC52YWx1ZT1bT10sYS5rJiYoQ2VbYS5rXT1ILnZhbHVlKSl9ZWxzZSBoZT8oQ2VbSF09TCx5Lmhhc093bihHZSxIKSYmKEdlW0hdPUwpKTpEZSYmKEgudmFsdWU9TCxhLmsmJihDZVthLmtdPUwpKX07TD8oZXQuaWQ9LTEsa3QoZXQsbSkpOmV0KCl9fX19dmFyIGRuPSExLGtuPWE9PmEubmFtZXNwYWNlVVJJLmluY2x1ZGVzKCJzdmciKSYmYS50YWdOYW1lIT09ImZvcmVpZ25PYmplY3QiLEF0PWE9PmEubmFtZXNwYWNlVVJJLmluY2x1ZGVzKCJNYXRoTUwiKSxybj1hPT57aWYoa24oYSkpcmV0dXJuInN2ZyI7aWYoQXQoYSkpcmV0dXJuIm1hdGhtbCJ9LFNuPWE9PmEubm9kZVR5cGU9PT04O2Z1bmN0aW9uIGFuKGEpe3ZhcnttdDpjLHA6bSxvOntwYXRjaFByb3A6dyxjcmVhdGVUZXh0Ok4sbmV4dFNpYmxpbmc6TyxwYXJlbnROb2RlOkwscmVtb3ZlOkosaW5zZXJ0OkgsY3JlYXRlQ29tbWVudDplZX19PWEsQ2U9KGFlLGtlKT0+e2lmKCFrZS5oYXNDaGlsZE5vZGVzKCkpe20obnVsbCxhZSxrZSksJG4oKSxrZS5fdm5vZGU9YWU7cmV0dXJufWRuPSExLEdlKGtlLmZpcnN0Q2hpbGQsYWUsbnVsbCxudWxsLG51bGwpLCRuKCksa2UuX3Zub2RlPWFlLGRuJiZjb25zb2xlLmVycm9yKCJIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLiIpfSxHZT1mdW5jdGlvbihhZSxrZSx3ZSxIZSx3dCl7dmFyIHR0PWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTohMSxpPVNuKGFlKSYmYWUuZGF0YT09PSJbIixsPSgpPT5ndChhZSxrZSx3ZSxIZSx3dCxpKSx7dHlwZTpoLHJlZjp2LHNoYXBlRmxhZzpBLHBhdGNoRmxhZzpUfT1rZSxrPWFlLm5vZGVUeXBlO2tlLmVsPWFlLFQ9PT0tMiYmKHR0PSExLGtlLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXIgRD1udWxsO3N3aXRjaChoKXtjYXNlIHNhOmshPT0zP2tlLmNoaWxkcmVuPT09IiI/KEgoa2UuZWw9TigiIiksTChhZSksYWUpLEQ9YWUpOkQ9bCgpOihhZS5kYXRhIT09a2UuY2hpbGRyZW4mJihkbj0hMCxhZS5kYXRhPWtlLmNoaWxkcmVuKSxEPU8oYWUpKTticmVhaztjYXNlIFVyOkh0KGFlKT8oRD1PKGFlKSxWdChrZS5lbD1hZS5jb250ZW50LmZpcnN0Q2hpbGQsYWUsd2UpKTprIT09OHx8aT9EPWwoKTpEPU8oYWUpO2JyZWFrO2Nhc2UgSG86aWYoaSYmKGFlPU8oYWUpLGs9YWUubm9kZVR5cGUpLGs9PT0xfHxrPT09Myl7RD1hZTtmb3IodmFyIGo9IWtlLmNoaWxkcmVuLmxlbmd0aCxaPTA7WjxrZS5zdGF0aWNDb3VudDtaKyspaiYmKGtlLmNoaWxkcmVuKz1ELm5vZGVUeXBlPT09MT9ELm91dGVySFRNTDpELmRhdGEpLFo9PT1rZS5zdGF0aWNDb3VudC0xJiYoa2UuYW5jaG9yPUQpLEQ9TyhEKTtyZXR1cm4gaT9PKEQpOkR9ZWxzZSBsKCk7YnJlYWs7Y2FzZSB0cjppP0Q9ZXQoYWUsa2Usd2UsSGUsd3QsdHQpOkQ9bCgpO2JyZWFrO2RlZmF1bHQ6aWYoQSYxKShrIT09MXx8a2UudHlwZS50b0xvd2VyQ2FzZSgpIT09YWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSYmIUh0KGFlKT9EPWwoKTpEPWhlKGFlLGtlLHdlLEhlLHd0LHR0KTtlbHNlIGlmKEEmNil7a2Uuc2xvdFNjb3BlSWRzPXd0O3ZhciBmZT1MKGFlKTtpZihpP0Q9ZHQoYWUpOlNuKGFlKSYmYWUuZGF0YT09PSJ0ZWxlcG9ydCBzdGFydCI/RD1kdChhZSxhZS5kYXRhLCJ0ZWxlcG9ydCBlbmQiKTpEPU8oYWUpLGMoa2UsZmUsbnVsbCx3ZSxIZSxybihmZSksdHQpLE5pKGtlKSl7dmFyIGdlO2k/KGdlPV9lKHRyKSxnZS5hbmNob3I9RD9ELnByZXZpb3VzU2libGluZzpmZS5sYXN0Q2hpbGQpOmdlPWFlLm5vZGVUeXBlPT09Mz90bigiIik6X2UoImRpdiIpLGdlLmVsPWFlLGtlLmNvbXBvbmVudC5zdWJUcmVlPWdlfX1lbHNlIEEmNjQ/ayE9PTg/RD1sKCk6RD1rZS50eXBlLmh5ZHJhdGUoYWUsa2Usd2UsSGUsd3QsdHQsYSxEZSk6QSYxMjgmJihEPWtlLnR5cGUuaHlkcmF0ZShhZSxrZSx3ZSxIZSxybihMKGFlKSksd3QsdHQsYSxHZSkpfXJldHVybiB2IT1udWxsJiZNdCh2LG51bGwsSGUsa2UpLER9LGhlPShhZSxrZSx3ZSxIZSx3dCx0dCk9Pnt0dD10dHx8ISFrZS5keW5hbWljQ2hpbGRyZW47dmFye3R5cGU6aSxwcm9wczpsLHBhdGNoRmxhZzpoLHNoYXBlRmxhZzp2LGRpcnM6QSx0cmFuc2l0aW9uOlR9PWtlLGs9aT09PSJpbnB1dCJ8fGk9PT0ib3B0aW9uIjtpZihrfHxoIT09LTEpe0EmJnRpKGtlLG51bGwsd2UsImNyZWF0ZWQiKTt2YXIgRD0hMTtpZihIdChhZSkpe0Q9T28oSGUsVCkmJndlJiZ3ZS52bm9kZS5wcm9wcyYmd2Uudm5vZGUucHJvcHMuYXBwZWFyO3ZhciBqPWFlLmNvbnRlbnQuZmlyc3RDaGlsZDtEJiZULmJlZm9yZUVudGVyKGopLFZ0KGosYWUsd2UpLGtlLmVsPWFlPWp9aWYodiYxNiYmIShsJiYobC5pbm5lckhUTUx8fGwudGV4dENvbnRlbnQpKSlmb3IodmFyIFo9RGUoYWUuZmlyc3RDaGlsZCxrZSxhZSx3ZSxIZSx3dCx0dCk7Wjspe2RuPSEwO3ZhciBmZT1aO1o9Wi5uZXh0U2libGluZyxKKGZlKX1lbHNlIHYmOCYmYWUudGV4dENvbnRlbnQhPT1rZS5jaGlsZHJlbiYmKGRuPSEwLGFlLnRleHRDb250ZW50PWtlLmNoaWxkcmVuKTtpZihsKWlmKGt8fCF0dHx8aCYoMTZ8MzIpKWZvcih2YXIgZ2UgaW4gbCkoayYmKGdlLmVuZHNXaXRoKCJ2YWx1ZSIpfHxnZT09PSJpbmRldGVybWluYXRlIil8fHkuaXNPbihnZSkmJiF5LmlzUmVzZXJ2ZWRQcm9wKGdlKXx8Z2VbMF09PT0iLiIpJiZ3KGFlLGdlLG51bGwsbFtnZV0sdm9pZCAwLHZvaWQgMCx3ZSk7ZWxzZSBsLm9uQ2xpY2smJncoYWUsIm9uQ2xpY2siLG51bGwsbC5vbkNsaWNrLHZvaWQgMCx2b2lkIDAsd2UpO3ZhciByZTsocmU9bCYmbC5vblZub2RlQmVmb3JlTW91bnQpJiZ6bihyZSx3ZSxrZSksQSYmdGkoa2UsbnVsbCx3ZSwiYmVmb3JlTW91bnQiKSwoKHJlPWwmJmwub25Wbm9kZU1vdW50ZWQpfHxBfHxEKSYmQnQoKCk9PntyZSYmem4ocmUsd2Usa2UpLEQmJlQuZW50ZXIoYWUpLEEmJnRpKGtlLG51bGwsd2UsIm1vdW50ZWQiKX0sSGUpfXJldHVybiBhZS5uZXh0U2libGluZ30sRGU9KGFlLGtlLHdlLEhlLHd0LHR0LGkpPT57aT1pfHwhIWtlLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIGw9a2UuY2hpbGRyZW4saD1sLmxlbmd0aCx2PTA7djxoO3YrKyl7dmFyIEE9aT9sW3ZdOmxbdl09Qm4obFt2XSk7aWYoYWUpYWU9R2UoYWUsQSxIZSx3dCx0dCxpKTtlbHNle2lmKEEudHlwZT09PXNhJiYhQS5jaGlsZHJlbiljb250aW51ZTtkbj0hMCxtKG51bGwsQSx3ZSxudWxsLEhlLHd0LHJuKHdlKSx0dCl9fXJldHVybiBhZX0sZXQ9KGFlLGtlLHdlLEhlLHd0LHR0KT0+e3ZhcntzbG90U2NvcGVJZHM6aX09a2U7aSYmKHd0PXd0P3d0LmNvbmNhdChpKTppKTt2YXIgbD1MKGFlKSxoPURlKE8oYWUpLGtlLGwsd2UsSGUsd3QsdHQpO3JldHVybiBoJiZTbihoKSYmaC5kYXRhPT09Il0iP08oa2UuYW5jaG9yPWgpOihkbj0hMCxIKGtlLmFuY2hvcj1lZSgiXSIpLGwsaCksaCl9LGd0PShhZSxrZSx3ZSxIZSx3dCx0dCk9PntpZihkbj0hMCxrZS5lbD1udWxsLHR0KWZvcih2YXIgaT1kdChhZSk7Oyl7dmFyIGw9TyhhZSk7aWYobCYmbCE9PWkpSihsKTtlbHNlIGJyZWFrfXZhciBoPU8oYWUpLHY9TChhZSk7cmV0dXJuIEooYWUpLG0obnVsbCxrZSx2LGgsd2UsSGUscm4odiksd3QpLGh9LGR0PWZ1bmN0aW9uKGFlKXtmb3IodmFyIGtlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXToiWyIsd2U9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiJdIixIZT0wO2FlOylpZihhZT1PKGFlKSxhZSYmU24oYWUpJiYoYWUuZGF0YT09PWtlJiZIZSsrLGFlLmRhdGE9PT13ZSkpe2lmKEhlPT09MClyZXR1cm4gTyhhZSk7SGUtLX1yZXR1cm4gYWV9LFZ0PShhZSxrZSx3ZSk9Pnt2YXIgSGU9a2UucGFyZW50Tm9kZTtIZSYmSGUucmVwbGFjZUNoaWxkKGFlLGtlKTtmb3IodmFyIHd0PXdlO3d0Oyl3dC52bm9kZS5lbD09PWtlJiYod3Qudm5vZGUuZWw9d3Quc3ViVHJlZS5lbD1hZSksd3Q9d3QucGFyZW50fSxIdD1hZT0+YWUubm9kZVR5cGU9PT0xJiZhZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PT0idGVtcGxhdGUiO3JldHVybltDZSxHZV19dmFyIGt0PUJ0O2Z1bmN0aW9uIENuKGEpe3JldHVybiBTYShhKX1mdW5jdGlvbiBxbihhKXtyZXR1cm4gU2EoYSxhbil9ZnVuY3Rpb24gU2EoYSxjKXt2YXIgbT15LmdldEdsb2JhbFRoaXMoKTttLl9fVlVFX189ITA7dmFye2luc2VydDp3LHJlbW92ZTpOLHBhdGNoUHJvcDpPLGZvcmNlUGF0Y2hQcm9wOkwsY3JlYXRlRWxlbWVudDpKLGNyZWF0ZVRleHQ6SCxjcmVhdGVDb21tZW50OmVlLHNldFRleHQ6Q2Usc2V0RWxlbWVudFRleHQ6R2UscGFyZW50Tm9kZTpoZSxuZXh0U2libGluZzpEZSxzZXRTY29wZUlkOmV0PXkuTk9PUCxpbnNlcnRTdGF0aWNDb250ZW50Omd0fT1hLGR0PWZ1bmN0aW9uKEIsVix0ZSl7dmFyIGRlPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsLG9lPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLFJlPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTpudWxsLGplPWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdIT09dm9pZCAwP2FyZ3VtZW50c1s2XTp2b2lkIDAseWU9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOm51bGwsSmU9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiEhVi5keW5hbWljQ2hpbGRyZW47aWYoQiE9PVYpe0ImJiFIcihCLFYpJiYoZGU9dWUoQiksV2UoQixvZSxSZSwhMCksQj1udWxsKSxWLnBhdGNoRmxhZz09PS0yJiYoSmU9ITEsVi5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFye3R5cGU6VWUscmVmOnl0LHNoYXBlRmxhZzpUdH09Vjtzd2l0Y2goVWUpe2Nhc2Ugc2E6VnQoQixWLHRlLGRlKTticmVhaztjYXNlIFVyOkh0KEIsVix0ZSxkZSk7YnJlYWs7Y2FzZSBIbzpCPT1udWxsJiZhZShWLHRlLGRlLGplKTticmVhaztjYXNlIHRyOkEoQixWLHRlLGRlLG9lLFJlLGplLHllLEplKTticmVhaztkZWZhdWx0OlR0JjE/SGUoQixWLHRlLGRlLG9lLFJlLGplLHllLEplKTpUdCY2P1QoQixWLHRlLGRlLG9lLFJlLGplLHllLEplKTooVHQmNjR8fFR0JjEyOCkmJlVlLnByb2Nlc3MoQixWLHRlLGRlLG9lLFJlLGplLHllLEplLFZlKX15dCE9bnVsbCYmb2UmJk10KHl0LEImJkIucmVmLFJlLFZ8fEIsIVYpfX0sVnQ9KEIsVix0ZSxkZSk9PntpZihCPT1udWxsKXcoVi5lbD1IKFYuY2hpbGRyZW4pLHRlLGRlKTtlbHNle3ZhciBvZT1WLmVsPUIuZWw7Vi5jaGlsZHJlbiE9PUIuY2hpbGRyZW4mJkNlKG9lLFYuY2hpbGRyZW4pfX0sSHQ9KEIsVix0ZSxkZSk9PntCPT1udWxsP3coVi5lbD1lZShWLmNoaWxkcmVufHwiIiksdGUsZGUpOlYuZWw9Qi5lbH0sYWU9KEIsVix0ZSxkZSk9PntbQi5lbCxCLmFuY2hvcl09Z3QoQi5jaGlsZHJlbixWLHRlLGRlLEIuZWwsQi5hbmNob3IpfSxrZT0oQixWLHRlKT0+e2Zvcih2YXJ7ZWw6ZGUsYW5jaG9yOm9lfT1CLFJlO2RlJiZkZSE9PW9lOylSZT1EZShkZSksdyhkZSxWLHRlKSxkZT1SZTt3KG9lLFYsdGUpfSx3ZT1CPT57Zm9yKHZhcntlbDpWLGFuY2hvcjp0ZX09QixkZTtWJiZWIT09dGU7KWRlPURlKFYpLE4oViksVj1kZTtOKHRlKX0sSGU9KEIsVix0ZSxkZSxvZSxSZSxqZSx5ZSxKZSk9PntWLnR5cGU9PT0ic3ZnIj9qZT0ic3ZnIjpWLnR5cGU9PT0ibWF0aCImJihqZT0ibWF0aG1sIiksQj09bnVsbD93dChWLHRlLGRlLG9lLFJlLGplLHllLEplKTpsKEIsVixvZSxSZSxqZSx5ZSxKZSl9LHd0PShCLFYsdGUsZGUsb2UsUmUsamUseWUpPT57dmFyIEplLFVlLHtwcm9wczp5dCxzaGFwZUZsYWc6VHQsdHJhbnNpdGlvbjpSdCxkaXJzOlV0fT1CO2lmKEplPUIuZWw9SihCLnR5cGUsUmUseXQmJnl0LmlzLHl0KSxUdCY4P0dlKEplLEIuY2hpbGRyZW4pOlR0JjE2JiZpKEIuY2hpbGRyZW4sSmUsbnVsbCxkZSxvZSxjcihCLFJlKSxqZSx5ZSksVXQmJnRpKEIsbnVsbCxkZSwiY3JlYXRlZCIpLHR0KEplLEIsQi5zY29wZUlkLGplLGRlKSx5dCl7Zm9yKHZhciBGbiBpbiB5dClGbiE9PSJ2YWx1ZSImJiF5LmlzUmVzZXJ2ZWRQcm9wKEZuKSYmTyhKZSxGbixudWxsLHl0W0ZuXSxSZSxCLmNoaWxkcmVuLGRlLG9lLEl0LEIuaG9zdEluc3RhbmNlKTsidmFsdWUiaW4geXQmJk8oSmUsInZhbHVlIixudWxsLHl0LnZhbHVlLFJlLFtdLGRlLG51bGwsdm9pZCAwLEIuaG9zdEluc3RhbmNlKSwoVWU9eXQub25Wbm9kZUJlZm9yZU1vdW50KSYmem4oVWUsZGUsQil9VXQmJnRpKEIsbnVsbCxkZSwiYmVmb3JlTW91bnQiKTt2YXIgSW49T28ob2UsUnQpO0luJiZSdC5iZWZvcmVFbnRlcihKZSksdyhKZSxWLHRlKSwoKFVlPXl0JiZ5dC5vblZub2RlTW91bnRlZCl8fElufHxVdCkmJmt0KCgpPT57VWUmJnpuKFVlLGRlLEIpLEluJiZSdC5lbnRlcihKZSksVXQmJnRpKEIsbnVsbCxkZSwibW91bnRlZCIpfSxvZSl9LHR0PShCLFYsdGUsZGUsb2UpPT57aWYodGUmJmV0KEIsdGUpLGRlKWZvcih2YXIgUmU9MDtSZTxkZS5sZW5ndGg7UmUrKylldChCLGRlW1JlXSk7aWYob2Upe3ZhciBqZT1vZS5zdWJUcmVlO2lmKFY9PT1qZSl7dmFyIHllPW9lLnZub2RlO3R0KEIseWUseWUuc2NvcGVJZCx5ZS5zbG90U2NvcGVJZHMsb2UucGFyZW50KX19fSxpPWZ1bmN0aW9uKEIsVix0ZSxkZSxvZSxSZSxqZSx5ZSl7Zm9yKHZhciBKZT1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06MCxVZT1KZTtVZTxCLmxlbmd0aDtVZSsrKXt2YXIgeXQ9QltVZV09eWU/RGkoQltVZV0pOkJuKEJbVWVdKTtkdChudWxsLHl0LFYsdGUsZGUsb2UsUmUsamUseWUpfX0sbD0oQixWLHRlLGRlLG9lLFJlLGplKT0+e3ZhciB5ZT1WLmVsPUIuZWwse3BhdGNoRmxhZzpKZSxkeW5hbWljQ2hpbGRyZW46VWUsZGlyczp5dH09VjtKZXw9Qi5wYXRjaEZsYWcmMTY7dmFyIFR0PUIucHJvcHN8fHkuRU1QVFlfT0JKLFJ0PVYucHJvcHN8fHkuRU1QVFlfT0JKLFV0O2lmKHRlJiZmbyh0ZSwhMSksKFV0PVJ0Lm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZ6bihVdCx0ZSxWLEIpLHl0JiZ0aShWLEIsdGUsImJlZm9yZVVwZGF0ZSIpLHRlJiZmbyh0ZSwhMCksVWU/aChCLmR5bmFtaWNDaGlsZHJlbixVZSx5ZSx0ZSxkZSxjcihWLG9lKSxSZSk6amV8fGZlKEIsVix5ZSxudWxsLHRlLGRlLGNyKFYsb2UpLFJlLCExKSxKZT4wKXtpZihKZSYxNil2KHllLFYsVHQsUnQsdGUsZGUsb2UpO2Vsc2UgaWYoSmUmMiYmVHQuY2xhc3MhPT1SdC5jbGFzcyYmTyh5ZSwiY2xhc3MiLG51bGwsUnQuY2xhc3Msb2UsW10sdGUsbnVsbCx2b2lkIDAsVi5ob3N0SW5zdGFuY2UpLEplJjQmJk8oeWUsInN0eWxlIixUdC5zdHlsZSxSdC5zdHlsZSxvZSxbXSx0ZSxudWxsLHZvaWQgMCxWLmhvc3RJbnN0YW5jZSksSmUmOClmb3IodmFyIEZuPVYuZHluYW1pY1Byb3BzLEluPTA7SW48Rm4ubGVuZ3RoO0luKyspe3ZhciBEbj1GbltJbl0sSm49VHRbRG5dLGlyPVJ0W0RuXTsoaXIhPT1Kbnx8RG49PT0idmFsdWUifHxMJiZMKHllLERuKSkmJk8oeWUsRG4sSm4saXIsb2UsQi5jaGlsZHJlbix0ZSxkZSxJdCxWLmhvc3RJbnN0YW5jZSl9SmUmMSYmQi5jaGlsZHJlbiE9PVYuY2hpbGRyZW4mJkdlKHllLFYuY2hpbGRyZW4pfWVsc2UhamUmJlVlPT1udWxsJiZ2KHllLFYsVHQsUnQsdGUsZGUsb2UpOygoVXQ9UnQub25Wbm9kZVVwZGF0ZWQpfHx5dCkmJmt0KCgpPT57VXQmJnpuKFV0LHRlLFYsQikseXQmJnRpKFYsQix0ZSwidXBkYXRlZCIpfSxkZSl9LGg9KEIsVix0ZSxkZSxvZSxSZSxqZSk9Pntmb3IodmFyIHllPTA7eWU8Vi5sZW5ndGg7eWUrKyl7dmFyIEplPUJbeWVdLFVlPVZbeWVdLHl0PUplLmVsJiYoSmUudHlwZT09PXRyfHwhSHIoSmUsVWUpfHxKZS5zaGFwZUZsYWcmKDZ8NjQpKT9oZShKZS5lbCk6dGU7ZHQoSmUsVWUseXQsbnVsbCxkZSxvZSxSZSxqZSwhMCl9fSx2PShCLFYsdGUsZGUsb2UsUmUsamUpPT57aWYodGUhPT1kZSl7aWYodGUhPT15LkVNUFRZX09CSilmb3IodmFyIHllIGluIHRlKSF5LmlzUmVzZXJ2ZWRQcm9wKHllKSYmISh5ZSBpbiBkZSkmJk8oQix5ZSx0ZVt5ZV0sbnVsbCxqZSxWLmNoaWxkcmVuLG9lLFJlLEl0LFYuaG9zdEluc3RhbmNlKTtmb3IodmFyIEplIGluIGRlKWlmKCF5LmlzUmVzZXJ2ZWRQcm9wKEplKSl7dmFyIFVlPWRlW0plXSx5dD10ZVtKZV07KFVlIT09eXQmJkplIT09InZhbHVlInx8TCYmTChCLEplKSkmJk8oQixKZSx5dCxVZSxqZSxWLmNoaWxkcmVuLG9lLFJlLEl0LFYuaG9zdEluc3RhbmNlKX0idmFsdWUiaW4gZGUmJk8oQiwidmFsdWUiLHRlLnZhbHVlLGRlLnZhbHVlLGplLFtdLG9lLG51bGwsdm9pZCAwLFYuaG9zdEluc3RhbmNlKX19LEE9KEIsVix0ZSxkZSxvZSxSZSxqZSx5ZSxKZSk9Pnt2YXIgVWU9Vi5lbD1CP0IuZWw6SCgiIikseXQ9Vi5hbmNob3I9Qj9CLmFuY2hvcjpIKCIiKSx7cGF0Y2hGbGFnOlR0LGR5bmFtaWNDaGlsZHJlbjpSdCxzbG90U2NvcGVJZHM6VXR9PVY7VXQmJih5ZT15ZT95ZS5jb25jYXQoVXQpOlV0KSxCPT1udWxsPyh3KFVlLHRlLGRlKSx3KHl0LHRlLGRlKSxpKFYuY2hpbGRyZW58fFtdLHRlLHl0LG9lLFJlLGplLHllLEplKSk6VHQ+MCYmVHQmNjQmJlJ0JiZCLmR5bmFtaWNDaGlsZHJlbj8oaChCLmR5bmFtaWNDaGlsZHJlbixSdCx0ZSxvZSxSZSxqZSx5ZSksKFYua2V5IT1udWxsfHxvZSYmVj09PW9lLnN1YlRyZWUpJiZ3YShCLFYsITApKTpmZShCLFYsdGUseXQsb2UsUmUsamUseWUsSmUpfSxUPShCLFYsdGUsZGUsb2UsUmUsamUseWUsSmUpPT57Vi5zbG90U2NvcGVJZHM9eWUsQj09bnVsbD9WLnNoYXBlRmxhZyY1MTI/b2UuY3R4LmFjdGl2YXRlKFYsdGUsZGUsamUsSmUpOmsoVix0ZSxkZSxvZSxSZSxqZSxKZSk6RChCLFYsSmUpfSxrPShCLFYsdGUsZGUsb2UsUmUsamUpPT57dmFyIHllPUIuY29tcG9uZW50PXNsKEIsZGUsb2UpO2lmKE0oQikmJih5ZS5jdHgucmVuZGVyZXI9VmUpLEVzKHllKSx5ZS5hc3luY0RlcCl7aWYob2UmJm9lLnJlZ2lzdGVyRGVwKHllLGopLCFCLmVsKXt2YXIgSmU9eWUuc3ViVHJlZT1fZShVcik7SHQobnVsbCxKZSxWLHRlKX19ZWxzZSBqKHllLEIsVix0ZSxvZSxSZSxqZSl9LEQ9KEIsVix0ZSk9Pnt2YXIgZGU9Vi5jb21wb25lbnQ9Qi5jb21wb25lbnQ7aWYoZHIoQixWLHRlKSlpZihkZS5hc3luY0RlcCYmIWRlLmFzeW5jUmVzb2x2ZWQpe1ooZGUsVix0ZSk7cmV0dXJufWVsc2UgZGUubmV4dD1WLExuKGRlLnVwZGF0ZSksZGUuZWZmZWN0LmRpcnR5PSEwLGRlLnVwZGF0ZSgpO2Vsc2UgVi5lbD1CLmVsLGRlLnZub2RlPVZ9LGo9KEIsVix0ZSxkZSxvZSxSZSxqZSk9Pnt2YXIgeWU9KCk9PntpZihCLmlzTW91bnRlZCl7dmFye25leHQ6Vm4sYnU6eGEsdTpZbyxwYXJlbnQ6eWksdm5vZGU6cGl9PUI7e3ZhciBHPUJpKEIpO2lmKEcpe1ZuJiYoVm4uZWw9cGkuZWwsWihCLFZuLGplKSksRy5hc3luY0RlcC50aGVuKCgpPT57Qi5pc1VubW91bnRlZHx8eWUoKX0pO3JldHVybn19dmFyIFE9Vm4sQWU7Zm8oQiwhMSksVm4/KFZuLmVsPXBpLmVsLFooQixWbixqZSkpOlZuPXBpLHhhJiZ5Lmludm9rZUFycmF5Rm5zKHhhKSwoQWU9Vm4ucHJvcHMmJlZuLnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZ6bihBZSx5aSxWbixwaSksZm8oQiwhMCk7dmFyIEllPUNpKEIpLHhlPUIuc3ViVHJlZTtCLnN1YlRyZWU9SWUsZHQoeGUsSWUsaGUoeGUuZWwpLHVlKHhlKSxCLG9lLFJlKSxWbi5lbD1JZS5lbCxRPT09bnVsbCYmQm8oQixJZS5lbCksWW8mJmt0KFlvLG9lKSwoQWU9Vm4ucHJvcHMmJlZuLnByb3BzLm9uVm5vZGVVcGRhdGVkKSYma3QoKCk9PnpuKEFlLHlpLFZuLHBpKSxvZSl9ZWxzZXt2YXIgeXQse2VsOlR0LHByb3BzOlJ0fT1WLHtibTpVdCxtOkZuLHBhcmVudDpJbn09QixEbj1OaShWKTtpZihmbyhCLCExKSxVdCYmeS5pbnZva2VBcnJheUZucyhVdCksIURuJiYoeXQ9UnQmJlJ0Lm9uVm5vZGVCZWZvcmVNb3VudCkmJnpuKHl0LEluLFYpLGZvKEIsITApLFR0JiZydCl7dmFyIEpuPSgpPT57Qi5zdWJUcmVlPUNpKEIpLHJ0KFR0LEIuc3ViVHJlZSxCLG9lLG51bGwpfTtEbj9WLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oKCk9PiFCLmlzVW5tb3VudGVkJiZKbigpKTpKbigpfWVsc2V7dmFyIGlyPUIuc3ViVHJlZT1DaShCKTtkdChudWxsLGlyLHRlLGRlLEIsb2UsUmUpLFYuZWw9aXIuZWx9aWYoRm4mJmt0KEZuLG9lKSwhRG4mJih5dD1SdCYmUnQub25Wbm9kZU1vdW50ZWQpKXt2YXIgZmE9VjtrdCgoKT0+em4oeXQsSW4sZmEpLG9lKX0oVi5zaGFwZUZsYWcmMjU2fHxJbiYmTmkoSW4udm5vZGUpJiZJbi52bm9kZS5zaGFwZUZsYWcmMjU2KSYmQi5hJiZrdChCLmEsb2UpLEIuaXNNb3VudGVkPSEwLFY9dGU9ZGU9bnVsbH19LEplPUIuZWZmZWN0PW5ldyBJLlJlYWN0aXZlRWZmZWN0KHllLHkuTk9PUCwoKT0+aHQoVWUpLEIuc2NvcGUpLFVlPUIudXBkYXRlPSgpPT57SmUuZGlydHkmJkplLnJ1bigpfTtVZS5pZD1CLnVpZCxmbyhCLCEwKSxVZSgpfSxaPShCLFYsdGUpPT57Vi5jb21wb25lbnQ9Qjt2YXIgZGU9Qi52bm9kZS5wcm9wcztCLnZub2RlPVYsQi5uZXh0PW51bGwseihCLFYucHJvcHMsZGUsdGUpLHFlKEIsVi5jaGlsZHJlbix0ZSksSS5wYXVzZVRyYWNraW5nKCksQW4oQiksSS5yZXNldFRyYWNraW5nKCl9LGZlPWZ1bmN0aW9uKEIsVix0ZSxkZSxvZSxSZSxqZSx5ZSl7dmFyIEplPWFyZ3VtZW50cy5sZW5ndGg+OCYmYXJndW1lbnRzWzhdIT09dm9pZCAwP2FyZ3VtZW50c1s4XTohMSxVZT1CJiZCLmNoaWxkcmVuLHl0PUI/Qi5zaGFwZUZsYWc6MCxUdD1WLmNoaWxkcmVuLHtwYXRjaEZsYWc6UnQsc2hhcGVGbGFnOlV0fT1WO2lmKFJ0PjApe2lmKFJ0JjEyOCl7cmUoVWUsVHQsdGUsZGUsb2UsUmUsamUseWUsSmUpO3JldHVybn1lbHNlIGlmKFJ0JjI1Nil7Z2UoVWUsVHQsdGUsZGUsb2UsUmUsamUseWUsSmUpO3JldHVybn19VXQmOD8oeXQmMTYmJkl0KFVlLG9lLFJlKSxUdCE9PVVlJiZHZSh0ZSxUdCkpOnl0JjE2P1V0JjE2P3JlKFVlLFR0LHRlLGRlLG9lLFJlLGplLHllLEplKTpJdChVZSxvZSxSZSwhMCk6KHl0JjgmJkdlKHRlLCIiKSxVdCYxNiYmaShUdCx0ZSxkZSxvZSxSZSxqZSx5ZSxKZSkpfSxnZT0oQixWLHRlLGRlLG9lLFJlLGplLHllLEplKT0+e0I9Qnx8eS5FTVBUWV9BUlIsVj1WfHx5LkVNUFRZX0FSUjt2YXIgVWU9Qi5sZW5ndGgseXQ9Vi5sZW5ndGgsVHQ9TWF0aC5taW4oVWUseXQpLFJ0O2ZvcihSdD0wO1J0PFR0O1J0Kyspe3ZhciBVdD1WW1J0XT1KZT9EaShWW1J0XSk6Qm4oVltSdF0pO2R0KEJbUnRdLFV0LHRlLG51bGwsb2UsUmUsamUseWUsSmUpfVVlPnl0P0l0KEIsb2UsUmUsITAsITEsVHQpOmkoVix0ZSxkZSxvZSxSZSxqZSx5ZSxKZSxUdCl9LHJlPShCLFYsdGUsZGUsb2UsUmUsamUseWUsSmUpPT57Zm9yKHZhciBVZT0wLHl0PVYubGVuZ3RoLFR0PUIubGVuZ3RoLTEsUnQ9eXQtMTtVZTw9VHQmJlVlPD1SdDspe3ZhciBVdD1CW1VlXSxGbj1WW1VlXT1KZT9EaShWW1VlXSk6Qm4oVltVZV0pO2lmKEhyKFV0LEZuKSlkdChVdCxGbix0ZSxudWxsLG9lLFJlLGplLHllLEplKTtlbHNlIGJyZWFrO1VlKyt9Zm9yKDtVZTw9VHQmJlVlPD1SdDspe3ZhciBJbj1CW1R0XSxEbj1WW1J0XT1KZT9EaShWW1J0XSk6Qm4oVltSdF0pO2lmKEhyKEluLERuKSlkdChJbixEbix0ZSxudWxsLG9lLFJlLGplLHllLEplKTtlbHNlIGJyZWFrO1R0LS0sUnQtLX1pZihVZT5UdCl7aWYoVWU8PVJ0KWZvcih2YXIgSm49UnQrMSxpcj1Kbjx5dD9WW0puXS5lbDpkZTtVZTw9UnQ7KWR0KG51bGwsVltVZV09SmU/RGkoVltVZV0pOkJuKFZbVWVdKSx0ZSxpcixvZSxSZSxqZSx5ZSxKZSksVWUrK31lbHNlIGlmKFVlPlJ0KWZvcig7VWU8PVR0OylXZShCW1VlXSxvZSxSZSwhMCksVWUrKztlbHNle3ZhciBmYT1VZSxWbj1VZSx4YT1uZXcgTWFwO2ZvcihVZT1WbjtVZTw9UnQ7VWUrKyl7dmFyIFlvPVZbVWVdPUplP0RpKFZbVWVdKTpCbihWW1VlXSk7WW8ua2V5IT1udWxsJiZ4YS5zZXQoWW8ua2V5LFVlKX12YXIgeWkscGk9MCxHPVJ0LVZuKzEsUT0hMSxBZT0wLEllPW5ldyBBcnJheShHKTtmb3IoVWU9MDtVZTxHO1VlKyspSWVbVWVdPTA7Zm9yKFVlPWZhO1VlPD1UdDtVZSsrKXt2YXIgeGU9QltVZV07aWYocGk+PUcpe1dlKHhlLG9lLFJlLCEwKTtjb250aW51ZX12YXIgWmU9dm9pZCAwO2lmKHhlLmtleSE9bnVsbClaZT14YS5nZXQoeGUua2V5KTtlbHNlIGZvcih5aT1Wbjt5aTw9UnQ7eWkrKylpZihJZVt5aS1Wbl09PT0wJiZIcih4ZSxWW3lpXSkpe1plPXlpO2JyZWFrfVplPT09dm9pZCAwP1dlKHhlLG9lLFJlLCEwKTooSWVbWmUtVm5dPVVlKzEsWmU+PUFlP0FlPVplOlE9ITAsZHQoeGUsVltaZV0sdGUsbnVsbCxvZSxSZSxqZSx5ZSxKZSkscGkrKyl9dmFyIG10PVE/aWkoSWUpOnkuRU1QVFlfQVJSO2Zvcih5aT1tdC5sZW5ndGgtMSxVZT1HLTE7VWU+PTA7VWUtLSl7dmFyIFFlPVZuK1VlLG90PVZbUWVdLFllPVFlKzE8eXQ/VltRZSsxXS5lbDpkZTtJZVtVZV09PT0wP2R0KG51bGwsb3QsdGUsWWUsb2UsUmUsamUseWUsSmUpOlEmJih5aTwwfHxVZSE9PW10W3lpXT92ZShvdCx0ZSxZZSwyKTp5aS0tKX19fSx2ZT1mdW5jdGlvbihCLFYsdGUsZGUpe3ZhciBvZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCx7ZWw6UmUsdHlwZTpqZSx0cmFuc2l0aW9uOnllLGNoaWxkcmVuOkplLHNoYXBlRmxhZzpVZX09QjtpZihVZSY2KXt2ZShCLmNvbXBvbmVudC5zdWJUcmVlLFYsdGUsZGUpO3JldHVybn1pZihVZSYxMjgpe0Iuc3VzcGVuc2UubW92ZShWLHRlLGRlKTtyZXR1cm59aWYoVWUmNjQpe2plLm1vdmUoQixWLHRlLFZlKTtyZXR1cm59aWYoamU9PT10cil7dyhSZSxWLHRlKTtmb3IodmFyIHl0PTA7eXQ8SmUubGVuZ3RoO3l0KyspdmUoSmVbeXRdLFYsdGUsZGUpO3coQi5hbmNob3IsVix0ZSk7cmV0dXJufWlmKGplPT09SG8pe2tlKEIsVix0ZSk7cmV0dXJufXZhciBUdD1kZSE9PTImJlVlJjEmJnllO2lmKFR0KWlmKGRlPT09MCl5ZS5iZWZvcmVFbnRlcihSZSksdyhSZSxWLHRlKSxrdCgoKT0+eWUuZW50ZXIoUmUpLG9lKTtlbHNle3ZhcntsZWF2ZTpSdCxkZWxheUxlYXZlOlV0LGFmdGVyTGVhdmU6Rm59PXllLEluPSgpPT53KFJlLFYsdGUpLERuPSgpPT57UnQoUmUsKCk9PntJbigpLEZuJiZGbigpfSl9O1V0P1V0KFJlLEluLERuKTpEbigpfWVsc2UgdyhSZSxWLHRlKX0sV2U9ZnVuY3Rpb24oQixWLHRlKXt2YXIgZGU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLG9lPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMSx7dHlwZTpSZSxwcm9wczpqZSxyZWY6eWUsY2hpbGRyZW46SmUsZHluYW1pY0NoaWxkcmVuOlVlLHNoYXBlRmxhZzp5dCxwYXRjaEZsYWc6VHQsZGlyczpSdH09QjtpZih5ZSE9bnVsbCYmTXQoeWUsbnVsbCx0ZSxCLCEwKSx5dCYyNTYpe1YuY3R4LmRlYWN0aXZhdGUoQik7cmV0dXJufXZhciBVdD15dCYxJiZSdCxGbj0hTmkoQiksSW47aWYoRm4mJihJbj1qZSYmamUub25Wbm9kZUJlZm9yZVVubW91bnQpJiZ6bihJbixWLEIpLHl0JjYpUHQoQi5jb21wb25lbnQsdGUsZGUpO2Vsc2V7aWYoeXQmMTI4KXtCLnN1c3BlbnNlLnVubW91bnQodGUsZGUpO3JldHVybn1VdCYmdGkoQixudWxsLFYsImJlZm9yZVVubW91bnQiKSx5dCY2ND9CLnR5cGUucmVtb3ZlKEIsVix0ZSxvZSxWZSxkZSk6VWUmJihSZSE9PXRyfHxUdD4wJiZUdCY2NCk/SXQoVWUsVix0ZSwhMSwhMCk6KFJlPT09dHImJlR0JigxMjh8MjU2KXx8IW9lJiZ5dCYxNikmJkl0KEplLFYsdGUpLGRlJiZpdChCKX0oRm4mJihJbj1qZSYmamUub25Wbm9kZVVubW91bnRlZCl8fFV0KSYma3QoKCk9PntJbiYmem4oSW4sVixCKSxVdCYmdGkoQixudWxsLFYsInVubW91bnRlZCIpfSx0ZSl9LGl0PUI9Pnt2YXJ7dHlwZTpWLGVsOnRlLGFuY2hvcjpkZSx0cmFuc2l0aW9uOm9lfT1CO2lmKFY9PT10cil7bnQodGUsZGUpO3JldHVybn1pZihWPT09SG8pe3dlKEIpO3JldHVybn12YXIgUmU9KCk9PntOKHRlKSxvZSYmIW9lLnBlcnNpc3RlZCYmb2UuYWZ0ZXJMZWF2ZSYmb2UuYWZ0ZXJMZWF2ZSgpfTtpZihCLnNoYXBlRmxhZyYxJiZvZSYmIW9lLnBlcnNpc3RlZCl7dmFye2xlYXZlOmplLGRlbGF5TGVhdmU6eWV9PW9lLEplPSgpPT5qZSh0ZSxSZSk7eWU/eWUoQi5lbCxSZSxKZSk6SmUoKX1lbHNlIFJlKCl9LG50PShCLFYpPT57Zm9yKHZhciB0ZTtCIT09VjspdGU9RGUoQiksTihCKSxCPXRlO04oVil9LFB0PShCLFYsdGUpPT57dmFye2J1bTpkZSxzY29wZTpvZSx1cGRhdGU6UmUsc3ViVHJlZTpqZSx1bTp5ZX09QjtkZSYmeS5pbnZva2VBcnJheUZucyhkZSksb2Uuc3RvcCgpLFJlJiYoUmUuYWN0aXZlPSExLFdlKGplLEIsVix0ZSkpLHllJiZrdCh5ZSxWKSxrdCgoKT0+e0IuaXNVbm1vdW50ZWQ9ITB9LFYpLFYmJlYucGVuZGluZ0JyYW5jaCYmIVYuaXNVbm1vdW50ZWQmJkIuYXN5bmNEZXAmJiFCLmFzeW5jUmVzb2x2ZWQmJkIuc3VzcGVuc2VJZD09PVYucGVuZGluZ0lkJiYoVi5kZXBzLS0sVi5kZXBzPT09MCYmVi5yZXNvbHZlKCkpfSxJdD1mdW5jdGlvbihCLFYsdGUpe2Zvcih2YXIgZGU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLG9lPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMSxSZT1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06MCxqZT1SZTtqZTxCLmxlbmd0aDtqZSsrKVdlKEJbamVdLFYsdGUsZGUsb2UpfSx1ZT1CPT5CLnNoYXBlRmxhZyY2P3VlKEIuY29tcG9uZW50LnN1YlRyZWUpOkIuc2hhcGVGbGFnJjEyOD9CLnN1c3BlbnNlLm5leHQoKTpEZShCLmFuY2hvcnx8Qi5lbCksT2U9ITEsU2U9KEIsVix0ZSk9PntCPT1udWxsP1YuX3Zub2RlJiZXZShWLl92bm9kZSxudWxsLG51bGwsITApOmR0KFYuX3Zub2RlfHxudWxsLEIsVixudWxsLG51bGwsbnVsbCx0ZSksT2V8fChPZT0hMCxBbigpLCRuKCksT2U9ITEpLFYuX3Zub2RlPUJ9LFZlPXtwOmR0LHVtOldlLG06dmUscjppdCxtdDprLG1jOmkscGM6ZmUscGJjOmgsbjp1ZSxvOmF9LHZ0LHJ0O3JldHVybiBjJiYoW3Z0LHJ0XT1jKFZlKSkse3JlbmRlcjpTZSxoeWRyYXRlOnZ0LGNyZWF0ZUFwcDpicyhTZSx2dCl9fWZ1bmN0aW9uIGNyKGEsYyl7dmFye3R5cGU6bSxwcm9wczp3fT1hO3JldHVybiBjPT09InN2ZyImJm09PT0iZm9yZWlnbk9iamVjdCJ8fGM9PT0ibWF0aG1sIiYmbT09PSJhbm5vdGF0aW9uLXhtbCImJncmJncuZW5jb2RpbmcmJncuZW5jb2RpbmcuaW5jbHVkZXMoImh0bWwiKT92b2lkIDA6Y31mdW5jdGlvbiBmbyhhLGMpe3ZhcntlZmZlY3Q6bSx1cGRhdGU6d309YTttLmFsbG93UmVjdXJzZT13LmFsbG93UmVjdXJzZT1jfWZ1bmN0aW9uIE9vKGEsYyl7cmV0dXJuKCFhfHxhJiYhYS5wZW5kaW5nQnJhbmNoKSYmYyYmIWMucGVyc2lzdGVkfWZ1bmN0aW9uIHdhKGEsYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHc9YS5jaGlsZHJlbixOPWMuY2hpbGRyZW47aWYoeS5pc0FycmF5KHcpJiZ5LmlzQXJyYXkoTikpZm9yKHZhciBPPTA7Tzx3Lmxlbmd0aDtPKyspe3ZhciBMPXdbT10sSj1OW09dO0ouc2hhcGVGbGFnJjEmJiFKLmR5bmFtaWNDaGlsZHJlbiYmKChKLnBhdGNoRmxhZzw9MHx8Si5wYXRjaEZsYWc9PT0zMikmJihKPU5bT109RGkoTltPXSksSi5lbD1MLmVsKSxtfHx3YShMLEopKSxKLnR5cGU9PT1zYSYmKEouZWw9TC5lbCl9fWZ1bmN0aW9uIGlpKGEpe3ZhciBjPWEuc2xpY2UoKSxtPVswXSx3LE4sTyxMLEosSD1hLmxlbmd0aDtmb3Iodz0wO3c8SDt3Kyspe3ZhciBlZT1hW3ddO2lmKGVlIT09MCl7aWYoTj1tW20ubGVuZ3RoLTFdLGFbTl08ZWUpe2Nbd109TixtLnB1c2godyk7Y29udGludWV9Zm9yKE89MCxMPW0ubGVuZ3RoLTE7TzxMOylKPU8rTD4+MSxhW21bSl1dPGVlP089SisxOkw9SjtlZTxhW21bT11dJiYoTz4wJiYoY1t3XT1tW08tMV0pLG1bT109dyl9fWZvcihPPW0ubGVuZ3RoLEw9bVtPLTFdO08tLSA+MDspbVtPXT1MLEw9Y1tMXTtyZXR1cm4gbX1mdW5jdGlvbiBCaShhKXt2YXIgYz1hLnN1YlRyZWUuY29tcG9uZW50O2lmKGMpcmV0dXJuIGMuYXN5bmNEZXAmJiFjLmFzeW5jUmVzb2x2ZWQ/YzpCaShjKX12YXIgUG89YT0+YS5fX2lzVGVsZXBvcnQseG49YT0+YSYmKGEuZGlzYWJsZWR8fGEuZGlzYWJsZWQ9PT0iIiksVWE9YT0+dHlwZW9mIFNWR0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZhIGluc3RhbmNlb2YgU1ZHRWxlbWVudCx0cz1hPT50eXBlb2YgTWF0aE1MRWxlbWVudD09ImZ1bmN0aW9uIiYmYSBpbnN0YW5jZW9mIE1hdGhNTEVsZW1lbnQsJG89KGEsYyk9Pnt2YXIgbT1hJiZhLnRvO2lmKHkuaXNTdHJpbmcobSkpaWYoYyl7dmFyIHc9YyhtKTtyZXR1cm4gd31lbHNlIHJldHVybiBudWxsO2Vsc2UgcmV0dXJuIG19LEFhPXtuYW1lOiJUZWxlcG9ydCIsX19pc1RlbGVwb3J0OiEwLHByb2Nlc3MoYSxjLG0sdyxOLE8sTCxKLEgsZWUpe3ZhcnttYzpDZSxwYzpHZSxwYmM6aGUsbzp7aW5zZXJ0OkRlLHF1ZXJ5U2VsZWN0b3I6ZXQsY3JlYXRlVGV4dDpndCxjcmVhdGVDb21tZW50OmR0fX09ZWUsVnQ9eG4oYy5wcm9wcykse3NoYXBlRmxhZzpIdCxjaGlsZHJlbjphZSxkeW5hbWljQ2hpbGRyZW46a2V9PWM7aWYoYT09bnVsbCl7dmFyIHdlPWMuZWw9Z3QoIiIpLEhlPWMuYW5jaG9yPWd0KCIiKTtEZSh3ZSxtLHcpLERlKEhlLG0sdyk7dmFyIHd0PWMudGFyZ2V0PSRvKGMucHJvcHMsZXQpLHR0PWMudGFyZ2V0QW5jaG9yPWd0KCIiKTt3dCYmKERlKHR0LHd0KSxMPT09InN2ZyJ8fFVhKHd0KT9MPSJzdmciOihMPT09Im1hdGhtbCJ8fHRzKHd0KSkmJihMPSJtYXRobWwiKSk7dmFyIGk9KGosWik9PntIdCYxNiYmQ2UoYWUsaixaLE4sTyxMLEosSCl9O1Z0P2kobSxIZSk6d3QmJmkod3QsdHQpfWVsc2V7Yy5lbD1hLmVsO3ZhciBsPWMuYW5jaG9yPWEuYW5jaG9yLGg9Yy50YXJnZXQ9YS50YXJnZXQsdj1jLnRhcmdldEFuY2hvcj1hLnRhcmdldEFuY2hvcixBPXhuKGEucHJvcHMpLFQ9QT9tOmgsaz1BP2w6djtpZihMPT09InN2ZyJ8fFVhKGgpP0w9InN2ZyI6KEw9PT0ibWF0aG1sInx8dHMoaCkpJiYoTD0ibWF0aG1sIiksa2U/KGhlKGEuZHluYW1pY0NoaWxkcmVuLGtlLFQsTixPLEwsSiksd2EoYSxjLCEwKSk6SHx8R2UoYSxjLFQsayxOLE8sTCxKLCExKSxWdClBP2MucHJvcHMmJmEucHJvcHMmJmMucHJvcHMudG8hPT1hLnByb3BzLnRvJiYoYy5wcm9wcy50bz1hLnByb3BzLnRvKTprcihjLG0sbCxlZSwxKTtlbHNlIGlmKChjLnByb3BzJiZjLnByb3BzLnRvKSE9PShhLnByb3BzJiZhLnByb3BzLnRvKSl7dmFyIEQ9Yy50YXJnZXQ9JG8oYy5wcm9wcyxldCk7RCYma3IoYyxELG51bGwsZWUsMCl9ZWxzZSBBJiZrcihjLGgsdixlZSwxKX1obyhjKX0scmVtb3ZlKGEsYyxtLHcsTixPKXt2YXJ7dW06TCxvOntyZW1vdmU6Sn19PU4se3NoYXBlRmxhZzpILGNoaWxkcmVuOmVlLGFuY2hvcjpDZSx0YXJnZXRBbmNob3I6R2UsdGFyZ2V0OmhlLHByb3BzOkRlfT1hO2lmKGhlJiZKKEdlKSxPJiZKKENlKSxIJjE2KWZvcih2YXIgZXQ9T3x8IXhuKERlKSxndD0wO2d0PGVlLmxlbmd0aDtndCsrKXt2YXIgZHQ9ZWVbZ3RdO0woZHQsYyxtLGV0LCEhZHQuZHluYW1pY0NoaWxkcmVuKX19LG1vdmU6a3IsaHlkcmF0ZTpDYX07ZnVuY3Rpb24ga3IoYSxjLG0sdyl7dmFye286e2luc2VydDpOfSxtOk99PXcsTD1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06MjtMPT09MCYmTihhLnRhcmdldEFuY2hvcixjLG0pO3ZhcntlbDpKLGFuY2hvcjpILHNoYXBlRmxhZzplZSxjaGlsZHJlbjpDZSxwcm9wczpHZX09YSxoZT1MPT09MjtpZihoZSYmTihKLGMsbSksKCFoZXx8eG4oR2UpKSYmZWUmMTYpZm9yKHZhciBEZT0wO0RlPENlLmxlbmd0aDtEZSsrKU8oQ2VbRGVdLGMsbSwyKTtoZSYmTihILGMsbSl9ZnVuY3Rpb24gQ2EoYSxjLG0sdyxOLE8sTCxKKXt2YXJ7bzp7bmV4dFNpYmxpbmc6SCxwYXJlbnROb2RlOmVlLHF1ZXJ5U2VsZWN0b3I6Q2V9fT1MLEdlPWMudGFyZ2V0PSRvKGMucHJvcHMsQ2UpO2lmKEdlKXt2YXIgaGU9R2UuX2xwYXx8R2UuZmlyc3RDaGlsZDtpZihjLnNoYXBlRmxhZyYxNilpZih4bihjLnByb3BzKSljLmFuY2hvcj1KKEgoYSksYyxlZShhKSxtLHcsTixPKSxjLnRhcmdldEFuY2hvcj1oZTtlbHNle2MuYW5jaG9yPUgoYSk7Zm9yKHZhciBEZT1oZTtEZTspaWYoRGU9SChEZSksRGUmJkRlLm5vZGVUeXBlPT09OCYmRGUuZGF0YT09PSJ0ZWxlcG9ydCBhbmNob3IiKXtjLnRhcmdldEFuY2hvcj1EZSxHZS5fbHBhPWMudGFyZ2V0QW5jaG9yJiZIKGMudGFyZ2V0QW5jaG9yKTticmVha31KKGhlLGMsR2UsbSx3LE4sTyl9aG8oYyl9cmV0dXJuIGMuYW5jaG9yJiZIKGMuYW5jaG9yKX12YXIgTWk9QWE7ZnVuY3Rpb24gaG8oYSl7dmFyIGM9YS5jdHg7aWYoYyYmYy51dCl7Zm9yKHZhciBtPWEuY2hpbGRyZW5bMF0uZWw7bSYmbSE9PWEudGFyZ2V0QW5jaG9yOyltLm5vZGVUeXBlPT09MSYmbS5zZXRBdHRyaWJ1dGUoImRhdGEtdi1vd25lciIsYy51aWQpLG09bS5uZXh0U2libGluZztjLnV0KCl9fXZhciB0cj1TeW1ib2wuZm9yKCJ2LWZndCIpLHNhPVN5bWJvbC5mb3IoInYtdHh0IiksVXI9U3ltYm9sLmZvcigidi1jbXQiKSxIbz1TeW1ib2wuZm9yKCJ2LXN0YyIpLG5yPVtdLEduPW51bGw7ZnVuY3Rpb24gZ3IoKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06ITE7bnIucHVzaChHbj1hP251bGw6W10pfWZ1bmN0aW9uIGdvKCl7bnIucG9wKCksR249bnJbbnIubGVuZ3RoLTFdfHxudWxsfXZhciBZbj0xO2Z1bmN0aW9uICRyKGEpe1luKz1hfWZ1bmN0aW9uIFRhKGEpe3JldHVybiBhLmR5bmFtaWNDaGlsZHJlbj1Zbj4wP0dufHx5LkVNUFRZX0FSUjpudWxsLGdvKCksWW4+MCYmR24mJkduLnB1c2goYSksYX1mdW5jdGlvbiBucyhhLGMsbSx3LE4sTyl7cmV0dXJuIFRhKHlzKGEsYyxtLHcsTixPLCEwKSl9ZnVuY3Rpb24gZGkoYSxjLG0sdyxOKXtyZXR1cm4gVGEoX2UoYSxjLG0sdyxOLCEwKSl9ZnVuY3Rpb24gS3IoYSl7cmV0dXJuIGE/YS5fX3ZfaXNWTm9kZT09PSEwOiExfWZ1bmN0aW9uIEhyKGEsYyl7cmV0dXJuIGEudHlwZT09PWMudHlwZSYmYS5rZXk9PT1jLmtleX1mdW5jdGlvbiBvbChhKXt9dmFyIExpPSJfX3ZJbnRlcm5hbCIsTm89YT0+e3ZhcntrZXk6Y309YTtyZXR1cm4gYyE9bnVsbD9jOm51bGx9LG9pPWE9Pnt2YXJ7cmVmOmMscmVmX2tleTptLHJlZl9mb3I6d309YTtyZXR1cm4gdHlwZW9mIGM9PSJudW1iZXIiJiYoYz0iIitjKSxjIT1udWxsP3kuaXNTdHJpbmcoYyl8fEkuaXNSZWYoYyl8fHkuaXNGdW5jdGlvbihjKT97aTpPbixyOmMsazptLGY6ISF3fTpjOm51bGx9O2Z1bmN0aW9uIHlzKGEpe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpudWxsLG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsdz1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106MCxOPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLE89YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOmE9PT10cj8wOjEsTD1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSE9PXZvaWQgMD9hcmd1bWVudHNbNl06ITEsSj1hcmd1bWVudHMubGVuZ3RoPjcmJmFyZ3VtZW50c1s3XSE9PXZvaWQgMD9hcmd1bWVudHNbN106ITEsSD17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTphLHByb3BzOmMsa2V5OmMmJk5vKGMpLHJlZjpjJiZvaShjKSxzY29wZUlkOm1yLHNsb3RTY29wZUlkczpudWxsLGNoaWxkcmVuOm0sY29tcG9uZW50Om51bGwsc3VzcGVuc2U6bnVsbCxzc0NvbnRlbnQ6bnVsbCxzc0ZhbGxiYWNrOm51bGwsZGlyczpudWxsLHRyYW5zaXRpb246bnVsbCxlbDpudWxsLGFuY2hvcjpudWxsLHRhcmdldDpudWxsLHRhcmdldEFuY2hvcjpudWxsLHN0YXRpY0NvdW50OjAsc2hhcGVGbGFnOk8scGF0Y2hGbGFnOncsZHluYW1pY1Byb3BzOk4sZHluYW1pY0NoaWxkcmVuOm51bGwsYXBwQ29udGV4dDpudWxsLGhvc3RJbnN0YW5jZTpPbixjdHg6T259O3JldHVybiBKPyhqbyhILG0pLE8mMTI4JiZhLm5vcm1hbGl6ZShIKSk6bSYmKEguc2hhcGVGbGFnfD15LmlzU3RyaW5nKG0pPzg6MTYpLFluPjAmJiFMJiZHbiYmKEgucGF0Y2hGbGFnPjB8fE8mNikmJkgucGF0Y2hGbGFnIT09MzImJkduLnB1c2goSCksSH12YXIgX2U9eHQ7ZnVuY3Rpb24geHQoYSl7dmFyIGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCx3PWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLE49YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsTz1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITE7aWYoKCFhfHxhPT09RW8pJiYoYT1VciksS3IoYSkpe3ZhciBMPW9uKGEsYywhMCk7cmV0dXJuIG0mJmpvKEwsbSksWW4+MCYmIU8mJkduJiYoTC5zaGFwZUZsYWcmNj9HbltHbi5pbmRleE9mKGEpXT1MOkduLnB1c2goTCkpLEwucGF0Y2hGbGFnfD0tMixMfWlmKGZsKGEpJiYoYT1hLl9fdmNjT3B0cyksYyl7Yz1DdChjKTt2YXJ7Y2xhc3M6SixzdHlsZTpIfT1jO0omJiF5LmlzU3RyaW5nKEopJiYoYy5jbGFzcz15Lm5vcm1hbGl6ZUNsYXNzKEopKSx5LmlzT2JqZWN0KEgpJiYoSS5pc1Byb3h5KEgpJiYheS5pc0FycmF5KEgpJiYoSD15LmV4dGVuZCh7fSxIKSksYy5zdHlsZT15Lm5vcm1hbGl6ZVN0eWxlKEgpKX12YXIgZWU9eS5pc1N0cmluZyhhKT8xOmVpKGEpPzEyODpQbyhhKT82NDp5LmlzT2JqZWN0KGEpPzQ6eS5pc0Z1bmN0aW9uKGEpPzI6MDtyZXR1cm4geXMoYSxjLG0sdyxOLGVlLE8sITApfWZ1bmN0aW9uIEN0KGEpe3JldHVybiBhP0kuaXNQcm94eShhKXx8TGkgaW4gYT95LmV4dGVuZCh7fSxhKTphOm51bGx9ZnVuY3Rpb24gb24oYSxjKXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEse3Byb3BzOncscmVmOk4scGF0Y2hGbGFnOk8sY2hpbGRyZW46TH09YSxKPWM/QnMod3x8e30sYyk6dyxIPXtfX3ZfaXNWTm9kZTohMCxfX3Zfc2tpcDohMCx0eXBlOmEudHlwZSxwcm9wczpKLGtleTpKJiZObyhKKSxyZWY6YyYmYy5yZWY/bSYmTj95LmlzQXJyYXkoTik/Ti5jb25jYXQob2koYykpOltOLG9pKGMpXTpvaShjKTpOLHNjb3BlSWQ6YS5zY29wZUlkLHNsb3RTY29wZUlkczphLnNsb3RTY29wZUlkcyxjaGlsZHJlbjpMLHRhcmdldDphLnRhcmdldCx0YXJnZXRBbmNob3I6YS50YXJnZXRBbmNob3Isc3RhdGljQ291bnQ6YS5zdGF0aWNDb3VudCxzaGFwZUZsYWc6YS5zaGFwZUZsYWcscGF0Y2hGbGFnOmMmJmEudHlwZSE9PXRyP089PT0tMT8xNjpPfDE2Ok8sZHluYW1pY1Byb3BzOmEuZHluYW1pY1Byb3BzLGR5bmFtaWNDaGlsZHJlbjphLmR5bmFtaWNDaGlsZHJlbixhcHBDb250ZXh0OmEuYXBwQ29udGV4dCxob3N0SW5zdGFuY2U6YS5ob3N0SW5zdGFuY2UsZGlyczphLmRpcnMsdHJhbnNpdGlvbjphLnRyYW5zaXRpb24sY29tcG9uZW50OmEuY29tcG9uZW50LHN1c3BlbnNlOmEuc3VzcGVuc2Usc3NDb250ZW50OmEuc3NDb250ZW50JiZvbihhLnNzQ29udGVudCksc3NGYWxsYmFjazphLnNzRmFsbGJhY2smJm9uKGEuc3NGYWxsYmFjayksZWw6YS5lbCxhbmNob3I6YS5hbmNob3IsY3R4OmEuY3R4LGNlOmEuY2V9O3JldHVybiBIfWZ1bmN0aW9uIHRuKCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIgIixjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowO3JldHVybiBfZShzYSxudWxsLGEsYyl9ZnVuY3Rpb24gRmkoYSxjKXt2YXIgbT1fZShIbyxudWxsLGEpO3JldHVybiBtLnN0YXRpY0NvdW50PWMsbX1mdW5jdGlvbiBrbygpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiIixjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gYz8oZ3IoKSxkaShVcixudWxsLGEpKTpfZShVcixudWxsLGEpfWZ1bmN0aW9uIEJuKGEpe3JldHVybiBhPT1udWxsfHx0eXBlb2YgYT09ImJvb2xlYW4iP19lKFVyKTp5LmlzQXJyYXkoYSk/X2UodHIsbnVsbCxhLnNsaWNlKCkpOnR5cGVvZiBhPT0ib2JqZWN0Ij9EaShhKTpfZShzYSxudWxsLFN0cmluZyhhKSl9ZnVuY3Rpb24gRGkoYSl7cmV0dXJuIGEuZWw9PT1udWxsJiZhLnBhdGNoRmxhZyE9PS0xfHxhLm1lbW8/YTpvbihhKX1mdW5jdGlvbiBqbyhhLGMpe3ZhciBtPTAse3NoYXBlRmxhZzp3fT1hO2lmKGM9PW51bGwpYz1udWxsO2Vsc2UgaWYoeS5pc0FycmF5KGMpKW09MTY7ZWxzZSBpZih0eXBlb2YgYz09Im9iamVjdCIpaWYodyYoMXw2NCkpe3ZhciBOPWMuZGVmYXVsdDtOJiYoTi5fYyYmKE4uX2Q9ITEpLGpvKGEsTigpKSxOLl9jJiYoTi5fZD0hMCkpO3JldHVybn1lbHNle209MzI7dmFyIE89Yy5fOyFPJiYhKExpIGluIGMpP2MuX2N0eD1PbjpPPT09MyYmT24mJihPbi5zbG90cy5fPT09MT9jLl89MTooYy5fPTIsYS5wYXRjaEZsYWd8PTEwMjQpKX1lbHNlIHkuaXNGdW5jdGlvbihjKT8oYz17ZGVmYXVsdDpjLF9jdHg6T259LG09MzIpOihjPVN0cmluZyhjKSx3JjY0PyhtPTE2LGM9W3RuKGMpXSk6bT04KTthLmNoaWxkcmVuPWMsYS5zaGFwZUZsYWd8PW19ZnVuY3Rpb24gQnMoKXtmb3IodmFyIGE9e30sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBtPWM8MHx8YXJndW1lbnRzLmxlbmd0aDw9Yz92b2lkIDA6YXJndW1lbnRzW2NdO2Zvcih2YXIgdyBpbiBtKWlmKHc9PT0iY2xhc3MiKWEuY2xhc3MhPT1tLmNsYXNzJiYoYS5jbGFzcz15Lm5vcm1hbGl6ZUNsYXNzKFthLmNsYXNzLG0uY2xhc3NdKSk7ZWxzZSBpZih3PT09InN0eWxlIilhLnN0eWxlPXkubm9ybWFsaXplU3R5bGUoW2Euc3R5bGUsbS5zdHlsZV0pO2Vsc2UgaWYoeS5pc09uKHcpKXt2YXIgTj1hW3ddLE89bVt3XTtPJiZOIT09TyYmISh5LmlzQXJyYXkoTikmJk4uaW5jbHVkZXMoTykpJiYoYVt3XT1OP1tdLmNvbmNhdChOLE8pOk8pfWVsc2UgdyE9PSIiJiYoYVt3XT1tW3ddKX1yZXR1cm4gYX1mdW5jdGlvbiB6bihhLGMsbSl7dmFyIHc9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7Ym4oYSxjLDcsW20sd10pfXZhciBPYT1KcigpLGFsPTA7ZnVuY3Rpb24gc2woYSxjLG0pe3ZhciB3PWEudHlwZSxOPShjP2MuYXBwQ29udGV4dDphLmFwcENvbnRleHQpfHxPYSxPPXt1aWQ6YWwrKyx2bm9kZTphLHR5cGU6dyxwYXJlbnQ6YyxhcHBDb250ZXh0Ok4scm9vdDpudWxsLG5leHQ6bnVsbCxzdWJUcmVlOm51bGwsZWZmZWN0Om51bGwsdXBkYXRlOm51bGwsc2NvcGU6bmV3IEkuRWZmZWN0U2NvcGUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6Yz9jLnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoTi5wcm92aWRlcyksYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpYKHcsTiksZW1pdHNPcHRpb25zOnZhKHcsTiksZW1pdDpudWxsLGVtaXR0ZWQ6bnVsbCxwcm9wc0RlZmF1bHRzOnkuRU1QVFlfT0JKLGluaGVyaXRBdHRyczp3LmluaGVyaXRBdHRycyxjdHg6eS5FTVBUWV9PQkosZGF0YTp5LkVNUFRZX09CSixwcm9wczp5LkVNUFRZX09CSixhdHRyczp5LkVNUFRZX09CSixzbG90czp5LkVNUFRZX09CSixyZWZzOnkuRU1QVFlfT0JKLHNldHVwU3RhdGU6eS5FTVBUWV9PQkosc2V0dXBDb250ZXh0Om51bGwsYXR0cnNQcm94eTpudWxsLHNsb3RzUHJveHk6bnVsbCxzdXNwZW5zZTptLHN1c3BlbnNlSWQ6bT9tLnBlbmRpbmdJZDowLGFzeW5jRGVwOm51bGwsYXN5bmNSZXNvbHZlZDohMSxpc01vdW50ZWQ6ITEsaXNVbm1vdW50ZWQ6ITEsaXNEZWFjdGl2YXRlZDohMSxiYzpudWxsLGM6bnVsbCxibTpudWxsLG06bnVsbCxidTpudWxsLHU6bnVsbCx1bTpudWxsLGJ1bTpudWxsLGRhOm51bGwsYTpudWxsLHJ0ZzpudWxsLHJ0YzpudWxsLGVjOm51bGwsc3A6bnVsbH07cmV0dXJuIE8uY3R4PXtfOk99LE8ucm9vdD1jP2Mucm9vdDpPLE8uZW1pdD1aby5iaW5kKG51bGwsTyksYS5jZSYmYS5jZShPKSxPfXZhciBfbj1udWxsLHBvPSgpPT5fbnx8T24sUGEsbGE7e3ZhciBycj15LmdldEdsb2JhbFRoaXMoKSxJbz0oYSxjKT0+e3ZhciBtO3JldHVybihtPXJyW2FdKXx8KG09cnJbYV09W10pLG0ucHVzaChjKSx3PT57bS5sZW5ndGg+MT9tLmZvckVhY2goTj0+Tih3KSk6bVswXSh3KX19O1BhPUlvKCJfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX18iLGE9Pl9uPWEpLGxhPUlvKCJfX1ZVRV9TU1JfU0VUVEVSU19fIixhPT5nLmlzSW5TU1JDb21wb25lbnRTZXR1cD1hKX12YXIgaGk9YT0+e3ZhciBjPV9uO3JldHVybiBQYShhKSxhLnNjb3BlLm9uKCksKCk9PnthLnNjb3BlLm9mZigpLFBhKGMpfX0sJGE9KCk9PntfbiYmX24uc2NvcGUub2ZmKCksUGEobnVsbCl9O2Z1bmN0aW9uIGxsKGEpe3JldHVybiBhLnZub2RlLnNoYXBlRmxhZyY0fWcuaXNJblNTUkNvbXBvbmVudFNldHVwPSExO2Z1bmN0aW9uIEVzKGEpe3ZhciBjPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtjJiZsYShjKTt2YXJ7cHJvcHM6bSxjaGlsZHJlbjp3fT1hLnZub2RlLE49bGwoYSk7eChhLG0sTixjKSxidChhLHcpO3ZhciBPPU4/TmEoYSxjKTp2b2lkIDA7cmV0dXJuIGMmJmxhKCExKSxPfWZ1bmN0aW9uIE5hKGEsYyl7dmFyIG09YS50eXBlO2EuYWNjZXNzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSxhLnByb3h5PUkubWFya1JhdyhuZXcgUHJveHkoYS5jdHgsVG8pKTt2YXJ7c2V0dXA6d309bTtpZih3KXt2YXIgTj1hLnNldHVwQ29udGV4dD13Lmxlbmd0aD4xP3pvKGEpOm51bGwsTz1oaShhKTtJLnBhdXNlVHJhY2tpbmcoKTt2YXIgTD1sbih3LGEsMCxbYS5wcm9wcyxOXSk7aWYoSS5yZXNldFRyYWNraW5nKCksTygpLHkuaXNQcm9taXNlKEwpKXtpZihMLnRoZW4oJGEsJGEpLGMpcmV0dXJuIEwudGhlbihKPT57cnMoYSxKLGMpfSkuY2F0Y2goSj0+e1puKEosYSwwKX0pO2EuYXN5bmNEZXA9TH1lbHNlIHJzKGEsTCxjKX1lbHNlIGFzKGEsYyl9ZnVuY3Rpb24gcnMoYSxjLG0pe3kuaXNGdW5jdGlvbihjKT9hLnR5cGUuX19zc3JJbmxpbmVSZW5kZXI/YS5zc3JSZW5kZXI9YzphLnJlbmRlcj1jOnkuaXNPYmplY3QoYykmJihhLnNldHVwU3RhdGU9SS5wcm94eVJlZnMoYykpLGFzKGEsbSl9dmFyIGlzLG9zO2Z1bmN0aW9uIE1zKGEpe2lzPWEsb3M9Yz0+e2MucmVuZGVyLl9yYyYmKGMud2l0aFByb3h5PW5ldyBQcm94eShjLmN0eCxuYSkpfX12YXIgY2w9KCk9PiFpcztmdW5jdGlvbiBhcyhhLGMsbSl7dmFyIHc9YS50eXBlO2lmKCFhLnJlbmRlcil7aWYoIWMmJmlzJiYhdy5yZW5kZXIpe3ZhciBOPXcudGVtcGxhdGV8fFZvKGEpLnRlbXBsYXRlO2lmKE4pe3Zhcntpc0N1c3RvbUVsZW1lbnQ6Tyxjb21waWxlck9wdGlvbnM6TH09YS5hcHBDb250ZXh0LmNvbmZpZyx7ZGVsaW1pdGVyczpKLGNvbXBpbGVyT3B0aW9uczpIfT13LGVlPXkuZXh0ZW5kKHkuZXh0ZW5kKHtpc0N1c3RvbUVsZW1lbnQ6TyxkZWxpbWl0ZXJzOkp9LEwpLEgpO3cucmVuZGVyPWlzKE4sZWUpfX1hLnJlbmRlcj13LnJlbmRlcnx8eS5OT09QLG9zJiZvcyhhKX17dmFyIENlPWhpKGEpO0kucGF1c2VUcmFja2luZygpO3RyeXt4cyhhKX1maW5hbGx5e0kucmVzZXRUcmFja2luZygpLENlKCl9fX1mdW5jdGlvbiB1bChhKXtyZXR1cm4gYS5hdHRyc1Byb3h5fHwoYS5hdHRyc1Byb3h5PW5ldyBQcm94eShhLmF0dHJzLHtnZXQoYyxtKXtyZXR1cm4gSS50cmFjayhhLCJnZXQiLCIkYXR0cnMiKSxjW21dfX0pKX1mdW5jdGlvbiB6byhhKXt2YXIgYz1tPT57YS5leHBvc2VkPW18fHt9fTtyZXR1cm57Z2V0IGF0dHJzKCl7cmV0dXJuIHVsKGEpfSxzbG90czphLnNsb3RzLGVtaXQ6YS5lbWl0LGV4cG9zZTpjfX1mdW5jdGlvbiBrYShhKXtpZihhLmV4cG9zZWQpcmV0dXJuIGEuZXhwb3NlUHJveHl8fChhLmV4cG9zZVByb3h5PW5ldyBQcm94eShJLnByb3h5UmVmcyhJLm1hcmtSYXcoYS5leHBvc2VkKSkse2dldChjLG0pe2lmKG0gaW4gYylyZXR1cm4gY1ttXTtpZihtIGluIHVvKXJldHVybiB1b1ttXShhKX0saGFzKGMsbSl7cmV0dXJuIG0gaW4gY3x8bSBpbiB1b319KSl9dmFyIHNzPS8oPzpefFstX10pKFx3KS9nLFNzPWE9PmEucmVwbGFjZShzcyxjPT5jLnRvVXBwZXJDYXNlKCkpLnJlcGxhY2UoL1stX10vZywiIik7ZnVuY3Rpb24gSGEoYSl7dmFyIGM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiEwO3JldHVybiB5LmlzRnVuY3Rpb24oYSk/YS5kaXNwbGF5TmFtZXx8YS5uYW1lOmEubmFtZXx8YyYmYS5fX25hbWV9ZnVuY3Rpb24gSWEoYSxjKXt2YXIgbT1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsdz1IYShjKTtpZighdyYmYy5fX2ZpbGUpe3ZhciBOPWMuX19maWxlLm1hdGNoKC8oW14vXFxdKylcLlx3KyQvKTtOJiYodz1OWzFdKX1pZighdyYmYSYmYS5wYXJlbnQpe3ZhciBPPUw9Pntmb3IodmFyIEogaW4gTClpZihMW0pdPT09YylyZXR1cm4gSn07dz1PKGEuY29tcG9uZW50c3x8YS5wYXJlbnQudHlwZS5jb21wb25lbnRzKXx8TyhhLmFwcENvbnRleHQuY29tcG9uZW50cyl9cmV0dXJuIHc/U3Modyk6bT8iQXBwIjoiQW5vbnltb3VzIn1mdW5jdGlvbiBmbChhKXtyZXR1cm4geS5pc0Z1bmN0aW9uKGEpJiYiX192Y2NPcHRzImluIGF9dmFyIGRsPShhLGMpPT57dmFyIG09SS5jb21wdXRlZChhLGMsZy5pc0luU1NSQ29tcG9uZW50U2V0dXApO3JldHVybiBtfTtmdW5jdGlvbiB3cyhhLGMpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp5LkVNUFRZX09CSix3PXBvKCksTj15LmNhbWVsaXplKGMpLE89eS5oeXBoZW5hdGUoYyksTD1JLmN1c3RvbVJlZigoSCxlZSk9Pnt2YXIgQ2U7cmV0dXJuIExvKCgpPT57dmFyIEdlPWFbY107eS5oYXNDaGFuZ2VkKENlLEdlKSYmKENlPUdlLGVlKCkpfSkse2dldCgpe3JldHVybiBIKCksbS5nZXQ/bS5nZXQoQ2UpOkNlfSxzZXQoR2Upe3ZhciBoZT13LnZub2RlLnByb3BzOyEoaGUmJihjIGluIGhlfHxOIGluIGhlfHxPIGluIGhlKSYmKCJvblVwZGF0ZToiLmNvbmNhdChjKWluIGhlfHwib25VcGRhdGU6Ii5jb25jYXQoTilpbiBoZXx8Im9uVXBkYXRlOiIuY29uY2F0KE8paW4gaGUpKSYmeS5oYXNDaGFuZ2VkKEdlLENlKSYmKENlPUdlLGVlKCkpLHcuZW1pdCgidXBkYXRlOiIuY29uY2F0KGMpLG0uc2V0P20uc2V0KEdlKTpHZSl9fX0pLEo9Yz09PSJtb2RlbFZhbHVlIj8ibW9kZWxNb2RpZmllcnMiOiIiLmNvbmNhdChjLCJNb2RpZmllcnMiKTtyZXR1cm4gTFtTeW1ib2wuaXRlcmF0b3JdPSgpPT57dmFyIEg9MDtyZXR1cm57bmV4dCgpe3JldHVybiBIPDI/e3ZhbHVlOkgrKz9hW0pdfHx7fTpMLGRvbmU6ITF9Ontkb25lOiEwfX19fSxMfWZ1bmN0aW9uIGhsKGEsYyxtKXt2YXIgdz1hcmd1bWVudHMubGVuZ3RoO3JldHVybiB3PT09Mj95LmlzT2JqZWN0KGMpJiYheS5pc0FycmF5KGMpP0tyKGMpP19lKGEsbnVsbCxbY10pOl9lKGEsYyk6X2UoYSxudWxsLGMpOih3PjM/bT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik6dz09PTMmJktyKG0pJiYobT1bbV0pLF9lKGEsYyxtKSl9ZnVuY3Rpb24gZ2woKXt9ZnVuY3Rpb24gcGwoYSxjLG0sdyl7dmFyIE49bVt3XTtpZihOJiZscyhOLGEpKXJldHVybiBOO3ZhciBPPWMoKTtyZXR1cm4gTy5tZW1vPWEuc2xpY2UoKSxtW3ddPU99ZnVuY3Rpb24gbHMoYSxjKXt2YXIgbT1hLm1lbW87aWYobS5sZW5ndGghPWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgdz0wO3c8bS5sZW5ndGg7dysrKWlmKHkuaGFzQ2hhbmdlZChtW3ddLGNbd10pKXJldHVybiExO3JldHVybiBZbj4wJiZHbiYmR24ucHVzaChhKSwhMH12YXIgZ2k9IjMuNC4yMSIsV289eS5OT09QLFZsPXNuLFVsPVdyLCRsPXJvLEhsPXtjcmVhdGVDb21wb25lbnRJbnN0YW5jZTpzbCxzZXR1cENvbXBvbmVudDpFcyxyZW5kZXJDb21wb25lbnRSb290OkNpLHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTpRcixpc1ZOb2RlOktyLG5vcm1hbGl6ZVZOb2RlOkJufSxDYz1IbCxqbD1udWxsLHpsPW51bGwsVGM9bnVsbCxXbD17aW5zZXJ0OihhLGMsbSk9Pm0/Yy5pbnNlcnRCZWZvcmUoYSxtKTpjLmFwcGVuZENoaWxkKGEpLHJlbW92ZTphPT57dmFyIGM9YS5wYXJlbnROb2RlO2MmJmMucmVtb3ZlQ2hpbGQoYSl9LGNyZWF0ZUVsZW1lbnQ6YT0+by5jcmVhdGVFbGVtZW50KGEpLGNyZWF0ZVRleHQ6YT0+by5jcmVhdGVUZXh0KGEpLGNyZWF0ZUNvbW1lbnQ6YT0+by5jcmVhdGVDb21tZW50KGEpLHNldFRleHQ6KGEsYyk9PnthLnNldEF0dHIoInZhbHVlIixjKX0sc2V0RWxlbWVudFRleHQ6KGEsYyk9PnthLnNldEF0dHIoInZhbHVlIixjKX0scGFyZW50Tm9kZTphPT5hLnBhcmVudE5vZGUsbmV4dFNpYmxpbmc6YT0+YS5uZXh0U2libGluZ307ZnVuY3Rpb24gamEoYSl7cmV0dXJuIE9iamVjdC5rZXlzKGEpfWZ1bmN0aW9uIExzKGEpe3ZhciBjPXt9O3JldHVybiB5LmlzQXJyYXkoYSkmJmEuZm9yRWFjaChtPT57amEobSkuZm9yRWFjaCh3PT57dmFyIE49bVt3XSxPPWNbd118fChjW3ddPXt9KTtqYShOKS5mb3JFYWNoKEw9Pnt2YXIgSj1OW0xdLEg9T1tMXXx8KE9bTF09e30pO2phKEopLmZvckVhY2goZWU9PntlZVswXT09PSIhIj8oSFtlZV09SltlZV0sZGVsZXRlIEhbZWUuc2xpY2UoMSldKTp5Lmhhc093bihILCIhIitlZSl8fChIW2VlXT1KW2VlXSl9KX0pfSl9KSxjfWZ1bmN0aW9uIEZzKGEsYyl7dmFyIG09YyYmYy5jbGFzc0xpc3Q7cmV0dXJuIG0mJm0uaW5jbHVkZXMoYSl9dmFyIERzPS9bK34+IF0kLyxWcz0icGFyZW50Tm9kZSIsVXM9InByZXZpb3VzU2libGluZyI7ZnVuY3Rpb24gR2woYSxjKXtmb3IodmFyIG09YS5zcGxpdCgiLiIpLHc9bS5sZW5ndGgtMTt3PjA7dy0tKXt2YXIgTj1tW3ddLE89TltOLmxlbmd0aC0xXSxMPU4ucmVwbGFjZShEcywiIik7aWYoTz09PSJ+Inx8Tz09PSIgIil7Zm9yKHZhciBKPU89PT0ifiI/VXM6VnM7YyYmKGM9Y1tKXSwhRnMoTCxjKSk7KTtpZighYylyZXR1cm4hMX1lbHNlIGlmKE89PT0iPiI/Yz1jJiZjW1ZzXTpPPT09IisiJiYoYz1jJiZjW1VzXSksIUZzKEwsYykpcmV0dXJuITF9cmV0dXJuITB9dmFyIFlsPTFlMztmdW5jdGlvbiBxbChhLGMsbSl7dmFye3N0eWxlczp3LHdlaWdodHM6Tn09YTtqYShjKS5mb3JFYWNoKE89PntpZighKE8mJm0mJiFHbChPLG0pKSl7dmFyIEw9Ty5zcGxpdCgiLiIpLmxlbmd0aCxKPWNbT107amEoSikuZm9yRWFjaChIPT57dmFyIGVlPUpbSF0sQ2U9SFswXT09PSIhIjtDZSYmKEg9SC5zbGljZSgxKSk7dmFyIEdlPU5bSF18fDAsaGU9TCsoQ2U/WWw6MCk7aGU+PUdlJiYoTltIXT1oZSx3W0hdPWVlKX0pfX0pfWZ1bmN0aW9uIEpsKGEsYyl7dmFyIG09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGwsdz17c3R5bGVzOnt9LHdlaWdodHM6e319O3JldHVybiBhLmZvckVhY2goTj0+e3ZhciBPPWNbTl07TyYmcWwodyxPLG0pfSksdy5zdHlsZXN9ZnVuY3Rpb24gS2woYSl7cmV0dXJuIEpsKGEuY2xhc3NMaXN0LGEuc3R5bGVTaGVldCxhKX1mdW5jdGlvbiB2bChhLGMpe3ZhciBtPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsO3JldHVybiBKbChhLFpsKGMpLG0pfWZ1bmN0aW9uIFpsKGEpe3Zhcnt0eXBlOmMsYXBwQ29udGV4dDptfT1hLHc9YztpZighdy5fX3N0eWxlcylpZihtJiZ5LmlzQXJyYXkobS5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykmJihtLnByb3ZpZGVzLl9fZ2xvYmFsU3R5bGVzPUxzKG0ucHJvdmlkZXMuX19nbG9iYWxTdHlsZXMpKSx3Lm1wVHlwZT09PSJwYWdlIiYmbSl3Ll9fc3R5bGVzPW0ucHJvdmlkZXMuX19nbG9iYWxTdHlsZXM7ZWxzZXt2YXIgTj1bXTttJiZOLnB1c2gobS5wcm92aWRlcy5fX2dsb2JhbFN0eWxlcykseS5pc0FycmF5KHcuc3R5bGVzKSYmdy5zdHlsZXMuZm9yRWFjaChPPT5OLnB1c2goTykpLHcuX19zdHlsZXM9THMoTil9cmV0dXJuIHcuX19zdHlsZXN9ZnVuY3Rpb24gT2MoYSxjLG0pe3ZhciB3PWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3cmJihbYyxtXT1YaShhLGMsbSx3KSksYS5zZXRBdHRyKGMsbSl9dmFyICRzPSJob3ZlckNsYXNzIixtbD0icGxhY2Vob2xkZXJDbGFzcyIsWGw9InBsYWNlaG9sZGVyU3R5bGUiLFBjPSJpbmRpY2F0b3JDbGFzcyIsTmM9ImluZGljYXRvclN0eWxlIixRbD0ibWFza0NsYXNzIixfbD0ibWFza1N0eWxlIixhaT17dmlldzp7Y2xhc3M6WyRzXSxzdHlsZTpbXX0sYnV0dG9uOntjbGFzczpbJHNdLHN0eWxlOltdfSxuYXZpZ2F0b3I6e2NsYXNzOlskc10sc3R5bGU6W119LCJ1LWlucHV0Ijp7Y2xhc3M6W21sXSxzdHlsZTpbWGxdfSwidS10ZXh0YXJlYSI6e2NsYXNzOlttbF0sc3R5bGU6W1hsXX0sInBpY2tlci12aWV3Ijp7Y2xhc3M6W1BjLFFsXSxzdHlsZTpbTmMsX2xdfX07ZnVuY3Rpb24gWGkoYSxjLG0sdyl7aWYoIW0pcmV0dXJuW2MsbV07dmFyIE49YWlbYS50eXBlXTtpZihOKXt2YXIgTz15LmNhbWVsaXplKGMpO2lmKE4uY2xhc3MuaW5kZXhPZihPKT4tMSlyZXR1cm5bTyx2bChbbV0sdyxhKV07aWYoTi5zdHlsZS5pbmRleE9mKGMpPi0xKXJldHVybiB5LmlzU3RyaW5nKG0pP1tPLHkucGFyc2VTdHJpbmdTdHlsZShtKV06W08seS5ub3JtYWxpemVTdHlsZShtKV19cmV0dXJuW2MsbV19ZnVuY3Rpb24gY2EoYSxjLG0pe3ZhciB3PWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO2lmKCEhdyl7dmFyIE49bT9tLnNwbGl0KCIgIik6W107YS5zZXRDbGFzc0xpc3QoTiksYS5zZXRTdHlsZVNoZWV0KFpsKHcpKX19ZnVuY3Rpb24gdm8oYSxjLG0sdyl7YS5hZGRFdmVudChjLG0pfWZ1bmN0aW9uIGJsKGEsYyl7YS5yZW1vdmVFdmVudChjKX1mdW5jdGlvbiBSYShhLGMsbSx3KXt2YXIgTj1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxPPWEuX3ZlaXx8KGEuX3ZlaT17fSksTD1PW2NdO2lmKHcmJkwpTC52YWx1ZT13O2Vsc2V7dmFyW0osSF09dWEoYyk7aWYodyl7dmFyIGVlPU9bY109eWwodyxOKTt2byhhLEosZWUpfWVsc2UgTCYmKGJsKGEsSiksT1tjXT12b2lkIDApfX12YXIgZWM9Lyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIHphKGEpe3JldHVybiBhPT09Im9uLXBvc3QtbWVzc2FnZSI/Im9uUG9zdE1lc3NhZ2UiOmF9ZnVuY3Rpb24gdWEoYSl7dmFyIGM7aWYoZWMudGVzdChhKSl7Yz17fTtmb3IodmFyIG07bT1hLm1hdGNoKGVjKTspYT1hLnNsaWNlKDAsYS5sZW5ndGgtbVswXS5sZW5ndGgpLGNbbVswXS50b0xvd2VyQ2FzZSgpXT0hMH12YXIgdz1hWzJdPT09IjoiP2Euc2xpY2UoMyk6eS5oeXBoZW5hdGUoYS5zbGljZSgyKSk7cmV0dXJuW3phKHcpLGNdfWZ1bmN0aW9uIHlsKGEsYyl7dmFyIG09Tj0+e2JuKG0udmFsdWUsYyw1LFtOXSl9O20udmFsdWU9YTt2YXIgdz1uZXcgU2V0O3JldHVybiB5LmlzQXJyYXkobS52YWx1ZSk/bS52YWx1ZS5mb3JFYWNoKE49PntOLm1vZGlmaWVycyYmTi5tb2RpZmllcnMuZm9yRWFjaChPPT57dy5hZGQoTyl9KX0pOm0udmFsdWUubW9kaWZpZXJzJiZtLnZhbHVlLm1vZGlmaWVycy5mb3JFYWNoKE49Pnt3LmFkZChOKX0pLG0ubW9kaWZpZXJzPVsuLi53XSxtfWZ1bmN0aW9uIEdvKGEsYyxtKXtpZighIW0pe3kuaXNTdHJpbmcobSkmJihtPXkucGFyc2VTdHJpbmdTdHlsZShtKSk7dmFyIHc9e30sTj1jJiYheS5pc1N0cmluZyhjKTtpZihOKXtmb3IodmFyIE8gaW4gYyltW09dPT1udWxsJiYod1t5LmNhbWVsaXplKE8pXT0iIik7Zm9yKHZhciBMIGluIG0pe3ZhciBKPW1bTF07SiE9PWNbTF0mJih3W3kuY2FtZWxpemUoTCldPUopfX1lbHNlIGZvcih2YXIgSCBpbiBtKXdbeS5jYW1lbGl6ZShIKV09bVtIXTthLnNldFN0eWxlcyh3KX19dmFyIEhzPVsidS1pbnB1dCIsInUtdGV4dGFyZWEiXSxJcj0oYSxjLG0sdyxOLE8sTCxKLEgsZWUpPT57Yz09PSJjbGFzcyI/Y2EoYSxtLHcsZWV8fEwpOmM9PT0ic3R5bGUiP0dvKGEsbSx3KTp5LmlzT24oYyk/eS5pc01vZGVsTGlzdGVuZXIoYyl8fFJhKGEsYyxtLHcsTCk6Yz09PSJtb2RlbFZhbHVlIiYmSHMuaW5jbHVkZXMoYS50eXBlKT9hLnNldEF0dHJzKHttb2RlbFZhbHVlOncsdmFsdWU6d30pOk9jKGEsYyx3LEwpfTtmdW5jdGlvbiBXYSgpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiJHN0eWxlIjt7dmFyIGM9cG8oKTtpZighYylyZXR1cm4geS5FTVBUWV9PQko7dmFyIG09Yy50eXBlLl9fY3NzTW9kdWxlcztpZighbSlyZXR1cm4geS5FTVBUWV9PQko7dmFyIHc9bVthXTtyZXR1cm4gd3x8eS5FTVBUWV9PQkp9fWZ1bmN0aW9uIGpzKGEpe3ZhciBjPXBvKCk7aWYoISFjKXt2YXIgbT0oKT0+RWwoYy5zdWJUcmVlLGEoYy5wcm94eSkpO0V0KCgpPT5xcihtLHtmbHVzaDoicG9zdCJ9KSksbmkobSl9fWZ1bmN0aW9uIEVsKGEsYyl7aWYoYS5zaGFwZUZsYWcmMTI4KXt2YXIgbT1hLnN1c3BlbnNlO2E9bS5hY3RpdmVCcmFuY2gsbS5wZW5kaW5nQnJhbmNoJiYhbS5pc0h5ZHJhdGluZyYmbS5lZmZlY3RzLnB1c2goKCk9PntFbChtLmFjdGl2ZUJyYW5jaCxjKX0pfWZvcig7YS5jb21wb25lbnQ7KWE9YS5jb21wb25lbnQuc3ViVHJlZTtpZihhLnNoYXBlRmxhZyYxJiZhLmVsKXt2YXIgdz1hLmVsLnN0eWxlO2Zvcih2YXIgTiBpbiBjKXcuc2V0UHJvcGVydHkoIi0tIi5jb25jYXQoTiksY1tOXSl9ZWxzZSBhLnR5cGU9PT10ciYmYS5jaGlsZHJlbi5mb3JFYWNoKE89PkVsKE8sYykpfXZhciB0Yz1bImN0cmwiLCJzaGlmdCIsImFsdCIsIm1ldGEiXSxBcz17c3RvcDphPT5hLnN0b3BQcm9wYWdhdGlvbigpLHByZXZlbnQ6YT0+YS5wcmV2ZW50RGVmYXVsdCgpLHNlbGY6YT0+YS50YXJnZXQhPT1hLmN1cnJlbnRUYXJnZXQsY3RybDphPT4hYS5jdHJsS2V5LHNoaWZ0OmE9PiFhLnNoaWZ0S2V5LGFsdDphPT4hYS5hbHRLZXksbWV0YTphPT4hYS5tZXRhS2V5LGxlZnQ6YT0+ImJ1dHRvbiJpbiBhJiZhLmJ1dHRvbiE9PTAsbWlkZGxlOmE9PiJidXR0b24iaW4gYSYmYS5idXR0b24hPT0xLHJpZ2h0OmE9PiJidXR0b24iaW4gYSYmYS5idXR0b24hPT0yLGV4YWN0OihhLGMpPT50Yy5zb21lKG09PmFbIiIuY29uY2F0KG0sIktleSIpXSYmIWMuaW5jbHVkZXMobSkpfSxuYz0oYSxjKT0+ZnVuY3Rpb24obSl7Zm9yKHZhciB3PTA7dzxjLmxlbmd0aDt3Kyspe3ZhciBOPUFzW2Nbd11dO2lmKE4mJk4obSxjKSlyZXR1cm59Zm9yKHZhciBPPWFyZ3VtZW50cy5sZW5ndGgsTD1uZXcgQXJyYXkoTz4xP08tMTowKSxKPTE7SjxPO0orKylMW0otMV09YXJndW1lbnRzW0pdO3JldHVybiBhKG0sLi4uTCl9LHJjPShhLGMpPT5tPT57aWYoImtleSJpbiBtKXt2YXIgdz15Lmh5cGhlbmF0ZShtLmtleSk7aWYoYy5zb21lKE49Pk49PT13KSlyZXR1cm4gYShtKX19LGljPXkuZXh0ZW5kKHtwYXRjaFByb3A6SXJ9LFdsKSxTbDtmdW5jdGlvbiBjcygpe3JldHVybiBTbHx8KFNsPUNuKGljKSl9dmFyIG9jPWZ1bmN0aW9uKCl7Y3MoKS5yZW5kZXIoLi4uYXJndW1lbnRzKX0sa2M9ZnVuY3Rpb24oKXt2YXIgYT1jcygpLmNyZWF0ZUFwcCguLi5hcmd1bWVudHMpLHttb3VudDpjfT1hO3JldHVybiBhLm1vdW50PW09PmMobSksYX07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJjYW1lbGl6ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuY2FtZWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsImNhcGl0YWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmNhcGl0YWxpemV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsImh5cGhlbmF0ZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuaHlwaGVuYXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJub3JtYWxpemVDbGFzcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkubm9ybWFsaXplQ2xhc3N9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsIm5vcm1hbGl6ZVByb3BzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5ub3JtYWxpemVQcm9wc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywibm9ybWFsaXplU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5Lm5vcm1hbGl6ZVN0eWxlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJ0b0Rpc3BsYXlTdHJpbmciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnRvRGlzcGxheVN0cmluZ319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywidG9IYW5kbGVyS2V5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS50b0hhbmRsZXJLZXl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsIkVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5FZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywiUmVhY3RpdmVFZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLlJlYWN0aXZlRWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJUcmFja09wVHlwZXMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLlRyYWNrT3BUeXBlc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywiVHJpZ2dlck9wVHlwZXMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLlRyaWdnZXJPcFR5cGVzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJjdXN0b21SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmN1c3RvbVJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywiZWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5lZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsImVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5lZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywiZ2V0Q3VycmVudFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5nZXRDdXJyZW50U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsImlzUHJveHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmlzUHJveHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsImlzUmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmlzUmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsImlzUmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLmlzUmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsImlzUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywiaXNTaGFsbG93Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc1NoYWxsb3d9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsIm1hcmtSYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLm1hcmtSYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsIm9uU2NvcGVEaXNwb3NlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5vblNjb3BlRGlzcG9zZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywicHJveHlSZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5wcm94eVJlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInJlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5yZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywicmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnJlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJyZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywic2hhbGxvd1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5zaGFsbG93UmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInNoYWxsb3dSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkuc2hhbGxvd1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJzaGFsbG93UmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5zaGFsbG93UmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJzdG9wIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5zdG9wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLCJ0b1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEkudG9SYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInRvUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS50b1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZywidG9SZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS50b1JlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInRvVmFsdWUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnRvVmFsdWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInRyaWdnZXJSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBJLnRyaWdnZXJSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInVucmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS51bnJlZn19KSxnLkJhc2VUcmFuc2l0aW9uPXRhLGcuQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnM9X2ksZy5Db21tZW50PVVyLGcuRGVwcmVjYXRpb25UeXBlcz1UYyxnLkVycm9yQ29kZXM9bmUsZy5FcnJvclR5cGVTdHJpbmdzPVZsLGcuRnJhZ21lbnQ9dHIsZy5LZWVwQWxpdmU9bGUsZy5TdGF0aWM9SG8sZy5TdXNwZW5zZT1RbyxnLlRlbGVwb3J0PU1pLGcuVGV4dD1zYSxnLmFzc2VydE51bWJlcj1xLGcuY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmc9Ym4sZy5jYWxsV2l0aEVycm9ySGFuZGxpbmc9bG4sZy5jbG9uZVZOb2RlPW9uLGcuY29tcGF0VXRpbHM9emwsZy5jb21wdXRlZD1kbCxnLmNyZWF0ZUFwcD1rYyxnLmNyZWF0ZUJsb2NrPWRpLGcuY3JlYXRlQ29tbWVudFZOb2RlPWtvLGcuY3JlYXRlRWxlbWVudEJsb2NrPW5zLGcuY3JlYXRlRWxlbWVudFZOb2RlPXlzLGcuY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXI9cW4sZy5jcmVhdGVQcm9wc1Jlc3RQcm94eT1pYSxnLmNyZWF0ZVJlbmRlcmVyPUNuLGcuY3JlYXRlU2xvdHM9Zm4sZy5jcmVhdGVTdGF0aWNWTm9kZT1GaSxnLmNyZWF0ZVRleHRWTm9kZT10bixnLmNyZWF0ZVZOb2RlPV9lLGcuZGVmaW5lQXN5bmNDb21wb25lbnQ9a2ksZy5kZWZpbmVDb21wb25lbnQ9U28sZy5kZWZpbmVFbWl0cz1EcixnLmRlZmluZUV4cG9zZT1YYSxnLmRlZmluZU1vZGVsPVFzLGcuZGVmaW5lT3B0aW9ucz1RYSxnLmRlZmluZVByb3BzPWxyLGcuZGVmaW5lU2xvdHM9cmksZy5kZXZ0b29scz1VbCxnLmdldEN1cnJlbnRJbnN0YW5jZT1wbyxnLmdldFRyYW5zaXRpb25SYXdDaGlsZHJlbj1iaSxnLmd1YXJkUmVhY3RpdmVQcm9wcz1DdCxnLmg9aGwsZy5oYW5kbGVFcnJvcj1abixnLmhhc0luamVjdGlvbkNvbnRleHQ9RSxnLmluaXRDdXN0b21Gb3JtYXR0ZXI9Z2wsZy5pbmplY3Q9RWEsZy5pbmplY3RIb29rPWhyLGcuaXNNZW1vU2FtZT1scyxnLmlzUnVudGltZU9ubHk9Y2wsZy5pc1ZOb2RlPUtyLGcubWVyZ2VEZWZhdWx0cz1ybCxnLm1lcmdlTW9kZWxzPWVyLGcubWVyZ2VQcm9wcz1CcyxnLm5leHRUaWNrPUtlLGcub25BY3RpdmF0ZWQ9emUsZy5vbkJlZm9yZU1vdW50PVJpLGcub25CZWZvcmVVbm1vdW50PXdvLGcub25CZWZvcmVVcGRhdGU9RHQsZy5vbkRlYWN0aXZhdGVkPWF0LGcub25FcnJvckNhcHR1cmVkPUxlLGcub25Nb3VudGVkPUV0LGcub25SZW5kZXJUcmFja2VkPWllLGcub25SZW5kZXJUcmlnZ2VyZWQ9WSxnLm9uU2VydmVyUHJlZmV0Y2g9c2UsZy5vblVubW91bnRlZD1BbyxnLm9uVXBkYXRlZD1uaSxnLm9wZW5CbG9jaz1ncixnLnBhcnNlQ2xhc3NMaXN0PXZsLGcucGFyc2VDbGFzc1N0eWxlcz1LbCxnLnBvcFNjb3BlSWQ9SG4sZy5wcm92aWRlPWVzLGcucHVzaFNjb3BlSWQ9bWksZy5xdWV1ZVBvc3RGbHVzaENiPWduLGcucmVnaXN0ZXJSdW50aW1lQ29tcGlsZXI9TXMsZy5yZW5kZXI9b2MsZy5yZW5kZXJMaXN0PWx0LGcucmVuZGVyU2xvdD1OcixnLnJlc29sdmVDb21wb25lbnQ9VGksZy5yZXNvbHZlRGlyZWN0aXZlPUJyLGcucmVzb2x2ZUR5bmFtaWNDb21wb25lbnQ9Q3IsZy5yZXNvbHZlRmlsdGVyPWpsLGcucmVzb2x2ZVRyYW5zaXRpb25Ib29rcz1FcixnLnNldEJsb2NrVHJhY2tpbmc9JHIsZy5zZXREZXZ0b29sc0hvb2s9JGwsZy5zZXRUcmFuc2l0aW9uSG9va3M9U3IsZy5zc3JDb250ZXh0S2V5PWNuLGcuc3NyVXRpbHM9Q2MsZy50b0hhbmRsZXJzPUppLGcudHJhbnNmb3JtVk5vZGVBcmdzPW9sLGcudXNlQXR0cnM9bmwsZy51c2VDc3NNb2R1bGU9V2EsZy51c2VDc3NTdHlsZXM9THMsZy51c2VDc3NWYXJzPWpzLGcudXNlTW9kZWw9d3MsZy51c2VTU1JDb250ZXh0PXNvLGcudXNlU2xvdHM9dGwsZy51c2VUcmFuc2l0aW9uU3RhdGU9cWksZy52ZXJzaW9uPWdpLGcud2Fybj1XbyxnLndhdGNoPVBpLGcud2F0Y2hFZmZlY3Q9cXIsZy53YXRjaFBvc3RFZmZlY3Q9R2ksZy53YXRjaFN5bmNFZmZlY3Q9TG8sZy53aXRoQXN5bmNDb250ZXh0PURvLGcud2l0aEN0eD1HcixnLndpdGhEZWZhdWx0cz1lbCxnLndpdGhEaXJlY3RpdmVzPWxvLGcud2l0aEtleXM9cmMsZy53aXRoTWVtbz1wbCxnLndpdGhNb2RpZmllcnM9bmMsZy53aXRoU2NvcGVJZD15byxnfSh7fSxfLEMsZCk7cmV0dXJuIGIuX19UWVBFX189Im52dWUiLGJ9dmFyIEF2PUZrKEhrKTt2YXIgWGM9e307UmsoWGMse0VNUFRZX0FSUjooKT0+V2ssRU1QVFlfT0JKOigpPT56ayxOTzooKT0+WWssTk9PUDooKT0+R2ssY2FtZWxpemU6KCk9Pm9JLGNhcGl0YWxpemU6KCk9Pnp1LGRlZjooKT0+dUksZXh0ZW5kOigpPT50byxnZXRHbG9iYWxUaGlzOigpPT5oSSxoYXNDaGFuZ2VkOigpPT5sSSxoYXNPd246KCk9PklsLGh5cGhlbmF0ZTooKT0+anUsaW5jbHVkZUJvb2xlYW5BdHRyOigpPT5PSSxpbnZva2VBcnJheUZuczooKT0+Y0ksaXNBcnJheTooKT0+JGksaXNCb29sZWFuQXR0cjooKT0+VEksaXNCdWlsdEluRGlyZWN0aXZlOigpPT5ySSxpc0Z1bmN0aW9uOigpPT5Xbixpc0dsb2JhbGx5QWxsb3dlZDooKT0+cEksaXNIVE1MVGFnOigpPT53SSxpc0ludGVnZXJLZXk6KCk9PnRJLGlzS25vd25IdG1sQXR0cjooKT0+UEksaXNLbm93blN2Z0F0dHI6KCk9Pk5JLGlzTWFwOigpPT5Ddixpc01vZGVsTGlzdGVuZXI6KCk9PkprLGlzT2JqZWN0OigpPT5FYyxpc09uOigpPT5xayxpc1BsYWluT2JqZWN0OigpPT5TYyxpc1Byb21pc2U6KCk9PlFrLGlzUmVnRXhwOigpPT5Yayxpc1JlbmRlcmFibGVBdHRyVmFsdWU6KCk9PmtJLGlzUmVzZXJ2ZWRQcm9wOigpPT5uSSxpc1NWR1RhZzooKT0+QUksaXNTZXQ6KCk9PlR2LGlzU3RyaW5nOigpPT5saSxpc1N5bWJvbDooKT0+WGYsbG9vc2VUb051bWJlcjooKT0+ZkksbWFrZU1hcDooKT0+TnMsbm9ybWFsaXplQ2xhc3M6KCk9PmVkLG5vcm1hbGl6ZVByb3BzOigpPT55SSxub3JtYWxpemVTdHlsZTooKT0+UWYscGFyc2VTdHJpbmdTdHlsZTooKT0+TnYscmVtb3ZlOigpPT5LayxzdHJpbmdpZnlTdHlsZTooKT0+YkksdG9EaXNwbGF5U3RyaW5nOigpPT5JSSx0b0hhbmRsZXJLZXk6KCk9PnNJLHRvTnVtYmVyOigpPT5kSSx0b1Jhd1R5cGU6KCk9PmVJLHRvVHlwZVN0cmluZzooKT0+Z3N9KTtmdW5jdGlvbiBOcyhmLG8pe2xldCBkPW5ldyBTZXQoZi5zcGxpdCgiLCIpKTtyZXR1cm4gbz9fPT5kLmhhcyhfLnRvTG93ZXJDYXNlKCkpOl89PmQuaGFzKF8pfXZhciB6az17fSxXaz1bXSxHaz0oKT0+e30sWWs9KCk9PiExLHFrPWY9PmYuY2hhckNvZGVBdCgwKT09PTExMSYmZi5jaGFyQ29kZUF0KDEpPT09MTEwJiYoZi5jaGFyQ29kZUF0KDIpPjEyMnx8Zi5jaGFyQ29kZUF0KDIpPDk3KSxKaz1mPT5mLnN0YXJ0c1dpdGgoIm9uVXBkYXRlOiIpLHRvPU9iamVjdC5hc3NpZ24sS2s9KGYsbyk9PntsZXQgZD1mLmluZGV4T2Yobyk7ZD4tMSYmZi5zcGxpY2UoZCwxKX0sWms9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxJbD0oZixvKT0+WmsuY2FsbChmLG8pLCRpPUFycmF5LmlzQXJyYXksQ3Y9Zj0+Z3MoZik9PT0iW29iamVjdCBNYXBdIixUdj1mPT5ncyhmKT09PSJbb2JqZWN0IFNldF0iLFhrPWY9PmdzKGYpPT09IltvYmplY3QgUmVnRXhwXSIsV249Zj0+dHlwZW9mIGY9PSJmdW5jdGlvbiIsbGk9Zj0+dHlwZW9mIGY9PSJzdHJpbmciLFhmPWY9PnR5cGVvZiBmPT0ic3ltYm9sIixFYz1mPT5mIT09bnVsbCYmdHlwZW9mIGY9PSJvYmplY3QiLFFrPWY9PihFYyhmKXx8V24oZikpJiZXbihmLnRoZW4pJiZXbihmLmNhdGNoKSxPdj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGdzPWY9Pk92LmNhbGwoZiksZUk9Zj0+Z3MoZikuc2xpY2UoOCwtMSksU2M9Zj0+Z3MoZik9PT0iW29iamVjdCBPYmplY3RdIix0ST1mPT5saShmKSYmZiE9PSJOYU4iJiZmWzBdIT09Ii0iJiYiIitwYXJzZUludChmLDEwKT09PWYsbkk9TnMoIixrZXkscmVmLHJlZl9mb3IscmVmX2tleSxvblZub2RlQmVmb3JlTW91bnQsb25Wbm9kZU1vdW50ZWQsb25Wbm9kZUJlZm9yZVVwZGF0ZSxvblZub2RlVXBkYXRlZCxvblZub2RlQmVmb3JlVW5tb3VudCxvblZub2RlVW5tb3VudGVkIiksckk9TnMoImJpbmQsY2xvYWssZWxzZS1pZixlbHNlLGZvcixodG1sLGlmLG1vZGVsLG9uLG9uY2UscHJlLHNob3csc2xvdCx0ZXh0LG1lbW8iKSxIdT1mPT57bGV0IG89T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZD0+b1tkXXx8KG9bZF09ZihkKSl9LGlJPS8tKFx3KS9nLG9JPUh1KGY9PmYucmVwbGFjZShpSSwobyxkKT0+ZD9kLnRvVXBwZXJDYXNlKCk6IiIpKSxhST0vXEIoW0EtWl0pL2csanU9SHUoZj0+Zi5yZXBsYWNlKGFJLCItJDEiKS50b0xvd2VyQ2FzZSgpKSx6dT1IdShmPT5mLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Yuc2xpY2UoMSkpLHNJPUh1KGY9PmY/YG9uJHt6dShmKX1gOiIiKSxsST0oZixvKT0+IU9iamVjdC5pcyhmLG8pLGNJPShmLG8pPT57Zm9yKGxldCBkPTA7ZDxmLmxlbmd0aDtkKyspZltkXShvKX0sdUk9KGYsbyxkKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLG8se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOmR9KX0sZkk9Zj0+e2xldCBvPXBhcnNlRmxvYXQoZik7cmV0dXJuIGlzTmFOKG8pP2Y6b30sZEk9Zj0+e2xldCBvPWxpKGYpP051bWJlcihmKTpOYU47cmV0dXJuIGlzTmFOKG8pP2Y6b30sUHYsaEk9KCk9PlB2fHwoUHY9dHlwZW9mIGdsb2JhbFRoaXMhPSJ1bmRlZmluZWQiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiP2dsb2JhbDp7fSksZ0k9IkluZmluaXR5LHVuZGVmaW5lZCxOYU4saXNGaW5pdGUsaXNOYU4scGFyc2VGbG9hdCxwYXJzZUludCxkZWNvZGVVUkksZGVjb2RlVVJJQ29tcG9uZW50LGVuY29kZVVSSSxlbmNvZGVVUklDb21wb25lbnQsTWF0aCxOdW1iZXIsRGF0ZSxBcnJheSxPYmplY3QsQm9vbGVhbixTdHJpbmcsUmVnRXhwLE1hcCxTZXQsSlNPTixJbnRsLEJpZ0ludCxjb25zb2xlLEVycm9yIixwST1OcyhnSSk7ZnVuY3Rpb24gUWYoZil7aWYoJGkoZikpe2xldCBvPXt9O2ZvcihsZXQgZD0wO2Q8Zi5sZW5ndGg7ZCsrKXtsZXQgXz1mW2RdLEM9bGkoXyk/TnYoXyk6UWYoXyk7aWYoQylmb3IobGV0IGIgaW4gQylvW2JdPUNbYl19cmV0dXJuIG99ZWxzZSBpZihsaShmKXx8RWMoZikpcmV0dXJuIGZ9dmFyIHZJPS87KD8hW14oXSpcKSkvZyxtST0vOihbXl0rKS8sX0k9L1wvXCpbXl0qP1wqXC8vZztmdW5jdGlvbiBOdihmKXtsZXQgbz17fTtyZXR1cm4gZi5yZXBsYWNlKF9JLCIiKS5zcGxpdCh2SSkuZm9yRWFjaChkPT57aWYoZCl7bGV0IF89ZC5zcGxpdChtSSk7Xy5sZW5ndGg+MSYmKG9bX1swXS50cmltKCldPV9bMV0udHJpbSgpKX19KSxvfWZ1bmN0aW9uIGJJKGYpe2xldCBvPSIiO2lmKCFmfHxsaShmKSlyZXR1cm4gbztmb3IobGV0IGQgaW4gZil7bGV0IF89ZltkXSxDPWQuc3RhcnRzV2l0aCgiLS0iKT9kOmp1KGQpOyhsaShfKXx8dHlwZW9mIF89PSJudW1iZXIiKSYmKG8rPWAke0N9OiR7X307YCl9cmV0dXJuIG99ZnVuY3Rpb24gZWQoZil7bGV0IG89IiI7aWYobGkoZikpbz1mO2Vsc2UgaWYoJGkoZikpZm9yKGxldCBkPTA7ZDxmLmxlbmd0aDtkKyspe2xldCBfPWVkKGZbZF0pO18mJihvKz1fKyIgIil9ZWxzZSBpZihFYyhmKSlmb3IobGV0IGQgaW4gZilmW2RdJiYobys9ZCsiICIpO3JldHVybiBvLnRyaW0oKX1mdW5jdGlvbiB5SShmKXtpZighZilyZXR1cm4gbnVsbDtsZXR7Y2xhc3M6byxzdHlsZTpkfT1mO3JldHVybiBvJiYhbGkobykmJihmLmNsYXNzPWVkKG8pKSxkJiYoZi5zdHlsZT1RZihkKSksZn12YXIgRUk9Imh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGhncm91cCxoMSxoMixoMyxoNCxoNSxoNixuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxzdW1tYXJ5LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IixTST0ic3ZnLGFuaW1hdGUsYW5pbWF0ZU1vdGlvbixhbmltYXRlVHJhbnNmb3JtLGNpcmNsZSxjbGlwUGF0aCxjb2xvci1wcm9maWxlLGRlZnMsZGVzYyxkaXNjYXJkLGVsbGlwc2UsZmVCbGVuZCxmZUNvbG9yTWF0cml4LGZlQ29tcG9uZW50VHJhbnNmZXIsZmVDb21wb3NpdGUsZmVDb252b2x2ZU1hdHJpeCxmZURpZmZ1c2VMaWdodGluZyxmZURpc3BsYWNlbWVudE1hcCxmZURpc3RhbnRMaWdodCxmZURyb3BTaGFkb3csZmVGbG9vZCxmZUZ1bmNBLGZlRnVuY0IsZmVGdW5jRyxmZUZ1bmNSLGZlR2F1c3NpYW5CbHVyLGZlSW1hZ2UsZmVNZXJnZSxmZU1lcmdlTm9kZSxmZU1vcnBob2xvZ3ksZmVPZmZzZXQsZmVQb2ludExpZ2h0LGZlU3BlY3VsYXJMaWdodGluZyxmZVNwb3RMaWdodCxmZVRpbGUsZmVUdXJidWxlbmNlLGZpbHRlcixmb3JlaWduT2JqZWN0LGcsaGF0Y2gsaGF0Y2hwYXRoLGltYWdlLGxpbmUsbGluZWFyR3JhZGllbnQsbWFya2VyLG1hc2ssbWVzaCxtZXNoZ3JhZGllbnQsbWVzaHBhdGNoLG1lc2hyb3csbWV0YWRhdGEsbXBhdGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmFkaWFsR3JhZGllbnQscmVjdCxzZXQsc29saWRjb2xvcixzdG9wLHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0UGF0aCx0aXRsZSx0c3Bhbix1bmtub3duLHVzZSx2aWV3Iix3ST1OcyhFSSksQUk9TnMoU0kpLENJPSJpdGVtc2NvcGUsYWxsb3dmdWxsc2NyZWVuLGZvcm1ub3ZhbGlkYXRlLGlzbWFwLG5vbW9kdWxlLG5vdmFsaWRhdGUscmVhZG9ubHkiLFRJPU5zKENJKyIsYXN5bmMsYXV0b2ZvY3VzLGF1dG9wbGF5LGNvbnRyb2xzLGRlZmF1bHQsZGVmZXIsZGlzYWJsZWQsaGlkZGVuLGluZXJ0LGxvb3Asb3BlbixyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3MsY2hlY2tlZCxtdXRlZCxtdWx0aXBsZSxzZWxlY3RlZCIpO2Z1bmN0aW9uIE9JKGYpe3JldHVybiEhZnx8Zj09PSIifXZhciBQST1OcygiYWNjZXB0LGFjY2VwdC1jaGFyc2V0LGFjY2Vzc2tleSxhY3Rpb24sYWxpZ24sYWxsb3csYWx0LGFzeW5jLGF1dG9jYXBpdGFsaXplLGF1dG9jb21wbGV0ZSxhdXRvZm9jdXMsYXV0b3BsYXksYmFja2dyb3VuZCxiZ2NvbG9yLGJvcmRlcixidWZmZXJlZCxjYXB0dXJlLGNoYWxsZW5nZSxjaGFyc2V0LGNoZWNrZWQsY2l0ZSxjbGFzcyxjb2RlLGNvZGViYXNlLGNvbG9yLGNvbHMsY29sc3Bhbixjb250ZW50LGNvbnRlbnRlZGl0YWJsZSxjb250ZXh0bWVudSxjb250cm9scyxjb29yZHMsY3Jvc3NvcmlnaW4sY3NwLGRhdGEsZGF0ZXRpbWUsZGVjb2RpbmcsZGVmYXVsdCxkZWZlcixkaXIsZGlybmFtZSxkaXNhYmxlZCxkb3dubG9hZCxkcmFnZ2FibGUsZHJvcHpvbmUsZW5jdHlwZSxlbnRlcmtleWhpbnQsZm9yLGZvcm0sZm9ybWFjdGlvbixmb3JtZW5jdHlwZSxmb3JtbWV0aG9kLGZvcm1ub3ZhbGlkYXRlLGZvcm10YXJnZXQsaGVhZGVycyxoZWlnaHQsaGlkZGVuLGhpZ2gsaHJlZixocmVmbGFuZyxodHRwLWVxdWl2LGljb24saWQsaW1wb3J0YW5jZSxpbmVydCxpbnRlZ3JpdHksaXNtYXAsaXRlbXByb3Asa2V5dHlwZSxraW5kLGxhYmVsLGxhbmcsbGFuZ3VhZ2UsbG9hZGluZyxsaXN0LGxvb3AsbG93LG1hbmlmZXN0LG1heCxtYXhsZW5ndGgsbWlubGVuZ3RoLG1lZGlhLG1pbixtdWx0aXBsZSxtdXRlZCxuYW1lLG5vdmFsaWRhdGUsb3BlbixvcHRpbXVtLHBhdHRlcm4scGluZyxwbGFjZWhvbGRlcixwb3N0ZXIscHJlbG9hZCxyYWRpb2dyb3VwLHJlYWRvbmx5LHJlZmVycmVycG9saWN5LHJlbCxyZXF1aXJlZCxyZXZlcnNlZCxyb3dzLHJvd3NwYW4sc2FuZGJveCxzY29wZSxzY29wZWQsc2VsZWN0ZWQsc2hhcGUsc2l6ZSxzaXplcyxzbG90LHNwYW4sc3BlbGxjaGVjayxzcmMsc3JjZG9jLHNyY2xhbmcsc3Jjc2V0LHN0YXJ0LHN0ZXAsc3R5bGUsc3VtbWFyeSx0YWJpbmRleCx0YXJnZXQsdGl0bGUsdHJhbnNsYXRlLHR5cGUsdXNlbWFwLHZhbHVlLHdpZHRoLHdyYXAiKSxOST1OcygieG1sbnMsYWNjZW50LWhlaWdodCxhY2N1bXVsYXRlLGFkZGl0aXZlLGFsaWdubWVudC1iYXNlbGluZSxhbHBoYWJldGljLGFtcGxpdHVkZSxhcmFiaWMtZm9ybSxhc2NlbnQsYXR0cmlidXRlTmFtZSxhdHRyaWJ1dGVUeXBlLGF6aW11dGgsYmFzZUZyZXF1ZW5jeSxiYXNlbGluZS1zaGlmdCxiYXNlUHJvZmlsZSxiYm94LGJlZ2luLGJpYXMsYnksY2FsY01vZGUsY2FwLWhlaWdodCxjbGFzcyxjbGlwLGNsaXBQYXRoVW5pdHMsY2xpcC1wYXRoLGNsaXAtcnVsZSxjb2xvcixjb2xvci1pbnRlcnBvbGF0aW9uLGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyxjb2xvci1wcm9maWxlLGNvbG9yLXJlbmRlcmluZyxjb250ZW50U2NyaXB0VHlwZSxjb250ZW50U3R5bGVUeXBlLGNyb3Nzb3JpZ2luLGN1cnNvcixjeCxjeSxkLGRlY2VsZXJhdGUsZGVzY2VudCxkaWZmdXNlQ29uc3RhbnQsZGlyZWN0aW9uLGRpc3BsYXksZGl2aXNvcixkb21pbmFudC1iYXNlbGluZSxkdXIsZHgsZHksZWRnZU1vZGUsZWxldmF0aW9uLGVuYWJsZS1iYWNrZ3JvdW5kLGVuZCxleHBvbmVudCxmaWxsLGZpbGwtb3BhY2l0eSxmaWxsLXJ1bGUsZmlsdGVyLGZpbHRlclJlcyxmaWx0ZXJVbml0cyxmbG9vZC1jb2xvcixmbG9vZC1vcGFjaXR5LGZvbnQtZmFtaWx5LGZvbnQtc2l6ZSxmb250LXNpemUtYWRqdXN0LGZvbnQtc3RyZXRjaCxmb250LXN0eWxlLGZvbnQtdmFyaWFudCxmb250LXdlaWdodCxmb3JtYXQsZnJvbSxmcixmeCxmeSxnMSxnMixnbHlwaC1uYW1lLGdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwsZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwsZ2x5cGhSZWYsZ3JhZGllbnRUcmFuc2Zvcm0sZ3JhZGllbnRVbml0cyxoYW5naW5nLGhlaWdodCxocmVmLGhyZWZsYW5nLGhvcml6LWFkdi14LGhvcml6LW9yaWdpbi14LGlkLGlkZW9ncmFwaGljLGltYWdlLXJlbmRlcmluZyxpbixpbjIsaW50ZXJjZXB0LGssazEsazIsazMsazQsa2VybmVsTWF0cml4LGtlcm5lbFVuaXRMZW5ndGgsa2VybmluZyxrZXlQb2ludHMsa2V5U3BsaW5lcyxrZXlUaW1lcyxsYW5nLGxlbmd0aEFkanVzdCxsZXR0ZXItc3BhY2luZyxsaWdodGluZy1jb2xvcixsaW1pdGluZ0NvbmVBbmdsZSxsb2NhbCxtYXJrZXItZW5kLG1hcmtlci1taWQsbWFya2VyLXN0YXJ0LG1hcmtlckhlaWdodCxtYXJrZXJVbml0cyxtYXJrZXJXaWR0aCxtYXNrLG1hc2tDb250ZW50VW5pdHMsbWFza1VuaXRzLG1hdGhlbWF0aWNhbCxtYXgsbWVkaWEsbWV0aG9kLG1pbixtb2RlLG5hbWUsbnVtT2N0YXZlcyxvZmZzZXQsb3BhY2l0eSxvcGVyYXRvcixvcmRlcixvcmllbnQsb3JpZW50YXRpb24sb3JpZ2luLG92ZXJmbG93LG92ZXJsaW5lLXBvc2l0aW9uLG92ZXJsaW5lLXRoaWNrbmVzcyxwYW5vc2UtMSxwYWludC1vcmRlcixwYXRoLHBhdGhMZW5ndGgscGF0dGVybkNvbnRlbnRVbml0cyxwYXR0ZXJuVHJhbnNmb3JtLHBhdHRlcm5Vbml0cyxwaW5nLHBvaW50ZXItZXZlbnRzLHBvaW50cyxwb2ludHNBdFgscG9pbnRzQXRZLHBvaW50c0F0WixwcmVzZXJ2ZUFscGhhLHByZXNlcnZlQXNwZWN0UmF0aW8scHJpbWl0aXZlVW5pdHMscixyYWRpdXMscmVmZXJyZXJQb2xpY3kscmVmWCxyZWZZLHJlbCxyZW5kZXJpbmctaW50ZW50LHJlcGVhdENvdW50LHJlcGVhdER1cixyZXF1aXJlZEV4dGVuc2lvbnMscmVxdWlyZWRGZWF0dXJlcyxyZXN0YXJ0LHJlc3VsdCxyb3RhdGUscngscnksc2NhbGUsc2VlZCxzaGFwZS1yZW5kZXJpbmcsc2xvcGUsc3BhY2luZyxzcGVjdWxhckNvbnN0YW50LHNwZWN1bGFyRXhwb25lbnQsc3BlZWQsc3ByZWFkTWV0aG9kLHN0YXJ0T2Zmc2V0LHN0ZERldmlhdGlvbixzdGVtaCxzdGVtdixzdGl0Y2hUaWxlcyxzdG9wLWNvbG9yLHN0b3Atb3BhY2l0eSxzdHJpa2V0aHJvdWdoLXBvc2l0aW9uLHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzLHN0cmluZyxzdHJva2Usc3Ryb2tlLWRhc2hhcnJheSxzdHJva2UtZGFzaG9mZnNldCxzdHJva2UtbGluZWNhcCxzdHJva2UtbGluZWpvaW4sc3Ryb2tlLW1pdGVybGltaXQsc3Ryb2tlLW9wYWNpdHksc3Ryb2tlLXdpZHRoLHN0eWxlLHN1cmZhY2VTY2FsZSxzeXN0ZW1MYW5ndWFnZSx0YWJpbmRleCx0YWJsZVZhbHVlcyx0YXJnZXQsdGFyZ2V0WCx0YXJnZXRZLHRleHQtYW5jaG9yLHRleHQtZGVjb3JhdGlvbix0ZXh0LXJlbmRlcmluZyx0ZXh0TGVuZ3RoLHRvLHRyYW5zZm9ybSx0cmFuc2Zvcm0tb3JpZ2luLHR5cGUsdTEsdTIsdW5kZXJsaW5lLXBvc2l0aW9uLHVuZGVybGluZS10aGlja25lc3MsdW5pY29kZSx1bmljb2RlLWJpZGksdW5pY29kZS1yYW5nZSx1bml0cy1wZXItZW0sdi1hbHBoYWJldGljLHYtaGFuZ2luZyx2LWlkZW9ncmFwaGljLHYtbWF0aGVtYXRpY2FsLHZhbHVlcyx2ZWN0b3ItZWZmZWN0LHZlcnNpb24sdmVydC1hZHYteSx2ZXJ0LW9yaWdpbi14LHZlcnQtb3JpZ2luLXksdmlld0JveCx2aWV3VGFyZ2V0LHZpc2liaWxpdHksd2lkdGgsd2lkdGhzLHdvcmQtc3BhY2luZyx3cml0aW5nLW1vZGUseCx4LWhlaWdodCx4MSx4Mix4Q2hhbm5lbFNlbGVjdG9yLHhsaW5rOmFjdHVhdGUseGxpbms6YXJjcm9sZSx4bGluazpocmVmLHhsaW5rOnJvbGUseGxpbms6c2hvdyx4bGluazp0aXRsZSx4bGluazp0eXBlLHhtbG5zOnhsaW5rLHhtbDpiYXNlLHhtbDpsYW5nLHhtbDpzcGFjZSx5LHkxLHkyLHlDaGFubmVsU2VsZWN0b3Iseix6b29tQW5kUGFuIik7ZnVuY3Rpb24ga0koZil7aWYoZj09bnVsbClyZXR1cm4hMTtsZXQgbz10eXBlb2YgZjtyZXR1cm4gbz09PSJzdHJpbmcifHxvPT09Im51bWJlciJ8fG89PT0iYm9vbGVhbiJ9dmFyIElJPWY9PmxpKGYpP2Y6Zj09bnVsbD8iIjokaShmKXx8RWMoZikmJihmLnRvU3RyaW5nPT09T3Z8fCFXbihmLnRvU3RyaW5nKSk/SlNPTi5zdHJpbmdpZnkoZixrdiwyKTpTdHJpbmcoZiksa3Y9KGYsbyk9Pm8mJm8uX192X2lzUmVmP2t2KGYsby52YWx1ZSk6Q3Yobyk/e1tgTWFwKCR7by5zaXplfSlgXTpbLi4uby5lbnRyaWVzKCldLnJlZHVjZSgoZCxbXyxDXSxiKT0+KGRbdGQoXyxiKSsiID0+Il09QyxkKSx7fSl9OlR2KG8pP3tbYFNldCgke28uc2l6ZX0pYF06Wy4uLm8udmFsdWVzKCldLm1hcChkPT50ZChkKSl9OlhmKG8pP3RkKG8pOkVjKG8pJiYhJGkobykmJiFTYyhvKT9TdHJpbmcobyk6byx0ZD0oZixvPSIiKT0+e3ZhciBkO3JldHVybiBYZihmKT9gU3ltYm9sKCR7KGQ9Zi5kZXNjcmlwdGlvbikhPW51bGw/ZDpvfSlgOmZ9O2Z1bmN0aW9uIEl2KGYpe3ZhciBvPWZ1bmN0aW9uKGQsXyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEMoTSwuLi5XKXtjb25zb2xlLndhcm4oYFtWdWUgd2Fybl0gJHtNfWAsLi4uVyl9bGV0IGI7Y2xhc3MgZ3tjb25zdHJ1Y3RvcihXPSExKXt0aGlzLmRldGFjaGVkPVcsdGhpcy5fYWN0aXZlPSEwLHRoaXMuZWZmZWN0cz1bXSx0aGlzLmNsZWFudXBzPVtdLHRoaXMucGFyZW50PWIsIVcmJmImJih0aGlzLmluZGV4PShiLnNjb3Blc3x8KGIuc2NvcGVzPVtdKSkucHVzaCh0aGlzKS0xKX1nZXQgYWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX1ydW4oVyl7aWYodGhpcy5fYWN0aXZlKXtsZXQgbGU9Yjt0cnl7cmV0dXJuIGI9dGhpcyxXKCl9ZmluYWxseXtiPWxlfX19b24oKXtiPXRoaXN9b2ZmKCl7Yj10aGlzLnBhcmVudH1zdG9wKFcpe2lmKHRoaXMuX2FjdGl2ZSl7bGV0IGxlLCRlO2ZvcihsZT0wLCRlPXRoaXMuZWZmZWN0cy5sZW5ndGg7bGU8JGU7bGUrKyl0aGlzLmVmZmVjdHNbbGVdLnN0b3AoKTtmb3IobGU9MCwkZT10aGlzLmNsZWFudXBzLmxlbmd0aDtsZTwkZTtsZSsrKXRoaXMuY2xlYW51cHNbbGVdKCk7aWYodGhpcy5zY29wZXMpZm9yKGxlPTAsJGU9dGhpcy5zY29wZXMubGVuZ3RoO2xlPCRlO2xlKyspdGhpcy5zY29wZXNbbGVdLnN0b3AoITApO2lmKCF0aGlzLmRldGFjaGVkJiZ0aGlzLnBhcmVudCYmIVcpe2xldCB6ZT10aGlzLnBhcmVudC5zY29wZXMucG9wKCk7emUmJnplIT09dGhpcyYmKHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XT16ZSx6ZS5pbmRleD10aGlzLmluZGV4KX10aGlzLnBhcmVudD12b2lkIDAsdGhpcy5fYWN0aXZlPSExfX19ZnVuY3Rpb24geShNKXtyZXR1cm4gbmV3IGcoTSl9ZnVuY3Rpb24gSShNLFc9Yil7VyYmVy5hY3RpdmUmJlcuZWZmZWN0cy5wdXNoKE0pfWZ1bmN0aW9uIEJlKCl7cmV0dXJuIGJ9ZnVuY3Rpb24gU3QoTSl7YiYmYi5jbGVhbnVwcy5wdXNoKE0pfWxldCBHdDtjbGFzcyBZdHtjb25zdHJ1Y3RvcihXLGxlLCRlLHplKXt0aGlzLmZuPVcsdGhpcy50cmlnZ2VyPWxlLHRoaXMuc2NoZWR1bGVyPSRlLHRoaXMuYWN0aXZlPSEwLHRoaXMuZGVwcz1bXSx0aGlzLl9kaXJ0eUxldmVsPTQsdGhpcy5fdHJhY2tJZD0wLHRoaXMuX3J1bm5pbmdzPTAsdGhpcy5fc2hvdWxkU2NoZWR1bGU9ITEsdGhpcy5fZGVwc0xlbmd0aD0wLEkodGhpcyx6ZSl9Z2V0IGRpcnR5KCl7aWYodGhpcy5fZGlydHlMZXZlbD09PTJ8fHRoaXMuX2RpcnR5TGV2ZWw9PT0zKXt0aGlzLl9kaXJ0eUxldmVsPTEsWm4oKTtmb3IobGV0IFc9MDtXPHRoaXMuX2RlcHNMZW5ndGg7VysrKXtsZXQgbGU9dGhpcy5kZXBzW1ddO2lmKGxlLmNvbXB1dGVkJiYoUihsZS5jb21wdXRlZCksdGhpcy5fZGlydHlMZXZlbD49NCkpYnJlYWt9dGhpcy5fZGlydHlMZXZlbD09PTEmJih0aGlzLl9kaXJ0eUxldmVsPTApLHpyKCl9cmV0dXJuIHRoaXMuX2RpcnR5TGV2ZWw+PTR9c2V0IGRpcnR5KFcpe3RoaXMuX2RpcnR5TGV2ZWw9Vz80OjB9cnVuKCl7aWYodGhpcy5fZGlydHlMZXZlbD0wLCF0aGlzLmFjdGl2ZSlyZXR1cm4gdGhpcy5mbigpO2xldCBXPXNuLGxlPUd0O3RyeXtyZXR1cm4gc249ITAsR3Q9dGhpcyx0aGlzLl9ydW5uaW5ncysrLE90KHRoaXMpLHRoaXMuZm4oKX1maW5hbGx5e1VuKHRoaXMpLHRoaXMuX3J1bm5pbmdzLS0sR3Q9bGUsc249V319c3RvcCgpe3ZhciBXO3RoaXMuYWN0aXZlJiYoT3QodGhpcyksVW4odGhpcyksKFc9dGhpcy5vblN0b3ApPT1udWxsfHxXLmNhbGwodGhpcyksdGhpcy5hY3RpdmU9ITEpfX1mdW5jdGlvbiBSKE0pe3JldHVybiBNLnZhbHVlfWZ1bmN0aW9uIE90KE0pe00uX3RyYWNrSWQrKyxNLl9kZXBzTGVuZ3RoPTB9ZnVuY3Rpb24gVW4oTSl7aWYoTS5kZXBzLmxlbmd0aD5NLl9kZXBzTGVuZ3RoKXtmb3IobGV0IFc9TS5fZGVwc0xlbmd0aDtXPE0uZGVwcy5sZW5ndGg7VysrKWZ0KE0uZGVwc1tXXSxNKTtNLmRlcHMubGVuZ3RoPU0uX2RlcHNMZW5ndGh9fWZ1bmN0aW9uIGZ0KE0sVyl7bGV0IGxlPU0uZ2V0KFcpO2xlIT09dm9pZCAwJiZXLl90cmFja0lkIT09bGUmJihNLmRlbGV0ZShXKSxNLnNpemU9PT0wJiZNLmNsZWFudXAoKSl9ZnVuY3Rpb24gcShNLFcpe00uZWZmZWN0IGluc3RhbmNlb2YgWXQmJihNPU0uZWZmZWN0LmZuKTtsZXQgbGU9bmV3IFl0KE0sXy5OT09QLCgpPT57bGUuZGlydHkmJmxlLnJ1bigpfSk7VyYmKF8uZXh0ZW5kKGxlLFcpLFcuc2NvcGUmJkkobGUsVy5zY29wZSkpLCghV3x8IVcubGF6eSkmJmxlLnJ1bigpO2xldCAkZT1sZS5ydW4uYmluZChsZSk7cmV0dXJuICRlLmVmZmVjdD1sZSwkZX1mdW5jdGlvbiBuZShNKXtNLmVmZmVjdC5zdG9wKCl9bGV0IHNuPSEwLGxuPTAsYm49W107ZnVuY3Rpb24gWm4oKXtibi5wdXNoKHNuKSxzbj0hMX1mdW5jdGlvbiB3aSgpe2JuLnB1c2goc24pLHNuPSEwfWZ1bmN0aW9uIHpyKCl7bGV0IE09Ym4ucG9wKCk7c249TT09PXZvaWQgMD8hMDpNfWZ1bmN0aW9uIEVuKCl7bG4rK31mdW5jdGlvbiBxdCgpe2Zvcihsbi0tOyFsbiYmTW4ubGVuZ3RoOylNbi5zaGlmdCgpKCl9ZnVuY3Rpb24gbW4oTSxXLGxlKXt2YXIgJGU7aWYoVy5nZXQoTSkhPT1NLl90cmFja0lkKXtXLnNldChNLE0uX3RyYWNrSWQpO2xldCB6ZT1NLmRlcHNbTS5fZGVwc0xlbmd0aF07emUhPT1XPyh6ZSYmZnQoemUsTSksTS5kZXBzW00uX2RlcHNMZW5ndGgrK109Vyk6TS5fZGVwc0xlbmd0aCsrfX1sZXQgTW49W107ZnVuY3Rpb24gUm4oTSxXLGxlKXt2YXIgJGU7RW4oKTtmb3IobGV0IHplIG9mIE0ua2V5cygpKXtsZXQgYXQ7emUuX2RpcnR5TGV2ZWw8VyYmKGF0IT1udWxsP2F0OmF0PU0uZ2V0KHplKT09PXplLl90cmFja0lkKSYmKHplLl9zaG91bGRTY2hlZHVsZXx8KHplLl9zaG91bGRTY2hlZHVsZT16ZS5fZGlydHlMZXZlbD09PTApLHplLl9kaXJ0eUxldmVsPVcpLHplLl9zaG91bGRTY2hlZHVsZSYmKGF0IT1udWxsP2F0OmF0PU0uZ2V0KHplKT09PXplLl90cmFja0lkKSYmKHplLnRyaWdnZXIoKSwoIXplLl9ydW5uaW5nc3x8emUuYWxsb3dSZWN1cnNlKSYmemUuX2RpcnR5TGV2ZWwhPT0yJiYoemUuX3Nob3VsZFNjaGVkdWxlPSExLHplLnNjaGVkdWxlciYmTW4ucHVzaCh6ZS5zY2hlZHVsZXIpKSl9cXQoKX1sZXQgcHI9KE0sVyk9PntsZXQgbGU9bmV3IE1hcDtyZXR1cm4gbGUuY2xlYW51cD1NLGxlLmNvbXB1dGVkPVcsbGV9LEFpPW5ldyBXZWFrTWFwLFhuPVN5bWJvbCgiIiksS2U9U3ltYm9sKCIiKTtmdW5jdGlvbiBYZShNLFcsbGUpe2lmKHNuJiZHdCl7bGV0ICRlPUFpLmdldChNKTskZXx8QWkuc2V0KE0sJGU9bmV3IE1hcCk7bGV0IHplPSRlLmdldChsZSk7emV8fCRlLnNldChsZSx6ZT1wcigoKT0+JGUuZGVsZXRlKGxlKSkpLG1uKEd0LHplLHZvaWQgMCl9fWZ1bmN0aW9uIGh0KE0sVyxsZSwkZSx6ZSxhdCl7bGV0IFF0PUFpLmdldChNKTtpZighUXQpcmV0dXJuO2xldCBKdD1bXTtpZihXPT09ImNsZWFyIilKdD1bLi4uUXQudmFsdWVzKCldO2Vsc2UgaWYobGU9PT0ibGVuZ3RoIiYmXy5pc0FycmF5KE0pKXtsZXQgT3I9TnVtYmVyKCRlKTtRdC5mb3JFYWNoKChJaSxocik9PnsoaHI9PT0ibGVuZ3RoInx8IV8uaXNTeW1ib2woaHIpJiZocj49T3IpJiZKdC5wdXNoKElpKX0pfWVsc2Ugc3dpdGNoKGxlIT09dm9pZCAwJiZKdC5wdXNoKFF0LmdldChsZSkpLFcpe2Nhc2UiYWRkIjpfLmlzQXJyYXkoTSk/Xy5pc0ludGVnZXJLZXkobGUpJiZKdC5wdXNoKFF0LmdldCgibGVuZ3RoIikpOihKdC5wdXNoKFF0LmdldChYbikpLF8uaXNNYXAoTSkmJkp0LnB1c2goUXQuZ2V0KEtlKSkpO2JyZWFrO2Nhc2UiZGVsZXRlIjpfLmlzQXJyYXkoTSl8fChKdC5wdXNoKFF0LmdldChYbikpLF8uaXNNYXAoTSkmJkp0LnB1c2goUXQuZ2V0KEtlKSkpO2JyZWFrO2Nhc2Uic2V0IjpfLmlzTWFwKE0pJiZKdC5wdXNoKFF0LmdldChYbikpO2JyZWFrfUVuKCk7Zm9yKGxldCBPciBvZiBKdClPciYmUm4oT3IsNCx2b2lkIDApO3F0KCl9ZnVuY3Rpb24gaG4oTSxXKXt2YXIgbGU7cmV0dXJuKGxlPUFpLmdldChNKSk9PW51bGw/dm9pZCAwOmxlLmdldChXKX1sZXQgTG49Xy5tYWtlTWFwKCJfX3Byb3RvX18sX192X2lzUmVmLF9faXNWdWUiKSxnbj1uZXcgU2V0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN5bWJvbCkuZmlsdGVyKE09Pk0hPT0iYXJndW1lbnRzIiYmTSE9PSJjYWxsZXIiKS5tYXAoTT0+U3ltYm9sW01dKS5maWx0ZXIoXy5pc1N5bWJvbCkpLEFuPSRuKCk7ZnVuY3Rpb24gJG4oKXtsZXQgTT17fTtyZXR1cm5bImluY2x1ZGVzIiwiaW5kZXhPZiIsImxhc3RJbmRleE9mIl0uZm9yRWFjaChXPT57TVtXXT1mdW5jdGlvbiguLi5sZSl7bGV0ICRlPWNuKHRoaXMpO2ZvcihsZXQgYXQ9MCxRdD10aGlzLmxlbmd0aDthdDxRdDthdCsrKVhlKCRlLCJnZXQiLGF0KyIiKTtsZXQgemU9JGVbV10oLi4ubGUpO3JldHVybiB6ZT09PS0xfHx6ZT09PSExPyRlW1ddKC4uLmxlLm1hcChjbikpOnplfX0pLFsicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSJdLmZvckVhY2goVz0+e01bV109ZnVuY3Rpb24oLi4ubGUpe1puKCksRW4oKTtsZXQgJGU9Y24odGhpcylbV10uYXBwbHkodGhpcyxsZSk7cmV0dXJuIHF0KCksenIoKSwkZX19KSxNfWZ1bmN0aW9uIHZyKE0pe2xldCBXPWNuKHRoaXMpO3JldHVybiBYZShXLCJoYXMiLE0pLFcuaGFzT3duUHJvcGVydHkoTSl9Y2xhc3MgYXJ7Y29uc3RydWN0b3IoVz0hMSxsZT0hMSl7dGhpcy5faXNSZWFkb25seT1XLHRoaXMuX2lzU2hhbGxvdz1sZX1nZXQoVyxsZSwkZSl7bGV0IHplPXRoaXMuX2lzUmVhZG9ubHksYXQ9dGhpcy5faXNTaGFsbG93O2lmKGxlPT09Il9fdl9pc1JlYWN0aXZlIilyZXR1cm4hemU7aWYobGU9PT0iX192X2lzUmVhZG9ubHkiKXJldHVybiB6ZTtpZihsZT09PSJfX3ZfaXNTaGFsbG93IilyZXR1cm4gYXQ7aWYobGU9PT0iX192X3JhdyIpcmV0dXJuICRlPT09KHplP2F0P3ppOmppOmF0P2VpOm9vKS5nZXQoVyl8fE9iamVjdC5nZXRQcm90b3R5cGVPZihXKT09PU9iamVjdC5nZXRQcm90b3R5cGVPZigkZSk/Vzp2b2lkIDA7bGV0IFF0PV8uaXNBcnJheShXKTtpZighemUpe2lmKFF0JiZfLmhhc093bihBbixsZSkpcmV0dXJuIFJlZmxlY3QuZ2V0KEFuLGxlLCRlKTtpZihsZT09PSJoYXNPd25Qcm9wZXJ0eSIpcmV0dXJuIHZyfWxldCBKdD1SZWZsZWN0LmdldChXLGxlLCRlKTtyZXR1cm4oXy5pc1N5bWJvbChsZSk/Z24uaGFzKGxlKTpMbihsZSkpfHwoemV8fFhlKFcsImdldCIsbGUpLGF0KT9KdDpicihKdCk/UXQmJl8uaXNJbnRlZ2VyS2V5KGxlKT9KdDpKdC52YWx1ZTpfLmlzT2JqZWN0KEp0KT96ZT9XaShKdCk6YW8oSnQpOkp0fX1jbGFzcyB2aSBleHRlbmRzIGFye2NvbnN0cnVjdG9yKFc9ITEpe3N1cGVyKCExLFcpfXNldChXLGxlLCRlLHplKXtsZXQgYXQ9V1tsZV07aWYoIXRoaXMuX2lzU2hhbGxvdyl7bGV0IE9yPUJ0KGF0KTtpZighVGUoJGUpJiYhQnQoJGUpJiYoYXQ9Y24oYXQpLCRlPWNuKCRlKSksIV8uaXNBcnJheShXKSYmYnIoYXQpJiYhYnIoJGUpKXJldHVybiBPcj8hMTooYXQudmFsdWU9JGUsITApfWxldCBRdD1fLmlzQXJyYXkoVykmJl8uaXNJbnRlZ2VyS2V5KGxlKT9OdW1iZXIobGUpPFcubGVuZ3RoOl8uaGFzT3duKFcsbGUpLEp0PVJlZmxlY3Quc2V0KFcsbGUsJGUsemUpO3JldHVybiBXPT09Y24oemUpJiYoUXQ/Xy5oYXNDaGFuZ2VkKCRlLGF0KSYmaHQoVywic2V0IixsZSwkZSxhdCk6aHQoVywiYWRkIixsZSwkZSkpLEp0fWRlbGV0ZVByb3BlcnR5KFcsbGUpe2xldCAkZT1fLmhhc093bihXLGxlKSx6ZT1XW2xlXSxhdD1SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KFcsbGUpO3JldHVybiBhdCYmJGUmJmh0KFcsImRlbGV0ZSIsbGUsdm9pZCAwLHplKSxhdH1oYXMoVyxsZSl7bGV0ICRlPVJlZmxlY3QuaGFzKFcsbGUpO3JldHVybighXy5pc1N5bWJvbChsZSl8fCFnbi5oYXMobGUpKSYmWGUoVywiaGFzIixsZSksJGV9b3duS2V5cyhXKXtyZXR1cm4gWGUoVywiaXRlcmF0ZSIsXy5pc0FycmF5KFcpPyJsZW5ndGgiOlhuKSxSZWZsZWN0Lm93bktleXMoVyl9fWNsYXNzIFdyIGV4dGVuZHMgYXJ7Y29uc3RydWN0b3IoVz0hMSl7c3VwZXIoITAsVyl9c2V0KFcsbGUpe3JldHVybiEwfWRlbGV0ZVByb3BlcnR5KFcsbGUpe3JldHVybiEwfX1sZXQgeHI9bmV3IHZpLHJvPW5ldyBXcixabz1uZXcgdmkoITApLHZhPW5ldyBXcighMCksSGk9TT0+TSxPbj1NPT5SZWZsZWN0LmdldFByb3RvdHlwZU9mKE0pO2Z1bmN0aW9uIG1yKE0sVyxsZT0hMSwkZT0hMSl7TT1NLl9fdl9yYXc7bGV0IHplPWNuKE0pLGF0PWNuKFcpO2xlfHwoXy5oYXNDaGFuZ2VkKFcsYXQpJiZYZSh6ZSwiZ2V0IixXKSxYZSh6ZSwiZ2V0IixhdCkpO2xldHtoYXM6UXR9PU9uKHplKSxKdD0kZT9IaTpsZT9HaTpxcjtpZihRdC5jYWxsKHplLFcpKXJldHVybiBKdChNLmdldChXKSk7aWYoUXQuY2FsbCh6ZSxhdCkpcmV0dXJuIEp0KE0uZ2V0KGF0KSk7TSE9PXplJiZNLmdldChXKX1mdW5jdGlvbiBRcihNLFc9ITEpe2xldCBsZT10aGlzLl9fdl9yYXcsJGU9Y24obGUpLHplPWNuKE0pO3JldHVybiBXfHwoXy5oYXNDaGFuZ2VkKE0semUpJiZYZSgkZSwiaGFzIixNKSxYZSgkZSwiaGFzIix6ZSkpLE09PT16ZT9sZS5oYXMoTSk6bGUuaGFzKE0pfHxsZS5oYXMoemUpfWZ1bmN0aW9uIG1pKE0sVz0hMSl7cmV0dXJuIE09TS5fX3ZfcmF3LCFXJiZYZShjbihNKSwiaXRlcmF0ZSIsWG4pLFJlZmxlY3QuZ2V0KE0sInNpemUiLE0pfWZ1bmN0aW9uIEhuKE0pe009Y24oTSk7bGV0IFc9Y24odGhpcyk7cmV0dXJuIE9uKFcpLmhhcy5jYWxsKFcsTSl8fChXLmFkZChNKSxodChXLCJhZGQiLE0sTSkpLHRoaXN9ZnVuY3Rpb24geW8oTSxXKXtXPWNuKFcpO2xldCBsZT1jbih0aGlzKSx7aGFzOiRlLGdldDp6ZX09T24obGUpLGF0PSRlLmNhbGwobGUsTSk7YXR8fChNPWNuKE0pLGF0PSRlLmNhbGwobGUsTSkpO2xldCBRdD16ZS5jYWxsKGxlLE0pO3JldHVybiBsZS5zZXQoTSxXKSxhdD9fLmhhc0NoYW5nZWQoVyxRdCkmJmh0KGxlLCJzZXQiLE0sVyxRdCk6aHQobGUsImFkZCIsTSxXKSx0aGlzfWZ1bmN0aW9uIEdyKE0pe2xldCBXPWNuKHRoaXMpLHtoYXM6bGUsZ2V0OiRlfT1PbihXKSx6ZT1sZS5jYWxsKFcsTSk7emV8fChNPWNuKE0pLHplPWxlLmNhbGwoVyxNKSk7bGV0IGF0PSRlPyRlLmNhbGwoVyxNKTp2b2lkIDAsUXQ9Vy5kZWxldGUoTSk7cmV0dXJuIHplJiZodChXLCJkZWxldGUiLE0sdm9pZCAwLGF0KSxRdH1mdW5jdGlvbiBtYSgpe2xldCBNPWNuKHRoaXMpLFc9TS5zaXplIT09MCxsZT12b2lkIDAsJGU9TS5jbGVhcigpO3JldHVybiBXJiZodChNLCJjbGVhciIsdm9pZCAwLHZvaWQgMCxsZSksJGV9ZnVuY3Rpb24gQ2koTSxXKXtyZXR1cm4gZnVuY3Rpb24oJGUsemUpe2xldCBhdD10aGlzLFF0PWF0Ll9fdl9yYXcsSnQ9Y24oUXQpLE9yPVc/SGk6TT9HaTpxcjtyZXR1cm4hTSYmWGUoSnQsIml0ZXJhdGUiLFhuKSxRdC5mb3JFYWNoKChJaSxocik9PiRlLmNhbGwoemUsT3IoSWkpLE9yKGhyKSxhdCkpfX1mdW5jdGlvbiBRbihNLFcsbGUpe3JldHVybiBmdW5jdGlvbiguLi4kZSl7bGV0IHplPXRoaXMuX192X3JhdyxhdD1jbih6ZSksUXQ9Xy5pc01hcChhdCksSnQ9TT09PSJlbnRyaWVzInx8TT09PVN5bWJvbC5pdGVyYXRvciYmUXQsT3I9TT09PSJrZXlzIiYmUXQsSWk9emVbTV0oLi4uJGUpLGhyPWxlP0hpOlc/R2k6cXI7cmV0dXJuIVcmJlhlKGF0LCJpdGVyYXRlIixPcj9LZTpYbikse25leHQoKXtsZXR7dmFsdWU6UHIsZG9uZTpSaX09SWkubmV4dCgpO3JldHVybiBSaT97dmFsdWU6UHIsZG9uZTpSaX06e3ZhbHVlOkp0P1tocihQclswXSksaHIoUHJbMV0pXTpocihQciksZG9uZTpSaX19LFtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX19ZnVuY3Rpb24gX3IoTSl7cmV0dXJuIGZ1bmN0aW9uKC4uLlcpe3JldHVybiBNPT09ImRlbGV0ZSI/ITE6TT09PSJjbGVhciI/dm9pZCAwOnRoaXN9fWZ1bmN0aW9uIExhKCl7bGV0IE09e2dldChhdCl7cmV0dXJuIG1yKHRoaXMsYXQpfSxnZXQgc2l6ZSgpe3JldHVybiBtaSh0aGlzKX0saGFzOlFyLGFkZDpIbixzZXQ6eW8sZGVsZXRlOkdyLGNsZWFyOm1hLGZvckVhY2g6Q2koITEsITEpfSxXPXtnZXQoYXQpe3JldHVybiBtcih0aGlzLGF0LCExLCEwKX0sZ2V0IHNpemUoKXtyZXR1cm4gbWkodGhpcyl9LGhhczpRcixhZGQ6SG4sc2V0OnlvLGRlbGV0ZTpHcixjbGVhcjptYSxmb3JFYWNoOkNpKCExLCEwKX0sbGU9e2dldChhdCl7cmV0dXJuIG1yKHRoaXMsYXQsITApfSxnZXQgc2l6ZSgpe3JldHVybiBtaSh0aGlzLCEwKX0saGFzKGF0KXtyZXR1cm4gUXIuY2FsbCh0aGlzLGF0LCEwKX0sYWRkOl9yKCJhZGQiKSxzZXQ6X3IoInNldCIpLGRlbGV0ZTpfcigiZGVsZXRlIiksY2xlYXI6X3IoImNsZWFyIiksZm9yRWFjaDpDaSghMCwhMSl9LCRlPXtnZXQoYXQpe3JldHVybiBtcih0aGlzLGF0LCEwLCEwKX0sZ2V0IHNpemUoKXtyZXR1cm4gbWkodGhpcywhMCl9LGhhcyhhdCl7cmV0dXJuIFFyLmNhbGwodGhpcyxhdCwhMCl9LGFkZDpfcigiYWRkIiksc2V0Ol9yKCJzZXQiKSxkZWxldGU6X3IoImRlbGV0ZSIpLGNsZWFyOl9yKCJjbGVhciIpLGZvckVhY2g6Q2koITAsITApfTtyZXR1cm5bImtleXMiLCJ2YWx1ZXMiLCJlbnRyaWVzIixTeW1ib2wuaXRlcmF0b3JdLmZvckVhY2goYXQ9PntNW2F0XT1RbihhdCwhMSwhMSksbGVbYXRdPVFuKGF0LCEwLCExKSxXW2F0XT1RbihhdCwhMSwhMCksJGVbYXRdPVFuKGF0LCEwLCEwKX0pLFtNLGxlLFcsJGVdfWxldFtkcixYbyxCbyxNb109TGEoKTtmdW5jdGlvbiBjaShNLFcpe2xldCBsZT1XP00/TW86Qm86TT9YbzpkcjtyZXR1cm4oJGUsemUsYXQpPT56ZT09PSJfX3ZfaXNSZWFjdGl2ZSI/IU06emU9PT0iX192X2lzUmVhZG9ubHkiP006emU9PT0iX192X3JhdyI/JGU6UmVmbGVjdC5nZXQoXy5oYXNPd24obGUsemUpJiZ6ZSBpbiAkZT9sZTokZSx6ZSxhdCl9bGV0IFRpPXtnZXQ6Y2koITEsITEpfSxFbz17Z2V0OmNpKCExLCEwKX0sQ3I9e2dldDpjaSghMCwhMSl9LEJyPXtnZXQ6Y2koITAsITApfTtmdW5jdGlvbiBpbyhNLFcsbGUpe2xldCAkZT1jbihsZSk7aWYoJGUhPT1sZSYmVy5jYWxsKE0sJGUpKXtsZXQgemU9Xy50b1Jhd1R5cGUoTSk7QyhgUmVhY3RpdmUgJHt6ZX0gY29udGFpbnMgYm90aCB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBvYmplY3Qke3plPT09Ik1hcCI/IiBhcyBrZXlzIjoiIn0sIHdoaWNoIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcy4gQXZvaWQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gdGhlIHJhdyBhbmQgcmVhY3RpdmUgdmVyc2lvbnMgb2YgYW4gb2JqZWN0IGFuZCBvbmx5IHVzZSB0aGUgcmVhY3RpdmUgdmVyc2lvbiBpZiBwb3NzaWJsZS5gKX19bGV0IG9vPW5ldyBXZWFrTWFwLGVpPW5ldyBXZWFrTWFwLGppPW5ldyBXZWFrTWFwLHppPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFFvKE0pe3N3aXRjaChNKXtjYXNlIk9iamVjdCI6Y2FzZSJBcnJheSI6cmV0dXJuIDE7Y2FzZSJNYXAiOmNhc2UiU2V0IjpjYXNlIldlYWtNYXAiOmNhc2UiV2Vha1NldCI6cmV0dXJuIDI7ZGVmYXVsdDpyZXR1cm4gMH19ZnVuY3Rpb24gT2koTSl7cmV0dXJuIE0uX192X3NraXB8fCFPYmplY3QuaXNFeHRlbnNpYmxlKE0pPzA6UW8oXy50b1Jhd1R5cGUoTSkpfWZ1bmN0aW9uIGFvKE0pe3JldHVybiBCdChNKT9NOllyKE0sITEseHIsVGksb28pfWZ1bmN0aW9uIGVhKE0pe3JldHVybiBZcihNLCExLFpvLEVvLGVpKX1mdW5jdGlvbiBXaShNKXtyZXR1cm4gWXIoTSwhMCxybyxDcixqaSl9ZnVuY3Rpb24gam4oTSl7cmV0dXJuIFlyKE0sITAsdmEsQnIsemkpfWZ1bmN0aW9uIFlyKE0sVyxsZSwkZSx6ZSl7aWYoIV8uaXNPYmplY3QoTSl8fE0uX192X3JhdyYmIShXJiZNLl9fdl9pc1JlYWN0aXZlKSlyZXR1cm4gTTtsZXQgYXQ9emUuZ2V0KE0pO2lmKGF0KXJldHVybiBhdDtsZXQgUXQ9T2koTSk7aWYoUXQ9PT0wKXJldHVybiBNO2xldCBKdD1uZXcgUHJveHkoTSxRdD09PTI/JGU6bGUpO3JldHVybiB6ZS5zZXQoTSxKdCksSnR9ZnVuY3Rpb24gVHIoTSl7cmV0dXJuIEJ0KE0pP1RyKE0uX192X3Jhdyk6ISEoTSYmTS5fX3ZfaXNSZWFjdGl2ZSl9ZnVuY3Rpb24gQnQoTSl7cmV0dXJuISEoTSYmTS5fX3ZfaXNSZWFkb25seSl9ZnVuY3Rpb24gVGUoTSl7cmV0dXJuISEoTSYmTS5fX3ZfaXNTaGFsbG93KX1mdW5jdGlvbiBGYShNKXtyZXR1cm4gVHIoTSl8fEJ0KE0pfWZ1bmN0aW9uIGNuKE0pe2xldCBXPU0mJk0uX192X3JhdztyZXR1cm4gVz9jbihXKTpNfWZ1bmN0aW9uIHNvKE0pe3JldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE0pJiZfLmRlZihNLCJfX3Zfc2tpcCIsITApLE19bGV0IHFyPU09Pl8uaXNPYmplY3QoTSk/YW8oTSk6TSxHaT1NPT5fLmlzT2JqZWN0KE0pP1dpKE0pOk0sTG89IkNvbXB1dGVkIGlzIHN0aWxsIGRpcnR5IGFmdGVyIGdldHRlciBldmFsdWF0aW9uLCBsaWtlbHkgYmVjYXVzZSBhIGNvbXB1dGVkIGlzIG11dGF0aW5nIGl0cyBvd24gZGVwZW5kZW5jeSBpbiBpdHMgZ2V0dGVyLiBTdGF0ZSBtdXRhdGlvbnMgaW4gY29tcHV0ZWQgZ2V0dGVycyBzaG91bGQgYmUgYXZvaWRlZC4gIENoZWNrIHRoZSBkb2NzIGZvciBtb3JlIGRldGFpbHM6IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2Vzc2VudGlhbHMvY29tcHV0ZWQuaHRtbCNnZXR0ZXJzLXNob3VsZC1iZS1zaWRlLWVmZmVjdC1mcmVlIjtjbGFzcyBZaXtjb25zdHJ1Y3RvcihXLGxlLCRlLHplKXt0aGlzLmdldHRlcj1XLHRoaXMuX3NldHRlcj1sZSx0aGlzLmRlcD12b2lkIDAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fX3ZfaXNSZWFkb25seT0hMSx0aGlzLmVmZmVjdD1uZXcgWXQoKCk9PlcodGhpcy5fdmFsdWUpLCgpPT5maSh0aGlzLHRoaXMuZWZmZWN0Ll9kaXJ0eUxldmVsPT09Mj8yOjMpKSx0aGlzLmVmZmVjdC5jb21wdXRlZD10aGlzLHRoaXMuZWZmZWN0LmFjdGl2ZT10aGlzLl9jYWNoZWFibGU9IXplLHRoaXMuX192X2lzUmVhZG9ubHk9JGV9Z2V0IHZhbHVlKCl7bGV0IFc9Y24odGhpcyk7cmV0dXJuKCFXLl9jYWNoZWFibGV8fFcuZWZmZWN0LmRpcnR5KSYmXy5oYXNDaGFuZ2VkKFcuX3ZhbHVlLFcuX3ZhbHVlPVcuZWZmZWN0LnJ1bigpKSYmZmkoVyw0KSx1aShXKSxXLmVmZmVjdC5fZGlydHlMZXZlbD49MiYmZmkoVywyKSxXLl92YWx1ZX1zZXQgdmFsdWUoVyl7dGhpcy5fc2V0dGVyKFcpfWdldCBfZGlydHkoKXtyZXR1cm4gdGhpcy5lZmZlY3QuZGlydHl9c2V0IF9kaXJ0eShXKXt0aGlzLmVmZmVjdC5kaXJ0eT1XfX1mdW5jdGlvbiBQaShNLFcsbGU9ITEpe2xldCAkZSx6ZSxhdD1fLmlzRnVuY3Rpb24oTSk7cmV0dXJuIGF0PygkZT1NLHplPV8uTk9PUCk6KCRlPU0uZ2V0LHplPU0uc2V0KSxuZXcgWWkoJGUsemUsYXR8fCF6ZSxsZSl9ZnVuY3Rpb24gdWkoTSl7dmFyIFc7c24mJkd0JiYoTT1jbihNKSxtbihHdCwoVz1NLmRlcCkhPW51bGw/VzpNLmRlcD1wcigoKT0+TS5kZXA9dm9pZCAwLE0gaW5zdGFuY2VvZiBZaT9NOnZvaWQgMCksdm9pZCAwKSl9ZnVuY3Rpb24gZmkoTSxXPTQsbGUpe009Y24oTSk7bGV0ICRlPU0uZGVwOyRlJiZSbigkZSxXLHZvaWQgMCl9ZnVuY3Rpb24gYnIoTSl7cmV0dXJuISEoTSYmTS5fX3ZfaXNSZWY9PT0hMCl9ZnVuY3Rpb24gTXIoTSl7cmV0dXJuIHRpKE0sITEpfWZ1bmN0aW9uIGxvKE0pe3JldHVybiB0aShNLCEwKX1mdW5jdGlvbiB0aShNLFcpe3JldHVybiBicihNKT9NOm5ldyBwbihNLFcpfWNsYXNzIHBue2NvbnN0cnVjdG9yKFcsbGUpe3RoaXMuX192X2lzU2hhbGxvdz1sZSx0aGlzLmRlcD12b2lkIDAsdGhpcy5fX3ZfaXNSZWY9ITAsdGhpcy5fcmF3VmFsdWU9bGU/VzpjbihXKSx0aGlzLl92YWx1ZT1sZT9XOnFyKFcpfWdldCB2YWx1ZSgpe3JldHVybiB1aSh0aGlzKSx0aGlzLl92YWx1ZX1zZXQgdmFsdWUoVyl7bGV0IGxlPXRoaXMuX192X2lzU2hhbGxvd3x8VGUoVyl8fEJ0KFcpO1c9bGU/VzpjbihXKSxfLmhhc0NoYW5nZWQoVyx0aGlzLl9yYXdWYWx1ZSkmJih0aGlzLl9yYXdWYWx1ZT1XLHRoaXMuX3ZhbHVlPWxlP1c6cXIoVyksZmkodGhpcyw0LFcpKX19ZnVuY3Rpb24geXIoTSl7ZmkoTSw0LHZvaWQgMCl9ZnVuY3Rpb24gcWkoTSl7cmV0dXJuIGJyKE0pP00udmFsdWU6TX1mdW5jdGlvbiBQbihNKXtyZXR1cm4gXy5pc0Z1bmN0aW9uKE0pP00oKTpxaShNKX1sZXQgX2k9e2dldDooTSxXLGxlKT0+cWkoUmVmbGVjdC5nZXQoTSxXLGxlKSksc2V0OihNLFcsbGUsJGUpPT57bGV0IHplPU1bV107cmV0dXJuIGJyKHplKSYmIWJyKGxlKT8oemUudmFsdWU9bGUsITApOlJlZmxlY3Quc2V0KE0sVyxsZSwkZSl9fTtmdW5jdGlvbiBGbyhNKXtyZXR1cm4gVHIoTSk/TTpuZXcgUHJveHkoTSxfaSl9Y2xhc3MgdGF7Y29uc3RydWN0b3IoVyl7dGhpcy5kZXA9dm9pZCAwLHRoaXMuX192X2lzUmVmPSEwO2xldHtnZXQ6bGUsc2V0OiRlfT1XKCgpPT51aSh0aGlzKSwoKT0+ZmkodGhpcykpO3RoaXMuX2dldD1sZSx0aGlzLl9zZXQ9JGV9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX2dldCgpfXNldCB2YWx1ZShXKXt0aGlzLl9zZXQoVyl9fWZ1bmN0aW9uIE5uKE0pe3JldHVybiBuZXcgdGEoTSl9ZnVuY3Rpb24gRXIoTSl7bGV0IFc9Xy5pc0FycmF5KE0pP25ldyBBcnJheShNLmxlbmd0aCk6e307Zm9yKGxldCBsZSBpbiBNKVdbbGVdPWJpKE0sbGUpO3JldHVybiBXfWNsYXNzIHNye2NvbnN0cnVjdG9yKFcsbGUsJGUpe3RoaXMuX29iamVjdD1XLHRoaXMuX2tleT1sZSx0aGlzLl9kZWZhdWx0VmFsdWU9JGUsdGhpcy5fX3ZfaXNSZWY9ITB9Z2V0IHZhbHVlKCl7bGV0IFc9dGhpcy5fb2JqZWN0W3RoaXMuX2tleV07cmV0dXJuIFc9PT12b2lkIDA/dGhpcy5fZGVmYXVsdFZhbHVlOld9c2V0IHZhbHVlKFcpe3RoaXMuX29iamVjdFt0aGlzLl9rZXldPVd9Z2V0IGRlcCgpe3JldHVybiBobihjbih0aGlzLl9vYmplY3QpLHRoaXMuX2tleSl9fWNsYXNzIExye2NvbnN0cnVjdG9yKFcpe3RoaXMuX2dldHRlcj1XLHRoaXMuX192X2lzUmVmPSEwLHRoaXMuX192X2lzUmVhZG9ubHk9ITB9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX2dldHRlcigpfX1mdW5jdGlvbiBTcihNLFcsbGUpe3JldHVybiBicihNKT9NOl8uaXNGdW5jdGlvbihNKT9uZXcgTHIoTSk6Xy5pc09iamVjdChNKSYmYXJndW1lbnRzLmxlbmd0aD4xP2JpKE0sVyxsZSk6TXIoTSl9ZnVuY3Rpb24gYmkoTSxXLGxlKXtsZXQgJGU9TVtXXTtyZXR1cm4gYnIoJGUpPyRlOm5ldyBzcihNLFcsbGUpfWxldCBTbz1QaSxOaT17R0VUOiJnZXQiLEhBUzoiaGFzIixJVEVSQVRFOiJpdGVyYXRlIn0sa2k9e1NFVDoic2V0IixBREQ6ImFkZCIsREVMRVRFOiJkZWxldGUiLENMRUFSOiJjbGVhciJ9LGNvPXtTS0lQOiJfX3Zfc2tpcCIsSVNfUkVBQ1RJVkU6Il9fdl9pc1JlYWN0aXZlIixJU19SRUFET05MWToiX192X2lzUmVhZG9ubHkiLElTX1NIQUxMT1c6Il9fdl9pc1NoYWxsb3ciLFJBVzoiX192X3JhdyJ9O3JldHVybiBkLkVmZmVjdFNjb3BlPWcsZC5JVEVSQVRFX0tFWT1YbixkLlJlYWN0aXZlRWZmZWN0PVl0LGQuUmVhY3RpdmVGbGFncz1jbyxkLlRyYWNrT3BUeXBlcz1OaSxkLlRyaWdnZXJPcFR5cGVzPWtpLGQuY29tcHV0ZWQ9UGksZC5jdXN0b21SZWY9Tm4sZC5kZWZlcnJlZENvbXB1dGVkPVNvLGQuZWZmZWN0PXEsZC5lZmZlY3RTY29wZT15LGQuZW5hYmxlVHJhY2tpbmc9d2ksZC5nZXRDdXJyZW50U2NvcGU9QmUsZC5pc1Byb3h5PUZhLGQuaXNSZWFjdGl2ZT1UcixkLmlzUmVhZG9ubHk9QnQsZC5pc1JlZj1icixkLmlzU2hhbGxvdz1UZSxkLm1hcmtSYXc9c28sZC5vblNjb3BlRGlzcG9zZT1TdCxkLnBhdXNlU2NoZWR1bGluZz1FbixkLnBhdXNlVHJhY2tpbmc9Wm4sZC5wcm94eVJlZnM9Rm8sZC5yZWFjdGl2ZT1hbyxkLnJlYWRvbmx5PVdpLGQucmVmPU1yLGQucmVzZXRTY2hlZHVsaW5nPXF0LGQucmVzZXRUcmFja2luZz16cixkLnNoYWxsb3dSZWFjdGl2ZT1lYSxkLnNoYWxsb3dSZWFkb25seT1qbixkLnNoYWxsb3dSZWY9bG8sZC5zdG9wPW5lLGQudG9SYXc9Y24sZC50b1JlZj1TcixkLnRvUmVmcz1FcixkLnRvVmFsdWU9UG4sZC50cmFjaz1YZSxkLnRyaWdnZXI9aHQsZC50cmlnZ2VyUmVmPXlyLGQudW5yZWY9cWksZH0oe30sZik7cmV0dXJuIG99ZnVuY3Rpb24gUnYoZil7dmFyIG89ZnVuY3Rpb24oZCl7InVzZSBzdHJpY3QiO2xldCBfPWAKYCxDPTQ0LGI9NTAsZz01MCx5PVsiJSIsIiUiXSxJPSIjMDA3YWZmIixCZT0vXihbYS16LV0rOik/XC9cLy9pLFN0PS9eZGF0YTouKiwuKi8sR3Q9IldFQl9JTlZPS0VfQVBQU0VSVklDRSIsWXQ9Ind4czovLyIsUj0ianNvbjovLyIsT3Q9Ind4c01vZHVsZXMiLFVuPSJyZW5kZXJqc01vZHVsZXMiLGZ0PSJvblNob3ciLHE9Im9uSGlkZSIsbmU9Im9uTGF1bmNoIixzbj0ib25FcnJvciIsbG49Im9uVGhlbWVDaGFuZ2UiLGJuPSJvZmZUaGVtZUNoYW5nZSIsWm49Im9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLHdpPSJvblBhZ2VOb3RGb3VuZCIsenI9Im9uVW5oYW5kbGVkUmVqZWN0aW9uIixFbj0ib25FeGl0IixxdD0ib25Mb2FkIixtbj0ib25SZWFkeSIsTW49Im9uVW5sb2FkIixSbj0ib25Jbml0Iixwcj0ib25TYXZlRXhpdFN0YXRlIixBaT0ib25SZXNpemUiLFhuPSJvbkJhY2tQcmVzcyIsS2U9Im9uUGFnZVNjcm9sbCIsWGU9Im9uVGFiSXRlbVRhcCIsaHQ9Im9uUmVhY2hCb3R0b20iLGhuPSJvblB1bGxEb3duUmVmcmVzaCIsTG49Im9uU2hhcmVUaW1lbGluZSIsZ249Im9uQWRkVG9GYXZvcml0ZXMiLEFuPSJvblNoYXJlQXBwTWVzc2FnZSIsJG49Im9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsdnI9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsYXI9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsdmk9Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIixXcj0ib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQiLHhyPSJvbkFwcEVudGVyRm9yZWdyb3VuZCIscm89Im9uQXBwRW50ZXJCYWNrZ3JvdW5kIixabz0ib25XeHNJbnZva2VDYWxsTWV0aG9kIjtmdW5jdGlvbiB2YShzZSl7cmV0dXJuISFzZS5hcHBDb250ZXh0fWZ1bmN0aW9uIEhpKHNlKXtyZXR1cm4gc2UmJih2YShzZSk/c2UucHJveHk6c2UpfWZ1bmN0aW9uIE9uKHNlKXtyZXR1cm4gc2Uubm9kZVR5cGU9PT0xfWZ1bmN0aW9uIG1yKHNlLFk9ITEpe2xldHt2bm9kZTppZX09c2U7aWYoT24oaWUuZWwpKXJldHVybiBZP2llLmVsP1tpZS5lbF06W106aWUuZWw7bGV0e3N1YlRyZWU6TGV9PXNlO2lmKExlLnNoYXBlRmxhZyYxNil7bGV0IGx0PUxlLmNoaWxkcmVuLmZpbHRlcihmbj0+Zm4uZWwmJk9uKGZuLmVsKSk7aWYobHQubGVuZ3RoPjApcmV0dXJuIFk/bHQubWFwKGZuPT5mbi5lbCk6bHRbMF0uZWx9cmV0dXJuIFk/aWUuZWw/W2llLmVsXTpbXTppZS5lbH1sZXQgUXI9MDtmdW5jdGlvbiBtaShzZSwuLi5ZKXtsZXQgaWU9RGF0ZS5ub3coKSxMZT1Rcj9pZS1RcjowO3JldHVybiBRcj1pZSxgWyR7aWV9XVske0xlfW1zXVske3NlfV1cdUZGMUEke1kubWFwKGx0PT5KU09OLnN0cmluZ2lmeShsdCkpLmpvaW4oIiAiKX1gfWZ1bmN0aW9uIEhuKHNlKXtsZXQgWT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBpZT0+WVtpZV18fChZW2llXT1zZShpZSkpfWZ1bmN0aW9uIHlvKHNlKXtyZXR1cm4gSG4oc2UpfWZ1bmN0aW9uIEdyKHNlPSIiKXtyZXR1cm4oIiIrc2UpLnJlcGxhY2UoL1teXHgwMC1ceGZmXS9nLCIqKiIpLmxlbmd0aH1mdW5jdGlvbiBtYShzZSl7cmV0dXJuIHNlLmluZGV4T2YoIi8iKT09PTB9ZnVuY3Rpb24gQ2koc2Upe3JldHVybiBtYShzZSk/c2U6Ii8iK3NlfWZ1bmN0aW9uIFFuKHNlKXtyZXR1cm4gbWEoc2UpP3NlLnNsaWNlKDEpOnNlfWxldCBfcj0oc2UsWSk9PntsZXQgaWU7Zm9yKGxldCBMZT0wO0xlPHNlLmxlbmd0aDtMZSsrKWllPXNlW0xlXShZKTtyZXR1cm4gaWV9O2Z1bmN0aW9uIExhKHNlLFk9bnVsbCl7bGV0IGllO3JldHVybiguLi5MZSk9PihzZSYmKGllPXNlLmFwcGx5KFksTGUpLHNlPW51bGwpLGllKX1mdW5jdGlvbiBkcihzZSxZKXtzZT1zZXx8e30sZC5pc1N0cmluZyhZKSYmKFk9e2Vyck1zZzpZfSksLzpvayQvLnRlc3QoWS5lcnJNc2cpP2QuaXNGdW5jdGlvbihzZS5zdWNjZXNzKSYmc2Uuc3VjY2VzcyhZKTpkLmlzRnVuY3Rpb24oc2UuZmFpbCkmJnNlLmZhaWwoWSksZC5pc0Z1bmN0aW9uKHNlLmNvbXBsZXRlKSYmc2UuY29tcGxldGUoWSl9ZnVuY3Rpb24gWG8oc2Upe2xldCBZPXt9O3JldHVybiBkLmlzUGxhaW5PYmplY3Qoc2UpJiZPYmplY3Qua2V5cyhzZSkuc29ydCgpLmZvckVhY2goaWU9PntsZXQgTGU9aWU7WVtMZV09c2VbTGVdfSksT2JqZWN0LmtleXMoWSk/WTpzZX1sZXQgQm89ZW5jb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIE1vKHNlLFk9Qm8pe2xldCBpZT1zZT9PYmplY3Qua2V5cyhzZSkubWFwKExlPT57bGV0IGx0PXNlW0xlXTtyZXR1cm4gdHlwZW9mIGx0PT09dm9pZCAwfHxsdD09PW51bGw/bHQ9IiI6ZC5pc1BsYWluT2JqZWN0KGx0KSYmKGx0PUpTT04uc3RyaW5naWZ5KGx0KSksWShMZSkrIj0iK1kobHQpfSkuZmlsdGVyKExlPT5MZS5sZW5ndGg+MCkuam9pbigiJiIpOm51bGw7cmV0dXJuIGllP2A/JHtpZX1gOiIifWZ1bmN0aW9uIGNpKHNlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCgiIitzZSl9Y2F0Y2goWSl7fXJldHVybiIiK3NlfWZ1bmN0aW9uIFRpKHNlPXt9KXtsZXQgWT17fTtyZXR1cm4gT2JqZWN0LmtleXMoc2UpLmZvckVhY2goaWU9Pnt0cnl7WVtpZV09Y2koc2VbaWVdKX1jYXRjaChMZSl7WVtpZV09c2VbaWVdfX0pLFl9bGV0IEVvPS9cKy9nO2Z1bmN0aW9uIENyKHNlKXtsZXQgWT17fTtpZihzZT09PSIifHxzZT09PSI/IilyZXR1cm4gWTtsZXQgTGU9KHNlWzBdPT09Ij8iP3NlLnNsaWNlKDEpOnNlKS5zcGxpdCgiJiIpO2ZvcihsZXQgbHQ9MDtsdDxMZS5sZW5ndGg7KytsdCl7bGV0IGZuPUxlW2x0XS5yZXBsYWNlKEVvLCIgIiksTnI9Zm4uaW5kZXhPZigiPSIpLHdyPWNpKE5yPDA/Zm46Zm4uc2xpY2UoMCxOcikpLEppPU5yPDA/bnVsbDpjaShmbi5zbGljZShOcisxKSk7aWYod3IgaW4gWSl7bGV0IEZyPVlbd3JdO2QuaXNBcnJheShGcil8fChGcj1ZW3dyXT1bRnJdKSxGci5wdXNoKEppKX1lbHNlIFlbd3JdPUppfXJldHVybiBZfWZ1bmN0aW9uIEJyKHNlKXtsZXRbWSxpZV09c2Uuc3BsaXQoIj8iLDIpO3JldHVybntwYXRoOlkscXVlcnk6Q3IoaWV8fCIiKX19ZnVuY3Rpb24gaW8oc2Upe2xldCBZPXt9O3JldHVybiBzZSYmT2JqZWN0LmtleXMoc2UpLmZvckVhY2goaWU9PntpZS5pbmRleE9mKCJkYXRhLSIpPT09MCYmKFlbaWUucmVwbGFjZSgiZGF0YS0iLCIiKV09c2VbaWVdKX0pLFl9Y2xhc3Mgb28gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihZKXtzdXBlcihZKTt0aGlzLm5hbWU9IkRPTUV4Y2VwdGlvbiJ9fWZ1bmN0aW9uIGVpKHNlLFkpe3JldHVybiBZJiYoWS5jYXB0dXJlJiYoc2UrPSJDYXB0dXJlIiksWS5vbmNlJiYoc2UrPSJPbmNlIiksWS5wYXNzaXZlJiYoc2UrPSJQYXNzaXZlIikpLGBvbiR7ZC5jYXBpdGFsaXplKGQuY2FtZWxpemUoc2UpKX1gfWNsYXNzIGppe2NvbnN0cnVjdG9yKFksaWUpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMSx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpLHRoaXMuX3N0b3A9ITEsdGhpcy5fZW5kPSExLHRoaXMudHlwZT1ZLHRoaXMuYnViYmxlcz0hIWllLmJ1YmJsZXMsdGhpcy5jYW5jZWxhYmxlPSEhaWUuY2FuY2VsYWJsZX1wcmV2ZW50RGVmYXVsdCgpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH1zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKXt0aGlzLl9lbmQ9dGhpcy5fc3RvcD0hMH1zdG9wUHJvcGFnYXRpb24oKXt0aGlzLl9zdG9wPSEwfX1mdW5jdGlvbiB6aShzZSl7aWYoc2UgaW5zdGFuY2VvZiBqaSlyZXR1cm4gc2U7bGV0W1ldPWFvKHNlLnR5cGUpLGllPW5ldyBqaShZLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KTtyZXR1cm4gZC5leHRlbmQoaWUsc2UpLGllfWNsYXNzIFFve2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0ZW5lcnM9T2JqZWN0LmNyZWF0ZShudWxsKX1kaXNwYXRjaEV2ZW50KFkpe2xldCBpZT10aGlzLmxpc3RlbmVyc1tZLnR5cGVdO2lmKCFpZSlyZXR1cm4hMTtsZXQgTGU9emkoWSksbHQ9aWUubGVuZ3RoO2ZvcihsZXQgZm49MDtmbjxsdCYmKGllW2ZuXS5jYWxsKHRoaXMsTGUpLCFMZS5fZW5kKTtmbisrKTtyZXR1cm4gTGUuY2FuY2VsYWJsZSYmTGUuZGVmYXVsdFByZXZlbnRlZH1hZGRFdmVudExpc3RlbmVyKFksaWUsTGUpe1k9ZWkoWSxMZSksKHRoaXMubGlzdGVuZXJzW1ldfHwodGhpcy5saXN0ZW5lcnNbWV09W10pKS5wdXNoKGllKX1yZW1vdmVFdmVudExpc3RlbmVyKFksaWUsTGUpe1k9ZWkoWSxMZSk7bGV0IGx0PXRoaXMubGlzdGVuZXJzW1ldO2lmKCFsdClyZXR1cm47bGV0IGZuPWx0LmluZGV4T2YoaWUpO2ZuPi0xJiZsdC5zcGxpY2UoZm4sMSl9fWxldCBPaT0vKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87ZnVuY3Rpb24gYW8oc2Upe2xldCBZO2lmKE9pLnRlc3Qoc2UpKXtZPXt9O2xldCBpZTtmb3IoO2llPXNlLm1hdGNoKE9pKTspc2U9c2Uuc2xpY2UoMCxzZS5sZW5ndGgtaWVbMF0ubGVuZ3RoKSxZW2llWzBdLnRvTG93ZXJDYXNlKCldPSEwfXJldHVybltkLmh5cGhlbmF0ZShzZS5zbGljZSgyKSksWV19bGV0IGVhPSgoKT0+KHtzdG9wOjEscHJldmVudDoxPDwxLHNlbGY6MTw8Mn0pKSgpO2Z1bmN0aW9uIFdpKHNlKXtsZXQgWT0wO3JldHVybiBzZS5pbmNsdWRlcygic3RvcCIpJiYoWXw9ZWEuc3RvcCksc2UuaW5jbHVkZXMoInByZXZlbnQiKSYmKFl8PWVhLnByZXZlbnQpLHNlLmluY2x1ZGVzKCJzZWxmIikmJihZfD1lYS5zZWxmKSxZfWxldCBqbj0wLFlyPTEsVHI9MyxCdD04O2Z1bmN0aW9uIFRlKHNlLFkpe2xldHtwYXJlbnROb2RlOmllfT1zZTtpZighaWUpcmV0dXJuIG51bGw7bGV0e2NoaWxkTm9kZXM6TGV9PWllO3JldHVybiBMZVtMZS5pbmRleE9mKHNlKSsoWT09PSJuIj8xOi0xKV18fG51bGx9ZnVuY3Rpb24gRmEoc2Upe2xldHtwYXJlbnROb2RlOll9PXNlO2lmKFkpe2xldHtjaGlsZE5vZGVzOmllfT1ZLExlPWllLmluZGV4T2Yoc2UpO0xlPi0xJiYoc2UucGFyZW50Tm9kZT1udWxsLGllLnNwbGljZShMZSwxKSl9fWZ1bmN0aW9uIGNuKHNlKXshc2Uubm9kZUlkJiZzZS5wYWdlTm9kZSYmKHNlLm5vZGVJZD1zZS5wYWdlTm9kZS5nZW5JZCgpKX1jbGFzcyBzbyBleHRlbmRzIFFve2NvbnN0cnVjdG9yKFksaWUsTGUpe3N1cGVyKCk7aWYodGhpcy5wYWdlTm9kZT1udWxsLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuX3RleHQ9bnVsbCxMZSl7bGV0e3BhZ2VOb2RlOmx0fT1MZTtsdCYmKHRoaXMucGFnZU5vZGU9bHQsdGhpcy5ub2RlSWQ9bHQuZ2VuSWQoKSwhbHQuaXNVbm1vdW50ZWQmJmx0Lm9uQ3JlYXRlKHRoaXMsaWUpKX10aGlzLm5vZGVUeXBlPVksdGhpcy5ub2RlTmFtZT1pZSx0aGlzLmNoaWxkTm9kZXM9W119Z2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdfHxudWxsfWdldCBsYXN0Q2hpbGQoKXtsZXR7Y2hpbGROb2RlczpZfT10aGlzLGllPVkubGVuZ3RoO3JldHVybiBpZT9ZW2llLTFdOm51bGx9Z2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIFRlKHRoaXMsIm4iKX1nZXQgbm9kZVZhbHVlKCl7cmV0dXJuIG51bGx9c2V0IG5vZGVWYWx1ZShZKXt9Z2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuX3RleHR8fCIifXNldCB0ZXh0Q29udGVudChZKXt0aGlzLl90ZXh0PVksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25UZXh0Q29udGVudCh0aGlzLFkpfWdldCBwYXJlbnRFbGVtZW50KCl7bGV0e3BhcmVudE5vZGU6WX09dGhpcztyZXR1cm4gWSYmWS5ub2RlVHlwZT09PVlyP1k6bnVsbH1nZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIFRlKHRoaXMsInAiKX1hcHBlbmRDaGlsZChZKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoWSxudWxsKX1jbG9uZU5vZGUoWSl7bGV0IGllPWQuZXh0ZW5kKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKSx0aGlzKSx7YXR0cmlidXRlczpMZX09aWU7cmV0dXJuIExlJiYoaWUuYXR0cmlidXRlcz1kLmV4dGVuZCh7fSxMZSkpLFkmJihpZS5jaGlsZE5vZGVzPWllLmNoaWxkTm9kZXMubWFwKGx0PT5sdC5jbG9uZU5vZGUoITApKSksaWV9aW5zZXJ0QmVmb3JlKFksaWUpe0ZhKFkpLFkucGFnZU5vZGU9dGhpcy5wYWdlTm9kZSxZLnBhcmVudE5vZGU9dGhpcyxjbihZKTtsZXR7Y2hpbGROb2RlczpMZX09dGhpcztpZihpZSl7bGV0IGx0PUxlLmluZGV4T2YoaWUpO2lmKGx0PT09LTEpdGhyb3cgbmV3IG9vKCJGYWlsZWQgdG8gZXhlY3V0ZSAnaW5zZXJ0QmVmb3JlJyBvbiAnTm9kZSc6IFRoZSBub2RlIGJlZm9yZSB3aGljaCB0aGUgbmV3IG5vZGUgaXMgdG8gYmUgaW5zZXJ0ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO0xlLnNwbGljZShsdCwwLFkpfWVsc2UgTGUucHVzaChZKTtyZXR1cm4gdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQ/dGhpcy5wYWdlTm9kZS5vbkluc2VydEJlZm9yZSh0aGlzLFksaWUpOll9cmVtb3ZlQ2hpbGQoWSl7bGV0e2NoaWxkTm9kZXM6aWV9PXRoaXMsTGU9aWUuaW5kZXhPZihZKTtpZihMZT09PS0xKXRocm93IG5ldyBvbygiRmFpbGVkIHRvIGV4ZWN1dGUgJ3JlbW92ZUNoaWxkJyBvbiAnTm9kZSc6IFRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLiIpO3JldHVybiBZLnBhcmVudE5vZGU9bnVsbCxpZS5zcGxpY2UoTGUsMSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQ/dGhpcy5wYWdlTm9kZS5vblJlbW92ZUNoaWxkKFkpOll9fWxldCBxcj0iY2xhc3MiLEdpPSJzdHlsZSIsTG89Ii52T3duZXJJZCIsWWk9Ii52UmVuZGVyanMiO2NsYXNzIFBpIGV4dGVuZHMgc297Y29uc3RydWN0b3IoWSxpZSxMZSl7c3VwZXIoWSxpZSxMZSk7dGhpcy5hdHRyaWJ1dGVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5zdHlsZT1udWxsLHRoaXMudlNob3c9bnVsbCx0aGlzLl9odG1sPW51bGx9Z2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbcXJdfHwiIn1zZXQgY2xhc3NOYW1lKFkpe3RoaXMuc2V0QXR0cmlidXRlKHFyLFkpfWdldCBpbm5lckhUTUwoKXtyZXR1cm4iIn1zZXQgaW5uZXJIVE1MKFkpe3RoaXMuX2h0bWw9WX1hZGRFdmVudExpc3RlbmVyKFksaWUsTGUpe3N1cGVyLmFkZEV2ZW50TGlzdGVuZXIoWSxpZSxMZSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJihpZS53eHNFdmVudD90aGlzLnBhZ2VOb2RlLm9uQWRkV3hzRXZlbnQodGhpcyxlaShZLExlKSxpZS53eHNFdmVudCxXaShpZS5tb2RpZmllcnN8fFtdKSk6dGhpcy5wYWdlTm9kZS5vbkFkZEV2ZW50KHRoaXMsZWkoWSxMZSksV2koaWUubW9kaWZpZXJzfHxbXSkpKX1yZW1vdmVFdmVudExpc3RlbmVyKFksaWUsTGUpe3N1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoWSxpZSxMZSksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25SZW1vdmVFdmVudCh0aGlzLGVpKFksTGUpKX1nZXRBdHRyaWJ1dGUoWSl7cmV0dXJuIFk9PT1HaT90aGlzLnN0eWxlOnRoaXMuYXR0cmlidXRlc1tZXX1yZW1vdmVBdHRyaWJ1dGUoWSl7WT09R2k/dGhpcy5zdHlsZT1udWxsOmRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbWV0sdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25SZW1vdmVBdHRyaWJ1dGUodGhpcyxZKX1zZXRBdHRyaWJ1dGUoWSxpZSl7WT09PUdpP3RoaXMuc3R5bGU9aWU6dGhpcy5hdHRyaWJ1dGVzW1ldPWllLHRoaXMucGFnZU5vZGUmJiF0aGlzLnBhZ2VOb2RlLmlzVW5tb3VudGVkJiZ0aGlzLnBhZ2VOb2RlLm9uU2V0QXR0cmlidXRlKHRoaXMsWSxpZSl9dG9KU09OKHthdHRyOlksbm9ybWFsaXplOmllfT17fSl7bGV0e2F0dHJpYnV0ZXM6TGUsc3R5bGU6bHQsbGlzdGVuZXJzOmZuLF90ZXh0Ok5yfT10aGlzLHdyPXt9O09iamVjdC5rZXlzKExlKS5sZW5ndGgmJih3ci5hPWllP2llKExlKTpMZSk7bGV0IEppPU9iamVjdC5rZXlzKGZuKTtpZihKaS5sZW5ndGgpe2xldCBGcix1bz17fTtKaS5mb3JFYWNoKENvPT57bGV0IFRvPWZuW0NvXTtpZihUby5sZW5ndGgpe2xldHt3eHNFdmVudDpuYSxtb2RpZmllcnM6bHJ9PVRvWzBdLERyPVdpKGxyfHxbXSk7bmE/KEZyfHwoRnI9e30pLEZyW0NvXT1baWU/aWUobmEpOm5hLERyXSk6dW9bQ29dPURyfX0pLHdyLmU9aWU/aWUodW8sITEpOnVvLEZyJiYod3Iudz1pZT9pZShGciwhMSk6RnIpfXJldHVybiBsdCE9PW51bGwmJih3ci5zPWllP2llKGx0KTpsdCksWXx8KHdyLmk9dGhpcy5ub2RlSWQsd3Iubj10aGlzLm5vZGVOYW1lKSxOciE9PW51bGwmJih3ci50PWllP2llKE5yKTpOciksd3J9fWNsYXNzIHVpIGV4dGVuZHMgc297Y29uc3RydWN0b3IoWSxpZSl7c3VwZXIoQnQsIiNjb21tZW50IixpZSk7dGhpcy5fdGV4dD0iIn10b0pTT04oWT17fSl7cmV0dXJuIFkuYXR0cj97fTp7aTp0aGlzLm5vZGVJZH19fWNsYXNzIGZpIGV4dGVuZHMgUGl7Y29uc3RydWN0b3IoWSxpZSl7c3VwZXIoWXIsWS50b1VwcGVyQ2FzZSgpLGllKTt0aGlzLnRhZ05hbWU9dGhpcy5ub2RlTmFtZX19Y2xhc3MgYnIgZXh0ZW5kcyBmaXtnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoInZhbHVlIil9c2V0IHZhbHVlKFkpe3RoaXMuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsWSl9fWNsYXNzIE1yIGV4dGVuZHMgYnJ7fWNsYXNzIGxvIGV4dGVuZHMgUGl7Y29uc3RydWN0b3IoWSxpZSl7c3VwZXIoVHIsIiN0ZXh0IixpZSk7dGhpcy5fdGV4dD1ZfWdldCBub2RlVmFsdWUoKXtyZXR1cm4gdGhpcy5fdGV4dHx8IiJ9c2V0IG5vZGVWYWx1ZShZKXt0aGlzLl90ZXh0PVksdGhpcy5wYWdlTm9kZSYmIXRoaXMucGFnZU5vZGUuaXNVbm1vdW50ZWQmJnRoaXMucGFnZU5vZGUub25Ob2RlVmFsdWUodGhpcyxZKX19bGV0IHRpPXtBRDpbImRhdGEiXSwiQUQtRFJBVyI6WyJkYXRhIl0sIkxJVkUtUExBWUVSIjpbInBpY3R1cmUtaW4tcGljdHVyZS1tb2RlIl0sTUFQOlsibWFya2VycyIsInBvbHlsaW5lIiwiY2lyY2xlcyIsImNvbnRyb2xzIiwiaW5jbHVkZS1wb2ludHMiLCJwb2x5Z29ucyJdLFBJQ0tFUjpbInJhbmdlIiwidmFsdWUiXSwiUElDS0VSLVZJRVciOlsidmFsdWUiXSwiUklDSC1URVhUIjpbIm5vZGVzIl0sVklERU86WyJkYW5tdS1saXN0IiwiaGVhZGVyIl0sIldFQi1WSUVXIjpbIndlYnZpZXctc3R5bGVzIl19LHBuPVsiYW5pbWF0aW9uIl0seXI9KHNlLFkpPT57aWYocG4uaW5kZXhPZihZKT4tMSlyZXR1cm4hMDtsZXQgaWU9dGlbc2Uubm9kZU5hbWVdO3JldHVybiEhKGllJiZpZS5pbmRleE9mKFkpPi0xKX0scWk9MSxQbj0yLF9pPTMsRm89NCx0YT01LE5uPTYsRXI9Nyxzcj04LExyPTksU3I9MTAsYmk9MTIsU289MTUsTmk9MjA7ZnVuY3Rpb24ga2koc2UsWSx7Y2xlYXJUaW1lb3V0OmllLHNldFRpbWVvdXQ6TGV9KXtsZXQgbHQsZm49ZnVuY3Rpb24oKXtpZShsdCksbHQ9TGUoKCk9PnNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxZKX07cmV0dXJuIGZuLmNhbmNlbD1mdW5jdGlvbigpe2llKGx0KX0sZm59Y2xhc3MgY297Y29uc3RydWN0b3IoWSxpZSl7dGhpcy5pZD1ZLHRoaXMubGlzdGVuZXI9e30sdGhpcy5lbWl0Q2FjaGU9W10saWUmJk9iamVjdC5rZXlzKGllKS5mb3JFYWNoKExlPT57dGhpcy5vbihMZSxpZVtMZV0pfSl9ZW1pdChZLC4uLmllKXtsZXQgTGU9dGhpcy5saXN0ZW5lcltZXTtpZighTGUpcmV0dXJuIHRoaXMuZW1pdENhY2hlLnB1c2goe2V2ZW50TmFtZTpZLGFyZ3M6aWV9KTtMZS5mb3JFYWNoKGx0PT57bHQuZm4uYXBwbHkobHQuZm4saWUpfSksdGhpcy5saXN0ZW5lcltZXT1MZS5maWx0ZXIobHQ9Pmx0LnR5cGUhPT0ib25jZSIpfW9uKFksaWUpe3RoaXMuX2FkZExpc3RlbmVyKFksIm9uIixpZSksdGhpcy5fY2xlYXJDYWNoZShZKX1vbmNlKFksaWUpe3RoaXMuX2FkZExpc3RlbmVyKFksIm9uY2UiLGllKSx0aGlzLl9jbGVhckNhY2hlKFkpfW9mZihZLGllKXtsZXQgTGU9dGhpcy5saXN0ZW5lcltZXTtpZighIUxlKWlmKGllKWZvcihsZXQgbHQ9MDtsdDxMZS5sZW5ndGg7KUxlW2x0XS5mbj09PWllJiYoTGUuc3BsaWNlKGx0LDEpLGx0LS0pLGx0Kys7ZWxzZSBkZWxldGUgdGhpcy5saXN0ZW5lcltZXX1fY2xlYXJDYWNoZShZKXtmb3IobGV0IGllPTA7aWU8dGhpcy5lbWl0Q2FjaGUubGVuZ3RoO2llKyspe2xldCBMZT10aGlzLmVtaXRDYWNoZVtpZV0sbHQ9WT9MZS5ldmVudE5hbWU9PT1ZP1k6bnVsbDpMZS5ldmVudE5hbWU7aWYoIWx0KWNvbnRpbnVlO2lmKHR5cGVvZiB0aGlzLmVtaXQuYXBwbHkodGhpcyxbbHQsLi4uTGUuYXJnc10pPT0ibnVtYmVyIil7dGhpcy5lbWl0Q2FjaGUucG9wKCk7Y29udGludWV9dGhpcy5lbWl0Q2FjaGUuc3BsaWNlKGllLDEpLGllLS19fV9hZGRMaXN0ZW5lcihZLGllLExlKXsodGhpcy5saXN0ZW5lcltZXXx8KHRoaXMubGlzdGVuZXJbWV09W10pKS5wdXNoKHtmbjpMZSx0eXBlOmllfSl9fWxldCBNPVtSbixxdCxmdCxxLE1uLFhuLEtlLFhlLGh0LGhuLExuLEFuLGduLHByLCRuLHZyLGFyLHZpLFdyXTtmdW5jdGlvbiBXKHNlKXtyZXR1cm5bcXQsZnRdLmluZGV4T2Yoc2UpPi0xfWZ1bmN0aW9uIGxlKHNlKXtyZXR1cm4gTS5pbmRleE9mKHNlKT4tMX1sZXQgJGU9W2Z0LHEsbmUsc24sbG4sd2ksenIsRW4sUm4scXQsbW4sTW4sQWksWG4sS2UsWGUsaHQsaG4sTG4sZ24sQW4scHIsJG4sdnIsYXIsdmksV3JdO2Z1bmN0aW9uIHplKHNlLFksaWU9ITApe3JldHVybiBpZSYmIWQuaXNGdW5jdGlvbihZKT8hMTokZS5pbmRleE9mKHNlKT4tMT8hMDpzZS5pbmRleE9mKCJvbiIpPT09MH1sZXQgYXQsUXQ9W107ZnVuY3Rpb24gSnQoc2Upe2lmKGF0KXJldHVybiBzZShhdCk7UXQucHVzaChzZSl9ZnVuY3Rpb24gT3Ioc2Upe2F0PXNlLFF0LmZvckVhY2goWT0+WShzZSkpfWxldCBJaT1MYSgoc2UsWSk9PntpZihkLmlzRnVuY3Rpb24oc2UuX2NvbXBvbmVudC5vbkVycm9yKSlyZXR1cm4gWShzZSl9KSxocj1mdW5jdGlvbigpe307aHIucHJvdG90eXBlPXtvbjpmdW5jdGlvbihzZSxZLGllKXt2YXIgTGU9dGhpcy5lfHwodGhpcy5lPXt9KTtyZXR1cm4oTGVbc2VdfHwoTGVbc2VdPVtdKSkucHVzaCh7Zm46WSxjdHg6aWV9KSx0aGlzfSxvbmNlOmZ1bmN0aW9uKHNlLFksaWUpe3ZhciBMZT10aGlzO2Z1bmN0aW9uIGx0KCl7TGUub2ZmKHNlLGx0KSxZLmFwcGx5KGllLGFyZ3VtZW50cyl9cmV0dXJuIGx0Ll89WSx0aGlzLm9uKHNlLGx0LGllKX0sZW1pdDpmdW5jdGlvbihzZSl7dmFyIFk9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaWU9KCh0aGlzLmV8fCh0aGlzLmU9e30pKVtzZV18fFtdKS5zbGljZSgpLExlPTAsbHQ9aWUubGVuZ3RoO2ZvcihMZTtMZTxsdDtMZSsrKWllW0xlXS5mbi5hcHBseShpZVtMZV0uY3R4LFkpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24oc2UsWSl7dmFyIGllPXRoaXMuZXx8KHRoaXMuZT17fSksTGU9aWVbc2VdLGx0PVtdO2lmKExlJiZZKXtmb3IodmFyIGZuPUxlLmxlbmd0aC0xO2ZuPj0wO2ZuLS0paWYoTGVbZm5dLmZuPT09WXx8TGVbZm5dLmZuLl89PT1ZKXtMZS5zcGxpY2UoZm4sMSk7YnJlYWt9bHQ9TGV9cmV0dXJuIGx0Lmxlbmd0aD9pZVtzZV09bHQ6ZGVsZXRlIGllW3NlXSx0aGlzfX07dmFyIFByPWhyO2xldCBSaT17YmxhY2s6InJnYmEoMCwwLDAsMC40KSIsd2hpdGU6InJnYmEoMjU1LDI1NSwyNTUsMC40KSJ9O2Z1bmN0aW9uIEV0KHNlKXtyZXR1cm4gc2UmJnNlIGluIFJpP1JpW3NlXTpzZX1mdW5jdGlvbiBEdChzZSl7cmV0dXJuIHNlPT09ImJsYWNrIj8iIzAwMDAwMCI6IiNmZmZmZmYifWZ1bmN0aW9uIG5pKHNlLFksaWUpe2lmKGQuaXNTdHJpbmcoWSkmJlkuc3RhcnRzV2l0aCgiQCIpKXtsZXQgTGU9WS5yZXBsYWNlKCJAIiwiIiksbHQ9c2VbTGVdfHxZO3N3aXRjaChpZSl7Y2FzZSJ0aXRsZUNvbG9yIjpsdD1EdChsdCk7YnJlYWs7Y2FzZSJib3JkZXJTdHlsZSI6bHQ9RXQobHQpO2JyZWFrfXJldHVybiBsdH1yZXR1cm4gWX1mdW5jdGlvbiB3byhzZSxZPXt9LGllPSJsaWdodCIpe2xldCBMZT1ZW2llXSxsdD17fTtyZXR1cm4gdHlwZW9mIExlPT0idW5kZWZpbmVkInx8IXNlP3NlOihPYmplY3Qua2V5cyhzZSkuZm9yRWFjaChmbj0+e2xldCBOcj1zZVtmbl0sd3I9KCk9PmQuaXNQbGFpbk9iamVjdChOcik/d28oTnIsWSxpZSk6ZC5pc0FycmF5KE5yKT9Oci5tYXAoSmk9PnR5cGVvZiBKaT09Im9iamVjdCI/d28oSmksWSxpZSk6bmkoTGUsSmkpKTpuaShMZSxOcixmbik7bHRbZm5dPXdyKCl9KSxsdCl9dmFyIEFvPXtpbnZva2VBcnJheUZuczpfcixpc1VuaUxpZmVjeWNsZUhvb2s6emUsZGVjb2RlZFF1ZXJ5OlRpLE9OX0xPQUQ6cXQsT05fU0hPVzpmdCxMSU5FRkVFRDpfLFJFTkRFUkpTX01PRFVMRVM6VW4sZm9ybWF0TG9nOm1pLFdYU19QUk9UT0NPTDpZdCxXWFNfTU9EVUxFUzpPdCxVbmlMaWZlY3ljbGVIb29rczokZSxPTl9FUlJPUjpzbixpbnZva2VDcmVhdGVFcnJvckhhbmRsZXI6SWksaW52b2tlQ3JlYXRlVnVlQXBwSG9vazpPcixwYXJzZU5WdWVEYXRhc2V0OmlvLG9uY2U6TGEsSTE4Tl9KU09OX0RFTElNSVRFUlM6eSxFbWl0dGVyOlByLG5vcm1hbGl6ZVN0eWxlczp3byxhZGRMZWFkaW5nU2xhc2g6Q2kscmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlOkhpLHJlbW92ZUxlYWRpbmdTbGFzaDpRbixPTl9SRVNJWkU6QWksT05fQVBQX0VOVEVSX0ZPUkVHUk9VTkQ6eHIsT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQ6cm8sT05fSElERTpxLE9OX1BBR0VfU0NST0xMOktlLE9OX1JFQUNIX0JPVFRPTTpodCxTQ0hFTUVfUkU6QmUsREFUQV9SRTpTdCxjYWNoZVN0cmluZ0Z1bmN0aW9uOnlvLHBhcnNlUXVlcnk6Q3IsY2FsbE9wdGlvbnM6ZHIsT05fVU5IQU5ETEVfUkVKRUNUSU9OOnpyLE9OX1BBR0VfTk9UX0ZPVU5EOndpLFBSSU1BUllfQ09MT1I6SSxnZXRMZW46R3IsT05fVEhFTUVfQ0hBTkdFOmxuLFRBQkJBUl9IRUlHSFQ6YixOQVZCQVJfSEVJR0hUOkMsc29ydE9iamVjdDpYbyxPRkZfVEhFTUVfQ0hBTkdFOmJuLE9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0U6Wm4sbm9ybWFsaXplVGFiQmFyU3R5bGVzOkV0LE9OX05BVklHQVRJT05fQkFSX0JVVFRPTl9UQVA6JG4sc3RyaW5naWZ5UXVlcnk6TW8sZGVib3VuY2U6a2ksT05fUFVMTF9ET1dOX1JFRlJFU0g6aG4sT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NIQU5HRUQ6YXIsT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NPTkZJUk1FRDp2aSxPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ0xJQ0tFRDp2cixPTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfRk9DVVNfQ0hBTkdFRDpXcixPTl9CQUNLX1BSRVNTOlhuLFVuaU5vZGU6c28sTk9ERV9UWVBFX1BBR0U6am4sQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEU6cWksQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEVEOlBuLEFDVElPTl9UWVBFX1BBR0VfU0NST0xMOlNvLEFDVElPTl9UWVBFX0lOU0VSVDpGbyxBQ1RJT05fVFlQRV9DUkVBVEU6X2ksQUNUSU9OX1RZUEVfUkVNT1ZFOnRhLEFDVElPTl9UWVBFX0FERF9FVkVOVDpzcixBQ1RJT05fVFlQRV9BRERfV1hTX0VWRU5UOmJpLEFDVElPTl9UWVBFX1JFTU9WRV9FVkVOVDpMcixBQ1RJT05fVFlQRV9TRVRfQVRUUklCVVRFOk5uLEFDVElPTl9UWVBFX1JFTU9WRV9BVFRSSUJVVEU6RXIsQUNUSU9OX1RZUEVfU0VUX1RFWFQ6U3IsT05fUkVBRFk6bW4sT05fVU5MT0FEOk1uLEV2ZW50Q2hhbm5lbDpjbyxPTl9SRUFDSF9CT1RUT01fRElTVEFOQ0U6ZyxwYXJzZVVybDpCcixvbkNyZWF0ZVZ1ZUFwcDpKdCxPTl9UQUJfSVRFTV9UQVA6WGUsT05fTEFVTkNIOm5lLEFDVElPTl9UWVBFX0VWRU5UOk5pLGNyZWF0ZVVuaUV2ZW50OnppLE9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0Q6Wm8sV0VCX0lOVk9LRV9BUFBTRVJWSUNFOkd0LGlzUm9vdEhvb2s6bGUsaXNSb290SW1tZWRpYXRlSG9vazpXLFVuaUlucHV0RWxlbWVudDpicixVbmlUZXh0QXJlYUVsZW1lbnQ6TXIsVW5pRWxlbWVudDpmaSxVbmlUZXh0Tm9kZTpsbyxVbmlDb21tZW50Tm9kZTp1aSxmb3JjZVBhdGNoUHJvcDp5cixKU09OX1BST1RPQ09MOlIscmVzb2x2ZU93bmVyRWw6bXIsQVRUUl9WX09XTkVSX0lEOkxvLEFUVFJfVl9SRU5ERVJKUzpZaX07cmV0dXJuIEFvfShmKTtyZXR1cm4gb312YXIgUkk9MTtmdW5jdGlvbiB4digpe3JldHVybihSSSsrKS50b1N0cmluZygpfXZhciBuZD1mPT5mJiZKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGYpKXx8ZjtmdW5jdGlvbiBRYyhmKXtsZXQgbz1ncyhmKTtyZXR1cm4gby5zdWJzdHJpbmcoOCxvLmxlbmd0aC0xKX1mdW5jdGlvbiByZChmKXtpZighV24oYnRvYSkpcmV0dXJuIiI7bGV0IG89QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGYpLGQ9PlN0cmluZy5mcm9tQ2hhckNvZGUoZCkpLmpvaW4oIiIpO3JldHVybiBidG9hKG8pfWZ1bmN0aW9uIGV1KGYpe2lmKCFmfHx0eXBlb2YgZiE9Im9iamVjdCIpcmV0dXJuITA7Zm9yKGxldCBvIGluIGYpaWYoSWwoZixvKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgV3U9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxHdT17fTtmdW5jdGlvbiBCdigpe1d1LmZvckVhY2goZj0+e2xldCBvPVd1LmluZGV4T2YoZik7R3VbZl09e30sV3UuZm9yRWFjaChkPT57V3UuaW5kZXhPZihkKTw9byYmKEd1W2ZdW2RdPSEwKX0pfSl9ZnVuY3Rpb24gb3IoZil7bGV0IG89Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gR3Vbb10mJkd1W29dW2ZdfWZ1bmN0aW9uIG5vKGYpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitmLCJfX0RFQlVHIil9ZnVuY3Rpb24gTXYoZixvLGQpe3JldHVybmAke299QCR7ZH0jJHtmfWB9dmFyIFl1PWNsYXNze2NvbnN0cnVjdG9yKG8pe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcobyksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319YWRkKG8pe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09byx0aGlzLmxhc3RDYWxsYmFja0lkfXJlbW92ZShvKXtsZXQgZD10aGlzLmNhbGxiYWNrc1tvXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW29dLGR9cmVnaXN0ZXJIb29rKG8sZCxfLEMpe2xldCBiPU12KG8sZCxfKTt0aGlzLmhvb2tzW2JdJiZjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIE92ZXJyaWRlIGFuIGV4aXN0aW5nIGNvbXBvbmVudCBob29rICIke2J9Ii5gKSx0aGlzLmhvb2tzW2JdPUN9dHJpZ2dlckhvb2sobyxkLF8sQyl7bGV0IGI9TXYobyxkLF8pLGc9dGhpcy5ob29rc1tiXTtpZighV24oZykpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEludmFsaWQgaG9vayBmdW5jdGlvbiB0eXBlICgke3R5cGVvZiBnfSkgb24gIiR7Yn0iLmApLG51bGw7bGV0IHk9bnVsbDt0cnl7eT1nLmFwcGx5KG51bGwsQ3x8W10pfWNhdGNoKEkpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICIke2J9Ii5gKSxJfXJldHVybiB5fWNvbnN1bWUobyxkLF8pe2xldCBDPXRoaXMuY2FsbGJhY2tzW29dO2lmKCh0eXBlb2YgXz09InVuZGVmaW5lZCJ8fF89PT0hMSkmJmRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tvXSxXbihDKSl0cnl7cmV0dXJuIEMuY2FsbChudWxsLGQsXyl9Y2F0Y2goYil7dGhyb3cgY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOgogJHtiLnRvU3RyaW5nKCl9YCksYn1yZXR1cm4gbmV3IEVycm9yKGBpbnZhbGlkIGNhbGxiYWNrIGlkICIke299ImApfWNsb3NlKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX19O3ZhciBxdT17fTtmdW5jdGlvbiBMdihmLG8pe2YmJihxdVtmXT1vKX1mdW5jdGlvbiBrcyhmKXtyZXR1cm4gcXVbZl19ZnVuY3Rpb24gRnYoZil7ZGVsZXRlIHF1W2ZdfWZ1bmN0aW9uIFhyKGYpe2lmKGYpe2xldCBvPXF1W2ZdO2lmKG8mJm8udGFza0NlbnRlcilyZXR1cm4gby50YXNrQ2VudGVyfXJldHVybiBudWxsfWZ1bmN0aW9uIHhJKGYpe2YuY2FsY0NsYXNzTGlzdCYmZi5jYWxjQ2xhc3NMaXN0KCl9ZnVuY3Rpb24gaWQoZixvLGQpe2xldHtkb2N1bWVudEVsZW1lbnQ6X309ZjtpZihfLnB1cmVDaGlsZHJlbi5sZW5ndGg+MHx8by5wYXJlbnROb2RlKXJldHVybjtsZXQgQz1fLmNoaWxkcmVuLGI9ZD9DLmluZGV4T2YoZCk6LTE7YjwwP0MucHVzaChvKTpDLnNwbGljZShiLDAsbyksby5ub2RlVHlwZT09PTE/KG8ucm9sZT09PSJib2R5Ij8oby5kb2NJZD1mLmlkLG8ub3duZXJEb2N1bWVudD1mLG8ucGFyZW50Tm9kZT1fLFJsKG8sXykpOihvLmNoaWxkcmVuLmZvckVhY2goZz0+e2cucGFyZW50Tm9kZT1vfSksb2QoZixvKSxSbChvLF8pLGRlbGV0ZSBmLm5vZGVNYXBbby5ub2RlSWRdKSxfLnB1cmVDaGlsZHJlbi5wdXNoKG8pLEJJKGYsbykpOihvLnBhcmVudE5vZGU9XyxmLm5vZGVNYXBbby5yZWZdPW8pfWZ1bmN0aW9uIEJJKGYsbyl7bGV0IGQ9by50b0pTT04oKTtmJiZmLnRhc2tDZW50ZXImJlduKGYudGFza0NlbnRlci5zZW5kKSYmZi50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoiY3JlYXRlQm9keSJ9LFtkXSl9ZnVuY3Rpb24gb2QoZixvKXtvLnJvbGU9ImJvZHkiLG8uZGVwdGg9MSxkZWxldGUgZi5ub2RlTWFwW28ubm9kZUlkXSxvLnJlZj0iX3Jvb3QiLGYubm9kZU1hcC5fcm9vdD1vLGYuYm9keT1vfWZ1bmN0aW9uIFJsKGYsbyl7Zi5wYXJlbnROb2RlPW8seEkoZiksby5kb2NJZCYmKGYuZG9jSWQ9by5kb2NJZCxmLm93bmVyRG9jdW1lbnQ9by5vd25lckRvY3VtZW50LGYub3duZXJEb2N1bWVudC5ub2RlTWFwW2Yubm9kZUlkXT1mLGYuZGVwdGg9by5kZXB0aCsxKSxmLmNoaWxkcmVuLmZvckVhY2goZD0+e1JsKGQsZil9KX1mdW5jdGlvbiBhZChmKXtmb3IoO2Y7KXtpZihmLm5vZGVUeXBlPT09MSlyZXR1cm4gZjtmPWYubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHNkKGYpe2Zvcig7Zjspe2lmKGYubm9kZVR5cGU9PT0xKXJldHVybiBmO2Y9Zi5wcmV2aW91c1NpYmxpbmd9fWZ1bmN0aW9uIHhsKGYsbyxkLF89ITEpe2Q8MCYmKGQ9MCk7bGV0IEM9b1tkLTFdLGI9b1tkXTtyZXR1cm4gby5zcGxpY2UoZCwwLGYpLF8mJihDJiYoQy5uZXh0U2libGluZz1mKSxmLnByZXZpb3VzU2libGluZz1DLGYubmV4dFNpYmxpbmc9YixiJiYoYi5wcmV2aW91c1NpYmxpbmc9ZikpLGR9ZnVuY3Rpb24gQmwoZixvLGQsXz0hMSl7bGV0IEM9by5pbmRleE9mKGYpO2lmKEM8MClyZXR1cm4tMTtpZihfKXtsZXQgST1vW0MtMV0sQmU9b1tDKzFdO0kmJihJLm5leHRTaWJsaW5nPUJlKSxCZSYmKEJlLnByZXZpb3VzU2libGluZz1JKX1vLnNwbGljZShDLDEpO2xldCBiPWQ7Qzw9ZCYmKGI9ZC0xKTtsZXQgZz1vW2ItMV0seT1vW2JdO3JldHVybiBvLnNwbGljZShiLDAsZiksXyYmKGcmJihnLm5leHRTaWJsaW5nPWYpLGYucHJldmlvdXNTaWJsaW5nPWcsZi5uZXh0U2libGluZz15LHkmJih5LnByZXZpb3VzU2libGluZz1mKSksQz09PWI/LTE6ZH1mdW5jdGlvbiBsZChmLG8sZD0hMSl7bGV0IF89by5pbmRleE9mKGYpO2lmKCEoXzwwKSl7aWYoZCl7bGV0IEM9b1tfLTFdLGI9b1tfKzFdO0MmJihDLm5leHRTaWJsaW5nPWIpLGImJihiLnByZXZpb3VzU2libGluZz1DKX1vLnNwbGljZShfLDEpfX12YXIgTWw9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmRlcHRoPTA7dGhpcy5ub2RlSWQ9eHYoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLnByZXZpb3VzU2libGluZz1udWxsfWRlc3Ryb3koKXtsZXQgbz1rcyh0aGlzLmRvY0lkKTtvJiYoZGVsZXRlIHRoaXMuZG9jSWQsZGVsZXRlIG8ubm9kZU1hcFt0aGlzLm5vZGVJZF0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChkPT57ZC5kZXN0cm95KCl9KX19O3ZhciBEdj17fTtmdW5jdGlvbiBjZChmLG8pe2lmKCEkaShvKXx8IW8ubGVuZ3RoKXJldHVybjtjbGFzcyBkIGV4dGVuZHMgYm97fW8uZm9yRWFjaChfPT57ZC5wcm90b3R5cGVbX109ZnVuY3Rpb24oLi4uQyl7bGV0IGI9WHIodGhpcy5kb2NJZCk7aWYoYilyZXR1cm4gYi5zZW5kKCJjb21wb25lbnQiLHtyZWY6dGhpcy5yZWYsY29tcG9uZW50OmYsbWV0aG9kOl99LEMpfX0pLER2W2ZdPWR9ZnVuY3Rpb24gVnYoZil7cmV0dXJuIER2W2ZdfWZ1bmN0aW9uIGpyKGYsbyxkLF8sQyl7bGV0IGI9e3R5cGU6ImRlY2wiLHByb3A6Zix2YWx1ZTpvLnRvU3RyaW5nKCkscmF3czpfLHNvdXJjZTpDfTtyZXR1cm4gZCYmKGIuaW1wb3J0YW50PSEwKSxifXZhciBNST0iYmFja2dyb3VuZENvbG9yIixMST0iYmFja2dyb3VuZEltYWdlIixGST1mPT57bGV0e3ZhbHVlOm8saW1wb3J0YW50OmQscmF3czpfLHNvdXJjZTpDfT1mO3JldHVybi9eIz9cUyskLy50ZXN0KG8pfHwvXnJnYmE/KC4rKSQvLnRlc3Qobyk/W2pyKE1JLG8sZCxfLEMpXTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KG8pP1tqcihMSSxvLGQsXyxDKV06W2ZdfSxEST0iV2lkdGgiLFZJPSJTdHlsZSIsVUk9IkNvbG9yIjtmdW5jdGlvbiAkSShmKXtyZXR1cm4gbz0+e2xldHtwcm9wOmQsdmFsdWU6XyxpbXBvcnRhbnQ6QyxyYXdzOmIsc291cmNlOmd9PW8seT1fLnJlcGxhY2UoL1xzKixccyovZywiLCIpLnNwbGl0KC9ccysvKSxJPVsvXltcZFwuXStcUyp8Xih0aGlufG1lZGl1bXx0aGljaykkLywvXihzb2xpZHxkYXNoZWR8ZG90dGVkfG5vbmUpJC8sL1xTKy9dLm1hcChCZT0+e2xldCBTdD15LmZpbmRJbmRleChHdD0+QmUudGVzdChHdCkpO3JldHVybiBTdDwwP251bGw6eS5zcGxpY2UoU3QsMSlbMF19KTtyZXR1cm4geS5sZW5ndGg/W29dOltqcihkK0RJLChJWzBdfHwoZi50eXBlPT09InV2dWUiPyJtZWRpdW0iOiIwIikpLnRyaW0oKSxDLGIsZyksanIoZCtWSSwoSVsxXXx8KGYudHlwZT09PSJ1dnVlIj8ibm9uZSI6InNvbGlkIikpLnRyaW0oKSxDLGIsZyksanIoZCtVSSwoSVsyXXx8IiMwMDAwMDAiKS50cmltKCksQyxiLGcpXX19dmFyIEhJPSJib3JkZXJUb3AiLGpJPSJib3JkZXJSaWdodCIsekk9ImJvcmRlckJvdHRvbSIsV0k9ImJvcmRlckxlZnQiLHVkPWY9PntsZXR7cHJvcDpvLHZhbHVlOmQsaW1wb3J0YW50Ol8scmF3czpDLHNvdXJjZTpifT1mLGc9anUobykuc3BsaXQoIi0iKVsxXTtnPXp1KGcpO2xldCB5PWQucmVwbGFjZSgvXHMqLFxzKi9nLCIsIikuc3BsaXQoL1xzKy8pO3N3aXRjaCh5Lmxlbmd0aCl7Y2FzZSAxOnJldHVybltmXTtjYXNlIDI6eS5wdXNoKHlbMF0seVsxXSk7YnJlYWs7Y2FzZSAzOnkucHVzaCh5WzFdKTticmVha31yZXR1cm5banIoSEkrZyx5WzBdLF8sQyxiKSxqcihqSStnLHlbMV0sXyxDLGIpLGpyKHpJK2cseVsyXSxfLEMsYiksanIoV0krZyx5WzNdLF8sQyxiKV19LEdJPSJib3JkZXJUb3BMZWZ0UmFkaXVzIixZST0iYm9yZGVyVG9wUmlnaHRSYWRpdXMiLHFJPSJib3JkZXJCb3R0b21SaWdodFJhZGl1cyIsSkk9ImJvcmRlckJvdHRvbUxlZnRSYWRpdXMiLEtJPWY9PntsZXR7dmFsdWU6byxpbXBvcnRhbnQ6ZCxyYXdzOl8sc291cmNlOkN9PWYsYj1vLnNwbGl0KC9ccysvKTtpZihvLmluY2x1ZGVzKCIvIikpcmV0dXJuW2ZdO3N3aXRjaChiLmxlbmd0aCl7Y2FzZSAxOnJldHVybltmXTtjYXNlIDI6Yi5wdXNoKGJbMF0sYlsxXSk7YnJlYWs7Y2FzZSAzOmIucHVzaChiWzFdKTticmVha31yZXR1cm5banIoR0ksYlswXSxkLF8sQyksanIoWUksYlsxXSxkLF8sQyksanIocUksYlsyXSxkLF8sQyksanIoSkksYlszXSxkLF8sQyldfSxaST11ZCxYST11ZCxRST0iZmxleERpcmVjdGlvbiIsZTE9ImZsZXhXcmFwIix0MT1mPT57bGV0e3ZhbHVlOm8saW1wb3J0YW50OmQscmF3czpfLHNvdXJjZTpDfT1mLGI9by5zcGxpdCgvXHMrLyksZz1bL14oY29sdW1ufGNvbHVtbi1yZXZlcnNlfHJvd3xyb3ctcmV2ZXJzZSkkLywvXihub3dyYXB8d3JhcHx3cmFwLXJldmVyc2UpJC9dLm1hcCh5PT57bGV0IEk9Yi5maW5kSW5kZXgoQmU9PnkudGVzdChCZSkpO3JldHVybiBJPDA/bnVsbDpiLnNwbGljZShJLDEpWzBdfSk7cmV0dXJuIGIubGVuZ3RoP1tmXTpbanIoUUksZ1swXXx8ImNvbHVtbiIsZCxfLEMpLGpyKGUxLGdbMV18fCJub3dyYXAiLGQsXyxDKV19LG4xPSJUb3AiLHIxPSJSaWdodCIsaTE9IkJvdHRvbSIsbzE9IkxlZnQiLFV2PWY9Pm89PntsZXR7dmFsdWU6ZCxpbXBvcnRhbnQ6XyxyYXdzOkMsc291cmNlOmJ9PW8sZz1kLnNwbGl0KC9ccysvKTtzd2l0Y2goZy5sZW5ndGgpe2Nhc2UgMTpnLnB1c2goZ1swXSxnWzBdLGdbMF0pO2JyZWFrO2Nhc2UgMjpnLnB1c2goZ1swXSxnWzFdKTticmVhaztjYXNlIDM6Zy5wdXNoKGdbMV0pO2JyZWFrfXJldHVybltqcihmK24xLGdbMF0sXyxDLGIpLGpyKGYrcjEsZ1sxXSxfLEMsYiksanIoZitpMSxnWzJdLF8sQyxiKSxqcihmK28xLGdbM10sXyxDLGIpXX0sYTE9VXYoIm1hcmdpbiIpLHMxPVV2KCJwYWRkaW5nIiksbDE9InRyYW5zaXRpb25Qcm9wZXJ0eSIsYzE9InRyYW5zaXRpb25EdXJhdGlvbiIsdTE9InRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiIsZjE9InRyYW5zaXRpb25EZWxheSIsZDE9Zj0+e2xldHt2YWx1ZTpvLGltcG9ydGFudDpkLHJhd3M6Xyxzb3VyY2U6Q309ZixiPVtdLGc7aWYoZi52YWx1ZS5pbmNsdWRlcygiY3ViaWMtYmV6aWVyIikpe2xldCB5PS9eKFxTKik/XHMqKFxkKlwuP1xkKyg/Om1zfHMpPyk/XHMqKChcUyopfGN1YmljLWJlemllclwoLipcKSk/XHMqKFxkKlwuP1xkKyg/Om1zfHMpPyk/JC87Zz1vLm1hdGNoKHkpfWVsc2V7bGV0IHk9L14oXFMqKT9ccyooXGQqXC4/XGQrKD86bXN8cyk/KT9ccyooXFMqKT9ccyooXGQqXC4/XGQrKD86bXN8cyk/KT8kLztnPW8ubWF0Y2goeSl9cmV0dXJuIGcmJihnWzFdJiZiLnB1c2goanIobDEsZ1sxXSxkLF8sQykpLGdbMl0mJmIucHVzaChqcihjMSxnWzJdLGQsXyxDKSksZ1szXSYmYi5wdXNoKGpyKHUxLGdbM10sZCxfLEMpKSxnWzRdJiZiLnB1c2goanIoZjEsZ1s0XSxkLF8sQykpKSxifTtmdW5jdGlvbiBoMShmKXtsZXQgbz0kSShmKSxkPV92KHt0cmFuc2l0aW9uOmQxLGJvcmRlcjpvLGJhY2tncm91bmQ6RkksYm9yZGVyVG9wOm8sYm9yZGVyUmlnaHQ6byxib3JkZXJCb3R0b206byxib3JkZXJMZWZ0Om8sYm9yZGVyU3R5bGU6WkksYm9yZGVyV2lkdGg6WEksYm9yZGVyQ29sb3I6dWQsYm9yZGVyUmFkaXVzOktJLG1hcmdpbjphMSxwYWRkaW5nOnMxfSxmLnR5cGUhPT0idXZ1ZSI/e2ZsZXhGbG93OnQxfTp7fSksXz17fTtyZXR1cm4gXz1kLF99dmFyIGZkLCR2PVN5bWJvbCgiZXhwYW5kZWQiKTtmdW5jdGlvbiBIdihmKXtyZXR1cm57cG9zdGNzc1BsdWdpbjoibnZ1ZTpleHBhbmQiLERlY2xhcmF0aW9uKGQpe2lmKGRbJHZdKXJldHVybjtmZHx8KGZkPWgxKGYpKTtsZXQgXz1mZFtkLnByb3BdO2lmKF8pe2xldCBDPV8oZCk7Qy5sZW5ndGg9PT0xJiZDWzBdPT09ZHx8ZC5yZXBsYWNlV2l0aChDKX1kWyR2XT0hMH19fXZhciBnMT1Idih7dHlwZToibnZ1ZSJ9KS5EZWNsYXJhdGlvbjtmdW5jdGlvbiBkZChmLG8pe2xldCBkPXRvKHtyZXBsYWNlV2l0aChDKXtfPUN9fSxwMShmLG8pKSxfPVtkXTtyZXR1cm4gZzEoZCksX31mdW5jdGlvbiBwMShmLG8pe2xldCBkPW8rIiI7cmV0dXJuIGQuaW5jbHVkZXMoIiFpbXBvcnRhbnQiKT97cHJvcDpmLHZhbHVlOmQucmVwbGFjZSgvXHMqIWltcG9ydGFudC8sIiIpLGltcG9ydGFudDohMH06e3Byb3A6Zix2YWx1ZTpkLGltcG9ydGFudDohMX19dmFyIHYxPSJ2aWV3IixtMT1bImNsaWNrIiwibG9uZ3ByZXNzIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIiwiaG9yaXpvbnRhbHBhbiIsInZlcnRpY2FscGFuIiwic3dpcGUiXTtmdW5jdGlvbiBoZChmLG8pe2xldCBkPWtzKGYpO2Qubm9kZU1hcFtvLm5vZGVJZF09b312YXIgZ2Q7ZnVuY3Rpb24ganYoZil7Z2R8fChnZD1mKX12YXIgYm89Y2xhc3MgZXh0ZW5kcyBNbHtjb25zdHJ1Y3RvcihvPXYxLGQ9e30sXyl7c3VwZXIoKTtsZXQgQz1WdihvKTtpZihDJiYhXylyZXR1cm4gbmV3IEMobyxkLCEwKTt0aGlzLm5vZGVUeXBlPTEsdGhpcy50eXBlPW8sdGhpcy5hdHRyPWQuYXR0cnx8e30sdGhpcy5zdHlsZT1kLnN0eWxlfHx7fSx0aGlzLmNsYXNzU3R5bGU9ZC5jbGFzc1N0eWxlfHx7fSx0aGlzLmNsYXNzTGlzdD1kLmNsYXNzTGlzdHx8W10sdGhpcy5zdHlsZVNoZWV0PWQuc3R5bGVTaGVldHx8e30sdGhpcy5ldmVudD17fX1hcHBlbmRDaGlsZChvKXtpZighKG8ucGFyZW50Tm9kZSYmby5wYXJlbnROb2RlIT09dGhpcykpe2lmKG8ucGFyZW50Tm9kZSl7aWYob3IoImRlYnVnIikmJm5vKGBbYXBwZW5kQ2hpbGRdKCR7dGhpcy5kb2NJZH0sJHtvLnR5cGV9LCR7by5yZWZ9KSBNb3ZlIDwke28udHlwZX0+IHRvICR7dGhpcy5jaGlsZHJlbi5sZW5ndGh9IG9mIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksQmwobyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCEwKSxvLm5vZGVUeXBlPT09MSl7bGV0IGQ9Qmwobyx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpLF89WHIodGhpcy5kb2NJZCk7aWYoXyYmZD49MClyZXR1cm4gXy5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW28ucmVmLHRoaXMucmVmLGRdKX19ZWxzZSBpZihvcigiZGVidWciKSYmbm8oYFthcHBlbmRDaGlsZF0oJHt0aGlzLmRvY0lkfSwke28udHlwZX0sJHtvLnJlZn0pIEFwcGVuZCA8JHtvLnR5cGV9PiB0byA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApLFJsKG8sdGhpcykseGwobyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCEwKSx0aGlzLmRvY0lkJiZoZCh0aGlzLmRvY0lkLG8pLG8ubm9kZVR5cGU9PT0xKXt4bChvLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCk7bGV0IGQ9WHIodGhpcy5kb2NJZCk7aWYoZClyZXR1cm4gZC5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsby50b0pTT04oKSwtMV0pfX19aW5zZXJ0QmVmb3JlKG8sZCl7aWYoIShvLnBhcmVudE5vZGUmJm8ucGFyZW50Tm9kZSE9PXRoaXMpJiYhKG89PT1kfHxvLm5leHRTaWJsaW5nJiZvLm5leHRTaWJsaW5nPT09ZCkpe2lmKG8ucGFyZW50Tm9kZSl7aWYoQmwobyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZihkKSwhMCksby5ub2RlVHlwZT09PTEpe2xldCBfPWFkKGQpLEM9Qmwobyx0aGlzLnB1cmVDaGlsZHJlbixfP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoXyk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxiPVhyKHRoaXMuZG9jSWQpO2lmKGImJkM+PTApcmV0dXJuIGIuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtvLnJlZix0aGlzLnJlZixDXSl9fWVsc2UgaWYob3IoImRlYnVnIikmJm5vKGBbaW5zZXJ0QmVmb3JlXSgke3RoaXMuZG9jSWR9LCR7by50eXBlfSwke28ucmVmfSkgSW5zZXJ0IDwke28udHlwZX0+IHRvIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSksIGJlZm9yZSAoJHtkLnJlZn0pLmApLFJsKG8sdGhpcykseGwobyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZihkKSwhMCksdGhpcy5kb2NJZCYmaGQodGhpcy5kb2NJZCxvKSxvLm5vZGVUeXBlPT09MSl7bGV0IF89YWQoZCksQz14bChvLHRoaXMucHVyZUNoaWxkcmVuLF8/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihfKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpLGI9WHIodGhpcy5kb2NJZCk7aWYoYilyZXR1cm4gYi5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsby50b0pTT04oKSxDXSl9fX1pbnNlcnRBZnRlcihvLGQpe2lmKCEoby5wYXJlbnROb2RlJiZvLnBhcmVudE5vZGUhPT10aGlzKSYmIShvPT09ZHx8by5wcmV2aW91c1NpYmxpbmcmJm8ucHJldmlvdXNTaWJsaW5nPT09ZCkpe2lmKG8ucGFyZW50Tm9kZSl7aWYoQmwobyx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZihkKSsxLCEwKSxvLm5vZGVUeXBlPT09MSl7bGV0IF89Qmwobyx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKHNkKGQpKSsxKSxDPVhyKHRoaXMuZG9jSWQpO2lmKEMmJl8+PTApcmV0dXJuIEMuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtvLnJlZix0aGlzLnJlZixfXSl9fWVsc2UgaWYob3IoImRlYnVnIikmJm5vKGBbaW5zZXJ0QWZ0ZXJdKCR7dGhpcy5kb2NJZH0sJHtvLnR5cGV9LCR7by5yZWZ9KSBJbnNlcnQgPCR7by50eXBlfT4gdG8gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KSwgYWZ0ZXIgKCR7ZC5yZWZ9KS5gKSxSbChvLHRoaXMpLHhsKG8sdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YoZCkrMSwhMCksdGhpcy5kb2NJZCYmaGQodGhpcy5kb2NJZCxvKSxvLm5vZGVUeXBlPT09MSl7bGV0IF89eGwobyx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKHNkKGQpKSsxKSxDPVhyKHRoaXMuZG9jSWQpO2lmKEMpcmV0dXJuIEMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLG8udG9KU09OKCksX10pfX19cmVtb3ZlQ2hpbGQobyxkKXtpZihvLnBhcmVudE5vZGUmJihsZChvLHRoaXMuY2hpbGRyZW4sITApLG8ubm9kZVR5cGU9PT0xKSl7b3IoImRlYnVnIikmJm5vKGBbcmVtb3ZlQ2hpbGRdKCR7dGhpcy5kb2NJZH0sJHtvLnR5cGV9LCR7by5yZWZ9KSBSZW1vdmUgPCR7by50eXBlfT4gZnJvbSA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApLGxkKG8sdGhpcy5wdXJlQ2hpbGRyZW4pO2xldCBfPVhyKHRoaXMuZG9jSWQpO18mJl8uc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW28ucmVmXSl9ZHx8by5kZXN0cm95KCl9Y2xlYXIoKXtsZXQgbz1Ycih0aGlzLmRvY0lkKTtvJiZ0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKGQ9PntvLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtkLnJlZl0pfSksdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGQ9PntkLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9c2V0QXR0cihvLGQsXyl7aWYodGhpcy5hdHRyW29dPT09ZCYmXyE9PSExKXJldHVybjt0aGlzLmF0dHJbb109ZDtsZXQgQz1Ycih0aGlzLmRvY0lkKTshXyYmQyYmQy5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZUF0dHJzIn0sW3RoaXMucmVmLHtbb106ZH1dKX1zZXRBdHRycyhvLGQpe2lmKGV1KG8pKXJldHVybjtsZXQgXz17fTtmb3IobGV0IEMgaW4gbyl0aGlzLmF0dHJbQ10hPT1vW0NdJiYodGhpcy5hdHRyW0NdPW9bQ10sX1tDXT1vW0NdKTtpZighZXUoXykpe2xldCBDPVhyKHRoaXMuZG9jSWQpOyFkJiZDJiZDLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlQXR0cnMifSxbdGhpcy5yZWYsX10pfX1zZXRTdHlsZShvLGQsXyl7ZGQobyxkKS5mb3JFYWNoKCh7cHJvcDpDLHZhbHVlOmJ9KT0+e2lmKHRoaXMuc3R5bGVbQ109PT1iJiZfIT09ITEpcmV0dXJuO3RoaXMuc3R5bGVbQ109YjtsZXQgZz1Ycih0aGlzLmRvY0lkKTshXyYmZyYmZy5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLHtbQ106Yj09PSIiJiZDIGluIHRoaXMuY2xhc3NTdHlsZT90aGlzLmNsYXNzU3R5bGVbQ106Yn1dKX0pfXNldFN0eWxlcyhvLGQpe2lmKGV1KG8pKXJldHVybjtsZXQgXz17fTtmb3IobGV0IEMgaW4gbylkZChDLG9bQ10pLmZvckVhY2goKHtwcm9wOmIsdmFsdWU6Z30pPT57dGhpcy5zdHlsZVtiXSE9PWcmJih0aGlzLnN0eWxlW2JdPWcsX1tiXT1nPT09IiImJmIgaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtiXTpnKX0pO2lmKCFldShfKSl7bGV0IEM9WHIodGhpcy5kb2NJZCk7IWQmJkMmJkMuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZixfXSl9fXNldENsYXNzU3R5bGUobyl7Zm9yKGxldCBfIGluIHRoaXMuY2xhc3NTdHlsZSl0aGlzLmNsYXNzU3R5bGVbX109IiI7dG8odGhpcy5jbGFzc1N0eWxlLG8pO2xldCBkPVhyKHRoaXMuZG9jSWQpO2QmJmQuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix0aGlzLnRvU3R5bGUoKV0pfXNldENsYXNzTGlzdChvKXtvLmxlbmd0aD09PXRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmby5maWx0ZXIoZD0+IXRoaXMuY2xhc3NMaXN0LmluY2x1ZGVzKGQpKS5sZW5ndGg9PT0wfHwodGhpcy5jbGFzc0xpc3Q9byx0aGlzLnBhcmVudE5vZGUmJnRoaXMuY2FsY0NsYXNzTGlzdCgpKX1jYWxjQ2xhc3NMaXN0KCl7dGhpcy5zZXRDbGFzc1N0eWxlKGdkKHRoaXMpKX1zZXRTdHlsZVNoZWV0KG8pe3RoaXMuc3R5bGVTaGVldD1vfWFkZEV2ZW50KG8sZCxfKXtpZih0aGlzLmV2ZW50fHwodGhpcy5ldmVudD17fSksIXRoaXMuZXZlbnRbb10pe29yKCJkZWJ1ZyIpJiZubyhgW2FkZEV2ZW50XSgke3RoaXMuZG9jSWR9LCR7dGhpcy50eXBlfSwke3RoaXMucmVmfSkgQWRkICIke299IiBldmVudCBvbiA8JHt0aGlzLnR5cGV9PiAoJHt0aGlzLnJlZn0pLmApLHRoaXMuZXZlbnRbb109e2hhbmRsZXI6ZCxwYXJhbXM6X307bGV0IEM9WHIodGhpcy5kb2NJZCk7QyYmQy5zZW5kKCJkb20iLHthY3Rpb246ImFkZEV2ZW50In0sW3RoaXMucmVmLG9dKX19cmVtb3ZlRXZlbnQobyl7aWYodGhpcy5ldmVudCYmdGhpcy5ldmVudFtvXSl7b3IoImRlYnVnIikmJm5vKGBbcmVtb3ZlRXZlbnRdKCR7dGhpcy5kb2NJZH0sJHt0aGlzLnR5cGV9LCR7dGhpcy5yZWZ9KSBSZW1vdmUgIiR7b30iIGV2ZW50IG9uIDwke3RoaXMudHlwZX0+ICgke3RoaXMucmVmfSkuYCksZGVsZXRlIHRoaXMuZXZlbnRbb107bGV0IGQ9WHIodGhpcy5kb2NJZCk7ZCYmZC5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUV2ZW50In0sW3RoaXMucmVmLG9dKX19ZmlyZUV2ZW50KG8sZCxfLEMpe2xldCBiPW51bGwsZz0hMSx5PXRoaXMuZXZlbnRbb107aWYoeSYmZCl7b3IoImRlYnVnIikmJm5vKGBbZmlyZUV2ZW50XSgke3RoaXMuZG9jSWR9LCR7dGhpcy50eXBlfSwke3RoaXMucmVmfSkgRmlyZSAiJHtvfSIgZXZlbnQgb24gPCR7dGhpcy50eXBlfT4gKCR7dGhpcy5yZWZ9KS5gKTtsZXQgST15LmhhbmRsZXI7ZC5zdG9wUHJvcGFnYXRpb249KCk9PntnPSEwfSxkLnByZXZlbnREZWZhdWx0PSgpPT57fTt0cnl7QyYmQy5wYXJhbXM/Yj1JLmNhbGwodGhpcywuLi5DLnBhcmFtcyxkKTpiPUkuY2FsbCh0aGlzLGQpfWNhdGNoKEJlKXt0aHJvdyBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW52b2tlIHRoZSBldmVudCBoYW5kbGVyIG9mICIke299IiBvbiAke3RoaXMudHlwZX0gKCR7dGhpcy5yZWZ9KToKICR7QmUudG9TdHJpbmcoKX1gKSxCZX19cmV0dXJuIWcmJl8mJm0xLmluZGV4T2YobykhPT0tMSYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50JiYoZC5jdXJyZW50VGFyZ2V0PXRoaXMucGFyZW50Tm9kZSx0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KG8sZCxfKSksYn10b1N0eWxlKCl7bGV0IG89T2JqZWN0LmFzc2lnbih7fSx0aGlzLmNsYXNzU3R5bGUpLGQ9dGhpcy5zdHlsZTtmb3IobGV0IF8gaW4gZCl7bGV0IEM9ZFtfXTtvW19dPUM9PT0iIiYmXyBpbiB0aGlzLmNsYXNzU3R5bGU/dGhpcy5jbGFzc1N0eWxlW19dOkN9cmV0dXJuIG99dG9KU09OKG89ITEpe2xldCBkPXtyZWY6dGhpcy5yZWYudG9TdHJpbmcoKSx0eXBlOnRoaXMudHlwZSxhdHRyOnRoaXMuYXR0cixzdHlsZTp0aGlzLnRvU3R5bGUoKX0sXz1bXTtmb3IobGV0IEMgaW4gdGhpcy5ldmVudCl7bGV0e3BhcmFtczpifT10aGlzLmV2ZW50W0NdO2I/Xy5wdXNoKHt0eXBlOkMscGFyYW1zOmJ9KTpfLnB1c2goQyl9cmV0dXJuIF8ubGVuZ3RoJiYoZC5ldmVudD1fKSwhbyYmdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoJiYoZC5jaGlsZHJlbj10aGlzLnB1cmVDaGlsZHJlbi5tYXAoQz0+Qy50b0pTT04oKSkpLGR9dG9TdHJpbmcoKXtyZXR1cm4iPCIrdGhpcy50eXBlKyIgYXR0cj0iK0pTT04uc3RyaW5naWZ5KHRoaXMuYXR0cikrIiBzdHlsZT0iK0pTT04uc3RyaW5naWZ5KHRoaXMudG9TdHlsZSgpKSsiPiIrdGhpcy5wdXJlQ2hpbGRyZW4ubWFwKG89Pm8udG9TdHJpbmcoKSkuam9pbigiIikrIjwvIit0aGlzLnR5cGUrIj4ifX07ZnVuY3Rpb24genYoZil7bGV0IG89ZiYmZi5fX3ZfcmF3O3JldHVybiBvP3p2KG8pOmZ9ZnVuY3Rpb24gV3YoZil7bGV0IG89UWMoZik7c3dpdGNoKG8pe2Nhc2UiVW5kZWZpbmVkIjpjYXNlIk51bGwiOnJldHVybiIiO2Nhc2UiUmVnRXhwIjpyZXR1cm4gZi50b1N0cmluZygpO2Nhc2UiRGF0ZSI6cmV0dXJuIGYudG9JU09TdHJpbmcoKTtjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiQm9vbGVhbiI6Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOnJldHVybiB6dihmKTtjYXNlIkFycmF5QnVmZmVyIjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTpvLGJhc2U2NDpyZChmKX07Y2FzZSJJbnQ4QXJyYXkiOmNhc2UiVWludDhBcnJheSI6Y2FzZSJVaW50OENsYW1wZWRBcnJheSI6Y2FzZSJJbnQxNkFycmF5IjpjYXNlIlVpbnQxNkFycmF5IjpjYXNlIkludDMyQXJyYXkiOmNhc2UiVWludDMyQXJyYXkiOmNhc2UiRmxvYXQzMkFycmF5IjpjYXNlIkZsb2F0NjRBcnJheSI6cmV0dXJueyJAdHlwZSI6ImJpbmFyeSIsZGF0YVR5cGU6byxiYXNlNjQ6cmQoZi5idWZmZXIpfTtkZWZhdWx0OnJldHVybiBKU09OLnN0cmluZ2lmeShmKX19dmFyIEp1PWZ1bmN0aW9uKCl7fSx3Yz1jbGFzc3tjb25zdHJ1Y3RvcihvLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbnN0YW5jZUlkIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpTdHJpbmcobyl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FsbGJhY2tNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpuZXcgWXUobyl9KSxKdT1kfHxmdW5jdGlvbigpe319Y2FsbGJhY2sobyxkLF8pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKG8sZCxfKX1yZWdpc3Rlckhvb2sobyxkLF8sQyl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLnJlZ2lzdGVySG9vayhvLGQsXyxDKX10cmlnZ2VySG9vayhvLGQsXyxDKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIudHJpZ2dlckhvb2sobyxkLF8sQyl9dXBkYXRlRGF0YShvLGQsXyl7dGhpcy5zZW5kKCJtb2R1bGUiLHttb2R1bGU6ImRvbSIsbWV0aG9kOiJ1cGRhdGVDb21wb25lbnREYXRhIn0sW28sZCxfXSl9ZGVzdHJveUNhbGxiYWNrKCl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNsb3NlKCl9bm9ybWFsaXplKG8sZD0hMSl7bGV0IF89UWMobyk7aWYobyYmbyBpbnN0YW5jZW9mIGJvKXJldHVybiBvLnJlZjtpZihvJiZvLiRlbCBpbnN0YW5jZW9mIGJvKXJldHVybiBvLiRlbC5yZWY7aWYoXz09PSJGdW5jdGlvbiIpcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZChvKS50b1N0cmluZygpO2lmKGQpe2lmKF89PT0iT2JqZWN0Iil7bGV0IEM9e307Zm9yKGxldCBiIGluIG8pQ1tiXT10aGlzLm5vcm1hbGl6ZShvW2JdLCEwKTtyZXR1cm4gQ31pZihfPT09IkFycmF5IilyZXR1cm4gby5tYXAoQz0+dGhpcy5ub3JtYWxpemUoQywhMCkpfXJldHVybiBvJiZvLnJlZiYmb1siW1tWaXJ0dWFsRWxlbWVudF1dIl0/by5yZWY6V3Yobyl9c2VuZChvLGQsXyxDKXtsZXR7YWN0aW9uOmIsY29tcG9uZW50OmcscmVmOnksbW9kdWxlOkksbWV0aG9kOkJlfT1kO3N3aXRjaChfPV8ubWFwKFN0PT50aGlzLm5vcm1hbGl6ZShTdCxvIT09Im1vZHVsZSIpKSxRYyhDKT09PSJPYmplY3QiJiYoQz10aGlzLm5vcm1hbGl6ZShDLCEwKSksbyl7Y2FzZSJkb20iOnJldHVybiBvcigiZGVidWciKSYmbm8oYFt0YXNrXSgke3RoaXMuaW5zdGFuY2VJZH0sJHtvfSwke2J9KSAke0pTT04uc3RyaW5naWZ5KF8pfWApLHRoaXNbYl0odGhpcy5pbnN0YW5jZUlkLF8pO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCx5LEJlLF8sdG8oe2NvbXBvbmVudDpnfSxDKSk7ZGVmYXVsdDpyZXR1cm4gb3IoImRlYnVnIikmJm5vKGBbdGFza10oJHt0aGlzLmluc3RhbmNlSWR9LCR7SX0sJHtCZX0pICR7SlNPTi5zdHJpbmdpZnkoXyl9YCksdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxJLEJlLF8sQyl9fWNhbGxET00obyxkKXtyZXR1cm4gdGhpc1tvXSh0aGlzLmluc3RhbmNlSWQsZCl9Y2FsbENvbXBvbmVudChvLGQsXyxDKXtyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxvLGQsXyxDKX1jYWxsTW9kdWxlKG8sZCxfLEMpe3JldHVybiB0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLG8sZCxfLEMpfX07ZnVuY3Rpb24gR3YoKXtsZXQgZj17Y3JlYXRlRmluaXNoOmdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLHVwZGF0ZUZpbmlzaDpnbG9iYWwuY2FsbFVwZGF0ZUZpbmlzaCxyZWZyZXNoRmluaXNoOmdsb2JhbC5jYWxsUmVmcmVzaEZpbmlzaCxjcmVhdGVCb2R5Omdsb2JhbC5jYWxsQ3JlYXRlQm9keSxhZGRFbGVtZW50Omdsb2JhbC5jYWxsQWRkRWxlbWVudCxyZW1vdmVFbGVtZW50Omdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbE1vdmVFbGVtZW50LHVwZGF0ZUF0dHJzOmdsb2JhbC5jYWxsVXBkYXRlQXR0cnMsdXBkYXRlU3R5bGU6Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxhZGRFdmVudDpnbG9iYWwuY2FsbEFkZEV2ZW50LHJlbW92ZUV2ZW50Omdsb2JhbC5jYWxsUmVtb3ZlRXZlbnQsX191cGRhdGVDb21wb25lbnREYXRhOmdsb2JhbC5fX3VwZGF0ZUNvbXBvbmVudERhdGF9LG89d2MucHJvdG90eXBlO2ZvcihsZXQgZCBpbiBmKXtsZXQgXz1mW2RdO29bZF09Xz8oQyxiKT0+XyhDLC4uLmIpOihDLGIpPT5KdShDLFt7bW9kdWxlOiJkb20iLG1ldGhvZDpkLGFyZ3M6Yn1dLCItMSIpfW8uY29tcG9uZW50SGFuZGxlcj1nbG9iYWwuY2FsbE5hdGl2ZUNvbXBvbmVudHx8KChkLF8sQyxiLGcpPT5KdShkLFt7Y29tcG9uZW50OmcuY29tcG9uZW50LHJlZjpfLG1ldGhvZDpDLGFyZ3M6Yn1dKSksby5tb2R1bGVIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlTW9kdWxlfHwoKGQsXyxDLGIpPT5KdShkLFt7bW9kdWxlOl8sbWV0aG9kOkMsYXJnczpifV0pKX1mdW5jdGlvbiBfMShmLG8sZCxfLEMsYil7bGV0IGc9Zi5nZXRSZWYobyk7aWYoZylyZXR1cm4gZi5maXJlRXZlbnQoZyxkLF8sQyxiKTtpZihfKXJldHVybiBfLl9ub2RlSWQ9byxmLmZpcmVFdmVudChmLmdldFJlZigiX2RvY3VtZW50RWxlbWVudCIpLGQsXyxDLGIpfWZ1bmN0aW9uIGIxKGYsbyxkLF8pe3JldHVybiBmLnRhc2tDZW50ZXIuY2FsbGJhY2sobyxkLF8pfWZ1bmN0aW9uIHkxKGYsbyxkLF8sQyl7aWYoIWZ8fCFmLnRhc2tDZW50ZXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIENhbid0IGZpbmQgImRvY3VtZW50IiBvciAidGFza0NlbnRlciIuYCksbnVsbDtsZXQgYj1udWxsO3RyeXtiPWYudGFza0NlbnRlci50cmlnZ2VySG9vayhvLGQsXyxDKX1jYXRjaChnKXt0aHJvdyBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gdHJpZ2dlciB0aGUgIiR7ZH1AJHtffSIgaG9vayBvbiAke299LmApLGd9cmV0dXJuIGJ9ZnVuY3Rpb24gcGQoZixvKXtsZXQgZD1rcyhmKTtpZighZClyZXR1cm4gbmV3IEVycm9yKGBbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVjZWl2ZVRhc2tzLCBpbnN0YW5jZSAoJHtmfSkgaXMgbm90IGF2YWlsYWJsZS5gKTtpZigkaShvKSlyZXR1cm4gby5tYXAoXz0+e3N3aXRjaChfLm1ldGhvZCl7Y2FzZSJjYWxsYmFjayI6cmV0dXJuIGIxKGQsLi4uXy5hcmdzKTtjYXNlImZpcmVFdmVudFN5bmMiOmNhc2UiZmlyZUV2ZW50IjpyZXR1cm4gXzEoZCwuLi5fLmFyZ3MpO2Nhc2UiY29tcG9uZW50SG9vayI6cmV0dXJuIHkxKGQsLi4uXy5hcmdzKX19KX12YXIgS3M9e307ZnVuY3Rpb24gWXYoZj17fSl7Zm9yKGxldCBvIGluIGYpSWwoS3Msbyl8fChLc1tvXT17fSksISEkaShmW29dKSYmZltvXS5mb3JFYWNoKGQ9PntsaShkKT9Lc1tvXVtkXT0hMDpTYyhkKSYmbGkoZC5uYW1lKSYmKEtzW29dW2QubmFtZV09ZC5hcmdzfHxbXSl9KX1mdW5jdGlvbiBLdShmLG8pe3JldHVybiBsaShvKT8hIShLc1tmXSYmS3NbZl1bb10pOiEhS3NbZl19ZnVuY3Rpb24gcXYoZil7cmV0dXJuIEtzW2ZdfXZhciB2ZD17fTtmdW5jdGlvbiBKdihmKXshJGkoZil8fGYuZm9yRWFjaChvPT57IW98fChsaShvKT92ZFtvXT0hMDpTYyhvKSYmbGkoby50eXBlKSYmKHZkW28udHlwZV09byxjZChvLnR5cGUsby5tZXRob2RzKSkpfSl9ZnVuY3Rpb24gbWQoZil7cmV0dXJuISF2ZFtmXX12YXIgWnM9W107ZnVuY3Rpb24gWnUoZixvKXtfZChmKT9jb25zb2xlLndhcm4oYFNlcnZpY2UgIiR7Zn0iIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYWxyZWFkeSFgKToobz10byh7fSxvKSxacy5wdXNoKHtuYW1lOmYsb3B0aW9uczpvfSkpfWZ1bmN0aW9uIFh1KGYpe1pzLnNvbWUoKG8sZCk9PntpZihvLm5hbWU9PT1mKXJldHVybiBacy5zcGxpY2UoZCwxKSwhMH0pfWZ1bmN0aW9uIF9kKGYpe3JldHVybiBFMShmKT49MH1mdW5jdGlvbiBFMShmKXtyZXR1cm4gWnMubWFwKG89Pm8ubmFtZSkuaW5kZXhPZihmKX1mdW5jdGlvbiBTMShmKXtyZXR1cm4gbz0+e2xldCBkPVV1KGYsbykse2NyZWF0ZUFwcDpffT1kO2QuY3JlYXRlVnVlQXBwPWQuY3JlYXRlQXBwPShDLGIpPT5fKEMsYikudXNlKHcxLG8pLG8uVnVlPWR9fXZhciB3MT17aW5zdGFsbChmLG8pe0ExKGYsbyksWmMobykuaW5pdEFwcChmKX19O2Z1bmN0aW9uIEExKGYsbyl7bGV0e21vdW50OmR9PWY7Zi5tb3VudD1fPT57bGV0IEM9ZChfKTtyZXR1cm4gXz09PSIjYXBwIiYmby5fX3JlZ2lzdGVyQXBwKEMpLEN9fWZ1bmN0aW9uIEMxKGYpe2xldHtVbmlTaGFyZWQ6byxWdWVTaGFyZWQ6ZCxWdWVSZWFjdGl2aXR5Ol99PWY7dmFyIEM9ZnVuY3Rpb24oYixnLHksSSl7InVzZSBzdHJpY3QiO3ZhciBCZT1bXTtmdW5jdGlvbiBTdChpKXt5LnBhdXNlVHJhY2tpbmcoKTtmb3IodmFyIGw9QmUubGVuZ3RoP0JlW0JlLmxlbmd0aC0xXS5jb21wb25lbnQ6bnVsbCxoPWwmJmwuYXBwQ29udGV4dC5jb25maWcud2FybkhhbmRsZXIsdj1HdCgpLEE9YXJndW1lbnRzLmxlbmd0aCxUPW5ldyBBcnJheShBPjE/QS0xOjApLGs9MTtrPEE7aysrKVRbay0xXT1hcmd1bWVudHNba107aWYoaClzbihoLGwsMTEsW2krVC5tYXAoaj0+e3ZhciBaLGZlO3JldHVybihmZT0oWj1qLnRvU3RyaW5nKT09bnVsbD92b2lkIDA6Wi5jYWxsKGopKSE9bnVsbD9mZTpKU09OLnN0cmluZ2lmeShqKX0pLmpvaW4oIiIpLGwmJmwucHJveHksdi5tYXAoaj0+e3Zhcnt2bm9kZTpafT1qO3JldHVybiJhdCA8Ii5jb25jYXQoaGwobCxaLnR5cGUpLCI+Iil9KS5qb2luKGAKYCksdl0pO2Vsc2V7dmFyIEQ9WyJbVnVlIHdhcm5dOiAiLmNvbmNhdChpKSwuLi5UXTt2Lmxlbmd0aCYmRC5wdXNoKGAKYCwuLi5ZdCh2KSksY29uc29sZS53YXJuKC4uLkQpfXkucmVzZXRUcmFja2luZygpfWZ1bmN0aW9uIEd0KCl7dmFyIGk9QmVbQmUubGVuZ3RoLTFdO2lmKCFpKXJldHVybltdO2Zvcih2YXIgbD1bXTtpOyl7dmFyIGg9bFswXTtoJiZoLnZub2RlPT09aT9oLnJlY3Vyc2VDb3VudCsrOmwucHVzaCh7dm5vZGU6aSxyZWN1cnNlQ291bnQ6MH0pO3ZhciB2PWkuY29tcG9uZW50JiZpLmNvbXBvbmVudC5wYXJlbnQ7aT12JiZ2LnZub2RlfXJldHVybiBsfWZ1bmN0aW9uIFl0KGkpe3ZhciBsPVtdO3JldHVybiBpLmZvckVhY2goKGgsdik9PntsLnB1c2goLi4udj09PTA/W106W2AKYF0sLi4uUihoKSl9KSxsfWZ1bmN0aW9uIFIoaSl7dmFye3Zub2RlOmwscmVjdXJzZUNvdW50Omh9PWksdj1oPjA/Ii4uLiAoIi5jb25jYXQoaCwiIHJlY3Vyc2l2ZSBjYWxscykiKToiIixBPWwuY29tcG9uZW50P2wuY29tcG9uZW50LnBhcmVudD09bnVsbDohMSxUPSIgYXQgPCIuY29uY2F0KGhsKGwuY29tcG9uZW50LGwudHlwZSxBKSksaz0iPiIrdjtyZXR1cm4gbC5wcm9wcz9bVCwuLi5PdChsLnByb3BzKSxrXTpbVCtrXX1mdW5jdGlvbiBPdChpKXt2YXIgbD1bXSxoPU9iamVjdC5rZXlzKGkpO3JldHVybiBoLnNsaWNlKDAsMykuZm9yRWFjaCh2PT57bC5wdXNoKC4uLlVuKHYsaVt2XSkpfSksaC5sZW5ndGg+MyYmbC5wdXNoKCIgLi4uIiksbH1mdW5jdGlvbiBVbihpLGwsaCl7cmV0dXJuIGcuaXNTdHJpbmcobCk/KGw9SlNPTi5zdHJpbmdpZnkobCksaD9sOlsiIi5jb25jYXQoaSwiPSIpLmNvbmNhdChsKV0pOnR5cGVvZiBsPT0ibnVtYmVyInx8dHlwZW9mIGw9PSJib29sZWFuInx8bD09bnVsbD9oP2w6WyIiLmNvbmNhdChpLCI9IikuY29uY2F0KGwpXTp5LmlzUmVmKGwpPyhsPVVuKGkseS50b1JhdyhsLnZhbHVlKSwhMCksaD9sOlsiIi5jb25jYXQoaSwiPVJlZjwiKSxsLCI+Il0pOmcuaXNGdW5jdGlvbihsKT9bIiIuY29uY2F0KGksIj1mbiIpLmNvbmNhdChsLm5hbWU/IjwiLmNvbmNhdChsLm5hbWUsIj4iKToiIildOihsPXkudG9SYXcobCksaD9sOlsiIi5jb25jYXQoaSwiPSIpLGxdKX1mdW5jdGlvbiBmdChpLGwpe312YXIgcT17U0VUVVBfRlVOQ1RJT046MCwiMCI6IlNFVFVQX0ZVTkNUSU9OIixSRU5ERVJfRlVOQ1RJT046MSwiMSI6IlJFTkRFUl9GVU5DVElPTiIsV0FUQ0hfR0VUVEVSOjIsIjIiOiJXQVRDSF9HRVRURVIiLFdBVENIX0NBTExCQUNLOjMsIjMiOiJXQVRDSF9DQUxMQkFDSyIsV0FUQ0hfQ0xFQU5VUDo0LCI0IjoiV0FUQ0hfQ0xFQU5VUCIsTkFUSVZFX0VWRU5UX0hBTkRMRVI6NSwiNSI6Ik5BVElWRV9FVkVOVF9IQU5ETEVSIixDT01QT05FTlRfRVZFTlRfSEFORExFUjo2LCI2IjoiQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVIiLFZOT0RFX0hPT0s6NywiNyI6IlZOT0RFX0hPT0siLERJUkVDVElWRV9IT09LOjgsIjgiOiJESVJFQ1RJVkVfSE9PSyIsVFJBTlNJVElPTl9IT09LOjksIjkiOiJUUkFOU0lUSU9OX0hPT0siLEFQUF9FUlJPUl9IQU5ETEVSOjEwLCIxMCI6IkFQUF9FUlJPUl9IQU5ETEVSIixBUFBfV0FSTl9IQU5ETEVSOjExLCIxMSI6IkFQUF9XQVJOX0hBTkRMRVIiLEZVTkNUSU9OX1JFRjoxMiwiMTIiOiJGVU5DVElPTl9SRUYiLEFTWU5DX0NPTVBPTkVOVF9MT0FERVI6MTMsIjEzIjoiQVNZTkNfQ09NUE9ORU5UX0xPQURFUiIsU0NIRURVTEVSOjE0LCIxNCI6IlNDSEVEVUxFUiJ9LG5lPXtzcDoic2VydmVyUHJlZmV0Y2ggaG9vayIsYmM6ImJlZm9yZUNyZWF0ZSBob29rIixjOiJjcmVhdGVkIGhvb2siLGJtOiJiZWZvcmVNb3VudCBob29rIixtOiJtb3VudGVkIGhvb2siLGJ1OiJiZWZvcmVVcGRhdGUgaG9vayIsdToidXBkYXRlZCIsYnVtOiJiZWZvcmVVbm1vdW50IGhvb2siLHVtOiJ1bm1vdW50ZWQgaG9vayIsYToiYWN0aXZhdGVkIGhvb2siLGRhOiJkZWFjdGl2YXRlZCBob29rIixlYzoiZXJyb3JDYXB0dXJlZCBob29rIixydGM6InJlbmRlclRyYWNrZWQgaG9vayIscnRnOiJyZW5kZXJUcmlnZ2VyZWQgaG9vayIsWzBdOiJzZXR1cCBmdW5jdGlvbiIsWzFdOiJyZW5kZXIgZnVuY3Rpb24iLFsyXToid2F0Y2hlciBnZXR0ZXIiLFszXToid2F0Y2hlciBjYWxsYmFjayIsWzRdOiJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb24iLFs1XToibmF0aXZlIGV2ZW50IGhhbmRsZXIiLFs2XToiY29tcG9uZW50IGV2ZW50IGhhbmRsZXIiLFs3XToidm5vZGUgaG9vayIsWzhdOiJkaXJlY3RpdmUgaG9vayIsWzldOiJ0cmFuc2l0aW9uIGhvb2siLFsxMF06ImFwcCBlcnJvckhhbmRsZXIiLFsxMV06ImFwcCB3YXJuSGFuZGxlciIsWzEyXToicmVmIGZ1bmN0aW9uIixbMTNdOiJhc3luYyBjb21wb25lbnQgbG9hZGVyIixbMTRdOiJzY2hlZHVsZXIgZmx1c2guIFRoaXMgaXMgbGlrZWx5IGEgVnVlIGludGVybmFscyBidWcuIFBsZWFzZSBvcGVuIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9jb3JlIC4ifTtmdW5jdGlvbiBzbihpLGwsaCx2KXt0cnl7cmV0dXJuIHY/aSguLi52KTppKCl9Y2F0Y2goQSl7Ym4oQSxsLGgpfX1mdW5jdGlvbiBsbihpLGwsaCx2KXtpZihnLmlzRnVuY3Rpb24oaSkpe3ZhciBBPXNuKGksbCxoLHYpO3JldHVybiBBJiZnLmlzUHJvbWlzZShBKSYmQS5jYXRjaChEPT57Ym4oRCxsLGgpfSksQX1mb3IodmFyIFQ9W10saz0wO2s8aS5sZW5ndGg7aysrKVQucHVzaChsbihpW2tdLGwsaCx2KSk7cmV0dXJuIFR9ZnVuY3Rpb24gYm4oaSxsLGgpe2lmKGwmJmwudm5vZGUsbCl7Zm9yKHZhciB2PWwucGFyZW50LEE9bC5wcm94eSxUPSJodHRwczovL3Z1ZWpzLm9yZy9lcnJvci1yZWZlcmVuY2UvI3J1bnRpbWUtIi5jb25jYXQoaCk7djspe3ZhciBrPXYuZWM7aWYoayl7Zm9yKHZhciBEPTA7RDxrLmxlbmd0aDtEKyspaWYoa1tEXShpLEEsVCk9PT0hMSlyZXR1cm59dj12LnBhcmVudH12YXIgaj1sLmFwcENvbnRleHQuY29uZmlnLmVycm9ySGFuZGxlcjtpZihqKXtzbihqLG51bGwsMTAsW2ksQSxUXSk7cmV0dXJufX1abihpKX1mdW5jdGlvbiBabihpLGwsaCl7Y29uc29sZS5lcnJvcihpKX12YXIgd2k9ITEsenI9ITEsRW49W10scXQ9MCxtbj1bXSxNbj1udWxsLFJuPTAscHI9e3RoZW4oaSl7c2V0VGltZW91dCgoKT0+aSgpLDApfX0sQWk9Yi5wbGF0Zm9ybT09PSJpT1MiLFhuPUFpP3ByOlByb21pc2UucmVzb2x2ZSgpLEtlPW51bGw7ZnVuY3Rpb24gWGUoaSl7dmFyIGw9S2V8fFhuO3JldHVybiBpP2wudGhlbih0aGlzP2kuYmluZCh0aGlzKTppKTpsfWZ1bmN0aW9uIGh0KGkpe2Zvcih2YXIgbD1xdCsxLGg9RW4ubGVuZ3RoO2w8aDspe3ZhciB2PWwraD4+PjEsQT1Fblt2XSxUPWFyKEEpO1Q8aXx8VD09PWkmJkEucHJlP2w9disxOmg9dn1yZXR1cm4gbH1mdW5jdGlvbiBobihpKXsoIUVuLmxlbmd0aHx8IUVuLmluY2x1ZGVzKGksd2kmJmkuYWxsb3dSZWN1cnNlP3F0KzE6cXQpKSYmKGkuaWQ9PW51bGw/RW4ucHVzaChpKTpFbi5zcGxpY2UoaHQoaS5pZCksMCxpKSxMbigpKX1mdW5jdGlvbiBMbigpeyF3aSYmIXpyJiYoenI9ITAsS2U9WG4udGhlbihXcikpfWZ1bmN0aW9uIGduKGkpe3ZhciBsPUVuLmluZGV4T2YoaSk7bD5xdCYmRW4uc3BsaWNlKGwsMSl9ZnVuY3Rpb24gQW4oaSl7Zy5pc0FycmF5KGkpP21uLnB1c2goLi4uaSk6KCFNbnx8IU1uLmluY2x1ZGVzKGksaS5hbGxvd1JlY3Vyc2U/Um4rMTpSbikpJiZtbi5wdXNoKGkpLExuKCl9ZnVuY3Rpb24gJG4oaSxsKXtmb3IodmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOndpP3F0KzE6MDtoPEVuLmxlbmd0aDtoKyspe3ZhciB2PUVuW2hdO2lmKHYmJnYucHJlKXtpZihpJiZ2LmlkIT09aS51aWQpY29udGludWU7RW4uc3BsaWNlKGgsMSksaC0tLHYoKX19fWZ1bmN0aW9uIHZyKGkpe2lmKG1uLmxlbmd0aCl7dmFyIGw9Wy4uLm5ldyBTZXQobW4pXS5zb3J0KChoLHYpPT5hcihoKS1hcih2KSk7aWYobW4ubGVuZ3RoPTAsTW4pe01uLnB1c2goLi4ubCk7cmV0dXJufWZvcihNbj1sLFJuPTA7Um48TW4ubGVuZ3RoO1JuKyspTW5bUm5dKCk7TW49bnVsbCxSbj0wfX12YXIgYXI9aT0+aS5pZD09bnVsbD8xLzA6aS5pZCx2aT0oaSxsKT0+e3ZhciBoPWFyKGkpLWFyKGwpO2lmKGg9PT0wKXtpZihpLnByZSYmIWwucHJlKXJldHVybi0xO2lmKGwucHJlJiYhaS5wcmUpcmV0dXJuIDF9cmV0dXJuIGh9O2Z1bmN0aW9uIFdyKGkpe3pyPSExLHdpPSEwLEVuLnNvcnQodmkpO3ZhciBsPWcuTk9PUDt0cnl7Zm9yKHF0PTA7cXQ8RW4ubGVuZ3RoO3F0Kyspe3ZhciBoPUVuW3F0XTtoJiZoLmFjdGl2ZSE9PSExJiZzbihoLG51bGwsMTQpfX1maW5hbGx5e3F0PTAsRW4ubGVuZ3RoPTAsdnIoKSx3aT0hMSxLZT1udWxsLChFbi5sZW5ndGh8fG1uLmxlbmd0aCkmJldyKCl9fXZhciB4cixybz1bXSxabz0hMTtmdW5jdGlvbiB2YShpKXtmb3IodmFyIGw9YXJndW1lbnRzLmxlbmd0aCxoPW5ldyBBcnJheShsPjE/bC0xOjApLHY9MTt2PGw7disrKWhbdi0xXT1hcmd1bWVudHNbdl07eHI/eHIuZW1pdChpLC4uLmgpOlpvfHxyby5wdXNoKHtldmVudDppLGFyZ3M6aH0pfWZ1bmN0aW9uIEhpKGksbCl7dmFyIGgsdjtpZih4cj1pLHhyKXhyLmVuYWJsZWQ9ITAscm8uZm9yRWFjaChUPT57dmFye2V2ZW50OmssYXJnczpEfT1UO3JldHVybiB4ci5lbWl0KGssLi4uRCl9KSxybz1bXTtlbHNlIGlmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuSFRNTEVsZW1lbnQmJiEoKHY9KGg9d2luZG93Lm5hdmlnYXRvcik9PW51bGw/dm9pZCAwOmgudXNlckFnZW50KT09bnVsbD92b2lkIDA6di5pbmNsdWRlcygianNkb20iKSkpe3ZhciBBPWwuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1sLl9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX198fFtdO0EucHVzaChUPT57SGkoVCxsKX0pLHNldFRpbWVvdXQoKCk9Pnt4cnx8KGwuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXz1udWxsLFpvPSEwLHJvPVtdKX0sM2UzKX1lbHNlIFpvPSEwLHJvPVtdfWZ1bmN0aW9uIE9uKGksbCl7dmEoImFwcDppbml0IixpLGwse0ZyYWdtZW50Om5yLFRleHQ6R24sQ29tbWVudDpncixTdGF0aWM6Z299KX1mdW5jdGlvbiBtcihpLGwpe2lmKCFpLmlzVW5tb3VudGVkKXtmb3IodmFyIGg9aS52bm9kZS5wcm9wc3x8Zy5FTVBUWV9PQkosdj1hcmd1bWVudHMubGVuZ3RoLEE9bmV3IEFycmF5KHY+Mj92LTI6MCksVD0yO1Q8djtUKyspQVtULTJdPWFyZ3VtZW50c1tUXTt2YXIgaz1BLEQ9bC5zdGFydHNXaXRoKCJ1cGRhdGU6Iiksaj1EJiZsLnNsaWNlKDcpO2lmKGomJmogaW4gaCl7dmFyIFo9IiIuY29uY2F0KGo9PT0ibW9kZWxWYWx1ZSI/Im1vZGVsIjpqLCJNb2RpZmllcnMiKSx7bnVtYmVyOmZlLHRyaW06Z2V9PWhbWl18fGcuRU1QVFlfT0JKO2dlJiYoaz1BLm1hcChpdD0+Zy5pc1N0cmluZyhpdCk/aXQudHJpbSgpOml0KSksZmUmJihrPUEubWFwKGcubG9vc2VUb051bWJlcikpfXZhciByZSx2ZT1oW3JlPWcudG9IYW5kbGVyS2V5KGwpXXx8aFtyZT1nLnRvSGFuZGxlcktleShnLmNhbWVsaXplKGwpKV07IXZlJiZEJiYodmU9aFtyZT1nLnRvSGFuZGxlcktleShnLmh5cGhlbmF0ZShsKSldKSx2ZSYmbG4odmUsaSw2LGspO3ZhciBXZT1oW3JlKyJPbmNlIl07aWYoV2Upe2lmKCFpLmVtaXR0ZWQpaS5lbWl0dGVkPXt9O2Vsc2UgaWYoaS5lbWl0dGVkW3JlXSlyZXR1cm47aS5lbWl0dGVkW3JlXT0hMCxsbihXZSxpLDYsayl9fX1mdW5jdGlvbiBRcihpLGwpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx2PWwuZW1pdHNDYWNoZSxBPXYuZ2V0KGkpO2lmKEEhPT12b2lkIDApcmV0dXJuIEE7dmFyIFQ9aS5lbWl0cyxrPXt9LEQ9ITE7aWYoIWcuaXNGdW5jdGlvbihpKSl7dmFyIGo9Wj0+e3ZhciBmZT1RcihaLGwsITApO2ZlJiYoRD0hMCxnLmV4dGVuZChrLGZlKSl9OyFoJiZsLm1peGlucy5sZW5ndGgmJmwubWl4aW5zLmZvckVhY2goaiksaS5leHRlbmRzJiZqKGkuZXh0ZW5kcyksaS5taXhpbnMmJmkubWl4aW5zLmZvckVhY2goail9cmV0dXJuIVQmJiFEPyhnLmlzT2JqZWN0KGkpJiZ2LnNldChpLG51bGwpLG51bGwpOihnLmlzQXJyYXkoVCk/VC5mb3JFYWNoKFo9PmtbWl09bnVsbCk6Zy5leHRlbmQoayxUKSxnLmlzT2JqZWN0KGkpJiZ2LnNldChpLGspLGspfWZ1bmN0aW9uIG1pKGksbCl7cmV0dXJuIWl8fCFnLmlzT24obCk/ITE6KGw9bC5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIiIpLGcuaGFzT3duKGksbFswXS50b0xvd2VyQ2FzZSgpK2wuc2xpY2UoMSkpfHxnLmhhc093bihpLGcuaHlwaGVuYXRlKGwpKXx8Zy5oYXNPd24oaSxsKSl9dmFyIEhuPW51bGwseW89bnVsbDtmdW5jdGlvbiBHcihpKXt2YXIgbD1IbjtyZXR1cm4gSG49aSx5bz1pJiZpLnR5cGUuX19zY29wZUlkfHxudWxsLGx9ZnVuY3Rpb24gbWEoaSl7eW89aX1mdW5jdGlvbiBDaSgpe3lvPW51bGx9dmFyIFFuPWk9Pl9yO2Z1bmN0aW9uIF9yKGkpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpIbjtpZighbHx8aS5fbilyZXR1cm4gaTt2YXIgaD1mdW5jdGlvbigpe2guX2QmJktyKC0xKTt2YXIgdj1HcihsKSxBO3RyeXtBPWkoLi4uYXJndW1lbnRzKX1maW5hbGx5e0dyKHYpLGguX2QmJktyKDEpfXJldHVybiBBfTtyZXR1cm4gaC5fbj0hMCxoLl9jPSEwLGguX2Q9ITAsaH1mdW5jdGlvbiBMYSgpe31mdW5jdGlvbiBkcihpKXt2YXJ7dHlwZTpsLHZub2RlOmgscHJveHk6dix3aXRoUHJveHk6QSxwcm9wczpULHByb3BzT3B0aW9uczpba10sc2xvdHM6RCxhdHRyczpqLGVtaXQ6WixyZW5kZXI6ZmUscmVuZGVyQ2FjaGU6Z2UsZGF0YTpyZSxzZXR1cFN0YXRlOnZlLGN0eDpXZSxpbmhlcml0QXR0cnM6aXR9PWksbnQsUHQsSXQ9R3IoaSk7dHJ5e2lmKGguc2hhcGVGbGFnJjQpe3ZhciB1ZT1BfHx2LE9lPXVlO250PXpuKGZlLmNhbGwoT2UsdWUsZ2UsVCx2ZSxyZSxXZSkpLFB0PWp9ZWxzZXt2YXIgU2U9bDtudD16bihTZS5sZW5ndGg+MT9TZShULHthdHRyczpqLHNsb3RzOkQsZW1pdDpafSk6U2UoVCxudWxsKSksUHQ9bC5wcm9wcz9qOkJvKGopfX1jYXRjaChCKXtZbi5sZW5ndGg9MCxibihCLGksMSksbnQ9dG4oZ3IpfXZhciBWZT1udDtpZihQdCYmaXQhPT0hMSl7dmFyIHZ0PU9iamVjdC5rZXlzKFB0KSx7c2hhcGVGbGFnOnJ0fT1WZTt2dC5sZW5ndGgmJnJ0JigxfDYpJiYoayYmdnQuc29tZShnLmlzTW9kZWxMaXN0ZW5lcikmJihQdD1NbyhQdCxrKSksVmU9Qm4oVmUsUHQpKX1yZXR1cm4gaC5kaXJzJiYoVmU9Qm4oVmUpLFZlLmRpcnM9VmUuZGlycz9WZS5kaXJzLmNvbmNhdChoLmRpcnMpOmguZGlycyksaC50cmFuc2l0aW9uJiYoVmUudHJhbnNpdGlvbj1oLnRyYW5zaXRpb24pLG50PVZlLEdyKEl0KSxudH1mdW5jdGlvbiBYbyhpKXtmb3IodmFyIGwsaD0wO2g8aS5sZW5ndGg7aCsrKXt2YXIgdj1pW2hdO2lmKE5vKHYpKXtpZih2LnR5cGUhPT1ncnx8di5jaGlsZHJlbj09PSJ2LWlmIil7aWYobClyZXR1cm47bD12fX1lbHNlIHJldHVybn1yZXR1cm4gbH12YXIgQm89aT0+e3ZhciBsO2Zvcih2YXIgaCBpbiBpKShoPT09ImNsYXNzInx8aD09PSJzdHlsZSJ8fGcuaXNPbihoKSkmJigobHx8KGw9e30pKVtoXT1pW2hdKTtyZXR1cm4gbH0sTW89KGksbCk9Pnt2YXIgaD17fTtmb3IodmFyIHYgaW4gaSkoIWcuaXNNb2RlbExpc3RlbmVyKHYpfHwhKHYuc2xpY2UoOSlpbiBsKSkmJihoW3ZdPWlbdl0pO3JldHVybiBofTtmdW5jdGlvbiBjaShpLGwsaCl7dmFye3Byb3BzOnYsY2hpbGRyZW46QSxjb21wb25lbnQ6VH09aSx7cHJvcHM6ayxjaGlsZHJlbjpELHBhdGNoRmxhZzpqfT1sLFo9VC5lbWl0c09wdGlvbnM7aWYobC5kaXJzfHxsLnRyYW5zaXRpb24pcmV0dXJuITA7aWYoaCYmaj49MCl7aWYoaiYxMDI0KXJldHVybiEwO2lmKGomMTYpcmV0dXJuIHY/VGkodixrLFopOiEhaztpZihqJjgpZm9yKHZhciBmZT1sLmR5bmFtaWNQcm9wcyxnZT0wO2dlPGZlLmxlbmd0aDtnZSsrKXt2YXIgcmU9ZmVbZ2VdO2lmKGtbcmVdIT09dltyZV0mJiFtaShaLHJlKSlyZXR1cm4hMH19ZWxzZSByZXR1cm4oQXx8RCkmJighRHx8IUQuJHN0YWJsZSk/ITA6dj09PWs/ITE6dj9rP1RpKHYsayxaKTohMDohIWs7cmV0dXJuITF9ZnVuY3Rpb24gVGkoaSxsLGgpe3ZhciB2PU9iamVjdC5rZXlzKGwpO2lmKHYubGVuZ3RoIT09T2JqZWN0LmtleXMoaSkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgQT0wO0E8di5sZW5ndGg7QSsrKXt2YXIgVD12W0FdO2lmKGxbVF0hPT1pW1RdJiYhbWkoaCxUKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBFbyhpLGwpe2Zvcih2YXJ7dm5vZGU6aCxwYXJlbnQ6dn09aTt2Oyl7dmFyIEE9di5zdWJUcmVlO2lmKEEuc3VzcGVuc2UmJkEuc3VzcGVuc2UuYWN0aXZlQnJhbmNoPT09aCYmKEEuZWw9aC5lbCksQT09PWgpKGg9di52bm9kZSkuZWw9bCx2PXYucGFyZW50O2Vsc2UgYnJlYWt9fXZhciBDcj0iY29tcG9uZW50cyIsQnI9ImRpcmVjdGl2ZXMiO2Z1bmN0aW9uIGlvKGksbCl7cmV0dXJuIHppKENyLGksITAsbCl8fGl9dmFyIG9vPVN5bWJvbC5mb3IoInYtbmRjIik7ZnVuY3Rpb24gZWkoaSl7cmV0dXJuIGcuaXNTdHJpbmcoaSk/emkoQ3IsaSwhMSl8fGk6aXx8b299ZnVuY3Rpb24gamkoaSl7cmV0dXJuIHppKEJyLGkpfWZ1bmN0aW9uIHppKGksbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExLHY9SG58fHJyO2lmKHYpe3ZhciBBPXYudHlwZTtpZihpPT09Q3Ipe3ZhciBUPXdzKEEsITEpO2lmKFQmJihUPT09bHx8VD09PWcuY2FtZWxpemUobCl8fFQ9PT1nLmNhcGl0YWxpemUoZy5jYW1lbGl6ZShsKSkpKXJldHVybiBBfXZhciBrPVFvKHZbaV18fEFbaV0sbCl8fFFvKHYuYXBwQ29udGV4dFtpXSxsKTtyZXR1cm4hayYmaD9BOmt9fWZ1bmN0aW9uIFFvKGksbCl7cmV0dXJuIGkmJihpW2xdfHxpW2cuY2FtZWxpemUobCldfHxpW2cuY2FwaXRhbGl6ZShnLmNhbWVsaXplKGwpKV0pfXZhciBPaT1pPT5pLl9faXNTdXNwZW5zZSxhbz0wLGVhPXtuYW1lOiJTdXNwZW5zZSIsX19pc1N1c3BlbnNlOiEwLHByb2Nlc3MoaSxsLGgsdixBLFQsayxELGosWil7aWYoaT09bnVsbClZcihsLGgsdixBLFQsayxELGosWik7ZWxzZXtpZihUJiZULmRlcHM+MCYmIWkuc3VzcGVuc2UuaXNJbkZhbGxiYWNrKXtsLnN1c3BlbnNlPWkuc3VzcGVuc2UsbC5zdXNwZW5zZS52bm9kZT1sLGwuZWw9aS5lbDtyZXR1cm59VHIoaSxsLGgsdixBLGssRCxqLFopfX0saHlkcmF0ZTpUZSxjcmVhdGU6QnQsbm9ybWFsaXplOkZhfSxXaT1lYTtmdW5jdGlvbiBqbihpLGwpe3ZhciBoPWkucHJvcHMmJmkucHJvcHNbbF07Zy5pc0Z1bmN0aW9uKGgpJiZoKCl9ZnVuY3Rpb24gWXIoaSxsLGgsdixBLFQsayxELGope3ZhcntwOlosbzp7Y3JlYXRlRWxlbWVudDpmZX19PWosZ2U9ZmUoImRpdiIsbCkscmU9aS5zdXNwZW5zZT1CdChpLEEsdixsLGdlLGgsVCxrLEQsaik7WihudWxsLHJlLnBlbmRpbmdCcmFuY2g9aS5zc0NvbnRlbnQsZ2UsbnVsbCx2LHJlLFQsaykscmUuZGVwcz4wPyhqbihpLCJvblBlbmRpbmciKSxqbihpLCJvbkZhbGxiYWNrIiksWihudWxsLGkuc3NGYWxsYmFjayxsLGgsdixudWxsLFQsaykscXIocmUsaS5zc0ZhbGxiYWNrKSk6cmUucmVzb2x2ZSghMSwhMCl9ZnVuY3Rpb24gVHIoaSxsLGgsdixBLFQsayxELGope3ZhcntwOlosdW06ZmUsbzp7Y3JlYXRlRWxlbWVudDpnZX19PWoscmU9bC5zdXNwZW5zZT1pLnN1c3BlbnNlO3JlLnZub2RlPWwsbC5lbD1pLmVsO3ZhciB2ZT1sLnNzQ29udGVudCxXZT1sLnNzRmFsbGJhY2sse2FjdGl2ZUJyYW5jaDppdCxwZW5kaW5nQnJhbmNoOm50LGlzSW5GYWxsYmFjazpQdCxpc0h5ZHJhdGluZzpJdH09cmU7aWYobnQpcmUucGVuZGluZ0JyYW5jaD12ZSxvaSh2ZSxudCk/KFoobnQsdmUscmUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSxyZSxULGssRCkscmUuZGVwczw9MD9yZS5yZXNvbHZlKCk6UHQmJihJdHx8KFooaXQsV2UsaCx2LEEsbnVsbCxULGssRCkscXIocmUsV2UpKSkpOihyZS5wZW5kaW5nSWQ9YW8rKyxJdD8ocmUuaXNIeWRyYXRpbmc9ITEscmUuYWN0aXZlQnJhbmNoPW50KTpmZShudCxBLHJlKSxyZS5kZXBzPTAscmUuZWZmZWN0cy5sZW5ndGg9MCxyZS5oaWRkZW5Db250YWluZXI9Z2UoImRpdiIsaCksUHQ/KFoobnVsbCx2ZSxyZS5oaWRkZW5Db250YWluZXIsbnVsbCxBLHJlLFQsayxEKSxyZS5kZXBzPD0wP3JlLnJlc29sdmUoKTooWihpdCxXZSxoLHYsQSxudWxsLFQsayxEKSxxcihyZSxXZSkpKTppdCYmb2kodmUsaXQpPyhaKGl0LHZlLGgsdixBLHJlLFQsayxEKSxyZS5yZXNvbHZlKCEwKSk6KFoobnVsbCx2ZSxyZS5oaWRkZW5Db250YWluZXIsbnVsbCxBLHJlLFQsayxEKSxyZS5kZXBzPD0wJiZyZS5yZXNvbHZlKCkpKTtlbHNlIGlmKGl0JiZvaSh2ZSxpdCkpWihpdCx2ZSxoLHYsQSxyZSxULGssRCkscXIocmUsdmUpO2Vsc2UgaWYoam4obCwib25QZW5kaW5nIikscmUucGVuZGluZ0JyYW5jaD12ZSx2ZS5zaGFwZUZsYWcmNTEyP3JlLnBlbmRpbmdJZD12ZS5jb21wb25lbnQuc3VzcGVuc2VJZDpyZS5wZW5kaW5nSWQ9YW8rKyxaKG51bGwsdmUscmUuaGlkZGVuQ29udGFpbmVyLG51bGwsQSxyZSxULGssRCkscmUuZGVwczw9MClyZS5yZXNvbHZlKCk7ZWxzZXt2YXJ7dGltZW91dDp1ZSxwZW5kaW5nSWQ6T2V9PXJlO3VlPjA/c2V0VGltZW91dCgoKT0+e3JlLnBlbmRpbmdJZD09PU9lJiZyZS5mYWxsYmFjayhXZSl9LHVlKTp1ZT09PTAmJnJlLmZhbGxiYWNrKFdlKX19ZnVuY3Rpb24gQnQoaSxsLGgsdixBLFQsayxELGosWil7dmFyIGZlPWFyZ3VtZW50cy5sZW5ndGg+MTAmJmFyZ3VtZW50c1sxMF0hPT12b2lkIDA/YXJndW1lbnRzWzEwXTohMSx7cDpnZSxtOnJlLHVtOnZlLG46V2Usbzp7cGFyZW50Tm9kZTppdCxyZW1vdmU6bnR9fT1aLFB0LEl0PUdpKGkpO0l0JiYobD09bnVsbD92b2lkIDA6bC5wZW5kaW5nQnJhbmNoKSYmKFB0PWwucGVuZGluZ0lkLGwuZGVwcysrKTt2YXIgdWU9aS5wcm9wcz9nLnRvTnVtYmVyKGkucHJvcHMudGltZW91dCk6dm9pZCAwLE9lPVQsU2U9e3Zub2RlOmkscGFyZW50OmwscGFyZW50Q29tcG9uZW50OmgsbmFtZXNwYWNlOmssY29udGFpbmVyOnYsaGlkZGVuQ29udGFpbmVyOkEsZGVwczowLHBlbmRpbmdJZDphbysrLHRpbWVvdXQ6dHlwZW9mIHVlPT0ibnVtYmVyIj91ZTotMSxhY3RpdmVCcmFuY2g6bnVsbCxwZW5kaW5nQnJhbmNoOm51bGwsaXNJbkZhbGxiYWNrOiFmZSxpc0h5ZHJhdGluZzpmZSxpc1VubW91bnRlZDohMSxlZmZlY3RzOltdLHJlc29sdmUoKXt2YXIgVmU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExLHZ0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMSx7dm5vZGU6cnQsYWN0aXZlQnJhbmNoOkIscGVuZGluZ0JyYW5jaDpWLHBlbmRpbmdJZDp0ZSxlZmZlY3RzOmRlLHBhcmVudENvbXBvbmVudDpvZSxjb250YWluZXI6UmV9PVNlLGplPSExO1NlLmlzSHlkcmF0aW5nP1NlLmlzSHlkcmF0aW5nPSExOlZlfHwoamU9QiYmVi50cmFuc2l0aW9uJiZWLnRyYW5zaXRpb24ubW9kZT09PSJvdXQtaW4iLGplJiYoQi50cmFuc2l0aW9uLmFmdGVyTGVhdmU9KCk9Pnt0ZT09PVNlLnBlbmRpbmdJZCYmKHJlKFYsUmUsVD09PU9lP1dlKEIpOlQsMCksQW4oZGUpKX0pLEImJihpdChCLmVsKSE9PVNlLmhpZGRlbkNvbnRhaW5lciYmKFQ9V2UoQikpLHZlKEIsb2UsU2UsITApKSxqZXx8cmUoVixSZSxULDApKSxxcihTZSxWKSxTZS5wZW5kaW5nQnJhbmNoPW51bGwsU2UuaXNJbkZhbGxiYWNrPSExO2Zvcih2YXIgeWU9U2UucGFyZW50LEplPSExO3llOyl7aWYoeWUucGVuZGluZ0JyYW5jaCl7eWUuZWZmZWN0cy5wdXNoKC4uLmRlKSxKZT0hMDticmVha315ZT15ZS5wYXJlbnR9IUplJiYhamUmJkFuKGRlKSxTZS5lZmZlY3RzPVtdLEl0JiZsJiZsLnBlbmRpbmdCcmFuY2gmJlB0PT09bC5wZW5kaW5nSWQmJihsLmRlcHMtLSxsLmRlcHM9PT0wJiYhdnQmJmwucmVzb2x2ZSgpKSxqbihydCwib25SZXNvbHZlIil9LGZhbGxiYWNrKFZlKXtpZighIVNlLnBlbmRpbmdCcmFuY2gpe3Zhcnt2bm9kZTp2dCxhY3RpdmVCcmFuY2g6cnQscGFyZW50Q29tcG9uZW50OkIsY29udGFpbmVyOlYsbmFtZXNwYWNlOnRlfT1TZTtqbih2dCwib25GYWxsYmFjayIpO3ZhciBkZT1XZShydCksb2U9KCk9PnshU2UuaXNJbkZhbGxiYWNrfHwoZ2UobnVsbCxWZSxWLGRlLEIsbnVsbCx0ZSxELGopLHFyKFNlLFZlKSl9LFJlPVZlLnRyYW5zaXRpb24mJlZlLnRyYW5zaXRpb24ubW9kZT09PSJvdXQtaW4iO1JlJiYocnQudHJhbnNpdGlvbi5hZnRlckxlYXZlPW9lKSxTZS5pc0luRmFsbGJhY2s9ITAsdmUocnQsQixudWxsLCEwKSxSZXx8b2UoKX19LG1vdmUoVmUsdnQscnQpe1NlLmFjdGl2ZUJyYW5jaCYmcmUoU2UuYWN0aXZlQnJhbmNoLFZlLHZ0LHJ0KSxTZS5jb250YWluZXI9VmV9LG5leHQoKXtyZXR1cm4gU2UuYWN0aXZlQnJhbmNoJiZXZShTZS5hY3RpdmVCcmFuY2gpfSxyZWdpc3RlckRlcChWZSx2dCl7dmFyIHJ0PSEhU2UucGVuZGluZ0JyYW5jaDtydCYmU2UuZGVwcysrO3ZhciBCPVZlLnZub2RlLmVsO1ZlLmFzeW5jRGVwLmNhdGNoKFY9PntibihWLFZlLDApfSkudGhlbihWPT57aWYoIShWZS5pc1VubW91bnRlZHx8U2UuaXNVbm1vdW50ZWR8fFNlLnBlbmRpbmdJZCE9PVZlLnN1c3BlbnNlSWQpKXtWZS5hc3luY1Jlc29sdmVkPSEwO3Zhcnt2bm9kZTp0ZX09VmU7Y2woVmUsViwhMSksQiYmKHRlLmVsPUIpO3ZhciBkZT0hQiYmVmUuc3ViVHJlZS5lbDt2dChWZSx0ZSxpdChCfHxWZS5zdWJUcmVlLmVsKSxCP251bGw6V2UoVmUuc3ViVHJlZSksU2UsayxqKSxkZSYmbnQoZGUpLEVvKFZlLHRlLmVsKSxydCYmLS1TZS5kZXBzPT09MCYmU2UucmVzb2x2ZSgpfX0pfSx1bm1vdW50KFZlLHZ0KXtTZS5pc1VubW91bnRlZD0hMCxTZS5hY3RpdmVCcmFuY2gmJnZlKFNlLmFjdGl2ZUJyYW5jaCxoLFZlLHZ0KSxTZS5wZW5kaW5nQnJhbmNoJiZ2ZShTZS5wZW5kaW5nQnJhbmNoLGgsVmUsdnQpfX07cmV0dXJuIFNlfWZ1bmN0aW9uIFRlKGksbCxoLHYsQSxULGssRCxqKXt2YXIgWj1sLnN1c3BlbnNlPUJ0KGwsdixoLGkucGFyZW50Tm9kZSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxudWxsLEEsVCxrLEQsITApLGZlPWooaSxaLnBlbmRpbmdCcmFuY2g9bC5zc0NvbnRlbnQsaCxaLFQsayk7cmV0dXJuIFouZGVwcz09PTAmJloucmVzb2x2ZSghMSwhMCksZmV9ZnVuY3Rpb24gRmEoaSl7dmFye3NoYXBlRmxhZzpsLGNoaWxkcmVuOmh9PWksdj1sJjMyO2kuc3NDb250ZW50PWNuKHY/aC5kZWZhdWx0OmgpLGkuc3NGYWxsYmFjaz12P2NuKGguZmFsbGJhY2spOnRuKGdyKX1mdW5jdGlvbiBjbihpKXt2YXIgbDtpZihnLmlzRnVuY3Rpb24oaSkpe3ZhciBoPWRpJiZpLl9jO2gmJihpLl9kPSExLFRhKCkpLGk9aSgpLGgmJihpLl9kPSEwLGw9JHIsbnMoKSl9aWYoZy5pc0FycmF5KGkpKXt2YXIgdj1YbyhpKTtpPXZ9cmV0dXJuIGk9em4oaSksbCYmIWkuZHluYW1pY0NoaWxkcmVuJiYoaS5keW5hbWljQ2hpbGRyZW49bC5maWx0ZXIoQT0+QSE9PWkpKSxpfWZ1bmN0aW9uIHNvKGksbCl7bCYmbC5wZW5kaW5nQnJhbmNoP2cuaXNBcnJheShpKT9sLmVmZmVjdHMucHVzaCguLi5pKTpsLmVmZmVjdHMucHVzaChpKTpBbihpKX1mdW5jdGlvbiBxcihpLGwpe2kuYWN0aXZlQnJhbmNoPWw7Zm9yKHZhcnt2bm9kZTpoLHBhcmVudENvbXBvbmVudDp2fT1pLEE9bC5lbDshQSYmbC5jb21wb25lbnQ7KWw9bC5jb21wb25lbnQuc3ViVHJlZSxBPWwuZWw7aC5lbD1BLHYmJnYuc3ViVHJlZT09PWgmJih2LnZub2RlLmVsPUEsRW8odixBKSl9ZnVuY3Rpb24gR2koaSl7dmFyIGw7cmV0dXJuKChsPWkucHJvcHMpPT1udWxsP3ZvaWQgMDpsLnN1c3BlbnNpYmxlKSE9bnVsbCYmaS5wcm9wcy5zdXNwZW5zaWJsZSE9PSExfXZhciBMbz1TeW1ib2wuZm9yKCJ2LXNjeCIpLFlpPSgpPT57e3ZhciBpPSQoTG8pO3JldHVybiBpfX07ZnVuY3Rpb24gUGkoaSxsKXtyZXR1cm4gbG8oaSxudWxsLGwpfWZ1bmN0aW9uIHVpKGksbCl7cmV0dXJuIGxvKGksbnVsbCx7Zmx1c2g6InBvc3QifSl9ZnVuY3Rpb24gZmkoaSxsKXtyZXR1cm4gbG8oaSxudWxsLHtmbHVzaDoic3luYyJ9KX12YXIgYnI9e307ZnVuY3Rpb24gTXIoaSxsLGgpe3JldHVybiBsbyhpLGwsaCl9ZnVuY3Rpb24gbG8oaSxsKXt2YXJ7aW1tZWRpYXRlOmgsZGVlcDp2LGZsdXNoOkEsb25jZTpULG9uVHJhY2s6ayxvblRyaWdnZXI6RH09YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOmcuRU1QVFlfT0JKO2lmKGwmJlQpe3ZhciBqPWw7bD1mdW5jdGlvbigpe2ooLi4uYXJndW1lbnRzKSxydCgpfX12YXIgWj1ycixmZT1CPT52PT09ITA/Qjp5cihCLHY9PT0hMT8xOnZvaWQgMCksZ2UscmU9ITEsdmU9ITE7aWYoeS5pc1JlZihpKT8oZ2U9KCk9PmkudmFsdWUscmU9eS5pc1NoYWxsb3coaSkpOnkuaXNSZWFjdGl2ZShpKT8oZ2U9KCk9PmZlKGkpLHJlPSEwKTpnLmlzQXJyYXkoaSk/KHZlPSEwLHJlPWkuc29tZShCPT55LmlzUmVhY3RpdmUoQil8fHkuaXNTaGFsbG93KEIpKSxnZT0oKT0+aS5tYXAoQj0+e2lmKHkuaXNSZWYoQikpcmV0dXJuIEIudmFsdWU7aWYoeS5pc1JlYWN0aXZlKEIpKXJldHVybiBmZShCKTtpZihnLmlzRnVuY3Rpb24oQikpcmV0dXJuIHNuKEIsWiwyKX0pKTpnLmlzRnVuY3Rpb24oaSk/bD9nZT0oKT0+c24oaSxaLDIpOmdlPSgpPT4oaXQmJml0KCksbG4oaSxaLDMsW250XSkpOmdlPWcuTk9PUCxsJiZ2KXt2YXIgV2U9Z2U7Z2U9KCk9PnlyKFdlKCkpfXZhciBpdCxudD1CPT57aXQ9VmUub25TdG9wPSgpPT57c24oQixaLDQpLGl0PVZlLm9uU3RvcD12b2lkIDB9fSxQdDtpZihiLmlzSW5TU1JDb21wb25lbnRTZXR1cClpZihudD1nLk5PT1AsbD9oJiZsbihsLFosMyxbZ2UoKSx2ZT9bXTp2b2lkIDAsbnRdKTpnZSgpLEE9PT0ic3luYyIpe3ZhciBJdD1ZaSgpO1B0PUl0Ll9fd2F0Y2hlckhhbmRsZXN8fChJdC5fX3dhdGNoZXJIYW5kbGVzPVtdKX1lbHNlIHJldHVybiBnLk5PT1A7dmFyIHVlPXZlP25ldyBBcnJheShpLmxlbmd0aCkuZmlsbChicik6YnIsT2U9KCk9PntpZighKCFWZS5hY3RpdmV8fCFWZS5kaXJ0eSkpaWYobCl7dmFyIEI9VmUucnVuKCk7KHZ8fHJlfHwodmU/Qi5zb21lKChWLHRlKT0+Zy5oYXNDaGFuZ2VkKFYsdWVbdGVdKSk6Zy5oYXNDaGFuZ2VkKEIsdWUpKSkmJihpdCYmaXQoKSxsbihsLFosMyxbQix1ZT09PWJyP3ZvaWQgMDp2ZSYmdWVbMF09PT1icj9bXTp1ZSxudF0pLHVlPUIpfWVsc2UgVmUucnVuKCl9O09lLmFsbG93UmVjdXJzZT0hIWw7dmFyIFNlO0E9PT0ic3luYyI/U2U9T2U6QT09PSJwb3N0Ij9TZT0oKT0+Y3IoT2UsWiYmWi5zdXNwZW5zZSk6KE9lLnByZT0hMCxaJiYoT2UuaWQ9Wi51aWQpLFNlPSgpPT5obihPZSkpO3ZhciBWZT1uZXcgeS5SZWFjdGl2ZUVmZmVjdChnZSxnLk5PT1AsU2UpLHZ0PXkuZ2V0Q3VycmVudFNjb3BlKCkscnQ9KCk9PntWZS5zdG9wKCksdnQmJmcucmVtb3ZlKHZ0LmVmZmVjdHMsVmUpfTtyZXR1cm4gbD9oP09lKCk6dWU9VmUucnVuKCk6QT09PSJwb3N0Ij9jcihWZS5ydW4uYmluZChWZSksWiYmWi5zdXNwZW5zZSk6VmUucnVuKCksUHQmJlB0LnB1c2gocnQpLHJ0fWZ1bmN0aW9uIHRpKGksbCxoKXt2YXIgdj10aGlzLnByb3h5LEE9Zy5pc1N0cmluZyhpKT9pLmluY2x1ZGVzKCIuIik/cG4odixpKTooKT0+dltpXTppLmJpbmQodix2KSxUO2cuaXNGdW5jdGlvbihsKT9UPWw6KFQ9bC5oYW5kbGVyLGg9bCk7dmFyIGs9TmEodGhpcyksRD1sbyhBLFQuYmluZCh2KSxoKTtyZXR1cm4gaygpLER9ZnVuY3Rpb24gcG4oaSxsKXt2YXIgaD1sLnNwbGl0KCIuIik7cmV0dXJuKCk9Pntmb3IodmFyIHY9aSxBPTA7QTxoLmxlbmd0aCYmdjtBKyspdj12W2hbQV1dO3JldHVybiB2fX1mdW5jdGlvbiB5cihpLGwpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTowLHY9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7aWYoIWcuaXNPYmplY3QoaSl8fGkuX192X3NraXApcmV0dXJuIGk7aWYobCYmbD4wKXtpZihoPj1sKXJldHVybiBpO2grK31pZih2PXZ8fG5ldyBTZXQsdi5oYXMoaSkpcmV0dXJuIGk7aWYodi5hZGQoaSkseS5pc1JlZihpKSl5cihpLnZhbHVlLGwsaCx2KTtlbHNlIGlmKGcuaXNBcnJheShpKSlmb3IodmFyIEE9MDtBPGkubGVuZ3RoO0ErKyl5cihpW0FdLGwsaCx2KTtlbHNlIGlmKGcuaXNTZXQoaSl8fGcuaXNNYXAoaSkpaS5mb3JFYWNoKGs9Pnt5cihrLGwsaCx2KX0pO2Vsc2UgaWYoZy5pc1BsYWluT2JqZWN0KGkpKWZvcih2YXIgVCBpbiBpKXlyKGlbVF0sbCxoLHYpO3JldHVybiBpfWZ1bmN0aW9uIHFpKGksbCl7aWYoSG49PT1udWxsKXJldHVybiBpO2Zvcih2YXIgaD1JYShIbil8fEhuLnByb3h5LHY9aS5kaXJzfHwoaS5kaXJzPVtdKSxBPTA7QTxsLmxlbmd0aDtBKyspe3ZhcltULGssRCxqPWcuRU1QVFlfT0JKXT1sW0FdO1QmJihnLmlzRnVuY3Rpb24oVCkmJihUPXttb3VudGVkOlQsdXBkYXRlZDpUfSksVC5kZWVwJiZ5cihrKSx2LnB1c2goe2RpcjpULGluc3RhbmNlOmgsdmFsdWU6ayxvbGRWYWx1ZTp2b2lkIDAsYXJnOkQsbW9kaWZpZXJzOmp9KSl9cmV0dXJuIGl9ZnVuY3Rpb24gUG4oaSxsLGgsdil7Zm9yKHZhciBBPWkuZGlycyxUPWwmJmwuZGlycyxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciBEPUFba107VCYmKEQub2xkVmFsdWU9VFtrXS52YWx1ZSk7dmFyIGo9RC5kaXJbdl07aiYmKHkucGF1c2VUcmFja2luZygpLGxuKGosaCw4LFtpLmVsLEQsaSxsXSkseS5yZXNldFRyYWNraW5nKCkpfX12YXIgX2k9U3ltYm9sKCJfbGVhdmVDYiIpLEZvPVN5bWJvbCgiX2VudGVyQ2IiKTtmdW5jdGlvbiB0YSgpe3ZhciBpPXtpc01vdW50ZWQ6ITEsaXNMZWF2aW5nOiExLGlzVW5tb3VudGluZzohMSxsZWF2aW5nVk5vZGVzOm5ldyBNYXB9O3JldHVybiBBbygoKT0+e2kuaXNNb3VudGVkPSEwfSksaWUoKCk9PntpLmlzVW5tb3VudGluZz0hMH0pLGl9dmFyIE5uPVtGdW5jdGlvbixBcnJheV0sRXI9e21vZGU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLHBlcnNpc3RlZDpCb29sZWFuLG9uQmVmb3JlRW50ZXI6Tm4sb25FbnRlcjpObixvbkFmdGVyRW50ZXI6Tm4sb25FbnRlckNhbmNlbGxlZDpObixvbkJlZm9yZUxlYXZlOk5uLG9uTGVhdmU6Tm4sb25BZnRlckxlYXZlOk5uLG9uTGVhdmVDYW5jZWxsZWQ6Tm4sb25CZWZvcmVBcHBlYXI6Tm4sb25BcHBlYXI6Tm4sb25BZnRlckFwcGVhcjpObixvbkFwcGVhckNhbmNlbGxlZDpObn0sc3I9e25hbWU6IkJhc2VUcmFuc2l0aW9uIixwcm9wczpFcixzZXR1cChpLGwpe3ZhcntzbG90czpofT1sLHY9SW8oKSxBPXRhKCk7cmV0dXJuKCk9Pnt2YXIgVD1oLmRlZmF1bHQmJmNvKGguZGVmYXVsdCgpLCEwKTtpZighKCFUfHwhVC5sZW5ndGgpKXt2YXIgaz1UWzBdO2lmKFQubGVuZ3RoPjEpe2Zvcih2YXIgRCBvZiBUKWlmKEQudHlwZSE9PWdyKXtrPUQ7YnJlYWt9fXZhciBqPXkudG9SYXcoaSkse21vZGU6Wn09ajtpZihBLmlzTGVhdmluZylyZXR1cm4gU28oayk7dmFyIGZlPU5pKGspO2lmKCFmZSlyZXR1cm4gU28oayk7dmFyIGdlPWJpKGZlLGosQSx2KTtraShmZSxnZSk7dmFyIHJlPXYuc3ViVHJlZSx2ZT1yZSYmTmkocmUpO2lmKHZlJiZ2ZS50eXBlIT09Z3ImJiFvaShmZSx2ZSkpe3ZhciBXZT1iaSh2ZSxqLEEsdik7aWYoa2kodmUsV2UpLFo9PT0ib3V0LWluIilyZXR1cm4gQS5pc0xlYXZpbmc9ITAsV2UuYWZ0ZXJMZWF2ZT0oKT0+e0EuaXNMZWF2aW5nPSExLHYudXBkYXRlLmFjdGl2ZSE9PSExJiYodi5lZmZlY3QuZGlydHk9ITAsdi51cGRhdGUoKSl9LFNvKGspO1o9PT0iaW4tb3V0IiYmZmUudHlwZSE9PWdyJiYoV2UuZGVsYXlMZWF2ZT0oaXQsbnQsUHQpPT57dmFyIEl0PVNyKEEsdmUpO0l0W1N0cmluZyh2ZS5rZXkpXT12ZSxpdFtfaV09KCk9PntudCgpLGl0W19pXT12b2lkIDAsZGVsZXRlIGdlLmRlbGF5ZWRMZWF2ZX0sZ2UuZGVsYXllZExlYXZlPVB0fSl9cmV0dXJuIGt9fX19LExyPXNyO2Z1bmN0aW9uIFNyKGksbCl7dmFye2xlYXZpbmdWTm9kZXM6aH09aSx2PWguZ2V0KGwudHlwZSk7cmV0dXJuIHZ8fCh2PU9iamVjdC5jcmVhdGUobnVsbCksaC5zZXQobC50eXBlLHYpKSx2fWZ1bmN0aW9uIGJpKGksbCxoLHYpe3ZhcnthcHBlYXI6QSxtb2RlOlQscGVyc2lzdGVkOms9ITEsb25CZWZvcmVFbnRlcjpELG9uRW50ZXI6aixvbkFmdGVyRW50ZXI6WixvbkVudGVyQ2FuY2VsbGVkOmZlLG9uQmVmb3JlTGVhdmU6Z2Usb25MZWF2ZTpyZSxvbkFmdGVyTGVhdmU6dmUsb25MZWF2ZUNhbmNlbGxlZDpXZSxvbkJlZm9yZUFwcGVhcjppdCxvbkFwcGVhcjpudCxvbkFmdGVyQXBwZWFyOlB0LG9uQXBwZWFyQ2FuY2VsbGVkOkl0fT1sLHVlPVN0cmluZyhpLmtleSksT2U9U3IoaCxpKSxTZT0ocnQsQik9PntydCYmbG4ocnQsdiw5LEIpfSxWZT0ocnQsQik9Pnt2YXIgVj1CWzFdO1NlKHJ0LEIpLGcuaXNBcnJheShydCk/cnQuZXZlcnkodGU9PnRlLmxlbmd0aDw9MSkmJlYoKTpydC5sZW5ndGg8PTEmJlYoKX0sdnQ9e21vZGU6VCxwZXJzaXN0ZWQ6ayxiZWZvcmVFbnRlcihydCl7dmFyIEI9RDtpZighaC5pc01vdW50ZWQpaWYoQSlCPWl0fHxEO2Vsc2UgcmV0dXJuO3J0W19pXSYmcnRbX2ldKCEwKTt2YXIgVj1PZVt1ZV07ViYmb2koaSxWKSYmVi5lbFtfaV0mJlYuZWxbX2ldKCksU2UoQixbcnRdKX0sZW50ZXIocnQpe3ZhciBCPWosVj1aLHRlPWZlO2lmKCFoLmlzTW91bnRlZClpZihBKUI9bnR8fGosVj1QdHx8Wix0ZT1JdHx8ZmU7ZWxzZSByZXR1cm47dmFyIGRlPSExLG9lPXJ0W0ZvXT1SZT0+e2RlfHwoZGU9ITAsUmU/U2UodGUsW3J0XSk6U2UoVixbcnRdKSx2dC5kZWxheWVkTGVhdmUmJnZ0LmRlbGF5ZWRMZWF2ZSgpLHJ0W0ZvXT12b2lkIDApfTtCP1ZlKEIsW3J0LG9lXSk6b2UoKX0sbGVhdmUocnQsQil7dmFyIFY9U3RyaW5nKGkua2V5KTtpZihydFtGb10mJnJ0W0ZvXSghMCksaC5pc1VubW91bnRpbmcpcmV0dXJuIEIoKTtTZShnZSxbcnRdKTt2YXIgdGU9ITEsZGU9cnRbX2ldPW9lPT57dGV8fCh0ZT0hMCxCKCksb2U/U2UoV2UsW3J0XSk6U2UodmUsW3J0XSkscnRbX2ldPXZvaWQgMCxPZVtWXT09PWkmJmRlbGV0ZSBPZVtWXSl9O09lW1ZdPWkscmU/VmUocmUsW3J0LGRlXSk6ZGUoKX0sY2xvbmUocnQpe3JldHVybiBiaShydCxsLGgsdil9fTtyZXR1cm4gdnR9ZnVuY3Rpb24gU28oaSl7aWYoemUoaSkpcmV0dXJuIGk9Qm4oaSksaS5jaGlsZHJlbj1udWxsLGl9ZnVuY3Rpb24gTmkoaSl7cmV0dXJuIHplKGkpP2kuY2hpbGRyZW4/aS5jaGlsZHJlblswXTp2b2lkIDA6aX1mdW5jdGlvbiBraShpLGwpe2kuc2hhcGVGbGFnJjYmJmkuY29tcG9uZW50P2tpKGkuY29tcG9uZW50LnN1YlRyZWUsbCk6aS5zaGFwZUZsYWcmMTI4PyhpLnNzQ29udGVudC50cmFuc2l0aW9uPWwuY2xvbmUoaS5zc0NvbnRlbnQpLGkuc3NGYWxsYmFjay50cmFuc2l0aW9uPWwuY2xvbmUoaS5zc0ZhbGxiYWNrKSk6aS50cmFuc2l0aW9uPWx9ZnVuY3Rpb24gY28oaSl7Zm9yKHZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMSxoPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLHY9W10sQT0wLFQ9MDtUPGkubGVuZ3RoO1QrKyl7dmFyIGs9aVtUXSxEPWg9PW51bGw/ay5rZXk6U3RyaW5nKGgpK1N0cmluZyhrLmtleSE9bnVsbD9rLmtleTpUKTtrLnR5cGU9PT1ucj8oay5wYXRjaEZsYWcmMTI4JiZBKyssdj12LmNvbmNhdChjbyhrLmNoaWxkcmVuLGwsRCkpKToobHx8ay50eXBlIT09Z3IpJiZ2LnB1c2goRCE9bnVsbD9CbihrLHtrZXk6RH0pOmspfWlmKEE+MSlmb3IodmFyIGo9MDtqPHYubGVuZ3RoO2orKyl2W2pdLnBhdGNoRmxhZz0tMjtyZXR1cm4gdn1mdW5jdGlvbiBNKGksbCl7cmV0dXJuIGcuaXNGdW5jdGlvbihpKT8oKCk9PmcuZXh0ZW5kKHtuYW1lOmkubmFtZX0sbCx7c2V0dXA6aX0pKSgpOml9dmFyIFc9aT0+ISFpLnR5cGUuX19hc3luY0xvYWRlcjtmdW5jdGlvbiBsZShpKXtnLmlzRnVuY3Rpb24oaSkmJihpPXtsb2FkZXI6aX0pO3Zhcntsb2FkZXI6bCxsb2FkaW5nQ29tcG9uZW50OmgsZXJyb3JDb21wb25lbnQ6dixkZWxheTpBPTIwMCx0aW1lb3V0OlQsc3VzcGVuc2libGU6az0hMCxvbkVycm9yOkR9PWksaj1udWxsLFosZmU9MCxnZT0oKT0+KGZlKyssaj1udWxsLHJlKCkpLHJlPSgpPT57dmFyIHZlO3JldHVybiBqfHwodmU9aj1sKCkuY2F0Y2goV2U9PntpZihXZT1XZSBpbnN0YW5jZW9mIEVycm9yP1dlOm5ldyBFcnJvcihTdHJpbmcoV2UpKSxEKXJldHVybiBuZXcgUHJvbWlzZSgoaXQsbnQpPT57dmFyIFB0PSgpPT5pdChnZSgpKSxJdD0oKT0+bnQoV2UpO0QoV2UsUHQsSXQsZmUrMSl9KTt0aHJvdyBXZX0pLnRoZW4oV2U9PnZlIT09aiYmaj9qOihXZSYmKFdlLl9fZXNNb2R1bGV8fFdlW1N5bWJvbC50b1N0cmluZ1RhZ109PT0iTW9kdWxlIikmJihXZT1XZS5kZWZhdWx0KSxaPVdlLFdlKSkpfTtyZXR1cm4gTSh7bmFtZToiQXN5bmNDb21wb25lbnRXcmFwcGVyIixfX2FzeW5jTG9hZGVyOnJlLGdldCBfX2FzeW5jUmVzb2x2ZWQoKXtyZXR1cm4gWn0sc2V0dXAoKXt2YXIgdmU9cnI7aWYoWilyZXR1cm4oKT0+JGUoWix2ZSk7dmFyIFdlPUl0PT57aj1udWxsLGJuKEl0LHZlLDEzKX07aWYoayYmdmUuc3VzcGVuc2V8fGIuaXNJblNTUkNvbXBvbmVudFNldHVwKXJldHVybiByZSgpLnRoZW4oSXQ9PigpPT4kZShJdCx2ZSkpLmNhdGNoKEl0PT4oV2UoSXQpLCgpPT52P3RuKHYse2Vycm9yOkl0fSk6bnVsbCkpO3ZhciBpdD15LnJlZighMSksbnQ9eS5yZWYoKSxQdD15LnJlZighIUEpO3JldHVybiBBJiZzZXRUaW1lb3V0KCgpPT57UHQudmFsdWU9ITF9LEEpLFQhPW51bGwmJnNldFRpbWVvdXQoKCk9PntpZighaXQudmFsdWUmJiFudC52YWx1ZSl7dmFyIEl0PW5ldyBFcnJvcigiQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAiLmNvbmNhdChULCJtcy4iKSk7V2UoSXQpLG50LnZhbHVlPUl0fX0sVCkscmUoKS50aGVuKCgpPT57aXQudmFsdWU9ITAsdmUucGFyZW50JiZ6ZSh2ZS5wYXJlbnQudm5vZGUpJiYodmUucGFyZW50LmVmZmVjdC5kaXJ0eT0hMCxobih2ZS5wYXJlbnQudXBkYXRlKSl9KS5jYXRjaChJdD0+e1dlKEl0KSxudC52YWx1ZT1JdH0pLCgpPT57aWYoaXQudmFsdWUmJlopcmV0dXJuICRlKFosdmUpO2lmKG50LnZhbHVlJiZ2KXJldHVybiB0bih2LHtlcnJvcjpudC52YWx1ZX0pO2lmKGgmJiFQdC52YWx1ZSlyZXR1cm4gdG4oaCl9fX0pfWZ1bmN0aW9uICRlKGksbCl7dmFye3JlZjpoLHByb3BzOnYsY2hpbGRyZW46QSxjZTpUfT1sLnZub2RlLGs9dG4oaSx2LEEpO3JldHVybiBrLnJlZj1oLGsuY2U9VCxkZWxldGUgbC52bm9kZS5jZSxrfXZhciB6ZT1pPT5pLnR5cGUuX19pc0tlZXBBbGl2ZSxhdD17bmFtZToiS2VlcEFsaXZlIixfX2lzS2VlcEFsaXZlOiEwLHByb3BzOntpbmNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxleGNsdWRlOltTdHJpbmcsUmVnRXhwLEFycmF5XSxtYXg6W1N0cmluZyxOdW1iZXJdfSxzZXR1cChpLGwpe3ZhcntzbG90czpofT1sLHY9SW8oKSxBPXYuY3R4O2lmKCFBLnJlbmRlcmVyKXJldHVybigpPT57dmFyIHVlPWguZGVmYXVsdCYmaC5kZWZhdWx0KCk7cmV0dXJuIHVlJiZ1ZS5sZW5ndGg9PT0xP3VlWzBdOnVlfTt2YXIgVD1uZXcgTWFwLGs9bmV3IFNldCxEPW51bGwsaj12LnN1c3BlbnNlLHtyZW5kZXJlcjp7cDpaLG06ZmUsdW06Z2Usbzp7Y3JlYXRlRWxlbWVudDpyZX19fT1BLHZlPXJlKCJkaXYiLG51bGwpO0EuYWN0aXZhdGU9KHVlLE9lLFNlLFZlLHZ0KT0+e3ZhciBydD11ZS5jb21wb25lbnQ7ZmUodWUsT2UsU2UsMCxqKSxaKHJ0LnZub2RlLHVlLE9lLFNlLHJ0LGosVmUsdWUuc2xvdFNjb3BlSWRzLHZ0KSxjcigoKT0+e3J0LmlzRGVhY3RpdmF0ZWQ9ITEscnQuYSYmZy5pbnZva2VBcnJheUZucyhydC5hKTt2YXIgQj11ZS5wcm9wcyYmdWUucHJvcHMub25Wbm9kZU1vdW50ZWQ7QiYmX24oQixydC5wYXJlbnQsdWUpfSxqKX0sQS5kZWFjdGl2YXRlPXVlPT57dmFyIE9lPXVlLmNvbXBvbmVudDtmZSh1ZSx2ZSxudWxsLDEsaiksY3IoKCk9PntPZS5kYSYmZy5pbnZva2VBcnJheUZucyhPZS5kYSk7dmFyIFNlPXVlLnByb3BzJiZ1ZS5wcm9wcy5vblZub2RlVW5tb3VudGVkO1NlJiZfbihTZSxPZS5wYXJlbnQsdWUpLE9lLmlzRGVhY3RpdmF0ZWQ9ITB9LGopfTtmdW5jdGlvbiBXZSh1ZSl7UmkodWUpLGdlKHVlLHYsaiwhMCl9ZnVuY3Rpb24gaXQodWUpe1QuZm9yRWFjaCgoT2UsU2UpPT57dmFyIFZlPXdzKE9lLnR5cGUpO1ZlJiYoIXVlfHwhdWUoVmUpKSYmbnQoU2UpfSl9ZnVuY3Rpb24gbnQodWUpe3ZhciBPZT1ULmdldCh1ZSk7IUR8fCFvaShPZSxEKT9XZShPZSk6RCYmUmkoRCksVC5kZWxldGUodWUpLGsuZGVsZXRlKHVlKX1NcigoKT0+W2kuaW5jbHVkZSxpLmV4Y2x1ZGVdLHVlPT57dmFyW09lLFNlXT11ZTtPZSYmaXQoVmU9Pkp0KE9lLFZlKSksU2UmJml0KFZlPT4hSnQoU2UsVmUpKX0se2ZsdXNoOiJwb3N0IixkZWVwOiEwfSk7dmFyIFB0PW51bGwsSXQ9KCk9PntQdCE9bnVsbCYmVC5zZXQoUHQsRXQodi5zdWJUcmVlKSl9O3JldHVybiBBbyhJdCksWShJdCksaWUoKCk9PntULmZvckVhY2godWU9Pnt2YXJ7c3ViVHJlZTpPZSxzdXNwZW5zZTpTZX09dixWZT1FdChPZSk7aWYodWUudHlwZT09PVZlLnR5cGUmJnVlLmtleT09PVZlLmtleSl7UmkoVmUpO3ZhciB2dD1WZS5jb21wb25lbnQuZGE7dnQmJmNyKHZ0LFNlKTtyZXR1cm59V2UodWUpfSl9KSwoKT0+e2lmKFB0PW51bGwsIWguZGVmYXVsdClyZXR1cm4gbnVsbDt2YXIgdWU9aC5kZWZhdWx0KCksT2U9dWVbMF07aWYodWUubGVuZ3RoPjEpcmV0dXJuIEQ9bnVsbCx1ZTtpZighTm8oT2UpfHwhKE9lLnNoYXBlRmxhZyY0KSYmIShPZS5zaGFwZUZsYWcmMTI4KSlyZXR1cm4gRD1udWxsLE9lO3ZhciBTZT1FdChPZSksVmU9U2UudHlwZSx2dD13cyhXKFNlKT9TZS50eXBlLl9fYXN5bmNSZXNvbHZlZHx8e306VmUpLHtpbmNsdWRlOnJ0LGV4Y2x1ZGU6QixtYXg6Vn09aTtpZihydCYmKCF2dHx8IUp0KHJ0LHZ0KSl8fEImJnZ0JiZKdChCLHZ0KSlyZXR1cm4gRD1TZSxPZTt2YXIgdGU9U2Uua2V5PT1udWxsP1ZlOlNlLmtleSxkZT1ULmdldCh0ZSk7cmV0dXJuIFNlLmVsJiYoU2U9Qm4oU2UpLE9lLnNoYXBlRmxhZyYxMjgmJihPZS5zc0NvbnRlbnQ9U2UpKSxQdD10ZSxkZT8oU2UuZWw9ZGUuZWwsU2UuY29tcG9uZW50PWRlLmNvbXBvbmVudCxTZS50cmFuc2l0aW9uJiZraShTZSxTZS50cmFuc2l0aW9uKSxTZS5zaGFwZUZsYWd8PTUxMixrLmRlbGV0ZSh0ZSksay5hZGQodGUpKTooay5hZGQodGUpLFYmJmsuc2l6ZT5wYXJzZUludChWLDEwKSYmbnQoay52YWx1ZXMoKS5uZXh0KCkudmFsdWUpKSxTZS5zaGFwZUZsYWd8PTI1NixEPVNlLE9pKE9lLnR5cGUpP09lOlNlfX19LFF0PWF0O2Z1bmN0aW9uIEp0KGksbCl7cmV0dXJuIGcuaXNBcnJheShpKT9pLnNvbWUoaD0+SnQoaCxsKSk6Zy5pc1N0cmluZyhpKT9pLnNwbGl0KCIsIikuaW5jbHVkZXMobCk6Zy5pc1JlZ0V4cChpKT9pLnRlc3QobCk6ITF9ZnVuY3Rpb24gT3IoaSxsKXtocihpLCJhIixsKX1mdW5jdGlvbiBJaShpLGwpe2hyKGksImRhIixsKX1mdW5jdGlvbiBocihpLGwpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpycix2PWkuX193ZGN8fChpLl9fd2RjPSgpPT57Zm9yKHZhciBUPWg7VDspe2lmKFQuaXNEZWFjdGl2YXRlZClyZXR1cm47VD1ULnBhcmVudH1yZXR1cm4gaSgpfSk7aWYoRHQobCx2LGgpLGgpZm9yKHZhciBBPWgucGFyZW50O0EmJkEucGFyZW50Oyl6ZShBLnBhcmVudC52bm9kZSkmJlByKHYsbCxoLEEpLEE9QS5wYXJlbnR9ZnVuY3Rpb24gUHIoaSxsLGgsdil7dmFyIEE9RHQobCxpLHYsITApO0xlKCgpPT57Zy5yZW1vdmUodltsXSxBKX0saCl9ZnVuY3Rpb24gUmkoaSl7aS5zaGFwZUZsYWcmPX4yNTYsaS5zaGFwZUZsYWcmPX41MTJ9ZnVuY3Rpb24gRXQoaSl7cmV0dXJuIGkuc2hhcGVGbGFnJjEyOD9pLnNzQ29udGVudDppfWZ1bmN0aW9uIER0KGksbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOnJyLHY9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOiExO2lmKGgpe2lmKEkuaXNSb290SG9vayhpKSYmaCE9PWgucm9vdCYmKGg9aC5yb290LEkuaXNSb290SW1tZWRpYXRlSG9vayhpKSkpe3ZhciBBPWgucHJveHk7bG4obC5iaW5kKEEpLGgsaSxJLk9OX0xPQUQ9PT1pP1tBLiRwYWdlLm9wdGlvbnNdOltdKX12YXJ7X19wYWdlX2NvbnRhaW5lcl9fOlR9PWgucm9vdC52bm9kZTtUJiZULm9uSW5qZWN0SG9vayhpKTt2YXIgaz1oW2ldfHwoaFtpXT1bXSksRD1sLl9fd2VofHwobC5fX3dlaD1mdW5jdGlvbigpe2lmKCFoLmlzVW5tb3VudGVkKXt5LnBhdXNlVHJhY2tpbmcoKTtmb3IodmFyIGo9TmEoaCksWj1hcmd1bWVudHMubGVuZ3RoLGZlPW5ldyBBcnJheShaKSxnZT0wO2dlPFo7Z2UrKylmZVtnZV09YXJndW1lbnRzW2dlXTt2YXIgcmU9bG4obCxoLGksZmUpO3JldHVybiBqKCkseS5yZXNldFRyYWNraW5nKCkscmV9fSk7cmV0dXJuIHY/ay51bnNoaWZ0KEQpOmsucHVzaChEKSxEfX12YXIgbmk9aT0+ZnVuY3Rpb24obCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnJyO3JldHVybighYi5pc0luU1NSQ29tcG9uZW50U2V0dXB8fGk9PT0ic3AiKSYmRHQoaSxmdW5jdGlvbigpe3JldHVybiBsKC4uLmFyZ3VtZW50cyl9LGgpfSx3bz1uaSgiYm0iKSxBbz1uaSgibSIpLHNlPW5pKCJidSIpLFk9bmkoInUiKSxpZT1uaSgiYnVtIiksTGU9bmkoInVtIiksbHQ9bmkoInNwIiksZm49bmkoInJ0ZyIpLE5yPW5pKCJydGMiKTtmdW5jdGlvbiB3cihpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06cnI7RHQoImVjIixpLGwpfWZ1bmN0aW9uIEppKGksbCxoLHYpe3ZhciBBLFQ9aCYmaFt2XTtpZihnLmlzQXJyYXkoaSl8fGcuaXNTdHJpbmcoaSkpe0E9bmV3IEFycmF5KGkubGVuZ3RoKTtmb3IodmFyIGs9MCxEPWkubGVuZ3RoO2s8RDtrKyspQVtrXT1sKGlba10sayx2b2lkIDAsVCYmVFtrXSl9ZWxzZSBpZih0eXBlb2YgaT09Im51bWJlciIpe0E9bmV3IEFycmF5KGkpO2Zvcih2YXIgaj0wO2o8aTtqKyspQVtqXT1sKGorMSxqLHZvaWQgMCxUJiZUW2pdKX1lbHNlIGlmKGcuaXNPYmplY3QoaSkpaWYoaVtTeW1ib2wuaXRlcmF0b3JdKUE9QXJyYXkuZnJvbShpLCh2ZSxXZSk9PmwodmUsV2Usdm9pZCAwLFQmJlRbV2VdKSk7ZWxzZXt2YXIgWj1PYmplY3Qua2V5cyhpKTtBPW5ldyBBcnJheShaLmxlbmd0aCk7Zm9yKHZhciBmZT0wLGdlPVoubGVuZ3RoO2ZlPGdlO2ZlKyspe3ZhciByZT1aW2ZlXTtBW2ZlXT1sKGlbcmVdLHJlLGZlLFQmJlRbZmVdKX19ZWxzZSBBPVtdO3JldHVybiBoJiYoaFt2XT1BKSxBfWZ1bmN0aW9uIEZyKGksbCl7Zm9yKHZhciBoPWZ1bmN0aW9uKEEpe3ZhciBUPWxbQV07aWYoZy5pc0FycmF5KFQpKWZvcih2YXIgaz0wO2s8VC5sZW5ndGg7aysrKWlbVFtrXS5uYW1lXT1UW2tdLmZuO2Vsc2UgVCYmKGlbVC5uYW1lXT1ULmtleT9mdW5jdGlvbigpe3ZhciBEPVQuZm4oLi4uYXJndW1lbnRzKTtyZXR1cm4gRCYmKEQua2V5PVQua2V5KSxEfTpULmZuKX0sdj0wO3Y8bC5sZW5ndGg7disrKWgodik7cmV0dXJuIGl9ZnVuY3Rpb24gdW8oaSxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sdj1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMCxBPWFyZ3VtZW50cy5sZW5ndGg+ND9hcmd1bWVudHNbNF06dm9pZCAwO2lmKEhuLmlzQ0V8fEhuLnBhcmVudCYmVyhIbi5wYXJlbnQpJiZIbi5wYXJlbnQuaXNDRSlyZXR1cm4gbCE9PSJkZWZhdWx0IiYmKGgubmFtZT1sKSx0bigic2xvdCIsaCx2JiZ2KCkpO3ZhciBUPWlbbF07VCYmVC5fYyYmKFQuX2Q9ITEpLFRhKCk7dmFyIGs9VCYmQ28oVChoKSksRD1MaShucix7a2V5Omgua2V5fHxrJiZrLmtleXx8Il8iLmNvbmNhdChsKX0sa3x8KHY/digpOltdKSxrJiZpLl89PT0xPzY0Oi0yKTtyZXR1cm4hQSYmRC5zY29wZUlkJiYoRC5zbG90U2NvcGVJZHM9W0Quc2NvcGVJZCsiLXMiXSksVCYmVC5fYyYmKFQuX2Q9ITApLER9ZnVuY3Rpb24gQ28oaSl7cmV0dXJuIGkuc29tZShsPT5ObyhsKT8hKGwudHlwZT09PWdyfHxsLnR5cGU9PT1uciYmIUNvKGwuY2hpbGRyZW4pKTohMCk/aTpudWxsfWZ1bmN0aW9uIFRvKGksbCl7dmFyIGg9e307Zm9yKHZhciB2IGluIGkpaFtsJiYvW0EtWl0vLnRlc3Qodik/Im9uOiIuY29uY2F0KHYpOmcudG9IYW5kbGVyS2V5KHYpXT1pW3ZdO3JldHVybiBofXZhciBuYT1pPT5pP2lzKGkpP0lhKGkpfHxpLnByb3h5Om5hKGkucGFyZW50KTpudWxsLGxyPWcuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCkseyQ6aT0+aSwkZWw6aT0+aS52bm9kZS5lbCwkZGF0YTppPT5pLmRhdGEsJHByb3BzOmk9PmkucHJvcHMsJGF0dHJzOmk9PmkuYXR0cnMsJHNsb3RzOmk9Pmkuc2xvdHMsJHJlZnM6aT0+aS5yZWZzLCRwYXJlbnQ6aT0+bmEoaS5wYXJlbnQpLCRyb290Omk9Pm5hKGkucm9vdCksJGVtaXQ6aT0+aS5lbWl0LCRvcHRpb25zOmk9PnhpKGkpLCRmb3JjZVVwZGF0ZTppPT5pLmZ8fChpLmY9KCk9PntpLmVmZmVjdC5kaXJ0eT0hMCxobihpLnVwZGF0ZSl9KSwkbmV4dFRpY2s6aT0+aS5ufHwoaS5uPVhlLmJpbmQoaS5wcm94eSkpLCR3YXRjaDppPT50aS5iaW5kKGkpfSksRHI9KGksbCk9PmkhPT1nLkVNUFRZX09CSiYmIWkuX19pc1NjcmlwdFNldHVwJiZnLmhhc093bihpLGwpLFhhPXtnZXQoaSxsKXt2YXJ7XzpofT1pLHtjdHg6dixzZXR1cFN0YXRlOkEsZGF0YTpULHByb3BzOmssYWNjZXNzQ2FjaGU6RCx0eXBlOmosYXBwQ29udGV4dDpafT1oLGZlO2lmKGxbMF0hPT0iJCIpe3ZhciBnZT1EW2xdO2lmKGdlIT09dm9pZCAwKXN3aXRjaChnZSl7Y2FzZSAxOnJldHVybiBBW2xdO2Nhc2UgMjpyZXR1cm4gVFtsXTtjYXNlIDQ6cmV0dXJuIHZbbF07Y2FzZSAzOnJldHVybiBrW2xdfWVsc2V7aWYoRHIoQSxsKSlyZXR1cm4gRFtsXT0xLEFbbF07aWYoVCE9PWcuRU1QVFlfT0JKJiZnLmhhc093bihULGwpKXJldHVybiBEW2xdPTIsVFtsXTtpZigoZmU9aC5wcm9wc09wdGlvbnNbMF0pJiZnLmhhc093bihmZSxsKSlyZXR1cm4gRFtsXT0zLGtbbF07aWYodiE9PWcuRU1QVFlfT0JKJiZnLmhhc093bih2LGwpKXJldHVybiBEW2xdPTQsdltsXTtEYSYmKERbbF09MCl9fXZhciByZT1scltsXSx2ZSxXZTtpZihyZSlyZXR1cm4gbD09PSIkYXR0cnMiJiZ5LnRyYWNrKGgsImdldCIsbCkscmUoaCk7aWYoKHZlPWouX19jc3NNb2R1bGVzKSYmKHZlPXZlW2xdKSlyZXR1cm4gdmU7aWYodiE9PWcuRU1QVFlfT0JKJiZnLmhhc093bih2LGwpKXJldHVybiBEW2xdPTQsdltsXTtpZihXZT1aLmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLGcuaGFzT3duKFdlLGwpKXJldHVybiBXZVtsXX0sc2V0KGksbCxoKXt2YXJ7Xzp2fT1pLHtkYXRhOkEsc2V0dXBTdGF0ZTpULGN0eDprfT12O3JldHVybiBEcihULGwpPyhUW2xdPWgsITApOkEhPT1nLkVNUFRZX09CSiYmZy5oYXNPd24oQSxsKT8oQVtsXT1oLCEwKTpnLmhhc093bih2LnByb3BzLGwpfHxsWzBdPT09IiQiJiZsLnNsaWNlKDEpaW4gdj8hMTooa1tsXT1oLCEwKX0saGFzKGksbCl7dmFye186e2RhdGE6aCxzZXR1cFN0YXRlOnYsYWNjZXNzQ2FjaGU6QSxjdHg6VCxhcHBDb250ZXh0OmsscHJvcHNPcHRpb25zOkR9fT1pLGo7cmV0dXJuISFBW2xdfHxoIT09Zy5FTVBUWV9PQkomJmcuaGFzT3duKGgsbCl8fERyKHYsbCl8fChqPURbMF0pJiZnLmhhc093bihqLGwpfHxnLmhhc093bihULGwpfHxnLmhhc093bihscixsKXx8Zy5oYXNPd24oay5jb25maWcuZ2xvYmFsUHJvcGVydGllcyxsKX0sZGVmaW5lUHJvcGVydHkoaSxsLGgpe3JldHVybiBoLmdldCE9bnVsbD9pLl8uYWNjZXNzQ2FjaGVbbF09MDpnLmhhc093bihoLCJ2YWx1ZSIpJiZ0aGlzLnNldChpLGwsaC52YWx1ZSxudWxsKSxSZWZsZWN0LmRlZmluZVByb3BlcnR5KGksbCxoKX19LFFhPWcuZXh0ZW5kKHt9LFhhLHtnZXQoaSxsKXtpZihsIT09U3ltYm9sLnVuc2NvcGFibGVzKXJldHVybiBYYS5nZXQoaSxsLGkpfSxoYXMoaSxsKXt2YXIgaD1sWzBdIT09Il8iJiYhZy5pc0dsb2JhbGx5QWxsb3dlZChsKTtyZXR1cm4gaH19KTtmdW5jdGlvbiByaSgpe3JldHVybiBudWxsfWZ1bmN0aW9uIFFzKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gZWwoaSl7fWZ1bmN0aW9uIHRsKGkpe31mdW5jdGlvbiBubCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIFJzKCl7fWZ1bmN0aW9uIHJhKGksbCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gcmwoKXtyZXR1cm4gaWEoKS5zbG90c31mdW5jdGlvbiBlcigpe3JldHVybiBpYSgpLmF0dHJzfWZ1bmN0aW9uIGlhKCl7dmFyIGk9SW8oKTtyZXR1cm4gaS5zZXR1cENvbnRleHR8fChpLnNldHVwQ29udGV4dD1IYShpKSl9ZnVuY3Rpb24gRG8oaSl7cmV0dXJuIGcuaXNBcnJheShpKT9pLnJlZHVjZSgobCxoKT0+KGxbaF09bnVsbCxsKSx7fSk6aX1mdW5jdGlvbiBLaShpLGwpe3ZhciBoPURvKGkpO2Zvcih2YXIgdiBpbiBsKWlmKCF2LnN0YXJ0c1dpdGgoIl9fc2tpcCIpKXt2YXIgQT1oW3ZdO0E/Zy5pc0FycmF5KEEpfHxnLmlzRnVuY3Rpb24oQSk/QT1oW3ZdPXt0eXBlOkEsZGVmYXVsdDpsW3ZdfTpBLmRlZmF1bHQ9bFt2XTpBPT09bnVsbCYmKEE9aFt2XT17ZGVmYXVsdDpsW3ZdfSksQSYmbFsiX19za2lwXyIuY29uY2F0KHYpXSYmKEEuc2tpcEZhY3Rvcnk9ITApfXJldHVybiBofWZ1bmN0aW9uIHhzKGksbCl7cmV0dXJuIWl8fCFsP2l8fGw6Zy5pc0FycmF5KGkpJiZnLmlzQXJyYXkobCk/aS5jb25jYXQobCk6Zy5leHRlbmQoe30sRG8oaSksRG8obCkpfWZ1bmN0aW9uIGlsKGksbCl7dmFyIGg9e30sdj1mdW5jdGlvbihUKXtsLmluY2x1ZGVzKFQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoaCxULHtlbnVtZXJhYmxlOiEwLGdldDooKT0+aVtUXX0pfTtmb3IodmFyIEEgaW4gaSl2KEEpO3JldHVybiBofWZ1bmN0aW9uIG9hKGkpe3ZhciBsPUlvKCksaD1pKCk7cmV0dXJuIHJzKCksZy5pc1Byb21pc2UoaCkmJihoPWguY2F0Y2godj0+e3Rocm93IE5hKGwpLHZ9KSksW2gsKCk9Pk5hKGwpXX12YXIgRGE9ITA7ZnVuY3Rpb24gVm8oaSl7dmFyIGw9eGkoaSksaD1pLnByb3h5LHY9aS5jdHg7RGE9ITEsbC5iZWZvcmVDcmVhdGUmJm1zKGwuYmVmb3JlQ3JlYXRlLGksImJjIik7dmFye2RhdGE6QSxjb21wdXRlZDpULG1ldGhvZHM6ayx3YXRjaDpELHByb3ZpZGU6aixpbmplY3Q6WixjcmVhdGVkOmZlLGJlZm9yZU1vdW50OmdlLG1vdW50ZWQ6cmUsYmVmb3JlVXBkYXRlOnZlLHVwZGF0ZWQ6V2UsYWN0aXZhdGVkOml0LGRlYWN0aXZhdGVkOm50LGJlZm9yZURlc3Ryb3k6UHQsYmVmb3JlVW5tb3VudDpJdCxkZXN0cm95ZWQ6dWUsdW5tb3VudGVkOk9lLHJlbmRlcjpTZSxyZW5kZXJUcmFja2VkOlZlLHJlbmRlclRyaWdnZXJlZDp2dCxlcnJvckNhcHR1cmVkOnJ0LHNlcnZlclByZWZldGNoOkIsZXhwb3NlOlYsaW5oZXJpdEF0dHJzOnRlLGNvbXBvbmVudHM6ZGUsZGlyZWN0aXZlczpvZSxmaWx0ZXJzOlJlfT1sO2lmKFomJl9hKFosdiksaylmb3IodmFyIGplIGluIGspe3ZhciB5ZT1rW2plXTtnLmlzRnVuY3Rpb24oeWUpJiYodltqZV09eWUuYmluZChoKSl9aWYoQSl7dmFyIEplPUEuY2FsbChoLGgpO2cuaXNPYmplY3QoSmUpJiYoaS5kYXRhPXkucmVhY3RpdmUoSmUpKX1pZihEYT0hMCxUKXt2YXIgVWU9ZnVuY3Rpb24oRG4pe3ZhciBKbj1UW0RuXSxpcj1nLmlzRnVuY3Rpb24oSm4pP0puLmJpbmQoaCxoKTpnLmlzRnVuY3Rpb24oSm4uZ2V0KT9Kbi5nZXQuYmluZChoLGgpOmcuTk9PUCxmYT0hZy5pc0Z1bmN0aW9uKEpuKSYmZy5pc0Z1bmN0aW9uKEpuLnNldCk/Sm4uc2V0LmJpbmQoaCk6Zy5OT09QLFZuPXBsKHtnZXQ6aXIsc2V0OmZhfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHYsRG4se2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDooKT0+Vm4udmFsdWUsc2V0OnhhPT5Wbi52YWx1ZT14YX0pfTtmb3IodmFyIHl0IGluIFQpVWUoeXQpfWlmKEQpZm9yKHZhciBUdCBpbiBEKWJhKERbVHRdLHYsaCxUdCk7aWYoail7dmFyIFJ0PWcuaXNGdW5jdGlvbihqKT9qLmNhbGwoaCk6ajtSZWZsZWN0Lm93bktleXMoUnQpLmZvckVhY2goRG49Pnt6KERuLFJ0W0RuXSl9KX1mZSYmbXMoZmUsaSwiYyIpO2Z1bmN0aW9uIFV0KERuLEpuKXtnLmlzQXJyYXkoSm4pP0puLmZvckVhY2goaXI9PkRuKGlyLmJpbmQoaCkpKTpKbiYmRG4oSm4uYmluZChoKSl9aWYoVXQod28sZ2UpLFV0KEFvLHJlKSxVdChzZSx2ZSksVXQoWSxXZSksVXQoT3IsaXQpLFV0KElpLG50KSxVdCh3cixydCksVXQoTnIsVmUpLFV0KGZuLHZ0KSxVdChpZSxJdCksVXQoTGUsT2UpLFV0KGx0LEIpLGcuaXNBcnJheShWKSlpZihWLmxlbmd0aCl7dmFyIEZuPWkuZXhwb3NlZHx8KGkuZXhwb3NlZD17fSk7Vi5mb3JFYWNoKERuPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KEZuLERuLHtnZXQ6KCk9PmhbRG5dLHNldDpKbj0+aFtEbl09Sm59KX0pfWVsc2UgaS5leHBvc2VkfHwoaS5leHBvc2VkPXt9KTtTZSYmaS5yZW5kZXI9PT1nLk5PT1AmJihpLnJlbmRlcj1TZSksdGUhPW51bGwmJihpLmluaGVyaXRBdHRycz10ZSksZGUmJihpLmNvbXBvbmVudHM9ZGUpLG9lJiYoaS5kaXJlY3RpdmVzPW9lKTt2YXIgSW49aS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLiRhcHBseU9wdGlvbnM7SW4mJkluKGwsaSxoKX1mdW5jdGlvbiBfYShpLGwpe2cuaXNBcnJheShpKSYmKGk9VmEoaSkpO3ZhciBoPWZ1bmN0aW9uKEEpe3ZhciBUPWlbQV0saz12b2lkIDA7Zy5pc09iamVjdChUKT8iZGVmYXVsdCJpbiBUP2s9JChULmZyb218fEEsVC5kZWZhdWx0LCEwKTprPSQoVC5mcm9tfHxBKTprPSQoVCkseS5pc1JlZihrKT9PYmplY3QuZGVmaW5lUHJvcGVydHkobCxBLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9PmsudmFsdWUsc2V0OkQ9PmsudmFsdWU9RH0pOmxbQV09a307Zm9yKHZhciB2IGluIGkpaCh2KX1mdW5jdGlvbiBtcyhpLGwsaCl7bG4oZy5pc0FycmF5KGkpP2kubWFwKHY9PnYuYmluZChsLnByb3h5KSk6aS5iaW5kKGwucHJveHkpLGwsaCl9ZnVuY3Rpb24gYmEoaSxsLGgsdil7dmFyIEE9di5pbmNsdWRlcygiLiIpP3BuKGgsdik6KCk9Pmhbdl07aWYoZy5pc1N0cmluZyhpKSl7dmFyIFQ9bFtpXTtnLmlzRnVuY3Rpb24oVCkmJk1yKEEsVCl9ZWxzZSBpZihnLmlzRnVuY3Rpb24oaSkpTXIoQSxpLmJpbmQoaCkpO2Vsc2UgaWYoZy5pc09iamVjdChpKSlpZihnLmlzQXJyYXkoaSkpaS5mb3JFYWNoKEQ9PmJhKEQsbCxoLHYpKTtlbHNle3ZhciBrPWcuaXNGdW5jdGlvbihpLmhhbmRsZXIpP2kuaGFuZGxlci5iaW5kKGgpOmxbaS5oYW5kbGVyXTtnLmlzRnVuY3Rpb24oaykmJk1yKEEsayxpKX19ZnVuY3Rpb24geGkoaSl7dmFyIGw9aS50eXBlLHttaXhpbnM6aCxleHRlbmRzOnZ9PWwse21peGluczpBLG9wdGlvbnNDYWNoZTpULGNvbmZpZzp7b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOmt9fT1pLmFwcENvbnRleHQsRD1ULmdldChsKSxqO3JldHVybiBEP2o9RDohQS5sZW5ndGgmJiFoJiYhdj9qPWw6KGo9e30sQS5sZW5ndGgmJkEuZm9yRWFjaChaPT5VbyhqLFosaywhMCkpLFVvKGosbCxrKSksZy5pc09iamVjdChsKSYmVC5zZXQobCxqKSxqfWZ1bmN0aW9uIFVvKGksbCxoKXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEse21peGluczpBLGV4dGVuZHM6VH09bDtUJiZVbyhpLFQsaCwhMCksQSYmQS5mb3JFYWNoKGo9PlVvKGksaixoLCEwKSk7Zm9yKHZhciBrIGluIGwpaWYoISh2JiZrPT09ImV4cG9zZSIpKXt2YXIgRD1WcltrXXx8aCYmaFtrXTtpW2tdPUQ/RChpW2tdLGxba10pOmxba119cmV0dXJuIGl9dmFyIFZyPXtkYXRhOmFhLHByb3BzOmJzLGVtaXRzOmJzLG1ldGhvZHM6WmksY29tcHV0ZWQ6WmksYmVmb3JlQ3JlYXRlOkpyLGNyZWF0ZWQ6SnIsYmVmb3JlTW91bnQ6SnIsbW91bnRlZDpKcixiZWZvcmVVcGRhdGU6SnIsdXBkYXRlZDpKcixiZWZvcmVEZXN0cm95OkpyLGJlZm9yZVVubW91bnQ6SnIsZGVzdHJveWVkOkpyLHVubW91bnRlZDpKcixhY3RpdmF0ZWQ6SnIsZGVhY3RpdmF0ZWQ6SnIsZXJyb3JDYXB0dXJlZDpKcixzZXJ2ZXJQcmVmZXRjaDpKcixjb21wb25lbnRzOlppLGRpcmVjdGl2ZXM6Wmksd2F0Y2g6eWEscHJvdmlkZTphYSxpbmplY3Q6X3N9O2Z1bmN0aW9uIGFhKGksbCl7cmV0dXJuIGw/aT9mdW5jdGlvbigpe3JldHVybiBnLmV4dGVuZChnLmlzRnVuY3Rpb24oaSk/aS5jYWxsKHRoaXMsdGhpcyk6aSxnLmlzRnVuY3Rpb24obCk/bC5jYWxsKHRoaXMsdGhpcyk6bCl9Omw6aX1mdW5jdGlvbiBfcyhpLGwpe3JldHVybiBaaShWYShpKSxWYShsKSl9ZnVuY3Rpb24gVmEoaSl7aWYoZy5pc0FycmF5KGkpKXtmb3IodmFyIGw9e30saD0wO2g8aS5sZW5ndGg7aCsrKWxbaVtoXV09aVtoXTtyZXR1cm4gbH1yZXR1cm4gaX1mdW5jdGlvbiBKcihpLGwpe3JldHVybiBpP1suLi5uZXcgU2V0KFtdLmNvbmNhdChpLGwpKV06bH1mdW5jdGlvbiBaaShpLGwpe3JldHVybiBpP2cuZXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCksaSxsKTpsfWZ1bmN0aW9uIGJzKGksbCl7cmV0dXJuIGk/Zy5pc0FycmF5KGkpJiZnLmlzQXJyYXkobCk/Wy4uLm5ldyBTZXQoWy4uLmksLi4ubF0pXTpnLmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLERvKGkpLERvKGwhPW51bGw/bDp7fSkpOmx9ZnVuY3Rpb24geWEoaSxsKXtpZighaSlyZXR1cm4gbDtpZighbClyZXR1cm4gaTt2YXIgaD1nLmV4dGVuZChPYmplY3QuY3JlYXRlKG51bGwpLGkpO2Zvcih2YXIgdiBpbiBsKWhbdl09SnIoaVt2XSxsW3ZdKTtyZXR1cm4gaH1mdW5jdGlvbiBlcygpe3JldHVybnthcHA6bnVsbCxjb25maWc6e2lzTmF0aXZlVGFnOmcuTk8scGVyZm9ybWFuY2U6ITEsZ2xvYmFsUHJvcGVydGllczp7fSxvcHRpb25NZXJnZVN0cmF0ZWdpZXM6e30sZXJyb3JIYW5kbGVyOnZvaWQgMCx3YXJuSGFuZGxlcjp2b2lkIDAsY29tcGlsZXJPcHRpb25zOnt9fSxtaXhpbnM6W10sY29tcG9uZW50czp7fSxkaXJlY3RpdmVzOnt9LHByb3ZpZGVzOk9iamVjdC5jcmVhdGUobnVsbCksb3B0aW9uc0NhY2hlOm5ldyBXZWFrTWFwLHByb3BzQ2FjaGU6bmV3IFdlYWtNYXAsZW1pdHNDYWNoZTpuZXcgV2Vha01hcH19dmFyIEVhPTA7ZnVuY3Rpb24gRShpLGwpe3JldHVybiBmdW5jdGlvbih2KXt2YXIgQT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbDtnLmlzRnVuY3Rpb24odil8fCh2PWcuZXh0ZW5kKHt9LHYpKSxBIT1udWxsJiYhZy5pc09iamVjdChBKSYmKEE9bnVsbCk7dmFyIFQ9ZXMoKSxrPW5ldyBXZWFrU2V0LEQ9ITEsaj1ULmFwcD17X3VpZDpFYSsrLF9jb21wb25lbnQ6dixfcHJvcHM6QSxfY29udGFpbmVyOm51bGwsX2NvbnRleHQ6VCxfaW5zdGFuY2U6bnVsbCx2ZXJzaW9uOiRsLGdldCBjb25maWcoKXtyZXR1cm4gVC5jb25maWd9LHNldCBjb25maWcoWil7fSx1c2UoWil7Zm9yKHZhciBmZT1hcmd1bWVudHMubGVuZ3RoLGdlPW5ldyBBcnJheShmZT4xP2ZlLTE6MCkscmU9MTtyZTxmZTtyZSsrKWdlW3JlLTFdPWFyZ3VtZW50c1tyZV07cmV0dXJuIGsuaGFzKFopfHwoWiYmZy5pc0Z1bmN0aW9uKFouaW5zdGFsbCk/KGsuYWRkKFopLFouaW5zdGFsbChqLC4uLmdlKSk6Zy5pc0Z1bmN0aW9uKFopJiYoay5hZGQoWiksWihqLC4uLmdlKSkpLGp9LG1peGluKFope3JldHVybiBULm1peGlucy5pbmNsdWRlcyhaKXx8VC5taXhpbnMucHVzaChaKSxqfSxjb21wb25lbnQoWixmZSl7cmV0dXJuIGZlPyhULmNvbXBvbmVudHNbWl09ZmUsaik6VC5jb21wb25lbnRzW1pdfSxkaXJlY3RpdmUoWixmZSl7cmV0dXJuIGZlPyhULmRpcmVjdGl2ZXNbWl09ZmUsaik6VC5kaXJlY3RpdmVzW1pdfSxtb3VudChaLGZlLGdlKXtpZighRCl7dmFyIHJlPXRuKHYsQSk7cmV0dXJuIHJlLmFwcENvbnRleHQ9VCxnZT09PSEwP2dlPSJzdmciOmdlPT09ITEmJihnZT12b2lkIDApLGZlJiZsP2wocmUsWik6aShyZSxaLGdlKSxEPSEwLGouX2NvbnRhaW5lcj1aLFouX192dWVfYXBwX189aixqLl9pbnN0YW5jZT1yZS5jb21wb25lbnQsSWEocmUuY29tcG9uZW50KXx8cmUuY29tcG9uZW50LnByb3h5fX0sdW5tb3VudCgpe0QmJihpKG51bGwsai5fY29udGFpbmVyKSxkZWxldGUgai5fY29udGFpbmVyLl9fdnVlX2FwcF9fKX0scHJvdmlkZShaLGZlKXtyZXR1cm4gVC5wcm92aWRlc1taXT1mZSxqfSxydW5XaXRoQ29udGV4dChaKXt2YXIgZmU9eDt4PWo7dHJ5e3JldHVybiBaKCl9ZmluYWxseXt4PWZlfX19O3JldHVybiBqfX12YXIgeD1udWxsO2Z1bmN0aW9uIHooaSxsKXtpZihycil7dmFyIGg9cnIucHJvdmlkZXMsdj1yci5wYXJlbnQmJnJyLnBhcmVudC5wcm92aWRlczt2PT09aCYmKGg9cnIucHJvdmlkZXM9T2JqZWN0LmNyZWF0ZSh2KSksaFtpXT1sLHJyLnR5cGUubXBUeXBlPT09ImFwcCImJnJyLmFwcENvbnRleHQuYXBwLnByb3ZpZGUoaSxsKX19ZnVuY3Rpb24gJChpLGwpe3ZhciBoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTohMSx2PXJyfHxIbjtpZih2fHx4KXt2YXIgQT12P3YucGFyZW50PT1udWxsP3Yudm5vZGUuYXBwQ29udGV4dCYmdi52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzOnYucGFyZW50LnByb3ZpZGVzOnguX2NvbnRleHQucHJvdmlkZXM7aWYoQSYmaSBpbiBBKXJldHVybiBBW2ldO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gaCYmZy5pc0Z1bmN0aW9uKGwpP2wuY2FsbCh2JiZ2LnByb3h5KTpsfX1mdW5jdGlvbiBLKCl7cmV0dXJuISEocnJ8fEhufHx4KX1mdW5jdGlvbiBYKGksbCxoKXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsQT17fSxUPXt9O2cuZGVmKFQsX2UsMSksaS5wcm9wc0RlZmF1bHRzPU9iamVjdC5jcmVhdGUobnVsbCksbWUoaSxsLEEsVCk7Zm9yKHZhciBrIGluIGkucHJvcHNPcHRpb25zWzBdKWsgaW4gQXx8KEFba109dm9pZCAwKTtoP2kucHJvcHM9dj9BOnkuc2hhbGxvd1JlYWN0aXZlKEEpOmkudHlwZS5wcm9wcz9pLnByb3BzPUE6aS5wcm9wcz1ULGkuYXR0cnM9VH1mdW5jdGlvbiBjZShpLGwsaCx2KXt2YXJ7cHJvcHM6QSxhdHRyczpULHZub2RlOntwYXRjaEZsYWc6a319PWksRD15LnRvUmF3KEEpLFtqXT1pLnByb3BzT3B0aW9ucyxaPSExO2lmKCh2fHxrPjApJiYhKGsmMTYpKXtpZihrJjgpZm9yKHZhciBmZT1pLnZub2RlLmR5bmFtaWNQcm9wcyxnZT0wO2dlPGZlLmxlbmd0aDtnZSsrKXt2YXIgcmU9ZmVbZ2VdO2lmKCFtaShpLmVtaXRzT3B0aW9ucyxyZSkpe3ZhciB2ZT1sW3JlXTtpZihqKWlmKGcuaGFzT3duKFQscmUpKXZlIT09VFtyZV0mJihUW3JlXT12ZSxaPSEwKTtlbHNle3ZhciBXZT1nLmNhbWVsaXplKHJlKTtBW1dlXT1OZShqLEQsV2UsdmUsaSwhMSl9ZWxzZSB2ZSE9PVRbcmVdJiYoVFtyZV09dmUsWj0hMCl9fX1lbHNle21lKGksbCxBLFQpJiYoWj0hMCk7dmFyIGl0O2Zvcih2YXIgbnQgaW4gRCkoIWx8fCFnLmhhc093bihsLG50KSYmKChpdD1nLmh5cGhlbmF0ZShudCkpPT09bnR8fCFnLmhhc093bihsLGl0KSkpJiYoaj9oJiYoaFtudF0hPT12b2lkIDB8fGhbaXRdIT09dm9pZCAwKSYmKEFbbnRdPU5lKGosRCxudCx2b2lkIDAsaSwhMCkpOmRlbGV0ZSBBW250XSk7aWYoVCE9PUQpZm9yKHZhciBQdCBpbiBUKSghbHx8IWcuaGFzT3duKGwsUHQpJiYhMCkmJihkZWxldGUgVFtQdF0sWj0hMCl9WiYmeS50cmlnZ2VyKGksInNldCIsIiRhdHRycyIpfWZ1bmN0aW9uIG1lKGksbCxoLHYpe3ZhcltBLFRdPWkucHJvcHNPcHRpb25zLGs9ITEsRDtpZihsKXtmb3IodmFyIGogaW4gbClpZighZy5pc1Jlc2VydmVkUHJvcChqKSl7dmFyIFo9bFtqXSxmZT12b2lkIDA7QSYmZy5oYXNPd24oQSxmZT1nLmNhbWVsaXplKGopKT8hVHx8IVQuaW5jbHVkZXMoZmUpP2hbZmVdPVo6KER8fChEPXt9KSlbZmVdPVo6bWkoaS5lbWl0c09wdGlvbnMsail8fCghKGogaW4gdil8fFohPT12W2pdKSYmKHZbal09WixrPSEwKX19aWYoVClmb3IodmFyIGdlPXkudG9SYXcoaCkscmU9RHx8Zy5FTVBUWV9PQkosdmU9MDt2ZTxULmxlbmd0aDt2ZSsrKXt2YXIgV2U9VFt2ZV07aFtXZV09TmUoQSxnZSxXZSxyZVtXZV0saSwhZy5oYXNPd24ocmUsV2UpKX1yZXR1cm4ga31mdW5jdGlvbiBOZShpLGwsaCx2LEEsVCl7dmFyIGs9aVtoXTtpZihrIT1udWxsKXt2YXIgRD1nLmhhc093bihrLCJkZWZhdWx0Iik7aWYoRCYmdj09PXZvaWQgMCl7dmFyIGo9ay5kZWZhdWx0O2lmKGsudHlwZSE9PUZ1bmN0aW9uJiYhay5za2lwRmFjdG9yeSYmZy5pc0Z1bmN0aW9uKGopKXt2YXJ7cHJvcHNEZWZhdWx0czpafT1BO2lmKGggaW4gWil2PVpbaF07ZWxzZXt2YXIgZmU9TmEoQSk7dj1aW2hdPWouY2FsbChudWxsLGwpLGZlKCl9fWVsc2Ugdj1qfWtbMF0mJihUJiYhRD92PSExOmtbMV0mJih2PT09IiJ8fHY9PT1nLmh5cGhlbmF0ZShoKSkmJih2PSEwKSl9cmV0dXJuIHZ9ZnVuY3Rpb24gRmUoaSxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsdj1sLnByb3BzQ2FjaGUsQT12LmdldChpKTtpZihBKXJldHVybiBBO3ZhciBUPWkucHJvcHMsaz17fSxEPVtdLGo9ITE7aWYoIWcuaXNGdW5jdGlvbihpKSl7dmFyIFo9dWU9PntqPSEwO3ZhcltPZSxTZV09RmUodWUsbCwhMCk7Zy5leHRlbmQoayxPZSksU2UmJkQucHVzaCguLi5TZSl9OyFoJiZsLm1peGlucy5sZW5ndGgmJmwubWl4aW5zLmZvckVhY2goWiksaS5leHRlbmRzJiZaKGkuZXh0ZW5kcyksaS5taXhpbnMmJmkubWl4aW5zLmZvckVhY2goWil9aWYoIVQmJiFqKXJldHVybiBnLmlzT2JqZWN0KGkpJiZ2LnNldChpLGcuRU1QVFlfQVJSKSxnLkVNUFRZX0FSUjtpZihnLmlzQXJyYXkoVCkpZm9yKHZhciBmZT0wO2ZlPFQubGVuZ3RoO2ZlKyspe3ZhciBnZT1nLmNhbWVsaXplKFRbZmVdKTtwZShnZSkmJihrW2dlXT1nLkVNUFRZX09CSil9ZWxzZSBpZihUKWZvcih2YXIgcmUgaW4gVCl7dmFyIHZlPWcuY2FtZWxpemUocmUpO2lmKHBlKHZlKSl7dmFyIFdlPVRbcmVdLGl0PWtbdmVdPWcuaXNBcnJheShXZSl8fGcuaXNGdW5jdGlvbihXZSk/e3R5cGU6V2V9OmcuZXh0ZW5kKHt9LFdlKTtpZihpdCl7dmFyIG50PV90KEJvb2xlYW4saXQudHlwZSksUHQ9X3QoU3RyaW5nLGl0LnR5cGUpO2l0WzBdPW50Pi0xLGl0WzFdPVB0PDB8fG50PFB0LChudD4tMXx8Zy5oYXNPd24oaXQsImRlZmF1bHQiKSkmJkQucHVzaCh2ZSl9fX12YXIgSXQ9W2ssRF07cmV0dXJuIGcuaXNPYmplY3QoaSkmJnYuc2V0KGksSXQpLEl0fWZ1bmN0aW9uIHBlKGkpe3JldHVybiBpWzBdIT09IiQiJiYhZy5pc1Jlc2VydmVkUHJvcChpKX1mdW5jdGlvbiBNZShpKXtpZihpPT09bnVsbClyZXR1cm4ibnVsbCI7aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpcmV0dXJuIGkubmFtZXx8IiI7aWYodHlwZW9mIGk9PSJvYmplY3QiKXt2YXIgbD1pLmNvbnN0cnVjdG9yJiZpLmNvbnN0cnVjdG9yLm5hbWU7cmV0dXJuIGx8fCIifXJldHVybiIifWZ1bmN0aW9uIHV0KGksbCl7cmV0dXJuIE1lKGkpPT09TWUobCl9ZnVuY3Rpb24gX3QoaSxsKXtyZXR1cm4gZy5pc0FycmF5KGwpP2wuZmluZEluZGV4KGg9PnV0KGgsaSkpOmcuaXNGdW5jdGlvbihsKSYmdXQobCxpKT8wOi0xfXZhciBlbj1pPT5pWzBdPT09Il8ifHxpPT09IiRzdGFibGUiLGJ0PWk9PmcuaXNBcnJheShpKT9pLm1hcCh6bik6W3puKGkpXSxxZT0oaSxsLGgpPT57aWYobC5fbilyZXR1cm4gbDt2YXIgdj1fcihmdW5jdGlvbigpe3JldHVybiBidChsKC4uLmFyZ3VtZW50cykpfSxoKTtyZXR1cm4gdi5fYz0hMSx2fSxNdD0oaSxsLGgpPT57dmFyIHY9aS5fY3R4O2Zvcih2YXIgQSBpbiBpKWlmKCFlbihBKSl7dmFyIFQ9aVtBXTtnLmlzRnVuY3Rpb24oVCk/bFtBXT1xZShBLFQsdik6VCE9bnVsbCYmZnVuY3Rpb24oKXt2YXIgaz1idChUKTtsW0FdPSgpPT5rfSgpfX0sZG49KGksbCk9Pnt2YXIgaD1idChsKTtpLnNsb3RzLmRlZmF1bHQ9KCk9Pmh9LGtuPShpLGwpPT57aWYoaS52bm9kZS5zaGFwZUZsYWcmMzIpe3ZhciBoPWwuXztoPyhpLnNsb3RzPXkudG9SYXcobCksZy5kZWYobCwiXyIsaCkpOk10KGwsaS5zbG90cz17fSl9ZWxzZSBpLnNsb3RzPXt9LGwmJmRuKGksbCk7Zy5kZWYoaS5zbG90cyxfZSwxKX0sQXQ9KGksbCxoKT0+e3Zhcnt2bm9kZTp2LHNsb3RzOkF9PWksVD0hMCxrPWcuRU1QVFlfT0JKO2lmKHYuc2hhcGVGbGFnJjMyKXt2YXIgRD1sLl87RD9oJiZEPT09MT9UPSExOihnLmV4dGVuZChBLGwpLCFoJiZEPT09MSYmZGVsZXRlIEEuXyk6KFQ9IWwuJHN0YWJsZSxNdChsLEEpKSxrPWx9ZWxzZSBsJiYoZG4oaSxsKSxrPXtkZWZhdWx0OjF9KTtpZihUKWZvcih2YXIgaiBpbiBBKSFlbihqKSYma1tqXT09bnVsbCYmZGVsZXRlIEFbal19O2Z1bmN0aW9uIHJuKGksbCxoLHYpe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTohMTtpZihnLmlzQXJyYXkoaSkpe2kuZm9yRWFjaCgoaXQsbnQpPT5ybihpdCxsJiYoZy5pc0FycmF5KGwpP2xbbnRdOmwpLGgsdixBKSk7cmV0dXJufWlmKCEoVyh2KSYmIUEpKXt2YXIgVD12LnNoYXBlRmxhZyY0P0lhKHYuY29tcG9uZW50KXx8di5jb21wb25lbnQucHJveHk6di5lbCxrPUE/bnVsbDpULHtpOkQscjpqfT1pLFo9bCYmbC5yLGZlPUQucmVmcz09PWcuRU1QVFlfT0JKP0QucmVmcz17fTpELnJlZnMsZ2U9RC5zZXR1cFN0YXRlO2lmKFohPW51bGwmJlohPT1qJiYoZy5pc1N0cmluZyhaKT8oZmVbWl09bnVsbCxnLmhhc093bihnZSxaKSYmKGdlW1pdPW51bGwpKTp5LmlzUmVmKFopJiYoWi52YWx1ZT1udWxsKSksZy5pc0Z1bmN0aW9uKGopKXNuKGosRCwxMixbayxmZV0pO2Vsc2V7dmFyIHJlPWcuaXNTdHJpbmcoaiksdmU9eS5pc1JlZihqKTtpZihyZXx8dmUpe3ZhciBXZT0oKT0+e2lmKGkuZil7dmFyIGl0PXJlP2cuaGFzT3duKGdlLGopP2dlW2pdOmZlW2pdOmoudmFsdWU7QT9nLmlzQXJyYXkoaXQpJiZnLnJlbW92ZShpdCxUKTpnLmlzQXJyYXkoaXQpP2l0LmluY2x1ZGVzKFQpfHxpdC5wdXNoKFQpOnJlPyhmZVtqXT1bVF0sZy5oYXNPd24oZ2UsaikmJihnZVtqXT1mZVtqXSkpOihqLnZhbHVlPVtUXSxpLmsmJihmZVtpLmtdPWoudmFsdWUpKX1lbHNlIHJlPyhmZVtqXT1rLGcuaGFzT3duKGdlLGopJiYoZ2Vbal09aykpOnZlJiYoai52YWx1ZT1rLGkuayYmKGZlW2kua109aykpfTtrPyhXZS5pZD0tMSxjcihXZSxoKSk6V2UoKX19fX12YXIgU249ITEsYW49aT0+aS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoInN2ZyIpJiZpLnRhZ05hbWUhPT0iZm9yZWlnbk9iamVjdCIsa3Q9aT0+aS5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoIk1hdGhNTCIpLENuPWk9PntpZihhbihpKSlyZXR1cm4ic3ZnIjtpZihrdChpKSlyZXR1cm4ibWF0aG1sIn0scW49aT0+aS5ub2RlVHlwZT09PTg7ZnVuY3Rpb24gU2EoaSl7dmFye210OmwscDpoLG86e3BhdGNoUHJvcDp2LGNyZWF0ZVRleHQ6QSxuZXh0U2libGluZzpULHBhcmVudE5vZGU6ayxyZW1vdmU6RCxpbnNlcnQ6aixjcmVhdGVDb21tZW50Olp9fT1pLGZlPSh1ZSxPZSk9PntpZighT2UuaGFzQ2hpbGROb2RlcygpKXtoKG51bGwsdWUsT2UpLHZyKCksT2UuX3Zub2RlPXVlO3JldHVybn1Tbj0hMSxnZShPZS5maXJzdENoaWxkLHVlLG51bGwsbnVsbCxudWxsKSx2cigpLE9lLl92bm9kZT11ZSxTbiYmY29uc29sZS5lcnJvcigiSHlkcmF0aW9uIGNvbXBsZXRlZCBidXQgY29udGFpbnMgbWlzbWF0Y2hlcy4iKX0sZ2U9ZnVuY3Rpb24odWUsT2UsU2UsVmUsdnQpe3ZhciBydD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITEsQj1xbih1ZSkmJnVlLmRhdGE9PT0iWyIsVj0oKT0+aXQodWUsT2UsU2UsVmUsdnQsQikse3R5cGU6dGUscmVmOmRlLHNoYXBlRmxhZzpvZSxwYXRjaEZsYWc6UmV9PU9lLGplPXVlLm5vZGVUeXBlO09lLmVsPXVlLFJlPT09LTImJihydD0hMSxPZS5keW5hbWljQ2hpbGRyZW49bnVsbCk7dmFyIHllPW51bGw7c3dpdGNoKHRlKXtjYXNlIEduOmplIT09Mz9PZS5jaGlsZHJlbj09PSIiPyhqKE9lLmVsPUEoIiIsdWUucGFyZW50Tm9kZSksayh1ZSksdWUpLHllPXVlKTp5ZT1WKCk6KHVlLmRhdGEhPT1PZS5jaGlsZHJlbiYmKFNuPSEwLHVlLmRhdGE9T2UuY2hpbGRyZW4pLHllPVQodWUpKTticmVhaztjYXNlIGdyOkl0KHVlKT8oeWU9VCh1ZSksUHQoT2UuZWw9dWUuY29udGVudC5maXJzdENoaWxkLHVlLFNlKSk6amUhPT04fHxCP3llPVYoKTp5ZT1UKHVlKTticmVhaztjYXNlIGdvOmlmKEImJih1ZT1UKHVlKSxqZT11ZS5ub2RlVHlwZSksamU9PT0xfHxqZT09PTMpe3llPXVlO2Zvcih2YXIgSmU9IU9lLmNoaWxkcmVuLmxlbmd0aCxVZT0wO1VlPE9lLnN0YXRpY0NvdW50O1VlKyspSmUmJihPZS5jaGlsZHJlbis9eWUubm9kZVR5cGU9PT0xP3llLm91dGVySFRNTDp5ZS5kYXRhKSxVZT09PU9lLnN0YXRpY0NvdW50LTEmJihPZS5hbmNob3I9eWUpLHllPVQoeWUpO3JldHVybiBCP1QoeWUpOnllfWVsc2UgVigpO2JyZWFrO2Nhc2UgbnI6Qj95ZT1XZSh1ZSxPZSxTZSxWZSx2dCxydCk6eWU9VigpO2JyZWFrO2RlZmF1bHQ6aWYob2UmMSkoamUhPT0xfHxPZS50eXBlLnRvTG93ZXJDYXNlKCkhPT11ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpJiYhSXQodWUpP3llPVYoKTp5ZT1yZSh1ZSxPZSxTZSxWZSx2dCxydCk7ZWxzZSBpZihvZSY2KXtPZS5zbG90U2NvcGVJZHM9dnQ7dmFyIHl0PWsodWUpO2lmKEI/eWU9bnQodWUpOnFuKHVlKSYmdWUuZGF0YT09PSJ0ZWxlcG9ydCBzdGFydCI/eWU9bnQodWUsdWUuZGF0YSwidGVsZXBvcnQgZW5kIik6eWU9VCh1ZSksbChPZSx5dCxudWxsLFNlLFZlLENuKHl0KSxydCksVyhPZSkpe3ZhciBUdDtCPyhUdD10bihuciksVHQuYW5jaG9yPXllP3llLnByZXZpb3VzU2libGluZzp5dC5sYXN0Q2hpbGQpOlR0PXVlLm5vZGVUeXBlPT09Mz9EaSgiIik6dG4oImRpdiIpLFR0LmVsPXVlLE9lLmNvbXBvbmVudC5zdWJUcmVlPVR0fX1lbHNlIG9lJjY0P2plIT09OD95ZT1WKCk6eWU9T2UudHlwZS5oeWRyYXRlKHVlLE9lLFNlLFZlLHZ0LHJ0LGksdmUpOm9lJjEyOCYmKHllPU9lLnR5cGUuaHlkcmF0ZSh1ZSxPZSxTZSxWZSxDbihrKHVlKSksdnQscnQsaSxnZSkpfXJldHVybiBkZSE9bnVsbCYmcm4oZGUsbnVsbCxWZSxPZSkseWV9LHJlPSh1ZSxPZSxTZSxWZSx2dCxydCk9PntydD1ydHx8ISFPZS5keW5hbWljQ2hpbGRyZW47dmFye3R5cGU6Qixwcm9wczpWLHBhdGNoRmxhZzp0ZSxzaGFwZUZsYWc6ZGUsZGlyczpvZSx0cmFuc2l0aW9uOlJlfT1PZSxqZT1CPT09ImlucHV0Inx8Qj09PSJvcHRpb24iO2lmKGplfHx0ZSE9PS0xKXtvZSYmUG4oT2UsbnVsbCxTZSwiY3JlYXRlZCIpO3ZhciB5ZT0hMTtpZihJdCh1ZSkpe3llPVBvKFZlLFJlKSYmU2UmJlNlLnZub2RlLnByb3BzJiZTZS52bm9kZS5wcm9wcy5hcHBlYXI7dmFyIEplPXVlLmNvbnRlbnQuZmlyc3RDaGlsZDt5ZSYmUmUuYmVmb3JlRW50ZXIoSmUpLFB0KEplLHVlLFNlKSxPZS5lbD11ZT1KZX1pZihkZSYxNiYmIShWJiYoVi5pbm5lckhUTUx8fFYudGV4dENvbnRlbnQpKSlmb3IodmFyIFVlPXZlKHVlLmZpcnN0Q2hpbGQsT2UsdWUsU2UsVmUsdnQscnQpO1VlOyl7U249ITA7dmFyIHl0PVVlO1VlPVVlLm5leHRTaWJsaW5nLEQoeXQpfWVsc2UgZGUmOCYmdWUudGV4dENvbnRlbnQhPT1PZS5jaGlsZHJlbiYmKFNuPSEwLHVlLnRleHRDb250ZW50PU9lLmNoaWxkcmVuKTtpZihWKWlmKGplfHwhcnR8fHRlJigxNnwzMikpZm9yKHZhciBUdCBpbiBWKShqZSYmKFR0LmVuZHNXaXRoKCJ2YWx1ZSIpfHxUdD09PSJpbmRldGVybWluYXRlIil8fGcuaXNPbihUdCkmJiFnLmlzUmVzZXJ2ZWRQcm9wKFR0KXx8VHRbMF09PT0iLiIpJiZ2KHVlLFR0LG51bGwsVltUdF0sdm9pZCAwLHZvaWQgMCxTZSk7ZWxzZSBWLm9uQ2xpY2smJnYodWUsIm9uQ2xpY2siLG51bGwsVi5vbkNsaWNrLHZvaWQgMCx2b2lkIDAsU2UpO3ZhciBSdDsoUnQ9ViYmVi5vblZub2RlQmVmb3JlTW91bnQpJiZfbihSdCxTZSxPZSksb2UmJlBuKE9lLG51bGwsU2UsImJlZm9yZU1vdW50IiksKChSdD1WJiZWLm9uVm5vZGVNb3VudGVkKXx8b2V8fHllKSYmc28oKCk9PntSdCYmX24oUnQsU2UsT2UpLHllJiZSZS5lbnRlcih1ZSksb2UmJlBuKE9lLG51bGwsU2UsIm1vdW50ZWQiKX0sVmUpfXJldHVybiB1ZS5uZXh0U2libGluZ30sdmU9KHVlLE9lLFNlLFZlLHZ0LHJ0LEIpPT57Qj1CfHwhIU9lLmR5bmFtaWNDaGlsZHJlbjtmb3IodmFyIFY9T2UuY2hpbGRyZW4sdGU9Vi5sZW5ndGgsZGU9MDtkZTx0ZTtkZSsrKXt2YXIgb2U9Qj9WW2RlXTpWW2RlXT16bihWW2RlXSk7aWYodWUpdWU9Z2UodWUsb2UsVmUsdnQscnQsQik7ZWxzZXtpZihvZS50eXBlPT09R24mJiFvZS5jaGlsZHJlbiljb250aW51ZTtTbj0hMCxoKG51bGwsb2UsU2UsbnVsbCxWZSx2dCxDbihTZSkscnQpfX1yZXR1cm4gdWV9LFdlPSh1ZSxPZSxTZSxWZSx2dCxydCk9Pnt2YXJ7c2xvdFNjb3BlSWRzOkJ9PU9lO0ImJih2dD12dD92dC5jb25jYXQoQik6Qik7dmFyIFY9ayh1ZSksdGU9dmUoVCh1ZSksT2UsVixTZSxWZSx2dCxydCk7cmV0dXJuIHRlJiZxbih0ZSkmJnRlLmRhdGE9PT0iXSI/VChPZS5hbmNob3I9dGUpOihTbj0hMCxqKE9lLmFuY2hvcj1aKCJdIixWKSxWLHRlKSx0ZSl9LGl0PSh1ZSxPZSxTZSxWZSx2dCxydCk9PntpZihTbj0hMCxPZS5lbD1udWxsLHJ0KWZvcih2YXIgQj1udCh1ZSk7Oyl7dmFyIFY9VCh1ZSk7aWYoViYmViE9PUIpRChWKTtlbHNlIGJyZWFrfXZhciB0ZT1UKHVlKSxkZT1rKHVlKTtyZXR1cm4gRCh1ZSksaChudWxsLE9lLGRlLHRlLFNlLFZlLENuKGRlKSx2dCksdGV9LG50PWZ1bmN0aW9uKHVlKXtmb3IodmFyIE9lPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXToiWyIsU2U9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiJdIixWZT0wO3VlOylpZih1ZT1UKHVlKSx1ZSYmcW4odWUpJiYodWUuZGF0YT09PU9lJiZWZSsrLHVlLmRhdGE9PT1TZSkpe2lmKFZlPT09MClyZXR1cm4gVCh1ZSk7VmUtLX1yZXR1cm4gdWV9LFB0PSh1ZSxPZSxTZSk9Pnt2YXIgVmU9T2UucGFyZW50Tm9kZTtWZSYmVmUucmVwbGFjZUNoaWxkKHVlLE9lKTtmb3IodmFyIHZ0PVNlO3Z0Oyl2dC52bm9kZS5lbD09PU9lJiYodnQudm5vZGUuZWw9dnQuc3ViVHJlZS5lbD11ZSksdnQ9dnQucGFyZW50fSxJdD11ZT0+dWUubm9kZVR5cGU9PT0xJiZ1ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PT0idGVtcGxhdGUiO3JldHVybltmZSxnZV19dmFyIGNyPXNvO2Z1bmN0aW9uIGZvKGkpe3JldHVybiB3YShpKX1mdW5jdGlvbiBPbyhpKXtyZXR1cm4gd2EoaSxTYSl9ZnVuY3Rpb24gd2EoaSxsKXt2YXIgaD1nLmdldEdsb2JhbFRoaXMoKTtoLl9fVlVFX189ITA7dmFye2luc2VydDp2LHJlbW92ZTpBLHBhdGNoUHJvcDpULGZvcmNlUGF0Y2hQcm9wOmssY3JlYXRlRWxlbWVudDpELGNyZWF0ZVRleHQ6aixjcmVhdGVDb21tZW50Olosc2V0VGV4dDpmZSxzZXRFbGVtZW50VGV4dDpnZSxwYXJlbnROb2RlOnJlLG5leHRTaWJsaW5nOnZlLHNldFNjb3BlSWQ6V2U9Zy5OT09QLGluc2VydFN0YXRpY0NvbnRlbnQ6aXR9PWksbnQ9ZnVuY3Rpb24oRyxRLEFlKXt2YXIgSWU9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGwseGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsWmU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOm51bGwsbXQ9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOnZvaWQgMCxRZT1hcmd1bWVudHMubGVuZ3RoPjcmJmFyZ3VtZW50c1s3XSE9PXZvaWQgMD9hcmd1bWVudHNbN106bnVsbCxvdD1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06ISFRLmR5bmFtaWNDaGlsZHJlbjtpZihHIT09USl7RyYmIW9pKEcsUSkmJihJZT1mYShHKSxGbihHLHhlLFplLCEwKSxHPW51bGwpLFEucGF0Y2hGbGFnPT09LTImJihvdD0hMSxRLmR5bmFtaWNDaGlsZHJlbj1udWxsKTt2YXJ7dHlwZTpZZSxyZWY6RnQsc2hhcGVGbGFnOkt0fT1RO3N3aXRjaChZZSl7Y2FzZSBHbjpQdChHLFEsQWUsSWUpO2JyZWFrO2Nhc2UgZ3I6SXQoRyxRLEFlLEllKTticmVhaztjYXNlIGdvOkc9PW51bGwmJnVlKFEsQWUsSWUsbXQpO2JyZWFrO2Nhc2UgbnI6b2UoRyxRLEFlLEllLHhlLFplLG10LFFlLG90KTticmVhaztkZWZhdWx0Okt0JjE/VmUoRyxRLEFlLEllLHhlLFplLG10LFFlLG90KTpLdCY2P1JlKEcsUSxBZSxJZSx4ZSxaZSxtdCxRZSxvdCk6KEt0JjY0fHxLdCYxMjgpJiZZZS5wcm9jZXNzKEcsUSxBZSxJZSx4ZSxaZSxtdCxRZSxvdCxZbyl9RnQhPW51bGwmJnhlJiZybihGdCxHJiZHLnJlZixaZSxRfHxHLCFRKX19LFB0PShHLFEsQWUsSWUpPT57aWYoRz09bnVsbCl2KFEuZWw9aihRLmNoaWxkcmVuLEFlKSxBZSxJZSk7ZWxzZXt2YXIgeGU9US5lbD1HLmVsO1EuY2hpbGRyZW4hPT1HLmNoaWxkcmVuJiZmZSh4ZSxRLmNoaWxkcmVuKX19LEl0PShHLFEsQWUsSWUpPT57Rz09bnVsbD92KFEuZWw9WihRLmNoaWxkcmVufHwiIixBZSksQWUsSWUpOlEuZWw9Ry5lbH0sdWU9KEcsUSxBZSxJZSk9PntbRy5lbCxHLmFuY2hvcl09aXQoRy5jaGlsZHJlbixRLEFlLEllLEcuZWwsRy5hbmNob3IpfSxPZT0oRyxRLEFlKT0+e2Zvcih2YXJ7ZWw6SWUsYW5jaG9yOnhlfT1HLFplO0llJiZJZSE9PXhlOylaZT12ZShJZSksdihJZSxRLEFlKSxJZT1aZTt2KHhlLFEsQWUpfSxTZT1HPT57Zm9yKHZhcntlbDpRLGFuY2hvcjpBZX09RyxJZTtRJiZRIT09QWU7KUllPXZlKFEpLEEoUSksUT1JZTtBKEFlKX0sVmU9KEcsUSxBZSxJZSx4ZSxaZSxtdCxRZSxvdCk9PntRLnR5cGU9PT0ic3ZnIj9tdD0ic3ZnIjpRLnR5cGU9PT0ibWF0aCImJihtdD0ibWF0aG1sIiksRz09bnVsbD92dChRLEFlLEllLHhlLFplLG10LFFlLG90KTpWKEcsUSx4ZSxaZSxtdCxRZSxvdCl9LHZ0PShHLFEsQWUsSWUseGUsWmUsbXQsUWUpPT57dmFyIG90LFllLHtwcm9wczpGdCxzaGFwZUZsYWc6S3QsdHJhbnNpdGlvbjp6dCxkaXJzOndufT1HO2lmKG90PUcuZWw9RChHLnR5cGUsUSksS3QmOD9nZShvdCxHLmNoaWxkcmVuKTpLdCYxNiYmQihHLmNoaWxkcmVuLG90LG51bGwsSWUseGUsaWkoRyxaZSksbXQsUWUpLHduJiZQbihHLG51bGwsSWUsImNyZWF0ZWQiKSxydChvdCxHLEcuc2NvcGVJZCxtdCxJZSksRnQpe2Zvcih2YXIgWnIgaW4gRnQpWnIhPT0idmFsdWUiJiYhZy5pc1Jlc2VydmVkUHJvcChacikmJlQob3QsWnIsbnVsbCxGdFtacl0sWmUsRy5jaGlsZHJlbixJZSx4ZSxpcik7InZhbHVlImluIEZ0JiZUKG90LCJ2YWx1ZSIsbnVsbCxGdC52YWx1ZSxaZSksKFllPUZ0Lm9uVm5vZGVCZWZvcmVNb3VudCkmJl9uKFllLEllLEcpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShvdCwiX192dWVQYXJlbnRDb21wb25lbnQiLHt2YWx1ZTpJZSxlbnVtZXJhYmxlOiExfSksd24mJlBuKEcsbnVsbCxJZSwiYmVmb3JlTW91bnQiKTt2YXIgdXI9UG8oeGUsenQpO3VyJiZ6dC5iZWZvcmVFbnRlcihvdCksdihvdCxRLEFlKSwoKFllPUZ0JiZGdC5vblZub2RlTW91bnRlZCl8fHVyfHx3bikmJmNyKCgpPT57WWUmJl9uKFllLEllLEcpLHVyJiZ6dC5lbnRlcihvdCksd24mJlBuKEcsbnVsbCxJZSwibW91bnRlZCIpfSx4ZSl9LHJ0PShHLFEsQWUsSWUseGUpPT57aWYoQWUmJldlKEcsQWUpLEllKWZvcih2YXIgWmU9MDtaZTxJZS5sZW5ndGg7WmUrKylXZShHLEllW1plXSk7aWYoeGUpe3ZhciBtdD14ZS5zdWJUcmVlO2lmKFE9PT1tdCl7dmFyIFFlPXhlLnZub2RlO3J0KEcsUWUsUWUuc2NvcGVJZCxRZS5zbG90U2NvcGVJZHMseGUucGFyZW50KX19fSxCPWZ1bmN0aW9uKEcsUSxBZSxJZSx4ZSxaZSxtdCxRZSl7Zm9yKHZhciBvdD1hcmd1bWVudHMubGVuZ3RoPjgmJmFyZ3VtZW50c1s4XSE9PXZvaWQgMD9hcmd1bWVudHNbOF06MCxZZT1vdDtZZTxHLmxlbmd0aDtZZSsrKXt2YXIgRnQ9R1tZZV09UWU/T2EoR1tZZV0pOnpuKEdbWWVdKTtudChudWxsLEZ0LFEsQWUsSWUseGUsWmUsbXQsUWUpfX0sVj0oRyxRLEFlLEllLHhlLFplLG10KT0+e3ZhciBRZT1RLmVsPUcuZWwse3BhdGNoRmxhZzpvdCxkeW5hbWljQ2hpbGRyZW46WWUsZGlyczpGdH09UTtvdHw9Ry5wYXRjaEZsYWcmMTY7dmFyIEt0PUcucHJvcHN8fGcuRU1QVFlfT0JKLHp0PVEucHJvcHN8fGcuRU1QVFlfT0JKLHduO2lmKEFlJiZCaShBZSwhMSksKHduPXp0Lm9uVm5vZGVCZWZvcmVVcGRhdGUpJiZfbih3bixBZSxRLEcpLEZ0JiZQbihRLEcsQWUsImJlZm9yZVVwZGF0ZSIpLEFlJiZCaShBZSwhMCksWWU/dGUoRy5keW5hbWljQ2hpbGRyZW4sWWUsUWUsQWUsSWUsaWkoUSx4ZSksWmUpOm10fHx5dChHLFEsUWUsbnVsbCxBZSxJZSxpaShRLHhlKSxaZSwhMSksb3Q+MCl7aWYob3QmMTYpZGUoUWUsUSxLdCx6dCxBZSxJZSx4ZSk7ZWxzZSBpZihvdCYyJiZLdC5jbGFzcyE9PXp0LmNsYXNzJiZUKFFlLCJjbGFzcyIsbnVsbCx6dC5jbGFzcyx4ZSksb3QmNCYmVChRZSwic3R5bGUiLEt0LnN0eWxlLHp0LnN0eWxlLHhlKSxvdCY4KWZvcih2YXIgWnI9US5keW5hbWljUHJvcHMsdXI9MDt1cjxaci5sZW5ndGg7dXIrKyl7dmFyIFFpPVpyW3VyXSx1cz1LdFtRaV0sQ3M9enRbUWldOyhDcyE9PXVzfHxRaT09PSJ2YWx1ZSJ8fGsmJmsoUWUsUWkpKSYmVChRZSxRaSx1cyxDcyx4ZSxHLmNoaWxkcmVuLEFlLEllLGlyKX1vdCYxJiZHLmNoaWxkcmVuIT09US5jaGlsZHJlbiYmZ2UoUWUsUS5jaGlsZHJlbil9ZWxzZSFtdCYmWWU9PW51bGwmJmRlKFFlLFEsS3QsenQsQWUsSWUseGUpOygod249enQub25Wbm9kZVVwZGF0ZWQpfHxGdCkmJmNyKCgpPT57d24mJl9uKHduLEFlLFEsRyksRnQmJlBuKFEsRyxBZSwidXBkYXRlZCIpfSxJZSl9LHRlPShHLFEsQWUsSWUseGUsWmUsbXQpPT57Zm9yKHZhciBRZT0wO1FlPFEubGVuZ3RoO1FlKyspe3ZhciBvdD1HW1FlXSxZZT1RW1FlXSxGdD1vdC5lbCYmKG90LnR5cGU9PT1ucnx8IW9pKG90LFllKXx8b3Quc2hhcGVGbGFnJig2fDY0KSk/cmUob3QuZWwpOkFlO250KG90LFllLEZ0LG51bGwsSWUseGUsWmUsbXQsITApfX0sZGU9KEcsUSxBZSxJZSx4ZSxaZSxtdCk9PntpZihBZSE9PUllKXtpZihBZSE9PWcuRU1QVFlfT0JKKWZvcih2YXIgUWUgaW4gQWUpIWcuaXNSZXNlcnZlZFByb3AoUWUpJiYhKFFlIGluIEllKSYmVChHLFFlLEFlW1FlXSxudWxsLG10LFEuY2hpbGRyZW4seGUsWmUsaXIpO2Zvcih2YXIgb3QgaW4gSWUpaWYoIWcuaXNSZXNlcnZlZFByb3Aob3QpKXt2YXIgWWU9SWVbb3RdLEZ0PUFlW290XTsoWWUhPT1GdCYmb3QhPT0idmFsdWUifHxrJiZrKEcsb3QpKSYmVChHLG90LEZ0LFllLG10LFEuY2hpbGRyZW4seGUsWmUsaXIpfSJ2YWx1ZSJpbiBJZSYmVChHLCJ2YWx1ZSIsQWUudmFsdWUsSWUudmFsdWUsbXQpfX0sb2U9KEcsUSxBZSxJZSx4ZSxaZSxtdCxRZSxvdCk9Pnt2YXIgWWU9US5lbD1HP0cuZWw6aigiIixBZSksRnQ9US5hbmNob3I9Rz9HLmFuY2hvcjpqKCIiLEFlKSx7cGF0Y2hGbGFnOkt0LGR5bmFtaWNDaGlsZHJlbjp6dCxzbG90U2NvcGVJZHM6d259PVE7d24mJihRZT1RZT9RZS5jb25jYXQod24pOnduKSxHPT1udWxsPyh2KFllLEFlLEllKSx2KEZ0LEFlLEllKSxCKFEuY2hpbGRyZW58fFtdLEFlLEZ0LHhlLFplLG10LFFlLG90KSk6S3Q+MCYmS3QmNjQmJnp0JiZHLmR5bmFtaWNDaGlsZHJlbj8odGUoRy5keW5hbWljQ2hpbGRyZW4senQsQWUseGUsWmUsbXQsUWUpLChRLmtleSE9bnVsbHx8eGUmJlE9PT14ZS5zdWJUcmVlKSYmeG4oRyxRLCEwKSk6eXQoRyxRLEFlLEZ0LHhlLFplLG10LFFlLG90KX0sUmU9KEcsUSxBZSxJZSx4ZSxaZSxtdCxRZSxvdCk9PntRLnNsb3RTY29wZUlkcz1RZSxHPT1udWxsP1Euc2hhcGVGbGFnJjUxMj94ZS5jdHguYWN0aXZhdGUoUSxBZSxJZSxtdCxvdCk6amUoUSxBZSxJZSx4ZSxaZSxtdCxvdCk6eWUoRyxRLG90KX0samU9KEcsUSxBZSxJZSx4ZSxaZSxtdCk9Pnt2YXIgUWU9Ry5jb21wb25lbnQ9bGEoRyxJZSx4ZSk7aWYoemUoRykmJihRZS5jdHgucmVuZGVyZXI9WW8pLG9zKFFlKSxRZS5hc3luY0RlcCl7aWYoeGUmJnhlLnJlZ2lzdGVyRGVwKFFlLEplKSwhRy5lbCl7dmFyIG90PVFlLnN1YlRyZWU9dG4oZ3IpO0l0KG51bGwsb3QsUSxBZSl9fWVsc2UgSmUoUWUsRyxRLEFlLHhlLFplLG10KTtpZihRZS4kd3hzTW9kdWxlcyl7dmFyIFllPUkucmVzb2x2ZU93bmVyRWwoUWUsITApO1llLmxlbmd0aCYmWWUuZm9yRWFjaChGdD0+e0Z0LnNldEF0dHJpYnV0ZShJLkFUVFJfVl9PV05FUl9JRCxRZS51aWQpO3ZhcnskcmVuZGVyanNNb2R1bGVzOkt0fT1RZS50eXBlO0t0JiZGdC5zZXRBdHRyaWJ1dGUoSS5BVFRSX1ZfUkVOREVSSlMsS3QpfSl9fSx5ZT0oRyxRLEFlKT0+e3ZhciBJZT1RLmNvbXBvbmVudD1HLmNvbXBvbmVudDtpZihjaShHLFEsQWUpKWlmKEllLmFzeW5jRGVwJiYhSWUuYXN5bmNSZXNvbHZlZCl7VWUoSWUsUSxBZSk7cmV0dXJufWVsc2UgSWUubmV4dD1RLGduKEllLnVwZGF0ZSksSWUuZWZmZWN0LmRpcnR5PSEwLEllLnVwZGF0ZSgpO2Vsc2UgUS5lbD1HLmVsLEllLnZub2RlPVF9LEplPShHLFEsQWUsSWUseGUsWmUsbXQpPT57dmFyIFFlPSgpPT57aWYoRy5pc01vdW50ZWQpe3ZhcntuZXh0OlRuLGJ1OlRzLHU6bW8scGFyZW50OlJvLHZub2RlOnFvfT1HO3t2YXIgT3M9dHMoRyk7aWYoT3Mpe1RuJiYoVG4uZWw9cW8uZWwsVWUoRyxUbixtdCkpLE9zLmFzeW5jRGVwLnRoZW4oKCk9PntHLmlzVW5tb3VudGVkfHxRZSgpfSk7cmV0dXJufX12YXIgenM9VG4sZnM7QmkoRywhMSksVG4/KFRuLmVsPXFvLmVsLFVlKEcsVG4sbXQpKTpUbj1xbyxUcyYmZy5pbnZva2VBcnJheUZucyhUcyksKGZzPVRuLnByb3BzJiZUbi5wcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSYmX24oZnMsUm8sVG4scW8pLEJpKEcsITApO3ZhciBkYT1kcihHKSxCYT1HLnN1YlRyZWU7Ry5zdWJUcmVlPWRhLG50KEJhLGRhLHJlKEJhLmVsKSxmYShCYSksRyx4ZSxaZSksVG4uZWw9ZGEuZWwsenM9PT1udWxsJiZFbyhHLGRhLmVsKSxtbyYmY3IobW8seGUpLChmcz1Ubi5wcm9wcyYmVG4ucHJvcHMub25Wbm9kZVVwZGF0ZWQpJiZjcigoKT0+X24oZnMsUm8sVG4scW8pLHhlKX1lbHNle3ZhciBGdCx7ZWw6S3QscHJvcHM6enR9PVEse2JtOnduLG06WnIscGFyZW50OnVyfT1HLFFpPVcoUSk7aWYoQmkoRywhMSksd24mJmcuaW52b2tlQXJyYXlGbnMod24pLCFRaSYmKEZ0PXp0JiZ6dC5vblZub2RlQmVmb3JlTW91bnQpJiZfbihGdCx1cixRKSxCaShHLCEwKSxLdCYmcGkpe3ZhciB1cz0oKT0+e0cuc3ViVHJlZT1kcihHKSxwaShLdCxHLnN1YlRyZWUsRyx4ZSxudWxsKX07UWk/US50eXBlLl9fYXN5bmNMb2FkZXIoKS50aGVuKCgpPT4hRy5pc1VubW91bnRlZCYmdXMoKSk6dXMoKX1lbHNle3ZhciBDcz1HLnN1YlRyZWU9ZHIoRyk7bnQobnVsbCxDcyxBZSxJZSxHLHhlLFplKSxRLmVsPUNzLmVsfWlmKFpyJiZjcihacix4ZSksIVFpJiYoRnQ9enQmJnp0Lm9uVm5vZGVNb3VudGVkKSl7dmFyIEljPVE7Y3IoKCk9Pl9uKEZ0LHVyLEljKSx4ZSl9KFEuc2hhcGVGbGFnJjI1Nnx8dXImJlcodXIudm5vZGUpJiZ1ci52bm9kZS5zaGFwZUZsYWcmMjU2KSYmRy5hJiZjcihHLmEseGUpLEcuaXNNb3VudGVkPSEwLFE9QWU9SWU9bnVsbH19LG90PUcuZWZmZWN0PW5ldyB5LlJlYWN0aXZlRWZmZWN0KFFlLGcuTk9PUCwoKT0+aG4oWWUpLEcuc2NvcGUpLFllPUcudXBkYXRlPSgpPT57b3QuZGlydHkmJm90LnJ1bigpfTtZZS5pZD1HLnVpZCxCaShHLCEwKSxZZSgpfSxVZT0oRyxRLEFlKT0+e1EuY29tcG9uZW50PUc7dmFyIEllPUcudm5vZGUucHJvcHM7Ry52bm9kZT1RLEcubmV4dD1udWxsLGNlKEcsUS5wcm9wcyxJZSxBZSksQXQoRyxRLmNoaWxkcmVuLEFlKSx5LnBhdXNlVHJhY2tpbmcoKSwkbihHKSx5LnJlc2V0VHJhY2tpbmcoKX0seXQ9ZnVuY3Rpb24oRyxRLEFlLEllLHhlLFplLG10LFFlKXt2YXIgb3Q9YXJndW1lbnRzLmxlbmd0aD44JiZhcmd1bWVudHNbOF0hPT12b2lkIDA/YXJndW1lbnRzWzhdOiExLFllPUcmJkcuY2hpbGRyZW4sRnQ9Rz9HLnNoYXBlRmxhZzowLEt0PVEuY2hpbGRyZW4se3BhdGNoRmxhZzp6dCxzaGFwZUZsYWc6d259PVE7aWYoenQ+MCl7aWYoenQmMTI4KXtSdChZZSxLdCxBZSxJZSx4ZSxaZSxtdCxRZSxvdCk7cmV0dXJufWVsc2UgaWYoenQmMjU2KXtUdChZZSxLdCxBZSxJZSx4ZSxaZSxtdCxRZSxvdCk7cmV0dXJufX13biY4PyhGdCYxNiYmaXIoWWUseGUsWmUpLEt0IT09WWUmJmdlKEFlLEt0KSk6RnQmMTY/d24mMTY/UnQoWWUsS3QsQWUsSWUseGUsWmUsbXQsUWUsb3QpOmlyKFllLHhlLFplLCEwKTooRnQmOCYmZ2UoQWUsIiIpLHduJjE2JiZCKEt0LEFlLEllLHhlLFplLG10LFFlLG90KSl9LFR0PShHLFEsQWUsSWUseGUsWmUsbXQsUWUsb3QpPT57Rz1HfHxnLkVNUFRZX0FSUixRPVF8fGcuRU1QVFlfQVJSO3ZhciBZZT1HLmxlbmd0aCxGdD1RLmxlbmd0aCxLdD1NYXRoLm1pbihZZSxGdCksenQ7Zm9yKHp0PTA7enQ8S3Q7enQrKyl7dmFyIHduPVFbenRdPW90P09hKFFbenRdKTp6bihRW3p0XSk7bnQoR1t6dF0sd24sQWUsbnVsbCx4ZSxaZSxtdCxRZSxvdCl9WWU+RnQ/aXIoRyx4ZSxaZSwhMCwhMSxLdCk6QihRLEFlLEllLHhlLFplLG10LFFlLG90LEt0KX0sUnQ9KEcsUSxBZSxJZSx4ZSxaZSxtdCxRZSxvdCk9Pntmb3IodmFyIFllPTAsRnQ9US5sZW5ndGgsS3Q9Ry5sZW5ndGgtMSx6dD1GdC0xO1llPD1LdCYmWWU8PXp0Oyl7dmFyIHduPUdbWWVdLFpyPVFbWWVdPW90P09hKFFbWWVdKTp6bihRW1llXSk7aWYob2kod24sWnIpKW50KHduLFpyLEFlLG51bGwseGUsWmUsbXQsUWUsb3QpO2Vsc2UgYnJlYWs7WWUrK31mb3IoO1llPD1LdCYmWWU8PXp0Oyl7dmFyIHVyPUdbS3RdLFFpPVFbenRdPW90P09hKFFbenRdKTp6bihRW3p0XSk7aWYob2kodXIsUWkpKW50KHVyLFFpLEFlLG51bGwseGUsWmUsbXQsUWUsb3QpO2Vsc2UgYnJlYWs7S3QtLSx6dC0tfWlmKFllPkt0KXtpZihZZTw9enQpZm9yKHZhciB1cz16dCsxLENzPXVzPEZ0P1FbdXNdLmVsOkllO1llPD16dDspbnQobnVsbCxRW1llXT1vdD9PYShRW1llXSk6em4oUVtZZV0pLEFlLENzLHhlLFplLG10LFFlLG90KSxZZSsrfWVsc2UgaWYoWWU+enQpZm9yKDtZZTw9S3Q7KUZuKEdbWWVdLHhlLFplLCEwKSxZZSsrO2Vsc2V7dmFyIEljPVllLFRuPVllLFRzPW5ldyBNYXA7Zm9yKFllPVRuO1llPD16dDtZZSsrKXt2YXIgbW89UVtZZV09b3Q/T2EoUVtZZV0pOnpuKFFbWWVdKTttby5rZXkhPW51bGwmJlRzLnNldChtby5rZXksWWUpfXZhciBSbyxxbz0wLE9zPXp0LVRuKzEsenM9ITEsZnM9MCxkYT1uZXcgQXJyYXkoT3MpO2ZvcihZZT0wO1llPE9zO1llKyspZGFbWWVdPTA7Zm9yKFllPUljO1llPD1LdDtZZSsrKXt2YXIgQmE9R1tZZV07aWYocW8+PU9zKXtGbihCYSx4ZSxaZSwhMCk7Y29udGludWV9dmFyIE1hPXZvaWQgMDtpZihCYS5rZXkhPW51bGwpTWE9VHMuZ2V0KEJhLmtleSk7ZWxzZSBmb3IoUm89VG47Um88PXp0O1JvKyspaWYoZGFbUm8tVG5dPT09MCYmb2koQmEsUVtSb10pKXtNYT1SbzticmVha31NYT09PXZvaWQgMD9GbihCYSx4ZSxaZSwhMCk6KGRhW01hLVRuXT1ZZSsxLE1hPj1mcz9mcz1NYTp6cz0hMCxudChCYSxRW01hXSxBZSxudWxsLHhlLFplLG10LFFlLG90KSxxbysrKX12YXIgZHM9enM/VWEoZGEpOmcuRU1QVFlfQVJSO2ZvcihSbz1kcy5sZW5ndGgtMSxZZT1Pcy0xO1llPj0wO1llLS0pe3ZhciBSYz1UbitZZSxhdT1RW1JjXSx4bz1SYysxPEZ0P1FbUmMrMV0uZWw6SWU7ZGFbWWVdPT09MD9udChudWxsLGF1LEFlLHhvLHhlLFplLG10LFFlLG90KTp6cyYmKFJvPDB8fFllIT09ZHNbUm9dP1V0KGF1LEFlLHhvLDIpOlJvLS0pfX19LFV0PWZ1bmN0aW9uKEcsUSxBZSxJZSl7dmFyIHhlPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLHtlbDpaZSx0eXBlOm10LHRyYW5zaXRpb246UWUsY2hpbGRyZW46b3Qsc2hhcGVGbGFnOlllfT1HO2lmKFllJjYpe1V0KEcuY29tcG9uZW50LnN1YlRyZWUsUSxBZSxJZSk7cmV0dXJufWlmKFllJjEyOCl7Ry5zdXNwZW5zZS5tb3ZlKFEsQWUsSWUpO3JldHVybn1pZihZZSY2NCl7bXQubW92ZShHLFEsQWUsWW8pO3JldHVybn1pZihtdD09PW5yKXt2KFplLFEsQWUpO2Zvcih2YXIgRnQ9MDtGdDxvdC5sZW5ndGg7RnQrKylVdChvdFtGdF0sUSxBZSxJZSk7dihHLmFuY2hvcixRLEFlKTtyZXR1cm59aWYobXQ9PT1nbyl7T2UoRyxRLEFlKTtyZXR1cm59dmFyIEt0PUllIT09MiYmWWUmMSYmUWU7aWYoS3QpaWYoSWU9PT0wKVFlLmJlZm9yZUVudGVyKFplKSx2KFplLFEsQWUpLGNyKCgpPT5RZS5lbnRlcihaZSkseGUpO2Vsc2V7dmFye2xlYXZlOnp0LGRlbGF5TGVhdmU6d24sYWZ0ZXJMZWF2ZTpacn09UWUsdXI9KCk9PnYoWmUsUSxBZSksUWk9KCk9Pnt6dChaZSwoKT0+e3VyKCksWnImJlpyKCl9KX07d24/d24oWmUsdXIsUWkpOlFpKCl9ZWxzZSB2KFplLFEsQWUpfSxGbj1mdW5jdGlvbihHLFEsQWUpe3ZhciBJZT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEseGU9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOiExLHt0eXBlOlplLHByb3BzOm10LHJlZjpRZSxjaGlsZHJlbjpvdCxkeW5hbWljQ2hpbGRyZW46WWUsc2hhcGVGbGFnOkZ0LHBhdGNoRmxhZzpLdCxkaXJzOnp0fT1HO2lmKFFlIT1udWxsJiZybihRZSxudWxsLEFlLEcsITApLEZ0JjI1Nil7US5jdHguZGVhY3RpdmF0ZShHKTtyZXR1cm59dmFyIHduPUZ0JjEmJnp0LFpyPSFXKEcpLHVyO2lmKFpyJiYodXI9bXQmJm10Lm9uVm5vZGVCZWZvcmVVbm1vdW50KSYmX24odXIsUSxHKSxGdCY2KUpuKEcuY29tcG9uZW50LEFlLEllKTtlbHNle2lmKEZ0JjEyOCl7Ry5zdXNwZW5zZS51bm1vdW50KEFlLEllKTtyZXR1cm59d24mJlBuKEcsbnVsbCxRLCJiZWZvcmVVbm1vdW50IiksRnQmNjQ/Ry50eXBlLnJlbW92ZShHLFEsQWUseGUsWW8sSWUpOlllJiYoWmUhPT1ucnx8S3Q+MCYmS3QmNjQpP2lyKFllLFEsQWUsITEsITApOihaZT09PW5yJiZLdCYoMTI4fDI1Nil8fCF4ZSYmRnQmMTYpJiZpcihvdCxRLEFlKSxJZSYmSW4oRyl9KFpyJiYodXI9bXQmJm10Lm9uVm5vZGVVbm1vdW50ZWQpfHx3bikmJmNyKCgpPT57dXImJl9uKHVyLFEsRyksd24mJlBuKEcsbnVsbCxRLCJ1bm1vdW50ZWQiKX0sQWUpfSxJbj1HPT57dmFye3R5cGU6USxlbDpBZSxhbmNob3I6SWUsdHJhbnNpdGlvbjp4ZX09RztpZihRPT09bnIpe0RuKEFlLEllKTtyZXR1cm59aWYoUT09PWdvKXtTZShHKTtyZXR1cm59dmFyIFplPSgpPT57QShBZSkseGUmJiF4ZS5wZXJzaXN0ZWQmJnhlLmFmdGVyTGVhdmUmJnhlLmFmdGVyTGVhdmUoKX07aWYoRy5zaGFwZUZsYWcmMSYmeGUmJiF4ZS5wZXJzaXN0ZWQpe3ZhcntsZWF2ZTptdCxkZWxheUxlYXZlOlFlfT14ZSxvdD0oKT0+bXQoQWUsWmUpO1FlP1FlKEcuZWwsWmUsb3QpOm90KCl9ZWxzZSBaZSgpfSxEbj0oRyxRKT0+e2Zvcih2YXIgQWU7RyE9PVE7KUFlPXZlKEcpLEEoRyksRz1BZTtBKFEpfSxKbj0oRyxRLEFlKT0+e3ZhcntidW06SWUsc2NvcGU6eGUsdXBkYXRlOlplLHN1YlRyZWU6bXQsdW06UWV9PUc7SWUmJmcuaW52b2tlQXJyYXlGbnMoSWUpLHhlLnN0b3AoKSxaZSYmKFplLmFjdGl2ZT0hMSxGbihtdCxHLFEsQWUpKSxRZSYmY3IoUWUsUSksY3IoKCk9PntHLmlzVW5tb3VudGVkPSEwfSxRKSxRJiZRLnBlbmRpbmdCcmFuY2gmJiFRLmlzVW5tb3VudGVkJiZHLmFzeW5jRGVwJiYhRy5hc3luY1Jlc29sdmVkJiZHLnN1c3BlbnNlSWQ9PT1RLnBlbmRpbmdJZCYmKFEuZGVwcy0tLFEuZGVwcz09PTAmJlEucmVzb2x2ZSgpKX0saXI9ZnVuY3Rpb24oRyxRLEFlKXtmb3IodmFyIEllPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSx4ZT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06ITEsWmU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT12b2lkIDA/YXJndW1lbnRzWzVdOjAsbXQ9WmU7bXQ8Ry5sZW5ndGg7bXQrKylGbihHW210XSxRLEFlLEllLHhlKX0sZmE9Rz0+Ry5zaGFwZUZsYWcmNj9mYShHLmNvbXBvbmVudC5zdWJUcmVlKTpHLnNoYXBlRmxhZyYxMjg/Ry5zdXNwZW5zZS5uZXh0KCk6dmUoRy5hbmNob3J8fEcuZWwpLFZuPSExLHhhPShHLFEsQWUpPT57Rz09bnVsbD9RLl92bm9kZSYmRm4oUS5fdm5vZGUsbnVsbCxudWxsLCEwKTpudChRLl92bm9kZXx8bnVsbCxHLFEsbnVsbCxudWxsLG51bGwsQWUpLFZufHwoVm49ITAsJG4oKSx2cigpLFZuPSExKSxRLl92bm9kZT1HfSxZbz17cDpudCx1bTpGbixtOlV0LHI6SW4sbXQ6amUsbWM6QixwYzp5dCxwYmM6dGUsbjpmYSxvOml9LHlpLHBpO3JldHVybiBsJiYoW3lpLHBpXT1sKFlvKSkse3JlbmRlcjp4YSxoeWRyYXRlOnlpLGNyZWF0ZUFwcDpFKHhhLHlpKX19ZnVuY3Rpb24gaWkoaSxsKXt2YXJ7dHlwZTpoLHByb3BzOnZ9PWk7cmV0dXJuIGw9PT0ic3ZnIiYmaD09PSJmb3JlaWduT2JqZWN0Inx8bD09PSJtYXRobWwiJiZoPT09ImFubm90YXRpb24teG1sIiYmdiYmdi5lbmNvZGluZyYmdi5lbmNvZGluZy5pbmNsdWRlcygiaHRtbCIpP3ZvaWQgMDpsfWZ1bmN0aW9uIEJpKGksbCl7dmFye2VmZmVjdDpoLHVwZGF0ZTp2fT1pO2guYWxsb3dSZWN1cnNlPXYuYWxsb3dSZWN1cnNlPWx9ZnVuY3Rpb24gUG8oaSxsKXtyZXR1cm4oIWl8fGkmJiFpLnBlbmRpbmdCcmFuY2gpJiZsJiYhbC5wZXJzaXN0ZWR9ZnVuY3Rpb24geG4oaSxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITEsdj1pLmNoaWxkcmVuLEE9bC5jaGlsZHJlbjtpZihnLmlzQXJyYXkodikmJmcuaXNBcnJheShBKSlmb3IodmFyIFQ9MDtUPHYubGVuZ3RoO1QrKyl7dmFyIGs9dltUXSxEPUFbVF07RC5zaGFwZUZsYWcmMSYmIUQuZHluYW1pY0NoaWxkcmVuJiYoKEQucGF0Y2hGbGFnPD0wfHxELnBhdGNoRmxhZz09PTMyKSYmKEQ9QVtUXT1PYShBW1RdKSxELmVsPWsuZWwpLGh8fHhuKGssRCkpLEQudHlwZT09PUduJiYoRC5lbD1rLmVsKX19ZnVuY3Rpb24gVWEoaSl7dmFyIGw9aS5zbGljZSgpLGg9WzBdLHYsQSxULGssRCxqPWkubGVuZ3RoO2Zvcih2PTA7djxqO3YrKyl7dmFyIFo9aVt2XTtpZihaIT09MCl7aWYoQT1oW2gubGVuZ3RoLTFdLGlbQV08Wil7bFt2XT1BLGgucHVzaCh2KTtjb250aW51ZX1mb3IoVD0wLGs9aC5sZW5ndGgtMTtUPGs7KUQ9VCtrPj4xLGlbaFtEXV08Wj9UPUQrMTprPUQ7WjxpW2hbVF1dJiYoVD4wJiYobFt2XT1oW1QtMV0pLGhbVF09dil9fWZvcihUPWgubGVuZ3RoLGs9aFtULTFdO1QtLSA+MDspaFtUXT1rLGs9bFtrXTtyZXR1cm4gaH1mdW5jdGlvbiB0cyhpKXt2YXIgbD1pLnN1YlRyZWUuY29tcG9uZW50O2lmKGwpcmV0dXJuIGwuYXN5bmNEZXAmJiFsLmFzeW5jUmVzb2x2ZWQ/bDp0cyhsKX12YXIgJG89aT0+aS5fX2lzVGVsZXBvcnQsQWE9aT0+aSYmKGkuZGlzYWJsZWR8fGkuZGlzYWJsZWQ9PT0iIiksa3I9aT0+dHlwZW9mIFNWR0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgU1ZHRWxlbWVudCxDYT1pPT50eXBlb2YgTWF0aE1MRWxlbWVudD09ImZ1bmN0aW9uIiYmaSBpbnN0YW5jZW9mIE1hdGhNTEVsZW1lbnQsTWk9KGksbCk9Pnt2YXIgaD1pJiZpLnRvO2lmKGcuaXNTdHJpbmcoaCkpaWYobCl7dmFyIHY9bChoKTtyZXR1cm4gdn1lbHNlIHJldHVybiBudWxsO2Vsc2UgcmV0dXJuIGh9LGhvPXtuYW1lOiJUZWxlcG9ydCIsX19pc1RlbGVwb3J0OiEwLHByb2Nlc3MoaSxsLGgsdixBLFQsayxELGosWil7dmFye21jOmZlLHBjOmdlLHBiYzpyZSxvOntpbnNlcnQ6dmUscXVlcnlTZWxlY3RvcjpXZSxjcmVhdGVUZXh0Oml0LGNyZWF0ZUNvbW1lbnQ6bnR9fT1aLFB0PUFhKGwucHJvcHMpLHtzaGFwZUZsYWc6SXQsY2hpbGRyZW46dWUsZHluYW1pY0NoaWxkcmVuOk9lfT1sO2lmKGk9PW51bGwpe3ZhciBTZT1sLmVsPWl0KCIiLGgpLFZlPWwuYW5jaG9yPWl0KCIiLGgpO3ZlKFNlLGgsdiksdmUoVmUsaCx2KTt2YXIgdnQ9bC50YXJnZXQ9TWkobC5wcm9wcyxXZSkscnQ9bC50YXJnZXRBbmNob3I9aXQoIiIsaCk7dnQmJih2ZShydCx2dCksaz09PSJzdmcifHxrcih2dCk/az0ic3ZnIjooaz09PSJtYXRobWwifHxDYSh2dCkpJiYoaz0ibWF0aG1sIikpO3ZhciBCPShKZSxVZSk9PntJdCYxNiYmZmUodWUsSmUsVWUsQSxULGssRCxqKX07UHQ/QihoLFZlKTp2dCYmQih2dCxydCl9ZWxzZXtsLmVsPWkuZWw7dmFyIFY9bC5hbmNob3I9aS5hbmNob3IsdGU9bC50YXJnZXQ9aS50YXJnZXQsZGU9bC50YXJnZXRBbmNob3I9aS50YXJnZXRBbmNob3Isb2U9QWEoaS5wcm9wcyksUmU9b2U/aDp0ZSxqZT1vZT9WOmRlO2lmKGs9PT0ic3ZnInx8a3IodGUpP2s9InN2ZyI6KGs9PT0ibWF0aG1sInx8Q2EodGUpKSYmKGs9Im1hdGhtbCIpLE9lPyhyZShpLmR5bmFtaWNDaGlsZHJlbixPZSxSZSxBLFQsayxEKSx4bihpLGwsITApKTpqfHxnZShpLGwsUmUsamUsQSxULGssRCwhMSksUHQpb2U/bC5wcm9wcyYmaS5wcm9wcyYmbC5wcm9wcy50byE9PWkucHJvcHMudG8mJihsLnByb3BzLnRvPWkucHJvcHMudG8pOnRyKGwsaCxWLFosMSk7ZWxzZSBpZigobC5wcm9wcyYmbC5wcm9wcy50bykhPT0oaS5wcm9wcyYmaS5wcm9wcy50bykpe3ZhciB5ZT1sLnRhcmdldD1NaShsLnByb3BzLFdlKTt5ZSYmdHIobCx5ZSxudWxsLFosMCl9ZWxzZSBvZSYmdHIobCx0ZSxkZSxaLDEpfUhvKGwpfSxyZW1vdmUoaSxsLGgsdixBLFQpe3Zhcnt1bTprLG86e3JlbW92ZTpEfX09QSx7c2hhcGVGbGFnOmosY2hpbGRyZW46WixhbmNob3I6ZmUsdGFyZ2V0QW5jaG9yOmdlLHRhcmdldDpyZSxwcm9wczp2ZX09aTtpZihyZSYmRChnZSksVCYmRChmZSksaiYxNilmb3IodmFyIFdlPVR8fCFBYSh2ZSksaXQ9MDtpdDxaLmxlbmd0aDtpdCsrKXt2YXIgbnQ9WltpdF07ayhudCxsLGgsV2UsISFudC5keW5hbWljQ2hpbGRyZW4pfX0sbW92ZTp0cixoeWRyYXRlOnNhfTtmdW5jdGlvbiB0cihpLGwsaCx2KXt2YXJ7bzp7aW5zZXJ0OkF9LG06VH09dixrPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XToyO2s9PT0wJiZBKGkudGFyZ2V0QW5jaG9yLGwsaCk7dmFye2VsOkQsYW5jaG9yOmosc2hhcGVGbGFnOlosY2hpbGRyZW46ZmUscHJvcHM6Z2V9PWkscmU9az09PTI7aWYocmUmJkEoRCxsLGgpLCghcmV8fEFhKGdlKSkmJlomMTYpZm9yKHZhciB2ZT0wO3ZlPGZlLmxlbmd0aDt2ZSsrKVQoZmVbdmVdLGwsaCwyKTtyZSYmQShqLGwsaCl9ZnVuY3Rpb24gc2EoaSxsLGgsdixBLFQsayxEKXt2YXJ7bzp7bmV4dFNpYmxpbmc6aixwYXJlbnROb2RlOloscXVlcnlTZWxlY3RvcjpmZX19PWssZ2U9bC50YXJnZXQ9TWkobC5wcm9wcyxmZSk7aWYoZ2Upe3ZhciByZT1nZS5fbHBhfHxnZS5maXJzdENoaWxkO2lmKGwuc2hhcGVGbGFnJjE2KWlmKEFhKGwucHJvcHMpKWwuYW5jaG9yPUQoaihpKSxsLFooaSksaCx2LEEsVCksbC50YXJnZXRBbmNob3I9cmU7ZWxzZXtsLmFuY2hvcj1qKGkpO2Zvcih2YXIgdmU9cmU7dmU7KWlmKHZlPWoodmUpLHZlJiZ2ZS5ub2RlVHlwZT09PTgmJnZlLmRhdGE9PT0idGVsZXBvcnQgYW5jaG9yIil7bC50YXJnZXRBbmNob3I9dmUsZ2UuX2xwYT1sLnRhcmdldEFuY2hvciYmaihsLnRhcmdldEFuY2hvcik7YnJlYWt9RChyZSxsLGdlLGgsdixBLFQpfUhvKGwpfXJldHVybiBsLmFuY2hvciYmaihsLmFuY2hvcil9dmFyIFVyPWhvO2Z1bmN0aW9uIEhvKGkpe3ZhciBsPWkuY3R4O2lmKGwmJmwudXQpe2Zvcih2YXIgaD1pLmNoaWxkcmVuWzBdLmVsO2gmJmghPT1pLnRhcmdldEFuY2hvcjspaC5ub2RlVHlwZT09PTEmJmguc2V0QXR0cmlidXRlKCJkYXRhLXYtb3duZXIiLGwudWlkKSxoPWgubmV4dFNpYmxpbmc7bC51dCgpfX12YXIgbnI9U3ltYm9sLmZvcigidi1mZ3QiKSxHbj1TeW1ib2wuZm9yKCJ2LXR4dCIpLGdyPVN5bWJvbC5mb3IoInYtY210IiksZ289U3ltYm9sLmZvcigidi1zdGMiKSxZbj1bXSwkcj1udWxsO2Z1bmN0aW9uIFRhKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiExO1luLnB1c2goJHI9aT9udWxsOltdKX1mdW5jdGlvbiBucygpe1luLnBvcCgpLCRyPVluW1luLmxlbmd0aC0xXXx8bnVsbH12YXIgZGk9MTtmdW5jdGlvbiBLcihpKXtkaSs9aX1mdW5jdGlvbiBIcihpKXtyZXR1cm4gaS5keW5hbWljQ2hpbGRyZW49ZGk+MD8kcnx8Zy5FTVBUWV9BUlI6bnVsbCxucygpLGRpPjAmJiRyJiYkci5wdXNoKGkpLGl9ZnVuY3Rpb24gb2woaSxsLGgsdixBLFQpe3JldHVybiBIcihvbihpLGwsaCx2LEEsVCwhMCkpfWZ1bmN0aW9uIExpKGksbCxoLHYsQSl7cmV0dXJuIEhyKHRuKGksbCxoLHYsQSwhMCkpfWZ1bmN0aW9uIE5vKGkpe3JldHVybiBpP2kuX192X2lzVk5vZGU9PT0hMDohMX1mdW5jdGlvbiBvaShpLGwpe3JldHVybiBpLnR5cGU9PT1sLnR5cGUmJmkua2V5PT09bC5rZXl9ZnVuY3Rpb24geXMoaSl7fXZhciBfZT0iX192SW50ZXJuYWwiLHh0PWk9Pnt2YXJ7a2V5Omx9PWk7cmV0dXJuIGwhPW51bGw/bDpudWxsfSxDdD1pPT57dmFye3JlZjpsLHJlZl9rZXk6aCxyZWZfZm9yOnZ9PWk7cmV0dXJuIHR5cGVvZiBsPT0ibnVtYmVyIiYmKGw9IiIrbCksbCE9bnVsbD9nLmlzU3RyaW5nKGwpfHx5LmlzUmVmKGwpfHxnLmlzRnVuY3Rpb24obCk/e2k6SG4scjpsLGs6aCxmOiEhdn06bDpudWxsfTtmdW5jdGlvbiBvbihpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06bnVsbCxoPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsLHY9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOjAsQT1hcmd1bWVudHMubGVuZ3RoPjQmJmFyZ3VtZW50c1s0XSE9PXZvaWQgMD9hcmd1bWVudHNbNF06bnVsbCxUPWFyZ3VtZW50cy5sZW5ndGg+NSYmYXJndW1lbnRzWzVdIT09dm9pZCAwP2FyZ3VtZW50c1s1XTppPT09bnI/MDoxLGs9YXJndW1lbnRzLmxlbmd0aD42JiZhcmd1bWVudHNbNl0hPT12b2lkIDA/YXJndW1lbnRzWzZdOiExLEQ9YXJndW1lbnRzLmxlbmd0aD43JiZhcmd1bWVudHNbN10hPT12b2lkIDA/YXJndW1lbnRzWzddOiExLGo9e19fdl9pc1ZOb2RlOiEwLF9fdl9za2lwOiEwLHR5cGU6aSxwcm9wczpsLGtleTpsJiZ4dChsKSxyZWY6bCYmQ3QobCksc2NvcGVJZDp5byxzbG90U2NvcGVJZHM6bnVsbCxjaGlsZHJlbjpoLGNvbXBvbmVudDpudWxsLHN1c3BlbnNlOm51bGwsc3NDb250ZW50Om51bGwsc3NGYWxsYmFjazpudWxsLGRpcnM6bnVsbCx0cmFuc2l0aW9uOm51bGwsZWw6bnVsbCxhbmNob3I6bnVsbCx0YXJnZXQ6bnVsbCx0YXJnZXRBbmNob3I6bnVsbCxzdGF0aWNDb3VudDowLHNoYXBlRmxhZzpULHBhdGNoRmxhZzp2LGR5bmFtaWNQcm9wczpBLGR5bmFtaWNDaGlsZHJlbjpudWxsLGFwcENvbnRleHQ6bnVsbCxjdHg6SG59O3JldHVybiBEPyhhbChqLGgpLFQmMTI4JiZpLm5vcm1hbGl6ZShqKSk6aCYmKGouc2hhcGVGbGFnfD1nLmlzU3RyaW5nKGgpPzg6MTYpLGRpPjAmJiFrJiYkciYmKGoucGF0Y2hGbGFnPjB8fFQmNikmJmoucGF0Y2hGbGFnIT09MzImJiRyLnB1c2goaiksan12YXIgdG49Rmk7ZnVuY3Rpb24gRmkoaSl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGwsaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbCx2PWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTowLEE9YXJndW1lbnRzLmxlbmd0aD40JiZhcmd1bWVudHNbNF0hPT12b2lkIDA/YXJndW1lbnRzWzRdOm51bGwsVD1hcmd1bWVudHMubGVuZ3RoPjUmJmFyZ3VtZW50c1s1XSE9PXZvaWQgMD9hcmd1bWVudHNbNV06ITE7aWYoKCFpfHxpPT09b28pJiYoaT1nciksTm8oaSkpe3ZhciBrPUJuKGksbCwhMCk7cmV0dXJuIGgmJmFsKGssaCksZGk+MCYmIVQmJiRyJiYoay5zaGFwZUZsYWcmNj8kclskci5pbmRleE9mKGkpXT1rOiRyLnB1c2goaykpLGsucGF0Y2hGbGFnfD0tMixrfWlmKGdsKGkpJiYoaT1pLl9fdmNjT3B0cyksbCl7bD1rbyhsKTt2YXJ7Y2xhc3M6RCxzdHlsZTpqfT1sO0QmJiFnLmlzU3RyaW5nKEQpJiYobC5jbGFzcz1nLm5vcm1hbGl6ZUNsYXNzKEQpKSxnLmlzT2JqZWN0KGopJiYoeS5pc1Byb3h5KGopJiYhZy5pc0FycmF5KGopJiYoaj1nLmV4dGVuZCh7fSxqKSksbC5zdHlsZT1nLm5vcm1hbGl6ZVN0eWxlKGopKX12YXIgWj1nLmlzU3RyaW5nKGkpPzE6T2koaSk/MTI4OiRvKGkpPzY0OmcuaXNPYmplY3QoaSk/NDpnLmlzRnVuY3Rpb24oaSk/MjowO3JldHVybiBvbihpLGwsaCx2LEEsWixULCEwKX1mdW5jdGlvbiBrbyhpKXtyZXR1cm4gaT95LmlzUHJveHkoaSl8fF9lIGluIGk/Zy5leHRlbmQoe30saSk6aTpudWxsfWZ1bmN0aW9uIEJuKGksbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHtwcm9wczp2LHJlZjpBLHBhdGNoRmxhZzpULGNoaWxkcmVuOmt9PWksRD1sP3NsKHZ8fHt9LGwpOnYsaj17X192X2lzVk5vZGU6ITAsX192X3NraXA6ITAsdHlwZTppLnR5cGUscHJvcHM6RCxrZXk6RCYmeHQoRCkscmVmOmwmJmwucmVmP2gmJkE/Zy5pc0FycmF5KEEpP0EuY29uY2F0KEN0KGwpKTpbQSxDdChsKV06Q3QobCk6QSxzY29wZUlkOmkuc2NvcGVJZCxzbG90U2NvcGVJZHM6aS5zbG90U2NvcGVJZHMsY2hpbGRyZW46ayx0YXJnZXQ6aS50YXJnZXQsdGFyZ2V0QW5jaG9yOmkudGFyZ2V0QW5jaG9yLHN0YXRpY0NvdW50Omkuc3RhdGljQ291bnQsc2hhcGVGbGFnOmkuc2hhcGVGbGFnLHBhdGNoRmxhZzpsJiZpLnR5cGUhPT1ucj9UPT09LTE/MTY6VHwxNjpULGR5bmFtaWNQcm9wczppLmR5bmFtaWNQcm9wcyxkeW5hbWljQ2hpbGRyZW46aS5keW5hbWljQ2hpbGRyZW4sYXBwQ29udGV4dDppLmFwcENvbnRleHQsZGlyczppLmRpcnMsdHJhbnNpdGlvbjppLnRyYW5zaXRpb24sY29tcG9uZW50OmkuY29tcG9uZW50LHN1c3BlbnNlOmkuc3VzcGVuc2Usc3NDb250ZW50Omkuc3NDb250ZW50JiZCbihpLnNzQ29udGVudCksc3NGYWxsYmFjazppLnNzRmFsbGJhY2smJkJuKGkuc3NGYWxsYmFjayksZWw6aS5lbCxhbmNob3I6aS5hbmNob3IsY3R4OmkuY3R4LGNlOmkuY2V9O3JldHVybiBqfWZ1bmN0aW9uIERpKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOiIgIixsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowO3JldHVybiB0bihHbixudWxsLGksbCl9ZnVuY3Rpb24gam8oaSxsKXt2YXIgaD10bihnbyxudWxsLGkpO3JldHVybiBoLnN0YXRpY0NvdW50PWwsaH1mdW5jdGlvbiBCcygpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXToiIixsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gbD8oVGEoKSxMaShncixudWxsLGkpKTp0bihncixudWxsLGkpfWZ1bmN0aW9uIHpuKGkpe3JldHVybiBpPT1udWxsfHx0eXBlb2YgaT09ImJvb2xlYW4iP3RuKGdyKTpnLmlzQXJyYXkoaSk/dG4obnIsbnVsbCxpLnNsaWNlKCkpOnR5cGVvZiBpPT0ib2JqZWN0Ij9PYShpKTp0bihHbixudWxsLFN0cmluZyhpKSl9ZnVuY3Rpb24gT2EoaSl7cmV0dXJuIGkuZWw9PT1udWxsJiZpLnBhdGNoRmxhZyE9PS0xfHxpLm1lbW8/aTpCbihpKX1mdW5jdGlvbiBhbChpLGwpe3ZhciBoPTAse3NoYXBlRmxhZzp2fT1pO2lmKGw9PW51bGwpbD1udWxsO2Vsc2UgaWYoZy5pc0FycmF5KGwpKWg9MTY7ZWxzZSBpZih0eXBlb2YgbD09Im9iamVjdCIpaWYodiYoMXw2NCkpe3ZhciBBPWwuZGVmYXVsdDtBJiYoQS5fYyYmKEEuX2Q9ITEpLGFsKGksQSgpKSxBLl9jJiYoQS5fZD0hMCkpO3JldHVybn1lbHNle2g9MzI7dmFyIFQ9bC5fOyFUJiYhKF9lIGluIGwpP2wuX2N0eD1IbjpUPT09MyYmSG4mJihIbi5zbG90cy5fPT09MT9sLl89MToobC5fPTIsaS5wYXRjaEZsYWd8PTEwMjQpKX1lbHNlIGcuaXNGdW5jdGlvbihsKT8obD17ZGVmYXVsdDpsLF9jdHg6SG59LGg9MzIpOihsPVN0cmluZyhsKSx2JjY0PyhoPTE2LGw9W0RpKGwpXSk6aD04KTtpLmNoaWxkcmVuPWwsaS5zaGFwZUZsYWd8PWh9ZnVuY3Rpb24gc2woKXtmb3IodmFyIGk9e30sbD0wO2w8YXJndW1lbnRzLmxlbmd0aDtsKyspe3ZhciBoPWw8MHx8YXJndW1lbnRzLmxlbmd0aDw9bD92b2lkIDA6YXJndW1lbnRzW2xdO2Zvcih2YXIgdiBpbiBoKWlmKHY9PT0iY2xhc3MiKWkuY2xhc3MhPT1oLmNsYXNzJiYoaS5jbGFzcz1nLm5vcm1hbGl6ZUNsYXNzKFtpLmNsYXNzLGguY2xhc3NdKSk7ZWxzZSBpZih2PT09InN0eWxlIilpLnN0eWxlPWcubm9ybWFsaXplU3R5bGUoW2kuc3R5bGUsaC5zdHlsZV0pO2Vsc2UgaWYoZy5pc09uKHYpKXt2YXIgQT1pW3ZdLFQ9aFt2XTtUJiZBIT09VCYmIShnLmlzQXJyYXkoQSkmJkEuaW5jbHVkZXMoVCkpJiYoaVt2XT1BP1tdLmNvbmNhdChBLFQpOlQpfWVsc2UgdiE9PSIiJiYoaVt2XT1oW3ZdKX1yZXR1cm4gaX1mdW5jdGlvbiBfbihpLGwsaCl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7bG4oaSxsLDcsW2gsdl0pfXZhciBwbz1lcygpLFBhPTA7ZnVuY3Rpb24gbGEoaSxsLGgpe3ZhciB2PWkudHlwZSxBPShsP2wuYXBwQ29udGV4dDppLmFwcENvbnRleHQpfHxwbyxUPXt1aWQ6UGErKyx2bm9kZTppLHR5cGU6dixwYXJlbnQ6bCxhcHBDb250ZXh0OkEscm9vdDpudWxsLG5leHQ6bnVsbCxzdWJUcmVlOm51bGwsZWZmZWN0Om51bGwsdXBkYXRlOm51bGwsc2NvcGU6bmV3IHkuRWZmZWN0U2NvcGUoITApLHJlbmRlcjpudWxsLHByb3h5Om51bGwsZXhwb3NlZDpudWxsLGV4cG9zZVByb3h5Om51bGwsd2l0aFByb3h5Om51bGwscHJvdmlkZXM6bD9sLnByb3ZpZGVzOk9iamVjdC5jcmVhdGUoQS5wcm92aWRlcyksYWNjZXNzQ2FjaGU6bnVsbCxyZW5kZXJDYWNoZTpbXSxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlczpudWxsLHByb3BzT3B0aW9uczpGZSh2LEEpLGVtaXRzT3B0aW9uczpRcih2LEEpLGVtaXQ6bnVsbCxlbWl0dGVkOm51bGwscHJvcHNEZWZhdWx0czpnLkVNUFRZX09CSixpbmhlcml0QXR0cnM6di5pbmhlcml0QXR0cnMsY3R4OmcuRU1QVFlfT0JKLGRhdGE6Zy5FTVBUWV9PQkoscHJvcHM6Zy5FTVBUWV9PQkosYXR0cnM6Zy5FTVBUWV9PQkosc2xvdHM6Zy5FTVBUWV9PQkoscmVmczpnLkVNUFRZX09CSixzZXR1cFN0YXRlOmcuRU1QVFlfT0JKLHNldHVwQ29udGV4dDpudWxsLGF0dHJzUHJveHk6bnVsbCxzbG90c1Byb3h5Om51bGwsc3VzcGVuc2U6aCxzdXNwZW5zZUlkOmg/aC5wZW5kaW5nSWQ6MCxhc3luY0RlcDpudWxsLGFzeW5jUmVzb2x2ZWQ6ITEsaXNNb3VudGVkOiExLGlzVW5tb3VudGVkOiExLGlzRGVhY3RpdmF0ZWQ6ITEsYmM6bnVsbCxjOm51bGwsYm06bnVsbCxtOm51bGwsYnU6bnVsbCx1Om51bGwsdW06bnVsbCxidW06bnVsbCxkYTpudWxsLGE6bnVsbCxydGc6bnVsbCxydGM6bnVsbCxlYzpudWxsLHNwOm51bGx9O3JldHVybiBULmN0eD17XzpUfSxULnJvb3Q9bD9sLnJvb3Q6VCxULmVtaXQ9bXIuYmluZChudWxsLFQpLGkuY2UmJmkuY2UoVCksVH12YXIgcnI9bnVsbCxJbz0oKT0+cnJ8fEhuLGhpLCRhO3t2YXIgbGw9Zy5nZXRHbG9iYWxUaGlzKCksRXM9KGksbCk9Pnt2YXIgaDtyZXR1cm4oaD1sbFtpXSl8fChoPWxsW2ldPVtdKSxoLnB1c2gobCksdj0+e2gubGVuZ3RoPjE/aC5mb3JFYWNoKEE9PkEodikpOmhbMF0odil9fTtoaT1FcygiX19WVUVfSU5TVEFOQ0VfU0VUVEVSU19fIixpPT5ycj1pKSwkYT1FcygiX19WVUVfU1NSX1NFVFRFUlNfXyIsaT0+Yi5pc0luU1NSQ29tcG9uZW50U2V0dXA9aSl9dmFyIE5hPWk9Pnt2YXIgbD1ycjtyZXR1cm4gaGkoaSksaS5zY29wZS5vbigpLCgpPT57aS5zY29wZS5vZmYoKSxoaShsKX19LHJzPSgpPT57cnImJnJyLnNjb3BlLm9mZigpLGhpKG51bGwpfTtmdW5jdGlvbiBpcyhpKXtyZXR1cm4gaS52bm9kZS5zaGFwZUZsYWcmNH1iLmlzSW5TU1JDb21wb25lbnRTZXR1cD0hMTtmdW5jdGlvbiBvcyhpKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7bCYmJGEobCk7dmFye3Byb3BzOmgsY2hpbGRyZW46dn09aS52bm9kZSxBPWlzKGkpO1goaSxoLEEsbCksa24oaSx2KTt2YXIgVD1BP01zKGksbCk6dm9pZCAwO3JldHVybiBsJiYkYSghMSksVH1mdW5jdGlvbiBNcyhpLGwpe3ZhciBoPWkudHlwZTtpLmFjY2Vzc0NhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksaS5wcm94eT15Lm1hcmtSYXcobmV3IFByb3h5KGkuY3R4LFhhKSk7dmFye3NldHVwOnZ9PWg7aWYodil7dmFyIEE9aS5zZXR1cENvbnRleHQ9di5sZW5ndGg+MT9IYShpKTpudWxsLFQ9TmEoaSk7eS5wYXVzZVRyYWNraW5nKCk7dmFyIGs9c24odixpLDAsW2kucHJvcHMsQV0pO2lmKHkucmVzZXRUcmFja2luZygpLFQoKSxnLmlzUHJvbWlzZShrKSl7aWYoay50aGVuKHJzLHJzKSxsKXJldHVybiBrLnRoZW4oRD0+e2NsKGksRCxsKX0pLmNhdGNoKEQ9PntibihELGksMCl9KTtpLmFzeW5jRGVwPWt9ZWxzZSBjbChpLGssbCl9ZWxzZSBzcyhpLGwpfWZ1bmN0aW9uIGNsKGksbCxoKXtnLmlzRnVuY3Rpb24obCk/aS50eXBlLl9fc3NySW5saW5lUmVuZGVyP2kuc3NyUmVuZGVyPWw6aS5yZW5kZXI9bDpnLmlzT2JqZWN0KGwpJiYoaS5zZXR1cFN0YXRlPXkucHJveHlSZWZzKGwpKSxzcyhpLGgpfXZhciBhcyx1bDtmdW5jdGlvbiB6byhpKXthcz1pLHVsPWw9PntsLnJlbmRlci5fcmMmJihsLndpdGhQcm94eT1uZXcgUHJveHkobC5jdHgsUWEpKX19dmFyIGthPSgpPT4hYXM7ZnVuY3Rpb24gc3MoaSxsLGgpe3ZhciB2PWkudHlwZTtpZighaS5yZW5kZXIpe2lmKCFsJiZhcyYmIXYucmVuZGVyKXt2YXIgQT12LnRlbXBsYXRlfHx4aShpKS50ZW1wbGF0ZTtpZihBKXt2YXJ7aXNDdXN0b21FbGVtZW50OlQsY29tcGlsZXJPcHRpb25zOmt9PWkuYXBwQ29udGV4dC5jb25maWcse2RlbGltaXRlcnM6RCxjb21waWxlck9wdGlvbnM6an09dixaPWcuZXh0ZW5kKGcuZXh0ZW5kKHtpc0N1c3RvbUVsZW1lbnQ6VCxkZWxpbWl0ZXJzOkR9LGspLGopO3YucmVuZGVyPWFzKEEsWil9fWkucmVuZGVyPXYucmVuZGVyfHxnLk5PT1AsdWwmJnVsKGkpfXt2YXIgZmU9TmEoaSk7eS5wYXVzZVRyYWNraW5nKCk7dHJ5e1ZvKGkpfWZpbmFsbHl7eS5yZXNldFRyYWNraW5nKCksZmUoKX19fWZ1bmN0aW9uIFNzKGkpe3JldHVybiBpLmF0dHJzUHJveHl8fChpLmF0dHJzUHJveHk9bmV3IFByb3h5KGkuYXR0cnMse2dldChsLGgpe3JldHVybiB5LnRyYWNrKGksImdldCIsIiRhdHRycyIpLGxbaF19fSkpfWZ1bmN0aW9uIEhhKGkpe3ZhciBsPWg9PntpLmV4cG9zZWQ9aHx8e319O3JldHVybntnZXQgYXR0cnMoKXtyZXR1cm4gU3MoaSl9LHNsb3RzOmkuc2xvdHMsZW1pdDppLmVtaXQsZXhwb3NlOmx9fWZ1bmN0aW9uIElhKGkpe2lmKGkuZXhwb3NlZClyZXR1cm4gaS5leHBvc2VQcm94eXx8KGkuZXhwb3NlUHJveHk9bmV3IFByb3h5KHkucHJveHlSZWZzKHkubWFya1JhdyhpLmV4cG9zZWQpKSx7Z2V0KGwsaCl7aWYoaCBpbiBsKXJldHVybiBsW2hdO2lmKGggaW4gbHIpcmV0dXJuIGxyW2hdKGkpO2lmKGg9PT0iJHNjb3BlIilyZXR1cm4gaS5jdHguJHNjb3BlfSxoYXMobCxoKXtyZXR1cm4gaCBpbiBsfHxoIGluIGxyfHxoPT09IiRzY29wZSJ9fSkpfXZhciBmbD0vKD86XnxbLV9dKShcdykvZyxkbD1pPT5pLnJlcGxhY2UoZmwsbD0+bC50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIiIpO2Z1bmN0aW9uIHdzKGkpe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMDtyZXR1cm4gZy5pc0Z1bmN0aW9uKGkpP2kuZGlzcGxheU5hbWV8fGkubmFtZTppLm5hbWV8fGwmJmkuX19uYW1lfWZ1bmN0aW9uIGhsKGksbCl7dmFyIGg9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExLHY9d3MobCk7aWYoIXYmJmwuX19maWxlKXt2YXIgQT1sLl9fZmlsZS5tYXRjaCgvKFteL1xcXSspXC5cdyskLyk7QSYmKHY9QVsxXSl9aWYoIXYmJmkmJmkucGFyZW50KXt2YXIgVD1rPT57Zm9yKHZhciBEIGluIGspaWYoa1tEXT09PWwpcmV0dXJuIER9O3Y9VChpLmNvbXBvbmVudHN8fGkucGFyZW50LnR5cGUuY29tcG9uZW50cyl8fFQoaS5hcHBDb250ZXh0LmNvbXBvbmVudHMpfXJldHVybiB2P2RsKHYpOmg/IkFwcCI6IkFub255bW91cyJ9ZnVuY3Rpb24gZ2woaSl7cmV0dXJuIGcuaXNGdW5jdGlvbihpKSYmIl9fdmNjT3B0cyJpbiBpfXZhciBwbD0oaSxsKT0+e3ZhciBoPXkuY29tcHV0ZWQoaSxsLGIuaXNJblNTUkNvbXBvbmVudFNldHVwKTtyZXR1cm4gaH07ZnVuY3Rpb24gbHMoaSxsKXt2YXIgaD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06Zy5FTVBUWV9PQkosdj1JbygpLEE9Zy5jYW1lbGl6ZShsKSxUPWcuaHlwaGVuYXRlKGwpLGs9eS5jdXN0b21SZWYoKGosWik9Pnt2YXIgZmU7cmV0dXJuIGZpKCgpPT57dmFyIGdlPWlbbF07Zy5oYXNDaGFuZ2VkKGZlLGdlKSYmKGZlPWdlLFooKSl9KSx7Z2V0KCl7cmV0dXJuIGooKSxoLmdldD9oLmdldChmZSk6ZmV9LHNldChnZSl7dmFyIHJlPXYudm5vZGUucHJvcHM7IShyZSYmKGwgaW4gcmV8fEEgaW4gcmV8fFQgaW4gcmUpJiYoIm9uVXBkYXRlOiIuY29uY2F0KGwpaW4gcmV8fCJvblVwZGF0ZToiLmNvbmNhdChBKWluIHJlfHwib25VcGRhdGU6Ii5jb25jYXQoVClpbiByZSkpJiZnLmhhc0NoYW5nZWQoZ2UsZmUpJiYoZmU9Z2UsWigpKSx2LmVtaXQoInVwZGF0ZToiLmNvbmNhdChsKSxoLnNldD9oLnNldChnZSk6Z2UpfX19KSxEPWw9PT0ibW9kZWxWYWx1ZSI/Im1vZGVsTW9kaWZpZXJzIjoiIi5jb25jYXQobCwiTW9kaWZpZXJzIik7cmV0dXJuIGtbU3ltYm9sLml0ZXJhdG9yXT0oKT0+e3ZhciBqPTA7cmV0dXJue25leHQoKXtyZXR1cm4gajwyP3t2YWx1ZTpqKys/aVtEXXx8e306ayxkb25lOiExfTp7ZG9uZTohMH19fX0sa31mdW5jdGlvbiBnaShpLGwsaCl7dmFyIHY9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdj09PTI/Zy5pc09iamVjdChsKSYmIWcuaXNBcnJheShsKT9ObyhsKT90bihpLG51bGwsW2xdKTp0bihpLGwpOnRuKGksbnVsbCxsKToodj4zP2g9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpOnY9PT0zJiZObyhoKSYmKGg9W2hdKSx0bihpLGwsaCkpfWZ1bmN0aW9uIFdvKCl7fWZ1bmN0aW9uIFZsKGksbCxoLHYpe3ZhciBBPWhbdl07aWYoQSYmVWwoQSxpKSlyZXR1cm4gQTt2YXIgVD1sKCk7cmV0dXJuIFQubWVtbz1pLnNsaWNlKCksaFt2XT1UfWZ1bmN0aW9uIFVsKGksbCl7dmFyIGg9aS5tZW1vO2lmKGgubGVuZ3RoIT1sLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHY9MDt2PGgubGVuZ3RoO3YrKylpZihnLmhhc0NoYW5nZWQoaFt2XSxsW3ZdKSlyZXR1cm4hMTtyZXR1cm4gZGk+MCYmJHImJiRyLnB1c2goaSksITB9dmFyICRsPSIzLjQuMjEiLEhsPWcuTk9PUCxDYz1uZSxqbD14cix6bD1IaSxUYz17Y3JlYXRlQ29tcG9uZW50SW5zdGFuY2U6bGEsc2V0dXBDb21wb25lbnQ6b3MscmVuZGVyQ29tcG9uZW50Um9vdDpkcixzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U6R3IsaXNWTm9kZTpObyxub3JtYWxpemVWTm9kZTp6bn0sV2w9VGMsamE9bnVsbCxMcz1udWxsLEZzPW51bGw7ZnVuY3Rpb24gRHMoaSxsKXtyZXR1cm4gaT09PSJpbnB1dCI/bmV3IEkuVW5pSW5wdXRFbGVtZW50KGksbCk6aT09PSJ0ZXh0YXJlYSI/bmV3IEkuVW5pVGV4dEFyZWFFbGVtZW50KGksbCk6bmV3IEkuVW5pRWxlbWVudChpLGwpfWZ1bmN0aW9uIFZzKGksbCl7cmV0dXJuIG5ldyBJLlVuaVRleHROb2RlKGksbCl9ZnVuY3Rpb24gVXMoaSxsKXtyZXR1cm4gbmV3IEkuVW5pQ29tbWVudE5vZGUoaSxsKX12YXIgR2wsWWw9e2luc2VydDooaSxsLGgpPT57bC5pbnNlcnRCZWZvcmUoaSxofHxudWxsKX0scmVtb3ZlOmk9Pnt2YXIgbD1pLnBhcmVudE5vZGU7bCYmbC5yZW1vdmVDaGlsZChpKX0sY3JlYXRlRWxlbWVudDooaSxsKT0+RHMoaSxsKSxjcmVhdGVUZXh0OihpLGwpPT5WcyhpLGwpLGNyZWF0ZUNvbW1lbnQ6KGksbCk9PlVzKGksbCksc2V0VGV4dDooaSxsKT0+e2kubm9kZVZhbHVlPWx9LHNldEVsZW1lbnRUZXh0OihpLGwpPT57aS50ZXh0Q29udGVudD1sfSxwYXJlbnROb2RlOmk9PmkucGFyZW50Tm9kZSxuZXh0U2libGluZzppPT5pLm5leHRTaWJsaW5nLHNldFNjb3BlSWQoaSxsKXtpLnNldEF0dHJpYnV0ZShsLCIiKX0sY2xvbmVOb2RlKGkpe3ZhciBsPWkuY2xvbmVOb2RlKCEwKTtyZXR1cm4iX3ZhbHVlImluIGkmJihsLl92YWx1ZT1pLl92YWx1ZSksbH0saW5zZXJ0U3RhdGljQ29udGVudChpLGwsaCl7dmFyIHY9R2x8fChHbD1EcygiZGl2IikpO3YuaW5uZXJIVE1MPWk7Zm9yKHZhciBBPXYuZmlyc3RDaGlsZCxUPUEsaz1UO1Q7KWs9VCxZbC5pbnNlcnQoVCxsLGgpLFQ9di5maXJzdENoaWxkO3JldHVybltBLGtdfX07ZnVuY3Rpb24gcWwoaSxsKXtsPT1udWxsJiYobD0iIiksaS5zZXRBdHRyaWJ1dGUoImNsYXNzIixsKX1mdW5jdGlvbiBKbChpLGwsaCl7aWYoIWgpaS5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7ZWxzZSBpZihnLmlzU3RyaW5nKGgpKWwhPT1oJiZpLnNldEF0dHJpYnV0ZSgic3R5bGUiLGgpO2Vsc2V7dmFyIHY9e30sQT1sJiYhZy5pc1N0cmluZyhsKTtpZihBKXtmb3IodmFyIFQgaW4gbCloW1RdPT1udWxsJiYodltUXT0iIik7Zm9yKHZhciBrIGluIGgpe3ZhciBEPWhba107RCE9PWxba10mJih2W2tdPUQpfX1lbHNlIGZvcih2YXIgaiBpbiBoKXZbal09aFtqXTtPYmplY3Qua2V5cyh2KS5sZW5ndGgmJmkuc2V0QXR0cmlidXRlKCJzdHlsZSIsdil9fWZ1bmN0aW9uIEtsKGksbCxoKXtoPT1udWxsP2kucmVtb3ZlQXR0cmlidXRlKGwpOmkuc2V0QXR0cmlidXRlKGwsaCl9ZnVuY3Rpb24gdmwoaSxsLGgsdil7aS5hZGRFdmVudExpc3RlbmVyKGwsaCx2KX1mdW5jdGlvbiBabChpLGwsaCx2KXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIobCxoLHYpfWZ1bmN0aW9uIE9jKGksbCxoLHYpe3ZhciBBPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dm9pZCAwP2FyZ3VtZW50c1s0XTpudWxsLFQ9aS5fdmVpfHwoaS5fdmVpPXt9KSxrPVRbbF07aWYodiYmaylrLnZhbHVlPXY7ZWxzZXt2YXJbRCxqXT1tbChsKTtpZih2KXt2YXIgWj1UW2xdPVhsKHYsQSk7dmwoaSxELFosail9ZWxzZSBrJiYoWmwoaSxELGssaiksVFtsXT12b2lkIDApfX12YXIgJHM9Lyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO2Z1bmN0aW9uIG1sKGkpe3ZhciBsO2lmKCRzLnRlc3QoaSkpe2w9e307Zm9yKHZhciBoO2g9aS5tYXRjaCgkcyk7KWk9aS5zbGljZSgwLGkubGVuZ3RoLWhbMF0ubGVuZ3RoKSxsW2hbMF0udG9Mb3dlckNhc2UoKV09ITB9cmV0dXJuW2cuaHlwaGVuYXRlKGkuc2xpY2UoMikpLGxdfWZ1bmN0aW9uIFhsKGksbCl7dmFyIGg9QT0+e2xuKGgudmFsdWUsbCw1LFtBXSl9O2gudmFsdWU9aTt2YXIgdj1uZXcgU2V0O3JldHVybiBnLmlzQXJyYXkoaC52YWx1ZSk/aC52YWx1ZS5mb3JFYWNoKEE9PntBLm1vZGlmaWVycyYmQS5tb2RpZmllcnMuZm9yRWFjaChUPT57di5hZGQoVCl9KX0pOihoLnZhbHVlLm1vZGlmaWVycyYmaC52YWx1ZS5tb2RpZmllcnMuZm9yRWFjaChBPT57di5hZGQoQSl9KSxQYyhoLGwpKSxoLm1vZGlmaWVycz1bLi4udl0saH1mdW5jdGlvbiBQYyhpLGwpe2lmKCEhbCl7dmFyeyR3eHNNb2R1bGVzOmh9PWw7aWYoISFoKXt2YXIgdj1pLnZhbHVlLnRvU3RyaW5nKCk7IWguZmluZChBPT52LmluZGV4T2YoIi4iK0ErIi4iKT4tMSl8fChpLnd4c0V2ZW50PWkudmFsdWUoKSl9fX12YXIgTmM9KGksbCxoLHYsQSxULGssRCxqKT0+e3N3aXRjaChsKXtjYXNlImNsYXNzIjpxbChpLHYpO2JyZWFrO2Nhc2Uic3R5bGUiOkpsKGksaCx2KTticmVhaztkZWZhdWx0OmlmKGcuaXNPbihsKSlnLmlzTW9kZWxMaXN0ZW5lcihsKXx8T2MoaSxsLGgsdixrKTtlbHNle2lmKGcuaXNPYmplY3Qodikpe3ZhciBaPWg9PT12O2lmKHY9SS5KU09OX1BST1RPQ09MK0pTT04uc3RyaW5naWZ5KHYpLFomJmkuZ2V0QXR0cmlidXRlKGwpPT09dilyZXR1cm59ZWxzZSBpZihoPT09dilyZXR1cm47S2woaSxsLHYpfWJyZWFrfX07ZnVuY3Rpb24gUWwoKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06IiRzdHlsZSI7e3ZhciBsPUlvKCk7aWYoIWwpcmV0dXJuIGcuRU1QVFlfT0JKO3ZhciBoPWwudHlwZS5fX2Nzc01vZHVsZXM7aWYoIWgpcmV0dXJuIGcuRU1QVFlfT0JKO3ZhciB2PWhbaV07cmV0dXJuIHZ8fGcuRU1QVFlfT0JKfX1mdW5jdGlvbiBfbChpKXt2YXIgbD1JbygpO2lmKCEhbCl7dmFyIGg9KCk9PmFpKGwuc3ViVHJlZSxpKGwucHJveHkpKTtBbygoKT0+UGkoaCx7Zmx1c2g6InBvc3QifSkpLFkoaCl9fWZ1bmN0aW9uIGFpKGksbCl7aWYoaS5zaGFwZUZsYWcmMTI4KXt2YXIgaD1pLnN1c3BlbnNlO2k9aC5hY3RpdmVCcmFuY2gsaC5wZW5kaW5nQnJhbmNoJiYhaC5pc0h5ZHJhdGluZyYmaC5lZmZlY3RzLnB1c2goKCk9PnthaShoLmFjdGl2ZUJyYW5jaCxsKX0pfWZvcig7aS5jb21wb25lbnQ7KWk9aS5jb21wb25lbnQuc3ViVHJlZTtpZihpLnNoYXBlRmxhZyYxJiZpLmVsKVhpKGkuZWwsbCk7ZWxzZSBpZihpLnR5cGU9PT1ucilpLmNoaWxkcmVuLmZvckVhY2goVD0+YWkoVCxsKSk7ZWxzZSBpZihpLnR5cGU9PT1nbylmb3IodmFye2VsOnYsYW5jaG9yOkF9PWk7diYmKFhpKHYsbCksdiE9PUEpOyl2PXYubmV4dFNpYmxpbmd9ZnVuY3Rpb24gWGkoaSxsKXtpZihpLm5vZGVUeXBlPT09MSlmb3IodmFyIGggaW4gbClpLnNldEF0dHJpYnV0ZSgiLS0iLmNvbmNhdChoKSxsW2hdKX12YXIgY2E9InRyYW5zaXRpb24iLHZvPSJhbmltYXRpb24iLGJsPShpLGwpPT57dmFye3Nsb3RzOmh9PWw7cmV0dXJuIGdpKExyLHlsKGkpLGgpfTtibC5kaXNwbGF5TmFtZT0iVHJhbnNpdGlvbiI7dmFyIFJhPXtuYW1lOlN0cmluZyx0eXBlOlN0cmluZyxjc3M6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxkdXJhdGlvbjpbU3RyaW5nLE51bWJlcixPYmplY3RdLGVudGVyRnJvbUNsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGFwcGVhckZyb21DbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGxlYXZlRnJvbUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nfSxlYz1ibC5wcm9wcz1nLmV4dGVuZCh7fSxMci5wcm9wcyxSYSksemE9ZnVuY3Rpb24oaSl7dmFyIGw9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO2cuaXNBcnJheShpKT9pLmZvckVhY2goaD0+aCguLi5sKSk6aSYmaSguLi5sKX0sdWE9aT0+aT9nLmlzQXJyYXkoaSk/aS5zb21lKGw9PmwubGVuZ3RoPjEpOmkubGVuZ3RoPjE6ITE7ZnVuY3Rpb24geWwoaSl7dmFyIGw9e307Zm9yKHZhciBoIGluIGkpaCBpbiBSYXx8KGxbaF09aVtoXSk7aWYoaS5jc3M9PT0hMSlyZXR1cm4gbDt2YXJ7bmFtZTp2PSJ2Iix0eXBlOkEsZHVyYXRpb246VCxlbnRlckZyb21DbGFzczprPSIiLmNvbmNhdCh2LCItZW50ZXItZnJvbSIpLGVudGVyQWN0aXZlQ2xhc3M6RD0iIi5jb25jYXQodiwiLWVudGVyLWFjdGl2ZSIpLGVudGVyVG9DbGFzczpqPSIiLmNvbmNhdCh2LCItZW50ZXItdG8iKSxhcHBlYXJGcm9tQ2xhc3M6Wj1rLGFwcGVhckFjdGl2ZUNsYXNzOmZlPUQsYXBwZWFyVG9DbGFzczpnZT1qLGxlYXZlRnJvbUNsYXNzOnJlPSIiLmNvbmNhdCh2LCItbGVhdmUtZnJvbSIpLGxlYXZlQWN0aXZlQ2xhc3M6dmU9IiIuY29uY2F0KHYsIi1sZWF2ZS1hY3RpdmUiKSxsZWF2ZVRvQ2xhc3M6V2U9IiIuY29uY2F0KHYsIi1sZWF2ZS10byIpfT1pLGl0PUdvKFQpLG50PWl0JiZpdFswXSxQdD1pdCYmaXRbMV0se29uQmVmb3JlRW50ZXI6SXQsb25FbnRlcjp1ZSxvbkVudGVyQ2FuY2VsbGVkOk9lLG9uTGVhdmU6U2Usb25MZWF2ZUNhbmNlbGxlZDpWZSxvbkJlZm9yZUFwcGVhcjp2dD1JdCxvbkFwcGVhcjpydD11ZSxvbkFwcGVhckNhbmNlbGxlZDpCPU9lfT1sLFY9KG9lLFJlLGplKT0+e1dhKG9lLFJlP2dlOmopLFdhKG9lLFJlP2ZlOkQpLGplJiZqZSgpfSx0ZT0ob2UsUmUpPT57V2Eob2UsV2UpLFdhKG9lLHZlKSxSZSYmUmUoKX0sZGU9b2U9PihSZSxqZSk9Pnt2YXIgeWU9b2U/cnQ6dWUsSmU9KCk9PlYoUmUsb2UsamUpO3phKHllLFtSZSxKZV0pLGpzKCgpPT57V2EoUmUsb2U/WjprKSxJcihSZSxvZT9nZTpqKSx1YSh5ZSl8fHRjKFJlLEEsbnQsSmUpfSl9O3JldHVybiBnLmV4dGVuZChsLHtvbkJlZm9yZUVudGVyKG9lKXt6YShJdCxbb2VdKSxJcihvZSxrKSxJcihvZSxEKX0sb25CZWZvcmVBcHBlYXIob2Upe3phKHZ0LFtvZV0pLElyKG9lLFopLElyKG9lLGZlKX0sb25FbnRlcjpkZSghMSksb25BcHBlYXI6ZGUoITApLG9uTGVhdmUob2UsUmUpe3ZhciBqZT0oKT0+dGUob2UsUmUpO0lyKG9lLHJlKSxpYygpLElyKG9lLHZlKSxqcygoKT0+e1dhKG9lLHJlKSxJcihvZSxXZSksdWEoU2UpfHx0YyhvZSxBLFB0LGplKX0pLHphKFNlLFtvZSxqZV0pfSxvbkVudGVyQ2FuY2VsbGVkKG9lKXtWKG9lLCExKSx6YShPZSxbb2VdKX0sb25BcHBlYXJDYW5jZWxsZWQob2Upe1Yob2UsITApLHphKEIsW29lXSl9LG9uTGVhdmVDYW5jZWxsZWQob2Upe3RlKG9lKSx6YShWZSxbb2VdKX19KX1mdW5jdGlvbiBHbyhpKXtpZihpPT1udWxsKXJldHVybiBudWxsO2lmKGcuaXNPYmplY3QoaSkpcmV0dXJuW0hzKGkuZW50ZXIpLEhzKGkubGVhdmUpXTt2YXIgbD1IcyhpKTtyZXR1cm5bbCxsXX1mdW5jdGlvbiBIcyhpKXt2YXIgbD1nLnRvTnVtYmVyKGkpO3JldHVybiBsfWZ1bmN0aW9uIElyKGksbCl7bC5zcGxpdCgvXHMrLykuZm9yRWFjaChoPT5oJiZpLmNsYXNzTGlzdC5hZGQoaCkpLChpLl92dGN8fChpLl92dGM9bmV3IFNldCkpLmFkZChsKX1mdW5jdGlvbiBXYShpLGwpe2wuc3BsaXQoL1xzKy8pLmZvckVhY2godj0+diYmaS5jbGFzc0xpc3QucmVtb3ZlKHYpKTt2YXJ7X3Z0YzpofT1pO2gmJihoLmRlbGV0ZShsKSxoLnNpemV8fChpLl92dGM9dm9pZCAwKSl9ZnVuY3Rpb24ganMoaSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGkpfSl9dmFyIEVsPTA7ZnVuY3Rpb24gdGMoaSxsLGgsdil7dmFyIEE9aS5fZW5kSWQ9KytFbCxUPSgpPT57QT09PWkuX2VuZElkJiZ2KCl9O2lmKGgpcmV0dXJuIHNldFRpbWVvdXQoVCxoKTt2YXJ7dHlwZTprLHRpbWVvdXQ6RCxwcm9wQ291bnQ6an09QXMoaSxsKTtpZighaylyZXR1cm4gdigpO3ZhciBaPWsrImVuZCIsZmU9MCxnZT0oKT0+e2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihaLHJlKSxUKCl9LHJlPXZlPT57dmUudGFyZ2V0PT09aSYmKytmZT49aiYmZ2UoKX07c2V0VGltZW91dCgoKT0+e2ZlPGomJmdlKCl9LEQrMSksaS5hZGRFdmVudExpc3RlbmVyKFoscmUpfWZ1bmN0aW9uIEFzKGksbCl7dmFyIGg9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaSksdj1XZT0+KGhbV2VdfHwiIikuc3BsaXQoIiwgIiksQT12KGNhKyJEZWxheSIpLFQ9dihjYSsiRHVyYXRpb24iKSxrPW5jKEEsVCksRD12KHZvKyJEZWxheSIpLGo9dih2bysiRHVyYXRpb24iKSxaPW5jKEQsaiksZmU9bnVsbCxnZT0wLHJlPTA7bD09PWNhP2s+MCYmKGZlPWNhLGdlPWsscmU9VC5sZW5ndGgpOmw9PT12bz9aPjAmJihmZT12byxnZT1aLHJlPWoubGVuZ3RoKTooZ2U9TWF0aC5tYXgoayxaKSxmZT1nZT4wP2s+Wj9jYTp2bzpudWxsLHJlPWZlP2ZlPT09Y2E/VC5sZW5ndGg6ai5sZW5ndGg6MCk7dmFyIHZlPWZlPT09Y2EmJi9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLy50ZXN0KGhbY2ErIlByb3BlcnR5Il0pO3JldHVybnt0eXBlOmZlLHRpbWVvdXQ6Z2UscHJvcENvdW50OnJlLGhhc1RyYW5zZm9ybTp2ZX19ZnVuY3Rpb24gbmMoaSxsKXtmb3IoO2kubGVuZ3RoPGwubGVuZ3RoOylpPWkuY29uY2F0KGkpO3JldHVybiBNYXRoLm1heCguLi5sLm1hcCgoaCx2KT0+cmMoaCkrcmMoaVt2XSkpKX1mdW5jdGlvbiByYyhpKXtyZXR1cm4gTnVtYmVyKGkuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSkqMWUzfWZ1bmN0aW9uIGljKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXZhciBTbD1uZXcgV2Vha01hcCxjcz1uZXcgV2Vha01hcCxvYz17bmFtZToiVHJhbnNpdGlvbkdyb3VwIixwcm9wczpnLmV4dGVuZCh7fSxlYyx7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSksc2V0dXAoaSxsKXt2YXJ7c2xvdHM6aH09bCx2PUlvKCksQT10YSgpLFQsaztyZXR1cm4gWSgoKT0+e2lmKCEhVC5sZW5ndGgpe3ZhciBEPWkubW92ZUNsYXNzfHwiIi5jb25jYXQoaS5uYW1lfHwidiIsIi1tb3ZlIik7aWYoISFOKFRbMF0uZWwsdi52bm9kZS5lbCxEKSl7VC5mb3JFYWNoKGMpLFQuZm9yRWFjaChtKTt2YXIgaj1ULmZpbHRlcih3KTtpYygpLGouZm9yRWFjaChaPT57dmFyIGZlPVouZWwsZ2U9ZmUuc3R5bGU7SXIoZmUsRCksZ2UudHJhbnNmb3JtPWdlLndlYmtpdFRyYW5zZm9ybT1nZS50cmFuc2l0aW9uRHVyYXRpb249IiI7dmFyIHJlPWZlLl9tb3ZlQ2I9dmU9Pnt2ZSYmdmUudGFyZ2V0IT09ZmV8fCghdmV8fC90cmFuc2Zvcm0kLy50ZXN0KHZlLnByb3BlcnR5TmFtZSkpJiYoZmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIscmUpLGZlLl9tb3ZlQ2I9bnVsbCxXYShmZSxEKSl9O2ZlLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLHJlKX0pfX19KSwoKT0+e3ZhciBEPXkudG9SYXcoaSksaj15bChEKSxaPUQudGFnfHxucjtUPWssaz1oLmRlZmF1bHQ/Y28oaC5kZWZhdWx0KCkpOltdO2Zvcih2YXIgZmU9MDtmZTxrLmxlbmd0aDtmZSsrKXt2YXIgZ2U9a1tmZV07Z2Uua2V5IT1udWxsJiZraShnZSxiaShnZSxqLEEsdikpfWlmKFQpZm9yKHZhciByZT0wO3JlPFQubGVuZ3RoO3JlKyspe3ZhciB2ZT1UW3JlXTtraSh2ZSxiaSh2ZSxqLEEsdikpLFNsLnNldCh2ZSx2ZS5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9cmV0dXJuIHRuKFosbnVsbCxrKX19fSxrYz1pPT5kZWxldGUgaS5tb2RlO29jLnByb3BzO3ZhciBhPW9jO2Z1bmN0aW9uIGMoaSl7dmFyIGw9aS5lbDtsLl9tb3ZlQ2ImJmwuX21vdmVDYigpLGwuX2VudGVyQ2ImJmwuX2VudGVyQ2IoKX1mdW5jdGlvbiBtKGkpe2NzLnNldChpLGkuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfWZ1bmN0aW9uIHcoaSl7dmFyIGw9U2wuZ2V0KGkpLGg9Y3MuZ2V0KGkpLHY9bC5sZWZ0LWgubGVmdCxBPWwudG9wLWgudG9wO2lmKHZ8fEEpe3ZhciBUPWkuZWwuc3R5bGU7cmV0dXJuIFQudHJhbnNmb3JtPVQud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIi5jb25jYXQodiwicHgsIikuY29uY2F0KEEsInB4KSIpLFQudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyIsaX19ZnVuY3Rpb24gTihpLGwsaCl7dmFyIHY9aS5jbG9uZU5vZGUoKTtpLl92dGMmJmkuX3Z0Yy5mb3JFYWNoKGs9PntrLnNwbGl0KC9ccysvKS5mb3JFYWNoKEQ9PkQmJnYuY2xhc3NMaXN0LnJlbW92ZShEKSl9KSxoLnNwbGl0KC9ccysvKS5mb3JFYWNoKGs9PmsmJnYuY2xhc3NMaXN0LmFkZChrKSksdi5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgQT1sLm5vZGVUeXBlPT09MT9sOmwucGFyZW50Tm9kZTtBLmFwcGVuZENoaWxkKHYpO3ZhcntoYXNUcmFuc2Zvcm06VH09QXModik7cmV0dXJuIEEucmVtb3ZlQ2hpbGQodiksVH12YXIgTz1pPT57dmFyIGw9aS5wcm9wc1sib25VcGRhdGU6bW9kZWxWYWx1ZSJdO3JldHVybiBnLmlzQXJyYXkobCk/aD0+Zy5pbnZva2VBcnJheUZucyhsLGgpOmx9LEw9e2NyZWF0ZWQoaSxsLGgpe3Zhcnt2YWx1ZTp2LG1vZGlmaWVyczp7dHJpbTpBLG51bWJlcjpUfX09bDtpLnZhbHVlPXY9PW51bGw/IiI6dixpLl9hc3NpZ249TyhoKSx2bChpLCJpbnB1dCIsaz0+e3ZhciBEPWsuZGV0YWlsLnZhbHVlLGo9aS5wYWdlTm9kZTtpLnBhZ2VOb2RlPW51bGwsaS52YWx1ZT1ELGkucGFnZU5vZGU9aixBP0Q9RC50cmltKCk6VCYmKEQ9Zy50b051bWJlcihEKSksaS5fYXNzaWduKEQpfSl9LGJlZm9yZVVwZGF0ZShpLGwsaCl7dmFye3ZhbHVlOnZ9PWw7aS5fYXNzaWduPU8oaCk7dmFyIEE9dj09bnVsbD8iIjp2O2kudmFsdWUhPT1BJiYoaS52YWx1ZT1BKX19LEo9TCxIPVsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLGVlPXtzdG9wOmk9Pmkuc3RvcFByb3BhZ2F0aW9uKCkscHJldmVudDppPT5pLnByZXZlbnREZWZhdWx0KCksc2VsZjppPT5pLnRhcmdldCE9PWkuY3VycmVudFRhcmdldCxjdHJsOmk9PiFpLmN0cmxLZXksc2hpZnQ6aT0+IWkuc2hpZnRLZXksYWx0Omk9PiFpLmFsdEtleSxtZXRhOmk9PiFpLm1ldGFLZXksbGVmdDppPT4iYnV0dG9uImluIGkmJmkuYnV0dG9uIT09MCxtaWRkbGU6aT0+ImJ1dHRvbiJpbiBpJiZpLmJ1dHRvbiE9PTEscmlnaHQ6aT0+ImJ1dHRvbiJpbiBpJiZpLmJ1dHRvbiE9PTIsZXhhY3Q6KGksbCk9Pkguc29tZShoPT5pWyIiLmNvbmNhdChoLCJLZXkiKV0mJiFsLmluY2x1ZGVzKGgpKX0sQ2U9KGksbCk9Pnt2YXIgaD1mdW5jdGlvbih2KXtmb3IodmFyIEE9MDtBPGwubGVuZ3RoO0ErKyl7dmFyIFQ9ZWVbbFtBXV07aWYoVCYmVCh2LGwpKXJldHVybn1mb3IodmFyIGs9YXJndW1lbnRzLmxlbmd0aCxEPW5ldyBBcnJheShrPjE/ay0xOjApLGo9MTtqPGs7aisrKURbai0xXT1hcmd1bWVudHNbal07cmV0dXJuIGkodiwuLi5EKX07cmV0dXJuIGgubW9kaWZpZXJzPWwsaH0sR2U9e2VzYzoiZXNjYXBlIixzcGFjZToiICIsdXA6ImFycm93LXVwIixsZWZ0OiJhcnJvdy1sZWZ0IixyaWdodDoiYXJyb3ctcmlnaHQiLGRvd246ImFycm93LWRvd24iLGRlbGV0ZToiYmFja3NwYWNlIn0saGU9KGksbCk9Pmg9PntpZigia2V5ImluIGgpe3ZhciB2PWcuaHlwaGVuYXRlKGgua2V5KTtpZihsLnNvbWUoQT0+QT09PXZ8fEdlW0FdPT09dikpcmV0dXJuIGkoaCl9fSxEZT17YmVmb3JlTW91bnQoaSxsKXt2YXJ7dmFsdWU6aH09bDtldChpLGgpfSx1cGRhdGVkKGksbCl7dmFye3ZhbHVlOmgsb2xkVmFsdWU6dn09bDshaCE9IXYmJmV0KGksaCl9LGJlZm9yZVVubW91bnQoaSxsKXt2YXJ7dmFsdWU6aH09bDtldChpLGgpfX07ZnVuY3Rpb24gZXQoaSxsKXtpLnNldEF0dHJpYnV0ZSgiLnZTaG93IiwhIWwpfXZhciBndD1nLmV4dGVuZCh7cGF0Y2hQcm9wOk5jLGZvcmNlUGF0Y2hQcm9wOkkuZm9yY2VQYXRjaFByb3B9LFlsKSxkdDtmdW5jdGlvbiBWdCgpe3JldHVybiBkdHx8KGR0PWZvKGd0KSl9dmFyIEh0PWZ1bmN0aW9uKCl7VnQoKS5yZW5kZXIoLi4uYXJndW1lbnRzKX0sYWU9ZnVuY3Rpb24oKXt2YXIgaT1WdCgpLmNyZWF0ZUFwcCguLi5hcmd1bWVudHMpLHttb3VudDpsfT1pO3JldHVybiBpLm1vdW50PWg9PihnLmlzU3RyaW5nKGgpJiYoaD1VcyhoKSksaCYmbChoLCExLCExKSksaX0sa2U9YWU7ZnVuY3Rpb24gd2UoKXt9ZnVuY3Rpb24gSGUoKXt9ZnVuY3Rpb24gd3QoaSl7cmV0dXJuIGcuaXNPYmplY3QoaSk/SS5KU09OX1BST1RPQ09MK0pTT04uc3RyaW5naWZ5KGkpOml9dmFyIHR0PWk9Pnd0KGkpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiY2FtZWxpemUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnLmNhbWVsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJjYXBpdGFsaXplIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZy5jYXBpdGFsaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJub3JtYWxpemVDbGFzcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGcubm9ybWFsaXplQ2xhc3N9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIm5vcm1hbGl6ZVByb3BzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZy5ub3JtYWxpemVQcm9wc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwibm9ybWFsaXplU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnLm5vcm1hbGl6ZVN0eWxlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJ0b0Rpc3BsYXlTdHJpbmciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnLnRvRGlzcGxheVN0cmluZ319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwidG9IYW5kbGVyS2V5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZy50b0hhbmRsZXJLZXl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIkVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5FZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiUmVhY3RpdmVFZmZlY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LlJlYWN0aXZlRWZmZWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJUcmFja09wVHlwZXMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LlRyYWNrT3BUeXBlc319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiVHJpZ2dlck9wVHlwZXMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LlRyaWdnZXJPcFR5cGVzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJjdXN0b21SZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmN1c3RvbVJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiZWZmZWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5lZmZlY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsImVmZmVjdFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5lZmZlY3RTY29wZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiZ2V0Q3VycmVudFNjb3BlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5nZXRDdXJyZW50U2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsImlzUHJveHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmlzUHJveHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsImlzUmVhY3RpdmUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmlzUmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsImlzUmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LmlzUmVhZG9ubHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsImlzUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5pc1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaXNTaGFsbG93Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5pc1NoYWxsb3d9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIm1hcmtSYXciLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5Lm1hcmtSYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIm9uU2NvcGVEaXNwb3NlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5vblNjb3BlRGlzcG9zZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwicHJveHlSZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5wcm94eVJlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInJlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5yZWFjdGl2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwicmVhZG9ubHkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnJlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJyZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnJlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwic2hhbGxvd1JlYWN0aXZlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5zaGFsbG93UmVhY3RpdmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInNoYWxsb3dSZWFkb25seSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkuc2hhbGxvd1JlYWRvbmx5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJzaGFsbG93UmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5zaGFsbG93UmVmfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJzdG9wIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS5zdG9wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJ0b1JhdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkudG9SYXd9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInRvUmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS50b1JlZn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwidG9SZWZzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS50b1JlZnN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInRvVmFsdWUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnRvVmFsdWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInRyaWdnZXJSZWYiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB5LnRyaWdnZXJSZWZ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInVucmVmIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geS51bnJlZn19KSxiLkJhc2VUcmFuc2l0aW9uPUxyLGIuQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnM9RXIsYi5Db21tZW50PWdyLGIuRGVwcmVjYXRpb25UeXBlcz1GcyxiLkVycm9yQ29kZXM9cSxiLkVycm9yVHlwZVN0cmluZ3M9Q2MsYi5GcmFnbWVudD1ucixiLktlZXBBbGl2ZT1RdCxiLlN0YXRpYz1nbyxiLlN1c3BlbnNlPVdpLGIuVGVsZXBvcnQ9VXIsYi5UZXh0PUduLGIuVHJhbnNpdGlvbj1ibCxiLlRyYW5zaXRpb25Hcm91cD1hLGIuYXNzZXJ0TnVtYmVyPWZ0LGIuY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmc9bG4sYi5jYWxsV2l0aEVycm9ySGFuZGxpbmc9c24sYi5jbG9uZVZOb2RlPUJuLGIuY29tcGF0VXRpbHM9THMsYi5jb21wdXRlZD1wbCxiLmNyZWF0ZUFwcD1hZSxiLmNyZWF0ZUJsb2NrPUxpLGIuY3JlYXRlQ29tbWVudD1VcyxiLmNyZWF0ZUNvbW1lbnRWTm9kZT1CcyxiLmNyZWF0ZUVsZW1lbnQ9RHMsYi5jcmVhdGVFbGVtZW50QmxvY2s9b2wsYi5jcmVhdGVFbGVtZW50Vk5vZGU9b24sYi5jcmVhdGVIeWRyYXRpb25SZW5kZXJlcj1PbyxiLmNyZWF0ZVByb3BzUmVzdFByb3h5PWlsLGIuY3JlYXRlUmVuZGVyZXI9Zm8sYi5jcmVhdGVTU1JBcHA9a2UsYi5jcmVhdGVTbG90cz1GcixiLmNyZWF0ZVN0YXRpY1ZOb2RlPWpvLGIuY3JlYXRlVGV4dE5vZGU9VnMsYi5jcmVhdGVUZXh0Vk5vZGU9RGksYi5jcmVhdGVWTm9kZT10bixiLmNyZWF0ZVZ1ZUFwcD1hZSxiLmRlZmluZUFzeW5jQ29tcG9uZW50PWxlLGIuZGVmaW5lQ29tcG9uZW50PU0sYi5kZWZpbmVFbWl0cz1RcyxiLmRlZmluZUV4cG9zZT1lbCxiLmRlZmluZU1vZGVsPVJzLGIuZGVmaW5lT3B0aW9ucz10bCxiLmRlZmluZVByb3BzPXJpLGIuZGVmaW5lU2xvdHM9bmwsYi5kZXZ0b29scz1qbCxiLmRldnRvb2xzSW5pdEFwcD1PbixiLmdldEN1cnJlbnRJbnN0YW5jZT1JbyxiLmdldFRyYW5zaXRpb25SYXdDaGlsZHJlbj1jbyxiLmd1YXJkUmVhY3RpdmVQcm9wcz1rbyxiLmg9Z2ksYi5oYW5kbGVFcnJvcj1ibixiLmhhc0luamVjdGlvbkNvbnRleHQ9SyxiLmluaXRDdXN0b21Gb3JtYXR0ZXI9V28sYi5pbmplY3Q9JCxiLmluamVjdEhvb2s9RHQsYi5pc01lbW9TYW1lPVVsLGIuaXNSdW50aW1lT25seT1rYSxiLmlzVk5vZGU9Tm8sYi5tZXJnZURlZmF1bHRzPUtpLGIubWVyZ2VNb2RlbHM9eHMsYi5tZXJnZVByb3BzPXNsLGIubmV4dFRpY2s9WGUsYi5vbkFjdGl2YXRlZD1PcixiLm9uQmVmb3JlQWN0aXZhdGU9d2UsYi5vbkJlZm9yZURlYWN0aXZhdGU9SGUsYi5vbkJlZm9yZU1vdW50PXdvLGIub25CZWZvcmVVbm1vdW50PWllLGIub25CZWZvcmVVcGRhdGU9c2UsYi5vbkRlYWN0aXZhdGVkPUlpLGIub25FcnJvckNhcHR1cmVkPXdyLGIub25Nb3VudGVkPUFvLGIub25SZW5kZXJUcmFja2VkPU5yLGIub25SZW5kZXJUcmlnZ2VyZWQ9Zm4sYi5vblNlcnZlclByZWZldGNoPWx0LGIub25Vbm1vdW50ZWQ9TGUsYi5vblVwZGF0ZWQ9WSxiLm9wZW5CbG9jaz1UYSxiLnBvcFNjb3BlSWQ9Q2ksYi5wcm92aWRlPXosYi5wdXNoU2NvcGVJZD1tYSxiLnF1ZXVlUG9zdEZsdXNoQ2I9QW4sYi5yZWdpc3RlclJ1bnRpbWVDb21waWxlcj16byxiLnJlbmRlcj1IdCxiLnJlbmRlckxpc3Q9SmksYi5yZW5kZXJTbG90PXVvLGIucmVzb2x2ZUNvbXBvbmVudD1pbyxiLnJlc29sdmVEaXJlY3RpdmU9amksYi5yZXNvbHZlRHluYW1pY0NvbXBvbmVudD1laSxiLnJlc29sdmVGaWx0ZXI9amEsYi5yZXNvbHZlVHJhbnNpdGlvbkhvb2tzPWJpLGIuc2V0QmxvY2tUcmFja2luZz1LcixiLnNldERldnRvb2xzSG9vaz16bCxiLnNldFRyYW5zaXRpb25Ib29rcz1raSxiLnNzckNvbnRleHRLZXk9TG8sYi5zc3JVdGlscz1XbCxiLnRvSGFuZGxlcnM9VG8sYi50cmFuc2Zvcm1WTm9kZUFyZ3M9eXMsYi51c2VBdHRycz1lcixiLnVzZUNzc01vZHVsZT1RbCxiLnVzZUNzc1ZhcnM9X2wsYi51c2VNb2RlbD1scyxiLnVzZVNTUkNvbnRleHQ9WWksYi51c2VTbG90cz1ybCxiLnVzZVRyYW5zaXRpb25TdGF0ZT10YSxiLnZNb2RlbER5bmFtaWM9SixiLnZNb2RlbFRleHQ9TCxiLnZTaG93PURlLGIudmVyc2lvbj0kbCxiLndhcm49SGwsYi53YXRjaD1NcixiLndhdGNoRWZmZWN0PVBpLGIud2F0Y2hQb3N0RWZmZWN0PXVpLGIud2F0Y2hTeW5jRWZmZWN0PWZpLGIud2l0aEFzeW5jQ29udGV4dD1vYSxiLndpdGhDdHg9X3IsYi53aXRoRGVmYXVsdHM9cmEsYi53aXRoRGlyZWN0aXZlcz1xaSxiLndpdGhLZXlzPWhlLGIud2l0aE1lbW89VmwsYi53aXRoTW9kaWZpZXJzPUNlLGIud2l0aFNjb3BlSWQ9UW4sYi53cD10dCxifSh7fSxkLF8sbyk7cmV0dXJuIEMuX19UWVBFX189InZ1ZSIsQ31mdW5jdGlvbiBLdihmLG8sZCl7bGV0IF89ZC5WdWUsQz1kLnNldFRpbWVvdXQsYj1kLmNsZWFyVGltZW91dCxnPWQuc2V0SW50ZXJ2YWwseT1kLmNsZWFySW50ZXJ2YWwsST1kLl9fdW5pQ29uZmlnLEJlPWQuX191bmlSb3V0ZXMsU3Q9ZC5WdWVTaGFyZWQsR3Q9ZC5VbmlTaGFyZWQ7dmFyIFl0PWZ1bmN0aW9uKHEsbmUsc24peyJ1c2Ugc3RyaWN0Ijt2YXIgbG49IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGJuPWZ1bmN0aW9uKCl7bGV0IGU9bmV3IFVpbnQ4QXJyYXkoMjU2KTtmb3IodmFyIHQ9MDt0PGxuLmxlbmd0aDt0KyspZVtsbi5jaGFyQ29kZUF0KHQpXT10O3JldHVybiBlfSgpO2Z1bmN0aW9uIFpuKGUpe3ZhciB0PW5ldyBVaW50OEFycmF5KGUpLG4scj10Lmxlbmd0aCxzPSIiO2ZvcihuPTA7bjxyO24rPTMpcys9bG5bdFtuXT4+Ml0scys9bG5bKHRbbl0mMyk8PDR8dFtuKzFdPj40XSxzKz1sblsodFtuKzFdJjE1KTw8Mnx0W24rMl0+PjZdLHMrPWxuW3RbbisyXSY2M107cmV0dXJuIHIlMz09PTI/cz1zLnN1YnN0cmluZygwLHMubGVuZ3RoLTEpKyI9IjpyJTM9PT0xJiYocz1zLnN1YnN0cmluZygwLHMubGVuZ3RoLTIpKyI9PSIpLHN9ZnVuY3Rpb24gd2koZSl7dmFyIHQ9ZS5sZW5ndGgqLjc1LG49ZS5sZW5ndGgscixzPTAsdSxwLFMsVTtlW2UubGVuZ3RoLTFdPT09Ij0iJiYodC0tLGVbZS5sZW5ndGgtMl09PT0iPSImJnQtLSk7dmFyIFA9bmV3IEFycmF5QnVmZmVyKHQpLEY9bmV3IFVpbnQ4QXJyYXkoUCk7Zm9yKHI9MDtyPG47cis9NCl1PWJuW2UuY2hhckNvZGVBdChyKV0scD1ibltlLmNoYXJDb2RlQXQocisxKV0sUz1ibltlLmNoYXJDb2RlQXQocisyKV0sVT1ibltlLmNoYXJDb2RlQXQociszKV0sRltzKytdPXU8PDJ8cD4+NCxGW3MrK109KHAmMTUpPDw0fFM+PjIsRltzKytdPShTJjMpPDw2fFUmNjM7cmV0dXJuIFB9bGV0IHpyPVsib3JpZ2luYWwiLCJjb21wcmVzc2VkIl0sRW49WyJhbGJ1bSIsImNhbWVyYSJdLHF0PVsiR0VUIiwiT1BUSU9OUyIsIkhFQUQiLCJQT1NUIiwiUFVUIiwiREVMRVRFIiwiVFJBQ0UiLCJDT05ORUNUIiwiUEFUQ0giXTtmdW5jdGlvbiBtbihlLHQpe3JldHVybiFlfHx0LmluZGV4T2YoZSk9PT0tMT90WzBdOmV9ZnVuY3Rpb24gTW4oZSx0KXtyZXR1cm4hcS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PTB8fGUuZmluZChuPT50LmluZGV4T2Yobik9PT0tMSk/dDplfWZ1bmN0aW9uIFJuKGUsdCl7Y29uc29sZS53YXJuKGAke2V9OiAke3R9YCl9ZnVuY3Rpb24gcHIoZSx0LG4scil7cnx8KHI9Um4pO2ZvcihsZXQgcyBpbiBuKXtsZXQgdT1YbihzLHRbc10sbltzXSwhcS5oYXNPd24odCxzKSk7cS5pc1N0cmluZyh1KSYmcihlLHUpfX1mdW5jdGlvbiBBaShlLHQsbixyKXtpZighbilyZXR1cm47aWYoIXEuaXNBcnJheShuKSlyZXR1cm4gcHIoZSx0WzBdfHxPYmplY3QuY3JlYXRlKG51bGwpLG4scik7bGV0IHM9bi5sZW5ndGgsdT10Lmxlbmd0aDtmb3IobGV0IHA9MDtwPHM7cCsrKXtsZXQgUz1uW3BdLFU9T2JqZWN0LmNyZWF0ZShudWxsKTt1PnAmJihVW1MubmFtZV09dFtwXSkscHIoZSxVLHtbUy5uYW1lXTpTfSxyKX19ZnVuY3Rpb24gWG4oZSx0LG4scil7cS5pc1BsYWluT2JqZWN0KG4pfHwobj17dHlwZTpufSk7bGV0e3R5cGU6cyxyZXF1aXJlZDp1LHZhbGlkYXRvcjpwfT1uO2lmKHUmJnIpcmV0dXJuJ01pc3NpbmcgcmVxdWlyZWQgYXJnczogIicrZSsnIic7aWYoISh0PT1udWxsJiYhdSkpe2lmKHMhPW51bGwpe2xldCBTPSExLFU9cS5pc0FycmF5KHMpP3M6W3NdLFA9W107Zm9yKGxldCBGPTA7RjxVLmxlbmd0aCYmIVM7RisrKXtsZXR7dmFsaWQ6YmUsZXhwZWN0ZWRUeXBlOkVlfT1YZSh0LFVbRl0pO1AucHVzaChFZXx8IiIpLFM9YmV9aWYoIVMpcmV0dXJuIGh0KGUsdCxQKX1pZihwKXJldHVybiBwKHQpfX1sZXQgS2U9cS5tYWtlTWFwKCJTdHJpbmcsTnVtYmVyLEJvb2xlYW4sRnVuY3Rpb24sU3ltYm9sIik7ZnVuY3Rpb24gWGUoZSx0KXtsZXQgbixyPWhuKHQpO2lmKEtlKHIpKXtsZXQgcz10eXBlb2YgZTtuPXM9PT1yLnRvTG93ZXJDYXNlKCksIW4mJnM9PT0ib2JqZWN0IiYmKG49ZSBpbnN0YW5jZW9mIHQpfWVsc2Ugcj09PSJPYmplY3QiP249cS5pc09iamVjdChlKTpyPT09IkFycmF5Ij9uPXEuaXNBcnJheShlKTpuPWUgaW5zdGFuY2VvZiB0fHxxLnRvUmF3VHlwZShlKT09PWhuKHQpO3JldHVybnt2YWxpZDpuLGV4cGVjdGVkVHlwZTpyfX1mdW5jdGlvbiBodChlLHQsbil7bGV0IHI9YEludmFsaWQgYXJnczogdHlwZSBjaGVjayBmYWlsZWQgZm9yIGFyZ3MgIiR7ZX0iLiBFeHBlY3RlZCAke24ubWFwKHEuY2FwaXRhbGl6ZSkuam9pbigiLCAiKX1gLHM9blswXSx1PXEudG9SYXdUeXBlKHQpLHA9TG4odCxzKSxTPUxuKHQsdSk7cmV0dXJuIG4ubGVuZ3RoPT09MSYmZ24ocykmJiFBbihzLHUpJiYocis9YCB3aXRoIHZhbHVlICR7cH1gKSxyKz1gLCBnb3QgJHt1fSBgLGduKHUpJiYocis9YHdpdGggdmFsdWUgJHtTfS5gKSxyfWZ1bmN0aW9uIGhuKGUpe2xldCB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBMbihlLHQpe3JldHVybiB0PT09IlN0cmluZyI/YCIke2V9ImA6dD09PSJOdW1iZXIiP2Ake051bWJlcihlKX1gOmAke2V9YH1mdW5jdGlvbiBnbihlKXtyZXR1cm5bInN0cmluZyIsIm51bWJlciIsImJvb2xlYW4iXS5zb21lKG49PmUudG9Mb3dlckNhc2UoKT09PW4pfWZ1bmN0aW9uIEFuKC4uLmUpe3JldHVybiBlLnNvbWUodD0+dC50b0xvd2VyQ2FzZSgpPT09ImJvb2xlYW4iKX1mdW5jdGlvbiAkbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkoZSxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9fX1sZXQgdnI9MSxhcj17fTtmdW5jdGlvbiB2aShlLHQsbixyPSExKXtyZXR1cm4gYXJbZV09e25hbWU6dCxrZWVwQWxpdmU6cixjYWxsYmFjazpufSxlfWZ1bmN0aW9uIFdyKGUsdCxuKXtpZih0eXBlb2YgZT09Im51bWJlciIpe2xldCByPWFyW2VdO2lmKHIpcmV0dXJuIHIua2VlcEFsaXZlfHxkZWxldGUgYXJbZV0sci5jYWxsYmFjayh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIHhyKGUpe2ZvcihsZXQgdCBpbiBhcilpZihhclt0XS5uYW1lPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBybyhlLHQpe2ZvcihsZXQgbiBpbiBhcil7bGV0IHI9YXJbbl07ci5jYWxsYmFjaz09PXQmJnIubmFtZT09PWUmJmRlbGV0ZSBhcltuXX19ZnVuY3Rpb24gWm8oZSl7ZnQub2ZmKCJhcGkuIitlKX1mdW5jdGlvbiB2YShlKXtmdC5vbigiYXBpLiIrZSx0PT57Zm9yKGxldCBuIGluIGFyKXtsZXQgcj1hcltuXTtyLm5hbWU9PT1lJiZyLmNhbGxiYWNrKHQpfX0pfWZ1bmN0aW9uIEhpKGUsdCl7cmV0dXJuIHZpKHZyKyssZSx0LCEwKX1sZXQgT249InN1Y2Nlc3MiLG1yPSJmYWlsIixRcj0iY29tcGxldGUiO2Z1bmN0aW9uIG1pKGUpe2xldCB0PXt9O2ZvcihsZXQgbiBpbiBlKXtsZXQgcj1lW25dO3EuaXNGdW5jdGlvbihyKSYmKHRbbl09JG4ociksZGVsZXRlIGVbbl0pfXJldHVybiB0fWZ1bmN0aW9uIEhuKGUsdCl7cmV0dXJuIWV8fGUuaW5kZXhPZigiOmZhaWwiKT09PS0xP3QrIjpvayI6dCtlLnN1YnN0cmluZyhlLmluZGV4T2YoIjpmYWlsIikpfWZ1bmN0aW9uIHlvKGUsdD17fSx7YmVmb3JlQWxsOm4sYmVmb3JlU3VjY2VzczpyfT17fSl7cS5pc1BsYWluT2JqZWN0KHQpfHwodD17fSk7bGV0e3N1Y2Nlc3M6cyxmYWlsOnUsY29tcGxldGU6cH09bWkodCksUz1xLmlzRnVuY3Rpb24ocyksVT1xLmlzRnVuY3Rpb24odSksUD1xLmlzRnVuY3Rpb24ocCksRj12cisrO3JldHVybiB2aShGLGUsYmU9PntiZT1iZXx8e30sYmUuZXJyTXNnPUhuKGJlLmVyck1zZyxlKSxxLmlzRnVuY3Rpb24obikmJm4oYmUpLGJlLmVyck1zZz09PWUrIjpvayI/KHEuaXNGdW5jdGlvbihyKSYmcihiZSx0KSxTJiZzKGJlKSk6VSYmdShiZSksUCYmcChiZSl9KSxGfWxldCBHcj0ic3VjY2VzcyIsbWE9ImZhaWwiLENpPSJjb21wbGV0ZSIsUW49e30sX3I9e307ZnVuY3Rpb24gTGEoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUobix0KXx8bn19ZnVuY3Rpb24gZHIoZSx0LG4pe2xldCByPSExO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGg7cysrKXtsZXQgdT1lW3NdO2lmKHIpcj1Qcm9taXNlLnJlc29sdmUoTGEodSxuKSk7ZWxzZXtsZXQgcD11KHQsbik7aWYocS5pc1Byb21pc2UocCkmJihyPVByb21pc2UucmVzb2x2ZShwKSkscD09PSExKXJldHVybnt0aGVuKCl7fSxjYXRjaCgpe319fX1yZXR1cm4gcnx8e3RoZW4ocyl7cmV0dXJuIHModCl9LGNhdGNoKCl7fX19ZnVuY3Rpb24gWG8oZSx0PXt9KXtyZXR1cm5bR3IsbWEsQ2ldLmZvckVhY2gobj0+e2xldCByPWVbbl07aWYoIXEuaXNBcnJheShyKSlyZXR1cm47bGV0IHM9dFtuXTt0W25dPWZ1bmN0aW9uKHApe2RyKHIscCx0KS50aGVuKFM9PnEuaXNGdW5jdGlvbihzKSYmcyhTKXx8Uyl9fSksdH1mdW5jdGlvbiBCbyhlLHQpe2xldCBuPVtdO3EuaXNBcnJheShRbi5yZXR1cm5WYWx1ZSkmJm4ucHVzaCguLi5Rbi5yZXR1cm5WYWx1ZSk7bGV0IHI9X3JbZV07cmV0dXJuIHImJnEuaXNBcnJheShyLnJldHVyblZhbHVlKSYmbi5wdXNoKC4uLnIucmV0dXJuVmFsdWUpLG4uZm9yRWFjaChzPT57dD1zKHQpfHx0fSksdH1mdW5jdGlvbiBNbyhlKXtsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5rZXlzKFFuKS5mb3JFYWNoKHI9PntyIT09InJldHVyblZhbHVlIiYmKHRbcl09UW5bcl0uc2xpY2UoKSl9KTtsZXQgbj1fcltlXTtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChyPT57ciE9PSJyZXR1cm5WYWx1ZSImJih0W3JdPSh0W3JdfHxbXSkuY29uY2F0KG5bcl0pKX0pLHR9ZnVuY3Rpb24gY2koZSx0LG4scil7bGV0IHM9TW8oZSk7cmV0dXJuIHMmJk9iamVjdC5rZXlzKHMpLmxlbmd0aD9xLmlzQXJyYXkocy5pbnZva2UpP2RyKHMuaW52b2tlLG4pLnRoZW4ocD0+dChYbyhNbyhlKSxwKSwuLi5yKSk6dChYbyhzLG4pLC4uLnIpOnQobiwuLi5yKX1mdW5jdGlvbiBUaShlKXtyZXR1cm4hIShxLmlzUGxhaW5PYmplY3QoZSkmJltPbixtcixRcl0uZmluZCh0PT5xLmlzRnVuY3Rpb24oZVt0XSkpKX1mdW5jdGlvbiBFbyhlKXtyZXR1cm4gZX1mdW5jdGlvbiBDcihlLHQpe3JldHVybihuPXt9LC4uLnIpPT5UaShuKT9CbyhlLGNpKGUsdCxuLHIpKTpCbyhlLG5ldyBQcm9taXNlKChzLHUpPT57Y2koZSx0LHEuZXh0ZW5kKG4se3N1Y2Nlc3M6cyxmYWlsOnV9KSxyKX0pKX1mdW5jdGlvbiBCcihlLHQpe2xldCBuPWVbMF07aWYoIXR8fCF0LmZvcm1hdEFyZ3N8fCFxLmlzUGxhaW5PYmplY3QodC5mb3JtYXRBcmdzKSYmcS5pc1BsYWluT2JqZWN0KG4pKXJldHVybjtsZXQgcj10LmZvcm1hdEFyZ3Mscz1PYmplY3Qua2V5cyhyKTtmb3IobGV0IHU9MDt1PHMubGVuZ3RoO3UrKyl7bGV0IHA9c1t1XSxTPXJbcF07aWYocS5pc0Z1bmN0aW9uKFMpKXtsZXQgVT1TKGVbMF1bcF0sbik7aWYocS5pc1N0cmluZyhVKSlyZXR1cm4gVX1lbHNlIHEuaGFzT3duKG4scCl8fChuW3BdPVMpfX1mdW5jdGlvbiBpbyhlLHQsbil7bGV0IHI9e2Vyck1zZzp0KyI6b2sifTtyZXR1cm4gV3IoZSxxLmV4dGVuZChufHx7fSxyKSl9ZnVuY3Rpb24gb28oZSx0LG4scj17fSl7bGV0IHM9dCsiOmZhaWwiKyhuPyIgIituOiIiKTtkZWxldGUgci5lcnJDb2RlO2xldCB1PXEuZXh0ZW5kKHtlcnJNc2c6c30scik7cmV0dXJuIFdyKGUsdSl9ZnVuY3Rpb24gZWkoZSx0LG4scil7aWYociYmci5iZWZvcmVJbnZva2Upe2xldCB1PXIuYmVmb3JlSW52b2tlKHQpO2lmKHEuaXNTdHJpbmcodSkpcmV0dXJuIHV9bGV0IHM9QnIodCxyKTtpZihzKXJldHVybiBzfWZ1bmN0aW9uIGppKGUpe2lmKCFxLmlzRnVuY3Rpb24oZSkpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3M6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBhcmdzICJjYWxsYmFjayIuIEV4cGVjdGVkIEZ1bmN0aW9uJyl9ZnVuY3Rpb24gemkoZSx0LG4pe3JldHVybiByPT57amkocik7bGV0IHM9ZWkoZSxbcl0sdm9pZCAwLG4pO2lmKHMpdGhyb3cgbmV3IEVycm9yKHMpO2xldCB1PSF4cihlKTtIaShlLHIpLHUmJih2YShlKSx0KCkpfX1mdW5jdGlvbiBRbyhlLHQsbil7cmV0dXJuIHI9PntqaShyKTtsZXQgcz1laShlLFtyXSx2b2lkIDAsbik7aWYocyl0aHJvdyBuZXcgRXJyb3Iocyk7ZT1lLnJlcGxhY2UoIm9mZiIsIm9uIikscm8oZSxyKSx4cihlKXx8KFpvKGUpLHQoKSl9fWZ1bmN0aW9uIE9pKGUpe3JldHVybiFlfHxxLmlzU3RyaW5nKGUpP2U6ZS5zdGFjaz8oY29uc29sZS5lcnJvcihlLm1lc3NhZ2UrYApgK2Uuc3RhY2spLGUubWVzc2FnZSk6ZX1mdW5jdGlvbiBhbyhlLHQsbixyKXtyZXR1cm4gcz0+e2xldCB1PXlvKGUscyxyKSxwPWVpKGUsW3NdLG4scik7cmV0dXJuIHA/b28odSxlLHApOnQocyx7cmVzb2x2ZTpTPT5pbyh1LGUsUykscmVqZWN0OihTLFUpPT5vbyh1LGUsT2koUyksVSl9KX19ZnVuY3Rpb24gZWEoZSx0LG4scil7cmV0dXJuKC4uLnMpPT57bGV0IHU9ZWkoZSxzLG4scik7aWYodSl0aHJvdyBuZXcgRXJyb3IodSk7cmV0dXJuIHQuYXBwbHkobnVsbCxzKX19ZnVuY3Rpb24gV2koZSx0LG4scil7cmV0dXJuIGFvKGUsdCxuLHIpfWZ1bmN0aW9uIGpuKGUsdCxuKXtyZXR1cm4gemkoZSx0LG4pfWZ1bmN0aW9uIFlyKGUsdCxuKXtyZXR1cm4gUW8oZSx0LG4pfWZ1bmN0aW9uIFRyKGUsdCxuLHIpe3JldHVybiBDcihlLGFvKGUsdCx2b2lkIDAscikpfWZ1bmN0aW9uIEJ0KGUsdCxuLHIpe3JldHVybiBlYShlLHQsdm9pZCAwLHIpfWZ1bmN0aW9uIFRlKGUsdCxuLHIpe3JldHVybiBDcihlLFdpKGUsdCx2b2lkIDAscikpfWxldCBGYT0iYmFzZTY0VG9BcnJheUJ1ZmZlciIsY249W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sc289ImFycmF5QnVmZmVyVG9CYXNlNjQiLHFyPVt7bmFtZToiYXJyYXlCdWZmZXIiLHR5cGU6W0FycmF5QnVmZmVyLFVpbnQ4QXJyYXldLHJlcXVpcmVkOiEwfV0sR2k9QnQoRmEsZT0+d2koZSksY24pLExvPUJ0KHNvLGU9PlpuKGUpLHFyKTtmdW5jdGlvbiBZaSgpe2lmKHR5cGVvZiBfX1NZU1RFTV9JTkZPX18hPSJ1bmRlZmluZWQiKXJldHVybiB3aW5kb3cuX19TWVNURU1fSU5GT19fO2xldHtyZXNvbHV0aW9uV2lkdGg6ZX09by5zY3JlZW4uZ2V0Q3VycmVudFNpemUoKXx8e3Jlc29sdXRpb25XaWR0aDowfTtyZXR1cm57cGxhdGZvcm06KG8ub3MubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCkscGl4ZWxSYXRpbzpvLnNjcmVlbi5zY2FsZSx3aW5kb3dXaWR0aDpNYXRoLnJvdW5kKGUpfX1mdW5jdGlvbiBQaShlLHQsbil7ZS4kcGFnZS5tZXRhLmlzTlZ1ZT9maShlLHQsbik6dWkoZSx0LG4pfWZ1bmN0aW9uIHVpKGUsdCxuKXtmdC5pbnZva2VWaWV3TWV0aG9kKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIse3JlcXM6dC5tYXAocj0+KHIuY29tcG9uZW50JiYoci5jb21wb25lbnQ9ci5jb21wb25lbnQuJGVsLm5vZGVJZCkscikpfSxlLiRwYWdlLmlkLG4pfWZ1bmN0aW9uIGZpKGUsdCxuKXtsZXQgcj1icih0KSxzPW5ldyBBcnJheShyLmxlbmd0aCk7TXIocixlLiRlbCxzKSxsbyhlLiRyZXF1aXJlTmF0aXZlUGx1Z2luKCJkb20iKSxzLDAsW10sdT0+e24odSl9KX1mdW5jdGlvbiBicihlKXtsZXQgdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXS5zZWxlY3RvcjtyLmluZGV4T2YoIiMiKT09PTAmJnQucHVzaChyLnN1YnN0cmluZygxKSl9cmV0dXJuIHR9ZnVuY3Rpb24gTXIoZSx0LG4pe2xldCByPXQuY2hpbGRyZW47aWYoIXEuaXNBcnJheShyKSlyZXR1cm4hMTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoO3MrKyl7bGV0IHU9cltzXTtpZih1LmF0dHIpe2xldCBwPWUuaW5kZXhPZih1LmF0dHIuaWQpO2lmKHA+PTAmJihuW3BdPXtpZDplW3BdLHJlZjp1LnJlZixkYXRhc2V0Om5lLnBhcnNlTlZ1ZURhdGFzZXQodS5hdHRyKX0sZS5sZW5ndGg9PT0xKSlicmVha311LmNoaWxkcmVuJiZNcihlLHUsbil9fWZ1bmN0aW9uIGxvKGUsdCxuLHIscyl7bGV0IHU9dFtuXTtlLmdldENvbXBvbmVudFJlY3QodS5yZWYscD0+e3Auc2l6ZS5pZD11LmlkLHAuc2l6ZS5kYXRhc2V0PXUuZGF0YXNldCxyLnB1c2gocC5zaXplKSxuKz0xLG48dC5sZW5ndGg/bG8oZSx0LG4scixzKTpzKHIpfSl9ZnVuY3Rpb24gdGkoZSx0KXtmdC5pbnZva2VWaWV3TWV0aG9kKCJzZXRQYWdlTWV0YSIsdCxlLiRwYWdlLmlkKX1sZXQgcG49ZT0+ZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0Iix5cj1bInsiLCJ9Il07Y2xhc3MgcWl7Y29uc3RydWN0b3IoKXt0aGlzLl9jYWNoZXM9T2JqZWN0LmNyZWF0ZShudWxsKX1pbnRlcnBvbGF0ZSh0LG4scj15cil7aWYoIW4pcmV0dXJuW3RdO2xldCBzPXRoaXMuX2NhY2hlc1t0XTtyZXR1cm4gc3x8KHM9Rm8odCxyKSx0aGlzLl9jYWNoZXNbdF09cyksdGEocyxuKX19bGV0IFBuPS9eKD86XGQpKy8sX2k9L14oPzpcdykrLztmdW5jdGlvbiBGbyhlLFt0LG5dKXtsZXQgcj1bXSxzPTAsdT0iIjtmb3IoO3M8ZS5sZW5ndGg7KXtsZXQgcD1lW3MrK107aWYocD09PXQpe3UmJnIucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6dX0pLHU9IiI7bGV0IFM9IiI7Zm9yKHA9ZVtzKytdO3AhPT12b2lkIDAmJnAhPT1uOylTKz1wLHA9ZVtzKytdO2xldCBVPXA9PT1uLFA9UG4udGVzdChTKT8ibGlzdCI6VSYmX2kudGVzdChTKT8ibmFtZWQiOiJ1bmtub3duIjtyLnB1c2goe3ZhbHVlOlMsdHlwZTpQfSl9ZWxzZSB1Kz1wfXJldHVybiB1JiZyLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOnV9KSxyfWZ1bmN0aW9uIHRhKGUsdCl7bGV0IG49W10scj0wLHM9QXJyYXkuaXNBcnJheSh0KT8ibGlzdCI6cG4odCk/Im5hbWVkIjoidW5rbm93biI7aWYocz09PSJ1bmtub3duIilyZXR1cm4gbjtmb3IoO3I8ZS5sZW5ndGg7KXtsZXQgdT1lW3JdO3N3aXRjaCh1LnR5cGUpe2Nhc2UidGV4dCI6bi5wdXNoKHUudmFsdWUpO2JyZWFrO2Nhc2UibGlzdCI6bi5wdXNoKHRbcGFyc2VJbnQodS52YWx1ZSwxMCldKTticmVhaztjYXNlIm5hbWVkIjpzPT09Im5hbWVkIiYmbi5wdXNoKHRbdS52YWx1ZV0pO2JyZWFrO2Nhc2UidW5rbm93biI6YnJlYWt9cisrfXJldHVybiBufWxldCBObj0iemgtSGFucyIsRXI9InpoLUhhbnQiLHNyPSJlbiIsTHI9ImZyIixTcj0iZXMiLGJpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksU289KGUsdCk9PmJpLmNhbGwoZSx0KSxOaT1uZXcgcWk7ZnVuY3Rpb24ga2koZSx0KXtyZXR1cm4hIXQuZmluZChuPT5lLmluZGV4T2YobikhPT0tMSl9ZnVuY3Rpb24gY28oZSx0KXtyZXR1cm4gdC5maW5kKG49PmUuaW5kZXhPZihuKT09PTApfWZ1bmN0aW9uIE0oZSx0KXtpZighZSlyZXR1cm47aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLGU9PT0iY2hpbmVzZSIpcmV0dXJuIE5uO2lmKGUuaW5kZXhPZigiemgiKT09PTApcmV0dXJuIGUuaW5kZXhPZigiLWhhbnMiKT4tMT9ObjplLmluZGV4T2YoIi1oYW50Iik+LTF8fGtpKGUsWyItdHciLCItaGsiLCItbW8iLCItY2h0Il0pP0VyOk5uO2xldCBuPVtzcixMcixTcl07dCYmT2JqZWN0LmtleXModCkubGVuZ3RoPjAmJihuPU9iamVjdC5rZXlzKHQpKTtsZXQgcj1jbyhlLG4pO2lmKHIpcmV0dXJuIHJ9Y2xhc3MgV3tjb25zdHJ1Y3Rvcih7bG9jYWxlOnQsZmFsbGJhY2tMb2NhbGU6bixtZXNzYWdlczpyLHdhdGNoZXI6cyxmb3JtYXRlcjp1fSl7dGhpcy5sb2NhbGU9c3IsdGhpcy5mYWxsYmFja0xvY2FsZT1zcix0aGlzLm1lc3NhZ2U9e30sdGhpcy5tZXNzYWdlcz17fSx0aGlzLndhdGNoZXJzPVtdLG4mJih0aGlzLmZhbGxiYWNrTG9jYWxlPW4pLHRoaXMuZm9ybWF0ZXI9dXx8TmksdGhpcy5tZXNzYWdlcz1yfHx7fSx0aGlzLnNldExvY2FsZSh0fHxzcikscyYmdGhpcy53YXRjaExvY2FsZShzKX1zZXRMb2NhbGUodCl7bGV0IG49dGhpcy5sb2NhbGU7dGhpcy5sb2NhbGU9TSh0LHRoaXMubWVzc2FnZXMpfHx0aGlzLmZhbGxiYWNrTG9jYWxlLHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdfHwodGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV09e30pLHRoaXMubWVzc2FnZT10aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXSxuIT09dGhpcy5sb2NhbGUmJnRoaXMud2F0Y2hlcnMuZm9yRWFjaChyPT57cih0aGlzLmxvY2FsZSxuKX0pfWdldExvY2FsZSgpe3JldHVybiB0aGlzLmxvY2FsZX13YXRjaExvY2FsZSh0KXtsZXQgbj10aGlzLndhdGNoZXJzLnB1c2godCktMTtyZXR1cm4oKT0+e3RoaXMud2F0Y2hlcnMuc3BsaWNlKG4sMSl9fWFkZCh0LG4scj0hMCl7bGV0IHM9dGhpcy5tZXNzYWdlc1t0XTtzP3I/T2JqZWN0LmFzc2lnbihzLG4pOk9iamVjdC5rZXlzKG4pLmZvckVhY2godT0+e1NvKHMsdSl8fChzW3VdPW5bdV0pfSk6dGhpcy5tZXNzYWdlc1t0XT1ufWYodCxuLHIpe3JldHVybiB0aGlzLmZvcm1hdGVyLmludGVycG9sYXRlKHQsbixyKS5qb2luKCIiKX10KHQsbixyKXtsZXQgcz10aGlzLm1lc3NhZ2U7cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIj8obj1NKG4sdGhpcy5tZXNzYWdlcyksbiYmKHM9dGhpcy5tZXNzYWdlc1tuXSkpOnI9bixTbyhzLHQpP3RoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUoc1t0XSxyKS5qb2luKCIiKTooY29uc29sZS53YXJuKGBDYW5ub3QgdHJhbnNsYXRlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoICR7dH0uIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LmApLHQpfX1mdW5jdGlvbiBsZShlLHQpe2UuJHdhdGNoTG9jYWxlP2UuJHdhdGNoTG9jYWxlKG49Pnt0LnNldExvY2FsZShuKX0pOmUuJHdhdGNoKCgpPT5lLiRsb2NhbGUsbj0+e3Quc2V0TG9jYWxlKG4pfSl9ZnVuY3Rpb24gJGUoKXtyZXR1cm4gdHlwZW9mIFIhPSJ1bmRlZmluZWQiJiZSLmdldExvY2FsZT9SLmdldExvY2FsZSgpOnR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiJiZnbG9iYWwuZ2V0TG9jYWxlP2dsb2JhbC5nZXRMb2NhbGUoKTpzcn1mdW5jdGlvbiB6ZShlLHQ9e30sbixyKXtpZih0eXBlb2YgZSE9InN0cmluZyIpe2xldCBwPVt0LGVdO2U9cFswXSx0PXBbMV19dHlwZW9mIGUhPSJzdHJpbmciJiYoZT0kZSgpKSx0eXBlb2YgbiE9InN0cmluZyImJihuPXR5cGVvZiBJIT0idW5kZWZpbmVkIiYmSS5mYWxsYmFja0xvY2FsZXx8c3IpO2xldCBzPW5ldyBXKHtsb2NhbGU6ZSxmYWxsYmFja0xvY2FsZTpuLG1lc3NhZ2VzOnQsd2F0Y2hlcjpyfSksdT0ocCxTKT0+e2lmKHR5cGVvZiBPdCE9ImZ1bmN0aW9uIil1PWZ1bmN0aW9uKFUsUCl7cmV0dXJuIHMudChVLFApfTtlbHNle2xldCBVPSExO3U9ZnVuY3Rpb24oUCxGKXtsZXQgYmU9T3QoKS4kdm07cmV0dXJuIGJlJiYoYmUuJGxvY2FsZSxVfHwoVT0hMCxsZShiZSxzKSkpLHMudChQLEYpfX1yZXR1cm4gdShwLFMpfTtyZXR1cm57aTE4bjpzLGYocCxTLFUpe3JldHVybiBzLmYocCxTLFUpfSx0KHAsUyl7cmV0dXJuIHUocCxTKX0sYWRkKHAsUyxVPSEwKXtyZXR1cm4gcy5hZGQocCxTLFUpfSx3YXRjaChwKXtyZXR1cm4gcy53YXRjaExvY2FsZShwKX0sZ2V0TG9jYWxlKCl7cmV0dXJuIHMuZ2V0TG9jYWxlKCl9LHNldExvY2FsZShwKXtyZXR1cm4gcy5zZXRMb2NhbGUocCl9fX1mdW5jdGlvbiBhdChlLHQpe3JldHVybiBlLmluZGV4T2YodFswXSk+LTF9bGV0IFF0PW5lLm9uY2UoKCk9PnR5cGVvZiBJIT0idW5kZWZpbmVkIiYmSS5sb2NhbGVzJiYhIU9iamVjdC5rZXlzKEkubG9jYWxlcykubGVuZ3RoKSxKdDtmdW5jdGlvbiBPcigpe2xldCBlPVIuZ2V0TG9jYWxlKCksdD1JLmxvY2FsZXM7cmV0dXJuIHRbZV18fHRbSS5mYWxsYmFja0xvY2FsZV18fHQuZW58fHt9fWZ1bmN0aW9uIElpKGUpe3JldHVybiBhdChlLG5lLkkxOE5fSlNPTl9ERUxJTUlURVJTKT9FdCgpLmYoZSxPcigpLG5lLkkxOE5fSlNPTl9ERUxJTUlURVJTKTplfWZ1bmN0aW9uIGhyKGUsdCl7aWYodC5sZW5ndGg9PT0xKXtpZihlKXtsZXQgcj1TPT5xLmlzU3RyaW5nKFMpJiZhdChTLG5lLkkxOE5fSlNPTl9ERUxJTUlURVJTKSxzPXRbMF0sdT1bXTtpZihxLmlzQXJyYXkoZSkmJih1PWUuZmlsdGVyKFM9PnIoU1tzXSkpKS5sZW5ndGgpcmV0dXJuIHU7bGV0IHA9ZVt0WzBdXTtpZihyKHApKXJldHVybiBlfXJldHVybn1sZXQgbj10LnNoaWZ0KCk7cmV0dXJuIGhyKGUmJmVbbl0sdCl9ZnVuY3Rpb24gUHIoZSx0KXtyZXR1cm4gdC5tYXAobj0+UmkoZSxuKSl9ZnVuY3Rpb24gUmkoZSx0KXtsZXQgbj1ocihlLHQpO2lmKCFuKXJldHVybiExO2xldCByPXRbdC5sZW5ndGgtMV07aWYocS5pc0FycmF5KG4pKW4uZm9yRWFjaChzPT5SaShzLFtyXSkpO2Vsc2V7bGV0IHM9bltyXTtPYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHtnZXQoKXtyZXR1cm4gSWkocyl9LHNldCh1KXtzPXV9fSl9cmV0dXJuITB9ZnVuY3Rpb24gRXQoKXtpZighSnQpe2xldCBlO2lmKHR5cGVvZiBPdD09ImZ1bmN0aW9uIj9lPWYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldExhbmd1YWdlKCk6ZT1vLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5nZXRTdHlsZSgpLmxvY2FsZSxKdD16ZShlKSxRdCgpKXtsZXQgdD1PYmplY3Qua2V5cyhJLmxvY2FsZXN8fHt9KTt0Lmxlbmd0aCYmdC5mb3JFYWNoKG49Pkp0LmFkZChuLEkubG9jYWxlc1tuXSkpLEp0LnNldExvY2FsZShlKX19cmV0dXJuIEp0fWZ1bmN0aW9uIER0KGUsdCxuKXtyZXR1cm4gdC5yZWR1Y2UoKHIscyx1KT0+KHJbZStzXT1uW3VdLHIpLHt9KX1sZXQgbmk9bmUub25jZSgoKT0+e2xldCBlPSJ1bmkuYXBwLiIsdD1bInF1aXQiXTtFdCgpLmFkZChzcixEdChlLHQsWyJQcmVzcyBiYWNrIGJ1dHRvbiBhZ2FpbiB0byBleGl0Il0pLCExKSxFdCgpLmFkZChTcixEdChlLHQsWyJQdWxzZSBvdHJhIHZleiBwYXJhIHNhbGlyIl0pLCExKSxFdCgpLmFkZChMcixEdChlLHQsWyJBcHB1eWV6IFx4RTAgbm91dmVhdSBwb3VyIHF1aXR0ZXIgbCdhcHBsaWNhdGlvbiJdKSwhMSksRXQoKS5hZGQoTm4sRHQoZSx0LFsiXHU1MThEXHU2MzA5XHU0RTAwXHU2QjIxXHU5MDAwXHU1MUZBXHU1RTk0XHU3NTI4Il0pLCExKSxFdCgpLmFkZChFcixEdChlLHQsWyJcdTUxOERcdTYzMDlcdTRFMDBcdTZCMjFcdTkwMDBcdTUxRkFcdTYxQzlcdTc1MjgiXSksITEpfSksd289bmUub25jZSgoKT0+e2xldCBlPSJ1bmkuc2hvd0FjdGlvblNoZWV0LiIsdD1bImNhbmNlbCJdO0V0KCkuYWRkKHNyLER0KGUsdCxbIkNhbmNlbCJdKSwhMSksRXQoKS5hZGQoU3IsRHQoZSx0LFsiQ2FuY2VsYXIiXSksITEpLEV0KCkuYWRkKExyLER0KGUsdCxbIkFubnVsZXIiXSksITEpLEV0KCkuYWRkKE5uLER0KGUsdCxbIlx1NTNENlx1NkQ4OCJdKSwhMSksRXQoKS5hZGQoRXIsRHQoZSx0LFsiXHU1M0Q2XHU2RDg4Il0pLCExKX0pLEFvPW5lLm9uY2UoKCk9PntsZXQgZT0idW5pLnNob3dNb2RhbC4iLHQ9WyJjYW5jZWwiLCJjb25maXJtIl07RXQoKS5hZGQoc3IsRHQoZSx0LFsiQ2FuY2VsIiwiT0siXSksITEpLEV0KCkuYWRkKFNyLER0KGUsdCxbIkNhbmNlbGFyIiwiT0siXSksITEpLEV0KCkuYWRkKExyLER0KGUsdCxbIkFubnVsZXIiLCJPSyJdKSwhMSksRXQoKS5hZGQoTm4sRHQoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU3ODZFXHU1QjlBIl0pLCExKSxFdCgpLmFkZChFcixEdChlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTc4QkFcdTVCOUEiXSksITEpfSksc2U9bmUub25jZSgoKT0+e2xldCBlPSJ1bmkuY2hvb3NlSW1hZ2UuIix0PVsiY2FuY2VsIiwic291cmNlVHlwZS5hbGJ1bSIsInNvdXJjZVR5cGUuY2FtZXJhIl07RXQoKS5hZGQoc3IsRHQoZSx0LFsiQ2FuY2VsIiwiQWxidW0iLCJDYW1lcmEiXSksITEpLEV0KCkuYWRkKFNyLER0KGUsdCxbIkNhbmNlbGFyIiwiXHhDMWxidW0iLCJDXHhFMW1hcmEiXSksITEpLEV0KCkuYWRkKExyLER0KGUsdCxbIkFubnVsZXIiLCJBbGJ1bSIsIkNhbVx4RTlyYSJdKSwhMSksRXQoKS5hZGQoTm4sRHQoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RUNFXHU3NkY4XHU1MThDXHU5MDA5XHU2MkU5IiwiXHU2MkNEXHU2NDQ0Il0pLCExKSxFdCgpLmFkZChFcixEdChlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTVGOUVcdTc2RjhcdTUxOEFcdTkwNzhcdTY0QzciLCJcdTYyQ0RcdTY1MUQiXSksITEpfSksWT1uZS5vbmNlKCgpPT57bGV0IGU9InVuaS5jaG9vc2VWaWRlby4iLHQ9WyJjYW5jZWwiLCJzb3VyY2VUeXBlLmFsYnVtIiwic291cmNlVHlwZS5jYW1lcmEiXTtFdCgpLmFkZChzcixEdChlLHQsWyJDYW5jZWwiLCJBbGJ1bSIsIkNhbWVyYSJdKSwhMSksRXQoKS5hZGQoU3IsRHQoZSx0LFsiQ2FuY2VsYXIiLCJceEMxbGJ1bSIsIkNceEUxbWFyYSJdKSwhMSksRXQoKS5hZGQoTHIsRHQoZSx0LFsiQW5udWxlciIsIkFsYnVtIiwiQ2FtXHhFOXJhIl0pLCExKSxFdCgpLmFkZChObixEdChlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRFQ0VcdTc2RjhcdTUxOENcdTkwMDlcdTYyRTkiLCJcdTYyQ0RcdTY0NDQiXSksITEpLEV0KCkuYWRkKEVyLER0KGUsdCxbIlx1NTNENlx1NkQ4OCIsIlx1NUY5RVx1NzZGOFx1NTE4QVx1OTA3OFx1NjRDNyIsIlx1NjJDRFx1NjUxRCJdKSwhMSl9KSxpZT1uZS5vbmNlKCgpPT57bGV0IGU9InVuaS5wcmV2aWV3SW1hZ2UuIix0PVsiY2FuY2VsIiwiYnV0dG9uLnNhdmUiLCJzYXZlLnN1Y2Nlc3MiLCJzYXZlLmZhaWwiXTtFdCgpLmFkZChzcixEdChlLHQsWyJDYW5jZWwiLCJTYXZlIEltYWdlIiwiU2F2ZWQgc3VjY2Vzc2Z1bGx5IiwiU2F2ZSBmYWlsZWQiXSksITEpLEV0KCkuYWRkKFNyLER0KGUsdCxbIkNhbmNlbGFyIiwiR3VhcmRhciBpbWFnZW4iLCJHdWFyZGFkbyBleGl0b3NhbWVudGUiLCJFcnJvciBhbCBndWFyZGFyIl0pLCExKSxFdCgpLmFkZChMcixEdChlLHQsWyJBbm51bGVyIiwiR3VhcmRhciBpbWFnZW4iLCJFbnJlZ2lzdHJceEU5IGF2ZWMgc3VjY1x4RThzIiwiXHhDOWNoZWMgZGUgbGEgc2F1dmVnYXJkZSJdKSwhMSksRXQoKS5hZGQoTm4sRHQoZSx0LFsiXHU1M0Q2XHU2RDg4IiwiXHU0RkREXHU1QjU4XHU1NkZFXHU1MENGIiwiXHU0RkREXHU1QjU4XHU1NkZFXHU1MENGXHU1MjMwXHU3NkY4XHU1MThDXHU2MjEwXHU1MjlGIiwiXHU0RkREXHU1QjU4XHU1NkZFXHU1MENGXHU1MjMwXHU3NkY4XHU1MThDXHU1OTMxXHU4RDI1Il0pLCExKSxFdCgpLmFkZChFcixEdChlLHQsWyJcdTUzRDZcdTZEODgiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0YiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOEFcdTYyMTBcdTUyOUYiLCJcdTRGRERcdTVCNThcdTU3MTZcdTUwQ0ZcdTUyMzBcdTc2RjhcdTUxOEFcdTU5MzFcdTY1NTciXSksITEpfSksTGU9bmUub25jZSgoKT0+e2xldCBlPSJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS4iLHQ9WyJzdWNjZXNzIiwiZmFpbCJdO0V0KCkuYWRkKHNyLER0KGUsdCxbIkNvbnRlbnQgY29waWVkIiwiQ29weSBmYWlsZWQsIHBsZWFzZSBjb3B5IG1hbnVhbGx5Il0pLCExKSxFdCgpLmFkZChTcixEdChlLHQsWyJDb250ZW5pZG8gY29waWFkbyIsIkVycm9yIGFsIGNvcGlhciwgY29waWUgbWFudWFsbWVudGUiXSksITEpLEV0KCkuYWRkKExyLER0KGUsdCxbIkNvbnRlbnUgY29waVx4RTkiLCJceEM5Y2hlYyBkZSBsYSBjb3BpZSwgY29waWV6IG1hbnVlbGxlbWVudCJdKSwhMSksRXQoKS5hZGQoTm4sRHQoZSx0LFsiXHU1MTg1XHU1QkI5XHU1REYyXHU1OTBEXHU1MjM2IiwiXHU1OTBEXHU1MjM2XHU1OTMxXHU4RDI1XHVGRjBDXHU4QkY3XHU2MjRCXHU1MkE4XHU1OTBEXHU1MjM2Il0pLCExKSxFdCgpLmFkZChFcixEdChlLHQsWyJcdTUxNjdcdTVCQjlcdTVERjJcdTVGQTlcdTUyMzYiLCJcdTVGQTlcdTUyMzZcdTU5MzFcdTY1NTdcdUZGMENcdThBQ0JcdTYyNEJcdTUyRDVcdTVGQTlcdTg4RkQiXSksITEpfSksbHQ9bmUub25jZSgoKT0+e2xldCBlPSJ1bmkuc2NhbkNvZGUuIix0PVsidGl0bGUiLCJhbGJ1bSIsImZhaWwiLCJmbGFzaC5vbiIsImZsYXNoLm9mZiJdO0V0KCkuYWRkKHNyLER0KGUsdCxbIlNjYW4gY29kZSIsIkFsYnVtIiwiUmVjb2duaXRpb24gZmFpbHVyZSIsIlRhcCB0byB0dXJuIGxpZ2h0IG9uIiwiVGFwIHRvIHR1cm4gbGlnaHQgb2ZmIl0pLCExKSxFdCgpLmFkZChTcixEdChlLHQsWyJDXHhGM2RpZ28gZGUgZXNjYW5lbyIsIlx4QzFsYnVtIiwiXHhDOWNoZWMgZGUgbGEgcmVjb25uYWlzc2FuY2UiLCJUb3F1ZSBwYXJhIGVuY2VuZGVyIGxhIGx1eiIsIlRvcXVlIHBhcmEgYXBhZ2FyIGxhIGx1eiJdKSwhMSksRXQoKS5hZGQoTHIsRHQoZSx0LFsiQ29kZSBkXHUyMDE5YW5hbHlzZSIsIkFsYnVtIiwiRmFsbG8gZGUgcmVjb25vY2ltaWVudG8iLCJBcHB1eWV6IHBvdXIgYWN0aXZlciBsJ1x4RTljbGFpcmFnZSIsIkFwcHV5ZXogcG91ciBkXHhFOXNhY3RpdmVyIGwnXHhFOWNsYWlyYWdlIl0pLCExKSxFdCgpLmFkZChObixEdChlLHQsWyJcdTYyNkJcdTc4MDEiLCJcdTc2RjhcdTUxOEMiLCJcdThCQzZcdTUyMkJcdTU5MzFcdThEMjUiLCJcdThGN0JcdTg5RTZcdTcxNjdcdTRFQUUiLCJcdThGN0JcdTg5RTZcdTUxNzNcdTk1RUQiXSksITEpLEV0KCkuYWRkKEVyLER0KGUsdCxbIlx1NjM4M1x1NzhCQyIsIlx1NzZGOFx1NTE4QSIsIlx1OEI1OFx1NTIyNVx1NTkzMVx1NjU1NyIsIlx1OEYxNVx1ODlGOFx1NzE2N1x1NEVBRSIsIlx1OEYxNVx1ODlGOFx1OTVEQ1x1OTU4OSJdKSwhMSl9KSxmbj1uZS5vbmNlKCgpPT57bGV0IGU9InVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uIix0PVsiYXV0aENvbnRlbnQiLCJ3YWl0aW5nQ29udGVudCJdO0V0KCkuYWRkKHNyLER0KGUsdCxbIkZpbmdlcnByaW50IHJlY29nbml0aW9uIiwiVW5yZWNvZ25pemFibGUiXSksITEpLEV0KCkuYWRkKFNyLER0KGUsdCxbIlJlY29ub2NpbWllbnRvIGRlIGh1ZWxsYXMgZGFjdGlsYXJlcyIsIklycmVjb25vY2libGUiXSksITEpLEV0KCkuYWRkKExyLER0KGUsdCxbIlJlY29ubmFpc3NhbmNlIGRlIGwnZW1wcmVpbnRlIGRpZ2l0YWxlIiwiTVx4RTljb25uYWlzc2FibGUiXSksITEpLEV0KCkuYWRkKE5uLER0KGUsdCxbIlx1NjMwN1x1N0VCOVx1OEJDNlx1NTIyQlx1NEUyRC4uLiIsIlx1NjVFMFx1NkNENVx1OEJDNlx1NTIyQiJdKSwhMSksRXQoKS5hZGQoRXIsRHQoZSx0LFsiXHU2MzA3XHU3RDBCXHU4QjU4XHU1MjI1XHU0RTJELi4uIiwiXHU3MTIxXHU2Q0Q1XHU4QjU4XHU1MjI1Il0pLCExKX0pO2Z1bmN0aW9uIE5yKGUpe2lmKFF0KCkpcmV0dXJuIFByKGUsW1sidGl0bGVUZXh0Il0sWyJzZWFyY2hJbnB1dCIsInBsYWNlaG9sZGVyIl0sWyJidXR0b25zIiwidGV4dCJdXSl9ZnVuY3Rpb24gd3IoZSl7aWYoUXQoKSl7bGV0IHQ9ImNhcHRpb24iO3JldHVybiBQcihlLFtbImNvbnRlbnRkb3duIix0XSxbImNvbnRlbnRvdmVyIix0XSxbImNvbnRlbnRyZWZyZXNoIix0XV0pfX1mdW5jdGlvbiBKaShlKXtsZXQgdD1uZXcgbmUuRW1pdHRlcjtyZXR1cm57b24obixyKXtyZXR1cm4gdC5vbihuLHIpfSxvbmNlKG4scil7cmV0dXJuIHQub25jZShuLHIpfSxvZmYobixyKXtyZXR1cm4gdC5vZmYobixyKX0sZW1pdChuLC4uLnIpe3JldHVybiB0LmVtaXQobiwuLi5yKX0sc3Vic2NyaWJlKG4scixzPSExKXt0W3M/Im9uY2UiOiJvbiJdKGAke2V9LiR7bn1gLHIpfSx1bnN1YnNjcmliZShuLHIpe3Qub2ZmKGAke2V9LiR7bn1gLHIpfSxzdWJzY3JpYmVIYW5kbGVyKG4scixzKXt0LmVtaXQoYCR7ZX0uJHtufWAscixzKX19fWxldCBGcj0iaW52b2tlVmlld0FwaSIsdW89Imludm9rZVNlcnZpY2VBcGkiO2Z1bmN0aW9uIENvKGUpe3JldHVybiBlPWUrIiIsZS5pbmRleE9mKCJycHgiKSE9PS0xfHxlLmluZGV4T2YoInVweCIpIT09LTF9ZnVuY3Rpb24gVG8oZSx0PSExKXtpZih0KXJldHVybiBuYShlKTtpZihxLmlzU3RyaW5nKGUpKXtsZXQgbj1wYXJzZUludChlKXx8MDtyZXR1cm4gQ28oZSk/Ui51cHgycHgobik6bn1yZXR1cm4gZX1mdW5jdGlvbiBuYShlKXtyZXR1cm4gQ28oZSk/ZS5yZXBsYWNlKC8oXGQrKFwuXGQrKT8pW3J1XXB4L2csKHQsbik9PlIudXB4MnB4KHBhcnNlRmxvYXQobikpKyJweCIpOmV9ZnVuY3Rpb24gbHIoZSl7bGV0IHQ9bmUucmVzb2x2ZUNvbXBvbmVudEluc3RhbmNlKGUpO2lmKHQuJHBhZ2UpcmV0dXJuIHQuJHBhZ2UuaWQ7aWYoIXQuJClyZXR1cm47bGV0IG49dC4kLnJvb3QucHJveHk7aWYobiYmbi4kcGFnZSlyZXR1cm4gbi4kcGFnZS5pZH1mdW5jdGlvbiBEcigpe2xldCBlPVVuKCksdD1lLmxlbmd0aDtpZih0KXJldHVybiBlW3QtMV19ZnVuY3Rpb24gWGEoKXtsZXQgZT1EcigpO2lmKGUpcmV0dXJuIGUuJHBhZ2UubWV0YX1mdW5jdGlvbiBRYSgpe2xldCBlPVhhKCk7cmV0dXJuIGU/ZS5pZDotMX1mdW5jdGlvbiByaSgpe2xldCBlPURyKCk7aWYoZSlyZXR1cm4gZS4kdm19bGV0IFFzPVsibmF2aWdhdGlvbkJhciIsInB1bGxUb1JlZnJlc2giXTtmdW5jdGlvbiBlbCgpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEkuZ2xvYmFsU3R5bGV8fHt9KSl9ZnVuY3Rpb24gdGwoZSx0KXtsZXQgbj1lbCgpLHI9cS5leHRlbmQoe2lkOnR9LG4sZSk7UXMuZm9yRWFjaCh1PT57clt1XT1xLmV4dGVuZCh7fSxuW3VdLGVbdV0pfSk7bGV0e25hdmlnYXRpb25CYXI6c309cjtyZXR1cm4gcy50aXRsZVRleHQmJnMudGl0bGVJbWFnZSYmKHMudGl0bGVUZXh0PSIiKSxyfWZ1bmN0aW9uIG5sKGUpe3JldHVybiBKU09OLnBhcnNlKFRvKEpTT04uc3RyaW5naWZ5KGUpLCEwKSl9ZnVuY3Rpb24gUnMoZSl7cmV0dXJuIGUub2Zmc2V0JiYoZS5vZmZzZXQ9VG8oZS5vZmZzZXQpKSxlLmhlaWdodCYmKGUuaGVpZ2h0PVRvKGUuaGVpZ2h0KSksZS5yYW5nZSYmKGUucmFuZ2U9VG8oZS5yYW5nZSkpLGV9ZnVuY3Rpb24gcmEoZSx0LG4scixzLHUpe2xldHtpZDpwLHJvdXRlOlN9PXIsVT1uZS5ub3JtYWxpemVTdHlsZXMoci5uYXZpZ2F0aW9uQmFyLEkudGhlbWVDb25maWcsdSkudGl0bGVDb2xvcjtyZXR1cm57aWQ6cCxwYXRoOm5lLmFkZExlYWRpbmdTbGFzaChTKSxyb3V0ZTpTLGZ1bGxQYXRoOnQsb3B0aW9uczpuLG1ldGE6cixvcGVuVHlwZTplLGV2ZW50Q2hhbm5lbDpzLHN0YXR1c0JhclN0eWxlOlU9PT0iI2ZmZmZmZiI/ImxpZ2h0IjoiZGFyayJ9fWZ1bmN0aW9uIHJsKGUsdCxuKXtsZXQgcj1lLiRbdF07IXEuaXNBcnJheShyKXx8bi5fX3dlaCYmcS5yZW1vdmUocixuLl9fd2VoKX1mdW5jdGlvbiBlcihlLHQsbil7aWYocS5pc1N0cmluZyhlKSluPXQsdD1lLGU9cmkoKTtlbHNlIGlmKHR5cGVvZiBlPT0ibnVtYmVyIil7bGV0IHM9VW4oKS5maW5kKHU9PnUuJHBhZ2UuaWQ9PT1lKTtzP2U9cy4kdm06ZT1yaSgpfWlmKCFlKXJldHVybjtpZihlLl9fY2FsbF9ob29rKXJldHVybiBlLl9fY2FsbF9ob29rKHQsbik7bGV0IHI9ZS4kW3RdO3JldHVybiByJiZuZS5pbnZva2VBcnJheUZucyhyLG4pfWZ1bmN0aW9uIGlhKGUpe2lmKGUuaW5kZXhPZigiLyIpPT09MClyZXR1cm4gZTtsZXQgdD0iIixuPVVuKCk7cmV0dXJuIG4ubGVuZ3RoJiYodD1uW24ubGVuZ3RoLTFdLiRwYWdlLnJvdXRlKSxEbyh0LGUpfWZ1bmN0aW9uIERvKGUsdCl7aWYodC5pbmRleE9mKCIvIik9PT0wKXJldHVybiB0O2lmKHQuaW5kZXhPZigiLi8iKT09PTApcmV0dXJuIERvKGUsdC5zbGljZSgyKSk7bGV0IG49dC5zcGxpdCgiLyIpLHI9bi5sZW5ndGgscz0wO2Zvcig7czxyJiZuW3NdPT09Ii4uIjtzKyspO24uc3BsaWNlKDAscyksdD1uLmpvaW4oIi8iKTtsZXQgdT1lLmxlbmd0aD4wP2Uuc3BsaXQoIi8iKTpbXTtyZXR1cm4gdS5zcGxpY2UodS5sZW5ndGgtcy0xLHMrMSksbmUuYWRkTGVhZGluZ1NsYXNoKHUuY29uY2F0KG4pLmpvaW4oIi8iKSl9ZnVuY3Rpb24gS2koZSx0PSExKXtyZXR1cm4gdD9CZS5maW5kKG49Pm4ucGF0aD09PWV8fG4uYWxpYXM9PT1lKTpCZS5maW5kKG49Pm4ucGF0aD09PWUpfWZ1bmN0aW9uIHhzKGUpe2xldCB0PUtpKGUpO2lmKHQpcmV0dXJuIHQubWV0YX1mdW5jdGlvbiBpbChlLHQsbil7bGV0IHI9S2kobmUuYWRkTGVhZGluZ1NsYXNoKHQpKTtpZihyKXtsZXR7bWV0YTp1fT1yO2RlbGV0ZSB1LnRhYkJhckluZGV4LHUuaXNRdWl0PXUuaXNUYWJCYXI9ITF9bGV0IHM9S2kobmUuYWRkTGVhZGluZ1NsYXNoKG4pKTtpZihzKXtsZXR7bWV0YTp1fT1zO3UudGFiQmFySW5kZXg9ZSx1LmlzUXVpdD11LmlzVGFiQmFyPSEwO2xldCBwPUkudGFiQmFyO3AmJnAubGlzdCYmcC5saXN0W2VdJiYocC5saXN0W2VdLnBhZ2VQYXRoPW5lLnJlbW92ZUxlYWRpbmdTbGFzaChuKSl9fWxldCBvYSxEYSxWbztmdW5jdGlvbiBfYSgpe3JldHVybiB0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmdHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJnR5cGVvZiBkb2N1bWVudD09Im9iamVjdCI/IndlYnZpZXciOiJ2OCJ9ZnVuY3Rpb24gbXMoKXtyZXR1cm4gb2Eud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkfWxldCBiYSx4aSxVbz17fTtmdW5jdGlvbiBWcihlKXtsZXQgdD1lLmRhdGEmJmUuZGF0YS5fX21lc3NhZ2U7aWYoIXR8fCF0Ll9fcGFnZSlyZXR1cm47bGV0IG49dC5fX3BhZ2Uscj1Vb1tuXTtyJiZyKHQpLHQua2VlcHx8ZGVsZXRlIFVvW25dfWZ1bmN0aW9uIGFhKGUsdCl7X2EoKT09PSJ2OCI/Vm8/KGJhJiZiYS5jbG9zZSgpLGJhPW5ldyBWbyhtcygpKSxiYS5vbm1lc3NhZ2U9VnIpOnhpfHwoeGk9RGEucmVxdWlyZU1vZHVsZSgiZ2xvYmFsRXZlbnQiKSx4aS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsVnIpKTp3aW5kb3cuX19wbHVzTWVzc2FnZT1WcixVb1tlXT10fWNsYXNzIF9ze2NvbnN0cnVjdG9yKHQpe3RoaXMud2Vidmlldz10fXNlbmRNZXNzYWdlKHQpe2xldCBuPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTp0fX0pKSxyPXRoaXMud2Vidmlldy5pZDtWbz9uZXcgVm8ocikucG9zdE1lc3NhZ2Uobik6b2Eud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcmJm9hLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KG4scil9Y2xvc2UoKXt0aGlzLndlYnZpZXcuY2xvc2UoKX19ZnVuY3Rpb24gVmEoe2NvbnRleHQ6ZT17fSx1cmw6dCxkYXRhOm49e30sc3R5bGU6cj17fSxvbk1lc3NhZ2U6cyxvbkNsb3NlOnV9KXtsZXQgcD1JLmRhcmttb2RlO29hPWUucGx1c3x8byxEYT1lLndlZXh8fCh0eXBlb2YgZj09Im9iamVjdCI/ZjpudWxsKSxWbz1lLkJyb2FkY2FzdENoYW5uZWx8fCh0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD09Im9iamVjdCI/QnJvYWRjYXN0Q2hhbm5lbDpudWxsKTtsZXQgUz17YXV0b0JhY2tCdXR0b246ITAsdGl0bGVTaXplOiIxN3B4In0sVT1gcGFnZSR7RGF0ZS5ub3coKX1gO3I9cS5leHRlbmQoe30sciksci50aXRsZU5WaWV3IT09ITEmJnIudGl0bGVOVmlldyE9PSJub25lIiYmKHIudGl0bGVOVmlldz1xLmV4dGVuZChTLHIudGl0bGVOVmlldykpO2xldCBQPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6YC8ke3R9LmpzYCxkZWZhdWx0Rm9udFNpemU6MTYsdmlld3BvcnQ6b2Euc2NyZWVuLnJlc29sdXRpb25XaWR0aH19O3I9cS5leHRlbmQoUCxyKTtsZXQgRj1vYS53ZWJ2aWV3LmNyZWF0ZSgiIixVLHIse2V4dHJhczp7ZnJvbTptcygpLHJ1bnRpbWU6X2EoKSxkYXRhOnEuZXh0ZW5kKHt9LG4se2Rhcmttb2RlOnB9KSx1c2VHbG9iYWxFdmVudDohVm99fSk7cmV0dXJuIEYuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLHUpLGFhKFUsYmU9PntxLmlzRnVuY3Rpb24ocykmJnMoYmUuZGF0YSksYmUua2VlcHx8Ri5jbG9zZSgiYXV0byIpfSksRi5zaG93KHIuYW5pbWF0aW9uVHlwZSxyLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgX3MoRil9bGV0IEpyPShlLHQpPT5mdC5lbWl0KCJhcGkuIitlLHQpLFppPTE7ZnVuY3Rpb24gYnMoZSl7cmV0dXJuKGV8fFFhKCkpKyIuIitGcn1sZXQgeWE9KGUsdCxuLHIpPT57bGV0e3N1YnNjcmliZTpzLHB1Ymxpc2hIYW5kbGVyOnV9PWZ0LHA9cj9aaSsrOjA7ciYmcyhGcisiLiIrcCxyLCEwKSx1KGJzKG4pLHtpZDpwLG5hbWU6ZSxhcmdzOnR9LG4pfSxlcz0oZSx0LG4scik9PntsZXR7c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6dSxwdWJsaXNoSGFuZGxlcjpwfT1mdCxTPVppKyssVT1GcisiLiIrUztyZXR1cm4gcyhVLG4pLHAoYnMocikse2lkOlMsbmFtZTplLGFyZ3M6dH0sciksKCk9Pnt1KFUpfX0sRWE9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBFKCl7ZnQuc3Vic2NyaWJlKHVvLHopfWZ1bmN0aW9uIHgoZSx0KXtFYVtlXXx8KEVhW2VdPXQpfWZ1bmN0aW9uIHooe2lkOmUsbmFtZTp0LGFyZ3M6bn0scil7bGV0IHM9cD0+e2UmJmZ0LnB1Ymxpc2hIYW5kbGVyKHVvKyIuIitlLHAscil9LHU9RWFbdF07dT91KG4scyk6cyh7fSl9bGV0ICQ9cS5leHRlbmQoSmkoInZpZXciKSx7aW52b2tlT25DYWxsYmFjazpKcixpbnZva2VWaWV3TWV0aG9kOnlhLGludm9rZVZpZXdNZXRob2RLZWVwQWxpdmU6ZXN9KTtmdW5jdGlvbiBLKCl7bGV0e29uOmV9PWZ0O2UobmUuT05fUkVTSVpFLFgpLGUobmUuT05fQVBQX0VOVEVSX0ZPUkVHUk9VTkQsY2UpLGUobmUuT05fQVBQX0VOVEVSX0JBQ0tHUk9VTkQsbWUpfWZ1bmN0aW9uIFgoZSl7ZXIoRHIoKSxuZS5PTl9SRVNJWkUsZSksZnQuaW52b2tlT25DYWxsYmFjaygib25XaW5kb3dSZXNpemUiLGUpfWZ1bmN0aW9uIGNlKGUpe2xldCB0PURyKCk7ZXIoT3QoKSxuZS5PTl9TSE9XLGUpLGVyKHQsbmUuT05fU0hPVyl9ZnVuY3Rpb24gbWUoKXtlcihPdCgpLG5lLk9OX0hJREUpLGVyKERyKCksbmUuT05fSElERSl9bGV0IE5lPVtuZS5PTl9QQUdFX1NDUk9MTCxuZS5PTl9SRUFDSF9CT1RUT01dO2Z1bmN0aW9uIEZlKCl7TmUuZm9yRWFjaChlPT5mdC5zdWJzY3JpYmUoZSxwZShlKSkpfWZ1bmN0aW9uIHBlKGUpe3JldHVybih0LG4pPT57ZXIocGFyc2VJbnQobiksZSx0KX19ZnVuY3Rpb24gTWUoKXtLKCksRmUoKX1mdW5jdGlvbiB1dChlKXtlLiR2bT1lLGUuJG1wVHlwZT0iYXBwIjtsZXQgdD1zbi5yZWYoRXQoKS5nZXRMb2NhbGUoKSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIiRsb2NhbGUiLHtnZXQoKXtyZXR1cm4gdC52YWx1ZX0sc2V0KG4pe3QudmFsdWU9bn19KX1mdW5jdGlvbiBfdChlLHQpe2Uucm91dGU9dC5yb3V0ZSxlLiR2bT1lLGUuJHBhZ2U9dCxlLiRtcFR5cGU9InBhZ2UiLGUuJGZvbnRGYW1pbHlTZXQ9bmV3IFNldCx0Lm1ldGEuaXNUYWJCYXImJihlLiQuX19pc1RhYkJhcj0hMCxlLiQuX19pc0FjdGl2ZT0hMCl9ZnVuY3Rpb24gZW4oKXtyZXR1cm57cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX19ZnVuY3Rpb24gYnQoZSx0KXtsZXQgbj1lLiRvcHRpb25zfHx7fTtuLmdsb2JhbERhdGE9cS5leHRlbmQobi5nbG9iYWxEYXRhfHx7fSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZ2xvYmFsRGF0YSIse2dldCgpe3JldHVybiBuLmdsb2JhbERhdGF9LHNldChyKXtuLmdsb2JhbERhdGE9cn19KX1mdW5jdGlvbiBxZShlKXtpZihlLmluZGV4T2YoIi8vIik9PT0wKXJldHVybiJodHRwczoiK2U7aWYobmUuU0NIRU1FX1JFLnRlc3QoZSl8fG5lLkRBVEFfUkUudGVzdChlKSlyZXR1cm4gZTtpZihkbihlKSlyZXR1cm4iZmlsZTovLyIrTXQoZSk7bGV0IHQ9ImZpbGU6Ly8iK010KCJfd3d3Iik7aWYoZS5pbmRleE9mKCIvIik9PT0wKXJldHVybiBlLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6dCtlO2lmKGUuaW5kZXhPZigiLi4vIik9PT0wfHxlLmluZGV4T2YoIi4vIik9PT0wKXtpZih0eXBlb2YgX19pZF9fPT0ic3RyaW5nIilyZXR1cm4gdCtEbyhuZS5hZGRMZWFkaW5nU2xhc2goX19pZF9fKSxlKTt7bGV0IG49RHIoKTtpZihuKXJldHVybiB0K0RvKG5lLmFkZExlYWRpbmdTbGFzaChuLnJvdXRlKSxlKX19cmV0dXJuIGV9bGV0IE10PW5lLmNhY2hlU3RyaW5nRnVuY3Rpb24oZT0+by5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpKTtmdW5jdGlvbiBkbihlKXtyZXR1cm4gZS5pbmRleE9mKCJfd3d3Iik9PT0wfHxlLmluZGV4T2YoIl9kb2MiKT09PTB8fGUuaW5kZXhPZigiX2RvY3VtZW50cyIpPT09MHx8ZS5pbmRleE9mKCJfZG93bmxvYWRzIik9PT0wfWxldCBrbj0ic3VjY2VzcyIsQXQ9ImZhaWwiLFNuPVtrbixBdCwiY29tcGxldGUiXTtmdW5jdGlvbiBhbihlLHQsbixyKXtpZighZSlyZXR1cm47aWYodHlwZW9mIG49PSJ1bmRlZmluZWQiKXJldHVybiBlW3RdKCk7bGV0WyxzXT1TYShuLHIpO3JldHVybiBPYmplY3Qua2V5cyhzKS5sZW5ndGg/ZVt0XShjcih0LHMpKTplW3RdKCl9ZnVuY3Rpb24ga3QoZSx0LG4scil7aWYoIWUpcmV0dXJuO2xldFtzLHVdPVNhKG4scik7cmV0dXJuIE9iamVjdC5rZXlzKHUpLmxlbmd0aD9lW3RdKHMsY3IodCx1KSk6ZVt0XShzKX1mdW5jdGlvbiBDbihlLHQpe2xldCBuPXFuKGUsdC4kZWwpO3JldHVybiBufHxjb25zb2xlLmVycm9yKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfWZ1bmN0aW9uIHFuKGUsdCl7aWYoIWV8fCF0KXJldHVybjtpZih0LmF0dHImJnQuYXR0ci5pZD09PWUpcmV0dXJuIHQ7bGV0IG49dC5jaGlsZHJlbjtpZighIW4pZm9yKGxldCByPTAscz1uLmxlbmd0aDtyPHM7cisrKXtsZXQgdT1xbihlLG5bcl0pO2lmKHUpcmV0dXJuIHV9fWZ1bmN0aW9uIFNhKGU9e30sdCl7bGV0IG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWZ1bmN0aW9uKHUpe2xldCBwPWVbdV07cS5pc0Z1bmN0aW9uKHApJiYoblt1XT1wLGRlbGV0ZSBlW3VdKX07cmV0dXJuIFNuLmZvckVhY2gociksdCYmdC5mb3JFYWNoKHIpLFtlLG5dfWZ1bmN0aW9uIGNyKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe2xldCBzPXIudHlwZTtkZWxldGUgci50eXBlO2xldCB1PXRbc107aWYocz09PWtuP3IuZXJyTXNnPWAke2V9Om9rYDpzPT09QXQmJihyLmVyck1zZz1lKyI6ZmFpbCAiKyhyLm1zZz8iICIrci5tc2c6IiIpKSxkZWxldGUgci5jb2RlLGRlbGV0ZSByLm1zZyxxLmlzRnVuY3Rpb24odSkmJnUocikscz09PWtufHxzPT09QXQpe2xldCBwPXQuY29tcGxldGU7cS5pc0Z1bmN0aW9uKHApJiZwKHIpfX19bGV0IGZvO2Z1bmN0aW9uIE9vKCl7cmV0dXJuIGZvfWZ1bmN0aW9uIHdhKGUpe2xldCB0PWUuJDtPYmplY3QuZGVmaW5lUHJvcGVydHkodC5jdHgsIiRjaGlsZHJlbiIse2dldCgpe3JldHVybiB4bigpLm1hcChyPT5yLiR2bSl9fSk7bGV0IG49dC5hcHBDb250ZXh0O2ZvPXEuZXh0ZW5kKG4uYXBwLHttb3VudFBhZ2UocixzLHUpe2xldCBwPXNuLmNyZWF0ZVZOb2RlKHIscyk7cC5hcHBDb250ZXh0PW4scC5fX3BhZ2VfY29udGFpbmVyX189dSxzbi5yZW5kZXIocCx1KTtsZXQgUz1wLmNvbXBvbmVudC5wcm94eTtyZXR1cm4gUy5fX3BhZ2VfY29udGFpbmVyX189dSxTfSx1bm1vdW50UGFnZTpyPT57bGV0e19fcGFnZV9jb250YWluZXJfXzpzfT1yO3MmJihzLmlzVW5tb3VudGVkPSEwLHNuLnJlbmRlcihudWxsLHMpKX19KX1sZXQgaWk9W107ZnVuY3Rpb24gQmkoZSl7aWYoIWUuJHBhZ2UubWV0YS5pc05WdWUpcmV0dXJuIGlpLnB1c2goZSk7bGV0IG49aWkuZmluZEluZGV4KHI9PnIuJHBhZ2UuaWQ9PT1lLiRwYWdlLmlkKTtuPi0xP2lpLnNwbGljZShuLDEsZSk6aWkucHVzaChlKX1mdW5jdGlvbiBQbyhlKXtyZXR1cm4gaWkuZmluZCh0PT50LiRwYWdlLmlkPT09ZSl9ZnVuY3Rpb24geG4oKXtyZXR1cm4gaWl9ZnVuY3Rpb24gVWEoKXtsZXQgZT1bXTtyZXR1cm4gaWkuZm9yRWFjaCh0PT57dC4kLl9faXNUYWJCYXI/dC4kLl9faXNBY3RpdmUmJmUucHVzaCh0KTplLnB1c2godCl9KSxlfWZ1bmN0aW9uIHRzKCl7bGV0IGU9RHIoKTshZXx8JG8oZSl9ZnVuY3Rpb24gJG8oZSl7bGV0IHQ9aWkuZmluZEluZGV4KG49Pm49PT1lKTt0IT09LTEmJihlLiRwYWdlLm1ldGEuaXNOVnVlfHxPbygpLnVubW91bnRQYWdlKGUpLGlpLnNwbGljZSh0LDEpKX1sZXQgQWE9e3BsYXkoZSl7cmV0dXJuIGFuKGUsInBsYXkiKX0scGF1c2UoZSl7cmV0dXJuIGFuKGUsInBhdXNlIil9LHNlZWsoZSx0KXtyZXR1cm4ga3QoZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3AoZSl7cmV0dXJuIGFuKGUsInN0b3AiKX0sc2VuZERhbm11KGUsdCl7cmV0dXJuIGt0KGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZShlLHQpe3JldHVybiBrdChlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuKGUsdD17fSl7cmV0dXJuIGt0KGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW4oZSl7cmV0dXJuIGFuKGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXIoZSl7cmV0dXJuIGFuKGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcihlKXtyZXR1cm4gYW4oZSwiaGlkZVN0YXR1c0JhciIpfX07ZnVuY3Rpb24ga3IoZSx0LG4scil7bGV0IHM9UG8odCk7aWYocz09bnVsbD92b2lkIDA6cy4kcGFnZS5tZXRhLmlzTlZ1ZSl7bGV0IHU9cy4kdm07cmV0dXJuIEFhW25dKENuKGUsdSkscil9ZnQuaW52b2tlVmlld01ldGhvZCgidmlkZW8uIitlLHt2aWRlb0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9bGV0IENhPXtnZXRDZW50ZXJMb2NhdGlvbihlLHQpe3JldHVybiBhbihlLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9LG1vdmVUb0xvY2F0aW9uKGUsdCl7cmV0dXJuIGt0KGUsIm1vdmVUb0xvY2F0aW9uIix0KX0sdHJhbnNsYXRlTWFya2VyKGUsdCl7cmV0dXJuIGt0KGUsInRyYW5zbGF0ZU1hcmtlciIsdCxbImFuaW1hdGlvbkVuZCJdKX0saW5jbHVkZVBvaW50cyhlLHQpe3JldHVybiBrdChlLCJpbmNsdWRlUG9pbnRzIix0KX0sZ2V0UmVnaW9uKGUsdCl7cmV0dXJuIGFuKGUsImdldFJlZ2lvbiIsdCl9LGdldFNjYWxlKGUsdCl7cmV0dXJuIGFuKGUsImdldFNjYWxlIix0KX0sYWRkQ3VzdG9tTGF5ZXIoZSx0KXtyZXR1cm4ga3QoZSwiYWRkQ3VzdG9tTGF5ZXIiLHQpfSxyZW1vdmVDdXN0b21MYXllcihlLHQpe3JldHVybiBrdChlLCJyZW1vdmVDdXN0b21MYXllciIsdCl9LGFkZEdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4ga3QoZSwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9LHJlbW92ZUdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4ga3QoZSwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsdCl9LHVwZGF0ZUdyb3VuZE92ZXJsYXkoZSx0KXtyZXR1cm4ga3QoZSwidXBkYXRlR3JvdW5kT3ZlcmxheSIsdCl9LGluaXRNYXJrZXJDbHVzdGVyKGUsdCl7cmV0dXJuIGt0KGUsImluaXRNYXJrZXJDbHVzdGVyIix0KX0sYWRkTWFya2VycyhlLHQpe3JldHVybiBrdChlLCJhZGRNYXJrZXJzIix0KX0scmVtb3ZlTWFya2VycyhlLHQpe3JldHVybiBrdChlLCJyZW1vdmVNYXJrZXJzIix0KX0sbW92ZUFsb25nKGUsdCl7cmV0dXJuIGt0KGUsIm1vdmVBbG9uZyIsdCl9LHNldExvY01hcmtlckljb24oZSx0KXtyZXR1cm4ga3QoZSwic2V0TG9jTWFya2VySWNvbiIsdCl9LG9wZW5NYXBBcHAoZSx0KXtyZXR1cm4ga3QoZSwib3Blbk1hcEFwcCIsdCl9LG9uKGUsdCl7cmV0dXJuIGUub24odC5uYW1lLHQuY2FsbGJhY2spfX07ZnVuY3Rpb24gTWkoZSx0LG4scixzKXtsZXQgdT1Qbyh0KTtpZih1PT1udWxsP3ZvaWQgMDp1LiRwYWdlLm1ldGEuaXNOVnVlKXtsZXQgcD11LiR2bTtyZXR1cm4gQ2Fbbl0oQ24oZSxwKSxyKX1mdC5pbnZva2VWaWV3TWV0aG9kKCJtYXAuIitlLHt0eXBlOm4sZGF0YTpyfSx0LHMpfWZ1bmN0aW9uIGhvKGUpe3JldHVybmBJbnRlcnNlY3Rpb25PYnNlcnZlci4ke2V9YH1mdW5jdGlvbiB0cih7cmVxSWQ6ZSxjb21wb25lbnQ6dCxvcHRpb25zOm4sY2FsbGJhY2s6cn0scyl7bGV0IHU9aG8oZSk7ZnQuaW52b2tlVmlld01ldGhvZCgiYWRkSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWQsb3B0aW9uczpuLGV2ZW50TmFtZTp1fSxzKSxmdC5zdWJzY3JpYmUodSxyKX1mdW5jdGlvbiBzYSh7cmVxSWQ6ZSxjb21wb25lbnQ6dH0sbil7ZnQuaW52b2tlVmlld01ldGhvZCgicmVtb3ZlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWR9LG4pLGZ0LnVuc3Vic2NyaWJlKGhvKGUpKX1mdW5jdGlvbiBVcihlKXtyZXR1cm5gTWVkaWFRdWVyeU9ic2VydmVyLiR7ZX1gfWZ1bmN0aW9uIEhvKHtyZXFJZDplLGNvbXBvbmVudDp0LG9wdGlvbnM6bixjYWxsYmFjazpyfSxzKXtsZXQgdT1VcihlKTtmdC5pbnZva2VWaWV3TWV0aG9kKCJhZGRNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDplLGNvbXBvbmVudDp0LiRlbC5ub2RlSWQsb3B0aW9uczpuLGV2ZW50TmFtZTp1fSxzKSxmdC5zdWJzY3JpYmUodSxyKX1mdW5jdGlvbiBucih7cmVxSWQ6ZSxjb21wb25lbnQ6dH0sbil7ZnQuaW52b2tlVmlld01ldGhvZCgicmVtb3ZlTWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6ZSxjb21wb25lbnQ6dC4kZWwubm9kZUlkfSxuKSxmdC51bnN1YnNjcmliZShVcihlKSl9bGV0IEduPTIwMCxncj1bInVua25vd24iLCJub25lIiwiZXRoZXJuZXQiLCJ3aWZpIiwiMmciLCIzZyIsIjRnIiwiNWciXSxnbz0iX2RvYy91bmlhcHBfdGVtcCIsWW49YCR7Z299XyR7RGF0ZS5ub3coKX1gO2Z1bmN0aW9uICRyKGUpe2xldCB0PWUuc3BsaXQoIi8iKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1mdW5jdGlvbiBUYShlKXtsZXQgdD1lLnNwbGl0KCIuIik7cmV0dXJuIHQubGVuZ3RoPjE/Ii4iK3RbdC5sZW5ndGgtMV06IiJ9bGV0IG5zPSJiYWNrYnV0dG9uIjtmdW5jdGlvbiBkaSgpe1IubmF2aWdhdGVCYWNrKHtmcm9tOiJiYWNrYnV0dG9uIixzdWNjZXNzKCl7fX0pfWxldCBLcj1lbigpLEhyPWVuKCk7ZnVuY3Rpb24gb2woKXtyZXR1cm4gcS5leHRlbmQoe30sSHIpfWZ1bmN0aW9uIExpKCl7cmV0dXJuIHEuZXh0ZW5kKHt9LEtyKX1mdW5jdGlvbiBObyh7cGF0aDplLHF1ZXJ5OnQscmVmZXJyZXJJbmZvOm59KXtxLmV4dGVuZChLcix7cGF0aDplLHF1ZXJ5OnQ/bmUucGFyc2VRdWVyeSh0KTp7fSxyZWZlcnJlckluZm86bnx8e319KX1mdW5jdGlvbiBvaSh7cGF0aDplLHF1ZXJ5OnQscmVmZXJyZXJJbmZvOm59KXtyZXR1cm4gcS5leHRlbmQoSHIse3BhdGg6ZSxxdWVyeTp0P25lLnBhcnNlUXVlcnkodCk6e30scmVmZXJyZXJJbmZvOm58fHt9LGNoYW5uZWw6by5ydW50aW1lLmNoYW5uZWwsbGF1bmNoZXI6by5ydW50aW1lLmxhdW5jaGVyfSkscS5leHRlbmQoS3IsSHIpLEtyfWZ1bmN0aW9uIHlzKCl7bGV0IGU9Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoZS5nZXRSZWRpcmVjdEluZm8pe2xldHtwYXRoOnQscXVlcnk6bixleHRyYURhdGE6cix1c2VyQWN0aW9uOnMsZnJvbUFwcGlkOnV9PWUuZ2V0UmVkaXJlY3RJbmZvKCl8fHt9LHA9e2FwcElkOnUsZXh0cmFEYXRhOnt9fTtyZXR1cm4gciYmKHAuZXh0cmFEYXRhPXIpLHtwYXRoOnR8fCIiLHF1ZXJ5Om4/Ij8iK246IiIscmVmZXJyZXJJbmZvOnAsdXNlckFjdGlvbjpzfX19dmFyIF9lPXt9OyhmdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCImJnR5cGVvZiBVaW50MTZBcnJheSE9InVuZGVmaW5lZCImJnR5cGVvZiBJbnQzMkFycmF5IT0idW5kZWZpbmVkIjtmdW5jdGlvbiBuKHUscCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1LHApfWUuYXNzaWduPWZ1bmN0aW9uKHUpe2Zvcih2YXIgcD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cC5sZW5ndGg7KXt2YXIgUz1wLnNoaWZ0KCk7aWYoISFTKXtpZih0eXBlb2YgUyE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcihTKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIFUgaW4gUyluKFMsVSkmJih1W1VdPVNbVV0pfX1yZXR1cm4gdX0sZS5zaHJpbmtCdWY9ZnVuY3Rpb24odSxwKXtyZXR1cm4gdS5sZW5ndGg9PT1wP3U6dS5zdWJhcnJheT91LnN1YmFycmF5KDAscCk6KHUubGVuZ3RoPXAsdSl9O3ZhciByPXthcnJheVNldDpmdW5jdGlvbih1LHAsUyxVLFApe2lmKHAuc3ViYXJyYXkmJnUuc3ViYXJyYXkpe3Uuc2V0KHAuc3ViYXJyYXkoUyxTK1UpLFApO3JldHVybn1mb3IodmFyIEY9MDtGPFU7RisrKXVbUCtGXT1wW1MrRl19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24odSl7dmFyIHAsUyxVLFAsRixiZTtmb3IoVT0wLHA9MCxTPXUubGVuZ3RoO3A8UztwKyspVSs9dVtwXS5sZW5ndGg7Zm9yKGJlPW5ldyBVaW50OEFycmF5KFUpLFA9MCxwPTAsUz11Lmxlbmd0aDtwPFM7cCsrKUY9dVtwXSxiZS5zZXQoRixQKSxQKz1GLmxlbmd0aDtyZXR1cm4gYmV9fSxzPXthcnJheVNldDpmdW5jdGlvbih1LHAsUyxVLFApe2Zvcih2YXIgRj0wO0Y8VTtGKyspdVtQK0ZdPXBbUytGXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbih1KXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sdSl9fTtlLnNldFR5cGVkPWZ1bmN0aW9uKHUpe3U/KGUuQnVmOD1VaW50OEFycmF5LGUuQnVmMTY9VWludDE2QXJyYXksZS5CdWYzMj1JbnQzMkFycmF5LGUuYXNzaWduKGUscikpOihlLkJ1Zjg9QXJyYXksZS5CdWYxNj1BcnJheSxlLkJ1ZjMyPUFycmF5LGUuYXNzaWduKGUscykpfSxlLnNldFR5cGVkKHQpfSkoX2UpO3ZhciB4dD17fSxDdD17fSxvbj17fSx0bj1fZSxGaT00LGtvPTAsQm49MSxEaT0yO2Z1bmN0aW9uIGpvKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDstLXQ+PTA7KWVbdF09MH12YXIgQnM9MCx6bj0xLE9hPTIsYWw9MyxzbD0yNTgsX249MjkscG89MjU2LFBhPXBvKzErX24sbGE9MzAscnI9MTksSW89MipQYSsxLGhpPTE1LCRhPTE2LGxsPTcsRXM9MjU2LE5hPTE2LHJzPTE3LGlzPTE4LG9zPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLE1zPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxjbD1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sYXM9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLHVsPTUxMix6bz1uZXcgQXJyYXkoKFBhKzIpKjIpO2pvKHpvKTt2YXIga2E9bmV3IEFycmF5KGxhKjIpO2pvKGthKTt2YXIgc3M9bmV3IEFycmF5KHVsKTtqbyhzcyk7dmFyIFNzPW5ldyBBcnJheShzbC1hbCsxKTtqbyhTcyk7dmFyIEhhPW5ldyBBcnJheShfbik7am8oSGEpO3ZhciBJYT1uZXcgQXJyYXkobGEpO2pvKElhKTtmdW5jdGlvbiBmbChlLHQsbixyLHMpe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9dCx0aGlzLmV4dHJhX2Jhc2U9bix0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPXMsdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9dmFyIGRsLHdzLGhsO2Z1bmN0aW9uIGdsKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fWZ1bmN0aW9uIHBsKGUpe3JldHVybiBlPDI1Nj9zc1tlXTpzc1syNTYrKGU+Pj43KV19ZnVuY3Rpb24gbHMoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10JjI1NSxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9ZnVuY3Rpb24gZ2koZSx0LG4pe2UuYmlfdmFsaWQ+JGEtbj8oZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsbHMoZSxlLmJpX2J1ZiksZS5iaV9idWY9dD4+JGEtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz1uLSRhKTooZS5iaV9idWZ8PXQ8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9bil9ZnVuY3Rpb24gV28oZSx0LG4pe2dpKGUsblt0KjJdLG5bdCoyKzFdKX1mdW5jdGlvbiBWbChlLHQpe3ZhciBuPTA7ZG8gbnw9ZSYxLGU+Pj49MSxuPDw9MTt3aGlsZSgtLXQ+MCk7cmV0dXJuIG4+Pj4xfWZ1bmN0aW9uIFVsKGUpe2UuYmlfdmFsaWQ9PT0xNj8obHMoZSxlLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTApOmUuYmlfdmFsaWQ+PTgmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiYyNTUsZS5iaV9idWY+Pj04LGUuYmlfdmFsaWQtPTgpfWZ1bmN0aW9uICRsKGUsdCl7dmFyIG49dC5keW5fdHJlZSxyPXQubWF4X2NvZGUscz10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSx1PXQuc3RhdF9kZXNjLmhhc19zdHJlZSxwPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMsUz10LnN0YXRfZGVzYy5leHRyYV9iYXNlLFU9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCxQLEYsYmUsRWUsUGUsY3QscHQ9MDtmb3IoRWU9MDtFZTw9aGk7RWUrKyllLmJsX2NvdW50W0VlXT0wO2ZvcihuW2UuaGVhcFtlLmhlYXBfbWF4XSoyKzFdPTAsUD1lLmhlYXBfbWF4KzE7UDxJbztQKyspRj1lLmhlYXBbUF0sRWU9bltuW0YqMisxXSoyKzFdKzEsRWU+VSYmKEVlPVUscHQrKyksbltGKjIrMV09RWUsIShGPnIpJiYoZS5ibF9jb3VudFtFZV0rKyxQZT0wLEY+PVMmJihQZT1wW0YtU10pLGN0PW5bRioyXSxlLm9wdF9sZW4rPWN0KihFZStQZSksdSYmKGUuc3RhdGljX2xlbis9Y3QqKHNbRioyKzFdK1BlKSkpO2lmKHB0IT09MCl7ZG97Zm9yKEVlPVUtMTtlLmJsX2NvdW50W0VlXT09PTA7KUVlLS07ZS5ibF9jb3VudFtFZV0tLSxlLmJsX2NvdW50W0VlKzFdKz0yLGUuYmxfY291bnRbVV0tLSxwdC09Mn13aGlsZShwdD4wKTtmb3IoRWU9VTtFZSE9PTA7RWUtLSlmb3IoRj1lLmJsX2NvdW50W0VlXTtGIT09MDspYmU9ZS5oZWFwWy0tUF0sIShiZT5yKSYmKG5bYmUqMisxXSE9PUVlJiYoZS5vcHRfbGVuKz0oRWUtbltiZSoyKzFdKSpuW2JlKjJdLG5bYmUqMisxXT1FZSksRi0tKX19ZnVuY3Rpb24gSGwoZSx0LG4pe3ZhciByPW5ldyBBcnJheShoaSsxKSxzPTAsdSxwO2Zvcih1PTE7dTw9aGk7dSsrKXJbdV09cz1zK25bdS0xXTw8MTtmb3IocD0wO3A8PXQ7cCsrKXt2YXIgUz1lW3AqMisxXTtTIT09MCYmKGVbcCoyXT1WbChyW1NdKyssUykpfX1mdW5jdGlvbiBDYygpe3ZhciBlLHQsbixyLHMsdT1uZXcgQXJyYXkoaGkrMSk7Zm9yKG49MCxyPTA7cjxfbi0xO3IrKylmb3IoSGFbcl09bixlPTA7ZTwxPDxvc1tyXTtlKyspU3NbbisrXT1yO2ZvcihTc1tuLTFdPXIscz0wLHI9MDtyPDE2O3IrKylmb3IoSWFbcl09cyxlPTA7ZTwxPDxNc1tyXTtlKyspc3NbcysrXT1yO2ZvcihzPj49NztyPGxhO3IrKylmb3IoSWFbcl09czw8NyxlPTA7ZTwxPDxNc1tyXS03O2UrKylzc1syNTYrcysrXT1yO2Zvcih0PTA7dDw9aGk7dCsrKXVbdF09MDtmb3IoZT0wO2U8PTE0Mzspem9bZSoyKzFdPTgsZSsrLHVbOF0rKztmb3IoO2U8PTI1NTspem9bZSoyKzFdPTksZSsrLHVbOV0rKztmb3IoO2U8PTI3OTspem9bZSoyKzFdPTcsZSsrLHVbN10rKztmb3IoO2U8PTI4Nzspem9bZSoyKzFdPTgsZSsrLHVbOF0rKztmb3IoSGwoem8sUGErMSx1KSxlPTA7ZTxsYTtlKyspa2FbZSoyKzFdPTUsa2FbZSoyXT1WbChlLDUpO2RsPW5ldyBmbCh6byxvcyxwbysxLFBhLGhpKSx3cz1uZXcgZmwoa2EsTXMsMCxsYSxoaSksaGw9bmV3IGZsKG5ldyBBcnJheSgwKSxjbCwwLHJyLGxsKX1mdW5jdGlvbiBqbChlKXt2YXIgdDtmb3IodD0wO3Q8UGE7dCsrKWUuZHluX2x0cmVlW3QqMl09MDtmb3IodD0wO3Q8bGE7dCsrKWUuZHluX2R0cmVlW3QqMl09MDtmb3IodD0wO3Q8cnI7dCsrKWUuYmxfdHJlZVt0KjJdPTA7ZS5keW5fbHRyZWVbRXMqMl09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH1mdW5jdGlvbiB6bChlKXtlLmJpX3ZhbGlkPjg/bHMoZSxlLmJpX2J1Zik6ZS5iaV92YWxpZD4wJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfWZ1bmN0aW9uIFRjKGUsdCxuLHIpe3psKGUpLHImJihscyhlLG4pLGxzKGUsfm4pKSx0bi5hcnJheVNldChlLnBlbmRpbmdfYnVmLGUud2luZG93LHQsbixlLnBlbmRpbmcpLGUucGVuZGluZys9bn1mdW5jdGlvbiBXbChlLHQsbixyKXt2YXIgcz10KjIsdT1uKjI7cmV0dXJuIGVbc108ZVt1XXx8ZVtzXT09PWVbdV0mJnJbdF08PXJbbl19ZnVuY3Rpb24gamEoZSx0LG4pe2Zvcih2YXIgcj1lLmhlYXBbbl0scz1uPDwxO3M8PWUuaGVhcF9sZW4mJihzPGUuaGVhcF9sZW4mJldsKHQsZS5oZWFwW3MrMV0sZS5oZWFwW3NdLGUuZGVwdGgpJiZzKyssIVdsKHQscixlLmhlYXBbc10sZS5kZXB0aCkpOyllLmhlYXBbbl09ZS5oZWFwW3NdLG49cyxzPDw9MTtlLmhlYXBbbl09cn1mdW5jdGlvbiBMcyhlLHQsbil7dmFyIHIscyx1PTAscCxTO2lmKGUubGFzdF9saXQhPT0wKWRvIHI9ZS5wZW5kaW5nX2J1ZltlLmRfYnVmK3UqMl08PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmK3UqMisxXSxzPWUucGVuZGluZ19idWZbZS5sX2J1Zit1XSx1Kysscj09PTA/V28oZSxzLHQpOihwPVNzW3NdLFdvKGUscCtwbysxLHQpLFM9b3NbcF0sUyE9PTAmJihzLT1IYVtwXSxnaShlLHMsUykpLHItLSxwPXBsKHIpLFdvKGUscCxuKSxTPU1zW3BdLFMhPT0wJiYoci09SWFbcF0sZ2koZSxyLFMpKSk7d2hpbGUodTxlLmxhc3RfbGl0KTtXbyhlLEVzLHQpfWZ1bmN0aW9uIEZzKGUsdCl7dmFyIG49dC5keW5fdHJlZSxyPXQuc3RhdF9kZXNjLnN0YXRpY190cmVlLHM9dC5zdGF0X2Rlc2MuaGFzX3N0cmVlLHU9dC5zdGF0X2Rlc2MuZWxlbXMscCxTLFU9LTEsUDtmb3IoZS5oZWFwX2xlbj0wLGUuaGVhcF9tYXg9SW8scD0wO3A8dTtwKyspbltwKjJdIT09MD8oZS5oZWFwWysrZS5oZWFwX2xlbl09VT1wLGUuZGVwdGhbcF09MCk6bltwKjIrMV09MDtmb3IoO2UuaGVhcF9sZW48MjspUD1lLmhlYXBbKytlLmhlYXBfbGVuXT1VPDI/KytVOjAsbltQKjJdPTEsZS5kZXB0aFtQXT0wLGUub3B0X2xlbi0tLHMmJihlLnN0YXRpY19sZW4tPXJbUCoyKzFdKTtmb3IodC5tYXhfY29kZT1VLHA9ZS5oZWFwX2xlbj4+MTtwPj0xO3AtLSlqYShlLG4scCk7UD11O2RvIHA9ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxqYShlLG4sMSksUz1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09cCxlLmhlYXBbLS1lLmhlYXBfbWF4XT1TLG5bUCoyXT1uW3AqMl0rbltTKjJdLGUuZGVwdGhbUF09KGUuZGVwdGhbcF0+PWUuZGVwdGhbU10/ZS5kZXB0aFtwXTplLmRlcHRoW1NdKSsxLG5bcCoyKzFdPW5bUyoyKzFdPVAsZS5oZWFwWzFdPVArKyxqYShlLG4sMSk7d2hpbGUoZS5oZWFwX2xlbj49Mik7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLCRsKGUsdCksSGwobixVLGUuYmxfY291bnQpfWZ1bmN0aW9uIERzKGUsdCxuKXt2YXIgcixzPS0xLHUscD10WzAqMisxXSxTPTAsVT03LFA9NDtmb3IocD09PTAmJihVPTEzOCxQPTMpLHRbKG4rMSkqMisxXT02NTUzNSxyPTA7cjw9bjtyKyspdT1wLHA9dFsocisxKSoyKzFdLCEoKytTPFUmJnU9PT1wKSYmKFM8UD9lLmJsX3RyZWVbdSoyXSs9Uzp1IT09MD8odSE9PXMmJmUuYmxfdHJlZVt1KjJdKyssZS5ibF90cmVlW05hKjJdKyspOlM8PTEwP2UuYmxfdHJlZVtycyoyXSsrOmUuYmxfdHJlZVtpcyoyXSsrLFM9MCxzPXUscD09PTA/KFU9MTM4LFA9Myk6dT09PXA/KFU9NixQPTMpOihVPTcsUD00KSl9ZnVuY3Rpb24gVnMoZSx0LG4pe3ZhciByLHM9LTEsdSxwPXRbMCoyKzFdLFM9MCxVPTcsUD00O2ZvcihwPT09MCYmKFU9MTM4LFA9Mykscj0wO3I8PW47cisrKWlmKHU9cCxwPXRbKHIrMSkqMisxXSwhKCsrUzxVJiZ1PT09cCkpe2lmKFM8UClkbyBXbyhlLHUsZS5ibF90cmVlKTt3aGlsZSgtLVMhPT0wKTtlbHNlIHUhPT0wPyh1IT09cyYmKFdvKGUsdSxlLmJsX3RyZWUpLFMtLSksV28oZSxOYSxlLmJsX3RyZWUpLGdpKGUsUy0zLDIpKTpTPD0xMD8oV28oZSxycyxlLmJsX3RyZWUpLGdpKGUsUy0zLDMpKTooV28oZSxpcyxlLmJsX3RyZWUpLGdpKGUsUy0xMSw3KSk7Uz0wLHM9dSxwPT09MD8oVT0xMzgsUD0zKTp1PT09cD8oVT02LFA9Myk6KFU9NyxQPTQpfX1mdW5jdGlvbiBVcyhlKXt2YXIgdDtmb3IoRHMoZSxlLmR5bl9sdHJlZSxlLmxfZGVzYy5tYXhfY29kZSksRHMoZSxlLmR5bl9kdHJlZSxlLmRfZGVzYy5tYXhfY29kZSksRnMoZSxlLmJsX2Rlc2MpLHQ9cnItMTt0Pj0zJiZlLmJsX3RyZWVbYXNbdF0qMisxXT09PTA7dC0tKTtyZXR1cm4gZS5vcHRfbGVuKz0zKih0KzEpKzUrNSs0LHR9ZnVuY3Rpb24gR2woZSx0LG4scil7dmFyIHM7Zm9yKGdpKGUsdC0yNTcsNSksZ2koZSxuLTEsNSksZ2koZSxyLTQsNCkscz0wO3M8cjtzKyspZ2koZSxlLmJsX3RyZWVbYXNbc10qMisxXSwzKTtWcyhlLGUuZHluX2x0cmVlLHQtMSksVnMoZSxlLmR5bl9kdHJlZSxuLTEpfWZ1bmN0aW9uIFlsKGUpe3ZhciB0PTQwOTM2MjQ0NDcsbjtmb3Iobj0wO248PTMxO24rKyx0Pj4+PTEpaWYodCYxJiZlLmR5bl9sdHJlZVtuKjJdIT09MClyZXR1cm4ga287aWYoZS5keW5fbHRyZWVbOSoyXSE9PTB8fGUuZHluX2x0cmVlWzEwKjJdIT09MHx8ZS5keW5fbHRyZWVbMTMqMl0hPT0wKXJldHVybiBCbjtmb3Iobj0zMjtuPHBvO24rKylpZihlLmR5bl9sdHJlZVtuKjJdIT09MClyZXR1cm4gQm47cmV0dXJuIGtvfXZhciBxbD0hMTtmdW5jdGlvbiBKbChlKXtxbHx8KENjKCkscWw9ITApLGUubF9kZXNjPW5ldyBnbChlLmR5bl9sdHJlZSxkbCksZS5kX2Rlc2M9bmV3IGdsKGUuZHluX2R0cmVlLHdzKSxlLmJsX2Rlc2M9bmV3IGdsKGUuYmxfdHJlZSxobCksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsamwoZSl9ZnVuY3Rpb24gS2woZSx0LG4scil7Z2koZSwoQnM8PDEpKyhyPzE6MCksMyksVGMoZSx0LG4sITApfWZ1bmN0aW9uIHZsKGUpe2dpKGUsem48PDEsMyksV28oZSxFcyx6byksVWwoZSl9ZnVuY3Rpb24gWmwoZSx0LG4scil7dmFyIHMsdSxwPTA7ZS5sZXZlbD4wPyhlLnN0cm0uZGF0YV90eXBlPT09RGkmJihlLnN0cm0uZGF0YV90eXBlPVlsKGUpKSxGcyhlLGUubF9kZXNjKSxGcyhlLGUuZF9kZXNjKSxwPVVzKGUpLHM9ZS5vcHRfbGVuKzMrNz4+PjMsdT1lLnN0YXRpY19sZW4rMys3Pj4+Myx1PD1zJiYocz11KSk6cz11PW4rNSxuKzQ8PXMmJnQhPT0tMT9LbChlLHQsbixyKTplLnN0cmF0ZWd5PT09Rml8fHU9PT1zPyhnaShlLCh6bjw8MSkrKHI/MTowKSwzKSxMcyhlLHpvLGthKSk6KGdpKGUsKE9hPDwxKSsocj8xOjApLDMpLEdsKGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLHArMSksTHMoZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLGpsKGUpLHImJnpsKGUpfWZ1bmN0aW9uIE9jKGUsdCxuKXtyZXR1cm4gZS5wZW5kaW5nX2J1ZltlLmRfYnVmK2UubGFzdF9saXQqMl09dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5kX2J1ZitlLmxhc3RfbGl0KjIrMV09dCYyNTUsZS5wZW5kaW5nX2J1ZltlLmxfYnVmK2UubGFzdF9saXRdPW4mMjU1LGUubGFzdF9saXQrKyx0PT09MD9lLmR5bl9sdHJlZVtuKjJdKys6KGUubWF0Y2hlcysrLHQtLSxlLmR5bl9sdHJlZVsoU3Nbbl0rcG8rMSkqMl0rKyxlLmR5bl9kdHJlZVtwbCh0KSoyXSsrKSxlLmxhc3RfbGl0PT09ZS5saXRfYnVmc2l6ZS0xfW9uLl90cl9pbml0PUpsLG9uLl90cl9zdG9yZWRfYmxvY2s9S2wsb24uX3RyX2ZsdXNoX2Jsb2NrPVpsLG9uLl90cl90YWxseT1PYyxvbi5fdHJfYWxpZ249dmw7ZnVuY3Rpb24gJHMoZSx0LG4scil7Zm9yKHZhciBzPWUmNjU1MzV8MCx1PWU+Pj4xNiY2NTUzNXwwLHA9MDtuIT09MDspe3A9bj4yZTM/MmUzOm4sbi09cDtkbyBzPXMrdFtyKytdfDAsdT11K3N8MDt3aGlsZSgtLXApO3MlPTY1NTIxLHUlPTY1NTIxfXJldHVybiBzfHU8PDE2fDB9dmFyIG1sPSRzO2Z1bmN0aW9uIFhsKCl7Zm9yKHZhciBlLHQ9W10sbj0wO248MjU2O24rKyl7ZT1uO2Zvcih2YXIgcj0wO3I8ODtyKyspZT1lJjE/Mzk4ODI5MjM4NF5lPj4+MTplPj4+MTt0W25dPWV9cmV0dXJuIHR9dmFyIFBjPVhsKCk7ZnVuY3Rpb24gTmMoZSx0LG4scil7dmFyIHM9UGMsdT1yK247ZV49LTE7Zm9yKHZhciBwPXI7cDx1O3ArKyllPWU+Pj44XnNbKGVedFtwXSkmMjU1XTtyZXR1cm4gZV4tMX12YXIgUWw9TmMsX2w9ezI6Im5lZWQgZGljdGlvbmFyeSIsMToic3RyZWFtIGVuZCIsMDoiIiwiLTEiOiJmaWxlIGVycm9yIiwiLTIiOiJzdHJlYW0gZXJyb3IiLCItMyI6ImRhdGEgZXJyb3IiLCItNCI6Imluc3VmZmljaWVudCBtZW1vcnkiLCItNSI6ImJ1ZmZlciBlcnJvciIsIi02IjoiaW5jb21wYXRpYmxlIHZlcnNpb24ifSxhaT1fZSxYaT1vbixjYT1tbCx2bz1RbCxibD1fbCxSYT0wLGVjPTEsemE9Myx1YT00LHlsPTUsR289MCxIcz0xLElyPS0yLFdhPS0zLGpzPS01LEVsPS0xLHRjPTEsQXM9MixuYz0zLHJjPTQsaWM9MCxTbD0yLGNzPTgsb2M9OSxrYz0xNSxhPTgsYz0yOSxtPTI1Nix3PW0rMStjLE49MzAsTz0xOSxMPTIqdysxLEo9MTUsSD0zLGVlPTI1OCxDZT1lZStIKzEsR2U9MzIsaGU9NDIsRGU9NjksZXQ9NzMsZ3Q9OTEsZHQ9MTAzLFZ0PTExMyxIdD02NjYsYWU9MSxrZT0yLHdlPTMsSGU9NCx3dD0zO2Z1bmN0aW9uIHR0KGUsdCl7cmV0dXJuIGUubXNnPWJsW3RdLHR9ZnVuY3Rpb24gaShlKXtyZXR1cm4oZTw8MSktKGU+ND85OjApfWZ1bmN0aW9uIGwoZSl7Zm9yKHZhciB0PWUubGVuZ3RoOy0tdD49MDspZVt0XT0wfWZ1bmN0aW9uIGgoZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksbiE9PTAmJihhaS5hcnJheVNldChlLm91dHB1dCx0LnBlbmRpbmdfYnVmLHQucGVuZGluZ19vdXQsbixlLm5leHRfb3V0KSxlLm5leHRfb3V0Kz1uLHQucGVuZGluZ19vdXQrPW4sZS50b3RhbF9vdXQrPW4sZS5hdmFpbF9vdXQtPW4sdC5wZW5kaW5nLT1uLHQucGVuZGluZz09PTAmJih0LnBlbmRpbmdfb3V0PTApKX1mdW5jdGlvbiB2KGUsdCl7WGkuX3RyX2ZsdXNoX2Jsb2NrKGUsZS5ibG9ja19zdGFydD49MD9lLmJsb2NrX3N0YXJ0Oi0xLGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydCx0KSxlLmJsb2NrX3N0YXJ0PWUuc3Ryc3RhcnQsaChlLnN0cm0pfWZ1bmN0aW9uIEEoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10fWZ1bmN0aW9uIFQoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dCYyNTV9ZnVuY3Rpb24gayhlLHQsbixyKXt2YXIgcz1lLmF2YWlsX2luO3JldHVybiBzPnImJihzPXIpLHM9PT0wPzA6KGUuYXZhaWxfaW4tPXMsYWkuYXJyYXlTZXQodCxlLmlucHV0LGUubmV4dF9pbixzLG4pLGUuc3RhdGUud3JhcD09PTE/ZS5hZGxlcj1jYShlLmFkbGVyLHQscyxuKTplLnN0YXRlLndyYXA9PT0yJiYoZS5hZGxlcj12byhlLmFkbGVyLHQscyxuKSksZS5uZXh0X2luKz1zLGUudG90YWxfaW4rPXMscyl9ZnVuY3Rpb24gRChlLHQpe3ZhciBuPWUubWF4X2NoYWluX2xlbmd0aCxyPWUuc3Ryc3RhcnQscyx1LHA9ZS5wcmV2X2xlbmd0aCxTPWUubmljZV9tYXRjaCxVPWUuc3Ryc3RhcnQ+ZS53X3NpemUtQ2U/ZS5zdHJzdGFydC0oZS53X3NpemUtQ2UpOjAsUD1lLndpbmRvdyxGPWUud19tYXNrLGJlPWUucHJldixFZT1lLnN0cnN0YXJ0K2VlLFBlPVBbcitwLTFdLGN0PVBbcitwXTtlLnByZXZfbGVuZ3RoPj1lLmdvb2RfbWF0Y2gmJihuPj49MiksUz5lLmxvb2thaGVhZCYmKFM9ZS5sb29rYWhlYWQpO2RvIGlmKHM9dCwhKFBbcytwXSE9PWN0fHxQW3MrcC0xXSE9PVBlfHxQW3NdIT09UFtyXXx8UFsrK3NdIT09UFtyKzFdKSl7cis9MixzKys7ZG87d2hpbGUoUFsrK3JdPT09UFsrK3NdJiZQWysrcl09PT1QWysrc10mJlBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZQWysrcl09PT1QWysrc10mJlBbKytyXT09PVBbKytzXSYmUFsrK3JdPT09UFsrK3NdJiZQWysrcl09PT1QWysrc10mJnI8RWUpO2lmKHU9ZWUtKEVlLXIpLHI9RWUtZWUsdT5wKXtpZihlLm1hdGNoX3N0YXJ0PXQscD11LHU+PVMpYnJlYWs7UGU9UFtyK3AtMV0sY3Q9UFtyK3BdfX13aGlsZSgodD1iZVt0JkZdKT5VJiYtLW4hPT0wKTtyZXR1cm4gcDw9ZS5sb29rYWhlYWQ/cDplLmxvb2thaGVhZH1mdW5jdGlvbiBqKGUpe3ZhciB0PWUud19zaXplLG4scixzLHUscDtkb3tpZih1PWUud2luZG93X3NpemUtZS5sb29rYWhlYWQtZS5zdHJzdGFydCxlLnN0cnN0YXJ0Pj10Kyh0LUNlKSl7YWkuYXJyYXlTZXQoZS53aW5kb3csZS53aW5kb3csdCx0LDApLGUubWF0Y2hfc3RhcnQtPXQsZS5zdHJzdGFydC09dCxlLmJsb2NrX3N0YXJ0LT10LHI9ZS5oYXNoX3NpemUsbj1yO2RvIHM9ZS5oZWFkWy0tbl0sZS5oZWFkW25dPXM+PXQ/cy10OjA7d2hpbGUoLS1yKTtyPXQsbj1yO2RvIHM9ZS5wcmV2Wy0tbl0sZS5wcmV2W25dPXM+PXQ/cy10OjA7d2hpbGUoLS1yKTt1Kz10fWlmKGUuc3RybS5hdmFpbF9pbj09PTApYnJlYWs7aWYocj1rKGUuc3RybSxlLndpbmRvdyxlLnN0cnN0YXJ0K2UubG9va2FoZWFkLHUpLGUubG9va2FoZWFkKz1yLGUubG9va2FoZWFkK2UuaW5zZXJ0Pj1IKWZvcihwPWUuc3Ryc3RhcnQtZS5pbnNlcnQsZS5pbnNfaD1lLndpbmRvd1twXSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbcCsxXSkmZS5oYXNoX21hc2s7ZS5pbnNlcnQmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbcCtILTFdKSZlLmhhc2hfbWFzayxlLnByZXZbcCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1wLHArKyxlLmluc2VydC0tLCEoZS5sb29rYWhlYWQrZS5pbnNlcnQ8SCkpOyk7fXdoaWxlKGUubG9va2FoZWFkPENlJiZlLnN0cm0uYXZhaWxfaW4hPT0wKX1mdW5jdGlvbiBaKGUsdCl7dmFyIG49NjU1MzU7Zm9yKG4+ZS5wZW5kaW5nX2J1Zl9zaXplLTUmJihuPWUucGVuZGluZ19idWZfc2l6ZS01KTs7KXtpZihlLmxvb2thaGVhZDw9MSl7aWYoaihlKSxlLmxvb2thaGVhZD09PTAmJnQ9PT1SYSlyZXR1cm4gYWU7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWUuc3Ryc3RhcnQrPWUubG9va2FoZWFkLGUubG9va2FoZWFkPTA7dmFyIHI9ZS5ibG9ja19zdGFydCtuO2lmKChlLnN0cnN0YXJ0PT09MHx8ZS5zdHJzdGFydD49cikmJihlLmxvb2thaGVhZD1lLnN0cnN0YXJ0LXIsZS5zdHJzdGFydD1yLHYoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApfHxlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQ+PWUud19zaXplLUNlJiYodihlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIGFlfXJldHVybiBlLmluc2VydD0wLHQ9PT11YT8odihlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD93ZTpIZSk6KGUuc3Ryc3RhcnQ+ZS5ibG9ja19zdGFydCYmKHYoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApLGFlKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyOzspe2lmKGUubG9va2FoZWFkPENlKXtpZihqKGUpLGUubG9va2FoZWFkPENlJiZ0PT09UmEpcmV0dXJuIGFlO2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PUgmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtILTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLG4hPT0wJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUNlJiYoZS5tYXRjaF9sZW5ndGg9RChlLG4pKSxlLm1hdGNoX2xlbmd0aD49SClpZihyPVhpLl90cl90YWxseShlLGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aC1IKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj1IKXtlLm1hdGNoX2xlbmd0aC0tO2RvIGUuc3Ryc3RhcnQrKyxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtILTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQ7d2hpbGUoLS1lLm1hdGNoX2xlbmd0aCE9PTApO2Uuc3Ryc3RhcnQrK31lbHNlIGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTAsZS5pbnNfaD1lLndpbmRvd1tlLnN0cnN0YXJ0XSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCsxXSkmZS5oYXNoX21hc2s7ZWxzZSByPVhpLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrO2lmKHImJih2KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gYWV9cmV0dXJuIGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8SC0xP2Uuc3Ryc3RhcnQ6SC0xLHQ9PT11YT8odihlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD93ZTpIZSk6ZS5sYXN0X2xpdCYmKHYoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP2FlOmtlfWZ1bmN0aW9uIGdlKGUsdCl7Zm9yKHZhciBuLHIsczs7KXtpZihlLmxvb2thaGVhZDxDZSl7aWYoaihlKSxlLmxvb2thaGVhZDxDZSYmdD09PVJhKXJldHVybiBhZTtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj1IJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrSC0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSxlLnByZXZfbGVuZ3RoPWUubWF0Y2hfbGVuZ3RoLGUucHJldl9tYXRjaD1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoPUgtMSxuIT09MCYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLUNlJiYoZS5tYXRjaF9sZW5ndGg9RChlLG4pLGUubWF0Y2hfbGVuZ3RoPD01JiYoZS5zdHJhdGVneT09PXRjfHxlLm1hdGNoX2xlbmd0aD09PUgmJmUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydD40MDk2KSYmKGUubWF0Y2hfbGVuZ3RoPUgtMSkpLGUucHJldl9sZW5ndGg+PUgmJmUubWF0Y2hfbGVuZ3RoPD1lLnByZXZfbGVuZ3RoKXtzPWUuc3Ryc3RhcnQrZS5sb29rYWhlYWQtSCxyPVhpLl90cl90YWxseShlLGUuc3Ryc3RhcnQtMS1lLnByZXZfbWF0Y2gsZS5wcmV2X2xlbmd0aC1IKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7ZG8rK2Uuc3Ryc3RhcnQ8PXMmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtILTFdKSZlLmhhc2hfbWFzayxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpO3doaWxlKC0tZS5wcmV2X2xlbmd0aCE9PTApO2lmKGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5tYXRjaF9sZW5ndGg9SC0xLGUuc3Ryc3RhcnQrKyxyJiYodihlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIGFlfWVsc2UgaWYoZS5tYXRjaF9hdmFpbGFibGUpe2lmKHI9WGkuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0LTFdKSxyJiZ2KGUsITEpLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tLGUuc3RybS5hdmFpbF9vdXQ9PT0wKXJldHVybiBhZX1lbHNlIGUubWF0Y2hfYXZhaWxhYmxlPTEsZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS19cmV0dXJuIGUubWF0Y2hfYXZhaWxhYmxlJiYocj1YaS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnQtMV0pLGUubWF0Y2hfYXZhaWxhYmxlPTApLGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8SC0xP2Uuc3Ryc3RhcnQ6SC0xLHQ9PT11YT8odihlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD93ZTpIZSk6ZS5sYXN0X2xpdCYmKHYoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP2FlOmtlfWZ1bmN0aW9uIHJlKGUsdCl7Zm9yKHZhciBuLHIscyx1LHA9ZS53aW5kb3c7Oyl7aWYoZS5sb29rYWhlYWQ8PWVlKXtpZihqKGUpLGUubG9va2FoZWFkPD1lZSYmdD09PVJhKXJldHVybiBhZTtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYoZS5tYXRjaF9sZW5ndGg9MCxlLmxvb2thaGVhZD49SCYmZS5zdHJzdGFydD4wJiYocz1lLnN0cnN0YXJ0LTEscj1wW3NdLHI9PT1wWysrc10mJnI9PT1wWysrc10mJnI9PT1wWysrc10pKXt1PWUuc3Ryc3RhcnQrZWU7ZG87d2hpbGUocj09PXBbKytzXSYmcj09PXBbKytzXSYmcj09PXBbKytzXSYmcj09PXBbKytzXSYmcj09PXBbKytzXSYmcj09PXBbKytzXSYmcj09PXBbKytzXSYmcj09PXBbKytzXSYmczx1KTtlLm1hdGNoX2xlbmd0aD1lZS0odS1zKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49SD8obj1YaS5fdHJfdGFsbHkoZSwxLGUubWF0Y2hfbGVuZ3RoLUgpLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wKToobj1YaS5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyksbiYmKHYoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiBhZX1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09dWE/KHYoZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/d2U6SGUpOmUubGFzdF9saXQmJih2KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9hZTprZX1mdW5jdGlvbiB2ZShlLHQpe2Zvcih2YXIgbjs7KXtpZihlLmxvb2thaGVhZD09PTAmJihqKGUpLGUubG9va2FoZWFkPT09MCkpe2lmKHQ9PT1SYSlyZXR1cm4gYWU7YnJlYWt9aWYoZS5tYXRjaF9sZW5ndGg9MCxuPVhpLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydF0pLGUubG9va2FoZWFkLS0sZS5zdHJzdGFydCsrLG4mJih2KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gYWV9cmV0dXJuIGUuaW5zZXJ0PTAsdD09PXVhPyh2KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP3dlOkhlKTplLmxhc3RfbGl0JiYodihlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCk/YWU6a2V9ZnVuY3Rpb24gV2UoZSx0LG4scixzKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT10LHRoaXMubmljZV9sZW5ndGg9bix0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1zfXZhciBpdDtpdD1bbmV3IFdlKDAsMCwwLDAsWiksbmV3IFdlKDQsNCw4LDQsZmUpLG5ldyBXZSg0LDUsMTYsOCxmZSksbmV3IFdlKDQsNiwzMiwzMixmZSksbmV3IFdlKDQsNCwxNiwxNixnZSksbmV3IFdlKDgsMTYsMzIsMzIsZ2UpLG5ldyBXZSg4LDE2LDEyOCwxMjgsZ2UpLG5ldyBXZSg4LDMyLDEyOCwyNTYsZ2UpLG5ldyBXZSgzMiwxMjgsMjU4LDEwMjQsZ2UpLG5ldyBXZSgzMiwyNTgsMjU4LDQwOTYsZ2UpXTtmdW5jdGlvbiBudChlKXtlLndpbmRvd19zaXplPTIqZS53X3NpemUsbChlLmhlYWQpLGUubWF4X2xhenlfbWF0Y2g9aXRbZS5sZXZlbF0ubWF4X2xhenksZS5nb29kX21hdGNoPWl0W2UubGV2ZWxdLmdvb2RfbGVuZ3RoLGUubmljZV9tYXRjaD1pdFtlLmxldmVsXS5uaWNlX2xlbmd0aCxlLm1heF9jaGFpbl9sZW5ndGg9aXRbZS5sZXZlbF0ubWF4X2NoYWluLGUuc3Ryc3RhcnQ9MCxlLmJsb2NrX3N0YXJ0PTAsZS5sb29rYWhlYWQ9MCxlLmluc2VydD0wLGUubWF0Y2hfbGVuZ3RoPWUucHJldl9sZW5ndGg9SC0xLGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5pbnNfaD0wfWZ1bmN0aW9uIFB0KCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9Y3MsdGhpcy5sYXN0X2ZsdXNoPS0xLHRoaXMud19zaXplPTAsdGhpcy53X2JpdHM9MCx0aGlzLndfbWFzaz0wLHRoaXMud2luZG93PW51bGwsdGhpcy53aW5kb3dfc2l6ZT0wLHRoaXMucHJldj1udWxsLHRoaXMuaGVhZD1udWxsLHRoaXMuaW5zX2g9MCx0aGlzLmhhc2hfc2l6ZT0wLHRoaXMuaGFzaF9iaXRzPTAsdGhpcy5oYXNoX21hc2s9MCx0aGlzLmhhc2hfc2hpZnQ9MCx0aGlzLmJsb2NrX3N0YXJ0PTAsdGhpcy5tYXRjaF9sZW5ndGg9MCx0aGlzLnByZXZfbWF0Y2g9MCx0aGlzLm1hdGNoX2F2YWlsYWJsZT0wLHRoaXMuc3Ryc3RhcnQ9MCx0aGlzLm1hdGNoX3N0YXJ0PTAsdGhpcy5sb29rYWhlYWQ9MCx0aGlzLnByZXZfbGVuZ3RoPTAsdGhpcy5tYXhfY2hhaW5fbGVuZ3RoPTAsdGhpcy5tYXhfbGF6eV9tYXRjaD0wLHRoaXMubGV2ZWw9MCx0aGlzLnN0cmF0ZWd5PTAsdGhpcy5nb29kX21hdGNoPTAsdGhpcy5uaWNlX21hdGNoPTAsdGhpcy5keW5fbHRyZWU9bmV3IGFpLkJ1ZjE2KEwqMiksdGhpcy5keW5fZHRyZWU9bmV3IGFpLkJ1ZjE2KCgyKk4rMSkqMiksdGhpcy5ibF90cmVlPW5ldyBhaS5CdWYxNigoMipPKzEpKjIpLGwodGhpcy5keW5fbHRyZWUpLGwodGhpcy5keW5fZHRyZWUpLGwodGhpcy5ibF90cmVlKSx0aGlzLmxfZGVzYz1udWxsLHRoaXMuZF9kZXNjPW51bGwsdGhpcy5ibF9kZXNjPW51bGwsdGhpcy5ibF9jb3VudD1uZXcgYWkuQnVmMTYoSisxKSx0aGlzLmhlYXA9bmV3IGFpLkJ1ZjE2KDIqdysxKSxsKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBhaS5CdWYxNigyKncrMSksbCh0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBJdChlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/dHQoZSxJcik6KGUudG90YWxfaW49ZS50b3RhbF9vdXQ9MCxlLmRhdGFfdHlwZT1TbCx0PWUuc3RhdGUsdC5wZW5kaW5nPTAsdC5wZW5kaW5nX291dD0wLHQud3JhcDwwJiYodC53cmFwPS10LndyYXApLHQuc3RhdHVzPXQud3JhcD9oZTpWdCxlLmFkbGVyPXQud3JhcD09PTI/MDoxLHQubGFzdF9mbHVzaD1SYSxYaS5fdHJfaW5pdCh0KSxHbyl9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9SXQoZSk7cmV0dXJuIHQ9PT1HbyYmbnQoZS5zdGF0ZSksdH1mdW5jdGlvbiBPZShlLHQpe3JldHVybiFlfHwhZS5zdGF0ZXx8ZS5zdGF0ZS53cmFwIT09Mj9JcjooZS5zdGF0ZS5nemhlYWQ9dCxHbyl9ZnVuY3Rpb24gU2UoZSx0LG4scixzLHUpe2lmKCFlKXJldHVybiBJcjt2YXIgcD0xO2lmKHQ9PT1FbCYmKHQ9NikscjwwPyhwPTAscj0tcik6cj4xNSYmKHA9MixyLT0xNiksczwxfHxzPm9jfHxuIT09Y3N8fHI8OHx8cj4xNXx8dDwwfHx0Pjl8fHU8MHx8dT5yYylyZXR1cm4gdHQoZSxJcik7cj09PTgmJihyPTkpO3ZhciBTPW5ldyBQdDtyZXR1cm4gZS5zdGF0ZT1TLFMuc3RybT1lLFMud3JhcD1wLFMuZ3poZWFkPW51bGwsUy53X2JpdHM9cixTLndfc2l6ZT0xPDxTLndfYml0cyxTLndfbWFzaz1TLndfc2l6ZS0xLFMuaGFzaF9iaXRzPXMrNyxTLmhhc2hfc2l6ZT0xPDxTLmhhc2hfYml0cyxTLmhhc2hfbWFzaz1TLmhhc2hfc2l6ZS0xLFMuaGFzaF9zaGlmdD1+figoUy5oYXNoX2JpdHMrSC0xKS9IKSxTLndpbmRvdz1uZXcgYWkuQnVmOChTLndfc2l6ZSoyKSxTLmhlYWQ9bmV3IGFpLkJ1ZjE2KFMuaGFzaF9zaXplKSxTLnByZXY9bmV3IGFpLkJ1ZjE2KFMud19zaXplKSxTLmxpdF9idWZzaXplPTE8PHMrNixTLnBlbmRpbmdfYnVmX3NpemU9Uy5saXRfYnVmc2l6ZSo0LFMucGVuZGluZ19idWY9bmV3IGFpLkJ1ZjgoUy5wZW5kaW5nX2J1Zl9zaXplKSxTLmRfYnVmPTEqUy5saXRfYnVmc2l6ZSxTLmxfYnVmPSgxKzIpKlMubGl0X2J1ZnNpemUsUy5sZXZlbD10LFMuc3RyYXRlZ3k9dSxTLm1ldGhvZD1uLHVlKGUpfWZ1bmN0aW9uIFZlKGUsdCl7cmV0dXJuIFNlKGUsdCxjcyxrYyxhLGljKX1mdW5jdGlvbiB2dChlLHQpe3ZhciBuLHIscyx1O2lmKCFlfHwhZS5zdGF0ZXx8dD55bHx8dDwwKXJldHVybiBlP3R0KGUsSXIpOklyO2lmKHI9ZS5zdGF0ZSwhZS5vdXRwdXR8fCFlLmlucHV0JiZlLmF2YWlsX2luIT09MHx8ci5zdGF0dXM9PT1IdCYmdCE9PXVhKXJldHVybiB0dChlLGUuYXZhaWxfb3V0PT09MD9qczpJcik7aWYoci5zdHJtPWUsbj1yLmxhc3RfZmx1c2gsci5sYXN0X2ZsdXNoPXQsci5zdGF0dXM9PT1oZSlpZihyLndyYXA9PT0yKWUuYWRsZXI9MCxBKHIsMzEpLEEociwxMzkpLEEociw4KSxyLmd6aGVhZD8oQShyLChyLmd6aGVhZC50ZXh0PzE6MCkrKHIuZ3poZWFkLmhjcmM/MjowKSsoci5nemhlYWQuZXh0cmE/NDowKSsoci5nemhlYWQubmFtZT84OjApKyhyLmd6aGVhZC5jb21tZW50PzE2OjApKSxBKHIsci5nemhlYWQudGltZSYyNTUpLEEocixyLmd6aGVhZC50aW1lPj44JjI1NSksQShyLHIuZ3poZWFkLnRpbWU+PjE2JjI1NSksQShyLHIuZ3poZWFkLnRpbWU+PjI0JjI1NSksQShyLHIubGV2ZWw9PT05PzI6ci5zdHJhdGVneT49QXN8fHIubGV2ZWw8Mj80OjApLEEocixyLmd6aGVhZC5vcyYyNTUpLHIuZ3poZWFkLmV4dHJhJiZyLmd6aGVhZC5leHRyYS5sZW5ndGgmJihBKHIsci5nemhlYWQuZXh0cmEubGVuZ3RoJjI1NSksQShyLHIuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxyLmd6aGVhZC5oY3JjJiYoZS5hZGxlcj12byhlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLDApKSxyLmd6aW5kZXg9MCxyLnN0YXR1cz1EZSk6KEEociwwKSxBKHIsMCksQShyLDApLEEociwwKSxBKHIsMCksQShyLHIubGV2ZWw9PT05PzI6ci5zdHJhdGVneT49QXN8fHIubGV2ZWw8Mj80OjApLEEocix3dCksci5zdGF0dXM9VnQpO2Vsc2V7dmFyIHA9Y3MrKHIud19iaXRzLTg8PDQpPDw4LFM9LTE7ci5zdHJhdGVneT49QXN8fHIubGV2ZWw8Mj9TPTA6ci5sZXZlbDw2P1M9MTpyLmxldmVsPT09Nj9TPTI6Uz0zLHB8PVM8PDYsci5zdHJzdGFydCE9PTAmJihwfD1HZSkscCs9MzEtcCUzMSxyLnN0YXR1cz1WdCxUKHIscCksci5zdHJzdGFydCE9PTAmJihUKHIsZS5hZGxlcj4+PjE2KSxUKHIsZS5hZGxlciY2NTUzNSkpLGUuYWRsZXI9MX1pZihyLnN0YXR1cz09PURlKWlmKHIuZ3poZWFkLmV4dHJhKXtmb3Iocz1yLnBlbmRpbmc7ci5nemluZGV4PChyLmd6aGVhZC5leHRyYS5sZW5ndGgmNjU1MzUpJiYhKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5zJiYoZS5hZGxlcj12byhlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLXMscykpLGgoZSkscz1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSk7KUEocixyLmd6aGVhZC5leHRyYVtyLmd6aW5kZXhdJjI1NSksci5nemluZGV4Kys7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPnMmJihlLmFkbGVyPXZvKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctcyxzKSksci5nemluZGV4PT09ci5nemhlYWQuZXh0cmEubGVuZ3RoJiYoci5nemluZGV4PTAsci5zdGF0dXM9ZXQpfWVsc2Ugci5zdGF0dXM9ZXQ7aWYoci5zdGF0dXM9PT1ldClpZihyLmd6aGVhZC5uYW1lKXtzPXIucGVuZGluZztkb3tpZihyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUmJihyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+cyYmKGUuYWRsZXI9dm8oZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1zLHMpKSxoKGUpLHM9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe3U9MTticmVha31yLmd6aW5kZXg8ci5nemhlYWQubmFtZS5sZW5ndGg/dT1yLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoci5nemluZGV4KyspJjI1NTp1PTAsQShyLHUpfXdoaWxlKHUhPT0wKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+cyYmKGUuYWRsZXI9dm8oZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1zLHMpKSx1PT09MCYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPWd0KX1lbHNlIHIuc3RhdHVzPWd0O2lmKHIuc3RhdHVzPT09Z3QpaWYoci5nemhlYWQuY29tbWVudCl7cz1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPnMmJihlLmFkbGVyPXZvKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctcyxzKSksaChlKSxzPXIucGVuZGluZyxyLnBlbmRpbmc9PT1yLnBlbmRpbmdfYnVmX3NpemUpKXt1PTE7YnJlYWt9ci5nemluZGV4PHIuZ3poZWFkLmNvbW1lbnQubGVuZ3RoP3U9ci5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKSYyNTU6dT0wLEEocix1KX13aGlsZSh1IT09MCk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPnMmJihlLmFkbGVyPXZvKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctcyxzKSksdT09PTAmJihyLnN0YXR1cz1kdCl9ZWxzZSByLnN0YXR1cz1kdDtpZihyLnN0YXR1cz09PWR0JiYoci5nemhlYWQuaGNyYz8oci5wZW5kaW5nKzI+ci5wZW5kaW5nX2J1Zl9zaXplJiZoKGUpLHIucGVuZGluZysyPD1yLnBlbmRpbmdfYnVmX3NpemUmJihBKHIsZS5hZGxlciYyNTUpLEEocixlLmFkbGVyPj44JjI1NSksZS5hZGxlcj0wLHIuc3RhdHVzPVZ0KSk6ci5zdGF0dXM9VnQpLHIucGVuZGluZyE9PTApe2lmKGgoZSksZS5hdmFpbF9vdXQ9PT0wKXJldHVybiByLmxhc3RfZmx1c2g9LTEsR299ZWxzZSBpZihlLmF2YWlsX2luPT09MCYmaSh0KTw9aShuKSYmdCE9PXVhKXJldHVybiB0dChlLGpzKTtpZihyLnN0YXR1cz09PUh0JiZlLmF2YWlsX2luIT09MClyZXR1cm4gdHQoZSxqcyk7aWYoZS5hdmFpbF9pbiE9PTB8fHIubG9va2FoZWFkIT09MHx8dCE9PVJhJiZyLnN0YXR1cyE9PUh0KXt2YXIgVT1yLnN0cmF0ZWd5PT09QXM/dmUocix0KTpyLnN0cmF0ZWd5PT09bmM/cmUocix0KTppdFtyLmxldmVsXS5mdW5jKHIsdCk7aWYoKFU9PT13ZXx8VT09PUhlKSYmKHIuc3RhdHVzPUh0KSxVPT09YWV8fFU9PT13ZSlyZXR1cm4gZS5hdmFpbF9vdXQ9PT0wJiYoci5sYXN0X2ZsdXNoPS0xKSxHbztpZihVPT09a2UmJih0PT09ZWM/WGkuX3RyX2FsaWduKHIpOnQhPT15bCYmKFhpLl90cl9zdG9yZWRfYmxvY2sociwwLDAsITEpLHQ9PT16YSYmKGwoci5oZWFkKSxyLmxvb2thaGVhZD09PTAmJihyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApKSksaChlKSxlLmF2YWlsX291dD09PTApKXJldHVybiByLmxhc3RfZmx1c2g9LTEsR299cmV0dXJuIHQhPT11YT9HbzpyLndyYXA8PTA/SHM6KHIud3JhcD09PTI/KEEocixlLmFkbGVyJjI1NSksQShyLGUuYWRsZXI+PjgmMjU1KSxBKHIsZS5hZGxlcj4+MTYmMjU1KSxBKHIsZS5hZGxlcj4+MjQmMjU1KSxBKHIsZS50b3RhbF9pbiYyNTUpLEEocixlLnRvdGFsX2luPj44JjI1NSksQShyLGUudG90YWxfaW4+PjE2JjI1NSksQShyLGUudG90YWxfaW4+PjI0JjI1NSkpOihUKHIsZS5hZGxlcj4+PjE2KSxUKHIsZS5hZGxlciY2NTUzNSkpLGgoZSksci53cmFwPjAmJihyLndyYXA9LXIud3JhcCksci5wZW5kaW5nIT09MD9HbzpIcyl9ZnVuY3Rpb24gcnQoZSl7dmFyIHQ7cmV0dXJuIWV8fCFlLnN0YXRlP0lyOih0PWUuc3RhdGUuc3RhdHVzLHQhPT1oZSYmdCE9PURlJiZ0IT09ZXQmJnQhPT1ndCYmdCE9PWR0JiZ0IT09VnQmJnQhPT1IdD90dChlLElyKTooZS5zdGF0ZT1udWxsLHQ9PT1WdD90dChlLFdhKTpHbykpfWZ1bmN0aW9uIEIoZSx0KXt2YXIgbj10Lmxlbmd0aCxyLHMsdSxwLFMsVSxQLEY7aWYoIWV8fCFlLnN0YXRlfHwocj1lLnN0YXRlLHA9ci53cmFwLHA9PT0yfHxwPT09MSYmci5zdGF0dXMhPT1oZXx8ci5sb29rYWhlYWQpKXJldHVybiBJcjtmb3IocD09PTEmJihlLmFkbGVyPWNhKGUuYWRsZXIsdCxuLDApKSxyLndyYXA9MCxuPj1yLndfc2l6ZSYmKHA9PT0wJiYobChyLmhlYWQpLHIuc3Ryc3RhcnQ9MCxyLmJsb2NrX3N0YXJ0PTAsci5pbnNlcnQ9MCksRj1uZXcgYWkuQnVmOChyLndfc2l6ZSksYWkuYXJyYXlTZXQoRix0LG4tci53X3NpemUsci53X3NpemUsMCksdD1GLG49ci53X3NpemUpLFM9ZS5hdmFpbF9pbixVPWUubmV4dF9pbixQPWUuaW5wdXQsZS5hdmFpbF9pbj1uLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxqKHIpO3IubG9va2FoZWFkPj1IOyl7cz1yLnN0cnN0YXJ0LHU9ci5sb29rYWhlYWQtKEgtMSk7ZG8gci5pbnNfaD0oci5pbnNfaDw8ci5oYXNoX3NoaWZ0XnIud2luZG93W3MrSC0xXSkmci5oYXNoX21hc2ssci5wcmV2W3Mmci53X21hc2tdPXIuaGVhZFtyLmluc19oXSxyLmhlYWRbci5pbnNfaF09cyxzKys7d2hpbGUoLS11KTtyLnN0cnN0YXJ0PXMsci5sb29rYWhlYWQ9SC0xLGoocil9cmV0dXJuIHIuc3Ryc3RhcnQrPXIubG9va2FoZWFkLHIuYmxvY2tfc3RhcnQ9ci5zdHJzdGFydCxyLmluc2VydD1yLmxvb2thaGVhZCxyLmxvb2thaGVhZD0wLHIubWF0Y2hfbGVuZ3RoPXIucHJldl9sZW5ndGg9SC0xLHIubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPVUsZS5pbnB1dD1QLGUuYXZhaWxfaW49UyxyLndyYXA9cCxHb31DdC5kZWZsYXRlSW5pdD1WZSxDdC5kZWZsYXRlSW5pdDI9U2UsQ3QuZGVmbGF0ZVJlc2V0PXVlLEN0LmRlZmxhdGVSZXNldEtlZXA9SXQsQ3QuZGVmbGF0ZVNldEhlYWRlcj1PZSxDdC5kZWZsYXRlPXZ0LEN0LmRlZmxhdGVFbmQ9cnQsQ3QuZGVmbGF0ZVNldERpY3Rpb25hcnk9QixDdC5kZWZsYXRlSW5mbz0icGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7dmFyIFY9e30sdGU9X2UsZGU9ITAsb2U9ITA7dHJ5e1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxbMF0pfWNhdGNoKGUpe2RlPSExfXRyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKGUpe29lPSExfWZvcih2YXIgUmU9bmV3IHRlLkJ1ZjgoMjU2KSxqZT0wO2plPDI1NjtqZSsrKVJlW2plXT1qZT49MjUyPzY6amU+PTI0OD81OmplPj0yNDA/NDpqZT49MjI0PzM6amU+PTE5Mj8yOjE7UmVbMjU0XT1SZVsyNTRdPTEsVi5zdHJpbmcyYnVmPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixzLHUscD1lLmxlbmd0aCxTPTA7Zm9yKHM9MDtzPHA7cysrKW49ZS5jaGFyQ29kZUF0KHMpLChuJjY0NTEyKT09PTU1Mjk2JiZzKzE8cCYmKHI9ZS5jaGFyQ29kZUF0KHMrMSksKHImNjQ1MTIpPT09NTYzMjAmJihuPTY1NTM2KyhuLTU1Mjk2PDwxMCkrKHItNTYzMjApLHMrKykpLFMrPW48MTI4PzE6bjwyMDQ4PzI6bjw2NTUzNj8zOjQ7Zm9yKHQ9bmV3IHRlLkJ1ZjgoUyksdT0wLHM9MDt1PFM7cysrKW49ZS5jaGFyQ29kZUF0KHMpLChuJjY0NTEyKT09PTU1Mjk2JiZzKzE8cCYmKHI9ZS5jaGFyQ29kZUF0KHMrMSksKHImNjQ1MTIpPT09NTYzMjAmJihuPTY1NTM2KyhuLTU1Mjk2PDwxMCkrKHItNTYzMjApLHMrKykpLG48MTI4P3RbdSsrXT1uOm48MjA0OD8odFt1KytdPTE5MnxuPj4+Nix0W3UrK109MTI4fG4mNjMpOm48NjU1MzY/KHRbdSsrXT0yMjR8bj4+PjEyLHRbdSsrXT0xMjh8bj4+PjYmNjMsdFt1KytdPTEyOHxuJjYzKToodFt1KytdPTI0MHxuPj4+MTgsdFt1KytdPTEyOHxuPj4+MTImNjMsdFt1KytdPTEyOHxuPj4+NiY2Myx0W3UrK109MTI4fG4mNjMpO3JldHVybiB0fTtmdW5jdGlvbiB5ZShlLHQpe2lmKHQ8NjU1MzQmJihlLnN1YmFycmF5JiZvZXx8IWUuc3ViYXJyYXkmJmRlKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHRlLnNocmlua0J1ZihlLHQpKTtmb3IodmFyIG49IiIscj0wO3I8dDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW3JdKTtyZXR1cm4gbn1WLmJ1ZjJiaW5zdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHllKGUsZS5sZW5ndGgpfSxWLmJpbnN0cmluZzJidWY9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW5ldyB0ZS5CdWY4KGUubGVuZ3RoKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fSxWLmJ1ZjJzdHJpbmc9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLHMsdSxwPXR8fGUubGVuZ3RoLFM9bmV3IEFycmF5KHAqMik7Zm9yKHI9MCxuPTA7bjxwOyl7aWYocz1lW24rK10sczwxMjgpe1NbcisrXT1zO2NvbnRpbnVlfWlmKHU9UmVbc10sdT40KXtTW3IrK109NjU1MzMsbis9dS0xO2NvbnRpbnVlfWZvcihzJj11PT09Mj8zMTp1PT09Mz8xNTo3O3U+MSYmbjxwOylzPXM8PDZ8ZVtuKytdJjYzLHUtLTtpZih1PjEpe1NbcisrXT02NTUzMztjb250aW51ZX1zPDY1NTM2P1NbcisrXT1zOihzLT02NTUzNixTW3IrK109NTUyOTZ8cz4+MTAmMTAyMyxTW3IrK109NTYzMjB8cyYxMDIzKX1yZXR1cm4geWUoUyxyKX0sVi51dGY4Ym9yZGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHQ9dHx8ZS5sZW5ndGgsdD5lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLG49dC0xO24+PTAmJihlW25dJjE5Mik9PT0xMjg7KW4tLTtyZXR1cm4gbjwwfHxuPT09MD90Om4rUmVbZVtuXV0+dD9uOnR9O2Z1bmN0aW9uIEplKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH12YXIgVWU9SmUseXQ9Q3QsVHQ9X2UsUnQ9VixVdD1fbCxGbj1VZSxJbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLERuPTAsSm49NCxpcj0wLGZhPTEsVm49Mix4YT0tMSxZbz0wLHlpPTg7ZnVuY3Rpb24gcGkoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcGkpKXJldHVybiBuZXcgcGkoZSk7dGhpcy5vcHRpb25zPVR0LmFzc2lnbih7bGV2ZWw6eGEsbWV0aG9kOnlpLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6WW8sdG86IiJ9LGV8fHt9KTt2YXIgdD10aGlzLm9wdGlvbnM7dC5yYXcmJnQud2luZG93Qml0cz4wP3Qud2luZG93Qml0cz0tdC53aW5kb3dCaXRzOnQuZ3ppcCYmdC53aW5kb3dCaXRzPjAmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cys9MTYpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IEZuLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbj15dC5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLHQubGV2ZWwsdC5tZXRob2QsdC53aW5kb3dCaXRzLHQubWVtTGV2ZWwsdC5zdHJhdGVneSk7aWYobiE9PWlyKXRocm93IG5ldyBFcnJvcihVdFtuXSk7aWYodC5oZWFkZXImJnl0LmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLHQuaGVhZGVyKSx0LmRpY3Rpb25hcnkpe3ZhciByO2lmKHR5cGVvZiB0LmRpY3Rpb25hcnk9PSJzdHJpbmciP3I9UnQuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOkluLmNhbGwodC5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/cj1uZXcgVWludDhBcnJheSh0LmRpY3Rpb25hcnkpOnI9dC5kaWN0aW9uYXJ5LG49eXQuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHIpLG4hPT1pcil0aHJvdyBuZXcgRXJyb3IoVXRbbl0pO3RoaXMuX2RpY3Rfc2V0PSEwfX1waS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc3RybSxyPXRoaXMub3B0aW9ucy5jaHVua1NpemUscyx1O2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7dT10PT09fn50P3Q6dD09PSEwP0puOkRuLHR5cGVvZiBlPT0ic3RyaW5nIj9uLmlucHV0PVJ0LnN0cmluZzJidWYoZSk6SW4uY2FsbChlKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bi5pbnB1dD1uZXcgVWludDhBcnJheShlKTpuLmlucHV0PWUsbi5uZXh0X2luPTAsbi5hdmFpbF9pbj1uLmlucHV0Lmxlbmd0aDtkb3tpZihuLmF2YWlsX291dD09PTAmJihuLm91dHB1dD1uZXcgVHQuQnVmOChyKSxuLm5leHRfb3V0PTAsbi5hdmFpbF9vdXQ9cikscz15dC5kZWZsYXRlKG4sdSkscyE9PWZhJiZzIT09aXIpcmV0dXJuIHRoaXMub25FbmQocyksdGhpcy5lbmRlZD0hMCwhMTsobi5hdmFpbF9vdXQ9PT0wfHxuLmF2YWlsX2luPT09MCYmKHU9PT1Kbnx8dT09PVZuKSkmJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLm9uRGF0YShSdC5idWYyYmluc3RyaW5nKFR0LnNocmlua0J1ZihuLm91dHB1dCxuLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKFR0LnNocmlua0J1ZihuLm91dHB1dCxuLm5leHRfb3V0KSkpfXdoaWxlKChuLmF2YWlsX2luPjB8fG4uYXZhaWxfb3V0PT09MCkmJnMhPT1mYSk7cmV0dXJuIHU9PT1Kbj8ocz15dC5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChzKSx0aGlzLmVuZGVkPSEwLHM9PT1pcik6KHU9PT1WbiYmKHRoaXMub25FbmQoaXIpLG4uYXZhaWxfb3V0PTApLCEwKX0scGkucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxwaS5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PWlyJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9VHQuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWUsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ307ZnVuY3Rpb24gRyhlLHQpe3ZhciBuPW5ldyBwaSh0KTtpZihuLnB1c2goZSwhMCksbi5lcnIpdGhyb3cgbi5tc2d8fFV0W24uZXJyXTtyZXR1cm4gbi5yZXN1bHR9ZnVuY3Rpb24gUShlLHQpe3JldHVybiB0PXR8fHt9LHQucmF3PSEwLEcoZSx0KX1mdW5jdGlvbiBBZShlLHQpe3JldHVybiB0PXR8fHt9LHQuZ3ppcD0hMCxHKGUsdCl9eHQuRGVmbGF0ZT1waSx4dC5kZWZsYXRlPUcseHQuZGVmbGF0ZVJhdz1RLHh0Lmd6aXA9QWU7dmFyIEllPXt9LHhlPXt9LFplPTMwLG10PTEyLFFlPWZ1bmN0aW9uKHQsbil7dmFyIHIscyx1LHAsUyxVLFAsRixiZSxFZSxQZSxjdCxwdCxadCxMdCx5bix2bixOdCxzdCxqdCxXdCxubiwkdCxLbixYdDtyPXQuc3RhdGUscz10Lm5leHRfaW4sS249dC5pbnB1dCx1PXMrKHQuYXZhaWxfaW4tNSkscD10Lm5leHRfb3V0LFh0PXQub3V0cHV0LFM9cC0obi10LmF2YWlsX291dCksVT1wKyh0LmF2YWlsX291dC0yNTcpLFA9ci5kbWF4LEY9ci53c2l6ZSxiZT1yLndoYXZlLEVlPXIud25leHQsUGU9ci53aW5kb3csY3Q9ci5ob2xkLHB0PXIuYml0cyxadD1yLmxlbmNvZGUsTHQ9ci5kaXN0Y29kZSx5bj0oMTw8ci5sZW5iaXRzKS0xLHZuPSgxPDxyLmRpc3RiaXRzKS0xO2U6ZG97cHQ8MTUmJihjdCs9S25bcysrXTw8cHQscHQrPTgsY3QrPUtuW3MrK108PHB0LHB0Kz04KSxOdD1adFtjdCZ5bl07dDpmb3IoOzspe2lmKHN0PU50Pj4+MjQsY3Q+Pj49c3QscHQtPXN0LHN0PU50Pj4+MTYmMjU1LHN0PT09MClYdFtwKytdPU50JjY1NTM1O2Vsc2UgaWYoc3QmMTYpe2p0PU50JjY1NTM1LHN0Jj0xNSxzdCYmKHB0PHN0JiYoY3QrPUtuW3MrK108PHB0LHB0Kz04KSxqdCs9Y3QmKDE8PHN0KS0xLGN0Pj4+PXN0LHB0LT1zdCkscHQ8MTUmJihjdCs9S25bcysrXTw8cHQscHQrPTgsY3QrPUtuW3MrK108PHB0LHB0Kz04KSxOdD1MdFtjdCZ2bl07bjpmb3IoOzspe2lmKHN0PU50Pj4+MjQsY3Q+Pj49c3QscHQtPXN0LHN0PU50Pj4+MTYmMjU1LHN0JjE2KXtpZihXdD1OdCY2NTUzNSxzdCY9MTUscHQ8c3QmJihjdCs9S25bcysrXTw8cHQscHQrPTgscHQ8c3QmJihjdCs9S25bcysrXTw8cHQscHQrPTgpKSxXdCs9Y3QmKDE8PHN0KS0xLFd0PlApe3QubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsci5tb2RlPVplO2JyZWFrIGV9aWYoY3Q+Pj49c3QscHQtPXN0LHN0PXAtUyxXdD5zdCl7aWYoc3Q9V3Qtc3Qsc3Q+YmUmJnIuc2FuZSl7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixyLm1vZGU9WmU7YnJlYWsgZX1pZihubj0wLCR0PVBlLEVlPT09MCl7aWYobm4rPUYtc3Qsc3Q8anQpe2p0LT1zdDtkbyBYdFtwKytdPVBlW25uKytdO3doaWxlKC0tc3QpO25uPXAtV3QsJHQ9WHR9fWVsc2UgaWYoRWU8c3Qpe2lmKG5uKz1GK0VlLXN0LHN0LT1FZSxzdDxqdCl7anQtPXN0O2RvIFh0W3ArK109UGVbbm4rK107d2hpbGUoLS1zdCk7aWYobm49MCxFZTxqdCl7c3Q9RWUsanQtPXN0O2RvIFh0W3ArK109UGVbbm4rK107d2hpbGUoLS1zdCk7bm49cC1XdCwkdD1YdH19fWVsc2UgaWYobm4rPUVlLXN0LHN0PGp0KXtqdC09c3Q7ZG8gWHRbcCsrXT1QZVtubisrXTt3aGlsZSgtLXN0KTtubj1wLVd0LCR0PVh0fWZvcig7anQ+MjspWHRbcCsrXT0kdFtubisrXSxYdFtwKytdPSR0W25uKytdLFh0W3ArK109JHRbbm4rK10sanQtPTM7anQmJihYdFtwKytdPSR0W25uKytdLGp0PjEmJihYdFtwKytdPSR0W25uKytdKSl9ZWxzZXtubj1wLVd0O2RvIFh0W3ArK109WHRbbm4rK10sWHRbcCsrXT1YdFtubisrXSxYdFtwKytdPVh0W25uKytdLGp0LT0zO3doaWxlKGp0PjIpO2p0JiYoWHRbcCsrXT1YdFtubisrXSxqdD4xJiYoWHRbcCsrXT1YdFtubisrXSkpfX1lbHNlIGlmKChzdCY2NCk9PT0wKXtOdD1MdFsoTnQmNjU1MzUpKyhjdCYoMTw8c3QpLTEpXTtjb250aW51ZSBufWVsc2V7dC5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsci5tb2RlPVplO2JyZWFrIGV9YnJlYWt9fWVsc2UgaWYoKHN0JjY0KT09PTApe050PVp0WyhOdCY2NTUzNSkrKGN0JigxPDxzdCktMSldO2NvbnRpbnVlIHR9ZWxzZSBpZihzdCYzMil7ci5tb2RlPW10O2JyZWFrIGV9ZWxzZXt0Lm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixyLm1vZGU9WmU7YnJlYWsgZX1icmVha319d2hpbGUoczx1JiZwPFUpO2p0PXB0Pj4zLHMtPWp0LHB0LT1qdDw8MyxjdCY9KDE8PHB0KS0xLHQubmV4dF9pbj1zLHQubmV4dF9vdXQ9cCx0LmF2YWlsX2luPXM8dT81Kyh1LXMpOjUtKHMtdSksdC5hdmFpbF9vdXQ9cDxVPzI1NysoVS1wKToyNTctKHAtVSksci5ob2xkPWN0LHIuYml0cz1wdH0sb3Q9X2UsWWU9MTUsRnQ9ODUyLEt0PTU5Mix6dD0wLHduPTEsWnI9Mix1cj1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLFFpPVsxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNywxNywxNywxNywxOCwxOCwxOCwxOCwxOSwxOSwxOSwxOSwyMCwyMCwyMCwyMCwyMSwyMSwyMSwyMSwxNiw3Miw3OF0sdXM9WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywwLDBdLENzPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF0sSWM9ZnVuY3Rpb24odCxuLHIscyx1LHAsUyxVKXt2YXIgUD1VLmJpdHMsRj0wLGJlPTAsRWU9MCxQZT0wLGN0PTAscHQ9MCxadD0wLEx0PTAseW49MCx2bj0wLE50LHN0LGp0LFd0LG5uLCR0PW51bGwsS249MCxYdCxfbz1uZXcgb3QuQnVmMTYoWWUrMSksYmM9bmV3IG90LkJ1ZjE2KFllKzEpLEZ1PW51bGwsaHY9MCxndixEdSxWdTtmb3IoRj0wO0Y8PVllO0YrKylfb1tGXT0wO2ZvcihiZT0wO2JlPHM7YmUrKylfb1tuW3IrYmVdXSsrO2ZvcihjdD1QLFBlPVllO1BlPj0xJiZfb1tQZV09PT0wO1BlLS0pO2lmKGN0PlBlJiYoY3Q9UGUpLFBlPT09MClyZXR1cm4gdVtwKytdPTE8PDI0fDY0PDwxNnwwLHVbcCsrXT0xPDwyNHw2NDw8MTZ8MCxVLmJpdHM9MSwwO2ZvcihFZT0xO0VlPFBlJiZfb1tFZV09PT0wO0VlKyspO2ZvcihjdDxFZSYmKGN0PUVlKSxMdD0xLEY9MTtGPD1ZZTtGKyspaWYoTHQ8PD0xLEx0LT1fb1tGXSxMdDwwKXJldHVybi0xO2lmKEx0PjAmJih0PT09enR8fFBlIT09MSkpcmV0dXJuLTE7Zm9yKGJjWzFdPTAsRj0xO0Y8WWU7RisrKWJjW0YrMV09YmNbRl0rX29bRl07Zm9yKGJlPTA7YmU8cztiZSsrKW5bcitiZV0hPT0wJiYoU1tiY1tuW3IrYmVdXSsrXT1iZSk7aWYodD09PXp0PygkdD1GdT1TLFh0PTE5KTp0PT09d24/KCR0PXVyLEtuLT0yNTcsRnU9UWksaHYtPTI1NyxYdD0yNTYpOigkdD11cyxGdT1DcyxYdD0tMSksdm49MCxiZT0wLEY9RWUsbm49cCxwdD1jdCxadD0wLGp0PS0xLHluPTE8PGN0LFd0PXluLTEsdD09PXduJiZ5bj5GdHx8dD09PVpyJiZ5bj5LdClyZXR1cm4gMTtmb3IoOzspe2d2PUYtWnQsU1tiZV08WHQ/KER1PTAsVnU9U1tiZV0pOlNbYmVdPlh0PyhEdT1GdVtoditTW2JlXV0sVnU9JHRbS24rU1tiZV1dKTooRHU9MzIrNjQsVnU9MCksTnQ9MTw8Ri1adCxzdD0xPDxwdCxFZT1zdDtkbyBzdC09TnQsdVtubisodm4+Plp0KStzdF09Z3Y8PDI0fER1PDwxNnxWdXwwO3doaWxlKHN0IT09MCk7Zm9yKE50PTE8PEYtMTt2biZOdDspTnQ+Pj0xO2lmKE50IT09MD8odm4mPU50LTEsdm4rPU50KTp2bj0wLGJlKyssLS1fb1tGXT09PTApe2lmKEY9PT1QZSlicmVhaztGPW5bcitTW2JlXV19aWYoRj5jdCYmKHZuJld0KSE9PWp0KXtmb3IoWnQ9PT0wJiYoWnQ9Y3QpLG5uKz1FZSxwdD1GLVp0LEx0PTE8PHB0O3B0K1p0PFBlJiYoTHQtPV9vW3B0K1p0XSwhKEx0PD0wKSk7KXB0KyssTHQ8PD0xO2lmKHluKz0xPDxwdCx0PT09d24mJnluPkZ0fHx0PT09WnImJnluPkt0KXJldHVybiAxO2p0PXZuJld0LHVbanRdPWN0PDwyNHxwdDw8MTZ8bm4tcHwwfX1yZXR1cm4gdm4hPT0wJiYodVtubit2bl09Ri1adDw8MjR8NjQ8PDE2fDApLFUuYml0cz1jdCwwfSxUbj1fZSxUcz1tbCxtbz1RbCxSbz1RZSxxbz1JYyxPcz0wLHpzPTEsZnM9MixkYT00LEJhPTUsTWE9Nixkcz0wLFJjPTEsYXU9Mix4bz0tMixNZD0tMyxMZD0tNCxwXz0tNSxGZD04LERkPTEsVmQ9MixVZD0zLCRkPTQsSGQ9NSxqZD02LHpkPTcsV2Q9OCxHZD05LFlkPTEwLHN1PTExLFBzPTEyLHVmPTEzLHFkPTE0LGZmPTE1LEpkPTE2LEtkPTE3LFpkPTE4LFhkPTE5LGx1PTIwLGN1PTIxLFFkPTIyLGVoPTIzLHRoPTI0LG5oPTI1LHJoPTI2LGRmPTI3LGloPTI4LG9oPTI5LFJyPTMwLGFoPTMxLHZfPTMyLG1fPTg1MixfXz01OTIsYl89MTUseV89Yl87ZnVuY3Rpb24gc2goZSl7cmV0dXJuKGU+Pj4yNCYyNTUpKyhlPj4+OCY2NTI4MCkrKChlJjY1MjgwKTw8OCkrKChlJjI1NSk8PDI0KX1mdW5jdGlvbiBFXygpe3RoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgVG4uQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IFRuLkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIGxoKGUpe3ZhciB0O3JldHVybiFlfHwhZS5zdGF0ZT94bzoodD1lLnN0YXRlLGUudG90YWxfaW49ZS50b3RhbF9vdXQ9dC50b3RhbD0wLGUubXNnPSIiLHQud3JhcCYmKGUuYWRsZXI9dC53cmFwJjEpLHQubW9kZT1EZCx0Lmxhc3Q9MCx0LmhhdmVkaWN0PTAsdC5kbWF4PTMyNzY4LHQuaGVhZD1udWxsLHQuaG9sZD0wLHQuYml0cz0wLHQubGVuY29kZT10LmxlbmR5bj1uZXcgVG4uQnVmMzIobV8pLHQuZGlzdGNvZGU9dC5kaXN0ZHluPW5ldyBUbi5CdWYzMihfXyksdC5zYW5lPTEsdC5iYWNrPS0xLGRzKX1mdW5jdGlvbiBjaChlKXt2YXIgdDtyZXR1cm4hZXx8IWUuc3RhdGU/eG86KHQ9ZS5zdGF0ZSx0LndzaXplPTAsdC53aGF2ZT0wLHQud25leHQ9MCxsaChlKSl9ZnVuY3Rpb24gdWgoZSx0KXt2YXIgbixyO3JldHVybiFlfHwhZS5zdGF0ZXx8KHI9ZS5zdGF0ZSx0PDA/KG49MCx0PS10KToobj0odD4+NCkrMSx0PDQ4JiYodCY9MTUpKSx0JiYodDw4fHx0PjE1KSk/eG86KHIud2luZG93IT09bnVsbCYmci53Yml0cyE9PXQmJihyLndpbmRvdz1udWxsKSxyLndyYXA9bixyLndiaXRzPXQsY2goZSkpfWZ1bmN0aW9uIGZoKGUsdCl7dmFyIG4scjtyZXR1cm4gZT8ocj1uZXcgRV8sZS5zdGF0ZT1yLHIud2luZG93PW51bGwsbj11aChlLHQpLG4hPT1kcyYmKGUuc3RhdGU9bnVsbCksbik6eG99ZnVuY3Rpb24gU18oZSl7cmV0dXJuIGZoKGUseV8pfXZhciBkaD0hMCxoZixnZjtmdW5jdGlvbiB3XyhlKXtpZihkaCl7dmFyIHQ7Zm9yKGhmPW5ldyBUbi5CdWYzMig1MTIpLGdmPW5ldyBUbi5CdWYzMigzMiksdD0wO3Q8MTQ0OyllLmxlbnNbdCsrXT04O2Zvcig7dDwyNTY7KWUubGVuc1t0KytdPTk7Zm9yKDt0PDI4MDspZS5sZW5zW3QrK109Nztmb3IoO3Q8Mjg4OyllLmxlbnNbdCsrXT04O2Zvcihxbyh6cyxlLmxlbnMsMCwyODgsaGYsMCxlLndvcmsse2JpdHM6OX0pLHQ9MDt0PDMyOyllLmxlbnNbdCsrXT01O3FvKGZzLGUubGVucywwLDMyLGdmLDAsZS53b3JrLHtiaXRzOjV9KSxkaD0hMX1lLmxlbmNvZGU9aGYsZS5sZW5iaXRzPTksZS5kaXN0Y29kZT1nZixlLmRpc3RiaXRzPTV9ZnVuY3Rpb24gaGgoZSx0LG4scil7dmFyIHMsdT1lLnN0YXRlO3JldHVybiB1LndpbmRvdz09PW51bGwmJih1LndzaXplPTE8PHUud2JpdHMsdS53bmV4dD0wLHUud2hhdmU9MCx1LndpbmRvdz1uZXcgVG4uQnVmOCh1LndzaXplKSkscj49dS53c2l6ZT8oVG4uYXJyYXlTZXQodS53aW5kb3csdCxuLXUud3NpemUsdS53c2l6ZSwwKSx1LnduZXh0PTAsdS53aGF2ZT11LndzaXplKToocz11LndzaXplLXUud25leHQscz5yJiYocz1yKSxUbi5hcnJheVNldCh1LndpbmRvdyx0LG4tcixzLHUud25leHQpLHItPXMscj8oVG4uYXJyYXlTZXQodS53aW5kb3csdCxuLXIsciwwKSx1LnduZXh0PXIsdS53aGF2ZT11LndzaXplKToodS53bmV4dCs9cyx1LnduZXh0PT09dS53c2l6ZSYmKHUud25leHQ9MCksdS53aGF2ZTx1LndzaXplJiYodS53aGF2ZSs9cykpKSwwfWZ1bmN0aW9uIEFfKGUsdCl7dmFyIG4scixzLHUscCxTLFUsUCxGLGJlLEVlLFBlLGN0LHB0LFp0PTAsTHQseW4sdm4sTnQsc3QsanQsV3Qsbm4sJHQ9bmV3IFRuLkJ1ZjgoNCksS24sWHQsX289WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO2lmKCFlfHwhZS5zdGF0ZXx8IWUub3V0cHV0fHwhZS5pbnB1dCYmZS5hdmFpbF9pbiE9PTApcmV0dXJuIHhvO249ZS5zdGF0ZSxuLm1vZGU9PT1QcyYmKG4ubW9kZT11ZikscD1lLm5leHRfb3V0LHM9ZS5vdXRwdXQsVT1lLmF2YWlsX291dCx1PWUubmV4dF9pbixyPWUuaW5wdXQsUz1lLmF2YWlsX2luLFA9bi5ob2xkLEY9bi5iaXRzLGJlPVMsRWU9VSxubj1kcztlOmZvcig7Oylzd2l0Y2gobi5tb2RlKXtjYXNlIERkOmlmKG4ud3JhcD09PTApe24ubW9kZT11ZjticmVha31mb3IoO0Y8MTY7KXtpZihTPT09MClicmVhayBlO1MtLSxQKz1yW3UrK108PEYsRis9OH1pZihuLndyYXAmMiYmUD09PTM1NjE1KXtuLmNoZWNrPTAsJHRbMF09UCYyNTUsJHRbMV09UD4+PjgmMjU1LG4uY2hlY2s9bW8obi5jaGVjaywkdCwyLDApLFA9MCxGPTAsbi5tb2RlPVZkO2JyZWFrfWlmKG4uZmxhZ3M9MCxuLmhlYWQmJihuLmhlYWQuZG9uZT0hMSksIShuLndyYXAmMSl8fCgoKFAmMjU1KTw8OCkrKFA+PjgpKSUzMSl7ZS5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLG4ubW9kZT1ScjticmVha31pZigoUCYxNSkhPT1GZCl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9UnI7YnJlYWt9aWYoUD4+Pj00LEYtPTQsV3Q9KFAmMTUpKzgsbi53Yml0cz09PTApbi53Yml0cz1XdDtlbHNlIGlmKFd0Pm4ud2JpdHMpe2UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixuLm1vZGU9UnI7YnJlYWt9bi5kbWF4PTE8PFd0LGUuYWRsZXI9bi5jaGVjaz0xLG4ubW9kZT1QJjUxMj9ZZDpQcyxQPTAsRj0wO2JyZWFrO2Nhc2UgVmQ6Zm9yKDtGPDE2Oyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9aWYobi5mbGFncz1QLChuLmZsYWdzJjI1NSkhPT1GZCl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9UnI7YnJlYWt9aWYobi5mbGFncyY1NzM0NCl7ZS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsbi5tb2RlPVJyO2JyZWFrfW4uaGVhZCYmKG4uaGVhZC50ZXh0PVA+PjgmMSksbi5mbGFncyY1MTImJigkdFswXT1QJjI1NSwkdFsxXT1QPj4+OCYyNTUsbi5jaGVjaz1tbyhuLmNoZWNrLCR0LDIsMCkpLFA9MCxGPTAsbi5tb2RlPVVkO2Nhc2UgVWQ6Zm9yKDtGPDMyOyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9bi5oZWFkJiYobi5oZWFkLnRpbWU9UCksbi5mbGFncyY1MTImJigkdFswXT1QJjI1NSwkdFsxXT1QPj4+OCYyNTUsJHRbMl09UD4+PjE2JjI1NSwkdFszXT1QPj4+MjQmMjU1LG4uY2hlY2s9bW8obi5jaGVjaywkdCw0LDApKSxQPTAsRj0wLG4ubW9kZT0kZDtjYXNlICRkOmZvcig7RjwxNjspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fW4uaGVhZCYmKG4uaGVhZC54ZmxhZ3M9UCYyNTUsbi5oZWFkLm9zPVA+PjgpLG4uZmxhZ3MmNTEyJiYoJHRbMF09UCYyNTUsJHRbMV09UD4+PjgmMjU1LG4uY2hlY2s9bW8obi5jaGVjaywkdCwyLDApKSxQPTAsRj0wLG4ubW9kZT1IZDtjYXNlIEhkOmlmKG4uZmxhZ3MmMTAyNCl7Zm9yKDtGPDE2Oyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9bi5sZW5ndGg9UCxuLmhlYWQmJihuLmhlYWQuZXh0cmFfbGVuPVApLG4uZmxhZ3MmNTEyJiYoJHRbMF09UCYyNTUsJHRbMV09UD4+PjgmMjU1LG4uY2hlY2s9bW8obi5jaGVjaywkdCwyLDApKSxQPTAsRj0wfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmV4dHJhPW51bGwpO24ubW9kZT1qZDtjYXNlIGpkOmlmKG4uZmxhZ3MmMTAyNCYmKFBlPW4ubGVuZ3RoLFBlPlMmJihQZT1TKSxQZSYmKG4uaGVhZCYmKFd0PW4uaGVhZC5leHRyYV9sZW4tbi5sZW5ndGgsbi5oZWFkLmV4dHJhfHwobi5oZWFkLmV4dHJhPW5ldyBBcnJheShuLmhlYWQuZXh0cmFfbGVuKSksVG4uYXJyYXlTZXQobi5oZWFkLmV4dHJhLHIsdSxQZSxXdCkpLG4uZmxhZ3MmNTEyJiYobi5jaGVjaz1tbyhuLmNoZWNrLHIsUGUsdSkpLFMtPVBlLHUrPVBlLG4ubGVuZ3RoLT1QZSksbi5sZW5ndGgpKWJyZWFrIGU7bi5sZW5ndGg9MCxuLm1vZGU9emQ7Y2FzZSB6ZDppZihuLmZsYWdzJjIwNDgpe2lmKFM9PT0wKWJyZWFrIGU7UGU9MDtkbyBXdD1yW3UrUGUrK10sbi5oZWFkJiZXdCYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShXdCkpO3doaWxlKFd0JiZQZTxTKTtpZihuLmZsYWdzJjUxMiYmKG4uY2hlY2s9bW8obi5jaGVjayxyLFBlLHUpKSxTLT1QZSx1Kz1QZSxXdClicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLm5hbWU9bnVsbCk7bi5sZW5ndGg9MCxuLm1vZGU9V2Q7Y2FzZSBXZDppZihuLmZsYWdzJjQwOTYpe2lmKFM9PT0wKWJyZWFrIGU7UGU9MDtkbyBXdD1yW3UrUGUrK10sbi5oZWFkJiZXdCYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShXdCkpO3doaWxlKFd0JiZQZTxTKTtpZihuLmZsYWdzJjUxMiYmKG4uY2hlY2s9bW8obi5jaGVjayxyLFBlLHUpKSxTLT1QZSx1Kz1QZSxXdClicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmNvbW1lbnQ9bnVsbCk7bi5tb2RlPUdkO2Nhc2UgR2Q6aWYobi5mbGFncyY1MTIpe2Zvcig7RjwxNjspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fWlmKFAhPT0obi5jaGVjayY2NTUzNSkpe2UubXNnPSJoZWFkZXIgY3JjIG1pc21hdGNoIixuLm1vZGU9UnI7YnJlYWt9UD0wLEY9MH1uLmhlYWQmJihuLmhlYWQuaGNyYz1uLmZsYWdzPj45JjEsbi5oZWFkLmRvbmU9ITApLGUuYWRsZXI9bi5jaGVjaz0wLG4ubW9kZT1QczticmVhaztjYXNlIFlkOmZvcig7RjwzMjspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fWUuYWRsZXI9bi5jaGVjaz1zaChQKSxQPTAsRj0wLG4ubW9kZT1zdTtjYXNlIHN1OmlmKG4uaGF2ZWRpY3Q9PT0wKXJldHVybiBlLm5leHRfb3V0PXAsZS5hdmFpbF9vdXQ9VSxlLm5leHRfaW49dSxlLmF2YWlsX2luPVMsbi5ob2xkPVAsbi5iaXRzPUYsYXU7ZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPVBzO2Nhc2UgUHM6aWYodD09PUJhfHx0PT09TWEpYnJlYWsgZTtjYXNlIHVmOmlmKG4ubGFzdCl7UD4+Pj1GJjcsRi09RiY3LG4ubW9kZT1kZjticmVha31mb3IoO0Y8Mzspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fXN3aXRjaChuLmxhc3Q9UCYxLFA+Pj49MSxGLT0xLFAmMyl7Y2FzZSAwOm4ubW9kZT1xZDticmVhaztjYXNlIDE6aWYod18obiksbi5tb2RlPWx1LHQ9PT1NYSl7UD4+Pj0yLEYtPTI7YnJlYWsgZX1icmVhaztjYXNlIDI6bi5tb2RlPUtkO2JyZWFrO2Nhc2UgMzplLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixuLm1vZGU9UnJ9UD4+Pj0yLEYtPTI7YnJlYWs7Y2FzZSBxZDpmb3IoUD4+Pj1GJjcsRi09RiY3O0Y8MzI7KXtpZihTPT09MClicmVhayBlO1MtLSxQKz1yW3UrK108PEYsRis9OH1pZigoUCY2NTUzNSkhPT0oUD4+PjE2XjY1NTM1KSl7ZS5tc2c9ImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiLG4ubW9kZT1ScjticmVha31pZihuLmxlbmd0aD1QJjY1NTM1LFA9MCxGPTAsbi5tb2RlPWZmLHQ9PT1NYSlicmVhayBlO2Nhc2UgZmY6bi5tb2RlPUpkO2Nhc2UgSmQ6aWYoUGU9bi5sZW5ndGgsUGUpe2lmKFBlPlMmJihQZT1TKSxQZT5VJiYoUGU9VSksUGU9PT0wKWJyZWFrIGU7VG4uYXJyYXlTZXQocyxyLHUsUGUscCksUy09UGUsdSs9UGUsVS09UGUscCs9UGUsbi5sZW5ndGgtPVBlO2JyZWFrfW4ubW9kZT1QczticmVhaztjYXNlIEtkOmZvcig7RjwxNDspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fWlmKG4ubmxlbj0oUCYzMSkrMjU3LFA+Pj49NSxGLT01LG4ubmRpc3Q9KFAmMzEpKzEsUD4+Pj01LEYtPTUsbi5uY29kZT0oUCYxNSkrNCxQPj4+PTQsRi09NCxuLm5sZW4+Mjg2fHxuLm5kaXN0PjMwKXtlLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLG4ubW9kZT1ScjticmVha31uLmhhdmU9MCxuLm1vZGU9WmQ7Y2FzZSBaZDpmb3IoO24uaGF2ZTxuLm5jb2RlOyl7Zm9yKDtGPDM7KXtpZihTPT09MClicmVhayBlO1MtLSxQKz1yW3UrK108PEYsRis9OH1uLmxlbnNbX29bbi5oYXZlKytdXT1QJjcsUD4+Pj0zLEYtPTN9Zm9yKDtuLmhhdmU8MTk7KW4ubGVuc1tfb1tuLmhhdmUrK11dPTA7aWYobi5sZW5jb2RlPW4ubGVuZHluLG4ubGVuYml0cz03LEtuPXtiaXRzOm4ubGVuYml0c30sbm49cW8oT3Msbi5sZW5zLDAsMTksbi5sZW5jb2RlLDAsbi53b3JrLEtuKSxuLmxlbmJpdHM9S24uYml0cyxubil7ZS5tc2c9ImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsbi5tb2RlPVJyO2JyZWFrfW4uaGF2ZT0wLG4ubW9kZT1YZDtjYXNlIFhkOmZvcig7bi5oYXZlPG4ubmxlbituLm5kaXN0Oyl7Zm9yKDtadD1uLmxlbmNvZGVbUCYoMTw8bi5sZW5iaXRzKS0xXSxMdD1adD4+PjI0LHluPVp0Pj4+MTYmMjU1LHZuPVp0JjY1NTM1LCEoTHQ8PUYpOyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9aWYodm48MTYpUD4+Pj1MdCxGLT1MdCxuLmxlbnNbbi5oYXZlKytdPXZuO2Vsc2V7aWYodm49PT0xNil7Zm9yKFh0PUx0KzI7RjxYdDspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fWlmKFA+Pj49THQsRi09THQsbi5oYXZlPT09MCl7ZS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLG4ubW9kZT1ScjticmVha31XdD1uLmxlbnNbbi5oYXZlLTFdLFBlPTMrKFAmMyksUD4+Pj0yLEYtPTJ9ZWxzZSBpZih2bj09PTE3KXtmb3IoWHQ9THQrMztGPFh0Oyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9UD4+Pj1MdCxGLT1MdCxXdD0wLFBlPTMrKFAmNyksUD4+Pj0zLEYtPTN9ZWxzZXtmb3IoWHQ9THQrNztGPFh0Oyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9UD4+Pj1MdCxGLT1MdCxXdD0wLFBlPTExKyhQJjEyNyksUD4+Pj03LEYtPTd9aWYobi5oYXZlK1BlPm4ubmxlbituLm5kaXN0KXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPVJyO2JyZWFrfWZvcig7UGUtLTspbi5sZW5zW24uaGF2ZSsrXT1XdH19aWYobi5tb2RlPT09UnIpYnJlYWs7aWYobi5sZW5zWzI1Nl09PT0wKXtlLm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixuLm1vZGU9UnI7YnJlYWt9aWYobi5sZW5iaXRzPTksS249e2JpdHM6bi5sZW5iaXRzfSxubj1xbyh6cyxuLmxlbnMsMCxuLm5sZW4sbi5sZW5jb2RlLDAsbi53b3JrLEtuKSxuLmxlbmJpdHM9S24uYml0cyxubil7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsbi5tb2RlPVJyO2JyZWFrfWlmKG4uZGlzdGJpdHM9NixuLmRpc3Rjb2RlPW4uZGlzdGR5bixLbj17Yml0czpuLmRpc3RiaXRzfSxubj1xbyhmcyxuLmxlbnMsbi5ubGVuLG4ubmRpc3Qsbi5kaXN0Y29kZSwwLG4ud29yayxLbiksbi5kaXN0Yml0cz1Lbi5iaXRzLG5uKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0IixuLm1vZGU9UnI7YnJlYWt9aWYobi5tb2RlPWx1LHQ9PT1NYSlicmVhayBlO2Nhc2UgbHU6bi5tb2RlPWN1O2Nhc2UgY3U6aWYoUz49NiYmVT49MjU4KXtlLm5leHRfb3V0PXAsZS5hdmFpbF9vdXQ9VSxlLm5leHRfaW49dSxlLmF2YWlsX2luPVMsbi5ob2xkPVAsbi5iaXRzPUYsUm8oZSxFZSkscD1lLm5leHRfb3V0LHM9ZS5vdXRwdXQsVT1lLmF2YWlsX291dCx1PWUubmV4dF9pbixyPWUuaW5wdXQsUz1lLmF2YWlsX2luLFA9bi5ob2xkLEY9bi5iaXRzLG4ubW9kZT09PVBzJiYobi5iYWNrPS0xKTticmVha31mb3Iobi5iYWNrPTA7WnQ9bi5sZW5jb2RlW1AmKDE8PG4ubGVuYml0cyktMV0sTHQ9WnQ+Pj4yNCx5bj1adD4+PjE2JjI1NSx2bj1adCY2NTUzNSwhKEx0PD1GKTspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fWlmKHluJiYoeW4mMjQwKT09PTApe2ZvcihOdD1MdCxzdD15bixqdD12bjtadD1uLmxlbmNvZGVbanQrKChQJigxPDxOdCtzdCktMSk+Pk50KV0sTHQ9WnQ+Pj4yNCx5bj1adD4+PjE2JjI1NSx2bj1adCY2NTUzNSwhKE50K0x0PD1GKTspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFArPXJbdSsrXTw8RixGKz04fVA+Pj49TnQsRi09TnQsbi5iYWNrKz1OdH1pZihQPj4+PUx0LEYtPUx0LG4uYmFjays9THQsbi5sZW5ndGg9dm4seW49PT0wKXtuLm1vZGU9cmg7YnJlYWt9aWYoeW4mMzIpe24uYmFjaz0tMSxuLm1vZGU9UHM7YnJlYWt9aWYoeW4mNjQpe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLG4ubW9kZT1ScjticmVha31uLmV4dHJhPXluJjE1LG4ubW9kZT1RZDtjYXNlIFFkOmlmKG4uZXh0cmEpe2ZvcihYdD1uLmV4dHJhO0Y8WHQ7KXtpZihTPT09MClicmVhayBlO1MtLSxQKz1yW3UrK108PEYsRis9OH1uLmxlbmd0aCs9UCYoMTw8bi5leHRyYSktMSxQPj4+PW4uZXh0cmEsRi09bi5leHRyYSxuLmJhY2srPW4uZXh0cmF9bi53YXM9bi5sZW5ndGgsbi5tb2RlPWVoO2Nhc2UgZWg6Zm9yKDtadD1uLmRpc3Rjb2RlW1AmKDE8PG4uZGlzdGJpdHMpLTFdLEx0PVp0Pj4+MjQseW49WnQ+Pj4xNiYyNTUsdm49WnQmNjU1MzUsIShMdDw9Rik7KXtpZihTPT09MClicmVhayBlO1MtLSxQKz1yW3UrK108PEYsRis9OH1pZigoeW4mMjQwKT09PTApe2ZvcihOdD1MdCxzdD15bixqdD12bjtadD1uLmRpc3Rjb2RlW2p0KygoUCYoMTw8TnQrc3QpLTEpPj5OdCldLEx0PVp0Pj4+MjQseW49WnQ+Pj4xNiYyNTUsdm49WnQmNjU1MzUsIShOdCtMdDw9Rik7KXtpZihTPT09MClicmVhayBlO1MtLSxQKz1yW3UrK108PEYsRis9OH1QPj4+PU50LEYtPU50LG4uYmFjays9TnR9aWYoUD4+Pj1MdCxGLT1MdCxuLmJhY2srPUx0LHluJjY0KXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixuLm1vZGU9UnI7YnJlYWt9bi5vZmZzZXQ9dm4sbi5leHRyYT15biYxNSxuLm1vZGU9dGg7Y2FzZSB0aDppZihuLmV4dHJhKXtmb3IoWHQ9bi5leHRyYTtGPFh0Oyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9bi5vZmZzZXQrPVAmKDE8PG4uZXh0cmEpLTEsUD4+Pj1uLmV4dHJhLEYtPW4uZXh0cmEsbi5iYWNrKz1uLmV4dHJhfWlmKG4ub2Zmc2V0Pm4uZG1heCl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9UnI7YnJlYWt9bi5tb2RlPW5oO2Nhc2Ugbmg6aWYoVT09PTApYnJlYWsgZTtpZihQZT1FZS1VLG4ub2Zmc2V0PlBlKXtpZihQZT1uLm9mZnNldC1QZSxQZT5uLndoYXZlJiZuLnNhbmUpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPVJyO2JyZWFrfVBlPm4ud25leHQ/KFBlLT1uLnduZXh0LGN0PW4ud3NpemUtUGUpOmN0PW4ud25leHQtUGUsUGU+bi5sZW5ndGgmJihQZT1uLmxlbmd0aCkscHQ9bi53aW5kb3d9ZWxzZSBwdD1zLGN0PXAtbi5vZmZzZXQsUGU9bi5sZW5ndGg7UGU+VSYmKFBlPVUpLFUtPVBlLG4ubGVuZ3RoLT1QZTtkbyBzW3ArK109cHRbY3QrK107d2hpbGUoLS1QZSk7bi5sZW5ndGg9PT0wJiYobi5tb2RlPWN1KTticmVhaztjYXNlIHJoOmlmKFU9PT0wKWJyZWFrIGU7c1twKytdPW4ubGVuZ3RoLFUtLSxuLm1vZGU9Y3U7YnJlYWs7Y2FzZSBkZjppZihuLndyYXApe2Zvcig7RjwzMjspe2lmKFM9PT0wKWJyZWFrIGU7Uy0tLFB8PXJbdSsrXTw8RixGKz04fWlmKEVlLT1VLGUudG90YWxfb3V0Kz1FZSxuLnRvdGFsKz1FZSxFZSYmKGUuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP21vKG4uY2hlY2sscyxFZSxwLUVlKTpUcyhuLmNoZWNrLHMsRWUscC1FZSkpLEVlPVUsKG4uZmxhZ3M/UDpzaChQKSkhPT1uLmNoZWNrKXtlLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLG4ubW9kZT1ScjticmVha31QPTAsRj0wfW4ubW9kZT1paDtjYXNlIGloOmlmKG4ud3JhcCYmbi5mbGFncyl7Zm9yKDtGPDMyOyl7aWYoUz09PTApYnJlYWsgZTtTLS0sUCs9clt1KytdPDxGLEYrPTh9aWYoUCE9PShuLnRvdGFsJjQyOTQ5NjcyOTUpKXtlLm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsbi5tb2RlPVJyO2JyZWFrfVA9MCxGPTB9bi5tb2RlPW9oO2Nhc2Ugb2g6bm49UmM7YnJlYWsgZTtjYXNlIFJyOm5uPU1kO2JyZWFrIGU7Y2FzZSBhaDpyZXR1cm4gTGQ7Y2FzZSB2XzpkZWZhdWx0OnJldHVybiB4b31yZXR1cm4gZS5uZXh0X291dD1wLGUuYXZhaWxfb3V0PVUsZS5uZXh0X2luPXUsZS5hdmFpbF9pbj1TLG4uaG9sZD1QLG4uYml0cz1GLChuLndzaXplfHxFZSE9PWUuYXZhaWxfb3V0JiZuLm1vZGU8UnImJihuLm1vZGU8ZGZ8fHQhPT1kYSkpJiZoaChlLGUub3V0cHV0LGUubmV4dF9vdXQsRWUtZS5hdmFpbF9vdXQpLGJlLT1lLmF2YWlsX2luLEVlLT1lLmF2YWlsX291dCxlLnRvdGFsX2luKz1iZSxlLnRvdGFsX291dCs9RWUsbi50b3RhbCs9RWUsbi53cmFwJiZFZSYmKGUuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP21vKG4uY2hlY2sscyxFZSxlLm5leHRfb3V0LUVlKTpUcyhuLmNoZWNrLHMsRWUsZS5uZXh0X291dC1FZSkpLGUuZGF0YV90eXBlPW4uYml0cysobi5sYXN0PzY0OjApKyhuLm1vZGU9PT1Qcz8xMjg6MCkrKG4ubW9kZT09PWx1fHxuLm1vZGU9PT1mZj8yNTY6MCksKGJlPT09MCYmRWU9PT0wfHx0PT09ZGEpJiZubj09PWRzJiYobm49cF8pLG5ufWZ1bmN0aW9uIENfKGUpe2lmKCFlfHwhZS5zdGF0ZSlyZXR1cm4geG87dmFyIHQ9ZS5zdGF0ZTtyZXR1cm4gdC53aW5kb3cmJih0LndpbmRvdz1udWxsKSxlLnN0YXRlPW51bGwsZHN9ZnVuY3Rpb24gVF8oZSx0KXt2YXIgbjtyZXR1cm4hZXx8IWUuc3RhdGV8fChuPWUuc3RhdGUsKG4ud3JhcCYyKT09PTApP3hvOihuLmhlYWQ9dCx0LmRvbmU9ITEsZHMpfWZ1bmN0aW9uIE9fKGUsdCl7dmFyIG49dC5sZW5ndGgscixzLHU7cmV0dXJuIWV8fCFlLnN0YXRlfHwocj1lLnN0YXRlLHIud3JhcCE9PTAmJnIubW9kZSE9PXN1KT94bzpyLm1vZGU9PT1zdSYmKHM9MSxzPVRzKHMsdCxuLDApLHMhPT1yLmNoZWNrKT9NZDoodT1oaChlLHQsbixuKSx1PyhyLm1vZGU9YWgsTGQpOihyLmhhdmVkaWN0PTEsZHMpKX14ZS5pbmZsYXRlUmVzZXQ9Y2gseGUuaW5mbGF0ZVJlc2V0Mj11aCx4ZS5pbmZsYXRlUmVzZXRLZWVwPWxoLHhlLmluZmxhdGVJbml0PVNfLHhlLmluZmxhdGVJbml0Mj1maCx4ZS5pbmZsYXRlPUFfLHhlLmluZmxhdGVFbmQ9Q18seGUuaW5mbGF0ZUdldEhlYWRlcj1UXyx4ZS5pbmZsYXRlU2V0RGljdGlvbmFyeT1PXyx4ZS5pbmZsYXRlSW5mbz0icGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSI7dmFyIGdoPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O2Z1bmN0aW9uIFBfKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9dmFyIE5fPVBfLGFjPXhlLHhjPV9lLHV1PVYsc2k9Z2gscGY9X2wsa189VWUsSV89Tl8scGg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB3bChlKXtpZighKHRoaXMgaW5zdGFuY2VvZiB3bCkpcmV0dXJuIG5ldyB3bChlKTt0aGlzLm9wdGlvbnM9eGMuYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSxlfHx7fSk7dmFyIHQ9dGhpcy5vcHRpb25zO3QucmF3JiZ0LndpbmRvd0JpdHM+PTAmJnQud2luZG93Qml0czwxNiYmKHQud2luZG93Qml0cz0tdC53aW5kb3dCaXRzLHQud2luZG93Qml0cz09PTAmJih0LndpbmRvd0JpdHM9LTE1KSksdC53aW5kb3dCaXRzPj0wJiZ0LndpbmRvd0JpdHM8MTYmJiEoZSYmZS53aW5kb3dCaXRzKSYmKHQud2luZG93Qml0cys9MzIpLHQud2luZG93Qml0cz4xNSYmdC53aW5kb3dCaXRzPDQ4JiYodC53aW5kb3dCaXRzJjE1KT09PTAmJih0LndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBrXyx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIG49YWMuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0LndpbmRvd0JpdHMpO2lmKG4hPT1zaS5aX09LKXRocm93IG5ldyBFcnJvcihwZltuXSk7aWYodGhpcy5oZWFkZXI9bmV3IElfLGFjLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKSx0LmRpY3Rpb25hcnkmJih0eXBlb2YgdC5kaWN0aW9uYXJ5PT0ic3RyaW5nIj90LmRpY3Rpb25hcnk9dXUuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOnBoLmNhbGwodC5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSImJih0LmRpY3Rpb25hcnk9bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KSksdC5yYXcmJihuPWFjLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx0LmRpY3Rpb25hcnkpLG4hPT1zaS5aX09LKSkpdGhyb3cgbmV3IEVycm9yKHBmW25dKX13bC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc3RybSxyPXRoaXMub3B0aW9ucy5jaHVua1NpemUscz10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSx1LHAsUyxVLFAsRj0hMTtpZih0aGlzLmVuZGVkKXJldHVybiExO3A9dD09PX5+dD90OnQ9PT0hMD9zaS5aX0ZJTklTSDpzaS5aX05PX0ZMVVNILHR5cGVvZiBlPT0ic3RyaW5nIj9uLmlucHV0PXV1LmJpbnN0cmluZzJidWYoZSk6cGguY2FsbChlKT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bi5pbnB1dD1uZXcgVWludDhBcnJheShlKTpuLmlucHV0PWUsbi5uZXh0X2luPTAsbi5hdmFpbF9pbj1uLmlucHV0Lmxlbmd0aDtkb3tpZihuLmF2YWlsX291dD09PTAmJihuLm91dHB1dD1uZXcgeGMuQnVmOChyKSxuLm5leHRfb3V0PTAsbi5hdmFpbF9vdXQ9ciksdT1hYy5pbmZsYXRlKG4sc2kuWl9OT19GTFVTSCksdT09PXNpLlpfTkVFRF9ESUNUJiZzJiYodT1hYy5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0scykpLHU9PT1zaS5aX0JVRl9FUlJPUiYmRj09PSEwJiYodT1zaS5aX09LLEY9ITEpLHUhPT1zaS5aX1NUUkVBTV9FTkQmJnUhPT1zaS5aX09LKXJldHVybiB0aGlzLm9uRW5kKHUpLHRoaXMuZW5kZWQ9ITAsITE7bi5uZXh0X291dCYmKG4uYXZhaWxfb3V0PT09MHx8dT09PXNpLlpfU1RSRUFNX0VORHx8bi5hdmFpbF9pbj09PTAmJihwPT09c2kuWl9GSU5JU0h8fHA9PT1zaS5aX1NZTkNfRkxVU0gpKSYmKHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciPyhTPXV1LnV0Zjhib3JkZXIobi5vdXRwdXQsbi5uZXh0X291dCksVT1uLm5leHRfb3V0LVMsUD11dS5idWYyc3RyaW5nKG4ub3V0cHV0LFMpLG4ubmV4dF9vdXQ9VSxuLmF2YWlsX291dD1yLVUsVSYmeGMuYXJyYXlTZXQobi5vdXRwdXQsbi5vdXRwdXQsUyxVLDApLHRoaXMub25EYXRhKFApKTp0aGlzLm9uRGF0YSh4Yy5zaHJpbmtCdWYobi5vdXRwdXQsbi5uZXh0X291dCkpKSxuLmF2YWlsX2luPT09MCYmbi5hdmFpbF9vdXQ9PT0wJiYoRj0hMCl9d2hpbGUoKG4uYXZhaWxfaW4+MHx8bi5hdmFpbF9vdXQ9PT0wKSYmdSE9PXNpLlpfU1RSRUFNX0VORCk7cmV0dXJuIHU9PT1zaS5aX1NUUkVBTV9FTkQmJihwPXNpLlpfRklOSVNIKSxwPT09c2kuWl9GSU5JU0g/KHU9YWMuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMub25FbmQodSksdGhpcy5lbmRlZD0hMCx1PT09c2kuWl9PSyk6KHA9PT1zaS5aX1NZTkNfRkxVU0gmJih0aGlzLm9uRW5kKHNpLlpfT0spLG4uYXZhaWxfb3V0PTApLCEwKX0sd2wucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSx3bC5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PXNpLlpfT0smJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD14Yy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTtmdW5jdGlvbiB2ZihlLHQpe3ZhciBuPW5ldyB3bCh0KTtpZihuLnB1c2goZSwhMCksbi5lcnIpdGhyb3cgbi5tc2d8fHBmW24uZXJyXTtyZXR1cm4gbi5yZXN1bHR9ZnVuY3Rpb24gUl8oZSx0KXtyZXR1cm4gdD10fHx7fSx0LnJhdz0hMCx2ZihlLHQpfUllLkluZmxhdGU9d2wsSWUuaW5mbGF0ZT12ZixJZS5pbmZsYXRlUmF3PVJfLEllLnVuZ3ppcD12Zjt2YXIgeF89X2UuYXNzaWduLEJfPXh0LE1fPUllLExfPWdoLHZoPXt9O3hfKHZoLEJfLE1fLExfKTt2YXIgbWg9dmg7bGV0IEZfPSJ1cHgycHgiLERfPVt7bmFtZToidXB4Iix0eXBlOltOdW1iZXIsU3RyaW5nXSxyZXF1aXJlZDohMH1dLFZfPTFlLTQsVV89NzUwLF9oPSExLG1mPTAsYmg9MCx5aD05NjAsRWg9Mzc1LFNoPTc1MDtmdW5jdGlvbiAkXygpe2xldHtwbGF0Zm9ybTplLHBpeGVsUmF0aW86dCx3aW5kb3dXaWR0aDpufT1ZaSgpO21mPW4sYmg9dCxfaD1lPT09ImlvcyJ9ZnVuY3Rpb24gX2YoZSx0KXtsZXQgbj1OdW1iZXIoZSk7cmV0dXJuIGlzTmFOKG4pP3Q6bn1mdW5jdGlvbiBIXygpe2xldCBlPUkuZ2xvYmFsU3R5bGV8fHt9O3loPV9mKGUucnB4Q2FsY01heERldmljZVdpZHRoLDk2MCksRWg9X2YoZS5ycHhDYWxjQmFzZURldmljZVdpZHRoLDM3NSksU2g9X2YoZS5ycHhDYWxjQmFzZURldmljZVdpZHRoLDc1MCl9bGV0IGpfPUJ0KEZfLChlLHQpPT57aWYobWY9PT0wJiYoJF8oKSxIXygpKSxlPU51bWJlcihlKSxlPT09MClyZXR1cm4gMDtsZXQgbj10fHxtZjtuPWU9PT1TaHx8bjw9eWg/bjpFaDtsZXQgcj1lL1VfKm47cmV0dXJuIHI8MCYmKHI9LXIpLHI9TWF0aC5mbG9vcihyK1ZfKSxyPT09MCYmKGJoPT09MXx8IV9oP3I9MTpyPS41KSxlPDA/LXI6cn0sRF8pLHpfPSJhZGRJbnRlcmNlcHRvciIsV189InJlbW92ZUludGVyY2VwdG9yIix3aD1be25hbWU6Im1ldGhvZCIsdHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9XSxHXz13aDtmdW5jdGlvbiBBaChlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2gobj0+e3EuaXNGdW5jdGlvbih0W25dKSYmKGVbbl09WV8oZVtuXSx0W25dKSl9KX1mdW5jdGlvbiBDaChlLHQpeyFlfHwhdHx8T2JqZWN0LmtleXModCkuZm9yRWFjaChuPT57bGV0IHI9ZVtuXSxzPXRbbl07cS5pc0FycmF5KHIpJiZxLmlzRnVuY3Rpb24ocykmJnEucmVtb3ZlKHIscyl9KX1mdW5jdGlvbiBZXyhlLHQpe2xldCBuPXQ/ZT9lLmNvbmNhdCh0KTpxLmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbiYmcV8obil9ZnVuY3Rpb24gcV8oZSl7bGV0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5pbmRleE9mKGVbbl0pPT09LTEmJnQucHVzaChlW25dKTtyZXR1cm4gdH1sZXQgSl89QnQoel8sKGUsdCk9PntxLmlzU3RyaW5nKGUpJiZxLmlzUGxhaW5PYmplY3QodCk/QWgoX3JbZV18fChfcltlXT17fSksdCk6cS5pc1BsYWluT2JqZWN0KGUpJiZBaChRbixlKX0sd2gpLEtfPUJ0KFdfLChlLHQpPT57cS5pc1N0cmluZyhlKT9xLmlzUGxhaW5PYmplY3QodCk/Q2goX3JbZV0sdCk6ZGVsZXRlIF9yW2VdOnEuaXNQbGFpbk9iamVjdChlKSYmQ2goUW4sZSl9LEdfKSxaXz17fSxYXz0iJG9uIixUaD1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sUV89IiRvbmNlIixlYj1UaCx0Yj0iJG9mZiIsbmI9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0scmI9IiRlbWl0IixpYj1be25hbWU6ImV2ZW50Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLEFsPW5ldyBuZS5FbWl0dGVyLG9iPUJ0KFhfLChlLHQpPT4oQWwub24oZSx0KSwoKT0+QWwub2ZmKGUsdCkpLFRoKSxhYj1CdChRXywoZSx0KT0+KEFsLm9uY2UoZSx0KSwoKT0+QWwub2ZmKGUsdCkpLGViKSxzYj1CdCh0YiwoZSx0KT0+e2lmKCFlKXtBbC5lPXt9O3JldHVybn1xLmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKG49PkFsLm9mZihuLHQpKX0sbmIpLGxiPUJ0KHJiLChlLC4uLnQpPT57QWwuZW1pdChlLC4uLnQpfSxpYiksT2g9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxjYj0iY3JlYXRlVmlkZW9Db250ZXh0Iix1Yj0iY3JlYXRlTWFwQ29udGV4dCIsZmI9T2gsZGI9ImNyZWF0ZUNhbnZhc0NvbnRleHQiLGhiPVt7bmFtZToiY2FudmFzSWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fV0sZ2I9ImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IixwYj0iY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiLHZiPU9oLmNvbmNhdCh7bmFtZToiY29tcG9uZW50SW5zdGFuY2UiLHR5cGU6T2JqZWN0fSksbWI9Wy41LC44LDEsMS4yNSwxLjUsMl07Y2xhc3MgYmZ7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1wbGF5KCl7a3IodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGxheSIpfXBhdXNlKCl7a3IodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGF1c2UiKX1zdG9wKCl7a3IodGhpcy5pZCx0aGlzLnBhZ2VJZCwic3RvcCIpfXNlZWsodCl7a3IodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VlayIse3Bvc2l0aW9uOnR9KX1zZW5kRGFubXUodCl7a3IodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VuZERhbm11Iix0KX1wbGF5YmFja1JhdGUodCl7fm1iLmluZGV4T2YodCl8fCh0PTEpLGtyKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXliYWNrUmF0ZSIse3JhdGU6dH0pfXJlcXVlc3RGdWxsU2NyZWVuKHQ9e30pe2tyKHRoaXMuaWQsdGhpcy5wYWdlSWQsInJlcXVlc3RGdWxsU2NyZWVuIix0KX1leGl0RnVsbFNjcmVlbigpe2tyKHRoaXMuaWQsdGhpcy5wYWdlSWQsImV4aXRGdWxsU2NyZWVuIil9c2hvd1N0YXR1c0Jhcigpe2tyKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNob3dTdGF0dXNCYXIiKX1oaWRlU3RhdHVzQmFyKCl7a3IodGhpcy5pZCx0aGlzLnBhZ2VJZCwiaGlkZVN0YXR1c0JhciIpfX1sZXQgX2I9QnQoY2IsKGUsdCk9PnQ/bmV3IGJmKGUsbHIodCkpOm5ldyBiZihlLGxyKHJpKCkpKSksYmI9KGUsdCk9PntsZXQgbj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KG4pP2UuZmFpbCYmZS5mYWlsKHQpOmUuc3VjY2VzcyYmZS5zdWNjZXNzKHQpLGUuY29tcGxldGUmJmUuY29tcGxldGUodCl9LFZpPShlLHQsbixyKT0+e01pKGUsdCxuLHIscz0+e3ImJmJiKHIscyl9KX07Y2xhc3MgeWZ7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1nZXRDZW50ZXJMb2NhdGlvbih0KXtWaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9bW92ZVRvTG9jYXRpb24odCl7VmkodGhpcy5pZCx0aGlzLnBhZ2VJZCwibW92ZVRvTG9jYXRpb24iLHQpfWdldFNjYWxlKHQpe1ZpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImdldFNjYWxlIix0KX1nZXRSZWdpb24odCl7VmkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiZ2V0UmVnaW9uIix0KX1pbmNsdWRlUG9pbnRzKHQpe1ZpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluY2x1ZGVQb2ludHMiLHQpfXRyYW5zbGF0ZU1hcmtlcih0KXtWaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJ0cmFuc2xhdGVNYXJrZXIiLHQpfSRnZXRBcHBNYXAoKXtyZXR1cm4gby5tYXBzLmdldE1hcEJ5SWQodGhpcy5wYWdlSWQrIi1tYXAtIit0aGlzLmlkKX1hZGRDdXN0b21MYXllcih0KXtWaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJhZGRDdXN0b21MYXllciIsdCl9cmVtb3ZlQ3VzdG9tTGF5ZXIodCl7VmkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlQ3VzdG9tTGF5ZXIiLHQpfWFkZEdyb3VuZE92ZXJsYXkodCl7VmkodGhpcy5pZCx0aGlzLnBhZ2VJZCwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9cmVtb3ZlR3JvdW5kT3ZlcmxheSh0KXtWaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX11cGRhdGVHcm91bmRPdmVybGF5KHQpe1ZpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLHQpfWluaXRNYXJrZXJDbHVzdGVyKHQpe1ZpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImluaXRNYXJrZXJDbHVzdGVyIix0KX1hZGRNYXJrZXJzKHQpe1ZpKHRoaXMuaWQsdGhpcy5wYWdlSWQsImFkZE1hcmtlcnMiLHQpfXJlbW92ZU1hcmtlcnModCl7VmkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVtb3ZlTWFya2VycyIsdCl9bW92ZUFsb25nKHQpe1ZpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm1vdmVBbG9uZyIsdCl9c2V0TG9jTWFya2VySWNvbih0KXtWaSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZXRMb2NNYXJrZXJJY29uIix0KX1vcGVuTWFwQXBwKHQpe1ZpKHRoaXMuaWQsdGhpcy5wYWdlSWQsIm9wZW5NYXBBcHAiLHQpfW9uKHQsbil7VmkodGhpcy5pZCx0aGlzLnBhZ2VJZCwib24iLHtuYW1lOnQsY2FsbGJhY2s6bn0pfX1sZXQgeWI9QnQodWIsKGUsdCk9PnQ/bmV3IHlmKGUsbHIodCkpOm5ldyB5ZihlLGxyKHJpKCkpKSxmYik7ZnVuY3Rpb24gV3MoZSx0KXtyZXR1cm4gZnVuY3Rpb24obixyKXtuP3JbZV09TWF0aC5yb3VuZChuKTp0eXBlb2YgdCE9InVuZGVmaW5lZCImJihyW2VdPXQpfX1sZXQgUGg9V3MoIndpZHRoIiksTmg9V3MoImhlaWdodCIpLEViPSJjYW52YXNHZXRJbWFnZURhdGEiLGtoPXtmb3JtYXRBcmdzOnt4OldzKCJ4IikseTpXcygieSIpLHdpZHRoOlBoLGhlaWdodDpOaH19LEloPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSx5Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH0sd2lkdGg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfX0sU2I9ImNhbnZhc1B1dEltYWdlRGF0YSIsd2I9a2gsQWI9cS5leHRlbmQoe2RhdGE6e3R5cGU6VWludDhDbGFtcGVkQXJyYXkscmVxdWlyZWQ6ITB9fSxJaCx7aGVpZ2h0Ont0eXBlOk51bWJlcn19KSxSaD17UE5HOiJwbmciLEpQRzoianBnIixKUEVHOiJqcGcifSxDYj0iY2FudmFzVG9UZW1wRmlsZVBhdGgiLFRiPXtmb3JtYXRBcmdzOnt4OldzKCJ4IiwwKSx5OldzKCJ5IiwwKSx3aWR0aDpQaCxoZWlnaHQ6TmgsZGVzdFdpZHRoOldzKCJkZXN0V2lkdGgiKSxkZXN0SGVpZ2h0OldzKCJkZXN0SGVpZ2h0IiksZmlsZVR5cGUoZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKTtsZXQgbj1SaFtlXTtufHwobj1SaC5QTkcpLHQuZmlsZVR5cGU9bn0scXVhbGl0eShlLHQpe3QucXVhbGl0eT1lJiZlPjAmJmU8MT9lOjF9fX0sT2I9e3g6TnVtYmVyLHk6TnVtYmVyLHdpZHRoOk51bWJlcixoZWlnaHQ6TnVtYmVyLGRlc3RXaWR0aDpOdW1iZXIsZGVzdEhlaWdodDpOdW1iZXIsY2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTpTdHJpbmcscXVhbGl0eTpOdW1iZXJ9O2Z1bmN0aW9uIGZ1KGUsdCxuLHIscyl7ZnQuaW52b2tlVmlld01ldGhvZChgY2FudmFzLiR7ZX1gLHt0eXBlOm4sZGF0YTpyfSx0LHU9PntzJiZzKHUpfSl9dmFyIFBiPVsic2NhbGUiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJzZXRUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iXSxOYj1bImRyYXdJbWFnZSIsImZpbGxUZXh0IiwiZmlsbCIsInN0cm9rZSIsImZpbGxSZWN0Iiwic3Ryb2tlUmVjdCIsImNsZWFyUmVjdCIsInN0cm9rZVRleHQiXSxrYj1bInNldEZpbGxTdHlsZSIsInNldFRleHRBbGlnbiIsInNldFN0cm9rZVN0eWxlIiwic2V0R2xvYmFsQWxwaGEiLCJzZXRTaGFkb3ciLCJzZXRGb250U2l6ZSIsInNldExpbmVDYXAiLCJzZXRMaW5lSm9pbiIsInNldExpbmVXaWR0aCIsInNldE1pdGVyTGltaXQiLCJzZXRUZXh0QmFzZWxpbmUiLCJzZXRMaW5lRGFzaCJdO2Z1bmN0aW9uIEliKGUsdCl7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gci5mb250PXQsci5tZWFzdXJlVGV4dChlKS53aWR0aHx8MH1sZXQgeGg9e2FsaWNlYmx1ZToiI2YwZjhmZiIsYW50aXF1ZXdoaXRlOiIjZmFlYmQ3IixhcXVhOiIjMDBmZmZmIixhcXVhbWFyaW5lOiIjN2ZmZmQ0IixhenVyZToiI2YwZmZmZiIsYmVpZ2U6IiNmNWY1ZGMiLGJpc3F1ZToiI2ZmZTRjNCIsYmxhY2s6IiMwMDAwMDAiLGJsYW5jaGVkYWxtb25kOiIjZmZlYmNkIixibHVlOiIjMDAwMGZmIixibHVldmlvbGV0OiIjOGEyYmUyIixicm93bjoiI2E1MmEyYSIsYnVybHl3b29kOiIjZGViODg3IixjYWRldGJsdWU6IiM1ZjllYTAiLGNoYXJ0cmV1c2U6IiM3ZmZmMDAiLGNob2NvbGF0ZToiI2QyNjkxZSIsY29yYWw6IiNmZjdmNTAiLGNvcm5mbG93ZXJibHVlOiIjNjQ5NWVkIixjb3Juc2lsazoiI2ZmZjhkYyIsY3JpbXNvbjoiI2RjMTQzYyIsY3lhbjoiIzAwZmZmZiIsZGFya2JsdWU6IiMwMDAwOGIiLGRhcmtjeWFuOiIjMDA4YjhiIixkYXJrZ29sZGVucm9kOiIjYjg4NjBiIixkYXJrZ3JheToiI2E5YTlhOSIsZGFya2dyZXk6IiNhOWE5YTkiLGRhcmtncmVlbjoiIzAwNjQwMCIsZGFya2toYWtpOiIjYmRiNzZiIixkYXJrbWFnZW50YToiIzhiMDA4YiIsZGFya29saXZlZ3JlZW46IiM1NTZiMmYiLGRhcmtvcmFuZ2U6IiNmZjhjMDAiLGRhcmtvcmNoaWQ6IiM5OTMyY2MiLGRhcmtyZWQ6IiM4YjAwMDAiLGRhcmtzYWxtb246IiNlOTk2N2EiLGRhcmtzZWFncmVlbjoiIzhmYmM4ZiIsZGFya3NsYXRlYmx1ZToiIzQ4M2Q4YiIsZGFya3NsYXRlZ3JheToiIzJmNGY0ZiIsZGFya3NsYXRlZ3JleToiIzJmNGY0ZiIsZGFya3R1cnF1b2lzZToiIzAwY2VkMSIsZGFya3Zpb2xldDoiIzk0MDBkMyIsZGVlcHBpbms6IiNmZjE0OTMiLGRlZXBza3libHVlOiIjMDBiZmZmIixkaW1ncmF5OiIjNjk2OTY5IixkaW1ncmV5OiIjNjk2OTY5Iixkb2RnZXJibHVlOiIjMWU5MGZmIixmaXJlYnJpY2s6IiNiMjIyMjIiLGZsb3JhbHdoaXRlOiIjZmZmYWYwIixmb3Jlc3RncmVlbjoiIzIyOGIyMiIsZnVjaHNpYToiI2ZmMDBmZiIsZ2FpbnNib3JvOiIjZGNkY2RjIixnaG9zdHdoaXRlOiIjZjhmOGZmIixnb2xkOiIjZmZkNzAwIixnb2xkZW5yb2Q6IiNkYWE1MjAiLGdyYXk6IiM4MDgwODAiLGdyZXk6IiM4MDgwODAiLGdyZWVuOiIjMDA4MDAwIixncmVlbnllbGxvdzoiI2FkZmYyZiIsaG9uZXlkZXc6IiNmMGZmZjAiLGhvdHBpbms6IiNmZjY5YjQiLGluZGlhbnJlZDoiI2NkNWM1YyIsaW5kaWdvOiIjNGIwMDgyIixpdm9yeToiI2ZmZmZmMCIsa2hha2k6IiNmMGU2OGMiLGxhdmVuZGVyOiIjZTZlNmZhIixsYXZlbmRlcmJsdXNoOiIjZmZmMGY1IixsYXduZ3JlZW46IiM3Y2ZjMDAiLGxlbW9uY2hpZmZvbjoiI2ZmZmFjZCIsbGlnaHRibHVlOiIjYWRkOGU2IixsaWdodGNvcmFsOiIjZjA4MDgwIixsaWdodGN5YW46IiNlMGZmZmYiLGxpZ2h0Z29sZGVucm9keWVsbG93OiIjZmFmYWQyIixsaWdodGdyYXk6IiNkM2QzZDMiLGxpZ2h0Z3JleToiI2QzZDNkMyIsbGlnaHRncmVlbjoiIzkwZWU5MCIsbGlnaHRwaW5rOiIjZmZiNmMxIixsaWdodHNhbG1vbjoiI2ZmYTA3YSIsbGlnaHRzZWFncmVlbjoiIzIwYjJhYSIsbGlnaHRza3libHVlOiIjODdjZWZhIixsaWdodHNsYXRlZ3JheToiIzc3ODg5OSIsbGlnaHRzbGF0ZWdyZXk6IiM3Nzg4OTkiLGxpZ2h0c3RlZWxibHVlOiIjYjBjNGRlIixsaWdodHllbGxvdzoiI2ZmZmZlMCIsbGltZToiIzAwZmYwMCIsbGltZWdyZWVuOiIjMzJjZDMyIixsaW5lbjoiI2ZhZjBlNiIsbWFnZW50YToiI2ZmMDBmZiIsbWFyb29uOiIjODAwMDAwIixtZWRpdW1hcXVhbWFyaW5lOiIjNjZjZGFhIixtZWRpdW1ibHVlOiIjMDAwMGNkIixtZWRpdW1vcmNoaWQ6IiNiYTU1ZDMiLG1lZGl1bXB1cnBsZToiIzkzNzBkYiIsbWVkaXVtc2VhZ3JlZW46IiMzY2IzNzEiLG1lZGl1bXNsYXRlYmx1ZToiIzdiNjhlZSIsbWVkaXVtc3ByaW5nZ3JlZW46IiMwMGZhOWEiLG1lZGl1bXR1cnF1b2lzZToiIzQ4ZDFjYyIsbWVkaXVtdmlvbGV0cmVkOiIjYzcxNTg1IixtaWRuaWdodGJsdWU6IiMxOTE5NzAiLG1pbnRjcmVhbToiI2Y1ZmZmYSIsbWlzdHlyb3NlOiIjZmZlNGUxIixtb2NjYXNpbjoiI2ZmZTRiNSIsbmF2YWpvd2hpdGU6IiNmZmRlYWQiLG5hdnk6IiMwMDAwODAiLG9sZGxhY2U6IiNmZGY1ZTYiLG9saXZlOiIjODA4MDAwIixvbGl2ZWRyYWI6IiM2YjhlMjMiLG9yYW5nZToiI2ZmYTUwMCIsb3JhbmdlcmVkOiIjZmY0NTAwIixvcmNoaWQ6IiNkYTcwZDYiLHBhbGVnb2xkZW5yb2Q6IiNlZWU4YWEiLHBhbGVncmVlbjoiIzk4ZmI5OCIscGFsZXR1cnF1b2lzZToiI2FmZWVlZSIscGFsZXZpb2xldHJlZDoiI2RiNzA5MyIscGFwYXlhd2hpcDoiI2ZmZWZkNSIscGVhY2hwdWZmOiIjZmZkYWI5IixwZXJ1OiIjY2Q4NTNmIixwaW5rOiIjZmZjMGNiIixwbHVtOiIjZGRhMGRkIixwb3dkZXJibHVlOiIjYjBlMGU2IixwdXJwbGU6IiM4MDAwODAiLHJlYmVjY2FwdXJwbGU6IiM2NjMzOTkiLHJlZDoiI2ZmMDAwMCIscm9zeWJyb3duOiIjYmM4ZjhmIixyb3lhbGJsdWU6IiM0MTY5ZTEiLHNhZGRsZWJyb3duOiIjOGI0NTEzIixzYWxtb246IiNmYTgwNzIiLHNhbmR5YnJvd246IiNmNGE0NjAiLHNlYWdyZWVuOiIjMmU4YjU3IixzZWFzaGVsbDoiI2ZmZjVlZSIsc2llbm5hOiIjYTA1MjJkIixzaWx2ZXI6IiNjMGMwYzAiLHNreWJsdWU6IiM4N2NlZWIiLHNsYXRlYmx1ZToiIzZhNWFjZCIsc2xhdGVncmF5OiIjNzA4MDkwIixzbGF0ZWdyZXk6IiM3MDgwOTAiLHNub3c6IiNmZmZhZmEiLHNwcmluZ2dyZWVuOiIjMDBmZjdmIixzdGVlbGJsdWU6IiM0NjgyYjQiLHRhbjoiI2QyYjQ4YyIsdGVhbDoiIzAwODA4MCIsdGhpc3RsZToiI2Q4YmZkOCIsdG9tYXRvOiIjZmY2MzQ3Iix0dXJxdW9pc2U6IiM0MGUwZDAiLHZpb2xldDoiI2VlODJlZSIsd2hlYXQ6IiNmNWRlYjMiLHdoaXRlOiIjZmZmZmZmIix3aGl0ZXNtb2tlOiIjZjVmNWY1Iix5ZWxsb3c6IiNmZmZmMDAiLHllbGxvd2dyZWVuOiIjOWFjZDMyIix0cmFuc3BhcmVudDoiIzAwMDAwMDAwIn07ZnVuY3Rpb24gRWYoZSl7ZT1lfHwiIzAwMDAwMCI7bGV0IHQ9bnVsbDtpZigodD0vXiMoWzAtOXxBLUZ8YS1mXXs2fSkkLy5leGVjKGUpKSE9bnVsbCl7bGV0IHI9cGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxzPXBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNiksdT1wYXJzZUludCh0WzFdLnNsaWNlKDQpLDE2KTtyZXR1cm5bcixzLHUsMjU1XX1pZigodD0vXiMoWzAtOXxBLUZ8YS1mXXszfSkkLy5leGVjKGUpKSE9bnVsbCl7bGV0IHI9dFsxXS5zbGljZSgwLDEpLHM9dFsxXS5zbGljZSgxLDIpLHU9dFsxXS5zbGljZSgyLDMpO3JldHVybiByPXBhcnNlSW50KHIrciwxNikscz1wYXJzZUludChzK3MsMTYpLHU9cGFyc2VJbnQodSt1LDE2KSxbcixzLHUsMjU1XX1pZigodD0vXnJnYlwoKC4rKVwpJC8uZXhlYyhlKSkhPW51bGwpcmV0dXJuIHRbMV0uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgubWluKDI1NSxwYXJzZUludChyLnRyaW0oKSkpfSkuY29uY2F0KDI1NSk7aWYoKHQ9L15yZ2JhXCgoLispXCkkLy5leGVjKGUpKSE9bnVsbClyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihyLHMpe3JldHVybiBzPT09Mz9NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHIudHJpbSgpKSk6TWF0aC5taW4oMjU1LHBhcnNlSW50KHIudHJpbSgpKSl9KTt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7aWYocS5oYXNPd24oeGgsbikpe3Q9L14jKFswLTl8QS1GfGEtZl17Niw4fSkkLy5leGVjKHhoW25dKTtsZXQgcj1wYXJzZUludCh0WzFdLnNsaWNlKDAsMiksMTYpLHM9cGFyc2VJbnQodFsxXS5zbGljZSgyLDQpLDE2KSx1PXBhcnNlSW50KHRbMV0uc2xpY2UoNCw2KSwxNikscD1wYXJzZUludCh0WzFdLnNsaWNlKDYsOCksMTYpO3JldHVybiBwPXA+PTA/cDoyNTUsW3Iscyx1LHBdfXJldHVybiBjb25zb2xlLmVycm9yKCJ1bnN1cHBvcnRlZCBjb2xvcjoiK2UpLFswLDAsMCwyNTVdfWNsYXNzIEJoe2NvbnN0cnVjdG9yKHQsbil7dGhpcy50eXBlPXQsdGhpcy5kYXRhPW4sdGhpcy5jb2xvclN0b3A9W119YWRkQ29sb3JTdG9wKHQsbil7dGhpcy5jb2xvclN0b3AucHVzaChbdCxFZihuKV0pfX1jbGFzcyBSYntjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudHlwZT0icGF0dGVybiIsdGhpcy5kYXRhPXQsdGhpcy5jb2xvclN0b3A9bn19Y2xhc3MgeGJ7Y29uc3RydWN0b3IodCl7dGhpcy53aWR0aD10fX1sZXQgQmI9KCk9PlluO2NsYXNzIEJje2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW4sdGhpcy5hY3Rpb25zPVtdLHRoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5kcmF3aW5nU3RhdGU9W10sdGhpcy5zdGF0ZT17bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fXNldEZpbGxTdHlsZSh0KXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zZXRTdHJva2VTdHlsZSh0KXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zZXRTaGFkb3codCxuLHIscyl7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9YWRkQ29sb3JTdG9wKHQsbil7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9c2V0TGluZVdpZHRoKHQpe2NvbnNvbGUubG9nKCJpbml0Q2FudmFzQ29udGV4dFByb3BlcnR5IGltcGxlbWVudGVkLiIpfXNldExpbmVDYXAodCl7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9c2V0TGluZUpvaW4odCl7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9c2V0TGluZURhc2godCxuKXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zZXRNaXRlckxpbWl0KHQpe2NvbnNvbGUubG9nKCJpbml0Q2FudmFzQ29udGV4dFByb3BlcnR5IGltcGxlbWVudGVkLiIpfWZpbGxSZWN0KHQsbixyLHMpe2NvbnNvbGUubG9nKCJpbml0Q2FudmFzQ29udGV4dFByb3BlcnR5IGltcGxlbWVudGVkLiIpfXN0cm9rZVJlY3QodCxuLHIscyl7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9Y2xlYXJSZWN0KHQsbixyLHMpe2NvbnNvbGUubG9nKCJpbml0Q2FudmFzQ29udGV4dFByb3BlcnR5IGltcGxlbWVudGVkLiIpfWZpbGwoKXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zdHJva2UoKXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zY2FsZSh0LG4pe2NvbnNvbGUubG9nKCJpbml0Q2FudmFzQ29udGV4dFByb3BlcnR5IGltcGxlbWVudGVkLiIpfXJvdGF0ZSh0KXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX10cmFuc2xhdGUodCxuKXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zZXRGb250U2l6ZSh0KXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1maWxsVGV4dCh0LG4scixzKXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zZXRUZXh0QWxpZ24odCl7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9c2V0VGV4dEJhc2VsaW5lKHQpe2NvbnNvbGUubG9nKCJpbml0Q2FudmFzQ29udGV4dFByb3BlcnR5IGltcGxlbWVudGVkLiIpfWRyYXdJbWFnZSh0LG4scixzLHUscCxTLFUsUCl7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9c2V0R2xvYmFsQWxwaGEodCl7Y29uc29sZS5sb2coImluaXRDYW52YXNDb250ZXh0UHJvcGVydHkgaW1wbGVtZW50ZWQuIil9c3Ryb2tlVGV4dCh0LG4scixzKXtjb25zb2xlLmxvZygiaW5pdENhbnZhc0NvbnRleHRQcm9wZXJ0eSBpbXBsZW1lbnRlZC4iKX1zZXRUcmFuc2Zvcm0odCxuLHIscyx1LHApe2NvbnNvbGUubG9nKCJpbml0Q2FudmFzQ29udGV4dFByb3BlcnR5IGltcGxlbWVudGVkLiIpfWRyYXcodD0hMSxuKXt2YXIgcj1bLi4udGhpcy5hY3Rpb25zXTt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLGZ1KHRoaXMuaWQsdGhpcy5wYWdlSWQsImFjdGlvbnNDaGFuZ2VkIix7YWN0aW9uczpyLHJlc2VydmU6dH0sbil9Y3JlYXRlTGluZWFyR3JhZGllbnQodCxuLHIscyl7cmV0dXJuIG5ldyBCaCgibGluZWFyIixbdCxuLHIsc10pfWNyZWF0ZUNpcmN1bGFyR3JhZGllbnQodCxuLHIpe3JldHVybiBuZXcgQmgoInJhZGlhbCIsW3QsbixyXSl9Y3JlYXRlUGF0dGVybih0LG4pe2lmKG49PT12b2lkIDApY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudC4iKTtlbHNlIGlmKFsicmVwZWF0IiwicmVwZWF0LXgiLCJyZXBlYXQteSIsIm5vLXJlcGVhdCJdLmluZGV4T2Yobik8MCljb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnY3JlYXRlUGF0dGVybicgb24gJ0NhbnZhc0NvbnRleHQnOiBUaGUgcHJvdmlkZWQgdHlwZSAoJyIrbisiJykgaXMgbm90IG9uZSBvZiAncmVwZWF0JywgJ25vLXJlcGVhdCcsICdyZXBlYXQteCcsIG9yICdyZXBlYXQteScuIik7ZWxzZSByZXR1cm4gbmV3IFJiKHQsbil9bWVhc3VyZVRleHQodCxuKXtsZXQgcj10aGlzLnN0YXRlLmZvbnQscz0wO3tsZXQgdT1vLndlYnZpZXcuYWxsKCkuZmluZChwPT5wLmdldFVSTCgpLmVuZHNXaXRoKCJ3d3cvX191bmlhcHB2aWV3Lmh0bWwiKSk7dSYmKHM9TnVtYmVyKHUuZXZhbEpTU3luYyhgKCR7SWIudG9TdHJpbmcoKX0pKCR7SlNPTi5zdHJpbmdpZnkodCl9LCR7SlNPTi5zdHJpbmdpZnkocil9KWApKSl9cmV0dXJuIG5ldyB4YihzKX1zYXZlKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2F2ZSIsZGF0YTpbXX0pLHRoaXMuZHJhd2luZ1N0YXRlLnB1c2godGhpcy5zdGF0ZSl9cmVzdG9yZSgpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InJlc3RvcmUiLGRhdGE6W119KSx0aGlzLnN0YXRlPXRoaXMuZHJhd2luZ1N0YXRlLnBvcCgpfHx7bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fWJlZ2luUGF0aCgpe3RoaXMucGF0aD1bXSx0aGlzLnN1YnBhdGg9W10sdGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYmVnaW5QYXRoIixkYXRhOltdfSl9bW92ZVRvKHQsbil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoibW92ZVRvIixkYXRhOlt0LG5dfSksdGhpcy5zdWJwYXRoPVtbdCxuXV19bGluZVRvKHQsbil7dGhpcy5wYXRoLmxlbmd0aD09PTAmJnRoaXMuc3VicGF0aC5sZW5ndGg9PT0wP3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbdCxuXX0pOnRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImxpbmVUbyIsZGF0YTpbdCxuXX0pLHRoaXMuc3VicGF0aC5wdXNoKFt0LG5dKX1xdWFkcmF0aWNDdXJ2ZVRvKHQsbixyLHMpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6InF1YWRyYXRpY0N1cnZlVG8iLGRhdGE6W3QsbixyLHNdfSksdGhpcy5zdWJwYXRoLnB1c2goW3Isc10pfWJlemllckN1cnZlVG8odCxuLHIscyx1LHApe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImJlemllckN1cnZlVG8iLGRhdGE6W3QsbixyLHMsdSxwXX0pLHRoaXMuc3VicGF0aC5wdXNoKFt1LHBdKX1hcmModCxuLHIscyx1LHA9ITEpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyYyIsZGF0YTpbdCxuLHIscyx1LHBdfSksdGhpcy5zdWJwYXRoLnB1c2goW3Qsbl0pfXJlY3QodCxuLHIscyl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicmVjdCIsZGF0YTpbdCxuLHIsc119KSx0aGlzLnN1YnBhdGg9W1t0LG5dXX1hcmNUbyh0LG4scixzLHUpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6ImFyY1RvIixkYXRhOlt0LG4scixzLHVdfSksdGhpcy5zdWJwYXRoLnB1c2goW3Isc10pfWNsaXAoKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJjbGlwIixkYXRhOlsuLi50aGlzLnBhdGhdfSl9Y2xvc2VQYXRoKCl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiY2xvc2VQYXRoIixkYXRhOltdfSksdGhpcy5zdWJwYXRoLmxlbmd0aCYmKHRoaXMuc3VicGF0aD1bdGhpcy5zdWJwYXRoLnNoaWZ0KCldKX1jbGVhckFjdGlvbnMoKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXX1nZXRBY3Rpb25zKCl7dmFyIHQ9Wy4uLnRoaXMuYWN0aW9uc107cmV0dXJuIHRoaXMuY2xlYXJBY3Rpb25zKCksdH1zZXQgbGluZURhc2hPZmZzZXQodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZURhc2hPZmZzZXQiLGRhdGE6W3RdfSl9c2V0IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLGRhdGE6W3RdfSl9c2V0IHNoYWRvd0JsdXIodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Qmx1ciIsZGF0YTpbdF19KX1zZXQgc2hhZG93Q29sb3IodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93Q29sb3IiLGRhdGE6W3RdfSl9c2V0IHNoYWRvd09mZnNldFgodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WCIsZGF0YTpbdF19KX1zZXQgc2hhZG93T2Zmc2V0WSh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dPZmZzZXRZIixkYXRhOlt0XX0pfXNldCBmb250KHQpe3ZhciBuPXRoaXM7dGhpcy5zdGF0ZS5mb250PXQ7dmFyIHI9dC5tYXRjaCgvXigoW1x3XC1dK1xzKSopKFxkK3I/cHgpKFwvKFxkK1wuP1xkKihyP3B4KT8pKT9ccysoLiopLyk7aWYocil7dmFyIHM9clsxXS50cmltKCkuc3BsaXQoL1xzLyksdT1wYXJzZUZsb2F0KHJbM10pLHA9cls3XSxTPVtdO3MuZm9yRWFjaChmdW5jdGlvbihQLEYpe1siaXRhbGljIiwib2JsaXF1ZSIsIm5vcm1hbCJdLmluZGV4T2YoUCk+LTE/KFMucHVzaCh7bWV0aG9kOiJzZXRGb250U3R5bGUiLGRhdGE6W1BdfSksbi5zdGF0ZS5mb250U3R5bGU9UCk6WyJib2xkIiwibm9ybWFsIl0uaW5kZXhPZihQKT4tMT8oUy5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6W1BdfSksbi5zdGF0ZS5mb250V2VpZ2h0PVApOkY9PT0wPyhTLnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOlsibm9ybWFsIl19KSxuLnN0YXRlLmZvbnRTdHlsZT0ibm9ybWFsIik6Rj09PTEmJlUoKX0pLHMubGVuZ3RoPT09MSYmVSgpLHM9Uy5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFAuZGF0YVswXX0pLmpvaW4oIiAiKSx0aGlzLnN0YXRlLmZvbnRTaXplPXUsdGhpcy5zdGF0ZS5mb250RmFtaWx5PXAsdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0Rm9udCIsZGF0YTpbYCR7c30gJHt1fXB4ICR7cH1gXX0pfWVsc2UgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gc2V0ICdmb250JyBvbiAnQ2FudmFzQ29udGV4dCc6IGludmFsaWQgZm9ybWF0LiIpO2Z1bmN0aW9uIFUoKXtTLnB1c2goe21ldGhvZDoic2V0Rm9udFdlaWdodCIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250V2VpZ2h0PSJub3JtYWwifX1nZXQgZm9udCgpe3JldHVybiB0aGlzLnN0YXRlLmZvbnR9c2V0IGZpbGxTdHlsZSh0KXt0aGlzLnNldEZpbGxTdHlsZSh0KX1zZXQgc3Ryb2tlU3R5bGUodCl7dGhpcy5zZXRTdHJva2VTdHlsZSh0KX1zZXQgZ2xvYmFsQWxwaGEodCl7dD1NYXRoLmZsb29yKDI1NSpwYXJzZUZsb2F0KHQpKSx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxBbHBoYSIsZGF0YTpbdF19KX1zZXQgdGV4dEFsaWduKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRBbGlnbiIsZGF0YTpbdF19KX1zZXQgbGluZUNhcCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lQ2FwIixkYXRhOlt0XX0pfXNldCBsaW5lSm9pbih0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lSm9pbiIsZGF0YTpbdF19KX1zZXQgbGluZVdpZHRoKHQpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVXaWR0aCIsZGF0YTpbdF19KX1zZXQgbWl0ZXJMaW1pdCh0KXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRNaXRlckxpbWl0IixkYXRhOlt0XX0pfXNldCB0ZXh0QmFzZWxpbmUodCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0VGV4dEJhc2VsaW5lIixkYXRhOlt0XX0pfX1sZXQgTWI9bmUub25jZSgoKT0+e1suLi5QYiwuLi5OYl0uZm9yRWFjaChmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3N3aXRjaChuKXtjYXNlImZpbGwiOmNhc2Uic3Ryb2tlIjpyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4rIlBhdGgiLGRhdGE6Wy4uLnRoaXMucGF0aF19KX07Y2FzZSJmaWxsUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKHIscyx1LHApe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ImZpbGxQYXRoIixkYXRhOlt7bWV0aG9kOiJyZWN0IixkYXRhOltyLHMsdSxwXX1dfSl9O2Nhc2Uic3Ryb2tlUmVjdCI6cmV0dXJuIGZ1bmN0aW9uKHIscyx1LHApe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InN0cm9rZVBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W3Iscyx1LHBdfV19KX07Y2FzZSJmaWxsVGV4dCI6Y2FzZSJzdHJva2VUZXh0IjpyZXR1cm4gZnVuY3Rpb24ocixzLHUscCl7dmFyIFM9W3IudG9TdHJpbmcoKSxzLHVdO3R5cGVvZiBwPT0ibnVtYmVyIiYmUy5wdXNoKHApLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOlN9KX07Y2FzZSJkcmF3SW1hZ2UiOnJldHVybiBmdW5jdGlvbihyLHMsdSxwLFMsVSxQLEYsYmUpe2JlPT09dm9pZCAwJiYoVT1zLFA9dSxGPXAsYmU9UyxzPXZvaWQgMCx1PXZvaWQgMCxwPXZvaWQgMCxTPXZvaWQgMCk7dmFyIEVlO2Z1bmN0aW9uIFBlKGN0KXtyZXR1cm4gdHlwZW9mIGN0PT0ibnVtYmVyIn1FZT1QZShzKSYmUGUodSkmJlBlKHApJiZQZShTKT9bcixVLFAsRixiZSxzLHUscCxTXTpQZShGKSYmUGUoYmUpP1tyLFUsUCxGLGJlXTpbcixVLFBdLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOkVlfSl9O2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKC4uLnIpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOnJ9KX19fUJjLnByb3RvdHlwZVtlXT10KGUpfSksa2IuZm9yRWFjaChmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3N3aXRjaChuKXtjYXNlInNldEZpbGxTdHlsZSI6Y2FzZSJzZXRTdHJva2VTdHlsZSI6cmV0dXJuIGZ1bmN0aW9uKHIpe3R5cGVvZiByIT0ib2JqZWN0Ij90aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbIm5vcm1hbCIsRWYocildfSk6dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3IudHlwZSxyLmRhdGEsci5jb2xvclN0b3BdfSl9O2Nhc2Uic2V0R2xvYmFsQWxwaGEiOnJldHVybiBmdW5jdGlvbihyKXtyPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQocikpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyXX0pfTtjYXNlInNldFNoYWRvdyI6cmV0dXJuIGZ1bmN0aW9uKHIscyx1LHApe3A9RWYocCksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpuLGRhdGE6W3Iscyx1LHBdfSksdGhpcy5zdGF0ZS5zaGFkb3dCbHVyPXUsdGhpcy5zdGF0ZS5zaGFkb3dDb2xvcj1wLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WD1yLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WT1zfTtjYXNlInNldExpbmVEYXNoIjpyZXR1cm4gZnVuY3Rpb24ocixzKXtyPXJ8fFswLDBdLHM9c3x8MCx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpbcixzXX0pLHRoaXMuc3RhdGUubGluZURhc2g9cn07Y2FzZSJzZXRGb250U2l6ZSI6cmV0dXJuIGZ1bmN0aW9uKHIpe3RoaXMuc3RhdGUuZm9udD10aGlzLnN0YXRlLmZvbnQucmVwbGFjZSgvXGQrXC4/XGQqcHgvLHIrInB4IiksdGhpcy5zdGF0ZS5mb250U2l6ZT1yLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6bixkYXRhOltyXX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbiguLi5yKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOm4sZGF0YTpyfSl9fX1CYy5wcm90b3R5cGVbZV09dChlKX0pfSksTGI9QnQoZGIsKGUsdCk9PntpZihNYigpLHQpcmV0dXJuIG5ldyBCYyhlLGxyKHQpKTtsZXQgbj1scihyaSgpKTtpZihuKXJldHVybiBuZXcgQmMoZSxuKTtmdC5lbWl0KG5lLk9OX0VSUk9SLCJjcmVhdGVDYW52YXNDb250ZXh0OmZhaWwiKX0saGIpLEZiPVRlKEViLCh7Y2FudmFzSWQ6ZSx4OnQseTpuLHdpZHRoOnIsaGVpZ2h0OnN9LHtyZXNvbHZlOnUscmVqZWN0OnB9KT0+e2xldCBTPWxyKHJpKCkpO2lmKCFTKXtwKCk7cmV0dXJufWZ1bmN0aW9uIFUoUCl7aWYoUC5lcnJNc2cmJlAuZXJyTXNnLmluZGV4T2YoImZhaWwiKSE9PS0xKXtwKCIiLFApO3JldHVybn1sZXQgRj1QLmRhdGE7RiYmRi5sZW5ndGgmJihQLmNvbXByZXNzZWQmJihGPW1oLmluZmxhdGVSYXcoRikpLFAuZGF0YT1uZXcgVWludDhDbGFtcGVkQXJyYXkoRikpLGRlbGV0ZSBQLmNvbXByZXNzZWQsdShQKX1mdShlLFMsImdldEltYWdlRGF0YSIse3g6dCx5Om4sd2lkdGg6cixoZWlnaHQ6c30sVSl9LEloLGtoKSxEYj1UZShTYiwoe2NhbnZhc0lkOmUsZGF0YTp0LHg6bix5OnIsd2lkdGg6cyxoZWlnaHQ6dX0se3Jlc29sdmU6cCxyZWplY3Q6U30pPT57dmFyIFU9bHIocmkoKSk7aWYoIVUpe1MoKTtyZXR1cm59bGV0IFAsRj0oKT0+e2Z1KGUsVSwicHV0SW1hZ2VEYXRhIix7ZGF0YTp0LHg6bix5OnIsd2lkdGg6cyxoZWlnaHQ6dSxjb21wcmVzc2VkOlB9LGJlPT57aWYoYmUuZXJyTXNnJiZiZS5lcnJNc2cuaW5kZXhPZigiZmFpbCIpIT09LTEpe1MoKTtyZXR1cm59cChiZSl9KX07by5vcy5uYW1lIT09ImlPUyJ8fHR5cGVvZiBfX1dFRVhfREVWVE9PTF9fPT0iYm9vbGVhbiI/KHQ9bWguZGVmbGF0ZVJhdyh0LHt0bzoic3RyaW5nIn0pLFA9ITApOnQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCksRigpfSxBYix3YiksVmI9VGUoQ2IsKHt4OmU9MCx5OnQ9MCx3aWR0aDpuLGhlaWdodDpyLGRlc3RXaWR0aDpzLGRlc3RIZWlnaHQ6dSxjYW52YXNJZDpwLGZpbGVUeXBlOlMscXVhbGl0eTpVfSx7cmVzb2x2ZTpQLHJlamVjdDpGfSk9Pnt2YXIgYmU9bHIocmkoKSk7aWYoIWJlKXtGKCk7cmV0dXJufWxldCBFZT1gJHtCYigpfS9jYW52YXNgO2Z1KHAsYmUsInRvVGVtcEZpbGVQYXRoIix7eDplLHk6dCx3aWR0aDpuLGhlaWdodDpyLGRlc3RXaWR0aDpzLGRlc3RIZWlnaHQ6dSxmaWxlVHlwZTpTLHF1YWxpdHk6VSxkaXJuYW1lOkVlfSxQZT0+e2lmKFBlLmVyck1zZyYmUGUuZXJyTXNnLmluZGV4T2YoImZhaWwiKSE9PS0xKXtGKCIiLFBlKTtyZXR1cm59UChQZSl9KX0sT2IsVGIpLE1oPVsib25DYW5wbGF5Iiwib25QbGF5Iiwib25QYXVzZSIsIm9uU3RvcCIsIm9uRW5kZWQiLCJvblRpbWVVcGRhdGUiLCJvbkVycm9yIiwib25XYWl0aW5nIiwib25TZWVraW5nIiwib25TZWVrZWQiXSxVYj1bIm9mZkNhbnBsYXkiLCJvZmZQbGF5Iiwib2ZmUGF1c2UiLCJvZmZTdG9wIiwib2ZmRW5kZWQiLCJvZmZUaW1lVXBkYXRlIiwib2ZmRXJyb3IiLCJvZmZXYWl0aW5nIiwib2ZmU2Vla2luZyIsIm9mZlNlZWtlZCJdLCRiPXt0aHJlc2hvbGRzOlswXSxpbml0aWFsUmF0aW86MCxvYnNlcnZlQWxsOiExfSxIYj1bInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCJdLGpiPTE7ZnVuY3Rpb24gTGgoZT17fSl7cmV0dXJuIEhiLm1hcCh0PT5gJHtOdW1iZXIoZVt0XSl8fDB9cHhgKS5qb2luKCIgIil9Y2xhc3MgRmh7Y29uc3RydWN0b3IodCxuKXt0aGlzLl9wYWdlSWQ9bHIodCksdGhpcy5fY29tcG9uZW50PXQsdGhpcy5fb3B0aW9ucz1xLmV4dGVuZCh7fSwkYixuKX1yZWxhdGl2ZVRvKHQsbil7cmV0dXJuIHRoaXMuX29wdGlvbnMucmVsYXRpdmVUb1NlbGVjdG9yPXQsdGhpcy5fb3B0aW9ucy5yb290TWFyZ2luPUxoKG4pLHRoaXN9cmVsYXRpdmVUb1ZpZXdwb3J0KHQpe3JldHVybiB0aGlzLl9vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj12b2lkIDAsdGhpcy5fb3B0aW9ucy5yb290TWFyZ2luPUxoKHQpLHRoaXN9b2JzZXJ2ZSh0LG4peyFxLmlzRnVuY3Rpb24obil8fCh0aGlzLl9vcHRpb25zLnNlbGVjdG9yPXQsdGhpcy5fcmVxSWQ9amIrKyx0cih7cmVxSWQ6dGhpcy5fcmVxSWQsY29tcG9uZW50OnRoaXMuX2NvbXBvbmVudCxvcHRpb25zOnRoaXMuX29wdGlvbnMsY2FsbGJhY2s6bn0sdGhpcy5fcGFnZUlkKSl9ZGlzY29ubmVjdCgpe3RoaXMuX3JlcUlkJiZzYSh7cmVxSWQ6dGhpcy5fcmVxSWQsY29tcG9uZW50OnRoaXMuX2NvbXBvbmVudH0sdGhpcy5fcGFnZUlkKX19bGV0IHpiPUJ0KCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsKGUsdCk9PihlPW5lLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZShlKSxlJiYhbHIoZSkmJih0PWUsZT1udWxsKSxlP25ldyBGaChlLHQpOm5ldyBGaChyaSgpLHQpKSksV2I9MTtjbGFzcyBEaHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wYWdlSWQ9dC4kcGFnZSYmdC4kcGFnZS5pZCx0aGlzLl9jb21wb25lbnQ9dH1vYnNlcnZlKHQsbil7IXEuaXNGdW5jdGlvbihuKXx8KHRoaXMuX3JlcUlkPVdiKyssSG8oe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnQsb3B0aW9uczp0LGNhbGxiYWNrOm59LHRoaXMuX3BhZ2VJZCkpfWRpc2Nvbm5lY3QoKXt0aGlzLl9yZXFJZCYmbnIoe3JlcUlkOnRoaXMuX3JlcUlkLGNvbXBvbmVudDp0aGlzLl9jb21wb25lbnR9LHRoaXMuX3BhZ2VJZCl9fWxldCBHYj1CdCgiY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyIixlPT4oZT1uZS5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIWxyKGUpJiYoZT1udWxsKSxlP25ldyBEaChlKTpuZXcgRGgocmkoKSkpKSxZYj0wLFNmPXt9O2Z1bmN0aW9uIHFiKGUsdCxuLHIpe2xldCBzPXtvcHRpb25zOnJ9LHU9ciYmKCJzdWNjZXNzImluIHJ8fCJmYWlsImluIHJ8fCJjb21wbGV0ZSJpbiByKTtpZih1KXtsZXQgcD1TdHJpbmcoWWIrKyk7cy5jYWxsYmFja0lkPXAsU2ZbcF09cn1mdC5pbnZva2VWaWV3TWV0aG9kKGBlZGl0b3IuJHtlfWAse3R5cGU6bixkYXRhOnN9LHQsKHtjYWxsYmFja0lkOnAsZGF0YTpTfSk9Pnt1JiYobmUuY2FsbE9wdGlvbnMoU2ZbcF0sUyksZGVsZXRlIFNmW3BdKX0pfWNsYXNzIEpie2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMucGFnZUlkPW59Zm9ybWF0KHQsbil7dGhpcy5fZXhlYygiZm9ybWF0Iix7bmFtZTp0LHZhbHVlOm59KX1pbnNlcnREaXZpZGVyKCl7dGhpcy5fZXhlYygiaW5zZXJ0RGl2aWRlciIpfWluc2VydEltYWdlKHQpe3RoaXMuX2V4ZWMoImluc2VydEltYWdlIix0KX1pbnNlcnRUZXh0KHQpe3RoaXMuX2V4ZWMoImluc2VydFRleHQiLHQpfXNldENvbnRlbnRzKHQpe3RoaXMuX2V4ZWMoInNldENvbnRlbnRzIix0KX1nZXRDb250ZW50cyh0KXt0aGlzLl9leGVjKCJnZXRDb250ZW50cyIsdCl9Y2xlYXIodCl7dGhpcy5fZXhlYygiY2xlYXIiLHQpfXJlbW92ZUZvcm1hdCh0KXt0aGlzLl9leGVjKCJyZW1vdmVGb3JtYXQiLHQpfXVuZG8odCl7dGhpcy5fZXhlYygidW5kbyIsdCl9cmVkbyh0KXt0aGlzLl9leGVjKCJyZWRvIix0KX1ibHVyKHQpe3RoaXMuX2V4ZWMoImJsdXIiLHQpfWdldFNlbGVjdGlvblRleHQodCl7dGhpcy5fZXhlYygiZ2V0U2VsZWN0aW9uVGV4dCIsdCl9c2Nyb2xsSW50b1ZpZXcodCl7dGhpcy5fZXhlYygic2Nyb2xsSW50b1ZpZXciLHQpfV9leGVjKHQsbil7cWIodGhpcy5pZCx0aGlzLnBhZ2VJZCx0LG4pfX1sZXQgS2I9e2NhbnZhczpCYyxtYXA6eWYsdmlkZW86YmYsZWRpdG9yOkpifTtmdW5jdGlvbiBWaChlKXtpZihlJiZlLmNvbnRleHRJbmZvKXtsZXR7aWQ6dCx0eXBlOm4scGFnZTpyfT1lLmNvbnRleHRJbmZvLHM9S2Jbbl07ZS5jb250ZXh0PW5ldyBzKHQsciksZGVsZXRlIGUuY29udGV4dEluZm99fWNsYXNzIHdme2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMuX3NlbGVjdG9yUXVlcnk9dCx0aGlzLl9jb21wb25lbnQ9bix0aGlzLl9zZWxlY3Rvcj1yLHRoaXMuX3NpbmdsZT1zfWJvdW5kaW5nQ2xpZW50UmVjdCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtpZDohMCxkYXRhc2V0OiEwLHJlY3Q6ITAsc2l6ZTohMH0sdCksdGhpcy5fc2VsZWN0b3JRdWVyeX1maWVsZHModCxuKXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHQsbiksdGhpcy5fc2VsZWN0b3JRdWVyeX1zY3JvbGxPZmZzZXQodCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxzY3JvbGxPZmZzZXQ6ITB9LHQpLHRoaXMuX3NlbGVjdG9yUXVlcnl9Y29udGV4dCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtjb250ZXh0OiEwfSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fW5vZGUodCl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7bm9kZTohMH0sdCksdGhpcy5fc2VsZWN0b3JRdWVyeX19Y2xhc3MgWmJ7Y29uc3RydWN0b3IodCl7dGhpcy5fY29tcG9uZW50PXZvaWQgMCx0aGlzLl9wYWdlPXQsdGhpcy5fcXVldWU9W10sdGhpcy5fcXVldWVDYj1bXX1leGVjKHQpe3JldHVybiBQaSh0aGlzLl9wYWdlLHRoaXMuX3F1ZXVlLG49PntsZXQgcj10aGlzLl9xdWV1ZUNiO24uZm9yRWFjaCgocyx1KT0+e3EuaXNBcnJheShzKT9zLmZvckVhY2goVmgpOlZoKHMpO2xldCBwPXJbdV07cS5pc0Z1bmN0aW9uKHApJiZwLmNhbGwodGhpcyxzKX0pLHEuaXNGdW5jdGlvbih0KSYmdC5jYWxsKHRoaXMsbil9KSx0aGlzLl9ub2Rlc1JlZn1pbih0KXtyZXR1cm4gdGhpcy5fY29tcG9uZW50PW5lLnJlc29sdmVDb21wb25lbnRJbnN0YW5jZSh0KSx0aGlzfXNlbGVjdCh0KXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IHdmKHRoaXMsdGhpcy5fY29tcG9uZW50LHQsITApfXNlbGVjdEFsbCh0KXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IHdmKHRoaXMsdGhpcy5fY29tcG9uZW50LHQsITEpfXNlbGVjdFZpZXdwb3J0KCl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyB3Zih0aGlzLG51bGwsIiIsITApfV9wdXNoKHQsbixyLHMsdSl7dGhpcy5fcXVldWUucHVzaCh7Y29tcG9uZW50Om4sc2VsZWN0b3I6dCxzaW5nbGU6cixmaWVsZHM6c30pLHRoaXMuX3F1ZXVlQ2IucHVzaCh1KX19bGV0IFhiPUJ0KCJjcmVhdGVTZWxlY3RvclF1ZXJ5IixlPT4oZT1uZS5yZXNvbHZlQ29tcG9uZW50SW5zdGFuY2UoZSksZSYmIWxyKGUpJiYoZT1udWxsKSxuZXcgWmIoZXx8cmkoKSkpKSxRYj0iY3JlYXRlQW5pbWF0aW9uIixleT17Zm9ybWF0QXJnczp7fX0sdHk9e2R1cmF0aW9uOk51bWJlcix0aW1pbmdGdW5jdGlvbjpTdHJpbmcsZGVsYXk6TnVtYmVyLHRyYW5zZm9ybU9yaWdpbjpTdHJpbmd9LG55PXtkdXJhdGlvbjo0MDAsdGltaW5nRnVuY3Rpb246ImxpbmVhciIsZGVsYXk6MCx0cmFuc2Zvcm1PcmlnaW46IjUwJSA1MCUgMCJ9O2NsYXNzIFVoe2NvbnN0cnVjdG9yKHQpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLmN1cnJlbnRUcmFuc2Zvcm09e30sdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzPVtdLHRoaXMub3B0aW9uPXEuZXh0ZW5kKHt9LG55LHQpfV9nZXRPcHRpb24odCl7bGV0IG49e3RyYW5zaXRpb246cS5leHRlbmQoe30sdGhpcy5vcHRpb24sdCksdHJhbnNmb3JtT3JpZ2luOiIifTtyZXR1cm4gbi50cmFuc2Zvcm1PcmlnaW49bi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixkZWxldGUgbi50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixufV9wdXNoQW5pbWF0ZXModCxuKXt0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMucHVzaCh7dHlwZTp0LGFyZ3M6bn0pfV9jb252ZXJUeXBlKHQpe3JldHVybiB0LnJlcGxhY2UoL1tBLVpdL2csbj0+YC0ke24udG9Mb3dlckNhc2UoKX1gKX1fZ2V0VmFsdWUodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj9gJHt0fXB4YDp0fWV4cG9ydCgpe2xldCB0PXRoaXMuYWN0aW9ucztyZXR1cm4gdGhpcy5hY3Rpb25zPVtdLHthY3Rpb25zOnR9fXN0ZXAodCl7cmV0dXJuIHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5mb3JFYWNoKG49PntuLnR5cGUhPT0ic3R5bGUiP3RoaXMuY3VycmVudFRyYW5zZm9ybVtuLnR5cGVdPW46dGhpcy5jdXJyZW50VHJhbnNmb3JtW2Ake24udHlwZX0uJHtuLmFyZ3NbMF19YF09bn0pLHRoaXMuYWN0aW9ucy5wdXNoKHthbmltYXRlczpPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudFRyYW5zZm9ybSksb3B0aW9uOnRoaXMuX2dldE9wdGlvbih0KX0pLHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzfX1sZXQgcnk9bmUub25jZSgoKT0+e2xldCBlPVsibWF0cml4IiwibWF0cml4M2QiLCJyb3RhdGUiLCJyb3RhdGUzZCIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInNjYWxlIiwic2NhbGUzZCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsInNrZXciLCJza2V3WCIsInNrZXdZIiwidHJhbnNsYXRlIiwidHJhbnNsYXRlM2QiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInRyYW5zbGF0ZVoiXSx0PVsib3BhY2l0eSIsImJhY2tncm91bmRDb2xvciJdLG49WyJ3aWR0aCIsImhlaWdodCIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSJdO2UuY29uY2F0KHQsbikuZm9yRWFjaChyPT57VWgucHJvdG90eXBlW3JdPWZ1bmN0aW9uKC4uLnMpe3JldHVybiB0LmNvbmNhdChuKS5pbmNsdWRlcyhyKT90aGlzLl9wdXNoQW5pbWF0ZXMoInN0eWxlIixbdGhpcy5fY29udmVyVHlwZShyKSxuLmluY2x1ZGVzKHIpP3RoaXMuX2dldFZhbHVlKHNbMF0pOnNbMF1dKTp0aGlzLl9wdXNoQW5pbWF0ZXMocixzKSx0aGlzfX0pfSksaXk9QnQoUWIsZT0+KHJ5KCksbmV3IFVoKGUpKSx0eSxleSksJGg9Im9uVGFiQmFyTWlkQnV0dG9uVGFwIixveT1qbigkaCwoKT0+e30pLGF5PSJvbldpbmRvd1Jlc2l6ZSIsc3k9Im9mZldpbmRvd1Jlc2l6ZSIsbHk9am4oYXksKCk9Pnt9KSxjeT1ZcihzeSwoKT0+e30pLEhoPSJzZXRMb2NhbGUiLHV5PSJnZXRMb2NhbGUiLGpoPSJvbkxvY2FsZUNoYW5nZSIsTWM9QnQodXksKCk9PntsZXQgZT1PdCh7YWxsb3dEZWZhdWx0OiEwfSk7cmV0dXJuIGUmJmUuJHZtP2UuJHZtLiRsb2NhbGU6RXQoKS5nZXRMb2NhbGUoKX0pLGZ5PWpuKGpoLCgpPT57fSksZHk9QnQoSGgsZT0+e2xldCB0PU90KCk7cmV0dXJuIHQmJnQuJHZtLiRsb2NhbGUhPT1lPyh0LiR2bS4kbG9jYWxlPWUsVW4oKS5mb3JFYWNoKHM9PntmdC5wdWJsaXNoSGFuZGxlcihIaCxlLHMuJHBhZ2UuaWQpfSksZi5yZXF1aXJlTW9kdWxlKCJwbHVzIikuc2V0TGFuZ3VhZ2UoZSksZnQuaW52b2tlT25DYWxsYmFjayhqaCx7bG9jYWxlOmV9KSwhMCk6ITF9KSxoeT1UZSgic2V0UGFnZU1ldGEiLChlLHtyZXNvbHZlOnR9KT0+e3QodGkocmkoKSxlKSl9KSx6aD0iZ2V0U2VsZWN0ZWRUZXh0UmFuZ2UiLGd5PVRlKHpoLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2Z0Lmludm9rZVZpZXdNZXRob2Qoemgse30sUWEoKSxyPT57dHlwZW9mIHIuZW5kPT0idW5kZWZpbmVkIiYmdHlwZW9mIHIuc3RhcnQ9PSJ1bmRlZmluZWQiP24oIm5vIGZvY3VzZWQiKTp0KHIpfSl9KSxkdT17W25lLk9OX1VOSEFORExFX1JFSkVDVElPTl06W10sW25lLk9OX1BBR0VfTk9UX0ZPVU5EXTpbXSxbbmUuT05fRVJST1JdOltdLFtuZS5PTl9TSE9XXTpbXSxbbmUuT05fSElERV06W119O2Z1bmN0aW9uIExjKGUsdCl7bGV0IG49T3Qoe2FsbG93RGVmYXVsdDohMH0pO2lmKG4mJm4uJHZtKXJldHVybiBzbi5pbmplY3RIb29rKGUsdCxuLiR2bS4kKTtkdVtlXS5wdXNoKHQpfWZ1bmN0aW9uIHB5KGUpe09iamVjdC5rZXlzKGR1KS5mb3JFYWNoKHQ9PntkdVt0XS5mb3JFYWNoKG49Pntzbi5pbmplY3RIb29rKHQsbixlKX0pfSl9ZnVuY3Rpb24gRmMoZSx0KXtsZXQgbj1PdCh7YWxsb3dEZWZhdWx0OiEwfSk7aWYobiYmbi4kdm0pcmV0dXJuIHJsKG4uJHZtLGUsdCk7cS5yZW1vdmUoZHVbZV0sdCl9ZnVuY3Rpb24gdnkoZSl7TGMobmUuT05fVU5IQU5ETEVfUkVKRUNUSU9OLGUpfWZ1bmN0aW9uIG15KGUpe0ZjKG5lLk9OX1VOSEFORExFX1JFSkVDVElPTixlKX1mdW5jdGlvbiBfeShlKXtMYyhuZS5PTl9QQUdFX05PVF9GT1VORCxlKX1mdW5jdGlvbiBieShlKXtGYyhuZS5PTl9QQUdFX05PVF9GT1VORCxlKX1mdW5jdGlvbiB5eShlKXtMYyhuZS5PTl9FUlJPUixlKX1mdW5jdGlvbiBFeShlKXtGYyhuZS5PTl9FUlJPUixlKX1mdW5jdGlvbiBTeShlKXtMYyhuZS5PTl9TSE9XLGUpfWZ1bmN0aW9uIHd5KGUpe0ZjKG5lLk9OX1NIT1csZSl9ZnVuY3Rpb24gQXkoZSl7TGMobmUuT05fSElERSxlKX1mdW5jdGlvbiBDeShlKXtGYyhuZS5PTl9ISURFLGUpfWxldCBUeT1CdCgiZ2V0RW50ZXJPcHRpb25zU3luYyIsKCk9PkxpKCkpLE95PUJ0KCJnZXRMYXVuY2hPcHRpb25zU3luYyIsKCk9Pm9sKCkpLERjLEFmLENmLFdoO2Z1bmN0aW9uIEdoKGUpe3RyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaCh0KXt9cmV0dXJuIGV9ZnVuY3Rpb24gVGYoZSl7aWYoZS50eXBlPT09ImVuYWJsZWQiKUNmPSEwLFdoPWUub2ZmbGluZTtlbHNlIGlmKGUudHlwZT09PSJjbGllbnRJZCIpRGM9ZS5jaWQsQWY9ZS5lcnJNc2csWWgoRGMsZS5lcnJNc2cpO2Vsc2UgaWYoZS50eXBlPT09InB1c2hNc2ciKXtsZXQgdD17dHlwZToicmVjZWl2ZSIsZGF0YTpHaChlLm1lc3NhZ2UpfTtmb3IobGV0IG49MDtuPEdzLmxlbmd0aCYmKEdzW25dKHQpLCF0LnN0b3BwZWQpO24rKyk7fWVsc2UgZS50eXBlPT09ImNsaWNrIiYmR3MuZm9yRWFjaCh0PT57dCh7dHlwZToiY2xpY2siLGRhdGE6R2goZS5tZXNzYWdlKX0pfSl9bGV0IE9mPVtdO2Z1bmN0aW9uIFloKGUsdCl7T2YuZm9yRWFjaChuPT57bihlLHQpfSksT2YubGVuZ3RoPTB9bGV0IFB5PVRlKCJnZXRQdXNoQ2xpZW50SWQiLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2lmKFdoKXtvLnB1c2guZ2V0Q2xpZW50SW5mb0FzeW5jKHI9Pnt0KHtjaWQ6ci5jbGllbnRpZH0pfSxyPT57bihyLmNvZGUrIjogIityLm1lc3NhZ2UpfSk7cmV0dXJufVByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pnt0eXBlb2YgQ2Y9PSJ1bmRlZmluZWQiJiYoQ2Y9ITEsRGM9IiIsQWY9InVuaVB1c2ggaXMgbm90IGVuYWJsZWQiKSxPZi5wdXNoKChyLHMpPT57cj90KHtjaWQ6cn0pOm4ocyl9KSx0eXBlb2YgRGMhPSJ1bmRlZmluZWQiJiZZaChEYyxBZil9KX0pLEdzPVtdLHFoPSExLE55PWU9PntHcy5pbmRleE9mKGUpPT09LTEmJkdzLnB1c2goZSkscWh8fChxaD0hMCxvLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHQ9PntUZih7dHlwZToiY2xpY2siLG1lc3NhZ2U6dH0pfSksby5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoInJlY2VpdmUiLHQ9PntUZih7dHlwZToicHVzaE1zZyIsbWVzc2FnZTp0fSl9KSl9LGt5PWU9PntpZighZSlHcy5sZW5ndGg9MDtlbHNle2xldCB0PUdzLmluZGV4T2YoZSk7dD4tMSYmR3Muc3BsaWNlKHQsMSl9fSxJeT0iY2FuSVVzZSIsUnk9W3tuYW1lOiJzY2hlbWEiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0seHk9ImdldEJhY2tncm91bmRBdWRpb01hbmFnZXIiLEJ5PSJtYWtlUGhvbmVDYWxsIixNeT17cGhvbmVOdW1iZXI6U3RyaW5nfSxMeT0iYWRkUGhvbmVDb250YWN0IixGeT17Zm9ybWF0QXJnczp7Zmlyc3ROYW1lKGUpe2lmKCFlKXJldHVybiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5maXJzdE5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eTsifX19LER5PXtmaXJzdE5hbWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxwaG90b0ZpbGVQYXRoOlN0cmluZyxuaWNrTmFtZTpTdHJpbmcsbGFzdE5hbWU6U3RyaW5nLG1pZGRsZU5hbWU6U3RyaW5nLHJlbWFyazpTdHJpbmcsbW9iaWxlUGhvbmVOdW1iZXI6U3RyaW5nLHdlQ2hhdE51bWJlcjpTdHJpbmcsYWRkcmVzc0NvdW50cnk6U3RyaW5nLGFkZHJlc3NTdGF0ZTpTdHJpbmcsYWRkcmVzc0NpdHk6U3RyaW5nLGFkZHJlc3NTdHJlZXQ6U3RyaW5nLGFkZHJlc3NQb3N0YWxDb2RlOlN0cmluZyxvcmdhbml6YXRpb246U3RyaW5nLHRpdGxlOlN0cmluZyx3b3JrRmF4TnVtYmVyOlN0cmluZyx3b3JrUGhvbmVOdW1iZXI6U3RyaW5nLGhvc3ROdW1iZXI6U3RyaW5nLGVtYWlsOlN0cmluZyx1cmw6U3RyaW5nLHdvcmtBZGRyZXNzQ291bnRyeTpTdHJpbmcsd29ya0FkZHJlc3NTdGF0ZTpTdHJpbmcsd29ya0FkZHJlc3NDaXR5OlN0cmluZyx3b3JrQWRkcmVzc1N0cmVldDpTdHJpbmcsd29ya0FkZHJlc3NQb3N0YWxDb2RlOlN0cmluZyxob21lRmF4TnVtYmVyOlN0cmluZyxob21lUGhvbmVOdW1iZXI6U3RyaW5nLGhvbWVBZGRyZXNzQ291bnRyeTpTdHJpbmcsaG9tZUFkZHJlc3NTdGF0ZTpTdHJpbmcsaG9tZUFkZHJlc3NDaXR5OlN0cmluZyxob21lQWRkcmVzc1N0cmVldDpTdHJpbmcsaG9tZUFkZHJlc3NQb3N0YWxDb2RlOlN0cmluZ30sVnk9ImdldENsaXBib2FyZERhdGEiLFV5PSJzZXRDbGlwYm9hcmREYXRhIiwkeT17Zm9ybWF0QXJnczp7c2hvd1RvYXN0OiEwfSxiZWZvcmVJbnZva2UoKXtMZSgpfSxiZWZvcmVTdWNjZXNzKGUsdCl7aWYoIXQuc2hvd1RvYXN0KXJldHVybjtsZXR7dDpufT1FdCgpLHI9bigidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyIpO3ImJlIuc2hvd1RvYXN0KHt0aXRsZTpyLGljb246InN1Y2Nlc3MiLG1hc2s6ITF9KX19LEh5PXtkYXRhOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2hvd1RvYXN0Ont0eXBlOkJvb2xlYW59fSxKaD0ib25BY2NlbGVyb21ldGVyIixqeT0ib2ZmQWNjZWxlcm9tZXRlciIsenk9InN0YXJ0QWNjZWxlcm9tZXRlciIsV3k9InN0b3BBY2NlbGVyb21ldGVyIixLaD0ib25Db21wYXNzIixHeT0ib2ZmQ29tcGFzcyIsWXk9InN0YXJ0Q29tcGFzcyIscXk9InN0b3BDb21wYXNzIixKeT0idmlicmF0ZVNob3J0IixLeT0idmlicmF0ZUxvbmciLFpoPSJvbkJsdWV0b290aERldmljZUZvdW5kIixYaD0ib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiLFFoPSJvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSIsZWc9Im9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsWnk9InN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsWHk9e3NlcnZpY2VzOkFycmF5LGFsbG93RHVwbGljYXRlc0tleTpCb29sZWFuLGludGVydmFsOk51bWJlcn0sUXk9ImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLGUwPXtzZXJ2aWNlczp7dHlwZTpBcnJheSxyZXF1aXJlZDohMH19LHQwPSJjcmVhdGVCTEVDb25uZWN0aW9uIixuMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0scjA9ImNsb3NlQkxFQ29ubmVjdGlvbiIsaTA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LG8wPSJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsYTA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LHMwPSJnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MiLGwwPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNlcnZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxjMD0ibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsdTA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sY2hhcmFjdGVyaXN0aWNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHN0YXRlOnt0eXBlOkJvb2xlYW4scmVxdWlyZWQ6ITB9fSxmMD0icmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLGQwPXtkZXZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNlcnZpY2VJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGNoYXJhY3RlcmlzdGljSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0saDA9IndyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsZzA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc2VydmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sY2hhcmFjdGVyaXN0aWNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHZhbHVlOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfX0scDA9InNldEJMRU1UVSIsdjA9e2RldmljZUlkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sbXR1Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH19LG0wPSJnZXRCTEVEZXZpY2VSU1NJIixfMD17ZGV2aWNlSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sdGc9Im9uQmVhY29uVXBkYXRlIixuZz0ib25CZWFjb25TZXJ2aWNlQ2hhbmdlIixiMD0iZ2V0QmVhY29ucyIseTA9InN0YXJ0QmVhY29uRGlzY292ZXJ5IixFMD17dXVpZHM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9fSxTMD0ic3RvcEJlYWNvbkRpc2NvdmVyeSIsdzA9ImdldFNjcmVlbkJyaWdodG5lc3MiLEEwPSJzZXRTY3JlZW5CcmlnaHRuZXNzIixDMD0ic2V0S2VlcFNjcmVlbk9uIixUMD0iY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uIixPMD0iY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsUDA9WyJmaW5nZXJQcmludCIsImZhY2lhbCIsInNwZWVjaCJdLE4wPXtmb3JtYXRBcmdzOntjaGVja0F1dGhNb2RlKGUsdCl7aWYoIWV8fCFQMC5pbmNsdWRlcyhlKSlyZXR1cm4iY2hlY2tBdXRoTW9kZSBcdTU4NkJcdTUxOTlcdTk1MTlcdThCRUYifX19LGswPXtjaGVja0F1dGhNb2RlOlN0cmluZ30sSTA9InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbiIsUjA9e2Zvcm1hdEFyZ3M6e3JlcXVlc3RBdXRoTW9kZXMoZSx0KXtpZighZS5pbmNsdWRlcygiZmluZ2VyUHJpbnQiKSYmIWUuaW5jbHVkZXMoImZhY2lhbCIpKXJldHVybiJyZXF1ZXN0QXV0aE1vZGVzIFx1NTg2Qlx1NTE5OVx1OTUxOVx1OEJFRiJ9fX0seDA9e3JlcXVlc3RBdXRoTW9kZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LGNoYWxsZW5nZTpTdHJpbmcsYXV0aENvbnRlbnQ6U3RyaW5nfSxCMD0ic2NhbkNvZGUiLE0wPXtvbmx5RnJvbUNhbWVyYTpCb29sZWFuLHNjYW5UeXBlOkFycmF5LGF1dG9EZWNvZGVDaGFyU2V0OkJvb2xlYW4sc291bmQ6U3RyaW5nLGF1dG9ab29tOkJvb2xlYW59LEwwPVsiZGVmYXVsdCIsIm5vbmUiXSxGMD17Zm9ybWF0QXJnczp7c291bmQoZSx0KXtMMC5pbmNsdWRlcyhlKXx8KHQuc291bmQ9Im5vbmUiKX0sYXV0b1pvb20oZSx0KXt0eXBlb2YgZT09InVuZGVmaW5lZCImJih0LmF1dG9ab29tPSEwKX19fSxEMD0iZ2V0U3lzdGVtU2V0dGluZyIsVjA9ImdldEFwcEF1dGhvcml6ZVNldHRpbmciLFUwPSJvcGVuQXBwQXV0aG9yaXplU2V0dGluZyIsJDA9ImdldFN0b3JhZ2UiLHJnPXtrZXk6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sSDA9ImdldFN0b3JhZ2VTeW5jIixpZz1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxqMD0ic2V0U3RvcmFnZSIsejA9e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRhdGE6e3JlcXVpcmVkOiEwfX0sVzA9InNldFN0b3JhZ2VTeW5jIixHMD1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJkYXRhIixyZXF1aXJlZDohMH1dLG9nPSJyZW1vdmVTdG9yYWdlIixZMD1yZyxxMD1pZyxKMD0ic2F2ZUZpbGUiLEswPXtmb3JtYXRBcmdzOnt0ZW1wRmlsZVBhdGgoZSx0KXt0LnRlbXBGaWxlUGF0aD1xZShlKX19fSxaMD17dGVtcEZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFgwPSJnZXRTYXZlZEZpbGVMaXN0IixRMD0icmVtb3ZlU2F2ZWRGaWxlIixlRT17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPXFlKGUpfX19LHRFPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxuRT0iZ2V0RmlsZUluZm8iLHJFPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9cWUoZSl9fX0saUU9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LG9FPSJnZXRTYXZlZEZpbGVJbmZvIixhRT17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPXFlKGUpfX19LHNFPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxsRT0ib3BlbkRvY3VtZW50IixjRT17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXt0LmZpbGVQYXRoPXFlKGUpfX19LHVFPXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOlN0cmluZ30sZkU9ImhpZGVLZXlib2FyZCIsZEU9InNob3dLZXlib2FyZCIsaEU9ImNob29zZUxvY2F0aW9uIixnRT17a2V5d29yZDpTdHJpbmcsbGF0aXR1ZGU6TnVtYmVyLGxvbmdpdHVkZTpOdW1iZXJ9LHBFPSJnZXRMb2NhdGlvbiIsYWc9WyJ3Z3M4NCIsImdjajAyIl0sdkU9e2Zvcm1hdEFyZ3M6e3R5cGUoZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSxhZy5pbmRleE9mKGUpPT09LTE/dC50eXBlPWFnWzBdOnQudHlwZT1lfSxhbHRpdHVkZShlLHQpe3QuYWx0aXR1ZGU9ZXx8ITF9fX0sbUU9e3R5cGU6U3RyaW5nLGFsdGl0dWRlOkJvb2xlYW59LF9FPSJvcGVuTG9jYXRpb24iLHNnPShlLHQpPT57aWYodD09PXZvaWQgMClyZXR1cm5gJHtlfSBzaG91bGQgbm90IGJlIGVtcHR5LmA7aWYodHlwZW9mIHQhPSJudW1iZXIiKXtsZXQgbj10eXBlb2YgdDtyZXR1cm4gbj1uWzBdLnRvVXBwZXJDYXNlKCkrbi5zdWJzdHJpbmcoMSksYEV4cGVjdGVkIE51bWJlciwgZ290ICR7bn0gd2l0aCB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHQpfS5gfX0sYkU9e2Zvcm1hdEFyZ3M6e2xhdGl0dWRlKGUsdCl7bGV0IG49c2coImxhdGl0dWRlIixlKTtpZihuKXJldHVybiBuO3QubGF0aXR1ZGU9ZX0sbG9uZ2l0dWRlKGUsdCl7bGV0IG49c2coImxvbmdpdHVkZSIsZSk7aWYobilyZXR1cm4gbjt0LmxvbmdpdHVkZT1lfSxzY2FsZShlLHQpe2U9TWF0aC5mbG9vcihlKSx0LnNjYWxlPWU+PTUmJmU8PTE4P2U6MTh9fX0seUU9e2xhdGl0dWRlOk51bWJlcixsb25naXR1ZGU6TnVtYmVyLHNjYWxlOk51bWJlcixuYW1lOlN0cmluZyxhZGRyZXNzOlN0cmluZ30sRUU9ImNob29zZUltYWdlIixTRT17Zm9ybWF0QXJnczp7Y291bnQoZSx0KXsoIWV8fGU8PTApJiYodC5jb3VudD05KX0sc2l6ZVR5cGUoZSx0KXt0LnNpemVUeXBlPU1uKGUsenIpfSxzb3VyY2VUeXBlKGUsdCl7dC5zb3VyY2VUeXBlPU1uKGUsRW4pfSxleHRlbnNpb24oZSx0KXtpZihlIGluc3RhbmNlb2YgQXJyYXkmJmUubGVuZ3RoPT09MClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIjtlfHwodC5leHRlbnNpb249WyIqIl0pfX19LHdFPXtjb3VudDpOdW1iZXIsc2l6ZVR5cGU6W0FycmF5LFN0cmluZ10sc291cmNlVHlwZTpBcnJheSxleHRlbnNpb246QXJyYXl9LEFFPSJjaG9vc2VWaWRlbyIsQ0U9e2Zvcm1hdEFyZ3M6e3NvdXJjZVR5cGUoZSx0KXt0LnNvdXJjZVR5cGU9TW4oZSxFbil9LGNvbXByZXNzZWQ6ITAsbWF4RHVyYXRpb246NjAsY2FtZXJhOiJiYWNrIixleHRlbnNpb24oZSx0KXtpZihlIGluc3RhbmNlb2YgQXJyYXkmJmUubGVuZ3RoPT09MClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIjtlfHwodC5leHRlbnNpb249WyIqIl0pfX19LFRFPXtzb3VyY2VUeXBlOkFycmF5LGNvbXByZXNzZWQ6Qm9vbGVhbixtYXhEdXJhdGlvbjpOdW1iZXIsY2FtZXJhOlN0cmluZyxleHRlbnNpb246QXJyYXl9LE9FPSJnZXRJbWFnZUluZm8iLFBFPXtmb3JtYXRBcmdzOntzcmMoZSx0KXt0LnNyYz1xZShlKX19fSxORT17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGtFPSJwcmV2aWV3SW1hZ2UiLElFPXtmb3JtYXRBcmdzOnt1cmxzKGUsdCl7dC51cmxzPWUubWFwKG49PnEuaXNTdHJpbmcobikmJm4/cWUobik6IiIpfSxjdXJyZW50KGUsdCl7dHlwZW9mIGU9PSJudW1iZXIiP3QuY3VycmVudD1lPjAmJmU8dC51cmxzLmxlbmd0aD9lOjA6cS5pc1N0cmluZyhlKSYmZSYmKHQuY3VycmVudD1xZShlKSl9fX0sUkU9e3VybHM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LGN1cnJlbnQ6e3R5cGU6W051bWJlcixTdHJpbmddfX0seEU9ImNsb3NlUHJldmlld0ltYWdlIixCRT0iZ2V0VmlkZW9JbmZvIixNRT17Zm9ybWF0QXJnczp7c3JjKGUsdCl7dC5zcmM9cWUoZSl9fX0sTEU9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxGRT0ic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIsREU9e2Zvcm1hdEFyZ3M6e2ZpbGVQYXRoKGUsdCl7dC5maWxlUGF0aD1xZShlKX19fSxWRT17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sVUU9InNhdmVWaWRlb1RvUGhvdG9zQWxidW0iLCRFPXtmb3JtYXRBcmdzOntmaWxlUGF0aChlLHQpe3QuZmlsZVBhdGg9cWUoZSl9fX0sSEU9e2ZpbGVQYXRoOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGpFPSJnZXRSZWNvcmRlck1hbmFnZXIiLHpFPSJjb21wcmVzc0ltYWdlIixXRT17Zm9ybWF0QXJnczp7c3JjKGUsdCl7dC5zcmM9cWUoZSl9fX0sR0U9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxZRT0iY29tcHJlc3NWaWRlbyIscUU9e2Zvcm1hdEFyZ3M6e3NyYyhlLHQpe3Quc3JjPXFlKGUpfX19LEpFPXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxxdWFsaXR5OlN0cmluZyxiaXRyYXRlOk51bWJlcixmcHM6TnVtYmVyLHJlc29sdXRpb246TnVtYmVyfSxLRT0icmVxdWVzdCIsWkU9e0pTT046Impzb24ifSxYRT1bInRleHQiLCJhcnJheWJ1ZmZlciJdLFFFPSJ0ZXh0IixsZz1lbmNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gZVMoZSx0KXtsZXQgbj1lLnNwbGl0KCIjIikscj1uWzFdfHwiIjtuPW5bMF0uc3BsaXQoIj8iKTtsZXQgcz1uWzFdfHwiIjtlPW5bMF07bGV0IHU9cy5zcGxpdCgiJiIpLmZpbHRlcihTPT5TKSxwPXt9O3UuZm9yRWFjaChTPT57bGV0IFU9Uy5zcGxpdCgiPSIpO3BbVVswXV09VVsxXX0pO2ZvcihsZXQgUyBpbiB0KWlmKHEuaGFzT3duKHQsUykpe2xldCBVPXRbU107dHlwZW9mIFU9PSJ1bmRlZmluZWQifHxVPT09bnVsbD9VPSIiOnEuaXNQbGFpbk9iamVjdChVKSYmKFU9SlNPTi5zdHJpbmdpZnkoVSkpLHBbbGcoUyldPWxnKFUpfXJldHVybiBzPU9iamVjdC5rZXlzKHApLm1hcChTPT5gJHtTfT0ke3BbU119YCkuam9pbigiJiIpLGUrKHM/Ij8iK3M6IiIpKyhyPyIjIityOiIiKX1sZXQgdFM9e21ldGhvZDpTdHJpbmcsZGF0YTpbT2JqZWN0LFN0cmluZyxBcnJheSxBcnJheUJ1ZmZlcl0sdXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOk9iamVjdCxkYXRhVHlwZTpTdHJpbmcscmVzcG9uc2VUeXBlOlN0cmluZyx3aXRoQ3JlZGVudGlhbHM6Qm9vbGVhbn0sblM9e2Zvcm1hdEFyZ3M6e21ldGhvZChlLHQpe3QubWV0aG9kPW1uKChlfHwiIikudG9VcHBlckNhc2UoKSxxdCl9LGRhdGEoZSx0KXt0LmRhdGE9ZXx8IiJ9LHVybChlLHQpe3QubWV0aG9kPT09cXRbMF0mJnEuaXNQbGFpbk9iamVjdCh0LmRhdGEpJiZPYmplY3Qua2V5cyh0LmRhdGEpLmxlbmd0aCYmKHQudXJsPWVTKGUsdC5kYXRhKSl9LGhlYWRlcihlLHQpe2xldCBuPXQuaGVhZGVyPWV8fHt9O3QubWV0aG9kIT09cXRbMF0mJihPYmplY3Qua2V5cyhuKS5maW5kKHI9PnIudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiKXx8KG5bIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIikpfSxkYXRhVHlwZShlLHQpe3QuZGF0YVR5cGU9KGV8fFpFLkpTT04pLnRvTG93ZXJDYXNlKCl9LHJlc3BvbnNlVHlwZShlLHQpe3QucmVzcG9uc2VUeXBlPShlfHwiIikudG9Mb3dlckNhc2UoKSxYRS5pbmRleE9mKHQucmVzcG9uc2VUeXBlKT09PS0xJiYodC5yZXNwb25zZVR5cGU9UUUpfX19LHJTPSJjb25maWdNVExTIixpUz17Y2VydGlmaWNhdGVzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfX0sb1M9e2Zvcm1hdEFyZ3M6e2NlcnRpZmljYXRlcyhlKXtpZihlLnNvbWUodD0+cS50b1Jhd1R5cGUodC5ob3N0KSE9PSJTdHJpbmciKSlyZXR1cm4iXHU1M0MyXHU2NTcwXHU5MTREXHU3RjZFXHU5NTE5XHU4QkVGXHVGRjBDXHU4QkY3XHU3ODZFXHU4QkE0XHU1NDBFXHU5MUNEXHU4QkQ1In19fSxhUz0iZG93bmxvYWRGaWxlIixzUz17Zm9ybWF0QXJnczp7aGVhZGVyKGUsdCl7dC5oZWFkZXI9ZXx8e319fX0sbFM9e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGhlYWRlcjpPYmplY3QsdGltZW91dDpOdW1iZXJ9LGNTPSJ1cGxvYWRGaWxlIix1Uz17Zm9ybWF0QXJnczp7ZmlsZVBhdGgoZSx0KXtlJiYodC5maWxlUGF0aD1xZShlKSl9LGhlYWRlcihlLHQpe3QuaGVhZGVyPWV8fHt9fSxmb3JtRGF0YShlLHQpe3QuZm9ybURhdGE9ZXx8e319fX0sZlM9e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVzOkFycmF5LGZpbGVQYXRoOlN0cmluZyxuYW1lOlN0cmluZyxoZWFkZXI6T2JqZWN0LGZvcm1EYXRhOk9iamVjdCx0aW1lb3V0Ok51bWJlcn0sZFM9ImNvbm5lY3RTb2NrZXQiLGhTPXtmb3JtYXRBcmdzOntoZWFkZXIoZSx0KXt0LmhlYWRlcj1lfHx7fX0sbWV0aG9kKGUsdCl7dC5tZXRob2Q9bW4oKGV8fCIiKS50b1VwcGVyQ2FzZSgpLHF0KX0scHJvdG9jb2xzKGUsdCl7cS5pc1N0cmluZyhlKSYmKHQucHJvdG9jb2xzPVtlXSl9fX0sZ1M9e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGhlYWRlcjp7dHlwZTpPYmplY3R9LG1ldGhvZDpTdHJpbmcscHJvdG9jb2xzOltBcnJheSxTdHJpbmddfSxwUz0ic2VuZFNvY2tldE1lc3NhZ2UiLHZTPXtkYXRhOltTdHJpbmcsQXJyYXlCdWZmZXJdfSxtUz0iY2xvc2VTb2NrZXQiLF9TPXtjb2RlOk51bWJlcixyZWFzb246U3RyaW5nfSxiUz0ic3RhcnRMb2NhdGlvblVwZGF0ZSIsY2c9Im9uTG9jYXRpb25DaGFuZ2UiLHlTPSJzdG9wTG9jYXRpb25VcGRhdGUiLEVTPSJvZmZMb2NhdGlvbkNoYW5nZSIsU1M9Im9mZkxvY2F0aW9uQ2hhbmdlRXJyb3IiLHVnPSJvbkxvY2F0aW9uQ2hhbmdlRXJyb3IiLGZnPVsid2dzODQiLCJnY2owMiJdLHdTPXt0eXBlOlN0cmluZ30sQVM9e2Zvcm1hdEFyZ3M6e3R5cGUoZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSxmZy5pbmRleE9mKGUpPT09LTE/dC50eXBlPWZnWzFdOnQudHlwZT1lfX19O2Z1bmN0aW9uIENTKGUpe2lmKCFxLmlzU3RyaW5nKGUpKXJldHVybiBlO2xldCB0PWUuaW5kZXhPZigiPyIpO2lmKHQ9PT0tMSlyZXR1cm4gZTtsZXQgbj1lLnNsaWNlKHQrMSkudHJpbSgpLnJlcGxhY2UoL14oXD98I3wmKS8sIiIpO2lmKCFuKXJldHVybiBlO2U9ZS5zbGljZSgwLHQpO2xldCByPVtdO3JldHVybiBuLnNwbGl0KCImIikuZm9yRWFjaChzPT57bGV0IHU9cy5yZXBsYWNlKC9cKy9nLCIgIikuc3BsaXQoIj0iKSxwPXUuc2hpZnQoKSxTPXUubGVuZ3RoPjA/dS5qb2luKCI9Iik6IiI7ci5wdXNoKHArIj0iK2VuY29kZVVSSUNvbXBvbmVudChTKSl9KSxyLmxlbmd0aD9lKyI/IityLmpvaW4oIiYiKTplfWxldCBUUz1bInNsaWRlLWluLXJpZ2h0Iiwic2xpZGUtaW4tbGVmdCIsInNsaWRlLWluLXRvcCIsInNsaWRlLWluLWJvdHRvbSIsImZhZGUtaW4iLCJ6b29tLW91dCIsInpvb20tZmFkZS1vdXQiLCJwb3AtaW4iLCJub25lIl0sT1M9WyJzbGlkZS1vdXQtcmlnaHQiLCJzbGlkZS1vdXQtbGVmdCIsInNsaWRlLW91dC10b3AiLCJzbGlkZS1vdXQtYm90dG9tIiwiZmFkZS1vdXQiLCJ6b29tLWluIiwiem9vbS1mYWRlLWluIiwicG9wLW91dCIsIm5vbmUiXSxzYz17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFBmPSJuYXZpZ2F0ZVRvIixOZj0icmVkaXJlY3RUbyIsZGc9InJlTGF1bmNoIixodT0ic3dpdGNoVGFiIixQUz0ibmF2aWdhdGVCYWNrIixndT0icHJlbG9hZFBhZ2UiLGtmPSJ1blByZWxvYWRQYWdlIixOUz1xLmV4dGVuZCh7fSxzYyxoZyhUUykpLGtTPXEuZXh0ZW5kKHtkZWx0YTp7dHlwZTpOdW1iZXJ9fSxoZyhPUykpLElTPXNjLFJTPXNjLHhTPXNjLEJTPXNjLE1TPXNjLExTPWxjKFBmKSxGUz1sYyhOZiksRFM9bGMoZGcpLFZTPWxjKGh1KSxVUz17Zm9ybWF0QXJnczp7ZGVsdGEoZSx0KXtlPXBhcnNlSW50KGUrIiIpfHwxLHQuZGVsdGE9TWF0aC5taW4oVW4oKS5sZW5ndGgtMSxlKX19fSwkUz1sYyhndSksSFM9bGMoa2YpO2Z1bmN0aW9uIGhnKGUpe3JldHVybnthbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3IodCl7aWYodCYmZS5pbmRleE9mKHQpPT09LTEpcmV0dXJuImAiK3QrImAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYGFuaW1hdGlvblR5cGVgIChzdXBwb3J0ZWQgdmFsdWVzIGFyZTogYCIrZS5qb2luKCJgfGAiKSsiYCkifX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyfX19bGV0IHB1O2Z1bmN0aW9uIGpTKCl7cHU9IiJ9ZnVuY3Rpb24gbGMoZSl7cmV0dXJue2Zvcm1hdEFyZ3M6e3VybDp6UyhlKX0sYmVmb3JlQWxsOmpTfX1mdW5jdGlvbiB6UyhlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZighbilyZXR1cm4nTWlzc2luZyByZXF1aXJlZCBhcmdzOiAidXJsIic7bj1pYShuKTtsZXQgcz1uLnNwbGl0KCI/IilbMF0sdT1LaShzLCEwKTtpZighdSlyZXR1cm4icGFnZSBgIituKyJgIGlzIG5vdCBmb3VuZCI7aWYoZT09PVBmfHxlPT09TmYpe2lmKHUubWV0YS5pc1RhYkJhcilyZXR1cm5gY2FuIG5vdCAke2V9IGEgdGFiYmFyIHBhZ2VgfWVsc2UgaWYoZT09PWh1JiYhdS5tZXRhLmlzVGFiQmFyKXJldHVybiJjYW4gbm90IHN3aXRjaCB0byBuby10YWJCYXIgcGFnZSI7aWYoKGU9PT1odXx8ZT09PWd1KSYmdS5tZXRhLmlzVGFiQmFyJiZyLm9wZW5UeXBlIT09ImFwcExhdW5jaCImJihuPXMpLHUubWV0YS5pc0VudHJ5JiYobj1uLnJlcGxhY2UodS5hbGlhcywiLyIpKSxyLnVybD1DUyhuKSxlIT09a2Ype2lmKGU9PT1ndSl7aWYoIXUubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYodS5tZXRhLmlzVGFiQmFyKXtsZXQgcD1VbigpLFM9dS5wYXRoLnNsaWNlKDEpO2lmKHAuZmluZChVPT5VLnJvdXRlPT09UykpcmV0dXJuInRhYkJhciBwYWdlIGAiK1MrImAgYWxyZWFkeSBleGlzdHMifXJldHVybn1pZihwdT09PW4mJnIub3BlblR5cGUhPT0iYXBwTGF1bmNoIilyZXR1cm5gJHtwdX0gbG9ja2VkYDtJLnJlYWR5JiYocHU9bil9fX1sZXQgV1M9ImhpZGVMb2FkaW5nIixHUz0iaGlkZVRvYXN0IixnZz0ibG9hZEZvbnRGYWNlIixZUz17ZmFtaWx5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sc291cmNlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGVzYzpPYmplY3R9LHFTPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxKUz0ic2V0TmF2aWdhdGlvbkJhckNvbG9yIixLUz17Zm9ybWF0QXJnczp7YW5pbWF0aW9uKGUsdCl7ZXx8KGU9e2R1cmF0aW9uOjAsdGltaW5nRnVuYzoibGluZWFyIn0pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sWlM9e2Zyb250Q29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcihlKXtpZihxUy5pbmRleE9mKGUpPT09LTEpcmV0dXJuYGludmFsaWQgZnJvbnRDb2xvciAiJHtlfSJgfX0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sYW5pbWF0aW9uOk9iamVjdH0sWFM9InNldE5hdmlnYXRpb25CYXJUaXRsZSIsUVM9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LGV3PSJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmciLHR3PSJoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmciLHBnPSJwYWdlU2Nyb2xsVG8iLG53PXtzY3JvbGxUb3A6TnVtYmVyLHNlbGVjdG9yOlN0cmluZyxkdXJhdGlvbjpOdW1iZXJ9LHJ3PXtmb3JtYXRBcmdzOntkdXJhdGlvbjozMDB9fSxpdz0ic2hvd0FjdGlvblNoZWV0Iixvdz17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHRpdGxlOlN0cmluZyxpdGVtQ29sb3I6U3RyaW5nLHBvcG92ZXI6T2JqZWN0fSxhdz17Zm9ybWF0QXJnczp7aXRlbUNvbG9yOiIjMDAwIn19LHN3PSJzaG93TG9hZGluZyIsbHc9e3RpdGxlOlN0cmluZyxtYXNrOkJvb2xlYW59LGN3PXtmb3JtYXRBcmdzOnt0aXRsZToiIixtYXNrOiExfX0sdXc9InNob3dNb2RhbCIsZnc9e3RpdGxlOlN0cmluZyxjb250ZW50OlN0cmluZyxzaG93Q2FuY2VsOkJvb2xlYW4sY2FuY2VsVGV4dDpTdHJpbmcsY2FuY2VsQ29sb3I6U3RyaW5nLGNvbmZpcm1UZXh0OlN0cmluZyxjb25maXJtQ29sb3I6U3RyaW5nfSxkdz17YmVmb3JlSW52b2tlKCl7QW8oKX0sZm9ybWF0QXJnczp7dGl0bGU6IiIsY29udGVudDoiIixwbGFjZWhvbGRlclRleHQ6IiIsc2hvd0NhbmNlbDohMCxlZGl0YWJsZTohMSxjYW5jZWxUZXh0KGUsdCl7aWYoIXEuaGFzT3duKHQsImNhbmNlbFRleHQiKSl7bGV0e3Q6bn09RXQoKTt0LmNhbmNlbFRleHQ9bigidW5pLnNob3dNb2RhbC5jYW5jZWwiKX19LGNhbmNlbENvbG9yOiIjMDAwIixjb25maXJtVGV4dChlLHQpe2lmKCFxLmhhc093bih0LCJjb25maXJtVGV4dCIpKXtsZXR7dDpufT1FdCgpO3QuY29uZmlybVRleHQ9bigidW5pLnNob3dNb2RhbC5jb25maXJtIil9fSxjb25maXJtQ29sb3I6bmUuUFJJTUFSWV9DT0xPUn19LGh3PSJzaG93VG9hc3QiLGd3PVsic3VjY2VzcyIsImxvYWRpbmciLCJub25lIiwiZXJyb3IiXSxwdz17dGl0bGU6U3RyaW5nLGljb246U3RyaW5nLGltYWdlOlN0cmluZyxkdXJhdGlvbjpOdW1iZXIsbWFzazpCb29sZWFufSx2dz17Zm9ybWF0QXJnczp7dGl0bGU6IiIsaWNvbihlLHQpe3QuaWNvbj1tbihlLGd3KX0saW1hZ2UoZSx0KXtlP3QuaW1hZ2U9cWUoZSk6dC5pbWFnZT0iIn0sZHVyYXRpb246MTUwMCxtYXNrOiExfX0sbXc9InN0YXJ0UHVsbERvd25SZWZyZXNoIixfdz0ic3RvcFB1bGxEb3duUmVmcmVzaCIsVmM9e2luZGV4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMH19LFlzPXtiZWZvcmVJbnZva2UoKXtsZXQgZT1YYSgpO2lmKGUmJiFlLmlzVGFiQmFyKXJldHVybiJub3QgVGFiQmFyIHBhZ2UifSxmb3JtYXRBcmdzOntpbmRleChlKXtpZighSS50YWJCYXIubGlzdFtlXSlyZXR1cm4idGFiYmFyIGl0ZW0gbm90IGZvdW5kIn19fSxidz0ic2V0VGFiQmFySXRlbSIseXc9cS5leHRlbmQoe3RleHQ6U3RyaW5nLGljb25QYXRoOlN0cmluZyxzZWxlY3RlZEljb25QYXRoOlN0cmluZyxwYWdlUGF0aDpTdHJpbmd9LFZjKSxFdz17YmVmb3JlSW52b2tlOllzLmJlZm9yZUludm9rZSxmb3JtYXRBcmdzOnEuZXh0ZW5kKHtwYWdlUGF0aChlLHQpe2UmJih0LnBhZ2VQYXRoPW5lLnJlbW92ZUxlYWRpbmdTbGFzaChlKSl9fSxZcy5mb3JtYXRBcmdzKX0sU3c9InNldFRhYkJhclN0eWxlIix3dz17Y29sb3I6U3RyaW5nLHNlbGVjdGVkQ29sb3I6U3RyaW5nLGJhY2tncm91bmRDb2xvcjpTdHJpbmcsYmFja2dyb3VuZEltYWdlOlN0cmluZyxiYWNrZ3JvdW5kUmVwZWF0OlN0cmluZyxib3JkZXJTdHlsZTpTdHJpbmd9LEF3PS9eKGxpbmVhcnxyYWRpYWwpLWdyYWRpZW50XCguKz9cKTs/JC8sQ3c9e2JlZm9yZUludm9rZTpZcy5iZWZvcmVJbnZva2UsZm9ybWF0QXJnczp7YmFja2dyb3VuZEltYWdlKGUsdCl7ZSYmIUF3LnRlc3QoZSkmJih0LmJhY2tncm91bmRJbWFnZT1xZShlKSl9LGJvcmRlclN0eWxlKGUsdCl7ZSYmKHQuYm9yZGVyU3R5bGU9ZT09PSJ3aGl0ZSI/IndoaXRlIjoiYmxhY2siKX19fSxUdz0iaGlkZVRhYkJhciIsdmc9e2FuaW1hdGlvbjpCb29sZWFufSxPdz0ic2hvd1RhYkJhciIsUHc9dmcsTnc9ImhpZGVUYWJCYXJSZWREb3QiLGt3PVZjLEl3PVlzLFJ3PSJzaG93VGFiQmFyUmVkRG90Iix4dz1WYyxCdz1ZcyxNdz0icmVtb3ZlVGFiQmFyQmFkZ2UiLEx3PVZjLEZ3PVlzLER3PSJzZXRUYWJCYXJCYWRnZSIsVnc9cS5leHRlbmQoe3RleHQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sVmMpLFV3PXtiZWZvcmVJbnZva2U6WXMuYmVmb3JlSW52b2tlLGZvcm1hdEFyZ3M6cS5leHRlbmQoe3RleHQoZSx0KXtuZS5nZXRMZW4oZSk+PTQmJih0LnRleHQ9Ii4uLiIpfX0sWXMuZm9ybWF0QXJncyl9LCR3PSJnZXRQcm92aWRlciIsSHc9e3NlcnZpY2U6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sanc9ImxvZ2luIix6dz17cHJvdmlkZXI6U3RyaW5nLHNjb3BlczpbU3RyaW5nLEFycmF5XSx0aW1lb3V0Ok51bWJlcix1bml2ZXJpZnlTdHlsZTpPYmplY3Qsb25seUF1dGhvcml6ZTpCb29sZWFufSxXdz0iZ2V0VXNlckluZm8iLEd3PXtwcm92aWRlcjpTdHJpbmcsd2l0aENyZWRlbnRpYWxzOkJvb2xlYW4sdGltZW91dDpOdW1iZXIsbGFuZzpTdHJpbmd9LFl3PSJnZ2V0VXNlclByb2ZpbGVnZXRVc2VyUHJvZmlsZSIscXc9e3Byb3ZpZGVyOlN0cmluZyx3aXRoQ3JlZGVudGlhbHM6Qm9vbGVhbix0aW1lb3V0Ok51bWJlcixsYW5nOlN0cmluZ30sSnc9InByZUxvZ2luIixLdz17VU5JVkVSSUZZOiJ1bml2ZXJpZnkifSxadz17Zm9ybWF0QXJnczp7cHJvdmlkZXIoZSx0KXtpZihPYmplY3QudmFsdWVzKEt3KS5pbmRleE9mKFN0cmluZyhlKSk8MClyZXR1cm4icHJvdmlkZXIgZXJyb3IifX19LFh3PXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxRdz0iY2xvc2VBdXRoVmlldyIsZUE9ImdldENoZWNrQm94U3RhdGUiLHRBPSJnZXRVbml2ZXJpZnlNYW5hZ2VyIixuQT0ic2hhcmUiLG1nPVsiV1hTY2VuZVNlc3Npb24iLCJXWFNjZW5lVGltZWxpbmUiLCJXWFNjZW5lRmF2b3JpdGUiXSxyQT17Zm9ybWF0QXJnczp7c2NlbmUoZSx0KXtsZXR7cHJvdmlkZXI6bixvcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdDpyfT10O2lmKG49PT0id2VpeGluIiYmIXImJighZXx8IW1nLmluY2x1ZGVzKGUpKSlyZXR1cm5gXHU1MjA2XHU0RUFCXHU1MjMwXHU1RkFFXHU0RkUxXHU2NUY2XHVGRjBDc2NlbmVcdTVGQzVcdTk4N0JcdTRFM0FcdTRFRTVcdTRFMEJcdTUxNzZcdTRFMkRcdTRFMDBcdTRFMkFcdUZGMUEke21nLmpvaW4oIlx1MzAwMSIpfWB9LHN1bW1hcnkoZSx0KXtpZih0LnR5cGU9PT0xJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU3RUFGXHU2NTg3XHU2NzJDXHU2NUY2XHVGRjBDc3VtbWFyeVx1NUZDNVx1NTg2QiJ9LGhyZWYoZSx0KXtpZih0LnR5cGU9PT0wJiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1NkZFXHU2NTg3XHU2NUY2XHVGRjBDaHJlZlx1NUZDNVx1NTg2QiJ9LGltYWdlVXJsKGUsdCl7aWYoWzAsMiw1XS5pbmNsdWRlcyhOdW1iZXIodC50eXBlKSkmJiFlKXJldHVybiJcdTUyMDZcdTRFQUJcdTU2RkVcdTY1ODdcdTMwMDFcdTdFQUZcdTU2RkVcdTcyNDdcdTMwMDFcdTVDMEZcdTdBMEJcdTVFOEZcdTY1RjZcdUZGMENpbWFnZVVybFx1NUZDNVx1NTg2Qlx1RkYwQ1x1NjNBOFx1ODM1MFx1NEY3Rlx1NzUyOFx1NUMwRlx1NEU4RTIwS2JcdTc2ODRcdTU2RkVcdTcyNDcifSxtZWRpYVVybChlLHQpe2lmKFszLDRdLmluY2x1ZGVzKE51bWJlcih0LnR5cGUpKSYmIWUpcmV0dXJuIlx1NTIwNlx1NEVBQlx1OTdGM1x1NEU1MFx1MzAwMVx1ODlDNlx1OTg5MVx1NjVGNlx1RkYwQ21lZGlhVXJsXHU1RkM1XHU1ODZCIn0sbWluaVByb2dyYW0oZSx0KXtpZih0LnR5cGU9PT01JiYhZSlyZXR1cm4iXHU1MjA2XHU0RUFCXHU1QzBGXHU3QTBCXHU1RThGXHU2NUY2XHVGRjBDbWluaVByb2dyYW1cdTVGQzVcdTU4NkIifSxjb3JwaWQoZSx0KXtpZih0Lm9wZW5DdXN0b21lclNlcnZpY2VDaGF0JiYhZSlyZXR1cm4iXHU0RjdGXHU3NTI4XHU2MjUzXHU1RjAwXHU1QkEyXHU2NzBEXHU1MjlGXHU4MEZEXHU2NUY2IGNvcnBpZCBcdTVGQzVcdTU4NkIifSxjdXN0b21lclVybChlLHQpe2lmKHQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQmJiFlKXJldHVybiJcdTRGN0ZcdTc1MjhcdTYyNTNcdTVGMDBcdTVCQTJcdTY3MERcdTUyOUZcdTgwRkRcdTY1RjYgY3VzdG9tZXJVcmwgXHU1RkM1XHU1ODZCIn19fSxpQT17cHJvdmlkZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx0eXBlOk51bWJlcix0aXRsZTpTdHJpbmcsc2NlbmU6U3RyaW5nLHN1bW1hcnk6U3RyaW5nLGhyZWY6U3RyaW5nLGltYWdlVXJsOlN0cmluZyxtZWRpYVVybDpTdHJpbmcsbWluaVByb2dyYW06T2JqZWN0fSxvQT0ic2hhcmVXaXRoU3lzdGVtIixfZz1bInRleHQiLCJpbWFnZSJdLGFBPXtmb3JtYXRBcmdzOnt0eXBlKGUsdCl7aWYoZSYmIV9nLmluY2x1ZGVzKGUpKXJldHVybiJcdTUyMDZcdTRFQUJcdTUzQzJcdTY1NzAgdHlwZSBcdTRFMERcdTZCNjNcdTc4NkVcdTMwMDJcdTUzRUFcdTY1MkZcdTYzMDF0ZXh0XHUzMDAxaW1hZ2UiO3QudHlwZT1tbihlLF9nKX19fSxzQT17dHlwZTpTdHJpbmcsc3VtbWFyeTpTdHJpbmcsaHJlZjpTdHJpbmcsaW1hZ2VVcmw6U3RyaW5nfSxsQT0icmVxdWVzdFBheW1lbnQiLGNBPXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LG9yZGVySW5mbzp7dHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9LHRpbWVTdGFtcDpTdHJpbmcsbm9uY2VTdHI6U3RyaW5nLHBhY2thZ2U6U3RyaW5nLHNpZ25UeXBlOlN0cmluZyxwYXlTaWduOlN0cmluZ30sdUE9ImNyZWF0ZVB1c2hNZXNzYWdlIixmQT17Zm9ybWF0QXJnczp7Y29udGVudChlKXtpZighZSlyZXR1cm4iY29udGVudCBpcyByZXF1aXJlZCJ9fX0sZEE9ImdldENoYW5uZWxNYW5hZ2VyIixoQT0iY3JlYXRlUmV3YXJkZWRWaWRlb0FkIixnQT17Zm9ybWF0QXJnczp7YWRwaWQ6IiIsYWRVbml0SWQ6IiJ9fSxwQT17YWRwaWQ6U3RyaW5nLGFkVW5pdElkOlN0cmluZ30sdkE9ImNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkIixtQT17Zm9ybWF0QXJnczp7YWRwaWQ6IiJ9fSxfQT17YWRwaWQ6U3RyaW5nfSxiQT0iY3JlYXRlSW50ZXJzdGl0aWFsQWQiLHlBPXtmb3JtYXRBcmdzOnthZHBpZDoiIixhZFVuaXRJZDoiIn19LEVBPXthZHBpZDpTdHJpbmcsYWRVbml0SWQ6U3RyaW5nfSxTQT0iY3JlYXRlSW50ZXJhY3RpdmVBZCIsd0E9e2Zvcm1hdEFyZ3M6e2FkcGlkKGUsdCl7aWYoIWUpcmV0dXJuImFkcGlkIHNob3VsZCBub3QgYmUgZW1wdHkuIjtlJiYodC5hZHBpZD1lKX0scHJvdmlkZXIoZSx0KXtpZighZSlyZXR1cm4icHJvdmlkZXIgc2hvdWxkIG5vdCBiZSBlbXB0eS4iO2UmJih0LnByb3ZpZGVyPWUpfX19LEFBPXthZHBpZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHByb3ZpZGVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19O2Z1bmN0aW9uIENsKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe2RlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSxxLmlzRnVuY3Rpb24odCkmJihyPXQocikpLGUocil9fWZ1bmN0aW9uIEFyKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3I9cnx8e30sdD1yLm1lc3NhZ2V8fHR8fCIiLGRlbGV0ZSByLm1lc3NhZ2UsZSh0LHEuZXh0ZW5kKHtjb2RlOjB9LHIpKX19ZnVuY3Rpb24gY2MoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlKCkoZnVuY3Rpb24ocil7ciYmKGRlbGV0ZSByLmNvZGUsZGVsZXRlIHIubWVzc2FnZSksZnQuaW52b2tlT25DYWxsYmFjayh0LHIpfSl9fWZ1bmN0aW9uIEVpKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocix7cmVzb2x2ZTpzLHJlamVjdDp1fSl7ZSgpKHEuZXh0ZW5kKHt9LHEuaXNGdW5jdGlvbih0KT90KHIpOnIse3N1Y2Nlc3M6Q2wocyxuKSxmYWlsOkFyKHUpfSkpfX1mdW5jdGlvbiBVYyhlPSIiKXtpZighKEkudGFiQmFyJiZxLmlzQXJyYXkoSS50YWJCYXIubGlzdCkpKXJldHVybiExO3RyeXtpZighZSl7bGV0IG49VW4oKTtpZighbi5sZW5ndGgpcmV0dXJuITE7bGV0IHI9bltuLmxlbmd0aC0xXTtyZXR1cm4gcj9yLiRwYWdlLm1ldGEuaXNUYWJCYXI6ITF9L15cLy8udGVzdChlKXx8KGU9bmUuYWRkTGVhZGluZ1NsYXNoKGUpKTtsZXQgdD1LaShlKTtyZXR1cm4gdCYmdC5tZXRhLmlzVGFiQmFyfWNhdGNoKHQpe31yZXR1cm4hMX1sZXQgR2E9Il9fVFlQRSIsQ0E9InVuaS1zdG9yYWdlLWtleXMiO2Z1bmN0aW9uIElmKGUpe2xldCB0PVsib2JqZWN0Iiwic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiIsInVuZGVmaW5lZCJdO3RyeXtsZXQgbj1xLmlzU3RyaW5nKGUpP0pTT04ucGFyc2UoZSk6ZSxyPW4udHlwZTtpZih0LmluZGV4T2Yocik+PTApe2xldCBzPU9iamVjdC5rZXlzKG4pO2lmKHMubGVuZ3RoPT09MiYmImRhdGEiaW4gbil7aWYodHlwZW9mIG4uZGF0YT09PXIpcmV0dXJuIG4uZGF0YTtpZihyPT09Im9iamVjdCImJi9eXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn1cOlxkezJ9XDpcZHsyfVwuXGR7M31aJC8udGVzdChuLmRhdGEpKXJldHVybiBuZXcgRGF0ZShuLmRhdGEpfWVsc2UgaWYocy5sZW5ndGg9PT0xKXJldHVybiIifX1jYXRjaChuKXt9fWxldCBUQT1CdChXMCwoZSx0KT0+e2xldCBuPXR5cGVvZiB0LHI9bj09PSJzdHJpbmciP3Q6SlNPTi5zdHJpbmdpZnkoe3R5cGU6bixkYXRhOnR9KTt0cnl7bj09PSJzdHJpbmciJiZJZihyKSE9PXZvaWQgMD9vLnN0b3JhZ2Uuc2V0SXRlbShlK0dhLG4pOm8uc3RvcmFnZS5yZW1vdmVJdGVtKGUrR2EpLG8uc3RvcmFnZS5zZXRJdGVtKGUscil9Y2F0Y2gocyl7fX0sRzApLE9BPVRlKGowLCh7a2V5OmUsZGF0YTp0fSx7cmVzb2x2ZTpuLHJlamVjdDpyfSk9PntsZXQgcz10eXBlb2YgdCx1PXM9PT0ic3RyaW5nIj90OkpTT04uc3RyaW5naWZ5KHt0eXBlOnMsZGF0YTp0fSk7dHJ5e2xldCBwPW8uc3RvcmFnZTtzPT09InN0cmluZyImJklmKHUpIT09dm9pZCAwP3Auc2V0SXRlbUFzeW5jKGUrR2EscywoKT0+e30pOnAucmVtb3ZlSXRlbUFzeW5jKGUrR2EsKCk9Pnt9KSxwLnNldEl0ZW1Bc3luYyhlLHUsbixBcihyKSl9Y2F0Y2gocCl7cihwLm1lc3NhZ2UpfX0sejApO2Z1bmN0aW9uIFJmKGUsdCl7bGV0IG49dDtpZihlIT09InN0cmluZyJ8fGU9PT0ic3RyaW5nIiYmdD09PSd7InR5cGUiOiJ1bmRlZmluZWQifScpdHJ5e2xldCByPUpTT04ucGFyc2UodCkscz1JZihyKTtpZihzIT09dm9pZCAwKW49cztlbHNlIGlmKGUmJihuPXIscS5pc1N0cmluZyhyKSkpe3I9SlNPTi5wYXJzZShyKTtsZXQgdT10eXBlb2Ygcjt1PT09Im51bWJlciImJmU9PT0iZGF0ZSI/bj1uZXcgRGF0ZShyKTp1PT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2gocil7fXJldHVybiBufWxldCBQQT1CdChIMCxlPT57bGV0IHQ9by5zdG9yYWdlLmdldEl0ZW0oZSkscj0oby5zdG9yYWdlLmdldEl0ZW0oZStHYSl8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiBxLmlzU3RyaW5nKHQpP1JmKHIsdCk6IiJ9LGlnKSxOQT1UZSgkMCwoe2tleTplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1vLnN0b3JhZ2U7ci5nZXRJdGVtQXN5bmMoZSxmdW5jdGlvbihzKXtyLmdldEl0ZW1Bc3luYyhlK0dhLGZ1bmN0aW9uKHUpe2xldCBTPSh1LmRhdGF8fCIiKS50b0xvd2VyQ2FzZSgpO3Qoe2RhdGE6UmYoUyxzLmRhdGEpfSl9LGZ1bmN0aW9uKCl7dCh7ZGF0YTpSZigiIixzLmRhdGEpfSl9KX0sQXIobikpfSxyZyksa0E9QnQob2csZT0+e28uc3RvcmFnZS5yZW1vdmVJdGVtKGUrR2EpLG8uc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSxxMCksSUE9VGUob2csKHtrZXk6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57by5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhlK0dhLCgpPT57fSksby5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhlLHQsQXIobikpfSxZMCksUkE9QnQoImNsZWFyU3RvcmFnZVN5bmMiLCgpPT57by5zdG9yYWdlLmNsZWFyKCl9KSx4QT1UZSgiY2xlYXJTdG9yYWdlIiwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntvLnN0b3JhZ2UuY2xlYXJBc3luYyh0LEFyKG4pKX0pLGJnPUJ0KCJnZXRTdG9yYWdlSW5mb1N5bmMiLCgpPT57bGV0IGU9by5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2xldCBzPW8uc3RvcmFnZS5rZXkocik7aWYocyE9PUNBJiYocy5pbmRleE9mKEdhKTwwfHxzLmluZGV4T2YoR2EpK0dhLmxlbmd0aCE9PXMubGVuZ3RoKSl7bGV0IHU9by5zdG9yYWdlLmdldEl0ZW0ocyk7bis9cy5sZW5ndGgrdS5sZW5ndGgsdC5wdXNoKHMpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbChuKjIvMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUV9fSksQkE9VGUoImdldFN0b3JhZ2VJbmZvIiwoZSx7cmVzb2x2ZTp0fSk9Pnt0KGJnKCkpfSksTUE9VGUobkUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57by5pby5nZXRGaWxlSW5mbyhxLmV4dGVuZChlLHtzdWNjZXNzOkNsKHQpLGZhaWw6QXIobil9KSl9LGlFLHJFKSxMQT0wLHlnPSJ1bmlhcHBfc2F2ZSIsRkE9YF9kb2MvJHt5Z31gO2Z1bmN0aW9uIERBKGUsdCl7dD10fHxmdW5jdGlvbigpe30sby5pby5yZXF1ZXN0RmlsZVN5c3RlbShvLmlvLlBSSVZBVEVfRE9DLG49PntuLnJvb3QuZ2V0RGlyZWN0b3J5KHlnLHtjcmVhdGU6ITB9LGUsdCl9LHQpfWxldCBWQT1UZShKMCwoe3RlbXBGaWxlUGF0aDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1BcihuKSxzPWAke0RhdGUubm93KCl9JHtMQSsrfSR7VGEoZSl9YDtvLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZSx1PT57REEocD0+e3UuY29weVRvKHAscywoKT0+e2xldCBTPUZBKyIvIitzO3Qoe3NhdmVkRmlsZVBhdGg6U30pfSxyKX0scil9LHIpfSxaMCxLMCksVUE9InVuaWFwcF9zYXZlIjtmdW5jdGlvbiAkQShlLHQpe3Q9dHx8ZnVuY3Rpb24oKXt9LG8uaW8ucmVxdWVzdEZpbGVTeXN0ZW0oby5pby5QUklWQVRFX0RPQyxuPT57bi5yb290LmdldERpcmVjdG9yeShVQSx7Y3JlYXRlOiEwfSxlLHQpfSx0KX1sZXQgSEE9VGUoWDAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9QXIobik7JEEocz0+e3ZhciB1PXMuY3JlYXRlUmVhZGVyKCkscD1bXTt1LnJlYWRFbnRyaWVzKFM9PntTJiZTLmxlbmd0aD9TLmZvckVhY2goVT0+e1UuZ2V0TWV0YWRhdGEoUD0+e3AucHVzaCh7ZmlsZVBhdGg6by5pby5jb252ZXJ0QWJzb2x1dGVGaWxlU3lzdGVtKFUuZnVsbFBhdGgpLGNyZWF0ZVRpbWU6UC5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOlAuc2l6ZX0pLHAubGVuZ3RoPT09Uy5sZW5ndGgmJnQoe2ZpbGVMaXN0OnB9KX0sciwhMSl9KTp0KHtmaWxlTGlzdDpwfSl9LHIpfSxyKX0pLGpBPVRlKG9FLCh7ZmlsZVBhdGg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9QXIobik7by5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKGUscz0+e3MuZ2V0TWV0YWRhdGEodT0+e3Qoe2NyZWF0ZVRpbWU6dS5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOnUuc2l6ZX0pfSxyLCExKX0scil9LHNFLGFFKSx6QT1UZShRMCwoe2ZpbGVQYXRoOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPUFyKG4pO28uaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChlLHM9PntzLnJlbW92ZSgoKT0+e3QoKX0scil9LHIpfSx0RSxlRSksV0E9VGUobEUsKHtmaWxlUGF0aDplLGZpbGVUeXBlOnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e2xldCBzPUFyKHIpO28ucnVudGltZS5vcGVuRG9jdW1lbnQocWUoZSksdm9pZCAwLG4scyl9LHVFLGNFKSxHQT1CdChJeSxlPT4hIXEuaGFzT3duKFIsZSksUnkpLCRjLEVnPW8ubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlO2Z1bmN0aW9uIFlBKGUpe0VnPWV9ZnVuY3Rpb24gU2coZSl7JGM9ZSxFZyhlKX1vLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT1TZztmdW5jdGlvbiBocyhlKXtpZighZSl7bGV0IHQ9RHIoKTtpZighdHx8KGU9dC4kcGFnZS5zdGF0dXNCYXJTdHlsZSwhZXx8ZT09PSRjKSlyZXR1cm59ZSE9PSRjJiYoJGM9ZSxvLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShlKSl9ZnVuY3Rpb24gd2coZSl7ZnQub24obmUuT05fVEhFTUVfQ0hBTkdFLGUpfWZ1bmN0aW9uIHFBKGUpe2Z0Lm9mZihuZS5PTl9USEVNRV9DSEFOR0UsZSl9ZnVuY3Rpb24gSkEoKXtyZXR1cm4gQWcoKT09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIn1mdW5jdGlvbiBBZygpe3JldHVybiBvLm5hdmlnYXRvci5nZXRVSVN0eWxlKCl9ZnVuY3Rpb24gS0EoKXtpZihJLmRhcmttb2RlKXtsZXQgZT1KQSgpO2hzKGUpLHhuKCkuZm9yRWFjaChuPT57bi4kcGFnZS5zdGF0dXNCYXJTdHlsZT1lfSl9fWZ1bmN0aW9uIHhmKGUpe2lmKEkuZGFya21vZGUpe2xldCB0PXt9LG49by5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLHI9amMoKTtyZXR1cm4gciYmci5ob3N0VGhlbWUmJihuPXIuaG9zdFRoZW1lKSx0PW5lLm5vcm1hbGl6ZVN0eWxlcyhlLEkudGhlbWVDb25maWcsbiksdH1yZXR1cm4gZX1mdW5jdGlvbiBaQShlLHQpe2lmKEkuZGFya21vZGUpe2xldCBuPSgpPT57bGV0e2xpc3Q6cj1bXSxjb2xvcjpzLHNlbGVjdGVkQ29sb3I6dSxiYWNrZ3JvdW5kQ29sb3I6cCxib3JkZXJTdHlsZTpTLG1pZEJ1dHRvbjpVfT14Zih0KTtlJiYoZS5zZXRUYWJCYXJTdHlsZSh7Y29sb3I6cyxzZWxlY3RlZENvbG9yOnUsYmFja2dyb3VuZENvbG9yOnAsYm9yZGVyU3R5bGU6UyxtaWRCdXR0b246VX0pLGUuc2V0VGFiQmFySXRlbXMoe2xpc3Q6ci5tYXAoUD0+KHtpY29uUGF0aDpQLmljb25QYXRoLHNlbGVjdGVkSWNvblBhdGg6UC5zZWxlY3RlZEljb25QYXRoLHZpc2libGU6UC52aXNpYmxlfSkpfSkpfTtuKCksd2cobil9fWZ1bmN0aW9uIENnKGUsdCl7aWYoSS5kYXJrbW9kZSl7bGV0IG49KCk9PntsZXQgcj10KCk7ci5hbmltYXRpb25BbHBoYUJHQ29sb3Isci5iYWNrZ3JvdW5kLHIuYmFja2dyb3VuZENvbG9yQm90dG9tLHIuYmFja2dyb3VuZENvbG9yVG9wO3ZhciBzPXIudGl0bGVOVmlldzt0eXBlb2YgcyE9InVuZGVmaW5lZCImJnR5cGVvZiBzPT0ib2JqZWN0IiYmKHMuYmFja2dyb3VuZENvbG9yLHMudGl0bGVDb2xvciksZSYmZS5zZXRTdHlsZShyKX07d2cobiksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PnFBKG4pKX19bGV0IEhjLEJmPSEwLGZyO2Z1bmN0aW9uIFhBKGUsdCxuKXshZnJ8fChlPT09Im5vbmUiPyhmci5oaWRlVGFiQmFyUmVkRG90KHtpbmRleDp0fSksZnIucmVtb3ZlVGFiQmFyQmFkZ2Uoe2luZGV4OnR9KSk6ZT09PSJ0ZXh0Ij9mci5zZXRUYWJCYXJCYWRnZSh7aW5kZXg6dCx0ZXh0Om59KTplPT09InJlZERvdCImJmZyLnNob3dUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSl9ZnVuY3Rpb24gUUEoZSl7ZnImJmZyLnNldFRhYkJhckl0ZW1zKGUpfWZ1bmN0aW9uIGVDKGUsdCxuLHIscyx1KXtsZXQgcD17aW5kZXg6ZX07aWYodCE9PXZvaWQgMCYmKHAudGV4dD10KSxuJiYocC5pY29uUGF0aD1xZShuKSksciYmKHAuc2VsZWN0ZWRJY29uUGF0aD1xZShyKSksdSE9PXZvaWQgMCYmKHAuaWNvbmZvbnQ9dSkscyE9PXZvaWQgMCl7cC52aXNpYmxlPUhjLmxpc3RbZV0udmlzaWJsZT1zLGRlbGV0ZSBwLmluZGV4O2xldCBTPUhjLmxpc3QubWFwKFU9Pih7dmlzaWJsZTpVLnZpc2libGV9KSk7U1tlXT1wLFFBKHtsaXN0OlN9KX1lbHNlIGZyJiZmci5zZXRUYWJCYXJJdGVtKHApfWZ1bmN0aW9uIHRDKGUpe2ZyJiZmci5zZXRUYWJCYXJTdHlsZShlKX1mdW5jdGlvbiBuQyhlKXtCZj0hMSxmciYmZnIuaGlkZVRhYkJhcih7YW5pbWF0aW9uOmV9KX1mdW5jdGlvbiByQyhlKXtCZj0hMCxmciYmZnIuc2hvd1RhYkJhcih7YW5pbWF0aW9uOmV9KX1sZXQgdnU9W107dmFyIFNpPXtpZDoiMCIsaW5pdChlLHQpe2UmJmUubGlzdC5sZW5ndGgmJihIYz1lKTt0cnl7ZnI9Zi5yZXF1aXJlTW9kdWxlKCJ1bmktdGFidmlldyIpfWNhdGNoKG4pe2NvbnNvbGUubG9nKGB1bmkucmVxdWlyZU5hdGl2ZVBsdWdpbigidW5pLXRhYnZpZXciKSBlcnJvciAke259YCl9ZnIub25NYXNrQ2xpY2soKCk9Pnt2dS5mb3JFYWNoKG49PntuKCl9KX0pLGZyJiZmci5vbkNsaWNrKCh7aW5kZXg6bn0pPT57dChIYy5saXN0W25dLG4pfSksZnImJmZyLm9uTWlkQnV0dG9uQ2xpY2soKCk9PmZ0Lmludm9rZU9uQ2FsbGJhY2soJGgpKSxaQShmcixlKX0saW5kZXhPZihlKXtsZXQgdD10aGlzLmNvbmZpZyxuPXQmJnQubGlzdCYmdC5saXN0Lmxlbmd0aDtpZihuKXtmb3IobGV0IHI9MDtyPG47cisrKWlmKHQubGlzdFtyXS5wYWdlUGF0aD09PWV8fHQubGlzdFtyXS5wYWdlUGF0aD09PWAke2V9Lmh0bWxgKXJldHVybiByfXJldHVybi0xfSxzd2l0Y2hUYWIoZSl7bGV0IHQ9dGhpcy5pbmRleE9mKGUpO3JldHVybiB0Pj0wPyhmciYmZnIuc3dpdGNoU2VsZWN0KHtpbmRleDp0fSksITApOiExfSxzZXRUYWJCYXJCYWRnZTpYQSxzZXRUYWJCYXJJdGVtOmVDLHNldFRhYkJhclN0eWxlOnRDLGhpZGVUYWJCYXI6bkMsc2hvd1RhYkJhcjpyQyxhcHBlbmQoZSl7ZnImJmZyLmFwcGVuZCh7aWQ6ZS5pZH0sKHtjb2RlOnR9KT0+e3QhPT0wJiZDKCgpPT57dGhpcy5hcHBlbmQoZSl9LDIwKX0pfSxnZXQgY29uZmlnKCl7cmV0dXJuIEhjfHxJLnRhYkJhcn0sZ2V0IHZpc2libGUoKXtyZXR1cm4gQmZ9LGdldCBoZWlnaHQoKXtsZXQgZT10aGlzLmNvbmZpZztyZXR1cm4oZSYmZS5oZWlnaHQ/cGFyc2VGbG9hdChlLmhlaWdodCk6bmUuVEFCQkFSX0hFSUdIVCkrby5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS5kZXZpY2VCb3R0b219LGdldCBjb3Zlcigpe2xldCBlPXRoaXMuY29uZmlnO3JldHVybiBlJiZbImV4dHJhbGlnaHQiLCJsaWdodCIsImRhcmsiXS5pbmRleE9mKGUuYmx1ckVmZmVjdCk+PTB9LHNldFN0eWxlKHttYXNrOmV9KXtmci5zZXRNYXNrKHtjb2xvcjplfSl9LGFkZEV2ZW50TGlzdGVuZXIoZSx0KXt2dS5wdXNoKHQpfSxyZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IG49dnUuaW5kZXhPZih0KTt2dS5zcGxpY2UobiwxKX19O2Z1bmN0aW9uIG11KCl7bGV0IGU9RHIoKTtyZXR1cm4gZT9lLiRnZXRBcHBXZWJ2aWV3KCk6bnVsbH1mdW5jdGlvbiBUZyhlKXtyZXR1cm4gZT9lLiRnZXRBcHBXZWJ2aWV3KCk6bXUoKX1sZXQgT2c9bnVsbDtmdW5jdGlvbiBQZygpe3JldHVybiBPZ31mdW5jdGlvbiBNZihlKXtPZz1lfWZ1bmN0aW9uIExmKCl7cmV0dXJuIG8ubmF2aWdhdG9yLmlzSW1tZXJzZWRTdGF0dXNiYXIoKT9NYXRoLnJvdW5kKG8ub3MubmFtZT09PSJpT1MiP28ubmF2aWdhdG9yLmdldFNhZmVBcmVhSW5zZXRzKCkudG9wOm8ubmF2aWdhdG9yLmdldFN0YXR1c2JhckhlaWdodCgpKTowfWZ1bmN0aW9uIE5nKCl7bGV0IGU9by5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKTtyZXR1cm4gZT09PSJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCJ8fGU9PT0iVUlTdGF0dXNCYXJTdHlsZUJsYWNrT3BhcXVlInx8ZT09PSJudWxsIj9lPSJsaWdodCI6ZT09PSJVSVN0YXR1c0JhclN0eWxlRGVmYXVsdCImJihlPSJkYXJrIiksZX1mdW5jdGlvbiBpQygpe2xldHtyZXNvbHV0aW9uV2lkdGg6ZSxyZXNvbHV0aW9uSGVpZ2h0OnR9PW8uc2NyZWVuLmdldEN1cnJlbnRTaXplKCl8fHtyZXNvbHV0aW9uV2lkdGg6MCxyZXNvbHV0aW9uSGVpZ2h0OjB9O3JldHVybntzY3JlZW5XaWR0aDpNYXRoLnJvdW5kKGUpLHNjcmVlbkhlaWdodDpNYXRoLnJvdW5kKHQpfX1sZXQga2c9QnQoImdldFdpbmRvd0luZm8iLCgpPT57bGV0IGU9by5vcy5uYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW9zIix7c2NyZWVuV2lkdGg6dCxzY3JlZW5IZWlnaHQ6bn09aUMoKSxyPUxmKCkscyx1PXtoZWlnaHQ6MCxjb3ZlcjohMX0scD1tdSgpO2lmKHApe2xldCBjdD1wLmdldFN0eWxlKCkscHQ9Y3QmJmN0LnRpdGxlTlZpZXc7cHQmJnB0LnR5cGUmJnB0LnR5cGUhPT0ibm9uZSImJih1LmhlaWdodD1wdC50eXBlPT09InRyYW5zcGFyZW50Ij8wOnIrbmUuTkFWQkFSX0hFSUdIVCx1LmNvdmVyPXB0LnR5cGU9PT0idHJhbnNwYXJlbnQifHxwdC50eXBlPT09ImZsb2F0Iikscz1wLmdldFNhZmVBcmVhSW5zZXRzKCl9ZWxzZSBzPW8ubmF2aWdhdG9yLmdldFNhZmVBcmVhSW5zZXRzKCk7bGV0IFM9e2hlaWdodDowLGNvdmVyOiExfTtVYygpJiYoUy5oZWlnaHQ9U2kudmlzaWJsZT9TaS5oZWlnaHQ6MCxTLmNvdmVyPVNpLmNvdmVyKTtsZXQgVT11LmNvdmVyP3UuaGVpZ2h0OjAsUD1TLmNvdmVyP1MuaGVpZ2h0OjAsRj1uLXUuaGVpZ2h0LVMuaGVpZ2h0LGJlPW4tKHUuY292ZXI/MDp1LmhlaWdodCktKFMuY292ZXI/MDpTLmhlaWdodCksRWU9dDsoIVMuaGVpZ2h0fHxTLmNvdmVyKSYmIXMuYm90dG9tJiZzLmRldmljZUJvdHRvbSYmKEYtPXMuZGV2aWNlQm90dG9tLGJlLT1zLmRldmljZUJvdHRvbSkscz1lP3M6e2xlZnQ6MCxyaWdodDowLHRvcDp1LmhlaWdodCYmIXUuY292ZXI/MDpyLGJvdHRvbTowfTtsZXQgUGU9e2xlZnQ6cy5sZWZ0LHJpZ2h0OkVlLXMucmlnaHQsdG9wOnMudG9wLGJvdHRvbTpiZS1zLmJvdHRvbSx3aWR0aDpFZS1zLmxlZnQtcy5yaWdodCxoZWlnaHQ6YmUtcy50b3Atcy5ib3R0b219O3JldHVybntwaXhlbFJhdGlvOm8uc2NyZWVuLnNjYWxlLHNjcmVlbldpZHRoOnQsc2NyZWVuSGVpZ2h0Om4sd2luZG93V2lkdGg6RWUsd2luZG93SGVpZ2h0OkYsc3RhdHVzQmFySGVpZ2h0OnIsc2FmZUFyZWE6UGUsc2FmZUFyZWFJbnNldHM6e3RvcDpzLnRvcCxyaWdodDpzLnJpZ2h0LGJvdHRvbTpzLmJvdHRvbSxsZWZ0OnMubGVmdH0sd2luZG93VG9wOlUsd2luZG93Qm90dG9tOlAsc2NyZWVuVG9wOm4tRn19KSxZYSxfdT0hMDtmdW5jdGlvbiBqYygpe2lmKCFfdSlyZXR1cm47bGV0e2dldFN5c3RlbUluZm9TeW5jOmV9PWYucmVxdWlyZU1vZHVsZSgicGx1cyIpO2lmKFlhPWUoKSxxLmlzU3RyaW5nKFlhKSl0cnl7WWE9SlNPTi5wYXJzZShZYSl9Y2F0Y2godCl7fXJldHVybiBZYX1sZXQgSWc9QnQoImdldERldmljZUluZm8iLCgpPT57amMoKTtsZXR7ZGV2aWNlQnJhbmQ6ZT0iIixkZXZpY2VNb2RlbDp0LG9zTmFtZTpuLG9zVmVyc2lvbjpyLGRldmljZU9yaWVudGF0aW9uOnMsZGV2aWNlVHlwZTp1LGRldmljZUlkOnB9PVlhLFM9ZS50b0xvd2VyQ2FzZSgpLFU9bi50b0xvd2VyQ2FzZSgpO3JldHVybnticmFuZDpTLGRldmljZUJyYW5kOlMsZGV2aWNlTW9kZWw6dCxkZXZpY2VQaXhlbFJhdGlvOm8uc2NyZWVuLnNjYWxlLGRldmljZUlkOnAsZGV2aWNlT3JpZW50YXRpb246cyxkZXZpY2VUeXBlOnUsbW9kZWw6dCxwbGF0Zm9ybTpVLHN5c3RlbTpgJHtVPT09ImlvcyI/ImlPUyI6IkFuZHJvaWQifSAke3J9YH19KSxSZz1CdCgiZ2V0QXBwQmFzZUluZm8iLCgpPT57amMoKTtsZXR7aG9zdFBhY2thZ2VOYW1lOmUsaG9zdE5hbWU6dCxob3N0VmVyc2lvbjpuLGhvc3RMYW5ndWFnZTpyLG9zTGFuZ3VhZ2U6cyxob3N0VGhlbWU6dSxhcHBJZDpwLGFwcE5hbWU6UyxhcHBWZXJzaW9uOlUsYXBwVmVyc2lvbkNvZGU6UCxhcHBXZ3RWZXJzaW9uOkZ9PVlhO3JldHVybnthcHBJZDpwLGFwcE5hbWU6UyxhcHBWZXJzaW9uOlUsYXBwVmVyc2lvbkNvZGU6UCxhcHBXZ3RWZXJzaW9uOkYsYXBwTGFuZ3VhZ2U6TWM/TWMoKTpzLGVuYWJsZURlYnVnOiExLGhvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246bixob3N0TGFuZ3VhZ2U6cixob3N0VGhlbWU6dSxob3N0Rm9udFNpemVTZXR0aW5nOnZvaWQgMCxob3N0U0RLVmVyc2lvbjp2b2lkIDAsbGFuZ3VhZ2U6cyxTREtWZXJzaW9uOiIiLHRoZW1lOkFnKCksdmVyc2lvbjpvLnJ1bnRpbWUuaW5uZXJWZXJzaW9ufX0pLHhnPUJ0KCJnZXRTeXN0ZW1JbmZvU3luYyIsKCk9PntfdT0hMCxqYygpLF91PSExO2xldCBlPWtnKCksdD1JZygpLG49UmcoKTtfdT0hMDtsZXQgcj17Zm9udFNpemVTZXR0aW5nOm4uaG9zdEZvbnRTaXplU2V0dGluZyxvc05hbWU6WWEub3NOYW1lLnRvTG93ZXJDYXNlKCl9O1lhLmhvc3ROYW1lJiYoci5ob3N0U0RLVmVyc2lvbj1ZYS51bmlSdW50aW1lVmVyc2lvbik7bGV0IHM9cS5leHRlbmQoWWEsZSx0LG4scik7cmV0dXJuIGRlbGV0ZSBzLnNjcmVlblRvcCxkZWxldGUgcy5lbmFibGVEZWJ1ZyxJLmRhcmttb2RlfHxkZWxldGUgcy50aGVtZSxuZS5zb3J0T2JqZWN0KHMpfSksb0M9VGUoImdldFN5c3RlbUluZm8iLChlLHtyZXNvbHZlOnR9KT0+dCh4ZygpKSksdWM9bnVsbCxhQz1qbihLaCwoKT0+e0JnKCl9KSxzQz1ZcihHeSwoKT0+e01nKCl9KSxCZz1UZShZeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9Pnt1Y3x8KHVjPW8ub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihyPT57ZnQuaW52b2tlT25DYWxsYmFjayhLaCx7ZGlyZWN0aW9uOnIubWFnbmV0aWNIZWFkaW5nfSl9LHI9PntuKHIubWVzc2FnZSksdWM9bnVsbH0se2ZyZXF1ZW5jeTpHbn0pKSxDKHQsR24pfSksTWc9VGUocXksKGUse3Jlc29sdmU6dH0pPT57dWMmJihvLm9yaWVudGF0aW9uLmNsZWFyV2F0Y2godWMpLHVjPW51bGwpLHQoKX0pLGxDPVRlKEp5LChlLHtyZXNvbHZlOnR9KT0+e28uZGV2aWNlLnZpYnJhdGUoMTUpLHQoKX0pLGNDPVRlKEt5LChlLHtyZXNvbHZlOnR9KT0+e28uZGV2aWNlLnZpYnJhdGUoNDAwKSx0KCl9KSxmYz1udWxsLHVDPWpuKEpoLCgpPT57TGcoKX0pLGZDPVlyKGp5LCgpPT57RmcoKX0pLExnPVRlKHp5LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2ZjfHwoZmM9by5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKHI9PntmdC5pbnZva2VPbkNhbGxiYWNrKEpoLHt4OnImJnIueEF4aXN8fDAseTpyJiZyLnlBeGlzfHwwLHo6ciYmci56QXhpc3x8MH0pfSxyPT57ZmM9bnVsbCxuKGBzdGFydEFjY2VsZXJvbWV0ZXI6ZmFpbCAke3IubWVzc2FnZX1gKX0se2ZyZXF1ZW5jeTpHbn0pKSxDKHQsR24pfSksRmc9VGUoV3ksKGUse3Jlc29sdmU6dH0pPT57ZmMmJihvLmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaChmYyksZmM9bnVsbCksdCgpfSksZEM9am4oWmgsY2MoKCk9Pm8uYmx1ZXRvb3RoLm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQuYmluZChvLmJsdWV0b290aCksWmgpKSxoQz1qbihYaCxjYygoKT0+by5ibHVldG9vdGgub25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UuYmluZChvLmJsdWV0b290aCksWGgpKSxnQz1qbihRaCxjYygoKT0+by5ibHVldG9vdGgub25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UuYmluZChvLmJsdWV0b290aCksUWgpKSxwQz1qbihlZyxjYygoKT0+by5ibHVldG9vdGgub25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlLmJpbmQoby5ibHVldG9vdGgpLGVnKSksdkM9VGUoIm9wZW5CbHVldG9vdGhBZGFwdGVyIixFaSgoKT0+by5ibHVldG9vdGgub3BlbkJsdWV0b290aEFkYXB0ZXIuYmluZChvLmJsdWV0b290aCkpKSxtQz1UZSgiY2xvc2VCbHVldG9vdGhBZGFwdGVyIixFaSgoKT0+by5ibHVldG9vdGguY2xvc2VCbHVldG9vdGhBZGFwdGVyLmJpbmQoby5ibHVldG9vdGgpKSksX0M9VGUoImdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZSIsRWkoKCk9Pm8uYmx1ZXRvb3RoLmdldEJsdWV0b290aEFkYXB0ZXJTdGF0ZS5iaW5kKG8uYmx1ZXRvb3RoKSkpLGJDPVRlKFp5LEVpKCgpPT5vLmJsdWV0b290aC5zdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkuYmluZChvLmJsdWV0b290aCkpLFh5KSx5Qz1UZSgic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLEVpKCgpPT5vLmJsdWV0b290aC5zdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeS5iaW5kKG8uYmx1ZXRvb3RoKSkpLEVDPVRlKCJnZXRCbHVldG9vdGhEZXZpY2VzIixFaSgoKT0+by5ibHVldG9vdGguZ2V0Qmx1ZXRvb3RoRGV2aWNlcy5iaW5kKG8uYmx1ZXRvb3RoKSkpLFNDPVRlKFF5LEVpKCgpPT5vLmJsdWV0b290aC5nZXRDb25uZWN0ZWRCbHVldG9vdGhEZXZpY2VzLmJpbmQoby5ibHVldG9vdGgpKSxlMCksd0M9VGUodDAsRWkoKCk9Pm8uYmx1ZXRvb3RoLmNyZWF0ZUJMRUNvbm5lY3Rpb24uYmluZChvLmJsdWV0b290aCkpLG4wKSxBQz1UZShyMCxFaSgoKT0+by5ibHVldG9vdGguY2xvc2VCTEVDb25uZWN0aW9uLmJpbmQoby5ibHVldG9vdGgpKSxpMCksQ0M9VGUobzAsRWkoKCk9Pm8uYmx1ZXRvb3RoLmdldEJMRURldmljZVNlcnZpY2VzLmJpbmQoby5ibHVldG9vdGgpKSxhMCksVEM9VGUoczAsRWkoKCk9Pm8uYmx1ZXRvb3RoLmdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcy5iaW5kKG8uYmx1ZXRvb3RoKSksbDApLE9DPVRlKGMwLEVpKCgpPT5vLmJsdWV0b290aC5ub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlLmJpbmQoby5ibHVldG9vdGgpKSx1MCksUEM9VGUoZjAsRWkoKCk9Pm8uYmx1ZXRvb3RoLnJlYWRCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlLmJpbmQoby5ibHVldG9vdGgpKSxkMCksTkM9VGUoaDAsRWkoKCk9Pm8uYmx1ZXRvb3RoLndyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZS5iaW5kKG8uYmx1ZXRvb3RoKSksZzApLGtDPVRlKHAwLEVpKCgpPT5vLmJsdWV0b290aC5zZXRCTEVNVFUuYmluZChvLmJsdWV0b290aCkpLHYwKSxJQz1UZShtMCxFaSgoKT0+by5ibHVldG9vdGguZ2V0QkxFRGV2aWNlUlNTSS5iaW5kKG8uYmx1ZXRvb3RoKSksXzApLFJDPWpuKHRnLGNjKCgpPT5vLmliZWFjb24ub25CZWFjb25VcGRhdGUuYmluZChvLmliZWFjb24pLHRnKSkseEM9am4obmcsY2MoKCk9Pm8uaWJlYWNvbi5vbkJlYWNvblNlcnZpY2VDaGFuZ2UuYmluZChvLmliZWFjb24pLG5nKSksQkM9VGUoYjAsRWkoKCk9Pm8uaWJlYWNvbi5nZXRCZWFjb25zLmJpbmQoby5pYmVhY29uKSkpLE1DPVRlKHkwLEVpKCgpPT5vLmliZWFjb24uc3RhcnRCZWFjb25EaXNjb3ZlcnkuYmluZChvLmliZWFjb24pKSxFMCksTEM9VGUoUzAsRWkoKCk9Pm8uaWJlYWNvbi5zdG9wQmVhY29uRGlzY292ZXJ5LmJpbmQoby5pYmVhY29uKSkpLEZDPVRlKEJ5LCh7cGhvbmVOdW1iZXI6ZX0se3Jlc29sdmU6dH0pPT4oby5kZXZpY2UuZGlhbChlKSx0KCkpLE15KSxEQz17bmFtZTp7Z2l2ZW5OYW1lOiJmaXJzdE5hbWUiLG1pZGRsZU5hbWU6Im1pZGRsZU5hbWUiLGZhbWlseU5hbWU6Imxhc3ROYW1lIn0sbmlja25hbWU6Im5pY2tOYW1lIixwaG90b3M6e3R5cGU6InVybCIsdmFsdWU6InBob3RvRmlsZVBhdGgifSxub3RlOiJyZW1hcmsiLHBob25lTnVtYmVyczpbe3R5cGU6Im1vYmlsZSIsdmFsdWU6Im1vYmlsZVBob25lTnVtYmVyIn0se3R5cGU6IndvcmsiLHZhbHVlOiJ3b3JrUGhvbmVOdW1iZXIifSx7dHlwZToiY29tcGFueSIsdmFsdWU6Imhvc3ROdW1iZXIifSx7dHlwZToiaG9tZSBmYXgiLHZhbHVlOiJob21lRmF4TnVtYmVyIn0se3R5cGU6IndvcmsgZmF4Iix2YWx1ZToid29ya0ZheE51bWJlciJ9XSxlbWFpbHM6W3t0eXBlOiJob21lIix2YWx1ZToiZW1haWwifV0sdXJsczpbe3R5cGU6Im90aGVyIix2YWx1ZToidXJsIn1dLG9yZ2FuaXphdGlvbnM6W3t0eXBlOiJjb21wYW55IixuYW1lOiJvcmdhbml6YXRpb24iLHRpdGxlOiJ0aXRsZSJ9XSxpbXM6W3t0eXBlOiJvdGhlciIsdmFsdWU6IndlQ2hhdE51bWJlciJ9XSxhZGRyZXNzZXM6W3t0eXBlOiJvdGhlciIscHJlZmVycmVkOiEwLGNvdW50cnk6ImFkZHJlc3NDb3VudHJ5IixyZWdpb246ImFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJhZGRyZXNzU3RyZWV0Iixwb3N0YWxDb2RlOiJhZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJob21lIixjb3VudHJ5OiJob21lQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiaG9tZUFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImhvbWVBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoiaG9tZUFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImhvbWVBZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJjb21wYW55Iixjb3VudHJ5OiJ3b3JrQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoid29ya0FkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6IndvcmtBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoid29ya0FkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6IndvcmtBZGRyZXNzUG9zdGFsQ29kZSJ9XX0sVkM9WyJ0eXBlIiwicHJlZmVycmVkIl07ZnVuY3Rpb24gRmYoZSx0LG4pe2xldCByPTA7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2gocz0+e2xldCB1PW5bc107dHlwZW9mIHUhPT0ib2JqZWN0Ij9WQy5pbmRleE9mKHMpIT09LTE/ZVtzXT1uW3NdOnR5cGVvZiB0W3VdIT0idW5kZWZpbmVkIj8ocisrLGVbc109dFt1XSk6ZGVsZXRlIGVbc106dSBpbnN0YW5jZW9mIEFycmF5PyhlW3NdPVtdLHUuZm9yRWFjaChTPT57bGV0IFU9e307RmYoVSx0LFMpJiZlW3NdLnB1c2goVSl9KSxlW3NdLmxlbmd0aD9yKys6ZGVsZXRlIGVbc10pOihlW3NdPXt9LEZmKGVbc10sdCx1KT9yKys6ZGVsZXRlIGVbc10pfSkscn1sZXQgVUM9VGUoTHksKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57IWUucGhvdG9GaWxlUGF0aCYmKGUucGhvdG9GaWxlUGF0aD0iIiksby5jb250YWN0cy5nZXRBZGRyZXNzQm9vayhvLmNvbnRhY3RzLkFERFJFU1NCT09LX1BIT05FLHI9PntsZXQgcz1yLmNyZWF0ZSgpO0ZmKHMsZSxEQykscy5zYXZlKCgpPT50KCksdT0+bigpKX0scj0+bigpKX0sRHksRnkpO2Z1bmN0aW9uIGhhKGUpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCI/Zi5yZXF1aXJlTW9kdWxlKGUpOl9fcmVxdWlyZU5hdGl2ZVBsdWdpbl9fKGUpfWZ1bmN0aW9uIERnKGUsdCxuKXtyZXR1cm4gaGEoInBsdXMiKS5zZW5kTmF0aXZlRXZlbnQoZSx0LG4pfWxldCAkQz1UZShWeSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntoYSgiY2xpcGJvYXJkIikuZ2V0U3RyaW5nKHM9PntzLnJlc3VsdD09PSJzdWNjZXNzIj90KHtkYXRhOnMuZGF0YX0pOm4oImdldENsaXBib2FyZERhdGE6ZmFpbCIpfSl9KSxIQz1UZShVeSwoZSx7cmVzb2x2ZTp0fSk9PntoYSgiY2xpcGJvYXJkIikuc2V0U3RyaW5nKGUuZGF0YSksdCgpfSxIeSwkeSksVmc9Im9uTmV0d29ya1N0YXR1c0NoYW5nZSI7ZnVuY3Rpb24gVWcoKXskZygpLnRoZW4oKHtuZXR3b3JrVHlwZTplfSk9PntmdC5pbnZva2VPbkNhbGxiYWNrKFZnLHtpc0Nvbm5lY3RlZDplIT09Im5vbmUiLG5ldHdvcmtUeXBlOmV9KX0pfWxldCBqQz1qbihWZywoKT0+e28uZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigibmV0Y2hhbmdlIixVZyl9KSx6Qz1Zcigib2ZmTmV0d29ya1N0YXR1c0NoYW5nZSIsKCk9PntvLmdsb2JhbEV2ZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsVWcpfSksJGc9VGUoImdldE5ldHdvcmtUeXBlIiwoZSx7cmVzb2x2ZTp0fSk9PntsZXQgbj1ncltvLm5ldHdvcmtpbmZvLmdldEN1cnJlbnRUeXBlKCldfHwidW5rbm93biI7cmV0dXJuIHQoe25ldHdvcmtUeXBlOm59KX0pO2Z1bmN0aW9uIEhnKCl7aWYoby5vcy5uYW1lLnRvTG93ZXJDYXNlKCkhPT0iaW9zIilyZXR1cm4hMTtsZXQgdD1oYSgiZmFjZUlEIik7cmV0dXJuISEodCYmdC5pc1N1cHBvcnQoKSl9ZnVuY3Rpb24gamcoKXtyZXR1cm4hIShvLmZpbmdlcnByaW50JiZvLmZpbmdlcnByaW50LmlzU3VwcG9ydCgpKX1sZXQgemc9ZT0+e2xldCB0PVtdO3JldHVybiBqZygpJiZ0LnB1c2goImZpbmdlclByaW50IiksSGcoKSYmdC5wdXNoKCJmYWNpYWwiKSxlJiZlKHtzdXBwb3J0TW9kZTp0fSkse3N1cHBvcnRNb2RlOnQsZXJyTXNnOiJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb246b2sifX0sV0M9VGUoVDAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57emcodCl9KSxXZz0oe2NoZWNrQXV0aE1vZGU6ZSxyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPSh1LHApPT5uJiZuKHUscCkscz11PT50JiZ0KHUpO2lmKGU9PT0iZmluZ2VyUHJpbnQiKXtpZihqZygpKXtsZXQgdT1vLmZpbmdlcnByaW50LmlzS2V5Z3VhcmRTZWN1cmUoKSYmby5maW5nZXJwcmludC5pc0Vucm9sbGVkRmluZ2VycHJpbnRzKCk7cmV0dXJuIHMoe2lzRW5yb2xsZWQ6dX0pLHtpc0Vucm9sbGVkOnUsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOm9rIn19cmV0dXJuIHIoIm5vdCBzdXBwb3J0Iix7aXNFbnJvbGxlZDohMX0pLHtpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19ZWxzZSBpZihlPT09ImZhY2lhbCIpe2lmKEhnKCkpe2xldCB1PWhhKCJmYWNlSUQiKSxwPXUmJnUuaXNLZXlndWFyZFNlY3VyZSgpJiZ1LmlzRW5yb2xsZWRGYWNlSUQoKTtyZXR1cm4gcyh7aXNFbnJvbGxlZDpwfSkse2lzRW5yb2xsZWQ6cCxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX1yZXR1cm4gcigibm90IHN1cHBvcnQiLHtpc0Vucm9sbGVkOiExfSkse2lzRW5yb2xsZWQ6ITEsZXJyTXNnOiJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOmZhaWwgbm90IHN1cHBvcnQifX0sR0M9VGUoTzAsKHtjaGVja0F1dGhNb2RlOmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1dnKHtjaGVja0F1dGhNb2RlOmUscmVzb2x2ZTp0LHJlamVjdDpufSl9LGswLE4wKSxZQz1UZShJMCwoe3JlcXVlc3RBdXRoTW9kZXM6ZSxjaGFsbGVuZ2U6dD0hMSxhdXRoQ29udGVudDpufSx7cmVzb2x2ZTpyLHJlamVjdDpzfSk9PntmbigpO2xldHt0OnV9PUV0KCkse3N1cHBvcnRNb2RlOnB9PXpnKCk7aWYoIXAubGVuZ3RoKXJldHVybiBzKCJub3Qgc3VwcG9ydCIse2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMX0pO2xldCBTPVtdO2lmKGUuZm9yRWFjaChjdD0+e3AuaW5kZXhPZihjdCk+LTEmJlMucHVzaChjdCl9KSwhUy5sZW5ndGgpcmV0dXJuIHMoInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vIGNvcnJlc3BvbmRpbmcgbW9kZSIse2F1dGhNb2RlOiJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwM30pO2xldCBVPVtdO2lmKFMuZm9yRWFjaChjdD0+e1dnKHtjaGVja0F1dGhNb2RlOmN0fSkuaXNFbnJvbGxlZCYmVS5wdXNoKGN0KX0pLCFVLmxlbmd0aClyZXR1cm4gcyhgc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gJHtTWzBdfSBlbnJvbGxlZGAse2F1dGhNb2RlOlNbMF0sZXJyQ29kZTo5MDAxMX0pO2xldCBQPVVbMF0sRj1udWxsLGJlLEVlPW58fHUoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiKSxQZT1jdD0+e2xldHtjb2RlOnB0fT1jdCxadD17YXV0aE1vZGU6UH0sTHQ9ezQ6KCk9PntGPyhiKGJlKSxGLnNldFRpdGxlKHUoInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiKSksYmU9QygoKT0+e0YmJkYuc2V0VGl0bGUoRWUpfSwxZTMpKTpzKCIiLHEuZXh0ZW5kKFp0LHtlcnJDb2RlOjkwMDA5fSkpfSw1OigpPT57by5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxzKCJhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIixxLmV4dGVuZChadCx7ZXJyQ29kZTo5MDAxMH0pKX0sNjooKT0+e28ubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCkscygiY2FuY2VsIixxLmV4dGVuZChadCx7ZXJyQ29kZTo5MDAwOH0pKX19O3B0JiZMdFtwdF0/THRbcHRdKCk6KG8ubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCkscygiIixxLmV4dGVuZChadCx7ZXJyQ29kZTo5MDAwN30pKSl9O1A9PT0iZmluZ2VyUHJpbnQiPyhvLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIiYmKEY9by5uYXRpdmVVSS5zaG93V2FpdGluZyhFZSksRi5vbmNsb3NlPWZ1bmN0aW9uKCl7by5maW5nZXJwcmludC5jYW5jZWwoKX0pLG8uZmluZ2VycHJpbnQuYXV0aGVudGljYXRlKCgpPT57by5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxyKHthdXRoTW9kZTpQLGVyckNvZGU6MH0pfSxQZSx7bWVzc2FnZTpFZX0pKTpQPT09ImZhY2lhbCImJmhhKCJmYWNlSUQiKS5hdXRoZW50aWNhdGUoe21lc3NhZ2U6RWV9LHB0PT57cHQudHlwZT09PSJzdWNjZXNzIiYmcHQuY29kZT09PTA/cih7YXV0aE1vZGU6UCxlcnJDb2RlOjB9KTpQZShwdCl9KX0seDAsUjApLHFDPVRlKEIwLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2x0KCk7bGV0e3Q6cn09RXQoKSx1PU5nKCkhPT0ibGlnaHQiLHAsUz0hMSxVPVZhKHt1cmw6Il9fdW5pYXBwc2NhbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse21lc3NhZ2VzOntmYWlsOnIoInVuaS5zY2FuQ29kZS5mYWlsIiksImZsYXNoLm9uIjpyKCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iKSwiZmxhc2gub2ZmIjpyKCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIil9fSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwicG9wLWluIix0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0eXBlOiJmbG9hdCIsdGl0bGVUZXh0OmUudGl0bGVUZXh0fHxyKCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZUNvbG9yOiIjZmZmZmZmIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJ1dHRvbnM6ZS5vbmx5RnJvbUNhbWVyYT9bXTpbe3RleHQ6ZS5hbGJ1bVRleHR8fHIoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazooKT0+e1Uuc2VuZE1lc3NhZ2Uoe3R5cGU6ImdhbGxlcnkifSl9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrZ3JvdW5kOiIjMDAwMDAwIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25NZXNzYWdlKHtldmVudDpQLGRldGFpbDpGfSl7cD1GLFM9UD09PSJtYXJrZWQifSxvbkNsb3NlKCl7dSYmby5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxwP1M/KGRlbGV0ZSBwLm1lc3NhZ2UsdChwKSk6bihwLm1lc3NhZ2UpOm4oImNhbmNlbCIpfX0pO3UmJihvLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxVLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsKHt0eXBlOlAscmVzdWx0OkZ9KT0+e1A9PT0ic3RhcnQiP28ubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6UD09PSJlbmQiJiYhRiYmby5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9LE0wLEYwKSxHZz1lPT57ZnQuaW52b2tlT25DYWxsYmFjayhuZS5PTl9USEVNRV9DSEFOR0UsZSl9LEpDPWpuKG5lLk9OX1RIRU1FX0NIQU5HRSwoKT0+e2Z0Lm9uKG5lLk9OX1RIRU1FX0NIQU5HRSxHZyl9KSxLQz1ZcihuZS5PRkZfVEhFTUVfQ0hBTkdFLCgpPT57ZnQub2ZmKG5lLk9OX1RIRU1FX0NIQU5HRSxHZyl9KSxaQz1UZSh3MCwoZSx7cmVzb2x2ZTp0fSk9PntsZXQgbj1vLnNjcmVlbi5nZXRCcmlnaHRuZXNzKCExKTt0KHt2YWx1ZTpufSl9KSxYQz1UZShBMCwoZSx7cmVzb2x2ZTp0fSk9PntvLnNjcmVlbi5zZXRCcmlnaHRuZXNzKGUudmFsdWUsITEpLHQoKX0pLFFDPVRlKEMwLChlLHtyZXNvbHZlOnR9KT0+e28uZGV2aWNlLnNldFdha2Vsb2NrKCEhZS5rZWVwU2NyZWVuT24pLHQoKX0pLGVUPUJ0KEQwLCgpPT57bGV0e2dldFN5c3RlbVNldHRpbmc6ZX09Zi5yZXF1aXJlTW9kdWxlKCJwbHVzIiksdD1lKCk7dHJ5e3R5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9SlNPTi5wYXJzZSh0KSl9Y2F0Y2gobil7fXJldHVybiB0fSksWWc9QnQoVjAsKCk9PntsZXR7Z2V0QXBwQXV0aG9yaXplU2V0dGluZzplfT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKSx0PWUoKTt0cnl7dHlwZW9mIHQ9PSJzdHJpbmciJiYodD1KU09OLnBhcnNlKHQpKX1jYXRjaChuKXt9Zm9yKGxldCBuIGluIHQpcS5oYXNPd24odCxuKSYmdFtuXT09PSJ1bmRlZmluZWQiJiYodFtuXT12b2lkIDApO3JldHVybiB0fSksdFQ9VGUoVTAsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e29wZW5BcHBBdXRob3JpemVTZXR0aW5nOnJ9PWYucmVxdWlyZU1vZHVsZSgicGx1cyIpO3IodT0+e3UudHlwZT09PSJzdWNjZXNzIj90KCk6bigpfSl9KSxuVD1UZShPRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1ZbisiL2Rvd25sb2FkLyI7by5pby5nZXRJbWFnZUluZm8ocS5leHRlbmQoZSx7c2F2ZVBhdGg6cixmaWxlbmFtZTpyLHN1Y2Nlc3M6Q2wodCksZmFpbDpBcihuKX0pKX0sTkUsUEUpLHJUPVRlKEJFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e28uaW8uZ2V0VmlkZW9JbmZvKHtmaWxlUGF0aDplLnNyYyxzdWNjZXNzOnI9Pnt0KHtvcmllbnRhdGlvbjpyLm9yaWVudGF0aW9uLHR5cGU6ci50eXBlLGR1cmF0aW9uOnIuZHVyYXRpb24sc2l6ZTpyLnNpemUsaGVpZ2h0OnIuaGVpZ2h0LHdpZHRoOnIud2lkdGgsZnBzOnIuZnBzfHwzMCxiaXRyYXRlOnIuYml0cmF0ZX0pfSxmYWlsOkFyKG4pfSl9LExFLE1FKSxpVD1UZShrRSwoe2N1cnJlbnQ6ZT0wLGluZGljYXRvcjp0PSJudW1iZXIiLGxvb3A6bj0hMSx1cmxzOnIsbG9uZ1ByZXNzQWN0aW9uczpzfSx7cmVzb2x2ZTp1LHJlamVjdDpwfSk9PntpZSgpO2xldHt0OlN9PUV0KCk7cj1yLm1hcChQPT5xZShQKSk7bGV0IFU9TnVtYmVyKGUpO2lzTmFOKFUpPyhlPXIuaW5kZXhPZihxZShlKSksZT1lPDA/MDplKTplPVUsby5uYXRpdmVVSS5wcmV2aWV3SW1hZ2Uocix7Y3VycmVudDplLGluZGljYXRvcjp0LGxvb3A6bixvbkxvbmdQcmVzczpmdW5jdGlvbihQKXtsZXQgRj1bXSxiZT0iIixFZT1zJiZxLmlzUGxhaW5PYmplY3Qocyk7RWU/KEY9cy5pdGVtTGlzdD9zLml0ZW1MaXN0OltdLGJlPXMuaXRlbUNvbG9yP3MuaXRlbUNvbG9yOiIjMDAwMDAwIik6KEY9W1MoInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiKV0sYmU9IiMwMDAwMDAiKTtsZXQgUGU9e2J1dHRvbnM6Ri5tYXAoY3Q9Pih7dGl0bGU6Y3QsY29sb3I6YmV9KSksY2FuY2VsOlMoInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIil9O28ubmF0aXZlVUkuYWN0aW9uU2hlZXQoUGUsY3Q9PntpZihjdC5pbmRleD4wKXtpZihFZSl7cS5pc0Z1bmN0aW9uKHMuc3VjY2VzcykmJnMuc3VjY2Vzcyh7dGFwSW5kZXg6Y3QuaW5kZXgtMSxpbmRleDpQLmluZGV4fSk7cmV0dXJufW8uZ2FsbGVyeS5zYXZlKFAudXJsLCgpPT57by5uYXRpdmVVSS50b2FzdChTKCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyIpKX0sZnVuY3Rpb24oKXtvLm5hdGl2ZVVJLnRvYXN0KFMoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIikpfSl9ZWxzZSBFZSYmcS5pc0Z1bmN0aW9uKHMuZmFpbCkmJnMuZmFpbCh7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6ZmFpbCBjYW5jZWwifSl9KX19KSx1KCl9LFJFLElFKSxvVD1UZSh4RSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9Pnt0cnl7by5uYXRpdmVVSS5jbG9zZVByZXZpZXdJbWFnZSgpLHQoKX1jYXRjaChyKXtuKCl9fSksRGYsZGM9ITEsVmYsaGM9KGUsdD17fSk9PnthVChxLmV4dGVuZCh7c3RhdGU6ZX0sdCkpfSx6Yz17c3RhcnQoe2R1cmF0aW9uOmU9NmU0LHNhbXBsZVJhdGU6dCxudW1iZXJPZkNoYW5uZWxzOm4sZW5jb2RlQml0UmF0ZTpyLGZvcm1hdDpzPSJtcDMiLGZyYW1lU2l6ZTp1fT17fSl7aWYoZGMpcmV0dXJuIGhjKCJzdGFydCIpO0RmPW8uYXVkaW8uZ2V0UmVjb3JkZXIoKSxEZi5yZWNvcmQoe2Zvcm1hdDpzLHNhbXBsZXJhdGU6dD9TdHJpbmcodCk6dm9pZCAwLGZpbGVuYW1lOlluKyIvcmVjb3JkZXIvIn0scD0+aGMoInN0b3AiLHt0ZW1wRmlsZVBhdGg6cH0pLHA9PmhjKCJlcnJvciIse2Vyck1zZzpwLm1lc3NhZ2V9KSksVmY9QygoKT0+e3pjLnN0b3AoKX0sZSksaGMoInN0YXJ0IiksZGM9ITB9LHN0b3AoKXtkYyYmKERmLnN0b3AoKSxkYz0hMSxWZiYmYihWZikpfSxwYXVzZSgpe2RjJiZoYygiZXJyb3IiLHtlcnJNc2c6IlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogcGF1c2UifSl9LHJlc3VtZSgpe2RjJiZoYygiZXJyb3IiLHtlcnJNc2c6IlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogcmVzdW1lIn0pfX0sVGw9e3BhdXNlOm51bGwscmVzdW1lOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsZXJyb3I6bnVsbH07ZnVuY3Rpb24gYVQoZSl7bGV0IHQ9ZS5zdGF0ZTtkZWxldGUgZS5zdGF0ZSxkZWxldGUgZS5lcnJNc2csdCYmcS5pc0Z1bmN0aW9uKFRsW3RdKSYmVGxbdF0oZSl9Y2xhc3Mgc1R7Y29uc3RydWN0b3IoKXt9b25FcnJvcih0KXtUbC5lcnJvcj10fW9uRnJhbWVSZWNvcmRlZCh0KXt9b25JbnRlcnJ1cHRpb25CZWdpbih0KXt9b25JbnRlcnJ1cHRpb25FbmQodCl7fW9uUGF1c2UodCl7VGwucGF1c2U9dH1vblJlc3VtZSh0KXtUbC5yZXN1bWU9dH1vblN0YXJ0KHQpe1RsLnN0YXJ0PXR9b25TdG9wKHQpe1RsLnN0b3A9dH1wYXVzZSgpe3pjLnBhdXNlKCl9cmVzdW1lKCl7emMucmVzdW1lKCl9c3RhcnQodD17fSl7emMuc3RhcnQodCl9c3RvcCgpe3pjLnN0b3AoKX19bGV0IHFnLGxUPUJ0KGpFLCgpPT5xZ3x8KHFnPW5ldyBzVCkpLGNUPVRlKFVFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e28uZ2FsbGVyeS5zYXZlKGUuZmlsZVBhdGgsQ2wodCksQXIobikpfSxIRSwkRSksdVQ9VGUoRkUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57by5nYWxsZXJ5LnNhdmUoZS5maWxlUGF0aCxDbCh0KSxBcihuKSl9LFZFLERFKSxmVD1UZSh6RSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1gJHtZbn0vY29tcHJlc3NlZC8ke0RhdGUubm93KCl9XyR7JHIoZS5zcmMpfWAse2NvbXByZXNzZWRXaWR0aDpzLGNvbXByZXNzZWRIZWlnaHQ6dX09ZTt0eXBlb2Ygcz09Im51bWJlciImJihlLndpZHRoPXMrInB4IiksdHlwZW9mIHU9PSJudW1iZXIiJiYoZS5oZWlnaHQ9dSsicHgiKSxvLnppcC5jb21wcmVzc0ltYWdlKHEuZXh0ZW5kKHt9LGUse2RzdDpyfSksKCk9Pnt0KHt0ZW1wRmlsZVBhdGg6cn0pfSxuKX0sR0UsV0UpLGRUPVRlKFlFLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWAke1lufS9jb21wcmVzc2VkLyR7RGF0ZS5ub3coKX1fJHskcihlLnNyYyl9YDtvLnppcC5jb21wcmVzc1ZpZGVvKHEuZXh0ZW5kKHt9LGUse2ZpbGVuYW1lOnJ9KSxzPT57dCh7dGVtcEZpbGVQYXRoOnIsc2l6ZTpzLnNpemV9KX0sbil9LEpFLHFFKTtmdW5jdGlvbiBoVChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntvLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwoZSxmdW5jdGlvbihyKXtyLmdldE1ldGFkYXRhKHQsbiwhMSl9LG4pfSl9bGV0IGdUPVRlKEVFLCh7Y291bnQ6ZSxzaXplVHlwZTp0LHNvdXJjZVR5cGU6bixjcm9wOnJ9PXt9LHtyZXNvbHZlOnMscmVqZWN0OnV9KT0+e3NlKCk7bGV0e3Q6cH09RXQoKSxTPUFyKHUpO2Z1bmN0aW9uIFUoYmUpe2xldCBFZT1bXSxQZT1bXTtQcm9taXNlLmFsbChiZS5tYXAoY3Q9PmhUKGN0KSkpLnRoZW4oY3Q9PntjdC5mb3JFYWNoKChwdCxadCk9PntsZXQgTHQ9YmVbWnRdO1BlLnB1c2goTHQpLEVlLnB1c2goe3BhdGg6THQsc2l6ZTpwdC5zaXplfSl9KSxzKHt0ZW1wRmlsZVBhdGhzOlBlLHRlbXBGaWxlczpFZX0pfSkuY2F0Y2goUyl9ZnVuY3Rpb24gUCgpe28uY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZShFZT0+VShbRWVdKSxTLHtmaWxlbmFtZTpZbisiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6cixzaXplVHlwZTp0fSl9ZnVuY3Rpb24gRigpe28uZ2FsbGVyeS5waWNrKCh7ZmlsZXM6YmV9KT0+VShiZSksUyx7bWF4aW11bTplLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTpZbisiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpyLHNpemVUeXBlOnR9KX1pZihuLmxlbmd0aD09PTEpe2lmKG4uaW5jbHVkZXMoImFsYnVtIikpe0YoKTtyZXR1cm59ZWxzZSBpZihuLmluY2x1ZGVzKCJjYW1lcmEiKSl7UCgpO3JldHVybn19by5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOnAoInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6cCgidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpwKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LGJlPT57c3dpdGNoKGJlLmluZGV4KXtjYXNlIDE6UCgpO2JyZWFrO2Nhc2UgMjpGKCk7YnJlYWs7ZGVmYXVsdDpTKCk7YnJlYWt9fSl9LHdFLFNFKSxwVD1UZShBRSwoe3NvdXJjZVR5cGU6ZSxjb21wcmVzc2VkOnQsbWF4RHVyYXRpb246bixjYW1lcmE6cn0se3Jlc29sdmU6cyxyZWplY3Q6dX0pPT57WSgpO2xldHt0OnB9PUV0KCksUz1Bcih1KTtmdW5jdGlvbiBVKGJlKXtvLmlvLmdldFZpZGVvSW5mbyh7ZmlsZVBhdGg6YmUsc3VjY2VzcyhFZSl7bGV0IFBlPXtlcnJNc2c6ImNob29zZVZpZGVvOm9rIix0ZW1wRmlsZVBhdGg6YmUsc2l6ZTpFZS5zaXplLGR1cmF0aW9uOkVlLmR1cmF0aW9uLHdpZHRoOkVlLndpZHRoLGhlaWdodDpFZS5oZWlnaHR9O3MoUGUpfSxmYWlsOlN9KX1mdW5jdGlvbiBQKCl7by5nYWxsZXJ5LnBpY2soKHtmaWxlczpiZX0pPT5VKGJlWzBdKSxTLHtmaWx0ZXI6InZpZGVvIixzeXN0ZW06ITEsbXVsdGlwbGU6ITAsbWF4aW11bToxLGZpbGVuYW1lOlluKyIvZ2FsbGVyeS8iLHBlcm1pc3Npb25BbGVydDohMCx2aWRlb0NvbXByZXNzOnR9KX1mdW5jdGlvbiBGKCl7by5jYW1lcmEuZ2V0Q2FtZXJhKCkuc3RhcnRWaWRlb0NhcHR1cmUoVSxTLHtpbmRleDpyPT09ImZyb250Ij8iMiI6IjEiLHZpZGVvTWF4aW11bUR1cmF0aW9uOm4sZmlsZW5hbWU6WW4rIi9jYW1lcmEvIix2aWRlb0NvbXByZXNzOnR9KX1pZihlLmxlbmd0aD09PTEpe2lmKGUuaW5jbHVkZXMoImFsYnVtIikpe1AoKTtyZXR1cm59ZWxzZSBpZihlLmluY2x1ZGVzKCJjYW1lcmEiKSl7RigpO3JldHVybn19by5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOnAoInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiKSxidXR0b25zOlt7dGl0bGU6cCgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpwKCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSIpfV19LGJlPT57c3dpdGNoKGJlLmluZGV4KXtjYXNlIDE6RigpO2JyZWFrO2Nhc2UgMjpQKCk7YnJlYWs7ZGVmYXVsdDpTKCk7YnJlYWt9fSl9LFRFLENFKSx2VD1UZShkRSwoZSx7cmVzb2x2ZTp0fSk9PntvLmtleS5zaG93U29mdEtleWJvcmQoKSx0KCl9KSxtVD1UZShmRSwoZSx7cmVzb2x2ZTp0fSk9PntvLmtleS5oaWRlU29mdEtleWJvcmQoKSx0KCl9KTtmdW5jdGlvbiBKZyhlKXtmdC5pbnZva2VPbkNhbGxiYWNrKG5lLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsZSl9bGV0IF9UPWpuKG5lLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntmdC5vbihuZS5PTl9LRVlCT0FSRF9IRUlHSFRfQ0hBTkdFLEpnKX0pLGJUPVlyKG5lLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsKCk9PntmdC5vZmYobmUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSxKZyl9KTtjbGFzcyB5VHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fZG93bmxvYWRlcj10LHQuYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIiwobixyKT0+e24uZG93bmxvYWRlZFNpemUmJm4udG90YWxTaXplJiZ0aGlzLl9jYWxsYmFja3MuZm9yRWFjaChzPT57cyh7cHJvZ3Jlc3M6TWF0aC5yb3VuZChuLmRvd25sb2FkZWRTaXplL24udG90YWxTaXplKjEwMCksdG90YWxCeXRlc1dyaXR0ZW46bi5kb3dubG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlOm4udG90YWxTaXplfSl9KX0pfWFib3J0KCl7dGhpcy5fZG93bmxvYWRlci5hYm9ydCgpfW9uUHJvZ3Jlc3NVcGRhdGUodCl7IXEuaXNGdW5jdGlvbih0KXx8dGhpcy5fY2FsbGJhY2tzLnB1c2godCl9b2ZmUHJvZ3Jlc3NVcGRhdGUodCl7bGV0IG49dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YodCk7bj49MCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZShuLDEpfW9uSGVhZGVyc1JlY2VpdmVkKHQpe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX1vZmZIZWFkZXJzUmVjZWl2ZWQodCl7dGhyb3cgbmV3IEVycm9yKCJNZXRob2Qgbm90IGltcGxlbWVudGVkLiIpfX1sZXQgRVQ9VHIoYVMsKHt1cmw6ZSxoZWFkZXI6dCx0aW1lb3V0Om59LHtyZXNvbHZlOnIscmVqZWN0OnN9KT0+e249KG58fEkubmV0d29ya1RpbWVvdXQmJkkubmV0d29ya1RpbWVvdXQucmVxdWVzdHx8NjAqMWUzKS8xZTM7bGV0IHU9by5kb3dubG9hZGVyLmNyZWF0ZURvd25sb2FkKGUse3RpbWVvdXQ6bixmaWxlbmFtZTpZbisiL2Rvd25sb2FkLyIscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LChTLFUpPT57VT9yKHt0ZW1wRmlsZVBhdGg6Uy5maWxlbmFtZSxzdGF0dXNDb2RlOlV9KTpzKGBzdGF0dXNDb2RlOiAke1V9YCl9KSxwPW5ldyB5VCh1KTtmb3IobGV0IFMgaW4gdClxLmhhc093bih0LFMpJiZ1LnNldFJlcXVlc3RIZWFkZXIoUyx0W1NdKTtyZXR1cm4gdS5zdGFydCgpLHB9LGxTLHNTKSxTVD1lPT57bGV0IHQ9ZVsiU2V0LUNvb2tpZSJdfHxlWyJzZXQtY29va2llIl0sbj1bXTtpZighdClyZXR1cm5bXTt0WzBdPT09IlsiJiZ0W3QubGVuZ3RoLTFdPT09Il0iJiYodD10LnNsaWNlKDEsLTEpKTtsZXQgcj10LnNwbGl0KCI7Iik7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKyspcltzXS5pbmRleE9mKCJFeHBpcmVzPSIpIT09LTF8fHJbc10uaW5kZXhPZigiZXhwaXJlcz0iKSE9PS0xP24ucHVzaChyW3NdLnJlcGxhY2UoIiwiLCIiKSk6bi5wdXNoKHJbc10pO3JldHVybiBuPW4uam9pbigiOyIpLnNwbGl0KCIsIiksbn07ZnVuY3Rpb24gd1QoZSx0KXtpZihxLmlzU3RyaW5nKGUuZGF0YSkmJmUuZGF0YS5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihlLmRhdGE9ZS5kYXRhLnNsaWNlKDEpKSxlLnN0YXR1c0NvZGU9cGFyc2VJbnQoU3RyaW5nKGUuc3RhdHVzQ29kZSksMTApLHEuaXNQbGFpbk9iamVjdChlLmhlYWRlcikmJihlLmhlYWRlcj1PYmplY3Qua2V5cyhlLmhlYWRlcikucmVkdWNlKGZ1bmN0aW9uKG4scil7bGV0IHM9ZS5oZWFkZXJbcl07cmV0dXJuIHEuaXNBcnJheShzKT9uW3JdPXMuam9pbigiLCIpOnEuaXNTdHJpbmcocykmJihuW3JdPXMpLG59LHt9KSksdC5kYXRhVHlwZSYmdC5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpPT09Impzb24iKXRyeXtlLmRhdGE9SlNPTi5wYXJzZShlLmRhdGEpfWNhdGNoKG4pe31yZXR1cm4gZX1jbGFzcyBBVHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9yZXF1ZXN0VGFzaz10fWFib3J0KCl7dGhpcy5fcmVxdWVzdFRhc2suYWJvcnQoKX1vZmZIZWFkZXJzUmVjZWl2ZWQoKXt9b25IZWFkZXJzUmVjZWl2ZWQoKXt9fWxldCBDVD1UcihLRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXR7aGVhZGVyOnIsbWV0aG9kOnMsZGF0YTp1LHRpbWVvdXQ6cCx1cmw6UyxyZXNwb25zZVR5cGU6VSxzc2xWZXJpZnk6UCxmaXJzdElwdjQ6Rix0bHM6YmV9PWUsRWU7Zm9yKGxldCBzdCBpbiByKWlmKHN0LnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIil7RWU9cltzdF07YnJlYWt9cyE9PSJHRVQiJiZFZSYmRWUuaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpPT09MCYmcS5pc1BsYWluT2JqZWN0KHUpJiYodT1KU09OLnN0cmluZ2lmeSh1KSk7bGV0IFBlPWhhKCJzdHJlYW0iKSxjdD17fSxwdCxadCxMdD0hMTtmb3IobGV0IHN0IGluIHIpaWYoIUx0JiZzdC50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSIpe2lmKEx0PSEwLGN0WyJDb250ZW50LVR5cGUiXT1yW3N0XSxzIT09IkdFVCImJnJbc3RdLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpPT09MCYmIXEuaXNTdHJpbmcodSkmJiEodSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSl7bGV0IGp0PVtdO2ZvcihsZXQgV3QgaW4gdSlxLmhhc093bih1LFd0KSYmanQucHVzaChlbmNvZGVVUklDb21wb25lbnQoV3QpKyI9IitlbmNvZGVVUklDb21wb25lbnQodVtXdF0pKTt1PWp0LmpvaW4oIiYiKX19ZWxzZSBjdFtzdF09cltzdF07IUx0JiZzPT09IlBPU1QiJiYoY3RbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKSxwJiYocHQ9QygoKT0+e1p0PSEwLG4oInRpbWVvdXQiKX0scCsyMDApKTtsZXQgeW49e21ldGhvZDpzLHVybDpTLnRyaW0oKSxoZWFkZXJzOmN0LHR5cGU6VT09PSJhcnJheWJ1ZmZlciI/ImJhc2U2NCI6InRleHQiLHRpbWVvdXQ6cHx8NmU1LHNzbFZlcmlmeTohUCxmaXJzdElwdjQ6Rix0bHM6YmV9LHZuPSExO3MhPT0iR0VUIiYmKHRvU3RyaW5nLmNhbGwodSk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP3ZuPSEwOnluLmJvZHk9cS5pc1N0cmluZyh1KT91OkpTT04uc3RyaW5naWZ5KHUpKTtsZXQgTnQ9KHtvazpzdCxzdGF0dXM6anQsZGF0YTpXdCxoZWFkZXJzOm5uLGVycm9yTXNnOiR0fSk9PntpZihadClyZXR1cm47cHQmJmIocHQpO2xldCBLbj1qdDtpZihLbj4wKXQod1Qoe2RhdGE6c3QmJlU9PT0iYXJyYXlidWZmZXIiP0dpKFd0KTpXdCxzdGF0dXNDb2RlOktuLGhlYWRlcjpubixjb29raWVzOlNUKG5uKX0sZSkpO2Vsc2V7bGV0IFh0PSJhYm9ydCBzdGF0dXNDb2RlOiIrS247JHQmJihYdD1YdCsiICIrJHQpLG4oWHQpfX07cmV0dXJuIHZuP1BlLmZldGNoV2l0aEFycmF5QnVmZmVyKHsiQHR5cGUiOiJiaW5hcnkiLGJhc2U2NDpMbyh1KX0seW4sTnQpOlBlLmZldGNoKHluLE50KSxuZXcgQVQoe2Fib3J0KCl7WnQ9ITAscHQmJmIocHQpLG4oImFib3J0Iil9fSl9LHRTLG5TKSxUVD1UZShyUywoe2NlcnRpZmljYXRlczplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntoYSgic3RyZWFtIikuY29uZmlnTVRMUyhlLCh7dHlwZTpzLGNvZGU6dSxtZXNzYWdlOnB9KT0+e3N3aXRjaChzKXtjYXNlInN1Y2Nlc3MiOnQoe2NvZGU6dX0pO2JyZWFrO2Nhc2UiZmFpbCI6bihwLHtjb2RlOnV9KTticmVha319KX0saVMsb1MpLGdjPVtdLHBjPXt9LFVmPXtvcGVuOiIiLGNsb3NlOiIiLGVycm9yOiIiLG1lc3NhZ2U6IiJ9LFdjO2Z1bmN0aW9uIE9UKGUpe2xldCB0PVN0cmluZyhEYXRlLm5vdygpKSxuO3RyeXtXY3x8KFdjPWhhKCJ1bmktd2ViU29ja2V0IiksUFQoV2MpKSxXYy5XZWJTb2NrZXQoe2lkOnQsdXJsOmUudXJsLHByb3RvY29sOnEuaXNBcnJheShlLnByb3RvY29scyk/ZS5wcm90b2NvbHMuam9pbigiLCIpOmUucHJvdG9jb2xzLGhlYWRlcjplLmhlYWRlcn0pfWNhdGNoKHIpe249cn1yZXR1cm57c29ja2V0OldjLHNvY2tldElkOnQsZXJyTXNnOm59fWZ1bmN0aW9uIFBUKGUpe2Uub25vcGVuKHQ9PntsZXQgbj1wY1t0LmlkXTshbnx8bi5fc29ja2V0T25PcGVuKCl9KSxlLm9ubWVzc2FnZSh0PT57bGV0IG49cGNbdC5pZF07IW58fG4uX3NvY2tldE9uTWVzc2FnZSh0KX0pLGUub25lcnJvcih0PT57bGV0IG49cGNbdC5pZF07IW58fG4uX3NvY2tldE9uRXJyb3IoKX0pLGUub25jbG9zZSh0PT57bGV0e2lkOm4sY29kZTpyLHJlYXNvbjpzfT10LHU9cGNbbl07IXV8fHUuX3NvY2tldE9uQ2xvc2Uoe2NvZGU6cixyZWFzb246c30pfSl9Y2xhc3MgTlR7Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPW4sdGhpcy5fc29ja2V0PXQsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VELCEhdGhpcy5fc29ja2V0fV9zb2NrZXRPbk9wZW4oKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5PUEVOLHRoaXMuc29ja2V0U3RhdGVDaGFuZ2UoIm9wZW4iKX1fc29ja2V0T25NZXNzYWdlKHQpe3RoaXMuc29ja2V0U3RhdGVDaGFuZ2UoIm1lc3NhZ2UiLHtkYXRhOnR5cGVvZiB0LmRhdGE9PSJvYmplY3QiP0dpKHQuZGF0YS5iYXNlNjQpOnQuZGF0YX0pfV9zb2NrZXRPbkVycm9yKCl7dGhpcy5zb2NrZXRTdGF0ZUNoYW5nZSgiZXJyb3IiKSx0aGlzLm9uRXJyb3JPckNsb3NlKCl9X3NvY2tldE9uQ2xvc2UodCl7dGhpcy5zb2NrZXRTdGF0ZUNoYW5nZSgiY2xvc2UiLHQpLHRoaXMub25FcnJvck9yQ2xvc2UoKX1vbkVycm9yT3JDbG9zZSgpe3RoaXMucmVhZHlTdGF0ZT10aGlzLkNMT1NFRCxkZWxldGUgcGNbdGhpcy5pZF07bGV0IHQ9Z2MuaW5kZXhPZih0aGlzKTt0Pj0wJiZnYy5zcGxpY2UodCwxKX1zb2NrZXRTdGF0ZUNoYW5nZSh0LG49e30pe2xldHtjb2RlOnIscmVhc29uOnN9PW4sdT10PT09Im1lc3NhZ2UiP3tkYXRhOm4uZGF0YX06dD09PSJjbG9zZSI/e2NvZGU6cixyZWFzb246c306e307dGhpcz09PWdjWzBdJiZVZlt0XSYmZnQuaW52b2tlT25DYWxsYmFjayhVZlt0XSx1KSx0aGlzLl9jYWxsYmFja3NbdF0uZm9yRWFjaChwPT57cS5pc0Z1bmN0aW9uKHApJiZwKHUpfSl9c2VuZCh0LG49ITApe3RoaXMucmVhZHlTdGF0ZSE9PXRoaXMuT1BFTiYmbmUuY2FsbE9wdGlvbnModCwic2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIpO3RyeXt0aGlzLl9zb2NrZXQuc2VuZCh7aWQ6dGhpcy5pZCxkYXRhOnR5cGVvZiB0LmRhdGE9PSJvYmplY3QiP3siQHR5cGUiOiJiaW5hcnkiLGJhc2U2NDpMbyh0LmRhdGEpfTp0LmRhdGF9KSxuJiZuZS5jYWxsT3B0aW9ucyh0LCJzZW5kU29ja2V0TWVzc2FnZTpvayIpfWNhdGNoKHIpe24mJm5lLmNhbGxPcHRpb25zKHQsYHNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgJHtyfWApfX1jbG9zZSh0LG49ITApe3RoaXMucmVhZHlTdGF0ZT10aGlzLkNMT1NJTkc7dHJ5e3RoaXMuX3NvY2tldC5jbG9zZShxLmV4dGVuZCh7aWQ6dGhpcy5pZCxhcmdzOnR9KSksbiYmbmUuY2FsbE9wdGlvbnModCwiY2xvc2VTb2NrZXQ6b2siKX1jYXRjaChyKXtuJiZuZS5jYWxsT3B0aW9ucyh0LGBjbG9zZVNvY2tldDpmYWlsICR7cn1gKX19b25PcGVuKHQpe3RoaXMuX2NhbGxiYWNrcy5vcGVuLnB1c2godCl9b25DbG9zZSh0KXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaCh0KX1vbkVycm9yKHQpe3RoaXMuX2NhbGxiYWNrcy5lcnJvci5wdXNoKHQpfW9uTWVzc2FnZSh0KXt0aGlzLl9jYWxsYmFja3MubWVzc2FnZS5wdXNoKHQpfX1sZXQga1Q9VHIoZFMsKHt1cmw6ZSxwcm90b2NvbHM6dCxoZWFkZXI6bixtZXRob2Q6cn0se3Jlc29sdmU6cyxyZWplY3Q6dX0pPT57bGV0e3NvY2tldDpwLHNvY2tldElkOlMsZXJyTXNnOlV9PU9UKHt1cmw6ZSxwcm90b2NvbHM6dCxoZWFkZXI6bixtZXRob2Q6cn0pLFA9bmV3IE5UKHAsUyk7cmV0dXJuIFU/QygoKT0+e3UoVSl9LDApOihnYy5wdXNoKFApLHBjW1NdPVApLEMoKCk9PntzKCl9LDApLFB9LGdTLGhTKSxJVD1UZShwUywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1nY1swXTtpZighcnx8ci5yZWFkeVN0YXRlIT09ci5PUEVOKXtuKCJXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIpO3JldHVybn1yLnNlbmQoe2RhdGE6ZS5kYXRhfSwhMSksdCgpfSx2UyksUlQ9VGUobVMsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9Z2NbMF07aWYoIXIpe24oIldlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIik7cmV0dXJufXIucmVhZHlTdGF0ZT1yLkNMT1NJTkcsci5jbG9zZShlLCExKSx0KCl9LF9TKTtmdW5jdGlvbiBidShlKXtsZXQgdD1gb25Tb2NrZXQke3EuY2FwaXRhbGl6ZShlKX1gO3JldHVybiBqbih0LCgpPT57VWZbZV09dH0pfWxldCB4VD1idSgib3BlbiIpLEJUPWJ1KCJlcnJvciIpLE1UPWJ1KCJtZXNzYWdlIiksTFQ9YnUoImNsb3NlIik7Y2xhc3MgRlR7Y29uc3RydWN0b3IodCl7dGhpcy5fY2FsbGJhY2tzPVtdLHRoaXMuX3VwbG9hZGVyPXQsdC5hZGRFdmVudExpc3RlbmVyKCJzdGF0ZWNoYW5nZWQiLChuLHIpPT57bi51cGxvYWRlZFNpemUmJm4udG90YWxTaXplJiZ0aGlzLl9jYWxsYmFja3MuZm9yRWFjaChzPT57cyh7cHJvZ3Jlc3M6cGFyc2VJbnQoU3RyaW5nKG4udXBsb2FkZWRTaXplL24udG90YWxTaXplKjEwMCkpLHRvdGFsQnl0ZXNTZW50Om4udXBsb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvU2VuZDpuLnRvdGFsU2l6ZX0pfSl9KX1hYm9ydCgpe3RoaXMuX3VwbG9hZGVyLmFib3J0KCl9b25Qcm9ncmVzc1VwZGF0ZSh0KXshcS5pc0Z1bmN0aW9uKHQpfHx0aGlzLl9jYWxsYmFja3MucHVzaCh0KX1vbkhlYWRlcnNSZWNlaXZlZCgpe31vZmZQcm9ncmVzc1VwZGF0ZSh0KXtsZXQgbj10aGlzLl9jYWxsYmFja3MuaW5kZXhPZih0KTtuPj0wJiZ0aGlzLl9jYWxsYmFja3Muc3BsaWNlKG4sMSl9b2ZmSGVhZGVyc1JlY2VpdmVkKCl7fX1sZXQgRFQ9VHIoY1MsKHt1cmw6ZSx0aW1lb3V0OnQsaGVhZGVyOm4sZm9ybURhdGE6cixmaWxlczpzLGZpbGVQYXRoOnUsbmFtZTpwfSx7cmVzb2x2ZTpTLHJlamVjdDpVfSk9Pnt0PSh0fHxJLm5ldHdvcmtUaW1lb3V0JiZJLm5ldHdvcmtUaW1lb3V0LnVwbG9hZEZpbGV8fDYwKjFlMykvMWUzO2xldCBQPW8udXBsb2FkZXIuY3JlYXRlVXBsb2FkKGUse3RpbWVvdXQ6dCxyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sKGJlLEVlKT0+e0VlP1Moe2RhdGE6YmUucmVzcG9uc2VUZXh0LHN0YXR1c0NvZGU6RWV9KTpVKGBzdGF0dXNDb2RlOiAke0VlfWApfSk7Zm9yKGxldCBiZSBpbiBuKXEuaGFzT3duKG4sYmUpJiZQLnNldFJlcXVlc3RIZWFkZXIoYmUsU3RyaW5nKG5bYmVdKSk7Zm9yKGxldCBiZSBpbiByKXEuaGFzT3duKHIsYmUpJiZQLmFkZERhdGEoYmUsU3RyaW5nKHJbYmVdKSk7cyYmcy5sZW5ndGg/cy5mb3JFYWNoKGJlPT57UC5hZGRGaWxlKHFlKGJlLnVyaSkse2tleTpiZS5uYW1lfHwiZmlsZSJ9KX0pOlAuYWRkRmlsZShxZSh1KSx7a2V5OnB9KTtsZXQgRj1uZXcgRlQoUCk7cmV0dXJuIFAuc3RhcnQoKSxGfSxmUyx1UykscXM9e30sVlQ9WyJwbGF5IiwiY2FucGxheSIsImVuZGVkIiwic3RvcCIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIiwicGF1c2UiXSxLZz0icGxheWJhY2siLFVUPTIwMCwkVD1lPT57bGV0IHQ9cXNbZV07IXR8fHQuaW5pdFN0YXRlQ2hhZ2V8fCh0LmluaXRTdGF0ZUNoYWdlPSEwLHQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG49PntaZyh7c3RhdGU6ImVycm9yIixhdWRpb0lkOmUsZXJyTXNnOiJNZWRpYUVycm9yIixlcnJDb2RlOm4uY29kZX0pfSksVlQuZm9yRWFjaChuPT57dC5hZGRFdmVudExpc3RlbmVyKG4sKCk9PntuPT09InBsYXkiP3QuaXNTdG9wcGVkPSExOm49PT0ic3RvcCImJih0LmlzU3RvcHBlZD0hMCksWmcoe3N0YXRlOm4sYXVkaW9JZDplfSl9KX0pKX07ZnVuY3Rpb24gSFQoKXtsZXQgZT1gJHtEYXRlLm5vdygpfSR7TWF0aC5yYW5kb20oKX1gLHQ9cXNbZV09by5hdWRpby5jcmVhdGVQbGF5ZXIoIiIpO3JldHVybiB0LnNyYz0iIix0LnZvbHVtZT0xLHQuc3RhcnRUaW1lPTAsdC5zZXRTZXNzaW9uQ2F0ZWdvcnkoS2cpLHtlcnJNc2c6ImNyZWF0ZUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6ZX19ZnVuY3Rpb24galQoe2F1ZGlvSWQ6ZSxzcmM6dCxzdGFydFRpbWU6bixhdXRvcGxheTpyPSExLGxvb3A6cz0hMSxvYmV5TXV0ZVN3aXRjaDp1LHZvbHVtZTpwLHNlc3Npb25DYXRlZ29yeTpTPUtnLHBsYXliYWNrUmF0ZTpVfSl7bGV0IFA9cXNbZV07aWYoUCl7bGV0IEY9e2xvb3A6cyxhdXRvcGxheTpyfTtpZih0KXtsZXQgYmU9cWUodCk7UC5zcmMhPT1iZSYmKFAuc3JjPUYuc3JjPWJlKX1uJiYoUC5zdGFydFRpbWU9Ri5zdGFydFRpbWU9biksdHlwZW9mIHA9PSJudW1iZXIiJiYoUC52b2x1bWU9Ri52b2x1bWU9cCksUC5zZXRTdHlsZXMoRiksUyYmUC5zZXRTZXNzaW9uQ2F0ZWdvcnkoUyksVSYmUC5wbGF5YmFja1JhdGUmJlAucGxheWJhY2tSYXRlKFUpLCRUKGUpfXJldHVybntlcnJNc2c6InNldEF1ZGlvU3RhdGU6b2sifX1mdW5jdGlvbiB6VCh7YXVkaW9JZDplfSl7bGV0IHQ9cXNbZV07aWYoIXQpcmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpmYWlsIn07bGV0e3NyYzpuLHN0YXJ0VGltZTpyLHZvbHVtZTpzfT10O3JldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6b2siLGR1cmF0aW9uOjFlMyoodC5nZXREdXJhdGlvbigpfHwwKSxjdXJyZW50VGltZTp0LmlzU3RvcHBlZD8wOjFlMyp0LmdldFBvc2l0aW9uKCkscGF1c2VkOnQuaXNQYXVzZWQoKSxzcmM6bix2b2x1bWU6cyxzdGFydFRpbWU6MWUzKnIsYnVmZmVyZWQ6MWUzKnQuZ2V0QnVmZmVyZWQoKX19ZnVuY3Rpb24gV1Qoe29wZXJhdGlvblR5cGU6ZSxhdWRpb0lkOnQsY3VycmVudFRpbWU6bn0pe2xldCByPXFzW3RdO3N3aXRjaChlKXtjYXNlInBsYXkiOmNhc2UicGF1c2UiOmNhc2Uic3RvcCI6cltlPT09InBsYXkiJiZyLmlzUGF1c2VkKCk/InJlc3VtZSI6ZV0oKTticmVhaztjYXNlInNlZWsiOnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmci5zZWVrVG8obi8xZTMpO2JyZWFrfXJldHVybntlcnJNc2c6Im9wZXJhdGVBdWRpbzpvayJ9fWxldCAkZj1PYmplY3QuY3JlYXRlKG51bGwpLFpnPSh7c3RhdGU6ZSxhdWRpb0lkOnQsZXJyTXNnOm4sZXJyQ29kZTpyfSk9PntsZXQgcz0kZlt0XTtpZihzKWlmKGpmKHMsZSxuLHIpLGU9PT0icGxheSIpe2xldCB1PXMuY3VycmVudFRpbWU7amYocywidGltZVVwZGF0ZSIpLHMuX190aW1pbmc9ZygoKT0+e3MuY3VycmVudFRpbWUhPT11JiZqZihzLCJ0aW1lVXBkYXRlIil9LFVUKX1lbHNlKGU9PT0icGF1c2UifHxlPT09InN0b3AifHxlPT09ImVycm9yIikmJnkocy5fX3RpbWluZyl9LEdUPVt7bmFtZToic3JjIixjYWNoZTohMH0se25hbWU6InN0YXJ0VGltZSIsZGVmYXVsdDowLGNhY2hlOiEwfSx7bmFtZToiYXV0b3BsYXkiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJsb29wIixkZWZhdWx0OiExLGNhY2hlOiEwfSx7bmFtZToib2JleU11dGVTd2l0Y2giLGRlZmF1bHQ6ITAscmVhZG9ubHk6ITAsY2FjaGU6ITB9LHtuYW1lOiJkdXJhdGlvbiIscmVhZG9ubHk6ITB9LHtuYW1lOiJjdXJyZW50VGltZSIscmVhZG9ubHk6ITB9LHtuYW1lOiJwYXVzZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToiYnVmZmVyZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToidm9sdW1lIn0se25hbWU6InBsYXliYWNrUmF0ZSIsY2FjaGU6ITB9XTtjbGFzcyBIZntjb25zdHJ1Y3Rvcih0KXt0aGlzLmlkPXQsdGhpcy5fY2FsbGJhY2tzPXt9LHRoaXMuX29wdGlvbnM9e30sTWguZm9yRWFjaChuPT57dGhpcy5fY2FsbGJhY2tzW25dPVtdfSksR1QuZm9yRWFjaChuPT57bGV0IHI9bi5uYW1lO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHIse2dldDooKT0+e2xldCBzPW4uY2FjaGU/dGhpcy5fb3B0aW9uczp6VCh7YXVkaW9JZDp0aGlzLmlkfSksdT1yIGluIHM/c1tyXTpuLmRlZmF1bHQ7cmV0dXJuIHR5cGVvZiB1PT0ibnVtYmVyIiYmciE9PSJ2b2x1bWUiP3UvMWUzOnV9LHNldDpuLnJlYWRvbmx5P3ZvaWQgMDpzPT57dGhpcy5fb3B0aW9uc1tyXT1zLGpUKHEuZXh0ZW5kKHt9LHRoaXMuX29wdGlvbnMse2F1ZGlvSWQ6dGhpcy5pZH0pKX19KX0pLFlUKCl9cGxheSgpe3RoaXMuX29wZXJhdGUoInBsYXkiKX1wYXVzZSgpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9c3RvcCgpe3RoaXMuX29wZXJhdGUoInN0b3AiKX1zZWVrKHQpe3RoaXMuX29wZXJhdGUoInNlZWsiLHtjdXJyZW50VGltZTp0KjFlM30pfWRlc3Ryb3koKXt5KHRoaXMuX190aW1pbmcpLHFzW3RoaXMuaWRdJiYocXNbdGhpcy5pZF0uY2xvc2UoKSxkZWxldGUgcXNbdGhpcy5pZF0pLGRlbGV0ZSAkZlt0aGlzLmlkXX1fb3BlcmF0ZSh0LG4pe1dUKHEuZXh0ZW5kKHt9LG4se2F1ZGlvSWQ6dGhpcy5pZCxvcGVyYXRpb25UeXBlOnR9KSl9fWxldCBZVD1uZS5vbmNlKCgpPT57TWguZm9yRWFjaChlPT57SGYucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQpe3EuaXNGdW5jdGlvbih0KSYmdGhpcy5fY2FsbGJhY2tzW2VdLnB1c2godCl9fSksVWIuZm9yRWFjaChlPT57SGYucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQpe2xldCBuPXRoaXMuX2NhbGxiYWNrc1tlXSxyPW4uaW5kZXhPZih0KTtyPj0wJiZuLnNwbGljZShyLDEpfX0pfSk7ZnVuY3Rpb24gamYoZSx0LG4scil7bGV0IHM9YG9uJHtxLmNhcGl0YWxpemUodCl9YDtlLl9jYWxsYmFja3Nbc10uZm9yRWFjaCh1PT57cS5pc0Z1bmN0aW9uKHUpJiZ1KHQ9PT0iZXJyb3IiP3tlcnJNc2c6bixlcnJDb2RlOnJ9Ont9KX0pfWxldCBxVD1CdChnYiwoKT0+e2xldHthdWRpb0lkOmV9PUhUKCksdD1uZXcgSGYoZSk7cmV0dXJuICRmW2VdPXQsdH0pLEpUPVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJwcmV2IiwibmV4dCIsImVycm9yIiwid2FpdGluZyJdLFhnPXtjYW5wbGF5OltdLHBsYXk6W10scGF1c2U6W10sc3RvcDpbXSxlbmRlZDpbXSx0aW1lVXBkYXRlOltdLHByZXY6W10sbmV4dDpbXSxlcnJvcjpbXSx3YWl0aW5nOltdfSx1bix6Zj1udWxsLEtUPTI1MCxaVD1bInBsYXkiLCJwYXVzZSIsImVuZGVkIiwic3RvcCIsImNhbnBsYXkiXTtmdW5jdGlvbiBYVCgpe3l1KCksT2woe3N0YXRlOiJ0aW1lVXBkYXRlIn0pLHpmPWcoKCk9PntPbCh7c3RhdGU6InRpbWVVcGRhdGUifSl9LEtUKX1mdW5jdGlvbiB5dSgpe3pmIT09bnVsbCYmeSh6Zil9ZnVuY3Rpb24gUVQoKXtpZih1bilyZXR1cm47bGV0IGU9ZnQuaW52b2tlT25DYWxsYmFjazt1bj1vLmF1ZGlvLmNyZWF0ZVBsYXllcih7YXV0b3BsYXk6ITAsYmFja2dyb3VuZENvbnRyb2w6ITB9KSx1bi5zcmM9dW4udGl0bGU9dW4uZXBuYW1lPXVuLnNpbmdlcj11bi5jb3ZlckltZ1VybD11bi53ZWJVcmw9IiIsdW4uc3RhcnRUaW1lPTAsWlQuZm9yRWFjaCh0PT57dW4uYWRkRXZlbnRMaXN0ZW5lcih0LCgpPT57dD09PSJwbGF5Ij8odW4uaXNTdG9wcGVkPSExLFhUKCkpOnQ9PT0ic3RvcCImJih1bi5pc1N0b3BwZWQ9ITApLCh0PT09InBhdXNlInx8dD09PSJlbmRlZCJ8fHQ9PT0ic3RvcCIpJiZ5dSgpO2xldCBuPWBvbk11c2ljJHt0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX1gO2Uobix7ZGF0YVVybDp1bi5zcmMsZXJyTXNnOmAke259Om9rYH0pLE9sKHtzdGF0ZTp0LGRhdGFVcmw6dW4uc3JjfSl9KX0pLHVuLmFkZEV2ZW50TGlzdGVuZXIoIndhaXRpbmciLCgpPT57eXUoKSxPbCh7c3RhdGU6IndhaXRpbmciLGRhdGFVcmw6dW4uc3JjfSl9KSx1bi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdD0+e3l1KCksZSgib25NdXNpY0Vycm9yIix7ZGF0YVVybDp1bi5zcmMsZXJyTXNnOiJFcnJvcjoiK3QubWVzc2FnZX0pLE9sKHtzdGF0ZToiZXJyb3IiLGRhdGFVcmw6dW4uc3JjLGVyck1zZzp0Lm1lc3NhZ2UsZXJyQ29kZTp0LmNvZGV9KX0pLHVuLmFkZEV2ZW50TGlzdGVuZXIoInByZXYiLCgpPT57T2woe3N0YXRlOiJwcmV2In0pfSksdW4uYWRkRXZlbnRMaXN0ZW5lcigibmV4dCIsKCk9PntPbCh7c3RhdGU6Im5leHQifSl9KX1mdW5jdGlvbiBlTygpe2xldCBlPXtkdXJhdGlvbjowLGN1cnJlbnRUaW1lOjAscGF1c2VkOiExLHNyYzoiIixidWZmZXJlZDowLHRpdGxlOiIiLGVwbmFtZToiIixzaW5nZXI6IiIsY292ZXJJbWdVcmw6IiIsd2ViVXJsOiIiLHN0YXJ0VGltZTowLGVyck1zZzoiZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6b2sifTtpZih1bil7bGV0IHQ9e2R1cmF0aW9uOnVuLmdldER1cmF0aW9uKCl8fDAsY3VycmVudFRpbWU6dW4uaXNTdG9wcGVkPzA6dW4uZ2V0UG9zaXRpb24oKSxwYXVzZWQ6dW4uaXNQYXVzZWQoKSxzcmM6dW4uc3JjLGJ1ZmZlcmVkOnVuLmdldEJ1ZmZlcmVkKCksdGl0bGU6dW4udGl0bGUsZXBuYW1lOnVuLmVwbmFtZSxzaW5nZXI6dW4uc2luZ2VyLGNvdmVySW1nVXJsOnVuLmNvdmVySW1nVXJsLHdlYlVybDp1bi53ZWJVcmwsc3RhcnRUaW1lOnVuLnN0YXJ0VGltZX07ZT1xLmV4dGVuZChlLHQpfXJldHVybiBlfWZ1bmN0aW9uIFFnKGUsdCl7UVQoKTtsZXQgbj1bInNyYyIsInN0YXJ0VGltZSIsImNvdmVySW1nVXJsIiwid2ViVXJsIiwic2luZ2VyIiwiZXBuYW1lIiwidGl0bGUiXTtpZih0PT09InBsYXliYWNrUmF0ZSIpe2xldCBzPWVbdF07dW4ucGxheWJhY2tSYXRlJiZ1bi5wbGF5YmFja1JhdGUocGFyc2VGbG9hdChzKSk7cmV0dXJufWxldCByPXt9O09iamVjdC5rZXlzKGUpLmZvckVhY2gocz0+e2lmKG4uaW5kZXhPZihzKT49MCl7bGV0IHU9ZVtzXTtzPT09blswXSYmdSYmKHU9cWUodSkpLHVuW3NdPXJbc109dX19KSx1bi5zZXRTdHlsZXMocil9ZnVuY3Rpb24gdE8oe29wZXJhdGlvblR5cGU6ZSxzcmM6dCxwb3NpdGlvbjpuLGFwaTpyPSJvcGVyYXRlTXVzaWNQbGF5ZXIiLHRpdGxlOnMsY292ZXJJbWdVcmw6dX0pe3ZhciBwPVsicmVzdW1lIiwicGF1c2UiLCJzdG9wIl07cmV0dXJuIHAuaW5kZXhPZihlKT4wP3VuJiZ1bltlXSgpOmU9PT0icGxheSI/KFFnKHtzcmM6dCxzdGFydFRpbWU6bix0aXRsZTpzLGNvdmVySW1nVXJsOnV9KSx1bi5wbGF5KCkpOmU9PT0ic2VlayImJnVuJiZ1bi5zZWVrVG8obikse2Vyck1zZzpgJHtyfTpva2B9fWZ1bmN0aW9uIG5PKHtvcGVyYXRpb25UeXBlOmUsc3JjOnQsc3RhcnRUaW1lOm4sY3VycmVudFRpbWU6cn0pe3JldHVybiB0Tyh7b3BlcmF0aW9uVHlwZTplLHNyYzp0LHBvc2l0aW9uOm58fHJ8fDAsYXBpOiJvcGVyYXRlQmFja2dyb3VuZEF1ZGlvIn0pfWZ1bmN0aW9uIE9sKHtzdGF0ZTplLGVyck1zZzp0LGVyckNvZGU6bixkYXRhVXJsOnJ9KXtYZ1tlXS5mb3JFYWNoKHM9PntxLmlzRnVuY3Rpb24ocykmJnMoZT09PSJlcnJvciI/e2Vyck1zZzp0LGVyckNvZGU6bn06e30pfSl9bGV0IHJPPW5lLm9uY2UoKCk9PntKVC5mb3JFYWNoKGU9PntlcC5wcm90b3R5cGVbYG9uJHtxLmNhcGl0YWxpemUoZSl9YF09ZnVuY3Rpb24odCl7WGdbZV0ucHVzaCh0KX19KX0pLGlPPVt7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InRpdGxlIixjYWNoZTohMH0se25hbWU6ImVwbmFtZSIsY2FjaGU6ITB9LHtuYW1lOiJzaW5nZXIiLGNhY2hlOiEwfSx7bmFtZToiY292ZXJJbWdVcmwiLGNhY2hlOiEwfSx7bmFtZToid2ViVXJsIixjYWNoZTohMH0se25hbWU6InByb3RvY29sIixyZWFkb25seTohMCxkZWZhdWx0OiJodHRwIn0se25hbWU6InBsYXliYWNrUmF0ZSIsZGVmYXVsdDoxLGNhY2hlOiEwfV07Y2xhc3MgZXB7Y29uc3RydWN0b3IoKXt0aGlzLl9vcHRpb25zPXt9LGlPLmZvckVhY2godD0+e2xldCBuPXQubmFtZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxuLHtnZXQ6KCk9PntsZXQgcj10LmNhY2hlP3RoaXMuX29wdGlvbnM6ZU8oKTtyZXR1cm4gbiBpbiByP3Jbbl06dC5kZWZhdWx0fSxzZXQ6dC5yZWFkb25seT92b2lkIDA6cj0+e3RoaXMuX29wdGlvbnNbbl09cixRZyh0aGlzLl9vcHRpb25zLG4pfX0pfSksck8oKX1wbGF5KCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfXBhdXNlKCl7dGhpcy5fb3BlcmF0ZSgicGF1c2UiKX1zdG9wKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfXNlZWsodCl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOnR9KX1fb3BlcmF0ZSh0LG4pe25PKHEuZXh0ZW5kKHt9LG4se29wZXJhdGlvblR5cGU6dH0pKX19bGV0IHRwLG9PPUJ0KHh5LCgpPT50cHx8KHRwPW5ldyBlcCkpO2NsYXNzIGFPe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pZD10LHRoaXMuY3R4PW59c3RhcnQodCl7cmV0dXJuIGFuKHRoaXMuY3R4LCJzdGFydCIsdCl9c3RvcCh0KXtyZXR1cm4gYW4odGhpcy5jdHgsInN0b3AiLHQpfXBhdXNlKHQpe3JldHVybiBhbih0aGlzLmN0eCwicGF1c2UiLHQpfXJlc3VtZSh0KXtyZXR1cm4gYW4odGhpcy5jdHgsInJlc3VtZSIsdCl9c3dpdGNoQ2FtZXJhKHQpe3JldHVybiBhbih0aGlzLmN0eCwic3dpdGNoQ2FtZXJhIix0KX1zbmFwc2hvdCh0KXtyZXR1cm4gYW4odGhpcy5jdHgsInNuYXBzaG90Iix0KX10b2dnbGVUb3JjaCh0KXtyZXR1cm4gYW4odGhpcy5jdHgsInRvZ2dsZVRvcmNoIix0KX1wbGF5QkdNKHQpe3JldHVybiBrdCh0aGlzLmN0eCwicGxheUJHTSIsdCl9c3RvcEJHTSh0KXtyZXR1cm4gYW4odGhpcy5jdHgsInN0b3BCR00iLHQpfXBhdXNlQkdNKHQpe3JldHVybiBhbih0aGlzLmN0eCwicGF1c2VCR00iLHQpfXJlc3VtZUJHTSh0KXtyZXR1cm4gYW4odGhpcy5jdHgsInJlc3VtZUJHTSIsdCl9c2V0QkdNVm9sdW1lKHQpe3JldHVybiBrdCh0aGlzLmN0eCwic2V0QkdNVm9sdW1lIix0KX1zdGFydFByZXZpZXcodCl7cmV0dXJuIGFuKHRoaXMuY3R4LCJzdGFydFByZXZpZXciLHQpfXN0b3BQcmV2aWV3KHQpe3JldHVybiBhbih0aGlzLmN0eCwic3RvcFByZXZpZXciLHQpfX1mdW5jdGlvbiBKcyhlLHQsbixyKXtmdC5pbnZva2VWaWV3TWV0aG9kKCJsaXZlcHVzaGVyLiIrZSx7bGl2ZVB1c2hlcklkOmUsdHlwZTpuLGRhdGE6cn0sdCl9Y2xhc3Mgc097Y29uc3RydWN0b3IodCxuKXt0aGlzLmlkPXQsdGhpcy5wYWdlSWQ9bn1zdGFydCgpe0pzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0YXJ0Iil9c3RvcCgpe0pzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInN0b3AiKX1wYXVzZSgpe0pzKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBhdXNlIil9cmVzdW1lKCl7SnModGhpcy5pZCx0aGlzLnBhZ2VJZCwicmVzdW1lIil9c3dpdGNoQ2FtZXJhKCl7SnModGhpcy5pZCx0aGlzLnBhZ2VJZCwic3dpdGNoQ2FtZXJhIil9c3RhcnRQcmV2aWV3KCl7SnModGhpcy5pZCx0aGlzLnBhZ2VJZCwicHJldmlldyIpfXN0b3BQcmV2aWV3KCl7SnModGhpcy5pZCx0aGlzLnBhZ2VJZCwic3RvcCIpfXNuYXBzaG90KCl7SnModGhpcy5pZCx0aGlzLnBhZ2VJZCwic25hcHNob3QiKX19bGV0IGxPPUJ0KHBiLChlLHQpPT57aWYodC4kcGFnZS5tZXRhLmlzTlZ1ZSl7aWYoIXQpcmV0dXJuIGNvbnNvbGUud2FybigidW5pLmNyZWF0ZUxpdmVQdXNoZXJDb250ZXh0OiAyIGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgMSBwcmVzZW50Iik7bGV0IG49Q24oZSx0KTtyZXR1cm4gbj9uZXcgYU8oZSxuKTpjb25zb2xlLndhcm4oIkNhbiBub3QgZmluZCBgIitlKyJgIil9cmV0dXJuIG5ldyBzTyhlLHQuJHBhZ2UuaWQpfSx2YiksVWk9My4xNDE1OTI2NTM1ODk3OTMsRXU9NjM3ODI0NSxTdT0uMDA2NjkzNDIxNjIyOTY1OTQzO2Z1bmN0aW9uIGNPKGUsdCl7aWYodD0rdCxlPStlLG5wKGUsdCkpcmV0dXJuW2UsdF07bGV0IG49cnAoZS0xMDUsdC0zNSkscj1pcChlLTEwNSx0LTM1KSxzPXQvMTgwKlVpLHU9TWF0aC5zaW4ocyk7dT0xLVN1KnUqdTtsZXQgcD1NYXRoLnNxcnQodSk7bj1uKjE4MC8oRXUqKDEtU3UpLyh1KnApKlVpKSxyPXIqMTgwLyhFdS9wKk1hdGguY29zKHMpKlVpKTtsZXQgUz10K24sVT1lK3I7cmV0dXJuW2UqMi1VLHQqMi1TXX1mdW5jdGlvbiB1TyhlLHQpe2lmKHQ9K3QsZT0rZSxucChlLHQpKXJldHVybltlLHRdO2xldCBuPXJwKGUtMTA1LHQtMzUpLHI9aXAoZS0xMDUsdC0zNSkscz10LzE4MCpVaSx1PU1hdGguc2luKHMpO3U9MS1TdSp1KnU7bGV0IHA9TWF0aC5zcXJ0KHUpO249bioxODAvKEV1KigxLVN1KS8odSpwKSpVaSkscj1yKjE4MC8oRXUvcCpNYXRoLmNvcyhzKSpVaSk7bGV0IFM9dCtuO3JldHVybltlK3IsU119bGV0IG5wPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8NzIuMDA0fHxlPjEzNy44MzQ3fHx0PC44MjkzfHx0PjU1LjgyNzF8fCExfSxycD1mdW5jdGlvbihlLHQpe2xldCBuPS0xMDArMiplKzMqdCsuMip0KnQrLjEqZSp0Ky4yKk1hdGguc3FydChNYXRoLmFicyhlKSk7cmV0dXJuIG4rPSgyMCpNYXRoLnNpbig2KmUqVWkpKzIwKk1hdGguc2luKDIqZSpVaSkpKjIvMyxuKz0oMjAqTWF0aC5zaW4odCpVaSkrNDAqTWF0aC5zaW4odC8zKlVpKSkqMi8zLG4rPSgxNjAqTWF0aC5zaW4odC8xMipVaSkrMzIwKk1hdGguc2luKHQqVWkvMzApKSoyLzMsbn0saXA9ZnVuY3Rpb24oZSx0KXtsZXQgbj0zMDArZSsyKnQrLjEqZSplKy4xKmUqdCsuMSpNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0oMjAqTWF0aC5zaW4oNiplKlVpKSsyMCpNYXRoLnNpbigyKmUqVWkpKSoyLzMsbis9KDIwKk1hdGguc2luKGUqVWkpKzQwKk1hdGguc2luKGUvMypVaSkpKjIvMyxuKz0oMTUwKk1hdGguc2luKGUvMTIqVWkpKzMwMCpNYXRoLnNpbihlLzMwKlVpKSkqMi8zLG59O2Z1bmN0aW9uIG9wKGUsdCxuKXtsZXQgcj10LmNvb3JkcztpZihlIT09dC5jb29yZHNUeXBlKXtsZXQgcztlPT09Indnczg0Ij9zPWNPKHIubG9uZ2l0dWRlLHIubGF0aXR1ZGUpOmU9PT0iZ2NqMDIiJiYocz11TyhyLmxvbmdpdHVkZSxyLmxhdGl0dWRlKSkscyYmKHIubG9uZ2l0dWRlPXNbMF0sci5sYXRpdHVkZT1zWzFdKX1uKHt0eXBlOmUsYWx0aXR1ZGU6ci5hbHRpdHVkZXx8MCxsYXRpdHVkZTpyLmxhdGl0dWRlLGxvbmdpdHVkZTpyLmxvbmdpdHVkZSxzcGVlZDpyLnNwZWVkLGFjY3VyYWN5OnIuYWNjdXJhY3ksYWRkcmVzczp0LmFkZHJlc3MsZXJyTXNnOiJnZXRMb2NhdGlvbjpvayJ9KX1sZXQgZk89VGUocEUsKHt0eXBlOmU9Indnczg0IixnZW9jb2RlOnQ9ITEsYWx0aXR1ZGU6bj0hMSxoaWdoQWNjdXJhY3lFeHBpcmVUaW1lOnIsaXNIaWdoQWNjdXJhY3k6cz0hMX0se3Jlc29sdmU6dSxyZWplY3Q6cH0pPT57by5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oUz0+e29wKGUsUyx1KX0sUz0+e2lmKFMuY29kZT09PTE1MDEpe29wKGUsUyx1KTtyZXR1cm59cCgiZ2V0TG9jYXRpb246ZmFpbCAiK1MubWVzc2FnZSl9LHtnZW9jb2RlOnQsZW5hYmxlSGlnaEFjY3VyYWN5OnN8fG4sdGltZW91dDpyLGNvb3Jkc1R5cGU6ZX0pfSxtRSx2RSksZE89VGUoaEUsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHM9TmcoKSE9PSJsaWdodCIsdSxwPVZhKHt1cmw6Il9fdW5pYXBwY2hvb3NlbG9jYXRpb24iLGRhdGE6cS5leHRlbmQoe30sZSx7bG9jYWxlOk1jKCl9KSxzdHlsZTp7YW5pbWF0aW9uVHlwZTplLmFuaW1hdGlvblR5cGV8fCJzbGlkZS1pbi1ib3R0b20iLHRpdGxlTlZpZXc6ITEscG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSJ9LG9uTWVzc2FnZSh7ZXZlbnQ6UyxkZXRhaWw6VX0pe1M9PT0ic2VsZWN0ZWQiJiYodT1VKX0sb25DbG9zZSgpe3MmJm8ubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksdT90KHUpOm4oImNhbmNlbCIpfX0pO3MmJihvLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxwLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsKHt0eXBlOlMscmVzdWx0OlV9KT0+e1M9PT0ic3RhcnQiP28ubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6Uz09PSJlbmQiJiYhVSYmby5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSl9LGdFKSxoTz1UZShfRSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PihWYSh7dXJsOiJfX3VuaWFwcG9wZW5sb2NhdGlvbiIsZGF0YTpxLmV4dGVuZCh7fSxlLHtsb2NhbGU6TWMoKX0pLHN0eWxlOnt0aXRsZU5WaWV3Ont0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25DbG9zZSgpe24oImNhbmNlbCIpfX0pLHQoKSkseUUsYkUpLHd1PSExLEdjPTAsZ089VGUoYlMsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57R2M9R2N8fG8uZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihyPT57d3U9ITAsZnQuaW52b2tlT25DYWxsYmFjayhjZyxyLmNvb3Jkcyl9LHI9Pnt3dXx8KG4oci5tZXNzYWdlKSx3dT0hMCksZnQuaW52b2tlT25DYWxsYmFjayh1Zyx7ZXJyTXNnOmBvbkxvY2F0aW9uQ2hhbmdlOmZhaWwgJHtyLm1lc3NhZ2V9YH0pfSx7Y29vcmRzVHlwZTplPT1udWxsP3ZvaWQgMDplLnR5cGV9KSxDKHQsMTAwKX0sd1MsQVMpLHBPPVRlKHlTLChlLHtyZXNvbHZlOnR9KT0+e0djJiYoby5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKEdjKSx3dT0hMSxHYz0wKSx0KCl9KSx2Tz1qbihjZywoKT0+e30pLG1PPVlyKEVTLCgpPT57fSksX089am4odWcsKCk9Pnt9KSxiTz1ZcihTUywoKT0+e30pLHlPPVRlKHV3LCh7dGl0bGU6ZT0iIixjb250ZW50OnQ9IiIsc2hvd0NhbmNlbDpuPSEwLGNhbmNlbFRleHQ6cixjYW5jZWxDb2xvcjpzLGNvbmZpcm1UZXh0OnUsY29uZmlybUNvbG9yOnAsZWRpdGFibGU6Uz0hMSxwbGFjZWhvbGRlclRleHQ6VT0iIn09e30se3Jlc29sdmU6UH0pPT57bGV0IEY9bj9bcix1XTpbdV0sYmU9Uz9VOkY7dD10fHwiICIsby5uYXRpdmVVSVtTPyJwcm9tcHQiOiJjb25maXJtIl0odCxFZT0+e2lmKG4pe2xldCBQZT1FZS5pbmRleD09PTEsY3Q9e2NvbmZpcm06UGUsY2FuY2VsOkVlLmluZGV4PT09MHx8RWUuaW5kZXg9PT0tMX07UGUmJlMmJihjdC5jb250ZW50PUVlLnZhbHVlKSxQKGN0KX1lbHNle2xldCBQZT17Y29uZmlybTpFZS5pbmRleD09PTAsY2FuY2VsOiExfTtTJiYoUGUuY29udGVudD1FZS52YWx1ZSksUChQZSl9fSxlLGJlLEYpfSxmdyxkdyksRU89e2xpZ2h0OntpdGVtQ29sb3I6IiMwMDAwMDAifSxkYXJrOntpdGVtQ29sb3I6InJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSJ9fSxTTz1UZShpdywoe2l0ZW1MaXN0OmU9W10saXRlbUNvbG9yOnQsdGl0bGU6bj0iIixwb3BvdmVyOnJ9LHtyZXNvbHZlOnMscmVqZWN0OnV9KT0+e3Q9PT0iIzAwMCImJkkuZGFya21vZGUmJih0PUVPW28ubmF2aWdhdG9yLmdldFVJU3R5bGUoKV0uaXRlbUNvbG9yKSx3bygpO2xldHt0OnB9PUV0KCksUz17dGl0bGU6bixjYW5jZWw6cCgidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiKSxidXR0b25zOmUubWFwKFU9Pih7dGl0bGU6VSxjb2xvcjp0fSkpfTtvLm5hdGl2ZVVJLmFjdGlvblNoZWV0KHEuZXh0ZW5kKFMse3BvcG92ZXI6cn0pLFU9PntVLmluZGV4PjA/cyh7dGFwSW5kZXg6VS5pbmRleC0xfSk6dSgic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIil9KX0sb3csYXcpLFljLFdmPSExLEF1PSIiLEN1LHdPPVRlKHN3LChlLHQpPT5hcChxLmV4dGVuZCh7fSxlLHt0eXBlOiJsb2FkaW5nIixpY29uOiJsb2FkaW5nIn0pLHQpLGx3LGN3KSxhcD0oe3RpdGxlOmU9IiIsaWNvbjp0PSJzdWNjZXNzIixpbWFnZTpuPSIiLGR1cmF0aW9uOnI9MTUwMCxtYXNrOnM9ITEscG9zaXRpb246dSx0eXBlOnA9InRvYXN0IixzdHlsZTpTfSx7cmVzb2x2ZTpVLHJlamVjdDpQfSk9PntpZihUdSgiIiksQXU9cCxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKFN0cmluZyh1KSkpby5uYXRpdmVVSS50b2FzdChlLHt2ZXJ0aWNhbEFsaWduOnV9KSxXZj0hMDtlbHNle3QmJiF+WyJzdWNjZXNzIiwibG9hZGluZyIsImVycm9yIiwibm9uZSJdLmluZGV4T2YodCkmJih0PSJzdWNjZXNzIik7bGV0IEY9e21vZGFsOnMsYmFjazoidHJhbnNtaXQiLHBhZGRpbmc6IjEwcHgiLHNpemU6IjE2cHgifTshbiYmKCF0fHx0PT09Im5vbmUiKT9GLmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifTooRi53aWR0aD0iMTQwcHgiLEYuaGVpZ2h0PSIxMTJweCIpLG4/Ri5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOm4saW50ZXJ2YWw6cn06WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKHQpIT09LTEmJihGLmxvYWRpbmc9e2Rpc3BsYXk6ImJsb2NrIixoZWlnaHQ6IjU1cHgiLGljb246dD09PSJzdWNjZXNzIj8iX191bmlhcHBzdWNjZXNzLnBuZyI6Il9fdW5pYXBwZXJyb3IucG5nIixpbnRlcnZhbDpyfSk7dHJ5e1ljPW8ubmF0aXZlVUkuc2hvd1dhaXRpbmcoZSxxLmV4dGVuZChGLFMpKX1jYXRjaChiZSl7UChgJHtiZX1gKX19cmV0dXJuIEF1PT09InRvYXN0IiYmKEN1PUMoKCk9PntUdSgiIil9LHIpKSxVKCl9LEFPPVRlKGh3LGFwLHB3LHZ3KSxDTz1UZShHUywoZSx0KT0+VHUoInRvYXN0Iix0KSksVE89VGUoV1MsKGUsdCk9PlR1KCJsb2FkaW5nIix0KSk7ZnVuY3Rpb24gVHUoZT0idG9hc3QiLHQpe3JldHVybiBlJiZlIT09QXV8fChDdSYmKGIoQ3UpLEN1PW51bGwpLFdmP28ubmF0aXZlVUkuY2xvc2VUb2FzdCgpOlljJiZZYy5jbG9zZSYmWWMuY2xvc2UoKSxZYz1udWxsLFdmPSExLEF1PSIiKSx0JiZ0LnJlc29sdmUoKX1sZXQgT089VGUobXcsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9UGcoKTtpZihyJiZyLmVuZFB1bGxUb1JlZnJlc2goKSxyPW11KCksIXIpcmV0dXJuIG4oKTtyLmJlZ2luUHVsbFRvUmVmcmVzaCgpLE1mKHIpLHQoKX0pLFBPPVRlKF93LChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPVBnKCl8fG11KCk7aWYoIXIpcmV0dXJuIG4oKTtyLmVuZFB1bGxUb1JlZnJlc2goKSxNZihudWxsKSx0KCl9KSxOTz1UZShnZywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1scihyaSgpKTtmdC5pbnZva2VWaWV3TWV0aG9kKGdnLGUscixzPT57dHlwZW9mIHM9PSJzdHJpbmciP24ocyk6dCgpfSl9LFlTKSxrTz1UZShwZywoZSx7cmVzb2x2ZTp0fSk9PntsZXQgbj1scihyaSgpKTtmdC5pbnZva2VWaWV3TWV0aG9kKHBnLGUsbix0KX0sbncscncpLElPPVRlKFhTLCh7X19wYWdlX186ZSx0aXRsZTp0fSx7cmVzb2x2ZTpuLHJlamVjdDpyfSk9PntsZXQgcz1UZyhlKTtpZihzKXtsZXQgdT1zLmdldFN0eWxlKCk7dSYmdS50aXRsZU5WaWV3JiZzLnNldFN0eWxlKHt0aXRsZU5WaWV3Ont0aXRsZVRleHQ6dH19KSxuKCl9ZWxzZSByKCl9LFFTKSxSTz1UZShldywoZSx7cmVzb2x2ZTp0fSk9PntvLm5hdGl2ZVVJLnNob3dXYWl0aW5nKCIiLHttb2RhbDohMX0pLHQoKX0pLHhPPVRlKHR3LChlLHtyZXNvbHZlOnR9KT0+e28ubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksdCgpfSk7ZnVuY3Rpb24gQk8oZSl7bGV0IHQ9VW4oKTshdC5sZW5ndGh8fCh0W3QubGVuZ3RoLTFdLiRwYWdlLnN0YXR1c0JhclN0eWxlPWUpfWxldCBNTz1UZShKUywoe19fcGFnZV9fOmUsZnJvbnRDb2xvcjp0LGJhY2tncm91bmRDb2xvcjpufSx7cmVzb2x2ZTpyLHJlamVjdDpzfSk9PntsZXQgdT1UZyhlKTtpZih1KXtsZXQgcD17fTt0JiYocC50aXRsZUNvbG9yPXQpLG4mJihwLmJhY2tncm91bmRDb2xvcj1uKTtsZXQgUz10PT09IiMwMDAwMDAiPyJkYXJrIjoibGlnaHQiO28ubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKFMpLEJPKFMpO2xldCBVPXUuZ2V0U3R5bGUoKTtVJiZVLnRpdGxlTlZpZXcmJihVLnRpdGxlTlZpZXcuYXV0b0JhY2tCdXR0b24mJihwLmJhY2tCdXR0b249cC5iYWNrQnV0dG9ufHx7fSxwLmJhY2tCdXR0b24uY29sb3I9dCksdS5zZXRTdHlsZSh7dGl0bGVOVmlldzpwfSkpLHIoKX1lbHNlIHMoKX0sWlMsS1MpLExPPVRlKER3LCh7aW5kZXg6ZSx0ZXh0OnR9LHtyZXNvbHZlOm4scmVqZWN0OnJ9KT0+e1NpLnNldFRhYkJhckJhZGdlKCJ0ZXh0IixlLHQpLG4oKX0sVncsVXcpLEZPPVRlKGJ3LCh7aW5kZXg6ZSx0ZXh0OnQsaWNvblBhdGg6bixzZWxlY3RlZEljb25QYXRoOnIscGFnZVBhdGg6cyx2aXNpYmxlOnUsaWNvbmZvbnQ6cH0se3Jlc29sdmU6U30pPT57aWYoU2kuc2V0VGFiQmFySXRlbShlLHQsbixyLHUscCkscyl7bGV0IFU9SS50YWJCYXIubGlzdFtlXTtpZihVKXtsZXQgUD1VLnBhZ2VQYXRoLEY9bmUucmVtb3ZlTGVhZGluZ1NsYXNoKHMpO0YhPT1QJiZpbChlLFAsRil9fVMoKX0seXcsRXcpLERPPVRlKFN3LChlPXt9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2lmKCFVYygpKXJldHVybiBuKCJub3QgVGFiQmFyIHBhZ2UiKTtlLmJvcmRlclN0eWxlPW5lLm5vcm1hbGl6ZVRhYkJhclN0eWxlcyhlLmJvcmRlclN0eWxlKSxTaS5zZXRUYWJCYXJTdHlsZShlKSx0KCl9LHd3LEN3KSxWTz1UZShUdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lJiZlLmFuaW1hdGlvbjtpZighVWMoKSlyZXR1cm4gbigibm90IFRhYkJhciBwYWdlIik7U2kuaGlkZVRhYkJhcihCb29sZWFuKHIpKSx0KCl9LHZnKSxVTz1UZShPdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lJiZlLmFuaW1hdGlvbjtpZighVWMoKSlyZXR1cm4gbigibm90IFRhYkJhciBwYWdlIik7U2kuc2hvd1RhYkJhcihCb29sZWFuKHIpKSx0KCl9LFB3KSwkTz1UZShSdywoe2luZGV4OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e1NpLnNldFRhYkJhckJhZGdlKCJyZWREb3QiLGUpLHQoKX0seHcsQncpLHNwPWU9PlNpLnNldFRhYkJhckJhZGdlKCJub25lIixlKSxITz1UZShNdywoe2luZGV4OmV9LHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e3NwKGUpLHQoKX0sTHcsRncpLGpPPVRlKE53LCh7aW5kZXg6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57c3AoZSksdCgpfSxrdyxJdyksbHA9InZkU3luYyIsek89Il9fdW5pYXBwX19zZXJ2aWNlIix2Yz0ib25XZWJ2aWV3UmVhZHkiLFdPPTAsR089IndlYnZpZXdJbnNlcnRlZCIsWU89IndlYnZpZXdSZW1vdmVkIixjcD0iVW5pQXBwU3ViTlZ1ZSI7Y2xhc3MgcU97Y29uc3RydWN0b3IodCxuKXt0aGlzLmNhbGxiYWNrcz1bXTtsZXQgcj10aGlzLndlYnZpZXc9by53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQpO2lmKHRoaXMuaXNTdWI9bnx8ITEsci5fX3VuaWFwcF9tYXNrX2lkKXtsZXQgcz10aGlzLm1hc2tXZWJ2aWV3PXIuX191bmlhcHBfbWFza19pZD09PSIwIj97c2V0U3R5bGUoe21hc2s6cH0pe2hhKCJ1bmktdGFidmlldyIpLnNldE1hc2soe2NvbG9yOnB9KX19Om8ud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChyLl9fdW5pYXBwX21hc2tfaWQpLHU9ZnVuY3Rpb24oKXtzLnNldFN0eWxlKHttYXNrOiJub25lIn0pfTtyLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLHUpLHIuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLHUpfX1zaG93KC4uLnQpe2lmKHRoaXMubWFza1dlYnZpZXcpe2xldCBuPXRoaXMud2Vidmlldy5fX3VuaWFwcF9tYXNrO3RoaXMubWFza1dlYnZpZXcuc2V0U3R5bGUoe21hc2s6bn0pfXRoaXMud2Vidmlldy5zaG93KC4uLnQpfWhpZGUoLi4udCl7dGhpcy53ZWJ2aWV3LmhpZGUoLi4udCl9c2V0U3R5bGUodCl7dGhpcy53ZWJ2aWV3LnNldFN0eWxlKHQpfWluaXRNZXNzYWdlKCl7aWYodGhpcy5tZXNzYWdlUmVhZHkpcmV0dXJuO3RoaXMubWVzc2FnZVJlYWR5PSEwO2xldCB0PXI9PntpZihyLmRhdGEmJnIuZGF0YS50eXBlPT09Y3Ape2xldCBzPXIuZGF0YS50YXJnZXQ7cy5pZD09PXRoaXMud2Vidmlldy5pZCYmcy5pc1N1Yj09PXRoaXMuaXNTdWImJnRoaXMuY2FsbGJhY2tzLmZvckVhY2godT0+e3Uoe29yaWdpbjp0aGlzLndlYnZpZXcuX191bmlhcHBfaG9zdCxkYXRhOnIuZGF0YS5kYXRhfSl9KX19O2hhKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIix0KSx0aGlzLndlYnZpZXcuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLCgpPT57dGhpcy5jYWxsYmFja3MubGVuZ3RoPTB9KX1wb3N0TWVzc2FnZSh0KXtvLndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KHt0eXBlOmNwLGRhdGE6dCx0YXJnZXQ6e2lkOnRoaXMud2Vidmlldy5pZCxpc1N1YjohdGhpcy5pc1N1Yn19LHpPKX1vbk1lc3NhZ2UodCl7dGhpcy5pbml0TWVzc2FnZSgpLHRoaXMuY2FsbGJhY2tzLnB1c2godCl9fWxldCBKTz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgcU8oZSx0KX07ZnVuY3Rpb24gS08oZSx0LG4scixzLHUscCl7byE9PW4mJihfPXNuPWUsZj10LG89bixZQShvLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSksby5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU9U2csQz1yLGI9cyxnPXUseT1wKSxJLnNlcnZpY2VSZWFkeT0hMH1mdW5jdGlvbiBaTygpe2xldCBlPVsiQXJyYXlCdWZmZXIiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJCaWdJbnQ2NEFycmF5IiwiQmlnVWludDY0QXJyYXkiXSx0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fWZ1bmN0aW9uIFhPKGUpe3EuZXh0ZW5kKGdsb2JhbCxlKX1sZXQgdXA9e29hdXRoKGUpe28ub2F1dGguZ2V0U2VydmljZXModD0+e3Q9dDtsZXQgbj1bXTt0LmZvckVhY2goKHtpZDpyfSk9PntuLnB1c2gocil9KSxlKG51bGwsbix0KX0sdD0+e3Q9dCxlKHQpfSl9LHNoYXJlKGUpe28uc2hhcmUuZ2V0U2VydmljZXModD0+e3Q9dDtsZXQgbj1bXTt0LmZvckVhY2goKHtpZDpyfSk9PntuLnB1c2gocil9KSxlKG51bGwsbix0KX0sdD0+e2UodCl9KX0scGF5bWVudChlKXtvLnBheW1lbnQuZ2V0Q2hhbm5lbHModD0+e2xldCBuPVtdO3QuZm9yRWFjaCgoe2lkOnJ9KT0+e24ucHVzaChyKX0pLGUobnVsbCxuLHQpfSx0PT57ZSh0KX0pfSxwdXNoKGUpe2lmKHR5cGVvZiBmIT0idW5kZWZpbmVkInx8dHlwZW9mIG8hPSJ1bmRlZmluZWQiKXtsZXQgdD1vLnB1c2guZ2V0Q2xpZW50SW5mbygpO2UobnVsbCxbdC5pZF0sW3RdKX1lbHNlIGUobnVsbCxbXSl9fSxRTz1UZSgkdywoe3NlcnZpY2U6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57dXBbZV0/dXBbZV0oKHIscz1bXSx1PVtdKT0+e3I/bihyLm1lc3NhZ2UpOnQoe3NlcnZpY2U6ZSxwcm92aWRlcjpzLHByb3ZpZGVyczp1Lm1hcChwPT4odHlwZW9mIHAuc2VydmljZVJlYWR5PT0iYm9vbGVhbiImJihwLmlzQXBwRXhpc3Q9cC5zZXJ2aWNlUmVhZHkpLHR5cGVvZiBwLm5hdGl2ZUNsaWVudD09ImJvb2xlYW4iJiYocC5pc0FwcEV4aXN0PXAubmF0aXZlQ2xpZW50KSxwKSl9KX0pOm4oInNlcnZpY2Ugbm90IGZvdW5kIil9LEh3KSxPdTtmdW5jdGlvbiBxYyhlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntvLm9hdXRoLmdldFNlcnZpY2VzKHI9PntsZXQgcz1yLmZpbmQoKHtpZDp1fSk9PnU9PT1lKTtzP3Qocyk6bihuZXcgRXJyb3IoInByb3ZpZGVyIG5vdCBmaW5kIikpfSxuKX0pfWxldCBmcD1UZShqdywoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyfHwid2VpeGluIixzPUFyKG4pLHU9cj09PSJhcHBsZSIscD11P3tzY29wZToiZW1haWwifTplLnVuaXZlcmlmeVN0eWxlP3t1bml2ZXJpZnlTdHlsZTpuUChlLnVuaXZlcmlmeVN0eWxlLHMpfTp7fTtxYyhyKS50aGVuKFM9PntmdW5jdGlvbiBVKCl7aWYoZS5vbmx5QXV0aG9yaXplJiZyPT09IndlaXhpbiIpe1MuYXV0aG9yaXplKCh7Y29kZTpQfSk9Pnt0KHtjb2RlOlAsYXV0aFJlc3VsdDoiIn0pfSxzKTtyZXR1cm59Uy5sb2dpbihQPT57bGV0IEY9UC50YXJnZXQuYXV0aFJlc3VsdCxiZT1QLnRhcmdldC5hcHBsZUluZm87dCh7Y29kZTpGLmNvZGUsYXV0aFJlc3VsdDpGLGFwcGxlSW5mbzpiZX0pfSxzLHApfXV8fHI9PT0idW5pdmVyaWZ5Ij9VKCk6Uy5sb2dvdXQoVSxVKX0pLmNhdGNoKHMpfSx6dyksZHA9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9ZS5wcm92aWRlcnx8IndlaXhpbiIscz1BcihuKTtxYyhyKS50aGVuKHU9Pnt1LmdldFVzZXJJbmZvKHA9PntsZXQgUz17bmlja05hbWU6IiJ9O2lmKHI9PT0id2VpeGluIil7bGV0IFA9dS51c2VySW5mbztQJiYoUz17b3BlbklkOlAub3BlbmlkLG5pY2tOYW1lOlAubmlja25hbWUsZ2VuZGVyOlAuc2V4LGNpdHk6UC5jaXR5LHByb3ZpbmNlOlAucHJvdmluY2UsY291bnRyeTpQLmNvdW50cnksYXZhdGFyVXJsOlAuaGVhZGltZ3VybCx1bmlvbklkOlAudW5pb25pZH0pfWVsc2UgaWYocj09PSJhcHBsZSIpe2xldCBQPXUuYXBwbGVJbmZvO1AmJihTPXtvcGVuSWQ6UC51c2VyLGZ1bGxOYW1lOlAuZnVsbE5hbWUsZW1haWw6UC5lbWFpbCxhdXRob3JpemF0aW9uQ29kZTpQLmF1dGhvcml6YXRpb25Db2RlLGlkZW50aXR5VG9rZW46UC5pZGVudGl0eVRva2VuLHJlYWxVc2VyU3RhdHVzOlAucmVhbFVzZXJTdGF0dXN9KX1lbHNlIFM9dS51c2VySW5mbyxTJiYoUy5vcGVuSWQ9Uy5vcGVuSWR8fFMub3BlbmlkfHx1LmF1dGhSZXN1bHQub3BlbmlkLFMubmlja05hbWU9Uy5uaWNrTmFtZXx8Uy5uaWNrbmFtZSxTLmF2YXRhclVybD1TLmF2YXRhclVybHx8Uy5oZWFkaW1ndXJsKTtsZXQgVT17fTtlLmRhdGEmJmUuZGF0YS5hcGlfbmFtZT09PSJ3ZWJhcGlfZ2V0dXNlcmluZm8iP1UuZGF0YT17ZGF0YTpKU09OLnN0cmluZ2lmeShTKSxyYXdEYXRhOiIiLHNpZ25hdHVyZToiIixlbmNyeXB0ZWREYXRhOiIiLGl2OiIifTpVLnVzZXJJbmZvPVMsdChVKX0scyl9KS5jYXRjaCgoKT0+e24oIlx1OEJGN1x1NTE0OFx1OEMwM1x1NzUyOCB1bmkubG9naW4iKX0pfSxlUD1UZShXdyxkcCxHdyksdFA9VGUoWXcsZHAscXcpLGhwPVRlKEp3LCh7cHJvdmlkZXI6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9Q2wodCkscz1BcihuKTtxYyhlKS50aGVuKHU9PnUucHJlTG9naW4ocixzKSkuY2F0Y2gocyl9LFh3LFp3KSxncD0oKT0+cWMoInVuaXZlcmlmeSIpLnRoZW4oZT0+ZS5jbG9zZUF1dGhWaWV3KCkpLHBwPUJ0KFF3LGdwKSx2cD1UZShlQSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1DbCh0KSxzPUFyKG4pO3RyeXtxYygidW5pdmVyaWZ5IikudGhlbih1PT57bGV0IHA9dS5nZXRDaGVja0JveFN0YXRlKCk7cih7c3RhdGU6cH0pfSl9Y2F0Y2godSl7cyh1KX19KTtmdW5jdGlvbiBuUChlLHQpe3JldHVybiBxLmlzUGxhaW5PYmplY3QoZSkmJnEuaXNQbGFpbk9iamVjdChlLmJ1dHRvbnMpJiZxLnRvVHlwZVN0cmluZyhlLmJ1dHRvbnMubGlzdCk9PT0iW29iamVjdCBBcnJheV0iJiZlLmJ1dHRvbnMubGlzdC5mb3JFYWNoKChuLHIpPT57ZS5idXR0b25zLmxpc3Rbcl0ub25jbGljaz1mdW5jdGlvbigpe2xldCBzPXtjb2RlOiIzMDAwOCIsbWVzc2FnZToiXHU3NTI4XHU2MjM3XHU3MEI5XHU1MUZCXHU0RTg2XHU4MUVBXHU1QjlBXHU0RTQ5XHU2MzA5XHU5NEFFIixpbmRleDpyLHByb3ZpZGVyOm4ucHJvdmlkZXJ9O3EuaXNQbGFpbk9iamVjdChPdSk/T3UuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2socyk6Z3AoKS50aGVuKCgpPT57dChzKX0pfX0pLGV9Y2xhc3MgclB7Y29uc3RydWN0b3IoKXt0aGlzLnByb3ZpZGVyPSJ1bml2ZXJpZnkiLHRoaXMuZXZlbnROYW1lPSJhcGkudW5pdmVyaWZ5QnV0dG9uc0NsaWNrIn1jbG9zZSgpe3JldHVybiBwcCgpfWxvZ2luKHQpe3JldHVybiBmcCh0aGlzLl9nZXRPcHRpb25zKHQpKX1nZXRDaGVja0JveFN0YXRlKHQpe3JldHVybiB2cCh0KX1wcmVMb2dpbih0KXtyZXR1cm4gaHAodGhpcy5fZ2V0T3B0aW9ucyh0KSl9b25CdXR0b25zQ2xpY2sodCl7ZnQub24odGhpcy5ldmVudE5hbWUsdCl9b2ZmQnV0dG9uc0NsaWNrKHQpe2Z0Lm9mZih0aGlzLmV2ZW50TmFtZSx0KX1fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayh0KXtmdC5lbWl0KHRoaXMuZXZlbnROYW1lLHQpfV9nZXRPcHRpb25zKHQ9e30pe3JldHVybiBxLmV4dGVuZCh7fSx0LHtwcm92aWRlcjp0aGlzLnByb3ZpZGVyfSl9fWxldCBpUD1CdCh0QSwoKT0+T3V8fChPdT1uZXcgclApKSxvUD1UZSh1QSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1ZZygpO2lmKHIubm90aWZpY2F0aW9uQXV0aG9yaXplZCE9PSJhdXRob3JpemVkIilyZXR1cm4gbigibm90aWZpY2F0aW9uQXV0aG9yaXplZDogIityLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWQpO2xldCBzPXEuZXh0ZW5kKHt9LGUpO2RlbGV0ZSBzLmNvbnRlbnQsZGVsZXRlIHMucGF5bG9hZCxvLnB1c2guY3JlYXRlTWVzc2FnZShlLmNvbnRlbnQsZS5wYXlsb2FkLHMpLHQoKX0sdm9pZCAwLGZBKSxtcCxhUD1CdChkQSwoKT0+bXB8fChtcD1vLnB1c2guZ2V0Q2hhbm5lbE1hbmFnZXIoKSkpLHNQPUJ0KCJyZWdpc3RlclJ1bnRpbWUiLGU9PntxLmV4dGVuZChqc1J1bnRpbWUsZSl9KSxsUD17MDp7bmFtZToid2ViIix0aXRsZToiXHU1NkZFXHU2NTg3In0sMTp7bmFtZToidGV4dCIsdGl0bGU6Ilx1N0VBRlx1NjU4N1x1NUI1NyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToiXHU3RUFGXHU1NkZFXHU3MjQ3In0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiJcdTk3RjNcdTRFNTAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6Ilx1ODlDNlx1OTg5MSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToiXHU1QzBGXHU3QTBCXHU1RThGIn19LGNQPWU9PntlLnR5cGU9ZS50eXBlfHwwO2xldHtwcm92aWRlcjp0LHR5cGU6bix0aXRsZTpyLHN1bW1hcnk6cyxocmVmOnUsaW1hZ2VVcmw6cCxtZWRpYVVybDpTLHNjZW5lOlUsbWluaVByb2dyYW06UCxvcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdDpGLGNvcnBpZDpiZSxjdXN0b21lclVybDpFZX09ZTtxLmlzU3RyaW5nKHApJiZwJiYocD1xZShwKSk7bGV0IFBlPWxQW25dO2lmKFBlKXtsZXQgY3Q9e3Byb3ZpZGVyOnQsdHlwZTpQZS5uYW1lLHRpdGxlOnIsY29udGVudDpzLGhyZWY6dSxwaWN0dXJlczpbcF0sdGh1bWJzOnA/W3BdOnZvaWQgMCxtZWRpYTpTLG1pbmlQcm9ncmFtOlAsZXh0cmE6e3NjZW5lOlV9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OkYsY29ycGlkOmJlLHVybDpFZX07cmV0dXJuIHQ9PT0id2VpeGluIiYmKG49PT0xfHxuPT09MikmJmRlbGV0ZSBjdC50aHVtYnMsY3R9cmV0dXJuIlx1NTIwNlx1NEVBQlx1NTNDMlx1NjU3MCB0eXBlIFx1NEUwRFx1NkI2M1x1Nzg2RSJ9LF9wPWZ1bmN0aW9uKGUsdCxuLHIscz0ic2hhcmUiKXtsZXQgdT1BcihyKSxwPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2VbcF0odCwoKT0+e24oKX0sdSl9Y2F0Y2goUyl7dSh7bWVzc2FnZTpgJHt0LnByb3ZpZGVyfSAke3B9IFx1NjVCOVx1NkNENVx1OEMwM1x1NzUyOFx1NTkzMVx1OEQyNWB9KX19LHVQPVRlKG5BLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPWNQKGUpLHM9QXIobik7aWYocS5pc1N0cmluZyhyKSlyZXR1cm4gbihyKTtvLnNoYXJlLmdldFNlcnZpY2VzKHU9PntsZXQgcD11LmZpbmQoKHtpZDpTfSk9PlM9PT1yLnByb3ZpZGVyKTtwP3AuYXV0aGVudGljYXRlZD9fcChwLHIsdCxuKTpwLmF1dGhvcml6ZSgoKT0+X3AocCxyLHQsbikscyk6bigic2VydmljZSBub3QgZm91bmQiKX0scyl9LGlBLHJBKSxmUD1UZShvQSwoe3R5cGU6ZSxpbWFnZVVybDp0LHN1bW1hcnk6bixocmVmOnJ9LHtyZXNvbHZlOnMscmVqZWN0OnV9KT0+e2xldCBwPUFyKHUpO3EuaXNTdHJpbmcodCkmJnQmJih0PXFlKHQpKSxvLnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOmUscGljdHVyZXM6dD9bdF06dm9pZCAwLGNvbnRlbnQ6bixocmVmOnJ9LCgpPT5zKCkscCl9LHNBLGFBKSxkUD1UZShsQSwoZSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXQgcj1lLnByb3ZpZGVyLHM9QXIobik7by5wYXltZW50LmdldENoYW5uZWxzKHU9PntsZXQgcD11LmZpbmQoKHtpZDpTfSk9PlM9PT1yKTtwP28ucGF5bWVudC5yZXF1ZXN0KHAsZS5vcmRlckluZm8sUz0+e3QoUyl9LHMpOm4oInNlcnZpY2Ugbm90IGZvdW5kIil9LHMpfSxjQSksYnA9RGcsaFA9VGUoIm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSIsKGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57YnAoIm5hdmlnYXRlVG9VbmlNUCIsZSxyPT57aWYoci5lcnJNc2cmJnIuZXJyTXNnLmluZGV4T2YoIjpvayIpPT09LTEpcmV0dXJuIG4oci5lcnJNc2cuc3BsaXQoIiAiKVsxXSk7dCgpfSl9KSx5cD1bXTtmdW5jdGlvbiBFcChlKXt5cC5wdXNoKGUpfWxldCBnUD1FcDtmdW5jdGlvbiBwUChlLHQpe3lwLmZvckVhY2gobj0+bihlLHQpKX1mdW5jdGlvbiB2UChlLHQsLi4ubil7bGV0IHI9YlAoZSx0LG4pO3ImJmNvbnNvbGVbZV0ocil9ZnVuY3Rpb24gbVAoKXtyZXR1cm4gdHlwZW9mIF9fY2hhbm5lbElkX189PSJzdHJpbmciJiZfX2NoYW5uZWxJZF9ffWZ1bmN0aW9uIF9QKGUsdCl7c3dpdGNoKHEudG9SYXdUeXBlKHQpKXtjYXNlIkZ1bmN0aW9uIjpyZXR1cm4iZnVuY3Rpb24oKSB7IFtuYXRpdmUgY29kZV0gfSI7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gYlAoZSx0LG4pe3JldHVybiBtUCgpPyhuLnB1c2godC5yZXBsYWNlKCJhdCAiLCJ1bmktYXBwOi8vLyIpKSxjb25zb2xlW2VdLmFwcGx5KGNvbnNvbGUsbikpOm4ubWFwKGZ1bmN0aW9uKHMpe2xldCB1PXEudG9UeXBlU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCk7aWYoWyJbb2JqZWN0IG9iamVjdF0iLCJbb2JqZWN0IGFycmF5XSIsIltvYmplY3QgbW9kdWxlXSJdLmluZGV4T2YodSkhPT0tMSl0cnl7cz0iLS0tQkVHSU46SlNPTi0tLSIrSlNPTi5zdHJpbmdpZnkocyxfUCkrIi0tLUVORDpKU09OLS0tIn1jYXRjaChwKXtzPXV9ZWxzZSBpZihzPT09bnVsbClzPSItLS1OVUxMLS0tIjtlbHNlIGlmKHM9PT12b2lkIDApcz0iLS0tVU5ERUZJTkVELS0tIjtlbHNle2xldCBwPXEudG9SYXdUeXBlKHMpLnRvVXBwZXJDYXNlKCk7cD09PSJOVU1CRVIifHxwPT09IkJPT0xFQU4iP3M9Ii0tLUJFR0lOOiIrcCsiLS0tIitzKyItLS1FTkQ6IitwKyItLS0iOnM9U3RyaW5nKHMpfXJldHVybiBzfSkuam9pbigiLS0tQ09NTUEtLS0iKSsiICIrdH1sZXQgU3A9MSxHZix5UD17fTtmdW5jdGlvbiBFUChlKXtyZXR1cm4gdHlwZW9mIGUuZ2V0Tm9kZUlkPT0iZnVuY3Rpb24iJiZlLnBhZ2VJZH1mdW5jdGlvbiBTUChlKXtyZXR1cm4gZSYmZS4kJiZlLiQucHJveHk9PT1lfWZ1bmN0aW9uIHdQKGUpe2lmKEVQKGUpKXJldHVybiBlO2lmKFNQKGUpKXJldHVybiBlLiRlbH1mdW5jdGlvbiB3cChlKXtsZXQgdD1lJiZlLl9fdl9yYXc7cmV0dXJuIHQ/d3AodCk6ZX1mdW5jdGlvbiBBcChlLHQsbil7aWYoZT13cChlKSx0eXBlb2YgZT09ImZ1bmN0aW9uIil7bGV0IHI7aWYobil7bGV0IHM9T2JqZWN0LmtleXModCkuZmluZCh1PT50W3VdPT09ZSk7cj1zP3BhcnNlSW50KHMpOlNwKyssdFtyXT1lfWVsc2Ugcj1TcCsrLHRbcl09ZTtyZXR1cm4gcn1lbHNlIGlmKHEuaXNQbGFpbk9iamVjdChlKSl7bGV0IHI9d1AoZSk7aWYocil7bGV0IHM9IiIsdT0iIjtyZXR1cm4gciYmci5nZXROb2RlSWQmJih1PXIucGFnZUlkLHM9ci5nZXROb2RlSWQoKSkse3BhZ2VJZDp1LG5vZGVJZDpzfX1lbHNle2xldCBzPXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKHU9PntzW3VdPUFwKGVbdV0sdCxuKX0pLHN9fXJldHVybiBlfWZ1bmN0aW9uIEFQKGUsdCxuLHIpe3JldHVybiBKYygibWV0aG9kIixlLHQsbixyKX1mdW5jdGlvbiBZZigpe3JldHVybiBHZnx8KEdmPVIucmVxdWlyZU5hdGl2ZVBsdWdpbigiVVRTLVByb3h5IikpLEdmfWZ1bmN0aW9uIENwKGUsdCxuLHIscyl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJcdThGRDRcdTU2REVcdTUwM0NcdTRFM0FcdUZGMUEiK0pTT04uc3RyaW5naWZ5KHQpKyJcdUZGMUJcdThCRjdcdTZDNDJcdTUzQzJcdTY1NzBcdTRFM0FcdUZGMUEiK0pTT04uc3RyaW5naWZ5KGUpKTtpZihxLmlzU3RyaW5nKHQpKXRyeXt0PUpTT04ucGFyc2UodCl9Y2F0Y2godSl7dGhyb3cgbmV3IEVycm9yKGBKU09OLnBhcnNlKCR7dH0pOiBgK3UpfWlmKHQuZXJyTXNnKXRocm93IG5ldyBFcnJvcih0LmVyck1zZyk7aWYobiYmbi50eXBlPT09ImludGVyZmFjZSImJnR5cGVvZiB0LnBhcmFtcz09Im51bWJlciIpe2lmKCF0LnBhcmFtcylyZXR1cm4gbnVsbDtpZih0LnBhcmFtcz09PXImJnMpcmV0dXJuIHM7aWYocWZbbi5vcHRpb25zXSl7bGV0IHU9TnAocS5leHRlbmQoe2luc3RhbmNlSWQ6dC5wYXJhbXN9LHFmW24ub3B0aW9uc10pKTtyZXR1cm4gbmV3IHV9fXJldHVybiB0LnBhcmFtc31mdW5jdGlvbiBUcChlKXtpZihlLmVyck1zZyl0aHJvdyBuZXcgRXJyb3IoZS5lcnJNc2cpO3JldHVybiBkZWxldGUgZS5lcnJNc2csQ3AoZSxZZigpLmludm9rZVN5bmMoZSwoKT0+e30pKX1mdW5jdGlvbiBKYyhlLHQse21vZHVsZU5hbWU6bixtb2R1bGVUeXBlOnIscGFja2FnZTpzLGNsYXNzOnUsbmFtZTpwLG1ldGhvZDpTLGNvbXBhbmlvbjpVLGtlZXBBbGl2ZTpQLHBhcmFtczpGLHJldHVybjpiZSxlcnJNc2c6RWV9LFBlLGN0KXtQfHwoUD1wLmluZGV4T2YoIm9uIik9PT0wJiZGLmxlbmd0aD09PTEmJkZbMF0udHlwZT09PSJVVFNDYWxsYmFjayIpO2xldCBwdD1QZT97bW9kdWxlTmFtZTpuLG1vZHVsZVR5cGU6cixpZDpQZSx0eXBlOmUsbmFtZTpwLG1ldGhvZDpGLGtlZXBBbGl2ZTpQfTp7bW9kdWxlTmFtZTpuLG1vZHVsZVR5cGU6cixwYWNrYWdlOnMsY2xhc3M6dSxuYW1lOlN8fHAsdHlwZTplLGNvbXBhbmlvbjpVLG1ldGhvZDpGLGtlZXBBbGl2ZTpQfTtyZXR1cm4oLi4uWnQpPT57aWYoRWUpdGhyb3cgbmV3IEVycm9yKEVlKTtsZXQgTHQ9UD95UDp7fSx5bj0oe2lkOk50LG5hbWU6c3QscGFyYW1zOmp0fSk9PntsZXQgV3Q9THRbTnRdO1d0PyhXdCguLi5qdCksUHx8ZGVsZXRlIEx0W050XSk6Y29uc29sZS5lcnJvcihgdXRzXHU2M0QyXHU0RUY2WyR7bn1dICR7c30ke3V9LiR7cC5yZXBsYWNlKCJCeUpzIiwiIil9ICR7c3R9XHU1NkRFXHU4QzAzXHU1MUZEXHU2NTcwXHU1REYyXHU5MUNBXHU2NTNFXHVGRjBDXHU0RTBEXHU4MEZEXHU1MThEXHU2QjIxXHU2MjY3XHU4ODRDXHVGRjBDXHU1M0MyXHU4MDAzXHU2NTg3XHU2ODYzXHVGRjFBaHR0cHM6Ly9kb2MuZGNsb3VkLm5ldC5jbi91bmktYXBwLXgvcGx1Z2luL3V0cy1wbHVnaW4uaHRtbCNrZWVwYWxpdmVgKX0sdm49cS5leHRlbmQoe30scHQse3BhcmFtczpadC5tYXAoTnQ9PkFwKE50LEx0LFApKX0pO3JldHVybiB0P25ldyBQcm9taXNlKChOdCxzdCk9PntZZigpLmludm9rZUFzeW5jKHZuLGp0PT57anQudHlwZSE9PSJyZXR1cm4iP3luKGp0KTpqdC5lcnJNc2c/c3QoanQuZXJyTXNnKTpOdChqdC5wYXJhbXMpfSl9KTpDcCh2bixZZigpLmludm9rZVN5bmModm4seW4pLGJlLFBlLGN0KX19ZnVuY3Rpb24gT3AoZSx0KXtyZXR1cm4gdC5tYWluJiYhdC5tZXRob2QmJmtwKCkmJih0Lm1ldGhvZD0ic18iK3QubmFtZSksSmMoIm1ldGhvZCIsZSx0LDApfWxldCBDUD1PcDtmdW5jdGlvbiBQcChlLHQpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyImJnEuaGFzT3duKHQsZSsiQnlKcyIpP2UrIkJ5SnMiOmV9ZnVuY3Rpb24gVFAoZSl7cmV0dXJuIHR5cGVvZiBlPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBPUChlKXtyZXR1cm4hVFAoZS5pbnN0YW5jZUlkKX1mdW5jdGlvbiBQdShlKXtyZXR1cm4iX18kc2V0IitxLmNhcGl0YWxpemUoZSl9ZnVuY3Rpb24gTnAoZSl7bGV0e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOnMsbWV0aG9kczp1LHByb3BzOnAsc2V0dGVyczpTLGVyck1zZzpVfT1lLFA9e21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4scGFja2FnZTpyLGNsYXNzOnMsZXJyTXNnOlV9LEYsYmU9W10sRWU9e30sUGU9W10sY3Q9e30scHQ9ITE7T1AoZSk/KHB0PSEwLEY9ZS5pbnN0YW5jZUlkKTooYmU9ZS5jb25zdHJ1Y3Rvci5wYXJhbXMsRWU9ZS5zdGF0aWNNZXRob2RzLFBlPWUuc3RhdGljUHJvcHMsY3Q9ZS5zdGF0aWNTZXR0ZXJzKSxrcCgpJiZiZS5maW5kKHZuPT52bi50eXBlPT09IlVUU0NhbGxiYWNrInx8dm4udHlwZS5pbmRleE9mKCJKU09OT2JqZWN0Iik+MCkmJmJlLnB1c2goe25hbWU6Il9ieUpzIix0eXBlOiJib29sZWFuIn0pO2xldCBadD1jbGFzc3tjb25zdHJ1Y3RvciguLi5OdCl7aWYodGhpcy5fX2luc3RhbmNlSWQ9MCxVKXRocm93IG5ldyBFcnJvcihVKTtsZXQgc3Q9e307aWYocHQ/dHlwZW9mIEY9PSJudW1iZXIiJiYodGhpcy5fX2luc3RhbmNlSWQ9Rik6dGhpcy5fX2luc3RhbmNlSWQ9SmMoImNvbnN0cnVjdG9yIiwhMSxxLmV4dGVuZCh7bmFtZToiY29uc3RydWN0b3IiLGtlZXBBbGl2ZTohMSxwYXJhbXM6YmV9LFApLDApLmFwcGx5KG51bGwsTnQpLCF0aGlzLl9faW5zdGFuY2VJZCl0aHJvdyBuZXcgRXJyb3IoYG5ldyAke3N9IGlzIGZhaWxlZGApO2xldCBqdD10aGlzLFd0PW5ldyBQcm94eShqdCx7Z2V0KG5uLCR0KXtpZigkdD09PSJfX3Zfc2tpcCIpcmV0dXJuITA7aWYoIXN0WyR0XSl7aWYoJHQ9UHAoJHQsdSkscS5oYXNPd24odSwkdCkpe2xldHthc3luYzpLbixrZWVwQWxpdmU6WHQscGFyYW1zOl9vLHJldHVybjpiY309dVskdF07c3RbJHRdPUFQKCEhS24scS5leHRlbmQoe25hbWU6JHQsa2VlcEFsaXZlOlh0LHBhcmFtczpfbyxyZXR1cm46YmN9LFApLGp0Ll9faW5zdGFuY2VJZCxXdCl9ZWxzZSBpZihwLmluY2x1ZGVzKCR0KSlyZXR1cm4gVHAoe21vZHVsZU5hbWU6dCxtb2R1bGVUeXBlOm4saWQ6anQuX19pbnN0YW5jZUlkLHR5cGU6ImdldHRlciIsa2VlcEFsaXZlOiExLG5hbWU6JHQsZXJyTXNnOlV9KX1yZXR1cm4gc3RbJHRdfSxzZXQobm4sJHQsS24pe2lmKHAuaW5jbHVkZXMoJHQpKXtsZXQgWHQ9UHUoJHQpO2lmKCFzdFtYdF0pe2xldCBfbz1TWyR0XTtfbyYmKHN0W1h0XT1KYygic2V0dGVyIiwhMSxxLmV4dGVuZCh7bmFtZTokdCxrZWVwQWxpdmU6ITEscGFyYW1zOltfb119LFApLGp0Ll9faW5zdGFuY2VJZCxXdCkpfXJldHVybiBzdFtQdSgkdCldKEtuKSwhMH1yZXR1cm4hMX19KTtyZXR1cm4gV3R9fSxMdD17fSx5bj17fTtyZXR1cm4gbmV3IFByb3h5KFp0LHtnZXQodm4sTnQsc3Qpe2lmKE50PVBwKE50LEVlKSxxLmhhc093bihFZSxOdCkpe2lmKCF5bltOdF0pe2xldHthc3luYzpqdCxrZWVwQWxpdmU6V3QscGFyYW1zOm5uLHJldHVybjokdH09RWVbTnRdO3luW050XT1PcCghIWp0LHEuZXh0ZW5kKHtuYW1lOk50LGNvbXBhbmlvbjohMCxrZWVwQWxpdmU6V3QscGFyYW1zOm5uLHJldHVybjokdH0sUCkpfXJldHVybiB5bltOdF19cmV0dXJuIFBlLmluY2x1ZGVzKE50KT9UcChxLmV4dGVuZCh7bmFtZTpOdCxjb21wYW5pb246ITAsdHlwZToiZ2V0dGVyIn0sUCkpOlJlZmxlY3QuZ2V0KHZuLE50LHN0KX0sc2V0KHZuLE50LHN0KXtpZihQZS5pbmNsdWRlcyhOdCkpe2xldCBqdD1QdShOdCk7aWYoIUx0W2p0XSl7bGV0IFd0PWN0W050XTtXdCYmKEx0W2p0XT1KYygic2V0dGVyIiwhMSxxLmV4dGVuZCh7bmFtZTpOdCxrZWVwQWxpdmU6ITEscGFyYW1zOltXdF19LFApLDApKX1yZXR1cm4gTHRbUHUoTnQpXShzdCksITB9cmV0dXJuITF9fSl9ZnVuY3Rpb24gTnUoKXtyZXR1cm4gdHlwZW9mIG8hPSJ1bmRlZmluZWQiJiZvLm9zLm5hbWU9PT0iQW5kcm9pZCJ9ZnVuY3Rpb24ga3AoKXtyZXR1cm4hTnUoKX1mdW5jdGlvbiBQUChlLHQpe3JldHVybiBOdSgpPyJ1dHMuc2RrLiIrKHQ/Im1vZHVsZXMuIjoiIikrZToiIn1mdW5jdGlvbiBOUChlLHQpe3JldHVybiBJcChlLE51KCk/IkluZGV4S3QiOiJJbmRleFN3aWZ0Iix0KX1mdW5jdGlvbiBJcChlLHQsbil7cmV0dXJuIE51KCk/dDoiVVRTU0RLIisobj8iTW9kdWxlcyI6IiIpK3EuY2FwaXRhbGl6ZShlKStxLmNhcGl0YWxpemUodCl9bGV0IHFmPXt9O2Z1bmN0aW9uIGtQKGUsdCl7cWZbZV09dH1sZXQgUnA9e307ZnVuY3Rpb24gSVAoZSx0KXtScFtlXT10fWZ1bmN0aW9uIFJQKGUpe2xldCB0PVJwW2VdO3JldHVybiB0fHxjb25zb2xlLmVycm9yKGAke2V9IGlzIG5vdCBmb3VuZGApLHR9bGV0IEpvPXtsb2FkOiJsb2FkIixjbG9zZToiY2xvc2UiLGVycm9yOiJlcnJvciIsYWRDbGlja2VkOiJhZENsaWNrZWQifTtjbGFzcyB4cHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2NhbGxiYWNrcz17fX1vbkxvYWQodCl7dGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihKby5sb2FkLHQpfW9uQ2xvc2UodCl7dGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihKby5jbG9zZSx0KX1vbkVycm9yKHQpe3RoaXMuX2FkZEV2ZW50TGlzdGVuZXIoSm8uZXJyb3IsdCl9b2ZmTG9hZCh0KXt0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyKEpvLmxvYWQsdCl9b2ZmQ2xvc2UodCl7dGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcihKby5jbG9zZSx0KX1vZmZFcnJvcih0KXt0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyKEpvLmVycm9yLHQpfV9hZGRFdmVudExpc3RlbmVyKHQsbil7IXEuaXNGdW5jdGlvbihuKXx8KHRoaXMuX2NhbGxiYWNrc1t0XXx8KHRoaXMuX2NhbGxiYWNrc1t0XT1bXSksdGhpcy5fY2FsbGJhY2tzW3RdLnB1c2gobikpfV9yZW1vdmVFdmVudExpc3RlbmVyKHQsbil7bGV0IHI9dGhpcy5fY2FsbGJhY2tzW3RdLHM9ci5pbmRleE9mKG4pO3M+LTEmJnIuc3BsaWNlKHMsMSl9X2Rpc3BhdGNoRXZlbnQodCxuKXt0aGlzLl9jYWxsYmFja3NbdF0uZm9yRWFjaChyPT57cihufHx7fSl9KX19Y2xhc3MgSmYgZXh0ZW5kcyB4cHtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKCk7dGhpcy5wcmVsb2FkPSEwLHRoaXMuX2lzTG9hZGVkPSExLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5wcmVsb2FkPW4ucHJlbG9hZCE9PXZvaWQgMD9uLnByZWxvYWQ6ITE7bGV0IHI9dGhpcy5fYWRJbnN0YW5jZT10O3Iub25Mb2FkKCgpPT57dGhpcy5faXNMb2FkZWQ9ITAsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUhPW51bGwmJih0aGlzLl9zaG93UHJvbWlzZVJlc29sdmUoKSx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93QWQoKSksdGhpcy5fZGlzcGF0Y2hFdmVudChKby5sb2FkLHt9KX0pLHIub25DbG9zZShzPT57dGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2Rpc3BhdGNoRXZlbnQoSm8uY2xvc2UscyksdGhpcy5wcmVsb2FkPT09ITAmJnRoaXMuX2xvYWRBZCgpfSksci5vbkVycm9yKHM9Pnt0aGlzLl9pc0xvYWRpbmc9ITE7bGV0IHU9e2NvZGU6cy5jb2RlLGVyck1zZzpzLm1lc3NhZ2V9O3RoaXMuX2Rpc3BhdGNoRXZlbnQoSm8uZXJyb3IsdSk7bGV0IHA9bmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHUpKTt0aGlzLl9sb2FkUHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0KHApLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwpLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZWplY3QocCksdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCl9KSxyLm9uQWRDbGlja2VkJiZyLm9uQWRDbGlja2VkKCgpPT57dGhpcy5fZGlzcGF0Y2hFdmVudChKby5hZENsaWNrZWQse30pfSl9Z2V0UHJvdmlkZXIoKXtyZXR1cm4gdGhpcy5fYWRJbnN0YW5jZS5nZXRQcm92aWRlcigpfWxvYWQoKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9Pnt0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9dCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcmJih0aGlzLl9pc0xvYWRlZD90KCIiKTp0aGlzLl9sb2FkQWQoKSl9KX1zaG93KCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57dGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPXQsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9biwhdGhpcy5faXNMb2FkaW5nJiYodGhpcy5faXNMb2FkZWQ/KHRoaXMuX3Nob3dBZCgpLHQoIiIpKTp0aGlzLl9sb2FkQWQoKSl9KX1kZXN0cm95KCl7dGhpcy5fYWRJbnN0YW5jZS5kZXN0cm95KCl9X2xvYWRBZCgpe3RoaXMuX2lzTG9hZGVkPSExLHRoaXMuX2lzTG9hZGluZz0hMCx0aGlzLl9hZEluc3RhbmNlLmxvYWQoKX1fc2hvd0FkKCl7dGhpcy5fYWRJbnN0YW5jZS5zaG93KCl9fWNsYXNzIHhQIGV4dGVuZHMgSmZ7Y29uc3RydWN0b3IodCl7c3VwZXIoby5hZC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQodCksdCk7dGhpcy5fbG9hZEFkKCl9fWxldCBCUD1CdChoQSxlPT5uZXcgeFAoZSkscEEsZ0EpO2NsYXNzIE1QIGV4dGVuZHMgSmZ7Y29uc3RydWN0b3IodCl7c3VwZXIoby5hZC5jcmVhdGVGdWxsU2NyZWVuVmlkZW9BZCh0KSx0KTt0aGlzLnByZWxvYWQ9ITF9fWxldCBMUD1CdCh2QSxlPT5uZXcgTVAoZSksX0EsbUEpO2NsYXNzIEZQIGV4dGVuZHMgSmZ7Y29uc3RydWN0b3IodCl7c3VwZXIoby5hZC5jcmVhdGVJbnRlcnN0aXRpYWxBZCh0KSx0KTt0aGlzLnByZWxvYWQ9ITEsdGhpcy5fbG9hZEFkKCl9fWxldCBEUD1CdChiQSxlPT5uZXcgRlAoZSksRUEseUEpLHFhPXt9LFBsPXt9O2Z1bmN0aW9uIFZQKGUpe2xldCB0PWUucHJvdmlkZXI7aWYocWFbdF18fChxYVt0XT17fSksdHlwZW9mIHFhW3RdLnBsdWdpbj09Im9iamVjdCIpe2Uuc3VjY2VzcyhxYVt0XS5wbHVnaW4pO3JldHVybn1pZihQbFt0XXx8KFBsW3RdPVtdKSxQbFt0XS5wdXNoKGUpLHFhW3RdLnN0YXR1cz09PSEwKXtlLl9fcGx1Z2luPXFhW3RdLnBsdWdpbjtyZXR1cm59cWFbdF0uc3RhdHVzPSEwO2xldCBuPWhhKHQpO2lmKCFufHwhbi5pbml0U0RLKXtQbFt0XS5mb3JFYWNoKHI9PntyLmZhaWwoe2NvZGU6LTEsbWVzc2FnZToicHJvdmlkZXIgWyIrdCsiXSBpbnZhbGlkIn0pfSksUGxbdF0ubGVuZ3RoPTAscWFbdF0uc3RhdHVzPSExO3JldHVybn1xYVt0XS5wbHVnaW49bixlLl9fcGx1Z2luPW4sbi5pbml0U0RLKHI9PntsZXQgcz1yLmNvZGU9PT0xfHxyLmNvZGU9PT0iMSI7cz9xYVt0XS5wbHVnaW49bjpxYVt0XS5zdGF0dXM9ITEsUGxbdF0uZm9yRWFjaCh1PT57cz91LnN1Y2Nlc3ModS5fX3BsdWdpbik6dS5mYWlsKHIpfSksUGxbdF0ubGVuZ3RoPTB9KX1jbGFzcyBVUCBleHRlbmRzIHhwe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCk7dGhpcy5fYWRwaWQ9IiIsdGhpcy5fcHJvdmlkZXI9IiIsdGhpcy5fdXNlckRhdGE9bnVsbCx0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX2FkSW5zdGFuY2U9bnVsbCx0aGlzLl9hZEVycm9yPSIiLHRoaXMuX2FkcGlkPXQuYWRwaWQsdGhpcy5fcHJvdmlkZXI9dC5wcm92aWRlcix0aGlzLl91c2VyRGF0YT10LnVzZXJEYXRhLEMoKCk9Pnt0aGlzLl9pbml0KCl9KX1faW5pdCgpe3RoaXMuX2FkRXJyb3I9IiIsVlAoe3Byb3ZpZGVyOnRoaXMuX3Byb3ZpZGVyLHN1Y2Nlc3M6dD0+e3RoaXMuX2FkSW5zdGFuY2U9dCx0aGlzLl91c2VyRGF0YSYmdGhpcy5iaW5kVXNlckRhdGEodGhpcy5fdXNlckRhdGEpLHRoaXMuX2xvYWRBZCgpfSxmYWlsOnQ9Pnt0aGlzLl9hZEVycm9yPXQsdGhpcy5fbG9hZFByb21pc2VSZWplY3QhPW51bGwmJih0aGlzLl9sb2FkUHJvbWlzZVJlamVjdCh0aGlzLl9jcmVhdGVFcnJvcih0KSksdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksdGhpcy5fZGlzcGF0Y2hFdmVudChKby5lcnJvcix0KX19KX1nZXRQcm92aWRlcigpe3JldHVybiB0aGlzLl9wcm92aWRlcn1sb2FkKCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57aWYodGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPXQsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9biwhdGhpcy5faXNMb2FkaW5nKXtpZih0aGlzLl9hZEVycm9yKXt0aGlzLl9pbml0KCk7cmV0dXJufXRoaXMuX2lzTG9hZGVkP3QoIiIpOnRoaXMuX2xvYWRBZCgpfX0pfXNob3coKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZih0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9dCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1uLCF0aGlzLl9pc0xvYWRpbmcpe2lmKHRoaXMuX2FkRXJyb3Ipe3RoaXMuX2luaXQoKTtyZXR1cm59dGhpcy5faXNMb2FkZWQ/KHRoaXMuX3Nob3dBZCgpLHQoIiIpKTp0aGlzLl9sb2FkQWQoKX19KX1yZXBvcnRFeHBvc3VyZSgpe3RoaXMuX2FkSW5zdGFuY2UhPT1udWxsJiZ0aGlzLl9hZEluc3RhbmNlLnJlcG9ydEV4cG9zdXJlKCl9YmluZFVzZXJEYXRhKHQpe3RoaXMuX2FkSW5zdGFuY2UhPT1udWxsJiZ0aGlzLl9hZEluc3RhbmNlLmJpbmRVc2VyRGF0YSh0KX1kZXN0cm95KCl7dGhpcy5fYWRJbnN0YW5jZSE9PW51bGwmJnRoaXMuX2FkSW5zdGFuY2UuZGVzdHJveSYmdGhpcy5fYWRJbnN0YW5jZS5kZXN0cm95KHthZHBpZDp0aGlzLl9hZHBpZH0pfV9sb2FkQWQoKXtpZih0aGlzLl9hZEluc3RhbmNlIT09bnVsbCl7aWYodGhpcy5faXNMb2FkaW5nPT09ITApcmV0dXJuO3RoaXMuX2lzTG9hZGluZz0hMCx0aGlzLl9hZEluc3RhbmNlLmxvYWREYXRhKHthZHBpZDp0aGlzLl9hZHBpZH0sdD0+e3RoaXMuX2lzTG9hZGVkPSEwLHRoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmUhPW51bGwmJih0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmUoKSx0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCksdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlIT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlKCksdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd0FkKCkpLHRoaXMuX2Rpc3BhdGNoRXZlbnQoSm8ubG9hZCx0KX0sdD0+e3RoaXMuX2lzTG9hZGluZz0hMSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdCE9bnVsbCYmKHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0KHRoaXMuX2NyZWF0ZUVycm9yKHQpKSx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKSx0aGlzLl9kaXNwYXRjaEV2ZW50KEpvLmVycm9yLHQpfSl9fV9zaG93QWQoKXt0aGlzLl9hZEluc3RhbmNlIT09bnVsbCYmdGhpcy5faXNMb2FkZWQ9PT0hMCYmdGhpcy5fYWRJbnN0YW5jZS5zaG93KHthZHBpZDp0aGlzLl9hZHBpZH0sKCk9Pnt0aGlzLl9pc0xvYWRlZD0hMX0sdD0+e3RoaXMuX2lzTG9hZGVkPSExLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0IT1udWxsJiYodGhpcy5fc2hvd1Byb21pc2VSZWplY3QodGhpcy5fY3JlYXRlRXJyb3IodCkpLHRoaXMuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHRoaXMuX2Rpc3BhdGNoRXZlbnQoSm8uZXJyb3IsdCl9KX1fY3JlYXRlRXJyb3IodCl7cmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh0KSl9fWxldCAkUD1CdChTQSxlPT5uZXcgVVAoZSksQUEsd0EpLEJwPW8ub3MubmFtZT09PSJBbmRyb2lkIiYmcGFyc2VJbnQoby5vcy52ZXJzaW9uKTw2LEhQPUJwPyJzbGlkZS1pbi1yaWdodCI6InBvcC1pbiIsa3U9MzAwLE1wPUJwPyJzbGlkZS1vdXQtcmlnaHQiOiJwb3Atb3V0IixqUD0iX3d3dy9fX3VuaWFwcHZpZXcuaHRtbCIselA9IndlYnZpZXdJZCIsV1A9InVuaU1QTmF0aXZlRXZlbnQiO2Z1bmN0aW9uIEdQKGUsdCxuKXtuJiZ0LmlzTlZ1ZSYmKGUudW5pTlZpZXc9e3BhdGg6bixkZWZhdWx0Rm9udFNpemU6SS5kZWZhdWx0Rm9udFNpemUsdmlld3BvcnQ6SS52aWV3cG9ydH0pfWxldCBZUD0vXiNbYS16MC05XXs2fSQvaTtmdW5jdGlvbiBxUChlKXtyZXR1cm4gZSYmKFlQLnRlc3QoZSl8fGU9PT0idHJhbnNwYXJlbnQiKX1mdW5jdGlvbiBKUChlLHQpe2xldHtiYWNrZ3JvdW5kQ29sb3I6bn09dDshbnx8IXFQKG4pfHwoZS5iYWNrZ3JvdW5kP249ZS5iYWNrZ3JvdW5kOmUuYmFja2dyb3VuZD1uLGUuYmFja2dyb3VuZENvbG9yVG9wfHwoZS5iYWNrZ3JvdW5kQ29sb3JUb3A9biksZS5iYWNrZ3JvdW5kQ29sb3JCb3R0b218fChlLmJhY2tncm91bmRDb2xvckJvdHRvbT1uKSxlLmFuaW1hdGlvbkFscGhhQkdDb2xvcnx8KGUuYW5pbWF0aW9uQWxwaGFCR0NvbG9yPW4pLHR5cGVvZiBlLndlYnZpZXdCR1RyYW5zcGFyZW50PT0idW5kZWZpbmVkIiYmKGUud2Vidmlld0JHVHJhbnNwYXJlbnQ9ITApKX1mdW5jdGlvbiBLUChlLHQpe2UucG9wR2VzdHVyZT09PSJoaWRlIiYmZGVsZXRlIGUucG9wR2VzdHVyZSx0LmlzUXVpdCYmKGUucG9wR2VzdHVyZT1vLm9zLm5hbWU9PT0iaU9TIj8iYXBwYmFjayI6Im5vbmUiKX1mdW5jdGlvbiBaUChlLHQpe2lmKCF0LmVuYWJsZVB1bGxEb3duUmVmcmVzaClyZXR1cm47bGV0IG49UnMocS5leHRlbmQoe30sby5vcy5uYW1lPT09IkFuZHJvaWQiP1FQOmVOLHQucHVsbFRvUmVmcmVzaCkpO2UucHVsbFRvUmVmcmVzaD1YUChuLHQpfWZ1bmN0aW9uIFhQKGUsdCl7bGV0IG49d3IoZSk7aWYoIW4pcmV0dXJuIGU7bGV0W3Iscyx1XT1uO3JldHVybihyfHxzfHx1KSYmUi5vbkxvY2FsZUNoYW5nZSgoKT0+e2xldCBwPW8ud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0LmlkKyIiKTtpZighcClyZXR1cm47bGV0IFM9e3N1cHBvcnQ6ITB9O3ImJihTLmNvbnRlbnRkb3duPXtjYXB0aW9uOmUuY29udGVudGRvd24uY2FwdGlvbn0pLHMmJihTLmNvbnRlbnRvdmVyPXtjYXB0aW9uOmUuY29udGVudG92ZXIuY2FwdGlvbn0pLHUmJihTLmNvbnRlbnRyZWZyZXNoPXtjYXB0aW9uOmUuY29udGVudHJlZnJlc2guY2FwdGlvbn0pLHAuc2V0U3R5bGUoe3B1bGxUb1JlZnJlc2g6U30pfSksZX1sZXQgUVA9e3N1cHBvcnQ6ITAsc3R5bGU6ImNpcmNsZSJ9LGVOPXtzdXBwb3J0OiEwLHN0eWxlOiJkZWZhdWx0IixoZWlnaHQ6IjUwcHgiLHJhbmdlOiIyMDBweCIsY29udGVudGRvd246e2NhcHRpb246IiJ9LGNvbnRlbnRvdmVyOntjYXB0aW9uOiIifSxjb250ZW50cmVmcmVzaDp7Y2FwdGlvbjoiIn19O2Z1bmN0aW9uIHROKGUsdCl7bGV0e25hdmlnYXRpb25CYXI6bn09dDtpZihuLnN0eWxlPT09ImN1c3RvbSIpcmV0dXJuITE7bGV0IHI9ITA7dC5pc1F1aXQmJihyPSExKTtsZXQgcz17YXV0b0JhY2tCdXR0b246cn07T2JqZWN0LmtleXMobikuZm9yRWFjaCh1PT57bGV0IHA9blt1XTt1PT09InRpdGxlSW1hZ2UiJiZwP3MudGFncz1yTihwKTp1PT09ImJ1dHRvbnMiJiZxLmlzQXJyYXkocCk/cy5idXR0b25zPXAubWFwKChTLFUpPT4oUy5vbmNsaWNrPWlOKFUpLFMpKTpzW3VdPXB9KSxlLnRpdGxlTlZpZXc9bk4ocyx0KX1mdW5jdGlvbiBuTihlLHQpe2xldCBuPU5yKGUpO2lmKCFuKXJldHVybiBlO2xldFtyLHNdPW47cmV0dXJuKHJ8fHMpJiZSLm9uTG9jYWxlQ2hhbmdlKCgpPT57bGV0IHU9by53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQuaWQrIiIpO2lmKCF1KXJldHVybjtsZXQgcD17fTtyJiYocC50aXRsZVRleHQ9ZS50aXRsZVRleHQpLHMmJihwLnNlYXJjaElucHV0PXtwbGFjZWhvbGRlcjplLnNlYXJjaElucHV0LnBsYWNlaG9sZGVyfSksdS5zZXRTdHlsZSh7dGl0bGVOVmlldzpwfSl9KSxlfWZ1bmN0aW9uIHJOKGUpe3JldHVyblt7dGFnOiJpbWciLHNyYzplLHBvc2l0aW9uOntsZWZ0OiJhdXRvIix0b3A6ImF1dG8iLHdpZHRoOiJhdXRvIixoZWlnaHQ6IjI2cHgifX1dfWZ1bmN0aW9uIGlOKGUpe3JldHVybiBmdW5jdGlvbihuKXtuLmluZGV4PWUsZXIobmUuT05fTkFWSUdBVElPTl9CQVJfQlVUVE9OX1RBUCxuKX19ZnVuY3Rpb24gTHAoZSx0LG4pe2xldCByPXtib3VuY2U6InZlcnRpY2FsIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2gocz0+e29OLmluZGV4T2Yocyk9PT0tMSYmKHJbc109dFtzXSl9KSxuLmlkIT09IjEiJiZHUChyLHQsZSksS1Aocix0KSxKUChyLHQpLHROKHIsdCksWlAocix0KSxyfWxldCBvTj1bImlkIiwicm91dGUiLCJpc05WdWUiLCJpc1F1aXQiLCJpc0VudHJ5IiwiaXNUYWJCYXIiLCJ0YWJCYXJJbmRleCIsIndpbmRvd1RvcCIsInRvcFdpbmRvdyIsImxlZnRXaW5kb3ciLCJyaWdodFdpbmRvdyIsIm1heFdpZHRoIiwidXNpbmdDb21wb25lbnRzIiwiZGlzYWJsZVNjcm9sbCIsImVuYWJsZVB1bGxEb3duUmVmcmVzaCIsIm5hdmlnYXRpb25CYXIiLCJwdWxsVG9SZWZyZXNoIiwib25SZWFjaEJvdHRvbURpc3RhbmNlIiwicGFnZU9yaWVudGF0aW9uIiwiYmFja2dyb3VuZENvbG9yIl0sRnA9MjtmdW5jdGlvbiBEcCgpe3JldHVybiBGcH1mdW5jdGlvbiBWcCgpe3JldHVybiBGcCsrfWZ1bmN0aW9uIFVwKGUpe3JldHVybiBlfWZ1bmN0aW9uICRwKGUsdCl7bGV0IG49dD9uZS5zdHJpbmdpZnlRdWVyeSh0LFVwKToiIjtyZXR1cm57cGF0aDplLnNsaWNlKDEpLHF1ZXJ5Om4mJm4uc2xpY2UoMSl9fWZ1bmN0aW9uIGFOKGUsdCxuKXtsZXQgcj1uP25lLnN0cmluZ2lmeVF1ZXJ5KG4sVXApOiIiO3JldHVybntpc1RhYjplLGFyZ3VtZW50czpKU09OLnN0cmluZ2lmeSh7cGF0aDp0LnNsaWNlKDEpLHF1ZXJ5OnImJnIuc2xpY2UoMSl9KX19ZnVuY3Rpb24gc04oe3BhdGg6ZSxxdWVyeTp0LHJvdXRlT3B0aW9uczpuLHdlYnZpZXdFeHRyYXM6cn0pe2xldCBzPSgpPT5McChlLHhmKG4ubWV0YSkse2lkOnUrIiJ9KSx1PVZwKCkscD1zKCk7cC51bmlQYWdlVXJsPSRwKGUsdCkscC5pc1RhYj0hIW4ubWV0YS5pc1RhYkJhcjtsZXQgUz1vLndlYnZpZXcuY3JlYXRlKCIiLFN0cmluZyh1KSxwLHEuZXh0ZW5kKHtudnVlOiEwLF9fcGF0aF9fOmUsX19xdWVyeV9fOkpTT04uc3RyaW5naWZ5KHQpfSxyKSk7cmV0dXJuIENnKFMscyksU31sZXQgZW87ZnVuY3Rpb24gSHAoZSl7cmV0dXJuIGVvPWV9ZnVuY3Rpb24gbE4oKXtyZXR1cm4gZW99ZnVuY3Rpb24gY04oKXtyZXR1cm4oIWVvfHxlby5fX3VuaWFwcF9yb3V0ZSkmJihlbz1vLndlYnZpZXcuY3JlYXRlKGpQLFN0cmluZyhWcCgpKSx7Y29udGVudEFkanVzdDohMX0pKSxlb31mdW5jdGlvbiB1TihlKXtsZXR7cG9wdXBTdWJOVnVlV2Vidmlld3M6dH09ZTshdHx8ZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKCk9PntPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG49Pnt0W25dLmNsb3NlKCJub25lIil9KX0pfWZ1bmN0aW9uIGpwKGUpe3JldHVybiBJLnJlYWxFbnRyeVBhZ2VQYXRoJiZlLiRwYWdlLnJvdXRlPT09SS5lbnRyeVBhZ2VQYXRofWZ1bmN0aW9uIHpwKCl7SS5lbnRyeVBhZ2VQYXRoPUkucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlIEkucmVhbEVudHJ5UGFnZVBhdGgsUi5yZUxhdW5jaCh7dXJsOm5lLmFkZExlYWRpbmdTbGFzaChJLmVudHJ5UGFnZVBhdGgpfSl9ZnVuY3Rpb24gZk4oZSl7bGV0IHQ7ZS5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixuPT57aWYobi50eXBlPT09InN0YXJ0Iil7bGV0IHI9VW4oKSxzPXJbci5sZW5ndGgtMl07dD0kYztsZXQgdT1zJiZzLiRwYWdlLnN0YXR1c0JhclN0eWxlO3UmJmhzKHUpfWVsc2UgaWYobi50eXBlPT09ImVuZCImJiFuLnJlc3VsdClocyh0KTtlbHNlIGlmKG4udHlwZT09PSJlbmQiJiZuLnJlc3VsdCl7bGV0IHI9VW4oKS5sZW5ndGgscz1EcigpO3RzKCksaHMoKSxzJiZyPT09MSYmanAocyk/enAoKTplcihuZS5PTl9TSE9XKX19KX1mdW5jdGlvbiBkTihlKXtpZihlLm52dWUpcmV0dXJuO2xldCB0PWUuaWQse3N1YnNjcmliZTpuLHVuc3Vic2NyaWJlOnJ9PWZ0LHM9KHUscCk9PntpZih0IT09cClyZXR1cm47cih2YyxzKTtsZXQgUz1QbyhwYXJzZUludChwKSk7UyYmUy5fX3BhZ2VfY29udGFpbmVyX18ucmVzdG9yZSgpfTtlLmFkZEV2ZW50TGlzdGVuZXIoInJlY292ZXJ5IiwoKT0+e24odmMscyl9KX1mdW5jdGlvbiBoTihlKXtsZXR7ZW1pdDp0fT1mdCxuPWZ1bmN0aW9uKHt3aWR0aDpyLGhlaWdodDpzfSl7bGV0IHA9e2RldmljZU9yaWVudGF0aW9uOk1hdGguYWJzKG8ubmF2aWdhdG9yLmdldE9yaWVudGF0aW9uKCkpPT09OTA/ImxhbmRzY2FwZSI6InBvcnRyYWl0IixzaXplOnt3aW5kb3dXaWR0aDpNYXRoLmNlaWwociksd2luZG93SGVpZ2h0Ok1hdGguY2VpbChzKX19O3QobmUuT05fUkVTSVpFLHAscGFyc2VJbnQoZS5pZCkpfTtlLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbmUuZGVib3VuY2Uobiw1MCx7c2V0VGltZW91dDpDLGNsZWFyVGltZW91dDpifSkpfWxldCBXcD17cHVsbFRvUmVmcmVzaDpuZS5PTl9QVUxMX0RPV05fUkVGUkVTSCx0aXRsZU5WaWV3U2VhcmNoSW5wdXRDaGFuZ2VkOm5lLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9DSEFOR0VELHRpdGxlTlZpZXdTZWFyY2hJbnB1dENvbmZpcm1lZDpuZS5PTl9OQVZJR0FUSU9OX0JBUl9TRUFSQ0hfSU5QVVRfQ09ORklSTUVELHRpdGxlTlZpZXdTZWFyY2hJbnB1dENsaWNrZWQ6bmUuT05fTkFWSUdBVElPTl9CQVJfU0VBUkNIX0lOUFVUX0NMSUNLRUQsdGl0bGVOVmlld1NlYXJjaElucHV0Rm9jdXNDaGFuZ2VkOm5lLk9OX05BVklHQVRJT05fQkFSX1NFQVJDSF9JTlBVVF9GT0NVU19DSEFOR0VEfTtmdW5jdGlvbiBnTihlKXtsZXQgdD1wYXJzZUludChlLmlkKTtPYmplY3Qua2V5cyhXcCkuZm9yRWFjaChuPT57bGV0IHI9V3Bbbl07ZS5hZGRFdmVudExpc3RlbmVyKG4scz0+e3I9PT1uZS5PTl9QVUxMX0RPV05fUkVGUkVTSCYmTWYoZSksZXIodCxyLHMpfSl9KSx1TihlKSxoTihlKSxvLm9zLm5hbWU9PT0iaU9TIiYmKGROKGUpLGZOKGUpKX1mdW5jdGlvbiBwTihlLHQsbixyKXtsZXQgcz0oKT0+THAodCx4ZihyKSxlKSx1PXMoKTt1LnVuaVBhZ2VVcmw9JHAodCxuKTtsZXQgcD0hIXIuaXNUYWJCYXI7ci5pc05WdWU/dS5pc1RhYj1wOnUuZGVidWdSZWZyZXNoPWFOKHAsdCxuKSx1LmxvY2FsZT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpLENnKGUscyksZS5zZXRTdHlsZSh1KX1mdW5jdGlvbiB2TihlLHQsbil7KG4uc3ViTlZ1ZXN8fFtdKS5mb3JFYWNoKHM9PntpZighcy5wYXRoKXJldHVybjtsZXQgdT1ubChzLnN0eWxlfHx7fSkscD1zLnR5cGU9PT0ibmF2aWdhdGlvbkJhciIsUz1zLnR5cGU9PT0icG9wdXAiO3UudW5pTlZpZXc9e3BhdGg6cy5wYXRoLnJlcGxhY2UoIi5udnVlIiwiLmpzIiksZGVmYXVsdEZvbnRTaXplOkkuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0Okkudmlld3BvcnR9O2xldCBVPXtfX3VuaWFwcF9ob3N0OnQsX191bmlhcHBfb3JpZ2luOnUudW5pTlZpZXcucGF0aC5zcGxpdCgiPyIpWzBdLnJlcGxhY2UoIi5qcyIsIiIpLF9fdW5pYXBwX29yaWdpbl9pZDplLmlkLF9fdW5pYXBwX29yaWdpbl90eXBlOmUuX191bmlhcHBfdHlwZX0sUDtwPyh1LnBvc2l0aW9uPSJkb2NrIix1LmRvY2s9InRvcCIsdS50b3A9IjAiLHUud2lkdGg9IjEwMCUiLHUuaGVpZ2h0PVN0cmluZyhuZS5OQVZCQVJfSEVJR0hUK0xmKCkpLGRlbGV0ZSB1LmxlZnQsZGVsZXRlIHUucmlnaHQsZGVsZXRlIHUuYm90dG9tLGRlbGV0ZSB1Lm1hcmdpbik6UyYmKHUucG9zaXRpb249ImFic29sdXRlIixVYyh0KT9QPVNpOlA9ZSxVLl9fdW5pYXBwX21hc2s9dS5tYXNrfHwicmdiYSgwLDAsMCwwLjUpIixVLl9fdW5pYXBwX21hc2tfaWQ9UC5pZCksZGVsZXRlIHUubWFzaztsZXQgRj1vLndlYnZpZXcuY3JlYXRlKCIiLHMuaWQsdSxVKTtpZihTKXtQLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzfHwoUC5wb3B1cFN1Yk5WdWVXZWJ2aWV3cz17fSksUC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tGLmlkXT1GO2xldCBiZT1mdW5jdGlvbigpe1Auc2V0U3R5bGUoe21hc2s6Im5vbmUifSksRi5oaWRlKCJhdXRvIil9O1AuYWRkRXZlbnRMaXN0ZW5lcigibWFza0NsaWNrIixiZSk7bGV0IEVlPSExO0YuYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsKCk9PntFZXx8KG8ua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLGRpKSxvLmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixiZSksRWU9ITApfSksRi5hZGRFdmVudExpc3RlbmVyKCJoaWRlIiwoKT0+e0VlJiYoby5rZXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsYmUpLG8ua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLGRpKSxFZT0hMSl9KSxGLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwoKT0+e2RlbGV0ZSBQLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzW0YuaWRdLEVlJiYoby5rZXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsYmUpLG8ua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLGRpKSxFZT0hMSl9KX1lbHNlIGUuYXBwZW5kKEYpfSl9ZnVuY3Rpb24gbU4oZSx0LG4scil7KGUuaWQ9PT0iMSJ8fCFyLmlzTlZ1ZSkmJnBOKGUsdCxuLHIpLHZOKGUsdCxyKSxnTihlKX1mdW5jdGlvbiBHcChlKXtyZXR1cm4gZS5yb3V0ZU9wdGlvbnMubWV0YS5pc05WdWU/c04oZSk6RHAoKT09PTI/by53ZWJ2aWV3LmdldExhdW5jaFdlYnZpZXcoKTpsTigpfWZ1bmN0aW9uIFlwKGUsdCl7ZnQub25jZSh2YysiLiIrZSx0KX1sZXQgSmE9ITE7ZnVuY3Rpb24gcXAoZSx0LG4pe0phPXtwYXRoOmUsbnZ1ZTp4cyhlKS5pc05WdWUsY2FsbGJhY2s6dH19ZnVuY3Rpb24gSnAoZSx0LG4peyRvKGUpLE5sKGUuJGdldEFwcFdlYnZpZXcoKSx0LG4pfWZ1bmN0aW9uIEl1KGUsdCxuPSExKXtpZighbiYmSmEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFdhaXRpbmcgdG8gbmF2aWdhdGUgdG86ICR7SmEucGF0aH0sIGRvIG5vdCBvcGVyYXRlIGNvbnRpbnVvdXNseTogJHtlfS5gKTtpZihJLnJlbmRlcmVyPT09Im5hdGl2ZSIpcmV0dXJuIFVuKCkubGVuZ3RoPT09MD9xcChlLHQsIndhaXRGb3JSZWFkeSIpOnQoKTtsZXQgcj0hZW98fGVvJiZlby5fX3VuaWFwcF9yb3V0ZSxzPWVvJiYhZW8ubG9hZGVkO3J8fHM/cXAoZSx0LHI/IndhaXRGb3JDcmVhdGUiOiJ3YWl0Rm9yUmVhZHkiKTp0KCkscyYmWXAoZW8uaWQsUnUpfWZ1bmN0aW9uIFJ1KCl7aWYoIUphKXJldHVybjtsZXR7Y2FsbGJhY2s6ZX09SmE7cmV0dXJuIEphPSExLGUoKX1mdW5jdGlvbiBLcCgpe2lmKEkucmVuZGVyZXI9PT0ibmF0aXZlIilyZXR1cm4gSmEmJkphLm52dWU/UnUoKTp2b2lkIDA7bGV0IGU9Y04oKTtpZighIUphKXtpZihKYS5udnVlKXJldHVybiBSdSgpO2UubG9hZGVkP0phLmNhbGxiYWNrKCk6WXAoZS5pZCxSdSl9fWZ1bmN0aW9uIE5sKGUsdCxuKXtlW2UuX19wcmVsb2FkX18/ImhpZGUiOiJjbG9zZSJdKHQsbil9ZnVuY3Rpb24geHUoZSx0LG4scixzKXt0eXBlb2Ygcz09InVuZGVmaW5lZCImJihzPWUubnZ1ZT8wOjEwMCk7bGV0IHU9ZnVuY3Rpb24oKXt1Ll9jYWxsZWR8fCh1Ll9jYWxsZWQ9ITAsciYmcigpLEtwKCkpfTt1Ll9jYWxsZWQ9ITEsQygoKT0+e2xldCBwPUMoKCk9Pnt1KCl9LG4rMTUwKTtlLnNob3codCxuLCgpPT57dS5fY2FsbGVkfHxiKHApLHUoKX0pfSxzKX1mdW5jdGlvbiBfTihlLHQpe2xldCBuPWUuY2hpbGRyZW4oKTtpZighbnx8IW4ubGVuZ3RoKXJldHVybiB0KCk7bGV0IHI9bi5maW5kKHM9PnMuaWQuaW5kZXhPZih6UCk9PT0wKXx8blswXTtyLmNhbkJhY2soKHtjYW5CYWNrOnN9KT0+e3M/ci5iYWNrKCk6dCgpfSl9bGV0IGJOPVRlKFBTLChlLHtyZXNvbHZlOnQscmVqZWN0Om59KT0+e2xldCByPURyKCk7aWYoIXIpcmV0dXJuIG4oImdldEN1cnJlbnRQYWdlcyBpcyBlbXB0eSIpO2lmKGVyKHIsbmUuT05fQkFDS19QUkVTUyx7ZnJvbTplLmZyb218fCJuYXZpZ2F0ZUJhY2sifSkpcmV0dXJuIHQoKTtpZihSLmhpZGVUb2FzdCgpLFIuaGlkZUxvYWRpbmcoKSxyLiRwYWdlLm1ldGEuaXNRdWl0KXlOKCk7ZWxzZSBpZihqcChyKSl6cCgpO2Vsc2V7bGV0e2RlbHRhOnMsYW5pbWF0aW9uVHlwZTp1LGFuaW1hdGlvbkR1cmF0aW9uOnB9PWU7RU4ocyx1LHApfXJldHVybiB0KCl9LGtTLFVTKSxCdT0wO2Z1bmN0aW9uIHlOKCl7bmkoKSxCdT9EYXRlLm5vdygpLUJ1PDJlMyYmby5ydW50aW1lLnF1aXQoKTooQnU9RGF0ZS5ub3coKSxvLm5hdGl2ZVVJLnRvYXN0KEV0KCkudCgidW5pLmFwcC5xdWl0IikpLEMoKCk9PntCdT0wfSwyZTMpKX1mdW5jdGlvbiBFTihlLHQsbil7bGV0IHI9VW4oKSxzPXIubGVuZ3RoLHU9cltzLTFdO2U+MSYmci5zbGljZShzLWUscy0xKS5yZXZlcnNlKCkuZm9yRWFjaChVPT57Tmwoby53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKFUuJHBhZ2UuaWQrIiIpLCJub25lIiwwKX0pO2xldCBwPWZ1bmN0aW9uKFUpe3Q/TmwoVSx0LG58fGt1KTp1LiRwYWdlLm9wZW5UeXBlPT09InJlZGlyZWN0VG8iP05sKFUsTXAsa3UpOk5sKFUsImF1dG8iKSxyLnNsaWNlKHMtZSxzKS5mb3JFYWNoKFA9PiRvKFApKSxocygpLGVyKG5lLk9OX1NIT1cpfSxTPW8ud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh1LiRwYWdlLmlkKyIiKTtpZighdS5fX3VuaWFwcF93ZWJ2aWV3KXJldHVybiBwKFMpO19OKFMsKCk9PntwKFMpfSl9Y2xhc3MgU04gZXh0ZW5kcyBuZS5VbmlOb2Rle2NvbnN0cnVjdG9yKHQsbixyPSExKXtzdXBlcihuZS5OT0RFX1RZUEVfUEFHRSwiI3BhZ2UiLG51bGwpO3RoaXMuX2lkPTEsdGhpcy5fY3JlYXRlZD0hMSx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9jcmVhdGVBY3Rpb25NYXA9bmV3IE1hcCx0aGlzLnVwZGF0ZUFjdGlvbnM9W10sdGhpcy5kaWN0cz1bXSx0aGlzLm5vZGVJZD0wLHRoaXMucGFnZUlkPXQsdGhpcy5wYWdlTm9kZT10aGlzLHRoaXMub3B0aW9ucz1uLHRoaXMuaXNVbm1vdW50ZWQ9ITEsdGhpcy5jcmVhdGVBY3Rpb249W25lLkFDVElPTl9UWVBFX1BBR0VfQ1JFQVRFLG5dLHRoaXMuY3JlYXRlZEFjdGlvbj1bbmUuQUNUSU9OX1RZUEVfUEFHRV9DUkVBVEVEXSx0aGlzLm5vcm1hbGl6ZURpY3Q9dGhpcy5fbm9ybWFsaXplRGljdC5iaW5kKHRoaXMpLHRoaXMuX3VwZGF0ZT10aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLHImJnRoaXMuc2V0dXAoKX1fbm9ybWFsaXplRGljdCh0LG49ITApe2lmKCFxLmlzUGxhaW5PYmplY3QodCkpcmV0dXJuIHRoaXMuYWRkRGljdCh0KTtsZXQgcj1bXTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChzPT57bGV0IHU9W3RoaXMuYWRkRGljdChzKV0scD10W3NdO24/dS5wdXNoKHRoaXMuYWRkRGljdChwKSk6dS5wdXNoKHApLHIucHVzaCh1KX0pLHJ9YWRkRGljdCh0KXtsZXR7ZGljdHM6bn09dGhpcyxyPW4uaW5kZXhPZih0KTtyZXR1cm4gcj4tMT9yOm4ucHVzaCh0KS0xfW9uSW5qZWN0SG9vayh0KXsodD09PW5lLk9OX1BBR0VfU0NST0xMfHx0PT09bmUuT05fUkVBQ0hfQk9UVE9NKSYmIXRoaXMuc2Nyb2xsQWN0aW9uJiYodGhpcy5zY3JvbGxBY3Rpb249W25lLkFDVElPTl9UWVBFX1BBR0VfU0NST0xMLHRoaXMub3B0aW9ucy5vblJlYWNoQm90dG9tRGlzdGFuY2VdLHRoaXMucHVzaCh0aGlzLnNjcm9sbEFjdGlvbikpfW9uQ3JlYXRlKHQsbil7cmV0dXJuIENOKHRoaXMsdC5ub2RlSWQsbiksdH1vbkluc2VydEJlZm9yZSh0LG4scil7cmV0dXJuIFROKHRoaXMsbix0Lm5vZGVJZCxyJiZyLm5vZGVJZHx8LTEpLG59b25SZW1vdmVDaGlsZCh0KXtyZXR1cm4gT04odGhpcyx0Lm5vZGVJZCksdH1vbkFkZEV2ZW50KHQsbixyKXt0LnBhcmVudE5vZGUmJlBOKHRoaXMsdC5ub2RlSWQsbixyKX1vbkFkZFd4c0V2ZW50KHQsbixyLHMpe3QucGFyZW50Tm9kZSYmTk4odGhpcyx0Lm5vZGVJZCxuLHIscyl9b25SZW1vdmVFdmVudCh0LG4pe3QucGFyZW50Tm9kZSYma04odGhpcyx0Lm5vZGVJZCxuKX1vblNldEF0dHJpYnV0ZSh0LG4scil7dC5wYXJlbnROb2RlJiZSTih0aGlzLHQubm9kZUlkLG4scil9b25SZW1vdmVBdHRyaWJ1dGUodCxuKXt0LnBhcmVudE5vZGUmJnhOKHRoaXMsdC5ub2RlSWQsbil9b25UZXh0Q29udGVudCh0LG4pe3QucGFyZW50Tm9kZSYmWHAodGhpcyx0Lm5vZGVJZCxuKX1vbk5vZGVWYWx1ZSh0LG4pe3QucGFyZW50Tm9kZSYmWHAodGhpcyx0Lm5vZGVJZCxuKX1nZW5JZCgpe3JldHVybiB0aGlzLl9pZCsrfXB1c2godCxuKXtpZighdGhpcy5pc1VubW91bnRlZCl7c3dpdGNoKHRbMF0pe2Nhc2UgbmUuQUNUSU9OX1RZUEVfQ1JFQVRFOnRoaXMuX2NyZWF0ZUFjdGlvbk1hcC5zZXQodFsxXSx0KTticmVhaztjYXNlIG5lLkFDVElPTl9UWVBFX0lOU0VSVDpsZXQgcj10aGlzLl9jcmVhdGVBY3Rpb25NYXAuZ2V0KHRbMV0pO3I/KHJbM109dFsyXSxyWzRdPXRbM10sbiYmKHJbNV09bikpOihuJiYodFs0XT1uKSx0aGlzLnVwZGF0ZUFjdGlvbnMucHVzaCh0KSk7YnJlYWt9dFswXSE9PW5lLkFDVElPTl9UWVBFX0lOU0VSVCYmdGhpcy51cGRhdGVBY3Rpb25zLnB1c2godCksdGhpcy5fdXBkYXRpbmd8fCh0aGlzLl91cGRhdGluZz0hMCxzbi5xdWV1ZVBvc3RGbHVzaENiKHRoaXMuX3VwZGF0ZSkpfX1yZXN0b3JlKCl7dGhpcy5jbGVhcigpLHRoaXMuc2V0dXAoKSx0aGlzLnNjcm9sbEFjdGlvbiYmdGhpcy5wdXNoKHRoaXMuc2Nyb2xsQWN0aW9uKTtsZXQgdD1uPT57dGhpcy5vbkNyZWF0ZShuLG4ubm9kZU5hbWUpLHRoaXMub25JbnNlcnRCZWZvcmUobi5wYXJlbnROb2RlLG4sbnVsbCksbi5jaGlsZE5vZGVzLmZvckVhY2gocj0+e3Qocil9KX07dGhpcy5jaGlsZE5vZGVzLmZvckVhY2gobj0+dChuKSksdGhpcy5wdXNoKHRoaXMuY3JlYXRlZEFjdGlvbil9c2V0dXAoKXt0aGlzLnNlbmQoW3RoaXMuY3JlYXRlQWN0aW9uXSl9dXBkYXRlKCl7bGV0e2RpY3RzOnQsdXBkYXRlQWN0aW9uczpuLF9jcmVhdGVBY3Rpb25NYXA6cn09dGhpczt0aGlzLl9jcmVhdGVkfHwodGhpcy5fY3JlYXRlZD0hMCxuLnB1c2godGhpcy5jcmVhdGVkQWN0aW9uKSksbi5sZW5ndGgmJih0Lmxlbmd0aCYmbi51bnNoaWZ0KFtXTyx0XSksdGhpcy5zZW5kKG4pKSx0aGlzLmNsZWFyKCl9Y2xlYXIoKXt0aGlzLmRpY3RzLmxlbmd0aD0wLHRoaXMudXBkYXRlQWN0aW9ucy5sZW5ndGg9MCx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9jcmVhdGVBY3Rpb25NYXAuY2xlYXIoKX1zZW5kKHQpe2Z0LnB1Ymxpc2hIYW5kbGVyKGxwLHQsdGhpcy5wYWdlSWQpfWZpcmVFdmVudCh0LG4pe2xldCByPVpwKHQsdGhpcyk7ciYmci5kaXNwYXRjaEV2ZW50KG4pfX1mdW5jdGlvbiB3TihlKXtsZXQgdD1QbyhlKTtyZXR1cm4gdD90Ll9fcGFnZV9jb250YWluZXJfXzpudWxsfWZ1bmN0aW9uIEtmKGUsdCxuKXtpZih0eXBlb2Ygbj09Im51bWJlciImJihuPXdOKG4pKSxuW2VdPT09dClyZXR1cm4gbjtsZXR7Y2hpbGROb2RlczpyfT1uO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGg7cysrKXtsZXQgdT1LZihlLHQscltzXSk7aWYodSlyZXR1cm4gdX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBacChlLHQpe3JldHVybiBLZigibm9kZUlkIixlLHQpfWZ1bmN0aW9uIEFOKGUsdCl7cmV0dXJuIEtmKCJub2RlTmFtZSIsZS50b1VwcGVyQ2FzZSgpLHQpfWZ1bmN0aW9uIENOKGUsdCxuKXtlLnB1c2goW25lLkFDVElPTl9UWVBFX0NSRUFURSx0LGUuYWRkRGljdChuKSwtMSwtMV0pfWZ1bmN0aW9uIFROKGUsdCxuLHIpe2xldCBzPXQudG9KU09OKHthdHRyOiEwLG5vcm1hbGl6ZTplLm5vcm1hbGl6ZURpY3R9KTtlLnB1c2goW25lLkFDVElPTl9UWVBFX0lOU0VSVCx0Lm5vZGVJZCxuLHJdLE9iamVjdC5rZXlzKHMpLmxlbmd0aD9zOnZvaWQgMCl9ZnVuY3Rpb24gT04oZSx0KXtlLnB1c2goW25lLkFDVElPTl9UWVBFX1JFTU9WRSx0XSl9ZnVuY3Rpb24gUE4oZSx0LG4scil7ZS5wdXNoKFtuZS5BQ1RJT05fVFlQRV9BRERfRVZFTlQsdCxlLmFkZERpY3Qobikscl0pfWZ1bmN0aW9uIE5OKGUsdCxuLHIscyl7ZS5wdXNoKFtuZS5BQ1RJT05fVFlQRV9BRERfV1hTX0VWRU5ULHQsZS5hZGREaWN0KG4pLGUuYWRkRGljdChyKSxzXSl9ZnVuY3Rpb24ga04oZSx0LG4pe2UucHVzaChbbmUuQUNUSU9OX1RZUEVfUkVNT1ZFX0VWRU5ULHQsZS5hZGREaWN0KG4pXSl9ZnVuY3Rpb24gSU4oZSx0LG4pe3JldHVybiB0PT09InN0eWxlIiYmcS5pc1BsYWluT2JqZWN0KG4pP2Uubm9ybWFsaXplRGljdChuKTplLmFkZERpY3Qobil9ZnVuY3Rpb24gUk4oZSx0LG4scil7ZS5wdXNoKFtuZS5BQ1RJT05fVFlQRV9TRVRfQVRUUklCVVRFLHQsZS5hZGREaWN0KG4pLElOKGUsbixyKV0pfWZ1bmN0aW9uIHhOKGUsdCxuKXtlLnB1c2goW25lLkFDVElPTl9UWVBFX1JFTU9WRV9BVFRSSUJVVEUsdCxlLmFkZERpY3QobildKX1mdW5jdGlvbiBYcChlLHQsbil7ZS5wdXNoKFtuZS5BQ1RJT05fVFlQRV9TRVRfVEVYVCx0LGUuYWRkRGljdChuKV0pfWZ1bmN0aW9uIEJOKGUsdCxuKXtyZXR1cm4gbmV3IFNOKGUsdCxuKX1mdW5jdGlvbiBRcChlKXtsZXQgdD1lLnNldHVwO3JldHVybiBlLmluaGVyaXRBdHRycz0hMSxlLnNldHVwPShuLHIpPT57bGV0e2F0dHJzOntfX3BhZ2VJZDpzLF9fcGFnZVBhdGg6dSxfX3BhZ2VRdWVyeTpwLF9fcGFnZUluc3RhbmNlOlN9fT1yLFA9c24uZ2V0Q3VycmVudEluc3RhbmNlKCkucHJveHk7aWYoX3QoUCxTKSxCaShldihzLFAsUykpLHNuLm9uTW91bnRlZCgoKT0+e3NuLm5leHRUaWNrKCgpPT57ZXIoUCxuZS5PTl9SRUFEWSl9KX0pLHNuLm9uQmVmb3JlVW5tb3VudCgoKT0+e2VyKFAsbmUuT05fVU5MT0FEKX0pLHQpcmV0dXJuIHQocCxyKX0sZX1mdW5jdGlvbiBldihlLHQsbil7e2xldCByPSgpPT5vLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoZSsiIik7dC4kZ2V0QXBwV2Vidmlldz1yLHQuJC5jdHguJHNjb3BlPXskZ2V0QXBwV2VidmlldzpyfX1yZXR1cm4gdC5nZXRPcGVuZXJFdmVudENoYW5uZWw9KCk9PihuLmV2ZW50Q2hhbm5lbHx8KG4uZXZlbnRDaGFubmVsPW5ldyBuZS5FdmVudENoYW5uZWwoZSkpLG4uZXZlbnRDaGFubmVsKSx0fWZ1bmN0aW9uIE1OKGUpe3JldHVybiBxLmlzRnVuY3Rpb24oZSl9bGV0IHR2PW5ldyBNYXA7ZnVuY3Rpb24gTE4oZSx0KXt0di5zZXQoZSxuZS5vbmNlKEROKHQpKSl9ZnVuY3Rpb24gRk4oZSx0LG4scixzKXtsZXQgdT1CTihlLHMsITApLHA9T28oKSxTPXR2LmdldCh0KSgpLFU9UD0+cC5tb3VudFBhZ2UoUCx7X19wYWdlSWQ6ZSxfX3BhZ2VQYXRoOnQsX19wYWdlUXVlcnk6bixfX3BhZ2VJbnN0YW5jZTpyfSx1KTtyZXR1cm4gcS5pc1Byb21pc2UoUyk/Uy50aGVuKFA9PlUoUCkpOlUoUyl9ZnVuY3Rpb24gRE4oZSl7cmV0dXJuKCk9Pk1OKGUpP2UoKS50aGVuKHQ9PlFwKHQpKTpRcChlKX1sZXQgbnY9ITE7ZnVuY3Rpb24gcnYoKXtpZihudilyZXR1cm47bnY9ITA7bGV0IGUsdDtpZihmLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRSZWRpcmVjdEluZm8pe2xldHtwYXRoOnUscXVlcnk6cCxyZWZlcnJlckluZm86U309eXMoKTt1JiYoZT11LHQ9cCksSS5yZWZlcnJlckluZm89U31lbHNle2xldCB1PW8ucnVudGltZS5hcmd1bWVudHM7aWYoIXUpcmV0dXJuO3RyeXtsZXQgcD1KU09OLnBhcnNlKHUpO2U9cC5wYXRofHxwLnBhdGhOYW1lLHQ9cC5xdWVyeT8iPyIrcC5xdWVyeToiIn1jYXRjaChwKXt9fWlmKCFlfHxlPT09SS5lbnRyeVBhZ2VQYXRoKXt0JiYoSS5lbnRyeVBhZ2VRdWVyeT10KTtyZXR1cm59bGV0IHI9bmUuYWRkTGVhZGluZ1NsYXNoKGUpLHM9S2kocik7IXN8fChzLm1ldGEuaXNUYWJCYXJ8fChJLnJlYWxFbnRyeVBhZ2VQYXRoPUkucmVhbEVudHJ5UGFnZVBhdGh8fEkuZW50cnlQYWdlUGF0aCksSS5lbnRyeVBhZ2VQYXRoPWUsSS5lbnRyeVBhZ2VRdWVyeT10KX1mdW5jdGlvbiBNdShlLHQpe2xldCBuPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoS2koZSkpKTtyZXR1cm4gbi5tZXRhPXRsKG4ubWV0YSksdCE9PSJwcmVsb2FkUGFnZSImJiFJLnJlYWxFbnRyeVBhZ2VQYXRoJiYodD09PSJyZUxhdW5jaCJ8fFVuKCkubGVuZ3RoPT09MCk/bi5tZXRhLmlzUXVpdD0hMDpuLm1ldGEuaXNUYWJCYXJ8fChuLm1ldGEuaXNRdWl0PSExKSxufWxldCBLYT17fTtmdW5jdGlvbiBWTihlKXtsZXQgdD1PYmplY3Qua2V5cyhLYSkuZmluZChuPT5LYVtuXS5pZD09PWUuaWQpO3QmJmRlbGV0ZSBLYVt0XX1mdW5jdGlvbiBVTih7dXJsOmV9KXtsZXQgdD1LYVtlXTtyZXR1cm4gdCYmKHQuX19wYWdlX18mJlVuKCkuZmluZChuPT5uPT09dC5fX3BhZ2VfXyk/dC5fX3ByZWxvYWRfXz0hMTp0LmNsb3NlKCJub25lIiksZGVsZXRlIEthW2VdKSx0fWZ1bmN0aW9uICROKHt1cmw6ZSxwYXRoOnQscXVlcnk6bn0pe2lmKCFLYVtlXSl7bGV0IHI9TXUodCwicHJlbG9hZFBhZ2UiKTtLYVtlXT1HcCh7cGF0aDp0LHJvdXRlT3B0aW9uczpyLHF1ZXJ5Om4sd2Vidmlld0V4dHJhczp7X19wcmVsb2FkX186ITB9fSl9cmV0dXJuIEthW2VdfWZ1bmN0aW9uIEtjKHt1cmw6ZSxwYXRoOnQscXVlcnk6bixvcGVuVHlwZTpyLHdlYnZpZXc6cyxudnVlUGFnZVZtOnUsZXZlbnRDaGFubmVsOnB9KXtpZihzJiZydigpLEthW2VdKXtzPUthW2VdO2xldCBFZT1zO2lmKEVlLl9fcGFnZV9fKWlmKFVuKCkuZmluZChQZT0+UGU9PT1FZS5fX3BhZ2VfXykpcz12b2lkIDA7ZWxzZSByZXR1cm4gcCYmKEVlLl9fcGFnZV9fLiRwYWdlLmV2ZW50Q2hhbm5lbD1wKSxyPT09ImxhdW5jaCI/SE4oZSx0LG4sRWUsdSxwKTpCaShFZS5fX3BhZ2VfXyksRWV9bGV0IFM9TXUodCxyKTtzPyhzPW8ud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChzLmlkKSxzLm52dWU9Uy5tZXRhLmlzTlZ1ZSk6cz1HcCh7cGF0aDp0LHJvdXRlT3B0aW9uczpTLHF1ZXJ5Om59KSxTLm1ldGEuaWQ9cGFyc2VJbnQocy5pZCksISFTLm1ldGEuaXNUYWJCYXImJlNpLmFwcGVuZChzKSxtTihzLHQsbixTLm1ldGEpO2xldCBQPXQuc2xpY2UoMSk7cy5fX3VuaWFwcF9yb3V0ZT1QO2xldCBGPXJhKHIsZSxuLFMubWV0YSxwLEkuZGFya21vZGU/by5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpOiJsaWdodCIpLGJlPXBhcnNlSW50KHMuaWQpO3JldHVybiBzLm52dWU/dT96TihiZSx1LEYpOml2KGJlLHMsRik6Rk4oYmUsUCxuLEYsak4oUykpLHN9ZnVuY3Rpb24gSE4oZSx0LG4scixzLHUpe2xldCBwPU11KHQsInByZWxvYWRQYWdlIik7cC5tZXRhLmlkPXBhcnNlSW50KHIuaWQpO2xldCBTPXJhKCJwcmVsb2FkUGFnZSIsZSxuLHAubWV0YSx1LEkuZGFya21vZGU/by5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpOiJsaWdodCIpO190KHMsUyksci5fX3BhZ2VfXz1zfWZ1bmN0aW9uIGpOKHttZXRhOmV9KXtsZXQgdD1MZigpLHtwbGF0Zm9ybTpuLHBpeGVsUmF0aW86cix3aW5kb3dXaWR0aDpzfT1ZaSgpO3JldHVybntjc3M6ITAscm91dGU6ZS5yb3V0ZSx2ZXJzaW9uOjEsbG9jYWxlOiIiLHBsYXRmb3JtOm4scGl4ZWxSYXRpbzpyLHdpbmRvd1dpZHRoOnMsZGlzYWJsZVNjcm9sbDplLmRpc2FibGVTY3JvbGw9PT0hMCxvblBhZ2VTY3JvbGw6ITEsb25QYWdlUmVhY2hCb3R0b206ITEsb25SZWFjaEJvdHRvbURpc3RhbmNlOnEuaGFzT3duKGUsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP2Uub25SZWFjaEJvdHRvbURpc3RhbmNlOm5lLk9OX1JFQUNIX0JPVFRPTV9ESVNUQU5DRSxzdGF0dXNiYXJIZWlnaHQ6dCx3aW5kb3dUb3A6ZS5uYXZpZ2F0aW9uQmFyLnR5cGU9PT0iZmxvYXQiP3QrbmUuTkFWQkFSX0hFSUdIVDowLHdpbmRvd0JvdHRvbTpTaS5pbmRleE9mKGUucm91dGUpPj0wJiZTaS5jb3Zlcj9TaS5oZWlnaHQ6MH19ZnVuY3Rpb24gek4oZSx0LG4pe190KHQsbiksQmkoZXYoZSx0LG4pKSxlPT09MSYmKEkuc3BsYXNoc2NyZWVuJiZJLnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiFJLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZvLm5hdmlnYXRvci5jbG9zZVNwbGFzaHNjcmVlbigpLEkub25SZWFkeShmdW5jdGlvbigpe0twKCl9KSl9ZnVuY3Rpb24gaXYoZSx0LG4pe2xldCByPXskOnt9LCRnZXRBcHBXZWJ2aWV3KCl7cmV0dXJuIHR9LGdldE9wZW5lckV2ZW50Q2hhbm5lbCgpe3JldHVybiBuLmV2ZW50Q2hhbm5lbHx8KG4uZXZlbnRDaGFubmVsPW5ldyBuZS5FdmVudENoYW5uZWwoZSkpLG4uZXZlbnRDaGFubmVsfSxfX3NldHVwKHMsdSl7cy4kZ2V0QXBwV2Vidmlldz0oKT0+dCxzLmdldE9wZW5lckV2ZW50Q2hhbm5lbD11LmdldE9wZW5lckV2ZW50Q2hhbm5lbCxfdChzLG4pLHQuX19wcmVsb2FkX18mJih0Ll9fcGFnZV9fPXMpO2xldCBwPXhuKCksUz1wLmZpbmRJbmRleChVPT5VPT09dSk7Uz4tMSYmcC5zcGxpY2UoUywxLHMpfX07X3QocixuKSx0Ll9fcHJlbG9hZF9fPyh0Ll9fcGFnZV9fPXIsdC5hZGRFdmVudExpc3RlbmVyKCJzaG93IiwoKT0+e2VyKHQuX19wYWdlX18sbmUuT05fU0hPVyl9KSx0LmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLCgpPT57ZXIodC5fX3BhZ2VfXyxuZS5PTl9ISURFKX0pKTpCaShyKX1sZXQgb3Y9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3VybDpyLGV2ZW50czpzLGFuaW1hdGlvblR5cGU6dSxhbmltYXRpb25EdXJhdGlvbjpwfT1lLHtwYXRoOlMscXVlcnk6VX09bmUucGFyc2VVcmwociksW1AsRl09WU4oUyx1LHApO0l1KFMsKCk9PntHTih7dXJsOnIscGF0aDpTLHF1ZXJ5OlUsZXZlbnRzOnMsYW5pVHlwZTpQLGFuaUR1cmF0aW9uOkZ9KS50aGVuKHQpLmNhdGNoKG4pfSxlLm9wZW5UeXBlPT09ImFwcExhdW5jaCIpfSxXTj1UZShQZixvdixOUyxMUyk7ZnVuY3Rpb24gR04oe3VybDplLHBhdGg6dCxxdWVyeTpuLGV2ZW50czpyLGFuaVR5cGU6cyxhbmlEdXJhdGlvbjp1fSl7ZXIobmUuT05fSElERSk7bGV0IHA9bmV3IG5lLkV2ZW50Q2hhbm5lbChEcCgpKzEscik7cmV0dXJuIG5ldyBQcm9taXNlKFM9Pnt4dShLYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6Im5hdmlnYXRlVG8iLGV2ZW50Q2hhbm5lbDpwfSkscyx1LCgpPT57Uyh7ZXZlbnRDaGFubmVsOnB9KX0pLGhzKCl9KX1mdW5jdGlvbiBZTihlLHQsbil7bGV0e2dsb2JhbFN0eWxlOnJ9PUkscz14cyhlKTtyZXR1cm5bdHx8cy5hbmltYXRpb25UeXBlfHxyLmFuaW1hdGlvblR5cGV8fEhQLG58fHMuYW5pbWF0aW9uRHVyYXRpb258fHIuYW5pbWF0aW9uRHVyYXRpb258fGt1XX1sZXQgcU49VGUoTmYsKHt1cmw6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3BhdGg6cixxdWVyeTpzfT1uZS5wYXJzZVVybChlKTtJdShyLCgpPT57Sk4oe3VybDplLHBhdGg6cixxdWVyeTpzfSkudGhlbih0KS5jYXRjaChuKX0pfSxJUyxGUyk7ZnVuY3Rpb24gSk4oe3VybDplLHBhdGg6dCxxdWVyeTpufSl7bGV0IHI9RHIoKTtyZXR1cm4gciYmJG8ociksbmV3IFByb21pc2Uocz0+e3h1KEtjKHt1cmw6ZSxwYXRoOnQscXVlcnk6bixvcGVuVHlwZToicmVkaXJlY3RUbyJ9KSwibm9uZSIsMCwoKT0+e2lmKHIpe2xldCB1PXIuJGdldEFwcFdlYnZpZXcoKTt1Ll9fcHJlbG9hZF9fJiZWTih1KSx1LmNsb3NlKCJub25lIil9cyh2b2lkIDApfSksaHMoKX0pfWxldCBLTj0oe3VybDplfSx7cmVzb2x2ZTp0LHJlamVjdDpufSk9PntsZXR7cGF0aDpyLHF1ZXJ5OnN9PW5lLnBhcnNlVXJsKGUpO0l1KHIsKCk9PntaTih7dXJsOmUscGF0aDpyLHF1ZXJ5OnN9KS50aGVuKHQpLmNhdGNoKG4pfSl9O2Z1bmN0aW9uIFpOKHt1cmw6ZSxwYXRoOnQscXVlcnk6bn0pe3JldHVybiBuZXcgUHJvbWlzZShyPT57bGV0IHM9eG4oKS5zbGljZSgwKTtCZS5maW5kKHA9PnAucGF0aD09PXQpLm1ldGEuaXNUYWJCYXImJlNpLnN3aXRjaFRhYih0LnNsaWNlKDEpKSx4dShLYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLCgpPT57cy5mb3JFYWNoKHA9PkpwKHAsIm5vbmUiKSkscih2b2lkIDApfSksaHMoKX0pfWxldCBYTj1UZShkZyxLTixSUyxEUyksYXY9KGUse3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0e3VybDpyfT1lLHtwYXRoOnMscXVlcnk6dX09bmUucGFyc2VVcmwocik7SXUocywoKT0+e2VrKHt1cmw6cixwYXRoOnMscXVlcnk6dX0pLnRoZW4odCkuY2F0Y2gobil9LGUub3BlblR5cGU9PT0iYXBwTGF1bmNoIil9LFFOPVRlKGh1LGF2LHhTLFZTKTtmdW5jdGlvbiBlayh7dXJsOmUscGF0aDp0LHF1ZXJ5Om59KXtTaS5zd2l0Y2hUYWIodC5zbGljZSgxKSk7bGV0IHI9VW4oKSxzPXIubGVuZ3RoLHU9ITEscD0hMSxTO3M+PTEmJihTPXJbcy0xXSxTJiYhUy4kLl9faXNUYWJCYXI/KHA9ITAsci5yZXZlcnNlKCkuZm9yRWFjaChQPT57IVAuJC5fX2lzVGFiQmFyJiZQIT09UyYmSnAoUCwibm9uZSIpfSksJG8oUyksQygoKT0+e1MuJHBhZ2Uub3BlblR5cGU9PT0icmVkaXJlY3RUbyI/TmwoUy4kZ2V0QXBwV2VidmlldygpLE1wLGt1KTpObChTLiRnZXRBcHBXZWJ2aWV3KCksImF1dG8iKX0sMTAwKSk6dT0hMCk7bGV0IFU7cmV0dXJuIHhuKCkuZm9yRWFjaChQPT57bmUuYWRkTGVhZGluZ1NsYXNoKFAucm91dGUpPT09dD8oUC4kLl9faXNBY3RpdmV8fChwPSEwKSxQLiQuX19pc0FjdGl2ZT0hMCxVPVApOlAuJC5fX2lzVGFiQmFyJiYoUC4kLl9faXNBY3RpdmU9ITEpfSksUz09PVUmJih1PSExKSxTJiZ1JiZlcihTLG5lLk9OX0hJREUpLG5ldyBQcm9taXNlKFA9PntpZihVKXtsZXQgRj1VLiRnZXRBcHBXZWJ2aWV3KCk7Ri5zaG93KCJub25lIikscCYmIUYuX19wcmVsb2FkX18mJmVyKFUsbmUuT05fU0hPVyksaHMoKSxQKHZvaWQgMCl9ZWxzZSB4dShLYyh7dXJsOmUscGF0aDp0LHF1ZXJ5Om4sb3BlblR5cGU6InN3aXRjaFRhYiJ9KSwibm9uZSIsMCwoKT0+e2hzKCksUCh2b2lkIDApfSw3MCl9KX1sZXQgdGs9VGUoa2YsKHt1cmw6ZX0se3Jlc29sdmU6dCxyZWplY3Q6bn0pPT57bGV0IHI9VU4oe3VybDplfSk7aWYocil7dCh7aWQ6ci5pZCx1cmw6ZSxlcnJNc2c6InVuUHJlbG9hZFBhZ2U6b2sifSk7cmV0dXJufW4oIm5vdCBmb3VuZCIpfSxNUyxIUyksbms9VGUoZ3UsKHt1cmw6ZX0se3Jlc29sdmU6dH0pPT57aWYoS2FbZV0pcmV0dXJuO2xldCBuPWUuc3BsaXQoIj8iKSxyPW5bMF0scz1uZS5wYXJzZVF1ZXJ5KG5bMV18fCIiKSx1PSROKHt1cmw6ZSxwYXRoOnIscXVlcnk6c30pLHA9TXUociwicHJlbG9hZFBhZ2UiKTtwLm1ldGEuaWQ9cGFyc2VJbnQodS5pZCk7bGV0IFM9cmEoInByZWxvYWRQYWdlIixlLHMscC5tZXRhLHZvaWQgMCxJLmRhcmttb2RlP28ubmF2aWdhdG9yLmdldFVJU3R5bGUoKToibGlnaHQiKTtpdihwYXJzZUludCh1LmlkKSx1LFMpLHQoe2lkOnUuaWQsdXJsOmUsZXJyTXNnOiJwcmVsb2FkUGFnZTpvayJ9KX0sQlMsJFMpO3ZhciByaz17X19wcm90b19fOm51bGwsJGVtaXQ6bGIsJG9mZjpzYiwkb246b2IsJG9uY2U6YWIsX19sb2dfXzp2UCxhZGRJbnRlcmNlcHRvcjpKXyxhZGRQaG9uZUNvbnRhY3Q6VUMsYXJyYXlCdWZmZXJUb0Jhc2U2NDpMbyxiYXNlNjRUb0FycmF5QnVmZmVyOkdpLGNhbklVc2U6R0EsY2FudmFzR2V0SW1hZ2VEYXRhOkZiLGNhbnZhc1B1dEltYWdlRGF0YTpEYixjYW52YXNUb1RlbXBGaWxlUGF0aDpWYixjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOkdDLGNoZWNrSXNTdXBwb3J0U290ZXJBdXRoZW50aWNhdGlvbjpXQyxjaG9vc2VJbWFnZTpnVCxjaG9vc2VMb2NhdGlvbjpkTyxjaG9vc2VWaWRlbzpwVCxjbGVhclN0b3JhZ2U6eEEsY2xlYXJTdG9yYWdlU3luYzpSQSxjbG9zZUF1dGhWaWV3OnBwLGNsb3NlQkxFQ29ubmVjdGlvbjpBQyxjbG9zZUJsdWV0b290aEFkYXB0ZXI6bUMsY2xvc2VQcmV2aWV3SW1hZ2U6b1QsY2xvc2VTb2NrZXQ6UlQsY29tcHJlc3NJbWFnZTpmVCxjb21wcmVzc1ZpZGVvOmRULGNvbmZpZ01UTFM6VFQsY29ubmVjdFNvY2tldDprVCxjcmVhdGVBbmltYXRpb246aXksY3JlYXRlQkxFQ29ubmVjdGlvbjp3QyxjcmVhdGVDYW52YXNDb250ZXh0OkxiLGNyZWF0ZUZ1bGxTY3JlZW5WaWRlb0FkOkxQLGNyZWF0ZUlubmVyQXVkaW9Db250ZXh0OnFULGNyZWF0ZUludGVyYWN0aXZlQWQ6JFAsY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXI6emIsY3JlYXRlSW50ZXJzdGl0aWFsQWQ6RFAsY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6bE8sY3JlYXRlTWFwQ29udGV4dDp5YixjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXI6R2IsY3JlYXRlUHVzaE1lc3NhZ2U6b1AsY3JlYXRlUmV3YXJkZWRWaWRlb0FkOkJQLGNyZWF0ZVNlbGVjdG9yUXVlcnk6WGIsY3JlYXRlVmlkZW9Db250ZXh0Ol9iLGRvd25sb2FkRmlsZTpFVCxnZXRBcHBBdXRob3JpemVTZXR0aW5nOllnLGdldEFwcEJhc2VJbmZvOlJnLGdldEJMRURldmljZUNoYXJhY3RlcmlzdGljczpUQyxnZXRCTEVEZXZpY2VSU1NJOklDLGdldEJMRURldmljZVNlcnZpY2VzOkNDLGdldEJhY2tncm91bmRBdWRpb01hbmFnZXI6b08sZ2V0QmVhY29uczpCQyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6X0MsZ2V0Qmx1ZXRvb3RoRGV2aWNlczpFQyxnZXRDaGFubmVsTWFuYWdlcjphUCxnZXRDaGVja0JveFN0YXRlOnZwLGdldENsaXBib2FyZERhdGE6JEMsZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczpTQyxnZXREZXZpY2VJbmZvOklnLGdldEVudGVyT3B0aW9uc1N5bmM6VHksZ2V0RmlsZUluZm86TUEsZ2V0SW1hZ2VJbmZvOm5ULGdldExhdW5jaE9wdGlvbnNTeW5jOk95LGdldExvY2FsZTpNYyxnZXRMb2NhdGlvbjpmTyxnZXROZXR3b3JrVHlwZTokZyxnZXRQcm92aWRlcjpRTyxnZXRQdXNoQ2xpZW50SWQ6UHksZ2V0UmVjb3JkZXJNYW5hZ2VyOmxULGdldFNhdmVkRmlsZUluZm86akEsZ2V0U2F2ZWRGaWxlTGlzdDpIQSxnZXRTY3JlZW5CcmlnaHRuZXNzOlpDLGdldFNlbGVjdGVkVGV4dFJhbmdlOmd5LGdldFN0b3JhZ2U6TkEsZ2V0U3RvcmFnZUluZm86QkEsZ2V0U3RvcmFnZUluZm9TeW5jOmJnLGdldFN0b3JhZ2VTeW5jOlBBLGdldFN1Yk5WdWVCeUlkOkpPLGdldFN5c3RlbUluZm86b0MsZ2V0U3lzdGVtSW5mb1N5bmM6eGcsZ2V0U3lzdGVtU2V0dGluZzplVCxnZXRVbml2ZXJpZnlNYW5hZ2VyOmlQLGdldFVzZXJJbmZvOmVQLGdldFVzZXJQcm9maWxlOnRQLGdldFZpZGVvSW5mbzpyVCxnZXRXaW5kb3dJbmZvOmtnLGhpZGVLZXlib2FyZDptVCxoaWRlTG9hZGluZzpUTyxoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmc6eE8saGlkZVRhYkJhcjpWTyxoaWRlVGFiQmFyUmVkRG90OmpPLGhpZGVUb2FzdDpDTyxpbml0VVRTQ2xhc3NOYW1lOklwLGluaXRVVFNJbmRleENsYXNzTmFtZTpOUCxpbml0VVRTUGFja2FnZU5hbWU6UFAsaW5pdFVUU1Byb3h5Q2xhc3M6TnAsaW5pdFVUU1Byb3h5RnVuY3Rpb246Q1AsaW50ZXJjZXB0b3JzOlpfLGludm9rZVB1c2hDYWxsYmFjazpUZixsb2FkRm9udEZhY2U6Tk8sbG9naW46ZnAsbWFrZVBob25lQ2FsbDpGQyxuYXZpZ2F0ZUJhY2s6Yk4sbmF2aWdhdGVUbzpXTixuYXZpZ2F0ZVRvTWluaVByb2dyYW06aFAsbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpPQyxvZmZBY2NlbGVyb21ldGVyQ2hhbmdlOmZDLG9mZkFwcEhpZGU6Q3ksb2ZmQXBwU2hvdzp3eSxvZmZDb21wYXNzQ2hhbmdlOnNDLG9mZkVycm9yOkV5LG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOmJULG9mZkxvY2F0aW9uQ2hhbmdlOm1PLG9mZkxvY2F0aW9uQ2hhbmdlRXJyb3I6Yk8sb2ZmTmV0d29ya1N0YXR1c0NoYW5nZTp6QyxvZmZQYWdlTm90Rm91bmQ6Ynksb2ZmUHVzaE1lc3NhZ2U6a3ksb2ZmVGhlbWVDaGFuZ2U6S0Msb2ZmVW5oYW5kbGVkUmVqZWN0aW9uOm15LG9mZldpbmRvd1Jlc2l6ZTpjeSxvbkFjY2VsZXJvbWV0ZXJDaGFuZ2U6dUMsb25BcHBIaWRlOkF5LG9uQXBwU2hvdzpTeSxvbkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2U6cEMsb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6Z0Msb25CZWFjb25TZXJ2aWNlQ2hhbmdlOnhDLG9uQmVhY29uVXBkYXRlOlJDLG9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlOmhDLG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6ZEMsb25Db21wYXNzQ2hhbmdlOmFDLG9uQ3JlYXRlVnVlQXBwOm5lLm9uQ3JlYXRlVnVlQXBwLG9uRXJyb3I6eXksb25Ib3N0RXZlbnRSZWNlaXZlOkVwLG9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6X1Qsb25Mb2NhbGVDaGFuZ2U6Znksb25Mb2NhdGlvbkNoYW5nZTp2TyxvbkxvY2F0aW9uQ2hhbmdlRXJyb3I6X08sb25OYXRpdmVFdmVudFJlY2VpdmU6Z1Asb25OZXR3b3JrU3RhdHVzQ2hhbmdlOmpDLG9uUGFnZU5vdEZvdW5kOl95LG9uUHVzaE1lc3NhZ2U6Tnksb25Tb2NrZXRDbG9zZTpMVCxvblNvY2tldEVycm9yOkJULG9uU29ja2V0TWVzc2FnZTpNVCxvblNvY2tldE9wZW46eFQsb25UYWJCYXJNaWRCdXR0b25UYXA6b3ksb25UaGVtZUNoYW5nZTpKQyxvblVuaGFuZGxlZFJlamVjdGlvbjp2eSxvbldpbmRvd1Jlc2l6ZTpseSxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzp0VCxvcGVuQmx1ZXRvb3RoQWRhcHRlcjp2QyxvcGVuRG9jdW1lbnQ6V0Esb3BlbkxvY2F0aW9uOmhPLHBhZ2VTY3JvbGxUbzprTyxwcmVMb2dpbjpocCxwcmVsb2FkUGFnZTpuayxwcmV2aWV3SW1hZ2U6aVQscmVMYXVuY2g6WE4scmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWU6UEMscmVkaXJlY3RUbzpxTixyZWdpc3RlclJ1bnRpbWU6c1AscmVnaXN0ZXJVVFNJbnRlcmZhY2U6a1AscmVnaXN0ZXJVVFNQbHVnaW46SVAscmVtb3ZlSW50ZXJjZXB0b3I6S18scmVtb3ZlU2F2ZWRGaWxlOnpBLHJlbW92ZVN0b3JhZ2U6SUEscmVtb3ZlU3RvcmFnZVN5bmM6a0EscmVtb3ZlVGFiQmFyQmFkZ2U6SE8scmVxdWVzdDpDVCxyZXF1ZXN0UGF5bWVudDpkUCxyZXF1aXJlR2xvYmFsOlpPLHJlcXVpcmVOYXRpdmVQbHVnaW46aGEscmVxdWlyZVVUU1BsdWdpbjpSUCxyZXN0b3JlR2xvYmFsOktPLHNhdmVGaWxlOlZBLHNhdmVJbWFnZVRvUGhvdG9zQWxidW06dVQsc2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpjVCxzY2FuQ29kZTpxQyxzZW5kSG9zdEV2ZW50OmJwLHNlbmROYXRpdmVFdmVudDpEZyxzZW5kU29ja2V0TWVzc2FnZTpJVCxzZXRCTEVNVFU6a0Msc2V0Q2xpcGJvYXJkRGF0YTpIQyxzZXRLZWVwU2NyZWVuT246UUMsc2V0TG9jYWxlOmR5LHNldE5hdmlnYXRpb25CYXJDb2xvcjpNTyxzZXROYXZpZ2F0aW9uQmFyVGl0bGU6SU8sc2V0UGFnZU1ldGE6aHksc2V0U2NyZWVuQnJpZ2h0bmVzczpYQyxzZXRTdG9yYWdlOk9BLHNldFN0b3JhZ2VTeW5jOlRBLHNldFRhYkJhckJhZGdlOkxPLHNldFRhYkJhckl0ZW06Rk8sc2V0VGFiQmFyU3R5bGU6RE8sc2hhcmU6dVAsc2hhcmVXaXRoU3lzdGVtOmZQLHNob3dBY3Rpb25TaGVldDpTTyxzaG93S2V5Ym9hcmQ6dlQsc2hvd0xvYWRpbmc6d08sc2hvd01vZGFsOnlPLHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpSTyxzaG93VGFiQmFyOlVPLHNob3dUYWJCYXJSZWREb3Q6JE8sc2hvd1RvYXN0OkFPLHN0YXJ0QWNjZWxlcm9tZXRlcjpMZyxzdGFydEJlYWNvbkRpc2NvdmVyeTpNQyxzdGFydEJsdWV0b290aERldmljZXNEaXNjb3Zlcnk6YkMsc3RhcnRDb21wYXNzOkJnLHN0YXJ0TG9jYXRpb25VcGRhdGU6Z08sc3RhcnRQdWxsRG93blJlZnJlc2g6T08sc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOllDLHN0b3BBY2NlbGVyb21ldGVyOkZnLHN0b3BCZWFjb25EaXNjb3Zlcnk6TEMsc3RvcEJsdWV0b290aERldmljZXNEaXNjb3Zlcnk6eUMsc3RvcENvbXBhc3M6TWcsc3RvcExvY2F0aW9uVXBkYXRlOnBPLHN0b3BQdWxsRG93blJlZnJlc2g6UE8sc3dpdGNoVGFiOlFOLHN5bmNEYXRhVG9HbG9iYWw6WE8sdW5QcmVsb2FkUGFnZTp0ayx1cGxvYWRGaWxlOkRULHVweDJweDpqXyx2aWJyYXRlTG9uZzpjQyx2aWJyYXRlU2hvcnQ6bEMsd2VleEdldFN5c3RlbUluZm9TeW5jOmpjLHdyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTpOQ307bGV0IGlrPXEuZXh0ZW5kKCQse3B1Ymxpc2hIYW5kbGVyOm9rfSk7ZnVuY3Rpb24gb2soZSx0LG4pe3Q9SlNPTi5zdHJpbmdpZnkodCkscS5pc0FycmF5KG4pfHwobj1bbl0pO2xldCByPWB0eXBlb2YgVW5pVmlld0pTQnJpZGdlICE9PSAndW5kZWZpbmVkJyAmJiBVbmlWaWV3SlNCcmlkZ2Uuc3Vic2NyaWJlSGFuZGxlcigiJHtlfSIsJHt0fSxfX1BBR0VfSURfXylgO24uZm9yRWFjaChzPT57bGV0IHU9U3RyaW5nKHMpLHA9by53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHUpO3AmJnAuZXZhbEpTKHIucmVwbGFjZSgiX19QQUdFX0lEX18iLHUpKX0pfWZ1bmN0aW9uIGFrKCl7bGV0e3RhYkJhcjplfT1JO2lmKCEoZSYmZS5saXN0JiZlLmxpc3QubGVuZ3RoKSlyZXR1cm47bGV0e2VudHJ5UGFnZVBhdGg6bn09STtlLnNlbGVjdGVkSW5kZXg9MDtsZXQgcj1lLmxpc3QuZmluZEluZGV4KHM9PnMucGFnZVBhdGg9PT1uKTtTaS5pbml0KGUsKHMsdSk9PntSLnN3aXRjaFRhYih7dXJsOm5lLmFkZExlYWRpbmdTbGFzaChzLnBhZ2VQYXRoKSxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3MoKXtlcihuZS5PTl9UQUJfSVRFTV9UQVAse2luZGV4OnUsdGV4dDpzLnRleHQscGFnZVBhdGg6cy5wYWdlUGF0aH0pfX0pfSksciE9PS0xJiYoZS5zZWxlY3RlZEluZGV4PXIsciE9PTAmJlNpLnN3aXRjaFRhYihuKSl9ZnVuY3Rpb24gc2soKXtsZXQgZT1vLmdsb2JhbEV2ZW50LHQ9Zi5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLHtlbWl0Om4scHVibGlzaEhhbmRsZXI6cn09ZnQ7Zi5jb25maWcucHJlbG9hZD9vLmtleS5hZGRFdmVudExpc3RlbmVyKG5zLGRpKTplLmFkZEV2ZW50TGlzdGVuZXIoInNwbGFzaGNsb3NlZCIsKCk9PntvLmtleS5hZGRFdmVudExpc3RlbmVyKG5zLGRpKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigicGF1c2UiLCgpPT57bihuZS5PTl9BUFBfRU5URVJfQkFDS0dST1VORCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInJlc3VtZSIsKCk9PntsZXQgdT15cygpO3UmJnUudXNlckFjdGlvbiYmTm8odSksbihuZS5PTl9BUFBfRU5URVJfRk9SRUdST1VORCxMaSgpKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigidWlzdHlsZWNoYW5nZSIsZnVuY3Rpb24odSl7bGV0IHA9e3RoZW1lOnUudWlzdHlsZX07bihuZS5PTl9USEVNRV9DSEFOR0UscCkscihuZS5PTl9USEVNRV9DSEFOR0UscCxRYSgpKSxLQSgpfSk7bGV0IHM9MDtlLmFkZEV2ZW50TGlzdGVuZXIoIktleWJvYXJkSGVpZ2h0Q2hhbmdlIixmdW5jdGlvbih1KXtzIT09dS5oZWlnaHQmJihzPXUuaGVpZ2h0LG4obmUuT05fS0VZQk9BUkRfSEVJR0hUX0NIQU5HRSx7aGVpZ2h0OnN9KSl9KSx0LmFkZEV2ZW50TGlzdGVuZXIoV1AsZnVuY3Rpb24odSl7dSYmdS5ldmVudCYmcFAodS5ldmVudCx1LmRhdGEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsc3YpLGUuYWRkRXZlbnRMaXN0ZW5lcigiV2Vidmlld1Bvc3RNZXNzYWdlIixzdil9ZnVuY3Rpb24gc3Yoe2RhdGE6ZX0pe2UmJmUudHlwZSYmZnQuc3Vic2NyaWJlSGFuZGxlcigicGx1c01lc3NhZ2UuIitlLnR5cGUsZS5hcmdzKX1mdW5jdGlvbiBsdihlLHQsbj0hMSl7ZnQuc3Vic2NyaWJlKCJwbHVzTWVzc2FnZS4iK2UsdCxuKX1mdW5jdGlvbiBsayhlKXtweShlLiQpO2xldHtlbnRyeVBhZ2VQYXRoOnQsZW50cnlQYWdlUXVlcnk6bixyZWZlcnJlckluZm86cn09SSxzPW9pKHtwYXRoOnQscXVlcnk6bixyZWZlcnJlckluZm86cn0pO2VyKGUsbmUuT05fTEFVTkNILHMpLGVyKGUsbmUuT05fU0hPVyxzKTtsZXQgdT1mLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRBcHBTdGF0ZTsodSYmTnVtYmVyKHUoKSkpPT09MiYmZXIoZSxuZS5PTl9ISURFLHMpfWZ1bmN0aW9uIGN2KGUpe3JldHVybiBlPWUucmVwbGFjZSgvXC8kLywiIiksZS5pbmRleE9mKCJfIik9PT0wP28uaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKTplfWZ1bmN0aW9uIGNrKCl7bGV0IGU9Y3YoZ28pLHQ9Y3YoWW4pLG49dC5zcGxpdCgiLyIpO24ucG9wKCk7bGV0IHI9bi5qb2luKCIvIik7by5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKG8uaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbShyKSxzPT57cy5jcmVhdGVSZWFkZXIoKS5yZWFkRW50cmllcyhmdW5jdGlvbihwKXtsZXQgUz1wO1MmJlMubGVuZ3RoJiZTLmZvckVhY2goZnVuY3Rpb24oVSl7VS5pc0RpcmVjdG9yeSYmVS5mdWxsUGF0aC5pbmRleE9mKGUpPT09MCYmVS5mdWxsUGF0aC5pbmRleE9mKHQpIT09MCYmVS5yZW1vdmVSZWN1cnNpdmVseSgpfSl9KX0pfWxldCB1dj0wLG1jPTAsTHU9bnVsbCxrbD1udWxsO2Z1bmN0aW9uIHVrKGUsdCl7aWYoTHU9bnVsbCxrbCYmKGIoa2wpLGtsPW51bGwpLGUudHlwZT09PSJvbkZvY3VzIilpZihtYz4wKWUuZGV0YWlsLmhlaWdodD1tYztlbHNle2tsPUMoZnVuY3Rpb24oKXtlLmRldGFpbC5oZWlnaHQ9bWMsdChlKX0sdXYpLEx1PWZ1bmN0aW9uKCl7a2wmJihiKGtsKSxrbD1udWxsKSxlLmRldGFpbC5oZWlnaHQ9bWMsdChlKX07cmV0dXJufXQoZSl9ZnVuY3Rpb24gZmsoKXt1dj1vLm9zLm5hbWUudG9Mb3dlckNhc2UoKT09PSJhbmRyb2lkIj8zMDA6NzAwLGZ0Lm9uKG5lLk9OX0tFWUJPQVJEX0hFSUdIVF9DSEFOR0UsdD0+e2lmKG1jPXQuaGVpZ2h0LG1jPjApe2xldCBuPUx1O0x1PW51bGwsbiYmbigpfX0pfWZ1bmN0aW9uIGRrKGUsdCxuKXtsZXQgcj10LnR5cGU7cj09PSJvbkZvY3VzInx8cj09PSJvbkJsdXIiP3VrKHQscz0+e24uZmlyZUV2ZW50KGUscyl9KTpuLmZpcmVFdmVudChlLHQpfWZ1bmN0aW9uIGhrKGUsdCl7bGV0IG49UG8ocGFyc2VJbnQodCkpO2lmKCFuKXJldHVybjtsZXQgcj1uLl9fcGFnZV9jb250YWluZXJfXztlLmZvckVhY2gocz0+e3N3aXRjaChzWzBdKXtjYXNlIG5lLkFDVElPTl9UWVBFX0VWRU5UOmRrKHNbMV0sc1syXSxyKTticmVha319KX1sZXQgZnY9e307ZnVuY3Rpb24gZ2soZSx0LG4pe2xldHthZHBpZDpyLHdpZHRoOnN9PWUsdT1yKyItIitzLHA9ZnZbdV07aWYocCYmcC5sZW5ndGg+MCl7dChwLnNwbGljZSgwLDEpWzBdKTtyZXR1cm59by5hZC5nZXRBZHMoZSxTPT57bGV0IFU9Uy5hZHM7dChVLnNwbGljZSgwLDEpWzBdKSxmdlt1XT1wP3AuY29uY2F0KFUpOlV9LFM9PntuKHtlcnJDb2RlOlMuY29kZSxlcnJNc2c6Uy5tZXNzYWdlfSl9KX1mdW5jdGlvbiBwaygpe3goImdldEFkRGF0YSIsKGUsdCk9PntnayhlLG49Pnt0KHtjb2RlOjAsZGF0YTpufSl9LG49Pnt0KHtjb2RlOjEsbWVzc2FnZTpufSl9KX0pfWxldCB2az1bInN3aXRjaFRhYiIsInJlTGF1bmNoIiwicmVkaXJlY3RUbyIsIm5hdmlnYXRlVG8iLCJuYXZpZ2F0ZUJhY2siXTtmdW5jdGlvbiBtaygpe3ZrLmZvckVhY2goZT0+e3goZSx0PT57UltlXShxLmV4dGVuZCh0LHtmYWlsKG4pe2NvbnNvbGUuZXJyb3Iobi5lcnJNc2cpfX0pKX0pfSl9bGV0IGR2PSExO2Z1bmN0aW9uIF9rKGUsdCl7bGV0IG49dD09PSIxIjtpZighKG4mJmR2KSl7aWYobj8oZHY9ITAsSHAoby53ZWJ2aWV3LmdldExhdW5jaFdlYnZpZXcoKSkpOmVvfHxIcChvLndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCkpLCFlby5sb2FkZWQpe2lmKGVvLmlkIT09dClyZXR1cm4gY29uc29sZS5lcnJvcihgd2Vidmlld1JlYWR5WyR7ZW8uaWR9XVske3R9XSBub3QgbWF0Y2hgKTtlby5sb2FkZWQ9ITB9ZnQuZW1pdCh2YysiLiIrdCksbiYmYmsoKX19ZnVuY3Rpb24gYmsoKXtsZXR7YXV0b2Nsb3NlOmUsYWx3YXlzU2hvd0JlZm9yZVJlbmRlcjp0fT1JLnNwbGFzaHNjcmVlbjtlJiYhdCYmby5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKTtsZXQgbj1uZS5hZGRMZWFkaW5nU2xhc2goSS5lbnRyeVBhZ2VQYXRoKSxyPUtpKG4pO2lmKCFyLm1ldGEuaXNOVnVlKXtsZXQgcz17dXJsOm4rKEkuZW50cnlQYWdlUXVlcnl8fCIiKSxvcGVuVHlwZToiYXBwTGF1bmNoIn0sdT17cmVzb2x2ZSgpe30scmVqZWN0KCl7fX07cmV0dXJuIHIubWV0YS5pc1RhYkJhcj9hdihzLHUpOm92KHMsdSl9fWZ1bmN0aW9uIHlrKGUsdCl7bGV0IG49UG8ocGFyc2VJbnQodCkpO24mJihuLl9fdW5pYXBwX3dlYnZpZXc9ITApfWZ1bmN0aW9uIEVrKGUsdCl7bGV0IG49UG8ocGFyc2VJbnQodCkpO24mJmRlbGV0ZSBuLl9fdW5pYXBwX3dlYnZpZXd9bGV0IFNrPSh7bmFtZTplLGFyZzp0fSxuKT0+e2U9PT0icG9zdE1lc3NhZ2UiP3drKG5bMF0sdCk6UltlXShxLmV4dGVuZCh0LHtmYWlsKHIpe2NvbnNvbGUuZXJyb3Ioci5lcnJNc2cpfX0pKX07ZnVuY3Rpb24gd2soZSx0KXtsZXQgbj1BTigid2ViLXZpZXciLHBhcnNlSW50KGUpKTtuJiZuLmRpc3BhdGNoRXZlbnQobmUuY3JlYXRlVW5pRXZlbnQoe3R5cGU6Im9uTWVzc2FnZSIsdGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksY3VycmVudFRhcmdldDpPYmplY3QuY3JlYXRlKG51bGwpLGRldGFpbDp7ZGF0YTpbdF19fSkpfWZ1bmN0aW9uIEFrKHtub2RlSWQ6ZSxvd25lcklkOnQsbWV0aG9kOm4sYXJnczpyfSxzKXtsZXQgdT1acChlLHBhcnNlSW50KHMpKTtpZighdSlyZXR1cm47bGV0IHA9Q2sodCx1Ll9fdnVlUGFyZW50Q29tcG9uZW50KTshcHx8IXBbbl18fHBbbl0ocil9ZnVuY3Rpb24gQ2soZSx0KXtpZighdClyZXR1cm4gbnVsbDtpZih0LnVpZD09PWUpcmV0dXJuIHQucHJveHk7bGV0IG49dC5wYXJlbnQ7Zm9yKDtuOyl7aWYobi51aWQ9PT1lKXJldHVybiBuLnByb3h5O249bi5wYXJlbnR9cmV0dXJuIHQucHJveHl9ZnVuY3Rpb24gVGsoKXtsZXR7c3Vic2NyaWJlOmUsc3Vic2NyaWJlSGFuZGxlcjp0LHB1Ymxpc2hIYW5kbGVyOm59PWZ0O2lmKGx2KCJzdWJzY3JpYmVIYW5kbGVyIiwoe3R5cGU6cixkYXRhOnMscGFnZUlkOnV9KT0+e3QocixzLHUpfSksbHYobmUuV0VCX0lOVk9LRV9BUFBTRVJWSUNFLCh7ZGF0YTpyLHdlYnZpZXdJZHM6c30pPT57U2socixzKX0pLEkucmVuZGVyZXIhPT0ibmF0aXZlIil7ZSh2YyxfayksZShscCxoayksRSgpLHBrKCksbWsoKSxlKEdPLHlrKSxlKFlPLEVrKSxlKG5lLk9OX1dYU19JTlZPS0VfQ0FMTF9NRVRIT0QsQWspO2xldCByPUtpKG5lLmFkZExlYWRpbmdTbGFzaChJLmVudHJ5UGFnZVBhdGgpKTtyJiYhci5tZXRhLmlzTlZ1ZSYmbih2Yyx7fSwxKX19bGV0IF9jLFpmPXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBPayh7YWxsb3dEZWZhdWx0OmU9ITF9PXt9KXtpZihfYylyZXR1cm4gX2M7aWYoZSlyZXR1cm4gWmY7Y29uc29sZS5lcnJvcigiW3dhcm5dOiBnZXRBcHAoKSBmYWlsZWQuIExlYXJuIG1vcmU6IGh0dHBzOi8vdW5pYXBwLmRjbG91ZC5pby9jb2xsb2NhdGlvbi9mcmFtZS93aW5kb3c/aWQ9Z2V0YXBwLiIpfWZ1bmN0aW9uIFBrKGUpe2lmKFIuVnVleCYmZS4kc3RvcmUpe2xldHt1c2VTdG9yZTp0fT1SLlZ1ZXg7Ui5WdWV4LnVzZVN0b3JlPW49Pm4/dChuKTplLiRzdG9yZX13YShlKSxfYz1lLHV0KF9jKSxxLmV4dGVuZChfYyxaZiksYnQoX2MsWmYuZ2xvYmFsRGF0YSksTWUoKSxydigpLGFrKCksc2soKSxmaygpLFRrKCksbGsoZSksQyhjaywxZTQpLEkucmVhZHk9ITB9dmFyIE5rPXt1bmk6cmssZ2V0QXBwOk9rLGdldEN1cnJlbnRQYWdlczpVYSxfX2RlZmluZVBhZ2U6TE4sX19yZWdpc3RlckFwcDpQayxfX3JlZ2lzdGVyUGFnZTpLYyxVbmlTZXJ2aWNlSlNCcmlkZ2U6aWt9O3JldHVybiBOa30oU3QsR3QsXyk7WXQ9WXQuZGVmYXVsdHx8WXQ7bGV0IFI9WXQudW5pLE90PVl0LmdldEFwcCxVbj1ZdC5nZXRDdXJyZW50UGFnZXMsZnQ9WXQuVW5pU2VydmljZUpTQnJpZGdlO3JldHVybiBZdH12YXIgWnY9UzEoQzEpO2Z1bmN0aW9uIFQxKGYpe3JldHVybiBmLmxlbmd0aD09PTA/bnVsbDpmLnBvcCgpfWZ1bmN0aW9uIE8xKGYpe3JldHVybiBmLmxlbmd0aD09PTA/bnVsbDpmLnNoaWZ0KCl9ZnVuY3Rpb24gUDEoZixvKXtsZXQgZD1mLmZpbmRJbmRleChvKTtyZXR1cm4gZDwwP251bGw6ZltkXX1mdW5jdGlvbiBOMShmLG8pe2xldCBkPWYuZmluZExhc3RJbmRleChvKTtyZXR1cm4gZDwwP251bGw6ZltkXX1mdW5jdGlvbiBrMShmLG8pe3JldHVybiBvPC1mLmxlbmd0aHx8bz49Zi5sZW5ndGg/bnVsbDpmLmF0KG8pfXZhciBiZDsoZnVuY3Rpb24oZil7Zi5VVFNKU09OT2JqZWN0PSJVVFNKU09OT2JqZWN0IixmLkpTT049IkpTT04iLGYuVVRTPSJVVFMiLGYuREVGSU5FX0NPTVBPTkVOVD0iZGVmaW5lQ29tcG9uZW50IixmLlZVRT0idnVlIixmLkdMT0JBTF9USElTPSJnbG9iYWxUaGlzIixmLlVUU19UWVBFPSJVVFNUeXBlIixmLlVUU19NRVRBREFUQT0iJFVUU01ldGFkYXRhJCIsZi5URU1QX1VUU19NRVRBREFUQT0iJFRlbXBVVFNNZXRhZGF0YSQiLGYuSlNPTl9GSUVMRD0iSlNPTl9GSUVMRCJ9KShiZHx8KGJkPXt9KSk7dmFyIFF1OyhmdW5jdGlvbihmKXtmW2YuQ0xBU1M9MF09IkNMQVNTIixmW2YuSU5URVJGQUNFPTFdPSJJTlRFUkZBQ0UiLGZbZi5UWVBFPTJdPSJUWVBFIn0pKFF1fHwoUXU9e30pKTtmdW5jdGlvbiBYdihmKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGYpLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gUXYoZil7aWYoZj09bnVsbHx8dHlwZW9mIGYhPSJvYmplY3QiKXJldHVybiExO2xldCBvPU9iamVjdC5nZXRQcm90b3R5cGVPZihmKTtyZXR1cm4gbz09PU9iamVjdC5wcm90b3R5cGV8fG89PT1udWxsfXZhciB0dT1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKG8pe3N1cGVyKG8pfX07ZnVuY3Rpb24gSTEoZil7cmV0dXJuISEoZiYmZi5raW5kIGluIFF1JiZmLmludGVyZmFjZXMpfWZ1bmN0aW9uIGVtKGYpe3JldHVybiFmfHxmPT09T2JqZWN0LnByb3RvdHlwZX12YXIgdG09YmQuVVRTX01FVEFEQVRBO2Z1bmN0aW9uIFIxKGYpe2xldCBvPXRtIGluIGY/Zlt0bV06e30sZD1bXTtJMShvKT9kPW8uaW50ZXJmYWNlc3x8W106ZD1bXTtsZXQgXz1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZik7cmV0dXJuIGVtKF8pfHxkLnB1c2goXy5jb25zdHJ1Y3RvciksZH1mdW5jdGlvbiBubShmLG8sZD1bXSl7cmV0dXJuIGVtKGYpPyExOmY9PT1vPyEwOihkLnB1c2goZiksUjEoZikuc29tZShDPT5kLmluY2x1ZGVzKEMpPyExOm5tKEMsbyxkKSkpfWZ1bmN0aW9uIHgxKGYsbyl7bGV0IGQ9ZiBpbnN0YW5jZW9mIG87aWYoZHx8dHlwZW9mIGYhPSJvYmplY3QiKXJldHVybiBkO2xldCBfPU9iamVjdC5nZXRQcm90b3R5cGVPZihmKS5jb25zdHJ1Y3RvcjtyZXR1cm4gbm0oXyxvKX1mdW5jdGlvbiBybShmKXtyZXR1cm4gZj09PU51bWJlcnx8Zj09PVN0cmluZ3x8Zj09PUJvb2xlYW59ZnVuY3Rpb24gaW0oZil7cmV0dXJuIGY9PT0iVW5rbm93biJ9ZnVuY3Rpb24gb20oZil7cmV0dXJuIGY9PT0iQW55In1mdW5jdGlvbiB5ZChmKXtyZXR1cm4gZiYmZi5wcm90b3R5cGUmJmYucHJvdG90eXBlIGluc3RhbmNlb2YgSXN9ZnVuY3Rpb24gRWQoZixvLGQ9ITEpe3JldHVybiBmPT1udWxsP251bGw6cm0obyl8fGltKG8pfHxvbShvKT9mOm89PT1BcnJheT9uZXcgQXJyYXkoLi4uZik6bmV3IG8oZix2b2lkIDAsZCl9dmFyIElzPWNsYXNze3N0YXRpYyBnZXQkVVRTTWV0YWRhdGEkKC4uLm8pe3JldHVybntraW5kOlF1LlRZUEUsaW50ZXJmYWNlczpbXSxmaWVsZHM6e319fWdldCAkVVRTTWV0YWRhdGEkKCl7cmV0dXJuIElzLmdldCRVVFNNZXRhZGF0YSQoKX1zdGF0aWMgd2l0aEdlbmVyaWNzKG8sZCxfPSExKXtpZihfKXtsZXQgQz1kLmZpbmQoYj0+IShiPT09QXJyYXl8fHJtKGIpfHxpbShiKXx8b20oYil8fGI9PT1VVFNKU09OT2JqZWN0fHxiLnByb3RvdHlwZSYmYi5wcm90b3R5cGUgaW5zdGFuY2VvZiBJcykpO2lmKEMpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmljIGlzIG5vdCBVVFNUeXBlIG9yIEFycmF5IG9yIFVUU0pTT05PYmplY3Qgb3IgYmFzZSB0eXBlLCBnZW5lcmljOiAiK0MpfXJldHVybiBvPT09QXJyYXk/Y2xhc3MgZXh0ZW5kcyBJc3tjb25zdHJ1Y3RvcihiLGc9ITEpe2lmKCFBcnJheS5pc0FycmF5KGIpKXRocm93IG5ldyB0dShgRmFpbGVkIHRvIGNvbnRydWN0IHR5cGUsICR7Yn0gaXMgbm90IGFuIGFycmF5YCk7c3VwZXIoKTtyZXR1cm4gYi5tYXAoeT0+RWQoeSxkWzBdLGcpKX19Om89PT1NYXB8fG89PT1XZWFrTWFwP2NsYXNzIGV4dGVuZHMgSXN7Y29uc3RydWN0b3IoYixnPSExKXtpZihiPT1udWxsfHx0eXBlb2YgYiE9Im9iamVjdCIpdGhyb3cgbmV3IHR1KGBGYWlsZWQgdG8gY29udHJ1Y3QgdHlwZSwgJHtifSBpcyBub3QgYW4gb2JqZWN0YCk7c3VwZXIoKTtsZXQgeT1uZXcgbztmb3IobGV0IEkgaW4gYil5LnNldChFZChJLGRbMF0sZyksRWQoYltJXSxkWzFdLGcpKTtyZXR1cm4geX19OnlkKG8pP2NsYXNzIGFtIGV4dGVuZHMgb3tzdGF0aWMgZ2V0JFVUU01ldGFkYXRhJCgpe3JldHVybiBvLmdldCRVVFNNZXRhZGF0YSQoLi4uZCl9Y29uc3RydWN0b3IoYixnPWFtLmdldCRVVFNNZXRhZGF0YSQoKSx5PSExKXtzdXBlcihiLGcseSl9fTpvfWNvbnN0cnVjdG9yKCl7fXN0YXRpYyBpbml0UHJvcHMobyxkLF89ITEpe2xldCBDPXt9O2lmKCFkLmZpZWxkcylyZXR1cm4gQztmb3IobGV0IGIgaW4gZC5maWVsZHMpe2xldHt0eXBlOmcsb3B0aW9uYWw6eSxqc29uRmllbGQ6SX09ZC5maWVsZHNbYl0sQmU9XyYmSXx8YjtpZihvW0JlXT09bnVsbClpZih5KXtDW2JdPW51bGw7Y29udGludWV9ZWxzZSB0aHJvdyBuZXcgdHUoYEZhaWxlZCB0byBjb250cnVjdCB0eXBlLCBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5OiAke2J9YCk7aWYoeWQoZykpQ1tiXT1uZXcgZyhvW0JlXSx2b2lkIDAsXyk7ZWxzZSBpZihnPT09QXJyYXkpe2lmKCFBcnJheS5pc0FycmF5KG9bQmVdKSl0aHJvdyBuZXcgdHUoYEZhaWxlZCB0byBjb250cnVjdCB0eXBlLCBwcm9wZXJ0eSAke2J9IGlzIG5vdCBhbiBhcnJheWApO0NbYl09b1tCZV0ubWFwKFN0PT5TdD09bnVsbD9udWxsOlN0KX1lbHNlIENbYl09b1tCZV19cmV0dXJuIEN9fSxlZj1KU09OO2Z1bmN0aW9uIHRmKGYsbyl7bGV0IGQ9WHYoZik7aWYoZj09PW51bGx8fGQhPT0ib2JqZWN0IiYmZCE9PSJhcnJheSIpcmV0dXJuIGY7aWYob3x8bz09PVVUU0pTT05PYmplY3QpdHJ5e3JldHVybiBuZXcgbyhmLHZvaWQgMCwhMCl9Y2F0Y2goXyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoXyksbnVsbH1yZXR1cm4gZD09PSJhcnJheSI/Zi5tYXAoXz0+dGYoXykpOmQ9PT0ib2JqZWN0Ij9uZXcgVVRTSlNPTk9iamVjdChmKTpmfXZhciBCMT17cGFyc2U6KGYsbyxkKT0+e28mJih5ZChvKXx8bz09PVVUU0pTT05PYmplY3QpJiYoZD1vLG89dm9pZCAwKTt0cnl7bGV0IF89ZWYucGFyc2UoZixvKTtyZXR1cm4gdGYoXyxkKX1jYXRjaChfKXtyZXR1cm4gY29uc29sZS5lcnJvcihfKSxudWxsfX0scGFyc2VBcnJheShmLG8pe3RyeXtsZXQgZD1lZi5wYXJzZShmKTtyZXR1cm4gQXJyYXkuaXNBcnJheShkKT90ZihkLG8/SXMud2l0aEdlbmVyaWNzKEFycmF5LFtvXSwhMCk6dm9pZCAwKTpudWxsfWNhdGNoKGQpe3JldHVybiBjb25zb2xlLmVycm9yKGQpLG51bGx9fSxwYXJzZU9iamVjdChmLG8pe3RyeXtsZXQgZD1lZi5wYXJzZShmKTtyZXR1cm4gQXJyYXkuaXNBcnJheShkKT9udWxsOnRmKGQsbyl9Y2F0Y2goZCl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoZCksbnVsbH19LHN0cmluZ2lmeTpmPT5lZi5zdHJpbmdpZnkoZil9O2Z1bmN0aW9uIE0xKGYsbyl7cmV0dXJuIGYuaGFzKG8pP2YuZ2V0KG8pOm51bGx9ZnVuY3Rpb24gTDEoZixvKXtyZXR1cm4gbzwwfHxvPj1mLmxlbmd0aD9udWxsOmYuY29kZVBvaW50QXQobyl9ZnVuY3Rpb24gRjEoZixvKXtyZXR1cm4gbzwtZi5sZW5ndGh8fG8+PWYubGVuZ3RoP251bGw6Zi5hdChvKX1mdW5jdGlvbiBEMShmLG8pe3JldHVybiBmLmhhcyhvKT9mLmdldChvKTpudWxsfXZhciBWMT17YXJyYXlBdDprMSxhcnJheUZpbmQ6UDEsYXJyYXlGaW5kTGFzdDpOMSxhcnJheVBvcDpUMSxhcnJheVNoaWZ0Ok8xLGlzSW5zdGFuY2VPZjp4MSxVVFNUeXBlOklzLG1hcEdldDpNMSxzdHJpbmdBdDpGMSxzdHJpbmdDb2RlUG9pbnRBdDpMMSx3ZWFrTWFwR2V0OkQxLEpTT046QjF9LHNtPWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IobyxkLF8pe2xldCBDPXt9O3N3aXRjaChBcnJheS5mcm9tKGFyZ3VtZW50cykubGVuZ3RoKXtjYXNlIDA6bz0iIixfPSIiLGQ9MDticmVhaztjYXNlIDE6Xz1vLG89IiIsZD0wO2JyZWFrO2Nhc2UgMjpfPW8sQz1kLGQ9Qy5lcnJDb2RlfHwwLG89Qy5lcnJTdWJqZWN0fHwiIjticmVha31zdXBlcihfKTt0aGlzLm5hbWU9IlVuaUVycm9yIix0aGlzLmVyclN1YmplY3Q9byx0aGlzLmVyckNvZGU9ZCx0aGlzLmVyck1zZz1fLEMuZGF0YSYmKHRoaXMuZGF0YT1DLmRhdGEpLEMuY2F1c2UmJih0aGlzLmNhdXNlPUMuY2F1c2UpfXNldCBlcnJNc2cobyl7dGhpcy5tZXNzYWdlPW99Z2V0IGVyck1zZygpe3JldHVybiB0aGlzLm1lc3NhZ2V9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5lcnJNc2d9dG9KU09OKCl7cmV0dXJue2VyclN1YmplY3Q6dGhpcy5lcnJTdWJqZWN0LGVyckNvZGU6dGhpcy5lcnJDb2RlLGVyck1zZzp0aGlzLmVyck1zZyxkYXRhOnRoaXMuZGF0YSxjYXVzZTp0aGlzLmNhdXNlJiZ0eXBlb2YgdGhpcy5jYXVzZS50b0pTT049PSJmdW5jdGlvbiI/dGhpcy5jYXVzZS50b0pTT04oKTp0aGlzLmNhdXNlfX19O2Z1bmN0aW9uIFUxKGYpe2xldCBvPVsiX3Jlc29sdmVLZXlQYXRoIiwiX2dldFZhbHVlIiwidG9KU09OIiwiZ2V0Iiwic2V0IiwiZ2V0QW55IiwiZ2V0U3RyaW5nIiwiZ2V0TnVtYmVyIiwiZ2V0Qm9vbGVhbiIsImdldEpTT04iLCJnZXRBcnJheSIsInRvTWFwIiwiZm9yRWFjaCJdLGQ9e307Zm9yKGxldCBfPTA7XzxvLmxlbmd0aDtfKyspe2xldCBDPW9bX107ZFtDXT17ZW51bWVyYWJsZTohMSx2YWx1ZTpmW0NdfX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhmLGQpfWZ1bmN0aW9uIGxtKGYsbyxkKXtRdihkKT9mW29dPW5ldyBTZChkKTpYdihkKT09PSJhcnJheSI/ZltvXT1kLm1hcChfPT5RdihfKT9uZXcgU2QoXyk6Xyk6ZltvXT1kfXZhciBTZD1jbGFzcyBjbXtzdGF0aWMga2V5cyhvKXtyZXR1cm4gT2JqZWN0LmtleXMobyl9c3RhdGljIGFzc2lnbihvLC4uLmQpe2ZvcihsZXQgXz0wO188ZC5sZW5ndGg7XysrKXtsZXQgQz1kW19dO2ZvcihsZXQgYiBpbiBDKW9bYl09Q1tiXX1yZXR1cm4gb31jb25zdHJ1Y3RvcihvPXt9KXtpZihvIGluc3RhbmNlb2YgTWFwKW8uZm9yRWFjaCgoZCxfKT0+e2xtKHRoaXMsXyxkKX0pO2Vsc2UgZm9yKGxldCBkIGluIG8paWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sZCkpe2xldCBfPW9bZF07bG0odGhpcyxkLF8pfVUxKHRoaXMpfV9yZXNvbHZlS2V5UGF0aChvKXtsZXQgZD0iIixfPVtdLEM9ITE7Zm9yKGxldCBiPTA7YjxvLmxlbmd0aDtiKyspe2xldCBnPW9bYl07c3dpdGNoKGcpe2Nhc2UiLiI6ZC5sZW5ndGg+MCYmKF8ucHVzaChkKSxkPSIiKTticmVhaztjYXNlIlsiOntDPSEwLGQubGVuZ3RoPjAmJihfLnB1c2goZCksZD0iIik7YnJlYWt9Y2FzZSJdIjppZihDKXtpZihkLmxlbmd0aD4wKXtsZXQgeT1kWzBdLEk9ZFtkLmxlbmd0aC0xXTtpZih5PT09JyInJiZJPT09JyInfHx5PT09IiciJiZJPT09IicifHx5PT09ImAiJiZJPT09ImAiKWlmKGQubGVuZ3RoPjIpZD1kLnNsaWNlKDEsLTEpO2Vsc2UgcmV0dXJuW107ZWxzZSBpZighL15cZCskLy50ZXN0KGQpKXJldHVybltdO18ucHVzaChkKSxkPSIifWVsc2UgcmV0dXJuW107Qz0hMX1lbHNlIHJldHVybltdO2JyZWFrO2RlZmF1bHQ6ZCs9ZzticmVha31iPT09by5sZW5ndGgtMSYmZC5sZW5ndGg+MCYmKF8ucHVzaChkKSxkPSIiKX1yZXR1cm4gX31fZ2V0VmFsdWUobyl7bGV0IGQ9dGhpcy5fcmVzb2x2ZUtleVBhdGgobyk7aWYoZC5sZW5ndGg9PT0wKXJldHVybiBudWxsO2xldCBfPXRoaXM7Zm9yKGxldCBDPTA7QzxkLmxlbmd0aDtDKyspe2xldCBiPWRbQ107aWYoXyBpbnN0YW5jZW9mIE9iamVjdClfPV9bYl07ZWxzZSByZXR1cm4gbnVsbH1yZXR1cm4gX31nZXQobyl7cmV0dXJuIHRoaXMuX2dldFZhbHVlKG8pfXNldChvLGQpe3RoaXNbb109ZH1nZXRBbnkobyl7cmV0dXJuIHRoaXMuX2dldFZhbHVlKG8pfWdldFN0cmluZyhvKXtsZXQgZD10aGlzLl9nZXRWYWx1ZShvKTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2Q6bnVsbH1nZXROdW1iZXIobyl7bGV0IGQ9dGhpcy5fZ2V0VmFsdWUobyk7cmV0dXJuIHR5cGVvZiBkPT0ibnVtYmVyIj9kOm51bGx9Z2V0Qm9vbGVhbihvKXtsZXQgZD10aGlzLl9nZXRWYWx1ZShvKTtyZXR1cm4gdHlwZW9mIGQ9PSJib29sZWFuIj9kOm51bGx9Z2V0SlNPTihvKXtsZXQgZD10aGlzLl9nZXRWYWx1ZShvKTtyZXR1cm4gZCBpbnN0YW5jZW9mIE9iamVjdD9uZXcgY20oZCk6bnVsbH1nZXRBcnJheShvKXtsZXQgZD10aGlzLl9nZXRWYWx1ZShvKTtyZXR1cm4gZCBpbnN0YW5jZW9mIEFycmF5P2Q6bnVsbH10b01hcCgpe2xldCBvPW5ldyBNYXA7Zm9yKGxldCBkIGluIHRoaXMpby5zZXQoZCx0aGlzW2RdKTtyZXR1cm4gb31mb3JFYWNoKG8pe2ZvcihsZXQgZCBpbiB0aGlzKW8odGhpc1tkXSxkKX19O2Z1bmN0aW9uICQxKCl7aWYodHlwZW9mIGdsb2JhbFRoaXMhPSJ1bmRlZmluZWQiKXJldHVybiBnbG9iYWxUaGlzO2lmKHR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIilyZXR1cm4gc2VsZjtpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIilyZXR1cm4gd2luZG93O2lmKHR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiKXJldHVybiBnbG9iYWw7ZnVuY3Rpb24gZigpe3JldHVybiB0aGlzfXJldHVybiB0eXBlb2YgZigpIT0idW5kZWZpbmVkIj9mKCk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9KCl9dmFyIHdkPSQxKCk7d2QuVVRTSlNPTk9iamVjdD1TZDt3ZC5VbmlFcnJvcj1zbTt3ZC5VVFM9VjE7ZnVuY3Rpb24gdW0oZil7fXZhciBmbT1mPT57fTt2YXIgZG09Zj0+e307dmFyIGhtPWY9PntsZXR7cmVnaXN0ZXJVVFNJbnRlcmZhY2U6byxpbml0VVRTUHJveHlDbGFzczpkLGluaXRVVFNQcm94eUZ1bmN0aW9uOl8saW5pdFVUU1BhY2thZ2VOYW1lOkMsaW5pdFVUU0luZGV4Q2xhc3NOYW1lOmIsaW5pdFVUU0NsYXNzTmFtZTpnfT1mLHk9IkRDbG91ZFVuaUNyZWF0ZVJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXIiLEk9InVuaS1jcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyIixCZT0iYnVpbHQtaW4iLFN0PSIiLEd0PSEwLFl0PUMoeSxHdCksUj1iKHksR3QpO28oIlJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXJPcHRpb25zIixPYmplY3QuYXNzaWduKHttb2R1bGVOYW1lOkksbW9kdWxlVHlwZTpCZSxlcnJNc2c6U3QscGFja2FnZTpZdCxjbGFzczpnKHksIlJlcXVlc3RQZXJtaXNzaW9uTGlzdGVuZXJCeUpzUHJveHkiLEd0KX0se21ldGhvZHM6e29uUmVxdWVzdEJ5SnM6e2FzeW5jOiExLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV19LG9uQ29uZmlybUJ5SnM6e2FzeW5jOiExLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJjYWxsYmFjayIsdHlwZToiVVRTQ2FsbGJhY2sifV19LG9uQ29tcGxldGVCeUpzOnthc3luYzohMSxrZWVwQWxpdmU6ITEscGFyYW1zOlt7bmFtZToiY2FsbGJhY2siLHR5cGU6IlVUU0NhbGxiYWNrIn1dfSxzdG9wQnlKczp7YXN5bmM6ITEsa2VlcEFsaXZlOiExLHBhcmFtczpbXX19LHByb3BzOltdLHNldHRlcnM6e319KSksZi5jcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyPV8oITEse21vZHVsZU5hbWU6SSxtb2R1bGVUeXBlOkJlLGVyck1zZzpTdCxtYWluOiEwLHBhY2thZ2U6WXQsY2xhc3M6UixuYW1lOiJjcmVhdGVSZXF1ZXN0UGVybWlzc2lvbkxpc3RlbmVyQnlKcyIsa2VlcEFsaXZlOiExLHBhcmFtczpbXSxyZXR1cm46e3R5cGU6ImludGVyZmFjZSIsb3B0aW9uczoiUmVxdWVzdFBlcm1pc3Npb25MaXN0ZW5lck9wdGlvbnMifX0pfTt2YXIgZ209Zj0+e307dmFyIHBtPWY9PntsZXR7cmVnaXN0ZXJVVFNJbnRlcmZhY2U6byxpbml0VVRTUHJveHlDbGFzczpkLGluaXRVVFNQcm94eUZ1bmN0aW9uOl8saW5pdFVUU1BhY2thZ2VOYW1lOkMsaW5pdFVUU0luZGV4Q2xhc3NOYW1lOmIsaW5pdFVUU0NsYXNzTmFtZTpnfT1mLHk9IkRDbG91ZFVuaUV4aXQiLEk9InVuaS1leGl0IixCZT0iYnVpbHQtaW4iLFN0PSIiLEd0PSEwLFl0PUMoeSxHdCksUj1iKHksR3QpO2YuZXhpdD1fKCExLHttb2R1bGVOYW1lOkksbW9kdWxlVHlwZTpCZSxlcnJNc2c6U3QsbWFpbjohMCxwYWNrYWdlOll0LGNsYXNzOlIsbmFtZToiZXhpdEJ5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pRXhpdEV4aXRPcHRpb25zSlNPTk9iamVjdCIsZGVmYXVsdDoiVVRTTnVsbCJ9XSxyZXR1cm46IiJ9KX07dmFyIHZtPWY9PntsZXR7cmVnaXN0ZXJVVFNJbnRlcmZhY2U6byxpbml0VVRTUHJveHlDbGFzczpkLGluaXRVVFNQcm94eUZ1bmN0aW9uOl8saW5pdFVUU1BhY2thZ2VOYW1lOkMsaW5pdFVUU0luZGV4Q2xhc3NOYW1lOmIsaW5pdFVUU0NsYXNzTmFtZTpnfT1mLHk9IkRDbG91ZFVuaUZhY2lhbFJlY29nbml0aW9uVmVyaWZ5IixJPSJGYWNpYWxSZWNvZ25pdGlvblZlcmlmeShcdTVCOUVcdTRFQkFcdThCQTRcdThCQzEpIixCZT0iYnVpbHQtaW4iLFN0PSIiLEd0PSEwLFl0PUMoeSxHdCksUj1iKHksR3QpO2Yuc3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeT1fKCExLHttb2R1bGVOYW1lOkksbW9kdWxlVHlwZTpCZSxlcnJNc2c6U3QsbWFpbjohMCxwYWNrYWdlOll0LGNsYXNzOlIsbmFtZToic3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeUJ5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJmYWNlU3R5bGUiLHR5cGU6IlVUU1NES01vZHVsZXNEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeVN0YXJ0RmFjaWFsUmVjb2duaXRpb25WZXJpZnlPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KSxmLmdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm89XyghMSx7bW9kdWxlTmFtZTpJLG1vZHVsZVR5cGU6QmUsZXJyTXNnOlN0LG1haW46ITAscGFja2FnZTpZdCxjbGFzczpSLG5hbWU6ImdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm9CeUpzIixrZWVwQWxpdmU6ITEscGFyYW1zOltdLHJldHVybjoiIn0pfTt2YXIgbmY9Y2xhc3MgZXh0ZW5kcyBVVFMuVVRTVHlwZXtzdGF0aWMgZ2V0JFVUU01ldGFkYXRhJCgpe3JldHVybntraW5kOjIsZ2V0IGZpZWxkcygpe3JldHVybntkYXRhOnt0eXBlOlN0cmluZyxvcHRpb25hbDohMX19fX19Y29uc3RydWN0b3IobyxkPW5mLmdldCRVVFNNZXRhZGF0YSQoKSxfPSExKXtzdXBlcigpO3RoaXMuX19wcm9wc19fPVVUUy5VVFNUeXBlLmluaXRQcm9wcyhvLGQsXyksdGhpcy5kYXRhPXRoaXMuX19wcm9wc19fLmRhdGEsZGVsZXRlIHRoaXMuX19wcm9wc19ffX0scHM9Y2xhc3MgZXh0ZW5kcyBVVFMuVVRTVHlwZXtzdGF0aWMgZ2V0JFVUU01ldGFkYXRhJCgpe3JldHVybntraW5kOjIsZ2V0IGZpZWxkcygpe3JldHVybntlcnJNc2c6e3R5cGU6U3RyaW5nLG9wdGlvbmFsOiExfX19fX1jb25zdHJ1Y3RvcihvLGQ9cHMuZ2V0JFVUU01ldGFkYXRhJCgpLF89ITEpe3N1cGVyKCk7dGhpcy5fX3Byb3BzX189VVRTLlVUU1R5cGUuaW5pdFByb3BzKG8sZCxfKSx0aGlzLmVyck1zZz10aGlzLl9fcHJvcHNfXy5lcnJNc2csZGVsZXRlIHRoaXMuX19wcm9wc19ffX0scmY9Y2xhc3MgZXh0ZW5kcyBVVFMuVVRTVHlwZXtzdGF0aWMgZ2V0JFVUU01ldGFkYXRhJCgpe3JldHVybntraW5kOjIsZ2V0IGZpZWxkcygpe3JldHVybntmaWxlczp7dHlwZTpVVFMuVVRTVHlwZS53aXRoR2VuZXJpY3MoQXJyYXksW1N0cmluZ10pLG9wdGlvbmFsOiExfX19fX1jb25zdHJ1Y3RvcihvLGQ9cmYuZ2V0JFVUU01ldGFkYXRhJCgpLF89ITEpe3N1cGVyKCk7dGhpcy5fX3Byb3BzX189VVRTLlVUU1R5cGUuaW5pdFByb3BzKG8sZCxfKSx0aGlzLmZpbGVzPXRoaXMuX19wcm9wc19fLmZpbGVzLGRlbGV0ZSB0aGlzLl9fcHJvcHNfX319LG9mPWNsYXNzIGV4dGVuZHMgVVRTLlVUU1R5cGV7c3RhdGljIGdldCRVVFNNZXRhZGF0YSQoKXtyZXR1cm57a2luZDoyLGdldCBmaWVsZHMoKXtyZXR1cm57ZGlnZXN0Ont0eXBlOlN0cmluZyxvcHRpb25hbDohMX0sc2l6ZTp7dHlwZTpOdW1iZXIsb3B0aW9uYWw6ITF9LGVyck1zZzp7dHlwZTpTdHJpbmcsb3B0aW9uYWw6ITF9fX19fWNvbnN0cnVjdG9yKG8sZD1vZi5nZXQkVVRTTWV0YWRhdGEkKCksXz0hMSl7c3VwZXIoKTt0aGlzLl9fcHJvcHNfXz1VVFMuVVRTVHlwZS5pbml0UHJvcHMobyxkLF8pLHRoaXMuZGlnZXN0PXRoaXMuX19wcm9wc19fLmRpZ2VzdCx0aGlzLnNpemU9dGhpcy5fX3Byb3BzX18uc2l6ZSx0aGlzLmVyck1zZz10aGlzLl9fcHJvcHNfXy5lcnJNc2csZGVsZXRlIHRoaXMuX19wcm9wc19ffX0sbnU9Y2xhc3MgZXh0ZW5kcyBVVFMuVVRTVHlwZXtzdGF0aWMgZ2V0JFVUU01ldGFkYXRhJCgpe3JldHVybntraW5kOjIsZ2V0IGZpZWxkcygpe3JldHVybntwYXRoOnt0eXBlOlN0cmluZyxvcHRpb25hbDohMX0sc3RhdHM6e3R5cGU6IlVua25vd24iLG9wdGlvbmFsOiExfX19fX1jb25zdHJ1Y3RvcihvLGQ9bnUuZ2V0JFVUU01ldGFkYXRhJCgpLF89ITEpe3N1cGVyKCk7dGhpcy5fX3Byb3BzX189VVRTLlVUU1R5cGUuaW5pdFByb3BzKG8sZCxfKSx0aGlzLnBhdGg9dGhpcy5fX3Byb3BzX18ucGF0aCx0aGlzLnN0YXRzPXRoaXMuX19wcm9wc19fLnN0YXRzLGRlbGV0ZSB0aGlzLl9fcHJvcHNfX319LGFmPWNsYXNzIGV4dGVuZHMgVVRTLlVUU1R5cGV7c3RhdGljIGdldCRVVFNNZXRhZGF0YSQoKXtyZXR1cm57a2luZDoyLGdldCBmaWVsZHMoKXtyZXR1cm57ZXJyTXNnOnt0eXBlOlN0cmluZyxvcHRpb25hbDohMX0sc3RhdHM6e3R5cGU6VVRTLlVUU1R5cGUud2l0aEdlbmVyaWNzKEFycmF5LFtudV0pLG9wdGlvbmFsOiExfX19fX1jb25zdHJ1Y3RvcihvLGQ9YWYuZ2V0JFVUU01ldGFkYXRhJCgpLF89ITEpe3N1cGVyKCk7dGhpcy5fX3Byb3BzX189VVRTLlVUU1R5cGUuaW5pdFByb3BzKG8sZCxfKSx0aGlzLmVyck1zZz10aGlzLl9fcHJvcHNfXy5lcnJNc2csdGhpcy5zdGF0cz10aGlzLl9fcHJvcHNfXy5zdGF0cyxkZWxldGUgdGhpcy5fX3Byb3BzX199fSxIMT0idW5pLWZpbGVTeXN0ZW1NYW5hZ2VyIixqMT1uZXcgTWFwKFtbMTIwMDAwMiwidHlwZSBlcnJvci4gb25seSBzdXBwb3J0IGJhc2U2NCAvIHV0Zi04Il0sWzEzMDAwMDIsIm5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiXSxbMTMwMDAxMywicGVybWlzc2lvbiBkZW5pZWQiXSxbMTMwMDAyMSwiSXMgYSBkaXJlY3RvcnkiXSxbMTMwMDAyMiwiSW52YWxpZCBhcmd1bWVudCJdLFsxMzAwMDY2LCJkaXJlY3Rvcnkgbm90IGVtcHR5Il0sWzEzMDEwMDMsImlsbGVnYWwgb3BlcmF0aW9uIG9uIGEgZGlyZWN0b3J5Il0sWzEzMDEwMDUsImZpbGUgYWxyZWFkeSBleGlzdHMiXSxbMTMwMDIwMSwic3lzdGVtIGVycm9yIl0sWzEzMDAyMDIsInRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZpbGUgc3RvcmFnZSBsaW1pdCBpcyBleGNlZWRlZCJdLFsxMzAxMTExLCJicm90bGkgZGVjb21wcmVzcyBmYWlsIl0sWzEzMDIwMDMsImludmFsaWQgZmxhZyJdLFsxMzAwMDA5LCJiYWQgZmlsZSBkZXNjcmlwdG9yIl1dKSxnYT1jbGFzcyBleHRlbmRzIFVuaUVycm9ye2NvbnN0cnVjdG9yKG8pe3N1cGVyKCk7dmFyIGQ7dGhpcy5lcnJTdWJqZWN0PUgxLHRoaXMuZXJyQ29kZT1vLHRoaXMuZXJyTXNnPShkPVVUUy5tYXBHZXQoajEsbykpIT1udWxsP2Q6IiJ9fSxtbT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMubW9kZT0wLHRoaXMuc2l6ZT0wLHRoaXMubGFzdEFjY2Vzc2VkVGltZT0wLHRoaXMubGFzdE1vZGlmaWVkVGltZT0wLHRoaXMubUlzRmlsZT0hMX1pc0RpcmVjdG9yeSgpe3JldHVybiF0aGlzLm1Jc0ZpbGV9aXNGaWxlKCl7cmV0dXJuIHRoaXMubUlzRmlsZX10b0xvZygpe3JldHVybiB0aGlzLnRvSlNPTigpfXRvSlNPTigpe2xldCBvPW5ldyBVVFNKU09OT2JqZWN0O3JldHVybiBvLnNldCgibW9kZSIsdGhpcy5tb2RlKSxvLnNldCgic2l6ZSIsdGhpcy5zaXplKSxvLnNldCgibGFzdEFjY2Vzc2VkVGltZSIsdGhpcy5sYXN0QWNjZXNzZWRUaW1lKSxvLnNldCgibGFzdE1vZGlmaWVkVGltZSIsdGhpcy5sYXN0TW9kaWZpZWRUaW1lKSxvfX07ZnVuY3Rpb24gejEoZj1udWxsKXtsZXQgbz1uZXcgbW07cmV0dXJuIG8ubUlzRmlsZT1mLmlzRmlsZSxvLm1vZGU9Zi5tb2RlLG8uc2l6ZT1mLnNpemUsby5sYXN0QWNjZXNzZWRUaW1lPWYubGFzdEFjY2Vzc2VkVGltZSxvLmxhc3RNb2RpZmllZFRpbWU9Zi5sYXN0TW9kaWZpZWRUaW1lLG5ldyBudSh7cGF0aDpmLnBhdGgsc3RhdHM6b30pfWZ1bmN0aW9uIFcxKGY9bnVsbCl7cmV0dXJuIGYubWFwKChvPW51bGwpPT56MShvKSl9dmFyIF9tPWNsYXNze3N0YXQobyl7bmF0aXZlRmlsZU1hbmFnZXIuc3RhdChvLnBhdGgsby5yZWN1cnNpdmUsZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDLGI9bmV3IGFmKHtzdGF0czpXMShkKSxlcnJNc2c6InN0YXQ6b2sifSk7KF89by5zdWNjZXNzKT09bnVsbHx8Xy5jYWxsKG8sYiksKEM9by5jb21wbGV0ZSk9PW51bGx8fEMuY2FsbChvLGIpfSxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEM7bGV0IGI9bmV3IGdhKGQpOyhfPW8uZmFpbCk9PW51bGx8fF8uY2FsbChvLGIpLChDPW8uY29tcGxldGUpPT1udWxsfHxDLmNhbGwobyxiKX0pfWdldEZpbGVJbmZvKG8pe3ZhciBkLF87aWYoby5kaWdlc3RBbGdvcml0aG09PW51bGx8fG8uZGlnZXN0QWxnb3JpdGhtPT1udWxsKW8uZGlnZXN0QWxnb3JpdGhtPSJtZDUiO2Vsc2UgaWYoby5kaWdlc3RBbGdvcml0aG0udG9Mb3dlckNhc2UoKSE9Im1kNSImJm8uZGlnZXN0QWxnb3JpdGhtLnRvTG93ZXJDYXNlKCkhPSJzaGExIil7bGV0IEM9bmV3IGdhKDEzMDAwMjIpO3JldHVybihkPW8uZmFpbCk9PW51bGx8fGQuY2FsbChvLEMpLChfPW8uY29tcGxldGUpPT1udWxsfHxfLmNhbGwobyxDKSxudWxsfW5hdGl2ZUZpbGVNYW5hZ2VyLmdldEZpbGVJbmZvKG8uZmlsZVBhdGgsby5kaWdlc3RBbGdvcml0aG0sZnVuY3Rpb24oQz1udWxsKXt2YXIgYixnLHk9bmV3IG9mKHtzaXplOkMuc2l6ZSxkaWdlc3Q6Qy5kaWdlc3QsZXJyTXNnOiJnZXRGaWxlSW5mbzpvayJ9KTsoYj1vLnN1Y2Nlc3MpPT1udWxsfHxiLmNhbGwobyx5KSwoZz1vLmNvbXBsZXRlKT09bnVsbHx8Zy5jYWxsKG8seSl9LGZ1bmN0aW9uKEM9bnVsbCl7dmFyIGIsZztsZXQgeT1uZXcgZ2EoQyk7KGI9by5mYWlsKT09bnVsbHx8Yi5jYWxsKG8seSksKGc9by5jb21wbGV0ZSk9PW51bGx8fGcuY2FsbChvLHkpfSl9Y29weUZpbGUobyl7bmF0aXZlRmlsZU1hbmFnZXIuY29weUZpbGUoby5zcmNQYXRoLG8uZGVzdFBhdGgsZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDLGI9bmV3IHBzKHtlcnJNc2c6ImNvcHlGaWxlOm9rIn0pOyhfPW8uc3VjY2Vzcyk9PW51bGx8fF8uY2FsbChvLGIpLChDPW8uY29tcGxldGUpPT1udWxsfHxDLmNhbGwobyxiKX0sZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDO2xldCBiPW5ldyBnYShkKTsoXz1vLmZhaWwpPT1udWxsfHxfLmNhbGwobyxiKSwoQz1vLmNvbXBsZXRlKT09bnVsbHx8Qy5jYWxsKG8sYil9KX1yZW5hbWUobyl7bmF0aXZlRmlsZU1hbmFnZXIucmVuYW1lKG8ub2xkUGF0aCxvLm5ld1BhdGgsZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDLGI9bmV3IHBzKHtlcnJNc2c6InJlbmFtZTpvayJ9KTsoXz1vLnN1Y2Nlc3MpPT1udWxsfHxfLmNhbGwobyxiKSwoQz1vLmNvbXBsZXRlKT09bnVsbHx8Qy5jYWxsKG8sYil9LGZ1bmN0aW9uKGQ9bnVsbCl7dmFyIF8sQztsZXQgYj1uZXcgZ2EoZCk7KF89by5mYWlsKT09bnVsbHx8Xy5jYWxsKG8sYiksKEM9by5jb21wbGV0ZSk9PW51bGx8fEMuY2FsbChvLGIpfSl9YWNjZXNzKG8pe25hdGl2ZUZpbGVNYW5hZ2VyLmFjY2VzcyhvLnBhdGgsZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDLGI9bmV3IHBzKHtlcnJNc2c6ImFjY2VzczpvayJ9KTsoXz1vLnN1Y2Nlc3MpPT1udWxsfHxfLmNhbGwobyxiKSwoQz1vLmNvbXBsZXRlKT09bnVsbHx8Qy5jYWxsKG8sYil9LGZ1bmN0aW9uKGQ9bnVsbCl7dmFyIF8sQztsZXQgYj1uZXcgZ2EoZCk7KF89by5mYWlsKT09bnVsbHx8Xy5jYWxsKG8sYiksKEM9by5jb21wbGV0ZSk9PW51bGx8fEMuY2FsbChvLGIpfSl9cmVhZGRpcihvKXtuYXRpdmVGaWxlTWFuYWdlci5yZWFkZGlyKG8uZGlyUGF0aCxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEMsYj1uZXcgcmYoZCk7KF89by5zdWNjZXNzKT09bnVsbHx8Xy5jYWxsKG8sYiksKEM9by5jb21wbGV0ZSk9PW51bGx8fEMuY2FsbChvLGIpfSxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEM7bGV0IGI9bmV3IGdhKGQpOyhfPW8uZmFpbCk9PW51bGx8fF8uY2FsbChvLGIpLChDPW8uY29tcGxldGUpPT1udWxsfHxDLmNhbGwobyxiKX0pfXJtZGlyKG8pe25hdGl2ZUZpbGVNYW5hZ2VyLnJtZGlyKG8uZGlyUGF0aCxvLnJlY3Vyc2l2ZSxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEMsYj1uZXcgcHMoe2Vyck1zZzoicm1kaXI6b2sifSk7KF89by5zdWNjZXNzKT09bnVsbHx8Xy5jYWxsKG8sYiksKEM9by5jb21wbGV0ZSk9PW51bGx8fEMuY2FsbChvLGIpfSxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEM7bGV0IGI9bmV3IGdhKGQpOyhfPW8uZmFpbCk9PW51bGx8fF8uY2FsbChvLGIpLChDPW8uY29tcGxldGUpPT1udWxsfHxDLmNhbGwobyxiKX0pfW1rZGlyKG8pe25hdGl2ZUZpbGVNYW5hZ2VyLm1rZGlyKG8uZGlyUGF0aCxvLnJlY3Vyc2l2ZSxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEMsYj1uZXcgcHMoe2Vyck1zZzoibWtkaXI6b2sifSk7KF89by5zdWNjZXNzKT09bnVsbHx8Xy5jYWxsKG8sYiksKEM9by5jb21wbGV0ZSk9PW51bGx8fEMuY2FsbChvLGIpfSxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEM7bGV0IGI9bmV3IGdhKGQpOyhfPW8uZmFpbCk9PW51bGx8fF8uY2FsbChvLGIpLChDPW8uY29tcGxldGUpPT1udWxsfHxDLmNhbGwobyxiKX0pfXVubGluayhvKXtuYXRpdmVGaWxlTWFuYWdlci51bmxpbmsoby5maWxlUGF0aCxmdW5jdGlvbihkPW51bGwpe3ZhciBfLEMsYj1uZXcgcHMoe2Vyck1zZzoidW5saW5rOm9rIn0pOyhfPW8uc3VjY2Vzcyk9PW51bGx8fF8uY2FsbChvLGIpLChDPW8uY29tcGxldGUpPT1udWxsfHxDLmNhbGwobyxiKX0sZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDO2xldCBiPW5ldyBnYShkKTsoXz1vLmZhaWwpPT1udWxsfHxfLmNhbGwobyxiKSwoQz1vLmNvbXBsZXRlKT09bnVsbHx8Qy5jYWxsKG8sYil9KX1yZWFkRmlsZShvKXtuYXRpdmVGaWxlTWFuYWdlci5yZWFkRmlsZShvLmVuY29kaW5nLG8uZmlsZVBhdGgsZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDLGI9bmV3IG5mKGQpOyhfPW8uc3VjY2Vzcyk9PW51bGx8fF8uY2FsbChvLGIpLChDPW8uY29tcGxldGUpPT1udWxsfHxDLmNhbGwobyxiKX0sZnVuY3Rpb24oZD1udWxsKXt2YXIgXyxDO2xldCBiPW5ldyBnYShkKTsoXz1vLmZhaWwpPT1udWxsfHxfLmNhbGwobyxiKSwoQz1vLmNvbXBsZXRlKT09bnVsbHx8Qy5jYWxsKG8sYil9KX13cml0ZUZpbGUobyl7bmF0aXZlRmlsZU1hbmFnZXIud3JpdGVGaWxlKG8uZmlsZVBhdGgsby5lbmNvZGluZyxvLmRhdGEsZnVuY3Rpb24oKXt2YXIgZCxfLEM9bmV3IHBzKHtlcnJNc2c6IndyaXRlRmlsZTpvayJ9KTsoZD1vLnN1Y2Nlc3MpPT1udWxsfHxkLmNhbGwobyxDKSwoXz1vLmNvbXBsZXRlKT09bnVsbHx8Xy5jYWxsKG8sQyl9LGZ1bmN0aW9uKGQ9bnVsbCl7dmFyIF8sQztsZXQgYj1uZXcgZ2EoZCk7KF89by5mYWlsKT09bnVsbHx8Xy5jYWxsKG8sYiksKEM9by5jb21wbGV0ZSk9PW51bGx8fEMuY2FsbChvLGIpfSl9fSxibT1mdW5jdGlvbigpe3JldHVybiBuZXcgX219O3ZhciB5bT1mPT57Zi5nZXRGaWxlU3lzdGVtTWFuYWdlcj1ibX07dmFyIEVtPWY9Pnt9O3ZhciBTbT1mPT57fTt2YXIgd209Zj0+e307dmFyIEFtPWY9Pnt9O3ZhciBDbT1mPT57fTt2YXIgVG09Zj0+e307dmFyIE9tPWY9Pnt9O3ZhciBQbT1mPT57fTt2YXIgTm09Zj0+e307dmFyIGttPWY9Pnt9O3ZhciBJbT1mPT57fTt2YXIgUm09Zj0+e307dmFyIHhtPWY9PntsZXR7cmVnaXN0ZXJVVFNJbnRlcmZhY2U6byxpbml0VVRTUHJveHlDbGFzczpkLGluaXRVVFNQcm94eUZ1bmN0aW9uOl8saW5pdFVUU1BhY2thZ2VOYW1lOkMsaW5pdFVUU0luZGV4Q2xhc3NOYW1lOmIsaW5pdFVUU0NsYXNzTmFtZTpnfT1mLHk9IkRDbG91ZFVuaUluc3RhbGxBcGsiLEk9InVuaS1pbnN0YWxsQXBrIixCZT0iYnVpbHQtaW4iLFN0PSIiLEd0PSEwLFl0PUMoeSxHdCksUj1iKHksR3QpO2YuaW5zdGFsbEFwaz1fKCExLHttb2R1bGVOYW1lOkksbW9kdWxlVHlwZTpCZSxlcnJNc2c6U3QsbWFpbjohMCxwYWNrYWdlOll0LGNsYXNzOlIsbmFtZToiaW5zdGFsbEFwa0J5SnMiLGtlZXBBbGl2ZTohMSxwYXJhbXM6W3tuYW1lOiJvcHRpb25zIix0eXBlOiJVVFNTREtNb2R1bGVzRENsb3VkVW5pSW5zdGFsbEFwa0luc3RhbGxBcGtPcHRpb25zSlNPTk9iamVjdCJ9XSxyZXR1cm46IiJ9KX07dmFyIEJtPWY9Pnt9O3ZhciBNbT1mPT57fTt2YXIgTG09Zj0+e307dmFyIEZtPWY9Pnt9O3ZhciBEbT1mPT57fTt2YXIgVm09Zj0+e307dmFyIFVtPWY9Pnt9O3ZhciAkbT1mPT57fTt2YXIgSG09Zj0+e307dmFyIGptPWY9Pnt9O3ZhciB6bT1mPT57fTt2YXIgV209Zj0+e307dmFyIEdtPWY9Pnt9O3ZhciBZbT1mPT57fTt2YXIgcW09Zj0+e307ZnVuY3Rpb24gSm0oZil7Zm0oZiksZG0oZiksaG0oZiksZ20oZikscG0oZiksdm0oZikseW0oZiksRW0oZiksU20oZiksd20oZiksQW0oZiksQ20oZiksVG0oZiksT20oZiksUG0oZiksTm0oZiksa20oZiksSW0oZiksUm0oZikseG0oZiksQm0oZiksTW0oZiksTG0oZiksRm0oZiksRG0oZiksVm0oZiksVW0oZiksJG0oZiksSG0oZiksam0oZiksem0oZiksV20oZiksR20oZiksWW0oZikscW0oZiksdW0oZil9dmFyIEFkLENkLFRkLHZzLE9kLFBkLE5kO2Z1bmN0aW9uIEttKCl7cmV0dXJuIHZzP3tfX2RlZmluZVBhZ2U6QWQsX19yZWdpc3RlckFwcDpDZCxfX3JlZ2lzdGVyUGFnZTpUZCx1bmk6dnMsd3g6dnMsZ2V0QXBwOk9kLGdldEN1cnJlbnRQYWdlczpQZCxVbmlTZXJ2aWNlSlNCcmlkZ2U6TmR9Ont9fWZ1bmN0aW9uIFptKGYpe2xldHt3ZWV4Om8scGx1czpkLFZ1ZVNoYXJlZDpffT1mO3JldHVybiB2c3x8KHtfX2RlZmluZVBhZ2U6QWQsX19yZWdpc3RlckFwcDpDZCxfX3JlZ2lzdGVyUGFnZTpUZCx1bmk6dnMsZ2V0QXBwOk9kLGdldEN1cnJlbnRQYWdlczpQZCxVbmlTZXJ2aWNlSlNCcmlkZ2U6TmR9PUt2KG8sZCxmKSx2cy5WdWVTaGFyZWQ9XyxKbSh2cykseXYodnMpKSx7X19kZWZpbmVQYWdlOkFkLF9fcmVnaXN0ZXJBcHA6Q2QsX19yZWdpc3RlclBhZ2U6VGQscGx1czpkLHVuaTp2cyx3eDp2cyxnZXRBcHA6T2QsZ2V0Q3VycmVudFBhZ2VzOlBkLFVuaVNlcnZpY2VKU0JyaWRnZTpOZH19ZnVuY3Rpb24gWG0oZixvKXtsZXR7X191bmlDb25maWc6ZH09bztpZighZClyZXR1cm47bGV0IF89by53ZWV4O18uZG9jdW1lbnQuX18kYXV0b21hdG9yX189ISFkLmF1dG9tYXRvcjtsZXQgQz1kLnJlbmRlcmVyIT09Im5hdGl2ZSImJl8uY29uZmlnLmJ1bmRsZVVybC5pbmRleE9mKCJhcHAtc2VydmljZS5qcyIpIT09LTE7aWYodG8obyxLbSgpKSxDP1p2KG8pOihBdihmLG8pLGp2KG8uVnVlLnBhcnNlQ2xhc3NTdHlsZXMpKSx0byhvLFptKG8pKSxfLmNvbmZpZy5wbHVzX3dlYl9pZD09PSIxIil7bGV0IEk9Xy5yZXF1aXJlTW9kdWxlKCJwbHVzIik7SS5zZXREZWZhdWx0Rm9udFNpemUmJkkuc2V0RGVmYXVsdEZvbnRTaXplKE1hdGgucm91bmQoby5wbHVzLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGgvMjApKX1sZXR7c2NhbGU6YixkZXZpY2VXaWR0aDpnLHBsYXRmb3JtOnl9PWdsb2JhbC5XWEVudmlyb25tZW50O2lmKHkudG9Mb3dlckNhc2UoKT09PSJpb3MiKXtsZXQgST1NYXRoLmNlaWwoZy9iKTtfLnJlcXVpcmVNb2R1bGUoIm1ldGEiKS5zZXRWaWV3cG9ydCh7d2lkdGg6SSxyb3VuZE9mZkRldmlhdGlvbjohMX0pfX12YXIgTGw9Y2xhc3MgZXh0ZW5kcyBNbHtjb25zdHJ1Y3RvcihvKXtzdXBlcigpO3RoaXMubm9kZVR5cGU9ODt0aGlzLnR5cGU9ImNvbW1lbnQiO3RoaXMudmFsdWU9IiI7dGhpcy52YWx1ZT1vfXRvU3RyaW5nKCl7cmV0dXJuIjwhLS0gIit0aGlzLnZhbHVlKyIgLS0+In19O2Z1bmN0aW9uIEtvKGYsbz1bXSl7cmV0dXJue21vZHVsZToiZG9tIixtZXRob2Q6ZixhcmdzOm99fXZhciBBYz1jbGFzc3tjb25zdHJ1Y3RvcihvLGQpe3RoaXMuaWQ9byx0aGlzLmJhdGNoZWQ9ITEsdGhpcy51cGRhdGVzPVtdLFduKGQpP09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoYW5kbGVyIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZH0pOmNvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBpbnZhbGlkIHBhcmFtZXRlciwgaGFuZGxlciBtdXN0IGJlIGEgZnVuY3Rpb24iKX1jcmVhdGVGaW5pc2gobyl7cmV0dXJuIHRoaXMuaGFuZGxlcihbS28oImNyZWF0ZUZpbmlzaCIpXSxvKX11cGRhdGVGaW5pc2gobyl7cmV0dXJuIHRoaXMuaGFuZGxlcihbS28oInVwZGF0ZUZpbmlzaCIpXSxvKX1yZWZyZXNoRmluaXNoKG8pe3JldHVybiB0aGlzLmhhbmRsZXIoW0tvKCJyZWZyZXNoRmluaXNoIildLG8pfWNyZWF0ZUJvZHkobyl7bGV0IGQ9by50b0pTT04oKSxfPWQuY2hpbGRyZW47ZGVsZXRlIGQuY2hpbGRyZW47bGV0IEM9W0tvKCJjcmVhdGVCb2R5IixbZF0pXTtyZXR1cm4gXyYmQy5wdXNoLmFwcGx5KEMsXy5tYXAoYj0+S28oImFkZEVsZW1lbnQiLFtkLnJlZixiLC0xXSkpKSx0aGlzLmFkZEFjdGlvbnMoQyl9YWRkRWxlbWVudChvLGQsXyl7cmV0dXJuIF8+PTB8fChfPS0xKSx0aGlzLmFkZEFjdGlvbnMoS28oImFkZEVsZW1lbnQiLFtkLG8udG9KU09OKCksX10pKX1yZW1vdmVFbGVtZW50KG8pe2lmKCRpKG8pKXtsZXQgZD1vLm1hcChfPT5LbygicmVtb3ZlRWxlbWVudCIsW19dKSk7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhkKX1yZXR1cm4gdGhpcy5hZGRBY3Rpb25zKEtvKCJyZW1vdmVFbGVtZW50Iixbb10pKX1tb3ZlRWxlbWVudChvLGQsXyl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhLbygibW92ZUVsZW1lbnQiLFtvLGQsX10pKX1zZXRBdHRyKG8sZCxfKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKEtvKCJ1cGRhdGVBdHRycyIsW28se1tkXTpffV0pKX1zZXRTdHlsZShvLGQsXyl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhLbygidXBkYXRlU3R5bGUiLFtvLHtbZF06X31dKSl9c2V0U3R5bGVzKG8sZCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhLbygidXBkYXRlU3R5bGUiLFtvLGRdKSl9YWRkRXZlbnQobyxkKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKEtvKCJhZGRFdmVudCIsW28sZF0pKX1yZW1vdmVFdmVudChvLGQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoS28oInJlbW92ZUV2ZW50IixbbyxkXSkpfWhhbmRsZXIobyxkKXtyZXR1cm4gZCYmZCgpfWFkZEFjdGlvbnMobyl7bGV0IGQ9dGhpcy51cGRhdGVzLF89dGhpcy5oYW5kbGVyO2lmKCRpKG8pfHwobz1bb10pLHRoaXMuYmF0Y2hlZClkLnB1c2guYXBwbHkoZCxvKTtlbHNlIHJldHVybiBfKG8pfX07dmFyIGtkPXtjcmVhdGVCb2R5OiJjYWxsQ3JlYXRlQm9keSIsYWRkRWxlbWVudDoiY2FsbEFkZEVsZW1lbnQiLHJlbW92ZUVsZW1lbnQ6ImNhbGxSZW1vdmVFbGVtZW50Iixtb3ZlRWxlbWVudDoiY2FsbE1vdmVFbGVtZW50Iix1cGRhdGVBdHRyczoiY2FsbFVwZGF0ZUF0dHJzIix1cGRhdGVTdHlsZToiY2FsbFVwZGF0ZVN0eWxlIixhZGRFdmVudDoiY2FsbEFkZEV2ZW50IixyZW1vdmVFdmVudDoiY2FsbFJlbW92ZUV2ZW50In07ZnVuY3Rpb24gUW0oZixvKXtsZXQgZD1vfHxnbG9iYWwuY2FsbE5hdGl2ZTtyZXR1cm4gV24oZCl8fGNvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBubyBkZWZhdWx0IGhhbmRsZXIiKSxmdW5jdGlvbihDKXskaShDKXx8KEM9W0NdKTtmb3IobGV0IGI9MDtiPEMubGVuZ3RoO2IrKyl7bGV0IGc9WTEoZixDW2JdLGQpO2lmKGc9PT0tMSlyZXR1cm4gZ319fWZ1bmN0aW9uIEcxKGYsbyl7cmV0dXJuIGY9PT0iZG9tIiYma2Rbb10mJlduKGdsb2JhbFtrZFtvXV0pfWZ1bmN0aW9uIFkxKGYsbyxkKXtsZXR7bW9kdWxlOl8sbWV0aG9kOkMsYXJnczpifT1vO3JldHVybiBHMShfLEMpP2dsb2JhbFtrZFtDXV0oZiwuLi5iLCItMSIpOmQoZixbb10sIi0xIil9dmFyIHNmPWNsYXNzIGV4dGVuZHMgYm97Y29uc3RydWN0b3Iobyl7c3VwZXIoKTt0aGlzLnZhbHVlPW8sdGhpcy5ub2RlVHlwZT0zLHRoaXMudHlwZT0idGV4dCIsdGhpcy52YWx1ZT0iIn10b1N0cmluZygpe3JldHVybiIiK3RoaXMudmFsdWV9fTt2YXIgZV89e3NsaWRlcjp7Y2hhbmdlOmZ1bmN0aW9uKGYpe3JldHVybntpbmRleDpmLmluZGV4LHNvdXJjZTpmLnNvdXJjZX19LHNjcm9sbDpmdW5jdGlvbihmKXtyZXR1cm57b2Zmc2V0WFJhdGlvOmYub2Zmc2V0WFJhdGlvLG9mZnNldFlSYXRpbzpmLm9mZnNldFlSYXRpbyxkcmFnOmYuZHJhZ319fSwic2Nyb2xsLXZpZXciOntzY3JvbGxlbmQ6ZnVuY3Rpb24oZil7cmV0dXJue2NvbnRlbnRPZmZzZXQ6Zi5jb250ZW50T2Zmc2V0fX19fTtmdW5jdGlvbiB0XyhmKXtsZXR7YXR0cjpvLG9mZnNldExlZnQ6ZCxvZmZzZXRUb3A6X309ZixDPXt9O3JldHVybiBvJiZPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGI9PntiLmluZGV4T2YoImRhdGEtIik9PT0wJiYoQ1tiLnJlcGxhY2UoImRhdGEtIiwiIildPW9bYl0pfSkse2lkOm8mJm8uaWR8fCIiLGRhdGFzZXQ6QyxvZmZzZXRMZWZ0OmR8fDAsb2Zmc2V0VG9wOl98fDB9fXZhciBxMT1bImEiLCJkaXYiLCJsaXN0IiwiY2VsbCIsImxvYWRpbmciLCJyZWZyZXNoIiwicmVjeWNsZS1saXN0Iiwic2Nyb2xsZXIiLCJpbmRpY2F0b3IiLCJ3YXRlcmZhbGwiLCJ3ZWIiLCJyaWNodGV4dCJdLEoxPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiXSxLMT17bWFya2VydGFwOlsibWFya2VySWQiXSxjb250cm9sdGFwOlsiY29udHJvbElkIl0scmVnaW9uY2hhbmdlOlsiY2F1c2VkQnkiXSxlbmQ6WyJjYXVzZWRCeSJdLGFwcGVhcjpbImRpcmVjdGlvbiJdLGRpc2FwcGVhcjpbImRpcmVjdGlvbiJdfTtmdW5jdGlvbiBuXyhmLG8pe2xldCBkPWYudHlwZTtpZihKMS5pbmRleE9mKGQpIT09LTEpcmV0dXJuIGY7bGV0IF89Zi5jdXJyZW50VGFyZ2V0LEM9Xy50eXBlLnJlcGxhY2UoInUtIiwiIik7aWYocTEuaW5kZXhPZihDKSE9PS0xKXJldHVybiBmO2xldHt0aW1lc3RhbXA6Yix0YXJnZXQ6Z309ZjtpZighbyl7bGV0IEJlPWVfW0NdO0JlP1duKEJlW2RdKT9vPUJlW2RdKGYpOm89Zi5kZXRhaWx8fHt9Om89Zi5kZXRhaWx8fHt9fWxldCB5PXt0eXBlOmQsdGltZVN0YW1wOmIsdGFyZ2V0OnRfKGcpLGN1cnJlbnRUYXJnZXQ6dF8oXyksZGV0YWlsOm8sdG91Y2hlczpkPT09InRvdWNoZW5kInx8ZD09PSJwYW5lbmQiP1tdOmYuY2hhbmdlZFRvdWNoZXMsY2hhbmdlZFRvdWNoZXM6Zi5jaGFuZ2VkVG91Y2hlc307Zi5jb21wb25lbnRJZCYmKHkuY29tcG9uZW50SWQ9Zi5jb21wb25lbnRJZCk7bGV0IEk9SzFbZF07cmV0dXJuIEkmJkkuZm9yRWFjaChCZT0+e0lsKGYsQmUpJiYoeVtCZV09ZltCZV0pfSkseX1mdW5jdGlvbiBaMShmLG8pe2xldCBkPW8uYXR0cnN8fHt9O2ZvcihsZXQgQyBpbiBkKWYuc2V0QXR0cihDLGRbQ10sITApO2xldCBfPW8uc3R5bGV8fHt9O2ZvcihsZXQgQyBpbiBfKWYuc2V0U3R5bGUoQyxfW0NdLCEwKX12YXIgcGE9Y2xhc3N7Y29uc3RydWN0b3IobyxkPSIiLF8pe289bz9vLnRvU3RyaW5nKCk6IiIsdGhpcy5pZD1vLHRoaXMuVVJMPWQsTHYobyx0aGlzKSx0aGlzLm5vZGVNYXA9e307bGV0IEM9cGEuTGlzdGVuZXJ8fEFjO3RoaXMubGlzdGVuZXI9bmV3IEMobyxffHxRbShvLHBhLmhhbmRsZXIpKSx0aGlzLnRhc2tDZW50ZXI9bmV3IHdjKG8sXz8oYixnKT0+XyhnKTpwYS5oYW5kbGVyKSx0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpfWdldFJlZihvKXtyZXR1cm4gdGhpcy5ub2RlTWFwW29dfW9wZW4oKXt0aGlzLmxpc3RlbmVyLmJhdGNoZWQ9ITF9Y2xvc2UoKXt0aGlzLmxpc3RlbmVyLmJhdGNoZWQ9ITB9Y3JlYXRlRG9jdW1lbnRFbGVtZW50KCl7aWYoIXRoaXMuZG9jdW1lbnRFbGVtZW50KXtsZXQgbz1uZXcgYm8oImRvY3VtZW50Iik7by5kb2NJZD10aGlzLmlkLG8ub3duZXJEb2N1bWVudD10aGlzLG8ucm9sZT0iZG9jdW1lbnRFbGVtZW50IixvLnJlZj0iX2RvY3VtZW50RWxlbWVudCIsdGhpcy5ub2RlTWFwLl9kb2N1bWVudEVsZW1lbnQ9byx0aGlzLmRvY3VtZW50RWxlbWVudD1vLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJhcHBlbmRDaGlsZCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmQ9PntpZCh0aGlzLGQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTooZCxfKT0+e2lkKHRoaXMsZCxfKX19KSxvcigiZGVidWciKSYmbm8oYENyZWF0ZSBkb2N1bWVudCBlbGVtZW50IChpZDogIiR7by5kb2NJZH0iLCByZWY6ICIke28ucmVmfSIpYCl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fWNyZWF0ZUJvZHkobyxkKXtpZighdGhpcy5ib2R5KXtsZXQgXz1uZXcgYm8obyxkKTtvZCh0aGlzLF8pLG9yKCJkZWJ1ZyIpJiZubyhgW2NyZWF0ZUJvZHldKCR7dGhpcy5pZH0sJHtfLnR5cGV9LCR7Xy5yZWZ9KSAoJHtKU09OLnN0cmluZ2lmeShfLnRvSlNPTighMCkpfSkuYCl9cmV0dXJuIHRoaXMuYm9keX1jcmVhdGVFbGVtZW50KG8sZCl7bGV0IF89bmV3IGJvKG8sZCk7cmV0dXJuIG9yKCJkZWJ1ZyIpJiZubyhgW2NyZWF0ZUVsZW1lbnRdKCR7dGhpcy5pZH0sJHtfLnR5cGV9LCR7Xy5yZWZ9KSAoJHtKU09OLnN0cmluZ2lmeShfLnRvSlNPTighMCkpfSkuYCksX31jcmVhdGVDb21tZW50KG8pe3JldHVybiBuZXcgTGwobyl9Y3JlYXRlVGV4dChvKXtyZXR1cm4gbmV3IHNmKG8pfWZpcmVFdmVudChvLGQsXyxDLGIpe2lmKCFvKXJldHVybjtfPV98fHt9LF8udHlwZT1fLnR5cGV8fGQsXy50YXJnZXQ9byxfLmN1cnJlbnRUYXJnZXQ9byxfLnRpbWVzdGFtcD1EYXRlLm5vdygpLEMmJloxKG8sQyk7bGV0IGc9ITAseT10aGlzLmdldFJlZigiX3Jvb3QiKTtpZih5JiZ5LmF0dHIpe2xldCBJPXkuYXR0ci5idWJibGU7Zz1JPT09InRydWUifHxJPT09ITB8fGcmJkk9PT12b2lkIDB9cmV0dXJuIF89bl8oXyksby5maXJlRXZlbnQoZCxfLGcsYil9ZGVzdHJveSgpe29yKCJkZWJ1ZyIpJiZubyhgW2Rlc3Ryb3ldKCR7dGhpcy5pZH0sZG9jdW1lbnQpIERlc3Ryb3kgZG9jdW1lbnQgKGlkOiAiJHt0aGlzLmlkfSIsIFVSTDogIiR7dGhpcy5VUkx9IilgKSx0aGlzLnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKCksZGVsZXRlIHRoaXMubGlzdGVuZXIsZGVsZXRlIHRoaXMubm9kZU1hcCxkZWxldGUgdGhpcy50YXNrQ2VudGVyLEZ2KHRoaXMuaWQpfX07cGEuaGFuZGxlcj1udWxsO3ZhciByXz17SW5wdXRFbGVtZW50RGl2OiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixJbnB1dEVsZW1lbnRSZWdFeHA6IjxXaGl0ZVNwYWNlPnw8TGluZVRlcm1pbmF0b3I+fDxSZXNlcnZlZFdvcmQ+fDxJZGVudGlmaWVyPnw8TnVtZXJpY0xpdGVyYWw+fDxQdW5jdHVhdG9yPnw8U3RyaW5nTGl0ZXJhbD4iLFJlc2VydmVkV29yZDoiPEtleXdvcmQ+fDxOdWxsTGl0ZXJhbD58PEJvb2xlYW5MaXRlcmFsPiIsV2hpdGVTcGFjZTovW1x0XHZcZlx1MDAyMFx1MDBBMFx1MTY4MFx1MTgwRVx1MjAwMC1cdTIwMEFcdTIwMkZcdTIwNWZcdTMwMDBcdUZFRkZdLyxMaW5lVGVybWluYXRvcjovW1xuXHJcdTIwMjhcdTIwMjldLyxLZXl3b3JkOi9uZXcoPyFbXyRhLXpBLVowLTldKXx2b2lkKD8hW18kYS16QS1aMC05XSl8ZGVsZXRlKD8hW18kYS16QS1aMC05XSl8aW4oPyFbXyRhLXpBLVowLTldKXxpbnN0YW5jZW9mKD8hW18kYS16QS1aMC05XSl8dHlwZW9mKD8hW18kYS16QS1aMC05XSkvLE51bGxMaXRlcmFsOi9udWxsKD8hW18kYS16QS1aMC05XSkvLEJvb2xlYW5MaXRlcmFsOi8oPzp0cnVlfGZhbHNlKSg/IVtfJGEtekEtWjAtOV0pLyxJZGVudGlmaWVyOi9bXyRhLXpBLVpdW18kYS16QS1aMC05XSovLFB1bmN0dWF0b3I6L1wvfD0+fFwqXCp8Pj4+PXw+Pj18PDw9fD09PXwhPT18Pj4+fDw8fCU9fFwqPXwtPXxcKz18PD18Pj18PT18IT18XF49fFx8PXxcfFx8fCYmfCY9fD4+fFwrXCt8LS18XDp8fXxcKnwmfFx8fFxefCF8fnwtfFwrfFw/fCV8PXw+fDx8LHw7fFwuKD8hWzAtOV0pfFxdfFxbfFwpfFwofHsvLERpdlB1bmN0dWF0b3I6L1wvPXxcLy8sTnVtZXJpY0xpdGVyYWw6Lyg/OjBbeFhdWzAtOWEtZkEtRl0qfFwuWzAtOV0rfCg/OlsxLTldK1swLTldKnwwKSg/OlwuWzAtOV0qfFwuKT8pKD86W2VFXVsrLV17MCwxfVswLTldKyk/KD8hW18kYS16QS1aMC05XSkvLFN0cmluZ0xpdGVyYWw6LyIoPzpbXiJcblxcXHJcdTIwMjhcdTIwMjldfFxcKD86WyciXFxiZm5ydHZcblxyXHUyMDI4XHUyMDI5XXxcclxuKXxcXHhbMC05YS1mQS1GXXsyfXxcXHVbMC05YS1mQS1GXXs0fXxcXFteMC05dXgnIlxcYmZucnR2XG5cXFxyXHUyMDI4XHUyMDI5XSkqInwnKD86W14nXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKicvLFJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbDovXC8oPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXipcL1xcXG5cclx1MjAyOFx1MjAyOV18XFxbXlxuXHJcdTIwMjhcdTIwMjldKSg/OlxbKD86XFxbXHNcU118W15cXV0pKlxdfFteXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkqXC9bMC05YS16QS1aXSovfTtmdW5jdGlvbiBpXyhmLG8sZCl7dmFyIF89W29dO2Z1bmN0aW9uIEMoZyl7dmFyIHk9bmV3IFJlZ0V4cDtyZXR1cm4geS5jb21waWxlKGcucmVwbGFjZSgvPChbXj5dKyk+L2csZnVuY3Rpb24oSSxCZSl7cmV0dXJuIGZbQmVdPyhfLnB1c2goQmUpLGZbQmVdaW5zdGFuY2VvZiBSZWdFeHA/IigiK2ZbQmVdLnNvdXJjZSsiKSI6IigiK0MoZltCZV0pLnNvdXJjZSsiKSIpOiIifSksZCkseX12YXIgYj1DKGZbb10pO3RoaXMuZXhlYz1mdW5jdGlvbihnKXt2YXIgeT1iLmV4ZWMoZyk7aWYoeT09bnVsbClyZXR1cm4gbnVsbDtmb3IodmFyIEk9bmV3IFN0cmluZyh5WzBdKSxCZT0wO0JlPF8ubGVuZ3RoO0JlKyspeVtCZV0mJihJW19bQmVdXT15W0JlXSk7cmV0dXJuIEl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsYXN0SW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYi5sYXN0SW5kZXh9LHNldDpmdW5jdGlvbihnKXtiLmxhc3RJbmRleD1nfX0pfWZ1bmN0aW9uIFgxKCl7dmFyIGY9bmV3IGlfKHJfLCJJbnB1dEVsZW1lbnREaXYiLCJnIiksbz1uZXcgaV8ocl8sIklucHV0RWxlbWVudFJlZ0V4cCIsImciKSxkO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzb3VyY2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZH0sc2V0OmZ1bmN0aW9uKF8pe2Q9XyxmLmxhc3RJbmRleD0wLG8ubGFzdEluZGV4PTB9fSksdGhpcy5yZXNldD1mdW5jdGlvbigpe2YubGFzdEluZGV4PTAsby5sYXN0SW5kZXg9MH0sdGhpcy5nZXROZXh0VG9rZW49ZnVuY3Rpb24oXyl7dmFyIEM9Zi5sYXN0SW5kZXgsYjtfP2I9ZjpiPW87dmFyIGc9Yi5leGVjKGQpO2lmKGcmJmIubGFzdEluZGV4LUM+Zy5sZW5ndGgpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIHRva2VuIElMTEVHQUwiKTtyZXR1cm4gZi5sYXN0SW5kZXg9Yi5sYXN0SW5kZXgsby5sYXN0SW5kZXg9Yi5sYXN0SW5kZXgsZ319dmFyIG9fPXtJZGVudGlmaWVyTmFtZTpbWyJJZGVudGlmaWVyIl1dLExpdGVyYWw6W1siTnVsbExpdGVyYWwiXSxbIkJvb2xlYW5MaXRlcmFsIl0sWyJOdW1lcmljTGl0ZXJhbCJdLFsiU3RyaW5nTGl0ZXJhbCJdLFsiUmVndWxhckV4cHJlc3Npb25MaXRlcmFsIl1dLFByaW1hcnlFeHByZXNzaW9uOltbIklkZW50aWZpZXIiXSxbIkxpdGVyYWwiXSxbIigiLCJFeHByZXNzaW9uIiwiKSJdXSxDYWxsRXhwcmVzc2lvbjpbWyJQcmltYXJ5RXhwcmVzc2lvbiIsIkFyZ3VtZW50cyJdLFsiQ2FsbEV4cHJlc3Npb24iLCJBcmd1bWVudHMiXV0sQXJndW1lbnRzOltbIigiLCIpIl0sWyIoIiwiQXJndW1lbnRMaXN0IiwiKSJdXSxBcmd1bWVudExpc3Q6W1siQ29uZGl0aW9uYWxFeHByZXNzaW9uIl0sWyJBcmd1bWVudExpc3QiLCIsIiwiQ29uZGl0aW9uYWxFeHByZXNzaW9uIl1dLExlZnRIYW5kU2lkZUV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iXSxbIkNhbGxFeHByZXNzaW9uIl1dLFVuYXJ5RXhwcmVzc2lvbjpbWyJMZWZ0SGFuZFNpZGVFeHByZXNzaW9uIl0sWyJ2b2lkIiwiVW5hcnlFeHByZXNzaW9uIl0sWyIrIiwiVW5hcnlFeHByZXNzaW9uIl0sWyItIiwiVW5hcnlFeHByZXNzaW9uIl0sWyJ+IiwiVW5hcnlFeHByZXNzaW9uIl0sWyIhIiwiVW5hcnlFeHByZXNzaW9uIl1dLEV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbjpbWyJVbmFyeUV4cHJlc3Npb24iXSxbIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiIsIioqIiwiVW5hcnlFeHByZXNzaW9uIl1dLE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIvIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXSxbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsIioiLCJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXSxbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsIiUiLCJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXV0sQWRkaXRpdmVFeHByZXNzaW9uOltbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiJdLFsiQWRkaXRpdmVFeHByZXNzaW9uIiwiKyIsIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiJdLFsiQWRkaXRpdmVFeHByZXNzaW9uIiwiLSIsIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiJdXSxTaGlmdEV4cHJlc3Npb246W1siQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI8PCIsIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+PiIsIkFkZGl0aXZlRXhwcmVzc2lvbiJdXSxSZWxhdGlvbmFsRXhwcmVzc2lvbjpbWyJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPCIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjw9IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIj49IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluc3RhbmNlb2YiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiaW4iLCJTaGlmdEV4cHJlc3Npb24iXV0sRXF1YWxpdHlFeHByZXNzaW9uOltbIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCI9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCIhPSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCI9PT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXV0sQml0d2lzZUFOREV4cHJlc3Npb246W1siRXF1YWxpdHlFeHByZXNzaW9uIl0sWyJCaXR3aXNlQU5ERXhwcmVzc2lvbiIsIiYiLCJFcXVhbGl0eUV4cHJlc3Npb24iXV0sQml0d2lzZVhPUkV4cHJlc3Npb246W1siQml0d2lzZUFOREV4cHJlc3Npb24iXSxbIkJpdHdpc2VYT1JFeHByZXNzaW9uIiwiXiIsIkJpdHdpc2VBTkRFeHByZXNzaW9uIl1dLEJpdHdpc2VPUkV4cHJlc3Npb246W1siQml0d2lzZVhPUkV4cHJlc3Npb24iXSxbIkJpdHdpc2VPUkV4cHJlc3Npb24iLCJ8IiwiQml0d2lzZVhPUkV4cHJlc3Npb24iXV0sTG9naWNhbEFOREV4cHJlc3Npb246W1siQml0d2lzZU9SRXhwcmVzc2lvbiJdLFsiTG9naWNhbEFOREV4cHJlc3Npb24iLCImJiIsIkJpdHdpc2VPUkV4cHJlc3Npb24iXV0sTG9naWNhbE9SRXhwcmVzc2lvbjpbWyJMb2dpY2FsQU5ERXhwcmVzc2lvbiJdLFsiTG9naWNhbE9SRXhwcmVzc2lvbiIsInx8IiwiTG9naWNhbEFOREV4cHJlc3Npb24iXV0sQ29uZGl0aW9uYWxFeHByZXNzaW9uOltbIkxvZ2ljYWxPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI/IiwiTG9naWNhbE9SRXhwcmVzc2lvbiIsIjoiLCJMb2dpY2FsT1JFeHByZXNzaW9uIl1dLEV4cHJlc3Npb246W1siQ29uZGl0aW9uYWxFeHByZXNzaW9uIl0sWyJFeHByZXNzaW9uIiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxQcm9ncmFtOltbIkV4cHJlc3Npb24iXV19O2Z1bmN0aW9uIHJ1KGYsbyl7dGhpcy5uYW1lPWYsdGhpcy50b2tlbj1vLHRoaXMuY2hpbGROb2Rlcz1bXSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKGQpe2lmKGR8fChkPSIiKSx0aGlzLmNoaWxkTm9kZXMubGVuZ3RoPT0xKXJldHVybiB0aGlzLmNoaWxkTm9kZXNbMF0udG9TdHJpbmcoZCk7Zm9yKHZhciBfPWQrdGhpcy5uYW1lKyh0aGlzLnRva2VuIT1udWxsJiZ0aGlzLm5hbWUhPXRoaXMudG9rZW4/IjoiK3RoaXMudG9rZW46IiIpK2AKYCxDPTA7Qzx0aGlzLmNoaWxkTm9kZXMubGVuZ3RoO0MrKylfKz10aGlzLmNoaWxkTm9kZXNbQ10udG9TdHJpbmcoZCsiICAgICIpO3JldHVybiBffX1mdW5jdGlvbiBRMSgpe3ZhciBmLG89e1Byb2dyYW06IiQifSxkPXt9O2Z1bmN0aW9uIF8oeSl7ZFtKU09OLnN0cmluZ2lmeSh5KV09eTtmb3IodmFyIEk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoeSk7SS5sZW5ndGg7KXt2YXIgQmU9SS5zaGlmdCgpOyFvX1tCZV18fG9fW0JlXS5mb3JFYWNoKGZ1bmN0aW9uKEd0KXt5W0d0WzBdXXx8SS5wdXNoKEd0WzBdKTt2YXIgWXQ9eSxSPW51bGw7R3QuZm9yRWFjaChmdW5jdGlvbihPdCl7WXRbT3RdfHwoWXRbT3RdPXt9KSxSPVl0LFl0PVl0W090XX0pLHlbQmVdLiRkaXYmJihZdC4kZGl2PSEwKSxZdC4kcmVkdWNlPUJlLFl0LiRjb3VudD1HdC5sZW5ndGh9KX1mb3IodmFyIFN0IGluIHkpdHlwZW9mIHlbU3RdIT0ib2JqZWN0Inx8U3QuY2hhckF0KDApPT0iJCJ8fHlbU3RdLiRjbG9zdXJlfHwoZFtKU09OLnN0cmluZ2lmeSh5W1N0XSldP3lbU3RdPWRbSlNPTi5zdHJpbmdpZnkoeVtTdF0pXTpfKHlbU3RdKSk7eS4kY2xvc3VyZT0hMH1fKG8pO3ZhciBDPVtdLGI9W29dLGc9bzt0aGlzLmluc2VydFN5bWJvbD1mdW5jdGlvbihJLEJlKXtmb3IoOyFnW0kubmFtZV0mJmcuJHJlZHVjZTspe2Zvcih2YXIgU3Q9Zy4kY291bnQsR3Q9bmV3IHJ1KGcuJHJlZHVjZSk7U3QtLTspR3QuY2hpbGROb2Rlcy5wdXNoKEMucG9wKCkpLGIucG9wKCk7Zz1iW2IubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKEd0KX1pZihnPWdbSS5uYW1lXSxDLnB1c2goSSksYi5wdXNoKGcpLCFnKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZy4kZGl2fSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7Zz1vLEM9W10sYj1bb119LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO2cuJHJlZHVjZTspe2Zvcih2YXIgeT1nLiRjb3VudCxJPW5ldyBydShnLiRyZWR1Y2UpO3ktLTspSS5jaGlsZE5vZGVzLnB1c2goQy5wb3AoKSksYi5wb3AoKTtnPWJbYi5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2woSSl9aWYoQy5sZW5ndGg+MCYmZ1siOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgcnUoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoQy5sZW5ndGghPTF8fENbMF0ubmFtZSE9IlByb2dyYW0iKXRocm93IG5ldyBFcnJvcn1jYXRjaChCZSl7dGhyb3cgbmV3IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpfXJldHVybiBDWzBdfX0pfWZ1bmN0aW9uIGVSKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyBYMSx0aGlzLnN5bnRhY3RpY2FsUGFyc2VyPW5ldyBRMTt2YXIgZj1bIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwiLCJJZGVudGlmaWVyIiwiKioiLCI9PiIsInsiLCJ9IiwiKCIsIikiLCJbIiwiXSIsIi4iLCI7IiwiLCIsIjwiLCI+IiwiPD0iLCI+PSIsIj09IiwiIT0iLCI9PT0iLCIhPT0iLCIrIiwiLSIsIioiLCIlIiwiKysiLCItLSIsIjw8IiwiPj4iLCI+Pj4iLCImIiwifCIsIl4iLCIhIiwifiIsIiYmIiwifHwiLCI/IiwiOiIsIj0iLCIrPSIsIi09IiwiKj0iLCIlPSIsIjw8PSIsIj4+PSIsIj4+Pj0iLCImPSIsInw9IiwiXj0iLCIvIiwiLz0iLCJpbnN0YW5jZW9mIiwidHlwZW9mIiwibmV3Iiwidm9pZCIsImRlYnVnZ2VyIiwidGhpcyIsImRlbGV0ZSIsImluIl0sbz17fTtmLmZvckVhY2goZnVuY3Rpb24oZCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sZCx7fSl9KSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5sZXhpY2FsUGFyc2VyLnJlc2V0KCksdGhpcy5zeW50YWN0aWNhbFBhcnNlci5yZXNldCgpfSx0aGlzLnBhcnNlPWZ1bmN0aW9uKGQsXyl7dmFyIEMsYj0hMTt0aGlzLmxleGljYWxQYXJzZXIuc291cmNlPWQ7Zm9yKHZhciBnPSExO0M9dGhpcy5sZXhpY2FsUGFyc2VyLmdldE5leHRUb2tlbihnKTspe18mJl8oQyk7dHJ5e2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEMpLnNvbWUoeT0+by5oYXNPd25Qcm9wZXJ0eSh5KT8oZz10aGlzLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgcnUoeSxDKSxiKSxiPSExLCEwKTohMSkpY29udGludWU7KEMuS2V5d29yZHx8Qy5QdW5jdHVhdG9yfHxDLkRpdlB1bmN0dWF0b3IpJiZvLmhhc093blByb3BlcnR5KEMudG9TdHJpbmcoKSkmJihnPXRoaXMuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBydShDLnRvU3RyaW5nKCksQyksYikpfWNhdGNoKHkpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK0MpfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIGFfPW5ldyBlUjtmdW5jdGlvbiB0UihmKXthXy5yZXNldCgpLHRoaXMudHJlZT1hXy5wYXJzZShmKSx0aGlzLnBhdGhzPVtdO3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCksZD10aGlzLF89T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmlzU2ltcGxlLHRoaXMuaXNDb25zdCxiKHRoaXMudHJlZSksQyh0aGlzLnRyZWUpLHRoaXMucGF0aHMubGVuZ3RoPT09MCYmKHRoaXMuaXNDb25zdD0hMCksdGhpcy5zZXR0ZXI9ZnVuY3Rpb24oSSl7Zm9yKHZhciBCZT1vLFN0PTA7U3Q8SS5sZW5ndGgtMTtTdCsrKUJlW0lbU3RdXXx8KEJlW0lbU3RdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxCZT1CZVtJW1N0XV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBHdCBpbiBfKWlmKCFfW0d0XSlyZXR1cm4hMTtyZXR1cm4hMH0sc2V0OmZ1bmN0aW9uKEd0KXtpZihfW0kuam9pbigiLiIpXXx8KF9bSS5qb2luKCIuIildPSEwKSxCZVtJW1N0XV09R3QsdGhpcy5pc0NvbXBsZXRlZCgpKXJldHVybiBkLmV4ZWMoKX19fSx0aGlzLnZhbHVlT2Y9dGhpcy5leGVjPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBmdW5jdGlvbigpe3JldHVybigwLGV2YWwpKGYpfS5jYWxsKG8pfWNhdGNoKEkpe319O2Z1bmN0aW9uIEMoSSl7Zm9yKHZhciBCZT1JO0JlLmNoaWxkTm9kZXMubGVuZ3RoPD0xJiZCZS5uYW1lIT09Ik1lbWJlckV4cHJlc3Npb24iOylCZT1CZS5jaGlsZE5vZGVzWzBdO0JlLm5hbWU9PT0iTWVtYmVyRXhwcmVzc2lvbiI/ZC5pc1NpbXBsZT0hMDpkLmlzU2ltcGxlPSExfWZ1bmN0aW9uIGIoSSl7aWYoSS5uYW1lPT09IkNhbGxFeHByZXNzaW9uIiYmSS5jaGlsZE5vZGVzW0kuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSE9PSJDYWxsRXhwcmVzc2lvbiIpe3ZhciBCZT1nKEkuY2hpbGROb2Rlc1sxXSk7YihJLmNoaWxkTm9kZXNbMF0pfWVsc2UgaWYoSS5uYW1lPT09Ik5ld0V4cHJlc3Npb24iJiZJLmNoaWxkTm9kZXMubGVuZ3RoPT09MSl2YXIgQmU9ZyhJLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoSS5uYW1lPT09Ik1lbWJlckV4cHJlc3Npb24iJiZJLmNoaWxkTm9kZXMubGVuZ3RoPT09MSl2YXIgQmU9ZyhJKTtlbHNlIGZvcih2YXIgU3Q9MDtTdDxJLmNoaWxkTm9kZXMubGVuZ3RoO1N0KyspYihJLmNoaWxkTm9kZXNbU3RdKX1mdW5jdGlvbiBnKEkpe2lmKEkuY2hpbGROb2Rlc1swXS5uYW1lPT09IklkZW50aWZpZXJOYW1lIil7dmFyIEJlPWcoSS5jaGlsZE5vZGVzWzJdKTtyZXR1cm4gQmUmJihCZT1CZS5jb25jYXQoSS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLHkoQmUpLEJlfWVsc2UgaWYoSS5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iUHJpbWFyeUV4cHJlc3Npb24iKWlmKEkuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLm5hbWU9PT0iSWRlbnRpZmllciIpe3ZhciBCZT1bSS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKV07cmV0dXJuIHkoQmUpLEJlfWVsc2UgcmV0dXJuIG51bGw7ZWxzZXtpZihJLmNoaWxkTm9kZXNbMF0ubmFtZT09PSJdIilyZXR1cm4gZyhJLmNoaWxkTm9kZXNbM10pLGIoSS5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKEkuY2hpbGROb2Rlc1swXS5uYW1lPT09IkFyZ3VtZW50cyIpcmV0dXJuIGIoSS5jaGlsZE5vZGVzWzBdKSxiKEkuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIFN0PTA7U3Q8SS5jaGlsZE5vZGVzLmxlbmd0aDtTdCsrKWIoSS5jaGlsZE5vZGVzW1N0XSl9fWZ1bmN0aW9uIHkoSSl7Zm9yKHZhciBCZT1vLFN0PTA7U3Q8SS5sZW5ndGgtMTtTdCsrKUJlW0lbU3RdXXx8KEJlW0lbU3RdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxCZT1CZVtJW1N0XV07ZC5wYXRocy5wdXNoKEkpLF9bSS5qb2luKCIuIildPSExfX1mdW5jdGlvbiBGbChmKXt2YXIgbz1mLmNoaWxkTm9kZXMuc2xpY2UoKS5yZXZlcnNlKCksZD1vLmZpbHRlcihJPT4hSS50b2tlbnx8IUkudG9rZW4uUHVuY3R1YXRvcik7aWYoZi5uYW1lPT09IlVuYXJ5RXhwcmVzc2lvbiImJm8ubGVuZ3RoPT09MiYmb1swXS5uYW1lPT09Ii0iJiZkLmxlbmd0aD09PTEpe3ZhciBfPUZsKGRbMF0pO3JldHVybiBfLnZhbHVlPS1fLnZhbHVlLF99aWYoZi5uYW1lPT09IkFyZ3VtZW50cyIpe2Zvcih2YXIgQz1bXSxiPWRbMF07YjspYi5jaGlsZE5vZGVzLmxlbmd0aD09PTMmJihDLnVuc2hpZnQoYi5jaGlsZE5vZGVzWzBdKSxiPWIuY2hpbGROb2Rlc1syXSksYi5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJihDLnVuc2hpZnQoYi5jaGlsZE5vZGVzWzBdKSxiPW51bGwpO3JldHVybnt0eXBlOiJBcmd1bWVudHMiLGNoaWxkcmVuOkMubWFwKEk9PkZsKEkpKX19aWYoZCYmZC5sZW5ndGg9PT0xKXt2YXIgXz1GbChkWzBdKTtyZXR1cm4gX31pZihmLnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShJPT5mLnRva2VuW0ldKSl7dmFyIGc9T2JqZWN0LmtleXMoZi50b2tlbikuZmlsdGVyKEk9PkkubWF0Y2goL0xpdGVyYWwvKXx8SS5tYXRjaCgvSWRlbnRpZmllci8pKVswXSx5PXtOdWxsTGl0ZXJhbDpudWxsLEJvb2xlYW5MaXRlcmFsOkJvb2xlYW4oZi50b2tlbiksTnVtZXJpY0xpdGVyYWw6TnVtYmVyKGYudG9rZW4pLFN0cmluZ0xpdGVyYWw6Zi50b2tlbixJZGVudGlmaWVyOmYudG9rZW59W2ddO3JldHVybnt0eXBlOmcsdmFsdWU6eX19cmV0dXJuIGYubmFtZT09PSJDYWxsRXhwcmVzc2lvbiI/e3R5cGU6IkNhbGxFeHByZXNzaW9uIixjaGlsZHJlbjpbRmwob1swXSksRmwob1sxXSldfTp7dHlwZTpvLmZpbHRlcihJPT5JLnRva2VuJiZJLnRva2VuLlB1bmN0dWF0b3IpWzBdLm5hbWUsY2hpbGRyZW46by5maWx0ZXIoST0+IUkudG9rZW58fCFJLnRva2VuLlB1bmN0dWF0b3IpLm1hcChJPT5GbChJKSl9fWZ1bmN0aW9uIHNfKGYpe3ZhciBvPW5ldyB0UihmKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoRmwoby50cmVlKSxudWxsKX1mdW5jdGlvbiBuUihmLG8pe3JldHVybiBvPT09ImJpbmQiJiYoZj09PSJiaW5kaW5neCJ8fGY9PT0iYmluZGluZyIpfWZ1bmN0aW9uIGxfKGYpe2lmKCFmKXJldHVybjt0cnl7Zj1KU09OLnBhcnNlKGYpfWNhdGNoKGQpe31sZXQgbz17fTtpZihsaShmKT9vLm9yaWdpbj1mOmYmJihvLm9yaWdpbj1mLm9yaWdpbixvLnRyYW5zZm9ybWVkPWYudHJhbnNmb3JtZWQpLCEoIW8udHJhbnNmb3JtZWQmJiFvLm9yaWdpbikpcmV0dXJuIG8udHJhbnNmb3JtZWQ9by50cmFuc2Zvcm1lZHx8c18oby5vcmlnaW4pLG99ZnVuY3Rpb24gclIoZil7cmV0dXJuIGYmJihmLmV4aXRFeHByZXNzaW9uPWxfKGYuZXhpdEV4cHJlc3Npb24pLGYucHJvcHMmJmYucHJvcHMuZm9yRWFjaChvPT57by5leHByZXNzaW9uPWxfKG8uZXhwcmVzc2lvbil9KSxmKX1mdW5jdGlvbiBpUihmKXtyZXR1cm4gZnVuY3Rpb24obz17fSl7aWYoV24oZikpcmV0dXJuIGYoe3N0YXRlOm8uc3RhdGU9PT0iZW5kIj8iZXhpdCI6by5zdGF0ZSx0Om8udCE9PXZvaWQgMD9vLnQ6by5kZWx0YVR9KX19ZnVuY3Rpb24gY18oZixvLGQpe3JldHVybiBkJiYoblIoZixvKT9mdW5jdGlvbihfLEM9ZnVuY3Rpb24oKXt9KXtpZighXyl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gclIoXyksZChfLF8mJl8uZXZlbnRUeXBlPT09InRpbWluZyI/aVIoQyk6Qyl9OmQpfWZ1bmN0aW9uIG9SKGYsbyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIltbQ3VycmVudEluc3RhbmNlSWRdXSIse3ZhbHVlOm99KX1mdW5jdGlvbiB1XyhmKXtyZXR1cm4gZlsiW1tDdXJyZW50SW5zdGFuY2VJZF1dIl19ZnVuY3Rpb24gYVIoZixvLGQpe2xldCBfPVhyKGYpO3JldHVybiFffHwhV24oXy5zZW5kKT8oY29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoJHtmfSkuYCksbnVsbCk6KC4uLkMpPT5fLnNlbmQoIm1vZHVsZSIse21vZHVsZTpvLG1ldGhvZDpkfSxDKX1mdW5jdGlvbiBzUihmLG8sZCxfKXtsZXQgQz1YcihmKTtyZXR1cm4hQ3x8IVduKEMuc2VuZCk/KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCR7Zn0pLmApLG51bGwpOlduKF8pP2I9PkMuc2VuZCgibW9kdWxlIix7bW9kdWxlOm8sbWV0aG9kOmR9LFtiXSk6KGNvbnNvbGUuZXJyb3IoYFtKUyBGcmFtZXdvcmtdICR7b30uJHtkfSBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uYCksbnVsbCl9dmFyIGxmPWNsYXNze2NvbnN0cnVjdG9yKG8sZCl7b1IodGhpcyxTdHJpbmcobykpLHRoaXMuY29uZmlnPWR8fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IHBhKG8sdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1LdSx0aGlzLmlzUmVnaXN0ZXJlZENvbXBvbmVudD1tZH1yZXF1aXJlTW9kdWxlKG8pe2xldCBkPXVfKHRoaXMpO2lmKCEoZCYmdGhpcy5kb2N1bWVudCYmdGhpcy5kb2N1bWVudC50YXNrQ2VudGVyKSl7Y29uc29sZS5lcnJvcihgW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHJlcXVpcmVNb2R1bGUoIiR7b30iKSwgaW5zdGFuY2UgKCR7ZH0pIGRvZXNuJ3QgZXhpc3QgYW55bW9yZS5gKTtyZXR1cm59aWYoIUt1KG8pKXtjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIFx1NUY1M1x1NTI0RFx1OEZEMFx1ODg0Q1x1NzY4NFx1NTdGQVx1NUVBN1x1NEUwRFx1NTMwNVx1NTQyQlx1NTM5Rlx1NzUxRlx1NjNEMlx1NEVGNlske299XVx1RkYwQ1x1OEJGN1x1NTcyOG1hbmlmZXN0XHU0RTJEXHU5MTREXHU3RjZFXHU4QkU1XHU2M0QyXHU0RUY2XHVGRjBDXHU5MUNEXHU2NUIwXHU1MjM2XHU0RjVDXHU1MzA1XHU2MkVDXHU4QkU1XHU1MzlGXHU3NTFGXHU2M0QyXHU0RUY2XHU3Njg0XHU4MUVBXHU1QjlBXHU0RTQ5XHU4RkQwXHU4ODRDXHU1N0ZBXHU1RUE3YCk7cmV0dXJufWxldCBfPXt9LEM9cXYobyk7Zm9yKGxldCBiIGluIEMpT2JqZWN0LmRlZmluZVByb3BlcnR5KF8sYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OigpPT5jXyhvLGIsYVIoZCxvLGIpKSxzZXQ6Zz0+c1IoZCxvLGIsZyl9KTtyZXR1cm4gX31zdXBwb3J0cyhvKXtpZighbGkobykpcmV0dXJuIG51bGw7bGV0IGQ9by5tYXRjaCgvXkAoXHcrKVwvKFtcdy1dKykoXC4oXHcrKSk/JC9pKTtpZihkKXtsZXQgXz1kWzFdLEM9ZFsyXSxiPWRbNF07c3dpdGNoKF8pe2Nhc2UibW9kdWxlIjpyZXR1cm4gS3UoQyxiKTtjYXNlImNvbXBvbmVudCI6cmV0dXJuIG1kKEMpfX1yZXR1cm4gbnVsbH1pbXBvcnRTY3JpcHQobyxkPXt9KXtsZXQgXz11Xyh0aGlzKSxDPVhyKF8pO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihiLGcpe2lmKCFDfHwhV24oQy5zZW5kKSlyZXR1cm4gZyhuZXcgRXJyb3IoYFtKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbXBvcnQgc2NyaXB0ICIke299Iiwgbm8gdGFza0NlbnRlciAoJHtffSkgbWF0Y2hlZC5gKSk7dHJ5e0Muc2VuZCgibW9kdWxlIix7bW9kdWxlOiJzY3JpcHQiLG1ldGhvZDoiaW1wb3J0U2NyaXB0In0sW28sZF0se2NhbGxiYWNrOlt5PT5iKHkpLHk9PmcoeSldfSl9Y2F0Y2goeSl7Zyh5KX19KX19O2Z1bmN0aW9uIGxSKGYsbyl7bGV0IGQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZC5zZXJ2aWNlPU9iamVjdC5jcmVhdGUobnVsbCksWnMuZm9yRWFjaCgoe25hbWU6XyxvcHRpb25zOkN9KT0+e2xldCBiPUMuY3JlYXRlO2lmKGIpdHJ5e2xldCBnPWIoZixvKTt0byhkLnNlcnZpY2UsZyksdG8oZCxnLmluc3RhbmNlKX1jYXRjaChnKXtjb25zb2xlLmVycm9yKGBbSlMgUnVudGltZV0gRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2aWNlICR7X30uYCl9fSksZGVsZXRlIGQuc2VydmljZS5pbnN0YW5jZSxaYShkLnNlcnZpY2UpLGR9dmFyIGNSPXt1aWQ6MH0sdVI9UnYoWGMpLGZSPUl2KFhjKTtmdW5jdGlvbiBmXyhmLG8sZCl7bGV0IF89bmV3IGxmKGYsbyksQz0iVnVlIixiPWxSKGYse3dlZXg6XyxudnVlOl8sY29uZmlnOm8sY3JlYXRlZDpEYXRlLm5vdygpLGZyYW1ld29yazpDfSk7WmEoYik7bGV0IGc9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gdG8oZyxfUihfKSksdG8oZyxiLHtTaGFyZWRPYmplY3Q6Y1Isd2VleDpfLG52dWU6XyxyZXF1aXJlTW9kdWxlOnk9Pl8ucmVxdWlyZU1vZHVsZSh5KSxfX1dFRVhfQ0FMTF9KQVZBU0NSSVBUX186cGQsc2VydmljZXM6Yn0pLGcucGx1cz1uZXcgZy5XZWV4UGx1cyhfKSxnLlZ1ZVNoYXJlZD1YYyxnLlVuaVNoYXJlZD11UixnLlZ1ZVJlYWN0aXZpdHk9ZlIsWG0oZixnKSxaYShnKSxnfWZ1bmN0aW9uIGRSKGYsbyxkPXt9KXtsZXQgXz0iVnVlIjtkPW5kKGQpLGQuZW52PW5kKGdsb2JhbC5XWEVudmlyb25tZW50fHx7fSksZC5idW5kbGVUeXBlPV87bGV0IEM9Zl8oZixkKTtoUihvLEMpfWZ1bmN0aW9uIGhSKGYsbyl7bGV0IGQ9W10sXz1bXTtmb3IobGV0IGcgaW4gbylkLnB1c2goZyksXy5wdXNoKG9bZ10pO2xldCBiPSIoZnVuY3Rpb24gKGdsb2JhbCkgeyAiK2AKZ2xvYmFsID0gKGZ1bmN0aW9uICgpIHsKICB2YXIgZwogIC8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlCiAgZyA9IChmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpcwogIH0pKCkKICB0cnkgewogICAgLy8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApCiAgICBnID0gZyB8fCBuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKQogIH0gY2F0Y2ggKGUpIHsKICAgIC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlCiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIpIGcgPSB3aW5kb3cKICB9CiAgcmV0dXJuIGcKfSkoKSB8fCBnbG9iYWw7CmArZisiIH0pKE9iamVjdC5jcmVhdGUodGhpcykpIjtyZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLmQsYikoLi4uXyl9ZnVuY3Rpb24gZ1IoZil7bGV0IG89a3MoZik7dHJ5e2lmKG8mJm8uYm9keSlyZXR1cm4gby5ib2R5LnRvSlNPTigpfWNhdGNoKGQpe2NvbnNvbGUuZXJyb3IoIltKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBnZXQgdGhlIHZpcnR1YWwgZG9tIHRyZWUuIik7cmV0dXJufX1mdW5jdGlvbiBwUihmKXtTdihmKSxacy5mb3JFYWNoKG89PntsZXQgZD1vLm9wdGlvbnMuZGVzdHJveTtkJiZkKGYpfSl9ZnVuY3Rpb24gdlIoZil7d3YoZiksWnMuZm9yRWFjaChvPT57bGV0IGQ9by5vcHRpb25zLnJlZnJlc2g7ZCYmZChmKX0pfXZhciBtUj17Y3JlYXRlSW5zdGFuY2U6ZFIsY3JlYXRlSW5zdGFuY2VDb250ZXh0OmZfLGdldFJvb3Q6Z1IsZ2V0RG9jdW1lbnQ6a3MscmVnaXN0ZXJTZXJ2aWNlOlp1LHVucmVnaXN0ZXJTZXJ2aWNlOlh1LGNhbGxKUyhmLG8pe3JldHVybiBwZChmLG8pfSxyZWdpc3RlckNvbXBvbmVudHM6SnYscmVnaXN0ZXJNb2R1bGVzOll2LGRlc3Ryb3lJbnN0YW5jZTpwUixyZWZyZXNoSW5zdGFuY2U6dlJ9O2Z1bmN0aW9uIElkKCl7cmV0dXJuIEd2KCksbVJ9ZnVuY3Rpb24gX1IoZil7aWYoZ2xvYmFsLnNldFRpbWVvdXQmJmdsb2JhbC5zZXRJbnRlcnZhbClyZXR1cm57c2V0VGltZW91dDpnbG9iYWwuc2V0VGltZW91dCxzZXRJbnRlcnZhbDpnbG9iYWwuc2V0SW50ZXJ2YWwsY2xlYXJUaW1lb3V0Omdsb2JhbC5jbGVhclRpbWVvdXQsY2xlYXJJbnRlcnZhbDpnbG9iYWwuY2xlYXJJbnRlcnZhbH07bGV0IG89Zi5yZXF1aXJlTW9kdWxlKCJ0aW1lciIpO3JldHVybntzZXRUaW1lb3V0OiguLi5fKT0+e2xldCBDPWZ1bmN0aW9uKCl7X1swXSguLi5fLnNsaWNlKDIpKX07cmV0dXJuIG8uc2V0VGltZW91dChDLF9bMV0pLGYuZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKX0sc2V0SW50ZXJ2YWw6KC4uLl8pPT57bGV0IEM9ZnVuY3Rpb24oKXtfWzBdKC4uLl8uc2xpY2UoMikpfTtyZXR1cm4gby5zZXRJbnRlcnZhbChDLF9bMV0pLGYuZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKX0sY2xlYXJUaW1lb3V0Ol89PntvLmNsZWFyVGltZW91dChfKX0sY2xlYXJJbnRlcnZhbDpfPT57by5jbGVhckludGVydmFsKF8pfX19dmFyIGRfPXtEb2N1bWVudDpwYSxFbGVtZW50OmJvLENvbW1lbnQ6TGwsTGlzdGVuZXI6QWMsVGFza0NlbnRlcjp3YyxzZW5kVGFza3MoLi4uZil7cmV0dXJuIFduKGNhbGxOYXRpdmUpP2NhbGxOYXRpdmUoLi4uZik6KGdsb2JhbC5jYWxsTmF0aXZlfHwoKCk9Pnt9KSkoLi4uZil9fTtwYS5oYW5kbGVyPWRfLnNlbmRUYXNrczt2YXIgRGw9ZF87ZnVuY3Rpb24gYlIoKXtaYShEbC5Db21tZW50KSxaYShEbC5MaXN0ZW5lciksWmEoRGwuRG9jdW1lbnQucHJvdG90eXBlKSxaYShEbC5Db21tZW50LnByb3RvdHlwZSksWmEoRGwuTGlzdGVuZXIucHJvdG90eXBlKX12YXIgY2Y9e3NlcnZpY2U6e3JlZ2lzdGVyOlp1LHVucmVnaXN0ZXI6WHUsaGFzOl9kfSxmcmVlemVQcm90b3R5cGU6YlIsaW5pdDpJZCxjb25maWc6RGx9O3ZhciBSZD1jbGFzc3tjb25zdHJ1Y3RvcihvLGQ9e30pe3RoaXMudHlwZT1vfHwibWVzc2FnZSIsdGhpcy5kYXRhPWQuZGF0YXx8bnVsbCx0aGlzLm9yaWdpbj1kLm9yaWdpbnx8IiIsdGhpcy5zb3VyY2U9ZC5zb3VyY2V8fG51bGwsdGhpcy5wb3J0cz1kLnBvcnRzfHxbXSx0aGlzLnRhcmdldD1udWxsLHRoaXMudGltZVN0YW1wPURhdGUubm93KCl9fTt2YXIgWHM9e30saXU9e307ZnVuY3Rpb24geGQoKXt9eGQucHJvdG90eXBlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGYpe2lmKHRoaXMuX2Nsb3NlZCl0aHJvdyBuZXcgRXJyb3IoYEJyb2FkY2FzdENoYW5uZWwgIiR7dGhpcy5uYW1lfSIgaXMgY2xvc2VkLmApO2xldCBvPVhzW3RoaXMubmFtZV07aWYobyYmby5sZW5ndGgpZm9yKGxldCBkPTA7ZDxvLmxlbmd0aDsrK2Qpe2xldCBfPW9bZF07Xy5fY2xvc2VkfHxfPT09dGhpc3x8V24oXy5vbm1lc3NhZ2UpJiZfLm9ubWVzc2FnZShuZXcgUmQoIm1lc3NhZ2UiLHtkYXRhOmZ9KSl9fTt4ZC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtpZighdGhpcy5fY2xvc2VkJiYodGhpcy5fY2xvc2VkPSEwLFhzW3RoaXMubmFtZV0pKXtsZXQgZj1Yc1t0aGlzLm5hbWVdLmZpbHRlcihvPT5vIT09dGhpcyk7Zi5sZW5ndGg/WHNbdGhpcy5uYW1lXT1mOmRlbGV0ZSBYc1t0aGlzLm5hbWVdfX07dmFyIGhfPXtjcmVhdGU6Zj0+e2lmKGl1W2ZdPVtdLFduKGdsb2JhbC5Ccm9hZGNhc3RDaGFubmVsKSlyZXR1cm57fTtsZXQgbz17QnJvYWRjYXN0Q2hhbm5lbDpmdW5jdGlvbihkKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmFtZSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiExLHZhbHVlOlN0cmluZyhkKX0pLHRoaXMuX2Nsb3NlZD0hMSx0aGlzLm9ubWVzc2FnZT1udWxsLFhzW3RoaXMubmFtZV18fChYc1t0aGlzLm5hbWVdPVtdKSxYc1t0aGlzLm5hbWVdLnB1c2godGhpcyksaXVbZl0ucHVzaCh0aGlzKX19O3JldHVybiBvLkJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlPXhkLnByb3RvdHlwZSx7aW5zdGFuY2U6b319LGRlc3Ryb3k6Zj0+e2l1W2ZdJiYoaXVbZl0uZm9yRWFjaChvPT5vLmNsb3NlKCkpLGRlbGV0ZSBpdVtmXSl9fTtmdW5jdGlvbiBCZCgpe2xldHtpbml0OmZ9PWNmO2NmLnNlcnZpY2UucmVnaXN0ZXIoIkJyb2FkY2FzdENoYW5uZWwiLGhfKSxjZi5mcmVlemVQcm90b3R5cGUoKTtsZXQgbz1mKCk7Zm9yKGxldCBkIGluIG8pZ2xvYmFsW2RdPSguLi5fKT0+e2xldCBDPW9bZF0oLi4uXyk7cmV0dXJuIEMgaW5zdGFuY2VvZiBFcnJvciYmY29uc29sZS5lcnJvcihDLnRvU3RyaW5nKCkpLEN9fXZhciBMTD1nbG9iYWwuY29uc29sZTtmdW5jdGlvbiBnXygpe2lmKEJ2KCksZ2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtIT09IldlYiIpZ2xvYmFsLmNvbnNvbGU9e2RlYnVnOiguLi5mKT0+e29yKCJkZWJ1ZyIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLm91KGYpLCJfX0RFQlVHIil9LGxvZzooLi4uZik9PntvcigibG9nIikmJmdsb2JhbC5uYXRpdmVMb2coLi4ub3UoZiksIl9fTE9HIil9LGluZm86KC4uLmYpPT57b3IoImluZm8iKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5vdShmKSwiX19JTkZPIil9LHdhcm46KC4uLmYpPT57b3IoIndhcm4iKSYmZ2xvYmFsLm5hdGl2ZUxvZyguLi5vdShmKSwiX19XQVJOIil9LGVycm9yOiguLi5mKT0+e29yKCJlcnJvciIpJiZnbG9iYWwubmF0aXZlTG9nKC4uLm91KGYpLCJfX0VSUk9SIil9fTtlbHNle2xldHtkZWJ1ZzpmLGxvZzpvLGluZm86ZCx3YXJuOl8sZXJyb3I6Q309Y29uc29sZTtjb25zb2xlLl9fb3JpX189e2RlYnVnOmYsbG9nOm8saW5mbzpkLHdhcm46XyxlcnJvcjpDfSxjb25zb2xlLmRlYnVnPSguLi5iKT0+e29yKCJkZWJ1ZyIpJiZjb25zb2xlLl9fb3JpX18uZGVidWcuYXBwbHkoY29uc29sZSxiKX0sY29uc29sZS5sb2c9KC4uLmIpPT57b3IoImxvZyIpJiZjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsYil9LGNvbnNvbGUuaW5mbz0oLi4uYik9PntvcigiaW5mbyIpJiZjb25zb2xlLl9fb3JpX18uaW5mby5hcHBseShjb25zb2xlLGIpfSxjb25zb2xlLndhcm49KC4uLmIpPT57b3IoIndhcm4iKSYmY29uc29sZS5fX29yaV9fLndhcm4uYXBwbHkoY29uc29sZSxiKX0sY29uc29sZS5lcnJvcj0oLi4uYik9PntvcigiZXJyb3IiKSYmY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsYil9fX1mdW5jdGlvbiBvdShmKXtyZXR1cm4gZi5tYXAobz0+e2lmKGdzKG8pLnRvTG93ZXJDYXNlKCk9PT0iW29iamVjdCBvYmplY3RdIil0cnl7bz1KU09OLnN0cmluZ2lmeShvKX1jYXRjaChfKXtvPSJbb2JqZWN0IG9iamVjdF0ifWVsc2Ugbz1TdHJpbmcobyk7cmV0dXJuIG99KX1nXygpO0JkKCk7fSkoKTsKLyohICNfX05PX1NJREVfRUZGRUNUU19fICovCi8qKgoqIEBkY2xvdWRpby91bmktYXBwLW52dWUgdjMuNC4yMQoqIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzCiogQGxpY2Vuc2UgTUlUCioqLwovKioKKiBAZGNsb3VkaW8vdW5pLWFwcC1zZXJ2aWNlLXZ1ZSB2My40LjIxCiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnMKKiBAbGljZW5zZSBNSVQKKiovCi8qKgoqIEB2dWUvcmVhY3Rpdml0eSB2My40LjIxCiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnMKKiBAbGljZW5zZSBNSVQKKiovCi8qKgoqIEB2dWUvc2hhcmVkIHYzLjQuMjEKKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9ycwoqIEBsaWNlbnNlIE1JVAoqKi8K