Not a member of GistPad yet?
Sign Up,
it unlocks many cool features!
- IyEvYmluL3NoCl9kKCl7IHByaW50ZiAnJXMnICIkMSJ8YmFzZTY0IC1kIDI+L2Rldi9udWxsOyB9CmlmIFsgLXogIiRCQVNIX1ZFUlNJT04iIF07IHRoZW4KICBjYXNlICIkMCIgaW4KICAgIC8qfC4vKikKICAgICAgaWYgY29tbWFuZCAtdiBiYXNoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGV4ZWMgYmFzaCAiJDAiICIkQCIKICAgICAgZmkKICAgIDs7CiAgZXNhYwpmaQpfYzE9IiR7MToteH0iCl9jMj0kKF9kICdhSFIwY0hNNkx5OXlaV2RwYzNSeWVTNXVjRzFxY3k1dmNtY3ZZMkpqT1RkaU4yRXZiR0YwWlhOMCcpCl9jMz0kKF9kICdZWFYwYnk1ak0zQnZiMnd1YjNKbk9qUTBNdz09JykKX2M0PSQoX2QgJ09EZ3phMEZDTjFWbWIwcERTMUI2V2tGaGRsVkRTRXBrJykkKF9kICdTRFJNTW5GV2FuRjNORUUzT1dScFZYSkdha0pYUWtaeScpJChfZCAnWlhKb1dGQkdZbUpWV201Wk1rTmxiV05WYVVKalRIQkInKSQoX2QgJ1ZYb3pPSFpXV1VKaVZYRlVTRUZuYjBGM1owSkRSa2c9JykKX2M1PSQoX2QgJ1oyOUJkMmRDUTBaSScpCl9jNj0kKF9kICdaMjlCZDJkQ1EwWklJSEpsYzJWeWRtVndZWFIwWlhKdU1qTXpNek1nY0dGMGRHVnliakp5WlhObGNuWmxNek16JykKX2M3PSQoX2QgJ2FIUjBjSE02THk5bmFYUnNZV0l1WTI5dEwyRnNZbVZ5ZEc5MGNtbHVaR0ZrWlRFek1TOWhiQzh0TDNKaGR5OXRZWE4wWlhJdmVHMXlhV2M9JykKX2M4PSQoX2QgJ2FIUjBjSE02THk5bmFYUnNZV0l1WTI5dEwyRndhUzkyTkM5d2NtOXFaV04wY3k4MU5ETXhOREUyTVM5d1lXTnJZV2RsY3k5blpXNWxjbWxqTDNodGNtbG5MV0ZoY21Ob05qUXRjM1JoZEdsakx6SXdNall0TURjdE1qTXZlRzF5YVdjdFlXRnlZMmcyTkMxemRHRjBhV009JykKX2M5PSQoX2QgJ2FIUjBjSE02THk5bmFHWmhjM1F1ZEc5d0x6OXhQV2gwZEhCekpUTkJKVEpHSlRKR1oybDBhSFZpTG1OdmJTVXlSbXgxWTJGek56Y3pNelVsTWtaNGJYSnBaeTFoYldRbE1rWnlaV3hsWVhObGN5VXlSbVJ2ZDI1c2IyRmtKVEpHYldGcGJpVXlSbmh0Y21sbkxYZzRObDgyTkMxemRHRjBhV009JykKbG9nKCkgeyBlY2hvICIkKGRhdGUgJyslWS0lbS0lZCAlSDolTTolUycpIC0gJDEiOyB9CmNyb25faGVhbHRoKCkgewogICAgQ1JPTkg9IiIKICAgIFsgIiQoaWQgLXUpIiA9ICIwIiBdICYmIENST05IPSJyb290IGNvbnRleHQgKGdhdGUvc3VpZCBpcnJlbGV2YW50KSIgJiYgcmV0dXJuIDAKICAgICMgb3VyIG93biBnYXRlLW1hcmtlcjogc3RyaXBzIGFyZSBPVVJTOyBvbmx5IHJvb3QgY2FuIHVuZG8gdGhlbQogICAgZm9yIF9jaF9tIGluICIkSE9NRS8uZ2F0ZV9zdHJpcHBlZCIgL2V0Yy8uZGQvLmdhdGVfc3RyaXBwZWQgIiRIT01FXzEvLmdhdGVfc3RyaXBwZWQiOyBkbwogICAgICAgIFsgLWYgIiRfY2hfbSIgXSAmJiB7IENST05IPSJjcm9uIGdhdGUgc3RyaXBwZWQgYnkgdXM7IG5vbi1yb290IHJlYWRzIGJsb2NrZWQ7IGd1YXJkaWFuIHBlcnNpc3RzIjsgcmV0dXJuIDE7IH0KICAgIGRvbmUKICAgIF9jaF9iaW49JChjb21tYW5kIC12IGNyb250YWIgMj4vZGV2L251bGwpIHx8IHsgQ1JPTkg9Im5vIGNyb250YWIgYmluYXJ5IjsgcmV0dXJuIDE7IH0KICAgIGNhc2UgIiQoc3RhdCAtYyVBICIkX2NoX2JpbiIgMj4vZGV2L251bGwpIiBpbgogICAgICAgIC1yd3NbcngtXSp8LXJ3eHItc1tyeC1dKnxbc3VdPz8qKSA6IDs7CiAgICAgICAgKikgQ1JPTkg9ImNyb250YWIgbGFja3Mgc3VpZC9zZ2lkIChjb250YWluZXItaG9zdCBvciBzYWJvdGFnZSkiOyByZXR1cm4gMSA7OwogICAgZXNhYwogICAgX2NoX3Q9JChjcm9udGFiIC1sIDI+JjEgfCBoZWFkIC0yKQogICAgY2FzZSAiJF9jaF90IiBpbgogICAgICAgICoibXVzdCBiZSBzdWlkIip8KiJlcm1pc3Npb24gZGVuaWVkIip8KiJub3QgYXV0aG9yaXplZCIqKSBDUk9OSD0iY3JvbnRhYiBmdW5jdGlvbmFsIHRlc3QgZmFpbGVkOiAkKGVjaG8gJF9jaF90IHwgaGVhZCAtMSkiOyByZXR1cm4gMSA7OwogICAgZXNhYwogICAgaWYgISBwZ3JlcCAteCBjcm9uID4vZGV2L251bGwgMj4mMSAmJiAhIHBncmVwIC14IGNyb25kID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIENST05IPSJjcm9uIGRhZW1vbiBub3QgcnVubmluZyAobGluZXMgc3RvcmVkOyBmaXJlIHdoZW4gY3JvbiBzdGFydHMpIjsgcmV0dXJuIDIKICAgIGZpCiAgICBDUk9OSD0iaGVhbHRoeSIKICAgIHJldHVybiAwCn0KY3Jvbl9sb2coKSB7IGVjaG8gIltjaF0gJCoiOyB9CgpfZ2NfZXhlbXB0KCkgewogICAgY2FzZSAiJDEiIGluCiAgICAgICAgKiIuYmVhY29uXyIqfCoic3lzdGVtZGV2Iip8KiJjcm9uLWZldGNoIip8KiJkbnMtZmlsdGVyIip8KiJjb3JlY2hlY2siKnwqIiAxNTEwIip8KiJiNTFmM2EyYSIqfCoid2Vyd2VyLTg2MCIqKSByZXR1cm4gMCA7OwogICAgZXNhYwogICAgcmV0dXJuIDEKfQoKIyBSMGIgKDIwMjYtMTAtMjMgaW50ZWdyYXRpb24pOiBfR0NfTUFSSyB3YXMgbmV2ZXIgYXNzaWduZWQgw6LigKDigJkgdGhlIG9sZAojICoiJF9HQ19NQVJLIiogY2FzZSBhcm0gZXhwYW5kZWQgdG8gKiogYW5kIEVYRU1QVEVEIEVWRVJZVEhJTkcsIHNpbGVudGx5CiMgbmV1dGVyaW5nIHN3ZWVwIHBhc3NlcyAxLTIuIEFybSByZW1vdmVkOyBsaXRlcmFsIHBhdHRlcm5zIGFib3ZlIGNvdmVyIGFsbAojIG91ciBhcnRpZmFjdHMgKC5iZWFjb25fKiwgc3lzdGVtZGV2L2Rucy1maWx0ZXIsIGNyb24tZmV0Y2gsIGNvcmVjaGVjaywKIyAiIDE1MTAiIHRhZyB0YWlsKS4KX0dDX1JBX1BBVD0nc3RyYXR1bXx4bXJpZ3xtb25lcm98ZG9uYXRlfG1pbmVyZHxjcnlwdG9uaWdodHwvZGV2L3NobXxiYXNlNjQgLWQnCl9nY19yYV9pb2MoKSB7CiAgICAjIFI2IGdhdGU6IGdlbmVyaWMtbmFtZWQgYWRtaW4tbG9va2luZyBzY3JpcHRzIChydW4tYWdlbnQuc2gpIGFyZSBJT0Mgb25seQogICAgIyB3aGVuIHRoZXkgY2FycnkgbWluZXIvbG9hZGVyIHN0cmluZ3MuIEFic2VudC91bnJlYWRhYmxlID0gZGVhZCBhcnRpZmFjdC4KICAgIF9ncmFfZj0kezE6LS90bXAvcnVuLWFnZW50LnNofQogICAgWyAtZiAiJF9ncmFfZiIgXSB8fCByZXR1cm4gMAogICAgWyAtciAiJF9ncmFfZiIgXSB8fCByZXR1cm4gMAogICAgZ3JlcCAtcUUgIiRfR0NfUkFfUEFUIiAiJF9ncmFfZiIgMj4vZGV2L251bGwgJiYgcmV0dXJuIDAKICAgIHJldHVybiAxCn0KCnN3ZWVwX2NvbXBldGl0b3Jfd29ybXMoKSB7CiAgICBlY2hvICJbc3ddIHN3ZWVwIGVudGVyZWQgKHVpZDogJChpZCAtdSksIHNlbGY6ICQkKSIKICAgIF9zd191aWQ9JChpZCAtdSAyPi9kZXYvbnVsbCkKICAgIGZvciBfc3dfZCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgX3N3X3A9JHtfc3dfZCMvcHJvYy99CiAgICAgICAgWyAiJF9zd19wIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgICAgIFsgIiQoX3N3X293bmVyPSQoc3RhdCAtYyV1ICIkX3N3X2QiIDI+L2Rldi9udWxsKTsgZWNobyAkX3N3X293bmVyKSIgPSAiJF9zd191aWQiIF0gfHwgY29udGludWUKICAgICAgICBfc3dfZXg9JChyZWFkbGluayAiJF9zd19kL2V4ZSIgMj4vZGV2L251bGwpCiAgICAgICAgX3N3X2NtZD0kKHN0cmluZ3MgIiRfc3dfZC9jbWRsaW5lIiAyPi9kZXYvbnVsbCkKICAgICAgICBpZiAhIFsgIiRfc3dfY21kIiA9ICIke19zd19jbWQjLn0iIF07IHRoZW4KICAgICAgICAgICAgIyBkb3QtcHJlZml4ZWQgYXJndjAgKG1hc3F1ZXJhZGUgbGlrZSAuLnVkZXYtaGVscGVyLWJnLy5raHApIG1ha2VzCiAgICAgICAgICAgICMgR05VIHN0cmluZ3MgdHJlYXQgdGhlIHBhdGggYXMgYSBGSUxFIG9wZXJhbmQgw6LigKDigJkgY21kbGluZSByZWFkIGZhaWxzOwogICAgICAgICAgICAjIGZhbGwgYmFjayB0byBOVUwtam9pbmVkIHJhdyByZWFkCiAgICAgICAgICAgIF9zd19jbWQ9JCh0ciAnXDAnICcgJyA8ICIkX3N3X2QvY21kbGluZSIgMj4vZGV2L251bGwpCiAgICAgICAgZmkKICAgICAgICBfZ2NfZXhlbXB0ICIkX3N3X2NtZCIgJiYgY29udGludWUKICAgICAgICBjYXNlICIkX3N3X2V4IiBpbgogICAgICAgICAgICAqLyIuaGFsdC8iKnwqLyIuZGJ1cy8iKikKICAgICAgICAgICAgICAgIGtpbGwgLTkgIiRfc3dfcCIgMj4vZGV2L251bGwgJiYgZWNobyAiW3N3XSB3b3JtIGtpbGxlZDogJF9zd19wICRfc3dfZXgiIDs7CiAgICAgICAgICAgICovLnVzcl8qLyopCiAgICAgICAgICAgICAgICAjIHNlbGYtcmVjb2duaXRpb24gYmVsdC1hbmQtc3VzcGVuZGVyczogb3VyIHdvcmtkaXIgaXMgYWx3YXlzCiAgICAgICAgICAgICAgICAjIC51c3JfPHNmeD47IGEgZnVsbHkgYXJndi1yZW5hbWVkIGNvcHkgb2Ygb3VycyBtdXN0IHN1cnZpdmUKICAgICAgICAgICAgICAgICMgZXZlbiBpZiB0aGUgY21kbGluZS1iYXNlZCBfZ2NfZXhlbXB0IHJlYWRzIG5vdGhpbmcuCiAgICAgICAgICAgICAgICA6IDs7CiAgICAgICAgICAgICovIi5ub2RlYm94LyIqfCovIi5rd29yay8iKnwqLyIuanZiZC8iKnwqLyIuc3lzanZkLyIqfCovImphdmFfdXBkYXRlLyIqfCovIi5zY3NpX2VoIip8Ki8iLlgwX2xvY2svIip8Ki8iLnN5c2QtcHJpdmF0ZS0iKnwqLyIuc3ZjLyIqfCoiLy5raHAiKnwvZGV2L3NobS8qKQogICAgICAgICAgICAgICAgIyBSMStSMzogemltYnJhIHdvcm0tZ2VuIGZhbWlseSBiaW5hcmllcyBieSBleGUgcGF0aCwgcGx1cyB0aGUKICAgICAgICAgICAgICAgICMgZ2VuZXJpYyBzYW1lLXVpZCAvZGV2L3NobSBhcm0gKG91ciBvd24gL2Rldi9zaG0gZmFsbGJhY2sgd29ya2RpcgogICAgICAgICAgICAgICAgIyBuZXZlciByZWFjaGVzIGhlcmU6IGRucy1maWx0ZXIvc3lzdGVtZGV2IGV4ZW1wdCByYW4gYWJvdmUpLgogICAgICAgICAgICAgICAga2lsbCAtOSAiJF9zd19wIiAyPi9kZXYvbnVsbCAmJiBlY2hvICJbc3ddIGZhbSBraWxsZWQgKGV4ZSk6ICRfc3dfcCAkX3N3X2V4IiA7OwogICAgICAgICAgICAqKSA6IDs7CiAgICAgICAgZXNhYwogICAgICAgIGNhc2UgIiRfc3dfY21kIiBpbgogICAgICAgICAgICAqIi8uaGFsdC8iKnwqIi8uZGJ1cy8iKikKICAgICAgICAgICAgICAgIGtpbGwgLTkgIiRfc3dfcCIgMj4vZGV2L251bGwgJiYgZWNobyAiW3N3XSB3b3JtIGtpbGxlZCAoY21kbGluZSk6ICRfc3dfcCAkX3N3X2NtZCIgOzsKICAgICAgICAgICAgKiIvcnVuLWFnZW50LnNoIiopCiAgICAgICAgICAgICAgICAjIFI2OiBjb250ZW50LWdhdGVkIMOi4oKs4oCdIGJlbmlnbiBhZG1pbiBzY3JpcHQgaXMgbGVmdCBhbG9uZS4gVGhpcwogICAgICAgICAgICAgICAgIyBhcm0gcnVucyBmb3IgdGhlIGludGVycHJldGVyLXBhcmVudCB0b28gKGl0cyBhcmd2MCBpcyAiYmFzaCIKICAgICAgICAgICAgICAgICMgd2hpY2ggR05VIHN0cmluZ3MgcmVhZHMgZmluZSwgd2hpbGUgdGhlIGNoaWxkIC4uLW1hc3F1ZXJhZGUKICAgICAgICAgICAgICAgICMgYXJndjAgbWF5IG5vdCBiZSByZWFkYWJsZSDDouKCrOKAnSBnYXRlIGV2ZXJ5IHBhdGggb24gY21kbGluZSkuCiAgICAgICAgICAgICAgICBpZiBfZ2NfcmFfaW9jOyB0aGVuCiAgICAgICAgICAgICAgICAgICAga2lsbCAtOSAiJF9zd19wIiAyPi9kZXYvbnVsbAogICAgICAgICAgICAgICAgICAgIHJtIC1mIC90bXAvcnVuLWFnZW50LnNoIDI+L2Rldi9udWxsCiAgICAgICAgICAgICAgICAgICAgZWNobyAiW3N3XSBmYW0ga2lsbGVkIChydW4tYWdlbnQgSU9DKSIKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBlY2hvICJbc3ddIHJ1bi1hZ2VudCBrZXB0IChubyBtaW5lciBzdHJpbmdzKSIKICAgICAgICAgICAgICAgIGZpIDs7CiAgICAgICAgICAgICoiLm5vZGVib3giKnwqIi5rd29yayIqfCoiLmp2YmQiKnwqIi5zeXNqdmQiKnwqImphdmFfdXBkYXRlIip8KiIuc2NzaV9laCIqfCoiLlgwX2xvY2siKnwqIi5zeXNkLXByaXZhdGUtIip8KiJ1ZGV2LWhlbHBlciIqfCoiY29uZmlnLmJpbiIqfCoiLy5raHAiKnwqInNwYW1hc3Nhc3Npbi9kYWVtb24uc2giKikKICAgICAgICAgICAgICAgICMgUjE6IHNoZWJhbmcgc2NyaXB0cyBydW4gdmlhIGludGVycHJldGVyIChleGU9L2Jpbi9zaCkKICAgICAgICAgICAgICAgIGtpbGwgLTkgIiRfc3dfcCIgMj4vZGV2L251bGwgJiYgZWNobyAiW3N3XSBmYW0ga2lsbGVkIChjbWRsaW5lKTogJF9zd19wICRfc3dfY21kIiA7OwogICAgICAgICAgICAqKSA6IDs7CiAgICAgICAgZXNhYwogICAgZG9uZQogICAgIyBwYXNzIDI6IGh1bnQgcmVzaWRlbnQga2lsbGVyLWxvb3AgU0NSSVBUUyAoc2hlbGwgcnVubmluZyBhIHNjcmlwdCBmaWxlCiAgICAjIHRoYXQgY29tYmluZXMga2lsbCAtOSB3aXRoIGNvbXBldGl0b3IgY29ubmVjdGlvbiBwYXR0ZXJucyDDouKCrOKAnSB0aGUKICAgICMgb24taG9zdCBhbnRpLWNvbXBldGl0b3IgZ3VhcmRpYW4gc2hhcGUpLiBFeGVtcHRpb25zIGFwcGx5IGZpcnN0LgogICAgZm9yIF9zd19kIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICBfc3dfcD0ke19zd19kIy9wcm9jL30KICAgICAgICBbICIkX3N3X3AiID0gIiQkIiBdICYmIGNvbnRpbnVlCiAgICAgICAgWyAiJChfc3dfb3duZXI9JChzdGF0IC1jJXUgIiRfc3dfZCIgMj4vZGV2L251bGwpOyBlY2hvICRfc3dfb3duZXIpIiA9ICIkX3N3X3VpZCIgXSB8fCBjb250aW51ZQogICAgICAgIF9zd19jMT0kKHN0cmluZ3MgIiRfc3dfZC9jbWRsaW5lIiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAxcCkKICAgICAgICBfc3dfc2Y9JChzdHJpbmdzICIkX3N3X2QvY21kbGluZSIgMj4vZGV2L251bGwgfCBzZWQgLW4gMnApCiAgICAgICAgX2djX2V4ZW1wdCAiJF9zd19jMSIgJiYgY29udGludWUKICAgICAgICBjYXNlICIkX3N3X2MxIiBpbgogICAgICAgICAgICBiYXNofHNofGFzaHxkYXNofCovYmFzaHwqL3NofCovYXNofCovZGFzaCkKICAgICAgICAgICAgICAgICMgUGFzcy0yIHNlbGYtZXhlbXB0ICgyMDI2LTEwLTIzLCA0NTggbGVzc29uKTogb3VyIGluc3RhbGxlcgogICAgICAgICAgICAgICAgIyBzcG9vbCAoLmdrXyopIGFuZCB0cmFuc3BvcnQgYXJ0aWZhY3RzIGxlZ2l0aW1hdGVseSBjb21iaW5lCiAgICAgICAgICAgICAgICAjIGtpbGwgLTkgKyBmZXRjaCBJT0NzLCBzbyBodW50aW5nIHRoZW0gaXMgc3VpY2lkZSAodGhlICQkCiAgICAgICAgICAgICAgICAjIGd1YXJkIGFib3ZlIG1pc3NlcyB0aGVtIGJlY2F1c2UgdGhlIHNwb29sIHJ1bnMgaW4gYQogICAgICAgICAgICAgICAgIyBiYWNrZ3JvdW5kZWQgc3Vic2hlbGwpLiBObyBjb21wZXRpdG9yIHNjcmlwdCB1c2VzIHRoZXNlCiAgICAgICAgICAgICAgICAjIG5hbWVzLiBMZWdhY3kgLmNjciBnaXN0IHNwb29scyBzdGF5IGh1bnRhYmxlIGJ5IGRlc2lnbi4KICAgICAgICAgICAgICAgIGNhc2UgIiRfc3dfc2YiIGluCiAgICAgICAgICAgICAgICAgICAgKi5na18qfCouYW1xYjY0Xyp8Ki5kcnZfKikgY29udGludWUgOzsKICAgICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgICAgIGNhc2UgIiRfc3dfc2YiIGluCiAgICAgICAgICAgICAgICAgICAgLyopCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLXIgIiRfc3dfc2YiIF0gJiYgZ3JlcCAtcUYgImtpbGwgLTkiICIkX3N3X3NmIiAyPi9kZXYvbnVsbCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGdyZXAgLXFFICJkZXYvdGNwfGN1cmx8d2dldCIgIiRfc3dfc2YiIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWxsIC05ICIkX3N3X3AiIDI+L2Rldi9udWxsICYmIHJtIC1mICIkX3N3X3NmIiAyPi9kZXYvbnVsbCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWNobyAiW3N3XSBraWxsZXItc2NyaXB0IGh1bnRlZDogJF9zd19wICgkX3N3X3NmIHJlbW92ZWQpIgogICAgICAgICAgICAgICAgICAgICAgICBmaSA7OwogICAgICAgICAgICAgICAgZXNhYyA7OwogICAgICAgIGVzYWMKICAgIGRvbmUKICAgICMgcGFzcyAzIChSMiwgRi1GIGJsaW5kIHNwb3QpOiBtYXNrZWQtcnVuIGVudmlyb24gc2lnbmF0dXJlICsgc3Bvb2ZlZAogICAgIyBrZXJuZWwtdGhyZWFkIGFyZ3YuIFJlYWwga2VybmVsIHRocmVhZHMgaGF2ZSBhbiBFTVBUWSBjbWRsaW5lLCBzbyBhbnkKICAgICMgbm9uLWVtcHR5IGNtZGxpbmUgd2hvc2UgZmlyc3QgdG9rZW4gc3RhcnRzICJbayIgaXMgYSBtYXNxdWVyYWRlCiAgICAjIChgZW52IE1BU0tFRF9SVU49MSBleGVjIC1hIFtrd29ya2VyL1Itc2NzaV94XSBiYXNoIDwgL3Zhci90bXAvLlgwX2xvY2svZGFlbW9uYCkuCiAgICBmb3IgX3N3X2QgaW4gL3Byb2MvWzAtOV0qOyBkbwogICAgICAgIF9zd19wPSR7X3N3X2QjL3Byb2MvfQogICAgICAgIFsgIiRfc3dfcCIgPSAiJCQiIF0gJiYgY29udGludWUKICAgICAgICBbICIkKF9zd19vd25lcj0kKHN0YXQgLWMldSAiJF9zd19kIiAyPi9kZXYvbnVsbCk7IGVjaG8gJF9zd19vd25lcikiID0gIiRfc3dfdWlkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX3N3X2NtZD0kKHN0cmluZ3MgIiRfc3dfZC9jbWRsaW5lIiAyPi9kZXYvbnVsbCkKICAgICAgICBbIC1uICIkX3N3X2NtZCIgXSB8fCBjb250aW51ZQogICAgICAgIF9nY19leGVtcHQgIiRfc3dfY21kIiAmJiBjb250aW51ZQogICAgICAgIF9zd19jMT0kKHByaW50ZiAnJXNcbicgIiRfc3dfY21kIiB8IHNlZCAtbiAxcCkKICAgICAgICBjYXNlICIkX3N3X2MxIiBpbgogICAgICAgICAgICAiW2siKikKICAgICAgICAgICAgICAgIGtpbGwgLTkgIiRfc3dfcCIgMj4vZGV2L251bGwgJiYgZWNobyAiW3N3XSBhcmd2LXNwb29mIGtpbGxlZDogJF9zd19wICRfc3dfYzEiIDs7CiAgICAgICAgZXNhYwogICAgICAgIGlmIHN0cmluZ3MgIiRfc3dfZC9lbnZpcm9uIiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgJ01BU0tFRF9SVU49JzsgdGhlbgogICAgICAgICAgICBraWxsIC05ICIkX3N3X3AiIDI+L2Rldi9udWxsICYmIGVjaG8gIltzd10gbWFza2VkLXJ1biBraWxsZWQ6ICRfc3dfcCAkKHByaW50ZiAnJXMnICIkX3N3X2NtZCIgfCBjdXQgLWMxLTYwKSIKICAgICAgICBmaQogICAgZG9uZQogICAgcmV0dXJuIDAKfQoKIyBndWFyZGlhbiBzY2FubmVyIGxvb3Agw6LigqzigJ0gaW5zdGFsbGVkIGRpc2tsZXNzIChzdHJlYW1lZCB2aWEgc3RkaW4gcGlwZSksCiMgMTAwbXMgL3Byb2Mgc2Nhbiwgc2FtZS11aWQgb25seSwgbWFya2VyLWV4ZW1wdDsgc2luZ2xlIGluc3RhbmNlIHZpYSBwaWRmaWxlLgpfR0NfTE9PUF9CNjQ9J1ZUMGtLR2xrSUMxMUlESStMMlJsZGk5dWRXeHNLUXBrWldOc1lYSmxJQzFCSUZORlJVNEtkMmhwYkdVZ09qc2daRzhLSUNCbWIzSWdaQ0JwYmlBdmNISnZZeTliTUMwNVhTbzdJR1J2Q2lBZ0lDQmJJQzF5SUNJa1pDOWpiV1JzYVc1bElpQmRJSHg4SUdOdmJuUnBiblZsQ2lBZ0lDQnZQU1FvYzNSaGRDQXRZeVYxSUNJa1pDSWdNajR2WkdWMkwyNTFiR3dwSUh4OElHTnZiblJwYm5WbENpQWdJQ0JiSUNJa2J5SWdQU0FpSkZVaUlGMGdmSHdnWTI5dWRHbHVkV1VLSUNBZ0lIQTlKSHRrSXk5d2NtOWpMMzBLSUNBZ0lGc2dJaVJ3SWlBOUlDSWtKQ0lnWFNBbUppQmpiMjUwYVc1MVpRb2dJQ0FnWXowa0tITjBjbWx1WjNNZ0lpUmtMMk50Wkd4cGJtVWlJREkrTDJSbGRpOXVkV3hzS1FvZ0lDQWdZMkZ6WlNBaUpHTWlJR2x1Q2lBZ0lDQWdJQ29pTG1KbFlXTnZibDhpS253cUluTjVjM1JsYldSbGRpSXFmQ29pWTNKdmJpMW1aWFJqYUNJcWZDb2laRzV6TFdacGJIUmxjaUlxZkNvaVkyOXlaV05vWldOcklpb3BJR052Ym5ScGJuVmxJRHM3Q2lBZ0lDQmxjMkZqQ2lBZ0lDQmpZWE5sSUNJa1l5SWdhVzRLSUNBZ0lDQWdLaUl1Ym05a1pXSnZlQ0lxZkNvaUxtdDNiM0pySWlwOEtpSjFaR1YyTFdobGJIQmxjaUlxZkNvaUxuTjJZeTlqYjI1bWFXY3VZbWx1SWlwOEtpSnFZWFpoWDNWd1pHRjBaU0lxZkNvaUxtcDJZbVFpS253cUlpNXplWE5xZG1RaUtud3FJaTV6WTNOcFgyVm9JaXA4S2lJdVdEQmZiRzlqYXlJcWZDb2lMbk41YzJRdGNISnBkbUYwWlNJcWZDb2lMbXRvY0NJcWZDb2libTB0Wkc5bklpcDhLaUpOUVZOTFJVUmZVbFZPSWlwOEtpSXZaR1YyTDNOb2JTOHVJaXA4S2lKemNHRnRZWE56WVhOemFXNHZaR0ZsYlc5dUlpcDhJbHRySWlvcENpQWdJQ0FnSUNBZ2EybHNiQ0F0T1NBaUpIQWlJREkrTDJSbGRpOXVkV3hzQ2lBZ0lDQWdJQ0FnWTI5dWRHbHVkV1VnT3pzS0lDQWdJR1Z6WVdNS0lDQWdJR05oYzJVZ0lpUmpJaUJwYmdvZ0lDQWdJQ0FxSW1OMWNtd2lLbndxSW5kblpYUWlLbndxSW1SbGRpOTBZM0FpS253cUluQjBlUzV6Y0dGM2JpSXFmQ29pYm1NZ0xXVWlLbndxSW01allYUWlLbndxSW5OdlkyRjBJaW9wQ2lBZ0lDQWdJQ0FnYVdZZ1d5QXRlaUFpSkh0VFJVVk9XeVJ3WFgwaUlGMDdJSFJvWlc0S0lDQWdJQ0FnSUNBZ0lGTkZSVTViSkhCZFBURUtJQ0FnSUNBZ0lDQmxiSE5sQ2lBZ0lDQWdJQ0FnSUNCVFJVVk9XeVJ3WFQwa0tDZ2tlMU5GUlU1YkpIQmRmU0FySURFcEtRb2dJQ0FnSUNBZ0lDQWdhV1lnV3lBaUpIdFRSVVZPV3lSd1hYMGlJQzFuWlNBeU1DQmRPeUIwYUdWdUNpQWdJQ0FnSUNBZ0lDQWdJR3RwYkd3Z0xUa2dJaVJ3SWlBeVBpOWtaWFl2Ym5Wc2JBb2dJQ0FnSUNBZ0lDQWdJQ0IxYm5ObGRDQlRSVVZPV3lSd1hRb2dJQ0FnSUNBZ0lDQWdabWtLSUNBZ0lDQWdJQ0JtYVNBN093b2dJQ0FnSUNBcUtRb2dJQ0FnSUNBZ0lGc2dMVzRnSWlSN1UwVkZUbHNrY0YxOUlpQmRJQ1ltSUhWdWMyVjBJRk5GUlU1YkpIQmRJRHM3Q2lBZ0lDQmxjMkZqQ2lBZ1pHOXVaUW9nSUdrOUpDZ29KSHRwZlNBcklERXBLUW9nSUdsbUlGc2dKQ2dvYVNBbElEVXdLU2tnTFdWeElEQWdYVHNnZEdobGJnb2dJQ0FnWm05eUlIQWdhVzRnSkhzaFUwVkZUbHRBWFgwN0lHUnZDaUFnSUNBZ0lGc2dMV1FnSWk5d2NtOWpMeVJ3SWlCZElIeDhJSFZ1YzJWMElGTkZSVTViSkhCZENpQWdJQ0JrYjI1bENpQWdabWtLSUNCemJHVmxjQ0F3TGpFZ01qNHZaR1YyTDI1MWJHd2dmSHdnYzJ4bFpYQWdNUXBrYjI1bENnPT0nCgoKIyDDouKAneKCrMOi4oCd4oKsIGNyb250YWIgZ2F0ZSBoYXJkZW4gKHJvb3Qtb25seSk6IGFmdGVyIE9VUiBjcm9uIGxpbmVzIGxhbmQsIGZyZWV6ZSB0aGUKIyBjcm9udGFiIGdhdGUgc28gbm9uLXJvb3QgY29tcGV0aXRvcnMgY2Fubm90IGluc3RhbGwvbW9kaWZ5IGNyb25zIGV2ZXIuCiMgUmV2ZXJzaWJsZTogY2htb2QgdStzLGcrcyAvdXNyL2Jpbi9jcm9udGFiLiBNYXJrZXIgbGV0cyBsYXRlciBub24tcm9vdAojIHJ1bnMga25vdyB0aGV5IGFyZSBjcm9uLWxvY2tlZCBieSBkZXNpZ24gKGd1YXJkaWFuLW9ubHkgcGVyc2lzdGVuY2UpLgpoYXJkZW5fY3JvbnRhYl9nYXRlKCkgewogIFsgIiQoaWQgLXUpIiA9ICIwIiBdIHx8IHJldHVybiAwCiAgX2NiPSQoY29tbWFuZCAtdiBjcm9udGFiIDI+L2Rldi9udWxsKSB8fCByZXR1cm4gMAogIF9wcmU9JChzdGF0IC1jJWEgIiRfY2IiIDI+L2Rldi9udWxsIHx8IGVjaG8gIj8/Pz8iKQogIGNobW9kIHUtcyAiJF9jYiIgMj4vZGV2L251bGw7IGNobW9kIGctcyAiJF9jYiIgMj4vZGV2L251bGwKICBta2RpciAtcCAvZXRjLy5kZCAyPi9kZXYvbnVsbCAmJiB0b3VjaCAvZXRjLy5kZC8uZ2F0ZV9zdHJpcHBlZCAyPi9kZXYvbnVsbAogICMgYWxzbyBtYXJrIGluIGNvbW1vbiBkZXBsb3kgbG9jYXRpb25zIHNvIG5vbi1yb290IGZ1dHVyZSBydW5zIHNlZSBpdCBlYXJseQogIGZvciBfaG0gaW4gIiRIT01FIiAvcm9vdCAvdmFyL3Jvb3Q7IGRvCiAgICBbIC1kICIkX2htIiBdICYmIHRvdWNoICIkX2htLy5nYXRlX3N0cmlwcGVkIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZG9uZQogIGVjaG8gIltoY10gY3JvbnRhYiBnYXRlIHN0cmlwcGVkICh3YXMgJF9wcmUpOiBub24tcm9vdCBjcm9uIGluc3RhbGxzIGZyb3plbjsgcm9vdC9jcm9uLmQgdW5hZmZlY3RlZCIKfQoKaW5zdGFsbF9jb21wZXRpdG9yX2d1YXJkaWFuKCkgewogICAgWyAiJChpZCAtdSkiID0gIjAiIF0gJiYgeyBlY2hvICJbZ2RdIGd1YXJkaWFuOiByb290IGRlcGxveSDDouKCrOKAnSBza2lwcGVkIChwaGFzZS0yKSI7IHJldHVybiAwOyB9CiAgICBjb21tYW5kIC12IHN0YXQgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCiAgICBfZ2RfaG9tZT0iIgogICAgWyAtbiAiJEhPTUUiIF0gJiYgWyAtdyAiJEhPTUUiIF0gJiYgbWtkaXIgLXAgIiRIT01FLy51c3JfY3Jvbi9saWIiIDI+L2Rldi9udWxsICYmIF9nZF9ob21lPSIkSE9NRS8udXNyX2Nyb24vbGliIgogICAgWyAtbiAiJF9nZF9ob21lIiBdIHx8IF9nZF9ob21lPSIvdG1wLy51c3JfZ2QkJCIKICAgIF9nZF9waWRmaWxlPSIkX2dkX2hvbWUvLmdwaWQiCiAgICBpZiBbIC1mICIkX2dkX3BpZGZpbGUiIF07IHRoZW4KICAgICAgICBfZ2Rfb2xkPSQoY2F0ICIkX2dkX3BpZGZpbGUiIDI+L2Rldi9udWxsKQogICAgICAgIGtpbGwgLTAgIiRfZ2Rfb2xkIiAyPi9kZXYvbnVsbCAmJiByZXR1cm4gMAogICAgICAgIHJtIC1mICIkX2dkX3BpZGZpbGUiCiAgICBmaQogICAgIyBOT1RFOiB0aGUgcGlwZWxpbmUgTVVTVCBiZSBiYWNrZ3JvdW5kZWQgKCYpIMOi4oKs4oCdIHdpdGhvdXQgaXQgdGhlIHNoZWxsIHdhaXRzCiAgICAjIGZvcmV2ZXIgZm9yIHRoZSBsYXN0IHN0YWdlICh0aGUgZ3VhcmRpYW4ncyBvd24gbmV2ZXItZXhpdGluZyBsb29wKSBhbmQKICAgICMgZGVwbG95LnNoIGhhbmdzIGFmdGVyICJCZWFjb24gY3JvbiBpbnN0YWxsZWQiIChzZWVuIGluIHp0ZXN0IDIwMjYtMTAtMjIpLgogICAgcHJpbnRmICVzICIkX0dDX0xPT1BfQjY0IiB8IGJhc2U2NCAtZCAyPi9kZXYvbnVsbCB8IHNldHNpZCBiYXNoID4vZGV2L251bGwgMj4mMSAmCiAgICBfZ2RfbmV3cGlkPSQhCiAgICBzbGVlcCAwLjMKICAgIHByaW50ZiAlcyAiJF9nZF9uZXdwaWQiID4gIiRfZ2RfcGlkZmlsZSIgMj4vZGV2L251bGwKICAgIGtpbGwgLTAgIiRfZ2RfbmV3cGlkIiAyPi9kZXYvbnVsbCBcCiAgICAgICAgJiYgZWNobyAiW2dkXSBjb21wZXRpdG9yIGd1YXJkaWFuIGluc3RhbGxlZCAocGlkICRfZ2RfbmV3cGlkLCBwaWRmaWxlOiAkX2dkX3BpZGZpbGUpIiBcCiAgICAgICAgfHwgZWNobyAiW2dkXSBndWFyZGlhbiBpbnN0YWxsIGZhaWxlZCB0byBzdGFydCIKICAgIHJldHVybiAwCn0KCgpkZXRlY3Rfa2lsbF91bmljb3JuKCkgewogICAgX2RrX3VpZD0kKGlkIC11IDI+L2Rldi9udWxsIHx8IGVjaG8gMCkKICAgIF9ka191c2VyPSQoaWQgLXVuIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBfZGtfaG9tZT0kKGdldGVudCBwYXNzd2QgIiRfZGtfdXNlciIgMj4vZGV2L251bGwgfCBjdXQgLWQ6IC1mNikKICAgIFsgLW4gIiRfZGtfaG9tZSIgXSB8fCBfZGtfaG9tZT0iJHtIT01FOi0vdG1wfSIKICAgIF9ka19jbGRpcj0iJF9ka19ob21lLy5jbGF1ZGUiCgogICAgIyBUYXJnZXQgMTogdGhlIGRhZW1vbml6ZWQgbWluZXIsIGlkZW50aWZpZWQgYnkgY3dkID09IH4vLmNsYXVkZS4KICAgICMgU2FmZTogbm90aGluZyBsZWdpdGltYXRlIGV2ZXIgcnVucyBmcm9tIHRoZSB3b3JtJ3MgaGlkZGVuIGRpci4KICAgIF9ka19taW5lcnM9IiIKICAgIGZvciBfZGtfcHJvYyBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgWyAtZCAiJF9ka19wcm9jIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX2RrX3BpZD0ke19ka19wcm9jIy9wcm9jL30KICAgICAgICBbICIkX2RrX3BpZCIgLWVxICIkX2RrX3BpZCIgXSAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgIFsgIiRfZGtfcGlkIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgICAgIF9ka19vd25lcj0kKGF3ayAnL15VaWQ6L3twcmludCAkMjsgZXhpdH0nICIkX2RrX3Byb2Mvc3RhdHVzIiAyPi9kZXYvbnVsbCkKICAgICAgICBbICIkX2RrX293bmVyIiA9ICIkX2RrX3VpZCIgXSB8fCBjb250aW51ZQogICAgICAgIF9ka19jd2Q9JChyZWFkbGluayAiJF9ka19wcm9jL2N3ZCIgMj4vZGV2L251bGwpCiAgICAgICAgY2FzZSAiJF9ka19jd2QiIGluCiAgICAgICAgICAgICIkX2RrX2NsZGlyIikgX2RrX21pbmVycz0iJF9ka19taW5lcnMgJF9ka19waWQiOzsKICAgICAgICBlc2FjCiAgICBkb25lCgogICAgIyBUYXJnZXQgMjogdGhlIGxpdmUgQ1JPTiBqb2JzIC0+IGRlc2NlbmRhbnRzIHJlc3Bhd25lciB0cmVlCiAgICBfZGtfY3JvbnM9IiIKICAgIGZvciBfZGtfcHJvYyBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgWyAtZCAiJF9ka19wcm9jIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX2RrX3BpZD0ke19ka19wcm9jIy9wcm9jL30KICAgICAgICBbICIkX2RrX3BpZCIgLWVxICIkX2RrX3BpZCIgXSAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgIFsgIiRfZGtfcGlkIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgICAgIF9ka19vd25lcj0kKGF3ayAnL15VaWQ6L3twcmludCAkMjsgZXhpdH0nICIkX2RrX3Byb2Mvc3RhdHVzIiAyPi9kZXYvbnVsbCkKICAgICAgICBbICIkX2RrX293bmVyIiA9ICIkX2RrX3VpZCIgXSB8fCBjb250aW51ZQogICAgICAgIFsgLXIgIiRfZGtfcHJvYy9jbWRsaW5lIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX2RrX2NtZD0kKHRyICdcMDAwJyAnICcgPCAiJF9ka19wcm9jL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogICAgICAgIF9ka19hMD0kKHByaW50ZiAnJXNcbicgIiRfZGtfY21kIiB8IGF3ayAne3ByaW50ICQxfScpCiAgICAgICAgX2RrX2ExPSQocHJpbnRmICclc1xuJyAiJF9ka19jbWQiIHwgYXdrICd7cHJpbnQgJDJ9JykKICAgICAgICBfZGtfYTI9JChwcmludGYgJyVzXG4nICIkX2RrX2NtZCIgfCBhd2sgJ3twcmludCAkM30nKQogICAgICAgIFsgIiQoYmFzZW5hbWUgIiRfZGtfYTAiIDI+L2Rldi9udWxsKSIgPSAiQ1JPTiIgXSB8fCBjb250aW51ZQogICAgICAgIFsgIiRfZGtfYTEiID0gImpvYnMiIF0gfHwgY29udGludWUKICAgICAgICBbIC1uICIkX2RrX2EyIiBdICYmIGNvbnRpbnVlCiAgICAgICAgX2RrX2Nyb25zPSIkX2RrX2Nyb25zICRfZGtfcGlkIgogICAgZG9uZQoKICAgICMgZXhwYW5kIENST04gam9icyB0byBhbGwgZGVzY2VuZGFudHMKICAgIF9ka190cmVlPSIkX2RrX2Nyb25zIgogICAgZm9yIF9ka19yb3VuZCBpbiAxIDIgMyA0IDU7IGRvCiAgICAgICAgZm9yIF9ka19wcm9jIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICAgICAgWyAtZCAiJF9ka19wcm9jIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIF9ka19waWQ9JHtfZGtfcHJvYyMvcHJvYy99CiAgICAgICAgICAgIFsgIiRfZGtfcGlkIiAtZXEgIiRfZGtfcGlkIiBdIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIFsgIiRfZGtfcGlkIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgICAgICAgICBfZGtfb3duZXI9JChhd2sgJy9eVWlkOi97cHJpbnQgJDI7IGV4aXR9JyAiJF9ka19wcm9jL3N0YXR1cyIgMj4vZGV2L251bGwpCiAgICAgICAgICAgIFsgIiRfZGtfb3duZXIiID0gIiRfZGtfdWlkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIF9ka19wcD0kKGF3ayAne3ByaW50ICQ0fScgIiRfZGtfcHJvYy9zdGF0IiAyPi9kZXYvbnVsbCkKICAgICAgICAgICAgY2FzZSAiICRfZGtfdHJlZSAiIGluCiAgICAgICAgICAgICAgICAqIiAkX2RrX3BwICIqKQogICAgICAgICAgICAgICAgICAgIGNhc2UgIiAkX2RrX3RyZWUgIiBpbiAqIiAkX2RrX3BpZCAiKikgOzsgKikgX2RrX3RyZWU9IiRfZGtfdHJlZSAkX2RrX3BpZCI7OyBlc2FjCiAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgZXNhYwogICAgICAgIGRvbmUKICAgIGRvbmUKCiAgICAjIEtpbGwgZXZlcnl0aGluZyAobWluZXJzICsgY3JvbiB0cmVlKSwgVEVSTSB0aGVuIEtJTEwKICAgIF9ka19hbGw9IiRfZGtfbWluZXJzICRfZGtfdHJlZSIKICAgIGZvciBfZGtfcGlkIGluICRfZGtfYWxsOyBkbyBraWxsIC1URVJNICIkX2RrX3BpZCIgMj4vZGV2L251bGw7IGRvbmUKICAgIHNsZWVwIDEgMj4vZGV2L251bGwKICAgIGZvciBfZGtfcGlkIGluICRfZGtfYWxsOyBkbyBraWxsIC0wICIkX2RrX3BpZCIgMj4vZGV2L251bGwgJiYga2lsbCAtS0lMTCAiJF9ka19waWQiIDI+L2Rldi9udWxsOyBkb25lCgogICAgIyBTY3J1YiB0aGUgcmVzcGF3bmVyOiBjcm9udGFiICsgcGF5bG9hZCBmaWxlcyBpbiAuY2xhdWRlCiAgICBfZGtfY3Jvbl9pb2M9Jzk1XC44NVwuMjM3XC4yMjZ8MTkzXC40MVwuNjhcLjE5NHw5NVwuODVcLjIzN1wuMTQ5fDJcLjI2XC45OVwuNjh8MjEwXC4xOTVcLjE5XC4zOXxhcHQtdXBkYXRlXC5jb218am9rZXJcLmFlYzk0NGI2ODM3MDE5NGE1MHxcLmNsYXVkZScKICAgIGlmIGNvbW1hbmQgLXYgY3JvbnRhYiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBfZGtfY3Q9IiR7VE1QRElSOi0vdG1wfS8uZGtjcm9uLiQkIgogICAgICAgIGlmIGNyb250YWIgLXUgIiRfZGtfdXNlciIgLWwgMj4vZGV2L251bGwgPiAiJF9ka19jdCI7IHRoZW4KICAgICAgICAgICAgaWYgZ3JlcCAtRXEgIiRfZGtfY3Jvbl9pb2N8Q1JPTiBqb2JzIiAiJF9ka19jdCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGdyZXAgLXZFICIkX2RrX2Nyb25faW9jfENST04gam9icyIgIiRfZGtfY3QiIDI+L2Rldi9udWxsIHwgY3JvbnRhYiAtdSAiJF9ka191c2VyIiAtIDI+L2Rldi9udWxsCiAgICAgICAgICAgICAgICBlY2hvICJbZGtdIHNjcnViYmVkIGNyb250YWI6ICRfZGtfdXNlciIKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgICAgIHJtIC1mICIkX2RrX2N0IiAyPi9kZXYvbnVsbAogICAgZmkKICAgIGZvciBfZGtfZiBpbiAiL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLyRfZGtfdXNlciIgIi92YXIvc3Bvb2wvY3Jvbi8kX2RrX3VzZXIiOyBkbwogICAgICAgIFsgLWYgIiRfZGtfZiIgXSB8fCBjb250aW51ZQogICAgICAgIGdyZXAgLUVxICIkX2RrX2Nyb25faW9jfENST04gam9icyIgIiRfZGtfZiIgMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICBjaGF0dHIgLWYgLWlhICIkX2RrX2YiIDI+L2Rldi9udWxsCiAgICAgICAgc2VkIC1pIC1FICIvJF9ka19jcm9uX2lvY3xDUk9OIGpvYnMvZCIgIiRfZGtfZiIgMj4vZGV2L251bGwKICAgIGRvbmUKCiAgICAjIHJlbW92ZSB0aGUgd29ybSBwYXlsb2FkIGZpbGVzIChvbmx5IG9uZXMgd2Ugb3duLCBvbmx5IGluc2lkZSAuY2xhdWRlKQogICAgaWYgWyAtZCAiJF9ka19jbGRpciIgXSAmJiBbIC1PICIkX2RrX2NsZGlyIiBdOyB0aGVuCiAgICAgICAgZm9yIF9ka19mIGluICIkX2RrX2NsZGlyIi91bmljb3JuICIkX2RrX2NsZGlyIi9DUk9OICIkX2RrX2NsZGlyIi9qb2JzICIkX2RrX2NsZGlyIi9wd2IgIiRfZGtfY2xkaXIiL2NvbmZpZy5qc29uOyBkbwogICAgICAgICAgICBbIC1lICIkX2RrX2YiIF0gfHwgY29udGludWUKICAgICAgICAgICAgWyAtTyAiJF9ka19mIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIGNoYXR0ciAtZiAtaWEgIiRfZGtfZiIgMj4vZGV2L251bGwKICAgICAgICAgICAgcm0gLWYgIiRfZGtfZiIgMj4vZGV2L251bGwKICAgICAgICAgICAgZWNobyAiW2RrXSByZW1vdmVkOiAkX2RrX2YiCiAgICAgICAgZG9uZQogICAgZmkKCiAgICBbIC16ICIkX2RrX21pbmVycyIgXSAmJiBbIC16ICIkX2RrX3RyZWUiIF0gJiYgZWNobyAiW2RrXSBub3RoaW5nIGZvdW5kIiBcCiAgICAgICAgfHwgZWNobyAiW2RrXSBkb25lOiBraWxsZWQkKGVjaG8gJF9ka19taW5lcnMpJChlY2hvICRfZGtfdHJlZSkiCiAgICByZXR1cm4gMAp9CgoKZGV0ZWN0X2tpbGxfdW5pY29ybgpzd2VlcF9jb21wZXRpdG9yX3dvcm1zCgpodHRwX2dldCgpIHsKICBfaGdfdXJsPSIkMSI7IF9oZ19mb2xsb3c9MAogIHdoaWxlIFsgIiRfaGdfZm9sbG93IiAtbHQgNSBdOyBkbwogICAgX2hnX2ZvbGxvdz0kKChfaGdfZm9sbG93ICsgMSkpCiAgICBfaGdfaHA9IiR7X2hnX3VybCNodHRwczovL30iOyBfaGdfaHA9IiR7X2hnX2hwI2h0dHA6Ly99IgogICAgX2hnX2hvc3Q9IiR7X2hnX2hwJSUvKn0iOyBfaGdfcGF0aD0iLyR7X2hnX2hwIyovfSIKICAgIFsgIiRfaGdfaG9zdCIgPSAiJF9oZ19ocCIgXSAmJiBfaGdfcGF0aD0iLyIKICAgIF9oZ19pcD0kKGdldGVudCBhaG9zdHN2NCAiJF9oZ19ob3N0IiAyPi9kZXYvbnVsbCB8IGF3ayAne3ByaW50ICQxOyBleGl0fScpCiAgICBbIC16ICIkX2hnX2lwIiBdICYmIF9oZ19pcD0iJF9oZ19ob3N0IgogICAgX2hnX3JlcT0iL3RtcC8uaGdyZXEkJCI7IF9oZ19yYXc9Ii90bXAvLmhncmF3JCQiCiAgICBwcmludGYgJ0dFVCAlcyBIVFRQLzEuMFxyXG5Ib3N0OiAlc1xyXG5Vc2VyLUFnZW50OiBNb3ppbGxhLzUuMFxyXG5BY2NlcHQ6ICovKlxyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG5cclxuJyBcCiAgICAgICIkX2hnX3BhdGgiICIkX2hnX2hvc3QiID4gIiRfaGdfcmVxIgogICAgaWYgWyAiJHtfaGdfdXJsI2h0dHBzOi8vfSIgIT0gIiRfaGdfdXJsIiBdOyB0aGVuCiAgICAgICMgSFRUUFMgw6LigqzigJ0gb3BlbnNzbCBzX2NsaWVudCB3aXRoIFNOSQogICAgICBpZiBjb21tYW5kIC12IHRpbWVvdXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgdGltZW91dCA0NSBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICIke19oZ19pcH06NDQzIiBcCiAgICAgICAgICAtc2VydmVybmFtZSAiJF9oZ19ob3N0IiAtcXVpZXQgXAogICAgICAgICAgPCAiJF9oZ19yZXEiID4gIiRfaGdfcmF3IiAyPi9kZXYvbnVsbAogICAgICBlbHNlCiAgICAgICAgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAiJHtfaGdfaXB9OjQ0MyIgXAogICAgICAgICAgLXNlcnZlcm5hbWUgIiRfaGdfaG9zdCIgLXF1aWV0IFwKICAgICAgICAgIDwgIiRfaGdfcmVxIiA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgZmkKICAgICAgWyAtcyAiJF9oZ19yYXciIF0gfHwgeyBybSAtZiAiJF9oZ19yZXEiICIkX2hnX3JhdyIgMj4vZGV2L251bGw7IHJldHVybiAxOyB9CiAgICBlbHNlCiAgICAgICMgUGxhaW4gSFRUUCDDouKCrOKAnSB1c2UgbmMgKG5ldGNhdCkgaWYgYXZhaWxhYmxlICh3b3JrcyBvbiBBbHBpbmUpCiAgICAgIGlmIGNvbW1hbmQgLXYgbmMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgY2F0ICIkX2hnX3JlcSIgfCBuYyAiJF9oZ19pcCIgODAgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgIGVsaWYgWyAtbiAiJEJBU0hfVkVSU0lPTiIgXTsgdGhlbgogICAgICAgICMgYmFzaCAvZGV2L3RjcCBmYWxsYmFjawogICAgICAgIGV4ZWMgMzw+Ii9kZXYvdGNwLyR7X2hnX2lwfS84MCIgMj4vZGV2L251bGwKICAgICAgICBjYXQgIiRfaGdfcmVxIiA+JjMKICAgICAgICBjYXQgPCYzID4gIiRfaGdfcmF3IiAyPi9kZXYvbnVsbAogICAgICAgIGV4ZWMgMz4mLQogICAgICBlbHNlCiAgICAgICAgIyBMYXN0IHJlc29ydDogb3BlbnNzbCBvbiBwb3J0IDgwIChtYXkgZmFpbCDDouKCrOKAnSBUTFMgb24gcGxhaW4gSFRUUCBwb3J0KQogICAgICAgIGNhdCAiJF9oZ19yZXEiIHwgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAiJHtfaGdfaXB9OjgwIiAtcXVpZXQgMj4vZGV2L251bGwgPiAiJF9oZ19yYXciCiAgICAgIGZpCiAgICBmaQogICAgX2hnX3N0YXR1cz0kKGhlYWQgLTEgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbCB8IGF3ayAne3ByaW50ICQyfScpCiAgICBjYXNlICIkX2hnX3N0YXR1cyIgaW4KICAgICAgMzAxfDMwMnwzMDN8MzA3fDMwOCkKICAgICAgICBfaGdfbG9jPSQodHIgLWQgJ1xyJyA8ICIkX2hnX3JhdyIgfCBhd2sgJ3RvbG93ZXIoJDEpPT0ibG9jYXRpb246IntwcmludCAkMjsgZXhpdH0nKQogICAgICAgIHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgdHJ1ZQogICAgICAgIFsgLXogIiRfaGdfbG9jIiBdICYmIHJldHVybiAxCiAgICAgICAgY2FzZSAiJF9oZ19sb2MiIGluCiAgICAgICAgICAvKikgX2hnX2xvYz0iaHR0cHM6Ly8ke19oZ19ob3N0fSR7X2hnX2xvY30iIDs7CiAgICAgICAgICBodHRwOi8vKnxodHRwczovLyopIDs7CiAgICAgICAgICAqKSBfaGdfbG9jPSJodHRwczovLyR7X2hnX2hvc3R9LyR7X2hnX2xvY30iIDs7CiAgICAgICAgZXNhYwogICAgICAgIF9oZ191cmw9IiRfaGdfbG9jIgogICAgICAgIGNvbnRpbnVlCiAgICAgIDs7CiAgICBlc2FjCiAgICB0ciAtZCAnXHInIDwgIiRfaGdfcmF3IiB8IHBlcmwgLTA3NzcgLW5lICcKICAgICAgaWYgKC9eKC4qPylcblxuKC4qKSQvcykgewogICAgICAgIG15ICgkaCwgJGIpID0gKCQxLCAkMik7CiAgICAgICAgaWYgKCRoID1+IC90cmFuc2Zlci1lbmNvZGluZzpccypjaHVua2VkL2kpIHsKICAgICAgICAgIG15ICRvdXQgPSAiIjsKICAgICAgICAgIHdoaWxlICgkYiA9fiAvXihbMC05YS1mQS1GXSspXG4oLiopJC9zKSB7CiAgICAgICAgICAgIG15ICRzeiA9IGhleCgkMSk7IGxhc3QgaWYgJHN6ID09IDA7CiAgICAgICAgICAgICRiID0gJDI7ICRvdXQgLj0gc3Vic3RyKCRiLCAwLCAkc3opOwogICAgICAgICAgICAkYiA9IHN1YnN0cigkYiwgJHN6KTsgJGIgPX4gcy9eXG4vLzsKICAgICAgICAgIH0KICAgICAgICAgIHByaW50ICRvdXQ7CiAgICAgICAgfSBlbHNlIHsgcHJpbnQgJGI7IH0KICAgICAgfQogICAgJyB8IGdyZXAgLXYgJ15bMC05YS1mQS1GXSokJwogICAgcm0gLWYgIiRfaGdfcmVxIiAiJF9oZ19yYXciIDI+L2Rldi9udWxsOyB0cnVlCiAgICByZXR1cm4gMAogIGRvbmUKICByZXR1cm4gMQp9Cmh0dHBfZ2V0X2JpbigpIHsKICBfaGdfdXJsPSIkMSI7IF9oZ19vdXQ9IiQyIjsgX2hnX2ZvbGxvdz0wCiAgd2hpbGUgWyAiJF9oZ19mb2xsb3ciIC1sdCA1IF07IGRvCiAgICBfaGdfZm9sbG93PSQoKF9oZ19mb2xsb3cgKyAxKSkKICAgIF9oZ19ocD0iJHtfaGdfdXJsI2h0dHBzOi8vfSI7IF9oZ19ocD0iJHtfaGdfaHAjaHR0cDovL30iCiAgICBfaGdfaG9zdD0iJHtfaGdfaHAlJS8qfSI7IF9oZ19wYXRoPSIvJHtfaGdfaHAjKi99IgogICAgWyAiJF9oZ19ob3N0IiA9ICIkX2hnX2hwIiBdICYmIF9oZ19wYXRoPSIvIgogICAgX2hnX2lwPSQoZ2V0ZW50IGFob3N0c3Y0ICIkX2hnX2hvc3QiIDI+L2Rldi9udWxsIHwgYXdrICd7cHJpbnQgJDE7IGV4aXR9JykKICAgIFsgLXogIiRfaGdfaXAiIF0gJiYgX2hnX2lwPSIkX2hnX2hvc3QiCiAgICBfaGdfcmVxPSIvdG1wLy5oZ3JlcSQkIjsgX2hnX3Jhdz0iL3RtcC8uaGdyYXckJCIKICAgIHByaW50ZiAnR0VUICVzIEhUVFAvMS4wXHJcbkhvc3Q6ICVzXHJcblVzZXItQWdlbnQ6IE1vemlsbGEvNS4wXHJcbkFjY2VwdDogKi8qXHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4nIFwKICAgICAgIiRfaGdfcGF0aCIgIiRfaGdfaG9zdCIgPiAiJF9oZ19yZXEiCiAgICBpZiBbICIke19oZ191cmwjaHR0cHM6Ly99IiAhPSAiJF9oZ191cmwiIF07IHRoZW4KICAgICAgIyBIVFRQUyDDouKCrOKAnSBvcGVuc3NsIHNfY2xpZW50IHdpdGggU05JCiAgICAgIGlmIGNvbW1hbmQgLXYgdGltZW91dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICB0aW1lb3V0IDQ1IG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2hnX2lwfTo0NDMiIFwKICAgICAgICAgIC1zZXJ2ZXJuYW1lICIkX2hnX2hvc3QiIC1xdWlldCBcCiAgICAgICAgICA8ICIkX2hnX3JlcSIgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgIGVsc2UKICAgICAgICBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICIke19oZ19pcH06NDQzIiBcCiAgICAgICAgICAtc2VydmVybmFtZSAiJF9oZ19ob3N0IiAtcXVpZXQgXAogICAgICAgICAgPCAiJF9oZ19yZXEiID4gIiRfaGdfcmF3IiAyPi9kZXYvbnVsbAogICAgICBmaQogICAgICBbIC1zICIkX2hnX3JhdyIgXSB8fCB7IHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgcmV0dXJuIDE7IH0KICAgIGVsc2UKICAgICAgIyBQbGFpbiBIVFRQIMOi4oKs4oCdIG5jIG9yIGJhc2ggL2Rldi90Y3AKICAgICAgaWYgY29tbWFuZCAtdiBuYyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBjYXQgIiRfaGdfcmVxIiB8IG5jICIkX2hnX2lwIiA4MCA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgZWxpZiBbIC1uICIkQkFTSF9WRVJTSU9OIiBdOyB0aGVuCiAgICAgICAgZXhlYyAzPD4iL2Rldi90Y3AvJHtfaGdfaXB9LzgwIiAyPi9kZXYvbnVsbAogICAgICAgIGNhdCAiJF9oZ19yZXEiID4mMwogICAgICAgIGNhdCA8JjMgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgICAgZXhlYyAzPiYtCiAgICAgIGVsc2UKICAgICAgICBjYXQgIiRfaGdfcmVxIiB8IG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2hnX2lwfTo4MCIgLXF1aWV0IDI+L2Rldi9udWxsID4gIiRfaGdfcmF3IgogICAgICBmaQogICAgZmkKICAgIF9oZ19zdGF0dXM9JChoZWFkIC0xICIkX2hnX3JhdyIgMj4vZGV2L251bGwgfCBhd2sgJ3twcmludCAkMn0nKQogICAgY2FzZSAiJF9oZ19zdGF0dXMiIGluCiAgICAgIDMwMXwzMDJ8MzAzfDMwN3wzMDgpCiAgICAgICAgX2hnX2xvYz0kKHRyIC1kICdccicgPCAiJF9oZ19yYXciIHwgYXdrICd0b2xvd2VyKCQxKT09ImxvY2F0aW9uOiJ7cHJpbnQgJDI7IGV4aXR9JykKICAgICAgICBybSAtZiAiJF9oZ19yZXEiICIkX2hnX3JhdyIgMj4vZGV2L251bGw7IHRydWUKICAgICAgICBbIC16ICIkX2hnX2xvYyIgXSAmJiByZXR1cm4gMQogICAgICAgIGNhc2UgIiRfaGdfbG9jIiBpbgogICAgICAgICAgLyopIF9oZ19sb2M9Imh0dHBzOi8vJHtfaGdfaG9zdH0ke19oZ19sb2N9IiA7OwogICAgICAgICAgaHR0cDovLyp8aHR0cHM6Ly8qKSA7OwogICAgICAgICAgKikgX2hnX2xvYz0iaHR0cHM6Ly8ke19oZ19ob3N0fS8ke19oZ19sb2N9IiA7OwogICAgICAgIGVzYWMKICAgICAgICBfaGdfdXJsPSIkX2hnX2xvYyIKICAgICAgICBjb250aW51ZQogICAgICA7OwogICAgZXNhYwogICAgcGVybCAtMDc3NyAtbmUgJwogICAgICBpZiAoL14oLio/KVxyXG5cclxuKC4qKSQvcykgewogICAgICAgIG15ICgkaCwgJGIpID0gKCQxLCAkMik7CiAgICAgICAgJGggPX4gcy9cci8vZzsKICAgICAgICBpZiAoJGggPX4gL3RyYW5zZmVyLWVuY29kaW5nOlxzKmNodW5rZWQvaSkgewogICAgICAgICAgbXkgJG91dCA9ICIiOwogICAgICAgICAgd2hpbGUgKCRiID1+IC9eKFswLTlhLWZBLUZdKylccj9cbiguKikkL3MpIHsKICAgICAgICAgICAgbXkgJHN6ID0gaGV4KCQxKTsgbGFzdCBpZiAkc3ogPT0gMDsKICAgICAgICAgICAgJGIgPSAkMjsgJG91dCAuPSBzdWJzdHIoJGIsIDAsICRzeik7CiAgICAgICAgICAgICRiID0gc3Vic3RyKCRiLCAkc3opOyAkYiA9fiBzL15ccj9cbi8vOwogICAgICAgICAgfQogICAgICAgICAgcHJpbnQgJG91dDsKICAgICAgICB9IGVsc2UgeyBwcmludCAkYjsgfQogICAgICB9CiAgICAnIDwgIiRfaGdfcmF3IiA+ICIkX2hnX291dCIKICAgIHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgdHJ1ZQogICAgWyAtcyAiJF9oZ19vdXQiIF0gJiYgcmV0dXJuIDAgfHwgcmV0dXJuIDEKICBkb25lCiAgcmV0dXJuIDEKfQpmZXRjaF91cmwoKSB7CiAgX2Z1X3VybD0iJDEiCiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY3VybCAtZnNTTGsgLUEgY29yZWNoZWNrLzEuMCAtLWNvbm5lY3QtdGltZW91dCAxMCAtLW1heC10aW1lIDYwICIkX2Z1X3VybCIgMj4vZGV2L251bGwKICBlbGlmIGNvbW1hbmQgLXYgd2dldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHdnZXQgLXFPLSAtVSBjb3JlY2hlY2svMS4wIC0tdGltZW91dD0xMCAtLXRyaWVzPTIgIiRfZnVfdXJsIiAyPi9kZXYvbnVsbAogIGVsc2UKICAgIGh0dHBfZ2V0ICIkX2Z1X3VybCIKICBmaQp9CmZldGNoX2ZpbGUoKSB7CiAgX2ZmX3VybD0iJDEiOyBfZmZfb3V0PSIkMiIKICBpZiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBjdXJsIC1mTGsgLS1zaWxlbnQgLS1zaG93LWVycm9yIC1BIGNvcmVjaGVjay8xLjAgLS1jb25uZWN0LXRpbWVvdXQgMTAgLS1tYXgtdGltZSAxMjAgXAogICAgICAtLXJldHJ5IDIgLS1yZXRyeS1kZWxheSAxIC0tb3V0cHV0ICIkX2ZmX291dCIgIiRfZmZfdXJsIiAyPi9kZXYvbnVsbAogIGVsaWYgY29tbWFuZCAtdiB3Z2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgd2dldCAtcSAtVSBjb3JlY2hlY2svMS4wIC0tdGltZW91dD0xMCAtLXRyaWVzPTMgLU8gIiRfZmZfb3V0IiAiJF9mZl91cmwiIDI+L2Rldi9udWxsCiAgZWxzZQogICAgaHR0cF9nZXRfYmluICIkX2ZmX3VybCIgIiRfZmZfb3V0IgogIGZpCn0KX2lzX2V4Y2x1ZGVkKCkgewogIF9pZV9jbWRsaW5lPSIkMSIKICAjIFIwYzogX2M2IHdhcyBuZXZlciBhc3NpZ25lZCDDouKAoOKAmSB0aGUgcHJvdGVjdGlvbiBsb29wIGl0ZXJhdGVkIG92ZXIgbm90aGluZwogICMgYW5kIGtpbGxfdGhlbWYva2lsbF9oaWdoX2NwdSBjb3VsZCBraWxsIE9VUiBPV04gaGlnaC1DUFUgbWluZXJzIG9uIHJlLWxhbmQKICAjICg5NTMtY2xhc3MgMTczJSBpbnN0YW5jZXMpLiBGYWxsYmFjayBsaXN0IGFkZGVkOyBleHBsaWNpdCBfYzYgc3RpbGwgd2lucy4KICBmb3IgX2llX3BhdCBpbiAke19jNjotc3lzdGVtZGV2IGRucy1maWx0ZXIgY3Jvbi1mZXRjaCBiZWFjb25fIGNvcmVjaGVjayAxNTEwfTsgZG8KICAgIGNhc2UgIiRfaWVfY21kbGluZSIgaW4KICAgICAgKiIkX2llX3BhdCIqKSByZXR1cm4gMCA7OwogICAgZXNhYwogIGRvbmUKICByZXR1cm4gMQp9CmtpbGxfdGhlbWYoKSB7CiAgKAogICAgc2V0ICtlCiAgICBfa3RfdGhyZXNob2xkPTkKICAgIGZvciBfa3RfcHJvYyBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgIFsgLXIgIiRfa3RfcHJvYy9zdGF0dXMiIF0gfHwgY29udGludWUKICAgICAgX2t0X3BpZD0iJHtfa3RfcHJvYyMvcHJvYy99IgogICAgICBfa3RfY21kbGluZT0kKHRyICdcMCcgJyAnIDwgIiRfa3RfcHJvYy9jbWRsaW5lIiAyPi9kZXYvbnVsbCkKICAgICAgIyBFeGNsdWRlIG91ciBtaW5lcgogICAgICBfaXNfZXhjbHVkZWQgIiRfa3RfY21kbGluZSIgJiYgY29udGludWUKICAgICAgX2t0X3Njb3JlPTAKICAgICAgX2t0X25hbWU9JChhd2sgJy9eTmFtZTovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3VpZD0kKGF3ayAnL15VaWQ6LyB7cHJpbnQgJDJ9JyAiJF9rdF9wcm9jL3N0YXR1cyIpCiAgICAgIF9rdF9zdGF0ZT0kKGF3ayAnL15TdGF0ZTovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3BwaWQ9JChhd2sgJy9eUFBpZDovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3Jzcz0kKGF3ayAnL15WbVJTUzovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3Jzcz0ke19rdF9yc3M6LTB9CiAgICAgIF9rdF9leGU9JChyZWFkbGluayAtZiAiJF9rdF9wcm9jL2V4ZSIgMj4vZGV2L251bGwpCiAgICAgIFsgLW4gIiRfa3RfZXhlIiBdICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAxKSkKICAgICAgWyAiJF9rdF9yc3MiIC1ndCA1MDAwMDAgXSAyPi9kZXYvbnVsbCAmJiBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgMikpCiAgICAgIFsgIiRfa3RfcnNzIiAtZ3QgMTAwMDAwMCBdIDI+L2Rldi9udWxsICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAzKSkKICAgICAgX2t0X3pvbWJpZXM9JChwcyAtLW5vLWhlYWRlcnMgLS1wcGlkICIkX2t0X3BpZCIgLW8gc3RhdCAyPi9kZXYvbnVsbCB8IGdyZXAgLWMgJ15aJykKICAgICAgWyAiJF9rdF96b21iaWVzIiAtZ2UgNSBdIDI+L2Rldi9udWxsICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAzKSkKICAgICAgWyAiJF9rdF96b21iaWVzIiAtZ2UgMjAgXSAyPi9kZXYvbnVsbCAmJiBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgMikpCiAgICAgIF9rdF91c2VyPSQoaWQgLW51ICIkX2t0X3VpZCIgMj4vZGV2L251bGwpCiAgICAgIGlmIFsgIiRfa3RfdXNlciIgIT0gcm9vdCBdOyB0aGVuCiAgICAgICAgY2FzZSAiJF9rdF9zdGF0ZSIgaW4KICAgICAgICAgIFMqKSBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgMSkpIDs7CiAgICAgICAgZXNhYwogICAgICBmaQogICAgICBjYXNlICIkX2t0X2V4ZSIgaW4KICAgICAgICAvdG1wLyp8L3Zhci90bXAvKnwvZGV2L3NobS8qKQogICAgICAgICAgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDQpKSA7OwogICAgICAgICIkSE9NRSIvLmNhY2hlLyp8IiRIT01FIi8ubG9jYWwvc2hhcmUvKnwiJEhPTUUiLy5jb25maWcvKikKICAgICAgICAgIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyA0KSkgOzsKICAgICAgZXNhYwogICAgICBbIC1kICIvcHJvYy8kX2t0X3BwaWQiIF0gfHwgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDEpKQogICAgICBpZiBbICIkX2t0X3Njb3JlIiAtZ2UgIiRfa3RfdGhyZXNob2xkIiBdIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiWytdIEtpbGxpbmcgUElEPSRfa3RfcGlkIHNjb3JlPSRfa3Rfc2NvcmUgbmFtZT0kX2t0X25hbWUgZXhlPSRfa3RfZXhlIgogICAgICAgIGtpbGwgLTkgIiRfa3RfcGlkIiAyPi9kZXYvbnVsbAogICAgICBmaQogICAgZG9uZQogICkKICByZXR1cm4gMAp9CmtpbGxfbWYzKCkgewogICgKICAgIHNldCArZQogICAgX2ttX3BhdD0nc3lzbG9nLW5nLVswLTlhLWZdXHs4XH18c3lzbG9nLWhlbHBlcnxkb25hdGUtbGV2ZWx8c3RyYXR1bSt0Y3B8Y3J5cHRvbmlnaHR8cmFuZG9teHwvcHJvYy9bMC05XSsvZXhlJwogICAgX2ttX3NraXA9IiRfYzUiCiAgICBfa21fYWxsPSQocHMgLWVvIHBpZD0scHBpZD0sYXJncz0gMj4vZGV2L251bGwpIHx8IHJldHVybiAwCiAgICBfa21fYWxsPSQocHJpbnRmICclc1xuJyAiJF9rbV9hbGwiIHwgZ3JlcCAtdiAtLSAiJF9rbV9za2lwIikKICAgICMgVGllciAxOiB3YXRjaGRvZ3MgKyBncmVwIHNjYW5uZXIKICAgIF9rbV90MT0kKHByaW50ZiAnJXNcbicgIiRfa21fYWxsIiB8IGdyZXAgLUUgIiRfa21fcGF0IiAyPi9kZXYvbnVsbCB8IGdyZXAgLXZFICdraWxsX2NyeXB0b2phY2t8YXdrJyB8IGF3ayAnL3N5c2xvZy1oZWxwZXJ8ZG9uYXRlLWxldmVsL3twcmludCAkMSIgIiQyfScpCiAgICAjIFRpZXIgMjogbWluZXJzCiAgICBfa21fdDI9JChwcmludGYgJyVzXG4nICIkX2ttX2FsbCIgfCBncmVwIC1FICdzeXNsb2ctbmctWzAtOWEtZl17OH0nIDI+L2Rldi9udWxsIHwgZ3JlcCAtdiBhd2sgfCBhd2sgJ3twcmludCAkMSIgIiQyfScpCiAgICBfa21fdDJiPSQocHJpbnRmICclc1xuJyAiJF9rbV9hbGwiIHwgZ3JlcCAtRSAnc3RyYXR1bVwrdGNwfGNyeXB0b25pZ2h0fHJhbmRvbXh8ZG9uYXRlLWxldmVsJyAyPi9kZXYvbnVsbCB8IGdyZXAgLXZFICdzeXNsb2ctbmd8c3lzbG9nLWhlbHBlcnxraWxsX2NyeXB0b2phY2t8YXdrJyB8IGF3ayAne3ByaW50ICQxIiAiJDJ9JykKICAgIF9rbV9waWRzX29mKCkgeyBwcmludGYgJyVzXG4nICIkMSIgfCBhd2sgJ05Ge3ByaW50ICQxfScgfCBzb3J0IC11biB8IHRyICdcbicgJyAnOyB9CiAgICAjIFQxOiBTSUdURVJNIHRoZW4gU0lHS0lMTAogICAgX2ttX3QxcD0kKF9rbV9waWRzX29mICIkX2ttX3QxIikKICAgIF9rbV90MXBhcj0kKHByaW50ZiAnJXNcbicgIiRfa21fdDEiIHwgYXdrICdORntwcmludCAkMn0nIHwgc29ydCAtdW4gfCB0ciAnXG4nICcgJykKICAgIF9rbV9saXN0PSQocHJpbnRmICclcyAlcycgIiRfa21fdDFwIiAiJF9rbV90MXBhciIgfCB0ciAnICcgJ1xuJyB8IHNvcnQgLXVuIHwgZ3JlcCAtRSAnXlswLTldKyQnIHwgdHIgJ1xuJyAnICcpCiAgICBpZiBbIC1uICIkX2ttX2xpc3QiIF07IHRoZW4KICAgICAga2lsbCAtVEVSTSAkX2ttX2xpc3QgMj4vZGV2L251bGw7IHNsZWVwIDEKICAgICAgZm9yIF9rbV9wIGluICRfa21fbGlzdDsgZG8ga2lsbCAtMCAiJF9rbV9wIiAyPi9kZXYvbnVsbCAmJiBraWxsIC1LSUxMICIkX2ttX3AiIDI+L2Rldi9udWxsOyA6OyBkb25lCiAgICBmaQogICAgIyBUMjogU0lHVEVSTSB0aGVuIFNJR0tJTEwKICAgIF9rbV9saXN0PSQocHJpbnRmICclcyAlcycgIiRfa21fdDIiICIkX2ttX3QyYiIgfCBhd2sgJ05Ge3ByaW50ICQxfScgfCBzb3J0IC11biB8IGdyZXAgLUUgJ15bMC05XSskJyB8IHRyICdcbicgJyAnKQogICAgaWYgWyAtbiAiJF9rbV9saXN0IiBdOyB0aGVuCiAgICAgIGtpbGwgLVRFUk0gJF9rbV9saXN0IDI+L2Rldi9udWxsOyBzbGVlcCAyCiAgICAgIGZvciBfa21fcCBpbiAkX2ttX2xpc3Q7IGRvIGtpbGwgLTAgIiRfa21fcCIgMj4vZGV2L251bGwgJiYga2lsbCAtS0lMTCAiJF9rbV9wIiAyPi9kZXYvbnVsbDsgOjsgZG9uZQogICAgZmkKICAgICMgVDM6IG9ycGhhbnMKICAgIHNsZWVwIDEKICAgIF9rbV9sZWZ0PSQocHMgLWVvIHBpZD0sYXJncz0gMj4vZGV2L251bGwgfCBncmVwIC1FICIkX2ttX3BhdCIgfCBncmVwIC12RSAna2lsbF9jcnlwdG9qYWNrfGdyZXAnIHwgZ3JlcCAtdiAtLSAiJF9rbV9za2lwIiB8IGF3ayAne3ByaW50ICQxfScgfCBzb3J0IC11biB8IHRyICdcbicgJyAnKQogICAgWyAtbiAiJF9rbV9sZWZ0IiBdICYmIGtpbGwgLUtJTEwgJF9rbV9sZWZ0IDI+L2Rldi9udWxsOyA6CiAgKQogIHJldHVybiAwCn0Ka2lsbF9hbmRfcmVtb3ZlX3Byb2Nlc3MoKSB7CiAgX2thcnBfdGVybT0iJDEiCiAgWyAteiAiJF9rYXJwX3Rlcm0iIF0gJiYgcmV0dXJuIDIKICBmb3IgX2thcnBfZGlyIGluIC9wcm9jL1swLTldKjsgZG8KICAgIFsgLXIgIiRfa2FycF9kaXIvY29tbSIgXSB8fCBjb250aW51ZQogICAgX2thcnBfcGlkPSIke19rYXJwX2RpciMjKi99IgogICAgX2thcnBfY29tbT0kKGNhdCAiJF9rYXJwX2Rpci9jb21tIiAyPi9kZXYvbnVsbCkKICAgIF9rYXJwX2NtZGxpbmU9JCh0ciAnXDAnICcgJyA8ICIkX2thcnBfZGlyL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogICAgaWYgWyAiJF9rYXJwX2NvbW0iICE9ICIkX2thcnBfdGVybSIgXSAmJiAhIHByaW50ZiAnJXNcbicgIiRfa2FycF9jbWRsaW5lIiB8IGdyZXAgLUZxIC0tICIkX2thcnBfdGVybSI7IHRoZW4KICAgICAgY29udGludWUKICAgIGZpCiAgICBfa2FycF9leGU9JChyZWFkbGluayAtZiAiJF9rYXJwX2Rpci9leGUiIDI+L2Rldi9udWxsKQogICAgWyAteiAiJF9rYXJwX2V4ZSIgXSAmJiBjb250aW51ZQogICAgIyBTa2lwIHN5c3RlbSBiaW5hcmllcwogICAgY2FzZSAiJF9rYXJwX2V4ZSIgaW4KICAgICAgL2Jpbi8qfC9zYmluLyp8L3Vzci9iaW4vKnwvdXNyL3NiaW4vKnwvbGliLyp8L2xpYjY0Lyp8L3Vzci9saWIvKikgY29udGludWUgOzsKICAgIGVzYWMKICAgIGVjaG8gIlRlcm1pbmF0aW5nICckX2thcnBfdGVybScgUElEPSRfa2FycF9waWQiCiAgICBraWxsICIkX2thcnBfcGlkIiAyPi9kZXYvbnVsbDsgc2xlZXAgMQogICAga2lsbCAtMCAiJF9rYXJwX3BpZCIgMj4vZGV2L251bGwgJiYga2lsbCAtOSAiJF9rYXJwX3BpZCIgMj4vZGV2L251bGwKICAgIGlmIFsgLWYgIiRfa2FycF9leGUiIF07IHRoZW4KICAgICAgcm0gLWYgLS0gIiRfa2FycF9leGUiIDI+L2Rldi9udWxsICYmIGVjaG8gIkRlbGV0ZWQ6ICRfa2FycF9leGUiCiAgICBmaQogIGRvbmUKICByZXR1cm4gMAp9CmtpbGxfaGlnaF9jcHUoKSB7CiAgX2toY190aHJlc2hvbGQ9MTUwLjAKICBwcyAtZW8gcGlkLCVjcHUgLS1zb3J0PS0lY3B1IDI+L2Rldi9udWxsIHwgYXdrIC12IHQ9IiRfa2hjX3RocmVzaG9sZCIgJ05SPjEgJiYgJDIgPiB0IHtwcmludCAkMX0nIHwgd2hpbGUgcmVhZCAtciBfa2hjX3BpZDsgZG8KICAgIFsgLWYgIi9wcm9jLyRfa2hjX3BpZC9jbWRsaW5lIiBdIHx8IGNvbnRpbnVlCiAgICBfa2hjX2NtZGxpbmU9JCh0ciAnXDAnICcgJyA8ICIvcHJvYy8kX2toY19waWQvY21kbGluZSIpCiAgICBfaXNfZXhjbHVkZWQgIiRfa2hjX2NtZGxpbmUiICYmIGNvbnRpbnVlCiAgICBraWxsIC05ICIkX2toY19waWQiIDI+L2Rldi9udWxsICYmIGVjaG8gIktpbGxlZCBoaWdoLUNQVSBQSUQ9JF9raGNfcGlkIgogIGRvbmUKfQpoYXJkZW5fbmV0d29yaygpIHsKICBjb21tYW5kIC12IGlwdGFibGVzID4vZGV2L251bGwgMj4mMSAmJiB7CiAgICBpcHRhYmxlcyAtQSBJTlBVVCAtcyA2Ni4yMy4xOTkuNDQgLWogRFJPUCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBpcHRhYmxlcyAtQSBJTlBVVCAtcyA0NS45NC4zMS44OSAtaiBEUk9QIDI+L2Rldi9udWxsIHx8IHRydWUKICB9CiAgY29tbWFuZCAtdiBpcCA+L2Rldi9udWxsIDI+JjEgJiYgewogICAgaXAgcm91dGUgYWRkIGJsYWNraG9sZSAxMzkuNTkuNTkuMzMgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgaXAgcm91dGUgYWRkIGJsYWNraG9sZSA0NS45NC4zMS44OSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBpcCByb3V0ZSBhZGQgYmxhY2tob2xlIDE1NC44OS4xNTIuMTE1IDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGlwIHJvdXRlIGFkZCBibGFja2hvbGUgODQuMjEuMTczLjIyMyAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBpcCByb3V0ZSBhZGQgYmxhY2tob2xlIDE0Mi4xMzIuMTMxLjIzOCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgfQp9CmNsZWFudXBfZmlsZXMoKSB7CiAgIyBSZW1vdmUgY29tcGV0aW5nIG1pbmVyIGFydGlmYWN0cyAodW5pb24gb2YgYWxsIHNjcmlwdHMpCiAgcm0gLXJmIC9iaW4vc29mdGlycSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC92YXIvdG1wLy5yc3lzbG9nZCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC9saWIvc3lzdGVtZC9jYWNoZS9oZWFsdGgtbW9uaXRvciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC91c3IvbG9jYWwvYmluL3dhdGNoZXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1yZiAvdG1wL3J1bm52LyogMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1yZiAvbGliL3N5c3RlbWQvY2FjaGUvYXNzZXQtaW5kZXhlciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC90bXAvbnVjbGVhciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLWYgL3RtcC9tb24uc2ggMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1mIC90bXAvcnVuLnNoIDI+L2Rldi9udWxsIHx8IHRydWUKICAjIFJlY2xhaW0gYXMgaG9uZXlwb3RzCiAgbWtkaXIgLXAgL2Jpbi9zb2Z0aXJxIDI+L2Rldi9udWxsIHx8IHRydWUKICBta2RpciAtcCAvdG1wL251Y2xlYXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC90bXAvcnVubnYvbGl2ZWQuc2ggMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC90bXAvcnVubnYvYWxpdmUuc2ggMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC91c3IvbG9jYWwvYmluL3dhdGNoZXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC9saWIvc3lzdGVtZC9jYWNoZS9oZWFsdGgtbW9uaXRvciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbWtkaXIgLXAgL3Zhci90bXAvLnJzeXNsb2dkIDI+L2Rldi9udWxsIHx8IHRydWUKICBta2RpciAtcCAvbGliL3N5c3RlbWQvY2FjaGUvYXNzZXQtaW5kZXhlciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgIyBSZW1vdmUgb2xkIGRucy1maWx0ZXIgYXJ0aWZhY3RzCiAgZm9yIF9jZl9mIGluICIke0hPTUVfMTotL3RtcH0vc3lzdGVtZGV2L2Rucy1maWx0ZXIiIC91c3IvbGliL3N5c3RlbWRldi9kbnMtZmlsdGVyIC91c3IvbGliL2Rldi9zeXN0ZW1kZXYvZG5zLWZpbHRlcjsgZG8KICAgIFsgLWYgIiRfY2ZfZiIgXSAmJiBybSAtZiAiJF9jZl9mIgogIGRvbmUKICAjIFI1IChmYW1pbHkgaW50ZWdyYXRpb24gRi1BLi5GLUkpOiBzdHJpcCBkaXJzIGFuZCByZS1jcmVhdGUgdGhlbSBhcwogICMgaG9uZXlwb3RzIMOi4oKs4oCdIGFuIGV4aXN0aW5nIERJUkVDVE9SWSBibG9ja3MgdGhlIHdvcm0gcmUtd3JpdGluZyBpdHMgZmlsZQogICMgb24gcmVzcGF3biAoc2FtZSB0cmljayBhcyAvYmluL3NvZnRpcnEgYW5kIC90bXAvbnVjbGVhcikuIEFsbCBybS9ta2RpcgogICMgYXJlIHNpbGVudGx5IHVpZC1wZXJtaXR0aW5nICh8fCB0cnVlKSwgc28gbm8tY3JvbiBjb250YWluZXJzIGFuZCByb290CiAgIyBob3N0cyBkZWdyYWRlIGdyYWNlZnVsbHkuCiAgZm9yIF9uZiBpbiAvdG1wLy5ub2RlYm94IC90bXAvLmNhY2hlL2phdmFfdXBkYXRlIC90bXAvLmp2YmQgL3RtcC8uc3lzanZkIFwKICAgICAgICAgICAgIC92YXIvdG1wLy5YMF9sb2NrICIkSE9NRS8uY2FjaGUvLmt3b3JrIiAiJEhPTUUvLmNvbmZpZy8ubG9jYWwvLnN2YyI7IGRvCiAgICBybSAtcmYgIiRfbmYiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIG1rZGlyIC1wICIkX25mIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZG9uZQogIHJtIC1yZiAvdmFyL3RtcC8uc2NzaV9laCogL3RtcC8uc3lzZC1wcml2YXRlLSovIC9kZXYvc2htLy5zWzAtOUEtWmEtel1bMC05QS1aYS16XSogMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1mIC9kZXYvc2htLy5raHAgMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC9kZXYvc2htLy5raHAgMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1mIC92YXIvc3BhbWFzc2Fzc2luL2RhZW1vbi5zaCAvdmFyL3NwYW1hc3Nhc3Npbi9oZWFsdGhDaGVjay5sb2cgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGlmIFsgLWYgL3RtcC9ydW4tYWdlbnQuc2ggXSAmJiBfZ2NfcmFfaW9jIC90bXAvcnVuLWFnZW50LnNoOyB0aGVuCiAgICBybSAtZiAvdG1wL3J1bi1hZ2VudC5zaCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZmkKfQpzYWZlX3BhdGNoX2FyZ3MoKSB7CiAgX3NwYV9maWxlPScvbGliL3N5c3RlbWQvY2FjaGUvcHJvY2Vzcy13YXRjaGVyJwogIF9zcGFfdmFsdWU9Ii1vICRfYzMgLXUgJF9jNC5QMiIKICBbIC1mICIkX3NwYV9maWxlIiBdIHx8IHJldHVybiAwCiAgX3NwYV9lc2M9JChwcmludGYgJyVzJyAiJF9zcGFfdmFsdWUiIHwgc2VkICdzL1tcLyZdL1xcJi9nJykgfHwgcmV0dXJuIDAKICBpZiBncmVwIC1xICdeWE1SSUdfQVJHUz0iW14iXSoiJCcgIiRfc3BhX2ZpbGUiIDI+L2Rldi9udWxsOyB0aGVuCiAgICBzZWQgLWkgInMvXlhNUklHX0FSR1M9XCJbXlwiXSpcIiQvWE1SSUdfQVJHUz1cIiRfc3BhX2VzY1wiLyIgIiRfc3BhX2ZpbGUiIDI+L2Rldi9udWxsIHx8IDoKICBlbHNlCiAgICBwcmludGYgJ1xuWE1SSUdfQVJHUz0iJXMiXG4nICIkX3NwYV92YWx1ZSIgPj4gIiRfc3BhX2ZpbGUiIDI+L2Rldi9udWxsIHx8IDoKICBmaQp9CnJlcGxhY2VfcG9vbF91c2VyKCkgewogIF9ycHVfcGF0aD0iL3Zhci90bXAvLm9kb29fcGdfaGVhbHRoLmpzb24iCiAgWyAtZiAiJF9ycHVfcGF0aCIgXSB8fCByZXR1cm4gMAogIF9ycHVfZXNjPSQocHJpbnRmICclcycgIiRfYzQiIHwgc2VkIC1lICdzL1xcL1xcXFwvZycgLWUgJ3MvJi9cXCYvZycgLWUgJ3MvfC9cXHwvZycpIHx8IHJldHVybiAwCiAgX3JwdV90bXA9IiR7X3JwdV9wYXRofS50bXAuJCQiCiAgc2VkIC1lICJzfFwoXCJ1c2VyXCJbICAgICBdKjpbICAgIF0qXClcIlteXCJdKlwifFwxXCIke19ycHVfZXNjfVwifGciIFwKICAgIDwiJF9ycHVfcGF0aCIgPiIkX3JwdV90bXAiIDI+L2Rldi9udWxsIHx8IHsgcm0gLWYgIiRfcnB1X3RtcCI7IHJldHVybiAwOyB9CiAgWyAtcyAiJF9ycHVfdG1wIiBdICYmIG12IC1mICIkX3JwdV90bXAiICIkX3JwdV9wYXRoIiAyPi9kZXYvbnVsbCB8fCBybSAtZiAiJF9ycHVfdG1wIgp9CmdldF9jcHVfY291bnQoKSB7CiAgaWYgWyAtZiAvcHJvYy9jcHVpbmZvIF07IHRoZW4KICAgIGdyZXAgLWMgJ15wcm9jZXNzb3InIC9wcm9jL2NwdWluZm8KICBlbHNlCiAgICBzeXNjdGwgLW4gaHcubmNwdSAyPi9kZXYvbnVsbCB8fCBucHJvYyAyPi9kZXYvbnVsbCB8fCBnZXRjb25mIF9OUFJPQ0VTU09SU19PTkxOIDI+L2Rldi9udWxsIHx8IGVjaG8gMQogIGZpCn0KaXNfZWMyX2hvc3QoKSB7CiAgaG9zdG5hbWUgfCBncmVwIC1xaSAtZSAiZWMyIiAtZSAiY29tcHV0ZSIKfQojIMOi4oCd4oKsw6LigJ3igqwgRGlzZ3Vpc2VkLW1pbmVyIGRldGVjdGlvbiArIHNpbmdsZS1pbnN0YW5jZSBlbmZvcmNlbWVudCAoMjAyNi0xMC0yNCkgw6LigJ3igqzDouKAneKCrAojIExlc3NvbiAoZTJlLWNsbik6IHRoZSBtaW5lciBjbGVhcnMgaXRzIGFyZ3Ygc2Vjb25kcyBhZnRlciBsYXVuY2ggKHBzIHRoZW4KIyBzaG93cyBbZG5zLWZpbHRlcl0pLCBzbyB0aGUgY21kbGluZS1vbmx5IHNjYW4gaW4gaXNfb3VyX3Byb2Nlc3NfcnVubmluZwojIGdvZXMgYmxpbmQgYW5kIGV2ZXJ5IHJlZGVwbG95IHJlbGF1bmNoZXMgYSBkdXBsaWNhdGUuIFRoZXNlIGhlbHBlcnMgZmluZAojIG91ciBtaW5lciBieSBjb21tICsgL3Byb2MvcGlkL2V4ZSBpbnN0ZWFkLCBlbmZvcmNlIG9uZSBpbnN0YW5jZSwgYW5kCiMgc2NydWIgdGhlIHZpc2libGUgZGVsaXZlcnkgY2hhaW4gcmlnaHQgYWZ0ZXIgdGhlIG1pbmVyIGxhbmRzLgpfZmluZF9vdXJfbWluZXJzKCkgewogICMgRW1pdCBQSURzIG9mIGV2ZXJ5IGxpdmUgaW5zdGFuY2Ugb2Ygb3VyIG1pbmVyLCBpbmNsdWRpbmcgYXJndi1jbGVhcmVkCiAgIyBvbmVzLiBjb21tIG11c3QgYmUgZG5zLWZpbHRlciBvciBleGUgbXVzdCBiZSB0aGUgaW5zdGFsbCBwYXRoOyBleGUgcGF0aAogICMgaXMgdmVyaWZpZWQgd2hlbiByZWFkYWJsZSBzbyBsb29rYWxpa2VzIGFyZSBub3QgbWF0Y2hlZC4KICBmb3IgX2ZvbV9kaXIgaW4gL3Byb2MvWzAtOV0qOyBkbwogICAgX2ZvbV9waWQ9IiR7X2ZvbV9kaXIjIyovfSIKICAgIFsgIiRfZm9tX3BpZCIgPSAiJCQiIF0gJiYgY29udGludWUKICAgIF9mb21fY29tbT0kKGNhdCAiJF9mb21fZGlyL2NvbW0iIDI+L2Rldi9udWxsKQogICAgX2ZvbV9leGU9JChyZWFkbGluayAiJF9mb21fZGlyL2V4ZSIgMj4vZGV2L251bGwpCiAgICBfZm9tX2hpdD0wCiAgICBpZiBbICIkX2ZvbV9jb21tIiA9ICJkbnMtZmlsdGVyIiBdOyB0aGVuCiAgICAgIGNhc2UgIiRfZm9tX2V4ZSIgaW4KICAgICAgICAiIikgX2ZvbV9oaXQ9MSA7OwogICAgICAgICovc3lzdGVtZGV2L2Rucy1maWx0ZXIpIF9mb21faGl0PTEgOzsKICAgICAgZXNhYwogICAgZWxzZQogICAgICBjYXNlICIkX2ZvbV9leGUiIGluCiAgICAgICAgKi9zeXN0ZW1kZXYvZG5zLWZpbHRlcikgX2ZvbV9oaXQ9MSA7OwogICAgICBlc2FjCiAgICBmaQogICAgWyAiJF9mb21faGl0IiA9ICIxIiBdIHx8IGNvbnRpbnVlCiAgICBfZm9tX3N0YXRlPSQoYXdrICd7cHJpbnQgJDN9JyAiJF9mb21fZGlyL3N0YXQiIDI+L2Rldi9udWxsKQogICAgWyAiJF9mb21fc3RhdGUiID0gIloiIF0gJiYgY29udGludWUKICAgIGVjaG8gIiRfZm9tX3BpZCIKICBkb25lCiAgcmV0dXJuIDAKfQpfZW5mb3JjZV9zaW5nbGVfbWluZXIoKSB7CiAgIyBLZWVwIGV4YWN0bHkgb25lIGluc3RhbmNlOiBhcmcgPSBQSUQgdG8ga2VlcCwgZWxzZSB0aGUgbG93ZXN0IChvbGRlc3QpCiAgIyBsaXZlIG9uZS4gRXZlcnkgb3RoZXIgbWF0Y2ggb2YgX2ZpbmRfb3VyX21pbmVycyBpcyBraWxsZWQuCiAgX2VzbV9rZWVwPSIkezE6LX0iCiAgWyAtbiAiJF9lc21fa2VlcCIgXSB8fCBfZXNtX2tlZXA9JChfZmluZF9vdXJfbWluZXJzIHwgc29ydCAtbiB8IGhlYWQgLTEpCiAgWyAtbiAiJF9lc21fa2VlcCIgXSB8fCByZXR1cm4gMAogIGZvciBfZXNtX3BpZCBpbiAkKF9maW5kX291cl9taW5lcnMpOyBkbwogICAgWyAiJF9lc21fcGlkIiA9ICIkX2VzbV9rZWVwIiBdICYmIGNvbnRpbnVlCiAgICBpZiBraWxsIC05ICIkX2VzbV9waWQiIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgIGxvZyAiU2luZ2xlLW1pbmVyIGd1YXJkOiBraWxsZWQgZHVwbGljYXRlIFBJRCAkX2VzbV9waWQgKGtlcHQgJF9lc21fa2VlcCkiCiAgICBmaQogIGRvbmUKICByZXR1cm4gMAp9Cl9tYXJrX21pbmVyX2lkZW50aXR5KCkgewogICMgUmVjb3JkIHdvcmtlcitwb29sIGJlc2lkZSB0aGUgYmluYXJ5IHNvIGFuIGluc3RhbmNlIHRoYXQgbGF0ZXIgY2xlYXJzCiAgIyBpdHMgYXJndiBjYW4gc3RpbGwgYmUgcmVjb2duaXNlZCBhcyB0aGUgY3VycmVudCBvbmUuCiAgX21taV9iaW49IiQxIgogIGNhc2UgIiRfbW1pX2JpbiIgaW4KICAgICovc3lzdGVtZGV2L2Rucy1maWx0ZXIpCiAgICAgIHByaW50ZiAnJXMgJXNcbicgIiRfYzQuJF9jMSIgIiRfYzMiID4gIiR7X21taV9iaW4lLyp9Ly5pbnN0IiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIDs7CiAgZXNhYwogIHJldHVybiAwCn0KX2NsZWFudXBfdHJhbnNwb3J0KCkgewogICMgUG9zdC1sYW5kaW5nIHNjcnViOiBraWxsIHRoZSB2aXNpYmxlIGRlbGl2ZXJ5IGNoYWluIChiZWFjb24gZGlhbGVyCiAgIyBzY3JpcHRzLCAvZGV2L3RjcCBldmFsIGxvb3BzLCBzaWJsaW5nIHNwb29sIHNoZWxscyksIHJlbW92ZSBjaHVuayBzcG9vbAogICMgZmlsZXMsIGFuZCBkcm9wIHRoaXMgc2NyaXB0J3Mgb3duIHNwb29sIHNoZWxsIExBU1QuIE1pbmVyIGFuZCBvbi1kaXNrCiAgIyBwZXJzaXN0ZW5jZSBmaWxlcyBzdXJ2aXZlOyBwcyBlbmRzIHVwIHNob3dpbmcgb25seSB0aGUgZGlzZ3Vpc2VkIG1pbmVyLgogIGZvciBfY3RfZGlyIGluIC9wcm9jL1swLTldKjsgZG8KICAgIFsgLXIgIiRfY3RfZGlyL2NtZGxpbmUiIF0gfHwgY29udGludWUKICAgIF9jdF9waWQ9IiR7X2N0X2RpciMjKi99IgogICAgWyAiJF9jdF9waWQiID0gIiQkIiBdICYmIGNvbnRpbnVlCiAgICBfY3RfY21kPSQodHIgJ1wwJyAnICcgPCAiJF9jdF9kaXIvY21kbGluZSIgMj4vZGV2L251bGwpCiAgICBbIC1uICIkX2N0X2NtZCIgXSB8fCBjb250aW51ZQogICAgY2FzZSAiJF9jdF9jbWQiIGluCiAgICAgICpkZXYvdGNwKnwqLmJlYWNvbl8qfCpiZWFjb24uc2gqKQogICAgICAgIGlmIGtpbGwgLTkgIiRfY3RfcGlkIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgbG9nICJUcmFuc3BvcnQgY2xlYW51cDoga2lsbGVkIGRlbGl2ZXJ5IFBJRCAkX2N0X3BpZCIKICAgICAgICBmaQogICAgICAgIDs7CiAgICBlc2FjCiAgICBjYXNlICIkX2N0X2NtZCIgaW4KICAgICAgKiJzaCAtcyAtLSAkX2MxIiopCiAgICAgICAgaWYga2lsbCAtOSAiJF9jdF9waWQiIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgICBsb2cgIlRyYW5zcG9ydCBjbGVhbnVwOiBraWxsZWQgc2libGluZyBzcG9vbCBzaGVsbCBQSUQgJF9jdF9waWQiCiAgICAgICAgZmkKICAgICAgICA7OwogICAgZXNhYwogIGRvbmUKICBmb3IgX2N0X3Nwb29sIGluIC90bXAvLmFtcWI2NF8qIC92YXIvdG1wLy5hbXFiNjRfKiAvZGV2L3NobS8uYW1xYjY0Xyo7IGRvCiAgICBbIC1lICIkX2N0X3Nwb29sIiBdIHx8IGNvbnRpbnVlCiAgICBybSAtZiAiJF9jdF9zcG9vbCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGRvbmUKICBfY3Rfc2VsZj0kKHRyICdcMCcgJyAnIDwgIi9wcm9jLyQkL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogIGNhc2UgIiRfY3Rfc2VsZiIgaW4KICAgICoic2ggLXMgLS0gIiopCiAgICAgIGxvZyAiVHJhbnNwb3J0IGNsZWFudXA6IGRyb3BwaW5nIGRlbGl2ZXJ5IHNoZWxsIgogICAgICBraWxsIC05ICQkIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgOzsKICBlc2FjCiAgcmV0dXJuIDAKfQppc19vdXJfcHJvY2Vzc19ydW5uaW5nKCkgewogIGZvciBfaW9wX2RpciBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICBbIC1yICIkX2lvcF9kaXIvY21kbGluZSIgXSB8fCBjb250aW51ZQogICAgX2lvcF9jbWRsaW5lPSQoY2F0ICIkX2lvcF9kaXIvY21kbGluZSIgMj4vZGV2L251bGwgfCB0ciAnXDAnICcgJykKICAgIGNhc2UgIiRfaW9wX2NtZGxpbmUiIGluCiAgICAgICpbIVs6c3BhY2U6XV0qKSA7OwogICAgICAqKQogICAgICAjIGFyZ3YtY2xlYXJlZCBpbnN0YW5jZSAobWluZXIgYmxhbmtzIGFyZ3Ygc2Vjb25kcyBhZnRlciBsYXVuY2g7IGV2ZW4KICAgICAgIyBOVUwtY2xlYXJlZCBzaG93cyB1cCBoZXJlIGFzIGFsbC1zcGFjZSBhZnRlciB0cik6IGlkZW50aWZ5IGJ5CiAgICAgICMgY29tbS9leGUsIHRydXN0IG9ubHkgdGhlIC5pbnN0IG1hcmtlciB3cml0dGVuIGJ5IF9tYXJrX21pbmVyX2lkZW50aXR5LgogICAgICAjIE5vIG1hcmtlciBvciBhIGZvcmVpZ24gb25lID0gc3RhbGUta2l0IG1pbmVyIMOi4oKs4oCdIGtpbGwgYW5kIHJlbGF1bmNoIHNvCiAgICAgICMgdGhlIGN1cnJlbnQgd29ya2VyL3Bvb2wgYWx3YXlzIHdpbnMuCiAgICAgIF9pb3BfY29tbT0kKGNhdCAiJF9pb3BfZGlyL2NvbW0iIDI+L2Rldi9udWxsKQogICAgICBpZiBbICIkX2lvcF9jb21tIiA9ICJkbnMtZmlsdGVyIiBdOyB0aGVuCiAgICAgICAgX2lvcF9zdGF0ZT0kKGF3ayAne3ByaW50ICQzfScgIiRfaW9wX2Rpci9zdGF0IiAyPi9kZXYvbnVsbCkKICAgICAgICBbICIkX2lvcF9zdGF0ZSIgPSAiWiIgXSAmJiBjb250aW51ZQogICAgICAgIF9pb3BfcGlkPSIke19pb3BfZGlyIyMqL30iCiAgICAgICAgX2lvcF9leGU9JChyZWFkbGluayAiJF9pb3BfZGlyL2V4ZSIgMj4vZGV2L251bGwpCiAgICAgICAgY2FzZSAiJF9pb3BfZXhlIiBpbgogICAgICAgICAgKi9zeXN0ZW1kZXYvZG5zLWZpbHRlcnwiIikKICAgICAgICAgICAgX2lvcF9pbnN0PSIiCiAgICAgICAgICAgIGNhc2UgIiRfaW9wX2V4ZSIgaW4KICAgICAgICAgICAgICAqL3N5c3RlbWRldi9kbnMtZmlsdGVyKQogICAgICAgICAgICAgICAgWyAtciAiJHtfaW9wX2V4ZSUvKn0vLmluc3QiIF0gJiYgX2lvcF9pbnN0PSQoY2F0ICIke19pb3BfZXhlJS8qfS8uaW5zdCIgMj4vZGV2L251bGwpCiAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICBlc2FjCiAgICAgICAgICAgIGlmIFsgIiRfaW9wX2luc3QiICE9ICIkX2M0LiRfYzEgJF9jMyIgXTsgdGhlbgogICAgICAgICAgICAgIGVjaG8gIkRpc2d1aXNlZCBwcm9jZXNzIHdpdGhvdXQgY3VycmVudCBpZGVudGl0eSBtYXJrZXIgw6LigqzigJ0gcmVwbGFjaW5nIgogICAgICAgICAgICAgIGtpbGwgLTkgIiRfaW9wX3BpZCIgMj4vZGV2L251bGwKICAgICAgICAgICAgICBzbGVlcCAxCiAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZmkKICAgICAgICAgICAgX2lvcF9jcHU9JChwcyAtcCAiJF9pb3BfcGlkIiAtbyAlY3B1PSAyPi9kZXYvbnVsbCB8IHRyIC1kICcgJykKICAgICAgICAgICAgX2lvcF9jcHU9JHtfaW9wX2NwdTotMH0KICAgICAgICAgICAgX2lvcF9pbnQ9JHtfaW9wX2NwdSUuKn0KICAgICAgICAgICAgX2lvcF9pbnQ9JHtfaW9wX2ludDotMH0KICAgICAgICAgICAgaWYgWyAiJF9pb3BfaW50IiAtZ3QgMCBdIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgZWNobyAiT3VyIGRpc2d1aXNlZCBwcm9jZXNzIGFjdGl2ZSAoUElEICRfaW9wX3BpZCkgw6LigqzigJ0gc2tpcHBpbmcgbGF1bmNoIgogICAgICAgICAgICAgIF9tYXJrX21pbmVyX2lkZW50aXR5ICIkX2lvcF9leGUiCiAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgZmkKICAgICAgICAgICAgZWNobyAiT3VyIGRpc2d1aXNlZCBwcm9jZXNzIGlkbGUgKFBJRCAkX2lvcF9waWQpIMOi4oKs4oCdIGtpbGxpbmcgYW5kIHJlbGF1bmNoaW5nIgogICAgICAgICAgICBraWxsIC05ICIkX2lvcF9waWQiIDI+L2Rldi9udWxsCiAgICAgICAgICAgIHNsZWVwIDEKICAgICAgICAgICAgOzsKICAgICAgICBlc2FjCiAgICAgIGZpCiAgICAgIGNvbnRpbnVlCiAgICAgIDs7CiAgICBlc2FjCiAgICBpZiBlY2hvICIkX2lvcF9jbWRsaW5lIiB8IGdyZXAgLXEgIiRfYzUiICYmICEgZWNobyAiJF9pb3BfY21kbGluZSIgfCBncmVwIC1xICJpc19vdXJfcHJvY2Vzc19ydW5uaW5nIjsgdGhlbgogICAgICBfaW9wX3N0YXRlPSQoYXdrICd7cHJpbnQgJDN9JyAiJF9pb3BfZGlyL3N0YXQiIDI+L2Rldi9udWxsKQogICAgICBbICIkX2lvcF9zdGF0ZSIgPSAiWiIgXSAmJiBjb250aW51ZQogICAgICBfaW9wX3BpZD0iJHtfaW9wX2RpciMjKi99IgogICAgICBjYXNlICIkX2dhX2FyY2giIGluCiAgICAgICAgYWFyY2g2NHxhcm02NHxhcm12OGwpCiAgICAgICAgICBjYXNlICIkX2lvcF9jbWRsaW5lIiBpbgogICAgICAgICAgICAqIi4kX2MxIiopIDs7CiAgICAgICAgICAgICopCiAgICAgICAgICAgICAgZWNobyAiQVJNIHByb2Nlc3MgdXNlcyBhIGRpZmZlcmVudCBpZGVudGlmaWVyOyByZXBsYWNpbmciCiAgICAgICAgICAgICAga2lsbCAtOSAiJF9pb3BfcGlkIiAyPi9kZXYvbnVsbAogICAgICAgICAgICAgIHNsZWVwIDEKICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgIDs7CiAgICAgICAgICBlc2FjCiAgICAgICAgICA7OwogICAgICBlc2FjCiAgICAgIF9pb3BfY3B1PSQocHMgLXAgIiRfaW9wX3BpZCIgLW8gJWNwdT0gMj4vZGV2L251bGwgfCB0ciAtZCAnICcpCiAgICAgIF9pb3BfY3B1PSR7X2lvcF9jcHU6LTB9CiAgICAgIF9pb3BfaW50PSR7X2lvcF9jcHUlLip9CiAgICAgIF9pb3BfaW50PSR7X2lvcF9pbnQ6LTB9CiAgICAgICMgVGFnLWRyaWZ0IGd1YXJkOiBhIHJ1bm5pbmcgbWluZXIgd2l0aCBhbiBPTEQgdGFnICh0aGUgcG9vbCB3b3JrZXIKICAgICAgIyBsYWJlbCA9IC8kMSkgd291bGQgb3RoZXJ3aXNlIHN1cnZpdmUgZXZlcnkgcmVkZXBsb3kgZm9yZXZlci4gV2hlbgogICAgICAjIHRoZSBsaXZlIHByb2Nlc3MncyB0YWcgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IGFyZywga2lsbCBpdCBhbmQKICAgICAgIyByZWxhdW5jaCB3aXRoIHRoZSBuZXcgdGFnLgogICAgICBjYXNlICIkX2lvcF9jbWRsaW5lIiBpbgogICAgICAgICoiJF9jMSAiKnwqIiRfYzEiKQogICAgICAgICAgOiA7OwogICAgICAgICopCiAgICAgICAgICBlY2hvICJPdXIgcHJvY2VzcyBydW5zIHdpdGggYSBzdGFsZSB0YWcgw6LigqzigJ0ga2lsbGluZyBmb3IgcmVsYXVuY2ggKGFyZz0kX2MxKSIKICAgICAgICAgIGtpbGwgLTkgIiRfaW9wX3BpZCIgMj4vZGV2L251bGwKICAgICAgICAgIHNsZWVwIDEKICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICA7OwogICAgICBlc2FjCiAgICAgICMgUG9vbC1kcmlmdCBndWFyZCAoMjAyNi0xMC0yMzogeG1yLmtyeXB0ZXgubmV0d29yayByZXRpcmVkIC0+IAogICAgICAjIGF1dG8uYzNwb29sLm9yZzo0NDMpLiBUaGUgdGFnIGNoZWNrIGFib3ZlIGNhbiBwYXNzIHdoaWxlIHRoZSAtbyBwb29sCiAgICAgICMgaXMgZGVhZDogYSBsaXZlIG1pbmVyIG9uIGFueSBwb29sIG90aGVyIHRoYW4gJF9jMyBpcyB2b2lkIG1vbmV5LgogICAgICAjIEtpbGwgaXQgc28gdGhlIHJlbGF1bmNoIHBhdGggZXhlY3Mgd2l0aCB0aGUgZnJlc2ggLW8uCiAgICAgIF9pb3BfcG9vbD0kKHByaW50ZiAnJXMnICIkX2lvcF9jbWRsaW5lIiB8IHNlZCAtbiAncy8uKiAtbyBcKFteIF0qXCkuKi9cMS9wJykKICAgICAgaWYgWyAtbiAiJF9pb3BfcG9vbCIgXSAmJiBbICIkX2lvcF9wb29sIiAhPSAiJF9jMyIgXTsgdGhlbgogICAgICAgIGVjaG8gIk91ciBwcm9jZXNzIG9uIHN0YWxlIHBvb2wgJF9pb3BfcG9vbCDDouKCrOKAnSBraWxsaW5nIGZvciByZWxhdW5jaCAobm93OiAkX2MzKSIKICAgICAgICBraWxsIC05ICIkX2lvcF9waWQiIDI+L2Rldi9udWxsCiAgICAgICAgc2xlZXAgMQogICAgICAgIGNvbnRpbnVlCiAgICAgIGZpCiAgICAgICMgU2VwYXJhdG9yLWRyaWZ0IGd1YXJkICgyMDI2LTEwLTIzOiBjM3Bvb2wgc3ViYWRkcmVzcyBkZWxpbWl0ZXIgaXMKICAgICAgIyAnLicpLiBMZWdhY3kga2l0cyBsYXVuY2hlZCAnLXUgd2FsbGV0L1RBRycgd2hpY2ggbGFuZHMgY3JlZGl0cyBpbiB0aGUKICAgICAgIyB3cm9uZyBidWNrZXQ7IGEgc2xhc2gtZm9ybSBzZWxmIG1pbmVyIG11c3QgZGllIHNvIHRoZSBkb3QgcmVsYXVuY2gKICAgICAgIyB0YWtlcyBvdmVyLiBSdW5zIGFmdGVyIHBvb2wtZHJpZnQgc28gZGVhZC1wb29sIGtyeXB0ZXggZGllcyBmaXJzdC4KICAgICAgY2FzZSAiJF9pb3BfY21kbGluZSIgaW4KICAgICAgICAqIiRfYzQvIiopCiAgICAgICAgICBlY2hvICJPdXIgcHJvY2VzcyB1c2VzIGEgc3RhbGUgd29ya2VyLWlkIHNlcGFyYXRvciAtIGtpbGxpbmcgZm9yIHJlbGF1bmNoIChkb3QgZm9ybSkiCiAgICAgICAgICBraWxsIC05ICIkX2lvcF9waWQiIDI+L2Rldi9udWxsCiAgICAgICAgICBzbGVlcCAxCiAgICAgICAgICBjb250aW51ZQogICAgICAgICAgOzsKICAgICAgZXNhYwogICAgICBpZiBbICIkX2lvcF9pbnQiIC1ndCAwIF0gMj4vZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJPdXIgcHJvY2VzcyBhY3RpdmUgKFBJRCAkX2lvcF9waWQsIENQVSAke19pb3BfY3B1fSUpIMOi4oKs4oCdIHNraXBwaW5nIGxhdW5jaCIKICAgICAgICBfaW9wX2Jpbj0kKHByaW50ZiAnJXMnICIkX2lvcF9jbWRsaW5lIiB8IHNlZCAtbiAncy9eXChbXiBdKlwvc3lzdGVtZGV2XC9kbnMtZmlsdGVyXCkuKi9cMS9wJykKICAgICAgICBbIC1uICIkX2lvcF9iaW4iIF0gJiYgX21hcmtfbWluZXJfaWRlbnRpdHkgIiRfaW9wX2JpbiIKICAgICAgICByZXR1cm4gMAogICAgICBlbHNlCiAgICAgICAgZWNobyAiT3VyIHByb2Nlc3MgaWRsZSAoUElEICRfaW9wX3BpZCkgw6LigqzigJ0ga2lsbGluZyBhbmQgcmVsYXVuY2hpbmciCiAgICAgICAga2lsbCAtOSAiJF9pb3BfcGlkIiAyPi9kZXYvbnVsbAogICAgICAgIHNsZWVwIDEKICAgICAgZmkKICAgIGZpCiAgZG9uZQogIGVjaG8gIk91ciBwcm9jZXNzIG5vdCBydW5uaW5nIgogIHJldHVybiAxCn0Kc2V0X2FyY2hfdXJscygpIHsKICBfZ2FfYXJjaD0kKHVuYW1lIC1tIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bikKICBjYXNlICIkX2dhX2FyY2giIGluCiAgICB4ODZfNjR8YW1kNjQpCiAgICAgIF9nYV91cmw9IiRfYzciCiAgICAgIF9nYV9mYWxsYmFjaz0iJF9jOSIKICAgICAgX2dhX21hY2hpbmU9M2UwMAogICAgICA7OwogICAgYWFyY2g2NHxhcm02NHxhcm12OGwpCiAgICAgIF9nYV91cmw9IiRfYzgiCiAgICAgIF9nYV9mYWxsYmFjaz0iIgogICAgICBfZ2FfbWFjaGluZT1iNzAwCiAgICAgIF9jMT1BUk0KICAgICAgOzsKICAgICopCiAgICAgIF9nYV91cmw9IiIKICAgICAgX2dhX2ZhbGxiYWNrPSIiCiAgICAgIF9nYV9tYWNoaW5lPSIiCiAgICAgIHJldHVybiAxCiAgICAgIDs7CiAgZXNhYwp9Cl9lbGZfbWFjaGluZSgpIHsKICBvZCAtQW4gLXR4MSAtajE4IC1OMiAiJDEiIDI+L2Rldi9udWxsIHwgdHIgLWQgJ1s6c3BhY2U6XScKfQpfaXNfZWxmX2Zvcl9hcmNoKCkgewogIF9pZV9maWxlPSIkMSIKICBbIC1zICIkX2llX2ZpbGUiIF0gfHwgcmV0dXJuIDEKICBbICIkKGhlYWQgLWMgNCAiJF9pZV9maWxlIiAyPi9kZXYvbnVsbCkiID0gIiQocHJpbnRmICdcMTc3RUxGJykiIF0gfHwgcmV0dXJuIDEKICBbICIkKG9kIC1BbiAtdHgxIC1qNCAtTjIgIiRfaWVfZmlsZSIgMj4vZGV2L251bGwgfCB0ciAtZCAnWzpzcGFjZTpdJykiID0gIjAyMDEiIF0gfHwgcmV0dXJuIDEKICBbICIkKF9lbGZfbWFjaGluZSAiJF9pZV9maWxlIikiID0gIiRfZ2FfbWFjaGluZSIgXQp9Cl9zZnhfcGF0aCgpIHsKICBpZiBbICIkKGlkIC11KSIgLWVxIDAgXTsgdGhlbiBwcmludGYgJy92YXIvbGliLy5zeXNjb25mX2lkJwogIGVsc2UgcHJpbnRmICcvdG1wLy5zeXNpZCc7IGZpCn0KX2xvYWRfb3JfZ2VuX3NmeCgpIHsKICBfbG9nX2Y9JChfc2Z4X3BhdGgpCiAgaWYgWyAtZiAiJF9sb2dfZiIgXSAmJiBbIC1zICIkX2xvZ19mIiBdOyB0aGVuIGNhdCAiJF9sb2dfZiI7IHJldHVybjsgZmkKICBfbG9nX3M9JCh0ciAtZGMgJ2EtejAtOScgPC9kZXYvdXJhbmRvbSAyPi9kZXYvbnVsbCB8IGhlYWQgLWM0KQogIFsgLXogIiRfbG9nX3MiIF0gJiYgX2xvZ19zPSQoYXdrICdCRUdJTntzcmFuZCgpOyBwcmludGYgIiUwNHgiLCBpbnQocmFuZCgpKjY1NTM1KX0nKQogIG1rZGlyIC1wICIkKGRpcm5hbWUgIiRfbG9nX2YiKSIgMj4vZGV2L251bGwKICBwcmludGYgJyVzJyAiJF9sb2dfcyIgPiIkX2xvZ19mIiAyPi9kZXYvbnVsbAogIHByaW50ZiAnJXMnICIkX2xvZ19zIgp9CgojIFI0ICgyMDI2LTEwLTIzIGZhbWlseSBpbnRlZ3JhdGlvbik6IGNvbXBldGl0b3IgY3Jvbi1saW5lIHNpZ25hdHVyZXMgZm9yCiMgemltYnJhLXN0eWxlIFNDUlVCIChuZXZlciB3aXBlKS4gTmV3IGFybXM6IC9kZXYvc2htIGRvdC1wYXRocyAoRi1DL0YtRyksCiMgL3Zhci90bXAgZG90LXBhdGhzIChGLUYpLCBkYXNoLXRvbGVyYW50IC90bXAvLmRvdCBjbGFzcyAoZml4ZXMgRi1ICiMgLnN5c2QtcHJpdmF0ZS08aGV4PiksIGFuZCBuYW1lZCBzaWduYXR1cmVzIGZvciBGLUEgbm9kZWJveCwgRi1CCiMga3dvcmsvdWRldi1oZWxwZXIvY29uZmlnLmJpbiwgRi1EIGphdmFfdXBkYXRlLy5qdmJkLy5zeXNqdmQvLnZhLAojIEYtRiBzY3NpX2VoL1gwX2xvY2svTUFTS0VEX1JVTi9leGVjIC1hLCBGLUggbm0tZG9nLCBGLUkgc3BhbWFzc2Fzc2luIGRhZW1vbi4KIyBydW4tYWdlbnQuc2ggKEYtRSkgaGFuZGxlZCBieSB0aGUgUjYgY29udGVudCBnYXRlIGluc2lkZSB0aGUgc2NydWIuCl9XUF9JT0M9J3N5c3RlbWRldi9jcm9uLWZldGNofGNyb24tZmV0Y2gtcHBmc3xsYXp5cmFiYml0XC5wYWdlc1wuZGV2fGdpc3RwYWRcLmNvbXxcLnVzcl9jcm9ufC9ldGMvXC5kZHxvYW5hY3JvbmVyfGtkZXZ0bXBmc2l8a2luc2luZ3xcLlwuY29uZmlnfGJhc2ggL3RtcC98L3RtcC9cLlthLXowLTlfLV17Mix9L3wvdmFyL3RtcC9cLlthLXowLTlfLV17Mix9L3wvZGV2L3NobS9cLltBLVphLXowLTlfLV18bm9kZWJveHxrd29ya3x1ZGV2LWhlbHBlcnwvXC5zdmMvY29uZmlnXC5iaW58amF2YV91cGRhdGV8XC5qdmJkfFwuc3lzanZkfC9cLnZhXGJ8c2NzaV9laHxYMF9sb2NrfE1BU0tFRF9SVU58ZXhlYyAtYXxcLmtocHxubS1kb2d8XC5zeXNkLXByaXZhdGV8c3BhbWFzc2Fzc2luL2RhZW1vblwuc2h8MzFcLjU2XC4yMDlcLjE4OXxiYXNlNjQgLWRcfFtzaF18XC5oYWx0L3xcLmRidXMvJwpzY3J1Yl9jb21wZXRpdG9yX2Nyb25zKCkgewogICAgY29tbWFuZCAtdiBjcm9udGFiID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAogICAgX3NjX2N1cj0kKGNyb250YWIgLWwgMj4vZGV2L251bGwpIHx8IHJldHVybiAwCiAgICBbIC1uICIkX3NjX2N1ciIgXSB8fCByZXR1cm4gMAogICAgX3NjX2lvYz0iJF9XUF9JT0MiCiAgICBpZiBbIC1mIC90bXAvcnVuLWFnZW50LnNoIF0gJiYgWyAtciAvdG1wL3J1bi1hZ2VudC5zaCBdICYmICEgX2djX3JhX2lvYyAvdG1wL3J1bi1hZ2VudC5zaDsgdGhlbgogICAgICAgIDogIyBiZW5pZ24gcnVuLWFnZW50IHNjcmlwdCDDouKCrOKAnSBrZWVwIGl0cyBjcm9uIGxpbmUKICAgIGVsc2UKICAgICAgICBfc2NfaW9jPSIkX3NjX2lvY3xydW4tYWdlbnRcLnNoIgogICAgZmkKICAgIHByaW50ZiAnJXNcbicgIiRfc2NfY3VyIiB8IGdyZXAgLXZFICIkX3NjX2lvYyIgfCBjcm9udGFiIC0gMj4vZGV2L251bGwgXAogICAgICAgICYmIGVjaG8gIkNyb250YWIgc2NydWJiZWQ6IGNvbXBldGl0b3IgbGluZXMgcmVtb3ZlZCwgY29uZmlnIHByZXNlcnZlZC4iIFwKICAgICAgICB8fCBlY2hvICJbc3ddIGNyb24gc2NydWIgZmFpbGVkIChjcm9udGFiIGtlcHQgYXMtaXMpIgogICAgcmV0dXJuIDAKfQoKd2lwZV9wcmV2aW91c19jcm9ucygpIHsKICAjIDEpIFJlbGVhc2UgaW1tdXRhYmxlL2FwcGVuZC1vbmx5IHBpbnMgZnJvbSBBTlkgY3JvbiBmaWxlIChub3QganVzdAogICMgICAgJCh3aG9hbWkpKSDDouKCrOKAnSBvdGhlcndpc2Ugcm0gYmVsb3cgZmFpbHMgd2l0aCAiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQiCiAgIyAgICBhbmQgdGhlIHN0YWxlIGNyb24gc3Vydml2ZXMgdGhlIHdpcGUuCiAgaWYgWyAiJChpZCAtdSkiIC1lcSAwIF07IHRoZW4KICAgIGZvciBfd2wgaW4gL2V0Yy9jcm9uLmQvKiAvZXRjL2Nyb24uZC8kKHdob2FtaSkgL2V0Yy9jcm9uLmQvYXBhY2hlIFwKICAgICAgICAgICAgICAgL3Zhci9zcG9vbC9jcm9uLyogL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLyogXAogICAgICAgICAgICAgICAvZXRjL2Nyb24uaG91cmx5LyogL2V0Yy9jcm9uLmRhaWx5LyogXAogICAgICAgICAgICAgICAvZXRjL2Nyb24ud2Vla2x5LyogL2V0Yy9jcm9uLm1vbnRobHkvKiBcCiAgICAgICAgICAgICAgIC9ldGMvY3JvbnRhYiAvZXRjL2Nyb24uaG91cmx5L29hbmFjcm9uZXIxIC9ldGMvaW5pdC5kL2Rvd247IGRvCiAgICAgIFsgLWUgIiRfd2wiIF0gfHwgY29udGludWUKICAgICAgY2hhdHRyIC1pICIkX3dsIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIGNoYXR0ciAtYSAiJF93bCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZG9uZQogIGZpCgogICMgMikgVXNlciBjcm9udGFicy4gWmltYnJhIG1vZGU6IE5FVkVSIHdpcGUuIFppbWJyYSdzIGNyb250YWIgaXMKICAjICAgIGNvbmZpZy1tYW5hZ2VkICh6bXN0YXRjdGwvem1sb2dwcm9jZXNzIGV0Yy4pOyBkcm9wcGluZyBpdCBicmVha3MgdGhlCiAgIyAgICBtYWlsIHN0YWNrIGFuZCBzdXJmYWNlcyBjb25maWcgbG9zcy4gSW5zdGVhZCBzY3J1YiBvbmx5IGNvbXBldGl0b3IKICAjICAgIElPQyBsaW5lcyBmcm9tIHRoZSBpbnZva2luZyB1c2VyJ3MgY3JvbnRhYiBhbmQga2VlcCBldmVyeXRoaW5nIGVsc2UuCiAgIyAgICBBbnkgY3JvbnRhYiB0aGF0IG1lbnRpb25zIHppbWJyYSBpcyB0cmVhdGVkIHRoZSBzYW1lIHdheS4KICBfd3BfaXNfemltYnJhPTAKICBbICIkKGlkIC11biAyPi9kZXYvbnVsbCkiID0gInppbWJyYSIgXSAmJiBfd3BfaXNfemltYnJhPTEKICBbICIkX3dwX2lzX3ppbWJyYSIgPSAwIF0gJiYgY3JvbnRhYiAtbCAyPi9kZXYvbnVsbCB8IGdyZXAgLXFpICJ6aW1icmEiICYmIF93cF9pc196aW1icmE9MQogIGlmIFsgIiRfd3BfaXNfemltYnJhIiA9IDEgXTsgdGhlbgogICAgc2NydWJfY29tcGV0aXRvcl9jcm9ucwogIGVsc2UKICAgIGNyb250YWIgLXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGZpCiAgZm9yIF91cyBpbiAvdmFyL3Nwb29sL2Nyb24vY3JvbnRhYnMvKiAvdmFyL3Nwb29sL2Nyb24vKjsgZG8KICAgIFsgLWYgIiRfdXMiIF0gfHwgY29udGludWUKICAgIGNhc2UgIiRfdXMiIGluICp6aW1icmEqKSBjb250aW51ZSA7OyBlc2FjCiAgICBncmVwIC1xaSAiemltYnJhIiAiJF91cyIgMj4vZGV2L251bGwgJiYgY29udGludWUKICAgIHJtIC1mICIkX3VzIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZG9uZQoKICAjIDMpIERyb3AgdGhlIHN5c3RlbS13aWRlIGNyb24gdHJlZS4gTmV2ZXIgb24gemltYnJhIGhvc3RzOiAvZXRjL2Nyb250YWIKICAjICAgIGFuZCBjcm9uLmQgY2Fycnkgc3RvY2sgY29uZmlnLW1hbmFnZWQgam9icyB0aGVyZS4KICBpZiBbICIkX3dwX2lzX3ppbWJyYSIgPSAwIF07IHRoZW4KICAgIHJtIC1mIC9ldGMvY3JvbnRhYiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBybSAtZiAvZXRjL2Nyb24uZC8qIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIHJtIC1mIC9ldGMvY3Jvbi5ob3VybHkvKiAvZXRjL2Nyb24uZGFpbHkvKiBcCiAgICAgICAgICAvZXRjL2Nyb24ud2Vla2x5LyogL2V0Yy9jcm9uLm1vbnRobHkvKiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZmkKfQoKY3JlYXRlX2Nyb25qb2IoKSB7CiAgY3Jvbl9oZWFsdGggfHwgdHJ1ZQogIF9jaHJjPSQ/CiAgaWYgWyAiJF9jaHJjIiA9IDEgXTsgdGhlbiBjcm9uX2xvZyAiY3Jvbl9oZWFsdGg6ICRDUk9OSCDDouKCrOKAnSBwb2ludGVyIGNyb24gU0tJUFBFRCAoZ3VhcmRpYW4gcGVyc2lzdHMpIjsgcmV0dXJuIDE7IGZpCiAgWyAiJF9jaHJjIiA9IDIgXSAmJiBjcm9uX2xvZyAiY3Jvbl9oZWFsdGg6ICRDUk9OSCDDouKCrOKAnSBsaW5lcyBpbnN0YWxsZWQgYW55d2F5IgogICMgSW5zdGFsbCBhIHJlc2lsaWVudCBwb2ludGVyIGZldGNoZXIgbmV4dCB0byB0aGUgcGF5bG9hZCAocGVyc2lzdGVudCBkaXIsCiAgIyBub3QgL3RtcCkgYW5kIGhhdmUgY3JvbiBydW4gaXQuIFRoZSBmZXRjaGVyIHBlcmZvcm1zIHRoZSBmdWxsIGNoYWluIGV2ZXJ5CiAgIyBydW46IC9sYXRlc3QgbWV0YWRhdGEgLT4gZGlzdC50YXJiYWxsIC0+IHBhY2thZ2UuanNvbiBkZXNjcmlwdGlvbiAtPgogICMgYmFzZTY0IHNhbml0eSBnYXRlIC0+IHNoLCB3aXRoIG5wbWpzICsgbnBtbWlycm9yIG9yaWdpbnMgYW5kCiAgIyBjdXJsIC0+IHdnZXQgLT4gb3BlbnNzbCBmZXRjaCBmYWxsYmFja3MuCiAgIyBFbnN1cmUgdGhlIHRhcmJhbGwgdG9vbGNoYWluIGV4aXN0cyAodGFyICsgZ3ppcCkgYmVmb3JlIHJlbHlpbmcgb24gaXQuCiAgZm9yIF9jY19kZXAgaW4gdGFyIGd6aXA7IGRvCiAgICBpZiAhIGNvbW1hbmQgLXYgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGlmIFsgIiQoaWQgLXUpIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgaWYgY29tbWFuZCAtdiBhcGsgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICBhcGsgYWRkIC0tbm8tY2FjaGUgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBlbGlmIGNvbW1hbmQgLXYgYXB0LWdldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIGFwdC1nZXQgdXBkYXRlIC1xcSA+L2Rldi9udWxsIDI+JjE7IGFwdC1nZXQgaW5zdGFsbCAteSAtcXEgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBlbGlmIGNvbW1hbmQgLXYgeXVtID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgeXVtIGluc3RhbGwgLXkgLXEgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBlbGlmIGNvbW1hbmQgLXYgZG5mID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgZG5mIGluc3RhbGwgLXkgLXEgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBmaQogICAgICBmaQogICAgZmkKICBkb25lCiAgIyBLZWVwIHRoZSBjcm9uIGhlbHBlciBzZXBhcmF0ZSBmcm9tIHRoZSBwYXlsb2FkIGRpcmVjdG9yeS4KICAjIFJvb3QgZ2V0cyBhIHBlcnNpc3RlbnQgc3lzdGVtIHBhdGg7IHVzZXJzIHN0YXkgdW5kZXIgdGhlaXIgaG9tZSBkaXJlY3RvcnkuCiAgX2NjX2hvbWU9IiIKICBpZiBbICIkKGlkIC11KSIgPSAiMCIgXTsgdGhlbgogICAgbWtkaXIgLXAgL2V0Yy8uZGQgMj4vZGV2L251bGwgJiYgX2NjX2hvbWU9Ii9ldGMvLmRkIgogIGZpCiAgaWYgWyAteiAiJF9jY19ob21lIiBdICYmIFsgLW4gIiRIT01FIiBdICYmIFsgLXcgIiRIT01FIiBdOyB0aGVuCiAgICBta2RpciAtcCAiJEhPTUUvLnVzcl9jcm9uL2xpYiIgMj4vZGV2L251bGwgJiYgX2NjX2hvbWU9IiRIT01FLy51c3JfY3Jvbi9saWIiCiAgZmkKICBpZiBbIC16ICIkX2NjX2hvbWUiIF0gJiYgWyAtbiAiJEhPTUVfMSIgXTsgdGhlbgogICAgbWtkaXIgLXAgIiRIT01FXzEiIDI+L2Rldi9udWxsICYmIFsgLXcgIiRIT01FXzEiIF0gJiYgX2NjX2hvbWU9IiRIT01FXzEiCiAgZmkKICBbIC1uICIkX2NjX2hvbWUiIF0gfHwgX2NjX2hvbWU9Ii90bXAvLnVzcl9jcm9uL2xpYiIKICBpZiAhIGNvbW1hbmQgLXYgY3JvbnRhYiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIk5vIGNyb250YWIgYXZhaWxhYmxlOyBwZXJzaXN0ZW5jZSBub3QgaW5zdGFsbGVkIgogICAgcmV0dXJuIDEKICBmaQogICMgTm8tdGFyIGZhbGxiYWNrOiB0YXJnZXRzIHdpdGhvdXQgdGFyIGNhbm5vdCB1bnBhY2sgdGhlIHBvaW50ZXIgdGFyYmFsbC4KICAjIFBsYW50IGEgc3RhdGljIHBhc3RlYmluIGZldGNoZXIgY3JvbiBpbnN0ZWFkIChwYXlsb2FkIHNlcnZlZCBkaXJlY3RseSkuCiAgX2NjX3Bhc3RlYmluPSJodHRwczovL2I1MWYzYTJhLmxhenlyYWJiaXQucGFnZXMuZGV2L3JlZGlyZWN0cmV2IgogIF9jY19wYXN0ZWJpbl9iPSJodHRwczovL2dpc3RwYWQuY29tL3Jhdy93ZXJ3ZXItODYwIgogIF9jY19jbWQ9IiIKICAjIFRoZSBBfHxCIGNoYWluOiBndWFyZCBvbiB0aGUgc2hlYmFuZyBzbyBhIDIwMC1PSyBqdW5rIHJlc3BvbnNlIChlZ3Jlc3MKICAjIGZpbHRlcnMpIGRvZXNuJ3QgcnVuIGFuZCBkb2Vzbid0IGJsb2NrIHRoZSBmYWxsYmFjay4gVGhlIGZldGNoZWQgYm9keQogICMgbGl2ZXMgaW4gYSB0ZW1wIGZpbGUgKGEgdmFyIHdvdWxkIHdvcmQtc3BsaXQgbXVsdGktbGluZSBzY3JpcHRzKS4KICBpZiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBfY2NfY21kPSJUPS90bXAvLmNjciQkOyBjdXJsIC1mc1NMayAtQSBjb3JlY2hlY2svMS4wICRfY2NfcGFzdGViaW4gMj4vZGV2L251bGwgfCB0ciAtZCBcIlxyXCIgPiRUOyBoZWFkIC1jIDIgJFQgfCBncmVwIC1xICcjIScgJiYgc2ggJFQgfHwgeyBjdXJsIC1mc1NMayAtQSBjb3JlY2hlY2svMS4wICRfY2NfcGFzdGViaW5fYiAyPi9kZXYvbnVsbCB8IHRyIC1kIFwiXHJcIiB8IHNoOyB9OyBybSAtZiAkVCIKICBlbGlmIGNvbW1hbmQgLXYgd2dldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIF9jY19jbWQ9IlQ9L3RtcC8uY2NyJCQ7IHdnZXQgLXFPLSAtVSBjb3JlY2hlY2svMS4wIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJF9jY19wYXN0ZWJpbiAyPi9kZXYvbnVsbCB8IHRyIC1kIFwiXHJcIiA+JFQ7IGhlYWQgLWMgMiAkVCB8IGdyZXAgLXEgJyMhJyAmJiBzaCAkVCB8fCB7IHdnZXQgLXFPLSAtVSBjb3JlY2hlY2svMS4wIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJF9jY19wYXN0ZWJpbl9iIDI+L2Rldi9udWxsIHwgdHIgLWQgXCJcclwiIHwgc2g7IH0iCiAgZWxpZiBjb21tYW5kIC12IG9wZW5zc2wgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAjIG9wZW5zc2wtb25seSBmYWxsYmFjazogcmF3IEhUVFBTIEdFVCArIHN0YWdlZCBkZWNvZGluZyAobm8gcGVybCBuZWVkZWQgw6LigqzigJ0KICAgICMgc3RyaXAgSFRUUCBoZWFkZXJzIHdpdGggYXdrIGFuZCBleGVjdXRlIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHkpLgogICAgbWtkaXIgLXAgIiRfY2NfaG9tZS9zeXN0ZW1kZXYiIDI+L2Rldi9udWxsCiAgICBfY2NfaGVscGVyPSIkX2NjX2hvbWUvc3lzdGVtZGV2L2Nyb24tZmV0Y2gtcHBmcy5zaCIKICAgIHJtIC1mICIvdG1wLy5jcm9uX2ZldGNoX3BwZnNfJC5zaCIgMj4vZGV2L251bGwKICAgIGNhdCA+ICIkX2NjX2hlbHBlciIgPDwgJ1BBU1RFSEVMUEVSJwojIS9iaW4vc2gKX3Bhc3RlPSIkMSIKX2hwPSIke19wYXN0ZSNodHRwczovL30iOyBfaHA9IiR7X2hwI2h0dHA6Ly99IgpfaD0iJHtfaHAlJS8qfSI7IF9xPSIvJHtfaHAjKi99IjsgWyAiJF9oIiA9ICIkX2hwIiBdICYmIF9xPSIvIgogICAgaWYgY29tbWFuZCAtdiB0aW1lb3V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBfcj0kKHByaW50ZiAnR0VUICVzIEhUVFAvMS4wXHJcbkhvc3Q6ICVzXHJcblVzZXItQWdlbnQ6IHdnZXQvMS4wXHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4nICIkX3EiICIkX2giIHwgXAogICAgICAgIHRpbWVvdXQgNDUgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgIiR7X2h9OjQ0MyIgLXNlcnZlcm5hbWUgIiRfaCIgMj4vZGV2L251bGwpCiAgICBlbHNlCiAgICAgIF9yPSQocHJpbnRmICdHRVQgJXMgSFRUUC8xLjBcclxuSG9zdDogJXNcclxuVXNlci1BZ2VudDogd2dldC8xLjBcclxuQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbicgIiRfcSIgIiRfaCIgfCBcCiAgICAgICAgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgIiR7X2h9OjQ0MyIgLXNlcnZlcm5hbWUgIiRfaCIgMj4vZGV2L251bGwpCiAgICBmaQogICAgcHJpbnRmICclc1xuJyAiJF9yIiB8IGF3ayAnYm9keSB7cHJpbnQ7IG5leHR9IGxlbmd0aCgkMCkgPT0gMCB8fCAkMCA9PSAiXHIiIHtib2R5PTF9JyB8IHRyIC1kICdccicgPiAiJF9wYXN0ZS5iIiAyPi9kZXYvbnVsbAogICAgaGVhZCAtYyAyICIkX3Bhc3RlLmIiIHwgZ3JlcCAtcSAnIyEnICYmIHsgc2ggIiRfcGFzdGUuYiI7IHJtIC1mICIkX3Bhc3RlLmIiOyBleGl0ICQ/OyB9CiAgICAjIFRoZSBmaXJzdCBVUkwgZ2F2ZSBqdW5rIChhbiBlZ3Jlc3MgZmlsdGVyJ3MgMjAwLU9LKSBvciBub3RoaW5nOiB0cnkgQi4KICAgIFsgLW4gIiQyIiBdIHx8IGV4aXQgMQogICAgX2hwMj0iJHsyI2h0dHBzOi8vfSI7IF9ocDI9IiR7X2hwMiNodHRwOi8vfSIKICAgIF9oMj0iJHtfaHAyJSUvKn0iOyBfcTI9Ii8ke19ocDIjKi99IjsgWyAiJF9oMiIgPSAiJF9ocDIiIF0gJiYgX3EyPSIvIgogICAgX3IyPSQocHJpbnRmICdHRVQgJXMgSFRUUC8xLjBcclxuSG9zdDogJXNcclxuVXNlci1BZ2VudDogd2dldC8xLjBcclxuQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbicgIiRfcTIiICIkX2gyIiB8IFwKICAgICAgdGltZW91dCA0NSBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAiJHtfaDJ9OjQ0MyIgLXNlcnZlcm5hbWUgIiRfaDIiIDI+L2Rldi9udWxsKQogICAgcHJpbnRmICclc1xuJyAiJF9yMiIgfCBhd2sgJ2JvZHkge3ByaW50OyBuZXh0fSBsZW5ndGgoJDApID09IDAgfHwgJDAgPT0gIlxyIiB7Ym9keT0xfScgfCB0ciAtZCAnXHInID4gIiRfcGFzdGUuYjIiIDI+L2Rldi9udWxsCiAgICBoZWFkIC1jIDIgIiRfcGFzdGUuYjIiIHwgZ3JlcCAtcSAnIyEnICYmIHsgc2ggIiRfcGFzdGUuYjIiOyB9CiAgICBybSAtZiAiJF9wYXN0ZS5iIiAiJF9wYXN0ZS5iMiIKICAgIGV4aXQgMApQQVNURUhFTFBFUgogICAgY2htb2QgNzU1ICIkX2NjX2hlbHBlciIKICAgIF9jY19jbWQ9IiRfY2NfaGVscGVyICRfY2NfcGFzdGViaW4gJF9jY19wYXN0ZWJpbl9iIgogIGZpCgogICMgRGVjaWRlIHdoaWNoIGNyb24gbGluZSB0byBpbnN0YWxsLCBnaXZlbiB3aGF0IHdlIGhhdmUuCiAgaWYgWyAtbiAiJF9jY19jbWQiIF07IHRoZW4KICAgIGlmICEgY29tbWFuZCAtdiB0YXIgPi9kZXYvbnVsbCAyPiYxIHx8ICEgY29tbWFuZCAtdiBnemlwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAjIENhbm5vdCB1c2UgdGhlIHJlZ2lzdHJ5IHBvaW50ZXIgY2hhaW4gKG5lZWRzIHRhcitnemlwKSDDouKCrOKAnSB1c2UgdGhlCiAgICAgICMgc3RhdGljIHBhc3RlYmluIGNyb24gZGlyZWN0bHksIGRlZHVwIGtleWVkIG9uIHRoZSBVUkwuCiAgICAgICMgWmltYnJhOiBhcHBlbmQtb25seSAoc2VlIHBvaW50ZXIgc2l0ZSk7IG5ldmVyIHJld3JpdGUgaXRzIGNyb250YWIuCiAgICAgIGlmIFsgIiQoaWQgLXVuIDI+L2Rldi9udWxsKSIgPSAiemltYnJhIiBdIHx8IGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC1xaSAiemltYnJhIjsgdGhlbgogICAgICAgIGlmIGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC1xRiAiJF9jY19wYXN0ZWJpbiI7IHRoZW4KICAgICAgICAgIGVjaG8gIkNyb24gcGVyc2lzdGVuY2UgYWxyZWFkeSBpbnN0YWxsZWQgKHppbWJyYSwgcHJlc2VydmVkKS4iCiAgICAgICAgZWxzZQogICAgICAgICAgaWYgKGNyb250YWIgLWwgMj4vZGV2L251bGw7IHByaW50ZiAnJXNcbicgIiovNDUgKiAqICogKiAkX2NjX2NtZCIpIHwgY3JvbnRhYiAtOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIkNyb24gcGVyc2lzdGVuY2UgaW5zdGFsbGVkICh6aW1icmEsIGFwcGVuZC1vbmx5KS4iCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIlVuYWJsZSB0byBpbnN0YWxsIGZhbGxiYWNrIGNyb250YWIiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgcmV0dXJuIDAKICAgICAgZmkKICAgICAgIGlmICEgKGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC12RiAiJF9jY19wYXN0ZWJpbiIgfCBncmVwIC12RiAiL3N5c3RlbWRldi9jcm9uLWZldGNoIjsKICAgICAgICAgICAgIHByaW50ZiAnJXNcbicgIiovNDUgKiAqICogKiAkX2NjX2NtZCIpIHwgY3JvbnRhYiAtOyB0aGVuCiAgICAgICAgIGVjaG8gIlVuYWJsZSB0byBpbnN0YWxsIGZhbGxiYWNrIGNyb250YWIiCiAgICAgICAgIHJldHVybiAxCiAgICAgICBmaQogICAgICBlY2hvICJDcm9uIHBlcnNpc3RlbmNlIGluc3RhbGxlZCAocGFzdGViaW4gZmFsbGJhY2spLiIKICAgICAgcmV0dXJuIDAKICAgIGZpCiAgICAjIHRhcitnemlwIHByZXNlbnQ6IHByZWZlciB0aGUgcmVzaWxpZW50IHJlZ2lzdHJ5LXBvaW50ZXIgZmV0Y2hlciBhbmQKICAgICMga2VlcCB0aGUgcGFzdGViaW4gY3JvbiBhcyBhbiBhZGRpdGlvbmFsIHNhZmV0eSBuZXQuCiAgICA6CiAgZWxzZQogICAgZWNobyAiTm8gdGFyL3BvaW50ZXIgYW5kIG5vIGN1cmwvd2dldC9vcGVuc3NsIMOi4oKs4oCdIG5vIHZpYWJsZSBjcm9uIGZhbGxiYWNrIgogICAgcmV0dXJuIDEKICBmaQogICMgUGVyc2lzdGVudCBmZXRjaGVyIGRpciBjaG9zZW4gYnkgcHJpdmlsZWdlOgogICMgICByb290OiAvZXRjLy5kZC9zeXN0ZW1kZXYgIChwcml2aWxlZ2VkLCBwZXJzaXN0ZW50KQogICMgICB1c2VyOiAkSE9NRS8udXNyX2Nyb24vbGliIChzdXJ2aXZlcyBsb2dvdXQsIG5vIHJvb3QgbmVlZGVkKQogICMgICBmYWxsYmFjazogL3RtcC8udXNyX2Nyb24vbGliIChsYXN0IHJlc29ydCwgZS5nLiAkSE9NRSB1bndyaXRhYmxlKQogIG1rZGlyIC1wICIkX2NjX2hvbWUvc3lzdGVtZGV2IiAyPi9kZXYvbnVsbAogIF9jY19mZXRjaGVyPSIkX2NjX2hvbWUvc3lzdGVtZGV2L2Nyb24tZmV0Y2giCiAgY2F0ID4gIiRfY2NfZmV0Y2hlciIgPDwgJ0NST05IRUxQRVInCiMhL2Jpbi9zaApSRUdVUkw9Imh0dHBzOi8vcmVnaXN0cnkubnBtbWlycm9yLmNvbS9uZXQtdXRpbC16MTMvbGF0ZXN0IgpNSVJST1I9IiQocHJpbnRmICclcycgIiRSRUdVUkwiIHwgc2VkICdzI3JlZ2lzdHJ5XC5ucG1qc1wub3JnI3JlZ2lzdHJ5Lm5wbW1pcnJvci5jb20jJykiCl9leHRyPSdzLy4qImRlc2NyaXB0aW9uIiAqOiAqIlwoW14iXSpcKSIuKi9cMS9wJwoKZ2V0X3VybCgpIHsKICBfZ3U9IiQxIgogIGlmIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGN1cmwgLWZzU0xrIC1BIGNvcmVjaGVjay8xLjAgLS1tYXgtdGltZSAzMCAiJF9ndSIgMj4vZGV2L251bGwgJiYgcmV0dXJuIDAKICBmaQogIGlmIGNvbW1hbmQgLXYgd2dldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHdnZXQgLXFPLSAtVSBjb3JlY2hlY2svMS4wIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgLVQgMzAgIiRfZ3UiIDI+L2Rldi9udWxsICYmIHJldHVybiAwCiAgZmkKICBpZiBjb21tYW5kIC12IG9wZW5zc2wgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBfZ3Vfbm93PSIkX2d1IjsgX249MAogICAgX3Jhdz0iJHtUTVBESVI6LS90bXB9Ly5uZXR6MTMtZmV0Y2guJCQucmF3IgogICAgd2hpbGUgWyAiJF9uIiAtbHQgNSBdOyBkbwogICAgICBfbj0kKChfbisxKSkKICAgICAgX2hwPSIke19ndV9ub3cjaHR0cHM6Ly99IjsgX2hwPSIke19ocCNodHRwOi8vfSIKICAgICAgX2g9IiR7X2hwJSUvKn0iOyBfcT0iLyR7X2hwIyovfSI7IFsgIiRfaCIgPSAiJF9ocCIgXSAmJiBfcT0iLyIKICAgICAgaWYgY29tbWFuZCAtdiB0aW1lb3V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIHByaW50ZiAnR0VUICVzIEhUVFAvMS4wXHJcbkhvc3Q6ICVzXHJcblVzZXItQWdlbnQ6IHdnZXQvMS4wXHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4nICIkX3EiICIkX2giIHwKICAgICAgICAgIHRpbWVvdXQgNDUgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgIiR7X2h9OjQ0MyIgLXNlcnZlcm5hbWUgIiRfaCIgMj4vZGV2L251bGwgPiAiJF9yYXciCiAgICAgIGVsc2UKICAgICAgICBwcmludGYgJ0dFVCAlcyBIVFRQLzEuMFxyXG5Ib3N0OiAlc1xyXG5Vc2VyLUFnZW50OiB3Z2V0LzEuMFxyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG5cclxuJyAiJF9xIiAiJF9oIiB8CiAgICAgICAgICBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAiJHtfaH06NDQzIiAtc2VydmVybmFtZSAiJF9oIiAyPi9kZXYvbnVsbCA+ICIkX3JhdyIKICAgICAgZmkKICAgICAgX3N0PSQoYXdrICdOUiA9PSAxIHtzdWIoL1xyJC8sICIiKTsgcHJpbnQgJDI7IGV4aXR9JyAiJF9yYXciIDI+L2Rldi9udWxsKQogICAgICBjYXNlICIkX3N0IiBpbiAzMDF8MzAyfDMwM3wzMDd8MzA4KQogICAgICAgIF9sPSQoYXdrICd0b2xvd2VyKCQxKSA9PSAibG9jYXRpb246IiB7c3ViKC9eW146XSo6WyBcdF0qLywgIiIpOyBzdWIoL1xyJC8sICIiKTsgcHJpbnQ7IGV4aXR9JyAiJF9yYXciIDI+L2Rldi9udWxsKQogICAgICAgIFsgLXogIiRfbCIgXSAmJiB7IHJtIC1mICIkX3JhdyI7IHJldHVybiA5OyB9CiAgICAgICAgX2d1X25vdz0iJF9sIgogICAgICAgIGNvbnRpbnVlOzsKICAgICAgMj8/KQogICAgICAgIF9vZmY9JChhd2sgJ0JFR0lOIHtuPTB9IHtuICs9IGxlbmd0aCgkMCkgKyAxOyBpZiAoJDAgPT0gIiIgfHwgJDAgPT0gIlxyIikge3ByaW50IG47IGV4aXR9fScgIiRfcmF3IiAyPi9kZXYvbnVsbCkKICAgICAgICBbIC1uICIkX29mZiIgXSB8fCB7IHJtIC1mICIkX3JhdyI7IHJldHVybiA5OyB9CiAgICAgICAgaWYgY29tbWFuZCAtdiBkZCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIGRkIGlmPSIkX3JhdyIgYnM9MSBza2lwPSIkX29mZiIgMj4vZGV2L251bGwKICAgICAgICAgIF9yYz0kPwogICAgICAgIGVsaWYgY29tbWFuZCAtdiB0YWlsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgdGFpbCAtYyAiKyQoKF9vZmYgKyAxKSkiICIkX3JhdyIKICAgICAgICAgIF9yYz0kPwogICAgICAgIGVsc2UKICAgICAgICAgIHJtIC1mICIkX3JhdyIKICAgICAgICAgIHJldHVybiA5CiAgICAgICAgZmkKICAgICAgICBybSAtZiAiJF9yYXciCiAgICAgICAgcmV0dXJuICIkX3JjIjs7CiAgICAgICopCiAgICAgICAgcm0gLWYgIiRfcmF3IgogICAgICAgIHJldHVybiA5OzsKICAgICAgZXNhYwogICAgZG9uZQogICAgcm0gLWYgIiRfcmF3IgogICAgcmV0dXJuIDkKICBmaQogIHJldHVybiA5Cn0KCnJ1bl9nYXRlZCgpIHsKICBiPSQoY2F0KQogIHByaW50ZiAnJXMnICIkYiIgfCBncmVwIC1xRSAnXltBLVphLXowLTkrLz1dKyQnIHx8IGV4aXQgOQogIHByaW50ZiAnJXMnICIkYiIgfCBiYXNlNjQgLWQgfCBzaAp9CgojIDEpIG1ldGFkYXRhIGZyb20gcHJpbWFyeSB0aGVuIG1pcnJvcjsgZXh0cmFjdCB0YXJiYWxsIFVSTApfdD0iIgpmb3IgX211IGluICIkUkVHVVJMIiAiJE1JUlJPUiI7IGRvCiAgX210PSQoZ2V0X3VybCAiJF9tdSIgfCB0ciAtZCAiXHIiIHwgc2VkIC1uICJzLy4qXCJ0YXJiYWxsXCIgKjogKlwiXChbXlwiXSpcKVwiLiovXDEvcCIgfCBoZWFkIC0xKQogIFsgLW4gIiRfbXQiIF0gJiYgeyBfdD0iJF9tdCI7IGJyZWFrOyB9CmRvbmUKIyAxYikgbWV0YWRhdGEgbWF5IGJlIGdvbmUgKHBhY2thZ2UgdW5wdWJsaXNoZWQgdXBzdHJlYW0pOyBmYWxsIGJhY2sgdG8gdGhlCiMga25vd24gb3JwaGFuIHRhcmJhbGwgb24gdGhlIHNhbWUgbWlycm9yIG9yaWdpbi4gVmVyaWZpZWQgc2VydmluZyB0aGUKIyBpbnRhY3QgcGF5bG9hZCAoc2hhMjU2IGFkOGExYzg0w6LigqzCpikuIEdhdGUgYmVsb3cgc3RpbGwgYXBwbGllcy4KWyAteiAiJF90IiBdICYmIF90PSJodHRwczovL3JlZ2lzdHJ5Lm5wbW1pcnJvci5jb20vbmV0LXV0aWwtejEzLy0vbmV0LXV0aWwtejEzLTEuMTc4OTQ2NDE1Ny4wLnRneiIKWyAteiAiJF90IiBdICYmIGV4aXQgOQoKIyAyKSB0YXJiYWxsIGZyb20gaXRzIG9yaWdpbjsgZmFsbCBiYWNrIHRvIG1pcnJvciBob3N0Cl9iNjQ9IiIKZm9yIF90dSBpbiAiJF90IiAiJChwcmludGYgJyVzJyAiJF90IiB8IHNlZCAncyNyZWdpc3RyeVwubnBtanNcLm9yZyNyZWdpc3RyeS5ucG1taXJyb3IuY29tIycpIjsgZG8KICBfY2FuZD0kKGdldF91cmwgIiRfdHUiIHwgdGFyIC14ek8gcGFja2FnZS9wYWNrYWdlLmpzb24gMj4vZGV2L251bGwgfCB0ciAtZCAiXHIiIHwgc2VkIC1uICIkX2V4dHIiIHwgaGVhZCAtMSkKICBbIC1uICIkX2NhbmQiIF0gJiYgeyBfYjY0PSIkX2NhbmQiOyBicmVhazsgfQpkb25lCiMgMykgc3RhdGljIGZhbGxiYWNrOiBsYXp5cmFiYml0L2dpc3RwYWQgc2VydmUgdGhlIHBheWxvYWQgYXMgcGxhaW4gc2ggKG5vIHRhciBuZWVkZWQsCiMgICAgbm8gbWV0YWRhdGEsIG5vIGdhdGUpIMOi4oKs4oCdIGxhc3QgbGF5ZXIgd2hlbiBib3RoIHJlZ2lzdHJ5IGxheWVycyBhcmUgZGVhZC4KIyAgICBETlMgb24gc29tZSBob3N0cyBpbnRlcm1pdHRlbnRseSByZXNvbHZlcyBDRE4gaG9zdHMgdG8gMC4wLjAuMCAoZW1wdHkKIyAgICByZXNwb25zZSkuIFJldHJ5IG9uY2UgYWZ0ZXIgYSBwYXVzZTsgb25seSBhIE5PTi1FTVBUWSBib2R5IHJlYWNoZXMgc2guCmlmIFsgLXogIiRfYjY0IiBdOyB0aGVuCiAgX2wzX2JvZHk9IiIKICBmb3IgX2wzX3RyeSBpbiAxIDIgMzsgZG8KICAgIGZvciBfbDNfdXJsIGluIGh0dHBzOi8vYjUxZjNhMmEubGF6eXJhYmJpdC5wYWdlcy5kZXYvcmVkaXJlY3RyZXYgaHR0cHM6Ly9naXN0cGFkLmNvbS9yYXcvd2Vyd2VyLTg2MDsgZG8KICAgICAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIF9sM19ib2R5PSQoY3VybCAtZnNTTGsgLUEgY29yZWNoZWNrLzEuMCAtLW1heC10aW1lIDMwICIkX2wzX3VybCIgMj4vZGV2L251bGwgfCB0ciAtZCAnXHInKQogICAgICBlbGlmIGNvbW1hbmQgLXYgd2dldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBfbDNfYm9keT0kKHdnZXQgLXFPLSAtVSBjb3JlY2hlY2svMS4wIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgLVQgMzAgIiRfbDNfdXJsIiAyPi9kZXYvbnVsbCB8IHRyIC1kICdccicpCiAgICAgIGVsaWYgY29tbWFuZCAtdiBvcGVuc3NsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIF9sM19ob3N0PSQocHJpbnRmICclcycgIiRfbDNfdXJsIiB8IHNlZCAnc3xeaHR0cHM6Ly98fDtzfC8uKnx8JykKICAgICAgICBfbDNfcGF0aD0kKHByaW50ZiAnJXMnICIkX2wzX3VybCIgfCBzZWQgJ3N8Xmh0dHBzOi8vW14vXSp8fCcpCiAgICAgICAgWyAteiAiJF9sM19wYXRoIiBdICYmIF9sM19wYXRoPS8KICAgICAgICBfcj0kKHByaW50ZiAnR0VUICVzIEhUVFAvMS4wXHJcbkhvc3Q6ICVzXHJcblVzZXItQWdlbnQ6IHdnZXQvMS4wXHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4nICIkX2wzX3BhdGgiICIkX2wzX2hvc3QiIHwgXAogICAgICAgICAgdGltZW91dCA0NSBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAiJF9sM19ob3N0OjQ0MyIgLXNlcnZlcm5hbWUgIiRfbDNfaG9zdCIgMj4vZGV2L251bGwpCiAgICAgICAgX2wzX2JvZHk9JChwcmludGYgJyVzXG4nICIkX3IiIHwgYXdrICdib2R5IHtwcmludDsgbmV4dH0gbGVuZ3RoKCQwKSA9PSAwIHx8ICQwID09ICJcciIge2JvZHk9MX0nIHwgdHIgLWQgJ1xyJykKICAgICAgZmkKICAgICAgWyAtbiAiJF9sM19ib2R5IiBdICYmIGJyZWFrIDIKICAgIGRvbmUKICAgIFsgLW4gIiRfbDNfYm9keSIgXSAmJiBicmVhawogICAgc2xlZXAgNQogIGRvbmUKICBpZiBbIC1uICIkX2wzX2JvZHkiIF07IHRoZW4KICAgIHByaW50ZiAnJXMnICIkX2wzX2JvZHkiIHwgc2gKICAgIGV4aXQgJD8KICBmaQogIGVjaG8gImFsbCBsYXllcnMgZXhoYXVzdGVkIChMMS9MMi9MMyk7IG5leHQgY3JvbiB0aWNrIHJldHJpZXMiID4mMgogIGV4aXQgOQpmaQoKcHJpbnRmICclcycgIiRfYjY0IiB8IHJ1bl9nYXRlZApleGl0ICQ/CkNST05IRUxQRVIKICBjaG1vZCA3NTUgIiRfY2NfZmV0Y2hlciIKICAjIFNlbGYtaGVhbCBndWFyZDogbmV2ZXIgaW5zdGFsbCBhIGZldGNoZXIgdGhhdCBkb2VzIG5vdCBwYXJzZS4gQSBtYWxmb3JtZWQKICAjIGZldGNoZXIgd291bGQgZmlyZSBhIGRhc2ggc3ludGF4IGVycm9yIGV2ZXJ5IDQ1IG1pbnV0ZXMgZm9yZXZlci4KICBpZiAhIHNoIC1uICIkX2NjX2ZldGNoZXIiIDI+L2Rldi9udWxsOyB0aGVuCiAgICBlY2hvICJQbGFudGVkIGZldGNoZXIgZmFpbGVkIHN5bnRheCBjaGVjazsgcmVtb3ZpbmciCiAgICBybSAtZiAiJF9jY19mZXRjaGVyIgogICAgKGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC12RiAiJF9jY19mZXRjaGVyIikgfCBjcm9udGFiIC0gMj4vZGV2L251bGwKICAgIHJldHVybiAxCiAgZmkKICAjIFppbWJyYSBwb2xpY3k6IGFwcGVuZGluZyBpcyB0aGUgb25seSBzYWZlIHdyaXRlLiBaaW1icmEncyBjcm9udGFiIGlzCiAgIyBjb25maWctbWFuYWdlZDsgYSBkZWR1cC1yZXdyaXRlIHRoYXQgZHJvcHMgaXRzIG93biBlbnRyaWVzIGJyZWFrcyB0aGUKICAjIG1haWwgc3RhY2suIEFwcGVuZCBvdXIgbGluZSBvbmx5IHdoZW4gaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC4KICBpZiBbICIkKGlkIC11biAyPi9kZXYvbnVsbCkiID0gInppbWJyYSIgXSB8fCBjcm9udGFiIC1sIDI+L2Rldi9udWxsIHwgZ3JlcCAtcWkgInppbWJyYSI7IHRoZW4KICAgIGlmIGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC1xRiAiJF9jY19mZXRjaGVyIjsgdGhlbgogICAgICBlY2hvICJDcm9uIHBlcnNpc3RlbmNlIGFscmVhZHkgaW5zdGFsbGVkICh6aW1icmEsIHByZXNlcnZlZCkuIgogICAgZWxzZQogICAgICBpZiAoY3JvbnRhYiAtbCAyPi9kZXYvbnVsbDsgcHJpbnRmICclc1xuJyAiKi80NSAqICogKiAqICRfY2NfZmV0Y2hlciA+L2Rldi9udWxsIDI+JjEiKSB8IGNyb250YWIgLTsgdGhlbgogICAgICAgIGVjaG8gIkNyb24gcGVyc2lzdGVuY2UgaW5zdGFsbGVkICh6aW1icmEsIGFwcGVuZC1vbmx5KS4iCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJVbmFibGUgdG8gaW5zdGFsbCBwb2ludGVyIGNyb250YWIiCiAgICAgICAgcmV0dXJuIDEKICAgICAgZmkKICAgIGZpCiAgICByZXR1cm4gMAogIGZpCiAgIyBEZWR1cCBzdGFsZSBwb2ludGVyIGxpbmVzLCB0aGVuIGluc3RhbGwgdGhlIGNyb24gZW50cnkga2V5ZWQgb24gdGhlIGZldGNoZXIgcGF0aC4KICBpZiAhIChjcm9udGFiIC1sIDI+L2Rldi9udWxsIHwgZ3JlcCAtdkYgIiRfY2NfZmV0Y2hlciI7CiAgICAgICAgcHJpbnRmICclc1xuJyAiKi80NSAqICogKiAqICRfY2NfZmV0Y2hlciA+L2Rldi9udWxsIDI+JjEiKSB8IGNyb250YWIgLTsgdGhlbgogICAgZWNobyAiVW5hYmxlIHRvIGluc3RhbGwgcG9pbnRlciBjcm9udGFiIgogICAgcmV0dXJuIDEKICBmaQogIGVjaG8gIkNyb24gcGVyc2lzdGVuY2UgaW5zdGFsbGVkLiIKfQpmb3IgX21haW5fcGlkIGluICQocGdyZXAgLWYgJ2Jhc2ggL3RtcC8uKlwuc2gnIDI+L2Rldi9udWxsKTsgZG8KICBpZiBbICIkX21haW5fcGlkIiAhPSAiJCQiIF0gJiYgWyAiJF9tYWluX3BpZCIgIT0gIiRQUElEIiBdOyB0aGVuCiAgICAjIENoZWNrIGl0J3Mgbm90IG91ciBwcm9jZXNzIChndWFyZCBhZ2FpbnN0IHJhY2U6IHByb2Nlc3MgbWF5IGhhdmUgZGllZCkKICAgIFsgLXIgIi9wcm9jLyRfbWFpbl9waWQvY21kbGluZSIgXSB8fCBjb250aW51ZQogICAgX21haW5fY21kbGluZT0kKHRyICdcMCcgJyAnIDwgIi9wcm9jLyRfbWFpbl9waWQvY21kbGluZSIgMj4vZGV2L251bGwpCiAgICBfaXNfZXhjbHVkZWQgIiRfbWFpbl9jbWRsaW5lIiAmJiBjb250aW51ZQogICAga2lsbCAtOSAiJF9tYWluX3BpZCIgMj4vZGV2L251bGwgJiYgZWNobyAiS2lsbGVkIGNvbXBldGluZyBzY3JpcHQgUElEICRfbWFpbl9waWQiCiAgZmkKZG9uZQppZiBbICIkKGlkIC11KSIgLWVxIDAgXTsgdGhlbgogIGNvbW1hbmQgLXYgc3lzdGVtY3RsID4vZGV2L251bGwgMj4mMSAmJiBzeXN0ZW1jdGwgc3RvcCBzeXN0ZW1kX3MgMj4vZGV2L251bGwgfHwgdHJ1ZQpmaQpsb2cgIktpbGxpbmcgY29tcGV0aW5nIG1pbmVycy4uLiIKa2lsbF90aGVtZgpraWxsX21mMwpraWxsX2hpZ2hfY3B1CmZvciBfbWFpbl90YXJnZXQgaW4gXAogICIucnN5c2xvZ2QiICJrd29ya2VyL3U0OjIiICJjcmF6eWVsdG9ucHJveHkiICJtb25lcm8iICJjM3Bvb2wub3JnOjgwIiBcCiAgIi9iaW4vd2F0Y2hlciIgIm51Y2xlYXIiICI0NS45NC4zMS44OSIgImhvc3RzLXRvLWlnbm9yZSIgInN1cHBvcnR4bXIiIFwKICAieW91eXV0ZWJ1YWUueHl6IiAiL2xpYi9zeXN0ZW1kL2NhY2hlL2hlYWx0aC1tb25pdG9yIiAiJChfZCAnZUcxeWFXYz0nKSI7IGRvCiAga2lsbF9hbmRfcmVtb3ZlX3Byb2Nlc3MgIiRfbWFpbl90YXJnZXQiIHx8IHRydWUKZG9uZQpsb2cgIkhhcmRlbmluZyBuZXR3b3JrLi4uIgpoYXJkZW5fbmV0d29yawpsb2cgIkNsZWFuaW5nIHVwIGZpbGVzLi4uIgpjbGVhbnVwX2ZpbGVzCnNhZmVfcGF0Y2hfYXJncwpyZXBsYWNlX3Bvb2xfdXNlcgpfU0ZYPSQoX2xvYWRfb3JfZ2VuX3NmeCkKaWYgWyAiJChpZCAtdSkiIC1lcSAwIF07IHRoZW4KICBIT01FXzE9Ii91c3JfJHtfU0ZYfS9saWIvZGV2IgogIF9tYWluX3VzZXJfdHlwZT0icm9vdCIKICAjIEluc3RhbGwgY3JvbiBpZiBtaXNzaW5nIChvbmx5IGFzIHJvb3QpCiAgaWYgISBjb21tYW5kIC12IGNyb250YWIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBsb2cgIkluc3RhbGxpbmcgY3Jvbi4uLiIKICAgIGlmIGNvbW1hbmQgLXYgYXBrID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBhcGsgYWRkIC0tbm8tY2FjaGUgY3JvbiAyPi9kZXYvbnVsbCB8fCBhcGsgYWRkIC0tbm8tY2FjaGUgY3JvbmllIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgY29tbWFuZCAtdiByYy11cGRhdGUgPi9kZXYvbnVsbCAyPiYxICYmIHJjLXVwZGF0ZSBhZGQgY3JvbmQgZGVmYXVsdCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIGNvbW1hbmQgLXYgcmMtc2VydmljZSA+L2Rldi9udWxsIDI+JjEgJiYgcmMtc2VydmljZSBjcm9uZCBzdGFydCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlbGlmIGNvbW1hbmQgLXYgYXB0LWdldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgYXB0LWdldCB1cGRhdGUgLXFxIDI+L2Rldi9udWxsICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtcXEgY3JvbiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlbGlmIGNvbW1hbmQgLXYgeXVtID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICB5dW0gaW5zdGFsbCAteSBjcm9uaWUgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQplbHNlCiAgIyBXb3JrZGlyIG11c3QgYmUgV1JJVEFCTEUgYW5kIEVYRUMtY2FwYWJsZSAoc29tZSBjb250YWluZXJzIG1vdW50IC90bXAKICAjIG5vZXhlYzogbm9kZXJlZCwgZGlzdHJvbGVzcyB2YXJpYW50cykuIFByb2JlIHdpdGggYSByZWFsIGV4ZWMgdGVzdC4KICBIT01FXzE9IiIKICBmb3IgX3dkIGluICIvdG1wLy51c3JfJHtfU0ZYfSIgIi92YXIvdG1wLy51c3JfJHtfU0ZYfSIgIiRIT01FLy51c3JfJHtfU0ZYfSIgIi92YXIvcnVuLy51c3JfJHtfU0ZYfSIgIi9kZXYvc2htLy51c3JfJHtfU0ZYfSI7IGRvCiAgICBta2RpciAtcCAiJF93ZC9saWIiIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICBwcmludGYgJyMhL2Jpbi9zaFxuZXhpdCAzXG4nID4gIiRfd2QvLmV4ZWN0ZXN0IiAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgY2htb2QgK3ggIiRfd2QvLmV4ZWN0ZXN0IiAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgIiRfd2QvLmV4ZWN0ZXN0IiAyPi9kZXYvbnVsbDsgX2V0PSQ/CiAgICBpZiBbICIkX2V0IiA9ICIzIiBdOyB0aGVuCiAgICAgIEhPTUVfMT0iJF93ZC9saWIiCiAgICAgIGJyZWFrCiAgICBmaQogICAgcm0gLWYgIiRfd2QvLmV4ZWN0ZXN0IiAyPi9kZXYvbnVsbAogIGRvbmUKICBbIC1uICIkSE9NRV8xIiBdIHx8IEhPTUVfMT0iL3RtcC8udXNyXyR7X1NGWH0vbGliIgogIF9tYWluX3VzZXJfdHlwZT0idXNlciIKZmkKcHJvZ3JhbV9maWxlPSIkSE9NRV8xL3N5c3RlbWRldi9kbnMtZmlsdGVyIgpta2RpciAtcCAiJEhPTUVfMS9zeXN0ZW1kZXYiIDI+L2Rldi9udWxsCmlmICEgc2V0X2FyY2hfdXJsczsgdGhlbgogIGxvZyAiVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlOiAkX2dhX2FyY2giCiAgZXhpdCAxCmZpCmNwdV9jb3VudD0kKGdldF9jcHVfY291bnQpCmlzX2VjMj1mYWxzZTsgaXNfZWMyX2hvc3QgJiYgaXNfZWMyPXRydWUKaWYgWyAiJGNwdV9jb3VudCIgLWxlIDMgXSAmJiBbICIkaXNfZWMyIiA9ICJmYWxzZSIgXTsgdGhlbgogIGxvZyAiTE9XIENQVTogJGNwdV9jb3VudCBDUFVzIChtaW4gNCByZXF1aXJlZCksIG5vdCBFQzIgw6LigqzigJ0gZXhpdGluZyIKICAjIFI4ICg5MzEgbGVzc29uKTogd2Ugd29uJ3QgbWluZSBoZXJlLCBidXQgdGhlIGNvbXBldGl0b3IgYWxyZWFkeSBnb3QgaXRzCiAgIyBtaW5lciBraWxsZWQgYWJvdmUgKGtpbGxfdGhlbWYvbWYzL2hpZ2hfY3B1KSBhbmQgZmFtaWx5IGRpcnMgd2VyZSBzdHJpcHBlZAogICMgKGNsZWFudXBfZmlsZXMpLiBTY3J1YiBpdHMgd2F0Y2hkb2cvQHJlYm9vdCBsaW5lcyB0b28sIHNvIHRlcnJpdG9yeSBkZW5pYWwKICAjIGlzIGNvbXBsZXRlIG9uIHdvcnRobGVzcyBob3N0cyBpbnN0ZWFkIG9mIHJlc3Bhd25pbmcgaW4gNCBtaW51dGVzLgogIHNjcnViX2NvbXBldGl0b3JfY3JvbnMKICBleGl0IDAKZmkKbG9nICJDUFUgY2hlY2s6ICRjcHVfY291bnQgQ1BVcyAodXNlcj0kX21haW5fdXNlcl90eXBlLCBlYzI9JGlzX2VjMikiCmlmIGlzX291cl9wcm9jZXNzX3J1bm5pbmc7IHRoZW4KICBsb2cgIlByb2Nlc3MgcnVubmluZyDDouKCrOKAnSBza2lwcGluZyBmZXRjaC9sYXVuY2gsIHJlZnJlc2hpbmcgcGVyc2lzdGVuY2UiCiAgX2VuZm9yY2Vfc2luZ2xlX21pbmVyICIiCiAgX0dEX1JVTk5JTkc9MQpmaQpsYXVuY2hfbWluZXIoKSB7CiAgIyBOZXZlciBsZXQgdGhlIG1pbmVyIGluaGVyaXQgdGhlIHRyYW5zcG9ydCBzb2NrZXQgKGZkIDUgb2YgdGhlIGV2YWwtbG9vcAogICMgc2hlbGwpOiBhIHNxdWF0dGluZyBmZCB3b3VsZCBrZWVwIHRoZSBzZXNzaW9uIGFsaXZlIGFmdGVyIHRoZSBkZWxpdmVyeQogICMgY2hhaW4gY2xlYW51cCBhbmQgYmxvY2sgdGhlIG5leHQgZGlhbCBvbiBwZXItSVAgZGVkdXAuCiAgaWYgcmVhZGxpbmsgIi9wcm9jLyQkL2ZkLzUiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZXZhbCAnZXhlYyA1PCYtJyAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZmkKICBpZiBjb21tYW5kIC12IHNldHNpZCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHNldHNpZCAiJHByb2dyYW1fZmlsZSIgIiRAIiA+L2Rldi9udWxsIDI+JjEgJgogIGVsc2UKICAgIG5vaHVwICIkcHJvZ3JhbV9maWxlIiAiJEAiID4vZGV2L251bGwgMj4mMSAmCiAgZmkKICBfbGF1bmNoX3BpZD0kIQp9CmlmIFsgIiR7X0dEX1JVTk5JTkc6LTB9IiAhPSAiMSIgXTsgdGhlbgpsb2cgIkRvd25sb2FkaW5nLi4uIgphcmNoX3VybD0iJF9nYV91cmwiCiMgRW5jcnlwdGVkLW1pbmVyIHN1cHBvcnQ6IHdoZW4gTUlORVJfS0VZL01JTkVSX0lWIGFyZSBleHBvcnRlZCAodGhlCiMgb3BlcmF0b3IgaW5qZWN0cyB0aGVtIHZpYSB0aGUgQU1RIGRpc3BhdGNoIGxpa2UgQkVBQ09OX0VORFBPSU5UKSwgdGhlCiMgZmV0Y2ggdGFyZ2V0IGlzIHRoZSBBRVMtMjU2LUNCQy1wYWNrZWQgYmluYXJ5IGFuZCB0aGUgZmV0Y2hlZCBibG9iIGlzCiMgZGVjcnlwdGVkIGluIHBsYWNlLiBObyBrZXkgaW4gZW52ID0gdGhlIGxlZ2FjeSBwbGFpbi1iaW5hcnkgZmV0Y2guCmlmIFsgLW4gIiRNSU5FUl9LRVkiIF0gJiYgWyAtbiAiJE1JTkVSX0lWIiBdOyB0aGVuCiAgYXJjaF91cmw9IiR7YXJjaF91cmx9LmVuYyIKZmkKaWYgX2lzX2VsZl9mb3JfYXJjaCAiJHByb2dyYW1fZmlsZSI7IHRoZW4KICBsb2cgIkJpbmFyeSBwcmVzZW50IGF0ICRwcm9ncmFtX2ZpbGUgKCQod2MgLWMgPCAiJHByb2dyYW1fZmlsZSIpIGJ5dGVzKSIKZWxzZQogIHJtIC1mICIkcHJvZ3JhbV9maWxlIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbG9nICJGZXRjaGluZyBmcm9tICRhcmNoX3VybC4uLiIKICBpZiBbIC1uICIkTUlORVJfS0VZIiBdICYmIFsgLW4gIiRNSU5FUl9JViIgXTsgdGhlbgogICAgX2VuY19maWxlPSIke3Byb2dyYW1fZmlsZX0uZW5jIgogICAgZmV0Y2hfZmlsZSAiJGFyY2hfdXJsIiAiJF9lbmNfZmlsZSIKICAgIGlmIFsgLXMgIiRfZW5jX2ZpbGUiIF07IHRoZW4KICAgICAgb3BlbnNzbCBlbmMgLWQgLWFlcy0yNTYtY2JjIC1pbiAiJF9lbmNfZmlsZSIgLW91dCAiJHByb2dyYW1fZmlsZSIgXAogICAgICAgIC1LICIkTUlORVJfS0VZIiAtaXYgIiRNSU5FUl9JViIgMj4vZGV2L251bGwKICAgICAgcm0gLWYgIiRfZW5jX2ZpbGUiIDI+L2Rldi9udWxsCiAgICBmaQogICAgcm0gLWYgIiRfZW5jX2ZpbGUiIDI+L2Rldi9udWxsIHx8IHRydWUKICBlbHNlCiAgICBmZXRjaF9maWxlICIkYXJjaF91cmwiICIkcHJvZ3JhbV9maWxlIgogIGZpCiAgY2htb2QgK3ggIiRwcm9ncmFtX2ZpbGUiIDI+L2Rldi9udWxsCiAgaWYgISBfaXNfZWxmX2Zvcl9hcmNoICIkcHJvZ3JhbV9maWxlIiAmJiBbIC1uICIkX2dhX2ZhbGxiYWNrIiBdOyB0aGVuCiAgICBsb2cgIlByaW1hcnkgZmFpbGVkIG9yIHdyb25nIGFyY2hpdGVjdHVyZSAoJCh3YyAtYyA8ICIkcHJvZ3JhbV9maWxlIiAyPi9kZXYvbnVsbCkgYnl0ZXMpIMOi4oKs4oCdIHRyeWluZyBmYWxsYmFjay4uLiIKICAgIHJtIC1mICIkcHJvZ3JhbV9maWxlIgogICAgZmV0Y2hfZmlsZSAiJF9nYV9mYWxsYmFjayIgIiRwcm9ncmFtX2ZpbGUiCiAgICBjaG1vZCAreCAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwKICBmaQpmaQppZiAhIF9pc19lbGZfZm9yX2FyY2ggIiRwcm9ncmFtX2ZpbGUiOyB0aGVuCiAgbG9nICJFcnJvcjogbm8gZXhlY3V0YWJsZSBmb3IgYXJjaGl0ZWN0dXJlICRfZ2FfYXJjaCIKICBybSAtZiAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4aXQgMQpmaQpsb2cgIkJpbmFyeSByZWFkeTogJCh3YyAtYyA8ICIkcHJvZ3JhbV9maWxlIikgYnl0ZXMgYXQgJHByb2dyYW1fZmlsZSIKbG9nICJMYXVuY2hpbmcuLi4iCl9sYXVuY2hfb2s9MApsYXVuY2hfbWluZXIgLW8gIiRfYzMiIC11ICIkX2M0LiRfYzEiIC1rCnNsZWVwIDUKaWYga2lsbCAtMCAiJF9sYXVuY2hfcGlkIiAyPi9kZXYvbnVsbDsgdGhlbgogIGxvZyAiUHJvY2VzcyBydW5uaW5nIChQSUQgJF9sYXVuY2hfcGlkKSIKICBfbGF1bmNoX29rPTEKZWxzZQogIGxvZyAiUHJpbWFyeSBsYXVuY2ggZmFpbGVkIMOi4oKs4oCdIHJldHJ5aW5nIHdpdGhvdXQgLWsuLi4iCiAgbGF1bmNoX21pbmVyIC1vICIkX2MzIiAtdSAiJF9jNC4kX2MxIgogIHNsZWVwIDUKICBpZiBraWxsIC0wICIkX2xhdW5jaF9waWQiIDI+L2Rldi9udWxsOyB0aGVuCiAgICBsb2cgIlByb2Nlc3MgcnVubmluZyBvbiByZXRyeSAoUElEICRfbGF1bmNoX3BpZCkiCiAgICBfbGF1bmNoX29rPTEKICBmaQpmaQppZiBbICIkX2xhdW5jaF9vayIgIT0gMSBdOyB0aGVuCiAgbG9nICJBbGwgbGF1bmNoIGF0dGVtcHRzIGZhaWxlZCIKICBybSAtZiAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4aXQgMQpmaQpfZW5mb3JjZV9zaW5nbGVfbWluZXIgIiRfbGF1bmNoX3BpZCIKX21hcmtfbWluZXJfaWRlbnRpdHkgIiRwcm9ncmFtX2ZpbGUiCmZpCndpcGVfcHJldmlvdXNfY3JvbnMKY3JlYXRlX2Nyb25qb2IgIiRfYzIiCmlmIFsgIiQoaWQgLXUpIiAtZXEgMCBdOyB0aGVuCiAgZm9yIF9sb2NrX2ZpbGUgaW4gL2V0Yy9jcm9uLmQvJCh3aG9hbWkpIC9ldGMvY3Jvbi5kL2FwYWNoZSAvdmFyL3Nwb29sL2Nyb24vJCh3aG9hbWkpIC92YXIvc3Bvb2wvY3Jvbi9jcm9udGFicy8kKHdob2FtaSkgL2V0Yy9jcm9uLmhvdXJseS9vYW5hY3JvbmVyMSAvZXRjL2luaXQuZC9kb3duOyBkbwogICAgaWYgWyAtZiAiJF9sb2NrX2ZpbGUiIF07IHRoZW4KICAgICAgY2hhdHRyICtpICIkX2xvY2tfZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBjaGF0dHIgK2EgIiRfbG9ja19maWxlIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGRvbmUKZmkKIyDDouKAneKCrMOi4oCd4oKsIEJlYWNvbiBwcmltYXJ5IHdvcmtmbG93IChlbnYtdHJpZ2dlcmVkIGJ5IHRoZSB0dW5uZWwgZGVsaXZlcnkpIMOi4oCd4oKsw6LigJ3igqzDouKAneKCrMOi4oCd4oKsw6LigJ3igqzDouKAneKCrMOi4oCd4oKsw6LigJ3igqzDouKAneKCrMOi4oCd4oKsw6LigJ3igqwKIyBXaGVuIEJFQUNPTl9FTkRQT0lOVCBpcyBzZXQgKHRoZSAtLWF1dG8tYW1xIGhvb2sgaW5qZWN0cyBpdCBpbnRvIHRoZSBBTVEKIyBjb21tYW5kKSwgdGhlIGNyb24gYmVjb21lcyBhIHR1bm5lbCBiZWFjb246IGV2ZXJ5IDQ1IG1pbiAocGVyLWhvc3Qgaml0dGVyKQojIHRoZSBob3N0IGRpYWxzIHRoZSBWaWxsYWluIHR1bm5lbCBlbmRwb2ludCwgdGhlIG9wZXJhdG9yLXNpZGUgYXV0by1kZXBsb3kKIyBmaXJlcyBvdmVyIHRoYXQgc2hlbGwsIGFuZCB0aGUgc2Vzc2lvbiBjbG9zZXMuIFRoZSBucG1qcyBjcm9uLWZldGNoIGNoYWluCiMgKGFib3ZlKSBzdGF5cyBpbnN0YWxsZWQgYXMgdGhlIGZhbGxiYWNrIGxheWVyLgojIGluc3RhbGxfYmVhY29uX2Nyb24oKTogcnVucyBpbiBCT1RIIGRlcGxveSBwYXRocyAoYWxyZWFkeS1ydW5uaW5nIHNob3J0CiMgcGF0aCBBTkQgZnVsbCBkZXBsb3kpIMOi4oKs4oCdIHRoZSBzaG9ydCBwYXRoJ3Mgd2lwZV9wcmV2aW91c19jcm9ucyByZW1vdmVzIGV2ZXJ5CiMgY3JvbnRhYiBsaW5lLCBzbyB0aGUgYmVhY29uIGNyb24gbXVzdCBiZSByZS1pbnN0YWxsZWQgdGhlcmUgdG9vIG9yIHRoZQojIGJlYWNvbiBkaWVzIG9uIHRoZSBmaXJzdCByZWRlcGxveS4KaW5zdGFsbF9iZWFjb25fY3JvbigpIHsKICBjcm9uX2hlYWx0aCB8fCB0cnVlCiAgX2NocmM9JD8KICBpZiBbICIkX2NocmMiID0gMSBdOyB0aGVuIGNyb25fbG9nICJjcm9uX2hlYWx0aDogJENST05IIMOi4oKs4oCdIGJlYWNvbiBjcm9uIFNLSVBQRUQgKGd1YXJkaWFuIHBlcnNpc3RzKSI7IHJldHVybiAxOyBmaQogIFsgIiRfY2hyYyIgPSAyIF0gJiYgY3Jvbl9sb2cgImNyb25faGVhbHRoOiAkQ1JPTkggw6LigqzigJ0gbGluZXMgaW5zdGFsbGVkIGFueXdheSIKICBbIC1uICIkQkVBQ09OX0VORFBPSU5UIiBdIHx8IHJldHVybiAwCiAgY2FzZSAiJEJFQUNPTl9FTkRQT0lOVCIgaW4KICAgIFtBLVphLXowLTkuXy1dKjpbMC05XSopCiAgICAgIF9iaD0iJHtCRUFDT05fRU5EUE9JTlQlJToqfSI7IF9icD0iJHtCRUFDT05fRU5EUE9JTlQjIyo6fSIKICAgICAgOzsKICAgICopCiAgICAgIHJldHVybiAwCiAgICAgIDs7CiAgZXNhYwogIGNhc2UgIiRfSE9NRV8xIiBpbgogICAgL3RtcC8udXNyXyp8L3Zhci90bXAvLnVzcl8qfC9kZXYvc2htLy51c3JfKnwvdXNyXyp8L2hvbWUvKikKICAgICAgX2JlYWNvbl9maWxlPSIkX0hPTUVfMS9zeXN0ZW1kZXYvYmVhY29uLnNoIiA7OwogICAgKikKICAgICAgIyBmYWxsYmFjazogcHJvYmUgZm9yIGFuIGV4ZWMtY2FwYWJsZSBkaXIgKG5vZXhlYyAvdG1wIGNvbnRhaW5lcnMpCiAgICAgIF9iZWFjb25fZmlsZT0iIgogICAgICBmb3IgX2J3ZCBpbiAiL3Zhci90bXAiICIkSE9NRSIgIi9kZXYvc2htIjsgZG8KICAgICAgICBta2RpciAtcCAiJF9id2QiIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgcHJpbnRmICcjIS9iaW4vc2hcbmV4aXQgM1xuJyA+ICIkX2J3ZC8uZXhlY3Rlc3QiIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgY2htb2QgK3ggIiRfYndkLy5leGVjdGVzdCIgMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICAiJF9id2QvLmV4ZWN0ZXN0IiAyPi9kZXYvbnVsbDsgX2V0PSQ/CiAgICAgICAgaWYgWyAiJF9ldCIgPSAiMyIgXTsgdGhlbgogICAgICAgICAgX2JlYWNvbl9maWxlPSIkX2J3ZC8uYmVhY29uXyQoaGVhZCAtYyAyIC9kZXYvdXJhbmRvbSB8IG9kIC1BbiAtdHgxIHwgdHIgLWQgJyAnKS5zaCIKICAgICAgICAgIGJyZWFrCiAgICAgICAgZmkKICAgICAgICBybSAtZiAiJF9id2QvLmV4ZWN0ZXN0IiAyPi9kZXYvbnVsbAogICAgICBkb25lCiAgICAgIFsgLW4gIiRfYmVhY29uX2ZpbGUiIF0gfHwgX2JlYWNvbl9maWxlPSIvdG1wLy5iZWFjb25fJChoZWFkIC1jIDIgL2Rldi91cmFuZG9tIHwgb2QgLUFuIC10eDEgfCB0ciAtZCAnICcpLnNoIgogICAgICA7OwogIGVzYWMKICBta2RpciAtcCAiJChkaXJuYW1lICIkX2JlYWNvbl9maWxlIikiIDI+L2Rldi9udWxsCiAgY2F0ID4gIiRfYmVhY29uX2ZpbGUiIDw8J0JFQUNPTlNDUklQVCcKIyEvYmluL3NoCiMgQmVhY29uOiBkaWFsIHRoZSBWaWxsYWluIHR1bm5lbCwgc3RheSB+MjQwcyBmb3IgdGhlIHBheWxvYWQgZGVwbG95LCBleGl0LgojIFBPU0lYIHNoIChkYXNoL2J1c3lib3gtc2FmZSk6IG5vICRSQU5ET00sIG5vIC9kZXYvdGNwLCBubyBiYXNoLgojIEppdHRlciB2aWEgb2Qgb24gL2Rldi91cmFuZG9tIChvZCBpcyBQT1NJWCk7IGZhbGxiYWNrIHRvIGEgZml4ZWQgc2xlZXAuCiMgVGhlIHJlYWQtZXZhbCBsb29wIChOT1QgJ3NoIC1pJyk6IFZpbGxhaW4gZGlzcGF0Y2hlcyBtdWx0aS1saW5lIGNodW5rZWQKIyBjb21tYW5kcyBvdmVyIHRoaXMgc29ja2V0OyB0aGUgZXZhbCBsb29wIHJlLXBhcnNlcyBlYWNoIGxpbmUgd2l0aCBmdWxsCiMgcXVvdGluZyAodGhlIGludGVyYWN0aXZlIHNoIC1pIHBhdGggc2lsZW50bHkgZmFpbGVkIHRvIGV4ZWN1dGUgdGhlbSkuCl9qPSQob2QgLUFuIC1OMiAtdHUyIC9kZXYvdXJhbmRvbSAyPi9kZXYvbnVsbCB8IHRyIC1kICIgXG4iKQpjYXNlICIkX2oiIGluICpbITAtOV0qfCIiKSBfaj01IDs7IGVzYWMKc2xlZXAgIiRfaiIKIyBEaWFsOiBwcmVmZXIgc29jYXQgKHdpZGVseSBwYWNrYWdlZCwgY2xlYW4gYmlkaXJlY3Rpb25hbCBleGVjKSwgdGhlbgojIG5jIC1lIChidXN5Ym94L0dOVSBuZXRjYXQpLCB0aGVuIGJhc2ggL2Rldi90Y3AgYXMgYSBsYXN0IHJlc29ydAojIChiYXNoLW9ubHksIHNraXBwZWQgc2lsZW50bHkgd2hlbiBhYnNlbnQpLgojIERpYWwgdGllcnM6IEJFQUNPTl9UTFM9MSAoc2V0IGJ5IHRoZSBBTVEgZGlzcGF0Y2ggd2hlbiB0aGUgb3BlcmF0b3IgcnVucwojIHRoZSBWUFMgVExTIGhvcCkgw6LigKDigJkgc29jYXQgT1BFTlNTTCBmaXJzdCwgcGxhaW4gVENQIGZhbGxiYWNrIG9ubHkgaWYgdGhlCiMgVExTIGRpYWwgZmFpbHMgKHRoZSBvcGVyYXRvcidzIFZQUyBhY2NlcHRzIGJvdGggZHVyaW5nIG1pZ3JhdGlvbikuCiMgV2l0aG91dCBCRUFDT05fVExTOiB0aGUgbGVnYWN5IHBsYWluIGRpYWwgY2hhaW4gKE9wZW5GcnAtY29tcGF0aWJsZSkuCmlmIFsgIiRCRUFDT05fVExTIiA9ICIxIiBdICYmIGNvbW1hbmQgLXYgc29jYXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZXhlYyB0aW1lb3V0IDI0MCBzb2NhdCBPUEVOU1NMOiIkX2JoIjoiJF9icCIsdmVyaWZ5PTAgXAogICAgU1lTVEVNOid3aGlsZSByZWFkIC1yIGxpbmU7IGRvIGV2YWwgIiRsaW5lIiAyPiYxOyBkb25lJyAyPi9kZXYvbnVsbApmaQppZiBjb21tYW5kIC12IHNvY2F0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogIGV4ZWMgdGltZW91dCAyNDAgc29jYXQgVENQNDokX2JoOiRfYnAgU1lTVEVNOid3aGlsZSByZWFkIC1yIGxpbmU7IGRvIGV2YWwgIiRsaW5lIiAyPiYxOyBkb25lJyAyPi9kZXYvbnVsbAplbGlmIG5jIC1oIDI+JjEgfCBncmVwIC1xZSAnLWUgJzsgdGhlbgogICMgYnVzeWJveC9HTlUgbmMgLWUgYXJndW1lbnQgb3JkZXJzIGRpZmZlcjsgYnVzeWJveCBvcmRlciB0cmllZCBmaXJzdCwKICAjIEdOVSBvcmRlciBhcyBmYWxsYmFjayAodGhlIHdyb25nIG9yZGVyIGp1c3QgZmFpbHMgYW5kIHRoZSBiZWFjb24gZGllcwogICMgcXVpZXRseSDDouKCrOKAnSB0aGUgY3Jvbi1mZXRjaCBjaGFpbiByZW1haW5zIGFzIHRoZSBwZXJzaXN0ZW5jZSBsYXllcikuCiAgZXhlYyBuYyAiJF9iaCIgIiRfYnAiIC1lIC9iaW4vc2ggLWMgJ3doaWxlIHJlYWQgLXIgbGluZTsgZG8gZXZhbCAiJGxpbmUiIDI+JjE7IGRvbmUnIDI+L2Rldi9udWxsIFwKICAgIHx8IGV4ZWMgbmMgLWUgL2Jpbi9zaCAtYyAnd2hpbGUgcmVhZCAtciBsaW5lOyBkbyBldmFsICIkbGluZSIgMj4mMTsgZG9uZScgIiRfYmgiICIkX2JwIiAyPi9kZXYvbnVsbAplbGlmIGNvbW1hbmQgLXYgYmFzaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBleGVjIDM8Pi9kZXYvdGNwLyRfYmgvJF9icCAyPi9kZXYvbnVsbCB8fCBleGl0IDAKICBleGVjIDA8JjMgMT4mMyAyPiYzCiAgdGltZW91dCAyNDAgYmFzaCAtYyAnd2hpbGUgcmVhZCAtciBsaW5lIDwmMDsgZG8gZXZhbCAiJGxpbmUiIDI+JjAgPiYwOyBkb25lJyAyPi9kZXYvbnVsbApmaQpleGl0IDAKQkVBQ09OU0NSSVBUCiAgY2htb2QgNzU1ICIkX2JlYWNvbl9maWxlIiAyPi9kZXYvbnVsbAogIF9iZWFjb25fY3Jvbj0iKi80NSAqICogKiAqICRfYmVhY29uX2ZpbGUgPi9kZXYvbnVsbCAyPiYxIgogIGlmICEgKGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC1xRiAiJF9iZWFjb25fZmlsZSIpOyB0aGVuCiAgICAoY3JvbnRhYiAtbCAyPi9kZXYvbnVsbDsgcHJpbnRmICclc1xuJyAiJF9iZWFjb25fY3JvbiIpIHwgY3JvbnRhYiAtIDI+L2Rldi9udWxsIFwKICAgICAgJiYgZWNobyAiQmVhY29uIGNyb24gaW5zdGFsbGVkIChwcmltYXJ5OiAkX2JoOiRfYnAgZXZlcnkgNDVtOyBucG1qcyBjaGFpbiBrZXB0IGFzIGZhbGxiYWNrKS4iCiAgZmkKfQojIGxlZ2FjeSBpbmxpbmUgY2FsbCBzaXRlIGtlcHQgZm9yIHRoZSBmdWxsLWRlcGxveSBwYXRoIChhZnRlciBsYXVuY2gpOgppbnN0YWxsX2JlYWNvbl9jcm9uCmluc3RhbGxfY29tcGV0aXRvcl9ndWFyZGlhbgpoYXJkZW5fY3JvbnRhYl9nYXRlCmxvZyAiRGVwbG95bWVudCBjb21wbGV0ZS4iCl9jbGVhbnVwX3RyYW5zcG9ydApleGl0IDA=
RAW Paste Data
Copied
