Fixing DNS/Kubernetes Resource Name Compliance Error in VMSP 9.0 GA Deployment
search cancel

Fixing DNS/Kubernetes Resource Name Compliance Error in VMSP 9.0 GA Deployment

book

Article ID: 428603

calendar_today

Updated On:

Products

VCF Automation

Issue/Introduction

After bootstrapping the cluster, VMSP deployment fails with one of the following error:

Scenario 1: Cluster Name Validation Error

>>> INIT0001 - Validating configuration
##:##:## ERROR : Invalid VCF services platform cluster. New Cluster should be DNS/Kubernetes resource name compliant.

Scenario 2: ESXi Datastore Connectivity Error

>>> INIT0001 - Validating configuration
##:##:## role VCF Services Platform exists
##:##:## role VCF Services Platform Admin exists
successfully added global permissions for user [email protected]
successfully added global permissions for user [email protected]
govc: /datacenter/host/sddc not found
##:##:## ERROR : Not all ESXi Hosts in the cluster /datacenter/host/sddc cluster 1 are connected to the datastore /datacenter/datastore/<datastore-name>

Environment

VCF Automation 9.0

Resolution

Step 1: Connect to the LCM appliance VM

Use SSH to connect to the lcm appliance VM with root credentials.

ssh root@<lcm_appliance_ip>

**Action:** Enter your `APPLIANCE_ROOT_PASSWORD` when prompted.

Step 2: Navigate to Scripts Directory

Change to the VMSP scripts directory:

cd /data/vmsp/scripts

Step 3: Backup Original File

Always create a backup before modifying system files. This allows easy rollback if needed. Create a backup of the `common.sh` file:

cp common.sh common.sh.backup

Step 4: Create Patch File

Create a new patch file named `patch.tmp` with the following content:
cat > patch.tmp << 'EOF' IyEgL3Vzci9iaW4vZW52IGJhc2gKCmNoZWNrRm9yVmFyaWFibGUoKSB7CiAgaWYgW1sgLXogIiR7ITErc2V0fSIgXV07IHRoZW4KICAgIGVycm9ybG9nICJEZWZpbmUgJDEgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgICByZXR1cm4gMQogIGZpCn0KCmZ1bmN0aW9uIG5leHRpcCgpIHsKICBsb2NhbCBpcD0iJHsxfSIKICBpZiBbWyAteiAiJHtpcH0iIF1dOyB0aGVuCiAgICByZXR1cm4gMQogIGZpCiAgbG9jYWwgaXBfaGV4IG5leHRfaXBfaGV4IG5leHRfaXAKICAjIGZvciB0aGVzZSBwcmludGYgc3RhdGVtZW50cywgc2hlbGxjaGVjayBpcyBpbmNvcnJlY3Qgd2l0aCB0aGUgcmVjb21tZW5kYXRpb25zLCBkaXNhYmxpbmcKICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIxODMsU0MyMDQ2CiAgaXBfaGV4PSQocHJpbnRmICclLjJYJS4yWCUuMlglLjJYXG4nICQoZWNobyAiJHtpcH0iIHwgc2VkIC1lICdzL1wuLyAvZycpKQogIG5leHRfaXBfaGV4PSQocHJpbnRmICUuOFggIiQoZWNobyAkKCgweCRpcF9oZXggKyAxKSkpIikKICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIxODMsU0MyMDQ2CiAgbmV4dF9pcD0kKHByaW50ZiAnJWQuJWQuJWQuJWRcbicgJChlY2hvICIke25leHRfaXBfaGV4fSIgfCBzZWQgLXIgJ3MvKC4uKS8weFwxIC9nJykpCiAgZWNobyAiJHtuZXh0X2lwfSIKfQoKZnVuY3Rpb24gZW5zdXJlX2Fic19wYXRoKCkgewogIGlmIGlzVkNSZXNvdXJjZU5hbWUgIiR7REFUQUNFTlRFUn0iOyB0aGVuCiAgICByZXM9JCgiJHtHT1ZDfSIgZmluZCAtdHlwZSBkIC1uYW1lICIke0RBVEFDRU5URVJ9IikKCiAgICBpZiBpc011bHRpbGluZSAiJHtyZXN9IjsgdGhlbgogICAgICBlcnJvcmxvZyAiRGF0YWNlbnRlciBuYW1lICR7REFUQUNFTlRFUn0gcmVzb2x2ZXMgdG8gbXVsdGlwbGUgZGF0YWNlbnRlcnMiCiAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIGlmIFtbIC16ICIke3Jlc30iIF1dOyB0aGVuCiAgICAgIGVycm9ybG9nICJEYXRhY2VudGVyICR7REFUQUNFTlRFUn0gZG9lcyBub3QgZXhpc3QiCiAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIERBVEFDRU5URVI9IiR7cmVzfSIKICBmaQoKICBpZiBpc1ZDUmVzb3VyY2VOYW1lICIke1ZTUEhFUkVfQ0xVU1RFUn0iOyB0aGVuCiAgICByZXM9JCgiJHtHT1ZDfSIgZmluZCAtdHlwZSBjIC1uYW1lICIke1ZTUEhFUkVfQ0xVU1RFUn0iKQoKICAgIGlmIGlzTXVsdGlsaW5lICIke3Jlc30iOyB0aGVuCiAgICAgIGVycm9ybG9nICJDbHVzdGVyIG5hbWUgJHtWU1BIRVJFX0NMVVNURVJ9IHJlc29sdmVzIHRvIG11bHRpcGxlIGNsdXN0ZXJzIgogICAgICByZXR1cm4gMQogICAgZmkKCiAgICBpZiBbWyAteiAiJHtyZXN9IiBdXTsgdGhlbgogICAgICBlcnJvcmxvZyAiQ2x1c3RlciAke1ZTUEhFUkVfQ0xVU1RFUn0gZG9lcyBub3QgZXhpc3QiCiAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIFZTUEhFUkVfQ0xVU1RFUj0iJHtyZXN9IgogIGZpCgogIGlmIGlzVkNSZXNvdXJjZU5hbWUgIiR7REFUQVNUT1JFfSI7IHRoZW4KICAgIHJlcz0kKCIke0dPVkN9IiBmaW5kIC10eXBlIHMgLW5hbWUgIiR7REFUQVNUT1JFfSIpCgogICAgaWYgaXNNdWx0aWxpbmUgIiR7cmVzfSI7IHRoZW4KICAgICAgZXJyb3Jsb2cgIkRhdGFzdG9yZSBuYW1lICR7REFUQVNUT1JFfSByZXNvbHZlcyB0byBtdWx0aXBsZSBkYXRhc3RvcmVzIgogICAgICByZXR1cm4gMQogICAgZmkKCiAgICBpZiBbWyAteiAiJHtyZXN9IiBdXTsgdGhlbgogICAgICBlcnJvcmxvZyAiRGF0YXN0b3JlICR7REFUQVNUT1JFfSBkb2VzIG5vdCBleGlzdCIKICAgICAgcmV0dXJuIDEKICAgIGZpCiAgICBEQVRBU1RPUkU9IiR7cmVzfSIKICBmaQoKICBpZiBpc1ZDUmVzb3VyY2VOYW1lICIke1ZTUEhFUkVfTkVUV09SS30iOyB0aGVuCiAgICByZXM9JCgiJHtHT1ZDfSIgZmluZCAtdHlwZSBuIC1uYW1lICIke1ZTUEhFUkVfTkVUV09SS30iKQoKICAgIGlmIGlzTXVsdGlsaW5lICIke3Jlc30iOyB0aGVuCiAgICAgIGVycm9ybG9nICJOZXR3b3JrIG5hbWUgJHtWU1BIRVJFX05FVFdPUkt9IHJlc29sdmVzIHRvIG11bHRpcGxlIG5ldHdvcmtzIgogICAgICByZXR1cm4gMQogICAgZmkKCiAgICBpZiBbWyAteiAiJHtyZXN9IiBdXTsgdGhlbgogICAgICBlcnJvcmxvZyAiTmV0d29yayAke1ZTUEhFUkVfTkVUV09SS30gZG9lcyBub3QgZXhpc3QiCiAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIFZTUEhFUkVfTkVUV09SSz0iJHtyZXN9IgogIGZpCn0KCmZ1bmN0aW9uIGNoZWNrX2lwX2luX3VzZSgpIHsKICBwaW5nIC13IDMgLWMgMSAiJHsxfSIgJj4gL2Rldi9udWxsCn0KCmZ1bmN0aW9uIG1vcmVmaWRfdG9fcGF0aCgpIHsKICBEQVRBQ0VOVEVSPSQoIiR7RVhFQ1VUQUJMRX0iIHZjIGlwYXRoIC0tcmVmICIke0RBVEFDRU5URVJ9IiB8fCBlY2hvICIvJHtEQVRBQ0VOVEVSfSIpCgogIFZTUEhFUkVfQ0xVU1RFUj0kKCIke0VYRUNVVEFCTEV9IiB2YyBpcGF0aCAtLXJlZiAiJHtWU1BIRVJFX0NMVVNURVJ9IiB8fCBlY2hvICIke1ZTUEhFUkVfQ0xVU1RFUn0iKQogIGlmIFtbICIke1ZTUEhFUkVfQ0xVU1RFUn0iICE9ICoiL2hvc3QvIiogXV07IHRoZW4KICAgIFZTUEhFUkVfQ0xVU1RFUj0iJHtEQVRBQ0VOVEVSfS9ob3N0LyR7VlNQSEVSRV9DTFVTVEVSfSIKICBmaQoKICBEQVRBU1RPUkU9JCgiJHtFWEVDVVRBQkxFfSIgdmMgaXBhdGggLS1yZWYgIiR7REFUQVNUT1JFfSIgfHwgZWNobyAiJHtEQVRBU1RPUkV9IikKCiAgaWYgW1sgLXogIiR7VlNQSEVSRV9SRVNPVVJDRV9QT09MfSIgXV07IHRoZW4KICAgIFZTUEhFUkVfUkVTT1VSQ0VfUE9PTD0iJHtWU1BIRVJFX0NMVVNURVJ9L1Jlc291cmNlcyIKICBmaQogIFZTUEhFUkVfUkVTT1VSQ0VfUE9PTD0kKCIke0VYRUNVVEFCTEV9IiB2YyBpcGF0aCAtLXJlZiAiJHtWU1BIRVJFX1JFU09VUkNFX1BPT0x9IiB8fCBlY2hvICIke1ZTUEhFUkVfUkVTT1VSQ0VfUE9PTH0iKQoKICBWU1BIRVJFX05FVFdPUks9JCgiJHtFWEVDVVRBQkxFfSIgdmMgaXBhdGggLS1yZWYgIiR7VlNQSEVSRV9ORVRXT1JLfSIgfHwgZWNobyAiJHtWU1BIRVJFX05FVFdPUkt9IikKCiAgaWYgW1sgLXogIiR7VlNQSEVSRV9GT0xERVJ9IiBdXTsgdGhlbgogICAgVlNQSEVSRV9GT0xERVI9IiR7REFUQUNFTlRFUn0vdm0iCiAgZmkKICBWU1BIRVJFX0ZPTERFUj0kKCIke0VYRUNVVEFCTEV9IiB2YyBpcGF0aCAtLXJlZiAiJHtWU1BIRVJFX0ZPTERFUn0iIHx8IGVjaG8gIiR7VlNQSEVSRV9GT0xERVJ9IikKCiAgaWYgW1sgLXogIiR7VlNQSEVSRV9URU1QTEFURV9GT0xERVJ9IiBdXTsgdGhlbgogICAgVlNQSEVSRV9URU1QTEFURV9GT0xERVI9IiR7VlNQSEVSRV9GT0xERVJ9IgogIGZpCiAgVlNQSEVSRV9URU1QTEFURV9GT0xERVI9JCgiJHtFWEVDVVRBQkxFfSIgdmMgaXBhdGggLS1yZWYgIiR7VlNQSEVSRV9URU1QTEFURV9GT0xERVJ9IiB8fCBlY2hvICIke1ZTUEhFUkVfVEVNUExBVEVfRk9MREVSfSIpCn0KCmZ1bmN0aW9uIHNldERlZmF1bHRzKCkgewogIGlmIFtbIC16ICIke1ZTUEhFUkVfQ0xVU1RFUn0iIF1dOyB0aGVuCiAgICBWU1BIRVJFX0NMVVNURVI9IiQoJHtHT1ZDfSBmaW5kIC10eXBlIGMpIgogICAgaWYgaXNNdWx0aWxpbmUgIiR7VlNQSEVSRV9DTFVTVEVSfSI7IHRoZW4KICAgICAgZXJyb3Jsb2cgIlZTUEhFUkVfQ0xVU1RFUiBub3QgcHJvdmlkZWQiCiAgICAgIHJldHVybiAxCiAgICBmaQogIGZpCiAgaWYgW1sgLXogIiR7REFUQUNFTlRFUn0iIF1dOyB0aGVuCiAgICBEQVRBQ0VOVEVSPSIkKCR7R09WQ30gZmluZCAtdHlwZSBkKSIKICAgIGlmIGlzTXVsdGlsaW5lICIke0RBVEFDRU5URVJ9IjsgdGhlbgogICAgICBlcnJvcmxvZyAiREFUQUNFTlRFUiBub3QgcHJvdmlkZWQiCiAgICAgIHJldHVybiAxCiAgICBmaQogIGZpCiAgaWYgW1sgLXogIiR7REFUQVNUT1JFfSIgXV07IHRoZW4KICAgIERBVEFTVE9SRT0kKCR7R09WQ30gZmluZCAtdHlwZSBzIHwgZ3JlcCAtdiAnbG9jYWwnKQogICAgaWYgaXNNdWx0aWxpbmUgIiR7REFUQVNUT1JFfSI7IHRoZW4KICAgICAgZXJyb3Jsb2cgIkRBVEFTVE9SRSBub3QgcHJvdmlkZWQiCiAgICAgIHJldHVybiAxCiAgICBmaQogIGZpCgogICMgY29udmVydCBtb1JlZklEcyBpbnRvIGFic29sdXRlIHBhdGhzCiAgbW9yZWZpZF90b19wYXRoCgogICMgY29udmVydCBuYW1lcyB0byBhYnNvbHV0ZSBwYXRocwogIGVuc3VyZV9hYnNfcGF0aAoKICBpZiBbWyAteiAiJHtWU1BIRVJFX0hPU1ROQU1FfSIgXV07IHRoZW4KICAgIFZTUEhFUkVfSE9TVE5BTUU9JCgke0dPVkN9IGZpbmQgLXR5cGUgaCAiJHtWU1BIRVJFX0NMVVNURVJ9IiB8IGF3ayAtRi8gJ3twcmludCAkTkY7IGV4aXR9JyB8fCB0cnVlKQogIGZpCn0KCmZ1bmN0aW9uIHByaW50SW1wb3J0YW50VmFycygpIHsKICBkZWJ1Z2xvZyAiQ3VycmVudCBDb25maWd1cmF0aW9uIgogIGRlYnVnbG9nICIgQXBwbGlhbmNlIHZlcnNpb246ICAgICAgICAke1ZNU1BfQkFTRV9WRVJTSU9OOi19IgogIGRlYnVnbG9nICIgQ0xJIHZlcnNpb246ICAgICAgICAgICAgICAkKCR7RVhFQ1VUQUJMRX0gdmVyc2lvbikiCiAgZGVidWdsb2cgIiBQbGF0Zm9ybSBwYWNrYWdlczogICAgICAgICR7RVhQRUNURURfT0NJX0NPVU5UOi19IChpbWFnZXMgYW5kIGNoYXJ0cykiCiAgZGVidWdsb2cgIiBWTVNQIFBhY2thZ2UgVVJMOiAgICAgICAgICR7Vk1TUF9QQUNLQUdFX1VSTDotfSIKICBkZWJ1Z2xvZyAiIE1hY2hpbmUgdGVtcGxhdGU6ICAgICAgICAgJHtWU1BIRVJFX1RFTVBMQVRFOi19IgogIGRlYnVnbG9nICIgTWFjaGluZSB0eXBlOiAgICAgICAgICAgICAke0NPTlRST0xQTEFORV9NQUNISU5FX1RZUEU6LX0iCiAgZGVidWdsb2cgIiBBcHBsaWFuY2Ugc2l6ZTogICAgICAgICAgICR7Vk1TUF9TSVpFOi19IgogIGRlYnVnbG9nICIgQ2x1c3RlciBuYW1lOiAgICAgICAgICAgICAke0NMVVNURVJfTkFNRTotTm90IHByb3ZpZGVkfSIKICBkZWJ1Z2xvZyAiIFByaW1hcnkgVklQOiAgICAgICAgICAgICAgJHtQUklNQVJZX1ZJUDotfSIKICBkZWJ1Z2xvZyAiIEFkZGl0aW9uYWwgVklQczogICAgICAgICAgJHtBRERJVElPTkFMX1ZJUFM6LX0iCiAgZGVidWdsb2cgIiBJUCBQb29sOiAgICAgICAgICAgICAgICAgICR7SVBQT09MU19BRERSRVNTRVM6LU5vdCBwcm92aWRlZH0iCiAgZGVidWdsb2cgIiBJUCBQcmVmaXgvQ0lEUjogICAgICAgICAgICR7SVBQT09MU19QUkVGSVg6LU5vdCBwcm92aWRlZH0iCiAgZGVidWdsb2cgIiBJUCBHYXRld2F5OiAgICAgICAgICAgICAgICR7SVBQT09MU19HQVRFV0FZOi1Ob3QgcHJvdmlkZWR9IgogIGRlYnVnbG9nICIgQ2x1c3RlciBDSURSOiAgICAgICAgICAgICAke0lOVEVSTkFMX0NMVVNURVJfQ0lEUjotfSIKICBkZWJ1Z2xvZyAiIEhBIENsdXN0ZXI6ICAgICAgICAgICAgICAgJHtIQV9DTFVTVEVSOi19IgogIGRlYnVnbG9nICIgQ2x1c3RlciBub2RlczogICAgICAgICAgICAke1RPVEFMX0NMVVNURVJfTk9ERVM6LU5vdCBwcm92aWRlZH0iCiAgZGVidWdsb2cgIiBSZWdpc3RyeSBzdG9yYWdlOiAgICAgICAgICR7UkVHSVNUUllfU1RPUkFHRV9UWVBFOi19IgogIGRlYnVnbG9nICIgRGVwbG95aW5nIHRvOiAgICAgICAgICAgICAke1ZTUEhFUkVfU0VSVkVSOi19IgogIGRlYnVnbG9nICIgIERhdGFjZW50ZXI6ICAgICAgICAgICAgICAke0RBVEFDRU5URVI6LX0iCiAgZGVidWdsb2cgIiAgQ2x1c3RlcjogICAgICAgICAgICAgICAgICR7VlNQSEVSRV9DTFVTVEVSOi19IgogIGRlYnVnbG9nICIgIEZvbGRlcjogICAgICAgICAgICAgICAgICAke1ZTUEhFUkVfRk9MREVSOi19IgogIGRlYnVnbG9nICIgIFJlc291cmNlIHBvb2w6ICAgICAgICAgICAke1ZTUEhFUkVfUkVTT1VSQ0VfUE9PTDotfSIKICBkZWJ1Z2xvZyAiICBEYXRhc3RvcmU6ICAgICAgICAgICAgICAgJHtEQVRBU1RPUkU6LX0iCiAgZGVidWdsb2cgIiAgVGVtcGxhdGUgZm9sZGVyOiAgICAgICAgICR7VlNQSEVSRV9URU1QTEFURV9GT0xERVI6LX0iCiAgZGVidWdsb2cgIiAgTmV0d29yazogICAgICAgICAgICAgICAgICR7VlNQSEVSRV9ORVRXT1JLOi19IgogIGRlYnVnbG9nICIgREhDUCBlbmFibGVkOiAgICAgICAgICAgICAke0RIQ1A0X0VOQUJMRUQ6LX0iCiAgZGVidWdsb2cgIiBFeHRyYSB2YWx1ZXM6ICAgICAgICAgICAgICR7RVhUUkFfVkFMVUVTOi1Ob3QgcHJvdmlkZWR9IgogIGRlYnVnbG9nICIgQm9vdHN0cmFwIExvZzogICAgICAgICAgICAke0JPT1RTVFJBUF9MT0c6LX0iCiAgZGVidWdsb2cgIiBCb290c3RyYXAgbWFya2VyIGZpbGU6ICAgICR7Qk9PVFNUUkFQX1NURVBTX0xPRzotfSIKfQoKZnVuY3Rpb24gbWFya2VyKCkgewogICMgVE9ETzogd3JpdGUgdGhlIHN0YWdlcyB0byBhIHNlcGFyYXRlIGZpbGUgZm9yIExDTSB0byByZWFkIGZyb20/CiAgbG9jYWwgcHJlZml4PSI+Pj4gIgogIGlmIFtbICIkezF9IiA9PSAiRVJSIiogXV07IHRoZW4KICAgIHByZWZpeD0iIgogIGZpCiAgZWNobyAiJHtwcmVmaXh9JHsxfSIgfCB0ZWUgLWEgIiR7Qk9PVFNUUkFQX1NURVBTX0xPR30iCn0KCmZ1bmN0aW9uIGhlYWx0aHooKSB7CiAgIyBjaGVjayBuZXcgY2x1c3RlcidzIHN0YXR1cyBvZiB0aGUgQVBJIHNlcnZlcgogIExJVkVaPSQoa3ViZWN0bCBnZXQgLS1yYXc9Jy9saXZleicgLS1rdWJlY29uZmlnPSIke01BTkFHRU1FTlRfS1VCRUNPTkZJR30iKQogIFJFQURZWj0kKGt1YmVjdGwgZ2V0IC0tcmF3PScvcmVhZHl6JyAtLWt1YmVjb25maWc9IiR7TUFOQUdFTUVOVF9LVUJFQ09ORklHfSIpCgogIGlmIFtbICIke0xJVkVafSIgPX4gIm9rIiAmJiAiJHtSRUFEWVp9IiA9fiAib2siIF1dOyB0aGVuCiAgICBsb2cgIkFwcGxpYW5jZSBjbHVzdGVyIEFQSSBPSyIKICBlbHNlCiAgICBlcnJvcmxvZyAiQXBwbGlhbmNlIGNsdXN0ZXIgQVBJIE5vdCBPSy4gUG9zdC1kZXBsb3ltZW50IGhlYWx0aCBjaGVjayBmYWlsZWQuIgogICAgcmV0dXJuIDEKICBmaQoKICAjIGNoZWNrIG5vZGVzIHJlYWRpbmVzcwogIE5PVF9SRUFEWV9OT0RFUz0kKGt1YmVjdGwgZ2V0IG5vIC0tbm8taGVhZGVycyAtLWt1YmVjb25maWc9IiR7TUFOQUdFTUVOVF9LVUJFQ09ORklHfSIgfCB7IGdyZXAgLXcgIk5vdFJlYWR5IiB8fCB0ZXN0ICQ/ID0gMTsgfSkKCiAgaWYgW1sgLXogIiR7Tk9UX1JFQURZX05PREVTOi19IiBdXTsgdGhlbgogICAgbG9nICJBbGwgQXBwbGlhbmNlIGNsdXN0ZXIgTm9kZXMgUmVhZHkiCiAgZWxzZQogICAgZXJyb3Jsb2cgIkFwcGxpYW5jZSBjbHVzdGVyIE5vZGUgTm90IFJlYWR5IgogICAgZXJyb3Jsb2cgIiR7Tk9UX1JFQURZX05PREVTfSIKICAgIGVycm9ybG9nICJQb3N0LWRlcGxveW1lbnQgY2hlY2sgZmFpbGVkLiIKICAgIHJldHVybiAxCiAgZmkKCiAgIyBjaGVjayBwb2RzCiAgTk9UX1JVTk5JTkdfUE9EUz0kKGt1YmVjdGwgZ2V0IHBvIC1BIC0tbm8taGVhZGVycyAtLWt1YmVjb25maWc9IiR7TUFOQUdFTUVOVF9LVUJFQ09ORklHfSIgfCB7IGdyZXAgLXZFICJSdW5uaW5nfENvbXBsZXRlZCIgfHwgdGVzdCAkPyA9IDE7IH0pCgogIGlmIFtbIC16ICIke05PVF9SVU5OSU5HX1BPRFN9IiBdXTsgdGhlbgogICAgbG9nICJBbGwgQXBwbGlhbmNlIGNsdXN0ZXIgcG9kcyBhcmUgUnVubmluZyIKICBlbHNlCiAgICBlcnJvcmxvZyAiQXBwbGlhbmNlIGNsdXN0ZXIgUG9kcyBTdGF0dXMgTm90IGFsbCBSdW5uaW5nIG9yIENvbXBsZXRlZDoiCiAgICBlcnJvcmxvZyAiJHtOT1RfUlVOTklOR19QT0RTfSIKICAgIGVycm9ybG9nICJQb3N0LWJvb3RzdHJhcCBjaGVjayBmYWlsZWQuIgogICAgcmV0dXJuIDEKICBmaQoKICByZXR1cm4gMAp9CgpmdW5jdGlvbiBrOHNfZGVidWdfaW5mbygpIHsKICBsb2NhbCBjb25maWc9IiR7MTotfi8ua3ViZS9jb25maWd9IgogIGxvY2FsIG5hbWU9IiIKICBuYW1lPSQoeXEgJy5jdXJyZW50LWNvbnRleHQnICIke2NvbmZpZ30iKQogIGlmIFtbICIke25hbWV9IiA9PSAibnVsbCIgXV07IHRoZW4KICAgIHJldHVybgogIGZpCgogIGxvZyAiRXZlbnRzIGZyb20gdGhlICR7bmFtZX0gY2x1c3RlciIKICBrdWJlY3RsIGdldCBldmVudHMgLUEgLS1zb3J0LWJ5PS5tZXRhZGF0YS5jcmVhdGlvblRpbWVzdGFtcCAtLWt1YmVjb25maWc9IiR7Y29uZmlnfSIKICBsb2cgIlBhY2thZ2VEZXBsb3ltZW50cyBvbiB0aGUgJHtuYW1lfSBjbHVzdGVyIgogIGt1YmVjdGwgZ2V0IHBkIC1BIC0ta3ViZWNvbmZpZz0iJHtjb25maWd9IgogIGxvZyAiUGFja2FnZURlcGxveW1lbnRzIFNwZWMgb24gdGhlICR7bmFtZX0gY2x1c3RlciIKICBrdWJlY3RsIGdldCBwZCAtQSAtbyB5YW1sIC0ta3ViZWNvbmZpZz0iJHtjb25maWd9IgogIGxvZyAiSGVsbVJlbGVhc2VzIG9uIHRoZSAke25hbWV9IGNsdXN0ZXIiCiAga3ViZWN0bCBnZXQgaHIgLUEgLS1rdWJlY29uZmlnPSIke2NvbmZpZ30iCiAgbG9nICJNYWNoaW5lcyBvbiB0aGUgJHtuYW1lfSBjbHVzdGVyIgogIGt1YmVjdGwgZ2V0IG1hY2hpbmVzIC1BIC0ta3ViZWNvbmZpZz0iJHtjb25maWd9IgogIGlmIFtbICIke2NvbmZpZ30iID09ICIke0tJTkRfS1VCRUNPTkZJR30iIF1dOyB0aGVuCiAgICBsb2cgIk1hY2hpbmVzIFNwZWMgb24gdGhlICR7bmFtZX0gY2x1c3RlciIKICAgIGt1YmVjdGwgZ2V0IG1hY2hpbmVzIC1BIC1vIHlhbWwgLS1rdWJlY29uZmlnPSIke2NvbmZpZ30iCiAgICBsb2cgIlZTcGhlcmVWTXMgU3BlYyBvbiB0aGUgJHtuYW1lfSBjbHVzdGVyIgogICAga3ViZWN0bCBnZXQgdnNwaGVyZXZtcyAtQSAtbyB5YW1sIC0ta3ViZWNvbmZpZz0iJHtjb25maWd9IgogIGZpCiAgbG9nICJDQVBWIGxvZ3Mgb24gdGhlICR7bmFtZX0gY2x1c3RlciIKICBlY2hvICItLSBMT0cgU1RBUlQgLS0iCiAga3ViZWN0bCBsb2dzIC1uIHZtc3AtcGxhdGZvcm0gLWwgY2x1c3Rlci54LWs4cy5pby9wcm92aWRlcj1pbmZyYXN0cnVjdHVyZS12c3BoZXJlLGNvbnRyb2wtcGxhbmU9Y29udHJvbGxlci1tYW5hZ2VyIC0ta3ViZWNvbmZpZz0iJHtjb25maWd9IiAtLXNpbmNlPTFoCiAgZWNobyAiLS0gTE9HIEVORCAtLSIKICBsb2cgIkFwcGxpYW5jZSBjbHVzdGVyIE9wZXJhdG9yIGxvZ3Mgb24gdGhlICR7bmFtZX0gY2x1c3RlciIKICBlY2hvICItLSBMT0cgU1RBUlQgLS0iCiAga3ViZWN0bCBsb2dzIC1uIHZtc3AtcGxhdGZvcm0gLWwgYXBwLmt1YmVybmV0ZXMuaW8vbmFtZT12bXNwLW9wZXJhdG9yIC0ta3ViZWNvbmZpZz0iJHtjb25maWd9IiAtLXNpbmNlPTFoCiAgZWNobyAiLS0gTE9HIEVORCAtLSIKCiAgZmFpbGVkX3BvZF9sb2dzICIke2NvbmZpZ30iCn0KCmZ1bmN0aW9uIGZhaWxlZF9wb2RfbG9ncygpIHsKICBsb2NhbCBjb25maWc9IiR7MTotfi8ua3ViZS9jb25maWd9IgogIGxvY2FsIG5hbWU9IiIKICBuYW1lPSQoeXEgJy5jdXJyZW50LWNvbnRleHQnICIke2NvbmZpZ30iKQogIGlmIFtbICIke25hbWV9IiA9PSAibnVsbCIgXV07IHRoZW4KICAgIHJldHVybgogIGZpCgogIHBvZF9hcnJheT0oKQogIHdoaWxlIHJlYWQgLXIgbnMgcG9kOyBkbwogICAgcG9kX2FycmF5Kz0oIiRuczokcG9kIikKICBkb25lIDwgPChrdWJlY3RsIGdldCBwb2QgLUEgLS1rdWJlY29uZmlnPSIke2NvbmZpZ30iIC0tbm8taGVhZGVycyAtLWlnbm9yZS1ub3QtZm91bmQgfCBhd2sgJyEvUnVubmluZ3xDb21wbGV0ZWQvIHsgcHJpbnQgJDEgIiAiICQyIH0nKQoKICBmb3IgcG9kIGluICIke3BvZF9hcnJheVtAXX0iOyBkbwogICAgbG9nICJGYWlsZWQgUG9kICR7cG9kfSBsb2dzIG9uIHRoZSAke25hbWV9IGNsdXN0ZXIiCiAgICBlY2hvICItLSBMT0cgU1RBUlQgKCR7cG9kfSkgLS0iCiAgICBrdWJlY3RsIGxvZ3MgLW4gIiR7cG9kJToqfSIgIiR7cG9kIyo6fSIgLS1rdWJlY29uZmlnPSIke2NvbmZpZ30iIC1wCiAgICBlY2hvICItLSBMT0cgRU5EIC0tIgogIGRvbmUKfQoKZnVuY3Rpb24gdGVhcmRvd24oKSB7CiAgbG9jYWwgY29uZmlnPSIkezE6LX4vLmt1YmUvY29uZmlnfSIKICBsb2NhbCB2bXM9IiIKICBsb2NhbCB2bVJlZj0iIgogIGxvY2FsIHZtUGF0aD0iIgogIHZtcz0kKGt1YmVjdGwgZ2V0IHZzcGhlcmV2bXMgLUEgLW8ganNvbiAtLWt1YmVjb25maWc9IiR7Y29uZmlnfSIgfCBqcSAnLml0ZW1zJykKICB2bXNwVm9sdW1lcz0iJChrdWJlY3RsIGdldCBwdiAtQSAtbyBqc29uIC0ta3ViZWNvbmZpZz0iJHtjb25maWd9IiB8IGpxICcuaXRlbXNbXS5zcGVjLmNzaS52b2x1bWVIYW5kbGUnIHwgc29ydCkiCiAgaWYgW1sgJChlY2hvICIke3Ztc30iIHwganEgJ2xlbmd0aCcpIC1lcSAwIF1dOyB0aGVuCiAgICByZXR1cm4KICBmaQogIGxvY2FsIHZtc0FycmF5PSgpCiAgbWFwZmlsZSAtdCB2bXNBcnJheSA8IDwoZWNobyAiJHt2bXN9IiB8IGpxIC1jICcuW10nKQogIGZvciB2bSBpbiAiJHt2bXNBcnJheVtAXX0iOyBkbwogICAgdm1SZWY9JChlY2hvICIke3ZtfSIgfCBqcSAtciAnLnN0YXR1cy52bVJlZicpCiAgICBpZiBbWyAiJHt2bVJlZn0iID09ICJudWxsIiBdXTsgdGhlbgogICAgICB2bVJlZj0kKGVjaG8gIiR7dm19IiB8IGpxIC1yICcuc3BlYy5ib290c3RyYXBSZWYubmFtZScpCiAgICAgIHZtUGF0aD0iJHtWU1BIRVJFX0ZPTERFUn0vJHt2bVJlZn0iCiAgICBlbHNlCiAgICAgIHZtUGF0aD0kKCIke0VYRUNVVEFCTEV9IiB2YyBpcGF0aCAtLXJlZiAiJHt2bVJlZn0iKQogICAgZmkKICAgIGxvZyAiVGVhcmluZyBkb3duIG1hY2hpbmUgd2l0aCBSZWY6ICR7dm1SZWZ9ICgke3ZtUGF0aH0pIgogICAgIiR7R09WQ30iIHZtLmRlc3Ryb3kgIiR7dm1QYXRofSIKICBkb25lCgogIGxvZyAiQ2xlYW5pbmcgdXAgY29udGFpbmVyIHZvbHVtZXMiCiAgdm9sdW1lc1dpdGhvdXRDb25zdW1lcklkPSQoIiR7R09WQ30iIGRpc2subHMgLWRzICIke0RBVEFTVE9SRX0iIC1sIC1qc29uIHwganEgJy5vYmplY3RzW10gfCBzZWxlY3QoLmNvbmZpZyB8IGhhcygiY29uc3VtZXJJZCIpIHwgbm90KSB8IC5jb25maWcuaWQuaWQnIHwgc29ydCApCiAgdm9sdW1lc1RvRGVsZXRlPSQoY29tbSAtMiA8KGVjaG8gIiR2bXNwVm9sdW1lcyIpIDwoZWNobyAiJHZvbHVtZXNXaXRob3V0Q29uc3VtZXJJZCIpKQogIGVjaG8gIiR7dm9sdW1lc1RvRGVsZXRlfSIgfCB4YXJncyAtSXt9ICIke0dPVkN9IiB2b2x1bWUucm0gInt9IiB8fCBsb2cgIkVycm9yOiBGYWlsZWQgdG8gcmVtb3ZlIHNvbWUgdm9sdW1lcy4iCn0KCmZ1bmN0aW9uIGV4aXRfaGFuZGxlcigpIHsKICBsb2NhbCBleGl0X2NvZGU9IiR7MTotJD99IgogIHNldCArZQogIHRyYXAgLSBFUlIKCiAgaWYgW1sgIiR7ZXhpdF9jb2RlfSIgIT0gIjAiIF1dOyB0aGVuCiAgICBpZiBbWyAtbiAiJHtTVEFHRTotfSIgXV07IHRoZW4KICAgICAgbWFya2VyICJFUlI6JHtTVEFHRX0iCiAgICBmaQoKICAgIGlmIFtbIC1uICIke1JFTU9URV9SRUdJU1RSWTotfSIgXV07IHRoZW4KICAgICAgT0NJX0NPVU5UPSQoY3VybCAtcyAiaHR0cDovLyR7UkVNT1RFX1JFR0lTVFJZfS92Mi9fY2F0YWxvZz9uPTEwMDAiIHwganEgJy5yZXBvc2l0b3JpZXMgfCBsZW5ndGgnKQogICAgICBpZiBbWyAiJHtPQ0lfQ09VTlR9IiAtbmUgIiR7RVhQRUNURURfT0NJX0NPVU5UfSIgXV07IHRoZW4KICAgICAgICBsb2cgIlRoZXJlIGFyZSBtaXNzaW5nIGltYWdlcywgZXhwZWN0ZWQgJHtFWFBFQ1RFRF9PQ0lfQ09VTlR9IGZvdW5kICR7T0NJX0NPVU5UfSIKICAgICAgZmkKICAgIGZpCgogICAgZGVidWdfaW5mbwoKICAgIGlmIFtbICIke0NMRUFOVVBfT05fRkFJTFVSRX0iID09ICJ0cnVlIiBdXTsgdGhlbgogICAgICBpZiBbWyAtbiAiJHtLSU5EX0tVQkVDT05GSUc6LX0iIF1dOyB0aGVuCiAgICAgICAgIyBUT0RPOiBpbiB0aGlzIGNhc2Ugd291bGQgaXQgYmUgYmV0dGVyIHRvIGRlbGV0ZSB0aGUgazhzIG9iamVjdHMgYW5kIGxldCB0aGUgY29udHJvbGxlciBkbyB0aGUgdGVhcmRvd24/CiAgICAgICAgdGVhcmRvd24gIiR7S0lORF9LVUJFQ09ORklHfSIKICAgICAgZmkKICAgICAgaWYgW1sgLW4gIiR7TUFOQUdFTUVOVF9LVUJFQ09ORklHOi19IiBdXTsgdGhlbgogICAgICAgIHRlYXJkb3duICIke01BTkFHRU1FTlRfS1VCRUNPTkZJR30iCiAgICAgIGZpCiAgICAgICMgcmVtb3ZlIHRoZSBraW5kIGNsdXN0ZXIgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgcmUtY3JlYXRlIHRoZSBWTXMKICAgICAgIyB1c2luZyB0aGUgY2xlYW51cCBib290c3RyYXAgc2NyaXB0IHdvdWxkIGFsc28gcmVtb3ZlIHRoZSBsb2dzIGFuZCB3ZSBkb24ndCB3YW50IHRoYXQKICAgICAgIyAiJHtDVVJSX0RJUn0vYm9vdHN0cmFwX2NsZWFudXAuc2giCiAgICAgIChraW5kIGRlbGV0ZSBjbHVzdGVycyAiJHtLSU5EX0NMVVNURVJ9IiAyPiYxIHx8IHRydWUpIHwgbG9nCiAgICBmaQogIGZpCgogIHJtIC1mICIke0JPT1RTVFJBUF9TVEVQU19MT0d9IgoKICBleGl0ICIke2V4aXRfY29kZX0iCn0KCmZ1bmN0aW9uIGRlYnVnX2luZm8oKSB7CiAgZWNobyAiLS0gREVCVUcgSU5GTyBTVEFSVCAtLSIKICBpZiBbWyAtbiAiJHtLSU5EX0tVQkVDT05GSUc6LX0iIF1dOyB0aGVuCiAgICBlY2hvICItLSBLSU5EIElORk8gLS0iCiAgICBrOHNfZGVidWdfaW5mbyAiJHtLSU5EX0tVQkVDT05GSUd9IgogIGZpCgogIGVjaG8gIi0tIE1BTkFHRU1FTlQgQ0xVU1RFUiBJTkZPIC0tIgogIGlmIFtbIC16ICIke01BTkFHRU1FTlRfS1VCRUNPTkZJRzotfSIgXV07IHRoZW4KICAgIGxvZyAiTm8gY29uZmlnIGZpbGUgZm91bmQgZm9yIHRoZSBBcHBsaWFuY2UgY2x1c3RlciAke0NMVVNURVJfTkFNRTotfSIKICAgIGVjaG8gIi0tIERFQlVHIElORk8gRU5EIC0tIgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAiIgogIGxvZyAiUG9kcyBvbiB0aGUgQXBwbGlhbmNlIGNsdXN0ZXIiCiAga3ViZWN0bCBnZXQgcG8gLUEgLW8gd2lkZSAtLWt1YmVjb25maWc9IiR7TUFOQUdFTUVOVF9LVUJFQ09ORklHfSIKICBsb2cgIk5vZGVzIG9uIHRoZSBBcHBsaWFuY2UgY2x1c3RlciIKICBrdWJlY3RsIGdldCBubyAtQSAtbyB3aWRlIC0ta3ViZWNvbmZpZz0iJHtNQU5BR0VNRU5UX0tVQkVDT05GSUd9IgogIGxvZyAiTm9kZXMgU3BlYyBvbiB0aGUgQXBwbGlhbmNlIGNsdXN0ZXIiCiAga3ViZWN0bCBnZXQgbm8gLUEgLW8geWFtbCAtLWt1YmVjb25maWc9IiR7TUFOQUdFTUVOVF9LVUJFQ09ORklHfSIKCiAgazhzX2RlYnVnX2luZm8gIiR7TUFOQUdFTUVOVF9LVUJFQ09ORklHfSIKCiAgZWNobyAiLS0gREVCVUcgSU5GTyBFTkQgLS0iCn0KCmZ1bmN0aW9uIGxvZ19tZXNzYWdlKCkgewogIGxvY2FsIG1lc3NhZ2U9IiR7KjotfSIKICAjIFRyaW0gbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBjb2xsYXBzZSBzcGFjZXMKICBtZXNzYWdlPSIke21lc3NhZ2UlJVtbOnNwYWNlOl1dfSIKICBtZXNzYWdlPSIke21lc3NhZ2UjI1tbOnNwYWNlOl1dfSIKICBtZXNzYWdlPSIkKGVjaG8gLW4gIiR7bWVzc2FnZSUkJ1xuJ30iIHwgdHIgLXMgJyAnKSIKICBpZiBbWyAteiAiJHttZXNzYWdlfSIgXV07IHRoZW4KICAgIHJldHVybiAwCiAgZmkKICBlY2hvIC1lICIkKGRhdGUgJyslWS8lbS8lZCAlSDolTTolUycpICR7bWVzc2FnZX0iCn0KCmZ1bmN0aW9uIGxvZygpIHsKICBsb2dfbWVzc2FnZSAiJHsqfSIKfQoKZnVuY3Rpb24gZXJyb3Jsb2coKSB7CiAgbG9nX21lc3NhZ2UgIkVSUk9SIDogJHsqfSIKICAjIHJldHJ5YWJsZSBlcnJvciB3aWxsIHRyaWdnZXIgdGhlIHRyYXAgaWYgLWUgaXMgc2V0CiAgIyBpbiBhIGZ1bmN0aW9uIHRoYXQgbWF5IGJlIHdyYXBwZWQgaW4gcmV0cnkgaXQncyBiZXR0ZXIgdG8gZXhwbGljaXRseSByZXR1cm4gdW5sZXMgdGhpcyB0aGUgbGFzdCBjYWxsCiAgcmV0dXJuIDIKfQoKZnVuY3Rpb24gY3JpdGljYWxsb2coKSB7CiAgbG9nX21lc3NhZ2UgIkNSSVRJQ0FMIDogJHsqfSIKICAjIG5vbiByZXRyaWFibGUgZXJyb3IsIGV4aXRzIHRoZSBzY3JpcHQgaW1tZWRpYXRlbHkKICAjIGRvZXMgbm90IHRyaWdnZXIgdGhlIGVycm9yIHRyYXAKICBleGl0IDEKfQoKZnVuY3Rpb24gZGVidWdsb2coKSB7CiAgaWYgW1sgIiR7REVCVUc6LX0iID09ICJ0cnVlIiBdXTsgdGhlbgogICAgbG9nX21lc3NhZ2UgIkRFQlVHIDogJHsqfSIKICBmaQp9CgpmdW5jdGlvbiB3YXJuaW5nbG9nKCkgewogIGlmIFtbICIke1dBUk46LX0iID09ICJ0cnVlIiBdXTsgdGhlbgogICAgbG9nX21lc3NhZ2UgIldBUk4gOiAkeyp9IgogIGZpCn0KCmZ1bmN0aW9uIHNwbGl0X2J5KCkgewogIGVjaG8gIiR7Mn0iIHwgdHIgIiQxIiAiXG4iCn0KCmZ1bmN0aW9uIGpvaW5fYnkoKSB7CiAgbG9jYWwgZD0kMQogIHNoaWZ0CiAgZWNobyAtbiAiJDEiCiAgc2hpZnQKICBwcmludGYgIiVzIiAiJHtALyMvJGR9Igp9CgpmdW5jdGlvbiBqb2luX3dpdGhfcHJlZml4KCkgewogIGxvY2FsIHA9JDEKICBzaGlmdAogIHByaW50ZiAnJXMnICIke0AvIy8kcH0iIHwgeGFyZ3MKfQoKZnVuY3Rpb24gd2FpdF9mb3Jfc2VydmVyKCkgewogIGxvZyAiV2FpdGluZyBmb3IgJHsxfSB0byBiZSBhdmFpbGFibGUiCiAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDE2CiAgdGltZW91dCAtcyBURVJNIDQ1IGJhc2ggLWMgJ3doaWxlIFtbICIkKGN1cmwgLXNrTG8gL2Rldi9udWxsIC13ICcnJXtodHRwX2NvZGV9JycgJHswfSB8fCB0cnVlKSIgIT0gIjIwMCIgXV07IGRvIHNsZWVwIDI7IGRvbmUnICIkezF9Igp9CgpmdW5jdGlvbiByZXRyeSgpIHsKICBsb2NhbCByZXRyaWVzPSIkMSIKICBsb2NhbCBtaW5fdD0yMAogIGxvY2FsIG1heF90PSQoKHJldHJpZXMgKiAxMCAvIDIpKQogIGxvY2FsIGNvbW1hbmQ9IiQyIgogIGxvY2FsIGFmdGVyPSIkezM6LX0iCiAgbG9jYWwgb3B0aW9ucz0iJC0iCgogIG1heF90PSQoKG1heF90ID4gbWluX3QgPyBtYXhfdCA6IG1pbl90KSkKCiAgIyBEaXNhYmxlIGVycm9yIHRyYXAKICBzYXZlX3RyYXBzPSQodHJhcCAtcCBFUlIpCiAgdHJhcCAtIEVSUgogIGlmIFtbICR7b3B0aW9uc30gPT0gKmUqIF1dOyB0aGVuCiAgICBzZXQgK2UKICBmaQoKICAjIFJ1biB0aGUgY29tbWFuZCBhbmQgY2FwdHVyZSBpdHMgZXhpdGNvZGUKICBldmFsICIke2NvbW1hbmR9IgogIGxvY2FsIGV4aXRfY29kZT0kPwoKICBpZiBbWyAkb3B0aW9ucyA9PSAqZSogXV07IHRoZW4KICAgIHNldCAtZQogIGZpCiAgIyBSZS1lbmFibGUgZXJyb3IgdHJhcAogIGV2YWwgIiR7c2F2ZV90cmFwc30iCgogIGlmIFtbICRleGl0X2NvZGUgLW5lIDAgJiYgJHJldHJpZXMgLWd0IDAgXV07IHRoZW4KICAgIGxvY2FsIHRpbWU9JCgobWF4X3QgLyByZXRyaWVzKSkKICAgIGlmIFtbIC1uICIke2FmdGVyfSIgXV07IHRoZW4KICAgICAgbG9nICJydW5uaW5nIGFmdGVyIGNvbW1hbmQ6ICR7YWZ0ZXJ9IgogICAgICBldmFsICIke2FmdGVyfSIKICAgIGZpCiAgICBsb2cgInJldHJ5aW5nIGluICR7dGltZX1zIgogICAgZGVidWdsb2cgInJldHJ5aW5nIGNvbW1hbmQgJHtjb21tYW5kfSBpbiAke3RpbWV9cyIKICAgIHNsZWVwICR7dGltZX0KICAgIHJldHJ5ICQoKHJldHJpZXMgLSAxKSkgIiR7Y29tbWFuZH0iICIke2FmdGVyfSIKICAgIGV4aXRfY29kZT0kPwogIGZpCgogIHJldHVybiAke2V4aXRfY29kZX0KfQoKZnVuY3Rpb24gZmx1eF9yZXRyeSgpIHsKICAjIFRoZSBoZWxtIHJlbGVhc2Ugc2VjcmV0IGlzIGFsd2F5cyBvbiB0aGUgbWFuYWdlbWVudCBjbHVzdGVyLgogICMgSW4gdGhlIGNhc2Ugb2YgYSByZW1vdGUgcmVsZWFzZSwgdGhlIFBEcyBhbmQgSFJzIHdpbGwgYmUgb24gdGhlIGtpbmQgY2x1c3Rlci4KICBsb2NhbCByZWxLQz0iJHtLSU5EX0tVQkVDT05GSUd9IgogIGxvY2FsIHNlY3JldEtDPSIke01BTkFHRU1FTlRfS1VCRUNPTkZJR30iCiAgaWYgW1sgIiR7MTotfSIgIT0gInJlbW90ZSIgXV07IHRoZW4KICAgIHJlbEtDPSIke01BTkFHRU1FTlRfS1VCRUNPTkZJR30iCiAgZmkKCiAgcGRfYXJyYXk9KCkKICB3aGlsZSByZWFkIC1yIG5zIHBkOyBkbwogICAgcGRfYXJyYXkrPSgiJG5zOiRwZCIpCiAgZG9uZSA8IDwoa3ViZWN0bCBnZXQgcGQgLUEgLS1uby1oZWFkZXJzIC0ta3ViZWNvbmZpZz0iJHtyZWxLQ30iIHwgZ3JlcCAtdiAiU3VjY2Vzc2Z1bCIgfCBhd2sgJ3sgcHJpbnQgJDEgIiAiICQyIH0nKQogICMgU3VzcGVuZCB0aGUgUEQncyBmaXJzdAogIGxvZyAiU3VzcGVuZGluZyBQYWNrYWdlRGVwbG95bWVudHMiCgogIGZvciBwZCBpbiAiJHtwZF9hcnJheVtAXX0iOyBkbwogICAga3ViZWN0bCBwYXRjaCBwZCAtLWt1YmVjb25maWc9IiR7cmVsS0N9IiAtbiAiJHtwZCU6Kn0iICIke3BkIyo6fSIgLS10eXBlPSdqc29uJyAtcD0nW3sib3AiOiAicmVwbGFjZSIsICJwYXRoIjogIi9zcGVjL3N1c3BlbmQvZW5hYmxlIiwgInZhbHVlIjogdHJ1ZX1dJwogIGRvbmUKCiAgbG9nICJTdXNwZW5kaW5nIGFuZCByZXN1bWluZyBwcm9ibGVtYXRpYyBoZWxtcmVsZWFzZXMiCiAgd2hpbGUgcmVhZCAtciBucyBocjsgZG8KICAgIGt1YmVjdGwgcGF0Y2ggaHIgLW4gIiRucyIgIiRociIgLS10eXBlPSdqc29uJyAtcD0nW3sib3AiOiAicmVwbGFjZSIsICJwYXRoIjogIi9zcGVjL3N1c3BlbmQiLCAidmFsdWUiOiB0cnVlfV0nIC0ta3ViZWNvbmZpZz0iJHtyZWxLQ30iCiAgICBrdWJlY3RsIHBhdGNoIGhyIC1uICIkbnMiICIkaHIiIC1wICd7InN0YXR1cyI6IG51bGx9JyAtLXR5cGU9bWVyZ2UgLS1zdWJyZXNvdXJjZSBzdGF0dXMgLS1rdWJlY29uZmlnPSIke3JlbEtDfSIKICAgIGxvZyAiVHJ5aW5nIHRvIGRlbGV0ZSBzZWNyZXRzIGZvciBoZWxtICRociBpbiBuYW1lc3BhY2UgJG5zIgogICAga3ViZWN0bCBkZWxldGUgc2VjcmV0IC1uICIkbnMiIC1sIG5hbWU9IiR7aHJ9Iixvd25lcj1oZWxtIC0taWdub3JlLW5vdC1mb3VuZCAtLWt1YmVjb25maWc9IiR7c2VjcmV0S0N9IgogICAga3ViZWN0bCBwYXRjaCBociAtbiAiJG5zIiAiJGhyIiAtLXR5cGU9J2pzb24nIC1wPSdbeyJvcCI6ICJyZXBsYWNlIiwgInBhdGgiOiAiL3NwZWMvc3VzcGVuZCIsICJ2YWx1ZSI6IGZhbHNlfV0nIC0ta3ViZWNvbmZpZz0iJHtyZWxLQ30iCiAgZG9uZSA8IDwoa3ViZWN0bCBnZXQgaHIgLUEgLS1uby1oZWFkZXJzIC0ta3ViZWNvbmZpZz0iJHtyZWxLQ30iIHwgZ3JlcCAnRmFsc2UnIHwgZ3JlcCAtdiAiZGVwZW5kZW5jeSIgfCBhd2sgJ3sgcHJpbnQgJDEgIiAiICQyIH0nKQoKICBsb2cgIlJlc3VtaW5nIFBhY2thZ2VEZXBsb3ltZW50cyIKICBmb3IgcGQgaW4gIiR7cGRfYXJyYXlbQF19IjsgZG8KICAgIGt1YmVjdGwgcGF0Y2ggcGQgLS1rdWJlY29uZmlnPSIke3JlbEtDfSIgLW4gIiR7cGQlOip9IiAiJHtwZCMqOn0iIC0tdHlwZT0nanNvbicgLXA9J1t7Im9wIjogInJlcGxhY2UiLCAicGF0aCI6ICIvc3BlYy9zdXNwZW5kL2VuYWJsZSIsICJ2YWx1ZSI6IGZhbHNlfV0nCiAgZG9uZQp9CgojIFRoaXMgdmFsaWRhdGVzIHRoYXQgYWxsIG9mIHRoZSBlc3hpIGhvc3RzIHByZXNlbnQgaW4gdGhlIHZzcGhlcmUgY2x1c3RlcgojIG11c3QgYmUgY29ubmVjdGVkIHRvIHRoZSB1c2VyIHByb3ZpZGVkIGRhdGFzdG9yZQpmdW5jdGlvbiB2YWxpZGF0ZV9hbGxfZXN4aV9ob3N0c19jb25uZWN0ZWRfdG9fZGF0YXN0b3JlKCkgewogIGxvY2FsIGNsdXN0ZXJfcGF0aD0iIgogIGxvY2FsIGVzeF9ob3N0X3BhdGg9IiIKICBsb2NhbCBmb3VuZD1mYWxzZQogIGNsdXN0ZXJfcGF0aD0iJCgke0dPVkN9IGZpbmQgLXR5cGUgYyAiJHtWU1BIRVJFX0NMVVNURVI6LX0iKSIKICBtYXBmaWxlIC10IGVzeF9ob3N0X3BhdGggPCA8KCR7R09WQ30gZmluZCAiJHtjbHVzdGVyX3BhdGh9IiAtdHlwZSBoKQogIGZvciBob3N0X3BhdGggaW4gIiR7ZXN4X2hvc3RfcGF0aFtAXX0iOyBkbwogICAgZm91bmQ9ZmFsc2UKICAgIG1hcGZpbGUgLWQsIC10IERTX0FSUkFZIDwgPChnb3ZjIG9iamVjdC5jb2xsZWN0IC1zICIke2hvc3RfcGF0aH0iIGRhdGFzdG9yZSkKICAgIGZvciBkcyBpbiAiJHtEU19BUlJBWVtAXX0iOyBkbwogICAgICBkYXRhc3RvcmVfcGF0aD0iJCh2bXNwIHZjIGlwYXRoIC0tcmVmICIke2RzJSQnXG4nfSIpIgogICAgICBpZiBbWyAiJHtkYXRhc3RvcmVfcGF0aH0iID09ICIke0RBVEFTVE9SRTotfSIgXV07IHRoZW4KICAgICAgICBmb3VuZD10cnVlCiAgICAgICAgYnJlYWsKICAgICAgZmkKICAgIGRvbmUKICAgIGlmIFtbICIke2ZvdW5kfSIgPT0gZmFsc2UgXV07IHRoZW4KICAgICAgYnJlYWsKICAgIGZpCiAgZG9uZQogIGlmIFtbICIke2ZvdW5kfSIgPT0gZmFsc2UgXV07IHRoZW4KICAgIHJldHVybiAwCiAgZmkKICByZXR1cm4gMQp9CgojIElmIEROUyBpcyBub3QgY29uZmlndXJlZCAoZS5nLiBNRENhYVMgdGVzdGJlZHMpLCBhZGQgYW4gZW50cnkgdG8gL2V0Yy9ob3N0cwojIGZvciB0aGUgbWFuZ2VtZW50IGludGVyZmFjZSBvZiB0aGUgZmlyc3QgRVNYaSBzZXJ2ZXIgY29ubmVjdGVkIHRvIHRoZSB2Q2VudGVyCiMgc28gdGhlIEVTWGkgaG9zdG5hbWUgY2FuIGJlIHJlc29sdmVkLgojIExvb2t1cCBvZiB0aGUgRVNYaSBob3N0bmFtZSBpcyByZXF1aXJlZCBieSB0aGUgImdvdmMgaW1wb3J0Lm92YSIgY29tbWFuZC4KIyAiZ292YyBpbXBvcnQub3ZhIiB3aWxsIHB1c2ggdGhlIE9WQSB0ZW1wbGF0ZSB0byB0aGlzIHNwZWNpZmljIEVTWGkgc2VydmVyLgojCiMgVGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgY29udGFpbiBPTkxZIHRoZSBFU1hpIGhvc3RuYW1lCiMgb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIHByb2Nlc3Mgd2lsbCByZWFkIHRoZSB3cm9uZyB2YWx1ZSBzaW5jZSB0aGUKIyBzdGFuZGFyZCBvdXRwdXQgZnJvbSB0aGUgY2hpbGQgYW5kIHBhcmVudCBwcm9jZXNzZXMgYXJlIGludGVybGVhdmVkLgpmdW5jdGlvbiBhZGRfZXN4aV90b19ldGNfaG9zdHMoKSB7CiAgIyBHZXQgSVAgYWRkcmVzcyBvZiBFU1hpIG1hbmFnZW1lbnQgaW50ZXJmYWNlCiAgbG9jYWwgY2x1c3Rlcl9wYXRoIGVzeF9ob3N0X3BhdGggZXN4X2hvc3RfbmFtZSBlc3hfaG9zdF9pcAogIGNsdXN0ZXJfcGF0aD0kKCR7R09WQ30gZmluZCAtdHlwZSBjICIke1ZTUEhFUkVfQ0xVU1RFUn0iKQogIGVzeF9ob3N0X3BhdGg9JCgke0dPVkN9IGZpbmQgIiR7Y2x1c3Rlcl9wYXRofSIgLXR5cGUgaCB8IGhlYWQgLW4gMSB8fCB0cnVlKQogIGVzeF9ob3N0X25hbWU9JCgke0dPVkN9IG9iamVjdC5jb2xsZWN0IC1zICIke2VzeF9ob3N0X3BhdGh9IiBuYW1lKQogICMgVE9ETzogZm9yIG5vdyBhc3N1bWUgdGhlIE1hbmFnZW1lbnQgaW50ZXJmYWNlIGlzIG9uIHZtazAKICBlc3hfaG9zdF9pcD0kKCR7R09WQ30gb2JqZWN0LmNvbGxlY3QgLWpzb24gXAogICAgIiR7ZXN4X2hvc3RfcGF0aH0iIGNvbmZpZy52aXJ0dWFsTmljTWFuYWdlckluZm8ubmV0Q29uZmlnIHwKICAgIGpxIC1lciAnLlswXS52YWwuX3ZhbHVlW10gfCBzZWxlY3QoLm5pY1R5cGU9PSJtYW5hZ2VtZW50IikgfAogICAgLmNhbmRpZGF0ZVZuaWNbXSB8IHNlbGVjdCguc3BlYy5uZXRTdGFja0luc3RhbmNlS2V5ID09ICJkZWZhdWx0VGNwaXBTdGFjayIpIHwKICAgIHNlbGVjdCAoLmRldmljZSA9PSAidm1rMCIpIHwgLnNwZWMuaXAuaXBBZGRyZXNzJyB8fCB0cnVlKQoKICBpZiAhIG5zbG9va3VwICIke2VzeF9ob3N0X25hbWV9IiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBpZiBbWyAtbiAiJHtlc3hfaG9zdF9pcH0iIF1dICYmICEgZ3JlcCAiXiR7ZXN4X2hvc3RfaXB9ICR7ZXN4X2hvc3RfbmFtZX0kIiAvZXRjL2hvc3RzID4gL2Rldi9udWxsOyB0aGVuCiAgICAgIGVjaG8gIiR7ZXN4X2hvc3RfaXB9ICR7ZXN4X2hvc3RfbmFtZX0iID4+IC9ldGMvaG9zdHMKICAgIGZpCiAgZmkKICBlY2hvICIke2VzeF9ob3N0X25hbWV9Igp9CgojIENoZWNrIGlmIG5hbWUgbGVuZ3RoIGV4Y2VlZHMgMjQwIENoYXJzCiMgd2UgYXV0by1nZW5lcmF0ZSBzb21lIHJlc291cmNlcyBsaWtlIG1hY2hpbmUsIG5vZGVzIHdoaWNoIGFkZCBzb21lIGNoYXJzCiMgbWF4aW11bSBsZW5ndGggb2Ygc3VjaCBhdXRvIGFkZGVkIGNoYXJzIHdlcmUgfjEyIHNvIHdlIHdpbGwgbGltaXQgdG8gMjQwICgyNTUtMTUpCiMgTWF0Y2ggd2l0aCByZWdleCBjb21wYXJpbmcgZG5zL2t1YmVybmV0ZXMgY29tcGxpYW50IG5hbWUKZnVuY3Rpb24gaXNfdmFsaWRfY2x1c3Rlcl9uYW1lKCkgewogIGxvY2FsIGNsdXN0ZXJfbmFtZT0kezF9CiAgbG9jYWwgcmVnZXg9Il5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyQiCgogIGlmIFtbICIkeyNjbHVzdGVyX25hbWV9IiAtZ3QgMjQwIF1dIHx8ICEgW1sgJHtjbHVzdGVyX25hbWU6LX0gPX4gJHtyZWdleH0gXV07IHRoZW4KICAgIHJldHVybiAxCiAgZmkKCiAgcmV0dXJuIDAKfQoKZnVuY3Rpb24gaXNfdmFsaWRfbm9kZV9wcmVmaXgoKSB7CiAgbG9jYWwgbm9kZV9wcmVmaXg9JHsxfQogIGxvY2FsIHJlZ2V4PSJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kIgoKICBpZiBbWyAiJHsjbm9kZV9wcmVmaXh9IiAtZ3QgNTcgXV0gfHwgISBbWyAke25vZGVfcHJlZml4Oi19ID1+ICR7cmVnZXh9IF1dOyB0aGVuCiAgICByZXR1cm4gMQogIGZpCgogIHJldHVybiAwCn0KCmZ1bmN0aW9uIGlzVkNSZXNvdXJjZU5hbWUoKSB7CiAgbG9jYWwgaW5wdXQ9IiQxIgogIGlmIFtbICIkaW5wdXQiID09IC8qIF1dOyB0aGVuCiAgICByZXR1cm4gMQogIGZpCgogIGlmIFtbICIkaW5wdXQiID1+IF4oW2EtekEtWl0rKDpbYS16QS1aMC05Xy4tXSspKT8kIF1dOyB0aGVuCiAgICByZXR1cm4gMQogIGZpCgogIHJldHVybiAwCn0KCmlzTXVsdGlsaW5lKCkgewogIGxvY2FsIGlucHV0PSIkMSIKICBpZiBbWyAiJGlucHV0IiA9PSAqJCdcbicqIF1dOyB0aGVuCiAgICByZXR1cm4gMAogIGZpCgogIHJldHVybiAxCn0KCmZ1bmN0aW9uIGVuc3VyZV9mb2xkZXIoKSB7CiAgaWYgW1sgLXogIiR7MTotfSIgXV07IHRoZW4KICAgIGVycm9ybG9nICJNSVNTSU5HIFZBTFVFOiBGb2xkZXIiCiAgICByZXR1cm4gMQogIGZpCiAgaWYgW1sgLXogIiQoJHtHT1ZDfSBmaW5kIC10eXBlIGYgfCBncmVwICIkezF9IiB8fCB0cnVlKSIgXV07IHRoZW4KICAgIGxvZyAiVmlydHVhbE1hY2hpbmUgRm9sZGVyICckezF9JyBkb2VzIG5vdCBleGlzdC4gQ3JlYXRpbmcgaXQuLi4iCiAgICAke0dPVkN9IGZvbGRlci5jcmVhdGUgIiR7MX0iCiAgZmkKfQoKIyBDcmVhdGUgVk0gRm9sZGVyIGluIHZTcGhlcmUgaWYgaXQgZG9lc24ndCBleGlzdApmdW5jdGlvbiBjcmVhdGVfdm1fZm9sZGVyKCkgewogIGlmIFtbICIke1ZTUEhFUkVfRk9MREVSfSIgIT0gIiR7REFUQUNFTlRFUn0vdm0iKiBdXTsgdGhlbgogICAgVlNQSEVSRV9GT0xERVI9IiR7REFUQUNFTlRFUn0vdm0vJHtWU1BIRVJFX0ZPTERFUn0iCiAgZmkKICBlbnN1cmVfZm9sZGVyICIke1ZTUEhFUkVfRk9MREVSfSIKICBpZiBbWyAteiAiJHtWU1BIRVJFX1RFTVBMQVRFX0ZPTERFUn0iIF1dOyB0aGVuCiAgICByZXR1cm4gMAogIGZpCiAgaWYgW1sgIiR7VlNQSEVSRV9URU1QTEFURV9GT0xERVJ9IiAhPSAiJHtEQVRBQ0VOVEVSfS92bSIqIF1dOyB0aGVuCiAgICBWU1BIRVJFX1RFTVBMQVRFX0ZPTERFUj0iJHtEQVRBQ0VOVEVSfS92bS8ke1ZTUEhFUkVfVEVNUExBVEVfRk9MREVSfSIKICBmaQogIGlmIFtbICIke1ZTUEhFUkVfVEVNUExBVEVfRk9MREVSfSIgPT0gIiR7VlNQSEVSRV9GT0xERVJ9IiBdXTsgdGhlbgogICAgcmV0dXJuIDAKICBmaQogIGVuc3VyZV9mb2xkZXIgIiR7VlNQSEVSRV9URU1QTEFURV9GT0xERVJ9Igp9CgojIENyZWF0ZSBSZXNvdXJjZSBQb29sIGluIHZTcGhlcmUgaWYgaXQgZG9lc24ndCBleGlzdApmdW5jdGlvbiBjcmVhdGVfcmVzb3VyY2VfcG9vbCgpIHsKICBpZiBbWyAiJHtWU1BIRVJFX1JFU09VUkNFX1BPT0x9IiAhPSAiJHtWU1BIRVJFX0NMVVNURVJ9L1Jlc291cmNlcyIqIF1dOyB0aGVuCiAgICBWU1BIRVJFX1JFU09VUkNFX1BPT0w9IiR7VlNQSEVSRV9DTFVTVEVSfS9SZXNvdXJjZXMvJHtWU1BIRVJFX1JFU09VUkNFX1BPT0x9IgogIGZpCiAgaWYgW1sgLXogIiQoJHtHT1ZDfSBmaW5kIC10eXBlIHAgfCBncmVwICIke1ZTUEhFUkVfUkVTT1VSQ0VfUE9PTH0iIHx8IHRydWUpIiBdXTsgdGhlbgogICAgbG9nICJSZXNvdXJjZSBwb29sICcke1ZTUEhFUkVfUkVTT1VSQ0VfUE9PTH0nIGRvZXMgbm90IGV4aXN0LiBDcmVhdGluZyBpdC4uLiIKICAgICR7R09WQ30gcG9vbC5jcmVhdGUgIiR7VlNQSEVSRV9SRVNPVVJDRV9QT09MfSIKICBmaQp9CgpmdW5jdGlvbiBzeW50aGV0aWNfY2hlY2tzKCkgewogIHN5bnRoZXRpY19jaGVja2VyX3N2Yz0iaHR0cHM6Ly8ke1BSSU1BUllfVklQfToke1NZTlRIRVRJQ19DSEVDS0VSX05PREVfUE9SVH0iCgogIHN5bnRoZXRpY19jaGVja2VyX3Jlc3VsdD0kKGN1cmwgLWtzTCAiJHtzeW50aGV0aWNfY2hlY2tlcl9zdmN9L3N0YXR1cz9zZWxlY3Rvcj1ncm91cCE9bm9uY3JpdGljYWwiIHwganEgLikKICBzeW50aGV0aWNfY2hlY2tlcl9lcnJvcnM9JChlY2hvICIke3N5bnRoZXRpY19jaGVja2VyX3Jlc3VsdH0iIHwganEgJy4gfCBtYXAoc2VsZWN0KC5vaz09ZmFsc2UpKScpCgogIGlmIFtbICQoZWNobyAiJHtzeW50aGV0aWNfY2hlY2tlcl9lcnJvcnN9IiB8IGpxIGxlbmd0aCkgLWd0IDAgXV07IHRoZW4KICAgIGVjaG8gIiR7c3ludGhldGljX2NoZWNrZXJfZXJyb3JzfSIKICAgIGVycm9ybG9nICJTeW50aGV0aWMgY2hlY2tzIGZhaWxlZC4iCiAgICByZXR1cm4gMQogIGZpCgogIGVjaG8gIiR7c3ludGhldGljX2NoZWNrZXJfcmVzdWx0fSIKCiAgcmV0dXJuIDAKfQoKIyBWYWxpZGF0ZSBwcm92aWRlZCBpcHY0IGFkZHJlc3NlcwpmdW5jdGlvbiB2YWxpZGF0ZV9pcCgpIHsKICBsb2NhbCBpcD0kMQogIGxvY2FsIG9jdGV0CiAgbG9jYWwgb2N0ZXRzPSgke2lwLy8uLyB9KQoKICAjIENoZWNrIGlmIHRoZSBJUCBoYXMgNCBvY3RldHMKICBpZiBbICR7I29jdGV0c1tAXX0gLW5lIDQgXTsgdGhlbgogICAgZXJyb3Jsb2cgIiR7MX0gaXAgaXMgbm90IHZhbGlkIElQVjQgYWRkcmVzcyIKICAgIHJldHVybiAxCiAgZmkKCiAgIyBDaGVjayBpZiBlYWNoIG9jdGV0IGlzIGEgdmFsaWQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1CiAgZm9yIG9jdGV0IGluICIke29jdGV0c1tAXX0iOyBkbwogICAgaWYgW1sgISAiJG9jdGV0IiA9fiBeWzAtOV0rJCBdXSB8fCBbICIkb2N0ZXQiIC1sdCAwIF0gfHwgWyAiJG9jdGV0IiAtZ3QgMjU1IF07IHRoZW4KICAgICAgZXJyb3Jsb2cgIiR7MX0gaXAgaXMgbm90IHZhbGlkIElQVjQgYWRkcmVzcyIKICAgICAgcmV0dXJuIDEKICAgIGZpCiAgZG9uZQp9CgojIEZ1bmN0aW9uIHRvIGNvbnZlcnQgSVAgdG8gYSBudW1lcmljIGZvcm1hdApmdW5jdGlvbiBpcF90b19pbnQoKSB7CiAgbG9jYWwgaXA9JDEKICBJRlM9Jy4nIHJlYWQgLXIgLWEgb2N0ZXRzIDw8PCAiJGlwIgogIGVjaG8gIiQoKCgke29jdGV0c1swXX0gPDwgMjQpICsgKCR7b2N0ZXRzWzFdfSA8PCAxNikgKyAoJHtvY3RldHNbMl19IDw8IDgpICsgJHtvY3RldHNbM119KSkiCn0KCiMgRnVuY3Rpb24gdG8gY29udmVydCBhIG51bWVyaWMgZm9ybWF0IGJhY2sgdG8gYW4gSVAKZnVuY3Rpb24gaW50X3RvX2lwKCkgewogIGxvY2FsIGludD0iJDEiCiAgZWNobyAiJCgoaW50ID4+IDI0ICYgMjU1KSkuJCgoaW50ID4+IDE2ICYgMjU1KSkuJCgoaW50ID4+IDggJiAyNTUpKS4kKChpbnQgJiAyNTUpKSIKfQoKZnVuY3Rpb24gaXNfdmFsaWRfY2lkcigpIHsKICBsb2NhbCBpcD0kMQogIGxvY2FsIHN1Ym5ldD0kMgoKICAjIENoZWNrIGlmIHRoZSBJUCBwYXJ0IGlzIHZhbGlkCiAgdmFsaWRhdGVfaXAgIiR7aXB9IgoKICAjIENoZWNrIGlmIHRoZSBzdWJuZXQgbWFzayBpcyBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDMyCiAgaWYgW1sgISAiJHN1Ym5ldCIgPX4gXlswLTldKyQgXV0gfHwgKChzdWJuZXQgPCAxIHx8IHN1Ym5ldCA+IDMyKSk7IHRoZW4KICAgIGVycm9ybG9nICJFcnJvcjogSW52YWxpZCBzdWJuZXQgbWFzayBwcm92aWRlZCBpbiBJUFBPT0xTX0FERFJFU1NFUy4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMyLiIKICAgIHJldHVybiAxCiAgZmkKICByZXR1cm4gMAp9CgpmdW5jdGlvbiBpcF9wb29sc192YWxpZGF0aW9uKCkgewogIGxvY2FsIElQUE9PTFNfQUREUkVTU0VTPSQxCiAgbG9jYWwgSVBQT09MU19HQVRFV0FZPSQyCiAgbG9jYWwgVE9UQUxfQ0xVU1RFUl9OT0RFUz0kMwogIGxvY2FsIE5VTV9JUFM9MAogIGRlY2xhcmUgLWEgSVBfQVJSQVkgIyBEZWNsYXJlIGFuIGVtcHR5IGFycmF5IHRvIGhvbGQgdGhlIElQcwoKICBPTERfSUZTPSRJRlMKCiAgIyBDYXNlIDE6IENoZWNrIGlmIGl0J3MgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMKICBpZiBbWyAiJHtJUFBPT0xTX0FERFJFU1NFU30iID1+IF5bMC05XStcLlswLTldK1wuWzAtOV0rXC5bMC05XSsoLFswLTldK1wuWzAtOV0rXC5bMC05XStcLlswLTldKykqJCBdXTsgdGhlbgogICAgSUZTPScsJyByZWFkIC1yYSBJUF9BUlJBWSA8PDwgIiR7SVBQT09MU19BRERSRVNTRVN9IgogICAgTlVNX0lQUz0keyNJUF9BUlJBWVtAXX0KCiAgICBmb3IgaXAgaW4gIiR7SVBfQVJSQVlbQF19IjsgZG8KICAgICAgIyBDaGVjayBpZiBwcm92aWRlZCBpcHMgYXJlIHZhbGlkIGlwdjQKICAgICAgdmFsaWRhdGVfaXAgIiR7aXB9IgoKICAgICAgaWYgY2hlY2tfaXBfaW5fdXNlICIke2lwfSI7IHRoZW4KICAgICAgICBlcnJvcmxvZyAiSVBQT09MUyBpcCAke2lwfSBpcyBhbHJlYWR5IGluIHVzZS4iCiAgICAgICAgcmV0dXJuIDEKICAgICAgZWxpZiBbWyAiJHtpcH0iID09ICIke0lQUE9PTFNfR0FURVdBWX0iIF1dOyB0aGVuCiAgICAgICAgZXJyb3Jsb2cgIiR7aXB9IGlzIHNhbWUgYXMgR0FURVdBWSBJUCIKICAgICAgICByZXR1cm4gMQogICAgICBmaQogICAgZG9uZQoKICAjIENhc2UgMjogQ2hlY2sgaWYgaXQncyBhIHJhbmdlIG9mIElQcyAoZS5nLiwgMTAuMC4xLjEwLTEwLjAuMS4xMDApCiAgZWxpZiBbWyAiJHtJUFBPT0xTX0FERFJFU1NFU30iID1+IF4oWzAtOV0rXC5bMC05XStcLlswLTldK1wuWzAtOV0rKS0oWzAtOV0rXC5bMC05XStcLlswLTldK1wuWzAtOV0rKSQgXV07IHRoZW4KICAgIHN0YXJ0X2lwPSQoZWNobyAiJHtJUFBPT0xTX0FERFJFU1NFU30iIHwgY3V0IC1kJy0nIC1mMSkKICAgIGVuZF9pcD0kKGVjaG8gIiR7SVBQT09MU19BRERSRVNTRVN9IiB8IGN1dCAtZCctJyAtZjIpCgogICAgI2NvbnZlcnQgYW4gSVAgYWRkcmVzcyB0byBhbiBpbnRlZ2VyCiAgICBzdGFydF9pcF9pbnQ9JChpcF90b19pbnQgIiRzdGFydF9pcCIpCiAgICBlbmRfaXBfaW50PSQoaXBfdG9faW50ICIkZW5kX2lwIikKCiAgICAjIENoZWNrIGlmIHRoZSByYW5nZSBpcyB2YWxpZCAoZW5kIElQIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc3RhcnQgSVApCiAgICBpZiAoKGVuZF9pcF9pbnQgPCBzdGFydF9pcF9pbnQpKTsgdGhlbgogICAgICBlcnJvcmxvZyAiSW52YWxpZCBJUCByYW5nZSAke0lQUE9PTFNfQUREUkVTU0VTfS4iCiAgICAgIHJldHVybiAxCiAgICBmaQogICAgTlVNX0lQUz0kKChlbmRfaXBfaW50IC0gc3RhcnRfaXBfaW50ICsgMSkpCiAgIyBDYXNlIDM6IENoZWNrIGlmIGl0J3MgYSBDSURSIG5vdGF0aW9uIHJhbmdlCiAgZWxpZiBbWyAiJHtJUFBPT0xTX0FERFJFU1NFU30iID1+IF4oWzAtOV17MSwzfVwuKXszfVswLTldezEsM30vWzAtOV0rJCBdXTsgdGhlbgogICAgSUZTPScvJyByZWFkIC1yIGlwIHN1Ym5ldCA8PDwgIiR7SVBQT09MU19BRERSRVNTRVN9IgogICAgaXNfdmFsaWRfY2lkciAiJHtpcH0iICIkc3VibmV0IgoKICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgSVBzIGluIHRoZSByYW5nZSAoMl4oMzIgLSBzdWJuZXQpKQogICAgTlVNX0lQUz0kKCgyICoqICgzMiAtIHN1Ym5ldCkpKQoKICBlbHNlCiAgICBlcnJvcmxvZyAiSW52YWxpZCBJUFBPT0xTX0FERFJFU1NFUyBmb3JtYXQuIFN1cHBvcnRlZCB2YWx1ZSBmb3JtYXRzIGFyZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBJUHMsIElQIHJhbmdlIChYLlguWC5YLVkuWS5ZLlkpIG9yIENJRFIgbm90YXRpb24gKFguWC5YLlgvTikiCiAgZmkKCiAgIyBDaGVjayBpZiB1c2VycyBoYXZlIHByb3ZpZGVkIGNvcnJlY3QgbnVtYmVyIG9mIElQcyBiYXNlZCBvbiBudW1iZXIgb2YgdG90YWwgY2x1c3RlciBub2RlcywKICAjIGZvciA8PSAzIG5vZGVzICwgbiArIDEgaXBzIHJlcXVpcmVkCiAgIyBmb3IgPiAzIG5vZGVzLCAgbiArIDIgaXAgcmVxdWlyZWQKICBpZiBbWyAiJHtUT1RBTF9DTFVTVEVSX05PREVTfSIgLWxlIDMgXV07IHRoZW4KICAgIHJlcXVpcmVkX2lwcz0kKCgiJHtUT1RBTF9DTFVTVEVSX05PREVTfSIgKyAxKSkKICBlbHNlCiAgICByZXF1aXJlZF9pcHM9JCgoIiR7VE9UQUxfQ0xVU1RFUl9OT0RFU30iICsgMikpCiAgZmkKCiAgaWYgKCgiJHtOVU1fSVBTfSIgPj0gIiR7cmVxdWlyZWRfaXBzfSIpKTsgdGhlbgogICAgbG9nICJWYWxpZGF0ZWQgbnVtYmVyIG9mIElQcyBwcm92aWRlZCBpbiBJUCBQb29scyIKICBlbHNlCiAgICBlcnJvcmxvZyAiVG90YWwgbnVtYmVyIG9mIElQcyBwcm92aWRlZCBpbiBJUCBQb29scyBhcmUgbm90IGVub3VnaCwgYmFzZWQgb24gdG90YWwgbnVtYmVyIG9mIGNsdXN0ZXIgbm9kZXMsICR7cmVxdWlyZWRfaXBzfSBJUHMgcmVxdWlyZWQiCiAgICByZXR1cm4gMQogIGZpCiAgSUZTPSRPTERfSUZTCn0KCmZ1bmN0aW9uIHZhbGlkYXRlX2xjbV9ob3N0KCkgewogIGxvY2FsIE9QU19NR01UX0hPU1Q9JDEKICBsb2NhbCBOQU1FU0VSVkVSUz0kMgoKICBPTERfSUZTPSRJRlMKICBJRlM9JywnIHJlYWQgLXJhIElQX0FSUkFZIDw8PCAiJHtOQU1FU0VSVkVSU30iCiAgZm9yIGlwIGluICIke0lQX0FSUkFZW0BdfSI7IGRvCiAgICB2YWxpZGF0ZV9pcCAiJHtpcH0iCgogICAgRE5TX1JFU1VMVD0kKGRpZyBAIiR7aXB9IiAiJHtPUFNfTUdNVF9IT1NUfSIgK3Nob3J0KQogICAgaWYgW1sgLXogIiR7RE5TX1JFU1VMVH0iIF1dOyB0aGVuCiAgICAgIGxvZyAiRE5TIHJlc29sdXRpb24gZmFpbGVkIHVzaW5nIG5hbWVzZXJ2ZXIgJHtpcH0gZm9yICR7T1BTX01HTVRfSE9TVH0iCiAgICBlbHNlCiAgICAgIGxvZyAiRE5TIHJlc29sdXRpb24gc3VjY2VlZGVkIHVzaW5nIG5hbWVzZXJ2ZXIgJHtpcH0iCiAgICAgIElGUz0kT0xEX0lGUwogICAgICByZXR1cm4gMAogICAgZmkKICBkb25lCiAgSUZTPSRPTERfSUZTCiAgcmV0dXJuIDEKfQoKZnVuY3Rpb24gY3JlYXRlX3ZjX3JvbGUoKSB7CiAgbG9jYWwgUk9MRV9OQU1FPSIkezF9IgogIHNoaWZ0CiAgbG9jYWwgUk9MRV9QRVJNSVNTSU9OUz0oIiR7QH0iKQoKICBpZiB2Y19yb2xlX2V4aXN0cyAiJHtST0xFX05BTUV9IjsgdGhlbgogICAgbG9nICJyb2xlICR7Uk9MRV9OQU1FfSBleGlzdHMiCiAgZWxzZQogICAgJHtHT1ZDfSByb2xlLmNyZWF0ZSAiJHtST0xFX05BTUV9IiAke1JPTEVfUEVSTUlTU0lPTlNbQF19CiAgZmkKfQoKZnVuY3Rpb24gdmNfcm9sZV9leGlzdHMoKSB7CiAgbG9jYWwgUk9MRV9OQU1FPSIkezF9IgogICR7R09WQ30gcm9sZS5scyAiJHtST0xFX05BTUV9IiA+IC9kZXYvbnVsbCAyPiYxCn0KCmZ1bmN0aW9uIGNyZWF0ZV92Y19zZXJ2aWNlYWNjb3VudCgpIHsKICBsb2NhbCBTQV9OQU1FPSIkezF9IgogIFNBX1BBU1NXT1JEPSIkKCR7RVhFQ1VUQUJMRX0gdmNlbnRlciBzZXJ2aWNlYWNjb3VudCAtLWNyZWF0ZSAtLW5hbWUgJHtTQV9OQU1FfSkiCiAgaWYgW1sgLXogIiR7U0FfUEFTU1dPUkR9IiBdXTsgdGhlbgogICAgZXJyb3Jsb2cgImZhaWxlZCB0byBnZW5lcmF0ZWQgc2VydmljZSBhY2NvdW50IgogICAgcmV0dXJuIDEKICBmaQogIGVjaG8gJHtTQV9OQU1FfSA+PiAke0JPT1RTVFJBUF9TQX0KICBlY2hvICIke1NBX1BBU1NXT1JEfSIKfQoKZnVuY3Rpb24gYXNzaWduX3JvbGVfdG9fc2EoKSB7CiAgbG9jYWwgU0FfTkFNRT0iJHsxfSIKICBsb2NhbCBST0xFPSIkezJ9IgoKICBST0xFX0lEPSQoJHtHT1ZDfSByb2xlLmxzIC1qc29uPXRydWUgIiR7Uk9MRX0iIHwganEgIi5yb2xlSWQiKQogIGlmIFtbIC16ICIke1JPTEVfSUR9IiBdXTsgdGhlbgogICAgZXJyb3Jsb2cgImZhaWxlZCB0byBnZXQgcm9sZSBpZCBmb3IgZ2l2ZW4gcm9sZTogJHtST0xFfSIKICAgIHJldHVybiAxCiAgZmkKCiAgZGVidWdsb2cgIkFzc2lnbmluZyAke1JPTEV9IHRvIHNlcnZpY2UgYWNjb3VudCAke1NBX05BTUV9IgogICR7RVhFQ1VUQUJMRX0gdmNlbnRlciBwZXJtaXNzaW9ucyAtLXByaW5jaXBhbCAiJHtTQV9OQU1FfUAke1NFUlZJQ0VfQUNDT1VOVF9ET01BSU59IiAtLXJvbGVpZCAke1JPTEVfSUR9Cn0KCmZ1bmN0aW9uIGVzY2FwZVNwZWNpYWxDaGFycygpIHsKICBsb2NhbCBpbnB1dF9zdHJpbmc9IiR7MX0iCiAgbG9jYWwgZXNjYXBlX2NoYXJzPSgiXFwiICJcIiIpCgogIGZvciBjaGFyIGluICIke2VzY2FwZV9jaGFyc1tAXX0iOyBkbwogICAgaW5wdXRfc3RyaW5nPSIke2lucHV0X3N0cmluZy8vIiR7Y2hhcn0iLyJcXCR7Y2hhcn0ifSIKICBkb25lCgogIGVjaG8gIiR7aW5wdXRfc3RyaW5nfSIKfQoKZnVuY3Rpb24gY2xlYW51cF92Y19zZXJ2aWNlYWNjb3VudCgpIHsKICBpZiBbWyAtcyAke0JPT1RTVFJBUF9TQX0gXV07IHRoZW4KICAgIHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KICAgICAgJHtFWEVDVVRBQkxFfSB2Y2VudGVyIHNlcnZpY2VhY2NvdW50IC0tZGVsZXRlIC0tbmFtZSAke2xpbmV9CiAgICBkb25lIDwgJHtCT09UU1RSQVBfU0F9CiAgZmkKICBybSAtcmYgJHtCT09UU1RSQVBfU0F9Cn0K EOF


Step 5: Apply the Patch

Apply the patch to `common.sh`:

base64 -d patch.tmp > common.sh

Step 6: Retry the bootstrap installation again from Ops UI