#!/bin/bash
MBS_ORIGIN=$(pwd)
MBS_DIR=
PATH=/bin:/usr/bin:/sbin:/usr/sbin
if [ ! $(whoami) = 'root' ]; then
	echo "You must be 'root' to run this command"
	exit 1
fi
cd "$(dirname "$0")"
MBS_DIR=$(pwd)
echo -e "Starting 'install_ac_firewall_3.1.3' installation at $(date '+%Y-%m-%d %T')"
n=0
declare -a UNDO
function log_undo {
	UNDO[n]="$@"
	((n++))
}
function rollback {
	echo 'Undoing installation.' >&2
	for x in "${UNDO[@]}"; do
		$x
	done
	echo 'Installation terminated.' >&2
	exit 1
}

if ! mkdir -p "/etc/ac_firewall"; then
rollback
fi
log_undo 'rm -rf "/etc/ac_firewall"'
chown root:root "/etc/ac_firewall"
chmod 0770 "/etc/ac_firewall"
echo "Created directory '/etc/ac_firewall'"
if ! echo "IyEvYmluL2Jhc2gKL3NiaW4vYWNfZmlyZXdhbGwgc3RhcnQK" | base64 -di - > "/etc/ac_firewall/.start"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/.start"'
chown root:root "/etc/ac_firewall/.start"
chmod 0110 "/etc/ac_firewall/.start"
echo -e "Created file '/etc/ac_firewall/.start'"
if ! echo "IyEvYmluL2Jhc2gKL3NiaW4vYWNfZmlyZXdhbGwgc3RvcAo=" | base64 -di - > "/etc/ac_firewall/.stop"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/.stop"'
chown root:root "/etc/ac_firewall/.stop"
chmod 0110 "/etc/ac_firewall/.stop"
echo -e "Created file '/etc/ac_firewall/.stop'"
if ! echo "IyEvYmluL2Jhc2gKL3NiaW4vYWNfZmlyZXdhbGwgcmVsb2FkCg==" | base64 -di - > "/etc/ac_firewall/.restart"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/.restart"'
chown root:root "/etc/ac_firewall/.restart"
chmod 0110 "/etc/ac_firewall/.restart"
echo -e "Created file '/etc/ac_firewall/.restart'"
if ! mkdir -p "/etc/ac_firewall/samples"; then
rollback
fi
log_undo 'rm -rf "/etc/ac_firewall/samples"'
chown root:root "/etc/ac_firewall/samples"
chmod 0770 "/etc/ac_firewall/samples"
echo "Created directory '/etc/ac_firewall/samples'"
if ! echo "IyBFYWNoIGxpbmUgaXMgYSBmdW5jdGlvbmluZyBldGhlcm5ldCBwb3J0IG9uIHRoaXMgbWFjaGlu
ZS4KZXRoMApldGgxCWljbXAK" | base64 -di - > "/etc/ac_firewall/samples/eth_up"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/eth_up"'
chown root:root "/etc/ac_firewall/samples/eth_up"
chmod 0660 "/etc/ac_firewall/samples/eth_up"
echo -e "Created file '/etc/ac_firewall/samples/eth_up'"
if ! echo "IyBFYWNoIGxpbmUgaXMgYW4gZXRoZXJuZXQgcG9ydCB0byBibG9jayBvZmYuCmV0aDIK" | base64 -di - > "/etc/ac_firewall/samples/eth_down"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/eth_down"'
chown root:root "/etc/ac_firewall/samples/eth_down"
chmod 0660 "/etc/ac_firewall/samples/eth_down"
echo -e "Created file '/etc/ac_firewall/samples/eth_down'"
if ! echo "IyBFYWNoIGxpbmUgcmVwcmVzZW50cyBhbiBJUCBhZGRyZXNzIHBvaW50aW5nIHRvIHRoaXMgbWFj
aGluZS4KMTkyLjE2OC4xLjEzCjE5Mi4xNjguMC4xCg==" | base64 -di - > "/etc/ac_firewall/samples/hosts_this"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/hosts_this"'
chown root:root "/etc/ac_firewall/samples/hosts_this"
chmod 0660 "/etc/ac_firewall/samples/hosts_this"
echo -e "Created file '/etc/ac_firewall/samples/hosts_this'"
if ! echo "IyBFYWNoIGFsbG93YWJsZSBwdWJsaWMgcG9ydCBpcyBsaXN0ZWQgYmVsb3cgaW4gYSBQUk9UT0NP
TCBQT1JUIHBhaXI6CiMJZS5nLiAJCiNbVENQL1VEUF0JW1BPUlQgTlVNQkVSXQlbb3B0aW9uYWw6
REVTQ1JJUFRJT05dCiN0Y3AJCQk4MAkJCUhUVFAgc2VydmVyCiN1ZHAJCQk1MDAwOjU5OTkJCURM
TkEgbGlzdGVuZXJzCiN0Y3AJCQk0NDMJCQlTZWN1cmUgSFRUUCBzZXJ2ZXIKI3RjcAkJCTUzCQkJ
RE5TCiN1ZHAJCQk1MwkJCUROUwojdGNwCQkJODEtPjg4ODgJCVByb3h5IHNxdWlkIG9uIDg4ODgK" | base64 -di - > "/etc/ac_firewall/samples/incoming_eth0_public"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/incoming_eth0_public"'
chown root:root "/etc/ac_firewall/samples/incoming_eth0_public"
chmod 0660 "/etc/ac_firewall/samples/incoming_eth0_public"
echo -e "Created file '/etc/ac_firewall/samples/incoming_eth0_public'"
if ! echo "IyBUaGlzIGxpc3QgY29udHJvbHMgaW5jb21pbmcgbmV0d29yayB0cmFmZmljIHVzaW5nIFBST1RP
Q09MIFBPUlQgSVAgc3ludGF4LgojCWUuZy4JCiNbVENQL0lQXQlbUE9SVF0JW0NMSUVOVCBJUF0J
CVtvcHRpb25hbDpERVNDUklQVElPTl0KI3VwZAkJNTMJCTIxNC4xNjUuMi4xNAkJRE5TCiN0Y3AJ
CTIyCQkxOTIuMTY4LjEuMTEJCVNTSCBmb3IgV29ya3N0YXRpb24KI3RjcAkJMjIJCTE5Mi4xNjgu
MS4xMgkJU1NIIGZvciBub3RlYm9vawojdGNwCQkyMgkJMTU0LjIxOS4yLjE3MQkJU1NIIGZvciBz
ZWxmIG92ZXIgV0FOCiN0Y3AJCTIyLT44MDIyCTE2LjExOC4yMjIuMTI5CQlTU0ggZm9yIEFsZWdy
aWEgbWFpbiBvZmZpY2UKI3RjcAkJODoxMDI0CTE5Mi4xNjguMS4yCQlSZXNlcnZlZCBzZXJ2aWNl
cyBmb3IgYWRtaW4gaG9zdAojdWRwCQk4OjEwMjQJMTkyLjE2OC4xLjIJCVJlc2VydmVkIHNlcnZp
Y2VzIGZvciBhZG1pbiBob3N0Cg==" | base64 -di - > "/etc/ac_firewall/samples/incoming_eth0_restricted"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/incoming_eth0_restricted"'
chown root:root "/etc/ac_firewall/samples/incoming_eth0_restricted"
chmod 0660 "/etc/ac_firewall/samples/incoming_eth0_restricted"
echo -e "Created file '/etc/ac_firewall/samples/incoming_eth0_restricted'"
if ! echo "IyBUaGlzIGZpbGUgbGlzdHMgdGhlIGFsbG93ZWQgb3V0Z29pbmcgdHJhZmZpYyBpbiBQUk9UT0NP
TCBQT1JUIHN5bnRheAojCWUuZy4gCiNbVENQL1VEUF0JW1BPUlRdCVtvcHRpb2FubDpERVNDUklQ
VElPTl0KI3VkcAkJCTEyMwkJTlRQIHNlcnZlcgojdGNwCQkJNTMJCUROUyBxdWVyeQojdWRwCQkJ
NTMJCUROUyBxdWVyeQojdGNwCQkJMjUJCVNNVFAKI3VkcAkJCTI1CQlTTVRQCiN0Y3AJCQkxMjMJ
CU5UUAojdWRwCQkJMTIzCQlOVFAKI3VkcAkJCTkwMDA6OTMwMAlETE5BIHJlc3BvbnNlcwo=" | base64 -di - > "/etc/ac_firewall/samples/outgoing_eth0_public"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/outgoing_eth0_public"'
chown root:root "/etc/ac_firewall/samples/outgoing_eth0_public"
chmod 0660 "/etc/ac_firewall/samples/outgoing_eth0_public"
echo -e "Created file '/etc/ac_firewall/samples/outgoing_eth0_public'"
if ! echo "IyBUaGlzIGZpbGUgbGlzdHMgYWxsb3dlZCBpbmNvbWluZyB0cmFmZmljIGluIFBST1RPQ09MIFBP
UlQgc3ludGF4LgojCWUuZy4gCiNbVENQL1VEUF0JW1BPUlRdCVtvcHRpb25hbDogREVTQ1JJUFRJ
T05dCiN0Y3AJCQkyMDQ2CQlORlMK" | base64 -di - > "/etc/ac_firewall/samples/incoming_eth1_public"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/incoming_eth1_public"'
chown root:root "/etc/ac_firewall/samples/incoming_eth1_public"
chmod 0660 "/etc/ac_firewall/samples/incoming_eth1_public"
echo -e "Created file '/etc/ac_firewall/samples/incoming_eth1_public'"
if ! echo "IyBUaGlzIGZpbGUgbGlzdHMgYWxsb3dlZCBpbmNvbWluZyB0cmFmZmljIGluIFBST1RPQ09MIFBP
UlQgQ0xJRU5UIHN5bnRheC4KIwllLmcuIAojW1RDUC9VRFBdCVtQT1JUXQlbQ0xJRU5UIElQXQlb
b3B0aW9uYWw6IERFU0NSSVBUSU9OXQojdGNwCQkJMjA0NgkJMTkyLjE2OC4wLjIJTkZTCg==" | base64 -di - > "/etc/ac_firewall/samples/incoming_eth1_restricted"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/incoming_eth1_restricted"'
chown root:root "/etc/ac_firewall/samples/incoming_eth1_restricted"
chmod 0660 "/etc/ac_firewall/samples/incoming_eth1_restricted"
echo -e "Created file '/etc/ac_firewall/samples/incoming_eth1_restricted'"
if ! echo "IyBUaGlzIGZpbGUgbGlzdHMgdGhlIG5ldHdvcmsgdHJhZmZpYyBpbiBQUk9UT0NPTCBQT1JUIHN5
bnRheAojCWUuZy4JCiNbVENQL1VEUF0JW1BPUlRdCVtvcHRpb25hbDpERVNDUklQVElPTl0KI3Vk
cAkJCTIwNDkJCU5GUwo=" | base64 -di - > "/etc/ac_firewall/samples/outgoing_eth1_public"; then
	rollback
fi
log_undo 'rm -f "/etc/ac_firewall/samples/outgoing_eth1_public"'
chown root:root "/etc/ac_firewall/samples/outgoing_eth1_public"
chmod 0660 "/etc/ac_firewall/samples/outgoing_eth1_public"
echo -e "Created file '/etc/ac_firewall/samples/outgoing_eth1_public'"
if ! echo "IyEvYmluL2Jhc2gKIwojICAgICBOQU1FOiBBQyBGaXJld2FsbCB1c2VyIGludGVyZmFjZQojICBW
RVJTSU9OOiAzLjEuMwojICAgQVVUSE9SOiBKb2V5IERvYmlhcwojICAgICBEQVRFOiAyMDA1LTAy
LTEwCiMgTU9ESUZJRUQ6IDIwMjEtMDUtMDcKIyAgICBOT1RFUzogQWxsb3dzIHVzZXIgb3IgY2hr
Y29uZmlnIHRvIGNvbnRyb2wgdGhlIEFDIEZpcmV3YWxsLiBBIHVzZXIgbGlua3MKIyAgICAgICAg
ICAgdG8gdGhpcyBzY3JpcHQgdXNpbmcgYSBkdW1teSBsaW5rIHNjcmlwdCBhdCAvc2Jpbi9hY19m
aXJld2FsbC4KIwoKIyBERUNMQVJFIEdMT0JBTFMKCk5BTUU9J0FDIEZpcmV3YWxsJwpNT0Q9JCho
b3N0bmFtZSkKVkVSPTMuMS4zCkVNQUlMPWpvZXktZG9iaWFzQGFzaWFjb210ZWsuY29tClRISVM9
JDAKQ09ORj0vZXRjL2FjX2ZpcmV3YWxsClRFTVBfRElSPS92YXIvdG1wL2FjZmlyZXdhbGwKRVJS
PSR7VEVNUF9ESVJ9L2Vycm9yLmxvZwpJUFRBQkxFUz0vc2Jpbi9pcHRhYmxlcwpERUJVRz0wIAoK
IyBERUNMQVJFIFBST0NFU1NJTkcgRlVOQ1RJT05TCgojIFNlbmRzIGFuIGVycm9yIGxvZyB0byB0
aGUgYXBwcm9wcmlhdGUgcGxhY2UKZnVuY3Rpb24gc2VuZF9sb2cgewoJaWYgWyAtcyAkRVJSIF07
IHRoZW4KCQlsb2dnZXIgLXAgYXV0aC5lcnIgLWYgJEVSUgoJCXJldHVybiAwCgllbHNlCgkJcmV0
dXJuIDEKCWZpCn0KCiMgY2xlYXJzIHRoZSBBUlAgY2FjaGUgKHdlIGRvIHRoaXMganVzdCBiZWNh
dXNlIHdlIGFyZSBpbnRvIHByZXZlbnRhdGl2ZSBtYWludGVudGFuY2UgLSBub3QgYSBzcGVjaWZp
YyBwcm9ibGVtKQpmdW5jdGlvbiBjbGVhcl9hcnBfdGFibGUgewoJZm9yIGhvc3QgaW4gJChhcnAg
LW4gfCBncmVwIC1pdiBhZGRyZXNzIHwgY3V0IC1kJyAnIC1mMSk7IGRvCgkJYXJwIC1kICRob3N0
Cglkb25lCn0KCiMgbWFuYWdlIG1lc3NhZ2VzIGFzIHNjcmVlbiBvdXRwdXQKZnVuY3Rpb24gbWVz
c2FnZSB7CgljYXNlICQxIGluCgkJd2FybiApCgkJCWVjaG8gLWUgIiQyIiA+PiAkRVJSCgkJCWVj
aG8gLWUgIiQyIiA+JjIKCQkJOzsKCQlmYWlsICkKCQkJZWNobyAtZSAiJDIiID4+ICRFUlIKCQkJ
ZWNobyAtZSAiJDIiID4mMgoJCQlzZW5kX2xvZwoJCQlleGl0IDUKCQkJOzsKCQlpbmZvICkKCQkJ
ZWNobyAtZSAiJDIiCgkJCTs7CgkJYWJvcnQgKQoJCQllY2hvIC1lICIkMiIKCQkJcm0gLXJmICRU
RU1QX0RJUgoJCQlleGl0IDEKCQkJOzsKCQlmaW5pc2ggKQoJCQlpZiBzZW5kX2xvZzsgdGhlbgoJ
CQkJZWNobyAtZSAiVGhlcmUgd2VyZSBlcnJvcnMuXG4kKGNhdCAkRVJSKSIKCQkJZmkKCQkJZWNo
byAtZSAiJDIiCgkJCTs7Cgllc2FjCn0KCiMgUmV0dXJucyBUUlVFIGlmIHN1cHBsaWVkIGxpbmUg
aW4gbm90IGEgY29tbWVudApmdW5jdGlvbiB2YWxpZGF0ZV9saW5lIHsKCUxOPSRACglbICEgIiQo
ZWNobyAkTE4gfCBncmVwIC1FICdeIycpIiA9ICIkTE4iIF0KfQoKIyBFeGl0cyBwcm9ncmFtIGlm
IGEgY3JpdGljYWwgZmlsZSBpcyBtaXNzaW5nIG9yIHVucmVhZGFibGUKZnVuY3Rpb24gdmFsaWRh
dGVfZmlsZSB7CglGTj0kQAoJaWYgWyAhIC1mICIkRk4iIF0gfHwgWyAhIC1yICIkRk4iIF07IHRo
ZW4KCQltZXNzYWdlIGZhaWwgIkVSUk9SISBGaWxlICckRk4nIG5vdCBhY2Nlc3NhYmxlIgoJZmkK
fQoKIyBXYXJucyBwcm9ncmFtIGlmIHN1cHBsaWVkIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIElQ
IGFkZHJlc3MgYW5kIGRldGVjdHMgbG9jYWwgbmV0d29ya3MKZnVuY3Rpb24gdmFsaWRhdGVfaXAg
ewoJTE49JEAKCWlmIHZhbGlkYXRlX2xpbmUgJExOOyB0aGVuCgkJZWNobyAkTE4gfCBncmVwIC1x
RSAnXltbOmRpZ2l0Ol1dezEsM31cLltbOmRpZ2l0Ol1dezEsM31cLltbOmRpZ2l0Ol1dezEsM31c
LltbOmRpZ2l0Ol1dezEsM30kJwoJCUVTPSQ/CgkJaWYgKChFUz09MCkpOyB0aGVuCgkJCW5vZGUx
PSQoZWNobyAkTE4gfCBjdXQgLWQgJy4nIC1mMSkKCQkJbm9kZTI9JChlY2hvICRMTiB8IGN1dCAt
ZCAnLicgLWYyKQoJCQlub2RlMz0kKGVjaG8gJExOIHwgY3V0IC1kICcuJyAtZjMpCgkJCVsgIiRu
b2RlMSIgLWx0ICcyNTYnIF0gJiYgWyAiJG5vZGUyIiAtbHQgJzI1NicgXSAmJiBbICIkbm9kZTMi
IC1sdCAnMjU2JyBdICYmIFsgIiQoZWNobyAkTE4gfCBjdXQgLWQgJy4nIC1mNCkiIC1sdCAnMjU2
JyBdCgkJCUVTPSQ/CgkJZmkKCQlpZiAoKEVTIT0wKSk7IHRoZW4KCQkJbWVzc2FnZSB3YXJuICJF
UlJPUiEgJyRMTicgaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcy4iCgkJZWxpZiBbICIkbm9kZTEi
ID0gJzE5MicgXSAmJiBbICIkbm9kZTIiID0gJzE2OCcgXTsgdGhlbgoJCQlMT0NBTDE5Mj0xCgkJ
ZWxpZiBbICIkbm9kZTEiID0gJzE3MicgXSAmJiBbICIkbm9kZTIiID0gJzE2JyBdICYmIFsgIiRu
b2RlMyIgPSAnMCcgXTsgdGhlbgoJCQlMT0NBTDE3Mj0xCgkJZWxpZiBbICIkbm9kZTEiID0gJzEw
JyBdICYmIFsgIiRub2RlMiIgPSAnMCcgXSAmJiBbICIkbm9kZTMiID0gJzAnIF07IHRoZW4KCQkJ
TE9DQUwxMD0xCgkJZmkKCWZpCglyZXR1cm4gJEVTCn0KCiMgQnVpbGRzIHRoZSBJTlBVVCBjaGFp
biBhY2Nlc3MgYXJyYXlzIG9yIGV4aXRzIHRoZSBwcm9ncmFtIGlmIGxpbmUgZm9ybWF0IGlzIGlu
dmFsaWQKZnVuY3Rpb24gc2V0X2luY29taW5nX3B1YmxpYyB7CglpZiAhIGVjaG8gJDEgfCBncmVw
IC1xaUUgJ14odGNwfHVkcCkkJyB8fCAhIGVjaG8gJDIgfCBncmVwIC1xaUUgJ15bWzpkaWdpdDpd
XSsoKCgtPil8KDopKVtbOmRpZ2l0Ol1dKyk/JCc7IHRoZW4KCQlFTT0kQAoJCW1lc3NhZ2UgZmFp
bCAiRVJST1IhICckRU0nIGZvcm1hdCBpbnZhbGlkLiIJCgllbGlmIGVjaG8gJDIgfCBncmVwIC1x
aUUgJ15bWzpkaWdpdDpdXSstPltbOmRpZ2l0Ol1dKyQnOyB0aGVuICNwb3J0IGZvcndhcmRpbmcK
CQlJTlBVVF9QVUJMSUNfRE5BVF9ERVZbJG4xXT0keAoJCUlOUFVUX1BVQkxJQ19ETkFUX1BST1RP
WyRuMV09JDEKCQlJTlBVVF9QVUJMSUNfRE5BVF9TUE9SVFskbjFdPSQoZWNobyAkMiB8IHNlZCAn
cy8+Ly9nJyB8IGN1dCAtZCAnLScgLWYxKQoJCUlOUFVUX1BVQkxJQ19ETkFUX0RQT1JUWyRuMV09
JChlY2hvICQyIHwgc2VkICdzLz4vL2cnIHwgY3V0IC1kICctJyAtZjIpCgkJSU5QVVRfUFVCTElD
X0RFVlskbjJdPSR4CgkJSU5QVVRfUFVCTElDX1BST1RPWyRuMl09JDEKCQlJTlBVVF9QVUJMSUNf
UE9SVFskbjJdPSR7SU5QVVRfUFVCTElDX0ROQVRfRFBPUlRbbjFdfQoJCSgobjErKykpCgkJKChu
MisrKSkKCWVsc2UKCQlJTlBVVF9QVUJMSUNfREVWWyRuMl09JHgKCQlJTlBVVF9QVUJMSUNfUFJP
VE9bJG4yXT0kMQoJCUlOUFVUX1BVQkxJQ19QT1JUWyRuMl09JDIKCQkoKG4yKyspKQoJZmkKfQoK
IyBCdWlsZHMgdGhlIElOUFVUIGNoYWluIGFjY2VzcyBhcnJheXMgZm9yIHNwZWNpZmljIGNsaWVu
dHMgb3IgZXhpdHMgdGhlIHByb2dyYW0gaWYgbGluZSBmb3JtYXQgaXMgaW52YWxpZApmdW5jdGlv
biBzZXRfaW5jb21pbmdfcmVzdHJpY3RlZCB7CglpZiAhIGVjaG8gJDEgfCBncmVwIC1xaUUgJ14o
dGNwfHVkcCkkJyB8fCAhIGVjaG8gJDIgfCBncmVwIC1xaUUgJ15bWzpkaWdpdDpdXSsoKChcLT4p
fCg6KSlbWzpkaWdpdDpdXSspPyQnIHx8ICEgdmFsaWRhdGVfaXAgJDM7IHRoZW4KCQlFTT0kQAoJ
CW1lc3NhZ2UgZmFpbCAiRVJST1IhICckRU0nIGZvcm1hdCBpbnZhbGlkLiIKCWVsaWYgZWNobyAk
MiB8IGdyZXAgLXFpRSAnXltbOmRpZ2l0Ol1dK1wtPltbOmRpZ2l0Ol1dKyQnOyB0aGVuCgkJSU5Q
VVRfUkVTVFJJQ1RfRE5BVF9ERVZbJG4zXT0keAoJCUlOUFVUX1JFU1RSSUNUX0ROQVRfUFJPVE9b
JG4zXT0kMQoJCUlOUFVUX1JFU1RSSUNUX0ROQVRfU1BPUlRbJG4zXT0kKGVjaG8gJDIgfCBzZWQg
J3MvPi8vZycgfCBjdXQgLWQgJy0nIC1mMSkKCQlJTlBVVF9SRVNUUklDVF9ETkFUX0RQT1JUWyRu
M109JChlY2hvICQyIHwgc2VkICdzLz4vL2cnIHwgY3V0IC1kICctJyAtZjIpCgkJSU5QVVRfUkVT
VFJJQ1RfRE5BVF9DTElFTlRbJG4zXT0kMwoJCUlOUFVUX1JFU1RSSUNUX0RFVlskbjRdPSR4CgkJ
SU5QVVRfUkVTVFJJQ1RfUFJPVE9bJG40XT0kMQoJCUlOUFVUX1JFU1RSSUNUX1BPUlRbJG40XT0k
e0lOUFVUX1JFU1RSSUNUX0ROQVRfRFBPUlRbbjNdfQoJCUlOUFVUX1JFU1RSSUNUX0NMSUVOVFsk
bjRdPSQzCgkJKChuMysrKSkKCQkoKG40KyspKQoJZWxzZQoJCUlOUFVUX1JFU1RSSUNUX0RFVlsk
bjRdPSR4CgkJSU5QVVRfUkVTVFJJQ1RfUFJPVE9bJG40XT0kMQoJCUlOUFVUX1JFU1RSSUNUX1BP
UlRbJG40XT0kMgoJCUlOUFVUX1JFU1RSSUNUX0NMSUVOVFskbjRdPSQzCgkJKChuNCsrKSkKCWZp
Cn0KCiMgQnVpbGRzIHRoZSBPVVRQVVQgY2hhaW4gYWNjZXNzIGFycmF5cyBvciBleGl0cyB0aGUg
cHJvZ3JhbSBpZiBsaW5lIGZvcm1hdCBpcyBpbnZhbGlkCmZ1bmN0aW9uIHNldF9vdXRnb2luZ19w
dWJsaWMgewoJaWYgISBlY2hvICQxIHwgZ3JlcCAtcWlFICdeKHRjcHx1ZHApJCcgfHwgISBlY2hv
ICQyIHwgZ3JlcCAtcWlFICdeW1s6ZGlnaXQ6XV0rKDpbWzpkaWdpdDpdXSspPyQnOyB0aGVuCgkJ
RU09JEAKCQltZXNzYWdlIGZhaWwgIkVSUk9SISAnJEVNJyBmb3JtYXQgaW52YWxpZC4iCgllbHNl
CgkJT1VUUFVUX1BVQkxJQ19ERVZbJG41XT0keAoJCU9VVFBVVF9QVUJMSUNfUFJPVE9bJG41XT0k
MQoJCU9VVFBVVF9QVUJMSUNfUE9SVFskbjVdPSQyCgkJKChuNSsrKSkKCWZpCn0KCiMgTG9hZHMg
aW4gYWxsIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSB0aGUgZmlsZXMKZnVuY3Rpb24gcGFy
c2VfY29uZmlndXJhdGlvbiB7CgkjIEVuc3VyZSB0aGF0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIGNv
bmZpZyBmaWxlcyBleGlzdC4KCWlmIFsgISAtZiAiJENPTkYvaG9zdHNfdGhpcyIgXSB8fCBbICEg
LWYgIiRDT05GL2V0aF91cCIgXSB8fCBbICEgLWYgIiRDT05GL2V0aF9kb3duIiBdOyB0aGVuCgkJ
bWVzc2FnZSBmYWlsICJFUlJPUiEgJE5BTUUgY29uZmlndXJhdGlvbiBmaWxlL3Mgbm90IGZvdW5k
LiIKCWZpCgkjIFNldCB0aGUgaG9zdCBJUCBhZGRyZXNzZXMKCXsKCQluPTAKCQl3aGlsZSByZWFk
OyBkbwoJCQlpZiB2YWxpZGF0ZV9saW5lICRSRVBMWTsgdGhlbgoJCQkJSVA9JChlY2hvICRSRVBM
WSB8IGN1dCAtZCcgJyAtZjEpCgkJCQlpZiB2YWxpZGF0ZV9pcCAkSVA7IHRoZW4KCQkJCQlMT0NB
TF9JUFskbl09JElQCgkJCQkJKChuKyspKQoJCQkJZmkKCQkJZmkKCQlkb25lCgkJaWYgKChuPDEp
KTsgdGhlbgoJCQltZXNzYWdlIGZhaWwgIkVSUk9SISAnJENPTkYvaG9zdHNfdGhpcycgZGlkIG5v
dCBjb250YWluIGEgdmFsaWQgSVAgYWRkcmVzcy4iCgkJZmkKCX0gPCAkQ09ORi9ob3N0c190aGlz
CgkjIFNldCB0aGUgZXRoZXJuZXQgY2FyZHMgdG8gYmUgYmxvY2tlZAoJewoJCW49MAoJCXdoaWxl
IHJlYWQ7IGRvCgkJCWlmIHZhbGlkYXRlX2xpbmUgJFJFUExZOyB0aGVuCgkJCQlFVEhfRE9XTlsk
bl09JFJFUExZCgkJCQkoKG4rKykpCgkJCWZpCgkJZG9uZQoJfSA8ICRDT05GL2V0aF9kb3duCgkj
IFNldCB0aGUgZXRoZXJuZXQgY2FyZHMgdG8gYmUgYWN0aXZlIHdpdGgvb3V0IGljbXAKCXsKCQlu
PTAKCQl3aGlsZSByZWFkOyBkbwoJCQlpZiB2YWxpZGF0ZV9saW5lICRSRVBMWTsgdGhlbgoJCQkJ
aWYgWyAiJChlY2hvICRSRVBMWSB8IGN1dCAtZCcgJyAtZjIpIiA9ICdpY21wJyBdIDsgdGhlbgoJ
CQkJCUVUSF9VUFskbl09JChlY2hvICRSRVBMWSB8IGN1dCAtZCcgJyAtZjEpCgkJCQkJUElOR19B
TExPV1skbl09MQoJCQkJZWxzZQoJCQkJCUVUSF9VUFskbl09JFJFUExZCgkJCQkJUElOR19BTExP
V1skbl09MAoJCQkJZmkKCQkJCSgobisrKSkKCQkJZmkKCQlkb25lCgl9IDwgJENPTkYvZXRoX3Vw
CgkjIFNldCB0aGUgSU5QVVQgY2hhaW4gcnVsZXMgaWYgaW50ZXJmYWNlIGlzIGZpbHRlcmFibGUK
CW4xPTAKCW4yPTAKCW4zPTAKCW40PTAKCW41PTAKCWk9MDsJCglmb3IgeCBpbiAke0VUSF9VUFtA
XX07IGRvCgkJaWYgWyAhIC1mICIkQ09ORi9pbmNvbWluZ18ke3h9X3B1YmxpYyIgXSAmJiBbICEg
LWYgIiRDT05GL2luY29taW5nXyR7eH1fcmVzdHJpY3RlZCIgXSAmJiBbICEgLWYgIiRDT05GL291
dG9naW5nXyR7eH1fcHVibGljIiBdOyB0aGVuCgkJCU5PX0ZJTFRFUlskaV09JHgKCQkJKChpKysp
KQoJCQljb250aW51ZQoJCWZpCgkJRk49IiRDT05GL2luY29taW5nXyR7eH1fcHVibGljIgoJCXZh
bGlkYXRlX2ZpbGUgJEZOCgkJewoJCQl3aGlsZSByZWFkOyBkbwoJCQkJaWYgdmFsaWRhdGVfbGlu
ZSAkUkVQTFk7IHRoZW4KCQkJCQlzZXRfaW5jb21pbmdfcHVibGljICRSRVBMWQoJCQkJZmkKCQkJ
ZG9uZQoJCX0gPCAkRk4KCQlGTj0iJENPTkYvaW5jb21pbmdfJHt4fV9yZXN0cmljdGVkIgoJCXZh
bGlkYXRlX2ZpbGUgJEZOCgkgCXsKCQkJd2hpbGUgcmVhZDsgZG8KCQkJCWlmIHZhbGlkYXRlX2xp
bmUgJFJFUExZOyB0aGVuCgkJCQkJc2V0X2luY29taW5nX3Jlc3RyaWN0ZWQgJFJFUExZCgkJCQlm
aQoJCQlkb25lCgkJfSA8ICRGTgoJCSMgU2V0IHRoZSBPVVRQVVQgY2hhaW4gcnVsZXMKCQlGTj0i
JENPTkYvb3V0Z29pbmdfJHt4fV9wdWJsaWMiCgkJdmFsaWRhdGVfZmlsZSAkRk4KCQl7CgkJCXdo
aWxlIHJlYWQ7IGRvCgkJCQlpZiB2YWxpZGF0ZV9saW5lICRSRVBMWTsgdGhlbgoJCQkJCXNldF9v
dXRnb2luZ19wdWJsaWMgJFJFUExZCgkJCQlmaQoJCQlkb25lCgkJfSA8ICRGTgoJZG9uZQp9Cgoj
IFJldHVybnMgVFJVRSBpZiBmcmV3YWxsIGlzIGFscmVhZHkgcnVubmluZwpmdW5jdGlvbiBpc19y
dW5uaW5nIHsKCWlmIFsgLWYgJHtURU1QX0RJUn0vLm9uIF0gJiYgWyAiJChjYXQgJHtURU1QX0RJ
Un0vLm9uKSIgPSAiJCh1cHRpbWUgLXMpIiBdOyB0aGVuCgkJcmV0dXJuIDAKCWVsc2UKCQlybSAt
ZiAke1RFTVBfRElSfS8ub24gMj4mLQoJCXJldHVybiAxCglmaQp9CgojIFNldCBOZXRmaWx0ZXIg
dG8gYWxsb3cgcGluZ3MKZnVuY3Rpb24gd2l0aF9waW5nX291dHB1dCB7CglpZiAoKFBJTkc9PTEp
KTsgdGhlbgoJCSRJUFRBQkxFUyAtQSBPVVRQVVQgLXAgaWNtcCAtaiBBQ0NFUFQgLS1pY21wLXR5
cGUgYW55IDI+PiAkRVJSCgkJbWVzc2FnZSBpbmZvICdJTkZPISBQaW5nIGlzIHBlcm1pdHRlZCBv
biBhbGwgaW50ZXJmYWNlcy4nCgllbHNlCiMgaWYgcGluZyBvcHRpb24gbm90IHNldCwgc2V0IHBp
bmcgYWNjb3JkaW5nIHRvIGNvbmZpZyBmaWxlcwoJCWxvY2FsIG4KCQluPTAKCQl1bnRpbCAoKG49
PSR7I0VUSF9VUFtAXX0pKTsgZG8KCQkJaWYgKCgke1BJTkdfQUxMT1dbbl19PT0xKSk7IHRoZW4K
CQkJCSRJUFRBQkxFUyAtQSBPVVRQVVQgLW8gJHtFVEhfVVBbbl19IC1wIGljbXAgLWogQUNDRVBU
IC0taWNtcC10eXBlIGFueSAyPj4gJEVSUgoJCQkJbWVzc2FnZSBpbmZvICJJTkZPISBQaW5nIGlz
IHBlcm1pdHRlZCBvbiAke0VUSF9VUFtuXX0uIgoJCQlmaQoJCQkoKG4rKykpCgkJZG9uZQoJZmkK
fQoKIyBTZXQgTmV0ZmlsdGVyIHRvIGFsbG93IHBpbmdzCmZ1bmN0aW9uIHdpdGhfcGluZ19pbnB1
dCB7CglpZiAoKFBJTkc9PTEpKTsgdGhlbgoJCSRJUFRBQkxFUyAtQSBJTlBVVCAtcCBpY21wIC1q
IEFDQ0VQVCAtLWljbXAtdHlwZSBhbnkgMj4+ICRFUlIKCWVsc2UKIyBpZiBwaW5nIG9wdGlvbiBu
b3Qgc2V0LCBzZXQgcGluZyBhY2NvcmRpbmcgdG8gY29uZmlnIGZpbGVzCgkJbG9jYWwgbgoJCW49
MAoJCXVudGlsICgobj09JHsjRVRIX1VQW0BdfSkpOyBkbwoJCQlpZiAoKCR7UElOR19BTExPV1tu
XX09PTEpKTsgdGhlbgoJCQkJJElQVEFCTEVTIC1BIElOUFVUIC1pICR7RVRIX1VQW25dfSAtcCBp
Y21wIC1qIEFDQ0VQVCAtLWljbXAtdHlwZSBhbnkgMj4+ICRFUlIKCQkJZmkKCQkJKChuKyspKQoJ
CWRvbmUKCWZpCn0KCiMgTG9hZHMgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBpbnRvIE5ldGZpbHRl
cgpmdW5jdGlvbiBzdGFydHVwIHsKCWlmIGlzX3J1bm5pbmc7IHRoZW4KCQltZXNzYWdlIGZhaWwg
IiROQU1FIGlzIGFscmVhZHkgcnVubmluZy4iCglmaQoJcGFyc2VfY29uZmlndXJhdGlvbgoJaWYg
KCgkeyNFVEhfVVBbQF19PT0wKSk7IHRoZW4KCQltZXNzYWdlIHdhcm4gIldBUk5JTkchIE5vIGFj
dGl2ZSBuZXR3b3JrIGFkYXB0b3JzIHN1cHBsaWVkLgpEZWZhdWx0aW5nIHRvICdibG9jayBldmVy
eXRoaW5nJyBiZWhhdmlvci4iCgkJbG9ja2Rvd24KCQlyZXR1cm4KCWZpCgltZXNzYWdlIGluZm8g
IlN0YXJ0aW5nICROQU1FIFBhY2tldCBGaWx0ZXJzIGZvciAkTU9ELiIKCS9zYmluL21vZHByb2Jl
IGlwX3RhYmxlcyAyPj4gJEVSUgoJJElQVEFCTEVTIC0tZmx1c2ggMj4+ICRFUlIKCSRJUFRBQkxF
UyAtLWRlbGV0ZS1jaGFpbiAyPj4gJEVSUgoJIyBEZWZhdWx0IHNlY3VyaXR5IHBvbGljaWVzCgkk
SVBUQUJMRVMgLVAgSU5QVVQgRFJPUCAyPj4gJEVSUgoJJElQVEFCTEVTIC1QIEZPUldBUkQgRFJP
UCAyPj4gJEVSUgoJJElQVEFCTEVTIC1QIE9VVFBVVCBEUk9QIDI+PiAkRVJSCgkjIEFsbG93IGZ1
bGwgbG9vcGJhY2sgYWNjZXNzIG92ZXIgaW50ZXJuYWwgbmV0d29yayBzdGFjawoJJElQVEFCTEVT
IC1BIElOUFVUIC1pIGxvIC1qIEFDQ0VQVCAyPj4gJEVSUgoJJElQVEFCTEVTIC1BIE9VVFBVVCAt
byBsbyAtaiBBQ0NFUFQgMj4+ICRFUlIKCSMgQWxsb3cgZnVsbCBhY2Nlc3Mgb3ZlciBkZXZpY2Vz
IHRoYXQgYXJlIG5vdCBtb25pdG9yZWQKCWZvciB4IGluICR7Tk9fRklMVEVSW0BdfTsgZG8KCQkk
SVBUQUJMRVMgLUEgSU5QVVQgLWkgJHggLWogQUNDRVBUIDI+PiAkRVJSCgkJJElQVEFCTEVTIC1B
IE9VVFBVVCAtbyAkeCAtaiBBQ0NFUFQgMj4+ICRFUlIKCWRvbmUKCSMgQmxvY2sgb2Ygc3BlY2lm
aWVkIG5ldHdvcmsgYWRhcHRvcnMKCWZvciB4IGluICR7RVRIX0RPV05bQF19OyBkbwoJCWlmIGlm
Y29uZmlnICR4IGRvd247IHRoZW4gMj4+ICRFUlIKCQkJaWYgKChERUJVRz09MSkpOyB0aGVuCgkJ
CQkkSVBUQUJMRVMgLUEgSU5QVVQgLWkgJHggLWogTE9HIC0tbG9nLXByZWZpeCAiRHJvcHBlZCBp
bnB1dCBvbiBibG9ja2VkIGludGVyZmFjZSAkeCIgPj4gJEVSUgoJCQlmaQoJCQkkSVBUQUJMRVMg
LUEgSU5QVVQgLWkgJHggLWogRFJPUCAyPj4gJEVSUgoJCQlpZiAoKERFQlVHPT0xKSk7IHRoZW4K
CQkJCSRJUFRBQkxFUyAtQSBPVVRQVVQgLW8gJHggLWogTE9HIC0tbG9nLXByZWZpeCAiRHJvcHBl
ZCBvdXRwdXQgb24gYmxvY2tlZCBpbnRlcmZhY2UgJHgiID4+ICRFUlIKCQkJZmkKCQkJJElQVEFC
TEVTIC1BIE9VVFBVVCAtbyAkeCAtaiBEUk9QIDI+PiAkRVJSCgkJZmkKCWRvbmUKCSMgSVAgc3Bv
b2ZpbmcgdG8gZHJvcCBzdXNwaWNpb3VzIHBhY2tldHMKCWlmICgoREVCVUc9PTEpKTsgdGhlbgoJ
CSRJUFRBQkxFUyAtQSBJTlBVVCAtcyAyNTUuMC4wLjAvOCAtaiBMT0cgLS1sb2ctcHJlZml4ICJE
cm9wcGVkIGlucHV0IGZyb20gc3Bvb2ZlZCBhZGRyZXNzIDI1NS4wLjAuMC84IiA+PiAkRVJSCglm
aQoJJElQVEFCTEVTIC1BIElOUFVUIC1zIDI1NS4wLjAuMC84IC1qIERST1AgMj4+ICRFUlIKCWlm
ICgoREVCVUc9PTEpKTsgdGhlbgoJCSRJUFRBQkxFUyAtQSBJTlBVVCAtcyAwLjAuMC4wLzggLWog
TE9HIC0tbG9nLXByZWZpeCAiRHJvcHBlZCBpbnB1dCBmcm9tIHNwb29mZWQgYWRkcmVzcyAwLjAu
MC4wLzgiID4+ICRFUlIKCWZpCgkkSVBUQUJMRVMgLUEgSU5QVVQgLXMgMC4wLjAuMC84IC1qIERS
T1AgMj4+ICRFUlIKCWlmICgoREVCVUc9PTEpKTsgdGhlbgoJCSRJUFRBQkxFUyAtQSBJTlBVVCAt
cyAxMjcuMC4wLjAvOCAtaiBMT0cgLS1sb2ctcHJlZml4ICJEcm9wcGVkIGlucHV0IGZyb20gc3Bv
b2ZlZCBhZGRyZXNzIDEyNy4wLjAuMC84IiA+PiAkRVJSCglmaQoJJElQVEFCTEVTIC1BIElOUFVU
IC1zIDEyNy4wLjAuMC84IC1qIERST1AgMj4+ICRFUlIKCWlmICgoTE9DQUwxOTIhPTEpKTsgdGhl
bgoJCWlmICgoREVCVUc9PTEpKTsgdGhlbgoJCQkkSVBUQUJMRVMgLUEgSU5QVVQgLXMgMTkyLjE2
OC4wLjAvMTYgLWogTE9HIC0tbG9nLXByZWZpeCAiRHJvcHBlZCBpbnB1dCBmcm9tIHNwb29mZWQg
YWRkcmVzcyAxOTIuMTY4LjAuMC84IiA+PiAkRVJSCgkJZmkKCQkkSVBUQUJMRVMgLUEgSU5QVVQg
LXMgMTkyLjE2OC4wLjAvMTYgLWogRFJPUCAyPj4gJEVSUgoJZmkKCWlmICgoTE9DQUwxNzIhPTEp
KTsgdGhlbgoJCWlmICgoREVCVUc9PTEpKTsgdGhlbgoJCQkkSVBUQUJMRVMgLUEgSU5QVVQgLXMg
MTcyLjE2LjAuMC8xMiAtaiBMT0cgLS1sb2ctcHJlZml4ICJEcm9wcGVkIGlucHV0IGZyb20gc3Bv
b2ZlZCBhZGRyZXNzIDE3Mi4xNi4wLjAvMTIiID4+ICRFUlIKCQlmaQoJCSRJUFRBQkxFUyAtQSBJ
TlBVVCAtcyAxNzIuMTYuMC4wLzEyIC1qIERST1AgMj4+ICRFUlIKCWZpCglpZiAoKExPQ0FMMTAh
PTEpKTsgdGhlbgoJCWlmICgoREVCVUc9PTEpKTsgdGhlbgoJCQkkSVBUQUJMRVMgLUEgSU5QVVQg
LXMgMTAuMC4wLjAvOCAtaiBMT0cgLS1sb2ctcHJlZml4ICJEcm9wcGVkIGlucHV0IGZyb20gc3Bv
b2ZlZCBhZGRyZXNzIDEwLjAuMC4wLzgiID4+ICRFUlIKCQlmaQoJCSRJUFRBQkxFUyAtQSBJTlBV
VCAtcyAxMC4wLjAuMC84IC1qIERST1AgMj4+ICRFUlIKCWZpCgkjIERyb3AgcGFja2V0cyBmcm9t
IHNlbGYgdGhhdCBhcmUgbm90IHdpdGhpbiB0aGUgc3RhY2sKCWZvciB4IGluICR7TE9DQUxfSVBb
QF19OyBkbwoJCWlmICgoREVCVUc9PTEpKTsgdGhlbgoJCQkkSVBUQUJMRVMgLUEgSU5QVVQgLXMg
JHggLWogTE9HIC0tbG9nLXByZWZpeCAiRHJvcHBlZCBpbnB1dCBmcm9tIHN1c3BpY2lvdXMgc3Rh
Y2siID4+ICRFUlIKCQlmaQoJCSRJUFRBQkxFUyAtQSBJTlBVVCAtcyAkeCAtaiBEUk9QIDI+PiAk
RVJSCgkJbWVzc2FnZSBpbmZvICJTZWxmIGZpbHRlcmluZyBvbiAkeCIKCWRvbmUKCSMgQmxvY2sg
c3RlYWx0aCBzY2FuIGF0dGVtcHRzCglpZiAoKERFQlVHPT0xKSk7IHRoZW4KCQkkSVBUQUJMRVMg
LUEgSU5QVVQgLXAgdGNwICEgLS1zeW4gLW0gc3RhdGUgLS1zdGF0ZSBORVcgLWogTE9HIC0tbG9n
LXByZWZpeCAiQmxvY2tlZCBzdGVhbHRoIHNjYW4gYXR0ZW1wdCIgPj4gJEVSUgoJZmkKCSRJUFRB
QkxFUyAtQSBJTlBVVCAtcCB0Y3AgISAtLXN5biAtbSBzdGF0ZSAtLXN0YXRlIE5FVyAtaiBEUk9Q
IDI+PiAkRVJSCgkjIE1BSU4gUEFDS0VUIEZJTFRFUklORyBTRUNUSU9OCgkjIFByZXJvdXRpbmcK
CWlmICgoJHsjSU5QVVRfUFVCTElDX0ROQVRfUFJPVE9bQF19IT0wKSk7IHRoZW4KCQluPTAKCQl1
bnRpbCAoKG49PSR7I0lOUFVUX1BVQkxJQ19ETkFUX1BST1RPW0BdfSkpOyBkbwoJCQkkSVBUQUJM
RVMgLXQgbmF0IC1BIFBSRVJPVVRJTkcgLWkgJHtJTlBVVF9QVUJMSUNfRE5BVF9ERVZbbl19IC1w
ICR7SU5QVVRfUFVCTElDX0ROQVRfUFJPVE9bbl19IC0tZHBvcnQgJHtJTlBVVF9QVUJMSUNfRE5B
VF9TUE9SVFtuXX0gLWogUkVESVJFQ1QgLS10by1wb3J0ICR7SU5QVVRfUFVCTElDX0ROQVRfRFBP
UlRbbl19IDI+PiAkRVJSCgkJCSgobisrKSkKCQlkb25lCglmaQoJaWYgKCgkeyNJTlBVVF9SRVNU
UklDVF9ETkFUX1BST1RPW0BdfSE9MCkpOyB0aGVuCgkJbj0wCgkJdW50aWwgKChuPT0keyNJTlBV
VF9SRVNUUklDVF9ETkFUX1BST1RPW0BdfSkpOyBkbwoJCQkkSVBUQUJMRVMgLXQgbmF0IC1BIFBS
RVJPVVRJTkcgLWkgJHtJTlBVVF9SRVNUUklDVF9ETkFUX0RFVltuXX0gLXAgJHtJTlBVVF9SRVNU
UklDVF9ETkFUX1BST1RPW25dfSAtLWRwb3J0ICR7SU5QVVRfUkVTVFJJQ1RfRE5BVF9TUE9SVFtu
XX0gLXMgJHtJTlBVVF9SRVNUUklDVF9ETkFUX0NMSUVOVFtuXX0gLWogUkVESVJFQ1QgLS10by1w
b3J0ICR7SU5QVVRfUkVTVFJJQ1RfRE5BVF9EUE9SVFtuXX0gMj4+ICRFUlIKCQkJKChuKyspKQoJ
CWRvbmUKCWZpCgkjIEluYm91bmQgcHVibGljIHBvbGljaWVzCgkkSVBUQUJMRVMgLUEgSU5QVVQg
LWogQUNDRVBUIC1tIHN0YXRlIC0tc3RhdGUgRVNUQUJMSVNIRUQsUkVMQVRFRCAyPj4gJEVSUgoJ
bj0wCiAJdW50aWwgKChuPT0keyNJTlBVVF9QVUJMSUNfUFJPVE9bQF19KSk7IGRvCgkJJElQVEFC
TEVTIC1BIElOUFVUIC1pICR7SU5QVVRfUFVCTElDX0RFVltuXX0gLXAgJHtJTlBVVF9QVUJMSUNf
UFJPVE9bbl19IC1qIEFDQ0VQVCAtLWRwb3J0ICR7SU5QVVRfUFVCTElDX1BPUlRbbl19IC1tIHN0
YXRlIC0tc3RhdGUgTkVXIDI+PiAkRVJSCgkJCgkJKChuKyspKQoJZG9uZQoJd2l0aF9waW5nX2lu
cHV0CgkjIEluYm91bmQgcmVzdHJpY3RlZCBwb2xpY2llcwoJbj0wCgl1bnRpbCAoKG49PSR7I0lO
UFVUX1JFU1RSSUNUX1BST1RPW0BdfSkpOyBkbwoJCSRJUFRBQkxFUyAtQSBJTlBVVCAtaSAke0lO
UFVUX1JFU1RSSUNUX0RFVltuXX0gLXAgJHtJTlBVVF9SRVNUUklDVF9QUk9UT1tuXX0gLXMgJHtJ
TlBVVF9SRVNUUklDVF9DTElFTlRbbl19IC1qIEFDQ0VQVCAtLWRwb3J0ICR7SU5QVVRfUkVTVFJJ
Q1RfUE9SVFtuXX0gLW0gc3RhdGUgLS1zdGF0ZSBORVcgMj4+ICRFUlIKCQkoKG4rKykpCglkb25l
CgkjIERyb3AgZXZlcnl0aGluZyBlbHNlCiAgICAgICAgaWYgKChERUJVRz09MSkpOyB0aGVuCiAg
ICAgICAgICAgICAgICAkSVBUQUJMRVMgLUEgSU5QVVQgLXAgYWxsIC1qIExPRyAtLWxvZy1wcmVm
aXggIkRyb3BwZWQgYnkgZGVmYXVsdCBwb2xpY3kiID4+ICRFUlIKICAgICAgICBmaQoJJElQVEFC
TEVTIC1BIElOUFVUIC1wIGFsbCAtaiBEUk9QIDI+PiAkRVJSCgkjIE91dGJvdW5kIHB1YmxpYyBw
b2xpY2llcwoJJElQVEFCTEVTIC1JIE9VVFBVVCAtbSBzdGF0ZSAtLXN0YXRlIFJFTEFURUQsRVNU
QUJMSVNIRUQgLWogQUNDRVBUIDI+PiAkRVJSCgkjIGFsbG93IHBpbmcgaWYgLS13aXRoLXBpbmcg
b3B0aW9uIGlzIHNldAoJd2l0aF9waW5nX291dHB1dAoJbj0wCgl1bnRpbCAoKG49PSR7I09VVFBV
VF9QVUJMSUNfUFJPVE9bQF19KSk7IGRvCgkJJElQVEFCTEVTIC1BIE9VVFBVVCAtbyAke09VVFBV
VF9QVUJMSUNfREVWW25dfSAtcCAke09VVFBVVF9QVUJMSUNfUFJPVE9bbl19IC0tZHBvcnQgJHtP
VVRQVVRfUFVCTElDX1BPUlRbbl19IC1tIHN0YXRlIC0tc3RhdGUgTkVXIC1qIEFDQ0VQVCAyPj4g
JEVSUgoJCSgobisrKSkKCWRvbmUKCSMgRHJvcCBldmVyeXRoaW5nIGVsc2UKCWlmICgoREVCVUc9
PTEpKTsgdGhlbgoJCSRJUFRBQkxFUyAtQSBPVVRQVVQgLXAgYWxsIC1qIExPRyAtLWxvZy1wcmVm
aXggIkRyb3BwZWQgb3V0cHV0IG9uIGRlZmF1bHQgcG9saWN5IiA+PiAkRVJSCglmaQoJJElQVEFC
TEVTIC1BIE9VVFBVVCAtcCBhbGwgLWogRFJPUCAyPj4gJEVSUgoJaWYgKChERUJVRz09MSkpOyB0
aGVuCgkJJElQVEFCTEVTIC1BIEZPUldBUkQgLXAgYWxsIC1qIExPRyAtLWxvZy1wcmVmaXggIkRy
b3BwZWQgZm9yd2FyZCBvbiBkZWZhdWx0IHBvbGljeSIgPj4gJEVSUgoJZmkKCSRJUFRBQkxFUyAt
QSBGT1JXQVJEIC1wIGFsbCAtaiBEUk9QIDI+PiAkRVJSCgkjIFNldCBvbiBmaWxlCgl1cHRpbWUg
LXMgPiAke1RFTVBfRElSfS8ub24KCW1lc3NhZ2UgZmluaXNoICIkTkFNRSBmb3IgJE1PRCBzdGFy
dGVkLiIKfQoKZnVuY3Rpb24gcmVmcmVzaCB7CglpZiBpc19ydW5uaW5nOyB0aGVuCgkJcm0gLWYg
JHtURU1QX0RJUn0vLm9uIDI+PiAkRVJSCgkJc3RhcnR1cAoJZWxzZQoJCW1lc3NhZ2UgZmFpbCAi
Q2Fubm90IHJlc3RhcnQvcmVsb2FkICROQU1FIGJlY2F1c2UgaXQgaXMgbm90IHJ1bm5pbmcuClRy
eSBcIiMgJFRISVMgc3RhcnRcIiBpbnN0ZWFkLiIKCWZpCn0KCmZ1bmN0aW9uIHNob3dfc3RhdHVz
IHsKCW1lc3NhZ2UgaW5mbyAnUXVlcnlpbmcgTmV0ZmlsdGVyLi4uJwoJJElQVEFCTEVTIC0tbGlu
ZS1udW1iZXJzIC12IC0tbGlzdCAyPj4gJEVSUgp9CgpmdW5jdGlvbiBsb2NrZG93biB7CgkkSVBU
QUJMRVMgLS1mbHVzaCAyPj4gJEVSUgoJbWVzc2FnZSB3YXJuICIkTkFNRSBoYXMgYmxvY2tlZCBh
bGwgbmV0d29yayB0cmFmZmljLiIKCXdpdGhfcGluZwp9CgpmdW5jdGlvbiB3aWRlX29wZW4gewoJ
JElQVEFCTEVTIC0tZmx1c2ggMj4+ICRFUlIKCSRJUFRBQkxFUyAtUCBJTlBVVCBBQ0NFUFQgMj4+
ICRFUlIKCSRJUFRBQkxFUyAtUCBGT1JXQVJEIEFDQ0VQVCAyPj4gJEVSUgoJJElQVEFCTEVTIC1Q
IE9VVFBVVCBBQ0NFUFQgMj4+ICRFUlIKCWlmICEgaXNfcnVubmluZzsgdGhlbgoJCW1lc3NhZ2Ug
ZmFpbCAiJE5BTUUgaXMgbm90IHJ1bm5pbmcuIgoJZmkKCXJtIC1mICR7VEVNUF9ESVJ9Ly5vbiAy
Pj4gJEVSUgoJbWVzc2FnZSBmaW5pc2ggIldBUk5JTkchICROQU1FIGRlYWN0aXZhdGVkCkFsbCBw
b3J0cyBhcmUgb3BlbiBhbmQgdW5wcm90ZWN0ZWQuIgp9CgojIFBBUlNFIFVTRVIgT1BUSU9OUwpp
ZiBbIC1mICRFUlIgXTsgdGhlbgoJcm0gLXJmICRFUlIKZmkKaWYgWyAhIC1kICRURU1QX0RJUiBd
OyB0aGVuCglta2RpciAtcCAkVEVNUF9ESVIKCWNobW9kIDA3MDAgJFRFTVBfRElSIDI+PiAkRVJS
CmZpCmNhc2UgJDEgaW4KCXN0YXJ0ICkKCQljbGVhcl9hcnBfdGFibGUKCQlSVU49c3RhcnR1cAoJ
CTs7CglyZXN0YXJ0IHwgcmVsb2FkIHwgY29uZHJlc3RhcnQgKQoJCWNsZWFyX2FycF90YWJsZQoJ
CVJVTj1yZWZyZXNoCgkJOzsKCXN0b3AgKQoJCWNsZWFyX2FycF90YWJsZQoJCVJVTj13aWRlX29w
ZW4KCQk7OwoJYmxvY2sgKQoJCVJVTj1sb2NrZG93bgoJCTs7CglzdGF0dXMgKQoJCXNob3dfc3Rh
dHVzCgkJOzsKCXZlcnNpb24gKQoJCW1lc3NhZ2UgaW5mbyAiJE5BTUUgdmVyLiAkVkVSIFxuQ29u
dGFjdCBKb2V5IERvYmlhcyAoJEVNQUlMKSIKCQk7OwoJKiApCgkJbWVzc2FnZSBhYm9ydCAiClVT
QUdFOiAkKGJhc2VuYW1lICRUSElTKSA8T3B0aW9uPiBbLS13aXRoX3BpbmddCgo8T3B0aW9ucz4K
ICAgICAgICAgICBzdGFydCA6IHN0YXJ0cyB0aGUgZmlyZXdhbGwgaWYgaXQgaXNuJ3QgcnVubmlu
Zy4KCSAgICBzdG9wIDogc3RvcHMgdGhlIGZpcmV3YWxsLiBWRVJZIGRhbmdlcm91cy4KICAgICAg
ICAgcmVzdGFydCA6IHJlc3RhcnRzIGFuZCByZWxvYWRzIHRoZSBmaXJld2FsbCBpZiBpdCBpcyBy
dW5uaW5nLgogICAgICAgICAgcmVsb2FkIDogYWxpYXMgZm9yICdyZXN0YXJ0Jy4KYmxvY2sgZXZl
cnl0aGluZyA6IGJsb2NrIGFsbCBuZXR3b3JrIHRyYWZmaWMuCiAgICAgICAgICBzdGF0dXMgOiBz
aG93cyBjdXJyZW50IGZpcmV3YWxsIHNldHRpbmdzLgogICAgICAgICB2ZXJzaW9uIDogc2hvd3Mg
dGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBmaXJld2FsbC4KCiAgIFstLXdpdGhfcGluZ10gOiBhbGxv
d3MgYSBwaW5nIHRvIGdldCB0aHJvdWdoLiBEZWZhdWx0IGlzIG5vIHBpbmcgdW5sZXNzCiAgICAg
ICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoZSAnZXRoX3VwJyBmaWxlcyB3aXRoICdpY21wJyBr
ZXl3b3JkLgogWy0tbG9nX2Jsb2NrZWRdIDogTG9ncyBhbGwgYmxvY2tlZCBwYWNrZXRzIHRvIHRo
ZSBrZXJuZWwgbG9nLAogICAgICAgICAgICAgICAgICAgYW5kIHJlcG9ydHMgdGhlIHJ1bGUgdGhh
dCBibG9ja2VkIHRoZW0uCiIKCQk7Owplc2FjCgppZiBbICEgJCh3aG9hbWkpID0gJ3Jvb3QnIF07
IHRoZW4KCW1lc3NhZ2UgYWJvcnQgJ1lvdSBtdXN0IGJlIHJvb3QgdG8gcnVuIHRoaXMgY29tbWFu
ZC4nCmZpCmlmIFsgISAteCAkSVBUQUJMRVMgXTsgdGhlbgoJbWVzc2FnZSBhYm9ydCAiRVJST1Ih
ICckSVBUQUJMRVMnIGNvbW1hbmQgbm90IGZvdW5kLiIKZmkKaWYgWyAtdyAkRVJSIF07IHRoZW4K
CXJtIC1mICRFUlIKZmkKaWYgWyAiJDIiID0gJy0td2l0aF9waW5nJyBdIHx8IFsgIiQzIiA9ICct
LXdpdGhfcGluZycgXTsgdGhlbgoJUElORz0xCmZpCmlmIFsgIiQyIiA9ICctLWxvZ19ibG9ja2Vk
JyBdIHx8IFsgIiQzIiA9ICctLWxvZ19ibG9ja2VkJyBdOyB0aGVuCgltZXNzYWdlIGluZm8gIkxv
Z2dpbmcgYmxvY2tlZCBwYWNrZXRzIGVuYWJsZWQgdG8gdGhlIGtlcm5lbCBsb2ciCiAgICAgICAg
REVCVUc9MQpmaQoKIyBSdW4gdGhlIHNlbGVjdGVkIGFjdGlvbgppZiBbIC1uICIkUlVOIiBdOyB0
aGVuCgkkUlVOCmZpCg==" | base64 -di - > "/sbin/ac_firewall"; then
	rollback
fi
log_undo 'rm -f "/sbin/ac_firewall"'
chown root:root "/sbin/ac_firewall"
chmod 0110 "/sbin/ac_firewall"
echo -e "Created file '/sbin/ac_firewall'"
if ! echo "IyEvYmluL2Jhc2gKIwojICAgIE5BTUU6IEFDIEZpcmV3YWxsIHVuaW5zdGFsbGVyCiMgVkVSU0lP
TjogMi4zLjIKIyAgQVVUSE9SOiBKb2V5IERvYmlhcwojICAgIERBVEU6IDIwMTItMDQtMjEKIyAg
IE5PVEVTOiBKdXN0IHJlbW92ZXMgQUMgRmlyZXdhbGwgZmlsZXMgYW5kIHJlc3RvcmVzIGlwdGFi
bGVzIGFzIHRoZSBtYWluCiMgICAgICAgICAgcGFja2V0IGZpbHRlcmluZyBzZXJ2aWNlCiMKCk5B
TUU9J0FDIEZpcmV3YWxsJwpNT0Q9JChob3N0bmFtZSkKVkVSPTMuMC4wCkVNQUlMPWZlZWxpbmdf
emVuanBAeWFob28uY28uanAKVEhJUz0kMApDT05GPS9ldGMvYWNfZmlyZXdhbGwKVEVNUF9ESVI9
L3Zhci90bXAvYWNmaXJld2FsbApQQVRIPS9iaW46L3Vzci9iaW46L3NiaW46L3Vzci9zYmluCgoj
IFBBUlNFIFVTRVIgT1BUSU9OUwppZiBbICEgJCh3aG9hbWkpID0gJ3Jvb3QnIF07IHRoZW4KCWVj
aG8gIllvdSBtdXN0IGJlICdyb290JyB0byBydW4gdGhpcyBjb21tYW5kIgoJZXhpdCAxCmZpCgpz
eXN0ZW1jdGwgc3RvcCBhY19maXJld2FsbC5zZXJ2aWNlCnNsZWVwIDIKc3lzdGVtY3RsIGRpc2Fi
bGUgYWNfZmlyZXdhbGwuc2VydmljZQpzeXN0ZW1jdGwgZW5hYmxlIGZpcmV3YWxsZC5zZXJ2aWNl
CgpybSAtZiAvc2Jpbi9hY19maXJld2FsbApybSAtcmYgJENPTkYKcm0gLXJmICR7VEVNUF9ESVJ9
CnJtIC1mIC9ldGMvc3lzdGVtZC9zeXN0ZW0vYWNfZmlyZXdhbGwuc2VydmljZQpybSAtZiAvc2Jp
bi91bmluc3RhbGxfYWNfZmlyZXdhbGwKZWNobyAtZSAiVW5pbnN0YWxsYXRpb24gJyROQU1FJyBj
b21wbGV0ZSBhdCAkKGRhdGUgJyslRiAlVCcpIgpleGl0IDAK" | base64 -di - > "/sbin/uninstall_ac_firewall"; then
	rollback
fi
log_undo 'rm -f "/sbin/uninstall_ac_firewall"'
chown root:root "/sbin/uninstall_ac_firewall"
chmod 0110 "/sbin/uninstall_ac_firewall"
echo -e "Created file '/sbin/uninstall_ac_firewall'"
if ! mkdir -p "/var/tmp/acfirewall"; then
rollback
fi
log_undo 'rm -rf "/var/tmp/acfirewall"'
chown root:root "/var/tmp/acfirewall"
chmod 0770 "/var/tmp/acfirewall"
echo "Created directory '/var/tmp/acfirewall'"
if ! echo "W1VuaXRdCkRlc2NyaXB0aW9uPUFDIEZpcmV3YWxsCgpbU2VydmljZV0KVHlwZT1vbmVzaG90ClJl
bWFpbkFmdGVyRXhpdD10cnVlCkV4ZWNTdGFydD0vZXRjL2FjX2ZpcmV3YWxsLy5zdGFydApFeGVj
U3RvcD0vZXRjL2FjX2ZpcmV3YWxsLy5zdG9wCkV4ZWNSZWxvYWQ9L2V0Yy9hY19maXJld2FsbC8u
cmVzdGFydAoKW0luc3RhbGxdClJlcXVpcmVkQnk9bXVsdGktdXNlci50YXJnZXQK" | base64 -di - > "/etc/systemd/system/ac_firewall.service"; then
	rollback
fi
log_undo 'rm -f "/etc/systemd/system/ac_firewall.service"'
chown root:root "/etc/systemd/system/ac_firewall.service"
chmod 0700 "/etc/systemd/system/ac_firewall.service"
echo -e "Created file '/etc/systemd/system/ac_firewall.service'"
#!/bin/bash
CONF=/etc/ac_firewall
SWAP=/tmp/$$
systemctl disable firewalld.service
umask 111
touch $CONF/eth_down
ip addr | grep -ivE '^[[:digit:]]+: lo:' | grep -ioE '^[[:digit:]]+: [-_[:alnum:]]+' | cut -d' ' -f2 > $SWAP
{
	while read; do
		echo -e "$REPLY\ticmp" >> $CONF/eth_up
		echo -e 'tcp\t22\tSSH' > $CONF/incoming_${REPLY}_public
		touch $CONF/incoming_${REPLY}_restricted
		echo -e "tcp\t8:65535\tEverything\nudp\t8:65535\tEverything" > $CONF/outgoing_${REPLY}_public
	done
} < $SWAP
rm -f $SWAP
# We cannot create config files until the network is up and we have an address. This should enforce that.
while true; do
	ip addr | grep -ioE 'inet [[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}' | cut -d' ' -f2 | grep -v '127.0.0.1' > $CONF/hosts_this
	if grep -qE '[[:digit:]]' $CONF/hosts_this; then
		break;
	fi
	sleep 10
done
systemctl enable ac_firewall.service
systemctl start ac_firewall.service
cd "${MBS_ORIGIN}"
echo -e "Installation 'install_ac_firewall_3.1.3' complete at $(date '+%Y-%m-%d %T')"
