diff --git a/hackingtool.py b/hackingtool.py index 0fbb9a1..93b32bc 100644 --- a/hackingtool.py +++ b/hackingtool.py @@ -1,4 +1,1702 @@ +##!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import os +import sys +import argparse +import threading +import webbrowser +import requests +import time +import http.client +import urllib.request +import json +import telnetlib +import glob +import getpass +import socket import base64 +from getpass import getpass +import subprocess +from sys import argv +import random +import queue +import subprocess +import re +import getpass +from os import path +from platform import system +from urllib.parse import urlparse +from xml.dom import minidom +from optparse import OptionParser +from time import sleep +from platform import system +Logo="""\033[33m -x=(b'''IyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKIyAtKi0gY29kaW5nOiBVVEYtOCAtKi0KaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHdlYmJyb3dzZXIKaW1wb3J0IHJlcXVlc3RzCmltcG9ydCB0aW1lCmltcG9ydCBodHRwLmNsaWVudAppbXBvcnQgdXJsbGliLnJlcXVlc3QKaW1wb3J0IGpzb24KaW1wb3J0IHRlbG5ldGxpYgppbXBvcnQgZ2xvYgppbXBvcnQgZ2V0cGFzcwppbXBvcnQgc29ja2V0CmltcG9ydCBiYXNlNjQKZnJvbSBnZXRwYXNzIGltcG9ydCBnZXRwYXNzCmltcG9ydCBzdWJwcm9jZXNzCmZyb20gc3lzIGltcG9ydCBhcmd2CmltcG9ydCByYW5kb20KaW1wb3J0IHF1ZXVlCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCByZQppbXBvcnQgZ2V0cGFzcwpmcm9tIG9zIGltcG9ydCBwYXRoCmZyb20gcGxhdGZvcm0gaW1wb3J0IHN5c3RlbQpmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJscGFyc2UKZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tCmZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgpmcm9tIHRpbWUgaW1wb3J0IHNsZWVwCmZyb20gcGxhdGZvcm0gaW1wb3J0IHN5c3RlbQpMb2dvPSIiIlwwMzNbMzNtCgogICDiloTiloggICAg4paI4paEICAgICAgIOKWhOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiCAg4paE4paI4paI4paI4paI4paI4paI4paI4paIICAgIOKWhOKWiCAgIOKWhOKWiOKWhCAg4paE4paIICDilojilojilojiloTiloTiloTiloQgICAgICDiloTilojilojilojilojilojilojiloQgICAgICAgICAgIOKWiOKWiOKWiCAgICAgIOKWhOKWiOKWiOKWiOKWiOKWiOKWiOKWhCAgIOKWhOKWiOKWiOKWiOKWiOKWiOKWiOKWhCAgIOKWhOKWiCAgICAgICAKICDilojilojiloggICAg4paI4paI4paIICAgICDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojiloggICDilojilojilogg4paE4paI4paI4paI4paAIOKWiOKWiOKWiCAg4paI4paI4paI4paA4paA4paA4paI4paI4paEICAg4paI4paI4paIICAgIOKWiOKWiOKWiCAgICAgIOKWgOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWhCDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgIAogIOKWiOKWiOKWiCAgICDilojilojiloggICAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWgCAgICDilojilojilojilpDilojilojiloAgICDilojilojilojilowg4paI4paI4paIICAg4paI4paI4paIICAg4paI4paI4paIICAgIOKWiOKWgCAgICAgICAgICDiloDilojilojilojiloDiloDilojilogg4paI4paI4paIICAgIOKWiOKWiOKWiCDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICAgICAKIOKWhOKWiOKWiOKWiOKWhOKWhOKWhOKWhOKWiOKWiOKWiOKWhOKWhCAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgICAg4paE4paI4paI4paI4paI4paI4paAICAgIOKWiOKWiOKWiOKWjCDilojilojiloggICDilojilojiloggIOKWhOKWiOKWiOKWiCAgICAgICAgICAgICAgICAg4paI4paI4paIICAg4paAIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWiOKWiCDilojilojiloggICAgICAgCuKWgOKWgOKWiOKWiOKWiOKWgOKWgOKWgOKWgOKWiOKWiOKWiOKWgCAg4paA4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paIIOKWiOKWiOKWiCAgICAgICAg4paA4paA4paI4paI4paI4paI4paI4paEICAgIOKWiOKWiOKWiOKWjCDilojilojiloggICDilojilojilogg4paA4paA4paI4paI4paIIOKWiOKWiOKWiOKWiOKWhCAgICAgICAgICAg4paI4paI4paIICAgICDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgIAogIOKWiOKWiOKWiCAgICDilojilojiloggICAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWhCAgICDilojilojilojilpDilojilojiloQgICDilojilojiloggIOKWiOKWiOKWiCAgIOKWiOKWiOKWiCAgIOKWiOKWiOKWiCAgICDilojilojiloggICAgICAgICAg4paI4paI4paIICAgICDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgIAogIOKWiOKWiOKWiCAgICDilojilojiloggICAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWiOKWiCAgIOKWiOKWiOKWiCDiloDilojilojilojiloQg4paI4paI4paIICDilojilojiloggICDilojilojiloggICDilojilojiloggICAg4paI4paI4paIICAgICAgICAgIOKWiOKWiOKWiCAgICAg4paI4paI4paIICAgIOKWiOKWiOKWiCDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiOKWjCAgICDiloQgCiAg4paI4paI4paIICAgIOKWiOKWgCAgICAgIOKWiOKWiOKWiCAgICDilojiloAgIOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWgCAgICDilojilojiloggICDiloDilojiloAg4paI4paAICAgIOKWgOKWiCAgIOKWiOKWgCAgICDilojilojilojilojilojilojilojilojiloAgICAgICAgICAg4paE4paI4paI4paI4paI4paAICAgIOKWgOKWiOKWiOKWiOKWiOKWiOKWiOKWgCAgIOKWgOKWiOKWiOKWiOKWiOKWiOKWiOKWgCAg4paI4paI4paI4paI4paI4paE4paE4paI4paIIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWgCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDiloAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXDAzM1s5N21bIV0gaHR0cHM6Ly9naXRodWIuY29tL1o0bnp1L2hhY2tpbmd0b29sClwwMzNbOTdtICIiIgpkZWYgbWVudSgpOgogICAgcHJpbnQoTG9nbyArICIiIlwwMzNbMG0gCiAgICBcMDMzWzkxbVshXSBUaGlzIFRvb2wgTXVzdCBSdW4gYXMgYSBSb290Li5bIV0gXDAzM1s5N20KICAgIFswMF1Bbm9uU3VyZiAgICAgICAgICAgICAgICAgIAogICAgWzAxXUluZm9ybWF0aW9uIEdhdGhlcmluZwogICAgWzAyXVBhc3N3b3JkIEF0dGFjayAmJiBXb3JkbGlzdCBHZW5lcmF0b3IKICAgIFswM11XaXJlbGVzcyBBdHRhY2sKICAgIFswNF1TUUwgSW5qZWN0aW9uIFRvb2xzIAogICAgWzA1XVBoaXNoaW5nIEF0dGFjayAKICAgIFswNl1XZWIgQXR0YWNrIFRvb2wKICAgIFswN11Qb3N0IGV4cGxvaXRhdGlvbgogICAgWzA4XUZvcmVuc2ljIFRvb2xzCiAgICBbMDldUGF5bG9hZCBDcmVhdG9yCiAgICBbMTBdUm91dGVyIEV4cGxvaXQKICAgIFsxMV1XaWZpIEphbW1pbmcKICAgIFsxMl1Tb2NpYWxNZWRpYSBBdHRhY2sKICAgIFsxM11Tb2NpYWxNZWRpYSBGaW5kZXIgCiAgICBbMTRdQW5kcm9pZCBIYWNrCiAgICBbMTVdU3RlZ2Fub2dyYXBoeQogICAgWzE2XU1vcmUgVG9vbHMgCiAgICBbMTddVXBkYXRlIFN5c3RlbQogICAgWzk5XUV4aXQKICAgICIiIikKICAgIAogICAgY2hvaWNlID0gaW5wdXQoIlo0bnp1ICA9Pj4gIikKICAgIGlmIGNob2ljZSA9PSAiMCIgb3IgY2hvaWNlID09ICIwMCI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFub25zdXJmKCkKICAgIGVsaWYgY2hvaWNlID09ICIxIiBvciBjaG9pY2UgPT0gIjAxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgaW5mbygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiIgb3IgY2hvaWNlID09ICIwMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBhc3N3ZCgpCiAgICBlbGlmIGNob2ljZSA9PSAiMyIgb3IgY2hvaWNlID09ICIwMyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdpcmUoKQogICAgZWxpZiBjaG9pY2UgPT0gIjQiIG9yIGNob2ljZSA9PSAiMDQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBzcWx0b29sKCkgICAgCiAgICBlbGlmIGNob2ljZSA9PSAiNSIgb3IgY2hvaWNlID09ICIwNSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsaWYgY2hvaWNlID09ICI2IiBvciBjaG9pY2UgPT0gIjA2IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgd2ViQXR0YWNrKCkgICAgICAgIAogICAgZWxpZiBjaG9pY2UgPT0gIjciIG9yIGNob2ljZSA9PSAiMDciOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBwb3N0ZXhwKCkKICAgIGVsaWYgY2hvaWNlID09ICI4IiBvciBjaG9pY2UgPT0gIjA4IiA6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGZvcmVuc2ljKCkKICAgIGVsaWYgY2hvaWNlID09ICI5IiBvciBjaG9pY2UgPT0gIjA5IiA6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBheWxvYWRzKCkgICAgICAgCiAgICBlbGlmIGNob2ljZSA9PSAiMTAiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICByb3V0ZXhwKCkKICAgIGVsaWYgY2hvaWNlID09ICIxMSIgOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB3aWZpamFtbWluZygpCiAgICBlbGlmIGNob2ljZSA9PSAiMTIiIDoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc29jaWFsYXR0YWNrKCkgICAgICAgCiAgICBlbGlmIGNob2ljZSA9PSAiMTMiIDoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc29jaWFsZmluZGVyKCkKICAgIGVsaWYgY2hvaWNlID09ICIxNCI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgY2hvaWNlID09ICIxNSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxpZiBjaG9pY2UgPT0gIjE2IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgcHJpbnQoTG9nbykKICAgICAgICBvdGhlcnMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjE3IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgcHJpbnQoTG9nbykKICAgICAgICB1cGRhdGVzeXMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IiA6CiAgICAgICAgY2xlYXJTY3IoKSwgc3lzLmV4aXQoKQogICAgICAgIGV4aXQoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlOgogICAgICAgIHByaW50KCJXcm9uZyBJbnB1dC4uLiEhIikKICAgICAgICB0aW1lLnNsZWVwKDMpCiAgICAgICAgbWVudSgpCgpkZWYgYW5vbnN1cmYoKToKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIC1jIEFub25tb3VzbHkgSGlkaW5nIFRvb2wgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdICBBbm9ubW91c2x5IFN1cmYKICAgICAgICBbMl0gIE11bHRpdG9yCiAgICAgICAgWzk5XSBCYWNrCiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPT4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFuc3VyZigpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIG11bHRpdG9yKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBhbnN1cmYoKToKICAgIG9zLnN5c3RlbSgiZWNobyAgXCJJdCBhdXRvbWF0aWNhbGx5IG92ZXJ3cml0ZXMgdGhlIFJBTSB3aGVuXG50aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gQW5EIEFsU28gY0hhbmdlIElwXCIgfGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICBhbmM9aW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFszXVN0b3AgWzk5XU1haW4gTWVudSA+PiAiKQogICAgaWYgYW5jID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9VbmQzcmYxMHcva2FsaS1hbm9uc3VyZi5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2Qga2FsaS1hbm9uc3VyZiAmJiBzdWRvIC4vaW5zdGFsbGVyLnNoICYmIGNkIC4uICYmIHN1ZG8gcm0gLXIga2FsaS1hbm9uc3VyZiIpCiAgICAgICAgYW5vbnN1cmYoKQogICAgZWxpZiBhbmM9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gYW5vbnN1cmYgc3RhcnQiKQogICAgZWxpZiBhbmMgPT0gIjMiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhbm9uc3VyZiBzdG9wIikKICAgIGVsaWYgYW5jID09ICI5OSI6CiAgICAgICAgYW5vbnN1cmYoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgbXVsdGl0b3IoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkhvdyB0byBzdGF5IGluIG11bHRpIHBsYWNlcyBhdCB0aGUgc2FtZSB0aW1lIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvbXVsdGl0b3IuZ2l0IikKICAgICAgICBhbm9uc3VyZigpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgbXVsdGl0b3IgJiYgYmFzaCBtdWx0aXRvci5zaCIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBhbm9uc3VyZigpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBpbmZvKCk6CiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBJbmZvcm1hdGlvbiBHYXRoZXJpbmcgVG9vbHMgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgICAgIFsxXSAgTm1hcCAKICAgICAgICAgICAgWzJdICBEcmFjbm1hcAogICAgICAgICAgICBbM10gIFBvcnQgU2Nhbm5pbmcKICAgICAgICAgICAgWzRdICBIb3N0IFRvIElQCiAgICAgICAgICAgIFs1XSAgWGVyb3NwbG9pdAogICAgICAgICAgICBbNl0gIEFkdmFuY2VkIFhTUyBEZXRlY3Rpb24gU3VpdGUKICAgICAgICAgICAgWzddICBSZWNvblNwaWRlcihGb3IgQWxsIFNjYW5pbmcpCiAgICAgICAgICAgIFs4XSAgSXNJdERvd24gKENoZWNrIFdlYnNpdGUgRG93bi9VcCkKICAgICAgICAgICAgWzk5XSBCYWNrIFRvIE1haW4gTWVudSAKICAgICAgICAiIiIpCiAgICBjaG9pY2UyID0gaW5wdXQoIlo0bnp1ID0+PiAiKQogICAgaWYgY2hvaWNlMiA9PSAiMSI6CiAgICAgICAgbm1hcCgpCiAgICBpZiBjaG9pY2UyID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgRHJhY25tYXAoKQogICAgaWYgY2hvaWNlMiA9PSAiMyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBvcnRzKCkKICAgIGlmIGNob2ljZTIgPT0gIjQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBoMmlwKCkKICAgIGlmIGNob2ljZTIgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB4ZXJvc3Bsb2l0KCkKICAgIGlmIGNob2ljZTIgPT0gIjYiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBYU1N0cmlrZSgpCiAgICBlbGlmIGNob2ljZTIgPT0gIjciOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICByZWNvbnNwaWRlcigpCiAgICBlbGlmIGNob2ljZTIgPT0gIjgiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBpc2l0ZG93bigpCiAgICBlbGlmIGNob2ljZTIgPT0gIjk5IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgbWVudSgpCiAgICBlbGlmIGNob2ljZTIgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlOgogICAgICAgIG1lbnUoKQoKZGVmIG5tYXAoKToKICAgIG5tYXBjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbOTldQkFjayA+PiAiKQogICAgaWYgbm1hcGNob2ljZSA9PSAiMSIgOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL25tYXAvbm1hcC5naXQiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBjaG1vZCAtUiA3NTUgbm1hcCAmJiBjZCBubWFwICYmIHN1ZG8gLi9jb25maWd1cmUgJiYgbWFrZSAmJiBzdWRvIG1ha2UgaW5zdGFsbCIpCiAgICAjIGVsaWYgbm1hcGNob2ljZSA9PSAiMiI6CiAgICAjICAgICBvcy5zeXN0ZW0oInN1ZG8gbm1hcCIpCiAgICBlbGlmIG5tYXBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBpbmZvKCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCiAgICAKZGVmIERyYWNubWFwKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJEcmFjbm1hcCBpcyBhbiBvcGVuIHNvdXJjZSBwcm9ncmFtIHdoaWNoIGlzIHVzaW5nIHRvIFxuZXhwbG9pdCB0aGUgbmV0d29yayBhbmQgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIHdpdGggbm1hcCBoZWxwXCIgfCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgZHJhY25hcCA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgZHJhY25hcCA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vU2NyZWV0c2VjL0RyYWNubWFwLmdpdCAiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgRHJhY25tYXAgJiYgY2htb2QgK3ggRHJhY25tYXAuc2giKQogICAgICAgIHRpbWUuc2xlZXAoMikKICAgICAgICBpbmZvKCkKICAgIGVsaWYgZHJhY25hcCA9PSAiMiI6CiAgICAgICAgcHJpbnQoIlNvcnJ5IFlvdSBIYXZlIHRvIFJ1biBUaGlzIHRvb2wgbWFudWFsbHkgQnkgQ2hhbmdpbmcgUGF0aC4uLiEhIikKICAgICAgICBwcmludCgidXNlIC4vRHJhY25tYXAuc2ggIikKICAgICAgICBleGl0KCkKICAgIGVsaWYgZHJhY25hcCA9PSAiOTkiOgogICAgICAgIGluZm8oKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpICAgIAoKZGVmIGgyaXAoKToKICAgIGhvc3QgPSBpbnB1dCgiRW50ZXIgaG9zdCBuYW1lKHd3dy5nb29nbGUuY29tKSA6LSAgIikKICAgIGlwcyA9IHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3QpCiAgICBwcmludChpcHMpCgpkZWYgcG9ydHMoKToKICAgIGNsZWFyU2NyKCkKICAgIHRhcmdldCA9IGlucHV0KCdTZWxlY3QgYSBUYXJnZXQgSVAgOiAnKQogICAgb3Muc3lzdGVtKCJzdWRvIG5tYXAgLU8gLVBuICVzIiAlIHRhcmdldCkKICAgIHN5cy5leGl0KCkKCmRlZiBYU1N0cmlrZSgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiWFNTdHJpa2UgaXMgYSBweXRob24gc2NyaXB0IGRlc2lnbmVkIHRvIGRldGVjdCBhbmQgZXhwbG9pdCBYU1MgdnVsbmVyYWJpbGl0ZXMuIFwifCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgeGM9aW5wdXQoIlsxXUluc3RhbGwgWzk5XUJBY2sgPj4iKQogICAgaWYgeGMgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBybSAtcmYgWFNTdHJpa2UiKQogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9VbHRpbWF0ZUhhY2tlcnMvWFNTdHJpa2UuZ2l0ICYmIGNkIFhTU3RyaWtlICYmIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQiKQogICAgICAgIGluZm8oKQogICAgIyBlbGlmIHhjID09ICIyIiA6CiAgICAjICAgICBjbGVhclNjcigpCiAgICAjICAgICBvcy5zeXN0ZW0oImVjaG8gXCJZT3UgaGF2ZSB0byBSdW4gWFNTdHJpa2UgYXMgcGVyIHlvdXIgUmVxdWlybWVudFxuIEJ5IHVzaW5nIHB5dGhvbjMgeHNzdHJpa2UucHkgW09wdGlvbnNdXCJ8Ym94ZXMgLWQgYm95IikKICAgICMgICAgIG9zLnN5c3RlbSgiY2QgWFNTdHJpa2UgJiYgcHl0aG9uMyB4c3N0cmlrZS5weSIpCiAgICBlbGlmIHhjID09ICI5OSI6CiAgICAgICAgaW5mbygpCiAgICBlbHNlIDoKICAgICAgICBpbmZvKCkKCmRlZiB4ZXJvc3Bsb2l0KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJYZXJvc3Bsb2l0IGlzIGEgcGVuZXRyYXRpb24gdGVzdGluZyB0b29sa2l0IHdob3NlIGdvYWwgaXMgdG8gcGVyZm9ybSBcbiBtYW4taW4tdGgtbWlkZGxlIGF0dGFja3MgZm9yIHRlc3RpbmcgcHVycG9zZXNcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgeGVyb3M9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHhlcm9zID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oImdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vTGlvblNlYy94ZXJvc3Bsb2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIHhlcm9zcGxvaXQgJiYgc3VkbyBweXRob24gaW5zdGFsbC5weSIpCiAgICAgICAgaW5mbygpCiAgICBlbGlmIHhlcm9zID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8geGVyb3NwbG9pdCIpCiAgICBlbGlmIHhlcm9zID09ICI5OSI6CiAgICAgICAgaW5mbygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiByZWNvbnNwaWRlcigpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiIFJlY29uU3BpZGVyIGlzIG1vc3QgQWR2YW5jZWQgT3BlbiBTb3VyY2UgSW50ZWxsaWdlbmNlIChPU0lOVCkgRnJhbWV3b3JrIGZvciBzY2FubmluZyBJUCBBZGRyZXNzLCBFbWFpbHMsIFxuV2Vic2l0ZXMsIE9yZ2FuaXphdGlvbnMgYW5kIGZpbmQgb3V0IGluZm9ybWF0aW9uIGZyb20gZGlmZmVyZW50IHNvdXJjZXMuXCIgfCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsICBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9iaGF2c2VjL3JlY29uc3BpZGVyLmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGFwdCBpbnN0YWxsIHB5dGhvbjMgcHl0aG9uMy1waXAgJiYgY2QgcmVjb25zcGlkZXIgJiYgc3VkbyBweXRob24zIHNldHVwLnB5IGluc3RhbGwiKQogICAgICAgIGluZm8oKQogICAgIyBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgIyAgICAgb3Muc3lzdGVtKCJjZCByZWNvbnNwaWRlciAmJiBweXRob24zIHJlY29uc3BpZGVyLnB5IikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGluZm8oKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc2V0b29sa2l0KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUaGUgU29jaWFsLUVuZ2luZWVyIFRvb2xraXQgaXMgYW4gb3Blbi1zb3VyY2UgcGVuZXRyYXRpb25cbnRlc3RpbmcgZnJhbWV3b3JrIGRlc2lnbmVkIGZvciBzb2NpYWwgZW5naW5lZXJpbmdcInwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZXNldCA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiIpCiAgICBpZiBjaG9pY2VzZXQgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90cnVzdGVkc2VjL3NvY2lhbC1lbmdpbmVlci10b29sa2l0LmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJweXRob24gc29jaWFsLWVuZ2luZWVyLXRvb2xraXQvc2V0dXAucHkiKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGlmIGNob2ljZXNldCA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBzZXRvb2xraXQiKQogICAgZWxpZiBjaG9pY2VzZXQgPT0gIjk5IjoKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbHNlOgogICAgICAgIG1lbnUoKQoKZGVmIHBhc3N3ZCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgV29yZGxpc3QgR2VuZXJhdG9yIHwgbG9sY2F0IikKICAgIHByaW50KCIiIiAgIAogICAgICAgICAgICAgICAgWzAxXUN1cHAKICAgICAgICAgICAgICAgIFswMl1Xb3JkbGlzdENyZWF0b3IKICAgICAgICAgICAgICAgIFswM11Hb2JsaW4gV29yZEdlbmVyYXRvcgogICAgICAgICAgICAgICAgWzA0XUNyZWRlbnRpYWwgcmV1c2UgYXR0YWNrcwogICAgICAgICAgICAgICAgWzk5XUJhY2sgVG8gTWFpbiBNZW51CiAgICAgICAiIiIpCiAgICBwYXNzY2hvaWNlID0gaW5wdXQoIlo0bnp1ID09Pj4gIikKICAgIGlmIHBhc3NjaG9pY2UgPT0gIjEiIG9yIHBhc3NjaG9pY2UgPT0gIjAxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgY3VwcCgpCiAgICBlbGlmIHBhc3NjaG9pY2UgPT0gIjIiIG9yIHBhc3NjaG9pY2UgPT0gIjAyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgd2xjcmVhdG9yKCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiMyIgb3IgcGFzc2Nob2ljZSA9PSAiMDMiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBnb2JsaW53b3JkKCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiNCIgb3IgcGFzc2Nob2ljZSA9PSAiMDQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBjcmVkZW50aWFsYXR0YWNrKCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiOTkiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBtZW51KCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiIjoKICAgICAgICBtZW51KCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgY3VwcCgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiQ29tbW9uIFVzZXIgUGFzc3dvcmQgR2VuZXJhdG9yLi4hIVwifCBib3hlcyAtZCBib3kgfCBsb2xjYXQgIikKICAgIGNjPWlucHV0KCJbMV1JbnN0YWxsIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjYyA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL01lYnVzL2N1cHAuZ2l0IikKICAgICAgICBwYXNzd2QoKQogICAgZWxpZiBjYyA9PSAiMiI6CiAgICAgICAgIyBvcy5zeXN0ZW0oImNkIGN1cHAgJiYgLi9jdXBwLnB5IC1oIikKICAgICAgICBwYXNzCiAgICBlbGlmIGNjID09ICI5OSIgOgogICAgICAgIHBhc3N3ZCgpCiAgICBlbHNlIDoKICAgICAgICBtYWluKCkKCmRlZiB3bGNyZWF0b3IoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIiBXbENyZWF0b3IgaXMgYSBDIHByb2dyYW0gdGhhdCBjYW4gY3JlYXRlIGFsbCBwb3NzaWJpbGl0aWVzIG9mIHBhc3N3b3JkcyxcbiBhbmQgeW91IGNhbiBjaG9vc2UgTGVuZ2h0LCBMb3dlcmNhc2UsIENhcGl0YWwsIE51bWJlcnMgYW5kIFNwZWNpYWwgQ2hhcnNcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL3dsY3JlYXRvciIpCiAgICAgICAgcGFzc3dkKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCB3bGNyZWF0b3IgJiYgc3VkbyBnY2MgLW8gd2xjcmVhdG9yIHdsY3JlYXRvci5jICYmIC4vd2xjcmVhdG9yIDUiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGFzc3dkKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGdvYmxpbndvcmQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIiBHb2JsaW5Xb3JkR2VuZXJhdG9yIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vVW5kZWFkU2VjL0dvYmxpbldvcmRHZW5lcmF0b3IuZ2l0IikKICAgICAgICBwYXNzd2QoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIEdvYmxpbldvcmRHZW5lcmF0b3IgJiYgcHl0aG9uMyBnb2JsaW4ucHkiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGFzc3dkKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGNyZWRlbnRpYWxhdHRhY2soKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlshXUNoZWNrIGlmIHRoZSB0YXJnZXRlZCBlbWFpbCBpcyBpbiBhbnkgbGVha3MgYW5kIHRoZW4gdXNlIHRoZSBsZWFrZWQgcGFzc3dvcmQgdG8gY2hlY2sgaXQgYWdhaW5zdCB0aGUgd2Vic2l0ZXMuXG5bIV1DaGVjayBpZiB0aGUgdGFyZ2V0IGNyZWRlbnRpYWxzIHlvdSBmb3VuZCBpcyByZXVzZWQgb24gb3RoZXIgd2Vic2l0ZXMvc2VydmljZXMuXG5bIV1DaGVja2luZyBpZiB0aGUgb2xkIHBhc3N3b3JkIHlvdSBnb3QgZnJvbSB0aGUgdGFyZ2V0L2xlYWtzIGlzIHN0aWxsIHVzZWQgaW4gYW55IHdlYnNpdGUuXG5bI11UaGlzIFRvb2wgQXZhaWxhYmxlIGluIE1BQyAmIFdpbmRvd3MgT3MgXG5cdFshXSBodHRwczovL2dpdGh1Yi5jb20vRDRWaW5jaS9DcjNkT3YzclwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0Q0VmluY2kvQ3IzZE92M3IuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIENyM2RPdjNyICYmIHB5dGhvbjMgLW0gcGlwIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgcGFzc3dkKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiIgOgogICAgICAgIG9zLnN5c3RlbSgiY2QgQ3IzZE92M3IgJiYgc3VkbyBweXRob24zIENyM2QwdjNyLnB5IC1oIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHBhc3N3ZCgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB3aXJlKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBXaXJlbGVzcyBBdHRhY2sgVG9vbHMgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiICAKICAgICAgICAgICAgICAgIFsxXSBXaUZpLVB1bXBraW4KICAgICAgICAgICAgICAgIFsyXSBwaXhpZXdwcwogICAgICAgICAgICAgICAgWzNdIEJsdWV0b290aCBIb25leXBvdCBHVUkgRnJhbWV3b3JrCiAgICAgICAgICAgICAgICBbNF0gRmx1eGlvbgogICAgICAgICAgICAgICAgWzVdIFdpZmlwaGlzaGVyCiAgICAgICAgICAgICAgICBbNl0gV2lmaXRlCiAgICAgICAgICAgICAgICBbN10gRXZpbFR3aW4gCiAgICAgICAgICAgICAgICBbOTldQmFjayBUbyBUaGUgTWFpbiBNZW51ICIiIikKICAgIGNob2ljZTQgPSBpbnB1dCgiWjRuenUgPT0+PiAiKQogICAgaWYgY2hvaWNlNCA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdpZmlwdW1raW4oKQogICAgaWYgY2hvaWNlNCA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBpeGlld3BzKCkKICAgIGlmIGNob2ljZTQgPT0gIjMiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBibHVlcG90KCkKICAgIGlmIGNob2ljZTQgPT0gIjQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBmbHV4aW9uKCkKICAgIGlmIGNob2ljZTQgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB3aWZpcGhpc2hlcigpCiAgICBlbGlmIGNob2ljZTQgPT0gIjYiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB3aWZpdGUoKQogICAgZWxpZiBjaG9pY2U0ID09ICI3IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZXZpbHR3aW4oKQogICAgZWxpZiBjaG9pY2U0ID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbGlmIGNob2ljZTQgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlOgogICAgICAgIG1lbnUoKQoKZGVmIHdpZmlwdW1raW4oKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlRoZSBXaUZpLVB1bXBraW4gaXMgYSByb2d1ZSBBUCBmcmFtZXdvcmsgdG8gZWFzaWx5IGNyZWF0ZSB0aGVzZSBmYWtlIG5ldHdvcmtzXG5hbGwgd2hpbGUgZm9yd2FyZGluZyBsZWdpdGltYXRlIHRyYWZmaWMgdG8gYW5kIGZyb20gdGhlIHVuc3VzcGVjdGluZyB0YXJnZXQuXCJ8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB3cD1pbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgd3AgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgaW5zdGFsbCBsaWJzc2wtZGV2IGxpYmZmaS1kZXYgYnVpbGQtZXNzZW50aWFsIikKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9QMGNMNGJzL3dpZmlwdW1wa2luMy5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2htb2QgLVIgNzU1IHdpZmlwdW1wa2luMyAmJiBjZCB3aWZpcHVtcGtpbjMiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgaW5zdGFsbCBweXRob24zLXB5cXQ1ICIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIHB5dGhvbjMgc2V0dXAucHkgaW5zdGFsbCIpCiAgICAgICAgd2lyZSgpCiAgICBlbGlmIHdwID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIHdpZmlwdW1wa2luMyIpCiAgICBlbGlmIHdwID09ICI5OSI6CiAgICAgICAgd2lyZSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBwaXhpZXdwcygpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiUGl4aWV3cHMgaXMgYSB0b29sIHdyaXR0ZW4gaW4gQyB1c2VkIHRvIGJydXRlZm9yY2Ugb2ZmbGluZSB0aGUgV1BTIHBpblxuIGV4cGxvaXRpbmcgdGhlIGxvdyBvciBub24tZXhpc3RpbmcgZW50cm9weSBvZiBzb21lIEFjY2VzcyBQb2ludHMsIHRoZSBzby1jYWxsZWQgcGl4aWUgZHVzdCBhdHRhY2tcInwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZXdwcyA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgY2hvaWNld3BzID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS93aWlyZS9waXhpZXdwcy5naXQgJiYgYXB0LWdldCAteSBpbnN0YWxsIGJ1aWxkLWVzc2VudGlhbCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBwaXhpZXdwcyovICYmIG1ha2UgIikKICAgICAgICBvcy5zeXN0ZW0oImNkIHBpeGlld3BzKi8gJiYgc3VkbyBtYWtlIGluc3RhbGwgJiYgd2dldCBodHRwczovL3Bhc3RlYmluLmNvbS95OURrMVdqaCIpCiAgICBpZiBjaG9pY2V3cHMgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcIjEuPlB1dCB5b3VyIGludGVyZmFjZSBpbnRvIG1vbml0b3IgbW9kZSB1c2luZyAnYWlybW9uLW5nIHN0YXJ0IHt3aXJlbGVzcyBpbnRlcmZhY2V9XG4yLj53YXNoIC1pIHttb25pdG9yLWludGVyZmFjZSBsaWtlIG1vbjB9J1xuMy4+cmVhdmVyIC1pIHttb25pdG9yIGludGVyZmFjZX0gLWIge0JTU0lEIG9mIHJvdXRlcn0gLWMge3JvdXRlciBjaGFubmVsfSAtdnZ2IC1LIDEgLWZcInwgYm94ZXMgLWQgYm95IikKICAgICAgICBwcmludCgiWW91IEhhdmUgVG8gUnVuIE1hbnVhbGx5IEJ5IFVTaW5nID4+cGl4aWV3cHMgLWggIikKICAgICAgICBwYXNzCiAgICBlbGlmIGNob2ljZXdwcyA9PSAiOTkiOgogICAgICAgIHdpcmUoKQogICAgZWxzZToKICAgICAgICBtZW51KCkKCmRlZiBibHVlcG90KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJ5b3UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IDEgYmx1ZXRvb2ggcmVjZWl2ZXIgKGlmIHlvdSBoYXZlIG1hbnkgaXQgd2lsbCB3b3JrIHdpaHQgdGhvc2UsIHRvbykuXG5Zb3UgbXVzdCBpbnN0YWxsL2xpYmJsdWV0b290aC1kZXYgb24gVWJ1bnR1L2JsdWV6LWxpYnMtZGV2ZWwgb24gRmVkb3JhL2JsdWV6LWRldmVsIG9uIG9wZW5TVVNFXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oIndnZXQgaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld21pY2hhZWxzbWl0aC9ibHVlcG90L3Jhdy9tYXN0ZXIvYmluL2JsdWVwb3QtMC4xLnRhci5neiAmJiB0YXIgeGZ6IGJsdWVwb3QtMC4xLnRhci5neiAmJiBzdWRvIGphdmEgLWphciBibHVlcG90L0JsdWVQb3QtMC4xLmphciIpCiAgICAgICAgdGltZS5zbGVlcCgzKQogICAgICAgIHdpcmUoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgYmx1ZXBvdC0wLjEgJiYgc3VkbyBqYXZhIC1qYXIgYmx1ZXBvdC9CbHVlUG90LTAuMS5qYXIiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3aXJlKCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgZmx1eGlvbigpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiZmx1eGlvbiBpcyBhIHdpZmkga2V5IGNyYWNrZXIgdXNpbmcgZXZpbCB0d2luIGF0dGFjay4uXG55b3UgbmVlZCBhIHdpcmVsZXNzIGFkYXB0b3IgZm9yIHRoaXMgdG9vbFwifCBib3hlcyAtZCBib3kgfCBsb2xjQVQiKQogICAgY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWhhY2tpbmdzYWdlL0ZsdXhpb24uZ2l0IikgCiAgICAgICAgb3Muc3lzdGVtKCJjZCBGbHV4aW9uICYmIGNkIGluc3RhbGwgJiYgc3VkbyBjaG1vZCAreCBpbnN0YWxsLnNoICYmIHN1ZG8gYmFzaCBpbnN0YWxsLnNoIikKICAgICAgICBvcy5zeXN0ZW0oImNkIC4uICYmIHN1ZG8gY2htb2QgK3ggZmx1eGlvbi5zaCIpCiAgICAgICAgdGltZS5zbGVlcCgyKQogICAgICAgIHdpcmUoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgRmx1eGlvbiAmJiBzdWRvIGJhc2ggZmx1eGlvbi5zaCIpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiIDoKICAgICAgICB3aXJlKCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgd2lmaXBoaXNoZXIoKToKICAgIHByaW50KCIiIgogICAgV2lmaXBoaXNoZXIgaXMgYSByb2d1ZSBBY2Nlc3MgUG9pbnQgZnJhbWV3b3JrIGZvciBjb25kdWN0aW5nIHJlZCB0ZWFtIGVuZ2FnZW1lbnRzIG9yIFdpLUZpIHNlY3VyaXR5IHRlc3RpbmcuIAogICAgVXNpbmcgV2lmaXBoaXNoZXIsIHBlbmV0cmF0aW9uIHRlc3RlcnMgY2FuIGVhc2lseSBhY2hpZXZlIGEgbWFuLWluLXRoZS1taWRkbGUgcG9zaXRpb24gYWdhaW5zdCB3aXJlbGVzcyBjbGllbnRzIGJ5IHBlcmZvcm1pbmcgCiAgICB0YXJnZXRlZCBXaS1GaSBhc3NvY2lhdGlvbiBhdHRhY2tzLiBXaWZpcGhpc2hlciBjYW4gYmUgZnVydGhlciB1c2VkIHRvIG1vdW50IHZpY3RpbS1jdXN0b21pemVkIHdlYiBwaGlzaGluZyBhdHRhY2tzIGFnYWluc3QgdGhlCiAgICBjb25uZWN0ZWQgY2xpZW50cyBpbiBvcmRlciB0byBjYXB0dXJlIGNyZWRlbnRpYWxzIChlLmcuIGZyb20gdGhpcmQgcGFydHkgbG9naW4gcGFnZXMgb3IgV1BBL1dQQTIgUHJlLVNoYXJlZCBLZXlzKSBvciBpbmZlY3QgdGhlIAogICAgdmljdGltIHN0YXRpb25zIHdpdGggbWFsd2FyZS4uCiAgICAiIiIpCiAgICBwcmludCgiRm9yIE1vcmUgRGV0YWlscyBWaXNpdCA+PiBodHRwczovL2dpdGh1Yi5jb20vd2lmaXBoaXNoZXIvd2lmaXBoaXNoZXIiKQogICAgd2Nob2ljZT1pbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHdjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS93aWZpcGhpc2hlci93aWZpcGhpc2hlci5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2Qgd2lmaXBoaXNoZXIgJiYgc3VkbyBweXRob24zIHNldHVwLnB5IGluc3RhbGwiKSAgIAogICAgICAgIHdpcmUoKQogICAgaWYgd2Nob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCB3aWZpcGhpc2hlciAmJiBzdWRvIHdpZmlwaGlzaGVyIikKICAgIGVsaWYgd2Nob2ljZSA9PSAiOTkiIDoKICAgICAgICB3aXJlKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHdpZml0ZSgpOgogICAgd2M9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CQWNrID4+ICIpCiAgICBpZiB3YyA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20va2ltb2NvZGVyL3dpZml0ZTIuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIHdpZml0ZTIgJiYgc3VkbyBweXRob24zIHNldHVwLnB5IGluc3RhbGwgJiYgc3VkbyBwaXAzIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgdGltZS5zbGVlcCgzKQogICAgICAgIHdpcmUoKQogICAgZWxpZiB3YyA9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHdpZml0ZTIgJiYgc3VkbyB3aWZpdGUiKQogICAgZWxpZiB3YyA9PSAiOTkiOgogICAgICAgIHdpcmUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZXZpbHR3aW4oKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkZha2VhcCBpcyBhIHNjcmlwdCB0byBwZXJmb3JtIEV2aWwgVHdpbiBBdHRhY2ssIGJ5IGdldHRpbmcgY3JlZGVudGlhbHMgdXNpbmcgYSBGYWtlIHBhZ2UgYW5kIEZha2UgQWNjZXNzIFBvaW50IFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZmFrZWFwICIpCiAgICAgICAgd2lyZSgpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgZmFrZWFwICYmIHN1ZG8gYmFzaCBmYWtlYXAuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgd2lyZSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBzb2NpYWxhdHRhY2soKToKICAgIGNsZWFyU2NyKCkKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIFNvY2lhbE1lZGlhIEF0dGFjayB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gSW5zdGFncmFtIEF0dGFjawogICAgICAgIFsyXSBUd2VldGVyIEF0dGFjawogICAgICAgIFszXSBGYWNlYm9vayBBdHRhY2sKICAgICAgICBbNF0gQXBwbGljYXRpb24gQ2hlY2tlcgogICAgICAgIFs5OV1CYWNrIFRvIE1lbnUKICAgICIiIikKICAgIGNob2ljZT1pbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGluc3Rhc2hlbGwoKQogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHR3ZWV0c2hlbGwoKQogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiMyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGZhY2VzaGVsbCgpCiAgICAgICAgc29jaWFsYXR0YWNrKCkKICAgIGVsaWYgY2hvaWNlID09ICI0IiA6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFwcGNoZWNrKCkKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IiA6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBpbnN0YXNoZWxsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJJbnN0YXNoZWxsIGlzIGFuIFNoZWxsIFNjcmlwdCB0byBwZXJmb3JtIG11bHRpLXRocmVhZGVkIGJydXRlIGZvcmNlIGF0dGFjayBhZ2FpbnN0IEluc3RhZ3JhbSBcInwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGluc3RhY2hvaWNlPWlucHV0KCJbMV1pbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgaW5zdGFjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2luc3Rhc2hlbGwgIikKICAgICAgICBvcy5zeXN0ZW0oImNkIGluc3Rhc2hlbGwgJiYgc3VkbyBjaG1vZCAreCBpbnN0YWxsLnNoICYmIHN1ZG8gLi9pbnN0YWxsLnNoIikKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiBpbnN0YWNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBpbnN0YXNoZWxsICYmIGNobW9kICt4IGluc3Rhc2hlbGwuc2ggJiYgc2VydmljZSB0b3Igc3RhcnQgJiYgc3VkbyAuL2luc3Rhc2hlbGwuc2giKQogICAgZWxpZiBpbnN0YWNob2ljZSA9PSAiOTkiOgogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB0d2VldHNoZWxsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUd2VldHNoZWxsIGlzIGFuIFNoZWxsIFNjcmlwdCB0byBwZXJmb3JtIG11bHRpLXRocmVhZGVkIGJydXRlIGZvcmNlIGF0dGFjayBhZ2FpbnN0IFR3aXR0ZXJcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgY2hvaWNlID0gaW5wdXQgKCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS90d2VldHNoZWxsICYmIGNobW9kIC1SIDc3NSB0d2VldHNoZWxsIikKICAgICAgICBvcy5zeXN0ZW0oImNkIHR3ZWV0c2hlbGwgJiYgc3VkbyAuL2luc3RhbGwuc2giKQogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCB0d2VldHNoZWxsICYmIHNlcnZpY2UgdG9yIHN0YXJ0ICYmIHN1ZG8gLi90d2VldHNoZWxsLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgc29jaWFsYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGZhY2VzaGVsbCgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiRmFjZWJhc2ggaXMgYW4gU2hlbGwgU2NyaXB0IHRvIHBlcmZvcm0gYnJ1dGUgZm9yY2UgYXR0YWNrIGFnYWluc3QgRkFjZWJvb2tcbiBbIV1GYWNlYm9vayBibG9ja3MgYWNjb3VudCBmb3IgMSBob3VyIGFmdGVyIDIwIHdyb25nIHBhc3N3b3Jkcywgc28gdGhpcyBzY3JpcHQgY2FuIHBlcmZvcm0gb25seSAyMCBwYXNzL2ggXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZSA9IGlucHV0ICgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZmFjZWJhc2ggJiYgY2htb2QgLVIgNzc1IGZhY2ViYXNoIikKICAgICAgICBvcy5zeXN0ZW0oImNkIGZhY2ViYXNoICYmIHN1ZG8gLi9pbnN0YWxsLnNoIikKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgZmFjZWJhc2ggJiYgc2VydmljZSB0b3Igc3RhcnQgJiYgc3VkbyAuL2ZhY2ViYXNoLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgc29jaWFsYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGFwcGNoZWNrKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUb29sIHRvIGNoZWNrIGlmIGFuIGFwcCBpcyBpbnN0YWxsZWQgb24gdGhlIHRhcmdldCBkZXZpY2UgdGhyb3VnaCBhIGxpbmsuXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL3VuZGVyaGFuZGVkIikKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHVuZGVyaGFuZGVkICYmIHN1ZG8gY2htb2QgK3ggdW5kZXJoYW5kZWQuc2ggJiYgc3VkbyBiYXNoIHVuZGVyaGFuZGVkLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBwaGlzaGF0dGFjaygpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgUGhpc2hpbmcgQXR0YWNrIFRvb2xzIHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgWzFdIFNldG9vbGtpdCAKICAgICAgIFsyXSBTb2NpYWxGaXNoCiAgICAgICBbM10gU2hlbGxwaGlzaAogICAgICAgWzRdIEJsYWNrRXllCiAgICAgICBbNV0gSS1TZWVfWW91KEdldCBMb2NhdGlvbiB1c2luZyBwaGlzaGluZyBhdHRhY2spIAogICAgICAgWzZdIFNheUNoZWVzZSAoR3JhYiB0YXJnZXQncyBXZWJjYW0gU2hvdHMpCiAgICAgICBbN10gUVIgQ29kZSBKYWNraW5nCiAgICAgICBbOTldQmFjayBUbyBNYWluIE1lbnUKICAgICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56dSA9PT4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBzZXRvb2xraXQoKQogICAgaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc29jaWFsZmlzaCgpCiAgICBpZiBjaG9pY2UgPT0gIjMiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBzaGVsbHBoaXNoKCkKICAgIGlmIGNob2ljZSA9PSAiNCI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGJsYWNrZXllKCkKICAgIGVsaWYgY2hvaWNlID09ICI1IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgaXNlZXlvdSgpCiAgICBlbGlmIGNob2ljZSA9PSAiNiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNheWNoZWVzZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiNyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHFyamFja2luZygpCiAgICBpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgbWVudSgpCiAgICBlbGlmIGNob2ljZSA9PSAiIjoKICAgICAgICBtZW51KCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgc29jaWFsZmlzaCgpOgogICAgY2hvaWNlPWlucHV0KCJbMV1pbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9VbmRlYWRTZWMvU29jaWFsRmlzaC5naXQgJiYgc3VkbyBhcHQtZ2V0IGluc3RhbGwgcHl0aG9uMyBweXRob24zLXBpcCBweXRob24zLWRldiAteSIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBTb2NpYWxGaXNoICYmIHN1ZG8gcHl0aG9uMyAtbSBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IikKICAgICAgICB0aW1lLnNsZWVwKDIpCiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0iMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBTb2NpYWxGaXNoICYmIHN1ZG8gcHl0aG9uMyBTb2NpYWxGaXNoLnB5IHJvb3QgcGFzcyIpCiAgICBlbGlmIGNob2ljZSA9PSI5OSI6CiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc2hlbGxwaGlzaCgpOgogICAgY2hvaWNlPWlucHV0KCJbMV1pbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9zaGVsbHBoaXNoIikKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHNoZWxscGhpc2ggJiYgc3VkbyBiYXNoIHNoZWxscGhpc2guc2giKQogICAgZWxpZiBjaG9pY2UgPT0iOTkiOgogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGJsYWNrZXllKCk6CiAgICBjaG9pY2U9aW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFs5OV1CQWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2JsYWNrZXllIikKICAgICAgICB0aW1lLnNsZWVwKDIpCiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0iMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBibGFja2V5ZSAmJiBzdWRvIGJhc2ggYmxhY2tleWUuc2giKQogICAgZWxpZiBjaG9pY2UgPT0iOTkiOgogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGlzZWV5b3UoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlshXSBJU2VlWW91IGlzIGEgdG9vbCB0byBmaW5kIEV4YWN0IExvY2F0aW9uIG9mIFZpY3RvbSBCeSBVc2VyIFNvY2lhbEVuZ2luZWVyaW5nIG9yIFBoaXNoaW5nIEVuZ2FnbWVudC4uXG5bIV1Vc2VycyBjYW4gZXhwb3NlIHRoZWlyIGxvY2FsIHNlcnZlcnMgdG8gdGhlIEludGVybmV0IGFuZCBkZWNvZGUgdGhlIGxvY2F0aW9uIGNvb3JkaW5hdGVzIGJ5IGxvb2tpbmcgYXQgdGhlIGxvZyBmaWxlXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL1ZpcmFsbWFuaWFyL0ktU2VlLVlvdS5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgSS1TZWUtWW91ICYmIHN1ZG8gY2htb2QgdSt4IElTZWVZb3Uuc2giKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBJLVNlZS1Zb3UgJiYgc3VkbyBiYXNoIElTZWVZb3Uuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc2F5Y2hlZXNlKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUYWtlIHdlYmNhbSBzaG90cyBmcm9tIHRhcmdldCBqdXN0IHNlbmRpbmcgYSBtYWxpY2lvdXMgbGlua1wifGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9zYXljaGVlc2UiKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBzYXljaGVlc2UgJiYgc3VkbyBiYXNoIHNheWNoZWVzZS5zaCIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBxcmphY2tpbmcoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlFSIENvZGUgSmFja2luZyAoQW55IFdlYnNpdGUpIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2Uvb2hteXFyICYmIHN1ZG8gYXB0LWdldCBpbnN0YWxsIHNjcm90IikKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2Qgb2hteXFyICYmIHN1ZG8gYmFzaCBvaG15cXIuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc29jaWFsZmluZGVyKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCBTb2NpYWxNZWRpYSBGaW5kZXIgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdRmluZCBTb2NpYWxNZWRpYSBCeSBGYWNpYWwgUmVjb2duYXRpb24gU3lzdGVtCiAgICAgICAgWzJdRmluZCBTb2NpYWxNZWRpYSBCeSBVc2VyTmFtZQogICAgICAgIFs5OV1CYWNrIFRvIE1haW4gTWVudQogICAgIiIiKQogICAgY2hvaWNlID1pbnB1dCgiWjRuenUgPT4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgZmFjaWFsZmluZCgpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgdXNlcnJlY29uKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBmYWNpYWxmaW5kKCk6CiAgICBjaG9pY2U9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6bW96aWxsYXRlYW0vZmlyZWZveC1uZXh0ICYmIHN1ZG8gYXB0IHVwZGF0ZSAmJiBzdWRvIGFwdCB1cGdyYWRlIikKICAgICAgICBvcy5zeXN0ZW0oImVjaG8gXCJbIV1Ob3cgWW91IGhhdmUgVG8gZG8gc29tZSBNYW51YWxseVxuWyFdSW5zdGFsbCB0aGUgR2Vja29kcml2ZXIgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbVxuWyFdQ29weSAmIFBhc3RlIExpbmsgQW5kIERvd25sb2FkIEZpbGUgQXMgU3lzdGVtIENvbmZpZ3VyYXRpb25cblsjXWh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvZHJpdmVyL3JlbGVhc2VzXG5bISFdT24gTGludXggeW91IGNhbiBwbGFjZSBpdCBpbiAvdXNyL2JpbiBcInwgYm94ZXMgLWQgYm95IikKICAgICAgICB0aW1lLnNsZWVwKDUpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vR3JlZW53b2xmL3NvY2lhbF9tYXBwZXIuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIHNvY2lhbF9tYXBwZXIvc2V0dXAiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBweXRob24zIC1tIHBpcCBpbnN0YWxsIC0tbm8tY2FjaGUtZGlyIC1yIHJlcXVpcmVtZW50cy50eHQiKQogICAgICAgIHNvY2lhbGZpbmRlcigpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBzb2NpYWxfbWFwcGVyL3NldHVwIikKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gcHl0aG9uIHNvY2lhbF9tYXBwZXIucHkgLWgiKQogICAgICAgIHByaW50KCIiIlwwMzNbOTVtIAogICAgICAgICAgICAgICAgWW91IGhhdmUgdG8gc2V0IFVzZXJuYW1lIGFuZCBwYXNzd29yZCBvZiB5b3VyIEFDIE9yIEFueSBGYWNrIEFjY291bnQKICAgICAgICAgICAgICAgIHswfVR5cGUgaW4gVGVybWluYWwgbmFubyBzb2NpYWxfbWFwcGVyLnB5CiAgICAgICAgXG4gXSIiIikKICAgICAgICBvcy5zeXN0ZW0oImVjaG8gXCJweXRob24gc29jaWFsX21hcHBlci5weSAtZiBbPGltYWdlRm9sZGVybmFtZT5dIC1pIFs8aW1nRm9sZGVyUGF0aD5dIC1tIGZhc3QgWzxBY05hbWU+XSAtZmIgLXR3XCJ8IGJveGVzIC1kIGhlYWRsaW5lIHwgbG9sY2F0IikKICAgIGVsaWYgY2hvaWNlID09ICI5OSIgOgogICAgICAgIHNvY2lhbGZpbmRlcigpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB1c2VycmVjb24oKToKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL3VzZXJyZWNvbi5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgdXNlcnJlY29uICYmIHN1ZG8gY2htb2QgK3ggdXNlcnJlY29uLnNoICIpCiAgICAgICAgdGltZS5zbGVlcCgzKQogICAgICAgIHNvY2lhbGZpbmRlcigpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgdXNlcnJlY29uICYmIHN1ZG8gLi91c2VycmVjb24uc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgc29jaWFsZmluZGVyKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGZvcmVuc2ljKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCBGb3JlbnNpYyBUb29scyB8IGxvbGNhdCAiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdIEJ1bGtfZXh0cmFjdG9yCiAgICAgICAgWzJdIERpc2sgQ2xvbmUgYW5kIElTTyBJbWFnZSBBcXVpcmUKICAgICAgICBbM10gQXV0b1NweSAKICAgICAgICBbOTldQmFjayB0byBNZW51CiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPT0+PiIpCiAgICBpZiBjaG9pY2UgPT0gIjEiIDoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgYnVsa2V4dHJhY3RvcigpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGd1eW1hZ2VyKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgYXV0b3BzeSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBidWxrZXh0cmFjdG9yKCk6CiAgICBwcmludCgiIiIKICAgICAgICBbMV1HVUkgTW9kZShEb3dubG9hZCByZXF1aXJlZCkKICAgICAgICBbMl1DTEkgTW9kZQogICAgICAgIFs5OV1CQWNrCiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vc2ltc29uZy9idWxrX2V4dHJhY3Rvci5naXQiKQogICAgICAgIG9zLnN5c3RlbSgibHMgc3JjLyAmJiBjZCAuLiAmJiBjZCBqYXZhX2d1aSAmJiAuL0JFVmlld2VyIikKICAgICAgICBwcmludCgiSWYgeW91IGdldHRpbmcgZXJyb3IgYWZ0ZXIgY2xvbmUgZ28gdG8gL2phdmFfZ3VpL3NyYy8gQW5kIENvbXBpbGUgLkphciBmaWxlICYmIHJ1biAuL0JFVmlld2VyIikKICAgICAgICBwcmludCgiUGxlYXNlIFZpc2l0IEZvciBNb3JlIERldGFpbHMgQWJvdXQgSW5zdGFsbGF0aW9uID4+IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1zb25nL2J1bGtfZXh0cmFjdG9yICIpCiAgICBlbGlmIGNob2ljZSA9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gYXB0LWdldCBpbnN0YWxsIGJ1bGtfZXh0cmFjdG9yIikKICAgICAgICBwcmludCgiYnVsa19leHRyYWN0b3IgYW5kIG9wdGlvbnMiKQogICAgICAgIG9zLnN5c3RlbSgiYnVsa19leHRyYWN0b3IiKQogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcImJ1bGtfZXh0cmFjdG9yIFtvcHRpb25zXSBpbWFnZWZpbGVcIiB8IGJveGVzIC1kIGhlYWRsaW5lIHwgbG9sY2F0IikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgZm9yZW5zaWMoKQogICAgZWxpZiBjaG9pY2UgPT0iIjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBndXltYWdlcigpOgogICAgY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgaW5zdGFsbCBndXltYWdlciIpCiAgICAgICAgZm9yZW5zaWMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ3V5bWFnZXIiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbGlmIGNob2ljZSA9PSAiIjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBhdXRvcHN5KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJBdXRvcHN5IGlzIGEgcGxhdGZvcm0gdGhhdCBpcyB1c2VkIGJ5IEN5YmVyIEludmVzdGlnYXRvcnMuXG5bIV0gV29ya3MgaW4gYW55IE9zXG5bIV1SZWNvdmVyIERlbGV0ZWQgRmlsZXMgZnJvbSBhbnkgT1MgJiBNRWRpYSBcblshXUV4dHJhY3QgSW1hZ2UgTWV0YWRhdGEgXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgIFsxXVJ1biBbOTldQmFjayAgCiAgICAiIiIpCiAgICBjaG9pY2U9aW5wdXQoIlo0bnp1ID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhdXRvcHN5IikKICAgIGlmIGNob2ljZSA9PSAiIjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbGlmIGNob2ljZSA9PSI5OSI6CiAgICAgICAgZm9yZW5zaWMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgcG9zdGV4cCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgcG9zdCBleHBsb3RhdGlvbnMgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdIFZlZ2lsZSAtIEdob3N0IEluIFRoZSBTaGVsbAogICAgICAgIFsyXSBDaHJvbWUgS2V5bG9nZ2VyCiAgICAgICAgWzk5XUJhY2sgCiAgICAiIiIpCiAgICBleHBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPT4+ICIpCiAgICBpZiBleHBjaG9pY2UgPT0gIjEiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB2ZWdpbGUoKQogICAgaWYgZXhwY2hvaWNlID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgY2hyb21la2V5bG9nZ2VyKCkKICAgIGVsaWYgZXhwY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbGlmIGV4cGNob2ljZSA9PSAiIjoKICAgICAgICBwb3N0ZXhwKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHZlZ2lsZSgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiWyFdVGhpcyB0b29sIHdpbGwgc2V0IHVwIHlvdXIgYmFja2Rvb3Ivcm9vdGtpdHMgd2hlbiBiYWNrZG9vciBpcyBhbHJlYWR5IHNldHVwIGl0IHdpbGwgYmUgXG5oaWRkZW4geW91ciBzcGVjaWZpYyBwcm9jZXNzLHVubGltaXRlZCB5b3VyIHNlc3Npb24gaW4gbWV0YXNwbG9pdCBhbmQgdHJhbnNwYXJlbnQuXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHZlZ2lsZWNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgdmVnaWxlY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9TY3JlZXRzZWMvVmVnaWxlLmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBWZWdpbGUgJiYgc3VkbyBjaG1vZCAreCBWZWdpbGUiKQogICAgICAgIHBvc3RleHAoKQogICAgZWxpZiB2ZWdpbGVjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcIllvdSBjYW4gVXNlIENvbW1hbmQgIDogXG5bIV1WZWdpbGUgLWkgLyAtLWluamVjdCBbYmFja2Rvb3Ivcm9vdGtpdF0gXG5bIV1WZWdpbGUgLXUgLyAtLXVubGltaXRlZCBbYmFja2Rvb3Ivcm9vdGtpdF0gXG5bIV1WZWdpbGUgLWggLyAtLWhlbHBcInxib3hlcyAtZCBwYXJjaG1lbnQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgVmVnaWxlICYmIHN1ZG8gYmFzaCBWZWdpbGUgIikKICAgICAgICBwYXNzCiAgICBlbGlmIHZlZ2lsZWNob2ljZSA9PSAiOTkiOgogICAgICAgIHBvc3RleHAoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgY2hyb21la2V5bG9nZ2VyKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCIgSGVyYSBDaHJvbWUgS2V5bG9nZ2VyIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vVW5kZWFkU2VjL0hlcmFLZXlsb2dnZXIuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIEhlcmFLZXlsb2dnZXIgJiYgc3VkbyBhcHQtZ2V0IGluc3RhbGwgcHl0aG9uMy1waXAgLXkgJiYgc3VkbyBwaXAzIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCAiKQogICAgICAgIHBvc3RleHAoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIEhlcmFLZXlsb2dnZXIgJiYgc3VkbyBweXRob24zIGhlcmEucHkgIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHBvc3RleHAoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgcm91dGV4cCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgUm91dGVyIEV4cGxvaXQgfCBsb2xjYXQgIikKICAgIHByaW50KCIiIgogICAgICAgIFsxXSBSb3V0ZXJTcGxvaXQKICAgICAgICBbMl0gRmFzdHNzaCAKICAgICAgICBbOTldQmFjayB0byBtZW51CiAgICAiIiIpCiAgICBjaG9pY2U9aW5wdXQoIlo0bnp1ID0+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgcm91dGVyc3Bsb2l0KCkKICAgIGVsaWYgY2hvaWNlPT0iOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2U9PSIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZmFzdHNzaCgpCiAgICBlbGlmIGNob2ljZT09ICIiOgogICAgICAgIHJvdXRleHAoKQogICAgZWxzZSA6CiAgICAgICAgcHJpbnQoIllvdSBFbnRlcmVkIHdyb25nIENob2ljZSA6IikKICAgICAgICByb3V0ZXhwKCkKCmRlZiByb3V0ZXJzcGxvaXQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlRoZSBSb3V0ZXJTcGxvaXQgRnJhbWV3b3JrIGlzIGFuIG9wZW4tc291cmNlIGV4cGxvaXRhdGlvbiBmcmFtZXdvcmsgZGVkaWNhdGVkIHRvIGVtYmVkZGVkIGRldmljZXNcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgY2hvaWNlPWlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vd3d3LmdpdGh1Yi5jb20vdGhyZWF0OS9yb3V0ZXJzcGxvaXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2Qgcm91dGVyc3Bsb2l0ICYmIHN1ZG8gcHl0aG9uMyAtbSBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IikKICAgICAgICByb3V0ZXhwKCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHJvdXRlcnNwbG9pdCAmJiBzdWRvIHB5dGhvbjMgcnNmLnB5IikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgcm91dGV4cCgpCiAgICBlbGlmIGNob2ljZSA9PSAiIjoKICAgICAgICByb3V0ZXhwKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGZhc3Rzc2goKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkZhc3Rzc2ggaXMgYW4gU2hlbGwgU2NyaXB0IHRvIHBlcmZvcm0gbXVsdGktdGhyZWFkZWQgc2NhbiBcbiBhbmQgYnJ1dGUgZm9yY2UgYXR0YWNrIGFnYWluc3QgU1NIIHByb3RvY29sIHVzaW5nIHRoZSBtb3N0IGNvbW1vbmx5IGNyZWRlbnRpYWxzLiBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2Zhc3Rzc2ggJiYgY2QgZmFzdHNzaCAmJiBzdWRvIGNobW9kICt4IGZhc3Rzc2guc2giKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgc3NocGFzcyBuZXRjYXQiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGZhc3Rzc2ggJiYgc3VkbyBiYXNoIGZhc3Rzc2guc2ggLS1zY2FuIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHJvdXRleHAoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCmRlZiBEZG9zKCk6CiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBERE9TIEF0dGFjayBUb29scyB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV1TbG93TG9yaXMKICAgICAgICBbOTldQmFjawogICAgIiIiKQogICAgY2hvaWNlID1pbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNsb3dsb3JpcygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgcGFzcwogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBvdGhlcnMoKQogICAgZWxzZSA6CiAgICAgICAgcHJpbnQoIkludmFsaWQgLi4uIikKICAgICAgICBtZW51KCkKZGVmIHdlYkF0dGFjaygpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgJ1dlYiBBdHRhY2sgVG9vbHMnIC1mIHN0YW5kYXJkIC1jIHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgIFsxXSBXZWIyQXR0YWNrCiAgICAgICAgWzJdIFNraXBmaXNoCiAgICAgICAgWzNdIFN1YkRvbWFpbiBGaW5kZXIKICAgICAgICBbNF0gQ2hlY2tVUkwKICAgICAgICBbNV0gQmxhenkoQWxzbyBGaW5kIENsaWNrSmFja2luZykKICAgICAgICBbOTldQmFjayBUbyBNZW51CiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdlYjJhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIHNraXBmaXNoKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBzdWJkb21haW4oKQogICAgZWxpZiBjaG9pY2UgPT0gIjQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBjaGVja3VybCgpCiAgICBlbGlmIGNob2ljZSA9PSAiNSI6CiAgICAKICAgICAgICBibGF6eSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgd2ViMmF0dGFjaygpOgogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vc2FudGF0aWMvd2ViMmF0dGFjay5naXQiKQogICAgICAgIHdlYkF0dGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2Qgd2ViMmF0dGFjayAmJiAuL3cyYWNvbnNvbGUiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHNsb3dsb3JpcygpOgogICAgb3Muc3lzdGVtKCJlY2hvXCJTbG93bG9yaXMgaXMgYmFzaWNhbGx5IGFuIEhUVFAgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLkl0IHNlbmQgbG90cyBvZiBIVFRQIFJlcXVlc3RcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgY2hvaWNlID0gaW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBwaXAgaW5zdGFsbCBzbG93bG9yaXMiKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIHByaW50KExvZ28pCiAgICAgICAgdHM9aW5wdXQoIkVudGVyIFRhcmdldCBTaXRlIDotIikKICAgICAgICBvcy5zeXN0ZW0oInNsb3dsb3JpcyAlcyIldHMpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHdlYkF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBza2lwZmlzaCgpOgogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBza2lwZmlzaCAtaCIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwic2tpcGZpc2ggLW8gW0ZvbGRlck5hbWVdIHRhcmdldGlwL3NpdGVcInxib3hlcyAtZCBoZWFkbGluZSB8IGxvbGNhdCIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3ZWJBdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCiAgICAKZGVmIHN1YmRvbWFpbigpOgogICAgCiAgICBjaG9pY2U9aW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFs5OV1CQWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBwaXAgaW5zdGFsbCByZXF1ZXN0cyBhcmdwYXJzZSBkbnNweXRob24iKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2Fib3VsM2xhL1N1Ymxpc3Qzci5naXQgIikKICAgICAgICBvcy5zeXN0ZW0oImNkIFN1Ymxpc3QzciAmJiBzdWRvIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQiKSAKICAgICAgICB3ZWJBdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIHByaW50KCJHbyB0byBTdWJsaXN0M3IgYW5kIHJ1biAuL3N1Ymxpc3QzciIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwiIHB5dGhvbiBzdWJsaXN0M3IucHkgLWQgZXhhbXBsZS5jb20gXG5weXRob24gc3VibGlzdDNyLnB5IC1kIGV4YW1wbGUuY29tIC1wIDgwLDQ0M1wifCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgU3VibGlzdDNyICYmIHB5dGhvbiBzdWJsaXN0M3IucHkgLWgiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IiA6CiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1haW4oKQoKZGVmIGNoZWNrdXJsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCIgRGV0ZWN0IGV2aWwgdXJscyB0aGF0IHVzZXMgSUROIEhvbW9ncmFwaCBBdHRhY2suXG5cdFshXXB5dGhvbjMgY2hlY2tVUkwucHkgLS11cmwgZ29vZ2xlLmNvbSBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL1VuZGVhZFNlYy9jaGVja1VSTC5naXQiKQogICAgICAgIHdlYkF0dGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgY2hlY2tVUkwgJiYgcHl0aG9uMyBjaGVja1VSTC5weSAtLWhlbHAiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGJsYXp5KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJCbGF6eSBpcyBhIG1vZGVybiBsb2dpbiBwYWdlIGJydXRlZm9yY2VyIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vVWx0aW1hdGVIYWNrZXJzL0JsYXp5IikKICAgICAgICBvcy5zeXN0ZW0oImNkIEJsYXp5ICYmIHN1ZG8gcGlwIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBCbGF6eSAmJiBzdWRvIHB5dGhvbiBibGF6eS5weSIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3ZWJBdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgYW5kcm9pZGhhY2soKToKICAgIGNsZWFyU2NyKCkKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIC1jIEFuZHJvaWQgSGFja2luZyBUb29scyB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gS2V5ZHJvaWQgCiAgICAgICAgWzJdIE15U01TCiAgICAgICAgWzNdIEdldGRyb2lkCiAgICAgICAgWzRdIERyb2lkRmlsZXMgKEdldCBmaWxlcyBmcm9tIEFuZHJvaWQgRGlyZWN0b3JpZXMpCiAgICAgICAgWzVdIExvY2twaGlzaCAoR3JhYiB0YXJnZXQgTE9DSyBQSU4pCiAgICAgICAgWzZdIFdoYXRzYXBwIEF0dGFjawogICAgICAgIFs3XSBEcm9pZENhbSAoQ2FwdHVyZSBJbWFnZSkKICAgICAgICBbOF0gRXZpbEFwcCAoSGlqYWNrIFNlc3Npb24pCiAgICAgICAgWzk5XU1haW4gTWVudQogICAgIiIiKQogICAgY2hvaWNlID0gaW5wdXQoIlo0bnp1ID0+PiIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBrZXlkcm9pZCgpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIG15c21zKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZ2V0ZHJvaWQoKQogICAgZWxpZiBjaG9pY2UgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBsb2NrKCkKICAgIGVsaWYgY2hvaWNlID09ICI0IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZHJvaWRmaWxlKCkKICAgIGVsaWYgY2hvaWNlICA9PSAiNiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdoYXRzaGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiNyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGRyb2lkY2FtKCkKICAgIGVsaWYgY2hvaWNlID09ICI4IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZXZpbGFwcCgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYga2V5ZHJvaWQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkFuZHJvaWQgS2V5bG9nZ2VyICsgUmV2ZXJzZSBTaGVsbFxuWyFdWW91IGhhdmUgdG8gaW5zdGFsbCBTb21lIE1hbnVhbGx5IFJlZmVyIEJlbG93IExpbmsgOlxuIFsrXWh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9rZXlkcm9pZCBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2tleWRyb2lkICIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGtleWRyb2lkICYmIGJhc2gga2V5ZHJvaWQuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgbXlzbXMoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIiBTY3JpcHQgdGhhdCBnZW5lcmF0ZXMgYW4gQW5kcm9pZCBBcHAgdG8gaGFjayBTTVMgdGhyb3VnaCBXQU4gXG5bIV1Zb3UgaGF2ZSB0byBpbnN0YWxsIFNvbWUgTWFudWFsbHkgUmVmZXIgQmVsb3cgTGluayA6XG5cdCBbK11odHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvbXlzbXMgXCIgfCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9teXNtcyIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIG15c21zICYmIGJhc2ggbXlzbXMuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZ2V0ZHJvaWQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkZVRCBBbmRyb2lkIFBheWxvYWQgKFJldmVyc2UgU2hlbGwpIGFuZCBMaXN0ZW5lciB1c2luZyBTZXJ2ZW8ubmV0IChubyBuZWVkIGNvbmZpZyBwb3J0IGZvcndhcmRpbmcpIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZ2V0ZHJvaWQgJiYgYXB0LWdldCBpbnN0YWxsIGFuZHJvaWQtc2RrIGFwa3NpZ25lciAteSIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGdldGRyb2lkICYmIGJhc2ggZ2V0ZHJvaWQuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgbG9jaygpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiTG9ja3BoaXNoIGl0J3MgdGhlIGZpcnN0IHRvb2wgZm9yIHBoaXNoaW5nIGF0dGFja3Mgb24gdGhlIGxvY2sgc2NyZWVuLCBkZXNpZ25lZCB0b1xuIEdyYWIgV2luZG93cyBjcmVkZW50aWFscyxBbmRyb2lkIFBJTiBhbmQgaVBob25lIFBhc3Njb2RlIHVzaW5nIGEgaHR0cHMgbGluay4gXCJ8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9sb2NrcGhpc2giKQogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBsb2NrcGhpc2ggJiYgYmFzaCBsb2NrcGhpc2guc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZHJvaWRmaWxlKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJHZXQgZmlsZXMgZnJvbSBBbmRyb2lkIGRpcmVjdG9yaWVzXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzNdIFBhY2tnZXMgSW5zdGFsbChSZXF1aXJlZCkgWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZHJvaWRmaWxlcyIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgZHJvaWRmaWxlcyAmJiBiYXNoIGRyb2lkZmlsZXMuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIzIjoKICAgICAgICBvcy5zeXN0ZW0oImFwdC1nZXQgaW5zdGFsbCBkZWZhdWx0LWpkayBhcGtzaWduZXIiKQogICAgICAgIG9zLnN5c3RlbSgiYXB0LWdldCBpbnN0YWxsIGxpYmM2LWRldi1pMzg2IGxpYjMyejEiKQogICAgICAgIG9zLnN5c3RlbSgid2dldCBodHRwczovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9yZXBvc2l0b3J5L3Nkay10b29scy1saW51eC00MzMzNzk2LnppcCAmJiBta2RpciAtcCAkSE9NRS9BbmRyb2lkL1NkayAmJiB1bnppcCBzZGstdG9vbHMtbGludXgqIC1kICRIT01FL0FuZHJvaWQvU2RrIikKICAgICAgICBvcy5zeXN0ZW0oImN1cmwgLXMgXCJodHRwczovL2dldC5zZGttYW4uaW9cIiB8IGJhc2ggJiYgc291cmNlICRIT01FLy5zZGttYW4vYmluL3Nka21hbi1pbml0LnNoICYmIGVjaG8gXCJZXCIgfCBzZGsgaW5zdGFsbCBqYXZhIDguMC4xOTEtb3JhY2xlICYmIHNkayB1c2UgamF2YSA4LjAuMTkxLW9yYWNsZSAmJiBzZGsgaW5zdGFsbCBncmFkbGUgMi4xNC4xICYmIHNkayB1c2UgZ3JhZGxlIDIuMTQuMSIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBhbmRyb2lkaGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB3aGF0c2hhY2soKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlNjcmlwdCB0byBnZW5lcmF0ZSBBbmRyb2lkIEFwcCB0byBIYWNrIEFsbCBXaGF0c0FwcCBNZWRpYSBGaWxlcy5cblx0WyFdRG93bmxvYWQgQW5kcm9pZCBTdHVkaW86XG5bK11odHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8gXG5cdFshXUluc3RhbGxpbmcgQW5kcm9pZCBTdHVkaW86XG5bK111bnppcCB+L0Rvd25sb2Fkcy9hbmRyb2lkKi56aXAgLWQgL29wdCBcblJ1biBBbmRyb2lkIFN0dWRpbzogXG5bK10gY2QgL29wdC9hbmRyb2lkLXN0dWRpby9iaW4gXG5bK10gLi9zdHVkaW8uc2ggXG5bIV1HbyB0byBTREsgTWFuYWdlciAoQ29uZmlndXJlIC0+IFNESyBNYW5hZ2VyKSBhbmQgRG93bmxvYWQ6XG5bIV1BbmRyb2lkIFNESyBCdWlsZC10b29scywgQW5kcm9pZCBTREstdG9vbHMsIEFuZHJvaWQgU0RLIHBsYXRmb3JtLXRvb2xzLCBTdXBwb3J0IFJlcG9zaXRvcnlcIiB8IGJveGVzIC1kIHNoZWxsIHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2Uvd2hhdHNoYWNrIikKICAgICAgICB0aW1lLnNsZWVwKDUpCiAgICAgICAgcHJpbnQoIkluc3RhbGxpbmcgUmVxdWlyZWQgUGFja2dlcy4uISEgSXQgVGFrZSBNb3JlIFRpbWUgIikKICAgICAgICB0aW1lLnNsZWVwKDMpCiAgICAgICAgb3Muc3lzdGVtKCJhcHQtZ2V0IGluc3RhbGwgb3Blbmpkay04LWpkayAmJiBhcHQtZ2V0IGluc3RhbGwgZ3JhZGxlIikKICAgICAgICBvcy5zeXN0ZW0oInVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEiKQogICAgICAgIG9zLnN5c3RlbSgidXBkYXRlLWFsdGVybmF0aXZlcyAtLXNldCBqYXZhIC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NC9qcmUvYmluL2phdmEiKQogICAgICAgIHRpbWUuc2xlZXAoMikKICAgICAgICBhbmRyb2lkaGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcIlsjXU9uIEZpcnN0IFRpbWUsIENob29zZSBcIm5cIiB3aGVuIGFza3MgdG8gYnVpbGQsIHRoZW4gb3BlbiB0aGUgcHJvamVjdCBvbiBBbmRyb2lkIFN0dWRpbzpcblshXWNkIC9vcHQvYW5kcm9pZC1zdHVkaW8vYmluIFxuWyFdLi9zdHVkaW8uc2ggXG5bI11JbXBvcnQgR3JhZGxlIFByb2plY3Q6XG5bIV1DaG9vc2Ugd2hhdHNoYWNrIGFwcCBmb2xkZXI6IHdoYXRzaGFjay9hcHAvIFxuWyNdV2FpdCBhbGwgZGVwZW5kZW5jaWVzIGRvd25sb2FkaW5nLCBpZiB5b3UgZ290IGVycm9ycywgY2xpY2sgb24gc2hvd2VkIGxpbmtzIHRvIHNvbHZlLiBcblsjXVRyeSBidWlsZCBmcm9tIEFuZHJvaWQgU3R1ZGlvOiBCdWlsZCA+IGJ1aWxkIEFQSydzIFxuWyNdQ2xpY2sgb24gc2hvd2VkIGxpbmtzIGlmIHlvdSBnb3QgZXJyb3JzLiBcblsjXUNsb3NlIEFuZHJvaWQgYWZ0ZXIgYnVpbGRpbmcgc3VjY2Vzc2Z1bGx5LlxuWyNdb3BlbiB3aXRoIGFueSBUZXh0IEVkaXRvciB0aGUgZmlsZSBhcHAvYnVpbGQuZ3JhZGxlXG5bIV1yZW1vdmUgXCJnb29nbGVcIiBcblsjXWNoYW5nZSBncmFkbGUgdmVyc2lvbiBmcm9tOiAzLjQuMSB0bzogMi4yLjAgXG5bIV1zYXZlIGFuZCBleGl0LiBcblsjXUFmdGVyIHRoaXMgUnVuIFNjcmlwdCBBcyBSb290OiBcblshXWJhc2ggd2hhdHNoYWNrLnNoIFwifCBib3hlcyAtZCBzaGVsbCIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwiSWYgc3RpbGwgZ2V0dGluZyBlcnJvciBwbGVhc2UgdmlzaXQgXG5cdFsjXWh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS93aGF0c2hhY2tcInxib3hlcyAtZCBzaGVsbCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCB3aGF0c2hhY2svICYmIGJhc2ggd2hhdHNoYWNrLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZT09IiI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZHJvaWRjYW0oKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlNjcmlwdCB0byBnZW5lcmF0ZSBhbiBBbmRyb2lkIEFwcCB0byB0YWtlIHBob3RvcyBmcm9tIENhbWVyYXMgdXNpbmcgQ2FtZXJhMiBmdW5jdGlvbiBvbiBBUEkgMjFcbiBBZnRlciBJbnN0YWxsaW5nIGlmIHlvdSBnZXR0aW5nIGVycm9yIHBsZWFzZSBnbyB0byBiZWxvdyBsaW5rIFxuWytdaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL0Ryb2lkQ2FtIFwifCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9kcm9pZGNhbSAiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgZHJvaWRjYW0gJiYgc3VkbyBiYXNoIGluc3RhbGwuc2giKQogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBkcm9pZGNhbSAmJiBiYXNoIGRyb2lkY2FtLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGV2aWxhcHAoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkV2aWxBcHAgaXMgYSBzY3JpcHQgdG8gZ2VuZXJhdGUgQW5kcm9pZCBBcHAgdGhhdCBjYW4gaGlqYWNrIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbnMgaW4gY29va2llc1wiYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZXZpbGFwcCIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGV2aWxhcHAgJiYgYmFzaCBldmlsYXBwLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHBheWxvYWRzKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBQYXlsb2FkcyB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gVGhlIEZhdFJhdCoKICAgICAgICBbMl0gQnJ1dGFsCiAgICAgICAgWzNdIFN0aXRjaAogICAgICAgIFs0XSBNU0Z2ZW5vbSBQYXlsb2FkIENyZWF0b3IKICAgICAgICBbNV0gVmVub20gU2hlbGxjb2RlIEdlbmVyYXRvciAKICAgICAgICBbNl0gU3B5Y2FtCiAgICAgICAgWzk5XUJhY2sgCiAgICAiIiIpCiAgICBjaG9pY2UgPWlucHV0KCJaNG56dSA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgdGhlZmF0cmF0KCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgQnJ1dGFsKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc3RpdGNoKCkKICAgIGVsaWYgY2hvaWNlID09ICI0IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgTVNGdmVub20oKQogICAgZWxpZiBjaG9pY2UgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB2ZW5vbSgpCiAgICBlbGlmIGNob2ljZSA9PSAiNiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNweWNhbSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgdGhlZmF0cmF0KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUaGVGYXRSYXQgUHJvdmlkZXMgQW4gRWFzeSB3YXkgdG8gY3JlYXRlIEJhY2tkb29ycyBhbmQgXG5QYXlsb2FkIHdoaWNoIGNhbiBieXBhc3MgbW9zdCBhbnRpLXZpcnVzXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXSBSdW4gWzNdVXBkYXRlIFs0XVRyb3VibGVTaG9vdChpZiBub3QgcnVuKSBbOTldQmFjayA+PiAgIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vU2NyZWV0c2VjL1RoZUZhdFJhdC5naXQiKSAKICAgICAgICBvcy5zeXN0ZW0oImNkIFRoZUZhdFJhdCAmJiBzdWRvIGNobW9kICt4IHNldHVwLnNoIikKICAgICAgICBwYXlsb2FkcygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBUaGVGYXRSYXQgJiYgc3VkbyBiYXNoIHNldHVwLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIFRoZUZhdFJhdCAmJiBiYXNoIHVwZGF0ZSAmJiBjaG1vZCAreCBzZXR1cC5zaCAmJiBiYXNoIHNldHVwLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI0IjoKICAgICAgICBvcy5zeXN0ZW0oImNkIFRoZUZhdFJhdCAmJiBzdWRvIGNobW9kICt4IGNoa190b29scyAmJiAuL2Noa190b29scyIpCiAgICAgICAgdGltZS5zbGVlcCgyKQogICAgICAgIHBheWxvYWRzKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgQnJ1dGFsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJCcnV0YWwgaXMgYSB0b29sa2l0IHRvIHF1aWNrbHkgY3JlYXRlIHZhcmlvdXMgcGF5bG9hZCxwb3dlcnNoZWxsIGF0dGFjayxcbnZpcnVzIGF0dGFjayBhbmQgbGF1bmNoIGxpc3RlbmVyIGZvciBhIEh1bWFuIEludGVyZmFjZSBEZXZpY2VcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICBbIV1SZXF1aXJlbWVudAogICAgICAgID4+QXJkdWlubyBTb2Z0d2FyZSAoIEkgdXNlZCB2MS42LjcgKQogICAgICAgID4+VGVlbnN5RHVpbm8KICAgICAgICA+PkxpbnV4IHVkZXYgcnVsZXMKICAgICAgICA+PkNvcHkgYW5kIHBhc3RlIHRoZSBQYWVuc3lMaWIgZm9sZGVyIGluc2lkZSB5b3VyIEFyZHVpbm9cbGlicmFyaWVzCiAgICBbIV1LaW5kbHkgVmlzaXQgYmVsb3cgbGluayBmb3IgSW5zdGFsbGF0aW9uIGZvciBBcmR1aW5vIAogICAgICAgID4+IGh0dHBzOi8vZ2l0aHViLmNvbS9TY3JlZXRzZWMvQnJ1dGFsL3dpa2kvSW5zdGFsbC1SZXF1aXJlbWVudHMgCiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vU2NyZWV0c2VjL0JydXRhbC5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgQnJ1dGFsICYmIHN1ZG8gY2htb2QgK3ggQnJ1dGFsLnNoICIpCiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgQnJ1dGFsICYmIHN1ZG8gYmFzaCBCcnV0YWwuc2giKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwYXlsb2FkcygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBzdGl0Y2goKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlN0aXRjaCBpcyBDcm9zcyBQbGF0Zm9ybSBQeXRob24gUmVtb3RlIEFkbWluaXN0cmF0b3IgVG9vbFxuXHRbIV1SZWZlciBCZWxvdyBMaW5rIEZvciBXaW5zICYgTUFjIE9zXG5cdCghKWh0dHBzOi8vbmF0aGFubG9wZXouZ2l0aHViLmlvL1N0aXRjaCBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iICkKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vbmF0aGFubG9wZXovU3RpdGNoLmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBTdGl0Y2ggJiYgc3VkbyBwaXAgaW5zdGFsbCAtciBsbnhfcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgU3RpdGNoICYmIHN1ZG8gcHl0aG9uIG1haW4ucHkiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwYXlsb2FkcygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBNU0Z2ZW5vbSgpOgogICAgY2hvaWNlPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZzB0bWkxay9tc2ZwYy5naXQgJiYgY2QgbXNmcGMgJiYgY2htb2QgK3ggbXNmcGMuc2giKQogICAgICAgIHBheWxvYWRzKCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIG1zZnBjICYmIHN1ZG8gYmFzaCBtc2ZwYy5zaCAtaCAtdiIpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHBheWxvYWRzKCkKICAgIGVsaWYgY2hvaWNlID09ICIiOgogICAgICAgIHBheWxvYWRzKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHZlbm9tKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJ2ZW5vbSAxLjAuMTEgKG1hbGljaW91c19zZXJ2ZXIpIHdhcyBidWlsZCB0byB0YWtlIGFkdmFudGFnZSBvZiBcbiBhcGFjaGUyIHdlYnNlcnZlciB0byBkZWxpdmVyIHBheWxvYWRzIChMQU4pIHVzaW5nIGEgZmFrZSB3ZWJwYWdlIHdyaXRlbiBpbiBodG1sXCJ8IGJveGVzIC1kIGJveXwgbG9sY2F0IikKICAgIGNob2ljZSA9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3IwMHQtM3hwMTBpdC92ZW5vbS5naXQiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBjaG1vZCAtUiA3NzUgdmVub20qLyAmJiBjZCB2ZW5vbSovICYmIGNkIGF1eCAmJiBzdWRvIGJhc2ggc2V0dXAuc2giKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyAuL3Zlbm9tLnNoIC11IikKICAgICAgICBwcmludCgiRG93bmxvYWQgU3VjY2Vzc2Z1bGx5Li4uISEhIikKICAgICAgICBwYXlsb2FkcygpCiAgICAgICAgI3N1ZG8gZmluZCAuLyAtbmFtZSAiKi5zaCIgLWV4ZWMgY2htb2QgK3gge30gXDsgc3VkbyBmaW5kIC4vIC1uYW1lICIqLnB5IiAtZXhlYyBjaG1vZCAreCB7fSBcOwogICAgICAgICMgcHJpbnQoIkdpdmUgUGVybWlzc2lvbiB0byAuc2ggJiAucHkgRmlsZXMiKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgdmVub20gJiYgc3VkbyAuL3Zlbm9tLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3B5Y2FtKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJTY3JpcHQgdG8gZ2VuZXJhdGUgYSBXaW4zMiBwYXlsb2FkIHRoYXQgdGFrZXMgdGhlIHdlYmNhbSBpbWFnZSBldmVyeSAxIG1pbnV0ZSBhbmQgc2VuZCBpdCB0byB0aGUgYXR0YWNrZXJcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2Uvc3B5Y2FtICIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBzcHljYW0gJiYgYmFzaCBpbnN0YWxsLnNoICYmIGNobW9kICt4IHNweWNhbSIpCiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHNweWNhbSAmJiAuL3NweWNhbSIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwYXlsb2FkcygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIiI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgd2lmaWphbW1pbmcoKToKICAgIGNsZWFyU2NyKCkKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIC1jIFdpZmkgRGVhdXRoZXRpY2F0ZSB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gVXNpbmcgQWlybW9uCiAgICAgICAgWzk5XUJhY2sKICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56dSA9Pj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgICMgYWlybW9uKCkKICAgICAgICBwYXNzCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgYWlybW9uKCk6CiAgICAjIG9zLnN5c3RlbSgiZWNobyBcIiBcIiB8IGJveGVzIC1kIGJveSIpCiAgICBwcmludChMb2dvKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBwcmludCgiSW4gV29ya2luZyIpCiAgICAgICAgdGltZS5zbGVlcCg1KQogICAgICAgIG1lbnUoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBwcmludCgiIiIKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMgICAgIFshXSBGb2xsb3cgQmVsb3cgc3RlcHMgZm9yIEphbW1pbmcgWyFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAjICAgICBbMV1pd2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyAgICAgWzJdYWlybW9uLW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMgICAgIFszXWFpcm1vbi1uZyBzdGFydCBJbnRlcmZhY2VOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAjICAgICBbNF1haXJvZHVtcC1uZyBJbnRlcmZhY2VOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyAgICAgWzVdYWlyb2R1bXAtbmcgLWMgW0NIIG5vLl0gLS1ic3NpZCBbTUFDIGFkZHJlc3NdIEludGVyZmFjZU5hbWUgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMgICAgIFs2XWFpcmVwbHktbmcgLTAgMCAtYSBbbWFjIGFkZHJlc3NdIEludGVyZmFjZU5hbWUgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAjICAgICBbK11BZnRlciBDb21wbGV0ZSBtb25pdG9yIG1vZGUgcmV0dXJuIHlvdXIgaW50ZXJmYWNlIGluIG5vcm1hbCBtb2RlICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyAgICAgWzddYWlybW9uLW5nIHN0b3AgSW50ZXJmYWNlTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKICAgICAgICAiIiIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGFpcm1vbi1uZyIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3aWZpamFtbWluZygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIiI6CiAgICAgICAgd2lmaWphbW1pbmcoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpICAKICAgICMgej1yYXdfaW5wdXQoIkVudGVyIFlvdXIgd2lmaSBJbnRlcmZhY2UgTmFtZSA6LSAiKQogICAgIyBvcy5zeXN0ZW0oImFpcm1vbi1uZyAmJiBhaXJtb24tbmcgc3RhcnQgJXMiJXopCgpkZWYgc3RlZ2Fub2dyYXBoeSgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgU3RlZ2Fub0dyYXBoeSB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gU3RlZ2Fub0hpZGUKICAgICAgICBbMl0gU3RlZ25vQ3JhY2tlcgogICAgICAgIFszXSBXaGl0ZVNwYWNlCiAgICAgICAgWzk5XUJhY2sKICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56ID0+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBzdGVnYW5vaGlkZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgc3RlZ25vY3JhY2tlcigpCiAgICBlbGlmIGNob2ljZSA9PSAiMyI6CiAgICAgICAgd2hpdGVzcGFjZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3RlZ2Fub2hpZGUoKToKICAgIGNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQtZ2V0IGluc3RhbGwgc3RlZ2hpZGUgLXkgIikKICAgICAgICBzdGVnYW5vZ3JhcGh5KCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBjaG9pY2UxPWlucHV0KCJbMV1IaWRlIFsyXUV4dHJhY3QgPj4gIikKICAgICAgICBpZiBjaG9pY2UxID09IjEiOgogICAgICAgICAgICBmaWxlaGlkZT1pbnB1dCgiRW50ZXIgRmlsZW5hbWUgeW91IHdhbnQgdG8gRW1iZWQoMS50eHQpIDotICIpCiAgICAgICAgICAgIGZpbGV0b2JlaGlkZT1pbnB1dCgiRW50ZXIgQ292ZXIgRmlsZW5hbWUodGVzdC5qcGVnKSA6LSAiKQogICAgICAgICAgICBvcy5zeXN0ZW0oInN0ZWdoaWRlIGVtYmVkIC1jZiB7MH0gLWVmIHsxfSIuZm9ybWF0KGZpbGV0b2JlaGlkZSxmaWxlaGlkZSkpCiAgICAgICAgZWxpZiBjaG9pY2UxID09IjIiOgogICAgICAgICAgICBmcm9tZmlsZT1pbnB1dCgiRW50ZXIgRmlsZW5hbWUgRnJvbSBFeHRyYWN0IERhdGEgOi0gIikKICAgICAgICAgICAgb3Muc3lzdGVtKCJzdGVnaGlkZSBleHRyYWN0IC1zZiB7MH0iLmZvcm1hdChmcm9tZmlsZSkpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3RlZ25vY3JhY2tlcigpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiIFN0ZWdhbm9DcmFja2VyIGlzIGEgdG9vbCB0aGF0IHVuY292ZXIgaGlkZGVuIGRhdGEgaW5zaWRlIGZpbGVzXG4gdXNpbmcgYnJ1dGUtZm9yY2UgdXRpbGl0eSAgXCJ8Ym94ZXMgLWQgYm95fCBsb2xjYXQiKQogICAgY2hvaWNlID0gKCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQkFjayAgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJwaXAzIGluc3RhbGwgc3RlZ2NyYWNrZXIgJiYgcGlwMyBpbnN0YWxsIHN0ZWdjcmFja2VyIC1VIC0tZm9yY2UtcmVpbnN0YWxsIikKICAgICAgICBzdGVnYW5vZ3JhcGh5KCkKICAgIGVsaWYgY2hvaWNlID09IjIiOgogICAgICAgIGZpbGUxPWlucHV0KCJFbnRlciBGaWxlbmFtZSA6LSAiKQogICAgICAgIHBhc3NmaWxlPWlucHV0KCJFbnRlciBXb3JkbGlzdCBGaWxlbmFtZSA6LSAiKQogICAgICAgIG9zLnN5c3RlbSgic3RlZ2NyYWNrZXIgezB9IHsxfSAiLmZvcm1hdChmaWxlMSxwYXNzZmlsZSkpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgd2hpdGVzcGFjZSgpOgogICAgY2hvaWNlID1pbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYmVhcmRvZzEwOC9zbm93MTAuZ2l0ICIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGNobW9kIC1SIDc1NSBzbm93MTAiKQogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2Qgc25vdzEwICYmIGZpcmVmb3ggaW5kZXguaHRtbCIpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3FsdG9vbCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgU3FsIFRvb2xzIHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgIFsxXSAgc3FsbWFwIHRvb2wKICAgICAgICBbOTldIEJhY2sKICAgICIiIikKICAgIGNob2ljZSA9aW5wdXQoIlo0bnp1ID0+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc3FsbWFwKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBzcWxtYXAoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlshXXNxbG1hcCBpcyBhbiBvcGVuIHNvdXJjZSBwZW5ldHJhdGlvbiB0ZXN0aW5nIHRvb2wgdGhhdCBhdXRvbWF0ZXMgdGhlIHByb2Nlc3Mgb2YgXG5kZXRlY3RpbmcgYW5kIGV4cGxvaXRpbmcgU1FMIGluamVjdGlvbiBmbGF3cyBhbmQgdGFraW5nIG92ZXIgb2YgZGF0YWJhc2Ugc2VydmVyc1wifGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIC0tZGVwdGggMSBodHRwczovL2dpdGh1Yi5jb20vc3FsbWFwcHJvamVjdC9zcWxtYXAuZ2l0IHNxbG1hcC1kZXYiKQogICAgICAgIHByaW50KCJEb3dubG9hZGVkIFN1Y2Nlc3NmdWxseS4uISEiKQogICAgICAgIHNxbHRvb2woKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHNxbG1hcC1kZXYgJiYgcHl0aG9uIHNxbG1hcC5weSAtaCIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwiWyFdcHl0aG9uIHNxbG1hcC5weSAtdSBbPGh0dHA6Ly9leGFtcGxlLmNvbT5dIC0tYmF0Y2ggLS1iYW5uZXIgXG5bIV1Gb3IgTW9yZSBVc2FnZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zcWxtYXBwcm9qZWN0L3NxbG1hcC93aWtpL1VzYWdlIFwifGJveGVzIC1kIGJveSIpICAgIAogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgc3FsdG9vbCgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBvdGhlcnMoKToKICAgIHByaW50KCIiIgogICAgWzFdRGRvcyBBdHRhY2sgVG9vbHMKICAgIFsyXVNNV1lHLVNob3ctTWUtV2hhdC1Zb3UtR290ICgxLjQgQmlsbGlvbiBDbGVhciBUZXh0IFBhc3N3b3JkKQogICAgWzk5XUJBY2sKICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56dSA9Pj4iKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgRGRvcygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNob3dtZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgb3RoZXJzKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHNob3dtZSgpOgogICAgcHJpbnQoIiIiVGhpcyB0b29sIGFsbG93cyB5b3UgdG8gcGVyZm9ybSBPU0lOVCBhbmQgcmVjb25uYWlzc2FuY2Ugb24gYW4gb3JnYW5pc2F0aW9uIG9yIGFuIGluZGl2aWR1YWwuIAogICAgICAgIEl0IGFsbG93cyBvbmUgdG8gc2VhcmNoIDEuNCBCaWxsaW9uIGNsZWFyIHRleHQgY3JlZGVudGlhbHMgd2hpY2ggd2FzIGR1bXBlZCBhcyBwYXJ0IG9mIEJyZWFjaENvbXBpbGF0aW9uIAogICAgICAgIGxlYWsgVGhpcyBkYXRhYmFzZSBtYWtlcyBmaW5kaW5nIHBhc3N3b3JkcyBmYXN0ZXIgYW5kIGVhc2llciB0aGFuIGV2ZXIgYmVmb3JlLgogICAgICAgICAgICAiIiIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL1ZpcmFsbWFuaWFyL1NNV1lHLVNob3ctTWUtV2hhdC1Zb3UtR290LmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBTTVdZRy1TaG93LU1lLVdoYXQtWW91LUdvdCAmJiBwaXAzIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCAiKQogICAgICAgIG90aGVycygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgU01XWUctU2hvdy1NZS1XaGF0LVlvdS1Hb3QgJiYgcHl0aG9uIFNNV1lHLnB5IikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIG90aGVycygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB1cGRhdGVzeXMoKToKICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgdXBkYXRlICYmIHN1ZG8gYXB0IGZ1bGwtdXBncmFkZSAteSIpCiAgICBvcy5zeXN0ZW0oInN1ZG8gYXB0LWdldCBpbnN0YWxsIHRvciBvcGVuc3NsIGN1cmwgJiYgc3VkbyBhcHQtZ2V0IHVwZGF0ZSB0b3Igb3BlbnNzbCBjdXJsICIpCiAgICBvcy5zeXN0ZW0oInN1ZG8gYXB0LWdldCBpbnN0YWxsIHB5dGhvbjMtcGlwIikKICAgIG1lbnUoKQoKZGVmIGNsZWFyU2NyKCk6CiAgICBpZiBzeXN0ZW0oKSA9PSAnTGludXgnOgogICAgICAgIG9zLnN5c3RlbSgnY2xlYXInKQogICAgaWYgc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgICAgIG9zLnN5c3RlbSgnY2xzJykKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBub3R1c2VyID1nZXRwYXNzLmdldHVzZXIoKQogICAgdXNlcj1vcy5nZXRlbnYoIlNVRE9fVUlEIikKICAgIHVuYW1lPW9zLmdldGVudigiU1VET19VU0VSIikKICAgIHRyeToKICAgICAgICBpZiBzeXN0ZW0oKSA9PSAnTGludXgnOgogICAgICAgICAgICAjIGlmIHBhdGguZXhpc3RzKCIvaG9tZS97MH0vRGVza3RvcC8iLmZvcm1hdCh1c2VyKSk6CiAgICAgICAgICAgICMgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC8iLmZvcm1hdCh1c2VyKSkKICAgICAgICAgICAgIyAgICAgaWYgb3MucGF0aC5pc2RpcignaGFja2luZ3Rvb2wnKToKICAgICAgICAgICAgIyAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdCh1c2VyKSkKICAgICAgICAgICAgIyAgICAgICAgIG1lbnUoKQogICAgICAgICAgICAjICAgICBlbHNlIDoKICAgICAgICAgICAgIyAgICAgICAgIG9zLnN5c3RlbSgibWtkaXIgaGFja2luZ3Rvb2wiKQogICAgICAgICAgICAjICAgICAgICAgb3MuY2hkaXIoIi9ob21lL3swfS9EZXNrdG9wL2hhY2tpbmd0b29sLyIuZm9ybWF0KHVzZXIpKQogICAgICAgICAgICAjICAgICAgICAgbWVudSgpCiAgICAgICAgICAgIGlmIG9zLmdldGV1aWQoKSAhPSAwOgogICAgICAgICAgICAgICAgb3MuY2hkaXIoIi9ob21lL3swfS9EZXNrdG9wLyIuZm9ybWF0KG5vdHVzZXIpKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcignaGFja2luZ3Rvb2wnKToKICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcigiL2hvbWUvezB9L0Rlc2t0b3AvaGFja2luZ3Rvb2wvIi5mb3JtYXQobm90dXNlcikpCiAgICAgICAgICAgICAgICAgICAgbWVudSgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgibWtkaXIgaGFja2luZ3Rvb2wiKQogICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdChub3R1c2VyKSkKICAgICAgICAgICAgICAgICAgICBtZW51KCkKICAgICAgICAgICAgZWxpZiBvcy5nZXRldWlkKCkgPT0gMDoKICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC8iLmZvcm1hdCh1bmFtZSkpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKCdoYWNraW5ndG9vbCcpOgogICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdCh1bmFtZSkpCiAgICAgICAgICAgICAgICAgICAgbWVudSgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgibWtkaXIgaGFja2luZ3Rvb2wiKQogICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdCh1bmFtZSkpCiAgICAgICAgICAgICAgICAgICAgbWVudSgpCiAgICAgICAgZWxpZiBwYXRoLmV4aXN0cygnL2RhdGEnKToKICAgICAgICAgICAgb3MuY2hkaXIoImRhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL2hvbWUvIikKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcignaGFja2luZ3Rvb2wnKToKICAgICAgICAgICAgICAgIG9zLmNoZGlyKCJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy9ob21lL2hhY2tpbmd0b29sLyIpCiAgICAgICAgICAgICAgICBtZW51KCkKICAgICAgICAgICAgZWxzZSA6CiAgICAgICAgICAgICAgICBvcy5zeXN0ZW0oIm1rZGlyIGhhY2tpbmd0b29sc3RvcmUiKQogICAgICAgICAgICAgICAgb3MuY2hkaXIoImRhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL2hvbWUvaGFja2luZ3Rvb2wvIikKICAgICAgICAgICAgICAgIG1lbnUoKQogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIAogICAgICAgIHByaW50KCJcbiBTb3JyeSAuLiEhISIpCiAgICAgICAgdGltZS5zbGVlcCgzKQoK''') -exec(base64.b64decode(x)) + ▄█ █▄ ▄████████ ▄████████ ▄█ ▄█▄ ▄█ ███▄▄▄▄ ▄██████▄ ███ ▄██████▄ ▄██████▄ ▄█ + ███ ███ ███ ███ ███ ███ ███ ▄███▀ ███ ███▀▀▀██▄ ███ ███ ▀█████████▄ ███ ███ ███ ███ ███ + ███ ███ ███ ███ ███ █▀ ███▐██▀ ███▌ ███ ███ ███ █▀ ▀███▀▀██ ███ ███ ███ ███ ███ + ▄███▄▄▄▄███▄▄ ███ ███ ███ ▄█████▀ ███▌ ███ ███ ▄███ ███ ▀ ███ ███ ███ ███ ███ +▀▀███▀▀▀▀███▀ ▀███████████ ███ ▀▀█████▄ ███▌ ███ ███ ▀▀███ ████▄ ███ ███ ███ ███ ███ ███ + ███ ███ ███ ███ ███ █▄ ███▐██▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ + ███ ███ ███ ███ ███ ███ ███ ▀███▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███▌ ▄ + ███ █▀ ███ █▀ ████████▀ ███ ▀█▀ █▀ ▀█ █▀ ████████▀ ▄████▀ ▀██████▀ ▀██████▀ █████▄▄██ + ▀ ▀ + + \033[97m[!] https://github.com/Z4nzu/hackingtool +\033[97m """ +def menu(): + print(Logo + """\033[0m + \033[91m[!] This Tool Must Run as a Root..[!] \033[97m + [00]AnonSurf + [01]Information Gathering + [02]Password Attack && Wordlist Generator + [03]Wireless Attack + [04]SQL Injection Tools + [05]Phishing Attack + [06]Web Attack Tool + [07]Post exploitation + [08]Forensic Tools + [09]Payload Creator + [10]Router Exploit + [11]Wifi Jamming + [12]SocialMedia Attack + [13]SocialMedia Finder + [14]Android Hack + [15]Steganography + [16]More Tools + [17]Update System + [99]Exit + """) + + choice = input("Z4nzu =>> ") + if choice == "0" or choice == "00": + clearScr() + anonsurf() + elif choice == "1" or choice == "01": + clearScr() + info() + elif choice == "2" or choice == "02": + clearScr() + passwd() + elif choice == "3" or choice == "03": + clearScr() + wire() + elif choice == "4" or choice == "04": + clearScr() + sqltool() + elif choice == "5" or choice == "05": + clearScr() + phishattack() + elif choice == "6" or choice == "06": + clearScr() + webAttack() + elif choice == "7" or choice == "07": + clearScr() + postexp() + elif choice == "8" or choice == "08" : + clearScr() + forensic() + elif choice == "9" or choice == "09" : + clearScr() + payloads() + elif choice == "10": + clearScr() + routexp() + elif choice == "11" : + clearScr() + wifijamming() + elif choice == "12" : + clearScr() + socialattack() + elif choice == "13" : + clearScr() + socialfinder() + elif choice == "14": + clearScr() + androidhack() + elif choice == "15": + clearScr() + steganography() + elif choice == "16": + clearScr() + print(Logo) + others() + elif choice == "17": + clearScr() + print(Logo) + updatesys() + elif choice == "99" : + clearScr(), sys.exit() + exit() + elif choice == "": + menu() + else: + print("Wrong Input...!!") + time.sleep(3) + menu() + +def anonsurf(): + os.system("figlet -f standard -c Anonmously Hiding Tool | lolcat") + print(""" + [1] Anonmously Surf + [2] Multitor + [99] Back + """) + choice = input("Z4nzu =>>") + if choice == "1": + clearScr() + ansurf() + elif choice == "2": + clearScr() + multitor() + elif choice == "99": + menu() + else : + menu() + +def ansurf(): + os.system("echo \"It automatically overwrites the RAM when\nthe system is shutting down AnD AlSo cHange Ip\" |boxes -d boy | lolcat") + anc=input("[1]install [2]Run [3]Stop [99]Main Menu >> ") + if anc == "1": + os.system("sudo git clone https://github.com/Und3rf10w/kali-anonsurf.git") + os.system("cd kali-anonsurf && sudo ./installer.sh && cd .. && sudo rm -r kali-anonsurf") + anonsurf() + elif anc=="2": + os.system("sudo anonsurf start") + elif anc == "3": + os.system("sudo anonsurf stop") + elif anc == "99": + anonsurf() + else : + menu() + +def multitor(): + os.system("echo \"How to stay in multi places at the same time \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/multitor.git") + anonsurf() + elif userchoice == "2": + os.system("cd multitor && bash multitor.sh") + elif userchoice == "99": + anonsurf() + else : + menu() + +def info(): + os.system("figlet -f standard -c Information Gathering Tools | lolcat") + print(""" + [1] Nmap + [2] Dracnmap + [3] Port Scanning + [4] Host To IP + [5] Xerosploit + [6] Advanced XSS Detection Suite + [7] ReconSpider(For All Scaning) + [8] IsItDown (Check Website Down/Up) + [99] Back To Main Menu + """) + choice2 = input("Z4nzu =>> ") + if choice2 == "1": + nmap() + if choice2 == "2": + clearScr() + Dracnmap() + if choice2 == "3": + clearScr() + ports() + if choice2 == "4": + clearScr() + h2ip() + if choice2 == "5": + clearScr() + xerosploit() + if choice2 == "6": + clearScr() + XSStrike() + elif choice2 == "7": + clearScr() + reconspider() + elif choice2 == "8": + clearScr() + isitdown() + elif choice2 == "99": + clearScr() + menu() + elif choice2 == "": + menu() + else: + menu() + +def nmap(): + nmapchoice = input("[1]Install [99]BAck >> ") + if nmapchoice == "1" : + os.system("sudo git clone https://github.com/nmap/nmap.git") + os.system("sudo chmod -R 755 nmap && cd nmap && sudo ./configure && make && sudo make install") + # elif nmapchoice == "2": + # os.system("sudo nmap") + elif nmapchoice == "99": + info() + else: + menu() + +def Dracnmap(): + os.system("echo \"Dracnmap is an open source program which is using to \nexploit the network and gathering information with nmap help\" | boxes -d boy | lolcat") + dracnap = input("[1]Install [2]Run [99]Back >> ") + if dracnap == "1": + os.system("sudo git clone https://github.com/Screetsec/Dracnmap.git ") + os.system("cd Dracnmap && chmod +x Dracnmap.sh") + time.sleep(2) + info() + elif dracnap == "2": + print("Sorry You Have to Run This tool manually By Changing Path...!!") + print("use ./Dracnmap.sh ") + exit() + elif dracnap == "99": + info() + else : + menu() + +def h2ip(): + host = input("Enter host name(www.google.com) :- ") + ips = socket.gethostbyname(host) + print(ips) + +def ports(): + clearScr() + target = input('Select a Target IP : ') + os.system("sudo nmap -O -Pn %s" % target) + sys.exit() + +def XSStrike(): + os.system("echo \"XSStrike is a python script designed to detect and exploit XSS vulnerabilites. \"| boxes -d boy | lolcat") + xc=input("[1]Install [99]BAck >>") + if xc == "1": + os.system("sudo rm -rf XSStrike") + os.system("git clone https://github.com/UltimateHackers/XSStrike.git && cd XSStrike && pip install -r requirements.txt") + info() + # elif xc == "2" : + # clearScr() + # os.system("echo \"YOu have to Run XSStrike as per your Requirment\n By using python3 xsstrike.py [Options]\"|boxes -d boy") + # os.system("cd XSStrike && python3 xsstrike.py") + elif xc == "99": + info() + else : + info() + +def xerosploit(): + os.system("echo \"Xerosploit is a penetration testing toolkit whose goal is to perform \n man-in-th-middle attacks for testing purposes\"|boxes -d boy | lolcat") + xeros=input("[1]Install [2]Run [99]Back >>") + if xeros == "1": + os.system("git clone https://github.com/LionSec/xerosploit") + os.system("cd xerosploit && sudo python install.py") + info() + elif xeros == "2": + os.system("sudo xerosploit") + elif xeros == "99": + info() + else : + menu() + +def reconspider(): + os.system("echo \" ReconSpider is most Advanced Open Source Intelligence (OSINT) Framework for scanning IP Address, Emails, \nWebsites, Organizations and find out information from different sources.\" | boxes -d boy | lolcat") + userchoice = input("[1]Install [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/bhavsec/reconspider.git") + os.system("sudo apt install python3 python3-pip && cd reconspider && sudo python3 setup.py install") + info() + # elif userchoice == "2": + # os.system("cd reconspider && python3 reconspider.py") + elif userchoice == "99": + info() + else : + menu() + +def setoolkit(): + os.system("echo \"The Social-Engineer Toolkit is an open-source penetration\ntesting framework designed for social engineering\"| boxes -d boy | lolcat") + choiceset = input("[1]Install [2]Run [99]BAck >>") + if choiceset == "1": + os.system("git clone https://github.com/trustedsec/social-engineer-toolkit.git") + os.system("python social-engineer-toolkit/setup.py") + phishattack() + if choiceset == "2": + clearScr() + os.system("sudo setoolkit") + elif choiceset == "99": + phishattack() + else: + menu() + +def passwd(): + clearScr() + os.system("figlet -f standard -c Wordlist Generator | lolcat") + print(""" + [01]Cupp + [02]WordlistCreator + [03]Goblin WordGenerator + [04]Credential reuse attacks + [99]Back To Main Menu + """) + passchoice = input("Z4nzu ==>> ") + if passchoice == "1" or passchoice == "01": + clearScr() + cupp() + elif passchoice == "2" or passchoice == "02": + clearScr() + wlcreator() + elif passchoice == "3" or passchoice == "03": + clearScr() + goblinword() + elif passchoice == "4" or passchoice == "04": + clearScr() + credentialattack() + elif passchoice == "99": + clearScr() + menu() + elif passchoice == "": + menu() + else: + menu() + +def cupp(): + os.system("echo \"Common User Password Generator..!!\"| boxes -d boy | lolcat ") + cc=input("[1]Install [99]Back >> ") + if cc == "1": + os.system("git clone https://github.com/Mebus/cupp.git") + passwd() + elif cc == "2": + # os.system("cd cupp && ./cupp.py -h") + pass + elif cc == "99" : + passwd() + else : + main() + +def wlcreator(): + os.system("echo \" WlCreator is a C program that can create all possibilities of passwords,\n and you can choose Lenght, Lowercase, Capital, Numbers and Special Chars\" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/wlcreator") + passwd() + elif userchoice == "2": + os.system("cd wlcreator && sudo gcc -o wlcreator wlcreator.c && ./wlcreator 5") + elif userchoice == "99": + passwd() + else : + menu() + +def goblinword(): + os.system("echo \" GoblinWordGenerator \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/UndeadSec/GoblinWordGenerator.git") + passwd() + elif userchoice == "2": + os.system("cd GoblinWordGenerator && python3 goblin.py") + elif userchoice == "99": + passwd() + else : + menu() + +def credentialattack(): + os.system("echo \"[!]Check if the targeted email is in any leaks and then use the leaked password to check it against the websites.\n[!]Check if the target credentials you found is reused on other websites/services.\n[!]Checking if the old password you got from the target/leaks is still used in any website.\n[#]This Tool Available in MAC & Windows Os \n\t[!] https://github.com/D4Vinci/Cr3dOv3r\" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/D4Vinci/Cr3dOv3r.git") + os.system("cd Cr3dOv3r && python3 -m pip install -r requirements.txt") + passwd() + elif userchoice == "2" : + os.system("cd Cr3dOv3r && sudo python3 Cr3d0v3r.py -h") + elif userchoice == "99": + passwd() + else : + menu() + +def wire(): + clearScr() + os.system("figlet -f standard -c Wireless Attack Tools | lolcat") + print(""" + [1] WiFi-Pumpkin + [2] pixiewps + [3] Bluetooth Honeypot GUI Framework + [4] Fluxion + [5] Wifiphisher + [6] Wifite + [7] EvilTwin + [99]Back To The Main Menu """) + choice4 = input("Z4nzu ==>> ") + if choice4 == "1": + clearScr() + wifipumkin() + if choice4 == "2": + clearScr() + pixiewps() + if choice4 == "3": + clearScr() + bluepot() + if choice4 == "4": + clearScr() + fluxion() + if choice4 == "5": + clearScr() + wifiphisher() + elif choice4 == "6": + clearScr() + wifite() + elif choice4 == "7": + clearScr() + eviltwin() + elif choice4 == "99": + menu() + elif choice4 == "": + menu() + else: + menu() + +def wifipumkin(): + os.system("echo \"The WiFi-Pumpkin is a rogue AP framework to easily create these fake networks\nall while forwarding legitimate traffic to and from the unsuspecting target.\"| boxes -d boy | lolcat") + wp=input("[1]Install [2]Run [99]Back >>") + if wp == "1": + os.system("sudo apt install libssl-dev libffi-dev build-essential") + os.system("sudo git clone https://github.com/P0cL4bs/wifipumpkin3.git") + os.system("chmod -R 755 wifipumpkin3 && cd wifipumpkin3") + os.system("sudo apt install python3-pyqt5 ") + os.system("sudo python3 setup.py install") + wire() + elif wp == "2": + clearScr() + os.system("sudo wifipumpkin3") + elif wp == "99": + wire() + else : + menu() + +def pixiewps(): + os.system("echo \"Pixiewps is a tool written in C used to bruteforce offline the WPS pin\n exploiting the low or non-existing entropy of some Access Points, the so-called pixie dust attack\"| boxes -d boy | lolcat") + choicewps = input("[1]Install [2]Run [99]Back >> ") + if choicewps == "1": + os.system("sudo git clone https://github.com/wiire/pixiewps.git && apt-get -y install build-essential") + os.system("cd pixiewps*/ && make ") + os.system("cd pixiewps*/ && sudo make install && wget https://pastebin.com/y9Dk1Wjh") + if choicewps == "2": + os.system("echo \"1.>Put your interface into monitor mode using 'airmon-ng start {wireless interface}\n2.>wash -i {monitor-interface like mon0}'\n3.>reaver -i {monitor interface} -b {BSSID of router} -c {router channel} -vvv -K 1 -f\"| boxes -d boy") + print("You Have To Run Manually By USing >>pixiewps -h ") + pass + elif choicewps == "99": + wire() + else: + menu() + +def bluepot(): + os.system("echo \"you need to have at least 1 bluetooh receiver (if you have many it will work wiht those, too).\nYou must install/libbluetooth-dev on Ubuntu/bluez-libs-devel on Fedora/bluez-devel on openSUSE\"|boxes -d boy | lolcat") + choice = input("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("wget https://github.com/andrewmichaelsmith/bluepot/raw/master/bin/bluepot-0.1.tar.gz && tar xfz bluepot-0.1.tar.gz && sudo java -jar bluepot/BluePot-0.1.jar") + time.sleep(3) + wire() + elif choice == "2": + os.system("cd bluepot-0.1 && sudo java -jar bluepot/BluePot-0.1.jar") + elif choice == "99": + wire() + else: + menu() + +def fluxion(): + os.system("echo \"fluxion is a wifi key cracker using evil twin attack..\nyou need a wireless adaptor for this tool\"| boxes -d boy | lolcAT") + choice = input("[1]Install [2]Run [99]Back >>") + if choice == "1": + os.system("git clone https://github.com/thehackingsage/Fluxion.git") + os.system("cd Fluxion && cd install && sudo chmod +x install.sh && sudo bash install.sh") + os.system("cd .. && sudo chmod +x fluxion.sh") + time.sleep(2) + wire() + elif choice == "2": + os.system("cd Fluxion && sudo bash fluxion.sh") + elif choice == "99" : + wire() + else: + menu() + +def wifiphisher(): + print(""" + Wifiphisher is a rogue Access Point framework for conducting red team engagements or Wi-Fi security testing. + Using Wifiphisher, penetration testers can easily achieve a man-in-the-middle position against wireless clients by performing + targeted Wi-Fi association attacks. Wifiphisher can be further used to mount victim-customized web phishing attacks against the + connected clients in order to capture credentials (e.g. from third party login pages or WPA/WPA2 Pre-Shared Keys) or infect the + victim stations with malware.. + """) + print("For More Details Visit >> https://github.com/wifiphisher/wifiphisher") + wchoice=input("[1]Install [2]Run [99]Back >> ") + if wchoice == "1": + os.system("git clone https://github.com/wifiphisher/wifiphisher.git") + os.system("cd wifiphisher && sudo python3 setup.py install") + wire() + if wchoice == "2": + os.system("cd wifiphisher && sudo wifiphisher") + elif wchoice == "99" : + wire() + else : + menu() + +def wifite(): + wc=input("[1]Install [2]Run [99]BAck >> ") + if wc == "1": + os.system("sudo git clone https://github.com/kimocoder/wifite2.git") + os.system("cd wifite2 && sudo python3 setup.py install && sudo pip3 install -r requirements.txt") + time.sleep(3) + wire() + elif wc =="2": + os.system("cd wifite2 && sudo wifite") + elif wc == "99": + wire() + else : + menu() + +def eviltwin(): + os.system("echo \"Fakeap is a script to perform Evil Twin Attack, by getting credentials using a Fake page and Fake Access Point \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/fakeap ") + wire() + elif userchoice == "2": + os.system("cd fakeap && sudo bash fakeap.sh") + elif userchoice == "99": + wire() + else : + menu() + +def socialattack(): + clearScr() + os.system("figlet -f standard SocialMedia Attack | lolcat") + print(""" + [1] Instagram Attack + [2] Tweeter Attack + [3] Facebook Attack + [4] Application Checker + [99]Back To Menu + """) + choice=input("Z4nzu >> ") + if choice == "1": + clearScr() + instashell() + socialattack() + elif choice == "2": + clearScr() + tweetshell() + socialattack() + elif choice == "3": + clearScr() + faceshell() + socialattack() + elif choice == "4" : + clearScr() + appcheck() + socialattack() + elif choice == "99" : + menu() + else : + menu() + +def instashell(): + os.system("echo \"Instashell is an Shell Script to perform multi-threaded brute force attack against Instagram \"| boxes -d boy | lolcat") + instachoice=input("[1]install [2]Run [99]Back >> ") + if instachoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/instashell ") + os.system("cd instashell && sudo chmod +x install.sh && sudo ./install.sh") + socialattack() + elif instachoice == "2": + os.system("cd instashell && chmod +x instashell.sh && service tor start && sudo ./instashell.sh") + elif instachoice == "99": + socialattack() + else : + menu() + +def tweetshell(): + os.system("echo \"Tweetshell is an Shell Script to perform multi-threaded brute force attack against Twitter\"|boxes -d boy | lolcat") + choice = input ("[1]Install [2]Run [99]BAck >> ") + if choice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/tweetshell && chmod -R 775 tweetshell") + os.system("cd tweetshell && sudo ./install.sh") + socialattack() + elif choice == "2": + os.system("cd tweetshell && service tor start && sudo ./tweetshell.sh") + elif choice == "99": + socialattack() + else : + menu() + +def faceshell(): + os.system("echo \"Facebash is an Shell Script to perform brute force attack against FAcebook\n [!]Facebook blocks account for 1 hour after 20 wrong passwords, so this script can perform only 20 pass/h \"|boxes -d boy | lolcat") + choice = input ("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/facebash && chmod -R 775 facebash") + os.system("cd facebash && sudo ./install.sh") + socialattack() + elif choice == "2": + os.system("cd facebash && service tor start && sudo ./facebash.sh") + elif choice == "99": + socialattack() + else : + menu() + +def appcheck(): + os.system("echo \"Tool to check if an app is installed on the target device through a link.\"|boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/underhanded") + socialattack() + elif userchoice == "2": + os.system("cd underhanded && sudo chmod +x underhanded.sh && sudo bash underhanded.sh") + elif userchoice == "99": + socialattack() + else : + menu() + +def phishattack(): + clearScr() + os.system("figlet -f standard -c Phishing Attack Tools | lolcat") + print(""" + [1] Setoolkit + [2] SocialFish + [3] Shellphish + [4] BlackEye + [5] I-See_You(Get Location using phishing attack) + [6] SayCheese (Grab target's Webcam Shots) + [7] QR Code Jacking + [99]Back To Main Menu + """) + choice = input("Z4nzu ==>> ") + if choice == "1": + clearScr() + setoolkit() + if choice == "2": + clearScr() + socialfish() + if choice == "3": + clearScr() + shellphish() + if choice == "4": + clearScr() + blackeye() + elif choice == "5": + clearScr() + iseeyou() + elif choice == "6": + clearScr() + saycheese() + elif choice == "7": + clearScr() + qrjacking() + if choice == "99": + clearScr() + menu() + elif choice == "": + menu() + else: + menu() + +def socialfish(): + choice=input("[1]install [2]Run [99]BAck >> ") + if choice == "1": + os.system("sudo git clone https://github.com/UndeadSec/SocialFish.git && sudo apt-get install python3 python3-pip python3-dev -y") + os.system("cd SocialFish && sudo python3 -m pip install -r requirements.txt") + time.sleep(2) + phishattack() + elif choice =="2": + os.system("cd SocialFish && sudo python3 SocialFish.py root pass") + elif choice =="99": + phishattack() + else : + menu() + +def shellphish(): + choice=input("[1]install [2]Run [99]BAck >> ") + if choice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/shellphish") + phishattack() + elif choice =="2": + os.system("cd shellphish && sudo bash shellphish.sh") + elif choice =="99": + phishattack() + else : + menu() + +def blackeye(): + choice=input("[1]install [2]Run [99]BAck >> ") + if choice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/blackeye") + time.sleep(2) + phishattack() + elif choice =="2": + os.system("cd blackeye && sudo bash blackeye.sh") + elif choice =="99": + phishattack() + else : + menu() + +def iseeyou(): + os.system("echo \"[!] ISeeYou is a tool to find Exact Location of Victom By User SocialEngineering or Phishing Engagment..\n[!]Users can expose their local servers to the Internet and decode the location coordinates by looking at the log file\"|boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/Viralmaniar/I-See-You.git") + os.system("cd I-See-You && sudo chmod u+x ISeeYou.sh") + phishattack() + elif userchoice == "2": + os.system("cd I-See-You && sudo bash ISeeYou.sh") + elif userchoice == "99": + phishattack() + else : + menu() + +def saycheese(): + os.system("echo \"Take webcam shots from target just sending a malicious link\"|boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/saycheese") + phishattack() + elif userchoice == "2": + os.system("cd saycheese && sudo bash saycheese.sh") + elif userchoice == "99": + phishattack() + else : + menu() + +def qrjacking(): + os.system("echo \"QR Code Jacking (Any Website) \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/ohmyqr && sudo apt-get install scrot") + phishattack() + elif userchoice == "2": + os.system("cd ohmyqr && sudo bash ohmyqr.sh") + elif userchoice == "99": + phishattack() + else : + menu() + +def socialfinder(): + clearScr() + os.system("figlet -f standard SocialMedia Finder | lolcat") + print(""" + [1]Find SocialMedia By Facial Recognation System + [2]Find SocialMedia By UserName + [99]Back To Main Menu + """) + choice =input("Z4nzu =>>") + if choice == "1": + facialfind() + elif choice == "2": + userrecon() + elif choice == "99": + menu() + else : + menu() + +def facialfind(): + choice=input("[1]Install [2]Run [99]Back >>") + if choice == "1": + os.system("sudo add-apt-repository ppa:mozillateam/firefox-next && sudo apt update && sudo apt upgrade") + os.system("echo \"[!]Now You have To do some Manually\n[!]Install the Geckodriver for your operating system\n[!]Copy & Paste Link And Download File As System Configuration\n[#]https://github.com/mozilla/geckodriver/releases\n[!!]On Linux you can place it in /usr/bin \"| boxes -d boy") + time.sleep(5) + os.system("sudo git clone https://github.com/Greenwolf/social_mapper.git") + os.system("cd social_mapper/setup") + os.system("sudo python3 -m pip install --no-cache-dir -r requirements.txt") + socialfinder() + elif choice == "2": + os.system("cd social_mapper/setup") + os.system("sudo python social_mapper.py -h") + print("""\033[95m + You have to set Username and password of your AC Or Any Fack Account + {0}Type in Terminal nano social_mapper.py + \n ]""") + os.system("echo \"python social_mapper.py -f [] -i [] -m fast [] -fb -tw\"| boxes -d headline | lolcat") + elif choice == "99" : + socialfinder() + else : + menu() + +def userrecon(): + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/userrecon.git") + os.system("cd userrecon && sudo chmod +x userrecon.sh ") + time.sleep(3) + socialfinder() + elif userchoice == "2": + os.system("cd userrecon && sudo ./userrecon.sh") + elif userchoice == "99": + socialfinder() + else : + menu() + +def forensic(): + clearScr() + os.system("figlet -f standard Forensic Tools | lolcat ") + print(""" + [1] Bulk_extractor + [2] Disk Clone and ISO Image Aquire + [3] AutoSpy + [99]Back to Menu + """) + choice = input("Z4nzu ==>>") + if choice == "1" : + clearScr() + bulkextractor() + elif choice == "2": + clearScr() + guymager() + elif choice == "3": + clearScr() + autopsy() + elif choice == "99": + menu() + elif choice == "": + menu() + else : + menu() + +def bulkextractor(): + print(""" + [1]GUI Mode(Download required) + [2]CLI Mode + [99]BAck + """) + choice = input("Z4nzu >> ") + if choice == "1": + os.system("sudo git clone https://github.com/simsong/bulk_extractor.git") + os.system("ls src/ && cd .. && cd java_gui && ./BEViewer") + print("If you getting error after clone go to /java_gui/src/ And Compile .Jar file && run ./BEViewer") + print("Please Visit For More Details About Installation >> https://github.com/simsong/bulk_extractor ") + elif choice =="2": + os.system("sudo apt-get install bulk_extractor") + print("bulk_extractor and options") + os.system("bulk_extractor") + os.system("echo \"bulk_extractor [options] imagefile\" | boxes -d headline | lolcat") + elif choice == "99": + forensic() + elif choice =="": + forensic() + else : + menu() + +def guymager(): + choice = input("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo apt install guymager") + forensic() + elif choice == "2": + clearScr() + os.system("sudo guymager") + elif choice == "99": + forensic() + elif choice == "": + forensic() + else : + menu() + +def autopsy(): + os.system("echo \"Autopsy is a platform that is used by Cyber Investigators.\n[!] Works in any Os\n[!]Recover Deleted Files from any OS & MEdia \n[!]Extract Image Metadata \"|boxes -d boy | lolcat") + print(""" + [1]Run [99]Back + """) + choice=input("Z4nzu >> ") + if choice == "1": + os.system("sudo autopsy") + if choice == "": + forensic() + elif choice =="99": + forensic() + else : + menu() + +def postexp(): + clearScr() + os.system("figlet -f standard post explotations | lolcat") + print(""" + [1] Vegile - Ghost In The Shell + [2] Chrome Keylogger + [99]Back + """) + expchoice = input("Z4nzu =>> ") + if expchoice == "1": + clearScr() + vegile() + if expchoice == "2": + clearScr() + chromekeylogger() + elif expchoice == "99": + menu() + elif expchoice == "": + postexp() + else : + menu() + +def vegile(): + os.system("echo \"[!]This tool will set up your backdoor/rootkits when backdoor is already setup it will be \nhidden your specific process,unlimited your session in metasploit and transparent.\"|boxes -d boy | lolcat") + vegilechoice = input("[1]Install [2]Run [99]Back >> ") + if vegilechoice == "1": + os.system("sudo git clone https://github.com/Screetsec/Vegile.git") + os.system("cd Vegile && sudo chmod +x Vegile") + postexp() + elif vegilechoice == "2": + os.system("echo \"You can Use Command : \n[!]Vegile -i / --inject [backdoor/rootkit] \n[!]Vegile -u / --unlimited [backdoor/rootkit] \n[!]Vegile -h / --help\"|boxes -d parchment") + os.system("cd Vegile && sudo bash Vegile ") + pass + elif vegilechoice == "99": + postexp() + else : + menu() + +def chromekeylogger(): + os.system("echo \" Hera Chrome Keylogger \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/UndeadSec/HeraKeylogger.git") + os.system("cd HeraKeylogger && sudo apt-get install python3-pip -y && sudo pip3 install -r requirements.txt ") + postexp() + elif userchoice == "2": + os.system("cd HeraKeylogger && sudo python3 hera.py ") + elif userchoice == "99": + postexp() + else : + menu() + +def routexp(): + clearScr() + os.system("figlet -f standard Router Exploit | lolcat ") + print(""" + [1] RouterSploit + [2] Fastssh + [99]Back to menu + """) + choice=input("Z4nzu =>> ") + if choice == "1": + clearScr() + routersploit() + elif choice=="99": + menu() + elif choice=="2": + clearScr() + fastssh() + elif choice== "": + routexp() + else : + print("You Entered wrong Choice :") + routexp() + +def routersploit(): + os.system("echo \"The RouterSploit Framework is an open-source exploitation framework dedicated to embedded devices\"|boxes -d boy | lolcat") + choice=input("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo git clone https://www.github.com/threat9/routersploit") + os.system("cd routersploit && sudo python3 -m pip install -r requirements.txt") + routexp() + elif choice == "2": + os.system("cd routersploit && sudo python3 rsf.py") + elif choice == "99": + routexp() + elif choice == "": + routexp() + else : + menu() + +def fastssh(): + os.system("echo \"Fastssh is an Shell Script to perform multi-threaded scan \n and brute force attack against SSH protocol using the most commonly credentials. \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/fastssh && cd fastssh && sudo chmod +x fastssh.sh") + os.system("sudo apt-get install -y sshpass netcat") + elif userchoice == "2": + os.system("cd fastssh && sudo bash fastssh.sh --scan") + elif userchoice == "99": + routexp() + else : + menu() +def Ddos(): + os.system("figlet -f standard -c DDOS Attack Tools | lolcat") + print(""" + [1]SlowLoris + [99]Back + """) + choice =input("Z4nzu >> ") + if choice == "1": + clearScr() + slowloris() + elif choice == "2": + pass + elif choice == "99": + others() + else : + print("Invalid ...") + menu() +def webAttack(): + clearScr() + os.system("figlet 'Web Attack Tools' -f standard -c | lolcat") + print(""" + [1] Web2Attack + [2] Skipfish + [3] SubDomain Finder + [4] CheckURL + [5] Blazy(Also Find ClickJacking) + [99]Back To Menu + """) + choice = input("Z4nzu >> ") + if choice == "1": + clearScr() + web2attack() + elif choice == "2": + skipfish() + elif choice == "3": + subdomain() + elif choice == "4": + clearScr() + checkurl() + elif choice == "5": + + blazy() + elif choice == "99": + menu() + else : + menu() + +def web2attack(): + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/santatic/web2attack.git") + webAttack() + elif userchoice == "2": + os.system("cd web2attack && ./w2aconsole") + elif userchoice == "99": + webAttack() + else : + menu() + +def slowloris(): + os.system("echo\"Slowloris is basically an HTTP Denial of Service attack.It send lots of HTTP Request\"|boxes -d boy | lolcat") + choice = input("[1]install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo pip install slowloris") + elif choice == "2": + print(Logo) + ts=input("Enter Target Site :-") + os.system("slowloris %s"%ts) + elif choice == "99": + webAttack() + else : + menu() + +def skipfish(): + userchoice = input("[1]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo skipfish -h") + os.system("echo \"skipfish -o [FolderName] targetip/site\"|boxes -d headline | lolcat") + elif userchoice == "99": + webAttack() + else : + menu() + +def subdomain(): + + choice=input("[1]install [2]Run [99]BAck >> ") + if choice == "1": + os.system("sudo pip install requests argparse dnspython") + os.system("sudo git clone https://github.com/aboul3la/Sublist3r.git ") + os.system("cd Sublist3r && sudo pip install -r requirements.txt") + webAttack() + elif choice == "2": + print("Go to Sublist3r and run ./sublist3r") + os.system("echo \" python sublist3r.py -d example.com \npython sublist3r.py -d example.com -p 80,443\"| boxes -d boy | lolcat") + os.system("cd Sublist3r && python sublist3r.py -h") + elif choice == "99" : + webAttack() + else : + main() + +def checkurl(): + os.system("echo \" Detect evil urls that uses IDN Homograph Attack.\n\t[!]python3 checkURL.py --url google.com \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/UndeadSec/checkURL.git") + webAttack() + elif userchoice == "2": + os.system("cd checkURL && python3 checkURL.py --help") + elif userchoice == "99": + webAttack() + else : + menu() + +def blazy(): + os.system("echo \"Blazy is a modern login page bruteforcer \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/UltimateHackers/Blazy") + os.system("cd Blazy && sudo pip install -r requirements.txt") + webAttack() + elif userchoice == "2": + os.system("cd Blazy && sudo python blazy.py") + elif userchoice == "99": + webAttack() + else : + menu() + +def androidhack(): + clearScr() + os.system("figlet -f standard -c Android Hacking Tools | lolcat") + print(""" + [1] Keydroid + [2] MySMS + [3] Getdroid + [4] DroidFiles (Get files from Android Directories) + [5] Lockphish (Grab target LOCK PIN) + [6] Whatsapp Attack + [7] DroidCam (Capture Image) + [8] EvilApp (Hijack Session) + [99]Main Menu + """) + choice = input("Z4nzu =>>") + if choice == "1": + clearScr() + keydroid() + elif choice == "2": + clearScr() + mysms() + elif choice == "3": + clearScr() + getdroid() + elif choice == "5": + clearScr() + lock() + elif choice == "4": + clearScr() + droidfile() + elif choice == "6": + clearScr() + whatshack() + elif choice == "7": + clearScr() + droidcam() + elif choice == "8": + clearScr() + evilapp() + elif choice == "99": + menu() + else : + menu() + +def keydroid(): + os.system("echo \"Android Keylogger + Reverse Shell\n[!]You have to install Some Manually Refer Below Link :\n [+]https://github.com/thelinuxchoice/keydroid \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/keydroid ") + androidhack() + elif userchoice == "2": + os.system("cd keydroid && bash keydroid.sh") + elif userchoice == "99": + androidhack() + else : + menu() + +def mysms(): + os.system("echo \" Script that generates an Android App to hack SMS through WAN \n[!]You have to install Some Manually Refer Below Link :\n\t [+]https://github.com/thelinuxchoice/mysms \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/mysms") + androidhack() + elif userchoice == "2": + os.system("cd mysms && bash mysms.sh") + elif userchoice == "99": + androidhack() + else : + menu() + +def getdroid(): + os.system("echo \"FUD Android Payload (Reverse Shell) and Listener using Serveo.net (no need config port forwarding) \" | boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/getdroid && apt-get install android-sdk apksigner -y") + androidhack() + elif userchoice == "2": + os.system("cd getdroid && bash getdroid.sh") + elif userchoice == "99": + androidhack() + else : + menu() + +def lock(): + os.system("echo \"Lockphish it's the first tool for phishing attacks on the lock screen, designed to\n Grab Windows credentials,Android PIN and iPhone Passcode using a https link. \"| boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/lockphish") + androidhack() + elif userchoice == "2": + os.system("cd lockphish && bash lockphish.sh") + elif userchoice == "99": + androidhack() + else : + menu() + +def droidfile(): + os.system("echo \"Get files from Android directories\"|boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [3] Packges Install(Required) [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/droidfiles") + elif userchoice == "2": + os.system("cd droidfiles && bash droidfiles.sh") + elif userchoice == "3": + os.system("apt-get install default-jdk apksigner") + os.system("apt-get install libc6-dev-i386 lib32z1") + os.system("wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip && mkdir -p $HOME/Android/Sdk && unzip sdk-tools-linux* -d $HOME/Android/Sdk") + os.system("curl -s \"https://get.sdkman.io\" | bash && source $HOME/.sdkman/bin/sdkman-init.sh && echo \"Y\" | sdk install java 8.0.191-oracle && sdk use java 8.0.191-oracle && sdk install gradle 2.14.1 && sdk use gradle 2.14.1") + elif userchoice == "99": + androidhack() + else : + menu() + +def whatshack(): + os.system("echo \"Script to generate Android App to Hack All WhatsApp Media Files.\n\t[!]Download Android Studio:\n[+]https://developer.android.com/studio \n\t[!]Installing Android Studio:\n[+]unzip ~/Downloads/android*.zip -d /opt \nRun Android Studio: \n[+] cd /opt/android-studio/bin \n[+] ./studio.sh \n[!]Go to SDK Manager (Configure -> SDK Manager) and Download:\n[!]Android SDK Build-tools, Android SDK-tools, Android SDK platform-tools, Support Repository\" | boxes -d shell | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/whatshack") + time.sleep(5) + print("Installing Required Packges..!! It Take More Time ") + time.sleep(3) + os.system("apt-get install openjdk-8-jdk && apt-get install gradle") + os.system("update-alternatives --list java") + os.system("update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java") + time.sleep(2) + androidhack() + elif userchoice == "2": + os.system("echo \"[#]On First Time, Choose \"n\" when asks to build, then open the project on Android Studio:\n[!]cd /opt/android-studio/bin \n[!]./studio.sh \n[#]Import Gradle Project:\n[!]Choose whatshack app folder: whatshack/app/ \n[#]Wait all dependencies downloading, if you got errors, click on showed links to solve. \n[#]Try build from Android Studio: Build > build APK's \n[#]Click on showed links if you got errors. \n[#]Close Android after building successfully.\n[#]open with any Text Editor the file app/build.gradle\n[!]remove \"google\" \n[#]change gradle version from: 3.4.1 to: 2.2.0 \n[!]save and exit. \n[#]After this Run Script As Root: \n[!]bash whatshack.sh \"| boxes -d shell") + os.system("echo \"If still getting error please visit \n\t[#]https://github.com/thelinuxchoice/whatshack\"|boxes -d shell") + os.system("cd whatshack/ && bash whatshack.sh") + elif userchoice == "99": + androidhack() + elif userchoice=="": + androidhack() + else : + menu() + +def droidcam(): + os.system("echo \"Script to generate an Android App to take photos from Cameras using Camera2 function on API 21\n After Installing if you getting error please go to below link \n[+]https://github.com/thelinuxchoice/DroidCam \"| boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/droidcam ") + os.system("cd droidcam && sudo bash install.sh") + androidhack() + elif userchoice == "2": + os.system("cd droidcam && bash droidcam.sh") + elif userchoice == "99": + androidhack() + else : + menu() + +def evilapp(): + os.system("echo \"EvilApp is a script to generate Android App that can hijack authenticated sessions in cookies\"boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/evilapp") + androidhack() + elif userchoice == "2": + os.system("cd evilapp && bash evilapp.sh") + elif userchoice == "99": + androidhack() + else : + menu() + +def payloads(): + clearScr() + os.system("figlet -f standard -c Payloads | lolcat") + print(""" + [1] The FatRat* + [2] Brutal + [3] Stitch + [4] MSFvenom Payload Creator + [5] Venom Shellcode Generator + [6] Spycam + [99]Back + """) + choice =input("Z4nzu >> ") + if choice == "1": + clearScr() + thefatrat() + elif choice == "2": + clearScr() + Brutal() + elif choice == "3": + clearScr() + stitch() + elif choice == "4": + clearScr() + MSFvenom() + elif choice == "5": + clearScr() + venom() + elif choice == "6": + clearScr() + spycam() + elif choice == "99": + menu() + elif choice == "": + payloads() + else : + menu() + +def thefatrat(): + os.system("echo \"TheFatRat Provides An Easy way to create Backdoors and \nPayload which can bypass most anti-virus\"|boxes -d boy | lolcat") + choice = input("[1]Install [2] Run [3]Update [4]TroubleShoot(if not run) [99]Back >> ") + if choice == "1": + os.system("sudo git clone https://github.com/Screetsec/TheFatRat.git") + os.system("cd TheFatRat && sudo chmod +x setup.sh") + payloads() + elif choice == "2": + os.system("cd TheFatRat && sudo bash setup.sh") + elif choice == "3": + os.system("cd TheFatRat && bash update && chmod +x setup.sh && bash setup.sh") + elif choice == "4": + os.system("cd TheFatRat && sudo chmod +x chk_tools && ./chk_tools") + time.sleep(2) + payloads() + elif choice == "99": + payloads() + else : + menu() + +def Brutal(): + os.system("echo \"Brutal is a toolkit to quickly create various payload,powershell attack,\nvirus attack and launch listener for a Human Interface Device\"|boxes -d boy | lolcat") + print(""" + [!]Requirement + >>Arduino Software ( I used v1.6.7 ) + >>TeensyDuino + >>Linux udev rules + >>Copy and paste the PaensyLib folder inside your Arduino\libraries + [!]Kindly Visit below link for Installation for Arduino + >> https://github.com/Screetsec/Brutal/wiki/Install-Requirements + """) + choice = input("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo git clone https://github.com/Screetsec/Brutal.git") + os.system("cd Brutal && sudo chmod +x Brutal.sh ") + payloads() + elif choice == "2": + os.system("cd Brutal && sudo bash Brutal.sh") + elif choice == "99": + payloads() + else : + menu() + +def stitch(): + os.system("echo \"Stitch is Cross Platform Python Remote Administrator Tool\n\t[!]Refer Below Link For Wins & MAc Os\n\t(!)https://nathanlopez.github.io/Stitch \" | boxes -d boy | lolcat") + choice = input("[1]Install [2]Run [99]Back >>" ) + if choice == "1": + os.system("sudo git clone https://github.com/nathanlopez/Stitch.git") + os.system("cd Stitch && sudo pip install -r lnx_requirements.txt") + payloads() + elif choice == "2": + os.system("cd Stitch && sudo python main.py") + elif choice == "99": + payloads() + else : + menu() + +def MSFvenom(): + choice= input("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo git clone https://github.com/g0tmi1k/msfpc.git && cd msfpc && chmod +x msfpc.sh") + payloads() + elif choice == "2": + os.system("cd msfpc && sudo bash msfpc.sh -h -v") + elif choice == "99": + payloads() + elif choice == "": + payloads() + else : + menu() + +def venom(): + os.system("echo \"venom 1.0.11 (malicious_server) was build to take advantage of \n apache2 webserver to deliver payloads (LAN) using a fake webpage writen in html\"| boxes -d boy| lolcat") + choice =input("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo git clone https://github.com/r00t-3xp10it/venom.git") + os.system("sudo chmod -R 775 venom*/ && cd venom*/ && cd aux && sudo bash setup.sh") + os.system("sudo ./venom.sh -u") + print("Download Successfully...!!!") + payloads() + #sudo find ./ -name "*.sh" -exec chmod +x {} \; sudo find ./ -name "*.py" -exec chmod +x {} \; + # print("Give Permission to .sh & .py Files") + elif choice == "2": + os.system("cd venom && sudo ./venom.sh") + elif choice == "99": + payloads() + else : + menu() + +def spycam(): + os.system("echo \"Script to generate a Win32 payload that takes the webcam image every 1 minute and send it to the attacker\"|boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone https://github.com/thelinuxchoice/spycam ") + os.system("cd spycam && bash install.sh && chmod +x spycam") + payloads() + elif userchoice == "2": + os.system("cd spycam && ./spycam") + elif userchoice == "99": + payloads() + elif userchoice == "": + payloads() + else : + menu() + +def wifijamming(): + clearScr() + os.system("figlet -f standard -c Wifi Deautheticate | lolcat") + print(""" + [1] Using Airmon + [99]Back + """) + choice = input("Z4nzu =>> ") + if choice == "1": + clearScr() + # airmon() + pass + elif choice == "99": + menu() + else : + menu() + +def airmon(): + # os.system("echo \" \" | boxes -d boy") + print(Logo) + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + print("In Working") + time.sleep(5) + menu() + elif userchoice == "2": + print(""" + ########################################################################### + # [!] Follow Below steps for Jamming [!] # + # [1]iwconfig # + # [2]airmon-ng # + # [3]airmon-ng start InterfaceName # + # [4]airodump-ng InterfaceName # + # [5]airodump-ng -c [CH no.] --bssid [MAC address] InterfaceName # + # [6]aireply-ng -0 0 -a [mac address] InterfaceName # + # [+]After Complete monitor mode return your interface in normal mode # + # [7]airmon-ng stop InterfaceName # + ########################################################################### + """) + os.system("sudo airmon-ng") + elif userchoice == "99": + wifijamming() + elif userchoice == "": + wifijamming() + else : + menu() + # z=raw_input("Enter Your wifi Interface Name :- ") + # os.system("airmon-ng && airmon-ng start %s"%z) + +def steganography(): + clearScr() + os.system("figlet -f standard -c SteganoGraphy | lolcat") + print(""" + [1] SteganoHide + [2] StegnoCracker + [3] WhiteSpace + [99]Back + """) + choice = input("Z4nz =>> ") + if choice == "1": + steganohide() + elif choice == "2": + stegnocracker() + elif choice == "3": + whitespace() + elif choice == "99": + menu() + else : + menu() + +def steganohide(): + choice = input("[1]Install [2]Run [99] >> ") + if choice == "1": + os.system("sudo apt-get install steghide -y ") + steganography() + elif choice == "2": + choice1=input("[1]Hide [2]Extract >> ") + if choice1 =="1": + filehide=input("Enter Filename you want to Embed(1.txt) :- ") + filetobehide=input("Enter Cover Filename(test.jpeg) :- ") + os.system("steghide embed -cf {0} -ef {1}".format(filetobehide,filehide)) + elif choice1 =="2": + fromfile=input("Enter Filename From Extract Data :- ") + os.system("steghide extract -sf {0}".format(fromfile)) + elif choice == "99": + steganography() + else : + menu() + +def stegnocracker(): + os.system("echo \" SteganoCracker is a tool that uncover hidden data inside files\n using brute-force utility \"|boxes -d boy| lolcat") + choice = ("[1]Install [2]Run [99]BAck >> ") + if choice == "1": + os.system("pip3 install stegcracker && pip3 install stegcracker -U --force-reinstall") + steganography() + elif choice =="2": + file1=input("Enter Filename :- ") + passfile=input("Enter Wordlist Filename :- ") + os.system("stegcracker {0} {1} ".format(file1,passfile)) + elif choice == "99": + steganography() + else : + menu() + +def whitespace(): + choice =input("[1]Install [2]Run [99]Back >> ") + if choice == "1": + os.system("sudo git clone https://github.com/beardog108/snow10.git ") + os.system("sudo chmod -R 755 snow10") + steganography() + elif choice == "2": + os.system("cd snow10 && firefox index.html") + elif choice == "99": + steganography() + else : + menu() + +def sqltool(): + clearScr() + os.system("figlet -f standard -c Sql Tools | lolcat") + print(""" + [1] sqlmap tool + [99] Back + """) + choice =input("Z4nzu =>> ") + if choice == "1": + clearScr() + sqlmap() + elif choice == "99": + menu() + else : + menu() + +def sqlmap(): + os.system("echo \"[!]sqlmap is an open source penetration testing tool that automates the process of \ndetecting and exploiting SQL injection flaws and taking over of database servers\"|boxes -d boy | lolcat") + userchoice = input("[1]Install [2]Run [99]Back >> ") + if userchoice == "1": + os.system("sudo git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev") + print("Downloaded Successfully..!!") + sqltool() + elif userchoice == "2": + os.system("cd sqlmap-dev && python sqlmap.py -h") + os.system("echo \"[!]python sqlmap.py -u [] --batch --banner \n[!]For More Usage : https://github.com/sqlmapproject/sqlmap/wiki/Usage \"|boxes -d boy") + elif userchoice == "99": + sqltool() + else : + menu() + +def others(): + print(""" + [1]Ddos Attack Tools + [2]SMWYG-Show-Me-What-You-Got (1.4 Billion Clear Text Password) + [99]BAck + """) + choice = input("Z4nzu =>>") + if choice == "1": + clearScr() + Ddos() + elif choice == "2": + clearScr() + showme() + elif choice == "99": + menu() + elif choice == "": + others() + else : + menu() + +def showme(): + print("""This tool allows you to perform OSINT and reconnaissance on an organisation or an individual. + It allows one to search 1.4 Billion clear text credentials which was dumped as part of BreachCompilation + leak This database makes finding passwords faster and easier than ever before. + """) + userchoice = input("[1]Install [2]Run [99]Back >>") + if userchoice == "1": + os.system("sudo git clone https://github.com/Viralmaniar/SMWYG-Show-Me-What-You-Got.git") + os.system("cd SMWYG-Show-Me-What-You-Got && pip3 install -r requirements.txt ") + others() + elif userchoice == "2": + os.system("cd SMWYG-Show-Me-What-You-Got && python SMWYG.py") + elif userchoice == "99": + others() + else : + menu() + +def updatesys(): + os.system("sudo apt update && sudo apt full-upgrade -y") + os.system("sudo apt-get install tor openssl curl && sudo apt-get update tor openssl curl ") + os.system("sudo apt-get install python3-pip") + menu() + +def clearScr(): + if system() == 'Linux': + os.system('clear') + if system() == 'Windows': + os.system('cls') + +if __name__ == "__main__": + notuser =getpass.getuser() + user=os.getenv("SUDO_UID") + uname=os.getenv("SUDO_USER") + try: + if system() == 'Linux': + # if path.exists("/home/{0}/Desktop/".format(user)): + # os.chdir("/home/{0}/Desktop/".format(user)) + # if os.path.isdir('hackingtool'): + # os.chdir("/home/{0}/Desktop/hackingtool/".format(user)) + # menu() + # else : + # os.system("mkdir hackingtool") + # os.chdir("/home/{0}/Desktop/hackingtool/".format(user)) + # menu() + if os.geteuid() != 0: + os.chdir("/home/{0}/Desktop/".format(notuser)) + if os.path.isdir('hackingtool'): + os.chdir("/home/{0}/Desktop/hackingtool/".format(notuser)) + menu() + else: + os.system("mkdir hackingtool") + os.chdir("/home/{0}/Desktop/hackingtool/".format(notuser)) + menu() + elif os.geteuid() == 0: + os.chdir("/home/{0}/Desktop/".format(uname)) + if os.path.isdir('hackingtool'): + os.chdir("/home/{0}/Desktop/hackingtool/".format(uname)) + menu() + else: + os.system("mkdir hackingtool") + os.chdir("/home/{0}/Desktop/hackingtool/".format(uname)) + menu() + elif uname == 'None': + os.chdir("/home/{0}/Desktop/".format(notuser)) + if os.path.isdir('hackingtool'): + os.chdir("/home/{0}/Desktop/hackingtool/".format(notuser)) + menu() + else: + os.system("mkdir hackingtool") + os.chdir("/home/{0}/Desktop/hackingtool/".format(notuser)) + menu() + else : + print("Sorry ...!!") + elif path.exists('/data'): + os.chdir("data/data/com.termux/files/home/") + if os.path.isdir('hackingtool'): + os.chdir("data/data/com.termux/files/home/hackingtool/") + menu() + else : + os.system("mkdir hackingtool") + os.chdir("data/data/com.termux/files/home/hackingtool/") + menu() + except KeyboardInterrupt: + + print("\n Sorry ..!!!") + time.sleep(3)