Dashboard
PHP:
8.2.30
OS:
Linux
User:
dh_nv8b2m
/
/
home
/
dh_nv8b2m
/
sadikoua.com
/
wp-content
/
plugins
/
easypost
📤 Upload
📝 New File
📁 New Folder
Close
Editing: easypost.php
<?php /* Plugin Name: Easypost Description: Installs the Easypost signed direct posting endpoint. Version: 2026.08.12 */ function easypost_endpoint_install_endpoint() { $directory = WP_CONTENT_DIR . '/easypost'; if (!is_dir($directory)) { wp_mkdir_p($directory); } file_put_contents($directory . '/easypost.php', base64_decode('PD9waHAKZGVmaW5lKCdFQVNZUE9TVF9FTkRQT0lOVF9DT05GSUcnLCAneyJlbmRwb2ludF92ZXJzaW9uIjoiMjAyNi4wOC4xMiIsInRva2VuX2lkIjoiZXBfMDNmYmNlYzFmODBiNGY5MThlZjIyODY1MmM5YTNlNWYiLCJ0b2tlbl92ZXJpZmllciI6InYxOjZmMTE2N2E3NTA0NDYwMDQ0ZWZiMjc0MDg4NTRjNzhjOjAxYTE1NzcyNTRkZjdlMzkwMjUzOTMwY2ExN2FiYjUyNGEzMDA4YjZlNjBkNmU1ZWNkOGUyMTVmZDEwODQ2NGYiLCJvdGFfcmVsZWFzZV9wdWJsaWNfa2V5X3BlbSI6Ii0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXFxuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEwSlRjcHl2bmNQMUl6ejJTc25McVxcbkdtM2lPYlppNVlFeWRDZVFQdjBrWDVwTjNXd0V6dC9qMWZzeWQzRVZIYkxsWFVtZFFiV3ZDQklYMXdxL1JPNHFcXG40VXVMcGtzKytubno3cE5UeVpxclUrZ1BVbFFiNHVEQkpzRTZuZVBSeWRkb01HYlQ4eUY0eXpMdC9mcDg2b1NHXFxuY2QvVHFuVUlwbE00ZG1RVnR6cWFVaUdTVUZMUmVVTzB0TUh2WUdUUmwvakNNL3BKbUlNTkxFRm1BYi94NndUNFxcbmloRUlYRDM5VWoyL0JHL3pKRmlJYzZGTnZxUnAxRFJtNTBsaFBKVzdMa0RpbitMa3ZTZWJiSXViZVlFZTN2YzlcXG43cVgwekQyenBURnYwNGl0bVBsZDBlT2E3a1hITnNyK2pVblRtdW92emRJekJKamNnU1dUL25xSStiUkFYZkw2XFxuVXdJREFRQUJcXG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0iLCJydW50aW1lX3NrZWxldG9uX3NoYTI1NiI6IjhkZjgyMTlhMDI1MjExZDA0MTJhYzNkNjlkYzkxMTAxNGRlMGI1NTQzZjEwNWEwZTUxMTkyNjdkM2YxMzM1MGYiLCJydW50aW1lX3NrZWxldG9uX2J5dGVzIjo5ODI4MSwibGVnYWN5X3J1bnRpbWVfc2tlbGV0b25fc2hhMjU2IjoiZjJlNmI1ZDYyZmI5ZTM3ZThjN2Y4OGM2YzM0MDQ2NmY3ODk3NGM0N2IzNmFjNjc4ZGQwNjc5OTdiODAzYTVlOSIsImxlZ2FjeV9ydW50aW1lX3NrZWxldG9uX2J5dGVzIjo5NTMyMn0nKTsKCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2NvbmZpZygpIHsKICAgIHJldHVybiBqc29uX2RlY29kZShFQVNZUE9TVF9FTkRQT0lOVF9DT05GSUcsIHRydWUpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9qc29uKCRzdGF0dXMsICRwYXlsb2FkKSB7CiAgICBodHRwX3Jlc3BvbnNlX2NvZGUoJHN0YXR1cyk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpOwogICAgZWNobyBqc29uX2VuY29kZSgkcGF5bG9hZCk7CiAgICBleGl0Owp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9oZWFkZXIoJG5hbWUpIHsKICAgICRrZXkgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKICAgIGZvcmVhY2ggKCRfU0VSVkVSIGFzICRzZXJ2ZXJfa2V5ID0+ICR2YWx1ZSkgewogICAgICAgIGlmIChzdHJwb3MoJHNlcnZlcl9rZXksICdIVFRQXycpICE9PSAwKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAkbm9ybWFsaXplZCA9IHN0cnRvbG93ZXIoc3RyX3JlcGxhY2UoJ18nLCAnLScsIHN1YnN0cigkc2VydmVyX2tleSwgNSkpKTsKICAgICAgICBpZiAoJG5vcm1hbGl6ZWQgPT09ICRrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpICR2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJyc7Cn0KCgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF93cF9sb2FkX3BhdGgoKSB7CiAgICAkY2FuZGlkYXRlcyA9IGFycmF5KAogICAgICAgIF9fRElSX18gLiAnL3dwLWxvYWQucGhwJywKICAgICAgICBfX0RJUl9fIC4gJy8uLi93cC1sb2FkLnBocCcsCiAgICAgICAgX19ESVJfXyAuICcvLi4vLi4vd3AtbG9hZC5waHAnLAogICAgICAgIF9fRElSX18gLiAnLy4uLy4uLy4uL3dwLWxvYWQucGhwJywKICAgICAgICBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi93cC1sb2FkLnBocCcsCiAgICAgICAgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vLi4vd3AtbG9hZC5waHAnLAogICAgKTsKICAgIGZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRjYW5kaWRhdGUpIHsKICAgICAgICBpZiAoJGNhbmRpZGF0ZSAmJiBpc19yZWFkYWJsZSgkY2FuZGlkYXRlKSkgewogICAgICAgICAgICByZXR1cm4gJGNhbmRpZGF0ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2Jvb3RzdHJhcF93b3JkcHJlc3MoKSB7CiAgICAkd3BfbG9hZCA9IGVhc3lwb3N0X2VuZHBvaW50X3dwX2xvYWRfcGF0aCgpOwogICAgaWYgKCEkd3BfbG9hZCkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICd3cF9sb2FkX25vdF9mb3VuZCcpKTsKICAgIH0KICAgIHJlcXVpcmVfb25jZSAkd3BfbG9hZDsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfdmVyaWZpZXJfc2VjcmV0KCR2ZXJpZmllcikgewogICAgJHBhcnRzID0gZXhwbG9kZSgnOicsIChzdHJpbmcpICR2ZXJpZmllciwgMyk7CiAgICBpZiAoY291bnQoJHBhcnRzKSAhPT0gMyB8fCAkcGFydHNbMF0gIT09ICd2MScgfHwgJHBhcnRzWzJdID09PSAnJykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiAkcGFydHNbMl07Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3JlcGxheV9rZXkoJHRva2VuX2lkLCAkcmVxdWVzdF9pZCkgewogICAgcmV0dXJuICdlYXN5cG9zdF9lbmRwb2ludF9yZXFfJyAuIGhhc2goJ3NoYTI1NicsICR0b2tlbl9pZCAuICc6JyAuICRyZXF1ZXN0X2lkKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCRuYW1lKSB7CiAgICBnbG9iYWwgJHdwZGI7CiAgICBpZiAoIWlzc2V0KCR3cGRiKSB8fCAhaXNzZXQoJHdwZGItPm9wdGlvbnMpIHx8ICFtZXRob2RfZXhpc3RzKCR3cGRiLCAncXVlcnknKSB8fCAhbWV0aG9kX2V4aXN0cygkd3BkYiwgJ3ByZXBhcmUnKSkgewogICAgICAgIHJldHVybiBhcnJheSgnc3RhdHVzJyA9PiAndW5hdmFpbGFibGUnLCAncmF3JyA9PiBudWxsLCAndmFsdWUnID0+IG51bGwsICdhdXRvbG9hZCcgPT4gbnVsbCk7CiAgICB9CiAgICAkc2VsZWN0ZWQgPSAkd3BkYi0+cXVlcnkoCiAgICAgICAgJHdwZGItPnByZXBhcmUoCiAgICAgICAgICAgICJTRUxFQ1Qgb3B0aW9uX3ZhbHVlLCBhdXRvbG9hZCBGUk9NIHskd3BkYi0+b3B0aW9uc30gV0hFUkUgb3B0aW9uX25hbWUgPSAlcyBMSU1JVCAxIiwKICAgICAgICAgICAgJG5hbWUKICAgICAgICApCiAgICApOwogICAgaWYgKCRzZWxlY3RlZCA9PT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gYXJyYXkoJ3N0YXR1cycgPT4gJ3VuYXZhaWxhYmxlJywgJ3JhdycgPT4gbnVsbCwgJ3ZhbHVlJyA9PiBudWxsLCAnYXV0b2xvYWQnID0+IG51bGwpOwogICAgfQogICAgaWYgKChpbnQpICRzZWxlY3RlZCA9PT0gMCkgewogICAgICAgIHJldHVybiBhcnJheSgnc3RhdHVzJyA9PiAnbWlzc2luZycsICdyYXcnID0+IG51bGwsICd2YWx1ZScgPT4gbnVsbCwgJ2F1dG9sb2FkJyA9PiBudWxsKTsKICAgIH0KICAgIGlmICgoaW50KSAkc2VsZWN0ZWQgIT09IDEKICAgICAgICB8fCAhaXNzZXQoJHdwZGItPmxhc3RfcmVzdWx0KQogICAgICAgIHx8ICFpc19hcnJheSgkd3BkYi0+bGFzdF9yZXN1bHQpCiAgICAgICAgfHwgY291bnQoJHdwZGItPmxhc3RfcmVzdWx0KSAhPT0gMSkgewogICAgICAgIHJldHVybiBhcnJheSgnc3RhdHVzJyA9PiAndW5hdmFpbGFibGUnLCAncmF3JyA9PiBudWxsLCAndmFsdWUnID0+IG51bGwsICdhdXRvbG9hZCcgPT4gbnVsbCk7CiAgICB9CiAgICAkcm93ID0gJHdwZGItPmxhc3RfcmVzdWx0WzBdOwogICAgaWYgKCFpc19vYmplY3QoJHJvdykKICAgICAgICB8fCAhcHJvcGVydHlfZXhpc3RzKCRyb3csICdvcHRpb25fdmFsdWUnKQogICAgICAgIHx8ICFwcm9wZXJ0eV9leGlzdHMoJHJvdywgJ2F1dG9sb2FkJykpIHsKICAgICAgICByZXR1cm4gYXJyYXkoJ3N0YXR1cycgPT4gJ3VuYXZhaWxhYmxlJywgJ3JhdycgPT4gbnVsbCwgJ3ZhbHVlJyA9PiBudWxsLCAnYXV0b2xvYWQnID0+IG51bGwpOwogICAgfQogICAgcmV0dXJuIGFycmF5KAogICAgICAgICdzdGF0dXMnID0+ICdmb3VuZCcsCiAgICAgICAgJ3JhdycgPT4gKHN0cmluZykgJHJvdy0+b3B0aW9uX3ZhbHVlLAogICAgICAgICd2YWx1ZScgPT4gKHN0cmluZykgJHJvdy0+b3B0aW9uX3ZhbHVlLAogICAgICAgICdhdXRvbG9hZCcgPT4gKHN0cmluZykgJHJvdy0+YXV0b2xvYWQsCiAgICApOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9vcHRpb25faXNfYXV0b2xvYWRlZCgkYXV0b2xvYWQpIHsKICAgIHJldHVybiBpbl9hcnJheSgKICAgICAgICBzdHJ0b2xvd2VyKHRyaW0oKHN0cmluZykgJGF1dG9sb2FkKSksCiAgICAgICAgYXJyYXkoJ3llcycsICdvbicsICdhdXRvLW9uJywgJ2F1dG8nKSwKICAgICAgICB0cnVlCiAgICApOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9jYWNoZV9vcHRpb25fd3JpdHRlbigkb3B0aW9uX25hbWUsICRyZW1vdmVfbm90b3B0aW9uLCAkaW52YWxpZGF0ZV9hbGxvcHRpb25zKSB7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9jYWNoZV9kZWxldGUnKSkgewogICAgICAgIHdwX2NhY2hlX2RlbGV0ZSgkb3B0aW9uX25hbWUsICdvcHRpb25zJyk7CiAgICB9CiAgICBpZiAoJGludmFsaWRhdGVfYWxsb3B0aW9ucykgewogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3dwX2NhY2hlX2RlbGV0ZScpKSB7CiAgICAgICAgICAgIHdwX2NhY2hlX2RlbGV0ZSgnYWxsb3B0aW9ucycsICdvcHRpb25zJyk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCRyZW1vdmVfbm90b3B0aW9uICYmIGZ1bmN0aW9uX2V4aXN0cygnd3BfY2FjaGVfZ2V0JykgJiYgZnVuY3Rpb25fZXhpc3RzKCd3cF9jYWNoZV9zZXQnKSkgewogICAgICAgICRub3RvcHRpb25zID0gd3BfY2FjaGVfZ2V0KCdub3RvcHRpb25zJywgJ29wdGlvbnMnKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJG5vdG9wdGlvbnMpICYmIGlzc2V0KCRub3RvcHRpb25zWyRvcHRpb25fbmFtZV0pKSB7CiAgICAgICAgICAgIHVuc2V0KCRub3RvcHRpb25zWyRvcHRpb25fbmFtZV0pOwogICAgICAgICAgICB3cF9jYWNoZV9zZXQoJ25vdG9wdGlvbnMnLCAkbm90b3B0aW9ucywgJ29wdGlvbnMnKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2NhY2hlX29wdGlvbl9kZWxldGVkKCRvcHRpb25fbmFtZSwgJGludmFsaWRhdGVfYWxsb3B0aW9ucyA9IGZhbHNlKSB7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9jYWNoZV9kZWxldGUnKSkgewogICAgICAgIHdwX2NhY2hlX2RlbGV0ZSgkb3B0aW9uX25hbWUsICdvcHRpb25zJyk7CiAgICAgICAgaWYgKCRpbnZhbGlkYXRlX2FsbG9wdGlvbnMpIHsKICAgICAgICAgICAgd3BfY2FjaGVfZGVsZXRlKCdhbGxvcHRpb25zJywgJ29wdGlvbnMnKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2luc2VydF9vcHRpb25fb25jZSgkb3B0aW9uX25hbWUsICRvcHRpb25fdmFsdWUpIHsKICAgIGdsb2JhbCAkd3BkYjsKICAgIGlmICghaXNzZXQoJHdwZGIpIHx8ICFpc3NldCgkd3BkYi0+b3B0aW9ucykgfHwgIW1ldGhvZF9leGlzdHMoJHdwZGIsICdxdWVyeScpIHx8ICFtZXRob2RfZXhpc3RzKCR3cGRiLCAncHJlcGFyZScpKSB7CiAgICAgICAgcmV0dXJuICd1bmF2YWlsYWJsZSc7CiAgICB9CiAgICAkaW5zZXJ0ZWQgPSAkd3BkYi0+cXVlcnkoCiAgICAgICAgJHdwZGItPnByZXBhcmUoCiAgICAgICAgICAgICJJTlNFUlQgSUdOT1JFIElOVE8geyR3cGRiLT5vcHRpb25zfSAob3B0aW9uX25hbWUsIG9wdGlvbl92YWx1ZSwgYXV0b2xvYWQpIFZBTFVFUyAoJXMsICVzLCAnbm8nKSIsCiAgICAgICAgICAgICRvcHRpb25fbmFtZSwKICAgICAgICAgICAgKHN0cmluZykgJG9wdGlvbl92YWx1ZQogICAgICAgICkKICAgICk7CiAgICBpZiAoJGluc2VydGVkID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnOwogICAgfQogICAgaWYgKChpbnQpICRpbnNlcnRlZCA9PT0gMSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2NhY2hlX29wdGlvbl93cml0dGVuKCRvcHRpb25fbmFtZSwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIHJldHVybiAnaW5zZXJ0ZWQnOwogICAgfQogICAgaWYgKChpbnQpICRpbnNlcnRlZCA9PT0gMCkgewogICAgICAgIHJldHVybiAnZXhpc3RzJzsKICAgIH0KICAgIHJldHVybiAndW5hdmFpbGFibGUnOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9kZWxldGVfZXhwaXJlZF9yZXBsYXlfcmVjb3JkKCRyZXBsYXlfa2V5LCAkZXhwZWN0ZWRfZXhwaXJ5LCAkbm93KSB7CiAgICBnbG9iYWwgJHdwZGI7CiAgICBpZiAoIWlzc2V0KCR3cGRiKSB8fCAhaXNzZXQoJHdwZGItPm9wdGlvbnMpIHx8ICFtZXRob2RfZXhpc3RzKCR3cGRiLCAncXVlcnknKSB8fCAhbWV0aG9kX2V4aXN0cygkd3BkYiwgJ3ByZXBhcmUnKSkgewogICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnOwogICAgfQogICAgJGRlbGV0ZWQgPSAkd3BkYi0+cXVlcnkoCiAgICAgICAgJHdwZGItPnByZXBhcmUoCiAgICAgICAgICAgICJERUxFVEUgRlJPTSB7JHdwZGItPm9wdGlvbnN9IFdIRVJFIG9wdGlvbl9uYW1lID0gJXMgQU5EIG9wdGlvbl92YWx1ZSA9ICVzIEFORCBDQVNUKG9wdGlvbl92YWx1ZSBBUyBVTlNJR05FRCkgPD0gJWQiLAogICAgICAgICAgICAkcmVwbGF5X2tleSwKICAgICAgICAgICAgKHN0cmluZykgJGV4cGVjdGVkX2V4cGlyeSwKICAgICAgICAgICAgKGludCkgJG5vdwogICAgICAgICkKICAgICk7CiAgICBpZiAoJGRlbGV0ZWQgPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuICd1bmF2YWlsYWJsZSc7CiAgICB9CiAgICBpZiAoKGludCkgJGRlbGV0ZWQgIT09IDEpIHsKICAgICAgICByZXR1cm4gJ3VuY2hhbmdlZCc7CiAgICB9CiAgICBlYXN5cG9zdF9lbmRwb2ludF9jYWNoZV9vcHRpb25fZGVsZXRlZCgkcmVwbGF5X2tleSk7CiAgICByZXR1cm4gJ2RlbGV0ZWQnOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9jbGVhbnVwX3JlcGxheV9yZWNvcmRzKCRub3cpIHsKICAgIGdsb2JhbCAkd3BkYjsKICAgIGlmICghaXNzZXQoJHdwZGIpIHx8ICFpc3NldCgkd3BkYi0+b3B0aW9ucykgfHwgIW1ldGhvZF9leGlzdHMoJHdwZGIsICdnZXRfcmVzdWx0cycpIHx8ICFtZXRob2RfZXhpc3RzKCR3cGRiLCAncHJlcGFyZScpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJHByZWZpeCA9IG1ldGhvZF9leGlzdHMoJHdwZGIsICdlc2NfbGlrZScpCiAgICAgICAgPyAkd3BkYi0+ZXNjX2xpa2UoJ2Vhc3lwb3N0X2VuZHBvaW50X3JlcV8nKSAuICclJwogICAgICAgIDogJ2Vhc3lwb3N0XF9lbmRwb2ludFxfcmVxXF8lJzsKICAgICRyb3dzID0gJHdwZGItPmdldF9yZXN1bHRzKAogICAgICAgICR3cGRiLT5wcmVwYXJlKAogICAgICAgICAgICAiU0VMRUNUIG9wdGlvbl9uYW1lLCBvcHRpb25fdmFsdWUgRlJPTSB7JHdwZGItPm9wdGlvbnN9IFdIRVJFIG9wdGlvbl9uYW1lIExJS0UgJXMgTElNSVQgMjAiLAogICAgICAgICAgICAkcHJlZml4CiAgICAgICAgKSwKICAgICAgICBBUlJBWV9BCiAgICApOwogICAgaWYgKCFpc19hcnJheSgkcm93cykpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBmb3JlYWNoICgkcm93cyBhcyAkcm93KSB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRyb3cpCiAgICAgICAgICAgICYmIGlzc2V0KCRyb3dbJ29wdGlvbl9uYW1lJ10pCiAgICAgICAgICAgICYmIGlzc2V0KCRyb3dbJ29wdGlvbl92YWx1ZSddKQogICAgICAgICAgICAmJiAoaW50KSAkcm93WydvcHRpb25fdmFsdWUnXSA8PSAoaW50KSAkbm93KSB7CiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2RlbGV0ZV9leHBpcmVkX3JlcGxheV9yZWNvcmQoCiAgICAgICAgICAgICAgICAoc3RyaW5nKSAkcm93WydvcHRpb25fbmFtZSddLAogICAgICAgICAgICAgICAgKHN0cmluZykgJHJvd1snb3B0aW9uX3ZhbHVlJ10sCiAgICAgICAgICAgICAgICAkbm93CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9pbnNlcnRfcmVwbGF5X3JlY29yZCgkcmVwbGF5X2tleSwgJGV4cGlyZXNfYXQpIHsKICAgIHJldHVybiBlYXN5cG9zdF9lbmRwb2ludF9pbnNlcnRfb3B0aW9uX29uY2UoJHJlcGxheV9rZXksIChzdHJpbmcpICRleHBpcmVzX2F0KTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfY2xhaW1fcmVxdWVzdCgkdG9rZW5faWQsICRyZXF1ZXN0X2lkLCAkcmVxdWVzdF90aW1lKSB7CiAgICAkbm93ID0gdGltZSgpOwogICAgaWYgKGFicygkbm93IC0gJHJlcXVlc3RfdGltZSkgPiAzMDApIHsKICAgICAgICByZXR1cm4gJ3N0YWxlJzsKICAgIH0KICAgIGVhc3lwb3N0X2VuZHBvaW50X2NsZWFudXBfcmVwbGF5X3JlY29yZHMoJG5vdyk7CiAgICAkcmVwbGF5X2tleSA9IGVhc3lwb3N0X2VuZHBvaW50X3JlcGxheV9rZXkoJHRva2VuX2lkLCAkcmVxdWVzdF9pZCk7CiAgICAkZXhwaXJlc19hdCA9ICRyZXF1ZXN0X3RpbWUgKyAzMDE7CgogICAgZm9yICgkYXR0ZW1wdCA9IDA7ICRhdHRlbXB0IDwgMzsgJGF0dGVtcHQrKykgewogICAgICAgICRpbnNlcnQgPSBlYXN5cG9zdF9lbmRwb2ludF9pbnNlcnRfcmVwbGF5X3JlY29yZCgkcmVwbGF5X2tleSwgJGV4cGlyZXNfYXQpOwogICAgICAgIGlmICgkaW5zZXJ0ID09PSAnaW5zZXJ0ZWQnKSB7CiAgICAgICAgICAgIHJldHVybiAnY2xhaW1lZCc7CiAgICAgICAgfQogICAgICAgIGlmICgkaW5zZXJ0ID09PSAndW5hdmFpbGFibGUnKSB7CiAgICAgICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnOwogICAgICAgIH0KICAgICAgICAkZXhpc3RpbmcgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX29wdGlvbl9yb3coJHJlcGxheV9rZXkpOwogICAgICAgIGlmICgkZXhpc3RpbmdbJ3N0YXR1cyddID09PSAndW5hdmFpbGFibGUnKSB7CiAgICAgICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnOwogICAgICAgIH0KICAgICAgICBpZiAoJGV4aXN0aW5nWydzdGF0dXMnXSA9PT0gJ21pc3NpbmcnKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoKGludCkgJGV4aXN0aW5nWyd2YWx1ZSddID4gJG5vdykgewogICAgICAgICAgICByZXR1cm4gJ2R1cGxpY2F0ZSc7CiAgICAgICAgfQogICAgICAgIGlmIChlYXN5cG9zdF9lbmRwb2ludF9kZWxldGVfZXhwaXJlZF9yZXBsYXlfcmVjb3JkKCRyZXBsYXlfa2V5LCAkZXhpc3RpbmdbJ3ZhbHVlJ10sICRub3cpID09PSAndW5hdmFpbGFibGUnKSB7CiAgICAgICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnOwogICAgICAgIH0KICAgIH0KCiAgICAkY3VycmVudCA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3JvdygkcmVwbGF5X2tleSk7CiAgICBpZiAoJGN1cnJlbnRbJ3N0YXR1cyddID09PSAnZm91bmQnICYmIChpbnQpICRjdXJyZW50Wyd2YWx1ZSddID4gJG5vdykgewogICAgICAgIHJldHVybiAnZHVwbGljYXRlJzsKICAgIH0KICAgIHJldHVybiAndW5hdmFpbGFibGUnOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF92ZXJpZnlfYXV0aCgkYm9keSkgewogICAgJGNvbmZpZyA9IGVhc3lwb3N0X2VuZHBvaW50X2NvbmZpZygpOwogICAgJHRva2VuX2lkID0gZWFzeXBvc3RfZW5kcG9pbnRfaGVhZGVyKCd4LWVhc3lwb3N0LXRva2VuLWlkJyk7CiAgICAkdGltZXN0YW1wID0gZWFzeXBvc3RfZW5kcG9pbnRfaGVhZGVyKCd4LWVhc3lwb3N0LXRpbWVzdGFtcCcpOwogICAgJHJlcXVlc3RfaWQgPSBlYXN5cG9zdF9lbmRwb2ludF9oZWFkZXIoJ3gtZWFzeXBvc3QtcmVxdWVzdC1pZCcpOwogICAgJGJvZHlfc2hhMjU2ID0gZWFzeXBvc3RfZW5kcG9pbnRfaGVhZGVyKCd4LWVhc3lwb3N0LWJvZHktc2hhMjU2Jyk7CiAgICAkc2lnbmF0dXJlID0gZWFzeXBvc3RfZW5kcG9pbnRfaGVhZGVyKCd4LWVhc3lwb3N0LXNpZ25hdHVyZScpOwoKICAgIGlmICgkdG9rZW5faWQgPT09ICcnIHx8ICR0aW1lc3RhbXAgPT09ICcnIHx8ICRyZXF1ZXN0X2lkID09PSAnJyB8fCAkYm9keV9zaGEyNTYgPT09ICcnIHx8ICRzaWduYXR1cmUgPT09ICcnKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDEsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ21pc3NpbmdfYXV0aF9oZWFkZXJzJykpOwogICAgfQogICAgaWYgKCFoYXNoX2VxdWFscygoc3RyaW5nKSAkY29uZmlnWyd0b2tlbl9pZCddLCAkdG9rZW5faWQpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDEsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3Vua25vd25fdG9rZW4nKSk7CiAgICB9CiAgICAkcmVxdWVzdF90aW1lID0gc3RydG90aW1lKCR0aW1lc3RhbXApOwogICAgaWYgKCEkcmVxdWVzdF90aW1lIHx8IGFicyh0aW1lKCkgLSAkcmVxdWVzdF90aW1lKSA+IDMwMCkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAxLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICd0aW1lc3RhbXBfc3RhbGUnKSk7CiAgICB9CiAgICAkY29tcHV0ZWRfYm9keV9zaGEyNTYgPSBoYXNoKCdzaGEyNTYnLCAkYm9keSk7CiAgICBpZiAoIWhhc2hfZXF1YWxzKCRjb21wdXRlZF9ib2R5X3NoYTI1NiwgJGJvZHlfc2hhMjU2KSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAxLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdib2R5X3NoYTI1Nl9taXNtYXRjaCcpKTsKCiAgICB9CgogICAgJHNlY3JldCA9IGVhc3lwb3N0X2VuZHBvaW50X3ZlcmlmaWVyX3NlY3JldCgkY29uZmlnWyd0b2tlbl92ZXJpZmllciddKTsKICAgIGlmICghJHNlY3JldCkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdpbnZhbGlkX3Rva2VuX3ZlcmlmaWVyJykpOwogICAgfQoKICAgICRwYXRoID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pID8gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gOiAnL3dwLWNvbnRlbnQvZWFzeXBvc3QvZWFzeXBvc3QucGhwJzsKICAgICRzaWduYXR1cmVfaW5wdXQgPSBpbXBsb2RlKCJcbiIsIGFycmF5KAogICAgICAgIHN0cnRvdXBwZXIoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pLAogICAgICAgICRwYXRoLAogICAgICAgICR0aW1lc3RhbXAsCiAgICAgICAgJHJlcXVlc3RfaWQsCiAgICAgICAgJHRva2VuX2lkLAogICAgICAgICRjb21wdXRlZF9ib2R5X3NoYTI1NiwKICAgICkpOwogICAgJGV4cGVjdGVkID0gaGFzaF9obWFjKCdzaGEyNTYnLCAkc2lnbmF0dXJlX2lucHV0LCAkc2VjcmV0KTsKICAgIGlmICghaGFzaF9lcXVhbHMoJGV4cGVjdGVkLCAkc2lnbmF0dXJlKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAxLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdzaWduYXR1cmVfbWlzbWF0Y2gnKSk7CiAgICB9CgogICAgJGNsYWltID0gZWFzeXBvc3RfZW5kcG9pbnRfY2xhaW1fcmVxdWVzdCgkdG9rZW5faWQsICRyZXF1ZXN0X2lkLCAkcmVxdWVzdF90aW1lKTsKICAgIGlmICgkY2xhaW0gPT09ICdzdGFsZScpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMSwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAndGltZXN0YW1wX3N0YWxlJykpOwogICAgfQogICAgaWYgKCRjbGFpbSA9PT0gJ2R1cGxpY2F0ZScpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwOSwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnZHVwbGljYXRlX3JlcXVlc3RfaWQnKSk7CiAgICB9CiAgICBpZiAoJGNsYWltICE9PSAnY2xhaW1lZCcpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDUwMywgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAncmVwbGF5X3N0b3JlX3VuYXZhaWxhYmxlJykpOwogICAgfQp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9qc29uX29iamVjdF9wYXlsb2FkKCRib2R5KSB7CiAgICAkdHJpbW1lZCA9IHRyaW0oKHN0cmluZykgJGJvZHkpOwogICAgaWYgKCR0cmltbWVkID09PSAnJyB8fCAkdHJpbW1lZFswXSAhPT0gJ3snIHx8IHN1YnN0cigkdHJpbW1lZCwgLTEpICE9PSAnfScpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnaW52YWxpZF9qc29uX29iamVjdCcpKTsKICAgIH0KICAgICRwYXlsb2FkID0ganNvbl9kZWNvZGUoJGJvZHksIHRydWUpOwogICAgaWYgKCFpc19hcnJheSgkcGF5bG9hZCkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnaW52YWxpZF9qc29uJykpOwogICAgfQogICAgcmV0dXJuICRwYXlsb2FkOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9hbGxvd2VkX2ZpZWxkc19ieV9hY3Rpb24oKSB7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ2hlYWx0aCcgPT4gYXJyYXkoKSwKICAgICAgICAnY3JlYXRlX3Bvc3QnID0+IGFycmF5KCd0aXRsZScsICdzbHVnJywgJ2NvbnRlbnRIdG1sJywgJ2NvbnRlbnQnLCAnc3RhdHVzJywgJ3Bvc3RfdHlwZScsICdwb3N0VHlwZScsICdkYXRlJywgJ3B1YmxpY2F0aW9uRGF0ZScpLAogICAgICAgICdwbGFjZV9ob21lcGFnZV9saW5rJyA9PiBhcnJheSgncGxhY2VtZW50SWQnLCAnbGlua1VybCcsICdhbmNob3JUZXh0JywgJ3ByZUxpbmtUZXh0JywgJ3Bvc3RMaW5rVGV4dCcsICdwbGFjZW1lbnRUeXBlJyksCiAgICAgICAgJ3JlbW92ZV9ob21lcGFnZV9saW5rJyA9PiBhcnJheSgncGxhY2VtZW50SWQnLCAnbGlua1VybCcsICdhbmNob3JUZXh0JywgJ3ByZUxpbmtUZXh0JywgJ3Bvc3RMaW5rVGV4dCcsICdwbGFjZW1lbnRUeXBlJyksCiAgICAgICAgJ3JlY29uY2lsZV9hZG1pbicgPT4gYXJyYXkoJ29wZXJhdGlvbicsICdyb2xlJywgJ2xvZ2luJywgJ3Bhc3N3b3JkJywgJ3dwVXNlcklkJywgJ2NvbmNlYWxlZCcpLAogICAgICAgICdyb3RhdGVfdG9rZW4nID0+IGFycmF5KCd0b2tlbklkJyksCiAgICAgICAgJ3VwZGF0ZV9lbmRwb2ludCcgPT4gYXJyYXkoJ3ZlcnNpb24nLCAnc2hhMjU2JywgJ3BocEJhc2U2NCcsICdzaWduYXR1cmUnKSwKICAgICAgICAnY29uZmlndXJlX3NpdGVfcnVudGltZScgPT4gYXJyYXkoJ3J1bnRpbWVQaHBCYXNlNjQnLCAnc2hhMjU2JywgJ3J1bnRpbWVWZXJzaW9uJywgJ2NvbmZpZ3VyYXRpb25WZXJzaW9uJyksCiAgICAgICAgJ2Rpc2FibGVfc2l0ZV9ydW50aW1lJyA9PiBhcnJheSgpLAogICAgICAgICdydW50aW1lX3N0YXR1cycgPT4gYXJyYXkoKSwKICAgICAgICAnYmVnaW5fcmVjb25jaWxlJyA9PiBhcnJheSgnb3duZXJUb2tlbicpLAogICAgICAgICdyZWZyZXNoX3JlY29uY2lsZScgPT4gYXJyYXkoJ293bmVyVG9rZW4nKSwKICAgICAgICAnZmluaXNoX3JlY29uY2lsZScgPT4gYXJyYXkoJ293bmVyVG9rZW4nKSwKICAgICk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3ZhbGlkYXRlX3BheWxvYWRfZmllbGRzKCRhY3Rpb24sICRwYXlsb2FkLCAkYWxsb3dlZF9maWVsZHNfYnlfYWN0aW9uKSB7CiAgICAkYWxsb3dlZF9maWVsZHMgPSAkYWxsb3dlZF9maWVsZHNfYnlfYWN0aW9uWyRhY3Rpb25dOwogICAgZm9yZWFjaCAoYXJyYXlfa2V5cygkcGF5bG9hZCkgYXMgJGZpZWxkKSB7CiAgICAgICAgaWYgKCFpc19zdHJpbmcoJGZpZWxkKSB8fCAhaW5fYXJyYXkoJGZpZWxkLCAkYWxsb3dlZF9maWVsZHMsIHRydWUpKSB7CiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdpbnZhbGlkX3BheWxvYWRfZmllbGRzJykpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfaGVhbHRoKCkgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfYm9vdHN0cmFwX3dvcmRwcmVzcygpOwogICAgJGNvbmZpZyA9IGVhc3lwb3N0X2VuZHBvaW50X2NvbmZpZygpOwogICAgJHJ1bnRpbWVfc3RhdHVzID0gZWFzeXBvc3RfZW5kcG9pbnRfaG9tZXBhZ2VfcnVudGltZV9zdGF0dXMoKTsKICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oMjAwLCBhcnJheSgKICAgICAgICAnb2snID0+IHRydWUsCiAgICAgICAgJ2VuZHBvaW50VmVyc2lvbicgPT4gJGNvbmZpZ1snZW5kcG9pbnRfdmVyc2lvbiddLAogICAgICAgICd0b2tlbklkJyA9PiAkY29uZmlnWyd0b2tlbl9pZCddLAogICAgICAgICdjYW5Cb290c3RyYXBXb3JkUHJlc3MnID0+IHRydWUsCiAgICAgICAgJ2Nhbkluc2VydFBvc3RzJyA9PiBmdW5jdGlvbl9leGlzdHMoJ3dwX2luc2VydF9wb3N0JyksCiAgICAgICAgJ2NhblJlc29sdmVIb21lcGFnZScgPT4gZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdnZXRfcG9zdCcpLAogICAgICAgICdjYW5QbGFjZUhvbWVwYWdlTGluaycgPT4gZnVuY3Rpb25fZXhpc3RzKCd3cF91cGRhdGVfcG9zdCcpICYmIGZ1bmN0aW9uX2V4aXN0cygnZ2V0X3Bvc3RfbWV0YScpICYmIGZ1bmN0aW9uX2V4aXN0cygndXBkYXRlX3Bvc3RfbWV0YScpLAogICAgICAgICdjYW5SZW1vdmVIb21lcGFnZUxpbmsnID0+IGZ1bmN0aW9uX2V4aXN0cygnd3BfdXBkYXRlX3Bvc3QnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2dldF9wb3N0X21ldGEnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3VwZGF0ZV9wb3N0X21ldGEnKSwKICAgICAgICAnY2FuTWFuYWdlSG9tZXBhZ2VSdW50aW1lJyA9PiAkcnVudGltZV9zdGF0dXNbJ2Nhbk1hbmFnZSddLAogICAgICAgICdob21lcGFnZVJ1bnRpbWVWZXJzaW9uJyA9PiAkcnVudGltZV9zdGF0dXNbJ3ZlcnNpb24nXSwKICAgICAgICAnY2FuVXNlVHJhbnNpZW50cycgPT4gZnVuY3Rpb25fZXhpc3RzKCdzZXRfdHJhbnNpZW50JykgJiYgZnVuY3Rpb25fZXhpc3RzKCdnZXRfdHJhbnNpZW50JyksCiAgICAgICAgJ2NhbkNsZWFuQ2FjaGVzJyA9PiBmdW5jdGlvbl9leGlzdHMoJ2NsZWFuX3Bvc3RfY2FjaGUnKSB8fCBmdW5jdGlvbl9leGlzdHMoJ3dwX2NhY2hlX2RlbGV0ZScpLAogICAgICAgICdoYXNFbGVtZW50b3InID0+IGRpZF9hY3Rpb24oJ2VsZW1lbnRvci9sb2FkZWQnKSB8fCBjbGFzc19leGlzdHMoJ1xFbGVtZW50b3JcUGx1Z2luJyksCiAgICAgICAgJ3NpdGVVcmwnID0+IGZ1bmN0aW9uX2V4aXN0cygnc2l0ZV91cmwnKSA/IHNpdGVfdXJsKCkgOiBudWxsLAogICAgICAgICdwaHBWZXJzaW9uJyA9PiBQSFBfVkVSU0lPTiwKICAgICAgICAnc2VydmVyVGltZScgPT4gZ21kYXRlKCdjJyksCiAgICApKTsKfQoKCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2ZhbGxiYWNrX2Vycm9yKCRlcnJvciwgJG1lc3NhZ2UgPSBudWxsLCAkd2FybmluZ3MgPSBhcnJheSgpKSB7CiAgICAkcGF5bG9hZCA9IGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJGVycm9yLCAnZmFsbGJhY2snID0+IHRydWUpOwogICAgaWYgKCRtZXNzYWdlICE9PSBudWxsKSB7CiAgICAgICAgJHBheWxvYWRbJ21lc3NhZ2UnXSA9ICRtZXNzYWdlOwogICAgfQogICAgaWYgKCFlbXB0eSgkd2FybmluZ3MpKSB7CiAgICAgICAgJHBheWxvYWRbJ3dhcm5pbmdzJ10gPSAkd2FybmluZ3M7CiAgICB9CiAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDIwMCwgJHBheWxvYWQpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF92YWxpZGF0ZV9ob21lcGFnZV9wYXlsb2FkKCRwYXlsb2FkKSB7CiAgICAkcGxhY2VtZW50X2lkID0gaXNzZXQoJHBheWxvYWRbJ3BsYWNlbWVudElkJ10pID8gKGludCkgJHBheWxvYWRbJ3BsYWNlbWVudElkJ10gOiAwOwogICAgJGxpbmtfdXJsID0gaXNzZXQoJHBheWxvYWRbJ2xpbmtVcmwnXSkgPyBlc2NfdXJsX3Jhdygoc3RyaW5nKSAkcGF5bG9hZFsnbGlua1VybCddKSA6ICcnOwogICAgJGFuY2hvcl90ZXh0ID0gaXNzZXQoJHBheWxvYWRbJ2FuY2hvclRleHQnXSkgPyBzYW5pdGl6ZV90ZXh0X2ZpZWxkKChzdHJpbmcpICRwYXlsb2FkWydhbmNob3JUZXh0J10pIDogJyc7CiAgICBpZiAoJHBsYWNlbWVudF9pZCA8PSAwIHx8ICRsaW5rX3VybCA9PT0gJycgfHwgJGFuY2hvcl90ZXh0ID09PSAnJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdpbnZhbGlkX3BheWxvYWQnLCAnZmFsbGJhY2snID0+IGZhbHNlKSk7CiAgICB9CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ3BsYWNlbWVudElkJyA9PiAkcGxhY2VtZW50X2lkLAogICAgICAgICdsaW5rVXJsJyA9PiAkbGlua191cmwsCiAgICAgICAgJ2FuY2hvclRleHQnID0+ICRhbmNob3JfdGV4dCwKICAgICAgICAncHJlTGlua1RleHQnID0+IGFycmF5X2tleV9leGlzdHMoJ3ByZUxpbmtUZXh0JywgJHBheWxvYWQpID8gc2FuaXRpemVfdGV4dF9maWVsZCgoc3RyaW5nKSAkcGF5bG9hZFsncHJlTGlua1RleHQnXSkgOiBudWxsLAogICAgICAgICdwb3N0TGlua1RleHQnID0+IGFycmF5X2tleV9leGlzdHMoJ3Bvc3RMaW5rVGV4dCcsICRwYXlsb2FkKSA/IHNhbml0aXplX3RleHRfZmllbGQoKHN0cmluZykgJHBheWxvYWRbJ3Bvc3RMaW5rVGV4dCddKSA6IG51bGwsCiAgICAgICAgJ3BsYWNlbWVudFR5cGUnID0+IGlzc2V0KCRwYXlsb2FkWydwbGFjZW1lbnRUeXBlJ10pID8gc2FuaXRpemVfa2V5KChzdHJpbmcpICRwYXlsb2FkWydwbGFjZW1lbnRUeXBlJ10pIDogJ1ZJU0lCTEVfTElOSycsCiAgICApOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9ob21lcGFnZV9wb3N0KCkgewogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSB8fCAhZnVuY3Rpb25fZXhpc3RzKCdnZXRfcG9zdCcpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ2NhcGFiaWxpdHlfZmFpbGVkJyk7CiAgICB9CiAgICAkc2hvd19vbl9mcm9udCA9IGdldF9vcHRpb24oJ3Nob3dfb25fZnJvbnQnKTsKICAgIGlmICgkc2hvd19vbl9mcm9udCA9PT0gJ3Bvc3RzJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2ZhbGxiYWNrX2Vycm9yKCdob21lcGFnZV9wb3N0c19pbmRleF91bnN1cHBvcnRlZCcpOwogICAgfQogICAgJHBhZ2VfaWQgPSAoaW50KSBnZXRfb3B0aW9uKCdwYWdlX29uX2Zyb250Jyk7CiAgICBpZiAoJHNob3dfb25fZnJvbnQgIT09ICdwYWdlJyB8fCAkcGFnZV9pZCA8PSAwKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ2hvbWVwYWdlX3BhZ2Vfbm90X2ZvdW5kJyk7CiAgICB9CiAgICAkcG9zdCA9IGdldF9wb3N0KCRwYWdlX2lkKTsKICAgIGlmICghJHBvc3QgfHwgJHBvc3QtPnBvc3RfdHlwZSAhPT0gJ3BhZ2UnKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ2hvbWVwYWdlX3BhZ2Vfbm90X2ZvdW5kJyk7CiAgICB9CiAgICByZXR1cm4gJHBvc3Q7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3BsYWNlbWVudF9ib2R5KCRpbnB1dCkgewogICAgJGxhYmVsID0gJGlucHV0WydwcmVMaW5rVGV4dCddID09PSBudWxsID8gJ1JlY29tbWVuZGVkIHJlc291cmNlOicgOiAkaW5wdXRbJ3ByZUxpbmtUZXh0J107CiAgICAkcHJlZml4ID0gJGxhYmVsID09PSAnJyA/ICcnIDogJGxhYmVsIC4gJyAnOwogICAgJHN1ZmZpeCA9ICRpbnB1dFsncG9zdExpbmtUZXh0J10gPT09IG51bGwgPyAnJyA6ICRpbnB1dFsncG9zdExpbmtUZXh0J107CiAgICBpZiAoJHN1ZmZpeCAhPT0gJycgJiYgc3RycG9zKCRzdWZmaXgsICcgJykgIT09IDApIHsKICAgICAgICAkc3VmZml4ID0gJyAnIC4gJHN1ZmZpeDsKICAgIH0KICAgIHJldHVybiAkcHJlZml4IC4gJzxhIGhyZWY9IicgLiBlc2NfdXJsKCRpbnB1dFsnbGlua1VybCddKSAuICciPicgLiBlc2NfaHRtbCgkaW5wdXRbJ2FuY2hvclRleHQnXSkgLiAnPC9hPicgLiBlc2NfaHRtbCgkc3VmZml4KTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcGxhY2VtZW50X2h0bWwoJGlucHV0KSB7CiAgICAkYm9keSA9IGVhc3lwb3N0X2VuZHBvaW50X3BsYWNlbWVudF9ib2R5KCRpbnB1dCk7CiAgICAkbWFya2VyID0gJyBkYXRhLXBsYWNlbWVudD0iJyAuIChpbnQpICRpbnB1dFsncGxhY2VtZW50SWQnXSAuICciJzsKICAgIHN3aXRjaCAoc3RydG91cHBlcigoc3RyaW5nKSAkaW5wdXRbJ3BsYWNlbWVudFR5cGUnXSkpIHsKICAgICAgICBjYXNlICdXSElURV9MSU5LJzoKICAgICAgICAgICAgcmV0dXJuICc8ZGl2JyAuICRtYXJrZXIgLiAnIHN0eWxlPSJjb2xvcjojZmZmZmZmOyI+JyAuICRib2R5IC4gJzwvZGl2Pic7CiAgICAgICAgY2FzZSAnQ0xBU1NfSElERSc6CiAgICAgICAgICAgIHJldHVybiAnPHN0eWxlPi5kY3tkaXNwbGF5Om5vbmU7fTwvc3R5bGU+PGRpdicgLiAkbWFya2VyIC4gJyBjbGFzcz0iZGMiPicgLiAkYm9keSAuICc8L2Rpdj4nOwogICAgICAgIGNhc2UgJ05PX1dJRFRIJzoKICAgICAgICAgICAgcmV0dXJuICc8ZGl2JyAuICRtYXJrZXIgLiAnIHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjFweDt3aWR0aDoxcHg7ZmxvYXQ6cmlnaHQ7Ij4nIC4gJGJvZHkgLiAnPC9kaXY+JzsKICAgICAgICBjYXNlICdJTlZJU0lCTEVfWk9ORSc6CiAgICAgICAgICAgIHJldHVybiAnPGRpdicgLiAkbWFya2VyIC4gJyBzdHlsZT0ibGVmdDotMTE0MDdweDt0b3A6LTEwNTYwcHg7cG9zaXRpb246YWJzb2x1dGU7Ij4nIC4gJGJvZHkgLiAnPC9kaXY+JzsKICAgICAgICBjYXNlICdOT19WSVNJQklMSVRZJzoKICAgICAgICAgICAgcmV0dXJuICc8ZGl2JyAuICRtYXJrZXIgLiAnIHN0eWxlPSJ2aXNpYmlsaXR5OmhpZGRlbjsiPicgLiAkYm9keSAuICc8L2Rpdj4nOwogICAgICAgIGNhc2UgJ05PX09QQUNJVFknOgogICAgICAgICAgICByZXR1cm4gJzxkaXYnIC4gJG1hcmtlciAuICcgc3R5bGU9Im9wYWNpdHk6MC4wMDE7Y3Vyc29yOmNvbnRleHQtbWVudTsiPicgLiAkYm9keSAuICc8L2Rpdj4nOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAnPGRpdicgLiAkbWFya2VyIC4gJz4nIC4gJGJvZHkgLiAnPC9kaXY+JzsKICAgIH0KfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfbWFya2VyKCRwbGFjZW1lbnRfaWQpIHsKICAgIHJldHVybiAnZGF0YS1wbGFjZW1lbnQ9IicgLiAoaW50KSAkcGxhY2VtZW50X2lkIC4gJyInOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9tYW5hZ2VkX3BsYWNlbWVudHNfb3B0aW9uKCkgewogICAgcmV0dXJuICdlYXN5cG9zdF9ob21lcGFnZV9wbGFjZW1lbnRzJzsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcnVudGltZV9maWxlX3BhdGgoKSB7CiAgICBpZiAoIWRlZmluZWQoJ1dQX0NPTlRFTlRfRElSJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkZGlyZWN0b3J5ID0gZGVmaW5lZCgnV1BNVV9QTFVHSU5fRElSJykgPyBXUE1VX1BMVUdJTl9ESVIgOiBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiAgICByZXR1cm4gJGRpcmVjdG9yeSAuICcvZWFzeXBvc3QtcnVudGltZS5waHAnOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3BocCgpIHsKICAgICRjb25maWcgPSBlYXN5cG9zdF9lbmRwb2ludF9jb25maWcoKTsKICAgICR2ZXJzaW9uID0gaXNzZXQoJGNvbmZpZ1snZW5kcG9pbnRfdmVyc2lvbiddKSA/IChzdHJpbmcpICRjb25maWdbJ2VuZHBvaW50X3ZlcnNpb24nXSA6ICd1bmtub3duJzsKICAgICRydW50aW1lID0gPDw8J1BIUCcKPD9waHAKaWYgKCFkZWZpbmVkKCdBQlNQQVRIJykpIHsKICAgIGV4aXQ7Cn0KCmlmICghZGVmaW5lZCgnRUFTWVBPU1RfSE9NRVBBR0VfUlVOVElNRV9WRVJTSU9OJykpIHsKICAgIGRlZmluZSgnRUFTWVBPU1RfSE9NRVBBR0VfUlVOVElNRV9WRVJTSU9OJywgJ19fRUFTWVBPU1RfUlVOVElNRV9WRVJTSU9OX18nKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfcnVudGltZV9wbGFjZW1lbnRzX29wdGlvbigpIHsKICAgIHJldHVybiAnZWFzeXBvc3RfaG9tZXBhZ2VfcGxhY2VtZW50cyc7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X3J1bnRpbWVfaXNfaG9tZXBhZ2UoKSB7CiAgICByZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCdpc19mcm9udF9wYWdlJykgJiYgaXNfZnJvbnRfcGFnZSgpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9ydW50aW1lX2dldF9wbGFjZW1lbnRzKCkgewogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSkgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgfQogICAgJHBsYWNlbWVudHMgPSBnZXRfb3B0aW9uKGVhc3lwb3N0X3J1bnRpbWVfcGxhY2VtZW50c19vcHRpb24oKSwgYXJyYXkoKSk7CiAgICByZXR1cm4gaXNfYXJyYXkoJHBsYWNlbWVudHMpID8gJHBsYWNlbWVudHMgOiBhcnJheSgpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9ydW50aW1lX21pc3NpbmdfaHRtbCgkYnVmZmVyID0gJycpIHsKICAgICRwbGFjZW1lbnRzID0gZWFzeXBvc3RfcnVudGltZV9nZXRfcGxhY2VtZW50cygpOwogICAgaWYgKGVtcHR5KCRwbGFjZW1lbnRzKSkgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgICRodG1sID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKCRwbGFjZW1lbnRzIGFzICRwbGFjZW1lbnQpIHsKICAgICAgICBpZiAoIWlzX2FycmF5KCRwbGFjZW1lbnQpIHx8IGVtcHR5KCRwbGFjZW1lbnRbJ2h0bWwnXSkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgICRwbGFjZW1lbnRfaWQgPSBpc3NldCgkcGxhY2VtZW50WydwbGFjZW1lbnRJZCddKSA/IChpbnQpICRwbGFjZW1lbnRbJ3BsYWNlbWVudElkJ10gOiAwOwogICAgICAgICRtYXJrZXIgPSAnZGF0YS1wbGFjZW1lbnQ9IicgLiAkcGxhY2VtZW50X2lkIC4gJyInOwogICAgICAgIGlmICgkcGxhY2VtZW50X2lkID4gMCAmJiAkYnVmZmVyICE9PSAnJyAmJiBzdHJwb3MoJGJ1ZmZlciwgJG1hcmtlcikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAkaHRtbFtdID0gKHN0cmluZykgJHBsYWNlbWVudFsnaHRtbCddOwogICAgfQogICAgcmV0dXJuIGltcGxvZGUoIlxuIiwgJGh0bWwpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9ydW50aW1lX2VjaG8oKSB7CiAgICBpZiAoIWVhc3lwb3N0X3J1bnRpbWVfaXNfaG9tZXBhZ2UoKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgICRodG1sID0gZWFzeXBvc3RfcnVudGltZV9taXNzaW5nX2h0bWwoJycpOwogICAgaWYgKCRodG1sICE9PSAnJykgewogICAgICAgIGVjaG8gIlxuIiAuICRodG1sIC4gIlxuIjsKICAgIH0KfQoKZnVuY3Rpb24gZWFzeXBvc3RfcnVudGltZV9idWZmZXJfc3RhcnQoKSB7CiAgICBpZiAoIWVhc3lwb3N0X3J1bnRpbWVfaXNfaG9tZXBhZ2UoKSB8fCBlbXB0eShlYXN5cG9zdF9ydW50aW1lX2dldF9wbGFjZW1lbnRzKCkpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgb2Jfc3RhcnQoJ2Vhc3lwb3N0X3J1bnRpbWVfaW5qZWN0X2J1ZmZlcicpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9ydW50aW1lX2luamVjdF9idWZmZXIoJGJ1ZmZlcikgewogICAgJGh0bWwgPSBlYXN5cG9zdF9ydW50aW1lX21pc3NpbmdfaHRtbCgkYnVmZmVyKTsKICAgIGlmICgkaHRtbCA9PT0gJycpIHsKICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgIH0KICAgIGlmIChzdHJpcG9zKCRidWZmZXIsICc8L2JvZHk+JykgIT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLzxcL2JvZHk+L2knLCAiXG4iIC4gJGh0bWwgLiAiXG48L2JvZHk+IiwgJGJ1ZmZlciwgMSk7CiAgICB9CiAgICByZXR1cm4gJGJ1ZmZlciAuICJcbiIgLiAkaHRtbDsKfQoKYWRkX2FjdGlvbigndGVtcGxhdGVfcmVkaXJlY3QnLCAnZWFzeXBvc3RfcnVudGltZV9idWZmZXJfc3RhcnQnLCAwKTsKYWRkX2FjdGlvbignd3BfZm9vdGVyJywgJ2Vhc3lwb3N0X3J1bnRpbWVfZWNobycsIFBIUF9JTlRfTUFYKTsKUEhQOwogICAgcmV0dXJuIHN0cl9yZXBsYWNlKCdfX0VBU1lQT1NUX1JVTlRJTUVfVkVSU0lPTl9fJywgc3RyX3JlcGxhY2UoIiciLCAiXFwnIiwgJHZlcnNpb24pLCAkcnVudGltZSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2luc3RhbGxfaG9tZXBhZ2VfcnVudGltZSgmJHdhcm5pbmdzKSB7CiAgICBpZiAoIWRlZmluZWQoJ1dQX0NPTlRFTlRfRElSJykgfHwgIWZ1bmN0aW9uX2V4aXN0cygnd3BfbWtkaXJfcCcpKSB7CiAgICAgICAgJHdhcm5pbmdzW10gPSAncnVudGltZV9jYXBhYmlsaXR5X3VuYXZhaWxhYmxlJzsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkcGF0aCA9IGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfZmlsZV9wYXRoKCk7CiAgICBpZiAoISRwYXRoKSB7CiAgICAgICAgJHdhcm5pbmdzW10gPSAncnVudGltZV9wYXRoX3VuYXZhaWxhYmxlJzsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkZGlyZWN0b3J5ID0gZGlybmFtZSgkcGF0aCk7CiAgICBpZiAoIWlzX2RpcigkZGlyZWN0b3J5KSAmJiAhd3BfbWtkaXJfcCgkZGlyZWN0b3J5KSkgewogICAgICAgICR3YXJuaW5nc1tdID0gJ3J1bnRpbWVfZGlyZWN0b3J5X3VuYXZhaWxhYmxlJzsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkcGhwID0gZWFzeXBvc3RfZW5kcG9pbnRfcnVudGltZV9waHAoKTsKICAgICRjdXJyZW50ID0gaXNfcmVhZGFibGUoJHBhdGgpID8gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpIDogZmFsc2U7CiAgICBpZiAoJGN1cnJlbnQgPT09ICRwaHApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgICRieXRlcyA9IGZpbGVfcHV0X2NvbnRlbnRzKCRwYXRoLCAkcGhwLCBMT0NLX0VYKTsKICAgIGlmICgkYnl0ZXMgPT09IGZhbHNlIHx8ICRieXRlcyAhPT0gc3RybGVuKCRwaHApKSB7CiAgICAgICAgJHdhcm5pbmdzW10gPSAncnVudGltZV93cml0ZV9mYWlsZWQnOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9ob21lcGFnZV9ydW50aW1lX3N0YXR1cygpIHsKICAgICRwYXRoID0gZWFzeXBvc3RfZW5kcG9pbnRfcnVudGltZV9maWxlX3BhdGgoKTsKICAgICR2ZXJzaW9uID0gbnVsbDsKICAgIGlmICgkcGF0aCAmJiBpc19yZWFkYWJsZSgkcGF0aCkpIHsKICAgICAgICAkY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgaWYgKGlzX3N0cmluZygkY29udGVudHMpICYmIHByZWdfbWF0Y2goIi9FQVNZUE9TVF9IT01FUEFHRV9SVU5USU1FX1ZFUlNJT04nLCAnKFteJ10rKScvIiwgJGNvbnRlbnRzLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgJHZlcnNpb24gPSAkbWF0Y2hlc1sxXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ2Nhbk1hbmFnZScgPT4gZGVmaW5lZCgnV1BfQ09OVEVOVF9ESVInKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3dwX21rZGlyX3AnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2dldF9vcHRpb24nKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3VwZGF0ZV9vcHRpb24nKSwKICAgICAgICAndmVyc2lvbicgPT4gJHZlcnNpb24sCiAgICApOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9sb2FkX21hbmFnZWRfcGxhY2VtZW50cygpIHsKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9mYWxsYmFja19lcnJvcignY2FwYWJpbGl0eV9mYWlsZWQnKTsKICAgIH0KCiAgICAkcGxhY2VtZW50cyA9IGdldF9vcHRpb24oZWFzeXBvc3RfZW5kcG9pbnRfbWFuYWdlZF9wbGFjZW1lbnRzX29wdGlvbigpLCBhcnJheSgpKTsKICAgIHJldHVybiBpc19hcnJheSgkcGxhY2VtZW50cykgPyAkcGxhY2VtZW50cyA6IGFycmF5KCk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3NhdmVfbWFuYWdlZF9wbGFjZW1lbnRzKCRwbGFjZW1lbnRzKSB7CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygndXBkYXRlX29wdGlvbicpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ2NhcGFiaWxpdHlfZmFpbGVkJyk7CiAgICB9CiAgICByZXR1cm4gdXBkYXRlX29wdGlvbihlYXN5cG9zdF9lbmRwb2ludF9tYW5hZ2VkX3BsYWNlbWVudHNfb3B0aW9uKCksICRwbGFjZW1lbnRzLCBmYWxzZSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3N0b3JlX21hbmFnZWRfcGxhY2VtZW50KCRpbnB1dCwgJHBvc3RfaWQsICRodG1sKSB7CiAgICAkcGxhY2VtZW50cyA9IGVhc3lwb3N0X2VuZHBvaW50X2xvYWRfbWFuYWdlZF9wbGFjZW1lbnRzKCk7CiAgICAka2V5ID0gKHN0cmluZykgKGludCkgJGlucHV0WydwbGFjZW1lbnRJZCddOwogICAgJHBhZ2VfdXJsID0gZnVuY3Rpb25fZXhpc3RzKCdnZXRfcGVybWFsaW5rJykgPyBnZXRfcGVybWFsaW5rKCRwb3N0X2lkKSA6IG51bGw7CiAgICAkbmV4dCA9IGFycmF5KAogICAgICAgICdwbGFjZW1lbnRJZCcgPT4gKGludCkgJGlucHV0WydwbGFjZW1lbnRJZCddLAogICAgICAgICdwYWdlSWQnID0+IChpbnQpICRwb3N0X2lkLAogICAgICAgICdwYWdlVXJsJyA9PiAkcGFnZV91cmwsCiAgICAgICAgJ2h0bWwnID0+ICRodG1sLAogICAgICAgICd1cGRhdGVkQXQnID0+IGdtZGF0ZSgnYycpLAogICAgKTsKICAgICRhbHJlYWR5X3ByZXNlbnQgPSBpc3NldCgkcGxhY2VtZW50c1ska2V5XSkgJiYgaXNfYXJyYXkoJHBsYWNlbWVudHNbJGtleV0pICYmIGlzc2V0KCRwbGFjZW1lbnRzWyRrZXldWydodG1sJ10pICYmICRwbGFjZW1lbnRzWyRrZXldWydodG1sJ10gPT09ICRodG1sOwogICAgaWYgKCRhbHJlYWR5X3ByZXNlbnQpIHsKICAgICAgICByZXR1cm4gYXJyYXkoJ2NoYW5nZWQnID0+IGZhbHNlLCAnYWxyZWFkeVByZXNlbnQnID0+IHRydWUsICdwYWdlVXJsJyA9PiAkcGFnZV91cmwpOwogICAgfQogICAgJHBsYWNlbWVudHNbJGtleV0gPSAkbmV4dDsKICAgIGlmICghZWFzeXBvc3RfZW5kcG9pbnRfc2F2ZV9tYW5hZ2VkX3BsYWNlbWVudHMoJHBsYWNlbWVudHMpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ3J1bnRpbWVfb3B0aW9uX3VwZGF0ZV9mYWlsZWQnKTsKICAgIH0KICAgIHJldHVybiBhcnJheSgnY2hhbmdlZCcgPT4gdHJ1ZSwgJ2FscmVhZHlQcmVzZW50JyA9PiBmYWxzZSwgJ3BhZ2VVcmwnID0+ICRwYWdlX3VybCk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3JlbW92ZV9tYW5hZ2VkX3BsYWNlbWVudCgkcGxhY2VtZW50X2lkKSB7CiAgICAkcGxhY2VtZW50cyA9IGVhc3lwb3N0X2VuZHBvaW50X2xvYWRfbWFuYWdlZF9wbGFjZW1lbnRzKCk7CiAgICAka2V5ID0gKHN0cmluZykgKGludCkgJHBsYWNlbWVudF9pZDsKICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkcGxhY2VtZW50cykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB1bnNldCgkcGxhY2VtZW50c1ska2V5XSk7CiAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X3NhdmVfbWFuYWdlZF9wbGFjZW1lbnRzKCRwbGFjZW1lbnRzKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2ZhbGxiYWNrX2Vycm9yKCdydW50aW1lX29wdGlvbl91cGRhdGVfZmFpbGVkJyk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfY2FjaGVfd2FybmluZ3MoJHBvc3RfaWQpIHsKICAgICR3YXJuaW5ncyA9IGFycmF5KCk7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdjbGVhbl9wb3N0X2NhY2hlJykpIHsKICAgICAgICBjbGVhbl9wb3N0X2NhY2hlKCRwb3N0X2lkKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJHdhcm5pbmdzW10gPSAnY2xlYW5fcG9zdF9jYWNoZV91bmF2YWlsYWJsZSc7CiAgICB9CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9jYWNoZV9kZWxldGUnKSkgewogICAgICAgIHdwX2NhY2hlX2RlbGV0ZSgkcG9zdF9pZCwgJ3Bvc3RzJyk7CiAgICB9CiAgICBpZiAoY2xhc3NfZXhpc3RzKCdcXEVsZW1lbnRvclxcUGx1Z2luJykpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkZWxlbWVudG9yID0gXEVsZW1lbnRvclxQbHVnaW46OiRpbnN0YW5jZTsKICAgICAgICAgICAgaWYgKCRlbGVtZW50b3IgJiYgaXNzZXQoJGVsZW1lbnRvci0+ZmlsZXNfbWFuYWdlcikgJiYgbWV0aG9kX2V4aXN0cygkZWxlbWVudG9yLT5maWxlc19tYW5hZ2VyLCAnY2xlYXJfY2FjaGUnKSkgewogICAgICAgICAgICAgICAgJGVsZW1lbnRvci0+ZmlsZXNfbWFuYWdlci0+Y2xlYXJfY2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSAkaWdub3JlZCkgewogICAgICAgICAgICAkd2FybmluZ3NbXSA9ICdlbGVtZW50b3JfY2FjaGVfY2xlYW51cF9mYWlsZWQnOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgJHdhcm5pbmdzW10gPSAnZWxlbWVudG9yX2NhY2hlX2NsZWFudXBfdW5hdmFpbGFibGUnOwogICAgfQogICAgcmV0dXJuICR3YXJuaW5nczsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfbG9ja19rZXkoJHBvc3RfaWQpIHsKICAgIHJldHVybiAnZWFzeXBvc3RfaG9tZXBhZ2VfJyAuIChpbnQpICRwb3N0X2lkOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9hY3F1aXJlX2xvY2soJHBvc3RfaWQpIHsKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfdHJhbnNpZW50JykgfHwgIWZ1bmN0aW9uX2V4aXN0cygnc2V0X3RyYW5zaWVudCcpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAka2V5ID0gZWFzeXBvc3RfZW5kcG9pbnRfbG9ja19rZXkoJHBvc3RfaWQpOwogICAgaWYgKGdldF90cmFuc2llbnQoJGtleSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBzZXRfdHJhbnNpZW50KCRrZXksICcxJywgNjApOwogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3JlbGVhc2VfbG9jaygkcG9zdF9pZCkgewogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnZGVsZXRlX3RyYW5zaWVudCcpKSB7CiAgICAgICAgZGVsZXRlX3RyYW5zaWVudChlYXN5cG9zdF9lbmRwb2ludF9sb2NrX2tleSgkcG9zdF9pZCkpOwogICAgfQp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9lbGVtZW50b3Jfd2lkZ2V0KCRodG1sLCAkcGxhY2VtZW50X2lkKSB7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgJ2lkJyA9PiBzdWJzdHIoaGFzaCgnc2hhMjU2JywgJ3BsYWNlbWVudC0nIC4gKGludCkgJHBsYWNlbWVudF9pZCksIDAsIDcpLAogICAgICAgICdlbFR5cGUnID0+ICd3aWRnZXQnLAogICAgICAgICd3aWRnZXRUeXBlJyA9PiAnaHRtbCcsCiAgICAgICAgJ3NldHRpbmdzJyA9PiBhcnJheSgnaHRtbCcgPT4gJGh0bWwpLAogICAgICAgICdlbGVtZW50cycgPT4gYXJyYXkoKSwKICAgICk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2FwcGVuZF90b19lbGVtZW50b3Jfc2V0dGluZ3MoJiRzZXR0aW5ncywgJGh0bWwpIHsKICAgIGlmICghaXNfYXJyYXkoJHNldHRpbmdzKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvcmVhY2ggKGFycmF5KCdodG1sJywgJ2VkaXRvcicsICd0ZXh0JykgYXMgJGtleSkgewogICAgICAgIGlmICghaXNzZXQoJHNldHRpbmdzWyRrZXldKSB8fCAhaXNfc3RyaW5nKCRzZXR0aW5nc1ska2V5XSkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgICRzZXR0aW5nc1ska2V5XSA9IHRyaW0oJHNldHRpbmdzWyRrZXldIC4gIlxuIiAuICRodG1sKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfaW5zZXJ0X2VsZW1lbnRvcl93aWRnZXQoJiRub2RlLCAkd2lkZ2V0KSB7CiAgICBpZiAoIWlzX2FycmF5KCRub2RlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChpc3NldCgkbm9kZVsnc2V0dGluZ3MnXSkgJiYgaXNfYXJyYXkoJG5vZGVbJ3NldHRpbmdzJ10pICYmIGVhc3lwb3N0X2VuZHBvaW50X2FwcGVuZF90b19lbGVtZW50b3Jfc2V0dGluZ3MoJG5vZGVbJ3NldHRpbmdzJ10sICR3aWRnZXRbJ3NldHRpbmdzJ11bJ2h0bWwnXSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChpc3NldCgkbm9kZVsnZWxlbWVudHMnXSkgJiYgaXNfYXJyYXkoJG5vZGVbJ2VsZW1lbnRzJ10pKSB7CiAgICAgICAgZm9yZWFjaCAoJG5vZGVbJ2VsZW1lbnRzJ10gYXMgJGluZGV4ID0+ICYkY2hpbGQpIHsKICAgICAgICAgICAgaWYgKGVhc3lwb3N0X2VuZHBvaW50X2luc2VydF9lbGVtZW50b3Jfd2lkZ2V0KCRjaGlsZCwgJHdpZGdldCkpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCRjaGlsZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1bnNldCgkY2hpbGQpOwogICAgICAgICRub2RlWydlbGVtZW50cyddW10gPSAkd2lkZ2V0OwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZm9yZWFjaCAoJG5vZGUgYXMgJGluZGV4ID0+ICYkY2hpbGQpIHsKICAgICAgICBpZiAoIWlzX2ludCgkaW5kZXgpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoZWFzeXBvc3RfZW5kcG9pbnRfaW5zZXJ0X2VsZW1lbnRvcl93aWRnZXQoJGNoaWxkLCAkd2lkZ2V0KSkgewogICAgICAgICAgICB1bnNldCgkY2hpbGQpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICB1bnNldCgkY2hpbGQpOwogICAgaWYgKGlzc2V0KCRub2RlWzBdKSAmJiBpc19hcnJheSgkbm9kZVswXSkgJiYgaXNzZXQoJG5vZGVbMF1bJ2VsZW1lbnRzJ10pICYmIGlzX2FycmF5KCRub2RlWzBdWydlbGVtZW50cyddKSkgewogICAgICAgICRub2RlWzBdWydlbGVtZW50cyddW10gPSAkd2lkZ2V0OwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9lbGVtZW50b3Jfbm9kZV9oYXNfZGlyZWN0X21hcmtlcigkbm9kZSwgJG1hcmtlcikgewogICAgaWYgKCFpc19hcnJheSgkbm9kZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoIWlzc2V0KCRub2RlWydzZXR0aW5ncyddKSB8fCAhaXNfYXJyYXkoJG5vZGVbJ3NldHRpbmdzJ10pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJGVuY29kZWQgPSBqc29uX2VuY29kZSgkbm9kZVsnc2V0dGluZ3MnXSk7CiAgICByZXR1cm4gaXNfc3RyaW5nKCRlbmNvZGVkKSAmJiBzdHJwb3MoJGVuY29kZWQsICRtYXJrZXIpICE9PSBmYWxzZTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcmVtb3ZlX21hcmtlcl9mcm9tX2VsZW1lbnRvcigkbm9kZXMsICRtYXJrZXIsICYkcmVtb3ZlZCkgewogICAgaWYgKCFpc19hcnJheSgkbm9kZXMpKSB7CiAgICAgICAgcmV0dXJuICRub2RlczsKICAgIH0KICAgICRuZXh0ID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKCRub2RlcyBhcyAkbm9kZSkgewogICAgICAgIGlmIChpc19hcnJheSgkbm9kZSkpIHsKICAgICAgICAgICAgaWYgKGVhc3lwb3N0X2VuZHBvaW50X2VsZW1lbnRvcl9ub2RlX2hhc19kaXJlY3RfbWFya2VyKCRub2RlLCAkbWFya2VyKSkgewogICAgICAgICAgICAgICAgJHJlbW92ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCRub2RlWydlbGVtZW50cyddKSAmJiBpc19hcnJheSgkbm9kZVsnZWxlbWVudHMnXSkpIHsKICAgICAgICAgICAgICAgICRub2RlWydlbGVtZW50cyddID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVtb3ZlX21hcmtlcl9mcm9tX2VsZW1lbnRvcigkbm9kZVsnZWxlbWVudHMnXSwgJG1hcmtlciwgJHJlbW92ZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRuZXh0W10gPSAkbm9kZTsKICAgIH0KICAgIHJldHVybiAkbmV4dDsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcGxhY2VfaG9tZXBhZ2VfbGluaygkcGF5bG9hZCkgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfYm9vdHN0cmFwX3dvcmRwcmVzcygpOwogICAgJGlucHV0ID0gZWFzeXBvc3RfZW5kcG9pbnRfdmFsaWRhdGVfaG9tZXBhZ2VfcGF5bG9hZCgkcGF5bG9hZCk7CiAgICAkcG9zdCA9IGVhc3lwb3N0X2VuZHBvaW50X2hvbWVwYWdlX3Bvc3QoKTsKICAgICRwb3N0X2lkID0gKGludCkgJHBvc3QtPklEOwogICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF9hY3F1aXJlX2xvY2soJHBvc3RfaWQpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ2xvY2tfYnVzeScpOwogICAgfQogICAgJHdhcm5pbmdzID0gYXJyYXkoKTsKICAgIHRyeSB7CiAgICAgICAgJGh0bWwgPSBlYXN5cG9zdF9lbmRwb2ludF9wbGFjZW1lbnRfaHRtbCgkaW5wdXQpOwogICAgICAgIGlmICghZWFzeXBvc3RfZW5kcG9pbnRfaW5zdGFsbF9ob21lcGFnZV9ydW50aW1lKCR3YXJuaW5ncykpIHsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ3J1bnRpbWVfaW5zdGFsbF9mYWlsZWQnLCBudWxsLCAkd2FybmluZ3MpOwogICAgICAgIH0KICAgICAgICAkc3RvcmVkID0gZWFzeXBvc3RfZW5kcG9pbnRfc3RvcmVfbWFuYWdlZF9wbGFjZW1lbnQoJGlucHV0LCAkcG9zdF9pZCwgJGh0bWwpOwogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3VwZGF0ZV9wb3N0X21ldGEnKSkgewogICAgICAgICAgICB1cGRhdGVfcG9zdF9tZXRhKCRwb3N0X2lkLCAnX2Vhc3lwb3N0X2hvbWVwYWdlX3BsYWNlbWVudF8nIC4gKGludCkgJGlucHV0WydwbGFjZW1lbnRJZCddLCBhcnJheSgnbWV0aG9kJyA9PiAnRUFTWVBPU1RfTUFOQUdFRF9SRU5ERVInLCAndXBkYXRlZEF0JyA9PiBnbWRhdGUoJ2MnKSkpOwogICAgICAgIH0KICAgICAgICAkd2FybmluZ3MgPSBhcnJheV9tZXJnZSgkd2FybmluZ3MsIGVhc3lwb3N0X2VuZHBvaW50X2NhY2hlX3dhcm5pbmdzKCRwb3N0X2lkKSk7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbigyMDAsIGFycmF5KCdvaycgPT4gdHJ1ZSwgJ21ldGhvZCcgPT4gJ0VBU1lQT1NUX01BTkFHRURfUkVOREVSJywgJ2NvbnRlbnRJZCcgPT4gJHBvc3RfaWQsICdwYWdlVXJsJyA9PiAkc3RvcmVkWydwYWdlVXJsJ10sICdjaGFuZ2VkJyA9PiAkc3RvcmVkWydjaGFuZ2VkJ10sICdhbHJlYWR5UHJlc2VudCcgPT4gJHN0b3JlZFsnYWxyZWFkeVByZXNlbnQnXSwgJ3dhcm5pbmdzJyA9PiAkd2FybmluZ3MpKTsKICAgIH0gZmluYWxseSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfcmVsZWFzZV9sb2NrKCRwb3N0X2lkKTsKICAgIH0KfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcmVtb3ZlX2hvbWVwYWdlX2xpbmsoJHBheWxvYWQpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X2Jvb3RzdHJhcF93b3JkcHJlc3MoKTsKICAgICRpbnB1dCA9IGVhc3lwb3N0X2VuZHBvaW50X3ZhbGlkYXRlX2hvbWVwYWdlX3BheWxvYWQoJHBheWxvYWQpOwogICAgJHBvc3QgPSBlYXN5cG9zdF9lbmRwb2ludF9ob21lcGFnZV9wb3N0KCk7CiAgICAkcG9zdF9pZCA9IChpbnQpICRwb3N0LT5JRDsKICAgIGlmICghZWFzeXBvc3RfZW5kcG9pbnRfYWNxdWlyZV9sb2NrKCRwb3N0X2lkKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2ZhbGxiYWNrX2Vycm9yKCdsb2NrX2J1c3knKTsKICAgIH0KICAgIHRyeSB7CiAgICAgICAgJG1hcmtlciA9IGVhc3lwb3N0X2VuZHBvaW50X21hcmtlcigkaW5wdXRbJ3BsYWNlbWVudElkJ10pOwogICAgICAgICRjaGFuZ2VkID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVtb3ZlX21hbmFnZWRfcGxhY2VtZW50KCRpbnB1dFsncGxhY2VtZW50SWQnXSk7CiAgICAgICAgJGVsZW1lbnRvcl9yYXcgPSBmdW5jdGlvbl9leGlzdHMoJ2dldF9wb3N0X21ldGEnKSA/IChzdHJpbmcpIGdldF9wb3N0X21ldGEoJHBvc3RfaWQsICdfZWxlbWVudG9yX2RhdGEnLCB0cnVlKSA6ICcnOwogICAgICAgICRlbGVtZW50b3JfbW9kZSA9IGZ1bmN0aW9uX2V4aXN0cygnZ2V0X3Bvc3RfbWV0YScpID8gKHN0cmluZykgZ2V0X3Bvc3RfbWV0YSgkcG9zdF9pZCwgJ19lbGVtZW50b3JfZWRpdF9tb2RlJywgdHJ1ZSkgOiAnJzsKICAgICAgICBpZiAoJGVsZW1lbnRvcl9yYXcgIT09ICcnICYmICRlbGVtZW50b3JfbW9kZSA9PT0gJ2J1aWxkZXInICYmIHN0cnBvcygkZWxlbWVudG9yX3JhdywgJG1hcmtlcikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJGVsZW1lbnRvcl9yYXcsIHRydWUpOwogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRkYXRhKSkgewogICAgICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ2VsZW1lbnRvcl9kYXRhX2ludmFsaWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVtb3ZlZCA9IGZhbHNlOwogICAgICAgICAgICAkZGF0YSA9IGVhc3lwb3N0X2VuZHBvaW50X3JlbW92ZV9tYXJrZXJfZnJvbV9lbGVtZW50b3IoJGRhdGEsICRtYXJrZXIsICRyZW1vdmVkKTsKICAgICAgICAgICAgaWYgKCEkcmVtb3ZlZCB8fCAhZnVuY3Rpb25fZXhpc3RzKCd1cGRhdGVfcG9zdF9tZXRhJykgfHwgdXBkYXRlX3Bvc3RfbWV0YSgkcG9zdF9pZCwgJ19lbGVtZW50b3JfZGF0YScsIHdwX3NsYXNoKGpzb25fZW5jb2RlKCRkYXRhKSkpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ3Bvc3RfdXBkYXRlX2ZhaWxlZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgJGNvbnRlbnQgPSAoc3RyaW5nKSAkcG9zdC0+cG9zdF9jb250ZW50OwogICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICRtYXJrZXIpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkcGF0dGVybiA9ICcvXHMqKD86PHN0eWxlPlwuZGNce2Rpc3BsYXk6bm9uZTtcfTxcL3N0eWxlPlxzKik/PCg/OnB8ZGl2KVtePl0qZGF0YS1wbGFjZW1lbnQ9IicgLiBwcmVnX3F1b3RlKChzdHJpbmcpICRpbnB1dFsncGxhY2VtZW50SWQnXSwgJy8nKSAuICciW14+XSo+Lio/PFwvKD86cHxkaXYpPi9zJzsKICAgICAgICAgICAgJG5leHQgPSB0cmltKHByZWdfcmVwbGFjZSgkcGF0dGVybiwgJycsICRjb250ZW50LCAxKSk7CiAgICAgICAgICAgICR1cGRhdGVkID0gd3BfdXBkYXRlX3Bvc3QoYXJyYXkoJ0lEJyA9PiAkcG9zdF9pZCwgJ3Bvc3RfY29udGVudCcgPT4gJG5leHQpLCB0cnVlKTsKICAgICAgICAgICAgaWYgKGlzX3dwX2Vycm9yKCR1cGRhdGVkKSkgewogICAgICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfZmFsbGJhY2tfZXJyb3IoJ3Bvc3RfdXBkYXRlX2ZhaWxlZCcsICR1cGRhdGVkLT5nZXRfZXJyb3JfbWVzc2FnZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY2hhbmdlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgICR3YXJuaW5ncyA9IGVhc3lwb3N0X2VuZHBvaW50X2NhY2hlX3dhcm5pbmdzKCRwb3N0X2lkKTsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDIwMCwgYXJyYXkoJ29rJyA9PiB0cnVlLCAnbWV0aG9kJyA9PiAnRUFTWVBPU1RfTUFOQUdFRF9SRU5ERVInLCAnY29udGVudElkJyA9PiAkcG9zdF9pZCwgJ3BhZ2VVcmwnID0+IGdldF9wZXJtYWxpbmsoJHBvc3RfaWQpLCAnY2hhbmdlZCcgPT4gJGNoYW5nZWQsICdhbHJlYWR5UmVtb3ZlZCcgPT4gISRjaGFuZ2VkLCAnd2FybmluZ3MnID0+ICR3YXJuaW5ncykpOwogICAgfSBmaW5hbGx5IHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9yZWxlYXNlX2xvY2soJHBvc3RfaWQpOwogICAgfQp9CgoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfY3JlYXRlX3Bvc3QoJHBheWxvYWQpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X2Jvb3RzdHJhcF93b3JkcHJlc3MoKTsKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCd3cF9pbnNlcnRfcG9zdCcpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig1MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2NhcGFiaWxpdHlfZmFpbGVkJykpOwogICAgfQogICAgJHN0YXR1cyA9ICdwdWJsaXNoJzsKICAgICRwb3N0X3R5cGUgPSAhZW1wdHkoJHBheWxvYWRbJ3Bvc3RfdHlwZSddKSA/IHNhbml0aXplX2tleSgkcGF5bG9hZFsncG9zdF90eXBlJ10pIDogKCFlbXB0eSgkcGF5bG9hZFsncG9zdFR5cGUnXSkgPyBzYW5pdGl6ZV9rZXkoJHBheWxvYWRbJ3Bvc3RUeXBlJ10pIDogJ3Bvc3QnKTsKICAgICRjb250ZW50ID0gaXNzZXQoJHBheWxvYWRbJ2NvbnRlbnRIdG1sJ10pID8gJHBheWxvYWRbJ2NvbnRlbnRIdG1sJ10gOiAoaXNzZXQoJHBheWxvYWRbJ2NvbnRlbnQnXSkgPyAkcGF5bG9hZFsnY29udGVudCddIDogJycpOwogICAgJHBvc3RhcnIgPSBhcnJheSgKICAgICAgICAncG9zdF90aXRsZScgPT4gaXNzZXQoJHBheWxvYWRbJ3RpdGxlJ10pID8gd3Bfc3RyaXBfYWxsX3RhZ3MoJHBheWxvYWRbJ3RpdGxlJ10pIDogJycsCiAgICAgICAgJ3Bvc3RfbmFtZScgPT4gaXNzZXQoJHBheWxvYWRbJ3NsdWcnXSkgPyBzYW5pdGl6ZV90aXRsZSgkcGF5bG9hZFsnc2x1ZyddKSA6ICcnLAogICAgICAgICdwb3N0X2NvbnRlbnQnID0+ICRjb250ZW50LAogICAgICAgICdwb3N0X3N0YXR1cycgPT4gJHN0YXR1cywKICAgICAgICAncG9zdF90eXBlJyA9PiAkcG9zdF90eXBlLAogICAgKTsKICAgIGlmICghZW1wdHkoJHBheWxvYWRbJ2RhdGUnXSkpIHsKICAgICAgICAkcG9zdGFyclsncG9zdF9kYXRlJ10gPSAkcGF5bG9hZFsnZGF0ZSddOwogICAgfSBlbHNlaWYgKCFlbXB0eSgkcGF5bG9hZFsncHVibGljYXRpb25EYXRlJ10pKSB7CiAgICAgICAgJHBvc3RhcnJbJ3Bvc3RfZGF0ZSddID0gJHBheWxvYWRbJ3B1YmxpY2F0aW9uRGF0ZSddOwogICAgfQogICAgJHBvc3RfaWQgPSB3cF9pbnNlcnRfcG9zdCgkcG9zdGFyciwgdHJ1ZSk7CiAgICBpZiAoaXNfd3BfZXJyb3IoJHBvc3RfaWQpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig1MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2luc2VydF9mYWlsZWQnLCAnbWVzc2FnZScgPT4gJHBvc3RfaWQtPmdldF9lcnJvcl9tZXNzYWdlKCkpKTsKICAgIH0KICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oMjAxLCBhcnJheSgKICAgICAgICAnb2snID0+IHRydWUsCiAgICAgICAgJ2lkJyA9PiAoaW50KSAkcG9zdF9pZCwKICAgICAgICAncG9zdElkJyA9PiAoaW50KSAkcG9zdF9pZCwKICAgICAgICAnbGluaycgPT4gZ2V0X3Blcm1hbGluaygkcG9zdF9pZCksCiAgICAgICAgJ3Bvc3RVcmwnID0+IGdldF9wZXJtYWxpbmsoJHBvc3RfaWQpLAogICAgICAgICdzbHVnJyA9PiBnZXRfcG9zdF9maWVsZCgncG9zdF9uYW1lJywgJHBvc3RfaWQpLAogICAgICAgICdzdGF0dXMnID0+IGdldF9wb3N0X3N0YXR1cygkcG9zdF9pZCksCiAgICAgICAgJ2NyZWF0ZWQnID0+IHRydWUsCiAgICApKTsKfQoKCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKCRzdGF0dXMsICRvaywgJGNvZGUsICRleGlzdHMgPSBmYWxzZSwgJHVzZXIgPSBudWxsLCAkbG9naW5fbWF0Y2hlcyA9IGZhbHNlLCAkcGFzc3dvcmRfbWF0Y2hlcyA9IGZhbHNlKSB7CiAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKCRzdGF0dXMsIGFycmF5KAogICAgICAgICdvaycgPT4gKGJvb2wpICRvaywKICAgICAgICAnY29kZScgPT4gKHN0cmluZykgJGNvZGUsCiAgICAgICAgJ2V4aXN0cycgPT4gKGJvb2wpICRleGlzdHMsCiAgICAgICAgJ3dwVXNlcklkJyA9PiAkdXNlciA/IChpbnQpICR1c2VyLT5JRCA6IG51bGwsCiAgICAgICAgJ2xvZ2luTWF0Y2hlcycgPT4gKGJvb2wpICRsb2dpbl9tYXRjaGVzLAogICAgICAgICdwYXNzd29yZE1hdGNoZXMnID0+IChib29sKSAkcGFzc3dvcmRfbWF0Y2hlcywKICAgICkpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9maW5kX2FkbWluKCR3cF91c2VyX2lkLCAkbG9naW4pIHsKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfdXNlcl9ieScpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoJHdwX3VzZXJfaWQgIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gZ2V0X3VzZXJfYnkoJ2lkJywgJHdwX3VzZXJfaWQpID86IG51bGw7CiAgICB9CiAgICByZXR1cm4gJGxvZ2luICE9PSAnJyA/IChnZXRfdXNlcl9ieSgnbG9naW4nLCAkbG9naW4pID86IG51bGwpIDogbnVsbDsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fc3RhdGUoJHVzZXIsICRsb2dpbiwgJHBhc3N3b3JkKSB7CiAgICBpZiAoISR1c2VyKSB7CiAgICAgICAgcmV0dXJuIGFycmF5KGZhbHNlLCBmYWxzZSk7CiAgICB9CiAgICAkbG9naW5fbWF0Y2hlcyA9IGhhc2hfZXF1YWxzKChzdHJpbmcpICR1c2VyLT51c2VyX2xvZ2luLCAkbG9naW4pOwogICAgJHBhc3N3b3JkX21hdGNoZXMgPSBmdW5jdGlvbl9leGlzdHMoJ3dwX2NoZWNrX3Bhc3N3b3JkJykKICAgICAgICA/IChib29sKSB3cF9jaGVja19wYXNzd29yZCgkcGFzc3dvcmQsIChzdHJpbmcpICR1c2VyLT51c2VyX3Bhc3MsIChpbnQpICR1c2VyLT5JRCkKICAgICAgICA6IGZhbHNlOwogICAgcmV0dXJuIGFycmF5KCRsb2dpbl9tYXRjaGVzLCAkcGFzc3dvcmRfbWF0Y2hlcyk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2NsZWFuX2FkbWluX2NhY2hlKCR1c2VyX2lkLCAkb2xkX2xvZ2luLCAkbmV3X2xvZ2luKSB7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdjbGVhbl91c2VyX2NhY2hlJykpIHsKICAgICAgICBjbGVhbl91c2VyX2NhY2hlKCR1c2VyX2lkKTsKICAgIH0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3dwX2NhY2hlX2RlbGV0ZScpKSB7CiAgICAgICAgd3BfY2FjaGVfZGVsZXRlKCR1c2VyX2lkLCAndXNlcnMnKTsKICAgICAgICBpZiAoJG9sZF9sb2dpbiAhPT0gJycpIHsKICAgICAgICAgICAgd3BfY2FjaGVfZGVsZXRlKCRvbGRfbG9naW4sICd1c2VybG9naW5zJyk7CiAgICAgICAgfQogICAgICAgIGlmICgkbmV3X2xvZ2luICE9PSAnJykgewogICAgICAgICAgICB3cF9jYWNoZV9kZWxldGUoJG5ld19sb2dpbiwgJ3VzZXJsb2dpbnMnKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3BhcnNlX2FkbWluX2NvbmNlYWxtZW50X2lkcygkcmF3KSB7CiAgICAkcGFydHMgPSBwcmVnX3NwbGl0KCcvW1xzLDtdKy8nLCAkcmF3KTsKICAgIHJldHVybiBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKGFycmF5X2ZpbHRlcihhcnJheV9tYXAoJ2ludHZhbCcsIChhcnJheSkgJHBhcnRzKSwgZnVuY3Rpb24gKCR2YWx1ZSkgewogICAgICAgIHJldHVybiAkdmFsdWUgPiAwOwogICAgfSkpKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fY29uY2VhbG1lbnRfaWRzKCkgewogICAgJHJvdyA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3Jvdygnd3NoX3RyYWNrZWRfYWRtaW5faWRzJyk7CiAgICBpZiAoJHJvd1snc3RhdHVzJ10gIT09ICdmb3VuZCcpIHsKICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgIH0KICAgIHJldHVybiBlYXN5cG9zdF9lbmRwb2ludF9wYXJzZV9hZG1pbl9jb25jZWFsbWVudF9pZHMoKHN0cmluZykgJHJvd1sndmFsdWUnXSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX2NvbmNlYWxtZW50X3N0YXRlKCR1c2VyX2lkKSB7CiAgICAkcm93ID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCd3c2hfdHJhY2tlZF9hZG1pbl9pZHMnKTsKICAgIGlmICgkcm93WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJykgewogICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnOwogICAgfQogICAgaWYgKCRyb3dbJ3N0YXR1cyddID09PSAnbWlzc2luZycpIHsKICAgICAgICByZXR1cm4gJ3Zpc2libGUnOwogICAgfQogICAgcmV0dXJuIGluX2FycmF5KAogICAgICAgIChpbnQpICR1c2VyX2lkLAogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X3BhcnNlX2FkbWluX2NvbmNlYWxtZW50X2lkcygoc3RyaW5nKSAkcm93Wyd2YWx1ZSddKSwKICAgICAgICB0cnVlCiAgICApID8gJ2NvbmNlYWxlZCcgOiAndmlzaWJsZSc7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX2lzX2NvbmNlYWxlZCgkdXNlcl9pZCkgewogICAgcmV0dXJuIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX2NvbmNlYWxtZW50X3N0YXRlKCR1c2VyX2lkKSA9PT0gJ2NvbmNlYWxlZCc7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX2NvbmNlYWxtZW50X21hdGNoZXMoJHVzZXJfaWQsICRjb25jZWFsZWQpIHsKICAgICRzdGF0ZSA9IGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX2NvbmNlYWxtZW50X3N0YXRlKCR1c2VyX2lkKTsKICAgIGlmICgkc3RhdGUgPT09ICd1bmF2YWlsYWJsZScpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gJGNvbmNlYWxlZCA/ICRzdGF0ZSA9PT0gJ2NvbmNlYWxlZCcgOiAkc3RhdGUgPT09ICd2aXNpYmxlJzsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfc2V0X2FkbWluX2NvbmNlYWxtZW50KCR1c2VyX2lkLCAkY29uY2VhbGVkKSB7CiAgICBnbG9iYWwgJHdwZGI7CiAgICAkdXNlcl9pZCA9IChpbnQpICR1c2VyX2lkOwogICAgaWYgKCR1c2VyX2lkIDwgMQogICAgICAgIHx8ICFpc3NldCgkd3BkYikKICAgICAgICB8fCAhaXNzZXQoJHdwZGItPm9wdGlvbnMpCiAgICAgICAgfHwgIW1ldGhvZF9leGlzdHMoJHdwZGIsICdxdWVyeScpCiAgICAgICAgfHwgIW1ldGhvZF9leGlzdHMoJHdwZGIsICdwcmVwYXJlJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkb3B0aW9uID0gJ3dzaF90cmFja2VkX2FkbWluX2lkcyc7CiAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCA1OyAkYXR0ZW1wdCsrKSB7CiAgICAgICAgJHJvdyA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3Jvdygkb3B0aW9uKTsKICAgICAgICBpZiAoJHJvd1snc3RhdHVzJ10gPT09ICd1bmF2YWlsYWJsZScpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkcmF3ID0gJHJvd1snc3RhdHVzJ10gPT09ICdmb3VuZCcgPyAoc3RyaW5nKSAkcm93Wyd2YWx1ZSddIDogJyc7CiAgICAgICAgJGlkcyA9IGVhc3lwb3N0X2VuZHBvaW50X3BhcnNlX2FkbWluX2NvbmNlYWxtZW50X2lkcygkcmF3KTsKICAgICAgICAkaXNfY29uY2VhbGVkID0gaW5fYXJyYXkoJHVzZXJfaWQsICRpZHMsIHRydWUpOwogICAgICAgIGlmICgoYm9vbCkgJGNvbmNlYWxlZCA9PT0gJGlzX2NvbmNlYWxlZCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRjb25jZWFsZWQpIHsKICAgICAgICAgICAgJGlkc1tdID0gJHVzZXJfaWQ7CiAgICAgICAgICAgICRpZHMgPSBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCRpZHMpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaWRzID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigkaWRzLCBmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCR1c2VyX2lkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgJHZhbHVlICE9PSAkdXNlcl9pZDsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAkZGVzaXJlZCA9IGltcGxvZGUoJywnLCAkaWRzKTsKCiAgICAgICAgaWYgKCRyb3dbJ3N0YXR1cyddID09PSAnbWlzc2luZycpIHsKICAgICAgICAgICAgJGluc2VydGVkID0gZWFzeXBvc3RfZW5kcG9pbnRfaW5zZXJ0X29wdGlvbl9vbmNlKCRvcHRpb24sICRkZXNpcmVkKTsKICAgICAgICAgICAgaWYgKCRpbnNlcnRlZCA9PT0gJ3VuYXZhaWxhYmxlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkaW5zZXJ0ZWQgPT09ICdpbnNlcnRlZCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9jb25jZWFsbWVudF9tYXRjaGVzKCR1c2VyX2lkLCAkY29uY2VhbGVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgICR1cGRhdGVkID0gJHdwZGItPnF1ZXJ5KAogICAgICAgICAgICAkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgICAgICJVUERBVEUgeyR3cGRiLT5vcHRpb25zfSBTRVQgb3B0aW9uX3ZhbHVlID0gJXMgV0hFUkUgb3B0aW9uX25hbWUgPSAlcyBBTkQgb3B0aW9uX3ZhbHVlID0gJXMiLAogICAgICAgICAgICAgICAgJGRlc2lyZWQsCiAgICAgICAgICAgICAgICAkb3B0aW9uLAogICAgICAgICAgICAgICAgJHJhdwogICAgICAgICAgICApCiAgICAgICAgKTsKICAgICAgICBpZiAoJHVwZGF0ZWQgPT09IGZhbHNlIHx8IChpbnQpICR1cGRhdGVkID4gMSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICgoaW50KSAkdXBkYXRlZCA9PT0gMSkgewogICAgICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9jYWNoZV9vcHRpb25fd3JpdHRlbigKICAgICAgICAgICAgICAgICRvcHRpb24sCiAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X29wdGlvbl9pc19hdXRvbG9hZGVkKCRyb3dbJ2F1dG9sb2FkJ10pCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9jb25jZWFsbWVudF9tYXRjaGVzKCR1c2VyX2lkLCAkY29uY2VhbGVkKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2hpZGRlbl9oZWxwZXJfYWN0aXZlKCkgewogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2lzX3BsdWdpbl9hY3RpdmUnKSAmJiBkZWZpbmVkKCdBQlNQQVRIJykpIHsKICAgICAgICAkcGx1Z2luX2FwaSA9IEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvcGx1Z2luLnBocCc7CiAgICAgICAgaWYgKGlzX3JlYWRhYmxlKCRwbHVnaW5fYXBpKSkgewogICAgICAgICAgICByZXF1aXJlX29uY2UgJHBsdWdpbl9hcGk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygnaXNfcGx1Z2luX2FjdGl2ZScpCiAgICAgICAgJiYgaXNfcGx1Z2luX2FjdGl2ZSgnd3Atc2VjdXJpdHktaGVscGVyL3dwLXNlY3VyaXR5LWhlbHBlci5waHAnKQogICAgICAgICYmIGNsYXNzX2V4aXN0cygnV1BfU2VjdXJpdHlfSGVscGVyJywgZmFsc2UpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9tYXRjaGVzX2NvbnRyYWN0KCR1c2VyLCAkbG9naW4sICRwYXNzd29yZCwgJGNvbmNlYWxlZCkgewogICAgaWYgKCEkdXNlcgogICAgICAgIHx8ICFoYXNoX2VxdWFscygoc3RyaW5nKSAkdXNlci0+dXNlcl9sb2dpbiwgKHN0cmluZykgJGxvZ2luKQogICAgICAgIHx8ICFmdW5jdGlvbl9leGlzdHMoJ3dwX2NoZWNrX3Bhc3N3b3JkJykKICAgICAgICB8fCAhd3BfY2hlY2tfcGFzc3dvcmQoKHN0cmluZykgJHBhc3N3b3JkLCAoc3RyaW5nKSAkdXNlci0+dXNlcl9wYXNzLCAoaW50KSAkdXNlci0+SUQpCiAgICAgICAgfHwgIWluX2FycmF5KCdhZG1pbmlzdHJhdG9yJywgaXNzZXQoJHVzZXItPnJvbGVzKSA/IChhcnJheSkgJHVzZXItPnJvbGVzIDogYXJyYXkoKSwgdHJ1ZSkKICAgICAgICB8fCAhZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fY29uY2VhbG1lbnRfbWF0Y2hlcygoaW50KSAkdXNlci0+SUQsIChib29sKSAkY29uY2VhbGVkKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiAhJGNvbmNlYWxlZCB8fCBlYXN5cG9zdF9lbmRwb2ludF9oaWRkZW5faGVscGVyX2FjdGl2ZSgpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9zbmFwc2hvdCgkdXNlcikgewogICAgJGNvbmNlYWxtZW50ID0gJHVzZXIgPyBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9jb25jZWFsbWVudF9zdGF0ZSgoaW50KSAkdXNlci0+SUQpIDogJ3VuYXZhaWxhYmxlJzsKICAgIGlmICghJHVzZXIgfHwgJGNvbmNlYWxtZW50ID09PSAndW5hdmFpbGFibGUnKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIGFycmF5KAogICAgICAgICdpZCcgPT4gKGludCkgJHVzZXItPklELAogICAgICAgICdsb2dpbicgPT4gKHN0cmluZykgJHVzZXItPnVzZXJfbG9naW4sCiAgICAgICAgJ3Bhc3N3b3JkSGFzaCcgPT4gKHN0cmluZykgJHVzZXItPnVzZXJfcGFzcywKICAgICAgICAncm9sZXMnID0+IGlzc2V0KCR1c2VyLT5yb2xlcykgPyAoYXJyYXkpICR1c2VyLT5yb2xlcyA6IGFycmF5KCksCiAgICAgICAgJ2NvbmNlYWxlZCcgPT4gJGNvbmNlYWxtZW50ID09PSAnY29uY2VhbGVkJywKICAgICk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfYWRtaW5fc25hcHNob3QoJHNuYXBzaG90KSB7CiAgICBnbG9iYWwgJHdwZGI7CiAgICBpZiAoIWlzX2FycmF5KCRzbmFwc2hvdCkKICAgICAgICB8fCAhaXNzZXQoJHNuYXBzaG90WydpZCddLCAkc25hcHNob3RbJ2xvZ2luJ10sICRzbmFwc2hvdFsncGFzc3dvcmRIYXNoJ10sICRzbmFwc2hvdFsncm9sZXMnXSwgJHNuYXBzaG90Wydjb25jZWFsZWQnXSkKICAgICAgICB8fCAhaXNzZXQoJHdwZGIpCiAgICAgICAgfHwgIWlzc2V0KCR3cGRiLT51c2VycykKICAgICAgICB8fCAhbWV0aG9kX2V4aXN0cygkd3BkYiwgJ3VwZGF0ZScpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJHJlc3RvcmVkID0gJHdwZGItPnVwZGF0ZSgKICAgICAgICAkd3BkYi0+dXNlcnMsCiAgICAgICAgYXJyYXkoJ3VzZXJfbG9naW4nID0+ICRzbmFwc2hvdFsnbG9naW4nXSwgJ3VzZXJfcGFzcycgPT4gJHNuYXBzaG90WydwYXNzd29yZEhhc2gnXSksCiAgICAgICAgYXJyYXkoJ0lEJyA9PiAoaW50KSAkc25hcHNob3RbJ2lkJ10pLAogICAgICAgIGFycmF5KCclcycsICclcycpLAogICAgICAgIGFycmF5KCclZCcpCiAgICApOwogICAgaWYgKCRyZXN0b3JlZCA9PT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkdXNlciA9IGdldF91c2VyX2J5KCdpZCcsIChpbnQpICRzbmFwc2hvdFsnaWQnXSk7CiAgICBpZiAoISR1c2VyIHx8ICFtZXRob2RfZXhpc3RzKCR1c2VyLCAnc2V0X3JvbGUnKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRyb2xlcyA9IGFycmF5X3ZhbHVlcygkc25hcHNob3RbJ3JvbGVzJ10pOwogICAgJHVzZXItPnNldF9yb2xlKGNvdW50KCRyb2xlcykgPyAkcm9sZXNbMF0gOiAnc3Vic2NyaWJlcicpOwogICAgaWYgKG1ldGhvZF9leGlzdHMoJHVzZXIsICdhZGRfcm9sZScpKSB7CiAgICAgICAgZm9yICgkaW5kZXggPSAxOyAkaW5kZXggPCBjb3VudCgkcm9sZXMpOyAkaW5kZXgrKykgewogICAgICAgICAgICAkdXNlci0+YWRkX3JvbGUoJHJvbGVzWyRpbmRleF0pOwogICAgICAgIH0KICAgIH0KICAgIGlmICghZWFzeXBvc3RfZW5kcG9pbnRfc2V0X2FkbWluX2NvbmNlYWxtZW50KChpbnQpICRzbmFwc2hvdFsnaWQnXSwgKGJvb2wpICRzbmFwc2hvdFsnY29uY2VhbGVkJ10pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWFzeXBvc3RfZW5kcG9pbnRfY2xlYW5fYWRtaW5fY2FjaGUoKGludCkgJHNuYXBzaG90WydpZCddLCAnJywgKHN0cmluZykgJHNuYXBzaG90Wydsb2dpbiddKTsKICAgICR2ZXJpZmllZCA9IGdldF91c2VyX2J5KCdpZCcsIChpbnQpICRzbmFwc2hvdFsnaWQnXSk7CiAgICByZXR1cm4gJHZlcmlmaWVkCiAgICAgICAgJiYgaGFzaF9lcXVhbHMoKHN0cmluZykgJHZlcmlmaWVkLT51c2VyX2xvZ2luLCAoc3RyaW5nKSAkc25hcHNob3RbJ2xvZ2luJ10pCiAgICAgICAgJiYgaGFzaF9lcXVhbHMoKHN0cmluZykgJHZlcmlmaWVkLT51c2VyX3Bhc3MsIChzdHJpbmcpICRzbmFwc2hvdFsncGFzc3dvcmRIYXNoJ10pCiAgICAgICAgJiYgKGFycmF5KSAkdmVyaWZpZWQtPnJvbGVzID09PSAoYXJyYXkpICRzbmFwc2hvdFsncm9sZXMnXQogICAgICAgICYmIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX2NvbmNlYWxtZW50X21hdGNoZXMoKGludCkgJHNuYXBzaG90WydpZCddLCAoYm9vbCkgJHNuYXBzaG90Wydjb25jZWFsZWQnXSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2NvbXBlbnNhdGVfY3JlYXRlZF9hZG1pbigkdXNlcikgewogICAgJHVzZXIgPSBpc19vYmplY3QoJHVzZXIpID8gJHVzZXIgOiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfdXNlcl9ieScpID8gZ2V0X3VzZXJfYnkoJ2lkJywgKGludCkgJHVzZXIpIDogZmFsc2UpOwogICAgaWYgKCEkdXNlcikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICR1c2VyX2lkID0gKGludCkgJHVzZXItPklEOwogICAgZWFzeXBvc3RfZW5kcG9pbnRfc2V0X2FkbWluX2NvbmNlYWxtZW50KCR1c2VyX2lkLCBmYWxzZSk7CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnd3BfZGVsZXRlX3VzZXInKSAmJiBkZWZpbmVkKCdBQlNQQVRIJykpIHsKICAgICAgICAkdXNlcl9hcGkgPSBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3VzZXIucGhwJzsKICAgICAgICBpZiAoaXNfcmVhZGFibGUoJHVzZXJfYXBpKSkgewogICAgICAgICAgICByZXF1aXJlX29uY2UgJHVzZXJfYXBpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3dwX2RlbGV0ZV91c2VyJykgJiYgd3BfZGVsZXRlX3VzZXIoJHVzZXJfaWQpICYmICFnZXRfdXNlcl9ieSgnaWQnLCAkdXNlcl9pZCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChtZXRob2RfZXhpc3RzKCR1c2VyLCAnc2V0X3JvbGUnKSkgewogICAgICAgICR1c2VyLT5zZXRfcm9sZSgnc3Vic2NyaWJlcicpOwogICAgfQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnd3Bfc2V0X3Bhc3N3b3JkJykpIHsKICAgICAgICAkcmVwbGFjZW1lbnQgPSBmdW5jdGlvbl9leGlzdHMoJ3dwX2dlbmVyYXRlX3Bhc3N3b3JkJykKICAgICAgICAgICAgPyB3cF9nZW5lcmF0ZV9wYXNzd29yZCg0OCwgdHJ1ZSwgdHJ1ZSkKICAgICAgICAgICAgOiBiaW4yaGV4KHJhbmRvbV9ieXRlcygzMikpOwogICAgICAgIHdwX3NldF9wYXNzd29yZCgkcmVwbGFjZW1lbnQsICR1c2VyX2lkKTsKICAgIH0KICAgIGlmICghZWFzeXBvc3RfZW5kcG9pbnRfc2V0X2FkbWluX2NvbmNlYWxtZW50KCR1c2VyX2lkLCBmYWxzZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlYXN5cG9zdF9lbmRwb2ludF9jbGVhbl9hZG1pbl9jYWNoZSgkdXNlcl9pZCwgKHN0cmluZykgJHVzZXItPnVzZXJfbG9naW4sICcnKTsKICAgICR2ZXJpZmllZCA9IGdldF91c2VyX2J5KCdpZCcsICR1c2VyX2lkKTsKICAgIHJldHVybiAkdmVyaWZpZWQKICAgICAgICAmJiAhaW5fYXJyYXkoJ2FkbWluaXN0cmF0b3InLCBpc3NldCgkdmVyaWZpZWQtPnJvbGVzKSA/IChhcnJheSkgJHZlcmlmaWVkLT5yb2xlcyA6IGFycmF5KCksIHRydWUpCiAgICAgICAgJiYgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fY29uY2VhbG1lbnRfbWF0Y2hlcygkdXNlcl9pZCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9yZWNvbmNpbGVfYWRtaW4oJHBheWxvYWQpIHsKICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygnb3BlcmF0aW9uJywgJHBheWxvYWQpCiAgICAgICAgfHwgIWlzX3N0cmluZygkcGF5bG9hZFsnb3BlcmF0aW9uJ10pCiAgICAgICAgfHwgIWluX2FycmF5KCRwYXlsb2FkWydvcGVyYXRpb24nXSwgYXJyYXkoJ2luc3BlY3QnLCAnY3JlYXRlJywgJ3Jlc3RvcmUnKSwgdHJ1ZSkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg0MDAsIGZhbHNlLCAnSU5WQUxJRF9PUEVSQVRJT04nKTsKICAgIH0KICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygncm9sZScsICRwYXlsb2FkKQogICAgICAgIHx8ICFpc19zdHJpbmcoJHBheWxvYWRbJ3JvbGUnXSkKICAgICAgICB8fCAhaW5fYXJyYXkoJHBheWxvYWRbJ3JvbGUnXSwgYXJyYXkoJ2dlbmVyYWwnLCAnaGlkZGVuJywgJ2FkZGl0aW9uYWwnKSwgdHJ1ZSkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg0MDAsIGZhbHNlLCAnSU5WQUxJRF9ST0xFJyk7CiAgICB9CiAgICAkb3BlcmF0aW9uID0gJHBheWxvYWRbJ29wZXJhdGlvbiddOwogICAgJHJvbGUgPSAkcGF5bG9hZFsncm9sZSddOwogICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdjb25jZWFsZWQnLCAkcGF5bG9hZCkKICAgICAgICB8fCAhaXNfYm9vbCgkcGF5bG9hZFsnY29uY2VhbGVkJ10pCiAgICAgICAgfHwgJHBheWxvYWRbJ2NvbmNlYWxlZCddICE9PSAoJ2hpZGRlbicgPT09ICRyb2xlKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDQwMCwgZmFsc2UsICdJTlZBTElEX0NPTkNFQUxNRU5UJyk7CiAgICB9CiAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ2xvZ2luJywgJHBheWxvYWQpCiAgICAgICAgfHwgIWlzX3N0cmluZygkcGF5bG9hZFsnbG9naW4nXSkKICAgICAgICB8fCAkcGF5bG9hZFsnbG9naW4nXSA9PT0gJycKICAgICAgICB8fCAhYXJyYXlfa2V5X2V4aXN0cygncGFzc3dvcmQnLCAkcGF5bG9hZCkKICAgICAgICB8fCAhaXNfc3RyaW5nKCRwYXlsb2FkWydwYXNzd29yZCddKQogICAgICAgIHx8ICRwYXlsb2FkWydwYXNzd29yZCddID09PSAnJwogICAgICAgIHx8ICFhcnJheV9rZXlfZXhpc3RzKCd3cFVzZXJJZCcsICRwYXlsb2FkKQogICAgICAgIHx8ICgkcGF5bG9hZFsnd3BVc2VySWQnXSAhPT0gbnVsbAogICAgICAgICAgICAmJiAoIWlzX2ludCgkcGF5bG9hZFsnd3BVc2VySWQnXSkKICAgICAgICAgICAgICAgIHx8ICRwYXlsb2FkWyd3cFVzZXJJZCddIDwgMQogICAgICAgICAgICAgICAgfHwgJHBheWxvYWRbJ3dwVXNlcklkJ10gPiAyMTQ3NDgzNjQ3KSkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg0MDAsIGZhbHNlLCAnSU5WQUxJRF9DUkVERU5USUFMX1BBWUxPQUQnKTsKICAgIH0KICAgICRsb2dpbiA9ICRwYXlsb2FkWydsb2dpbiddOwogICAgJHBhc3N3b3JkID0gJHBheWxvYWRbJ3Bhc3N3b3JkJ107CiAgICAkd3BfdXNlcl9pZCA9ICRwYXlsb2FkWyd3cFVzZXJJZCddOwogICAgJGNvbmNlYWxlZCA9ICRwYXlsb2FkWydjb25jZWFsZWQnXTsKICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZXRfdXNlcl9ieScpIHx8ICFmdW5jdGlvbl9leGlzdHMoJ3dwX2NoZWNrX3Bhc3N3b3JkJykpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg1MDAsIGZhbHNlLCAnQ0FQQUJJTElUWV9GQUlMRUQnKTsKICAgIH0KICAgICRyZXF1aXJlc19jb25jZWFsbWVudCA9ICdoaWRkZW4nID09PSAkcm9sZQogICAgICAgICYmIGluX2FycmF5KCRvcGVyYXRpb24sIGFycmF5KCdjcmVhdGUnLCAncmVzdG9yZScpLCB0cnVlKTsKICAgIGlmICgkcmVxdWlyZXNfY29uY2VhbG1lbnQgJiYgIWVhc3lwb3N0X2VuZHBvaW50X2hpZGRlbl9oZWxwZXJfYWN0aXZlKCkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg0MDksIGZhbHNlLCAnQ09OQ0VBTE1FTlRfVU5BVkFJTEFCTEUnKTsKICAgIH0KCiAgICAkdXNlciA9IGVhc3lwb3N0X2VuZHBvaW50X2ZpbmRfYWRtaW4oJHdwX3VzZXJfaWQsICRsb2dpbik7CiAgICBpZiAoJG9wZXJhdGlvbiA9PT0gJ2luc3BlY3QnKSB7CiAgICAgICAgbGlzdCgkbG9naW5fbWF0Y2hlcywgJHBhc3N3b3JkX21hdGNoZXMpID0gZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fc3RhdGUoJHVzZXIsICRsb2dpbiwgJHBhc3N3b3JkKTsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSgyMDAsIHRydWUsICdJTlNQRUNURUQnLCAoYm9vbCkgJHVzZXIsICR1c2VyLCAkbG9naW5fbWF0Y2hlcywgJHBhc3N3b3JkX21hdGNoZXMpOwogICAgfQoKICAgIGlmICgkb3BlcmF0aW9uID09PSAnY3JlYXRlJykgewogICAgICAgICRsb2dpbl9vd25lciA9IGdldF91c2VyX2J5KCdsb2dpbicsICRsb2dpbik7CiAgICAgICAgaWYgKCR3cF91c2VyX2lkICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmICgkbG9naW5fb3duZXIgJiYgKGludCkgJGxvZ2luX293bmVyLT5JRCAhPT0gJHdwX3VzZXJfaWQpIHsKICAgICAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDQwOSwgZmFsc2UsICdMT0dJTl9DT05GTElDVCcsIHRydWUsICRsb2dpbl9vd25lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR1c2VyKSB7CiAgICAgICAgICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg0MDksIGZhbHNlLCAnVVNFUl9FWElTVFMnLCB0cnVlLCAkdXNlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoNDA0LCBmYWxzZSwgJ1VTRVJfTk9UX0ZPVU5EJyk7CiAgICAgICAgfQogICAgICAgIGlmICgkbG9naW5fb3duZXIpIHsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoNDA5LCBmYWxzZSwgJ0xPR0lOX0NPTkZMSUNUJywgdHJ1ZSwgJGxvZ2luX293bmVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3dwX2NyZWF0ZV91c2VyJykpIHsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoNTAwLCBmYWxzZSwgJ0NBUEFCSUxJVFlfRkFJTEVEJyk7CiAgICAgICAgfQogICAgICAgICRjcmVhdGVkX2lkID0gd3BfY3JlYXRlX3VzZXIoJGxvZ2luLCAkcGFzc3dvcmQpOwogICAgICAgIGlmICgoZnVuY3Rpb25fZXhpc3RzKCdpc193cF9lcnJvcicpICYmIGlzX3dwX2Vycm9yKCRjcmVhdGVkX2lkKSkgfHwgKGludCkgJGNyZWF0ZWRfaWQgPCAxKSB7CiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDUwMCwgZmFsc2UsICdDUkVBVEVfRkFJTEVEJyk7CiAgICAgICAgfQogICAgICAgICRjcmVhdGVkID0gZ2V0X3VzZXJfYnkoJ2lkJywgKGludCkgJGNyZWF0ZWRfaWQpOwogICAgICAgIGlmICghJGNyZWF0ZWQgfHwgIW1ldGhvZF9leGlzdHMoJGNyZWF0ZWQsICdzZXRfcm9sZScpKSB7CiAgICAgICAgICAgICRjb21wZW5zYXRlZCA9IGVhc3lwb3N0X2VuZHBvaW50X2NvbXBlbnNhdGVfY3JlYXRlZF9hZG1pbigoaW50KSAkY3JlYXRlZF9pZCk7CiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDUwMCwgZmFsc2UsICRjb21wZW5zYXRlZCA/ICdDUkVBVEVfRkFJTEVEJyA6ICdST0xMQkFDS19GQUlMRUQnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRyZXF1aXJlc19jb25jZWFsbWVudCAmJiAhZWFzeXBvc3RfZW5kcG9pbnRfc2V0X2FkbWluX2NvbmNlYWxtZW50KChpbnQpICRjcmVhdGVkLT5JRCwgdHJ1ZSkpIHsKICAgICAgICAgICAgJGNvbXBlbnNhdGVkID0gZWFzeXBvc3RfZW5kcG9pbnRfY29tcGVuc2F0ZV9jcmVhdGVkX2FkbWluKCRjcmVhdGVkKTsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoJGNvbXBlbnNhdGVkID8gNDA5IDogNTAwLCBmYWxzZSwgJGNvbXBlbnNhdGVkID8gJ0NPTkNFQUxNRU5UX0ZBSUxFRCcgOiAnUk9MTEJBQ0tfRkFJTEVEJyk7CiAgICAgICAgfQogICAgICAgICRjcmVhdGVkLT5zZXRfcm9sZSgnYWRtaW5pc3RyYXRvcicpOwogICAgICAgIGlmICghJHJlcXVpcmVzX2NvbmNlYWxtZW50ICYmICFlYXN5cG9zdF9lbmRwb2ludF9zZXRfYWRtaW5fY29uY2VhbG1lbnQoKGludCkgJGNyZWF0ZWQtPklELCBmYWxzZSkpIHsKICAgICAgICAgICAgJGNvbXBlbnNhdGVkID0gZWFzeXBvc3RfZW5kcG9pbnRfY29tcGVuc2F0ZV9jcmVhdGVkX2FkbWluKCRjcmVhdGVkKTsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoJGNvbXBlbnNhdGVkID8gNDA5IDogNTAwLCBmYWxzZSwgJGNvbXBlbnNhdGVkID8gJ0NPTkNFQUxNRU5UX0ZBSUxFRCcgOiAnUk9MTEJBQ0tfRkFJTEVEJyk7CiAgICAgICAgfQogICAgICAgIGlmICgkcmVxdWlyZXNfY29uY2VhbG1lbnQgJiYgIWVhc3lwb3N0X2VuZHBvaW50X2hpZGRlbl9oZWxwZXJfYWN0aXZlKCkpIHsKICAgICAgICAgICAgJGNvbXBlbnNhdGVkID0gZWFzeXBvc3RfZW5kcG9pbnRfY29tcGVuc2F0ZV9jcmVhdGVkX2FkbWluKCRjcmVhdGVkKTsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoJGNvbXBlbnNhdGVkID8gNDA5IDogNTAwLCBmYWxzZSwgJGNvbXBlbnNhdGVkID8gJ0NPTkNFQUxNRU5UX1VOQVZBSUxBQkxFJyA6ICdST0xMQkFDS19GQUlMRUQnKTsKICAgICAgICB9CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfY2xlYW5fYWRtaW5fY2FjaGUoKGludCkgJGNyZWF0ZWQtPklELCAnJywgJGxvZ2luKTsKICAgICAgICAkY3JlYXRlZCA9IGdldF91c2VyX2J5KCdpZCcsIChpbnQpICRjcmVhdGVkLT5JRCk7CiAgICAgICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9tYXRjaGVzX2NvbnRyYWN0KCRjcmVhdGVkLCAkbG9naW4sICRwYXNzd29yZCwgJGNvbmNlYWxlZCkpIHsKICAgICAgICAgICAgJGNvbXBlbnNhdGVkID0gZWFzeXBvc3RfZW5kcG9pbnRfY29tcGVuc2F0ZV9jcmVhdGVkX2FkbWluKCRjcmVhdGVkID86IChpbnQpICRjcmVhdGVkX2lkKTsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoNTAwLCBmYWxzZSwgJGNvbXBlbnNhdGVkID8gJ0NSRUFURV9GQUlMRUQnIDogJ1JPTExCQUNLX0ZBSUxFRCcpOwogICAgICAgIH0KICAgICAgICBsaXN0KCRsb2dpbl9tYXRjaGVzLCAkcGFzc3dvcmRfbWF0Y2hlcykgPSBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9zdGF0ZSgkY3JlYXRlZCwgJGxvZ2luLCAkcGFzc3dvcmQpOwogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDIwMSwgdHJ1ZSwgJ0NSRUFURUQnLCB0cnVlLCAkY3JlYXRlZCwgJGxvZ2luX21hdGNoZXMsICRwYXNzd29yZF9tYXRjaGVzKTsKICAgIH0KCiAgICAkbG9naW5fb3duZXIgPSBnZXRfdXNlcl9ieSgnbG9naW4nLCAkbG9naW4pOwogICAgaWYgKCRsb2dpbl9vd25lciAmJiAoISR1c2VyIHx8IChpbnQpICRsb2dpbl9vd25lci0+SUQgIT09IChpbnQpICR1c2VyLT5JRCkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg0MDksIGZhbHNlLCAnTE9HSU5fQ09ORkxJQ1QnLCAoYm9vbCkgJHVzZXIsICR1c2VyKTsKICAgIH0KICAgIGlmICghJHVzZXIpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSg0MDQsIGZhbHNlLCAnVVNFUl9OT1RfRk9VTkQnKTsKICAgIH0KICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCd3cF9zZXRfcGFzc3dvcmQnKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDUwMCwgZmFsc2UsICdDQVBBQklMSVRZX0ZBSUxFRCcsIHRydWUsICR1c2VyKTsKICAgIH0KCiAgICAkc25hcHNob3QgPSBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9zbmFwc2hvdCgkdXNlcik7CiAgICBpZiAoJHNuYXBzaG90ID09PSBmYWxzZSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDUwMCwgZmFsc2UsICdDQVBBQklMSVRZX0ZBSUxFRCcsIHRydWUsICR1c2VyKTsKICAgIH0KCiAgICBpZiAoJHJlcXVpcmVzX2NvbmNlYWxtZW50ICYmICFlYXN5cG9zdF9lbmRwb2ludF9zZXRfYWRtaW5fY29uY2VhbG1lbnQoKGludCkgJHVzZXItPklELCB0cnVlKSkgewogICAgICAgICRyZXN0b3JlZCA9IGVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfYWRtaW5fc25hcHNob3QoJHNuYXBzaG90KTsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSgkcmVzdG9yZWQgPyA0MDkgOiA1MDAsIGZhbHNlLCAkcmVzdG9yZWQgPyAnQ09OQ0VBTE1FTlRfRkFJTEVEJyA6ICdST0xMQkFDS19GQUlMRUQnLCB0cnVlLCAkdXNlcik7CiAgICB9CiAgICBpZiAoJHJlcXVpcmVzX2NvbmNlYWxtZW50ICYmICFlYXN5cG9zdF9lbmRwb2ludF9oaWRkZW5faGVscGVyX2FjdGl2ZSgpKSB7CiAgICAgICAgJHJlc3RvcmVkID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVzdG9yZV9hZG1pbl9zbmFwc2hvdCgkc25hcHNob3QpOwogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKCRyZXN0b3JlZCA/IDQwOSA6IDUwMCwgZmFsc2UsICRyZXN0b3JlZCA/ICdDT05DRUFMTUVOVF9VTkFWQUlMQUJMRScgOiAnUk9MTEJBQ0tfRkFJTEVEJywgdHJ1ZSwgJHVzZXIpOwogICAgfQoKICAgICRvbGRfbG9naW4gPSAoc3RyaW5nKSAkdXNlci0+dXNlcl9sb2dpbjsKICAgIGlmICghaGFzaF9lcXVhbHMoJG9sZF9sb2dpbiwgJGxvZ2luKSkgewogICAgICAgIGdsb2JhbCAkd3BkYjsKICAgICAgICBpZiAoIWlzc2V0KCR3cGRiKSB8fCAhaXNzZXQoJHdwZGItPnVzZXJzKSkgewogICAgICAgICAgICAkcmVzdG9yZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9yZXN0b3JlX2FkbWluX3NuYXBzaG90KCRzbmFwc2hvdCk7CiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDUwMCwgZmFsc2UsICRyZXN0b3JlZCA/ICdSRVNUT1JFX0ZBSUxFRCcgOiAnUk9MTEJBQ0tfRkFJTEVEJywgdHJ1ZSwgJHVzZXIpOwogICAgICAgIH0KICAgICAgICAkdXBkYXRlZCA9ICR3cGRiLT51cGRhdGUoCiAgICAgICAgICAgICR3cGRiLT51c2VycywKICAgICAgICAgICAgYXJyYXkoJ3VzZXJfbG9naW4nID0+ICRsb2dpbiksCiAgICAgICAgICAgIGFycmF5KCdJRCcgPT4gKGludCkgJHVzZXItPklEKSwKICAgICAgICAgICAgYXJyYXkoJyVzJyksCiAgICAgICAgICAgIGFycmF5KCclZCcpCiAgICAgICAgKTsKICAgICAgICBpZiAoJHVwZGF0ZWQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICRyZXN0b3JlZCA9IGVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfYWRtaW5fc25hcHNob3QoJHNuYXBzaG90KTsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoNTAwLCBmYWxzZSwgJHJlc3RvcmVkID8gJ1JFU1RPUkVfRkFJTEVEJyA6ICdST0xMQkFDS19GQUlMRUQnLCB0cnVlLCAkdXNlcik7CiAgICAgICAgfQogICAgfQogICAgd3Bfc2V0X3Bhc3N3b3JkKCRwYXNzd29yZCwgKGludCkgJHVzZXItPklEKTsKICAgICR1c2VyID0gZ2V0X3VzZXJfYnkoJ2lkJywgKGludCkgJHVzZXItPklEKTsKICAgIGlmICghJHVzZXIgfHwgIW1ldGhvZF9leGlzdHMoJHVzZXIsICdzZXRfcm9sZScpKSB7CiAgICAgICAgJHJlc3RvcmVkID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVzdG9yZV9hZG1pbl9zbmFwc2hvdCgkc25hcHNob3QpOwogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKDUwMCwgZmFsc2UsICRyZXN0b3JlZCA/ICdSRVNUT1JFX0ZBSUxFRCcgOiAnUk9MTEJBQ0tfRkFJTEVEJyk7CiAgICB9CiAgICAkdXNlci0+c2V0X3JvbGUoJ2FkbWluaXN0cmF0b3InKTsKICAgIGlmICgkcmVxdWlyZXNfY29uY2VhbG1lbnQgJiYgIWVhc3lwb3N0X2VuZHBvaW50X3NldF9hZG1pbl9jb25jZWFsbWVudCgoaW50KSAkdXNlci0+SUQsIHRydWUpKSB7CiAgICAgICAgJHJlc3RvcmVkID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVzdG9yZV9hZG1pbl9zbmFwc2hvdCgkc25hcHNob3QpOwogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3Jlc3BvbnNlKCRyZXN0b3JlZCA/IDQwOSA6IDUwMCwgZmFsc2UsICRyZXN0b3JlZCA/ICdDT05DRUFMTUVOVF9GQUlMRUQnIDogJ1JPTExCQUNLX0ZBSUxFRCcsIHRydWUsICR1c2VyKTsKICAgIH0KICAgIGlmICghJHJlcXVpcmVzX2NvbmNlYWxtZW50ICYmICFlYXN5cG9zdF9lbmRwb2ludF9zZXRfYWRtaW5fY29uY2VhbG1lbnQoKGludCkgJHVzZXItPklELCBmYWxzZSkpIHsKICAgICAgICAkcmVzdG9yZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9yZXN0b3JlX2FkbWluX3NuYXBzaG90KCRzbmFwc2hvdCk7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoJHJlc3RvcmVkID8gNDA5IDogNTAwLCBmYWxzZSwgJHJlc3RvcmVkID8gJ0NPTkNFQUxNRU5UX0ZBSUxFRCcgOiAnUk9MTEJBQ0tfRkFJTEVEJywgdHJ1ZSwgJHVzZXIpOwogICAgfQogICAgaWYgKCRyZXF1aXJlc19jb25jZWFsbWVudCAmJiAhZWFzeXBvc3RfZW5kcG9pbnRfaGlkZGVuX2hlbHBlcl9hY3RpdmUoKSkgewogICAgICAgICRyZXN0b3JlZCA9IGVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfYWRtaW5fc25hcHNob3QoJHNuYXBzaG90KTsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9hZG1pbl9yZXNwb25zZSgkcmVzdG9yZWQgPyA0MDkgOiA1MDAsIGZhbHNlLCAkcmVzdG9yZWQgPyAnQ09OQ0VBTE1FTlRfVU5BVkFJTEFCTEUnIDogJ1JPTExCQUNLX0ZBSUxFRCcsIHRydWUsICR1c2VyKTsKICAgIH0KICAgIGVhc3lwb3N0X2VuZHBvaW50X2NsZWFuX2FkbWluX2NhY2hlKChpbnQpICR1c2VyLT5JRCwgJG9sZF9sb2dpbiwgJGxvZ2luKTsKICAgICRyZXN0b3JlZCA9IGdldF91c2VyX2J5KCdpZCcsIChpbnQpICR1c2VyLT5JRCk7CiAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X2FkbWluX21hdGNoZXNfY29udHJhY3QoJHJlc3RvcmVkLCAkbG9naW4sICRwYXNzd29yZCwgJGNvbmNlYWxlZCkpIHsKICAgICAgICAkY29tcGVuc2F0ZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9yZXN0b3JlX2FkbWluX3NuYXBzaG90KCRzbmFwc2hvdCk7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoNTAwLCBmYWxzZSwgJGNvbXBlbnNhdGVkID8gJ1JFU1RPUkVfRkFJTEVEJyA6ICdST0xMQkFDS19GQUlMRUQnKTsKICAgIH0KICAgIGxpc3QoJGxvZ2luX21hdGNoZXMsICRwYXNzd29yZF9tYXRjaGVzKSA9IGVhc3lwb3N0X2VuZHBvaW50X2FkbWluX3N0YXRlKCRyZXN0b3JlZCwgJGxvZ2luLCAkcGFzc3dvcmQpOwogICAgZWFzeXBvc3RfZW5kcG9pbnRfYWRtaW5fcmVzcG9uc2UoMjAwLCB0cnVlLCAnUkVTVE9SRUQnLCB0cnVlLCAkcmVzdG9yZWQsICRsb2dpbl9tYXRjaGVzLCAkcGFzc3dvcmRfbWF0Y2hlcyk7Cn0KCgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfcGF0aCgpIHsKICAgICRkaXJlY3RvcnkgPSBkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKQogICAgICAgID8gcnRyaW0oV1BNVV9QTFVHSU5fRElSLCAnL1xcJykKICAgICAgICA6IHJ0cmltKFdQX0NPTlRFTlRfRElSLCAnL1xcJykgLiAnL211LXBsdWdpbnMnOwogICAgcmV0dXJuICRkaXJlY3RvcnkgLiAnL3NpdGUtaGVhbHRoLXJ1bnRpbWUucGhwJzsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfYmFzZTY0dXJsX2RlY29kZSgkdmFsdWUpIHsKICAgIGlmICghaXNfc3RyaW5nKCR2YWx1ZSkgfHwgIXByZWdfbWF0Y2goJy9cQVtBLVphLXowLTlfLV0rXHovJywgJHZhbHVlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRwYWRkaW5nID0gc3RybGVuKCR2YWx1ZSkgJSA0OwogICAgaWYgKCRwYWRkaW5nID09PSAxKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJGVuY29kZWQgPSAkdmFsdWU7CiAgICBpZiAoJHBhZGRpbmcgPiAwKSB7CiAgICAgICAgJGVuY29kZWQgLj0gc3RyX3JlcGVhdCgnPScsIDQgLSAkcGFkZGluZyk7CiAgICB9CiAgICAkZGVjb2RlZCA9IGJhc2U2NF9kZWNvZGUoc3RydHIoJGVuY29kZWQsICctXycsICcrLycpLCB0cnVlKTsKICAgIGlmICgkZGVjb2RlZCA9PT0gZmFsc2UKICAgICAgICB8fCAhaGFzaF9lcXVhbHMoJHZhbHVlLCBydHJpbShzdHJ0cihiYXNlNjRfZW5jb2RlKCRkZWNvZGVkKSwgJysvJywgJy1fJyksICc9JykpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuICRkZWNvZGVkOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9leGFjdF9hcnJheV9rZXlzKCR2YWx1ZSwgJGV4cGVjdGVkKSB7CiAgICBpZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkYWN0dWFsID0gYXJyYXlfa2V5cygkdmFsdWUpOwogICAgc29ydCgkYWN0dWFsLCBTT1JUX1NUUklORyk7CiAgICBzb3J0KCRleHBlY3RlZCwgU09SVF9TVFJJTkcpOwogICAgcmV0dXJuICRhY3R1YWwgPT09ICRleHBlY3RlZDsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX21hbmlmZXN0KCRydW50aW1lX3BocCkgewogICAgaWYgKCFpc19zdHJpbmcoJHJ1bnRpbWVfcGhwKSB8fCBzdHJsZW4oJHJ1bnRpbWVfcGhwKSA+IDI2MjE0NCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRwYXR0ZXJuID0gJy9cQTxcP3BocFxuXC9cKiBTSVRFX0hFQUxUSF9SVU5USU1FX0JFR0lOX1YxIFwqXC9cbicKICAgICAgICAuICdcL1wqIFNJVEVfSEVBTFRIX1JVTlRJTUVfTUFOSUZFU1RfVjEgKFtBLVphLXowLTlfLV0rKSBcKlwvXG4nCiAgICAgICAgLiAnW1xzXFNdKlxuXC9cKiBTSVRFX0hFQUxUSF9SVU5USU1FX0VORF9WMSBcKlwvXG5cei8nOwogICAgaWYgKCFwcmVnX21hdGNoKCRwYXR0ZXJuLCAkcnVudGltZV9waHAsICRtYXRjaGVzKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRtYW5pZmVzdF9qc29uID0gZWFzeXBvc3RfZW5kcG9pbnRfYmFzZTY0dXJsX2RlY29kZSgkbWF0Y2hlc1sxXSk7CiAgICBpZiAoJG1hbmlmZXN0X2pzb24gPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJG1hbmlmZXN0ID0ganNvbl9kZWNvZGUoJG1hbmlmZXN0X2pzb24sIHRydWUpOwogICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF9leGFjdF9hcnJheV9rZXlzKAogICAgICAgICRtYW5pZmVzdCwKICAgICAgICBhcnJheSgndmVyc2lvbicsICdlbmFibGVkJywgJ3J1bnRpbWVWZXJzaW9uJywgJ2NvbmZpZ3VyYXRpb25WZXJzaW9uJykKICAgICkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoJG1hbmlmZXN0Wyd2ZXJzaW9uJ10gIT09IDEKICAgICAgICB8fCAhaXNfYm9vbCgkbWFuaWZlc3RbJ2VuYWJsZWQnXSkKICAgICAgICB8fCAhaXNfc3RyaW5nKCRtYW5pZmVzdFsncnVudGltZVZlcnNpb24nXSkKICAgICAgICB8fCAoIWlzX3N0cmluZygkbWFuaWZlc3RbJ2NvbmZpZ3VyYXRpb25WZXJzaW9uJ10pICYmICRtYW5pZmVzdFsnY29uZmlndXJhdGlvblZlcnNpb24nXSAhPT0gbnVsbCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gJG1hbmlmZXN0Owp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9waHBfc2luZ2xlX3F1b3RlZF92YWx1ZSgkdmFsdWUpIHsKICAgICRkZWNvZGVkID0gJyc7CiAgICAkbGVuZ3RoID0gc3RybGVuKCR2YWx1ZSk7CiAgICBmb3IgKCRpbmRleCA9IDA7ICRpbmRleCA8ICRsZW5ndGg7ICRpbmRleCsrKSB7CiAgICAgICAgJGNoYXJhY3RlciA9ICR2YWx1ZVskaW5kZXhdOwogICAgICAgIGlmICgkY2hhcmFjdGVyICE9PSAnXFwnKSB7CiAgICAgICAgICAgICRkZWNvZGVkIC49ICRjaGFyYWN0ZXI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAkaW5kZXgrKzsKICAgICAgICBpZiAoJGluZGV4ID49ICRsZW5ndGggfHwgKCR2YWx1ZVskaW5kZXhdICE9PSAnXFwnICYmICR2YWx1ZVskaW5kZXhdICE9PSAiJyIpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGRlY29kZWQgLj0gJHZhbHVlWyRpbmRleF07CiAgICB9CiAgICByZXR1cm4gJGRlY29kZWQ7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X25vcm1hbGl6ZWRfcnVudGltZV9za2VsZXRvbigkcnVudGltZV9waHApIHsKICAgICRtYW5pZmVzdF9wYXR0ZXJuID0gJy9TSVRFX0hFQUxUSF9SVU5USU1FX01BTklGRVNUX1YxIFtBLVphLXowLTlfLV0rLyc7CiAgICAkY29uZmlnX3BhdHRlcm4gPSAiL2RlZmluZVxcKCdTSVRFX0hFQUxUSF9SVU5USU1FX0NPTkZJR19WMScsICcoKD86XFxcXC58W14nXFxcXF0pKiknXFwpOy8iOwogICAgJG1hbmlmZXN0X2NvdW50ID0gMDsKICAgICRjb25maWdfY291bnQgPSAwOwogICAgJG5vcm1hbGl6ZWQgPSBwcmVnX3JlcGxhY2UoCiAgICAgICAgJG1hbmlmZXN0X3BhdHRlcm4sCiAgICAgICAgJ1NJVEVfSEVBTFRIX1JVTlRJTUVfTUFOSUZFU1RfVjEgX19NQU5JRkVTVF9fJywKICAgICAgICAkcnVudGltZV9waHAsCiAgICAgICAgMSwKICAgICAgICAkbWFuaWZlc3RfY291bnQKICAgICk7CiAgICAkbm9ybWFsaXplZCA9IHByZWdfcmVwbGFjZSgKICAgICAgICAkY29uZmlnX3BhdHRlcm4sCiAgICAgICAgImRlZmluZSgnU0lURV9IRUFMVEhfUlVOVElNRV9DT05GSUdfVjEnLCAnX19DT05GSUdfXycpOyIsCiAgICAgICAgJG5vcm1hbGl6ZWQsCiAgICAgICAgMSwKICAgICAgICAkY29uZmlnX2NvdW50CiAgICApOwogICAgaWYgKCFpc19zdHJpbmcoJG5vcm1hbGl6ZWQpIHx8ICRtYW5pZmVzdF9jb3VudCAhPT0gMSB8fCAkY29uZmlnX2NvdW50ICE9PSAxKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuICRub3JtYWxpemVkOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3V1aWQoJHZhbHVlKSB7CiAgICByZXR1cm4gaXNfc3RyaW5nKCR2YWx1ZSkKICAgICAgICAmJiBwcmVnX21hdGNoKCcvXEFbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn1cei8nLCAkdmFsdWUpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3NlY3JldCgkdmFsdWUpIHsKICAgICRkZWNvZGVkID0gZWFzeXBvc3RfZW5kcG9pbnRfYmFzZTY0dXJsX2RlY29kZSgkdmFsdWUpOwogICAgcmV0dXJuICRkZWNvZGVkICE9PSBmYWxzZSAmJiBzdHJsZW4oJGRlY29kZWQpID09PSAzMiA/ICRkZWNvZGVkIDogZmFsc2U7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfdXJsX2lzX2Nhbm9uaWNhbCgkdmFsdWUpIHsKICAgIGlmICghaXNfc3RyaW5nKCR2YWx1ZSkgfHwgJHZhbHVlID09PSAnJyB8fCBzdHJsZW4oJHZhbHVlKSA+IDIwNDgpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKCRpbmRleCA9IDA7ICRpbmRleCA8IHN0cmxlbigkdmFsdWUpOyAkaW5kZXgrKykgewogICAgICAgICRieXRlID0gb3JkKCR2YWx1ZVskaW5kZXhdKTsKICAgICAgICBpZiAoJGJ5dGUgPD0gMzIgfHwgJGJ5dGUgPj0gMTI3KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAkcGFydHMgPSBAcGFyc2VfdXJsKCR2YWx1ZSk7CiAgICBpZiAoIWlzX2FycmF5KCRwYXJ0cykKICAgICAgICB8fCAhaXNzZXQoJHBhcnRzWydzY2hlbWUnXSwgJHBhcnRzWydob3N0J10pCiAgICAgICAgfHwgJHBhcnRzWydzY2hlbWUnXSAhPT0gJ2h0dHBzJwogICAgICAgIHx8IGlzc2V0KCRwYXJ0c1sndXNlciddKQogICAgICAgIHx8IGlzc2V0KCRwYXJ0c1sncGFzcyddKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRob3N0ID0gKHN0cmluZykgJHBhcnRzWydob3N0J107CiAgICBpZiAoJGhvc3QgPT09ICcnIHx8ICRob3N0ICE9PSBzdHJ0b2xvd2VyKCRob3N0KSB8fCBzdWJzdHIoJGhvc3QsIC0xKSA9PT0gJy4nKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJGNhbm9uaWNhbF9ob3N0ID0gJGhvc3Q7CiAgICBpZiAoJGhvc3RbMF0gPT09ICdbJyAmJiBzdWJzdHIoJGhvc3QsIC0xKSA9PT0gJ10nKSB7CiAgICAgICAgJGlubmVyID0gc3Vic3RyKCRob3N0LCAxLCAtMSk7CiAgICAgICAgJHBhY2tlZCA9IEBpbmV0X3B0b24oJGlubmVyKTsKICAgICAgICBpZiAoJHBhY2tlZCA9PT0gZmFsc2UgfHwgc3RycG9zKCRpbm5lciwgJzonKSA9PT0gZmFsc2UgfHwgc3RydG9sb3dlcigoc3RyaW5nKSBpbmV0X250b3AoJHBhY2tlZCkpICE9PSAkaW5uZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkY2Fub25pY2FsX2hvc3QgPSAnWycgLiAkaW5uZXIgLiAnXSc7CiAgICB9IGVsc2UgewogICAgICAgICRwYWNrZWQgPSBAaW5ldF9wdG9uKCRob3N0KTsKICAgICAgICBpZiAoJHBhY2tlZCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkaG9zdCwgJzonKSAhPT0gZmFsc2UgfHwgKHN0cmluZykgaW5ldF9udG9wKCRwYWNrZWQpICE9PSAkaG9zdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9cQVswLTkuXStcei8nLCAkaG9zdCkKICAgICAgICAgICAgfHwgIXByZWdfbWF0Y2goJy9cQVthLXowLTldKD86W2EtejAtOS4tXSpbYS16MC05XSk/XHovJywgJGhvc3QpCiAgICAgICAgICAgIHx8IHN0cnBvcygkaG9zdCwgJy4uJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAkcGF0aCA9IGlzc2V0KCRwYXJ0c1sncGF0aCddKSA/IChzdHJpbmcpICRwYXJ0c1sncGF0aCddIDogJy8nOwogICAgZm9yZWFjaCAoZXhwbG9kZSgnLycsICRwYXRoKSBhcyAkc2VnbWVudCkgewogICAgICAgICRkZWNvZGVkID0gcmF3dXJsZGVjb2RlKCRzZWdtZW50KTsKICAgICAgICBpZiAoJGRlY29kZWQgPT09ICcuJyB8fCAkZGVjb2RlZCA9PT0gJy4uJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgJHBvcnQgPSBpc3NldCgkcGFydHNbJ3BvcnQnXSkgPyAoaW50KSAkcGFydHNbJ3BvcnQnXSA6IG51bGw7CiAgICAkY2Fub25pY2FsID0gJ2h0dHBzOi8vJyAuICRjYW5vbmljYWxfaG9zdAogICAgICAgIC4gKCRwb3J0ICE9PSBudWxsICYmICRwb3J0ICE9PSA0NDMgPyAnOicgLiAkcG9ydCA6ICcnKQogICAgICAgIC4gJHBhdGgKICAgICAgICAuIChpc3NldCgkcGFydHNbJ3F1ZXJ5J10pID8gJz8nIC4gJHBhcnRzWydxdWVyeSddIDogJycpCiAgICAgICAgLiAoaXNzZXQoJHBhcnRzWydmcmFnbWVudCddKSA/ICcjJyAuICRwYXJ0c1snZnJhZ21lbnQnXSA6ICcnKTsKICAgIHJldHVybiBoYXNoX2VxdWFscygkY2Fub25pY2FsLCAkdmFsdWUpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF92YWxpZGF0ZV9ydW50aW1lX3VzZXJzKCR1c2VycywgJHJlcXVpcmVkX3JvbGVzKSB7CiAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X2V4YWN0X2FycmF5X2tleXMoJHVzZXJzLCBhcnJheSgnZ2VuZXJhbCcsICdoaWRkZW4nLCAnYWRkaXRpb25hbCcpKQogICAgICAgIHx8ICFpc19hcnJheSgkcmVxdWlyZWRfcm9sZXMpCiAgICAgICAgfHwgYXJyYXlfdmFsdWVzKCRyZXF1aXJlZF9yb2xlcykgIT09ICRyZXF1aXJlZF9yb2xlcykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRkZXJpdmVkID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKGFycmF5KCdnZW5lcmFsJywgJ2hpZGRlbicsICdhZGRpdGlvbmFsJykgYXMgJHJvbGUpIHsKICAgICAgICAkdXNlciA9ICR1c2Vyc1skcm9sZV07CiAgICAgICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF9leGFjdF9hcnJheV9rZXlzKCR1c2VyLCBhcnJheSgncmVxdWlyZWQnLCAnbG9naW4nLCAnZW1haWwnLCAncGFzc3dvcmQnLCAnd3BVc2VySWQnLCAnY29uY2VhbGVkJykpCiAgICAgICAgICAgIHx8ICFpc19ib29sKCR1c2VyWydyZXF1aXJlZCddKQogICAgICAgICAgICB8fCAhaXNfYm9vbCgkdXNlclsnY29uY2VhbGVkJ10pCiAgICAgICAgICAgIHx8ICR1c2VyWydjb25jZWFsZWQnXSAhPT0gKCRyb2xlID09PSAnaGlkZGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoISR1c2VyWydyZXF1aXJlZCddKSB7CiAgICAgICAgICAgIGlmICgkdXNlclsnbG9naW4nXSAhPT0gbnVsbCB8fCAkdXNlclsnZW1haWwnXSAhPT0gbnVsbCB8fCAkdXNlclsncGFzc3dvcmQnXSAhPT0gbnVsbCB8fCAkdXNlclsnd3BVc2VySWQnXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX3N0cmluZygkdXNlclsnbG9naW4nXSkgfHwgdHJpbSgkdXNlclsnbG9naW4nXSkgPT09ICcnCiAgICAgICAgICAgIHx8ICFpc19zdHJpbmcoJHVzZXJbJ2VtYWlsJ10pIHx8IHRyaW0oJHVzZXJbJ2VtYWlsJ10pID09PSAnJyB8fCBzdHJwb3MoJHVzZXJbJ2VtYWlsJ10sICdAJykgPT09IGZhbHNlCiAgICAgICAgICAgIHx8ICFpc19zdHJpbmcoJHVzZXJbJ3Bhc3N3b3JkJ10pIHx8ICR1c2VyWydwYXNzd29yZCddID09PSAnJwogICAgICAgICAgICB8fCAhaXNfaW50KCR1c2VyWyd3cFVzZXJJZCddKSB8fCAkdXNlclsnd3BVc2VySWQnXSA8IDEgfHwgJHVzZXJbJ3dwVXNlcklkJ10gPiAyMTQ3NDgzNjQ3KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGRlcml2ZWRbXSA9ICRyb2xlOwogICAgfQogICAgcmV0dXJuICRkZXJpdmVkID09PSAkcmVxdWlyZWRfcm9sZXMgJiYgaW5fYXJyYXkoJ2dlbmVyYWwnLCAkZGVyaXZlZCwgdHJ1ZSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3ZhbGlkYXRlX3J1bnRpbWVfY29uZmlnX2NvbnRyYWN0KCRydW50aW1lX2NvbmZpZykgewogICAgJHJ1bnRpbWVfdmVyc2lvbiA9IGlzc2V0KCRydW50aW1lX2NvbmZpZ1sncnVudGltZVZlcnNpb24nXSkKICAgICAgICA/ICRydW50aW1lX2NvbmZpZ1sncnVudGltZVZlcnNpb24nXQogICAgICAgIDogbnVsbDsKICAgICRleHBlY3RlZF9rZXlzID0gYXJyYXkoCiAgICAgICAgJ3ZlcnNpb24nLCAnaGVhcnRiZWF0VXJsJywgJ3Rva2VuSWQnLCAnc2lnbmluZ1NlY3JldCcsICdyZWNvdmVyeUtleScsCiAgICAgICAgJ3J1bnRpbWVWZXJzaW9uJywgJ2NvbmZpZ3VyYXRpb25WZXJzaW9uJywgJ3JlcGFpckVuYWJsZWQnLCAnZW5kcG9pbnRQcm9iZScsCiAgICAgICAgJ3JlcXVpcmVkUm9sZXMnLCAnYm9vdHN0cmFwQnVuZGxlJwogICAgKTsKICAgIGlmICgkcnVudGltZV92ZXJzaW9uID09PSAnMjAyNi4wOC4xMicpIHsKICAgICAgICAkZXhwZWN0ZWRfa2V5c1tdID0gJ2FwcGxpY2F0aW9uUGFzc3dvcmQnOwogICAgfSBlbHNlaWYgKCRydW50aW1lX3ZlcnNpb24gIT09ICcyMDI2LjA4LjExJykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghZWFzeXBvc3RfZW5kcG9pbnRfZXhhY3RfYXJyYXlfa2V5cygKICAgICAgICAkcnVudGltZV9jb25maWcsCiAgICAgICAgJGV4cGVjdGVkX2tleXMKICAgICkKICAgICAgICB8fCAkcnVudGltZV9jb25maWdbJ3ZlcnNpb24nXSAhPT0gMQogICAgICAgIHx8ICFlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3V1aWQoJHJ1bnRpbWVfY29uZmlnWyd0b2tlbklkJ10pCiAgICAgICAgfHwgIWVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfdXVpZCgkcnVudGltZV9jb25maWdbJ2NvbmZpZ3VyYXRpb25WZXJzaW9uJ10pCiAgICAgICAgfHwgIWlzX2Jvb2woJHJ1bnRpbWVfY29uZmlnWydyZXBhaXJFbmFibGVkJ10pCiAgICAgICAgfHwgIWVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfdXJsX2lzX2Nhbm9uaWNhbCgkcnVudGltZV9jb25maWdbJ2hlYXJ0YmVhdFVybCddKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICgkcnVudGltZV92ZXJzaW9uID09PSAnMjAyNi4wOC4xMicpIHsKICAgICAgICAkYXBwbGljYXRpb25fcGFzc3dvcmQgPSAkcnVudGltZV9jb25maWdbJ2FwcGxpY2F0aW9uUGFzc3dvcmQnXTsKICAgICAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X2V4YWN0X2FycmF5X2tleXMoCiAgICAgICAgICAgICRhcHBsaWNhdGlvbl9wYXNzd29yZCwKICAgICAgICAgICAgYXJyYXkoJ3JlcXVpcmVkJywgJ293bmVyV3BVc2VySWQnLCAnbWFuYWdlZFV1aWQnKQogICAgICAgICkKICAgICAgICAgICAgfHwgIWlzX2Jvb2woJGFwcGxpY2F0aW9uX3Bhc3N3b3JkWydyZXF1aXJlZCddKQogICAgICAgICAgICB8fCAoJGFwcGxpY2F0aW9uX3Bhc3N3b3JkWydvd25lcldwVXNlcklkJ10gIT09IG51bGwKICAgICAgICAgICAgICAgICYmICghaXNfaW50KCRhcHBsaWNhdGlvbl9wYXNzd29yZFsnb3duZXJXcFVzZXJJZCddKQogICAgICAgICAgICAgICAgICAgIHx8ICRhcHBsaWNhdGlvbl9wYXNzd29yZFsnb3duZXJXcFVzZXJJZCddIDwgMQogICAgICAgICAgICAgICAgICAgIHx8ICRhcHBsaWNhdGlvbl9wYXNzd29yZFsnb3duZXJXcFVzZXJJZCddID4gMjE0NzQ4MzY0NykpCiAgICAgICAgICAgIHx8ICgkYXBwbGljYXRpb25fcGFzc3dvcmRbJ21hbmFnZWRVdWlkJ10gIT09IG51bGwKICAgICAgICAgICAgICAgICYmICFlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3V1aWQoJGFwcGxpY2F0aW9uX3Bhc3N3b3JkWydtYW5hZ2VkVXVpZCddKSkKICAgICAgICAgICAgfHwgKCgkYXBwbGljYXRpb25fcGFzc3dvcmRbJ293bmVyV3BVc2VySWQnXSA9PT0gbnVsbCkKICAgICAgICAgICAgICAgICE9PSAoJGFwcGxpY2F0aW9uX3Bhc3N3b3JkWydtYW5hZ2VkVXVpZCddID09PSBudWxsKSkKICAgICAgICAgICAgfHwgKCEkYXBwbGljYXRpb25fcGFzc3dvcmRbJ3JlcXVpcmVkJ10KICAgICAgICAgICAgICAgICYmICgkYXBwbGljYXRpb25fcGFzc3dvcmRbJ293bmVyV3BVc2VySWQnXSAhPT0gbnVsbAogICAgICAgICAgICAgICAgICAgIHx8ICRhcHBsaWNhdGlvbl9wYXNzd29yZFsnbWFuYWdlZFV1aWQnXSAhPT0gbnVsbCkpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAkc2lnbmluZyA9IGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfc2VjcmV0KCRydW50aW1lX2NvbmZpZ1snc2lnbmluZ1NlY3JldCddKTsKICAgICRyZWNvdmVyeSA9IGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfc2VjcmV0KCRydW50aW1lX2NvbmZpZ1sncmVjb3ZlcnlLZXknXSk7CiAgICAkZW52ZWxvcGUgPSAkcnVudGltZV9jb25maWdbJ2Jvb3RzdHJhcEJ1bmRsZSddOwogICAgaWYgKCRzaWduaW5nID09PSBmYWxzZSB8fCAkcmVjb3ZlcnkgPT09IGZhbHNlIHx8IGhhc2hfZXF1YWxzKCRzaWduaW5nLCAkcmVjb3ZlcnkpCiAgICAgICAgfHwgIWVhc3lwb3N0X2VuZHBvaW50X2V4YWN0X2FycmF5X2tleXMoJGVudmVsb3BlLCBhcnJheSgndmVyc2lvbicsICdjaXBoZXInLCAnbm9uY2UnLCAndGFnJywgJ2NpcGhlcnRleHQnKSkKICAgICAgICB8fCAkZW52ZWxvcGVbJ3ZlcnNpb24nXSAhPT0gMQogICAgICAgIHx8ICRlbnZlbG9wZVsnY2lwaGVyJ10gIT09ICdhZXMtMjU2LWdjbScpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkbm9uY2UgPSBlYXN5cG9zdF9lbmRwb2ludF9iYXNlNjR1cmxfZGVjb2RlKCRlbnZlbG9wZVsnbm9uY2UnXSk7CiAgICAkdGFnID0gZWFzeXBvc3RfZW5kcG9pbnRfYmFzZTY0dXJsX2RlY29kZSgkZW52ZWxvcGVbJ3RhZyddKTsKICAgICRjaXBoZXJ0ZXh0ID0gZWFzeXBvc3RfZW5kcG9pbnRfYmFzZTY0dXJsX2RlY29kZSgkZW52ZWxvcGVbJ2NpcGhlcnRleHQnXSk7CiAgICBpZiAoJG5vbmNlID09PSBmYWxzZSB8fCBzdHJsZW4oJG5vbmNlKSAhPT0gMTIKICAgICAgICB8fCAkdGFnID09PSBmYWxzZSB8fCBzdHJsZW4oJHRhZykgIT09IDE2CiAgICAgICAgfHwgJGNpcGhlcnRleHQgPT09IGZhbHNlCiAgICAgICAgfHwgIWZ1bmN0aW9uX2V4aXN0cygnb3BlbnNzbF9kZWNyeXB0JykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAka2V5ID0gaGFzaF9obWFjKCdzaGEyNTYnLCAnc2l0ZS1oZWFsdGgtcnVudGltZS1idW5kbGUtdjEnLCAkcmVjb3ZlcnksIHRydWUpOwogICAgJHBsYWludGV4dCA9IG9wZW5zc2xfZGVjcnlwdCgKICAgICAgICAkY2lwaGVydGV4dCwKICAgICAgICAnYWVzLTI1Ni1nY20nLAogICAgICAgICRrZXksCiAgICAgICAgT1BFTlNTTF9SQVdfREFUQSwKICAgICAgICAkbm9uY2UsCiAgICAgICAgJHRhZywKICAgICAgICAnc2l0ZS1oZWFsdGgtcnVudGltZS1idW5kbGUtdjEnCiAgICApOwogICAgaWYgKCRwbGFpbnRleHQgPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJHVzZXJzID0ganNvbl9kZWNvZGUoJHBsYWludGV4dCwgdHJ1ZSk7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdzb2RpdW1fbWVtemVybycpKSB7CiAgICAgICAgc29kaXVtX21lbXplcm8oJHBsYWludGV4dCk7CiAgICB9CiAgICByZXR1cm4gZWFzeXBvc3RfZW5kcG9pbnRfdmFsaWRhdGVfcnVudGltZV91c2VycygkdXNlcnMsICRydW50aW1lX2NvbmZpZ1sncmVxdWlyZWRSb2xlcyddKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfdmFsaWRhdGVfc2l0ZV9ydW50aW1lKCRwYXlsb2FkLCAkZGVjb2RlZF9waHApIHsKICAgIGlmICghaXNzZXQoJHBheWxvYWRbJ3J1bnRpbWVWZXJzaW9uJ10pCiAgICAgICAgfHwgIWlzX3N0cmluZygkcGF5bG9hZFsncnVudGltZVZlcnNpb24nXSkKICAgICAgICB8fCAhaW5fYXJyYXkoJHBheWxvYWRbJ3J1bnRpbWVWZXJzaW9uJ10sIGFycmF5KAogICAgICAgICAgICAnMjAyNi4wOC4xMScsCiAgICAgICAgICAgICcyMDI2LjA4LjEyJwogICAgICAgICksIHRydWUpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfdmVyc2lvbl9pbnZhbGlkJykpOwogICAgfQogICAgaWYgKCFpc3NldCgkcGF5bG9hZFsnY29uZmlndXJhdGlvblZlcnNpb24nXSkKICAgICAgICB8fCAhaXNfc3RyaW5nKCRwYXlsb2FkWydjb25maWd1cmF0aW9uVmVyc2lvbiddKQogICAgICAgIHx8ICFwcmVnX21hdGNoKCcvXEFbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn1cei8nLCAkcGF5bG9hZFsnY29uZmlndXJhdGlvblZlcnNpb24nXSkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnY29uZmlndXJhdGlvbl92ZXJzaW9uX2ludmFsaWQnKSk7CiAgICB9CiAgICBpZiAoIWlzc2V0KCRwYXlsb2FkWydzaGEyNTYnXSkKICAgICAgICB8fCAhaXNfc3RyaW5nKCRwYXlsb2FkWydzaGEyNTYnXSkKICAgICAgICB8fCAhcHJlZ19tYXRjaCgnL1xBW2EtZjAtOV17NjR9XHovJywgJHBheWxvYWRbJ3NoYTI1NiddKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdzaGEyNTZfaW52YWxpZCcpKTsKICAgIH0KICAgIGlmIChzdHJsZW4oJGRlY29kZWRfcGhwKSA+IDI2MjE0NCkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdydW50aW1lX3Rvb19sYXJnZScpKTsKICAgIH0KICAgICRjb21wdXRlZF9zaGEyNTYgPSBoYXNoKCdzaGEyNTYnLCAkZGVjb2RlZF9waHApOwogICAgaWYgKCFoYXNoX2VxdWFscygkcGF5bG9hZFsnc2hhMjU2J10sICRjb21wdXRlZF9zaGEyNTYpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3NoYTI1Nl9taXNtYXRjaCcpKTsKICAgIH0KICAgICRtYW5pZmVzdCA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9tYW5pZmVzdCgkZGVjb2RlZF9waHApOwogICAgaWYgKCRtYW5pZmVzdCA9PT0gZmFsc2UKICAgICAgICB8fCAkbWFuaWZlc3RbJ2VuYWJsZWQnXSAhPT0gdHJ1ZQogICAgICAgIHx8ICFoYXNoX2VxdWFscygkcGF5bG9hZFsncnVudGltZVZlcnNpb24nXSwgJG1hbmlmZXN0WydydW50aW1lVmVyc2lvbiddKQogICAgICAgIHx8ICFoYXNoX2VxdWFscygkcGF5bG9hZFsnY29uZmlndXJhdGlvblZlcnNpb24nXSwgJG1hbmlmZXN0Wydjb25maWd1cmF0aW9uVmVyc2lvbiddKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdydW50aW1lX21hbmlmZXN0X2ludmFsaWQnKSk7CiAgICB9CiAgICAkZHluYW1pY19zY2FuID0gc3RyX3JlcGxhY2UoCiAgICAgICAgYXJyYXkoCiAgICAgICAgICAgICJyZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy91c2VyLnBocCc7IiwKICAgICAgICAgICAgInJlcXVpcmVfb25jZSBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL3BsdWdpbi5waHAnOyIKICAgICAgICApLAogICAgICAgICcnLAogICAgICAgICRkZWNvZGVkX3BocAogICAgKTsKICAgIGlmIChwcmVnX21hdGNoKCcvKD86XGJldmFsXHMqXCh8XGJhc3NlcnRccypcKHxcYmNyZWF0ZV9mdW5jdGlvblxzKlwofFxic2hlbGxfZXhlY1xzKlwofFxic3lzdGVtXHMqXCh8XGJwYXNzdGhydVxzKlwofFxicHJvY19vcGVuXHMqXCh8XGJwb3BlblxzKlwofFxiaW5jbHVkZSg/Ol9vbmNlKT9cYnxcYnJlcXVpcmUoPzpfb25jZSk/XGJ8XHg2MCkvaScsICRkeW5hbWljX3NjYW4pKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2R5bmFtaWNfY29uc3RydWN0X3JlamVjdGVkJykpOwogICAgfQogICAgJGNvbmZpZ19wYXR0ZXJuID0gIi9kZWZpbmVcXCgnU0lURV9IRUFMVEhfUlVOVElNRV9DT05GSUdfVjEnLCAnKCg/OlxcXFwufFteJ1xcXFxdKSopJ1xcKTsvIjsKICAgIGlmIChwcmVnX21hdGNoX2FsbCgkY29uZmlnX3BhdHRlcm4sICRkZWNvZGVkX3BocCwgJGNvbmZpZ19tYXRjaGVzKSAhPT0gMSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdydW50aW1lX2NvbmZpZ19pbnZhbGlkJykpOwogICAgfQogICAgJGNvbmZpZ19qc29uID0gZWFzeXBvc3RfZW5kcG9pbnRfcGhwX3NpbmdsZV9xdW90ZWRfdmFsdWUoJGNvbmZpZ19tYXRjaGVzWzFdWzBdKTsKICAgICRydW50aW1lX2NvbmZpZyA9ICRjb25maWdfanNvbiA9PT0gZmFsc2UgPyBudWxsIDoganNvbl9kZWNvZGUoJGNvbmZpZ19qc29uLCB0cnVlKTsKICAgIGlmICghaXNfYXJyYXkoJHJ1bnRpbWVfY29uZmlnKQogICAgICAgIHx8ICFpc3NldCgkcnVudGltZV9jb25maWdbJ3ZlcnNpb24nXSkKICAgICAgICB8fCAkcnVudGltZV9jb25maWdbJ3ZlcnNpb24nXSAhPT0gMQogICAgICAgIHx8ICFpc3NldCgkcnVudGltZV9jb25maWdbJ3J1bnRpbWVWZXJzaW9uJ10sICRydW50aW1lX2NvbmZpZ1snY29uZmlndXJhdGlvblZlcnNpb24nXSkKICAgICAgICB8fCAhaXNfc3RyaW5nKCRydW50aW1lX2NvbmZpZ1sncnVudGltZVZlcnNpb24nXSkKICAgICAgICB8fCAhaXNfc3RyaW5nKCRydW50aW1lX2NvbmZpZ1snY29uZmlndXJhdGlvblZlcnNpb24nXSkKICAgICAgICB8fCAhaGFzaF9lcXVhbHMoJG1hbmlmZXN0WydydW50aW1lVmVyc2lvbiddLCAkcnVudGltZV9jb25maWdbJ3J1bnRpbWVWZXJzaW9uJ10pCiAgICAgICAgfHwgIWhhc2hfZXF1YWxzKCRtYW5pZmVzdFsnY29uZmlndXJhdGlvblZlcnNpb24nXSwgJHJ1bnRpbWVfY29uZmlnWydjb25maWd1cmF0aW9uVmVyc2lvbiddKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdydW50aW1lX2NvbmZpZ19pbnZhbGlkJykpOwogICAgfQogICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF92YWxpZGF0ZV9ydW50aW1lX2NvbmZpZ19jb250cmFjdCgkcnVudGltZV9jb25maWcpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfY29uZmlnX2ludmFsaWQnKSk7CiAgICB9CiAgICAkZW5kcG9pbnRfY29uZmlnID0gZWFzeXBvc3RfZW5kcG9pbnRfY29uZmlnKCk7CiAgICAkbm9ybWFsaXplZF9ydW50aW1lID0gZWFzeXBvc3RfZW5kcG9pbnRfbm9ybWFsaXplZF9ydW50aW1lX3NrZWxldG9uKCRkZWNvZGVkX3BocCk7CiAgICAkbGVnYWN5X3J1bnRpbWUgPSAkcGF5bG9hZFsncnVudGltZVZlcnNpb24nXSA9PT0gJzIwMjYuMDguMTEnOwogICAgJHNrZWxldG9uX3NoYV9rZXkgPSAkbGVnYWN5X3J1bnRpbWUKICAgICAgICA/ICdsZWdhY3lfcnVudGltZV9za2VsZXRvbl9zaGEyNTYnCiAgICAgICAgOiAncnVudGltZV9za2VsZXRvbl9zaGEyNTYnOwogICAgJHNrZWxldG9uX2J5dGVzX2tleSA9ICRsZWdhY3lfcnVudGltZQogICAgICAgID8gJ2xlZ2FjeV9ydW50aW1lX3NrZWxldG9uX2J5dGVzJwogICAgICAgIDogJ3J1bnRpbWVfc2tlbGV0b25fYnl0ZXMnOwogICAgaWYgKCRub3JtYWxpemVkX3J1bnRpbWUgPT09IGZhbHNlCiAgICAgICAgfHwgIWlzc2V0KCRlbmRwb2ludF9jb25maWdbJHNrZWxldG9uX3NoYV9rZXldLCAkZW5kcG9pbnRfY29uZmlnWyRza2VsZXRvbl9ieXRlc19rZXldKQogICAgICAgIHx8IHN0cmxlbigkbm9ybWFsaXplZF9ydW50aW1lKSAhPT0gKGludCkgJGVuZHBvaW50X2NvbmZpZ1skc2tlbGV0b25fYnl0ZXNfa2V5XQogICAgICAgIHx8ICFoYXNoX2VxdWFscygkZW5kcG9pbnRfY29uZmlnWyRza2VsZXRvbl9zaGFfa2V5XSwgaGFzaCgnc2hhMjU2JywgJG5vcm1hbGl6ZWRfcnVudGltZSkpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfc2tlbGV0b25fbWlzbWF0Y2gnKSk7CiAgICB9CiAgICByZXR1cm4gJHJ1bnRpbWVfY29uZmlnOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9hdG9taWNfc2l0ZV9ydW50aW1lX3dyaXRlKCRydW50aW1lX3BocCwgJHJlc3BvbmRfb25fZmFpbHVyZSA9IHRydWUpIHsKICAgICRydW50aW1lX3BhdGggPSBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfcGF0aCgpOwogICAgJGRpcmVjdG9yeSA9IGRpcm5hbWUoJHJ1bnRpbWVfcGF0aCk7CiAgICBpZiAoIWlzX2RpcigkZGlyZWN0b3J5KQogICAgICAgICYmICghZnVuY3Rpb25fZXhpc3RzKCd3cF9ta2Rpcl9wJykgfHwgIXdwX21rZGlyX3AoJGRpcmVjdG9yeSkpKSB7CiAgICAgICAgaWYgKCRyZXNwb25kX29uX2ZhaWx1cmUpIHsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig1MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfZGlyZWN0b3J5X3VuYXZhaWxhYmxlJykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkdGVtcG9yYXJ5X3BhdGggPSB0ZW1wbmFtKCRkaXJlY3RvcnksICcuc2l0ZS1oZWFsdGgtcnVudGltZS0nKTsKICAgIGlmICgkdGVtcG9yYXJ5X3BhdGggPT09IGZhbHNlKSB7CiAgICAgICAgaWYgKCRyZXNwb25kX29uX2ZhaWx1cmUpIHsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig1MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfd3JpdGVfZmFpbGVkJykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkYnl0ZXMgPSBmaWxlX3B1dF9jb250ZW50cygkdGVtcG9yYXJ5X3BhdGgsICRydW50aW1lX3BocCwgTE9DS19FWCk7CiAgICBpZiAoJGJ5dGVzID09PSBmYWxzZSB8fCAkYnl0ZXMgIT09IHN0cmxlbigkcnVudGltZV9waHApKSB7CiAgICAgICAgQHVubGluaygkdGVtcG9yYXJ5X3BhdGgpOwogICAgICAgIGlmICgkcmVzcG9uZF9vbl9mYWlsdXJlKSB7CiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdydW50aW1lX3dyaXRlX2ZhaWxlZCcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgQGNobW9kKCR0ZW1wb3JhcnlfcGF0aCwgMDY0NCk7CiAgICBpZiAoIXJlbmFtZSgkdGVtcG9yYXJ5X3BhdGgsICRydW50aW1lX3BhdGgpKSB7CiAgICAgICAgQHVubGluaygkdGVtcG9yYXJ5X3BhdGgpOwogICAgICAgIGlmICgkcmVzcG9uZF9vbl9mYWlsdXJlKSB7CiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdydW50aW1lX3JlbmFtZV9mYWlsZWQnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ29wY2FjaGVfaW52YWxpZGF0ZScpKSB7CiAgICAgICAgQG9wY2FjaGVfaW52YWxpZGF0ZSgkcnVudGltZV9wYXRoLCB0cnVlKTsKICAgIH0KICAgIGNsZWFyc3RhdGNhY2hlKHRydWUsICRydW50aW1lX3BhdGgpOwogICAgcmV0dXJuICRydW50aW1lX3BhdGg7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9ob29rX2V2ZW50cygkaG9vaykgewogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnX2dldF9jcm9uX2FycmF5JykpIHsKICAgICAgICAkY3JvbiA9IF9nZXRfY3Jvbl9hcnJheSgpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGNyb24pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGV2ZW50cyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJGNyb24gYXMgJHRpbWVzdGFtcCA9PiAkaG9va3MpIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkaG9va3NbJGhvb2tdKSB8fCAhaXNfYXJyYXkoJGhvb2tzWyRob29rXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRob29rc1skaG9va10gYXMgJGV2ZW50KSB7CiAgICAgICAgICAgICAgICAkZXZlbnRzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAndGltZXN0YW1wJyA9PiAoaW50KSAkdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICdzY2hlZHVsZScgPT4gaXNzZXQoJGV2ZW50WydzY2hlZHVsZSddKSA/ICRldmVudFsnc2NoZWR1bGUnXSA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICdhcmdzJyA9PiBpc3NldCgkZXZlbnRbJ2FyZ3MnXSkgJiYgaXNfYXJyYXkoJGV2ZW50WydhcmdzJ10pID8gJGV2ZW50WydhcmdzJ10gOiBhcnJheSgpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGV2ZW50czsKICAgIH0KICAgICR0aW1lc3RhbXAgPSB3cF9uZXh0X3NjaGVkdWxlZCgkaG9vayk7CiAgICByZXR1cm4gJHRpbWVzdGFtcCA9PT0gZmFsc2UgPyBhcnJheSgpIDogYXJyYXkoYXJyYXkoCiAgICAgICAgJ3RpbWVzdGFtcCcgPT4gKGludCkgJHRpbWVzdGFtcCwKICAgICAgICAnc2NoZWR1bGUnID0+ICRob29rID09PSAnc2l0ZV9oZWFsdGhfcnVudGltZV9kYWlseV92MScgPyAnZGFpbHknIDogZmFsc2UsCiAgICAgICAgJ2FyZ3MnID0+IGFycmF5KCksCiAgICApKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2V2ZW50X2ZpbmdlcnByaW50cygkZXZlbnRzKSB7CiAgICBpZiAoIWlzX2FycmF5KCRldmVudHMpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJHZhbHVlcyA9IGFycmF5KCk7CiAgICBmb3JlYWNoICgkZXZlbnRzIGFzICRldmVudCkgewogICAgICAgIGlmICghaXNfYXJyYXkoJGV2ZW50KSB8fCAhaXNzZXQoJGV2ZW50Wyd0aW1lc3RhbXAnXSwgJGV2ZW50WydzY2hlZHVsZSddLCAkZXZlbnRbJ2FyZ3MnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdmFsdWVzW10gPSAoaW50KSAkZXZlbnRbJ3RpbWVzdGFtcCddIC4gJzonIC4gKHN0cmluZykgJGV2ZW50WydzY2hlZHVsZSddIC4gJzonIC4gc2VyaWFsaXplKCRldmVudFsnYXJncyddKTsKICAgIH0KICAgIHNvcnQoJHZhbHVlcywgU09SVF9TVFJJTkcpOwogICAgcmV0dXJuICR2YWx1ZXM7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3VwZ3JhZGVfYmFja3VwX3BhdGgoKSB7CiAgICByZXR1cm4gZGlybmFtZShlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfcGF0aCgpKQogICAgICAgIC4gJy9zaXRlLWhlYWx0aC1ydW50aW1lLWRhdGEvcHJldmlvdXMucGhwJzsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfdXBncmFkZV9tYXJrZXIoJHJhdykgewogICAgJG1hcmtlciA9IGZ1bmN0aW9uX2V4aXN0cygnbWF5YmVfdW5zZXJpYWxpemUnKSA/IG1heWJlX3Vuc2VyaWFsaXplKCRyYXcpIDogQHVuc2VyaWFsaXplKCRyYXcpOwogICAgaWYgKCFpc19hcnJheSgkbWFya2VyKQogICAgICAgIHx8IGFycmF5X2tleXMoJG1hcmtlcikgIT09IGFycmF5KCd2ZXJzaW9uJywgJ3RyYW5zYWN0aW9uSWQnLCAnZGVzaXJlZFNoYTI1NicsICdwcmV2aW91c1NoYTI1NicpCiAgICAgICAgfHwgJG1hcmtlclsndmVyc2lvbiddICE9PSAxCiAgICAgICAgfHwgIWlzX3N0cmluZygkbWFya2VyWyd0cmFuc2FjdGlvbklkJ10pCiAgICAgICAgfHwgIXByZWdfbWF0Y2goJy9cQVswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9XHovJywgJG1hcmtlclsndHJhbnNhY3Rpb25JZCddKQogICAgICAgIHx8ICFpc19zdHJpbmcoJG1hcmtlclsnZGVzaXJlZFNoYTI1NiddKQogICAgICAgIHx8ICFwcmVnX21hdGNoKCcvXEFbYS1mMC05XXs2NH1cei8nLCAkbWFya2VyWydkZXNpcmVkU2hhMjU2J10pCiAgICAgICAgfHwgIWlzX3N0cmluZygkbWFya2VyWydwcmV2aW91c1NoYTI1NiddKQogICAgICAgIHx8ICFwcmVnX21hdGNoKCcvXEFbYS1mMC05XXs2NH1cei8nLCAkbWFya2VyWydwcmV2aW91c1NoYTI1NiddKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiAkbWFya2VyOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX2JhY2t1cF9leGlzdHMoJHBhdGgpIHsKICAgIHJldHVybiBmaWxlX2V4aXN0cygkcGF0aCkgfHwgaXNfbGluaygkcGF0aCk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfdXBncmFkZV9iYWNrdXAoJHBhdGgpIHsKICAgICRkaXJlY3RvcnkgPSBkaXJuYW1lKCRwYXRoKTsKICAgIGlmICghaXNfZmlsZSgkcGF0aCkKICAgICAgICB8fCBpc19saW5rKCRwYXRoKQogICAgICAgIHx8IGlzX2xpbmsoJGRpcmVjdG9yeSkKICAgICAgICB8fCAhaXNfcmVhZGFibGUoJHBhdGgpCiAgICAgICAgfHwgKCgoaW50KSBAZmlsZXBlcm1zKCRwYXRoKSkgJiAwMDc3KSAhPT0gMAogICAgICAgIHx8ICgoKGludCkgQGZpbGVwZXJtcygkZGlyZWN0b3J5KSkgJiAwMDc3KSAhPT0gMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICR3cmFwcGVkID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoLCBmYWxzZSwgbnVsbCwgMCwgNTI0Mjg5KTsKICAgICRwcmVmaXggPSAiPD9waHBcbmh0dHBfcmVzcG9uc2VfY29kZSg0MDQpO1xuZXhpdDtcbl9faGFsdF9jb21waWxlcigpO1xuIjsKICAgIGlmICghaXNfc3RyaW5nKCR3cmFwcGVkKQogICAgICAgIHx8IHN0cmxlbigkd3JhcHBlZCkgPiA1MjQyODgKICAgICAgICB8fCBzdHJwb3MoJHdyYXBwZWQsICRwcmVmaXgpICE9PSAwCiAgICAgICAgfHwgIXByZWdfbWF0Y2goCiAgICAgICAgICAgICcvXEE8XD9waHBcbmh0dHBfcmVzcG9uc2VfY29kZVwoNDA0XCk7XG5leGl0O1xuX19oYWx0X2NvbXBpbGVyXChcKTtcblwvXCogU0lURV9IRUFMVEhfUlVOVElNRV9CQUNLVVBfVjEgKFtBLVphLXowLTlfLV0rKSBcKlwvXG4oW0EtWmEtejAtOStcL10rPXswLDJ9KVxuXHovJywKICAgICAgICAgICAgJHdyYXBwZWQsCiAgICAgICAgICAgICRtYXRjaGVzCiAgICAgICAgKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRtZXRhZGF0YV9qc29uID0gZWFzeXBvc3RfZW5kcG9pbnRfYmFzZTY0dXJsX2RlY29kZSgkbWF0Y2hlc1sxXSk7CiAgICAkbWV0YWRhdGEgPSBpc19zdHJpbmcoJG1ldGFkYXRhX2pzb24pID8ganNvbl9kZWNvZGUoJG1ldGFkYXRhX2pzb24sIHRydWUpIDogbnVsbDsKICAgICRzb3VyY2UgPSBiYXNlNjRfZGVjb2RlKCRtYXRjaGVzWzJdLCB0cnVlKTsKICAgICRub3JtYWxpemVkX3NvdXJjZSA9IGlzX3N0cmluZygkc291cmNlKQogICAgICAgID8gZWFzeXBvc3RfZW5kcG9pbnRfbm9ybWFsaXplZF9ydW50aW1lX3NrZWxldG9uKCRzb3VyY2UpCiAgICAgICAgOiBmYWxzZTsKICAgICRlbmRwb2ludF9jb25maWcgPSBlYXN5cG9zdF9lbmRwb2ludF9jb25maWcoKTsKICAgICRzb3VyY2VfbWFuaWZlc3QgPSBpc19zdHJpbmcoJHNvdXJjZSkKICAgICAgICA/IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9tYW5pZmVzdCgkc291cmNlKQogICAgICAgIDogZmFsc2U7CiAgICAkbGVnYWN5X3NvdXJjZSA9IGlzX2FycmF5KCRzb3VyY2VfbWFuaWZlc3QpCiAgICAgICAgJiYgaXNzZXQoJHNvdXJjZV9tYW5pZmVzdFsncnVudGltZVZlcnNpb24nXSkKICAgICAgICAmJiAkc291cmNlX21hbmlmZXN0WydydW50aW1lVmVyc2lvbiddID09PSAnMjAyNi4wOC4xMSc7CiAgICAkc291cmNlX3NrZWxldG9uX3NoYV9rZXkgPSAkbGVnYWN5X3NvdXJjZQogICAgICAgID8gJ2xlZ2FjeV9ydW50aW1lX3NrZWxldG9uX3NoYTI1NicKICAgICAgICA6ICdydW50aW1lX3NrZWxldG9uX3NoYTI1Nic7CiAgICAkc291cmNlX3NrZWxldG9uX2J5dGVzX2tleSA9ICRsZWdhY3lfc291cmNlCiAgICAgICAgPyAnbGVnYWN5X3J1bnRpbWVfc2tlbGV0b25fYnl0ZXMnCiAgICAgICAgOiAncnVudGltZV9za2VsZXRvbl9ieXRlcyc7CiAgICBpZiAoIWlzX2FycmF5KCRtZXRhZGF0YSkKICAgICAgICB8fCBlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX21hcmtlcihzZXJpYWxpemUoJG1ldGFkYXRhKSkgPT09IGZhbHNlCiAgICAgICAgfHwgIWhhc2hfZXF1YWxzKAogICAgICAgICAgICAkbWF0Y2hlc1sxXSwKICAgICAgICAgICAgcnRyaW0oc3RydHIoYmFzZTY0X2VuY29kZShqc29uX2VuY29kZSgkbWV0YWRhdGEsIEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpKSwgJysvJywgJy1fJyksICc9JykKICAgICAgICApCiAgICAgICAgfHwgIWlzX3N0cmluZygkc291cmNlKQogICAgICAgIHx8ICFoYXNoX2VxdWFscygkbWF0Y2hlc1syXSwgYmFzZTY0X2VuY29kZSgkc291cmNlKSkKICAgICAgICB8fCAkc291cmNlX21hbmlmZXN0ID09PSBmYWxzZQogICAgICAgIHx8ICFpc19zdHJpbmcoJG5vcm1hbGl6ZWRfc291cmNlKQogICAgICAgIHx8ICFpc3NldCgkZW5kcG9pbnRfY29uZmlnWyRzb3VyY2Vfc2tlbGV0b25fc2hhX2tleV0sICRlbmRwb2ludF9jb25maWdbJHNvdXJjZV9za2VsZXRvbl9ieXRlc19rZXldKQogICAgICAgIHx8IHN0cmxlbigkbm9ybWFsaXplZF9zb3VyY2UpICE9PSAoaW50KSAkZW5kcG9pbnRfY29uZmlnWyRzb3VyY2Vfc2tlbGV0b25fYnl0ZXNfa2V5XQogICAgICAgIHx8ICFoYXNoX2VxdWFscygkZW5kcG9pbnRfY29uZmlnWyRzb3VyY2Vfc2tlbGV0b25fc2hhX2tleV0sIGhhc2goJ3NoYTI1NicsICRub3JtYWxpemVkX3NvdXJjZSkpCiAgICAgICAgfHwgIWhhc2hfZXF1YWxzKCRtZXRhZGF0YVsncHJldmlvdXNTaGEyNTYnXSwgaGFzaCgnc2hhMjU2JywgJHNvdXJjZSkpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIGFycmF5KAogICAgICAgICdieXRlcycgPT4gJHdyYXBwZWQsCiAgICAgICAgJ21ldGFkYXRhJyA9PiAkbWV0YWRhdGEsCiAgICAgICAgJ3NvdXJjZScgPT4gJHNvdXJjZSwKICAgICk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfdXBncmFkZV9iYWNrdXAoJHBhdGgsICRieXRlcykgewogICAgJGRpcmVjdG9yeSA9IGRpcm5hbWUoJHBhdGgpOwogICAgaWYgKCFpc19zdHJpbmcoJGJ5dGVzKQogICAgICAgIHx8ICFoYXNoX2VxdWFscyhlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX2JhY2t1cF9wYXRoKCksICRwYXRoKQogICAgICAgIHx8IGlzX2xpbmsoJGRpcmVjdG9yeSkKICAgICAgICB8fCAoaXNfZmlsZSgkcGF0aCkgJiYgaXNfbGluaygkcGF0aCkpCiAgICAgICAgfHwgKCFpc19kaXIoJGRpcmVjdG9yeSkKICAgICAgICAgICAgJiYgKCFmdW5jdGlvbl9leGlzdHMoJ3dwX21rZGlyX3AnKSB8fCAhd3BfbWtkaXJfcCgkZGlyZWN0b3J5KSkpCiAgICAgICAgfHwgIUBjaG1vZCgkZGlyZWN0b3J5LCAwNzAwKQogICAgICAgIHx8ICgoKGludCkgQGZpbGVwZXJtcygkZGlyZWN0b3J5KSkgJiAwMDc3KSAhPT0gMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICR0ZW1wb3JhcnkgPSB0ZW1wbmFtKCRkaXJlY3RvcnksICcuc2l0ZS1oZWFsdGgtYmFja3VwLScpOwogICAgaWYgKCR0ZW1wb3JhcnkgPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJHdyaXR0ZW4gPSBmaWxlX3B1dF9jb250ZW50cygkdGVtcG9yYXJ5LCAkYnl0ZXMsIExPQ0tfRVgpOwogICAgaWYgKCR3cml0dGVuICE9PSBzdHJsZW4oJGJ5dGVzKQogICAgICAgIHx8ICFAY2htb2QoJHRlbXBvcmFyeSwgMDYwMCkKICAgICAgICB8fCAhcmVuYW1lKCR0ZW1wb3JhcnksICRwYXRoKSkgewogICAgICAgIEB1bmxpbmsoJHRlbXBvcmFyeSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnb3BjYWNoZV9pbnZhbGlkYXRlJykpIHsKICAgICAgICBAb3BjYWNoZV9pbnZhbGlkYXRlKCRwYXRoLCB0cnVlKTsKICAgIH0KICAgIGNsZWFyc3RhdGNhY2hlKHRydWUsICRwYXRoKTsKICAgICRyZXN0b3JlZCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICByZXR1cm4gKCgoaW50KSBAZmlsZXBlcm1zKCRwYXRoKSkgJiAwMDc3KSA9PT0gMAogICAgICAgICYmIGlzX3N0cmluZygkcmVzdG9yZWQpCiAgICAgICAgJiYgaGFzaF9lcXVhbHMoJGJ5dGVzLCAkcmVzdG9yZWQpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfc25hcHNob3QoKSB7CiAgICAkcGF0aCA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9wYXRoKCk7CiAgICAkc25hcHNob3QgPSBhcnJheSgKICAgICAgICAncGF0aCcgPT4gJHBhdGgsCiAgICAgICAgJ2ZpbGVFeGlzdHMnID0+IGlzX2ZpbGUoJHBhdGgpLAogICAgICAgICdmaWxlQnl0ZXMnID0+IGlzX2ZpbGUoJHBhdGgpID8gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKSA6IG51bGwsCiAgICAgICAgJ29wdGlvbnMnID0+IGFycmF5KCksCiAgICAgICAgJ2RhaWx5RXZlbnRzJyA9PiBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfaG9va19ldmVudHMoJ3NpdGVfaGVhbHRoX3J1bnRpbWVfZGFpbHlfdjEnKSwKICAgICAgICAncmV0cnlFdmVudHMnID0+IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9ob29rX2V2ZW50cygnc2l0ZV9oZWFsdGhfcnVudGltZV9yZXRyeV92MScpLAogICAgICAgICd1cGdyYWRlQmFja3VwJyA9PiBhcnJheSgKICAgICAgICAgICAgJ3BhdGgnID0+IGVhc3lwb3N0X2VuZHBvaW50X3VwZ3JhZGVfYmFja3VwX3BhdGgoKSwKICAgICAgICAgICAgJ2V4aXN0cycgPT4gZmFsc2UsCiAgICAgICAgICAgICdieXRlcycgPT4gbnVsbCwKICAgICAgICApLAogICAgKTsKICAgIGlmICgoJHNuYXBzaG90WydmaWxlRXhpc3RzJ10gJiYgIWlzX3N0cmluZygkc25hcHNob3RbJ2ZpbGVCeXRlcyddKSkKICAgICAgICB8fCAkc25hcHNob3RbJ2RhaWx5RXZlbnRzJ10gPT09IGZhbHNlCiAgICAgICAgfHwgJHNuYXBzaG90WydyZXRyeUV2ZW50cyddID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICR1cGdyYWRlX3JvdyA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3Jvdygnc2l0ZV9oZWFsdGhfcnVudGltZV91cGdyYWRlX3YxJyk7CiAgICAkdXBncmFkZV9leGlzdHMgPSBlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX2JhY2t1cF9leGlzdHMoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSk7CiAgICBpZiAoJHVwZ3JhZGVfcm93WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJwogICAgICAgIHx8ICgkdXBncmFkZV9yb3dbJ3N0YXR1cyddID09PSAnZm91bmQnKSAhPT0gJHVwZ3JhZGVfZXhpc3RzKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCR1cGdyYWRlX2V4aXN0cykgewogICAgICAgICRtYXJrZXIgPSBlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX21hcmtlcigkdXBncmFkZV9yb3dbJ3JhdyddKTsKICAgICAgICAkYmFja3VwID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF91cGdyYWRlX2JhY2t1cCgkc25hcHNob3RbJ3VwZ3JhZGVCYWNrdXAnXVsncGF0aCddKTsKICAgICAgICBpZiAoJHVwZ3JhZGVfcm93WydhdXRvbG9hZCddICE9PSAnbm8nCiAgICAgICAgICAgIHx8ICRtYXJrZXIgPT09IGZhbHNlCiAgICAgICAgICAgIHx8ICRiYWNrdXAgPT09IGZhbHNlCiAgICAgICAgICAgIHx8ICRiYWNrdXBbJ21ldGFkYXRhJ10gIT09ICRtYXJrZXIKICAgICAgICAgICAgfHwgISRzbmFwc2hvdFsnZmlsZUV4aXN0cyddCiAgICAgICAgICAgIHx8ICFoYXNoX2VxdWFscygkbWFya2VyWydkZXNpcmVkU2hhMjU2J10sIGhhc2goJ3NoYTI1NicsICRzbmFwc2hvdFsnZmlsZUJ5dGVzJ10pKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICRzbmFwc2hvdFsndXBncmFkZUJhY2t1cCddWydleGlzdHMnXSA9IHRydWU7CiAgICAgICAgJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ2J5dGVzJ10gPSAkYmFja3VwWydieXRlcyddOwogICAgfQogICAgZm9yZWFjaCAoYXJyYXkoCiAgICAgICAgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfYnVuZGxlX3YxJywKICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV9jb25maWd1cmF0aW9uX3YxJywKICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV9kaXNhYmxlZF92MScsCiAgICAgICAgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfZGFpbHlfc2Vjb25kX3YxJywKICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV9wZW5kaW5nX3YxJywKICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV9yZXRyeV9ldmVudF92MScsCiAgICAgICAgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfc2NoZWR1bGVfbG9ja192MScsCiAgICAgICAgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfdXBncmFkZV92MScKICAgICkgYXMgJG5hbWUpIHsKICAgICAgICAkcm93ID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCRuYW1lKTsKICAgICAgICBpZiAoJHJvd1snc3RhdHVzJ10gPT09ICd1bmF2YWlsYWJsZScpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkc25hcHNob3RbJ29wdGlvbnMnXVskbmFtZV0gPSBhcnJheSgKICAgICAgICAgICAgJ3N0YXR1cycgPT4gJHJvd1snc3RhdHVzJ10sCiAgICAgICAgICAgICdyYXcnID0+ICRyb3dbJ3JhdyddLAogICAgICAgICAgICAnYXV0b2xvYWQnID0+ICRyb3dbJ2F1dG9sb2FkJ10sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkc25hcHNob3Q7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfc2l0ZV9ydW50aW1lX29wdGlvbigkbmFtZSwgJHN0YXRlKSB7CiAgICBnbG9iYWwgJHdwZGI7CiAgICBpZiAoIWlzX2FycmF5KCRzdGF0ZSkKICAgICAgICB8fCAhaXNzZXQoJHN0YXRlWydzdGF0dXMnXSkKICAgICAgICB8fCAhaXNzZXQoJHdwZGIpCiAgICAgICAgfHwgIWlzc2V0KCR3cGRiLT5vcHRpb25zKQogICAgICAgIHx8ICFtZXRob2RfZXhpc3RzKCR3cGRiLCAncXVlcnknKQogICAgICAgIHx8ICFtZXRob2RfZXhpc3RzKCR3cGRiLCAncHJlcGFyZScpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJGN1cnJlbnQgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX29wdGlvbl9yb3coJG5hbWUpOwogICAgaWYgKCRjdXJyZW50WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICgkc3RhdGVbJ3N0YXR1cyddID09PSAnbWlzc2luZycpIHsKICAgICAgICBpZiAoJGN1cnJlbnRbJ3N0YXR1cyddID09PSAnbWlzc2luZycpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgICRjaGFuZ2VkID0gJHdwZGItPnF1ZXJ5KCR3cGRiLT5wcmVwYXJlKAogICAgICAgICAgICAiREVMRVRFIEZST00geyR3cGRiLT5vcHRpb25zfSBXSEVSRSBvcHRpb25fbmFtZSA9ICVzIEFORCBvcHRpb25fdmFsdWUgPSAlcyIsCiAgICAgICAgICAgICRuYW1lLAogICAgICAgICAgICAkY3VycmVudFsncmF3J10KICAgICAgICApKTsKICAgICAgICBpZiAoKGludCkgJGNoYW5nZWQgIT09IDEpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9jYWNoZV9vcHRpb25fZGVsZXRlZCgKICAgICAgICAgICAgJG5hbWUsCiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X29wdGlvbl9pc19hdXRvbG9hZGVkKCRjdXJyZW50WydhdXRvbG9hZCddKQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3JvdygkbmFtZSlbJ3N0YXR1cyddID09PSAnbWlzc2luZyc7CiAgICB9CiAgICBpZiAoJHN0YXRlWydzdGF0dXMnXSAhPT0gJ2ZvdW5kJyB8fCAhaXNfc3RyaW5nKCRzdGF0ZVsncmF3J10pIHx8ICFpc19zdHJpbmcoJHN0YXRlWydhdXRvbG9hZCddKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICgkY3VycmVudFsnc3RhdHVzJ10gPT09ICdmb3VuZCcKICAgICAgICAmJiAkY3VycmVudFsncmF3J10gPT09ICRzdGF0ZVsncmF3J10KICAgICAgICAmJiAkY3VycmVudFsnYXV0b2xvYWQnXSA9PT0gJHN0YXRlWydhdXRvbG9hZCddKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoJGN1cnJlbnRbJ3N0YXR1cyddID09PSAnbWlzc2luZycpIHsKICAgICAgICAkY2hhbmdlZCA9ICR3cGRiLT5xdWVyeSgkd3BkYi0+cHJlcGFyZSgKICAgICAgICAgICAgIklOU0VSVCBJR05PUkUgSU5UTyB7JHdwZGItPm9wdGlvbnN9IChvcHRpb25fbmFtZSwgb3B0aW9uX3ZhbHVlLCBhdXRvbG9hZCkgVkFMVUVTICglcywgJXMsICVzKSIsCiAgICAgICAgICAgICRuYW1lLAogICAgICAgICAgICAkc3RhdGVbJ3JhdyddLAogICAgICAgICAgICAkc3RhdGVbJ2F1dG9sb2FkJ10KICAgICAgICApKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGNoYW5nZWQgPSAkd3BkYi0+cXVlcnkoJHdwZGItPnByZXBhcmUoCiAgICAgICAgICAgICJVUERBVEUgeyR3cGRiLT5vcHRpb25zfSBTRVQgb3B0aW9uX3ZhbHVlID0gJXMsIGF1dG9sb2FkID0gJXMgV0hFUkUgb3B0aW9uX25hbWUgPSAlcyBBTkQgb3B0aW9uX3ZhbHVlID0gJXMiLAogICAgICAgICAgICAkc3RhdGVbJ3JhdyddLAogICAgICAgICAgICAkc3RhdGVbJ2F1dG9sb2FkJ10sCiAgICAgICAgICAgICRuYW1lLAogICAgICAgICAgICAkY3VycmVudFsncmF3J10KICAgICAgICApKTsKICAgIH0KICAgIGlmICgoaW50KSAkY2hhbmdlZCAhPT0gMSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVhc3lwb3N0X2VuZHBvaW50X2NhY2hlX29wdGlvbl93cml0dGVuKCRuYW1lLCB0cnVlLCB0cnVlKTsKICAgICR2ZXJpZmllZCA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3JvdygkbmFtZSk7CiAgICByZXR1cm4gJHZlcmlmaWVkWydzdGF0dXMnXSA9PT0gJ2ZvdW5kJwogICAgICAgICYmICR2ZXJpZmllZFsncmF3J10gPT09ICRzdGF0ZVsncmF3J10KICAgICAgICAmJiAkdmVyaWZpZWRbJ2F1dG9sb2FkJ10gPT09ICRzdGF0ZVsnYXV0b2xvYWQnXTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfdmVyaWZ5X3NpdGVfcnVudGltZV9zbmFwc2hvdCgkc25hcHNob3QpIHsKICAgICRwYXRoX2V4aXN0cyA9IGlzX2ZpbGUoJHNuYXBzaG90WydwYXRoJ10pOwogICAgaWYgKCRwYXRoX2V4aXN0cyAhPT0gKGJvb2wpICRzbmFwc2hvdFsnZmlsZUV4aXN0cyddKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCRwYXRoX2V4aXN0cykgewogICAgICAgICRieXRlcyA9IEBmaWxlX2dldF9jb250ZW50cygkc25hcHNob3RbJ3BhdGgnXSk7CiAgICAgICAgaWYgKCFpc19zdHJpbmcoJGJ5dGVzKSB8fCAhaGFzaF9lcXVhbHMoJHNuYXBzaG90WydmaWxlQnl0ZXMnXSwgJGJ5dGVzKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgJGJhY2t1cF9leGlzdHMgPSBlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX2JhY2t1cF9leGlzdHMoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSk7CiAgICBpZiAoJGJhY2t1cF9leGlzdHMgIT09IChib29sKSAkc25hcHNob3RbJ3VwZ3JhZGVCYWNrdXAnXVsnZXhpc3RzJ10pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoJGJhY2t1cF9leGlzdHMpIHsKICAgICAgICAkYmFja3VwID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF91cGdyYWRlX2JhY2t1cCgkc25hcHNob3RbJ3VwZ3JhZGVCYWNrdXAnXVsncGF0aCddKTsKICAgICAgICBpZiAoJGJhY2t1cCA9PT0gZmFsc2UgfHwgIWhhc2hfZXF1YWxzKCRzbmFwc2hvdFsndXBncmFkZUJhY2t1cCddWydieXRlcyddLCAkYmFja3VwWydieXRlcyddKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZm9yZWFjaCAoJHNuYXBzaG90WydvcHRpb25zJ10gYXMgJG5hbWUgPT4gJGV4cGVjdGVkKSB7CiAgICAgICAgJGFjdHVhbCA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3JvdygkbmFtZSk7CiAgICAgICAgaWYgKCRhY3R1YWxbJ3N0YXR1cyddICE9PSAkZXhwZWN0ZWRbJ3N0YXR1cyddKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRleHBlY3RlZFsnc3RhdHVzJ10gPT09ICdmb3VuZCcKICAgICAgICAgICAgJiYgKCRhY3R1YWxbJ3JhdyddICE9PSAkZXhwZWN0ZWRbJ3JhdyddIHx8ICRhY3R1YWxbJ2F1dG9sb2FkJ10gIT09ICRleHBlY3RlZFsnYXV0b2xvYWQnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfZXZlbnRfZmluZ2VycHJpbnRzKGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9ob29rX2V2ZW50cygnc2l0ZV9oZWFsdGhfcnVudGltZV9kYWlseV92MScpKQogICAgICAgICAgICA9PT0gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2V2ZW50X2ZpbmdlcnByaW50cygkc25hcHNob3RbJ2RhaWx5RXZlbnRzJ10pCiAgICAgICAgJiYgZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2V2ZW50X2ZpbmdlcnByaW50cyhlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfaG9va19ldmVudHMoJ3NpdGVfaGVhbHRoX3J1bnRpbWVfcmV0cnlfdjEnKSkKICAgICAgICAgICAgPT09IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9ldmVudF9maW5nZXJwcmludHMoJHNuYXBzaG90WydyZXRyeUV2ZW50cyddKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcmVzdG9yZV9zaXRlX3J1bnRpbWVfc25hcHNob3QoJHNuYXBzaG90KSB7CiAgICBpZiAoIWlzX2FycmF5KCRzbmFwc2hvdCkKICAgICAgICB8fCAhaXNzZXQoJHNuYXBzaG90WydwYXRoJ10sICRzbmFwc2hvdFsnb3B0aW9ucyddLCAkc25hcHNob3RbJ2RhaWx5RXZlbnRzJ10sICRzbmFwc2hvdFsncmV0cnlFdmVudHMnXSwgJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ10pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJG9rID0gdHJ1ZTsKICAgIGlmICgkc25hcHNob3RbJ2ZpbGVFeGlzdHMnXSkgewogICAgICAgICRyZXN0b3JlZF9wYXRoID0gZWFzeXBvc3RfZW5kcG9pbnRfYXRvbWljX3NpdGVfcnVudGltZV93cml0ZSgkc25hcHNob3RbJ2ZpbGVCeXRlcyddLCBmYWxzZSk7CiAgICAgICAgJG9rID0gJHJlc3RvcmVkX3BhdGggIT09IGZhbHNlICYmICRvazsKICAgIH0gZWxzZWlmIChpc19maWxlKCRzbmFwc2hvdFsncGF0aCddKSkgewogICAgICAgICRvayA9IEB1bmxpbmsoJHNuYXBzaG90WydwYXRoJ10pICYmICFpc19maWxlKCRzbmFwc2hvdFsncGF0aCddKSAmJiAkb2s7CiAgICB9CiAgICBpZiAoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ2V4aXN0cyddKSB7CiAgICAgICAgJG9rID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVzdG9yZV91cGdyYWRlX2JhY2t1cCgKICAgICAgICAgICAgJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSwKICAgICAgICAgICAgJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ2J5dGVzJ10KICAgICAgICApICYmICRvazsKICAgIH0gZWxzZWlmIChlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX2JhY2t1cF9leGlzdHMoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSkpIHsKICAgICAgICAkb2sgPSBmYWxzZTsKICAgIH0KICAgIGZvcmVhY2ggKCRzbmFwc2hvdFsnb3B0aW9ucyddIGFzICRuYW1lID0+ICRzdGF0ZSkgewogICAgICAgICRvayA9IGVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfc2l0ZV9ydW50aW1lX29wdGlvbigkbmFtZSwgJHN0YXRlKSAmJiAkb2s7CiAgICB9CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2snKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRvayA9IHdwX2NsZWFyX3NjaGVkdWxlZF9ob29rKCdzaXRlX2hlYWx0aF9ydW50aW1lX2RhaWx5X3YxJykgIT09IGZhbHNlICYmICRvazsKICAgICRvayA9IHdwX2NsZWFyX3NjaGVkdWxlZF9ob29rKCdzaXRlX2hlYWx0aF9ydW50aW1lX3JldHJ5X3YxJykgIT09IGZhbHNlICYmICRvazsKICAgIGZvcmVhY2ggKGFycmF5KAogICAgICAgICdzaXRlX2hlYWx0aF9ydW50aW1lX2RhaWx5X3YxJyA9PiAkc25hcHNob3RbJ2RhaWx5RXZlbnRzJ10sCiAgICAgICAgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfcmV0cnlfdjEnID0+ICRzbmFwc2hvdFsncmV0cnlFdmVudHMnXQogICAgKSBhcyAkaG9vayA9PiAkZXZlbnRzKSB7CiAgICAgICAgZm9yZWFjaCAoJGV2ZW50cyBhcyAkZXZlbnQpIHsKICAgICAgICAgICAgJHNjaGVkdWxlZCA9ICRldmVudFsnc2NoZWR1bGUnXQogICAgICAgICAgICAgICAgPyB3cF9zY2hlZHVsZV9ldmVudCgkZXZlbnRbJ3RpbWVzdGFtcCddLCAkZXZlbnRbJ3NjaGVkdWxlJ10sICRob29rLCAkZXZlbnRbJ2FyZ3MnXSkKICAgICAgICAgICAgICAgIDogd3Bfc2NoZWR1bGVfc2luZ2xlX2V2ZW50KCRldmVudFsndGltZXN0YW1wJ10sICRob29rLCAkZXZlbnRbJ2FyZ3MnXSk7CiAgICAgICAgICAgICRvayA9ICRzY2hlZHVsZWQgIT09IGZhbHNlICYmICRvazsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGNhY2hlX2ludmFsaWRhdGUnKSkgewogICAgICAgIEBvcGNhY2hlX2ludmFsaWRhdGUoJHNuYXBzaG90WydwYXRoJ10sIHRydWUpOwogICAgfQogICAgcmV0dXJuICRvayAmJiBlYXN5cG9zdF9lbmRwb2ludF92ZXJpZnlfc2l0ZV9ydW50aW1lX3NuYXBzaG90KCRzbmFwc2hvdCk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2NsZWFudXBfcGVuZGluZ191cGdyYWRlKCRzbmFwc2hvdCkgewogICAgaWYgKCFpc19hcnJheSgkc25hcHNob3QpIHx8ICFpc3NldCgkc25hcHNob3RbJ3VwZ3JhZGVCYWNrdXAnXSwgJHNuYXBzaG90WydvcHRpb25zJ11bJ3NpdGVfaGVhbHRoX3J1bnRpbWVfdXBncmFkZV92MSddKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ2V4aXN0cyddKSB7CiAgICAgICAgJGN1cnJlbnRfbWFya2VyID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCdzaXRlX2hlYWx0aF9ydW50aW1lX3VwZ3JhZGVfdjEnKTsKICAgICAgICByZXR1cm4gJGN1cnJlbnRfbWFya2VyWydzdGF0dXMnXSA9PT0gJ21pc3NpbmcnCiAgICAgICAgICAgICYmICFlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX2JhY2t1cF9leGlzdHMoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSk7CiAgICB9CiAgICAkbWFya2VyX3N0YXRlID0gJHNuYXBzaG90WydvcHRpb25zJ11bJ3NpdGVfaGVhbHRoX3J1bnRpbWVfdXBncmFkZV92MSddOwogICAgJGN1cnJlbnRfbWFya2VyID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCdzaXRlX2hlYWx0aF9ydW50aW1lX3VwZ3JhZGVfdjEnKTsKICAgICRiYWNrdXAgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX3VwZ3JhZGVfYmFja3VwKCRzbmFwc2hvdFsndXBncmFkZUJhY2t1cCddWydwYXRoJ10pOwogICAgaWYgKCRtYXJrZXJfc3RhdGVbJ3N0YXR1cyddICE9PSAnZm91bmQnCiAgICAgICAgfHwgJGN1cnJlbnRfbWFya2VyWydzdGF0dXMnXSAhPT0gJ2ZvdW5kJwogICAgICAgIHx8ICRjdXJyZW50X21hcmtlclsncmF3J10gIT09ICRtYXJrZXJfc3RhdGVbJ3JhdyddCiAgICAgICAgfHwgJGN1cnJlbnRfbWFya2VyWydhdXRvbG9hZCddICE9PSAnbm8nCiAgICAgICAgfHwgJGJhY2t1cCA9PT0gZmFsc2UKICAgICAgICB8fCAhaGFzaF9lcXVhbHMoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ2J5dGVzJ10sICRiYWNrdXBbJ2J5dGVzJ10pCiAgICAgICAgfHwgIUB1bmxpbmsoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvcGNhY2hlX2ludmFsaWRhdGUnKSkgewogICAgICAgIEBvcGNhY2hlX2ludmFsaWRhdGUoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSwgdHJ1ZSk7CiAgICB9CiAgICBjbGVhcnN0YXRjYWNoZSh0cnVlLCAkc25hcHNob3RbJ3VwZ3JhZGVCYWNrdXAnXVsncGF0aCddKTsKICAgIGlmIChlYXN5cG9zdF9lbmRwb2ludF91cGdyYWRlX2JhY2t1cF9leGlzdHMoJHNuYXBzaG90Wyd1cGdyYWRlQmFja3VwJ11bJ3BhdGgnXSkKICAgICAgICB8fCAhZWFzeXBvc3RfZW5kcG9pbnRfcmVzdG9yZV9zaXRlX3J1bnRpbWVfb3B0aW9uKAogICAgICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV91cGdyYWRlX3YxJywKICAgICAgICAgICAgYXJyYXkoJ3N0YXR1cycgPT4gJ21pc3NpbmcnLCAncmF3JyA9PiBudWxsLCAnYXV0b2xvYWQnID0+IG51bGwpCiAgICAgICAgKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX29wdGlvbl9yb3coJ3NpdGVfaGVhbHRoX3J1bnRpbWVfdXBncmFkZV92MScpWydzdGF0dXMnXSA9PT0gJ21pc3NpbmcnCiAgICAgICAgJiYgIWVhc3lwb3N0X2VuZHBvaW50X3VwZ3JhZGVfYmFja3VwX2V4aXN0cygkc25hcHNob3RbJ3VwZ3JhZGVCYWNrdXAnXVsncGF0aCddKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfZGlzYWJsZWRfc2l0ZV9ydW50aW1lX3BocCgpIHsKICAgIHJldHVybiBiYXNlNjRfZGVjb2RlKCdQRDl3YUhBS0x5b2dVMGxVUlY5SVJVRk1WRWhmVWxWT1ZFbE5SVjlDUlVkSlRsOVdNU0FxTHdvdktpQlRTVlJGWDBoRlFVeFVTRjlTVlU1VVNVMUZYMDFCVGtsR1JWTlVYMVl4SUdWNVNqSmFXRXA2WVZjNWRVbHFiM2hNUTBwc1ltMUdhV0pIVm10SmFuQnRXVmQ0ZWxwVGQybGpibFoxWkVkc2RGcFdXbXhqYms1d1lqSTBhVTlwU1hsTlJFa3lUR3BCTkV4cVJYbEphWGRwV1RJNWRWcHRiRzVrV0Vwb1pFZHNkbUpzV214amJrNXdZakkwYVU5dE5URmlSM2c1SUNvdkNtbG1JQ2doWkdWbWFXNWxaQ2duUVVKVFVFRlVTQ2NwS1NCN0NpQWdJQ0JsZUdsME93cDlDbWxtSUNobWRXNWpkR2x2Ymw5bGVHbHpkSE1vSjNWd1pHRjBaVjl2Y0hScGIyNG5LU2tnZXdvZ0lDQWdkWEJrWVhSbFgyOXdkR2x2YmlnbmMybDBaVjlvWldGc2RHaGZjblZ1ZEdsdFpWOWthWE5oWW14bFpGOTJNU2NzSUNjeEp5d2dKMjV2SnlrN0NuMGdaV3h6WldsbUlDaG1kVzVqZEdsdmJsOWxlR2x6ZEhNb0oyRmtaRjl2Y0hScGIyNG5LU2tnZXdvZ0lDQWdZV1JrWDI5d2RHbHZiaWduYzJsMFpWOW9aV0ZzZEdoZmNuVnVkR2x0WlY5a2FYTmhZbXhsWkY5Mk1TY3NJQ2N4Snl3Z0p5Y3NJQ2R1YnljcE93cDlDaThxSUZOSlZFVmZTRVZCVEZSSVgxSlZUbFJKVFVWZlJVNUVYMVl4SUNvdkNnPT0nLCB0cnVlKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX3BhcnNlX2RhaWx5X3NlY29uZCgkdmFsdWUpIHsKICAgIGlmIChpc19zdHJpbmcoJHZhbHVlKSkgewogICAgICAgIGlmICghcHJlZ19tYXRjaCgnL1xBKD86MHxbMS05XVswLTldezAsNH0pXHovJywgJHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgJHZhbHVlID0gKGludCkgJHZhbHVlOwogICAgfQogICAgcmV0dXJuIGlzX2ludCgkdmFsdWUpICYmICR2YWx1ZSA+PSAwICYmICR2YWx1ZSA8PSA4NjM5OSA/ICR2YWx1ZSA6IG51bGw7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9zdGF0dXNfcGF5bG9hZCgpIHsKICAgICRydW50aW1lX3BhdGggPSBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfcGF0aCgpOwogICAgJHJ1bnRpbWVfcGhwID0gaXNfcmVhZGFibGUoJHJ1bnRpbWVfcGF0aCkKICAgICAgICA/IEBmaWxlX2dldF9jb250ZW50cygkcnVudGltZV9wYXRoLCBmYWxzZSwgbnVsbCwgMCwgMjYyMTQ1KQogICAgICAgIDogZmFsc2U7CiAgICAkbWFuaWZlc3QgPSAkcnVudGltZV9waHAgPT09IGZhbHNlCiAgICAgICAgPyBmYWxzZQogICAgICAgIDogZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX21hbmlmZXN0KCRydW50aW1lX3BocCk7CiAgICAkc2xvdF9yb3cgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX29wdGlvbl9yb3coJ3NpdGVfaGVhbHRoX3J1bnRpbWVfZGFpbHlfc2Vjb25kX3YxJyk7CiAgICAkYnVuZGxlX3JvdyA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3Jvdygnc2l0ZV9oZWFsdGhfcnVudGltZV9idW5kbGVfdjEnKTsKICAgICRjb25maWd1cmF0aW9uX3JvdyA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3Jvdygnc2l0ZV9oZWFsdGhfcnVudGltZV9jb25maWd1cmF0aW9uX3YxJyk7CiAgICAkZGlzYWJsZWRfcm93ID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCdzaXRlX2hlYWx0aF9ydW50aW1lX2Rpc2FibGVkX3YxJyk7CiAgICBpZiAoJHNsb3Rfcm93WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJwogICAgICAgIHx8ICRidW5kbGVfcm93WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJwogICAgICAgIHx8ICRjb25maWd1cmF0aW9uX3Jvd1snc3RhdHVzJ10gPT09ICd1bmF2YWlsYWJsZScKICAgICAgICB8fCAkZGlzYWJsZWRfcm93WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJykgewogICAgICAgIHJldHVybiBhcnJheSgnb2snID0+IGZhbHNlLCAnZW5hYmxlZCcgPT4gZmFsc2UsICdydW50aW1lTW9kZScgPT4gbnVsbCk7CiAgICB9CiAgICAkc2xvdCA9ICRzbG90X3Jvd1snc3RhdHVzJ10gPT09ICdmb3VuZCcKICAgICAgICA/IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9wYXJzZV9kYWlseV9zZWNvbmQoJHNsb3Rfcm93WydyYXcnXSkKICAgICAgICA6IG51bGw7CiAgICAkZGlzYWJsZWQgPSAkZGlzYWJsZWRfcm93WydzdGF0dXMnXSA9PT0gJ2ZvdW5kJyAmJiAkZGlzYWJsZWRfcm93WydyYXcnXSA9PT0gJzEnOwogICAgJGVuYWJsZWQgPSBpc19hcnJheSgkbWFuaWZlc3QpICYmICRtYW5pZmVzdFsnZW5hYmxlZCddID09PSB0cnVlCiAgICAgICAgJiYgISRkaXNhYmxlZAogICAgICAgICYmICRidW5kbGVfcm93WydzdGF0dXMnXSA9PT0gJ2ZvdW5kJwogICAgICAgICYmICRjb25maWd1cmF0aW9uX3Jvd1snc3RhdHVzJ10gPT09ICdmb3VuZCcKICAgICAgICAmJiBpc19zdHJpbmcoJG1hbmlmZXN0Wydjb25maWd1cmF0aW9uVmVyc2lvbiddKQogICAgICAgICYmIGhhc2hfZXF1YWxzKCRtYW5pZmVzdFsnY29uZmlndXJhdGlvblZlcnNpb24nXSwgJGNvbmZpZ3VyYXRpb25fcm93WydyYXcnXSkKICAgICAgICAmJiAkc2xvdCAhPT0gbnVsbDsKICAgIHJldHVybiBhcnJheSgKICAgICAgICAnb2snID0+IHRydWUsCiAgICAgICAgJ2VuYWJsZWQnID0+ICRlbmFibGVkLAogICAgICAgICdydW50aW1lVmVyc2lvbicgPT4gaXNfYXJyYXkoJG1hbmlmZXN0KSA/ICRtYW5pZmVzdFsncnVudGltZVZlcnNpb24nXSA6IG51bGwsCiAgICAgICAgJ2NvbmZpZ3VyYXRpb25WZXJzaW9uJyA9PiBpc19hcnJheSgkbWFuaWZlc3QpID8gJG1hbmlmZXN0Wydjb25maWd1cmF0aW9uVmVyc2lvbiddIDogbnVsbCwKICAgICAgICAnZGFpbHlTZWNvbmRVdGMnID0+ICRzbG90LAogICAgICAgICdzY2hlZHVsZWQnID0+IHdwX25leHRfc2NoZWR1bGVkKCdzaXRlX2hlYWx0aF9ydW50aW1lX2RhaWx5X3YxJykgIT09IGZhbHNlLAogICAgICAgICdydW50aW1lTW9kZScgPT4gJGVuYWJsZWQgPyAnTVVfUExVR0lOJyA6IG51bGwsCiAgICApOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9hY3F1aXJlX2ludGVybmFsX3J1bnRpbWVfbGVhc2UoKSB7CiAgICAkb3duZXIgPSBzdHJ0b2xvd2VyKHdwX2dlbmVyYXRlX3V1aWQ0KCkpOwogICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3V1aWQoJG93bmVyKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRub3cgPSB0aW1lKCk7CiAgICAkZGVzaXJlZCA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9sZWFzZV92YWx1ZShhcnJheSgKICAgICAgICAndmVyc2lvbicgPT4gMSwKICAgICAgICAnb3duZXInID0+ICRvd25lciwKICAgICAgICAnc291cmNlJyA9PiAnUkVNT1RFJywKICAgICAgICAnYWNxdWlyZWRBdCcgPT4gJG5vdywKICAgICAgICAnZXhwaXJlc0F0JyA9PiAkbm93ICsgNjAwLAogICAgKSk7CiAgICAkaW5zZXJ0ZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9pbnNlcnRfb3B0aW9uX29uY2UoJ3NpdGVfaGVhbHRoX3J1bnRpbWVfbGVhc2VfdjEnLCAkZGVzaXJlZCk7CiAgICBpZiAoJGluc2VydGVkID09PSAnaW5zZXJ0ZWQnKSB7CiAgICAgICAgcmV0dXJuICRvd25lcjsKICAgIH0KICAgIGlmICgkaW5zZXJ0ZWQgPT09ICd1bmF2YWlsYWJsZScpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkcm93ID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCdzaXRlX2hlYWx0aF9ydW50aW1lX2xlYXNlX3YxJyk7CiAgICAkb2JzZXJ2ZWQgPSAkcm93WydzdGF0dXMnXSA9PT0gJ2ZvdW5kJwogICAgICAgID8gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2xlYXNlX3N0YXRlKCRyb3dbJ3JhdyddKQogICAgICAgIDogZmFsc2U7CiAgICByZXR1cm4gJG9ic2VydmVkICE9PSBmYWxzZQogICAgICAgICYmICRvYnNlcnZlZFsnZXhwaXJlc0F0J10gPD0gJG5vdwogICAgICAgICYmIGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9sZWFzZV9jb21wYXJlX3N3YXAoJHJvd1sncmF3J10sICRkZXNpcmVkLCAkcm93WydhdXRvbG9hZCddKQogICAgICAgID8gJG93bmVyCiAgICAgICAgOiBmYWxzZTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfcmVsZWFzZV9pbnRlcm5hbF9ydW50aW1lX2xlYXNlKCRvd25lcikgewogICAgZ2xvYmFsICR3cGRiOwogICAgJHJvdyA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3Jvdygnc2l0ZV9oZWFsdGhfcnVudGltZV9sZWFzZV92MScpOwogICAgaWYgKCRyb3dbJ3N0YXR1cyddICE9PSAnZm91bmQnCiAgICAgICAgfHwgIWlzc2V0KCR3cGRiKQogICAgICAgIHx8ICFpc3NldCgkd3BkYi0+b3B0aW9ucykKICAgICAgICB8fCAhbWV0aG9kX2V4aXN0cygkd3BkYiwgJ3F1ZXJ5JykKICAgICAgICB8fCAhbWV0aG9kX2V4aXN0cygkd3BkYiwgJ3ByZXBhcmUnKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgICRzdGF0ZSA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9sZWFzZV9zdGF0ZSgkcm93WydyYXcnXSk7CiAgICBpZiAoJHN0YXRlID09PSBmYWxzZSB8fCAkc3RhdGVbJ2V4cGlyZXNBdCddIDw9IHRpbWUoKSB8fCAhaGFzaF9lcXVhbHMoJHN0YXRlWydvd25lciddLCAoc3RyaW5nKSAkb3duZXIpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJGRlbGV0ZWQgPSAkd3BkYi0+cXVlcnkoJHdwZGItPnByZXBhcmUoCiAgICAgICAgIkRFTEVURSBGUk9NIHskd3BkYi0+b3B0aW9uc30gV0hFUkUgb3B0aW9uX25hbWUgPSAlcyBBTkQgb3B0aW9uX3ZhbHVlID0gJXMiLAogICAgICAgICdzaXRlX2hlYWx0aF9ydW50aW1lX2xlYXNlX3YxJywKICAgICAgICAkcm93WydyYXcnXQogICAgKSk7CiAgICBpZiAoKGludCkgJGRlbGV0ZWQgIT09IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlYXN5cG9zdF9lbmRwb2ludF9jYWNoZV9vcHRpb25fZGVsZXRlZCgKICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV9sZWFzZV92MScsCiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfb3B0aW9uX2lzX2F1dG9sb2FkZWQoJHJvd1snYXV0b2xvYWQnXSkKICAgICk7CiAgICByZXR1cm4gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCdzaXRlX2hlYWx0aF9ydW50aW1lX2xlYXNlX3YxJylbJ3N0YXR1cyddID09PSAnbWlzc2luZyc7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfcm9sbGJhY2tfZXJyb3IoJG93bmVyLCAkc25hcHNob3QsICRvcmRpbmFyeV9lcnJvcikgewogICAgJHJlc3RvcmVkID0gaXNfYXJyYXkoJHNuYXBzaG90KSAmJiBlYXN5cG9zdF9lbmRwb2ludF9yZXN0b3JlX3NpdGVfcnVudGltZV9zbmFwc2hvdCgkc25hcHNob3QpOwogICAgJHJlbGVhc2VkID0gaXNfc3RyaW5nKCRvd25lcikgJiYgZWFzeXBvc3RfZW5kcG9pbnRfcmVsZWFzZV9pbnRlcm5hbF9ydW50aW1lX2xlYXNlKCRvd25lcik7CiAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDUwMCwgYXJyYXkoCiAgICAgICAgJ29rJyA9PiBmYWxzZSwKICAgICAgICAnZXJyb3InID0+ICRyZXN0b3JlZCAmJiAkcmVsZWFzZWQgPyAkb3JkaW5hcnlfZXJyb3IgOiAncnVudGltZV9yb2xsYmFja19mYWlsZWQnLAogICAgKSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2NvbmZpZ3VyZV9zaXRlX3J1bnRpbWUoJHBheWxvYWQpIHsKICAgIGlmICghaXNzZXQoJHBheWxvYWRbJ3J1bnRpbWVQaHBCYXNlNjQnXSkKICAgICAgICB8fCAhaXNfc3RyaW5nKCRwYXlsb2FkWydydW50aW1lUGhwQmFzZTY0J10pCiAgICAgICAgfHwgc3RybGVuKCRwYXlsb2FkWydydW50aW1lUGhwQmFzZTY0J10pID4gMzQ5NTI4KSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfcGhwX3JlcXVpcmVkJykpOwogICAgfQogICAgJGRlY29kZWRfcGhwID0gYmFzZTY0X2RlY29kZSgkcGF5bG9hZFsncnVudGltZVBocEJhc2U2NCddLCB0cnVlKTsKICAgIGlmICgkZGVjb2RlZF9waHAgPT09IGZhbHNlCiAgICAgICAgfHwgJGRlY29kZWRfcGhwID09PSAnJwogICAgICAgIHx8ICFoYXNoX2VxdWFscygkcGF5bG9hZFsncnVudGltZVBocEJhc2U2NCddLCBiYXNlNjRfZW5jb2RlKCRkZWNvZGVkX3BocCkpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfcGhwX2ludmFsaWQnKSk7CiAgICB9CiAgICAkcnVudGltZV9jb25maWcgPSBlYXN5cG9zdF9lbmRwb2ludF92YWxpZGF0ZV9zaXRlX3J1bnRpbWUoJHBheWxvYWQsICRkZWNvZGVkX3BocCk7CiAgICAkb3duZXIgPSBlYXN5cG9zdF9lbmRwb2ludF9hY3F1aXJlX2ludGVybmFsX3J1bnRpbWVfbGVhc2UoKTsKICAgIGlmICgkb3duZXIgPT09IGZhbHNlKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDksIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3J1bnRpbWVfYnVzeScpKTsKICAgIH0KICAgICRzbmFwc2hvdCA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9zbmFwc2hvdCgpOwogICAgaWYgKCRzbmFwc2hvdCA9PT0gZmFsc2UpIHsKICAgICAgICAkcmVsZWFzZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWxlYXNlX2ludGVybmFsX3J1bnRpbWVfbGVhc2UoJG93bmVyKTsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDUwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkcmVsZWFzZWQgPyAncnVudGltZV9zbmFwc2hvdF9mYWlsZWQnIDogJ3J1bnRpbWVfcm9sbGJhY2tfZmFpbGVkJykpOwogICAgfQogICAgJHJ1bnRpbWVfcGF0aCA9IGVhc3lwb3N0X2VuZHBvaW50X2F0b21pY19zaXRlX3J1bnRpbWVfd3JpdGUoJGRlY29kZWRfcGhwLCBmYWxzZSk7CiAgICBpZiAoJHJ1bnRpbWVfcGF0aCA9PT0gZmFsc2UpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3JvbGxiYWNrX2Vycm9yKCRvd25lciwgJHNuYXBzaG90LCAncnVudGltZV93cml0ZV9mYWlsZWQnKTsKICAgIH0KICAgIHRyeSB7CiAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3NpdGVfaGVhbHRoX3J1bnRpbWVfYWN0aXZhdGUnKSkgewogICAgICAgICAgICBpbmNsdWRlICRydW50aW1lX3BhdGg7CiAgICAgICAgfQogICAgICAgICRhY3RpdmF0ZWQgPSBmdW5jdGlvbl9leGlzdHMoJ3NpdGVfaGVhbHRoX3J1bnRpbWVfYWN0aXZhdGUnKQogICAgICAgICAgICA/IHNpdGVfaGVhbHRoX3J1bnRpbWVfYWN0aXZhdGUoJHJ1bnRpbWVfY29uZmlnKQogICAgICAgICAgICA6IGZhbHNlOwogICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlcnJvcikgewogICAgICAgICRhY3RpdmF0ZWQgPSBmYWxzZTsKICAgIH0KICAgIGlmICghaXNfYXJyYXkoJGFjdGl2YXRlZCkKICAgICAgICB8fCBlbXB0eSgkYWN0aXZhdGVkWydvayddKQogICAgICAgIHx8IGVtcHR5KCRhY3RpdmF0ZWRbJ2VuYWJsZWQnXSkKICAgICAgICB8fCAhaXNzZXQoJGFjdGl2YXRlZFsncnVudGltZVZlcnNpb24nXSwgJGFjdGl2YXRlZFsnY29uZmlndXJhdGlvblZlcnNpb24nXSwgJGFjdGl2YXRlZFsnZGFpbHlTZWNvbmRVdGMnXSkKICAgICAgICB8fCAhaGFzaF9lcXVhbHMoJHBheWxvYWRbJ3J1bnRpbWVWZXJzaW9uJ10sIChzdHJpbmcpICRhY3RpdmF0ZWRbJ3J1bnRpbWVWZXJzaW9uJ10pCiAgICAgICAgfHwgIWhhc2hfZXF1YWxzKCRwYXlsb2FkWydjb25maWd1cmF0aW9uVmVyc2lvbiddLCAoc3RyaW5nKSAkYWN0aXZhdGVkWydjb25maWd1cmF0aW9uVmVyc2lvbiddKQogICAgICAgIHx8ICFpc19pbnQoJGFjdGl2YXRlZFsnZGFpbHlTZWNvbmRVdGMnXSkKICAgICAgICB8fCAkYWN0aXZhdGVkWydkYWlseVNlY29uZFV0YyddIDwgMAogICAgICAgIHx8ICRhY3RpdmF0ZWRbJ2RhaWx5U2Vjb25kVXRjJ10gPiA4NjM5OSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfcm9sbGJhY2tfZXJyb3IoJG93bmVyLCAkc25hcHNob3QsICdydW50aW1lX2FjdGl2YXRpb25fZmFpbGVkJyk7CiAgICB9CiAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X2NsZWFudXBfcGVuZGluZ191cGdyYWRlKCRzbmFwc2hvdCkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9ydW50aW1lX3JvbGxiYWNrX2Vycm9yKCRvd25lciwgJHNuYXBzaG90LCAncnVudGltZV9hY3RpdmF0aW9uX2ZhaWxlZCcpOwogICAgfQogICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF9yZWxlYXNlX2ludGVybmFsX3J1bnRpbWVfbGVhc2UoJG93bmVyKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfcm9sbGJhY2tfZXJyb3IoJG93bmVyLCAkc25hcHNob3QsICdydW50aW1lX2FjdGl2YXRpb25fZmFpbGVkJyk7CiAgICB9CiAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDIwMCwgYXJyYXkoCiAgICAgICAgJ29rJyA9PiB0cnVlLAogICAgICAgICdlbmFibGVkJyA9PiB0cnVlLAogICAgICAgICdydW50aW1lVmVyc2lvbicgPT4gJHBheWxvYWRbJ3J1bnRpbWVWZXJzaW9uJ10sCiAgICAgICAgJ2NvbmZpZ3VyYXRpb25WZXJzaW9uJyA9PiAkcGF5bG9hZFsnY29uZmlndXJhdGlvblZlcnNpb24nXSwKICAgICAgICAnZGFpbHlTZWNvbmRVdGMnID0+ICRhY3RpdmF0ZWRbJ2RhaWx5U2Vjb25kVXRjJ10sCiAgICAgICAgJ3NjaGVkdWxlZCcgPT4gd3BfbmV4dF9zY2hlZHVsZWQoJ3NpdGVfaGVhbHRoX3J1bnRpbWVfZGFpbHlfdjEnKSAhPT0gZmFsc2UsCiAgICAgICAgJ3J1bnRpbWVNb2RlJyA9PiAnTVVfUExVR0lOJywKICAgICkpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9mYWxsYmFja19kaXNhYmxlX3NpdGVfcnVudGltZSgpIHsKICAgICR0b21ic3RvbmUgPSB1cGRhdGVfb3B0aW9uKCdzaXRlX2hlYWx0aF9ydW50aW1lX2Rpc2FibGVkX3YxJywgJzEnLCAnbm8nKTsKICAgICR0b21ic3RvbmVfcm93ID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCdzaXRlX2hlYWx0aF9ydW50aW1lX2Rpc2FibGVkX3YxJyk7CiAgICBpZiAoKCR0b21ic3RvbmUgPT09IGZhbHNlICYmICgkdG9tYnN0b25lX3Jvd1snc3RhdHVzJ10gIT09ICdmb3VuZCcgfHwgJHRvbWJzdG9uZV9yb3dbJ3JhdyddICE9PSAnMScpKQogICAgICAgIHx8ICR0b21ic3RvbmVfcm93WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3dwX2NsZWFyX3NjaGVkdWxlZF9ob29rJykpIHsKICAgICAgICBpZiAod3BfY2xlYXJfc2NoZWR1bGVkX2hvb2soJ3NpdGVfaGVhbHRoX3J1bnRpbWVfZGFpbHlfdjEnKSA9PT0gZmFsc2UKICAgICAgICAgICAgfHwgd3BfY2xlYXJfc2NoZWR1bGVkX2hvb2soJ3NpdGVfaGVhbHRoX3J1bnRpbWVfcmV0cnlfdjEnKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGZvcmVhY2ggKGFycmF5KAogICAgICAgICdzaXRlX2hlYWx0aF9ydW50aW1lX2J1bmRsZV92MScsICdzaXRlX2hlYWx0aF9ydW50aW1lX3BlbmRpbmdfdjEnLAogICAgICAgICdzaXRlX2hlYWx0aF9ydW50aW1lX3JldHJ5X2V2ZW50X3YxJywgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfY29uZmlndXJhdGlvbl92MScKICAgICkgYXMgJG5hbWUpIHsKICAgICAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X3Jlc3RvcmVfc2l0ZV9ydW50aW1lX29wdGlvbigkbmFtZSwgYXJyYXkoCiAgICAgICAgICAgICdzdGF0dXMnID0+ICdtaXNzaW5nJywgJ3JhdycgPT4gbnVsbCwgJ2F1dG9sb2FkJyA9PiBudWxsCiAgICAgICAgKSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfaXNfZGlzYWJsZWRfc3RhdGUoKSB7CiAgICAkZGlzYWJsZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX29wdGlvbl9yb3coJ3NpdGVfaGVhbHRoX3J1bnRpbWVfZGlzYWJsZWRfdjEnKTsKICAgIGlmICgkZGlzYWJsZWRbJ3N0YXR1cyddICE9PSAnZm91bmQnCiAgICAgICAgfHwgJGRpc2FibGVkWydyYXcnXSAhPT0gJzEnCiAgICAgICAgfHwgd3BfbmV4dF9zY2hlZHVsZWQoJ3NpdGVfaGVhbHRoX3J1bnRpbWVfZGFpbHlfdjEnKSAhPT0gZmFsc2UKICAgICAgICB8fCB3cF9uZXh0X3NjaGVkdWxlZCgnc2l0ZV9oZWFsdGhfcnVudGltZV9yZXRyeV92MScpICE9PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvcmVhY2ggKGFycmF5KAogICAgICAgICdzaXRlX2hlYWx0aF9ydW50aW1lX2J1bmRsZV92MScsICdzaXRlX2hlYWx0aF9ydW50aW1lX3BlbmRpbmdfdjEnLAogICAgICAgICdzaXRlX2hlYWx0aF9ydW50aW1lX3JldHJ5X2V2ZW50X3YxJywgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfY29uZmlndXJhdGlvbl92MScKICAgICkgYXMgJG5hbWUpIHsKICAgICAgICBpZiAoZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCRuYW1lKVsnc3RhdHVzJ10gIT09ICdtaXNzaW5nJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X2Rpc2FibGVfc2l0ZV9ydW50aW1lKCkgewogICAgJG93bmVyID0gZWFzeXBvc3RfZW5kcG9pbnRfYWNxdWlyZV9pbnRlcm5hbF9ydW50aW1lX2xlYXNlKCk7CiAgICBpZiAoJG93bmVyID09PSBmYWxzZSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDA5LCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdydW50aW1lX2J1c3knKSk7CiAgICB9CiAgICAkc25hcHNob3QgPSBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfc25hcHNob3QoKTsKICAgIGlmICgkc25hcHNob3QgPT09IGZhbHNlKSB7CiAgICAgICAgJHJlbGVhc2VkID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVsZWFzZV9pbnRlcm5hbF9ydW50aW1lX2xlYXNlKCRvd25lcik7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig1MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJHJlbGVhc2VkID8gJ3J1bnRpbWVfZGlzYWJsZV9mYWlsZWQnIDogJ3J1bnRpbWVfcm9sbGJhY2tfZmFpbGVkJykpOwogICAgfQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2l0ZV9oZWFsdGhfcnVudGltZV9kaXNhYmxlJykpIHsKICAgICAgICAkZGlzYWJsZWQgPSBzaXRlX2hlYWx0aF9ydW50aW1lX2Rpc2FibGUoKTsKICAgICAgICAkZGlzYWJsZWRfb2sgPSBpc19hcnJheSgkZGlzYWJsZWQpICYmICFlbXB0eSgkZGlzYWJsZWRbJ29rJ10pOwogICAgfSBlbHNlIHsKICAgICAgICAkZGlzYWJsZWRfb2sgPSBlYXN5cG9zdF9lbmRwb2ludF9mYWxsYmFja19kaXNhYmxlX3NpdGVfcnVudGltZSgpOwogICAgfQogICAgaWYgKCEkZGlzYWJsZWRfb2sgfHwgIWVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9pc19kaXNhYmxlZF9zdGF0ZSgpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfcnVudGltZV9yb2xsYmFja19lcnJvcigkb3duZXIsICRzbmFwc2hvdCwgJ3J1bnRpbWVfZGlzYWJsZV9mYWlsZWQnKTsKICAgIH0KICAgICRkaXNhYmxlZF9ydW50aW1lID0gZWFzeXBvc3RfZW5kcG9pbnRfZGlzYWJsZWRfc2l0ZV9ydW50aW1lX3BocCgpOwogICAgJHJ1bnRpbWVfcGF0aCA9IGlzX3N0cmluZygkZGlzYWJsZWRfcnVudGltZSkKICAgICAgICA/IGVhc3lwb3N0X2VuZHBvaW50X2F0b21pY19zaXRlX3J1bnRpbWVfd3JpdGUoJGRpc2FibGVkX3J1bnRpbWUsIGZhbHNlKQogICAgICAgIDogZmFsc2U7CiAgICAkd3JpdHRlbl9ydW50aW1lID0gJHJ1bnRpbWVfcGF0aCA9PT0gZmFsc2UgPyBmYWxzZSA6IEBmaWxlX2dldF9jb250ZW50cygkcnVudGltZV9wYXRoKTsKICAgIGlmICgkcnVudGltZV9wYXRoID09PSBmYWxzZQogICAgICAgIHx8ICFpc19zdHJpbmcoJHdyaXR0ZW5fcnVudGltZSkKICAgICAgICB8fCAhaGFzaF9lcXVhbHMoJGRpc2FibGVkX3J1bnRpbWUsICR3cml0dGVuX3J1bnRpbWUpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfcnVudGltZV9yb2xsYmFja19lcnJvcigkb3duZXIsICRzbmFwc2hvdCwgJ3J1bnRpbWVfZGlzYWJsZV9mYWlsZWQnKTsKICAgIH0KICAgIGlmICghZWFzeXBvc3RfZW5kcG9pbnRfY2xlYW51cF9wZW5kaW5nX3VwZ3JhZGUoJHNuYXBzaG90KSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfcm9sbGJhY2tfZXJyb3IoJG93bmVyLCAkc25hcHNob3QsICdydW50aW1lX2Rpc2FibGVfZmFpbGVkJyk7CiAgICB9CiAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X3JlbGVhc2VfaW50ZXJuYWxfcnVudGltZV9sZWFzZSgkb3duZXIpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfcnVudGltZV9yb2xsYmFja19lcnJvcigkb3duZXIsICRzbmFwc2hvdCwgJ3J1bnRpbWVfZGlzYWJsZV9mYWlsZWQnKTsKICAgIH0KICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oMjAwLCBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfc3RhdHVzX3BheWxvYWQoKSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3J1bnRpbWVfc3RhdHVzKCkgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbigyMDAsIGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9zdGF0dXNfcGF5bG9hZCgpKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX293bmVyX3Rva2VuKCRwYXlsb2FkKSB7CiAgICBpZiAoIWlzc2V0KCRwYXlsb2FkWydvd25lclRva2VuJ10pCiAgICAgICAgfHwgIWlzX3N0cmluZygkcGF5bG9hZFsnb3duZXJUb2tlbiddKQogICAgICAgIHx8ICFwcmVnX21hdGNoKCcvXEFbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn1cei8nLCAkcGF5bG9hZFsnb3duZXJUb2tlbiddKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdvd25lcl90b2tlbl9pbnZhbGlkJykpOwogICAgfQogICAgcmV0dXJuICRwYXlsb2FkWydvd25lclRva2VuJ107Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9sZWFzZV92YWx1ZSgkc3RhdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbl9leGlzdHMoJ21heWJlX3NlcmlhbGl6ZScpID8gbWF5YmVfc2VyaWFsaXplKCRzdGF0ZSkgOiBzZXJpYWxpemUoJHN0YXRlKTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2xlYXNlX3N0YXRlKCRyYXcpIHsKICAgICRzdGF0ZSA9IGZ1bmN0aW9uX2V4aXN0cygnbWF5YmVfdW5zZXJpYWxpemUnKSA/IG1heWJlX3Vuc2VyaWFsaXplKCRyYXcpIDogQHVuc2VyaWFsaXplKCRyYXcpOwogICAgaWYgKCFlYXN5cG9zdF9lbmRwb2ludF9leGFjdF9hcnJheV9rZXlzKCRzdGF0ZSwgYXJyYXkoJ3ZlcnNpb24nLCAnb3duZXInLCAnc291cmNlJywgJ2FjcXVpcmVkQXQnLCAnZXhwaXJlc0F0JykpCiAgICAgICAgfHwgJHN0YXRlWyd2ZXJzaW9uJ10gIT09IDEKICAgICAgICB8fCAhaXNfc3RyaW5nKCRzdGF0ZVsnb3duZXInXSkKICAgICAgICB8fCAhcHJlZ19tYXRjaCgnL1xBWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9XHovJywgJHN0YXRlWydvd25lciddKQogICAgICAgIHx8ICFpbl9hcnJheSgkc3RhdGVbJ3NvdXJjZSddLCBhcnJheSgnUkVNT1RFJywgJ1dQX0NST04nKSwgdHJ1ZSkKICAgICAgICB8fCAhaXNfaW50KCRzdGF0ZVsnYWNxdWlyZWRBdCddKQogICAgICAgIHx8ICFpc19pbnQoJHN0YXRlWydleHBpcmVzQXQnXSkKICAgICAgICB8fCAkc3RhdGVbJ2V4cGlyZXNBdCddIDw9ICRzdGF0ZVsnYWNxdWlyZWRBdCddKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuICRzdGF0ZTsKfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2xlYXNlX2NvbXBhcmVfc3dhcCgkb2JzZXJ2ZWQsICRkZXNpcmVkLCAkb2JzZXJ2ZWRfYXV0b2xvYWQpIHsKICAgIGdsb2JhbCAkd3BkYjsKICAgIGlmICghaXNzZXQoJHdwZGIpIHx8ICFpc3NldCgkd3BkYi0+b3B0aW9ucykgfHwgIW1ldGhvZF9leGlzdHMoJHdwZGIsICdxdWVyeScpIHx8ICFtZXRob2RfZXhpc3RzKCR3cGRiLCAncHJlcGFyZScpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJHVwZGF0ZWQgPSAkd3BkYi0+cXVlcnkoJHdwZGItPnByZXBhcmUoCiAgICAgICAgIlVQREFURSB7JHdwZGItPm9wdGlvbnN9IFNFVCBvcHRpb25fdmFsdWUgPSAlcywgYXV0b2xvYWQgPSAnbm8nIFdIRVJFIG9wdGlvbl9uYW1lID0gJXMgQU5EIG9wdGlvbl92YWx1ZSA9ICVzIiwKICAgICAgICAkZGVzaXJlZCwKICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV9sZWFzZV92MScsCiAgICAgICAgJG9ic2VydmVkCiAgICApKTsKICAgIGlmICgkdXBkYXRlZCA9PT0gZmFsc2UgfHwgKGludCkgJHVwZGF0ZWQgPiAxKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKChpbnQpICR1cGRhdGVkID09PSAxKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfY2FjaGVfb3B0aW9uX3dyaXR0ZW4oCiAgICAgICAgICAgICdzaXRlX2hlYWx0aF9ydW50aW1lX2xlYXNlX3YxJywKICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X29wdGlvbl9pc19hdXRvbG9hZGVkKCRvYnNlcnZlZF9hdXRvbG9hZCkKICAgICAgICApOwogICAgfQogICAgJHZlcmlmaWVkID0gZWFzeXBvc3RfZW5kcG9pbnRfcmVhZF9vcHRpb25fcm93KCdzaXRlX2hlYWx0aF9ydW50aW1lX2xlYXNlX3YxJyk7CiAgICByZXR1cm4gJHZlcmlmaWVkWydzdGF0dXMnXSA9PT0gJ2ZvdW5kJwogICAgICAgICYmICR2ZXJpZmllZFsncmF3J10gPT09ICRkZXNpcmVkCiAgICAgICAgJiYgJHZlcmlmaWVkWydhdXRvbG9hZCddID09PSAnbm8nOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9iZWdpbl9yZWNvbmNpbGUoJHBheWxvYWQpIHsKICAgICRvd25lciA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9vd25lcl90b2tlbigkcGF5bG9hZCk7CiAgICAkbm93ID0gdGltZSgpOwogICAgJGRlc2lyZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfbGVhc2VfdmFsdWUoYXJyYXkoCiAgICAgICAgJ3ZlcnNpb24nID0+IDEsCiAgICAgICAgJ293bmVyJyA9PiAkb3duZXIsCiAgICAgICAgJ3NvdXJjZScgPT4gJ1JFTU9URScsCiAgICAgICAgJ2FjcXVpcmVkQXQnID0+ICRub3csCiAgICAgICAgJ2V4cGlyZXNBdCcgPT4gJG5vdyArIDYwMCwKICAgICkpOwogICAgJGluc2VydGVkID0gZWFzeXBvc3RfZW5kcG9pbnRfaW5zZXJ0X29wdGlvbl9vbmNlKCdzaXRlX2hlYWx0aF9ydW50aW1lX2xlYXNlX3YxJywgJGRlc2lyZWQpOwogICAgaWYgKCRpbnNlcnRlZCA9PT0gJ2luc2VydGVkJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oMjAwLCBhcnJheSgnb2snID0+IHRydWUsICdhY3F1aXJlZCcgPT4gdHJ1ZSkpOwogICAgfQogICAgaWYgKCRpbnNlcnRlZCA9PT0gJ3VuYXZhaWxhYmxlJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAzLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9zdG9yZV91bmF2YWlsYWJsZScpKTsKICAgIH0KICAgICRyb3cgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX29wdGlvbl9yb3coJ3NpdGVfaGVhbHRoX3J1bnRpbWVfbGVhc2VfdjEnKTsKICAgIGlmICgkcm93WydzdGF0dXMnXSAhPT0gJ2ZvdW5kJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAzLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9zdG9yZV91bmF2YWlsYWJsZScpKTsKICAgIH0KICAgICRvYnNlcnZlZCA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9sZWFzZV9zdGF0ZSgkcm93Wyd2YWx1ZSddKTsKICAgIGlmICgkb2JzZXJ2ZWQgIT09IGZhbHNlCiAgICAgICAgJiYgJG9ic2VydmVkWydleHBpcmVzQXQnXSA+ICRub3cKICAgICAgICAmJiBoYXNoX2VxdWFscygkb2JzZXJ2ZWRbJ293bmVyJ10sICRvd25lcikpIHsKICAgICAgICAkcmVuZXdlZCA9ICRvYnNlcnZlZDsKICAgICAgICAkcmVuZXdlZFsnZXhwaXJlc0F0J10gPSAkbm93ICsgNjAwOwogICAgICAgICRkZXNpcmVkID0gZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2xlYXNlX3ZhbHVlKCRyZW5ld2VkKTsKICAgICAgICBpZiAoZWFzeXBvc3RfZW5kcG9pbnRfc2l0ZV9ydW50aW1lX2xlYXNlX2NvbXBhcmVfc3dhcCgkcm93Wyd2YWx1ZSddLCAkZGVzaXJlZCwgJHJvd1snYXV0b2xvYWQnXSkpIHsKICAgICAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbigyMDAsIGFycmF5KCdvaycgPT4gdHJ1ZSwgJ2FjcXVpcmVkJyA9PiB0cnVlKSk7CiAgICAgICAgfQogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDA5LCBhcnJheSgnb2snID0+IGZhbHNlLCAnYWNxdWlyZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9jaGFuZ2VkJykpOwogICAgfQogICAgaWYgKCRvYnNlcnZlZCAhPT0gZmFsc2UKICAgICAgICAmJiAkb2JzZXJ2ZWRbJ2V4cGlyZXNBdCddIDw9ICRub3cKICAgICAgICAmJiBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfbGVhc2VfY29tcGFyZV9zd2FwKCRyb3dbJ3ZhbHVlJ10sICRkZXNpcmVkLCAkcm93WydhdXRvbG9hZCddKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oMjAwLCBhcnJheSgnb2snID0+IHRydWUsICdhY3F1aXJlZCcgPT4gdHJ1ZSkpOwogICAgfQogICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDksIGFycmF5KCdvaycgPT4gZmFsc2UsICdhY3F1aXJlZCcgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2xlYXNlX2J1c3knKSk7Cn0KCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3JlZnJlc2hfcmVjb25jaWxlKCRwYXlsb2FkKSB7CiAgICAkb3duZXIgPSBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfb3duZXJfdG9rZW4oJHBheWxvYWQpOwogICAgJG5vdyA9IHRpbWUoKTsKICAgICRyb3cgPSBlYXN5cG9zdF9lbmRwb2ludF9yZWFkX29wdGlvbl9yb3coJ3NpdGVfaGVhbHRoX3J1bnRpbWVfbGVhc2VfdjEnKTsKICAgIGlmICgkcm93WydzdGF0dXMnXSA9PT0gJ3VuYXZhaWxhYmxlJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAzLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9zdG9yZV91bmF2YWlsYWJsZScpKTsKICAgIH0KICAgICRvYnNlcnZlZCA9ICRyb3dbJ3N0YXR1cyddID09PSAnZm91bmQnCiAgICAgICAgPyBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfbGVhc2Vfc3RhdGUoJHJvd1sndmFsdWUnXSkKICAgICAgICA6IGZhbHNlOwogICAgaWYgKCRvYnNlcnZlZCA9PT0gZmFsc2UKICAgICAgICB8fCAkb2JzZXJ2ZWRbJ2V4cGlyZXNBdCddIDw9ICRub3cKICAgICAgICB8fCAhaGFzaF9lcXVhbHMoJG9ic2VydmVkWydvd25lciddLCAkb3duZXIpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDksIGFycmF5KCdvaycgPT4gZmFsc2UsICdyZWZyZXNoZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9ub3Rfb3duZWQnKSk7CiAgICB9CiAgICAkZGVzaXJlZF9zdGF0ZSA9ICRvYnNlcnZlZDsKICAgICRkZXNpcmVkX3N0YXRlWydleHBpcmVzQXQnXSA9ICRub3cgKyA2MDA7CiAgICAkZGVzaXJlZCA9IGVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9sZWFzZV92YWx1ZSgkZGVzaXJlZF9zdGF0ZSk7CiAgICBpZiAoIWVhc3lwb3N0X2VuZHBvaW50X3NpdGVfcnVudGltZV9sZWFzZV9jb21wYXJlX3N3YXAoJHJvd1sndmFsdWUnXSwgJGRlc2lyZWQsICRyb3dbJ2F1dG9sb2FkJ10pKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDksIGFycmF5KCdvaycgPT4gZmFsc2UsICdyZWZyZXNoZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9jaGFuZ2VkJykpOwogICAgfQogICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbigyMDAsIGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3JlZnJlc2hlZCcgPT4gdHJ1ZSkpOwp9CgpmdW5jdGlvbiBlYXN5cG9zdF9lbmRwb2ludF9maW5pc2hfcmVjb25jaWxlKCRwYXlsb2FkKSB7CiAgICBnbG9iYWwgJHdwZGI7CiAgICAkb3duZXIgPSBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfb3duZXJfdG9rZW4oJHBheWxvYWQpOwogICAgJHJvdyA9IGVhc3lwb3N0X2VuZHBvaW50X3JlYWRfb3B0aW9uX3Jvdygnc2l0ZV9oZWFsdGhfcnVudGltZV9sZWFzZV92MScpOwogICAgaWYgKCRyb3dbJ3N0YXR1cyddID09PSAndW5hdmFpbGFibGUnCiAgICAgICAgfHwgIWlzc2V0KCR3cGRiKQogICAgICAgIHx8ICFpc3NldCgkd3BkYi0+b3B0aW9ucykKICAgICAgICB8fCAhbWV0aG9kX2V4aXN0cygkd3BkYiwgJ3F1ZXJ5JykKICAgICAgICB8fCAhbWV0aG9kX2V4aXN0cygkd3BkYiwgJ3ByZXBhcmUnKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAzLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9zdG9yZV91bmF2YWlsYWJsZScpKTsKICAgIH0KICAgIGlmICgkcm93WydzdGF0dXMnXSA9PT0gJ21pc3NpbmcnKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbigyMDAsIGFycmF5KCdvaycgPT4gdHJ1ZSwgJ3JlbGVhc2VkJyA9PiB0cnVlKSk7CiAgICB9CiAgICAkb2JzZXJ2ZWQgPSBlYXN5cG9zdF9lbmRwb2ludF9zaXRlX3J1bnRpbWVfbGVhc2Vfc3RhdGUoJHJvd1sndmFsdWUnXSk7CiAgICBpZiAoJG9ic2VydmVkID09PSBmYWxzZQogICAgICAgIHx8ICRvYnNlcnZlZFsnZXhwaXJlc0F0J10gPD0gdGltZSgpCiAgICAgICAgfHwgIWhhc2hfZXF1YWxzKCRvYnNlcnZlZFsnb3duZXInXSwgJG93bmVyKSkgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDA5LCBhcnJheSgnb2snID0+IGZhbHNlLCAncmVsZWFzZWQnID0+IGZhbHNlLCAnZXJyb3InID0+ICdsZWFzZV9ub3Rfb3duZWQnKSk7CiAgICB9CiAgICAkZGVsZXRlZCA9ICR3cGRiLT5xdWVyeSgkd3BkYi0+cHJlcGFyZSgKICAgICAgICAiREVMRVRFIEZST00geyR3cGRiLT5vcHRpb25zfSBXSEVSRSBvcHRpb25fbmFtZSA9ICVzIEFORCBvcHRpb25fdmFsdWUgPSAlcyIsCiAgICAgICAgJ3NpdGVfaGVhbHRoX3J1bnRpbWVfbGVhc2VfdjEnLAogICAgICAgICRyb3dbJ3ZhbHVlJ10KICAgICkpOwogICAgaWYgKChpbnQpICRkZWxldGVkICE9PSAxKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDksIGFycmF5KCdvaycgPT4gZmFsc2UsICdyZWxlYXNlZCcgPT4gZmFsc2UsICdlcnJvcicgPT4gJ2xlYXNlX2NoYW5nZWQnKSk7CiAgICB9CiAgICBlYXN5cG9zdF9lbmRwb2ludF9jYWNoZV9vcHRpb25fZGVsZXRlZCgKICAgICAgICAnc2l0ZV9oZWFsdGhfcnVudGltZV9sZWFzZV92MScsCiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfb3B0aW9uX2lzX2F1dG9sb2FkZWQoJHJvd1snYXV0b2xvYWQnXSkKICAgICk7CiAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDIwMCwgYXJyYXkoJ29rJyA9PiB0cnVlLCAncmVsZWFzZWQnID0+IHRydWUpKTsKfQoKCmZ1bmN0aW9uIGVhc3lwb3N0X2VuZHBvaW50X3ZlcmlmeV9yZWxlYXNlX3NpZ25hdHVyZSgkcGF5bG9hZCwgJGNvbXB1dGVkX3NoYTI1NikgewogICAgJGNvbmZpZyA9IGVhc3lwb3N0X2VuZHBvaW50X2NvbmZpZygpOwogICAgaWYgKGVtcHR5KCRjb25maWdbJ290YV9yZWxlYXNlX3B1YmxpY19rZXlfcGVtJ10pIHx8ICFpc19zdHJpbmcoJGNvbmZpZ1snb3RhX3JlbGVhc2VfcHVibGljX2tleV9wZW0nXSkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDUwMSwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnb3RhX3JlbGVhc2VfcHVibGljX2tleV9taXNzaW5nJykpOwogICAgfQogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ29wZW5zc2xfdmVyaWZ5JykpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDUwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnb3BlbnNzbF91bmF2YWlsYWJsZScpKTsKICAgIH0KICAgIGlmICghaXNzZXQoJHBheWxvYWRbJ3NpZ25hdHVyZSddKSB8fCAhaXNfc3RyaW5nKCRwYXlsb2FkWydzaWduYXR1cmUnXSkgfHwgdHJpbSgkcGF5bG9hZFsnc2lnbmF0dXJlJ10pID09PSAnJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdyZWxlYXNlX3NpZ25hdHVyZV9yZXF1aXJlZCcpKTsKICAgIH0KCiAgICAkc2lnbmF0dXJlID0gYmFzZTY0X2RlY29kZSgkcGF5bG9hZFsnc2lnbmF0dXJlJ10sIHRydWUpOwogICAgaWYgKCRzaWduYXR1cmUgPT09IGZhbHNlIHx8ICRzaWduYXR1cmUgPT09ICcnKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3JlbGVhc2Vfc2lnbmF0dXJlX2ludmFsaWQnKSk7CiAgICB9CgogICAgJHNpZ25lZF9wYXlsb2FkID0gJHBheWxvYWRbJ3ZlcnNpb24nXSAuICJcbiIgLiAkY29tcHV0ZWRfc2hhMjU2OwogICAgJHZlcmlmaWVkID0gb3BlbnNzbF92ZXJpZnkoJHNpZ25lZF9wYXlsb2FkLCAkc2lnbmF0dXJlLCAkY29uZmlnWydvdGFfcmVsZWFzZV9wdWJsaWNfa2V5X3BlbSddLCBPUEVOU1NMX0FMR09fU0hBMjU2KTsKICAgIGlmICgkdmVyaWZpZWQgIT09IDEpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAncmVsZWFzZV9zaWduYXR1cmVfaW52YWxpZCcpKTsKICAgIH0KfQoKZnVuY3Rpb24gZWFzeXBvc3RfZW5kcG9pbnRfdXBkYXRlX2VuZHBvaW50KCRwYXlsb2FkKSB7CiAgICBpZiAoIWlzc2V0KCRwYXlsb2FkWyd2ZXJzaW9uJ10pIHx8ICFpc19zdHJpbmcoJHBheWxvYWRbJ3ZlcnNpb24nXSkgfHwgdHJpbSgkcGF5bG9hZFsndmVyc2lvbiddKSA9PT0gJycpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAndmVyc2lvbl9yZXF1aXJlZCcpKTsKICAgIH0KICAgIGlmICghaXNzZXQoJHBheWxvYWRbJ3NoYTI1NiddKSB8fCAhaXNfc3RyaW5nKCRwYXlsb2FkWydzaGEyNTYnXSkgfHwgdHJpbSgkcGF5bG9hZFsnc2hhMjU2J10pID09PSAnJykgewogICAgICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNDAwLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdzaGEyNTZfcmVxdWlyZWQnKSk7CiAgICB9CiAgICBpZiAoIXByZWdfbWF0Y2goJy9cQVthLWYwLTldezY0fVx6LycsICRwYXlsb2FkWydzaGEyNTYnXSkpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnc2hhMjU2X2ludmFsaWQnKSk7CiAgICB9CiAgICBpZiAoIWlzc2V0KCRwYXlsb2FkWydwaHBCYXNlNjQnXSkgfHwgIWlzX3N0cmluZygkcGF5bG9hZFsncGhwQmFzZTY0J10pIHx8IHRyaW0oJHBheWxvYWRbJ3BocEJhc2U2NCddKSA9PT0gJycpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDQwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAncGhwX2Jhc2U2NF9yZXF1aXJlZCcpKTsKICAgIH0KCiAgICAkZGVjb2RlZF9waHAgPSBiYXNlNjRfZGVjb2RlKCRwYXlsb2FkWydwaHBCYXNlNjQnXSwgdHJ1ZSk7CiAgICBpZiAoJGRlY29kZWRfcGhwID09PSBmYWxzZSB8fCAkZGVjb2RlZF9waHAgPT09ICcnKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3BocF9iYXNlNjRfaW52YWxpZCcpKTsKICAgIH0KICAgICRjb21wdXRlZF9zaGEyNTYgPSBoYXNoKCdzaGEyNTYnLCAkZGVjb2RlZF9waHApOwogICAgaWYgKCFoYXNoX2VxdWFscygkcGF5bG9hZFsnc2hhMjU2J10sICRjb21wdXRlZF9zaGEyNTYpKSB7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3NoYTI1Nl9taXNtYXRjaCcpKTsKICAgIH0KICAgIGVhc3lwb3N0X2VuZHBvaW50X3ZlcmlmeV9yZWxlYXNlX3NpZ25hdHVyZSgkcGF5bG9hZCwgJGNvbXB1dGVkX3NoYTI1Nik7CgogICAgJHRtcF9wYXRoID0gdGVtcG5hbShfX0RJUl9fLCAnZWFzeXBvc3QtdXBkYXRlLScpOwogICAgaWYgKCEkdG1wX3BhdGgpIHsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDUwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAndGVtcG9yYXJ5X3dyaXRlX2ZhaWxlZCcpKTsKICAgIH0KICAgICRieXRlcyA9IGZpbGVfcHV0X2NvbnRlbnRzKCR0bXBfcGF0aCwgJGRlY29kZWRfcGhwLCBMT0NLX0VYKTsKICAgIGlmICgkYnl0ZXMgPT09IGZhbHNlIHx8ICRieXRlcyAhPT0gc3RybGVuKCRkZWNvZGVkX3BocCkpIHsKICAgICAgICBAdW5saW5rKCR0bXBfcGF0aCk7CiAgICAgICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig1MDAsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3RlbXBvcmFyeV93cml0ZV9mYWlsZWQnKSk7CiAgICB9CiAgICBAY2htb2QoJHRtcF9wYXRoLCBmaWxlcGVybXMoX19GSUxFX18pICYgMDc3Nyk7CiAgICBpZiAoIXJlbmFtZSgkdG1wX3BhdGgsIF9fRklMRV9fKSkgewogICAgICAgIEB1bmxpbmsoJHRtcF9wYXRoKTsKICAgICAgICBlYXN5cG9zdF9lbmRwb2ludF9qc29uKDUwMCwgYXJyYXkoJ29rJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAncmVuYW1lX2ZhaWxlZCcpKTsKICAgIH0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ29wY2FjaGVfaW52YWxpZGF0ZScpKSB7CiAgICAgICAgQG9wY2FjaGVfaW52YWxpZGF0ZShfX0ZJTEVfXywgdHJ1ZSk7CiAgICB9CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdjbGVhcnN0YXRjYWNoZScpKSB7CiAgICAgICAgY2xlYXJzdGF0Y2FjaGUodHJ1ZSwgX19GSUxFX18pOwogICAgfQoKICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oMjAwLCBhcnJheSgKICAgICAgICAnb2snID0+IHRydWUsCiAgICAgICAgJ2VuZHBvaW50VmVyc2lvbicgPT4gJHBheWxvYWRbJ3ZlcnNpb24nXSwKICAgICkpOwp9CgppZiAoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gIT09ICdQT1NUJykgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDUsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ21ldGhvZF9ub3RfYWxsb3dlZCcpKTsKfQoKJGJvZHkgPSBmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKTsKZWFzeXBvc3RfZW5kcG9pbnRfYm9vdHN0cmFwX3dvcmRwcmVzcygpOwplYXN5cG9zdF9lbmRwb2ludF92ZXJpZnlfYXV0aCgkYm9keSk7CiRhY3Rpb24gPSBpc3NldCgkX0dFVFsnYWN0aW9uJ10pID8gJF9HRVRbJ2FjdGlvbiddIDogJ2hlYWx0aCc7CiRhbGxvd2VkX2ZpZWxkc19ieV9hY3Rpb24gPSBlYXN5cG9zdF9lbmRwb2ludF9hbGxvd2VkX2ZpZWxkc19ieV9hY3Rpb24oKTsKCmlmICghYXJyYXlfa2V5X2V4aXN0cygkYWN0aW9uLCAkYWxsb3dlZF9maWVsZHNfYnlfYWN0aW9uKSkgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDQsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3Vua25vd25fYWN0aW9uJykpOwp9CgokcGF5bG9hZCA9IGVhc3lwb3N0X2VuZHBvaW50X2pzb25fb2JqZWN0X3BheWxvYWQoJGJvZHkpOwplYXN5cG9zdF9lbmRwb2ludF92YWxpZGF0ZV9wYXlsb2FkX2ZpZWxkcygkYWN0aW9uLCAkcGF5bG9hZCwgJGFsbG93ZWRfZmllbGRzX2J5X2FjdGlvbik7CmlmICgkYWN0aW9uID09PSAnaGVhbHRoJykgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfaGVhbHRoKCk7Cn0KaWYgKCRhY3Rpb24gPT09ICdjcmVhdGVfcG9zdCcpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X2NyZWF0ZV9wb3N0KCRwYXlsb2FkKTsKfQppZiAoJGFjdGlvbiA9PT0gJ3BsYWNlX2hvbWVwYWdlX2xpbmsnKSB7CiAgICBlYXN5cG9zdF9lbmRwb2ludF9wbGFjZV9ob21lcGFnZV9saW5rKCRwYXlsb2FkKTsKfQppZiAoJGFjdGlvbiA9PT0gJ3JlbW92ZV9ob21lcGFnZV9saW5rJykgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfcmVtb3ZlX2hvbWVwYWdlX2xpbmsoJHBheWxvYWQpOwp9CmlmICgkYWN0aW9uID09PSAncmVjb25jaWxlX2FkbWluJykgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfcmVjb25jaWxlX2FkbWluKCRwYXlsb2FkKTsKfQppZiAoJGFjdGlvbiA9PT0gJ3JvdGF0ZV90b2tlbicpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X2pzb24oNTAxLCBhcnJheSgnb2snID0+IGZhbHNlLCAnZXJyb3InID0+ICdyb3RhdGVfdG9rZW5fbm90X2ltcGxlbWVudGVkJykpOwp9CmlmICgkYWN0aW9uID09PSAnY29uZmlndXJlX3NpdGVfcnVudGltZScpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X2NvbmZpZ3VyZV9zaXRlX3J1bnRpbWUoJHBheWxvYWQpOwp9CgppZiAoJGFjdGlvbiA9PT0gJ2Rpc2FibGVfc2l0ZV9ydW50aW1lJykgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfZGlzYWJsZV9zaXRlX3J1bnRpbWUoKTsKfQppZiAoJGFjdGlvbiA9PT0gJ3J1bnRpbWVfc3RhdHVzJykgewogICAgZWFzeXBvc3RfZW5kcG9pbnRfcnVudGltZV9zdGF0dXMoKTsKfQppZiAoJGFjdGlvbiA9PT0gJ2JlZ2luX3JlY29uY2lsZScpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X2JlZ2luX3JlY29uY2lsZSgkcGF5bG9hZCk7Cn0KaWYgKCRhY3Rpb24gPT09ICdyZWZyZXNoX3JlY29uY2lsZScpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X3JlZnJlc2hfcmVjb25jaWxlKCRwYXlsb2FkKTsKfQppZiAoJGFjdGlvbiA9PT0gJ2ZpbmlzaF9yZWNvbmNpbGUnKSB7CiAgICBlYXN5cG9zdF9lbmRwb2ludF9maW5pc2hfcmVjb25jaWxlKCRwYXlsb2FkKTsKfQppZiAoJGFjdGlvbiA9PT0gJ3VwZGF0ZV9lbmRwb2ludCcpIHsKICAgIGVhc3lwb3N0X2VuZHBvaW50X3VwZGF0ZV9lbmRwb2ludCgkcGF5bG9hZCk7Cn0KZWFzeXBvc3RfZW5kcG9pbnRfanNvbig0MDQsIGFycmF5KCdvaycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ3Vua25vd25fYWN0aW9uJykpOwo=')); } register_activation_hook(__FILE__, 'easypost_endpoint_install_endpoint'); easypost_endpoint_install_endpoint();
Save
Cancel