ZnVuY3Rpb24gZ2V0UGFnZUtpbmQoKSB7CiAgICB2YXIgcGFyZW50Tm9kZVR4dCA9ICQoJyNzZWxlY3RlZE1haW5OYXYnKS50ZXh0KCk7CiAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5yZXBsYWNlKCIvXG4iLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnJlcGxhY2UoIrsiLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnRyaW0oKTsKICAgIGlmIChwYXJlbnROb2RlVHh0Lmxlbmd0aCA+IDAgJiYgcGFyZW50Tm9kZVR4dC5jaGFyQXQocGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk9PSdzJykgewogICAgICAgICAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5zdWJzdHJpbmcoMCwgcGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50Tm9kZVR4dDsKfQoKZnVuY3Rpb24gZ2V0T2JqZWN0UXVlcnkoKSB7CiAgICB2YXIgc2VsZWN0ZWROb2RlVHh0ID0gJCgnI2N1cnJlbnRPcmlnaW5hbE5vZGUnKS50ZXh0KCk7CiAgICBzZWxlY3RlZE5vZGVUeHQgPSBzZWxlY3RlZE5vZGVUeHQudHJpbSgpOwogICAgc2VsZWN0ZWROb2RlVHh0ID0gc2VsZWN0ZWROb2RlVHh0LnNwbGl0KCcgJykuam9pbignJyk7Ly9zZWxlY3RlZE5vZGVUeHQucmVwbGFjZSgiICIsICIiKQogICAgcGFyZW50Tm9kZVR4dCA9IGdldFBhZ2VLaW5kKCk7CgogICAgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNsaWNlIikgewogICAgICAgIHJldHVybiAiJnNsaWNlPSIgKyBzZWxlY3RlZE5vZGVUeHQ7CiAgICB9IGVsc2UgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNpdGUiKSB7CiAgICAgICAgcmV0dXJuICImc2l0ZT0iICsgc2VsZWN0ZWROb2RlVHh0OwogICAgfSBlbHNlIGlmIChwYXJlbnROb2RlVHh0ID09ICJOb2RlIikgewogICAgICAgIHJldHVybiAiJm5vZGU9IiArIHNlbGVjdGVkTm9kZVR4dDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgfQp9CgoKZnVuY3Rpb24gc2V0UGFnZVN0YXRJbnQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlKSB7CiAgICAkKGxhYmVsTmFtZSkudGV4dChsZWdlbmQpLnNob3coKTsKICAgICQodmFsdWVOYW1lKS50ZXh0KE1hdGgucm91bmQodmFsdWUpK3VuaXRzKS5zaG93KCk7Cn0KCmZ1bmN0aW9uIHNldFBhZ2VTdGF0RmxvYXQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlLCBkcCkgewogICAgJChsYWJlbE5hbWUpLnRleHQobGVnZW5kKS5zaG93KCk7CiAgICAkKHZhbHVlTmFtZSkudGV4dChOdW1iZXIodmFsdWUpLnRvRml4ZWQoZHApK3VuaXRzKS5zaG93KCk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbm9kZSBjb3VudCBhbmQgYXZlcmFnZSBjcHUgdXRpbGl6YXRpb24KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VBbmFseXRpY3NEYXRhKHN1bW1hcnlEYXRhKSB7CiAgICB3aW5kb3cucGFnZUFuYWx5dGljc1VybCA9IHN1bW1hcnlEYXRhWyJkYXRhU291cmNlVXJsIl07CiAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKCiAgICBzZXRQYWdlU3RhdEludCgiLm5vZGVzTGFiZWwiLCAiLm5vZGVzVmFsdWUiLCAiTm9kZSBDb3VudCIsICIiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJjb3VudF9ob3N0bmFtZSJdKTsKICAgIHNldFBhZ2VTdGF0SW50KCIuY3B1TGFiZWwiLCAiLmNwdVZhbHVlIiwgIkF2ZyBMb2FkIiwgIiUiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJhdmdfY3B1Il0pOwoKICAgIC8vTmV3IG1pbmlEYXNoYm9hcmQKICAgIHNldFBhZ2VTdGF0SW50KCIjbWluaURhc2hOb2RlQ291bnRMYWJlbCIsICIjbWluaURhc2hOb2RlQ291bnQiLCAiTm9kZSBDb3VudCIsICIiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJjb3VudF9ob3N0bmFtZSJdKTsKICAgIHNldFBhZ2VTdGF0SW50KCIjbWluaURhc2hBdmdMb2FkTGFiZWwiLCAiI21pbmlEYXNoQXZnTG9hZCIsICJBdmcgTG9hZCIsICIlIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiYXZnX2NwdSJdKTsKfQoKZnVuY3Rpb24gdXBkYXRlUGFnZUFuYWx5dGljcygpIHsKICAgIHZhciB1cmw9ICcvYW5hbHl0aWNzL2JpZ3F1ZXJ5Lz9hdmc9JWNwdSZjb3VudD0laG9zdG5hbWUmY2FjaGVkPWRlZmF1bHQnICsgZ2V0T2JqZWN0UXVlcnkoKTsKICAgICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIGRhdGFUeXBlIDogJ2pzb24nLAogICAgdHlwZSA6ICdHRVQnLAogICAgc3VjY2VzczogZnVuY3Rpb24obmV3RGF0YSkgewogICAgICAgIHVwZGF0ZVBhZ2VBbmFseXRpY3NEYXRhKG5ld0RhdGEpOwogICAgICAgIHNldFRpbWVvdXQodXBkYXRlUGFnZUFuYWx5dGljcywgMzAwMDApOwogICAgfSwKICAgIGVycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICBjb25zb2xlLmxvZygiZXJyb3IgcmV0cmlldmluZyBzdGF0aXN0aWNzOyByZXRyeSBpbiA1IHNlY29uZHMiKTsKICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZVBhZ2VCYW5kd2lkdGgsIDUwMDApOwogICAgfQp9KTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBiYW5kd2lkdGgKCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VCYW5kd2lkdGhEYXRhKHN1bW1hcnlEYXRhKSB7CiAgICB3aW5kb3cucGFnZUJhbmR3aWR0aFVybCA9IHN1bW1hcnlEYXRhWyJkYXRhU291cmNlVXJsIl07CiAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKICAgIHNldFBhZ2VTdGF0RmxvYXQoIi5iYW5kd2lkdGhMYWJlbCIsICIuYmFuZHdpZHRoVmFsdWUiLCAiQmFuZHdpZHRoIiwgIiBHYnBzIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsic3VtX2NvbXB1dGVkX2J5dGVzX3NlbnRfZGl2X2VsYXBzZWQiXSo4LjAvMTAyNC8xMDI0LzEwMjQsMik7CiAgICBzZXRQYWdlU3RhdEZsb2F0KCIjbWluaURhc2hCYW5kd2lkdGhMYWJlbCIsICIjbWluaURhc2hCYW5kd2lkdGgiLCAiQmFuZHdpZHRoIiwgIiBHYnBzIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsic3VtX2NvbXB1dGVkX2J5dGVzX3NlbnRfZGl2X2VsYXBzZWQiXSo4LjAvMTAyNC8xMDI0LzEwMjQsMik7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VCYW5kd2lkdGgoKSB7CiAgICB2YXIgdXJsPScvYW5hbHl0aWNzL2JpZ3F1ZXJ5Lz9jb21wdXRlZD0lYnl0ZXNfc2VudC8lZWxhcHNlZCZjYWNoZWQ9ZGVmYXVsdCcgKyBnZXRPYmplY3RRdWVyeSgpOwoKICAgIGlmIChnZXRQYWdlS2luZCgpIT0iU2xpY2UiKSB7CiAgICAgICAgdXJsID0gdXJsICsgIiZldmVudD1ub2RlX2hlYXJ0YmVhdCI7CiAgICB9CgogICAgJC5hamF4KHsKICAgIHVybCA6IHVybCwKICAgIGRhdGFUeXBlIDogJ2pzb24nLAogICAgdHlwZSA6ICdHRVQnLAogICAgc3VjY2VzczogZnVuY3Rpb24obmV3RGF0YSkgewogICAgICAgIHVwZGF0ZVBhZ2VCYW5kd2lkdGhEYXRhKG5ld0RhdGEpOwogICAgICAgIHNldFRpbWVvdXQodXBkYXRlUGFnZUJhbmR3aWR0aCwgMzAwMDApOwogICAgfSwKICAgIGVycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICBjb25zb2xlLmxvZygiZXJyb3IgcmV0cmlldmluZyBzdGF0aXN0aWNzOyByZXRyeSBpbiA1IHNlY29uZHMiKQogICAgICAgIHNldFRpbWVvdXQodXBkYXRlUGFnZUJhbmR3aWR0aCwgNTAwMCk7CiAgICB9Cn0pOwp9CgokKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdXBkYXRlUGFnZUFuYWx5dGljcygpOwogICAgdXBkYXRlUGFnZUJhbmR3aWR0aCgpOwp9KTsNCgo=