diff --git a/pkg/deploy/assets/gateway-production.json b/pkg/deploy/assets/gateway-production.json index 40853596420..983c7ec3a4a 100644 --- a/pkg/deploy/assets/gateway-production.json +++ b/pkg/deploy/assets/gateway-production.json @@ -290,7 +290,20 @@ "autoUpgradeMinorVersion": true, "settings": {}, "protectedSettings": { - "script": "[base64(concat(base64ToString('c2V0IC1leAoK'),'ACRRESOURCEID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('acrResourceId')),''')\n','AZURECLOUDNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureCloudName')),''')\n','AZURESECPACKQUALYSURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackQualysUrl')),''')\n','AZURESECPACKVSATENANTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackVSATenantId')),''')\n','DATABASEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('databaseAccountName')),''')\n','MDMFRONTENDURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdmFrontendUrl')),''')\n','MDSDENVIRONMENT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdEnvironment')),''')\n','FLUENTBITIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fluentbitImage')),''')\n','GATEWAYMDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayMdsdConfigVersion')),''')\n','GATEWAYDOMAINS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayDomains')),''')\n','GATEWAYFEATURES=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayFeatures')),''')\n','KEYVAULTDNSSUFFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultDNSSuffix')),''')\n','KEYVAULTPREFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultPrefix')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMDMACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdmAccount')),''')\n','RPMDSDACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdAccount')),''')\n','RPMDSDNAMESPACE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdNamespace')),''')\n','MDMIMAGE=''/distroless/genevamdm:2.2024.517.533-b73893-20240522t0954@sha256:939df9d7b6660874697f8ebed1fe56504f86d92f99801a9dc6fd98e9176d3f75''\n','LOCATION=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().location),''')\n','SUBSCRIPTIONID=$(base64 -d \u003c\u003c\u003c''',base64(subscription().subscriptionId),''')\n','RESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().name),''')\n','\n',base64ToString('IyEvYmluL2Jhc2gKIyBJbnRlcm5hbCBGdW5jdGlvbnMgYW5kIENvbnN0YW50cwoKIyBlbXB0eV9zdHIgLSBjb25zdGFudDsgdXNlZCBieSBmdW5jdGlvbnMgZm9yIG9wdGlvbmFsIG5hbWVyZWYgc3RyaW5nIGFyZ3VlbWVudHMKZGVjbGFyZSAtciBlbXB0eV9zdHI9IiIKCiMgcm9sZV9nYXRld2F5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIFZNU1MgaXMgYmVpbmcgYm9vdHN0cmFwcGVkCiMgdGhpcyBzaG91bGQgYmUgcmVmZXJlbmNlZCBieSBzY3JpcHRzIHNvdXJjaW5nIHRoaXMgZmlsZQpkZWNsYXJlIC1yIHJvbGVfZ2F0ZXdheT0iZ2F0ZXdheSIKIyByb2xlX3JwIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIFZNU1MgaXMgYmVpbmcgYm9vdHN0cmFwcGVkCiMgdGhpcyBzaG91bGQgYmUgcmVmZXJlbmNlZCBieSBzY3JpcHRzIHNvdXJjaW5nIHRoaXMgZmlsZQpkZWNsYXJlIC1yIHJvbGVfcnA9InJwIgoKIyBsb2cgaXMgYSB3cmFwcGVyIGZvciBlY2hvIHRoYXQgaW5jbHVkZXMgdGhlIGZ1bmN0aW9uIG5hbWUKIyBBcmdzCiMgMSkgbXNnIC0gc3RyaW5nCiMgMikgc3RhY2tfbGV2ZWwgLSBpbnQ7IG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjYWxsaW5nIGZ1bmN0aW9uCmxvZygpIHsKICAgIGxvY2FsIC1yIG1zZz0iJHsxOi0ibG9nIG1lc3NhZ2UgaXMgZW1wdHkifSIKICAgIGxvY2FsIC1yIHN0YWNrX2xldmVsPSIkezI6LTF9IgogICAgZWNobyAiJHtGVU5DTkFNRVske3N0YWNrX2xldmVsfV19OiAke21zZ30iCn0KCiMgYWJvcnQgaXMgYSB3cmFwcGVyIGZvciBsb2cgdGhhdCBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUKYWJvcnQoKSB7CiAgICBsb2NhbCAtcmkgb3JpZ2luX3N0YWNrbGV2ZWw9MgogICAgbG9nICIkezF9IiAiJG9yaWdpbl9zdGFja2xldmVsIgogICAgbG9nICJFeGl0aW5nIgogICAgZXhpdCAxCn0KCiMgd3JpdGVfZmlsZQojIEFyZ3MKIyAxKSBmaWxlbmFtZSAtIHN0cmluZwojIDIpIGZpbGVfY29udGVudHMgLSBzdHJpbmcKIyAzKSBjbG9iYmVyIC0gYm9vbGVhbjsgb3B0aW9uYWwgLSBkZWZhdWx0cyB0byBmYWxzZQp3cml0ZV9maWxlKCkgewogICAgbG9jYWwgLW4gZmlsZW5hbWU9IiQxIgogICAgbG9jYWwgLW4gZmlsZV9jb250ZW50cz0iJDIiCiAgICBsb2NhbCAtciBjbG9iYmVyPSIkezM6LWZhbHNlfSIKCiAgICBpZiAkY2xvYmJlcjsgdGhlbgogICAgICAgIGxvZyAiT3ZlcndyaXRpbmcgZmlsZSAkZmlsZW5hbWUiCiAgICAgICAgZWNobyAiJGZpbGVfY29udGVudHMiID4gIiRmaWxlbmFtZSIKICAgIGVsc2UKICAgICAgICBsb2cgIkFwcGVuZGluZyB0byAkZmlsZW5hbWUiCiAgICAgICAgZWNobyAiJGZpbGVfY29udGVudHMiID4+ICIkZmlsZW5hbWUiCiAgICBmaQp9CgojIHJldHJ5IEFkZGluZyByZXRyeSBsb2dpYyB0byB5dW0gY29tbWFuZHMgaW4gb3JkZXIgdG8gYXZvaWQgc3RhbGxpbmcgb3V0IG9uIHJlc291cmNlIGxvY2tzCiMgYXJnczoKIyAxKSBjbWRfcmV0cnkgLSBuYW1lcmVmLCBhcnJheTsgQ29tbWFuZCBhbmQgYXJndWVtZW50KHMpIHRvIHJldHJ5CiMgMikgd2FpdF90aW1lIC0gbmFtZXJlZiwgaW50ZWdlcjsgVGltZSB0byB3YWl0IGJlZm9yZSByZXRyeWluZyBjb21tYW5kCiMgMykgcmV0cmllcyAtIGludGVnZXIsIG9wdGlvbmFsOyBBbW1vdW50IG9mIHRpbWVzIHRvIHJldHJ5IGNvbW1hbmQsIGRlZmF1bHRzIHRvIDUKcmV0cnkoKSB7CiAgICBsb2NhbCAtbiBjbWRfcmV0cnk9IiQxIgogICAgbG9jYWwgLW4gd2FpdF90aW1lPSIkMiIKICAgIGxvY2FsIC1yaSByZXRyaWVzPSIkezM6LTV9IgoKICAgIGZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KICAgICAgICBsb2cgImF0dGVtcHQgIyR7YXR0ZW1wdH0gLSAke0ZVTkNOQU1FWzJdfSIKICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgICAgICAke2NtZF9yZXRyeVtAXX0gJgoKICAgICAgICB3YWl0ICQhICYmIGJyZWFrCiAgICAgICAgaWYgWyAiJHthdHRlbXB0fSIgLWxlICIkcmV0cmllcyIgXTsgdGhlbgogICAgICAgICAgICBzbGVlcCAiJHdhaXRfdGltZSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGFib3J0ICJhdHRlbXB0ICMke2F0dGVtcHR9IC0gRmFpbGVkIHRvIHVwZGF0ZSBwYWNrYWdlcyIKICAgICAgICBmaQogICAgZG9uZQp9CgojIHZlcmlmeV9yb2xlCiMgYXJnczoKIyAxKSB0ZXN0X3JvbGUgLSBuYW1lcmVmOyByb2xlIGJlaW5nIHZlcmlmaWVkCiMgMikgY2VydHMgLSBib29sZWFuLCBvcHRpb25hbDsgZGVmYXVsdHMgdG8gZmFsc2UuIFNldCB0byB0cnVlIHRvIGFkZCBkZXZwcm94eSB0byBhbGxvd2VkIHJvbGVzCnZlcmlmeV9yb2xlKCkgewogICAgbG9jYWwgLW4gdGVzdF9yb2xlPSIkMSIKICAgIGxvY2FsIC1yIGNlcnRzPSIkezI6LWZhbHNlfSIKCiAgICBhbGxvd2VkX3JvbGVzX2dsb2I9Iigkcm9sZV9ycHwkcm9sZV9nYXRld2F5KSIKICAgIGlmICRjZXJ0czsgdGhlbgogICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nICIpIiBhbmQgYXBwZW5kIGFkZGl0aW9uYWwgcm9sZQogICAgICAgIGFsbG93ZWRfcm9sZXNfZ2xvYj0iJHthbGxvd2VkX3JvbGVzX2dsb2IlXCkqfXxkZXZwcm94eSkiCiAgICBmaQoKICAgIGlmIFtbICIkdGVzdF9yb2xlIiA9fiAkYWxsb3dlZF9yb2xlc19nbG9iIF1dOyB0aGVuCiAgICAgICAgbG9nICJWZXJpZmllZCByb2xlIFwiJHRlc3Rfcm9sZVwiIgogICAgZWxzZQogICAgICAgIGFib3J0ICJmYWlsZWQgdG8gdmVyaWZ5IHJvbGUsIHJvbGUgXCIke3Rlc3Rfcm9sZX1cIiBub3QgaW4gXCIke2FsbG93ZWRfcm9sZXNfZ2xvYn1cIiIKICAgIGZpCn0KCiMgZ2V0X2tleXZhdWx0X3N1ZmZpeAojIGFyZ3M6CiMgMSkgcmwgLSBuYW1lcmVmLCBzdHJpbmc7IHJvbGUgdG8gZ2V0IHNob3J0IHJvbGUgZm9yCiMgMikga3Zfc3VmZml4IC0gbmFtZXJlZiwgc3RyaW5nOyBzaG9ydCByb2xlIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhpcyBuYW1lcmVmCiMgMykgc2VjX3ByZWZpeCAtIG5hbWVyZWYsIHN0cmluZzsga2V5dmF1bHQgY2VydGlmaWNhdGUgcHJlZml4IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhpcyBuYW1lcmVmCmdldF9rZXl2YXVsdF9zdWZmaXgoKSB7CiAgICBsb2NhbCAtbiBybD0iJDEiCiAgICBsb2NhbCAtbiBrdl9zdWZmaXg9IiQyIgogICAgbG9jYWwgLW4gc2VjX3ByZWZpeD0iJDMiCgogICAgbG9jYWwgLXIga2V5dmF1bHRfc3VmZml4X3JwPSJzdmMiCiAgICBsb2NhbCAtciBrZXl2YXVsdF9wcmVmaXhfZ2F0ZXdheT0iZ3d5IgoKICAgIGNhc2UgIiRybCIgaW4KICAgICAgICAiJHJvbGVfZ2F0ZXdheSIpCiAgICAgICAgICAgIGt2X3N1ZmZpeD0iJGtleXZhdWx0X3ByZWZpeF9nYXRld2F5IgogICAgICAgICAgICBzZWNfcHJlZml4PSIka2V5dmF1bHRfcHJlZml4X2dhdGV3YXkiCiAgICAgICAgICAgIDs7CiAgICAgICAgIiRyb2xlX3JwIikKICAgICAgICAgICAga3Zfc3VmZml4PSIka2V5dmF1bHRfc3VmZml4X3JwIgogICAgICAgICAgICBzZWNfcHJlZml4PSIkcm9sZV9ycCIKICAgICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgICBhYm9ydCAidW5rb3duIHJvbGUgJHJsIgogICAgICAgICAgICA7OwogICAgZXNhYwp9CgojIGNvbmZpZ3VyZV9zZWxpbnV4CiMgYXJnczoKIyAxKSByZWxhYmVsIC0gYm9vbGVhbiwgb3B0aW9uYWw7IGRlZmF1bHRzIHRvIGZhbHNlCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhYmVsIGZpbGVzeXN0ZW0gY29udGV4dApjb25maWd1cmVfc2VsaW51eCgpIHsKICAgIGxvY2FsIC1yIHJlbGFiZWw9IiR7MTotZmFsc2V9IgogICAgbG9nICJzdGFydGluZyIKCiAgICBhbHJlYWR5X2RlZmluZWRfaWdub3JlX2Vycm9yPSJGaWxlIGNvbnRleHQgZm9yIC92YXIvbG9nL2pvdXJuYWwoLy4qKT8gYWxyZWFkeSBkZWZpbmVkIgogICAgc2VtYW5hZ2UgZmNvbnRleHQgLWEgLXQgdmFyX2xvZ190ICIvdmFyL2xvZy9qb3VybmFsKC8uKik/IiB8fCBsb2cgIiRhbHJlYWR5X2RlZmluZWRfaWdub3JlX2Vycm9yIgogICAgY2hjb24gLVIgc3lzdGVtX3U6b2JqZWN0X3I6dmFyX2xvZ190OnMwIC92YXIvb3B0L21pY3Jvc29mdC9saW51eG1vbmFnZW50CgogICAgaWYgJHJlbGFiZWw7IHRoZW4KICAgICAgICByZXN0b3JlY29uIC1SRiAvdmFyL2xvZy8qIHx8IGxvZyAiJGFscmVhZHlfZGVmaW5lZF9pZ25vcmVfZXJyb3IiCiAgICBmaQp9CgojIHJlYm9vdF92bSByZXN0b3JlcyBhbGwgc2VsaW51eCBmaWxlIGNvbnRleHRzLCB0aGVuIHNjaGVkdWxlcyBhIHJlYm9vdCBmb3Igb25lIGhvdXIgbGF0ZXIKIyBSZWJvb3RzIHNob3VsZCBzY2hlZHVsZWQgYWZ0ZXIgYWxsIFZNIGV4dGVuc2lvbnMgaGF2ZSBoYWQgdGltZSB0byBjb21wbGV0ZQojIFJlZmVyZW5jZTogaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtbWFjaGluZXMvZXh0ZW5zaW9ucy9jdXN0b20tc2NyaXB0LWxpbnV4I3RpcHMKcmVib290X3ZtKCkgewogICAgbG9nICJzdGFydGluZyIKCiAgICBjb25maWd1cmVfc2VsaW51eCAidHJ1ZSIKICAgIChzaHV0ZG93biAtciBub3cgJikKfQojIS9iaW4vYmFzaAojIFJlcG9zaXRvcnkgYW5kIHBhY2thZ2UgbWFuYWdlbWVudCByZWxhdGVkIGZ1bmN0aW9ucwoKIyBjb25maWd1cmVfcnBtX3JlcG9zCiMgTmV3IHJlcG9zaXRvcmllcyBzaG91bGQgYmUgYWRkZWQgaW4gdGhlaXIgb3duIGZ1bmN0aW9ucywgYW5kIGNhbGxlZCBoZXJlCiMgYXJnczoKIyAxKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAyKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmNvbmZpZ3VyZV9ycG1fcmVwb3MoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGNvbmZpZ3VyZV9yaHVpX3JlcG8gIiQxIiAiJHsyOi19IgogICAgY3JlYXRlX2F6dXJlX3JwbV9yZXBvcwp9CgojIGRuZl9pbnN0YWxsX3BrZ3MKIyBhcmdzOgojIDEpIHBrZ3MgLSBuYW1lcmVmLCBzdHJpbmcgYXJyYXk7IFBhY2thZ2VzIHRvIGJlIGluc3RhbGxlZAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDMpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1vdW50IG9mIHRpbWVzIHRvIHJldHJ5IGNvbW1hbmQsIGRlZmF1bHRzIHRvIDUKZG5mX2luc3RhbGxfcGtncygpIHsKICAgIGxvY2FsIC1uIHBrZ3M9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICBsb2NhbCAtYSBjbWQ9KAogICAgICAgIGRuZgogICAgICAgIC15CiAgICAgICAgaW5zdGFsbAogICAgKQogICAgCiAgICAjIFJlZmVyZW5jZTogaHR0cHM6Ly93d3cuc2hlbGxjaGVjay5uZXQvd2lraS9TQzIyMDYKICAgICMgYXBwZW5kIHBrZ3MgYXJyYXkgdG8gY21kCiAgICBtYXBmaWxlIC1PICQoKCAkeyNjbWRbQF19ICsgMSApKSAtZCAnICcgY21kIDw8PCAiJHtwa2dzW0BdfSIKICAgIGxvY2FsIC1yIGNtZAoKICAgIGxvZyAiQXR0ZW1wdGluZyB0byBpbnN0YWxsIHBhY2thZ2VzOiAke3BrZ3NbKl19IgogICAgcmV0cnkgY21kICIkMiIgIiR7MzotfSIKfQoKCiMgZG5mX3VwZGF0ZV9wa2dzCiMgYXJnczoKIyAxKSBleGNsdWRlcyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheSwgb3B0aW9uYWw7IFBhY2thZ2VzIHRvIGV4Y2x1ZGUgZnJvbSB1cGRhdGluZwojICAgICAgIEVhY2ggaW5kZXggbXVzdCBiZSBwcmVmaXhlZCB3aXRoIC14IAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDMpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1tb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmRuZl91cGRhdGVfcGtncygpIHsKICAgIGxvY2FsIC1uIGV4Y2x1ZGVzPSIkezE6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1hIGNtZD0oCiAgICAgICAgZG5mCiAgICAgICAgLXkKICAgICAgICAjIFJlcGxhY2VkIHdpdGggZXhjbHVkZXMKICAgICAgICAiIgogICAgICAgIHVwZGF0ZQogICAgICAgIC0tYWxsb3dlcmFzaW5nCiAgICApCgogICAgaWYgWyAtbiAiJHtleGNsdWRlc30iIF07IHRoZW4KICAgICAgICAjIFJlZmVyZW5jZSBodHRwczovL3d3dy5zaGVsbGNoZWNrLm5ldC93aWtpL1NDMjIwNgogICAgICAgIG1hcGZpbGUgLU8gMiBjbWQgPDw8ICIke2V4Y2x1ZGVzW0BdfSIKICAgIGVsc2UKICAgICAgICAjIFJlbW92ZSBlbXB0eSBzdHJpbmcgaWYgd2UgYXJlbid0IHJlcGxhY2luZyB0aGVtLCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciwgYnV0IHdoeSBub3QgYmUgc2FmZQogICAgICAgIHVuc2V0ICJjbWRbMl0iCiAgICBmaQogICAgbG9jYWwgLXIgY21kCgogICAgbG9nICJVcGRhdGluZyBhbGwgcGFja2FnZXMgZXhjbHVkaW5nIFwiJHtleGNsdWRlc1sqXTotfVwiIgogICAgcmV0cnkgY21kICIkMiIgIiR7MzotfSIKfQoKCiMgY3JlYXRlX2F6dXJlX3JwbV9yZXBvcyBjcmVhdGVzIC9ldGMveXVtLnJlcG9zLmQvYXp1cmUucmVwbyByZXBvc2l0b3J5IGZpbGUKY3JlYXRlX2F6dXJlX3JwbV9yZXBvcygpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLXIgYXp1cmVfcmVwb19maWxlbmFtZT0nL2V0Yy95dW0ucmVwb3MuZC9henVyZS5yZXBvJwogICAgbG9jYWwgLXIgYXp1cmVfcmVwb19maWxlPSdbYXp1cmUtY2xpXQpuYW1lPWF6dXJlLWNsaQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZS1jbGkKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9eWVzCgpbYXp1cmVjb3JlXQpuYW1lPWF6dXJlY29yZQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZWNvcmUKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9bm8nCgogICAgd3JpdGVfZmlsZSBhenVyZV9yZXBvX2ZpbGVuYW1lIGF6dXJlX3JlcG9fZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3JodWlfcmVwbyBlbmFibGVzIGFsbCByaHVpLW1pY3Jvc29mdC1henVyZSogcmVwb3MKIyBhcmdzOgojIDEpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDIpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1vdW50IG9mIHRpbWVzIHRvIHJldHJ5IGNvbW1hbmQsIGRlZmF1bHRzIHRvIDUKY29uZmlndXJlX3JodWlfcmVwbygpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLXJhIGNtZD0oCiAgICAgICAgZG5mCiAgICAgICAgdXBkYXRlCiAgICAgICAgLXkKICAgICAgICAtLWRpc2FibGVyZXBvPScqJwogICAgICAgIC0tZW5hYmxlcmVwbz0ncmh1aS1taWNyb3NvZnQtYXp1cmUqJwogICAgKQoKICAgIGxvZyAicnVubmluZyBSSFVJIHBhY2thZ2UgdXBkYXRlcyIKICAgIHJldHJ5IGNtZCAiJDEiICIkezI6LX0iCn0KCiMgY29uZmlndXJlX2RuZl9jcm9uX2pvYgojIGNyZWF0ZSBjcm9uIGpvYiB0byBhdXRvIHVwZGF0ZSBycG0gcGFja2FnZXMKY29uZmlndXJlX2RuZl9jcm9uX2pvYigpIHsKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2NhbCAtciBjcm9uX3dlZWtseV9kbmZfdXBkYXRlX2ZpbGVuYW1lPScvZXRjL2Nyb24ud2Vla2x5L2RuZnVwZGF0ZScKICAgIGxvY2FsIC1yIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZT0iIyEvYmluL2Jhc2gKZG5mIHVwZGF0ZSAteSIKCiAgICB3cml0ZV9maWxlIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUgY3Jvbl93ZWVrbHlfZG5mX3VwZGF0ZV9maWxlIHRydWUKICAgIGNobW9kIHUreCAiJGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUiCn0KCiMgcnBtX2ltcG9ydF9rZXlzCiMgYXJnczoKIyAxKSBrZXlzIC0gbmFtZXJlZiwgc3RyaW5nIGFycmF5OyBycG0ga2V5cyB0byBiZSBpbXBvcnRlZAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZApycG1faW1wb3J0X2tleXMoKSB7CiAgICBsb2NhbCAtbiBrZXlzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3Iga2V5IGluICR7a2V5c1tAXX07IGRvCiAgICAgICAgaWYgWyAkeyNrZXlzW0BdfSAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZmkKICAgICAgICAgICAgbG9jYWwgLWEgY21kPSgKICAgICAgICAgICAgICAgIHJwbQogICAgICAgICAgICAgICAgLS1pbXBvcnQKICAgICAgICAgICAgICAgIC12CiAgICAgICAgICAgICAgICAiJGtleSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgbG9nICJJbXBvcnRpbmcgcnBtIHJlcG9zaXRvcnkga2V5ICRrZXkiCiAgICAgICAgICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iICYmIHVuc2V0IGtleQogICAgZG9uZQp9CiMhL2Jpbi9iYXNoCiMgQVJPIHNlcnZpY2Ugc2V0dXAgZnVuY3Rpb25zCgojIGNvbmZpZ3VyZV92bXNzX2Fyb19zZXJ2aWNlCiMgYXJnczoKIyAxKSByIC0gbmFtZXJlZiwgc3RyaW5nOyByb2xlIG9mIFZNU1MKIyAyKSBpbWFnZXMgLSBuYW1lcmVmLCBhc3NvY2lhdGl2ZSBhcnJheTsgQVJPIGNvbnRhaW5lciBpbWFnZXMKIyAzKSBjb25maWdzIC0gbmFtZXJlZiwgYXNzb2NpYXRpdmUgYXJyYXk7IGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHZlcnNpb25zLiBUaGUgdmFsdWVzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byB2YXJpYWJsZXMsIG5vdCBkZXJlZmVyZW5jZWQuCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIHZhbHVlIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBuYW1lcmVmIHZhcmlhYmxlcyBieSBoZWxwZXIgZnVuY3Rpb25zLgpjb25maWd1cmVfdm1zc19hcm9fc2VydmljZXMoKSB7CiAgICBsb2NhbCAtbiByPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlcz0iJDIiCiAgICBsb2NhbCAtbiBjb25maWdzPSIkMyIKICAgIGxvZyAic3RhcnRpbmciCiAgICB2ZXJpZnlfcm9sZSAiJDEiCgogICAgaWYgWyAiJHIiID09ICIkcm9sZV9nYXRld2F5IiBdOyB0aGVuCiAgICAgICAgY29uZmlndXJlX3NlcnZpY2VfYXJvX2dhdGV3YXkgIiR7Y29uZmlnc1sibG9nX2RpciJdfSIgIiR7aW1hZ2VzWyJycCJdfSIgIiQxIiAiJHtjb25maWdzWyJnYXRld2F5X2NvbmZpZyJdfSIKICAgIGVsaWYgWyAiJHIiID09ICIkcm9sZV9ycCIgXTsgdGhlbgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19ycCAiJHtpbWFnZXNbInJwIl19IiAiJDEiICIke2NvbmZpZ3NbInJwX2NvbmZpZyJdfSIKICAgICAgICBjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvciAiJHtpbWFnZXNbInJwIl19IgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwgIiR7aW1hZ2VzWyJycCJdfSIKICAgIGZpCgogICAgY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0ICIke2NvbmZpZ3NbImZsdWVudGJpdCJdfSIgIiR7aW1hZ2VzWyJmbHVlbnRiaXQiXX0iCiAgICBjb25maWd1cmVfc2VydmljZV9tZG0gIiQxIiAiJHtpbWFnZXNbIm1kbSJdfSIKICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QgIiQxIiAiJHtjb25maWdzWyJtZHNkIl19IgogICAgY29uZmlndXJlX2NlcnRzICIkMSIKICAgIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QgIiQxIgp9CgojIGVuYWJsZV9zZXJ2aWNlcyBlbmFibGVzIGFsbCBzZXJ2aWNlcyByZXF1aXJlZCBmb3IgYXJvIHJwCiMgYXJnczoKIyAxKSBzZXJ2aWNlcyAtIGFycmF5OyBzZXJ2aWNlcyB0byBiZSBlbmFibGVkCmVuYWJsZV9zZXJ2aWNlcygpIHsKICAgIGxvY2FsIC1uIHNlcnZpY2VzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQKCiAgICBsb2cgImVuYWJsaW5nIHNlcnZpY2VzICR7c2VydmljZXNbKl19IgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3Igc2VydmljZSBpbiAke3NlcnZpY2VzW0BdfTsgZG8KICAgICAgICBsb2cgIkVuYWJsaW5nIGFuZCBzdGFydGluZyAkc2VydmljZSBub3ciCiAgICAgICAgc3lzdGVtY3RsIGVuYWJsZSBcCiAgICAgICAgICAgICAgICAgIC0tbm93IFwKICAgICAgICAgICAgICAgICAgIiRzZXJ2aWNlIgogICAgZG9uZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19nYXRld2F5CiMgYXJnczoKIyAxKSBsb2dfZGlyIC0gbmFtZXJlZiwgc3RyaW5nOyBkaXJlY3RvcnkgdG8gbW91bnQgZm9yIGxvZ2dpbmcgZGlyZWN0b3J5IG9mIGNvbnRhaW5lcgojIDIpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBjb250YWluZXIgaW1hZ2UKIyAzKSByb2xlIC0gbmFtZXJlZiwgc3RyaW5nOyBWTVNTIHJvbGUKIyA0KSBjb25mX2ZpbGUgLSBuYW1lcmVmLCBzdHJpbmc7IGFybyBnYXRld2F5IGVudmlyb25tZW50IGZpbGUKY29uZmlndXJlX3NlcnZpY2VfYXJvX2dhdGV3YXkoKSB7CiAgICBsb2NhbCAtbiBsb2dfZGlyPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlPSIkMiIKICAgIGxvY2FsIC1uIHJvbGU9IiQzIgogICAgbG9jYWwgLW4gY29uZl9maWxlPSIkNCIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGFyby1nYXRld2F5IHNlcnZpY2UiCgogICAgbG9jYWwgLXIgYXJvX2dhdGV3YXlfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLWdhdGV3YXknCgogICAgd3JpdGVfZmlsZSBhcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lIGNvbmZfZmlsZSB0cnVlCgogICAgbG9jYWwgLXIgYXJvX2dhdGV3YXlfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tZ2F0ZXdheS5zZXJ2aWNlJwoKICAgIGxvY2FsIC1yIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9JHthcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lfQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnRQcmU9L3Vzci9iaW4vbWtkaXIgLXAgJHtsb2dfZGlyfQpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFDUl9SRVNPVVJDRV9JRCBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBHQVRFV0FZX0RPTUFJTlMgXAogIC1lIEdBVEVXQVlfRkVBVFVSRVMgXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtbSAyZyBcCiAgLXAgODA6ODA4MCBcCiAgLXAgODA4MTo4MDgxIFwKICAtcCA0NDM6ODQ0MyBcCiAgLXYgL3J1bi9zeXN0ZW1kL2pvdXJuYWw6L3J1bi9zeXN0ZW1kL2pvdXJuYWwgXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogIC12ICR7bG9nX2Rpcn06L2N0ci5sb2c6eiBcCiAgJGltYWdlIFwKICAke3JvbGUsLH0KRXhlY1N0b3A9L3Vzci9iaW4vZG9ja2VyIHN0b3AgLXQgMzYwMCAlTgpUaW1lb3V0U3RvcFNlYz0zNjAwClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CiAgICAiCgogICAgd3JpdGVfZmlsZSBhcm9fZ2F0ZXdheV9zZXJ2aWNlX2ZpbGVuYW1lIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfYXJvX3JwCiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgUlAgY29udGFpbmVyIGltYWdlCiMgMikgcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgVk1TUyByb2xlCiMgMykgY29uZl9maWxlIC0gbmFtZXJlZiwgc3RyaW5nOyBhcm8gcnAgZW52aXJvbm1lbnQgZmlsZQpjb25maWd1cmVfc2VydmljZV9hcm9fcnAoKSB7CiAgICBsb2NhbCAtbiBpbWFnZT0iJDEiCiAgICBsb2NhbCAtbiByb2xlPSIkMiIKICAgIGxvY2FsIC1uIGNvbmZfZmlsZT0iJDMiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8tcnAgc2VydmljZSIKCiAgICBsb2NhbCAtciBhcm9fcnBfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLXJwJwoKICAgIHdyaXRlX2ZpbGUgYXJvX3JwX2NvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICBsb2NhbCAtciBhcm9fcnBfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tcnAuc2VydmljZScKICAgIGxvY2FsIC1yIGFyb19ycF9zZXJ2aWNlX2ZpbGU9IltVbml0XQpBZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXQKV2FudHM9bmV0d29yay1vbmxpbmUudGFyZ2V0CgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPSR7YXJvX3JwX2NvbmZfZmlsZW5hbWV9CkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLWUgQUNSX1JFU09VUkNFX0lEIFwKICAtZSBBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIEFSTV9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIEFaVVJFX0FSTV9DTElFTlRfSUQgXAogIC1lIEFaVVJFX0ZQX0NMSUVOVF9JRCBcCiAgLWUgQ0xVU1RFUl9NRE1fQUNDT1VOVCBcCiAgLWUgQ0xVU1RFUl9NRE1fTkFNRVNQQUNFIFwKICAtZSBDTFVTVEVSX01EU0RfQUNDT1VOVCBcCiAgLWUgQ0xVU1RFUl9NRFNEX0NPTkZJR19WRVJTSU9OIFwKICAtZSBDTFVTVEVSX01EU0RfTkFNRVNQQUNFIFwKICAtZSBEQVRBQkFTRV9BQ0NPVU5UX05BTUUgXAogIC1lIERPTUFJTl9OQU1FIFwKICAtZSBHQVRFV0FZX0RPTUFJTlMgXAogIC1lIEdBVEVXQVlfUkVTT1VSQ0VHUk9VUCBcCiAgLWUgS0VZVkFVTFRfUFJFRklYIFwKICAtZSBNRE1fQUNDT1VOVCBcCiAgLWUgTURNX05BTUVTUEFDRSBcCiAgLWUgTURTRF9FTlZJUk9OTUVOVCBcCiAgLWUgUlBfRkVBVFVSRVMgXAogIC1lIEFST19JTlNUQUxMX1ZJQV9ISVZFIFwKICAtZSBBUk9fSElWRV9ERUZBVUxUX0lOU1RBTExFUl9QVUxMU1BFQyBcCiAgLWUgQVJPX0FET1BUX0JZX0hJVkUgXAogIC1lIFVTRV9DSEVDS0FDQ0VTUyBcCiAgLWUgT0lEQ19BRkRfRU5EUE9JTlQgXAogIC1lIE9JRENfU1RPUkFHRV9BQ0NPVU5UX05BTUUgXAogIC1tIDJnIFwKICAtcCA0NDM6ODQ0MyBcCiAgLXYgL2V0Yy9hcm8tcnA6L2V0Yy9hcm8tcnAgXAogIC12IC9ydW4vc3lzdGVtZC9qb3VybmFsOi9ydW4vc3lzdGVtZC9qb3VybmFsIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkaW1hZ2UgXAogICR7cm9sZSwsfQpFeGVjU3RvcD0vdXNyL2Jpbi9kb2NrZXIgc3RvcCAtdCAzNjAwICVOClRpbWVvdXRTdG9wU2VjPTM2MDAKUmVzdGFydD1hbHdheXMKUmVzdGFydFNlYz0xClN0YXJ0TGltaXRJbnRlcnZhbD0wCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSBhcm9fcnBfc2VydmljZV9maWxlbmFtZSBhcm9fcnBfc2VydmljZV9maWxlIHRydWUKfQoKIyBjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvcgojIGFyZ3M6CiMgMSkgaW1hZ2UgLSBuYW1lcmVmLCBzdHJpbmc7IFJQIGNvbnRhaW5lciBpbWFnZQpjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvcigpIHsKICAgIGxvY2FsIC1uIGltYWdlPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGFyby1tb25pdG9yIHNlcnZpY2UiCgogICAgIyBET01BSU5fTkFNRSwgQ0xVU1RFUl9NRFNEX0FDQ09VTlQsIENMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTiwgR0FURVdBWV9ET01BSU5TLCBHQVRFV0FZX1JFU09VUkNFR1JPVVAsIE1EU0RfRU5WSVJPTk1FTlQgQ0xVU1RFUl9NRFNEX05BTUVTUEFDRQogICAgIyBhcmUgbm90IHVzZWQsIGJ1dCBjYW4ndCBlYXNpbHkgYmUgcmVmYWN0b3JlZCBvdXQuIFNob3VsZCBiZSByZXZpc2l0ZWQgaW4gdGhlIGZ1dHVyZS4KICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLW1vbml0b3InCiAgICBsb2NhbCAtciBhcm9fbW9uaXRvcl9zZXJ2aWNlX2NvbmZfZmlsZT0iQVpVUkVfRlBfQ0xJRU5UX0lEPSckRlBDTElFTlRJRCcKRE9NQUlOX05BTUU9JyRMT0NBVElPTi4kQ0xVU1RFUlBBUkVOVERPTUFJTk5BTUUnCkNMVVNURVJfTURTRF9BQ0NPVU5UPSckQ0xVU1RFUk1EU0RBQ0NPVU5UJwpDTFVTVEVSX01EU0RfQ09ORklHX1ZFUlNJT049JyRDTFVTVEVSTURTRENPTkZJR1ZFUlNJT04nCkdBVEVXQVlfRE9NQUlOUz0nJEdBVEVXQVlET01BSU5TJwpHQVRFV0FZX1JFU09VUkNFR1JPVVA9JyRHQVRFV0FZUkVTT1VSQ0VHUk9VUE5BTUUnCk1EU0RfRU5WSVJPTk1FTlQ9JyRNRFNERU5WSVJPTk1FTlQnCkNMVVNURVJfTURTRF9OQU1FU1BBQ0U9JyRDTFVTVEVSTURTRE5BTUVTUEFDRScKQ0xVU1RFUl9NRE1fQUNDT1VOVD0nJENMVVNURVJNRE1BQ0NPVU5UJwpDTFVTVEVSX01ETV9OQU1FU1BBQ0U9QkJNCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCktFWVZBVUxUX1BSRUZJWD0nJEtFWVZBVUxUUFJFRklYJwpNRE1fQUNDT1VOVD0nJFJQTURNQUNDT1VOVCcKTURNX05BTUVTUEFDRT1CQk0KUlBJTUFHRT0nJGltYWdlJyIKCiAgICB3cml0ZV9maWxlIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlbmFtZSBhcm9fbW9uaXRvcl9zZXJ2aWNlX2NvbmZfZmlsZSB0cnVlCgogICAgbG9jYWwgLXIgYXJvX21vbml0b3Jfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tbW9uaXRvci5zZXJ2aWNlJwogICAgbG9jYWwgLXIgYXJvX21vbml0b3Jfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tbW9uaXRvcgpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFaVVJFX0ZQX0NMSUVOVF9JRCBcCiAgLWUgRE9NQUlOX05BTUUgXAogIC1lIENMVVNURVJfTURTRF9BQ0NPVU5UIFwKICAtZSBDTFVTVEVSX01EU0RfQ09ORklHX1ZFUlNJT04gXAogIC1lIEdBVEVXQVlfRE9NQUlOUyBcCiAgLWUgR0FURVdBWV9SRVNPVVJDRUdST1VQIFwKICAtZSBNRFNEX0VOVklST05NRU5UIFwKICAtZSBDTFVTVEVSX01EU0RfTkFNRVNQQUNFIFwKICAtZSBDTFVTVEVSX01ETV9BQ0NPVU5UIFwKICAtZSBDTFVTVEVSX01ETV9OQU1FU1BBQ0UgXAogIC1lIERBVEFCQVNFX0FDQ09VTlRfTkFNRSBcCiAgLWUgS0VZVkFVTFRfUFJFRklYIFwKICAtZSBNRE1fQUNDT1VOVCBcCiAgLWUgTURNX05BTUVTUEFDRSBcCiAgLW0gMi41ZyBcCiAgLXYgL3J1bi9zeXN0ZW1kL2pvdXJuYWw6L3J1bi9zeXN0ZW1kL2pvdXJuYWwgXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRpbWFnZSBcCiAgbW9uaXRvcgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIGFyb19tb25pdG9yX3NlcnZpY2VfZmlsZW5hbWUgYXJvX21vbml0b3Jfc2VydmljZV9maWxlIHRydWUKfQoKIyBjb25maWd1cmVfc2VydmljZV9hcm9fcG9ydGFsCiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgUlAgY29udGFpbmVyIGltYWdlCmNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwoKSB7CiAgICBsb2NhbCAtbiBpbWFnZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8gcG9ydGFsIHNlcnZpY2UiCgogICAgbG9jYWwgLXIgYXJvX3BvcnRhbF9zZXJ2aWNlX2NvbmZfZmlsZW5hbWU9Jy9ldGMvc3lzY29uZmlnL2Fyby1wb3J0YWwnCiAgICBsb2NhbCAtciBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlPSJBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUz0nJFBPUlRBTEFDQ0VTU0dST1VQSURTJwpBWlVSRV9QT1JUQUxfQ0xJRU5UX0lEPSckUE9SVEFMQ0xJRU5USUQnCkFaVVJFX1BPUlRBTF9FTEVWQVRFRF9HUk9VUF9JRFM9JyRQT1JUQUxFTEVWQVRFREdST1VQSURTJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpLRVlWQVVMVF9QUkVGSVg9JyRLRVlWQVVMVFBSRUZJWCcKTURNX0FDQ09VTlQ9JyRSUE1ETUFDQ09VTlQnCk1ETV9OQU1FU1BBQ0U9UG9ydGFsClBPUlRBTF9IT1NUTkFNRT0nJExPQ0FUSU9OLmFkbWluLiRSUFBBUkVOVERPTUFJTk5BTUUnClJQSU1BR0U9JyRpbWFnZSciCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlbmFtZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlIHRydWUKCiAgICBsb2NhbCAtciBhcm9fcG9ydGFsX3NlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLXBvcnRhbC5zZXJ2aWNlJwogICAgbG9jYWwgLXIgYXJvX3BvcnRhbF9zZXJ2aWNlX2ZpbGU9IltVbml0XQpBZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXQKV2FudHM9bmV0d29yay1vbmxpbmUudGFyZ2V0ClN0YXJ0TGltaXRJbnRlcnZhbD0wCgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL2Fyby1wb3J0YWwKRXhlY1N0YXJ0UHJlPS0vdXNyL2Jpbi9kb2NrZXIgcm0gLWYgJU4KRXhlY1N0YXJ0PS91c3IvYmluL2RvY2tlciBydW4gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLS1jYXAtZHJvcCBuZXRfcmF3IFwKICAtZSBBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUyBcCiAgLWUgQVpVUkVfUE9SVEFMX0NMSUVOVF9JRCBcCiAgLWUgQVpVUkVfUE9SVEFMX0VMRVZBVEVEX0dST1VQX0lEUyBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBQT1JUQUxfSE9TVE5BTUUgXAogIC1tIDJnIFwKICAtcCA0NDQ6ODQ0NCBcCiAgLXAgMjIyMjoyMjIyIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICBwb3J0YWwKUmVzdGFydD1hbHdheXMKUmVzdGFydFNlYz0xCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfZmlsZW5hbWUgYXJvX3BvcnRhbF9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QKIyBhcmdzOgojIDEpIG1vbml0b3Jpbmdfcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgY2FuIGJlICJnYXRld2F5IiBvciAicnAiCiMgMikgbW9uaXRvcl9jb25maWdfdmVyc2lvbiAtIG5hbWVyZWYsIHN0cmluZzsgbWRzZCBjb25maWcgdmVyc2lvbgpjb25maWd1cmVfc2VydmljZV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2NhbCAtbiBtb25pdG9yX2NvbmZpZ192ZXJzaW9uPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgImNvbmZpZ3VyaW5nIG1kc2Qgc2VydmljZSIKCiAgICB2ZXJpZnlfcm9sZSByb2xlCgogICAgbG9jYWwgLXIgbWRzZF9zZXJ2aWNlX2Rpcj0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZHNkLnNlcnZpY2UuZCIKICAgIG1rZGlyIC1wICIkbWRzZF9zZXJ2aWNlX2RpciIKCiAgICBsb2NhbCAtciBtZHNkX292ZXJyaWRlX2NvbmZfZmlsZW5hbWU9IiRtZHNkX3NlcnZpY2VfZGlyL292ZXJyaWRlLmNvbmYiCiAgICBsb2NhbCAtciBtZHNkX2NlcnRpZmljYXRlX3Nhbj0iJChvcGVuc3NsIHg1MDkgLWluIC92YXIvbGliL3dhYWdlbnQvTWljcm9zb2Z0LkF6dXJlLktleVZhdWx0LlN0b3JlL21kc2QucGVtIC1ub291dCAtc3ViamVjdCB8IHNlZCAtZSAncy8uKkNOID0gLy8nKSIKICAgIGxvY2FsIC1yIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgbWRzZF9vdmVycmlkZV9jb25mX2ZpbGVuYW1lIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlIHRydWUKCiAgICBsb2NhbCAtciBkZWZhdWx0X21kc2RfZmlsZW5hbWU9Ii9ldGMvZGVmYXVsdC9tZHNkIgogICAgbG9jYWwgLXIgZGVmYXVsdF9tZHNkX2ZpbGU9Ik1EU0RfUk9MRV9QUkVGSVg9L3Zhci9ydW4vbWRzZC9kZWZhdWx0Ck1EU0RfT1BUSU9OUz1cIi1BIC1kIC1yIFwkTURTRF9ST0xFX1BSRUZJWFwiCgpleHBvcnQgTU9OSVRPUklOR19HQ1NfRU5WSVJPTk1FTlQ9JyRNRFNERU5WSVJPTk1FTlQnCmV4cG9ydCBNT05JVE9SSU5HX0dDU19BQ0NPVU5UPSckUlBNRFNEQUNDT1VOVCcKZXhwb3J0IE1PTklUT1JJTkdfR0NTX1JFR0lPTj0nJExPQ0FUSU9OJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfQVVUSF9JRF9UWVBFPUF1dGhLZXlWYXVsdApleHBvcnQgTU9OSVRPUklOR19HQ1NfQVVUSF9JRD0nJG1kc2RfY2VydGlmaWNhdGVfc2FuJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfTkFNRVNQQUNFPSckUlBNRFNETkFNRVNQQUNFJwpleHBvcnQgTU9OSVRPUklOR19DT05GSUdfVkVSU0lPTj0nJG1vbml0b3JfY29uZmlnX3ZlcnNpb24nCmV4cG9ydCBNT05JVE9SSU5HX1VTRV9HRU5FVkFfQ09ORklHX1NFUlZJQ0U9dHJ1ZQoKZXhwb3J0IE1PTklUT1JJTkdfVEVOQU5UPSckTE9DQVRJT04nCmV4cG9ydCBNT05JVE9SSU5HX1JPTEU9JyRyb2xlJwpleHBvcnQgTU9OSVRPUklOR19ST0xFX0lOU1RBTkNFPVwiJChob3N0bmFtZSlcIgoKZXhwb3J0IE1EU0RfTVNHUEFDS19TT1JUX0NPTFVNTlM9MVwiIgoKICAgIHdyaXRlX2ZpbGUgZGVmYXVsdF9tZHNkX2ZpbGVuYW1lIGRlZmF1bHRfbWRzZF9maWxlIHRydWUKfQoKIyBjb25maWd1cmVfc2VydmljZV9mbHVlbnRiaXQKIyBhcmdzOgojIDEpIGNvbmZfZmlsZSAtIHN0cmluZzsgZmx1ZW5iaXQgY29uZmlndXJhdGlvbiBmaWxlCiMgMikgaW1hZ2UgLSBzdHJpbmc7IGZsdWVudGJpdCBjb250YWluZXIgaW1hZ2UgdG8gcnVuCmNvbmZpZ3VyZV9zZXJ2aWNlX2ZsdWVudGJpdCgpIHsKICAgIGxvY2FsIC1uIGNvbmZfZmlsZT0iJDEiCiAgICBsb2NhbCAtbiBpbWFnZT0iJDIiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBmbHVlbnRiaXQgc2VydmljZSIKCiAgICBta2RpciAtcCAvZXRjL2ZsdWVudGJpdC8KICAgIG1rZGlyIC1wIC92YXIvbGliL2ZsdWVudAoKICAgIGxvY2FsIC1yIGNvbmZfZmlsZW5hbWU9Jy9ldGMvZmx1ZW50Yml0L2ZsdWVudGJpdC5jb25mJwogICAgd3JpdGVfZmlsZSBjb25mX2ZpbGVuYW1lIGNvbmZfZmlsZSB0cnVlCgogICAgbG9jYWwgLXIgc3lzY29uZmlnX2ZpbGVuYW1lPScvZXRjL3N5c2NvbmZpZy9mbHVlbnRiaXQnCiAgICBsb2NhbCAtciBzeXNjb25maWdfZmlsZT0iRkxVRU5UQklUSU1BR0U9JGltYWdlIgoKICAgIHdyaXRlX2ZpbGUgc3lzY29uZmlnX2ZpbGVuYW1lIHN5c2NvbmZpZ19maWxlIHRydWUKCiAgICBsb2NhbCAtciBzZXJ2aWNlX2ZpbGVuYW1lPScvZXRjL3N5c3RlbWQvc3lzdGVtL2ZsdWVudGJpdC5zZXJ2aWNlJwogICAgbG9jYWwgLXIgc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldApTdGFydExpbWl0SW50ZXJ2YWxTZWM9MAoKW1NlcnZpY2VdClJlc3RhcnRTZWM9MXMKRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL2ZsdWVudGJpdApFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1zZWN1cml0eS1vcHQgbGFiZWw9ZGlzYWJsZSBcCiAgLS1lbnRyeXBvaW50IC9vcHQvdGQtYWdlbnQtYml0L2Jpbi90ZC1hZ2VudC1iaXQgXAogIC0tbmV0PWhvc3QgXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLS1jYXAtZHJvcCBuZXRfcmF3IFwKICAtdiAvZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZjovZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZiBcCiAgLXYgL3Zhci9saWIvZmx1ZW50Oi92YXIvbGliL2ZsdWVudDp6IFwKICAtdiAvdmFyL2xvZy9qb3VybmFsOi92YXIvbG9nL2pvdXJuYWw6cm8gXAogIC12IC9ldGMvbWFjaGluZS1pZDovZXRjL21hY2hpbmUtaWQ6cm8gXAogICRpbWFnZSBcCiAgLWMgL2V0Yy9mbHVlbnRiaXQvZmx1ZW50Yml0LmNvbmYKCkV4ZWNTdG9wPS91c3IvYmluL2RvY2tlciBzdG9wICVOClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9NQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgc2VydmljZV9maWxlbmFtZSBzZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QKIyBhcmdzOgojIDEpIHJvbGUgLSBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgpjb25maWd1cmVfdGltZXJzX21kbV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICBsb2NhbCBrZXl2YXVsdF9zdWZmaXggc2VjcmV0X3ByZWZpeAogICAgZ2V0X2tleXZhdWx0X3N1ZmZpeCByb2xlIGtleXZhdWx0X3N1ZmZpeCBzZWNyZXRfcHJlZml4CgogICAgZm9yIHZhciBpbiAibWRzZCIgIm1kbSI7IGRvCiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9kb3dubG9hZC0kdmFyLWNyZWRlbnRpYWxzLnNlcnZpY2UiCiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaCAkdmFyIgoKICAgICAgICB3cml0ZV9maWxlIGRvd25sb2FkX2NyZWRzX3NlcnZpY2VfZmlsZW5hbWUgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlIHRydWUKCiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfdGltZXJfZmlsZW5hbWU9Ii9ldGMvc3lzdGVtZC9zeXN0ZW0vZG93bmxvYWQtJHZhci1jcmVkZW50aWFscy50aW1lciIKICAgICAgICBsb2NhbCBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltUaW1lcl0KT25Cb290U2VjPTBtaW4KT25DYWxlbmRhcj0wLzEyOjAwOjAwCkFjY3VyYWN5U2VjPTVzCgpbSW5zdGFsbF0KV2FudGVkQnk9dGltZXJzLnRhcmdldCIKCiAgICAgICAgd3JpdGVfZmlsZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlbmFtZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlIHRydWUKICAgIGRvbmUKCiAgICBsb2NhbCAtciBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZW5hbWU9Ii91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoIgogICAgbG9jYWwgLXIgZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGU9IiMhL2Jpbi9iYXNoCnNldCAtZXUKCkNPTVBPTkVOVD1cJDEKZWNobyBcIkRvd25sb2FkIFwkQ09NUE9ORU5UIGNyZWRlbnRpYWxzXCIKClRFTVBfRElSPVwiXCQobWt0ZW1wIC1kKVwiCmV4cG9ydCBBWlVSRV9DT05GSUdfRElSPVwiXCQobWt0ZW1wIC1kKVwiCgplY2hvIFwiTG9nZ2luZyBpbnRvIEF6dXJlLi4uXCIKUkVUUklFUz0zCndoaWxlIFtbIFwkUkVUUklFUyAtZ3QgMCBdXTsgZG8KICAgIGlmIGF6IGxvZ2luIC1pIC0tYWxsb3ctbm8tc3Vic2NyaXB0aW9ucwogICAgdGhlbgogICAgICAgIGVjaG8gXCJheiBsb2dpbiBzdWNjZXNzZnVsXCIKICAgICAgICBicmVhawogICAgZWxzZQogICAgICAgIGVjaG8gXCJheiBsb2dpbiBmYWlsZWQuIFJldHJ5aW5nLi4uXCIKICAgICAgICBsZXQgUkVUUklFUy09MQogICAgICAgIHNsZWVwIDUKICAgIGZpCmRvbmUKCnRyYXAgXCJjbGVhbnVwXCIgRVhJVAoKY2xlYW51cCgpIHsKICBheiBsb2dvdXQKICBbWyBcJFRFTVBfRElSID1+IC90bXAvLisgXV0gJiYgcm0gLXJmIFwkVEVNUF9ESVIKICBbWyBcJEFaVVJFX0NPTkZJR19ESVIgPX4gL3RtcC8uKyBdXSAmJiBybSAtcmYgXCRBWlVSRV9DT05GSUdfRElSCn0KCmlmIFtbIFwkQ09NUE9ORU5UID0gXCJtZG1cIiBdXTsgdGhlbgogIENVUlJFTlRfQ0VSVF9GSUxFPVwiL2V0Yy9tZG0ucGVtXCIKZWxpZiBbWyBcJENPTVBPTkVOVCA9IFwibWRzZFwiIF1dOyB0aGVuCiAgQ1VSUkVOVF9DRVJUX0ZJTEU9XCIvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZS9tZHNkLnBlbVwiCmVsc2UKICBlY2hvIEludmFsaWQgdXNhZ2UgJiYgZXhpdCAxCmZpCgpTRUNSRVRfTkFNRT1cIiRzZWNyZXRfcHJlZml4LVwke0NPTVBPTkVOVH1cIgpORVdfQ0VSVF9GSUxFPVwiXCRURU1QX0RJUi9cJENPTVBPTkVOVC5wZW1cIgpmb3IgYXR0ZW1wdCBpbiB7MS4uNX07IGRvCiAgYXoga2V5dmF1bHQgXAogICAgc2VjcmV0IFwKICAgIGRvd25sb2FkIFwKICAgIC0tZmlsZSBcIlwkTkVXX0NFUlRfRklMRVwiIFwKICAgIC0taWQgXCJodHRwczovLyRLRVlWQVVMVFBSRUZJWC0ka2V5dmF1bHRfc3VmZml4LiRLRVlWQVVMVEROU1NVRkZJWC9zZWNyZXRzL1wkU0VDUkVUX05BTUVcIiBcCiAgICAmJiBicmVhawogIGlmIFtbIFwkYXR0ZW1wdCAtbHQgNSBdXTsgdGhlbiBzbGVlcCAxMDsgZWxzZSBleGl0IDE7IGZpCmRvbmUKCmlmIFsgLWYgXCRORVdfQ0VSVF9GSUxFIF07IHRoZW4KICBpZiBbWyBcJENPTVBPTkVOVCA9IFwibWRzZFwiIF1dOyB0aGVuCiAgICBjaG93biBzeXNsb2c6c3lzbG9nIFwkTkVXX0NFUlRfRklMRQogIGVsc2UKICAgIHNlZCAtaSAtbmUgJzEsL0VORCBDRVJUSUZJQ0FURS8gcCcgXCRORVdfQ0VSVF9GSUxFCiAgZmkKCiAgbmV3X2NlcnRfc249XCJcJChvcGVuc3NsIHg1MDkgLWluIFwiXCRORVdfQ0VSVF9GSUxFXCIgLW5vb3V0IC1zZXJpYWwgfCBhd2sgLUY9ICd7cHJpbnQgXCQyfScpXCIKICBjdXJyZW50X2NlcnRfc249XCJcJChvcGVuc3NsIHg1MDkgLWluIFwiXCRDVVJSRU5UX0NFUlRfRklMRVwiIC1ub291dCAtc2VyaWFsIHwgYXdrIC1GPSAne3ByaW50IFwkMn0nKVwiCiAgaWYgW1sgISAteiBcJG5ld19jZXJ0X3NuIF1dICYmIFtbIFwkbmV3X2NlcnRfc24gIT0gXCJcJGN1cnJlbnRfY2VydF9zblwiIF1dOyB0aGVuCiAgICBlY2hvIHVwZGF0aW5nIGNlcnRpZmljYXRlIGZvciBcJENPTVBPTkVOVAogICAgY2htb2QgMDYwMCBcJE5FV19DRVJUX0ZJTEUKICAgIG12IFwkTkVXX0NFUlRfRklMRSBcJENVUlJFTlRfQ0VSVF9GSUxFCiAgZmkKZWxzZQogIGVjaG8gRmFpbGVkIHRvIHJlZnJlc2ggY2VydGlmaWNhdGUgZm9yIFwkQ09NUE9ORU5UICYmIGV4aXQgMQpmaSIKCiAgICB3cml0ZV9maWxlIGRvd25sb2FkX2NyZWRzX3NjcmlwdF9maWxlbmFtZSBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZSB0cnVlCgogICAgY2htb2QgdSt4IC91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoCgogICAgJGRvd25sb2FkX2NyZWRzX3NjcmlwdF9maWxlbmFtZSBtZHNkCiAgICAkZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGVuYW1lIG1kbQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGVuYW1lPSIvZXRjL3N5c3RlbWQvc3lzdGVtL3dhdGNoLW1kbS1jcmVkZW50aWFscy5zZXJ2aWNlIgogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3NlcnZpY2VfZmlsZT0iW1VuaXRdCkRlc2NyaXB0aW9uPVdhdGNoIGZvciBjaGFuZ2VzIGluIG1kbS5wZW0gYW5kIHJlc3RhcnRzIHRoZSBtZG0gc2VydmljZQoKW1NlcnZpY2VdClR5cGU9b25lc2hvdApFeGVjU3RhcnQ9L3Vzci9iaW4vc3lzdGVtY3RsIHJlc3RhcnQgbWRtLnNlcnZpY2UKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGVuYW1lIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lPScvZXRjL3N5c3RlbWQvc3lzdGVtL3dhdGNoLW1kbS1jcmVkZW50aWFscy5wYXRoJwogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3BhdGhfZmlsZT0nW1BhdGhdClBhdGhNb2RpZmllZD0vZXRjL21kbS5wZW0KCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCcKCiAgICB3cml0ZV9maWxlIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkcz0nd2F0Y2gtbWRtLWNyZWRlbnRpYWxzLnBhdGgnCiAgICBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93ICIkd2F0Y2hfbWRtX2NyZWRzIiB8fCBhYm9ydCAiZmFpbGVkIHRvIGVuYWJsZSBhbmQgc3RhcnQgJHdhdGNoX21kbV9jcmVkcyIKfQoKIyBjb25maWd1cmVfc2VydmljZV9tZG0KIyBhcmdzOgojIDEpIHJvbGUgLSBuYW1lcmVmLCBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgojIDIpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBtZG0gY29udGFpbmVyIGltYWdlIHRvIHJ1bgpjb25maWd1cmVfc2VydmljZV9tZG0oKSB7CiAgICBsb2NhbCAtbiByb2xlPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIG1kbSBzZXJ2aWNlIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICBsb2NhbCAtciBzeXNjb25maWdfbWRtX2ZpbGVuYW1lPSIvZXRjL3N5c2NvbmZpZy9tZG0iCiAgICBsb2NhbCAtciBzeXNjb25maWdfbWRtX2ZpbGU9Ik1ETUZST05URU5EVVJMPSckTURNRlJPTlRFTkRVUkwnCk1ETUlNQUdFPSckaW1hZ2UnCk1ETVNPVVJDRUVOVklST05NRU5UPSckTE9DQVRJT04nCk1ETVNPVVJDRVJPTEU9JyRyb2xlJwpNRE1TT1VSQ0VST0xFSU5TVEFOQ0U9XCIkKGhvc3RuYW1lKVwiIgoKICAgIHdyaXRlX2ZpbGUgc3lzY29uZmlnX21kbV9maWxlbmFtZSBzeXNjb25maWdfbWRtX2ZpbGUgdHJ1ZQoKICAgIG1rZGlyIC1wIC92YXIvZXR3CiAgICBsb2NhbCAtciBtZG1fc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZG0uc2VydmljZSIKICAgIGxvY2FsIC1yIG1kbV9zZXJ2aWNlX2ZpbGU9IltVbml0XQpBZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXQKV2FudHM9bmV0d29yay1vbmxpbmUudGFyZ2V0CgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL21kbQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1lbnRyeXBvaW50IC91c3Ivc2Jpbi9NZXRyaWNzRXh0ZW5zaW9uIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLW0gMmcgXAogIC12IC9ldGMvbWRtLnBlbTovZXRjL21kbS5wZW0gXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRpbWFnZSBcCiAgLUNlcnRGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLUZyb250RW5kVXJsICRNRE1GUk9OVEVORFVSTCBcCiAgLUxvZ2dlciBDb25zb2xlIFwKICAtTG9nTGV2ZWwgV2FybmluZyBcCiAgLVByaXZhdGVLZXlGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLVNvdXJjZUVudmlyb25tZW50ICRMT0NBVElPTiBcCiAgLVNvdXJjZVJvbGUgJHJvbGUgXAogIC1Tb3VyY2VSb2xlSW5zdGFuY2UgJEhPU1ROQU1FCkV4ZWNTdG9wPS91c3IvYmluL2RvY2tlciBzdG9wICVOClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgbWRtX3NlcnZpY2VfZmlsZW5hbWUgbWRtX3NlcnZpY2VfZmlsZSB0cnVlCn0KIyEvYmluL2Jhc2gKIyBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgc291cmNlZCBieSBib290c3RyYXBwaW5nIHNjcmlwdHMgZm9yIGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25zCgojIGNvbmZpZ3VyZV9zc2hkCiMgV2UgbmVlZCB0byBjb25maWd1cmUgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB0byB5ZXMgaW4gb3JkZXIgZm9yIHRoZSBWTVNTIEFjY2VzcyBKSVQgdG8gd29yawpjb25maWd1cmVfc3NoZCgpIHsKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2NhbCAtciBzc2hkX2NvbmZpZz0iL2V0Yy9zc2gvc3NoZF9jb25maWciCgogICAgbG9nICJFZGl0aW5nICRzc2hkX2NvbmZpZyB0byBhbGxvdyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiIKICAgIHNlZCAtaSAncy9QYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vL1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzL2cnICIkc3NoZF9jb25maWciCgogICAgc3lzdGVtY3RsIHJlbG9hZCBzc2hkLnNlcnZpY2UgfHwgYWJvcnQgInNzaGQgZmFpbGVkIHRvIHJlbG9hZCIKfQoKIyBjb25maWd1cmVfZmlyZXdhbGxkX3J1bGVzCiMgYXJnczoKIyAxKSBwb3J0cyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheTsgcG9ydHMgdG8gYmUgZW5hYmxlZC4KIyAgICAgICBQb3J0cyBtdXN0IGJlIHBvc3RmaXhlZCB3aXRoIC90Y3Agb3IgL3VkcApjb25maWd1cmVfZmlyZXdhbGxkX3J1bGVzKCkgewogICAgbG9jYWwgLW4gcG9ydHM9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICAjIGh0dHBzOi8vYWNjZXNzLnJlZGhhdC5jb20vc2VjdXJpdHkvY3ZlL2N2ZS0yMDIwLTEzNDAxCiAgICBsb2NhbCAtciBwcmVmaXg9Ii9ldGMvc3lzY3RsLmQiCiAgICBsb2NhbCAtciBkaXNhYmxlX2FjY2VwdF9yYV9jb25mX2ZpbGVuYW1lPSIkcHJlZml4LzAyLWRpc2FibGUtYWNjZXB0LXJhLmNvbmYiCiAgICBsb2NhbCAtciBkaXNhYmxlX2FjY2VwdF9yYV9jb25mX2ZpbGU9Im5ldC5pcHY2LmNvbmYuYWxsLmFjY2VwdF9yYT0wIgoKICAgIHdyaXRlX2ZpbGUgZGlzYWJsZV9hY2NlcHRfcmFfY29uZl9maWxlbmFtZSBkaXNhYmxlX2FjY2VwdF9yYV9jb25mX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIGRpc2FibGVfY29yZV9maWxlbmFtZT0iJHByZWZpeC8wMS1kaXNhYmxlLWNvcmUuY29uZiIKICAgIGxvY2FsIC1yIGRpc2FibGVfY29yZV9maWxlPSJrZXJuZWwuY29yZV9wYXR0ZXJuID0gfC9iaW4vdHJ1ZQogICAgIgogICAgd3JpdGVfZmlsZSBkaXNhYmxlX2NvcmVfZmlsZW5hbWUgZGlzYWJsZV9jb3JlX2ZpbGUgdHJ1ZQoKICAgIHN5c2N0bCAtLXN5c3RlbQoKICAgIGxvZyAiRW5hYmxpbmcgcG9ydHMgJHtwb3J0c1sqXX0gb24gZGVmYXVsdCBmaXJld2FsbGQgem9uZSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA2OAogICAgZm9yIHBvcnQgaW4gJHtwb3J0c1tAXX07IGRvCiAgICAgICAgbG9nICJFbmFibGluZyBwb3J0ICRwb3J0IG5vdyIKICAgICAgICBmaXJld2FsbC1jbWQgIi0tYWRkLXBvcnQ9JHBvcnQiCiAgICBkb25lCgogICAgbG9nICJXcml0aW5nIHJ1bnRpbWUgY29uZmlnIHRvIHBlcm1hbmVudCBjb25maWciCiAgICBmaXJld2FsbC1jbWQgLS1ydW50aW1lLXRvLXBlcm1hbmVudAp9CgojIGNvbmZpZ3VyZV9sb2dyb3RhdGUgY2xvYmJlcnMgL2V0Yy9sb2dyb3RhdGUuY29uZgojIGFyZ3M6CiMgMSkgZHJvcGluX2ZpbGVzIC0gbmFtZXJlZiwgYXNzb2NpYXRpdmUgYXJyYXksIG9wdGlvbmFsOyBsb2dyb3RhdGUgZmlsZXMgdG8gd3JpdGUgdG8gL2V0Yy9sb2dyb3RhdGUuZAojICAgICAgIEtleSBuYW1lIGRpY3RhdGVzIGZpbGVuYW1lcyB3cml0dGVuIHRvIC9ldGMvbG9ncm90YXRlLmQuCmNvbmZpZ3VyZV9sb2dyb3RhdGUoKSB7CiAgICBsb2NhbCAtbiBkcm9waW5fZmlsZXM9IiR7MTotZW1wdHlfc3RyfSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLXIgbG9ncm90YXRlX2NvbmZfZmlsZW5hbWU9Jy9ldGMvbG9ncm90YXRlLmNvbmYnCiAgICBsb2NhbCAtciBsb2dyb3RhdGVfY29uZl9maWxlPScjIHNlZSAibWFuIGxvZ3JvdGF0ZSIgZm9yIGRldGFpbHMKIyByb3RhdGUgbG9nIGZpbGVzIHdlZWtseQp3ZWVrbHkKCiMga2VlcCAyIHdlZWtzIHdvcnRoIG9mIGJhY2tsb2dzCnJvdGF0ZSAyCgojIGNyZWF0ZSBuZXcgKGVtcHR5KSBsb2cgZmlsZXMgYWZ0ZXIgcm90YXRpbmcgb2xkIG9uZXMKY3JlYXRlCgojIHVzZSBkYXRlIGFzIGEgc3VmZml4IG9mIHRoZSByb3RhdGVkIGZpbGUKZGF0ZWV4dAoKIyB1bmNvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCB5b3VyIGxvZyBmaWxlcyBjb21wcmVzc2VkCmNvbXByZXNzCgojIFJQTSBwYWNrYWdlcyBkcm9wIGxvZyByb3RhdGlvbiBpbmZvcm1hdGlvbiBpbnRvIHRoaXMgZGlyZWN0b3J5CmluY2x1ZGUgL2V0Yy9sb2dyb3RhdGUuZAoKIyBubyBwYWNrYWdlcyBvd24gd3RtcCBhbmQgYnRtcCAtLSB3ZSB3aWxsIHJvdGF0ZSB0aGVtIGhlcmUKL3Zhci9sb2cvd3RtcCB7CiAgICBtb250aGx5CiAgICBjcmVhdGUgMDY2NCByb290IHV0bXAKICAgICAgICBtaW5zaXplIDFNCiAgICByb3RhdGUgMQp9CgovdmFyL2xvZy9idG1wIHsKICAgIG1pc3NpbmdvawogICAgbW9udGhseQogICAgY3JlYXRlIDA2MDAgcm9vdCB1dG1wCiAgICByb3RhdGUgMQp9JwoKICAgIHdyaXRlX2ZpbGUgbG9ncm90YXRlX2NvbmZfZmlsZW5hbWUgbG9ncm90YXRlX2NvbmZfZmlsZSB0cnVlCgogICAgaWYgWyAtbiAiJHtkcm9waW5fZmlsZXNbKl19IiBdOyB0aGVuCiAgICAgICAgbG9jYWwgLXIgbG9ncm90YXRlX2Q9Ii9ldGMvbG9ncm90YXRlLmQiCiAgICAgICAgbG9nICJXcml0aW5nIGxvZ3JvdGF0ZSBmaWxlcyB0byAkbG9ncm90YXRlX2QiCiAgICAgICAgZm9yIGRyb3Bpbl9uYW1lIGluICIkeyFkcm9waW5fZmlsZXNbQF19IjsgZG8KICAgICAgICAgICAgbG9jYWwgLXIgZHJvcGluX2ZpbGVuYW1lPSIkbG9ncm90YXRlX2QvJGRyb3Bpbl9uYW1lIgogICAgICAgICAgICBsb2NhbCAtciBkcm9waW5fZmlsZT0iJHtkcm9waW5fZmlsZXNbIiRkcm9waW5fbmFtZSJdfSIKICAgICAgICAgICAgd3JpdGVfZmlsZSBkcm9waW5fZmlsZW5hbWUgZHJvcGluX2ZpbGUgdHJ1ZQogICAgICAgIGRvbmUKICAgIGZpCn0KCiMgcHVsbF9jb250YWluZXJfaW1hZ2VzCiMgYXJnczoKIyAxKSBwdWxsX2ltYWdlcyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheQojIDIpIGF6X2xvZ2luIC0gYm9vbGVhbjsgbG9naW4gd2l0aCBheiBsb2dpbiBhbmQgYXogYWNyIGxvZ2luCiMgMykgcmVnaXN0cnlfY29uZiAtIG5hbWVyZWYsIHN0cmluZywgb3B0aW9uYWw7IHBhdGggdG8gZG9ja2VyL3BvZG1hbiBjb25maWd1cmF0aW9uIGZpbGUKcHVsbF9jb250YWluZXJfaW1hZ2VzKCkgewogICAgbG9jYWwgLW4gcHVsbF9pbWFnZXM9IiQxIgogICAgbG9jYWwgLXIgYXpfbG9naW49IiR7Mn0iCiAgICBsb2NhbCAtbiByZWdpc3RyeV9jb25mPSIkezM6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1yaSByZXRyeV90aW1lPTMwCiAgICAjIFRoZSBtYW5hZ2VkIGlkZW50aXR5IHRoYXQgdGhlIFZNIHJ1bnMgYXMgb25seSBoYXMgYSBzaW5nbGUgcm9sZWFzc2lnbm1lbnQuCiAgICAjIFRoaXMgcm9sZSBhc3NpZ25tZW50IGlzIEFDUlB1bGwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHByZXNlbnQgaW4gdGhlCiAgICAjIHN1YnNjcmlwdGlvbiB3ZSdyZSBkZXBsb3lpbmcgaW50by4gIElmIHRoZSBpZGVudGl0eSBkb2VzIG5vdCBoYXZlIGFueQogICAgIyByb2xlIGFzc2lnbm1lbnRzIHNjb3BlZCBvbiB0aGUgc3Vic2NyaXB0aW9uIHdlJ3JlIGRlcGxveWluZyBpbnRvLCBpdCB3aWxsCiAgICAjIG5vdCBzaG93IG9uIGF6IGxvZ2luIC1pLCB3aGljaCBpcyB3aHkgdGhlIGJlbG93IGxpbmUgaXMgY29tbWVudGVkLgogICAgIyBheiBhY2NvdW50IHNldCAtcyAiJFNVQlNDUklQVElPTklEIgogICAgaWYgJGF6X2xvZ2luOyB0aGVuCiAgICAgICAgY21kPSgKICAgICAgICAgICAgYXoKICAgICAgICAgICAgbG9naW4KICAgICAgICAgICAgLWkKICAgICAgICAgICAgLS1hbGxvdy1uby1zdWJzY3JpcHRpb25zCiAgICAgICAgKQoKICAgICAgICBsb2cgIlJ1bm5pbmcgYXogbG9naW4gd2l0aCByZXRyaWVzIgogICAgICAgIHJldHJ5IGNtZCByZXRyeV90aW1lCiAgICBmaQoKICAgICMgU3VwcHJlc3MgZW11bGF0aW9uIG91dHB1dCBmb3IgcG9kbWFuIGluc3RlYWQgb2YgZG9ja2VyIGZvciBheiBhY3IgY29tcGF0YWJpbGl0eQogICAgbWtkaXIgLXAgL2V0Yy9jb250YWluZXJzLwogICAgbWtkaXIgLXAgL3Jvb3QvLmRvY2tlcgogICAgdG91Y2ggL2V0Yy9jb250YWluZXJzL25vZG9ja2VyCgogICAgIyBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUgY2FzZSB0aGF0IGF6IGFjciBsb2dpbiBzZWFyY2hlcyBmb3IgdGhpcyBpbiBpdCdzIGVudmlyb25tZW50CiAgICBleHBvcnQgUkVHSVNUUllfQVVUSF9GSUxFPSIvcm9vdC8uZG9ja2VyL2NvbmZpZy5qc29uIgogICAgCiAgICBpZiBbIC1uICIke3JlZ2lzdHJ5X2NvbmZ9IiBdOyB0aGVuCiAgICAgICAgd3JpdGVfZmlsZSBSRUdJU1RSWV9BVVRIX0ZJTEUgcmVnaXN0cnlfY29uZiB0cnVlCiAgICBmaQoKICAgIGxvZyAibG9nZ2luZyBpbnRvIHByb2QgYWNyIgogICAgaWYgJGF6X2xvZ2luOyB0aGVuCiAgICAgICAgY21kPSgKICAgICAgICAgICAgYXoKICAgICAgICAgICAgYWNyCiAgICAgICAgICAgIGxvZ2luCiAgICAgICAgICAgIC0tbmFtZQogICAgICAgICAgICAiJChzZWQgLWUgJ3N8LiovfHwnIDw8PCIkQUNSUkVTT1VSQ0VJRCIpIgogICAgICAgICkKCiAgICAgICAgbG9nICJSdW5uaW5nIGF6IGxvZ2luIHdpdGggcmV0cmllcyIKICAgICAgICByZXRyeSBjbWQgcmV0cnlfdGltZQogICAgZmkKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBpIGluICR7cHVsbF9pbWFnZXNbQF19OyBkbwogICAgICAgIGxvY2FsIC1uIGltYWdlPSIkaSIKICAgICAgICBjbWQ9KAogICAgICAgICAgICBwb2RtYW4KICAgICAgICAgICAgcHVsbAogICAgICAgICAgICAiJGltYWdlIgogICAgICAgICkKCiAgICAgICAgbG9nICJQdWxsaW5nIGltYWdlICRpbWFnZSB3aXRoIHJldHJpZXMgbm93IgogICAgICAgIHJldHJ5IGNtZCByZXRyeV90aW1lCiAgICBkb25lCgogICAgaWYgJGF6X2xvZ2luOyB0aGVuCiAgICAgICAgY21kPSgKICAgICAgICAgICAgYXoKICAgICAgICAgICAgbG9nb3V0CiAgICAgICAgKQoKICAgICAgICBsb2cgIlJ1bm5pbmcgYXogbG9nb3V0IHdpdGggcmV0cmllcyIKICAgICAgICByZXRyeSBjbWQgcmV0cnlfdGltZQogICAgZmkKfQoKIyBjb25maWd1cmVfZGlza19wYXJ0aXRpb25zCmNvbmZpZ3VyZV9kaXNrX3BhcnRpdGlvbnMoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJleHRlbmRpbmcgcGFydGl0aW9uIHRhYmxlIgoKICAgICMgTGludXggYmxvY2sgZGV2aWNlcyBhcmUgaW5jb25zaXN0ZW50bHkgbmFtZWQKICAgICMgaXQncyBkaWZmaWN1bHQgdG8gdGllIHRoZSBsdm0gcHYgdG8gdGhlIHBoeXNpY2FsIGRpc2sgdXNpbmcgL2Rldi9kaXNrIGZpbGVzLCB3aGljaCBpcyB3aHkgbHZzIGlzIHVzZWQgaGVyZQogICAgbG9jYWwgLXIgcGh5c2ljYWxfZGlzaz0iJChsdnMgLW8gZGV2aWNlcyAtYSB8IGhlYWQgLW4yIHwgdGFpbCAtbjEgfCBjdXQgLWQgJyAnIC1mIDMgfCBjdXQgLWQgXCggLWYgMSB8IHRyIC1kICdbOmRpZ2l0Ol0nKSIKICAgIGdyb3dwYXJ0ICIkcGh5c2ljYWxfZGlzayIgMgoKICAgIGxvZyAiZXh0ZW5kaW5nIGZpbGVzeXN0ZW1zIgogICAgbG9nICJleHRlbmRpbmcgcm9vdCBsdm0iCiAgICBsdmV4dGVuZCAtbCArMjAlRlJFRSAvZGV2L3Jvb3R2Zy9yb290bHYKICAgIGxvZyAiZ3Jvd2luZyByb290IGZpbGVzeXN0ZW0iCiAgICB4ZnNfZ3Jvd2ZzIC8KCiAgICBsb2cgImV4dGVuZGluZyB2YXIgbHZtIgogICAgbHZleHRlbmQgLWwgKzEwMCVGUkVFIC9kZXYvcm9vdHZnL3Zhcmx2CiAgICBsb2cgImdyb3dpbmcgdmFyIGZpbGVzeXN0ZW0iCiAgICB4ZnNfZ3Jvd2ZzIC92YXIKfQoKIyBjb25maWd1cmVfY2VydHMKIyBhcmdzOgojIDEpIHJvbGUgLSBzdHJpbmc7IGNhbiBiZSAiZGV2cHJveHkiIG9yICJycCIKY29uZmlndXJlX2NlcnRzKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBjZXJ0aWZpY2F0ZXMgZm9yICRyb2xlIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUgdHJ1ZQoKICAgIGlmIFsgIiRyb2xlIiA9PSAiZGV2cHJveHkiIF07IHRoZW4KICAgICAgICBsb2NhbCAtciBwcm94eV9jZXJ0c19iYXNlZGlyPSIvZXRjL3Byb3h5IgogICAgICAgIG1rZGlyIC1wICIkcHJveHlfY2VydHNfYmFzZWRpciIKICAgICAgICBiYXNlNjQgLWQgPDw8IiRQUk9YWUNFUlQiID4gIiRwcm94eV9jZXJ0c19iYXNlZGlyL3Byb3h5LmNydCIKICAgICAgICBiYXNlNjQgLWQgPDw8IiRQUk9YWUtFWSIgPiAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHkua2V5IgogICAgICAgIGJhc2U2NCAtZCA8PDwiJFBST1hZQ0xJRU5UQ0VSVCIgPiAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHktY2xpZW50LmNydCIKICAgICAgICBjaG93biAtUiAxMDAwOjEwMDAgL2V0Yy9wcm94eQogICAgICAgIGNobW9kIDA2MDAgIiRwcm94eV9jZXJ0c19iYXNlZGlyL3Byb3h5LmtleSIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICBpZiBbICIkcm9sZSIgPT0gInJwIiBdOyB0aGVuCiAgICAgICAgbG9jYWwgLXIgcnBfY2VydHNfYmFzZWRpcj0iL2V0Yy9hcm8tcnAiCiAgICAgICAgbWtkaXIgLXAgIiRycF9jZXJ0c19iYXNlZGlyIgogICAgICAgIGJhc2U2NCAtZCA8PDwiJEFETUlOQVBJQ0FCVU5ETEUiID4gIiRycF9jZXJ0c19iYXNlZGlyL2FkbWluLWNhLWJ1bmRsZS5wZW0iCiAgICAgICAgaWYgW1sgLW4gIiRBUk1BUElDQUJVTkRMRSIgXV07IHRoZW4KICAgICAgICBiYXNlNjQgLWQgPDw8IiRBUk1BUElDQUJVTkRMRSIgPiAiJHJwX2NlcnRzX2Jhc2VkaXIvYXJtLWNhLWJ1bmRsZS5wZW0iCiAgICAgICAgZmkKICAgICAgICBjaG93biAtUiAxMDAwOjEwMDAgIiRycF9jZXJ0c19iYXNlZGlyIgogICAgZmkKCiAgICAjIHNldHRpbmcgTU9OSVRPUklOR19HQ1NfQVVUSF9JRF9UWVBFPUF1dGhLZXlWYXVsdCBzZWVtcyB0byBoYXZlIGNhdXNlZCBtZHNkIG5vdAogICAgIyB0byBob25vdXIgU1NMX0NFUlRfRklMRSBhbnkgbW9yZSwgaGVhdmVuIG9ubHkga25vd3Mgd2h5LgogICAgbG9jYWwgLXIgc3NsX2NlcnRzX2Jhc2VkaXI9Ii91c3IvbGliL3NzbC9jZXJ0cyIKICAgIG1rZGlyIC1wICIkc3NsX2NlcnRzX2Jhc2VkaXIiCiAgICBjc3BsaXQgLWYgIiRzc2xfY2VydHNfYmFzZWRpci9jZXJ0LSIgLWIgJTAzZC5wZW0gL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQgL14kLzEgInsqfSIgMT4vZGV2L251bGwKICAgIGNfcmVoYXNoICIkc3NsX2NlcnRzX2Jhc2VkaXIiCgogICAgIyB3ZSBsZWF2ZSBjbGllbnRJZCBibGFuayBhcyBsb25nIGFzIG9ubHkgMSBtYW5hZ2VkIGlkZW50aXR5IGFzc2lnbmVkIHRvIHZtc3MKICAgICMgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gMSwgd2Ugd2lsbCBuZWVkIHRvIHBvcHVsYXRlIHdpdGggY2xpZW50SWQgdXNlZCBmb3Igb2ZmLW5vZGUgc2Nhbm5pbmcKICAgIGxvY2FsIC1yIG5vZGVzY2FuX2FnZW50X2ZpbGVuYW1lPSIvZXRjL2RlZmF1bHQvdnNhLW5vZGVzY2FuLWFnZW50LmNvbmZpZyIKICAgIGxvY2FsIC1yIG5vZGVzY2FuX2FnZW50X2ZpbGU9InsKICAgIFwiTmljZVwiOiAxOSwKICAgIFwiVGltZW91dFwiOiAxMDgwMCwKICAgIFwiQ2xpZW50SWRcIjogXCJcIiwKICAgIFwiVGVuYW50SWRcIjogJEFaVVJFU0VDUEFDS1ZTQVRFTkFOVElELAogICAgXCJRdWFseXNTdG9yZUJhc2VVcmxcIjogJEFaVVJFU0VDUEFDS1FVQUxZU1VSTCwKICAgIFwiUHJvY2Vzc1RpbWVvdXRcIjogMzAwLAogICAgXCJDb21tYW5kRGVsYXlcIjogMAogIH0iCgogICAgd3JpdGVfZmlsZSBub2Rlc2Nhbl9hZ2VudF9maWxlbmFtZSBub2Rlc2Nhbl9hZ2VudF9maWxlIHRydWUKfQoKIyBydW5fYXpzZWNkX2NvbmZpZ19zY2FuCnJ1bl9henNlY2RfY29uZmlnX3NjYW4oKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1hciBjb25maWdzPSgKICAgICAgICAiYmFzZWxpbmUiCiAgICAgICAgImNsYW1hdiIKICAgICAgICAic29mdHdhcmUiCiAgICApCgogICAgbG9nICJTY2FubmluZyBjb25maWd1cmF0aW9uIGZpbGVzIHdpdGggYXpzZWNkICR7Y29uZmlnc1sqXX0iCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBzY2FuIGluICR7Y29uZmlnc1tAXX07IGRvCiAgICAgICAgbG9nICJTY2FubmluZyBjb25maWcgZmlsZSAkc2NhbiBub3ciCiAgICAgICAgL3Vzci9sb2NhbC9iaW4vYXpzZWNkIGNvbmZpZyAtcyAiJHNjYW4iIC1kIFAxRAogICAgZG9uZQp9CgojIGNyZWF0ZV9yZXF1aXJlZF9kaXJzCmNyZWF0ZV9yZXF1aXJlZF9kaXJzKCkgewogICAgY3JlYXRlX2RpcnM9KAogICAgICAgIC92YXIvbG9nL2pvdXJuYWwKICAgICAgICAvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZQogICAgICAgICMgRG9lcyBub3QgZXhpc3Qgb24gZGV2UHJveHlWTVNTCiAgICAgICAgL3Zhci9vcHQvbWljcm9zb2Z0L2xpbnV4bW9uYWdlbnQKICAgICkKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBkIGluICR7Y3JlYXRlX2RpcnNbQF19OyBkbwogICAgICAgIGxvZyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICRkIgogICAgICAgIG1rZGlyIC1wICIkZCIgfHwgYWJvcnQgImZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICRkIgogICAgZG9uZQp9CgojU3RhcnQgb2YgZ2F0ZXdheVZNU1Muc2gKIyEvYmluL2Jhc2gKCnNldCAtbyBlcnJleGl0IFwKICAgIC1vIG5vdW5zZXQKCmlmIFsgIiR7REVCVUc6LWZhbHNlfSIgPT0gdHJ1ZSBdOyB0aGVuCiAgICBzZXQgLXgKZmkKCm1haW4oKSB7CiAgICAjIHRyYW5zYWN0aW9uIGF0dGVtcHQgcmV0cnkgdGltZSBpbiBzZWNvbmRzCiAgICBsb2NhbCAtcmkgcmV0cnlfd2FpdF90aW1lPTMwCiAgICBsb2NhbCAtcmkgcGtnX3JldHJ5X2NvdW50PTYwCgogICAgY3JlYXRlX3JlcXVpcmVkX2RpcnMKICAgIGNvbmZpZ3VyZV9zc2hkCiAgICBjb25maWd1cmVfcnBtX3JlcG9zIHJldHJ5X3dhaXRfdGltZSAiJHBrZ19yZXRyeV9jb3VudCIKCiAgICBsb2NhbCAtYXIgZXhjbHVkZV9wa2dzPSgKICAgICAgICAiLXggV0FMaW51eEFnZW50IgogICAgICAgICIteCBXQUxpbnV4QWdlbnQtdWRldiIKICAgICkKCiAgICBkbmZfdXBkYXRlX3BrZ3MgZXhjbHVkZV9wa2dzIHJldHJ5X3dhaXRfdGltZSAiJHBrZ19yZXRyeV9jb3VudCIKCiAgICBsb2NhbCAtcmEgcnBtX2tleXM9KAogICAgICAgIGh0dHBzOi8vZGwuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvUlBNLUdQRy1LRVktRVBFTC04CiAgICAgICAgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYwogICAgKQoKICAgIHJwbV9pbXBvcnRfa2V5cyBycG1fa2V5cyByZXRyeV93YWl0X3RpbWUgIiRwa2dfcmV0cnlfY291bnQiCgogICAgbG9jYWwgLXJhIHJlcG9fcnBtX3BrZ3M9KAogICAgICAgIGh0dHBzOi8vZGwuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvZXBlbC1yZWxlYXNlLWxhdGVzdC04Lm5vYXJjaC5ycG0KICAgICkKCiAgICBkbmZfaW5zdGFsbF9wa2dzIHJlcG9fcnBtX3BrZ3MgcmV0cnlfd2FpdF90aW1lICIkcGtnX3JldHJ5X2NvdW50IgoKICAgIGxvY2FsIC1yYSBpbnN0YWxsX3BrZ3M9KAogICAgICAgIGF0CiAgICAgICAgY2xhbWF2CiAgICAgICAgYXpzZWMtY2xhbWF2CiAgICAgICAgYXpzZWMtbW9uaXRvcgogICAgICAgIGF6dXJlLWNsaQogICAgICAgIGF6dXJlLW1kc2QKICAgICAgICBhenVyZS1zZWN1cml0eQogICAgICAgIHBvZG1hbgogICAgICAgIHBvZG1hbi1kb2NrZXIKICAgICAgICBvcGVuc3NsLXBlcmwKICAgICAgICAjIGhhY2sgLSB3ZSBhcmUgaW5zdGFsbGluZyBweXRob24zIG9uIGhvc3RzIGR1ZSB0byBhbiBpc3N1ZSB3aXRoIEF6dXJlIExpbnV4IEV4dGVuc2lvbnMgaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2F6dXJlLWxpbnV4LWV4dGVuc2lvbnMvcHVsbC8xNTA1CiAgICAgICAgcHl0aG9uMwogICAgKQoKICAgIGRuZl9pbnN0YWxsX3BrZ3MgaW5zdGFsbF9wa2dzIHJldHJ5X3dhaXRfdGltZSAiJHBrZ19yZXRyeV9jb3VudCIKICAgIGNvbmZpZ3VyZV9kbmZfY3Jvbl9qb2IKICAgIGNvbmZpZ3VyZV9kaXNrX3BhcnRpdGlvbnMKCiAgICAjIGxvZyBkaXJlY3RvcnkgdG8gYmUgbW91bnRlZCB0byBydW5uaW5nIGNvbnRhaW5lcgogICAgbG9jYWwgLXIgZ2F0ZXdheV9sb2dkaXI9Jy92YXIvbG9nL2Fyby1nYXRld2F5JwogICAgbG9jYWwgLXIgZ2F0ZXdheV9sb2dfZmlsZT0iIyBNYXhpbXVtIGxvZyBkaXJlY3Rvcnkgc2l6ZSBpcyAxMDBHIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCiMgU2V0dGluZyBsaW1pdCB0byAxMDBHIHRvIGFsbG93IHNwYWNlIGZvciBvdGhlciBsb2dnaW5nIHNlcnZpY2VzCiMgY29weXRydW5jYXRlIGlzIGEgY3JpdGljYWwgb3B0aW9uIHVzZWQgdG8gcHJldmVudCBsb2dzIGZyb20gYmVpbmcgc2hpcHBlZCB0d2ljZQoke2dhdGV3YXlfbG9nZGlyfSB7CiAgICBzaXplIDIwRwogICAgcm90YXRlIDUKICAgIGNyZWF0ZSAwNjAwIHJvb3Qgcm9vdAogICAgY29weXRydW5jYXRlCiAgICBub29sZGRpcgogICAgY29tcHJlc3MKfSIKCiAgICAjIEtleSBkaWN0YXRlcyB0aGUgZmlsZW5hbWUgd3JpdHRlbiBpbiAvZXRjL2xvZ3JvdGF0ZS5kCiAgICBsb2NhbCAtckEgbG9ncm90YXRlX2Ryb3BpbnM9KAogICAgICAgIFsiZ2F0ZXdheSJdPSIkZ2F0ZXdheV9sb2dfZmlsZSIKICAgICkKCiAgICBjb25maWd1cmVfbG9ncm90YXRlIGxvZ3JvdGF0ZV9kcm9waW5zCiAgICBjb25maWd1cmVfc2VsaW51eAoKICAgIGxvY2FsIC1yYSBlbmFibGVfcG9ydHM9KAogICAgICAgICI4MC90Y3AiCiAgICAgICAgIjgwODEvdGNwIgogICAgICAgICI0NDMvdGNwIgogICAgKQogICAgY29uZmlndXJlX2ZpcmV3YWxsZF9ydWxlcyBlbmFibGVfcG9ydHMKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIxNTMKICAgIGxvY2FsIC1yIG1kbWltYWdlPSIke1JQSU1BR0UlJS8qfS8ke01ETUlNQUdFIyovfSIKICAgIGxvY2FsIC1yIHJwaW1hZ2U9IiRSUElNQUdFIgogICAgbG9jYWwgLXIgZmx1ZW50Yml0X2ltYWdlPSIkRkxVRU5UQklUSU1BR0UiCiAgICAjIHZhbHVlcyBhcmUgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMsIHRoZXkgc2hvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQgaGVyZQogICAgbG9jYWwgLXJBIGFyb19pbWFnZXM9KAogICAgICAgIFsibWRtIl09Im1kbWltYWdlIgogICAgICAgIFsicnAiXT0icnBpbWFnZSIKICAgICAgICBbImZsdWVudGJpdCJdPSJmbHVlbnRiaXRfaW1hZ2UiCiAgICApCiAgICBwdWxsX2NvbnRhaW5lcl9pbWFnZXMgYXJvX2ltYWdlcyB0cnVlCgogICAgbG9jYWwgLXIgZmx1ZW50Yml0X2NvbmZfZmlsZT0iW0lOUFVUXQpOYW1lIHN5c3RlbWQKVGFnIGpvdXJuYWxkClN5c3RlbWRfRmlsdGVyIF9DT01NPWFybwpEQiAvdmFyL2xpYi9mbHVlbnQvam91cm5hbGRiCgpbRklMVEVSXQoJTmFtZSBtb2RpZnkKCU1hdGNoIGpvdXJuYWxkCglSZW1vdmVfd2lsZGNhcmQgXwoJUmVtb3ZlIFRJTUVTVEFNUAoKW09VVFBVVF0KCU5hbWUgZm9yd2FyZAoJTWF0Y2ggKgoJUG9ydCAyOTIzMCIKCiAgICBsb2NhbCAtciBhcm9fZ2F0ZXdheV9jb25mX2ZpbGU9IkFDUl9SRVNPVVJDRV9JRD0nJEFDUlJFU09VUkNFSUQnCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCkFaVVJFX0RCVE9LRU5fQ0xJRU5UX0lEPSckREJUT0tFTkNMSUVOVElEJwpEQlRPS0VOX1VSTD0nJERCVE9LRU5VUkwnCk1ETV9BQ0NPVU5UPSckUlBNRE1BQ0NPVU5UJwpNRE1fTkFNRVNQQUNFPScke3JvbGVfZ2F0ZXdheV59JwpHQVRFV0FZX0RPTUFJTlM9JyRHQVRFV0FZRE9NQUlOUycKR0FURVdBWV9GRUFUVVJFUz0nJEdBVEVXQVlGRUFUVVJFUycKUlBJTUFHRT0nJHJwaW1hZ2UnIgoKICAgIGxvY2FsIC1yIG1kc2RfY29uZmlnX3ZlcnNpb249IiRHQVRFV0FZTURTRENPTkZJR1ZFUlNJT04iCiAgICAjIHZhbHVlcyBhcmUgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMsIHRoZXkgc2hvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQgaGVyZQogICAgbG9jYWwgLXJBIGFyb19jb25maWdzPSgKICAgICAgICBbImdhdGV3YXlfY29uZmlnIl09ImFyb19nYXRld2F5X2NvbmZfZmlsZSIKICAgICAgICBbImZsdWVudGJpdCJdPSJmbHVlbnRiaXRfY29uZl9maWxlIgogICAgICAgIFsibWRzZCJdPSJtZHNkX2NvbmZpZ192ZXJzaW9uIgogICAgICAgIFsibG9nX2RpciJdPSJnYXRld2F5X2xvZ2RpciIKICAgICkKCiAgICBjb25maWd1cmVfdm1zc19hcm9fc2VydmljZXMgcm9sZV9nYXRld2F5IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm9faW1hZ2VzIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm9fY29uZmlncwoKICAgIGxvY2FsIC1yYSBnYXRld2F5X3NlcnZpY2VzPSgKICAgICAgICAiYXJvLWdhdGV3YXkiCiAgICAgICAgImF1b21zIgogICAgICAgICJhenNlY2QiCiAgICAgICAgImF6c2VjbW9uZCIKICAgICAgICAibWRzZCIKICAgICAgICAibWRtIgogICAgICAgICJjaHJvbnlkIgogICAgICAgICJmbHVlbnRiaXQiCiAgICAgICAgImRvd25sb2FkLW1kc2QtY3JlZGVudGlhbHMudGltZXIiCiAgICAgICAgImRvd25sb2FkLW1kbS1jcmVkZW50aWFscy50aW1lciIKICAgICkKCiAgICBlbmFibGVfc2VydmljZXMgZ2F0ZXdheV9zZXJ2aWNlcwoKICAgIHJlYm9vdF92bQp9CgpleHBvcnQgQVpVUkVfQ0xPVURfTkFNRT0iJHtBWlVSRUNMT1VETkFNRTo/IkZhaWxlZCB0byBjYXJyeSBvdmVyIHZhcmlhYmxlcyJ9IgoKIyB1dGlsLnNoIGRvZXMgbm90IGV4aXN0IHdoZW4gZGVwbG95ZWQgdG8gVk1TUyB2aWEgVk1TUyBleHRlbnNpb25zCiMgVGhpcyBpcyBiZWNhdXNlIGNvbW1vblZNU1Muc2ggaXMgY29uY2F0ZW5hdGVkIHdpdGggdGhpcyBzY3JpcHQKdXRpbD0idXRpbC5zaCIKaWYgWyAtZiAiJHV0aWwiIF07IHRoZW4KICAgICMgc2hlbGxjaGVjayBzb3VyY2U9dXRpbC5zaAogICAgc291cmNlICIkdXRpbCIKZmkKCm1haW4gIiRAIgo=')))]" + "script": "[base64(concat(base64ToString('c2V0IC1leAoK'),'ACRRESOURCEID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('acrResourceId')),''')\n','AZURECLOUDNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureCloudName')),''')\n','AZURESECPACKQUALYSURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackQualysUrl')),''')\n','AZURESECPACKVSATENANTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackVSATenantId')),''')\n','DATABASEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('databaseAccountName')),''')\n','MDMFRONTENDURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdmFrontendUrl')),''')\n','MDSDENVIRONMENT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdEnvironment')),''')\n','FLUENTBITIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fluentbitImage')),''')\n','GATEWAYMDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayMdsdConfigVersion')),''')\n','GATEWAYDOMAINS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayDomains')),''')\n','GATEWAYFEATURES=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayFeatures')),''')\n','KEYVAULTDNSSUFFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultDNSSuffix')),''')\n','KEYVAULTPREFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultPrefix')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMDMACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdmAccount')),''')\n','RPMDSDACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdAccount')),''')\n','RPMDSDNAMESPACE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdNamespace')),''')\n','MDMIMAGE=''/distroless/genevamdm:2.2024.626.1539-d1a6e7-20240715t0935@sha256:372fbc981bbfdf2b9a9d0ffdca2c51ed389b291a3bcff0401e9afb0c01605823''\n','LOCATION=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().location),''')\n','SUBSCRIPTIONID=$(base64 -d \u003c\u003c\u003c''',base64(subscription().subscriptionId),''')\n','RESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().name),''')\n','\n',base64ToString('IyEvYmluL2Jhc2gKIyBJbnRlcm5hbCBGdW5jdGlvbnMgYW5kIENvbnN0YW50cwoKIyBlbXB0eV9zdHIgLSBjb25zdGFudDsgdXNlZCBieSBmdW5jdGlvbnMgZm9yIG9wdGlvbmFsIG5hbWVyZWYgc3RyaW5nIGFyZ3VlbWVudHMKIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CmRlY2xhcmUgLXIgZW1wdHlfc3RyPSIiCgojIHJvbGVfZ2F0ZXdheSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBWTVNTIGlzIGJlaW5nIGJvb3RzdHJhcHBlZAojIHRoaXMgc2hvdWxkIGJlIHJlZmVyZW5jZWQgYnkgc2NyaXB0cyBzb3VyY2luZyB0aGlzIGZpbGUKZGVjbGFyZSAtciByb2xlX2dhdGV3YXk9ImdhdGV3YXkiCiMgcm9sZV9ycCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBWTVNTIGlzIGJlaW5nIGJvb3RzdHJhcHBlZAojIHRoaXMgc2hvdWxkIGJlIHJlZmVyZW5jZWQgYnkgc2NyaXB0cyBzb3VyY2luZyB0aGlzIGZpbGUKZGVjbGFyZSAtciByb2xlX3JwPSJycCIKCiMgbG9nIGlzIGEgd3JhcHBlciBmb3IgZWNobyB0aGF0IGluY2x1ZGVzIHRoZSBmdW5jdGlvbiBuYW1lCiMgQXJncwojIDEpIG1zZyAtIHN0cmluZwojIDIpIHN0YWNrX2xldmVsIC0gaW50OyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY2FsbGluZyBmdW5jdGlvbgpsb2coKSB7CiAgICBsb2NhbCAtciBtc2c9IiR7MTotImxvZyBtZXNzYWdlIGlzIGVtcHR5In0iCiAgICBsb2NhbCAtciBzdGFja19sZXZlbD0iJHsyOi0xfSIKICAgIGVjaG8gIiR7RlVOQ05BTUVbJHtzdGFja19sZXZlbH1dfTogJHttc2d9Igp9CgojIGFib3J0IGlzIGEgd3JhcHBlciBmb3IgbG9nIHRoYXQgZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlCmFib3J0KCkgewogICAgbG9jYWwgLXJpIG9yaWdpbl9zdGFja2xldmVsPTIKICAgIGxvZyAiJHsxfSIgIiRvcmlnaW5fc3RhY2tsZXZlbCIKICAgIGxvZyAiRXhpdGluZyIKICAgIGV4aXQgMQp9CgojIHdyaXRlX2ZpbGUKIyBBcmdzCiMgMSkgZmlsZW5hbWUgLSBzdHJpbmcKIyAyKSBmaWxlX2NvbnRlbnRzIC0gc3RyaW5nCiMgMykgY2xvYmJlciAtIGJvb2xlYW47IG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gZmFsc2UKd3JpdGVfZmlsZSgpIHsKICAgIGxvY2FsIC1uIGZpbGVuYW1lPSIkMSIKICAgIGxvY2FsIC1uIGZpbGVfY29udGVudHM9IiQyIgogICAgbG9jYWwgLXIgY2xvYmJlcj0iJHszOi1mYWxzZX0iCgogICAgaWYgJGNsb2JiZXI7IHRoZW4KICAgICAgICBsb2cgIk92ZXJ3cml0aW5nIGZpbGUgJGZpbGVuYW1lIgogICAgICAgIGVjaG8gIiRmaWxlX2NvbnRlbnRzIiA+ICIkZmlsZW5hbWUiCiAgICBlbHNlCiAgICAgICAgbG9nICJBcHBlbmRpbmcgdG8gJGZpbGVuYW1lIgogICAgICAgIGVjaG8gIiRmaWxlX2NvbnRlbnRzIiA+PiAiJGZpbGVuYW1lIgogICAgZmkKfQoKIyByZXRyeSBBZGRpbmcgcmV0cnkgbG9naWMgdG8geXVtIGNvbW1hbmRzIGluIG9yZGVyIHRvIGF2b2lkIHN0YWxsaW5nIG91dCBvbiByZXNvdXJjZSBsb2NrcwojIGFyZ3M6CiMgMSkgY21kX3JldHJ5IC0gbmFtZXJlZiwgYXJyYXk7IENvbW1hbmQgYW5kIGFyZ3VlbWVudChzKSB0byByZXRyeQojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDMpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1tb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CnJldHJ5KCkgewogICAgbG9jYWwgLW4gY21kX3JldHJ5PSIkMSIKICAgIGxvY2FsIC1uIHdhaXRfdGltZT0iJDIiCiAgICBsb2NhbCAtcmkgcmV0cmllcz0iJHszOi01fSIKCiAgICBmb3IgYXR0ZW1wdCBpbiB7MS4uNX07IGRvCiAgICAgICAgbG9nICJhdHRlbXB0ICMke2F0dGVtcHR9IC0gJHtGVU5DTkFNRVsyXX0iCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICAgICAgJHtjbWRfcmV0cnlbQF19ICYKCiAgICAgICAgd2FpdCAkISAmJiBicmVhawogICAgICAgIGlmIFsgIiR7YXR0ZW1wdH0iIC1sZSAiJHJldHJpZXMiIF07IHRoZW4KICAgICAgICAgICAgc2xlZXAgIiR3YWl0X3RpbWUiCiAgICAgICAgZWxzZQogICAgICAgICAgICBhYm9ydCAiYXR0ZW1wdCAjJHthdHRlbXB0fSAtIEZhaWxlZCB0byB1cGRhdGUgcGFja2FnZXMiCiAgICAgICAgZmkKICAgIGRvbmUKfQoKIyB2ZXJpZnlfcm9sZQojIGFyZ3M6CiMgMSkgdGVzdF9yb2xlIC0gbmFtZXJlZjsgcm9sZSBiZWluZyB2ZXJpZmllZAojIDIpIGNlcnRzIC0gYm9vbGVhbiwgb3B0aW9uYWw7IGRlZmF1bHRzIHRvIGZhbHNlLiBTZXQgdG8gdHJ1ZSB0byBhZGQgZGV2cHJveHkgdG8gYWxsb3dlZCByb2xlcwp2ZXJpZnlfcm9sZSgpIHsKICAgIGxvY2FsIC1uIHRlc3Rfcm9sZT0iJDEiCiAgICBsb2NhbCAtciBjZXJ0cz0iJHsyOi1mYWxzZX0iCgogICAgYWxsb3dlZF9yb2xlc19nbG9iPSIoJHJvbGVfcnB8JHJvbGVfZ2F0ZXdheSkiCiAgICBpZiAkY2VydHM7IHRoZW4KICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyAiKSIgYW5kIGFwcGVuZCBhZGRpdGlvbmFsIHJvbGUKICAgICAgICBhbGxvd2VkX3JvbGVzX2dsb2I9IiR7YWxsb3dlZF9yb2xlc19nbG9iJVwpKn18ZGV2cHJveHkpIgogICAgZmkKCiAgICBpZiBbWyAiJHRlc3Rfcm9sZSIgPX4gJGFsbG93ZWRfcm9sZXNfZ2xvYiBdXTsgdGhlbgogICAgICAgIGxvZyAiVmVyaWZpZWQgcm9sZSBcIiR0ZXN0X3JvbGVcIiIKICAgIGVsc2UKICAgICAgICBhYm9ydCAiZmFpbGVkIHRvIHZlcmlmeSByb2xlLCByb2xlIFwiJHt0ZXN0X3JvbGV9XCIgbm90IGluIFwiJHthbGxvd2VkX3JvbGVzX2dsb2J9XCIiCiAgICBmaQp9CgojIGdldF9rZXl2YXVsdF9zdWZmaXgKIyBhcmdzOgojIDEpIHJsIC0gbmFtZXJlZiwgc3RyaW5nOyByb2xlIHRvIGdldCBzaG9ydCByb2xlIGZvcgojIDIpIGt2X3N1ZmZpeCAtIG5hbWVyZWYsIHN0cmluZzsgc2hvcnQgcm9sZSB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoaXMgbmFtZXJlZgojIDMpIHNlY19wcmVmaXggLSBuYW1lcmVmLCBzdHJpbmc7IGtleXZhdWx0IGNlcnRpZmljYXRlIHByZWZpeCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoaXMgbmFtZXJlZgpnZXRfa2V5dmF1bHRfc3VmZml4KCkgewogICAgbG9jYWwgLW4gcmw9IiQxIgogICAgbG9jYWwgLW4ga3Zfc3VmZml4PSIkMiIKICAgIGxvY2FsIC1uIHNlY19wcmVmaXg9IiQzIgoKICAgIGxvY2FsIC1yIGtleXZhdWx0X3N1ZmZpeF9ycD0ic3ZjIgogICAgbG9jYWwgLXIga2V5dmF1bHRfcHJlZml4X2dhdGV3YXk9Imd3eSIKCiAgICBjYXNlICIkcmwiIGluCiAgICAgICAgIiRyb2xlX2dhdGV3YXkiKQogICAgICAgICAgICBrdl9zdWZmaXg9IiRrZXl2YXVsdF9wcmVmaXhfZ2F0ZXdheSIKICAgICAgICAgICAgc2VjX3ByZWZpeD0iJGtleXZhdWx0X3ByZWZpeF9nYXRld2F5IgogICAgICAgICAgICA7OwogICAgICAgICIkcm9sZV9ycCIpCiAgICAgICAgICAgIGt2X3N1ZmZpeD0iJGtleXZhdWx0X3N1ZmZpeF9ycCIKICAgICAgICAgICAgc2VjX3ByZWZpeD0iJHJvbGVfcnAiCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgYWJvcnQgInVua293biByb2xlICRybCIKICAgICAgICAgICAgOzsKICAgIGVzYWMKfQoKIyByZWJvb3Rfdm0gcmVzdG9yZXMgYWxsIHNlbGludXggZmlsZSBjb250ZXh0cywgdGhlbiBzY2hlZHVsZXMgYSByZWJvb3QgZm9yIG9uZSBob3VyIGxhdGVyCiMgUmVib290cyBzaG91bGQgc2NoZWR1bGVkIGFmdGVyIGFsbCBWTSBleHRlbnNpb25zIGhhdmUgaGFkIHRpbWUgdG8gY29tcGxldGUKIyBSZWZlcmVuY2U6IGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS92aXJ0dWFsLW1hY2hpbmVzL2V4dGVuc2lvbnMvY3VzdG9tLXNjcmlwdC1saW51eCN0aXBzCnJlYm9vdF92bSgpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgKHNodXRkb3duIC1yIG5vdyAmKQp9CiMhL2Jpbi9iYXNoCiMgUmVwb3NpdG9yeSBhbmQgcGFja2FnZSBtYW5hZ2VtZW50IHJlbGF0ZWQgZnVuY3Rpb25zCgpjb25maWd1cmVfcmVwb19tYXJpbmVyX2V4dGVuZGVkKCkgewogICAgbG9jYWwgLXIgZXh0ZW5kZWRfcmVwb19jb25maWc9Imh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9jYmwtbWFyaW5lci8yLjAvcHJvZC9leHRlbmRlZC94ODZfNjQvY29uZmlnLnJlcG8iCiAgICBjdXJsIC1zU0wgIiRleHRlbmRlZF9yZXBvX2NvbmZpZyIgLW8gL2V0Yy95dW0ucmVwb3MuZC9tYXJpbmVyLWV4dGVuZGVkLnJlcG8KCiAgICBsb2NhbCAtciByZXBvX25hbWU9ImNibC1tYXJpbmVyMi4wcHJvZGV4dGVuZGVkeDg2XzY0IgoKICAgIGxvY2FsIC1yYSBjbWQ9KAogICAgICAgIGRuZgogICAgICAgIHVwZGF0ZQogICAgICAgIC15CiAgICAgICAgLS1lbmFibGVyZXBvPSIkcmVwb19uYW1lIgogICAgKQoKICAgIGxvZyAiRW5hYmxpbmcgcmVwbyAkcmVwb19uYW1lIgogICAgcmV0cnkgY21kICIkMSIgIiR7MjotfSIKfQoKIyBjb25maWd1cmVfcnBtX3JlcG9zCiMgTmV3IHJlcG9zaXRvcmllcyBzaG91bGQgYmUgYWRkZWQgaW4gdGhlaXIgb3duIGZ1bmN0aW9ucywgYW5kIGNhbGxlZCBoZXJlCiMgYXJnczoKIyAxKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAyKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmNvbmZpZ3VyZV9ycG1fcmVwb3MoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGNvbmZpZ3VyZV9yZXBvX21hcmluZXJfZXh0ZW5kZWQgIiQxIiAiJHsyOi0xfSIKfQoKIyBkbmZfaW5zdGFsbF9wa2dzCiMgYXJnczoKIyAxKSBwa2dzIC0gbmFtZXJlZiwgc3RyaW5nIGFycmF5OyBQYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQKIyAyKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAzKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmRuZl9pbnN0YWxsX3BrZ3MoKSB7CiAgICBsb2NhbCAtbiBwa2dzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLWEgY21kPSgKICAgICAgICBkbmYKICAgICAgICAteQogICAgICAgIGluc3RhbGwKICAgICkKICAgIAogICAgIyBSZWZlcmVuY2U6IGh0dHBzOi8vd3d3LnNoZWxsY2hlY2submV0L3dpa2kvU0MyMjA2CiAgICAjIGFwcGVuZCBwa2dzIGFycmF5IHRvIGNtZAogICAgbWFwZmlsZSAtTyAkKCggJHsjY21kW0BdfSArIDEgKSkgLWQgJyAnIGNtZCA8PDwgIiR7cGtnc1tAXX0iCiAgICBsb2NhbCAtciBjbWQKCiAgICBsb2cgIkF0dGVtcHRpbmcgdG8gaW5zdGFsbCBwYWNrYWdlczogJHtwa2dzWypdfSIKICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iCn0KCgojIGRuZl91cGRhdGVfcGtncwojIGFyZ3M6CiMgMSkgZXhjbHVkZXMgLSBuYW1lcmVmLCBzdHJpbmcgYXJyYXksIG9wdGlvbmFsOyBQYWNrYWdlcyB0byBleGNsdWRlIGZyb20gdXBkYXRpbmcKIyAgICAgICBFYWNoIGluZGV4IG11c3QgYmUgcHJlZml4ZWQgd2l0aCAteCAKIyAyKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAzKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtbW91bnQgb2YgdGltZXMgdG8gcmV0cnkgY29tbWFuZCwgZGVmYXVsdHMgdG8gNQpkbmZfdXBkYXRlX3BrZ3MoKSB7CiAgICBsb2NhbCAtbiBleGNsdWRlcz0iJHsxOi1lbXB0eV9zdHJ9IgogICAgbG9nICJzdGFydGluZyIKCiAgICBsb2NhbCAtYSBjbWQ9KAogICAgICAgIGRuZgogICAgICAgIC15CiAgICAgICAgIyBSZXBsYWNlZCB3aXRoIGV4Y2x1ZGVzCiAgICAgICAgIiIKICAgICAgICB1cGRhdGUKICAgICAgICAtLWFsbG93ZXJhc2luZwogICAgKQoKICAgIGlmIFsgLW4gIiR7ZXhjbHVkZXN9IiBdOyB0aGVuCiAgICAgICAgIyBSZWZlcmVuY2UgaHR0cHM6Ly93d3cuc2hlbGxjaGVjay5uZXQvd2lraS9TQzIyMDYKICAgICAgICBtYXBmaWxlIC1PIDIgY21kIDw8PCAiJHtleGNsdWRlc1tAXX0iCiAgICBlbHNlCiAgICAgICAgIyBSZW1vdmUgZW1wdHkgc3RyaW5nIGlmIHdlIGFyZW4ndCByZXBsYWNpbmcgdGhlbSwgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIsIGJ1dCB3aHkgbm90IGJlIHNhZmUKICAgICAgICB1bnNldCAiY21kWzJdIgogICAgZmkKICAgIGxvY2FsIC1yIGNtZAoKICAgIGxvZyAiVXBkYXRpbmcgYWxsIHBhY2thZ2VzIGV4Y2x1ZGluZyBcIiR7ZXhjbHVkZXNbKl06LX1cIiIKICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iCn0KCiMgY29uZmlndXJlX2RuZl9jcm9uX2pvYgojIGNyZWF0ZSBjcm9uIGpvYiB0byBhdXRvIHVwZGF0ZSBycG0gcGFja2FnZXMKY29uZmlndXJlX2RuZl9jcm9uX2pvYigpIHsKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2NhbCAtciBjcm9uX3dlZWtseV9kbmZfdXBkYXRlX2ZpbGVuYW1lPScvZXRjL2Nyb24ud2Vla2x5L2RuZnVwZGF0ZScKICAgIGxvY2FsIC1yIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZT0iIyEvYmluL2Jhc2gKZG5mIHVwZGF0ZSAteSIKCiAgICB3cml0ZV9maWxlIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUgY3Jvbl93ZWVrbHlfZG5mX3VwZGF0ZV9maWxlIHRydWUKICAgIGNobW9kIHUreCAiJGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUiCn0KCiMgcnBtX2ltcG9ydF9rZXlzCiMgYXJnczoKIyAxKSBrZXlzIC0gbmFtZXJlZiwgc3RyaW5nIGFycmF5OyBycG0ga2V5cyB0byBiZSBpbXBvcnRlZAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZApycG1faW1wb3J0X2tleXMoKSB7CiAgICBsb2NhbCAtbiBrZXlzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3Iga2V5IGluICR7a2V5c1tAXX07IGRvCiAgICAgICAgaWYgWyAkeyNrZXlzW0BdfSAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZmkKICAgICAgICAgICAgbG9jYWwgLWEgY21kPSgKICAgICAgICAgICAgICAgIHJwbQogICAgICAgICAgICAgICAgLS1pbXBvcnQKICAgICAgICAgICAgICAgIC12CiAgICAgICAgICAgICAgICAiJGtleSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgbG9nICJJbXBvcnRpbmcgcnBtIHJlcG9zaXRvcnkga2V5ICRrZXkiCiAgICAgICAgICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iICYmIHVuc2V0IGtleQogICAgZG9uZQp9CiMhL2Jpbi9iYXNoCiMgQVJPIHNlcnZpY2Ugc2V0dXAgZnVuY3Rpb25zCgojIGVuYWJsZV9zZXJ2aWNlcyBlbmFibGVzIGFsbCBzZXJ2aWNlcyByZXF1aXJlZCBmb3IgYXJvIHJwCiMgYXJnczoKIyAxKSBzZXJ2aWNlcyAtIGFycmF5OyBzZXJ2aWNlcyB0byBiZSBlbmFibGVkCmVuYWJsZV9zZXJ2aWNlcygpIHsKICAgIGxvY2FsIC1uIHN2Y3M9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZAoKICAgIGxvZyAiZW5hYmxpbmcgc2VydmljZXMgJHtzdmNzWypdfSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA2OAogICAgZm9yIHN2YyBpbiAke3N2Y3NbQF19OyBkbwogICAgICAgIGxvZyAiRW5hYmxpbmcgYW5kIHN0YXJ0aW5nICRzdmMgbm93IgogICAgICAgIHN5c3RlbWN0bCBlbmFibGUgXAogICAgICAgICAgICAgICAgICAtLW5vdyBcCiAgICAgICAgICAgICAgICAgICIkc3ZjIgogICAgZG9uZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19nYXRld2F5CiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgY29udGFpbmVyIGltYWdlCiMgMikgcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgVk1TUyByb2xlCiMgMykgY29uZl9maWxlIC0gbmFtZXJlZiwgc3RyaW5nOyBhcm8gZ2F0ZXdheSBlbnZpcm9ubWVudCBmaWxlCiMgNCkgbmV0d29yayAtIG5hbWVyZWYsIHN0cmluZzsgcG9kbWFuIG5ldHdvcmsgbmFtZSB0byBiZSBhdHRhY2hlZApjb25maWd1cmVfc2VydmljZV9hcm9fZ2F0ZXdheSgpIHsKICAgIGxvY2FsIC1uIGltYWdlPSIkMSIKICAgIGxvY2FsIC1uIHJvbGU9IiQyIgogICAgbG9jYWwgLW4gY29uZl9maWxlPSIkMyIKICAgIGxvY2FsIC1uIG5ldHdvcms9IiQ0IgogICAgbG9nICJzdGFydGluZyIKICAgIGxvZyAiQ29uZmlndXJpbmcgYXJvLWdhdGV3YXkgc2VydmljZSIKCiAgICBsb2NhbCAtciBhcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lPScvZXRjL3N5c2NvbmZpZy9hcm8tZ2F0ZXdheScKCiAgICB3cml0ZV9maWxlIGFyb19nYXRld2F5X2NvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLWdhdGV3YXkuc2VydmljZScKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9JHthcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lfQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL3BvZG1hbiBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vcG9kbWFuIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFDUl9SRVNPVVJDRV9JRCBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBHQVRFV0FZX0RPTUFJTlMgXAogIC1lIEdBVEVXQVlfRkVBVFVSRVMgXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtbSAyZyBcCiAgLS1uZXR3b3JrPSRuZXR3b3JrIFwKICAtcCA4MDo4MDgwIFwKICAtcCA4MDgxOjgwODEgXAogIC1wIDQ0Mzo4NDQzIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICAke3JvbGUsLH0KRXhlY1N0b3A9L3Vzci9iaW4vcG9kbWFuIHN0b3AgLXQgMzYwMCAlTgpUaW1lb3V0U3RvcFNlYz0zNjAwClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CiAgICAiCgogICAgd3JpdGVfZmlsZSBhcm9fZ2F0ZXdheV9zZXJ2aWNlX2ZpbGVuYW1lIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfYXJvX3JwCiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgUlAgY29udGFpbmVyIGltYWdlCiMgMikgcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgVk1TUyByb2xlCiMgMykgY29uZl9maWxlIC0gbmFtZXJlZiwgc3RyaW5nOyBhcm8gcnAgZW52aXJvbm1lbnQgZmlsZQojIDQpIG5ldHdvcmsgLSBuYW1lcmVmLCBzdHJpbmc7IHBvZG1hbiBuZXR3b3JrIG5hbWUgdG8gYmUgYXR0YWNoZWQKY29uZmlndXJlX3NlcnZpY2VfYXJvX3JwKCkgewogICAgbG9jYWwgLW4gaW1hZ2U9IiQxIgogICAgbG9jYWwgLW4gcm9sZT0iJDIiCiAgICBsb2NhbCAtbiBjb25mX2ZpbGU9IiQzIgogICAgbG9jYWwgLW4gbmV0d29yaz0iJDQiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8tcnAgc2VydmljZSIKCiAgICBsb2NhbCAtciBhcm9fcnBfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLXJwJwoKICAgIHdyaXRlX2ZpbGUgYXJvX3JwX2NvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19ycF9zZXJ2aWNlX2ZpbGVuYW1lPScvZXRjL3N5c3RlbWQvc3lzdGVtL2Fyby1ycC5zZXJ2aWNlJwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBhcm9fcnBfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0ke2Fyb19ycF9jb25mX2ZpbGVuYW1lfQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL3BvZG1hbiBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vcG9kbWFuIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFDUl9SRVNPVVJDRV9JRCBcCiAgLWUgQURNSU5fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FIFwKICAtZSBBUk1fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FIFwKICAtZSBBWlVSRV9BUk1fQ0xJRU5UX0lEIFwKICAtZSBBWlVSRV9GUF9DTElFTlRfSUQgXAogIC1lIENMVVNURVJfTURNX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURNX05BTUVTUEFDRSBcCiAgLWUgQ0xVU1RFUl9NRFNEX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTiBcCiAgLWUgQ0xVU1RFUl9NRFNEX05BTUVTUEFDRSBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBET01BSU5fTkFNRSBcCiAgLWUgR0FURVdBWV9ET01BSU5TIFwKICAtZSBHQVRFV0FZX1JFU09VUkNFR1JPVVAgXAogIC1lIEtFWVZBVUxUX1BSRUZJWCBcCiAgLWUgTURNX0FDQ09VTlQgXAogIC1lIE1ETV9OQU1FU1BBQ0UgXAogIC1lIE1EU0RfRU5WSVJPTk1FTlQgXAogIC1lIFJQX0ZFQVRVUkVTIFwKICAtZSBBUk9fSU5TVEFMTF9WSUFfSElWRSBcCiAgLWUgQVJPX0hJVkVfREVGQVVMVF9JTlNUQUxMRVJfUFVMTFNQRUMgXAogIC1lIEFST19BRE9QVF9CWV9ISVZFIFwKICAtZSBPSURDX0FGRF9FTkRQT0lOVCBcCiAgLWUgT0lEQ19TVE9SQUdFX0FDQ09VTlRfTkFNRSBcCiAgLW0gMmcgXAogIC0tbmV0d29yaz0kbmV0d29yayBcCiAgLXAgNDQzOjg0NDMgXAogIC12IC9ldGMvYXJvLXJwOi9ldGMvYXJvLXJwIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICAke3JvbGUsLH0KRXhlY1N0b3A9L3Vzci9iaW4vcG9kbWFuIHN0b3AgLXQgMzYwMCAlTgpUaW1lb3V0U3RvcFNlYz0zNjAwClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgYXJvX3JwX3NlcnZpY2VfZmlsZW5hbWUgYXJvX3JwX3NlcnZpY2VfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfYXJvX21vbml0b3IKIyBhcmdzOgojIDEpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBSUCBjb250YWluZXIgaW1hZ2UKIyAyKSBuZXR3b3JrIC0gbmFtZXJlZiwgc3RyaW5nOyBwb2RtYW4gbmV0d29yayBuYW1lIHRvIGJlIGF0dGFjaGVkCmNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19tb25pdG9yKCkgewogICAgbG9jYWwgLW4gaW1hZ2U9IiQxIgogICAgbG9jYWwgLW4gbmV0d29yaz0iJDIiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8tbW9uaXRvciBzZXJ2aWNlIgoKICAgICMgRE9NQUlOX05BTUUsIENMVVNURVJfTURTRF9BQ0NPVU5ULCBDTFVTVEVSX01EU0RfQ09ORklHX1ZFUlNJT04sIEdBVEVXQVlfRE9NQUlOUywgR0FURVdBWV9SRVNPVVJDRUdST1VQLCBNRFNEX0VOVklST05NRU5UIENMVVNURVJfTURTRF9OQU1FU1BBQ0UKICAgICMgYXJlIG5vdCB1c2VkLCBidXQgY2FuJ3QgZWFzaWx5IGJlIHJlZmFjdG9yZWQgb3V0LiBTaG91bGQgYmUgcmV2aXNpdGVkIGluIHRoZSBmdXR1cmUuCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLW1vbml0b3InCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlPSJBWlVSRV9GUF9DTElFTlRfSUQ9JyRGUENMSUVOVElEJwpET01BSU5fTkFNRT0nJExPQ0FUSU9OLiRDTFVTVEVSUEFSRU5URE9NQUlOTkFNRScKQ0xVU1RFUl9NRFNEX0FDQ09VTlQ9JyRDTFVTVEVSTURTREFDQ09VTlQnCkNMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTj0nJENMVVNURVJNRFNEQ09ORklHVkVSU0lPTicKR0FURVdBWV9ET01BSU5TPSckR0FURVdBWURPTUFJTlMnCkdBVEVXQVlfUkVTT1VSQ0VHUk9VUD0nJEdBVEVXQVlSRVNPVVJDRUdST1VQTkFNRScKTURTRF9FTlZJUk9OTUVOVD0nJE1EU0RFTlZJUk9OTUVOVCcKQ0xVU1RFUl9NRFNEX05BTUVTUEFDRT0nJENMVVNURVJNRFNETkFNRVNQQUNFJwpDTFVTVEVSX01ETV9BQ0NPVU5UPSckQ0xVU1RFUk1ETUFDQ09VTlQnCkNMVVNURVJfTURNX05BTUVTUEFDRT1CQk0KREFUQUJBU0VfQUNDT1VOVF9OQU1FPSckREFUQUJBU0VBQ0NPVU5UTkFNRScKS0VZVkFVTFRfUFJFRklYPSckS0VZVkFVTFRQUkVGSVgnCk1ETV9BQ0NPVU5UPSckUlBNRE1BQ0NPVU5UJwpNRE1fTkFNRVNQQUNFPUJCTQpSUElNQUdFPSckaW1hZ2UnIgoKICAgIHdyaXRlX2ZpbGUgYXJvX21vbml0b3Jfc2VydmljZV9jb25mX2ZpbGVuYW1lIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLW1vbml0b3Iuc2VydmljZScKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgYXJvX21vbml0b3Jfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tbW9uaXRvcgpFeGVjU3RhcnRQcmU9LS91c3IvYmluL3BvZG1hbiBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vcG9kbWFuIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC0tbmV0d29yaz0kbmV0d29yayBcCiAgLWUgQVpVUkVfRlBfQ0xJRU5UX0lEIFwKICAtZSBET01BSU5fTkFNRSBcCiAgLWUgQ0xVU1RFUl9NRFNEX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTiBcCiAgLWUgR0FURVdBWV9ET01BSU5TIFwKICAtZSBHQVRFV0FZX1JFU09VUkNFR1JPVVAgXAogIC1lIE1EU0RfRU5WSVJPTk1FTlQgXAogIC1lIENMVVNURVJfTURTRF9OQU1FU1BBQ0UgXAogIC1lIENMVVNURVJfTURNX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURNX05BTUVTUEFDRSBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtbSAyLjVnIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICBtb25pdG9yClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgYXJvX21vbml0b3Jfc2VydmljZV9maWxlbmFtZSBhcm9fbW9uaXRvcl9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwKIyBhcmdzOgojIDEpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBSUCBjb250YWluZXIgaW1hZ2UKIyAyKSBuZXR3b3JrIC0gbmFtZXJlZiwgc3RyaW5nOyBwb2RtYW4gbmV0d29yayBuYW1lIHRvIGJlIGF0dGFjaGVkCmNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwoKSB7CiAgICBsb2NhbCAtbiBpbWFnZT0iJDEiCiAgICBsb2NhbCAtbiBuZXR3b3JrPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGFybyBwb3J0YWwgc2VydmljZSIKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19wb3J0YWxfc2VydmljZV9jb25mX2ZpbGVuYW1lPScvZXRjL3N5c2NvbmZpZy9hcm8tcG9ydGFsJwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlPSJBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUz0nJFBPUlRBTEFDQ0VTU0dST1VQSURTJwpBWlVSRV9QT1JUQUxfQ0xJRU5UX0lEPSckUE9SVEFMQ0xJRU5USUQnCkFaVVJFX1BPUlRBTF9FTEVWQVRFRF9HUk9VUF9JRFM9JyRQT1JUQUxFTEVWQVRFREdST1VQSURTJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpLRVlWQVVMVF9QUkVGSVg9JyRLRVlWQVVMVFBSRUZJWCcKTURNX0FDQ09VTlQ9JyRSUE1ETUFDQ09VTlQnCk1ETV9OQU1FU1BBQ0U9UG9ydGFsClBPUlRBTF9IT1NUTkFNRT0nJExPQ0FUSU9OLmFkbWluLiRSUFBBUkVOVERPTUFJTk5BTUUnClJQSU1BR0U9JyRpbWFnZSciCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlbmFtZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19wb3J0YWxfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tcG9ydGFsLnNlcnZpY2UnCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19wb3J0YWxfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldApTdGFydExpbWl0SW50ZXJ2YWw9MAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tcG9ydGFsCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vcG9kbWFuIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9wb2RtYW4gcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLS1uZXR3b3JrPSRuZXR3b3JrIFwKICAtZSBBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUyBcCiAgLWUgQVpVUkVfUE9SVEFMX0NMSUVOVF9JRCBcCiAgLWUgQVpVUkVfUE9SVEFMX0VMRVZBVEVEX0dST1VQX0lEUyBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBQT1JUQUxfSE9TVE5BTUUgXAogIC1tIDJnIFwKICAtcCA0NDQ6ODQ0NCBcCiAgLXAgMjIyMjoyMjIyIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICBwb3J0YWwKUmVzdGFydD1hbHdheXMKUmVzdGFydFNlYz0xCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfZmlsZW5hbWUgYXJvX3BvcnRhbF9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QKIyBhcmdzOgojIDEpIG1vbml0b3Jpbmdfcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgY2FuIGJlICJnYXRld2F5IiBvciAicnAiCiMgMikgbW9uaXRvcl9jb25maWdfdmVyc2lvbiAtIG5hbWVyZWYsIHN0cmluZzsgbWRzZCBjb25maWcgdmVyc2lvbgpjb25maWd1cmVfc2VydmljZV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2NhbCAtbiBtb25pdG9yX2NvbmZpZ192ZXJzaW9uPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgImNvbmZpZ3VyaW5nIG1kc2Qgc2VydmljZSIKCiAgICB2ZXJpZnlfcm9sZSByb2xlCgogICAgbG9jYWwgLXIgbWRzZF9zZXJ2aWNlX2Rpcj0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZHNkLnNlcnZpY2UuZCIKICAgIG1rZGlyIC1wICIkbWRzZF9zZXJ2aWNlX2RpciIKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlbmFtZT0iJG1kc2Rfc2VydmljZV9kaXIvb3ZlcnJpZGUuY29uZiIKICAgIGxvY2FsIC1yIG1kc2RfY2VydGlmaWNhdGVfc2FuPSIkKG9wZW5zc2wgeDUwOSAtaW4gL3Zhci9saWIvd2FhZ2VudC9NaWNyb3NvZnQuQXp1cmUuS2V5VmF1bHQuU3RvcmUvbWRzZC5wZW0gLW5vb3V0IC1zdWJqZWN0IHwgc2VkIC1lICdzLy4qQ04gPSAvLycpIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBtZHNkX292ZXJyaWRlX2NvbmZfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlbmFtZSBtZHNkX292ZXJyaWRlX2NvbmZfZmlsZSB0cnVlCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBkZWZhdWx0X21kc2RfZmlsZW5hbWU9Ii9ldGMvZGVmYXVsdC9tZHNkIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBkZWZhdWx0X21kc2RfZmlsZT0iTURTRF9ST0xFX1BSRUZJWD0vdmFyL3J1bi9tZHNkL2RlZmF1bHQKTURTRF9PUFRJT05TPVwiLUEgLWQgLXIgXCRNRFNEX1JPTEVfUFJFRklYXCIKCmV4cG9ydCBNT05JVE9SSU5HX0dDU19FTlZJUk9OTUVOVD0nJE1EU0RFTlZJUk9OTUVOVCcKZXhwb3J0IE1PTklUT1JJTkdfR0NTX0FDQ09VTlQ9JyRSUE1EU0RBQ0NPVU5UJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfUkVHSU9OPSckTE9DQVRJT04nCmV4cG9ydCBNT05JVE9SSU5HX0dDU19BVVRIX0lEX1RZUEU9QXV0aEtleVZhdWx0CmV4cG9ydCBNT05JVE9SSU5HX0dDU19BVVRIX0lEPSckbWRzZF9jZXJ0aWZpY2F0ZV9zYW4nCmV4cG9ydCBNT05JVE9SSU5HX0dDU19OQU1FU1BBQ0U9JyRSUE1EU0ROQU1FU1BBQ0UnCmV4cG9ydCBNT05JVE9SSU5HX0NPTkZJR19WRVJTSU9OPSckbW9uaXRvcl9jb25maWdfdmVyc2lvbicKZXhwb3J0IE1PTklUT1JJTkdfVVNFX0dFTkVWQV9DT05GSUdfU0VSVklDRT10cnVlCgpleHBvcnQgTU9OSVRPUklOR19URU5BTlQ9JyRMT0NBVElPTicKZXhwb3J0IE1PTklUT1JJTkdfUk9MRT0nJHJvbGUnCmV4cG9ydCBNT05JVE9SSU5HX1JPTEVfSU5TVEFOQ0U9XCIkKGhvc3RuYW1lKVwiCgpleHBvcnQgTURTRF9NU0dQQUNLX1NPUlRfQ09MVU1OUz1cIjFcIiIKCiAgICB3cml0ZV9maWxlIGRlZmF1bHRfbWRzZF9maWxlbmFtZSBkZWZhdWx0X21kc2RfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0CiMgYXJnczoKIyAxKSBjb25mX2ZpbGUgLSBzdHJpbmc7IGZsdWVuYml0IGNvbmZpZ3VyYXRpb24gZmlsZQojIDIpIGltYWdlIC0gc3RyaW5nOyBmbHVlbnRiaXQgY29udGFpbmVyIGltYWdlIHRvIHJ1bgojIDMpIG5ldHdvcmsgLSBuYW1lcmVmLCBzdHJpbmc7IHBvZG1hbiBuZXR3b3JrIG5hbWUgdG8gYmUgYXR0YWNoZWQKY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0KCkgewogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtbiBjb25mX2ZpbGU9IiQxIgogICAgbG9jYWwgLW4gaW1hZ2U9IiQyIgogICAgbG9jYWwgLW4gbmV0d29yaz0iJDMiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBmbHVlbnRiaXQgc2VydmljZSIKCiAgICBta2RpciAtcCAvZXRjL2ZsdWVudGJpdC8KICAgIG1rZGlyIC1wIC92YXIvbGliL2ZsdWVudAoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgY29uZl9maWxlbmFtZT0nL2V0Yy9mbHVlbnRiaXQvZmx1ZW50Yml0LmNvbmYnCiAgICB3cml0ZV9maWxlIGNvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHN5c2NvbmZpZ19maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvZmx1ZW50Yml0JwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBzeXNjb25maWdfZmlsZT0iRkxVRU5UQklUSU1BR0U9JGltYWdlIgoKICAgIHdyaXRlX2ZpbGUgc3lzY29uZmlnX2ZpbGVuYW1lIHN5c2NvbmZpZ19maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHNlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vZmx1ZW50Yml0LnNlcnZpY2UnCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHNlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKU3RhcnRMaW1pdEludGVydmFsU2VjPTAKCltTZXJ2aWNlXQpSZXN0YXJ0U2VjPTFzCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9mbHVlbnRiaXQKRXhlY1N0YXJ0UHJlPS0vdXNyL2Jpbi9wb2RtYW4gcm0gLWYgJU4KRXhlY1N0YXJ0PS91c3IvYmluL3BvZG1hbiBydW4gXAogIC0tc2VjdXJpdHktb3B0IGxhYmVsPWRpc2FibGUgXAogIC0tZW50cnlwb2ludCAvb3B0L3RkLWFnZW50LWJpdC9iaW4vdGQtYWdlbnQtYml0IFwKICAtLW5ldD1ob3N0IFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLS1uZXR3b3JrPSRuZXR3b3JrIFwKICAtdiAvZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZjovZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZiBcCiAgLXYgL3Zhci9saWIvZmx1ZW50Oi92YXIvbGliL2ZsdWVudDp6IFwKICAtdiAvdmFyL2xvZy9qb3VybmFsOi92YXIvbG9nL2pvdXJuYWw6cm8gXAogIC12IC9ldGMvbWFjaGluZS1pZDovZXRjL21hY2hpbmUtaWQ6cm8gXAogICRpbWFnZSBcCiAgLWMgL2V0Yy9mbHVlbnRiaXQvZmx1ZW50Yml0LmNvbmYKCkV4ZWNTdG9wPS91c3IvYmluL3BvZG1hbiBzdG9wICVOClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9NQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgc2VydmljZV9maWxlbmFtZSBzZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QKIyBhcmdzOgojIDEpIHJvbGUgLSBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgpjb25maWd1cmVfdGltZXJzX21kbV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICBsb2NhbCBrZXl2YXVsdF9zdWZmaXggc2VjcmV0X3ByZWZpeAogICAgZ2V0X2tleXZhdWx0X3N1ZmZpeCByb2xlIGtleXZhdWx0X3N1ZmZpeCBzZWNyZXRfcHJlZml4CgogICAgZm9yIHZhciBpbiAibWRzZCIgIm1kbSI7IGRvCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9kb3dubG9hZC0kdmFyLWNyZWRlbnRpYWxzLnNlcnZpY2UiCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaCAkdmFyIgoKICAgICAgICB3cml0ZV9maWxlIGRvd25sb2FkX2NyZWRzX3NlcnZpY2VfZmlsZW5hbWUgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlIHRydWUKCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfdGltZXJfZmlsZW5hbWU9Ii9ldGMvc3lzdGVtZC9zeXN0ZW0vZG93bmxvYWQtJHZhci1jcmVkZW50aWFscy50aW1lciIKICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgICAgICBsb2NhbCBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltUaW1lcl0KT25Cb290U2VjPTBtaW4KT25DYWxlbmRhcj0wLzEyOjAwOjAwCkFjY3VyYWN5U2VjPTVzCgpbSW5zdGFsbF0KV2FudGVkQnk9dGltZXJzLnRhcmdldCIKCiAgICAgICAgd3JpdGVfZmlsZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlbmFtZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlIHRydWUKICAgIGRvbmUKCiAgICBsb2NhbCAtciBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZW5hbWU9Ii91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZT0iIyEvYmluL2Jhc2gKc2V0IC1ldQoKQ09NUE9ORU5UPVwkMQplY2hvIFwiRG93bmxvYWQgXCRDT01QT05FTlQgY3JlZGVudGlhbHNcIgoKVEVNUF9ESVI9XCJcJChta3RlbXAgLWQpXCIKZXhwb3J0IEFaVVJFX0NPTkZJR19ESVI9XCJcJChta3RlbXAgLWQpXCIKCmVjaG8gXCJMb2dnaW5nIGludG8gQXp1cmUuLi5cIgpSRVRSSUVTPTMKd2hpbGUgW1sgXCRSRVRSSUVTIC1ndCAwIF1dOyBkbwogICAgaWYgYXogbG9naW4gLWkgLS1hbGxvdy1uby1zdWJzY3JpcHRpb25zCiAgICB0aGVuCiAgICAgICAgZWNobyBcImF6IGxvZ2luIHN1Y2Nlc3NmdWxcIgogICAgICAgIGJyZWFrCiAgICBlbHNlCiAgICAgICAgZWNobyBcImF6IGxvZ2luIGZhaWxlZC4gUmV0cnlpbmcuLi5cIgogICAgICAgIGxldCBSRVRSSUVTLT0xCiAgICAgICAgc2xlZXAgNQogICAgZmkKZG9uZQoKdHJhcCBcImNsZWFudXBcIiBFWElUCgpjbGVhbnVwKCkgewogIGF6IGxvZ291dAogIFtbIFwkVEVNUF9ESVIgPX4gL3RtcC8uKyBdXSAmJiBybSAtcmYgXCRURU1QX0RJUgogIFtbIFwkQVpVUkVfQ09ORklHX0RJUiA9fiAvdG1wLy4rIF1dICYmIHJtIC1yZiBcJEFaVVJFX0NPTkZJR19ESVIKfQoKaWYgW1sgXCRDT01QT05FTlQgPSBcIm1kbVwiIF1dOyB0aGVuCiAgQ1VSUkVOVF9DRVJUX0ZJTEU9XCIvZXRjL21kbS5wZW1cIgplbGlmIFtbIFwkQ09NUE9ORU5UID0gXCJtZHNkXCIgXV07IHRoZW4KICBDVVJSRU5UX0NFUlRfRklMRT1cIi92YXIvbGliL3dhYWdlbnQvTWljcm9zb2Z0LkF6dXJlLktleVZhdWx0LlN0b3JlL21kc2QucGVtXCIKZWxzZQogIGVjaG8gSW52YWxpZCB1c2FnZSAmJiBleGl0IDEKZmkKClNFQ1JFVF9OQU1FPVwiJHNlY3JldF9wcmVmaXgtXCR7Q09NUE9ORU5UfVwiCk5FV19DRVJUX0ZJTEU9XCJcJFRFTVBfRElSL1wkQ09NUE9ORU5ULnBlbVwiCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KICBheiBrZXl2YXVsdCBcCiAgICBzZWNyZXQgXAogICAgZG93bmxvYWQgXAogICAgLS1maWxlIFwiXCRORVdfQ0VSVF9GSUxFXCIgXAogICAgLS1pZCBcImh0dHBzOi8vJEtFWVZBVUxUUFJFRklYLSRrZXl2YXVsdF9zdWZmaXguJEtFWVZBVUxURE5TU1VGRklYL3NlY3JldHMvXCRTRUNSRVRfTkFNRVwiIFwKICAgICYmIGJyZWFrCiAgaWYgW1sgXCRhdHRlbXB0IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKaWYgWyAtZiBcJE5FV19DRVJUX0ZJTEUgXTsgdGhlbgogIGlmIFtbIFwkQ09NUE9ORU5UID0gXCJtZHNkXCIgXV07IHRoZW4KICAgIGNob3duIHN5c2xvZzpzeXNsb2cgXCRORVdfQ0VSVF9GSUxFCiAgZWxzZQogICAgc2VkIC1pIC1uZSAnMSwvRU5EIENFUlRJRklDQVRFLyBwJyBcJE5FV19DRVJUX0ZJTEUKICBmaQoKICBuZXdfY2VydF9zbj1cIlwkKG9wZW5zc2wgeDUwOSAtaW4gXCJcJE5FV19DRVJUX0ZJTEVcIiAtbm9vdXQgLXNlcmlhbCB8IGF3ayAtRj0gJ3twcmludCBcJDJ9JylcIgogIGN1cnJlbnRfY2VydF9zbj1cIlwkKG9wZW5zc2wgeDUwOSAtaW4gXCJcJENVUlJFTlRfQ0VSVF9GSUxFXCIgLW5vb3V0IC1zZXJpYWwgfCBhd2sgLUY9ICd7cHJpbnQgXCQyfScpXCIKICBpZiBbWyAhIC16IFwkbmV3X2NlcnRfc24gXV0gJiYgW1sgXCRuZXdfY2VydF9zbiAhPSBcIlwkY3VycmVudF9jZXJ0X3NuXCIgXV07IHRoZW4KICAgIGVjaG8gdXBkYXRpbmcgY2VydGlmaWNhdGUgZm9yIFwkQ09NUE9ORU5UCiAgICBjaG1vZCAwNjAwIFwkTkVXX0NFUlRfRklMRQogICAgbXYgXCRORVdfQ0VSVF9GSUxFIFwkQ1VSUkVOVF9DRVJUX0ZJTEUKICBmaQplbHNlCiAgZWNobyBGYWlsZWQgdG8gcmVmcmVzaCBjZXJ0aWZpY2F0ZSBmb3IgXCRDT01QT05FTlQgJiYgZXhpdCAxCmZpIgoKICAgIHdyaXRlX2ZpbGUgZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGVuYW1lIGRvd25sb2FkX2NyZWRzX3NjcmlwdF9maWxlIHRydWUKCiAgICBjaG1vZCB1K3ggL3Vzci9sb2NhbC9iaW4vZG93bmxvYWQtY3JlZGVudGlhbHMuc2gKCiAgICAkZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGVuYW1lIG1kc2QgJgogICAgd2FpdCAiJCEiCgoKICAgICRkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZW5hbWUgbWRtICYKICAgIHdhaXQgIiQhIgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3NlcnZpY2VfZmlsZW5hbWU9Ii9ldGMvc3lzdGVtZC9zeXN0ZW0vd2F0Y2gtbWRtLWNyZWRlbnRpYWxzLnNlcnZpY2UiCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGU9IltVbml0XQpEZXNjcmlwdGlvbj1XYXRjaCBmb3IgY2hhbmdlcyBpbiBtZG0ucGVtIGFuZCByZXN0YXJ0cyB0aGUgbWRtIHNlcnZpY2UKCltTZXJ2aWNlXQpUeXBlPW9uZXNob3QKRXhlY1N0YXJ0PS91c3IvYmluL3N5c3RlbWN0bCByZXN0YXJ0IG1kbS5zZXJ2aWNlCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSB3YXRjaF9tZG1fY3JlZHNfc2VydmljZV9maWxlbmFtZSB3YXRjaF9tZG1fY3JlZHNfc2VydmljZV9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lPScvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS93YXRjaC1tZG0tY3JlZGVudGlhbHMucGF0aCcKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3BhdGhfZmlsZT0nW1BhdGhdClBhdGhNb2RpZmllZD0vZXRjL21kbS5wZW0KCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCcKCiAgICB3cml0ZV9maWxlIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkcz0nd2F0Y2gtbWRtLWNyZWRlbnRpYWxzLnBhdGgnCiAgICBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93ICIkd2F0Y2hfbWRtX2NyZWRzIiB8fCBhYm9ydCAiZmFpbGVkIHRvIGVuYWJsZSBhbmQgc3RhcnQgJHdhdGNoX21kbV9jcmVkcyIKfQoKIyBjb25maWd1cmVfc2VydmljZV9tZG0KIyBhcmdzOgojIDEpIHJvbGUgLSBuYW1lcmVmLCBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgojIDIpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBtZG0gY29udGFpbmVyIGltYWdlIHRvIHJ1bgojIDMpIG5ldHdvcmsgLSBuYW1lcmVmLCBzdHJpbmc7IHBvZG1hbiBuZXR3b3JrIG5hbWUgdG8gYmUgYXR0YWNoZWQKY29uZmlndXJlX3NlcnZpY2VfbWRtKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2NhbCAtbiBpbWFnZT0iJDIiCiAgICBsb2NhbCAtbiBuZXR3b3JrPSIkMyIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIG1kbSBzZXJ2aWNlIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHN5c2NvbmZpZ19tZG1fZmlsZW5hbWU9Ii9ldGMvc3lzY29uZmlnL21kbSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgc3lzY29uZmlnX21kbV9maWxlPSJNRE1GUk9OVEVORFVSTD0nJE1ETUZST05URU5EVVJMJwpNRE1JTUFHRT0nJGltYWdlJwpNRE1TT1VSQ0VFTlZJUk9OTUVOVD0nJExPQ0FUSU9OJwpNRE1TT1VSQ0VST0xFPSckcm9sZScKTURNU09VUkNFUk9MRUlOU1RBTkNFPVwiJChob3N0bmFtZSlcIiIKCiAgICB3cml0ZV9maWxlIHN5c2NvbmZpZ19tZG1fZmlsZW5hbWUgc3lzY29uZmlnX21kbV9maWxlIHRydWUKCiAgICBta2RpciAtcCAvdmFyL2V0dwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBtZG1fc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZG0uc2VydmljZSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgbWRtX3NlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvbWRtCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vcG9kbWFuIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9wb2RtYW4gcnVuIFwKICAtLWVudHJ5cG9pbnQgL3Vzci9zYmluL01ldHJpY3NFeHRlbnNpb24gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLS1jYXAtZHJvcCBuZXRfcmF3IFwKICAtLW5ldHdvcms9JG5ldHdvcmsgXAogIC1tIDJnIFwKICAtdiAvZXRjL21kbS5wZW06L2V0Yy9tZG0ucGVtIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkaW1hZ2UgXAogIC1DZXJ0RmlsZSAvZXRjL21kbS5wZW0gXAogIC1Gcm9udEVuZFVybCAkTURNRlJPTlRFTkRVUkwgXAogIC1Mb2dnZXIgQ29uc29sZSBcCiAgLUxvZ0xldmVsIFdhcm5pbmcgXAogIC1Qcml2YXRlS2V5RmlsZSAvZXRjL21kbS5wZW0gXAogIC1Tb3VyY2VFbnZpcm9ubWVudCAkTE9DQVRJT04gXAogIC1Tb3VyY2VSb2xlICRyb2xlIFwKICAtU291cmNlUm9sZUluc3RhbmNlICRIT1NUTkFNRQpFeGVjU3RvcD0vdXNyL2Jpbi9wb2RtYW4gc3RvcCAlTgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIG1kbV9zZXJ2aWNlX2ZpbGVuYW1lIG1kbV9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV92bXNzX2Fyb19zZXJ2aWNlCiMgYXJnczoKIyAxKSByIC0gbmFtZXJlZiwgc3RyaW5nOyByb2xlIG9mIFZNU1MKIyAyKSBpbWFnZXMgLSBuYW1lcmVmLCBhc3NvY2lhdGl2ZSBhcnJheTsgQVJPIGNvbnRhaW5lciBpbWFnZXMKIyAzKSBjb25maWdzIC0gbmFtZXJlZiwgYXNzb2NpYXRpdmUgYXJyYXk7IGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHZlcnNpb25zLiBUaGUgdmFsdWVzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byB2YXJpYWJsZXMsIG5vdCBkZXJlZmVyZW5jZWQuCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIHZhbHVlIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBuYW1lcmVmIHZhcmlhYmxlcyBieSBoZWxwZXIgZnVuY3Rpb25zLgpjb25maWd1cmVfdm1zc19hcm9fc2VydmljZXMoKSB7CiAgICBsb2NhbCAtbiByPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlcz0iJDIiCiAgICBsb2NhbCAtbiBjb25maWdzPSIkMyIKICAgIGxvZyAic3RhcnRpbmciCiAgICB2ZXJpZnlfcm9sZSAiJDEiCgogICAgaWYgWyAiJHIiID09ICIkcm9sZV9nYXRld2F5IiBdOyB0aGVuCiAgICAgICAgY29uZmlndXJlX3NlcnZpY2VfYXJvX2dhdGV3YXkgIiR7aW1hZ2VzWyJycCJdfSIgIiQxIiAiJHtjb25maWdzWyJnYXRld2F5X2NvbmZpZyJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgIGVsaWYgWyAiJHIiID09ICIkcm9sZV9ycCIgXTsgdGhlbgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19ycCAiJHtpbWFnZXNbInJwIl19IiAiJDEiICIke2NvbmZpZ3NbInJwX2NvbmZpZyJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgICAgICBjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvciAiJHtpbWFnZXNbInJwIl19IiAiJHtjb25maWdzWyJuZXR3b3JrIl19IgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwgIiR7aW1hZ2VzWyJycCJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgIGZpCgogICAgY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0ICIke2NvbmZpZ3NbImZsdWVudGJpdCJdfSIgIiR7aW1hZ2VzWyJmbHVlbnRiaXQiXX0iICIke2NvbmZpZ3NbIm5ldHdvcmsiXX0iCiAgICBjb25maWd1cmVfc2VydmljZV9tZG0gIiQxIiAiJHtpbWFnZXNbIm1kbSJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QgIiQxIiAiJHtjb25maWdzWyJtZHNkIl19IgogICAgY29uZmlndXJlX2NlcnRzICIkMSIKICAgIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QgIiQxIgp9Cgp1dGlsX2NvbW1vbj0idXRpbC1jb21tb24uc2giCmlmIFsgLWYgIiR1dGlsX2NvbW1vbiIgXTsgdGhlbgogICAgIyBzaGVsbGNoZWNrIHNvdXJjZT11dGlsLWNvbW1vbi5zaAogICAgc291cmNlICIkdXRpbF9jb21tb24iCmZpCiMhL2Jpbi9iYXNoCiMgVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIHNvdXJjZWQgYnkgYm9vdHN0cmFwcGluZyBzY3JpcHRzIGZvciBjb21tb25seSB1c2VkIGZ1bmN0aW9ucwoKIyBjb25maWd1cmVfc3NoZAojIFdlIG5lZWQgdG8gY29uZmlndXJlIFBhc3N3b3JkQXV0aGVudGljYXRpb24gdG8geWVzIGluIG9yZGVyIGZvciB0aGUgVk1TUyBBY2Nlc3MgSklUIHRvIHdvcmsKY29uZmlndXJlX3NzaGQoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9jYWwgLXIgc3NoZF9jb25maWc9Ii9ldGMvc3NoL3NzaGRfY29uZmlnIgoKICAgIGxvZyAiRWRpdGluZyAkc3NoZF9jb25maWcgdG8gYWxsb3cgcGFzc3dvcmQgYXV0aGVudGljYXRpb24iCiAgICBzZWQgLWkgJ3MvUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBuby9QYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcy9nJyAiJHNzaGRfY29uZmlnIgoKICAgIHN5c3RlbWN0bCByZWxvYWQgc3NoZC5zZXJ2aWNlIHx8IGFib3J0ICJzc2hkIGZhaWxlZCB0byByZWxvYWQiCn0KCiMgY29uZmlndXJlX2xvZ3JvdGF0ZSBjbG9iYmVycyAvZXRjL2xvZ3JvdGF0ZS5jb25mCiMgYXJnczoKIyAxKSBkcm9waW5fZmlsZXMgLSBuYW1lcmVmLCBhc3NvY2lhdGl2ZSBhcnJheSwgb3B0aW9uYWw7IGxvZ3JvdGF0ZSBmaWxlcyB0byB3cml0ZSB0byAvZXRjL2xvZ3JvdGF0ZS5kCiMgICAgICAgS2V5IG5hbWUgZGljdGF0ZXMgZmlsZW5hbWVzIHdyaXR0ZW4gdG8gL2V0Yy9sb2dyb3RhdGUuZC4KIyBFeGFtcGxlOiAKIyAgIEtleSBkaWN0YXRlcyB0aGUgZmlsZW5hbWUgd3JpdHRlbiBpbiAvZXRjL2xvZ3JvdGF0ZS5kCiMgICBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiMgICBsb2NhbCAtckEgbG9ncm90YXRlX2Ryb3BpbnM9KAojICAgICAgWyJnYXRld2F5Il09IiRnYXRld2F5X2xvZ19maWxlIgojICAgKQpjb25maWd1cmVfbG9ncm90YXRlKCkgewogICAgbG9jYWwgLW4gZHJvcGluX2ZpbGVzPSIkezE6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgbG9ncm90YXRlX2NvbmZfZmlsZW5hbWU9Jy9ldGMvbG9ncm90YXRlLmNvbmYnCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGxvZ3JvdGF0ZV9jb25mX2ZpbGU9JyMgc2VlICJtYW4gbG9ncm90YXRlIiBmb3IgZGV0YWlscwojIHJvdGF0ZSBsb2cgZmlsZXMgd2Vla2x5CndlZWtseQoKIyBrZWVwIDIgd2Vla3Mgd29ydGggb2YgYmFja2xvZ3MKcm90YXRlIDIKCiMgY3JlYXRlIG5ldyAoZW1wdHkpIGxvZyBmaWxlcyBhZnRlciByb3RhdGluZyBvbGQgb25lcwpjcmVhdGUKCiMgdXNlIGRhdGUgYXMgYSBzdWZmaXggb2YgdGhlIHJvdGF0ZWQgZmlsZQpkYXRlZXh0CgojIHVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHlvdXIgbG9nIGZpbGVzIGNvbXByZXNzZWQKY29tcHJlc3MKCiMgUlBNIHBhY2thZ2VzIGRyb3AgbG9nIHJvdGF0aW9uIGluZm9ybWF0aW9uIGludG8gdGhpcyBkaXJlY3RvcnkKaW5jbHVkZSAvZXRjL2xvZ3JvdGF0ZS5kCgojIG5vIHBhY2thZ2VzIG93biB3dG1wIGFuZCBidG1wIC0tIHdlIHdpbGwgcm90YXRlIHRoZW0gaGVyZQovdmFyL2xvZy93dG1wIHsKICAgIG1vbnRobHkKICAgIGNyZWF0ZSAwNjY0IHJvb3QgdXRtcAogICAgICAgIG1pbnNpemUgMU0KICAgIHJvdGF0ZSAxCn0KCi92YXIvbG9nL2J0bXAgewogICAgbWlzc2luZ29rCiAgICBtb250aGx5CiAgICBjcmVhdGUgMDYwMCByb290IHV0bXAKICAgIHJvdGF0ZSAxCn0nCgogICAgd3JpdGVfZmlsZSBsb2dyb3RhdGVfY29uZl9maWxlbmFtZSBsb2dyb3RhdGVfY29uZl9maWxlIHRydWUKCiAgICBpZiBbIC1uICIke2Ryb3Bpbl9maWxlc1sqXX0iIF07IHRoZW4KICAgICAgICBsb2NhbCAtciBsb2dyb3RhdGVfZD0iL2V0Yy9sb2dyb3RhdGUuZCIKICAgICAgICBsb2cgIldyaXRpbmcgbG9ncm90YXRlIGZpbGVzIHRvICRsb2dyb3RhdGVfZCIKICAgICAgICBmb3IgZHJvcGluX25hbWUgaW4gIiR7IWRyb3Bpbl9maWxlc1tAXX0iOyBkbwogICAgICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgICAgICAgICAgbG9jYWwgLXIgZHJvcGluX2ZpbGVuYW1lPSIkbG9ncm90YXRlX2QvJGRyb3Bpbl9uYW1lIgogICAgICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgICAgICAgICAgbG9jYWwgLXIgZHJvcGluX2ZpbGU9IiR7ZHJvcGluX2ZpbGVzWyIkZHJvcGluX25hbWUiXX0iCiAgICAgICAgICAgIHdyaXRlX2ZpbGUgZHJvcGluX2ZpbGVuYW1lIGRyb3Bpbl9maWxlIHRydWUKICAgICAgICBkb25lCiAgICBmaQp9CgojIHB1bGxfY29udGFpbmVyX2ltYWdlcwojIGFyZ3M6CiMgMSkgcHVsbF9pbWFnZXMgLSBuYW1lcmVmLCBzdHJpbmcgYXJyYXkKIyAyKSByZWdpc3RyeV9jb25mIC0gbmFtZXJlZiwgc3RyaW5nLCBvcHRpb25hbDsgcGF0aCB0byBkb2NrZXIvcG9kbWFuIGNvbmZpZ3VyYXRpb24gZmlsZQpwdWxsX2NvbnRhaW5lcl9pbWFnZXMoKSB7CiAgICBsb2NhbCAtbiBwdWxsX2ltYWdlcz0iJDEiCiAgICBsb2NhbCAtbiByZWdpc3RyeV9jb25mPSIkezI6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXJpIHJldHJ5X3RpbWU9MzAKICAgICMgVGhlIG1hbmFnZWQgaWRlbnRpdHkgdGhhdCB0aGUgVk0gcnVucyBhcyBvbmx5IGhhcyBhIHNpbmdsZSByb2xlYXNzaWdubWVudC4KICAgICMgVGhpcyByb2xlIGFzc2lnbm1lbnQgaXMgQUNSUHVsbCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgcHJlc2VudCBpbiB0aGUKICAgICMgc3Vic2NyaXB0aW9uIHdlJ3JlIGRlcGxveWluZyBpbnRvLiAgSWYgdGhlIGlkZW50aXR5IGRvZXMgbm90IGhhdmUgYW55CiAgICAjIHJvbGUgYXNzaWdubWVudHMgc2NvcGVkIG9uIHRoZSBzdWJzY3JpcHRpb24gd2UncmUgZGVwbG95aW5nIGludG8sIGl0IHdpbGwKICAgICMgbm90IHNob3cgb24gYXogbG9naW4gLWksIHdoaWNoIGlzIHdoeSB0aGUgYmVsb3cgbGluZSBpcyBjb21tZW50ZWQuCiAgICAjIGF6IGFjY291bnQgc2V0IC1zICIkU1VCU0NSSVBUSU9OSUQiCiAgICBjbWQ9KAogICAgICAgIGF6CiAgICAgICAgbG9naW4KICAgICAgICAtaQogICAgICAgIC0tYWxsb3ctbm8tc3Vic2NyaXB0aW9ucwogICAgKQoKICAgIGxvZyAiUnVubmluZyBheiBsb2dpbiB3aXRoIHJldHJpZXMiCiAgICByZXRyeSBjbWQgcmV0cnlfdGltZQoKICAgICMgU3VwcHJlc3MgZW11bGF0aW9uIG91dHB1dCBmb3IgcG9kbWFuIGluc3RlYWQgb2YgZG9ja2VyIGZvciBheiBhY3IgY29tcGF0YWJpbGl0eQogICAgbWtkaXIgLXAgL2V0Yy9jb250YWluZXJzLwogICAgbWtkaXIgLXAgL3Jvb3QvLmRvY2tlcgogICAgdG91Y2ggL2V0Yy9jb250YWluZXJzL25vZG9ja2VyCgogICAgIyBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUgY2FzZSB0aGF0IGF6IGFjciBsb2dpbiBzZWFyY2hlcyBmb3IgdGhpcyBpbiBpdCdzIGVudmlyb25tZW50CiAgICBleHBvcnQgUkVHSVNUUllfQVVUSF9GSUxFPSIvcm9vdC8uZG9ja2VyL2NvbmZpZy5qc29uIgogICAgCiAgICBpZiBbIC1uICIke3JlZ2lzdHJ5X2NvbmZ9IiBdOyB0aGVuCiAgICAgICAgd3JpdGVfZmlsZSBSRUdJU1RSWV9BVVRIX0ZJTEUgcmVnaXN0cnlfY29uZiB0cnVlCiAgICBmaQoKICAgIGxvZyAibG9nZ2luZyBpbnRvIHByb2QgYWNyIgogICAgY21kPSgKICAgICAgICBhegogICAgICAgIGFjcgogICAgICAgIGxvZ2luCiAgICAgICAgLS1uYW1lCiAgICAgICAgIyBUT0RPIHJlcGxhY2UgdGhpcyB3aXRoIHZhcmlhYmxlIGV4cGFuc2lvbgogICAgICAgICMgUmVmZXJlbmNlOiBodHRwczovL3d3dy5zaGVsbGNoZWNrLm5ldC93aWtpL1NDMjAwMQogICAgICAgICIkKHNlZCAtZSAnc3wuKi98fCcgPDw8IiRBQ1JSRVNPVVJDRUlEIikiCiAgICApCgogICAgcmV0cnkgY21kIHJldHJ5X3RpbWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBpIGluICR7cHVsbF9pbWFnZXNbQF19OyBkbwogICAgICAgIGxvY2FsIC1uIGltYWdlPSIkaSIKICAgICAgICBjbWQ9KAogICAgICAgICAgICBwb2RtYW4KICAgICAgICAgICAgcHVsbAogICAgICAgICAgICAiJGltYWdlIgogICAgICAgICkKCiAgICAgICAgbG9nICJQdWxsaW5nIGltYWdlICRpbWFnZSB3aXRoIHJldHJpZXMgbm93IgogICAgICAgIHJldHJ5IGNtZCByZXRyeV90aW1lCiAgICBkb25lCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBjbWQ9KAogICAgICAgIGF6CiAgICAgICAgbG9nb3V0CiAgICApCgogICAgbG9nICJSdW5uaW5nIGF6IGxvZ291dCB3aXRoIHJldHJpZXMiCiAgICByZXRyeSBjbWQgcmV0cnlfdGltZQp9CgojIGNvbmZpZ3VyZV9jZXJ0cwojIGFyZ3M6CiMgMSkgcm9sZSAtIHN0cmluZzsgY2FuIGJlICJkZXZwcm94eSIgb3IgInJwIgpjb25maWd1cmVfY2VydHMoKSB7CiAgICBsb2NhbCAtbiByb2xlPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGNlcnRpZmljYXRlcyBmb3IgJHJvbGUiCgogICAgdmVyaWZ5X3JvbGUgcm9sZSB0cnVlCgogICAgaWYgWyAiJHJvbGUiID09ICJkZXZwcm94eSIgXTsgdGhlbgogICAgICAgIGxvY2FsIC1yIHByb3h5X2NlcnRzX2Jhc2VkaXI9Ii9ldGMvcHJveHkiCiAgICAgICAgbWtkaXIgLXAgIiRwcm94eV9jZXJ0c19iYXNlZGlyIgogICAgICAgIGJhc2U2NCAtZCA8PDwiJFBST1hZQ0VSVCIgPiAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHkuY3J0IgogICAgICAgIGJhc2U2NCAtZCA8PDwiJFBST1hZS0VZIiA+ICIkcHJveHlfY2VydHNfYmFzZWRpci9wcm94eS5rZXkiCiAgICAgICAgYmFzZTY0IC1kIDw8PCIkUFJPWFlDTElFTlRDRVJUIiA+ICIkcHJveHlfY2VydHNfYmFzZWRpci9wcm94eS1jbGllbnQuY3J0IgogICAgICAgIGNob3duIC1SIDEwMDA6MTAwMCAvZXRjL3Byb3h5CiAgICAgICAgY2htb2QgMDYwMCAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHkua2V5IgogICAgICAgIHJldHVybiAwCiAgICBmaQoKICAgIGlmIFsgIiRyb2xlIiA9PSAicnAiIF07IHRoZW4KICAgICAgICBsb2NhbCAtciBycF9jZXJ0c19iYXNlZGlyPSIvZXRjL2Fyby1ycCIKICAgICAgICBta2RpciAtcCAiJHJwX2NlcnRzX2Jhc2VkaXIiCiAgICAgICAgYmFzZTY0IC1kIDw8PCIkQURNSU5BUElDQUJVTkRMRSIgPiAiJHJwX2NlcnRzX2Jhc2VkaXIvYWRtaW4tY2EtYnVuZGxlLnBlbSIKICAgICAgICBpZiBbWyAtbiAiJEFSTUFQSUNBQlVORExFIiBdXTsgdGhlbgogICAgICAgIGJhc2U2NCAtZCA8PDwiJEFSTUFQSUNBQlVORExFIiA+ICIkcnBfY2VydHNfYmFzZWRpci9hcm0tY2EtYnVuZGxlLnBlbSIKICAgICAgICBmaQogICAgICAgIGNob3duIC1SIDEwMDA6MTAwMCAiJHJwX2NlcnRzX2Jhc2VkaXIiCiAgICBmaQoKICAgICMgc2V0dGluZyBNT05JVE9SSU5HX0dDU19BVVRIX0lEX1RZUEU9QXV0aEtleVZhdWx0IHNlZW1zIHRvIGhhdmUgY2F1c2VkIG1kc2Qgbm90CiAgICAjIHRvIGhvbm91ciBTU0xfQ0VSVF9GSUxFIGFueSBtb3JlLCBoZWF2ZW4gb25seSBrbm93cyB3aHkuCiAgICBsb2NhbCAtciBzc2xfY2VydHNfYmFzZWRpcj0iL3Vzci9saWIvc3NsL2NlcnRzIgogICAgbWtkaXIgLXAgIiRzc2xfY2VydHNfYmFzZWRpciIKICAgIGNzcGxpdCAtZiAiJHNzbF9jZXJ0c19iYXNlZGlyL2NlcnQtIiAtYiAlMDNkLnBlbSAvZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydCAvXiQvMSAieyp9IiAxPi9kZXYvbnVsbAogICAgY19yZWhhc2ggIiRzc2xfY2VydHNfYmFzZWRpciIKCiAgICAjIHdlIGxlYXZlIGNsaWVudElkIGJsYW5rIGFzIGxvbmcgYXMgb25seSAxIG1hbmFnZWQgaWRlbnRpdHkgYXNzaWduZWQgdG8gdm1zcwogICAgIyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiAxLCB3ZSB3aWxsIG5lZWQgdG8gcG9wdWxhdGUgd2l0aCBjbGllbnRJZCB1c2VkIGZvciBvZmYtbm9kZSBzY2FubmluZwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBub2Rlc2Nhbl9hZ2VudF9maWxlbmFtZT0iL2V0Yy9kZWZhdWx0L3ZzYS1ub2Rlc2Nhbi1hZ2VudC5jb25maWciCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIG5vZGVzY2FuX2FnZW50X2ZpbGU9InsKICAgIFwiTmljZVwiOiAxOSwKICAgIFwiVGltZW91dFwiOiAxMDgwMCwKICAgIFwiQ2xpZW50SWRcIjogXCJcIiwKICAgIFwiVGVuYW50SWRcIjogJEFaVVJFU0VDUEFDS1ZTQVRFTkFOVElELAogICAgXCJRdWFseXNTdG9yZUJhc2VVcmxcIjogJEFaVVJFU0VDUEFDS1FVQUxZU1VSTCwKICAgIFwiUHJvY2Vzc1RpbWVvdXRcIjogMzAwLAogICAgXCJDb21tYW5kRGVsYXlcIjogMAogIH0iCgogICAgd3JpdGVfZmlsZSBub2Rlc2Nhbl9hZ2VudF9maWxlbmFtZSBub2Rlc2Nhbl9hZ2VudF9maWxlIHRydWUKfQoKIyBydW5fYXpzZWNkX2NvbmZpZ19zY2FuCnJ1bl9henNlY2RfY29uZmlnX3NjYW4oKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1hciBjb25maWdzPSgKICAgICAgICAiYmFzZWxpbmUiCiAgICAgICAgImNsYW1hdiIKICAgICAgICAic29mdHdhcmUiCiAgICApCgogICAgbG9nICJTY2FubmluZyBjb25maWd1cmF0aW9uIGZpbGVzIHdpdGggYXpzZWNkICR7Y29uZmlnc1sqXX0iCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBzY2FuIGluICR7Y29uZmlnc1tAXX07IGRvCiAgICAgICAgbG9nICJTY2FubmluZyBjb25maWcgZmlsZSAkc2NhbiBub3ciCiAgICAgICAgL3Vzci9sb2NhbC9iaW4vYXpzZWNkIGNvbmZpZyAtcyAiJHNjYW4iIC1kIFAxRAogICAgZG9uZQp9CgojIGNyZWF0ZV9yZXF1aXJlZF9kaXJzCmNyZWF0ZV9yZXF1aXJlZF9kaXJzKCkgewogICAgY3JlYXRlX2RpcnM9KAogICAgICAgIC92YXIvbG9nL2pvdXJuYWwKICAgICAgICAvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZQogICAgICAgICMgRG9lcyBub3QgZXhpc3Qgb24gZGV2UHJveHlWTVNTCiAgICAgICAgL3Zhci9vcHQvbWljcm9zb2Z0L2xpbnV4bW9uYWdlbnQKICAgICkKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBkIGluICR7Y3JlYXRlX2RpcnNbQF19OyBkbwogICAgICAgIGxvZyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICRkIgogICAgICAgIG1rZGlyIC1wICIkZCIgfHwgYWJvcnQgImZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICRkIgogICAgZG9uZQp9CgojIGNyZWF0ZV9wb2RtYW5fbmV0d29ya3MoKQojIGFyZ3M6CiMgMSkgbmV0cyAtIG5hbWVyZWYsIGFzc29jaWF0aXZlIGFycmF5OyBOZXR3b3JrcyB0byBiZSBjcmVhdGVkCiMgICAgICAgS2V5IGlzIHRoZSBuZXR3b3JrIG5hbWUsIHZhbHVlIGlzIHRoZSBzdWJuZXQgd2l0aCBjaWRyIG5vdGF0aW9uCmNyZWF0ZV9wb2RtYW5fbmV0d29ya3MoKSB7CiAgICBsb2NhbCAtbiBuZXRzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3IgbiBpbiAkeyFuZXRzW0BdfTsgZG8KICAgICAgICBsb2cgIkNyZWF0aW5nIHBvZG1hbiBuZXR3b3JrIFwiJG5cIiB3aXRoIHN1Ym5ldCBcIiR7bmV0c1skbl19XCIiCiAgICAgICAgcG9kbWFuIG5ldHdvcmsgXAogICAgICAgICAgICBjcmVhdGUgXAogICAgICAgICAgICAtLXN1Ym5ldCAiJHtuZXRzWyIkbiJdfSIgXAogICAgICAgICAgICAiJG4iCiAgICBkb25lCn0KCiMgZmlyZXdhbGxkX2NvbmZpZ3VyZV9iYWNrZW5kCmZpcmV3YWxsZF9jb25maWd1cmVfYmFja2VuZCgpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9nICJDaGFuZ2luZyBmaXJld2FsbGQgYmFja2VuZCB0byBpcHRhYmxlcyIKICAgIGNvbmZfZmlsZT0iL2V0Yy9maXJld2FsbGQvZmlyZXdhbGxkLmNvbmYiCiAgICBzZWQgLWkgJ3MvRmlyZXdhbGxCYWNrZW5kPW5mdGFibGVzL0ZpcmV3YWxsQmFja2VuZD1pcHRhYmxlcy9nJyAiJGNvbmZfZmlsZSIKfQoKIyBmaXJld2FsbGRfY29uZmlndXJlCiMgYXJnczoKIyAxKSBwb3J0cyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheTsgcG9ydHMgdG8gYmUgZW5hYmxlZC4KIyAgICAgICBQb3J0cyBtdXN0IGJlIHBvc3RmaXhlZCB3aXRoIC90Y3Agb3IgL3VkcApmaXJld2FsbGRfY29uZmlndXJlKCkgewogICAgbG9jYWwgLW4gcG9ydHM9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICBmaXJld2FsbGRfY29uZmlndXJlX2JhY2tlbmQKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yYSBzZXJ2aWNlPSgKICAgICAgICAiZmlyZXdhbGxkIgogICAgKQogICAgZW5hYmxlX3NlcnZpY2VzIHNlcnZpY2UKCiAgICBsb2cgIkVuYWJsaW5nIHBvcnRzICR7cG9ydHNbKl19IG9uIGRlZmF1bHQgZmlyZXdhbGxkIHpvbmUiCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBwb3J0IGluICR7cG9ydHNbQF19OyBkbwogICAgICAgIGxvZyAiRW5hYmxpbmcgcG9ydCAkcG9ydCBub3ciCiAgICAgICAgZmlyZXdhbGwtY21kICItLWFkZC1wb3J0PSRwb3J0IiBcCiAgICAgICAgICAgICAgICAgICAgIC0tcGVybWFuZW50CiAgICBkb25lCgogICAgbG9nICJXcml0aW5nIHJ1bnRpbWUgY29uZmlnIHRvIHBlcm1hbmVudCBjb25maWciCiAgICBmaXJld2FsbC1jbWQgLS1ydW50aW1lLXRvLXBlcm1hbmVudAp9CgojU3RhcnQgb2YgZ2F0ZXdheVZNU1Muc2gKIyEvYmluL2Jhc2gKCnNldCAtbyBlcnJleGl0IFwKICAgIC1vIHBpcGVmYWlsIFwKICAgIC1vIG5vdW5zZXQKCm1haW4oKSB7CiAgICAjIHRyYW5zYWN0aW9uIGF0dGVtcHQgcmV0cnkgdGltZSBpbiBzZWNvbmRzCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yaSByZXRyeV93YWl0X3RpbWU9MzAKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA2OAogICAgbG9jYWwgLXJpIHBrZ19yZXRyeV9jb3VudD02MAoKICAgIGNyZWF0ZV9yZXF1aXJlZF9kaXJzCiAgICBjb25maWd1cmVfc3NoZAogICAgY29uZmlndXJlX3JwbV9yZXBvcyByZXRyeV93YWl0X3RpbWUgXAogICAgICAgICAgICAgICAgICAgICIkcGtnX3JldHJ5X2NvdW50IgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLWFyIGV4Y2x1ZGVfcGtncz0oCiAgICAgICAgIi14IFdBTGludXhBZ2VudCIKICAgICAgICAiLXggV0FMaW51eEFnZW50LXVkZXYiCiAgICApCgogICAgZG5mX3VwZGF0ZV9wa2dzIGV4Y2x1ZGVfcGtncyBcCiAgICAgICAgICAgICAgICAgICAgcmV0cnlfd2FpdF90aW1lIFwKICAgICAgICAgICAgICAgICAgICAiJHBrZ19yZXRyeV9jb3VudCIKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yYSBpbnN0YWxsX3BrZ3M9KAogICAgICAgIGF6dXJlLWNsaQogICAgICAgIGNsYW1hdgogICAgICAgIGF6c2VjLWNsYW1hdgogICAgICAgIGF6dXJlLWNsaQogICAgICAgIGF6dXJlLW1kc2QKICAgICAgICBhenVyZS1zZWN1cml0eQogICAgICAgIHBvZG1hbgogICAgICAgIHBvZG1hbi1kb2NrZXIKICAgICAgICBvcGVuc3NsLXBlcmwKICAgICAgICAjIGhhY2sgLSB3ZSBhcmUgaW5zdGFsbGluZyBweXRob24zIG9uIGhvc3RzIGR1ZSB0byBhbiBpc3N1ZSB3aXRoIEF6dXJlIExpbnV4IEV4dGVuc2lvbnMgaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2F6dXJlLWxpbnV4LWV4dGVuc2lvbnMvcHVsbC8xNTA1CiAgICAgICAgcHl0aG9uMwogICAgICAgICMgcmVxdWlyZWQgZm9yIHBvZG1hbiBuZXR3b3JraW5nCiAgICAgICAgZmlyZXdhbGxkCiAgICApCgogICAgZG5mX2luc3RhbGxfcGtncyBpbnN0YWxsX3BrZ3MgXAogICAgICAgICAgICAgICAgICAgICByZXRyeV93YWl0X3RpbWUgXAogICAgICAgICAgICAgICAgICAgICAiJHBrZ19yZXRyeV9jb3VudCIKCiAgICAjIFRPRE8gcmVtb3ZlIHRoaXMgb25jZSBNaWNyb3NvZnRDQkxNYXJpbmVyOmNibC1tYXJpbmVyOmNibC1tYXJpbmVyLTItZ2VuMi1maXBzIHN1cHBvcnRzIGF1dG9tYXRpYyB1cGRhdGVzCiAgICAjIFJlZmVyZW5jZTogaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtbWFjaGluZS1zY2FsZS1zZXRzL3ZpcnR1YWwtbWFjaGluZS1zY2FsZS1zZXRzLWF1dG9tYXRpYy11cGdyYWRlI3N1cHBvcnRlZC1vcy1pbWFnZXMKICAgIGNvbmZpZ3VyZV9kbmZfY3Jvbl9qb2IKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIxMTkKICAgIGNvbmZpZ3VyZV9sb2dyb3RhdGUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQgZGlzYWJsZT1TQzIxNTMKICAgIGxvY2FsIC1yIG1kbWltYWdlPSIke1JQSU1BR0UlJS8qfS8ke01ETUlNQUdFIyovfSIKICAgIGxvY2FsIC1yIHJwaW1hZ2U9IiRSUElNQUdFIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBmbHVlbnRiaXRfaW1hZ2U9IiRGTFVFTlRCSVRJTUFHRSIKICAgICMgdmFsdWVzIGFyZSByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcywgdGhleSBzaG91bGQgbm90IGJlIGRlcmVmZXJlbmNlZCBoZXJlCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yQSBhcm9faW1hZ2VzPSgKICAgICAgICBbIm1kbSJdPSJtZG1pbWFnZSIKICAgICAgICBbInJwIl09InJwaW1hZ2UiCiAgICAgICAgWyJmbHVlbnRiaXQiXT0iZmx1ZW50Yml0X2ltYWdlIgogICAgKQoKICAgIHB1bGxfY29udGFpbmVyX2ltYWdlcyBhcm9faW1hZ2VzCgogICAgbG9jYWwgLXIgYXJvX25ldHdvcms9ImFybyIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXJBIG5ldHdvcmtzPSgKICAgICAgICBbIiRhcm9fbmV0d29yayJdPSIxOTIuMTY4LjI1NC4wLzI0IgogICAgKQogICAgY3JlYXRlX3BvZG1hbl9uZXR3b3JrcyBuZXR3b3JrcwoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXJhIGVuYWJsZV9wb3J0cz0oCiAgICAgICAgIyBSUCBnYXRld2F5CiAgICAgICAgIjgwL3RjcCIKICAgICAgICAiODA4MS90Y3AiCiAgICAgICAgIjQ0My90Y3AiCiAgICAgICAgIyBKSVQgc3NoCiAgICAgICAgIjIyL3RjcCIKICAgICkKCiAgICBmaXJld2FsbGRfY29uZmlndXJlIGVuYWJsZV9wb3J0cwoKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGZsdWVudGJpdF9jb25mX2ZpbGU9IltJTlBVVF0KTmFtZSBzeXN0ZW1kClRhZyBqb3VybmFsZApTeXN0ZW1kX0ZpbHRlciBfQ09NTT1hcm8KREIgL3Zhci9saWIvZmx1ZW50L2pvdXJuYWxkYgoKW0ZJTFRFUl0KCU5hbWUgbW9kaWZ5CglNYXRjaCBqb3VybmFsZAoJUmVtb3ZlX3dpbGRjYXJkIF8KCVJlbW92ZSBUSU1FU1RBTVAKCltPVVRQVVRdCglOYW1lIGZvcndhcmQKCU1hdGNoICoKCVBvcnQgMjkyMzAiCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBhcm9fZ2F0ZXdheV9jb25mX2ZpbGU9IkFDUl9SRVNPVVJDRV9JRD0nJEFDUlJFU09VUkNFSUQnCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCk1ETV9BQ0NPVU5UPSckUlBNRE1BQ0NPVU5UJwpNRE1fTkFNRVNQQUNFPScke3JvbGVfZ2F0ZXdheV59JwpHQVRFV0FZX0RPTUFJTlM9JyRHQVRFV0FZRE9NQUlOUycKR0FURVdBWV9GRUFUVVJFUz0nJEdBVEVXQVlGRUFUVVJFUycKUlBJTUFHRT0nJHJwaW1hZ2UnIgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgbWRzZF9jb25maWdfdmVyc2lvbj0iJEdBVEVXQVlNRFNEQ09ORklHVkVSU0lPTiIKCiAgICAjIHZhbHVlcyBhcmUgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMsIHRoZXkgc2hvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQgaGVyZQogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtckEgYXJvX2NvbmZpZ3M9KAogICAgICAgIFsiZ2F0ZXdheV9jb25maWciXT0iYXJvX2dhdGV3YXlfY29uZl9maWxlIgogICAgICAgIFsiZmx1ZW50Yml0Il09ImZsdWVudGJpdF9jb25mX2ZpbGUiCiAgICAgICAgWyJtZHNkIl09Im1kc2RfY29uZmlnX3ZlcnNpb24iCiAgICAgICAgWyJuZXR3b3JrIl09ImFyb19uZXR3b3JrIgogICAgKQoKICAgIGNvbmZpZ3VyZV92bXNzX2Fyb19zZXJ2aWNlcyByb2xlX2dhdGV3YXkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyb19pbWFnZXMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyb19jb25maWdzCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtcmEgZ2F0ZXdheV9zZXJ2aWNlcz0oCiAgICAgICAgImFyby1nYXRld2F5IgogICAgICAgICJhenNlY2QiCiAgICAgICAgIm1kc2QiCiAgICAgICAgIm1kbSIKICAgICAgICAiY2hyb255ZCIKICAgICAgICAiZmx1ZW50Yml0IgogICAgICAgICJkb3dubG9hZC1tZHNkLWNyZWRlbnRpYWxzLnRpbWVyIgogICAgICAgICJkb3dubG9hZC1tZG0tY3JlZGVudGlhbHMudGltZXIiCiAgICAgICAgImZpcmV3YWxsZCIKICAgICkKCiAgICBlbmFibGVfc2VydmljZXMgZ2F0ZXdheV9zZXJ2aWNlcwoKICAgIHJlYm9vdF92bQp9CgpleHBvcnQgQVpVUkVfQ0xPVURfTkFNRT0iJHtBWlVSRUNMT1VETkFNRTo/IkZhaWxlZCB0byBjYXJyeSBvdmVyIHZhcmlhYmxlcyJ9IgoKIyB1dGlsLnNoIGRvZXMgbm90IGV4aXN0IHdoZW4gZGVwbG95ZWQgdG8gVk1TUyB2aWEgVk1TUyBleHRlbnNpb25zCiMgVGhpcyBpcyBiZWNhdXNlIGNvbW1vblZNU1Muc2ggaXMgY29uY2F0ZW5hdGVkIHdpdGggdGhpcyBzY3JpcHQKdXRpbD0idXRpbC5zaCIKaWYgWyAtZiAiJHV0aWwiIF07IHRoZW4KICAgICMgc2hlbGxjaGVjayBzb3VyY2U9dXRpbC5zaAogICAgc291cmNlICIkdXRpbCIKZmkKCm1haW4gIiRAIgo=')))]" + } + } + }, + { + "name": "AzureMonitorLinuxAgent", + "properties": { + "publisher": "Microsoft.Azure.Monitor", + "type": "AzureMonitorLinuxAgent", + "typeHandlerVersion": "1.0", + "autoUpgradeMinorVersion": true, + "enableAutomaticUpgrade": true, + "settings": { + "GCS_AUTO_CONFIG": true } } } diff --git a/pkg/deploy/assets/rp-production.json b/pkg/deploy/assets/rp-production.json index 3e2b4bef27a..492bacdccc8 100644 --- a/pkg/deploy/assets/rp-production.json +++ b/pkg/deploy/assets/rp-production.json @@ -380,7 +380,7 @@ "imageReference": { "publisher": "MicrosoftCBLMariner", "offer": "cbl-mariner", - "sku": "cbl-mariner-2-fips", + "sku": "cbl-mariner-2-gen2-fips", "version": "latest" }, "osDisk": { @@ -439,7 +439,20 @@ "autoUpgradeMinorVersion": true, "settings": {}, "protectedSettings": { - "script": "[base64(concat(base64ToString('c2V0IC1leAoK'),'ACRRESOURCEID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('acrResourceId')),''')\n','ADMINAPICLIENTCERTCOMMONNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('adminApiClientCertCommonName')),''')\n','ARMAPICLIENTCERTCOMMONNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('armApiClientCertCommonName')),''')\n','ARMCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('armClientId')),''')\n','AZURECLOUDNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureCloudName')),''')\n','AZURESECPACKQUALYSURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackQualysUrl')),''')\n','AZURESECPACKVSATENANTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackVSATenantId')),''')\n','CLUSTERMDMACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdmAccount')),''')\n','CLUSTERMDSDACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdsdAccount')),''')\n','CLUSTERMDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdsdConfigVersion')),''')\n','CLUSTERMDSDNAMESPACE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdsdNamespace')),''')\n','CLUSTERPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterParentDomainName')),''')\n','DATABASEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('databaseAccountName')),''')\n','FLUENTBITIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fluentbitImage')),''')\n','FPCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fpClientId')),''')\n','FPSERVICEPRINCIPALID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fpServicePrincipalId')),''')\n','GATEWAYDOMAINS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayDomains')),''')\n','GATEWAYRESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayResourceGroupName')),''')\n','GATEWAYSERVICEPRINCIPALID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayServicePrincipalId')),''')\n','KEYVAULTDNSSUFFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultDNSSuffix')),''')\n','KEYVAULTPREFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultPrefix')),''')\n','MDMFRONTENDURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdmFrontendUrl')),''')\n','MDSDENVIRONMENT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdEnvironment')),''')\n','PORTALACCESSGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalAccessGroupIds')),''')\n','PORTALCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalClientId')),''')\n','PORTALELEVATEDGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalElevatedGroupIds')),''')\n','RPFEATURES=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpFeatures')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMDMACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdmAccount')),''')\n','RPMDSDACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdAccount')),''')\n','RPMDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdConfigVersion')),''')\n','RPMDSDNAMESPACE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdNamespace')),''')\n','RPPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpParentDomainName')),''')\n','OIDCSTORAGEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('oidcStorageAccountName')),''')\n','CLUSTERSINSTALLVIAHIVE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clustersInstallViaHive')),''')\n','CLUSTERSADOPTBYHIVE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clustersAdoptByHive')),''')\n','CLUSTERDEFAULTINSTALLERPULLSPEC=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterDefaultInstallerPullspec')),''')\n','USECHECKACCESS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('useCheckAccess')),''')\n','ADMINAPICABUNDLE=''',parameters('adminApiCaBundle'),'''\n','ARMAPICABUNDLE=''',parameters('armApiCaBundle'),'''\n','MDMIMAGE=''/distroless/genevamdm:2.2024.517.533-b73893-20240522t0954@sha256:939df9d7b6660874697f8ebed1fe56504f86d92f99801a9dc6fd98e9176d3f75''\n','LOCATION=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().location),''')\n','SUBSCRIPTIONID=$(base64 -d \u003c\u003c\u003c''',base64(subscription().subscriptionId),''')\n','RESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().name),''')\n','\n',base64ToString('IyEvYmluL2Jhc2gKIyBJbnRlcm5hbCBGdW5jdGlvbnMgYW5kIENvbnN0YW50cwoKIyBlbXB0eV9zdHIgLSBjb25zdGFudDsgdXNlZCBieSBmdW5jdGlvbnMgZm9yIG9wdGlvbmFsIG5hbWVyZWYgc3RyaW5nIGFyZ3VlbWVudHMKZGVjbGFyZSAtciBlbXB0eV9zdHI9IiIKCiMgcm9sZV9nYXRld2F5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIFZNU1MgaXMgYmVpbmcgYm9vdHN0cmFwcGVkCiMgdGhpcyBzaG91bGQgYmUgcmVmZXJlbmNlZCBieSBzY3JpcHRzIHNvdXJjaW5nIHRoaXMgZmlsZQpkZWNsYXJlIC1yIHJvbGVfZ2F0ZXdheT0iZ2F0ZXdheSIKIyByb2xlX3JwIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIFZNU1MgaXMgYmVpbmcgYm9vdHN0cmFwcGVkCiMgdGhpcyBzaG91bGQgYmUgcmVmZXJlbmNlZCBieSBzY3JpcHRzIHNvdXJjaW5nIHRoaXMgZmlsZQpkZWNsYXJlIC1yIHJvbGVfcnA9InJwIgoKIyBsb2cgaXMgYSB3cmFwcGVyIGZvciBlY2hvIHRoYXQgaW5jbHVkZXMgdGhlIGZ1bmN0aW9uIG5hbWUKIyBBcmdzCiMgMSkgbXNnIC0gc3RyaW5nCiMgMikgc3RhY2tfbGV2ZWwgLSBpbnQ7IG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjYWxsaW5nIGZ1bmN0aW9uCmxvZygpIHsKICAgIGxvY2FsIC1yIG1zZz0iJHsxOi0ibG9nIG1lc3NhZ2UgaXMgZW1wdHkifSIKICAgIGxvY2FsIC1yIHN0YWNrX2xldmVsPSIkezI6LTF9IgogICAgZWNobyAiJHtGVU5DTkFNRVske3N0YWNrX2xldmVsfV19OiAke21zZ30iCn0KCiMgYWJvcnQgaXMgYSB3cmFwcGVyIGZvciBsb2cgdGhhdCBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUKYWJvcnQoKSB7CiAgICBsb2NhbCAtcmkgb3JpZ2luX3N0YWNrbGV2ZWw9MgogICAgbG9nICIkezF9IiAiJG9yaWdpbl9zdGFja2xldmVsIgogICAgbG9nICJFeGl0aW5nIgogICAgZXhpdCAxCn0KCiMgd3JpdGVfZmlsZQojIEFyZ3MKIyAxKSBmaWxlbmFtZSAtIHN0cmluZwojIDIpIGZpbGVfY29udGVudHMgLSBzdHJpbmcKIyAzKSBjbG9iYmVyIC0gYm9vbGVhbjsgb3B0aW9uYWwgLSBkZWZhdWx0cyB0byBmYWxzZQp3cml0ZV9maWxlKCkgewogICAgbG9jYWwgLW4gZmlsZW5hbWU9IiQxIgogICAgbG9jYWwgLW4gZmlsZV9jb250ZW50cz0iJDIiCiAgICBsb2NhbCAtciBjbG9iYmVyPSIkezM6LWZhbHNlfSIKCiAgICBpZiAkY2xvYmJlcjsgdGhlbgogICAgICAgIGxvZyAiT3ZlcndyaXRpbmcgZmlsZSAkZmlsZW5hbWUiCiAgICAgICAgZWNobyAiJGZpbGVfY29udGVudHMiID4gIiRmaWxlbmFtZSIKICAgIGVsc2UKICAgICAgICBsb2cgIkFwcGVuZGluZyB0byAkZmlsZW5hbWUiCiAgICAgICAgZWNobyAiJGZpbGVfY29udGVudHMiID4+ICIkZmlsZW5hbWUiCiAgICBmaQp9CgojIHJldHJ5IEFkZGluZyByZXRyeSBsb2dpYyB0byB5dW0gY29tbWFuZHMgaW4gb3JkZXIgdG8gYXZvaWQgc3RhbGxpbmcgb3V0IG9uIHJlc291cmNlIGxvY2tzCiMgYXJnczoKIyAxKSBjbWRfcmV0cnkgLSBuYW1lcmVmLCBhcnJheTsgQ29tbWFuZCBhbmQgYXJndWVtZW50KHMpIHRvIHJldHJ5CiMgMikgd2FpdF90aW1lIC0gbmFtZXJlZiwgaW50ZWdlcjsgVGltZSB0byB3YWl0IGJlZm9yZSByZXRyeWluZyBjb21tYW5kCiMgMykgcmV0cmllcyAtIGludGVnZXIsIG9wdGlvbmFsOyBBbW1vdW50IG9mIHRpbWVzIHRvIHJldHJ5IGNvbW1hbmQsIGRlZmF1bHRzIHRvIDUKcmV0cnkoKSB7CiAgICBsb2NhbCAtbiBjbWRfcmV0cnk9IiQxIgogICAgbG9jYWwgLW4gd2FpdF90aW1lPSIkMiIKICAgIGxvY2FsIC1yaSByZXRyaWVzPSIkezM6LTV9IgoKICAgIGZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KICAgICAgICBsb2cgImF0dGVtcHQgIyR7YXR0ZW1wdH0gLSAke0ZVTkNOQU1FWzJdfSIKICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgICAgICAke2NtZF9yZXRyeVtAXX0gJgoKICAgICAgICB3YWl0ICQhICYmIGJyZWFrCiAgICAgICAgaWYgWyAiJHthdHRlbXB0fSIgLWxlICIkcmV0cmllcyIgXTsgdGhlbgogICAgICAgICAgICBzbGVlcCAiJHdhaXRfdGltZSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGFib3J0ICJhdHRlbXB0ICMke2F0dGVtcHR9IC0gRmFpbGVkIHRvIHVwZGF0ZSBwYWNrYWdlcyIKICAgICAgICBmaQogICAgZG9uZQp9CgojIHZlcmlmeV9yb2xlCiMgYXJnczoKIyAxKSB0ZXN0X3JvbGUgLSBuYW1lcmVmOyByb2xlIGJlaW5nIHZlcmlmaWVkCiMgMikgY2VydHMgLSBib29sZWFuLCBvcHRpb25hbDsgZGVmYXVsdHMgdG8gZmFsc2UuIFNldCB0byB0cnVlIHRvIGFkZCBkZXZwcm94eSB0byBhbGxvd2VkIHJvbGVzCnZlcmlmeV9yb2xlKCkgewogICAgbG9jYWwgLW4gdGVzdF9yb2xlPSIkMSIKICAgIGxvY2FsIC1yIGNlcnRzPSIkezI6LWZhbHNlfSIKCiAgICBhbGxvd2VkX3JvbGVzX2dsb2I9Iigkcm9sZV9ycHwkcm9sZV9nYXRld2F5KSIKICAgIGlmICRjZXJ0czsgdGhlbgogICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nICIpIiBhbmQgYXBwZW5kIGFkZGl0aW9uYWwgcm9sZQogICAgICAgIGFsbG93ZWRfcm9sZXNfZ2xvYj0iJHthbGxvd2VkX3JvbGVzX2dsb2IlXCkqfXxkZXZwcm94eSkiCiAgICBmaQoKICAgIGlmIFtbICIkdGVzdF9yb2xlIiA9fiAkYWxsb3dlZF9yb2xlc19nbG9iIF1dOyB0aGVuCiAgICAgICAgbG9nICJWZXJpZmllZCByb2xlIFwiJHRlc3Rfcm9sZVwiIgogICAgZWxzZQogICAgICAgIGFib3J0ICJmYWlsZWQgdG8gdmVyaWZ5IHJvbGUsIHJvbGUgXCIke3Rlc3Rfcm9sZX1cIiBub3QgaW4gXCIke2FsbG93ZWRfcm9sZXNfZ2xvYn1cIiIKICAgIGZpCn0KCiMgZ2V0X2tleXZhdWx0X3N1ZmZpeAojIGFyZ3M6CiMgMSkgcmwgLSBuYW1lcmVmLCBzdHJpbmc7IHJvbGUgdG8gZ2V0IHNob3J0IHJvbGUgZm9yCiMgMikga3Zfc3VmZml4IC0gbmFtZXJlZiwgc3RyaW5nOyBzaG9ydCByb2xlIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhpcyBuYW1lcmVmCiMgMykgc2VjX3ByZWZpeCAtIG5hbWVyZWYsIHN0cmluZzsga2V5dmF1bHQgY2VydGlmaWNhdGUgcHJlZml4IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhpcyBuYW1lcmVmCmdldF9rZXl2YXVsdF9zdWZmaXgoKSB7CiAgICBsb2NhbCAtbiBybD0iJDEiCiAgICBsb2NhbCAtbiBrdl9zdWZmaXg9IiQyIgogICAgbG9jYWwgLW4gc2VjX3ByZWZpeD0iJDMiCgogICAgbG9jYWwgLXIga2V5dmF1bHRfc3VmZml4X3JwPSJzdmMiCiAgICBsb2NhbCAtciBrZXl2YXVsdF9wcmVmaXhfZ2F0ZXdheT0iZ3d5IgoKICAgIGNhc2UgIiRybCIgaW4KICAgICAgICAiJHJvbGVfZ2F0ZXdheSIpCiAgICAgICAgICAgIGt2X3N1ZmZpeD0iJGtleXZhdWx0X3ByZWZpeF9nYXRld2F5IgogICAgICAgICAgICBzZWNfcHJlZml4PSIka2V5dmF1bHRfcHJlZml4X2dhdGV3YXkiCiAgICAgICAgICAgIDs7CiAgICAgICAgIiRyb2xlX3JwIikKICAgICAgICAgICAga3Zfc3VmZml4PSIka2V5dmF1bHRfc3VmZml4X3JwIgogICAgICAgICAgICBzZWNfcHJlZml4PSIkcm9sZV9ycCIKICAgICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgICBhYm9ydCAidW5rb3duIHJvbGUgJHJsIgogICAgICAgICAgICA7OwogICAgZXNhYwp9CgojIGNvbmZpZ3VyZV9zZWxpbnV4CiMgYXJnczoKIyAxKSByZWxhYmVsIC0gYm9vbGVhbiwgb3B0aW9uYWw7IGRlZmF1bHRzIHRvIGZhbHNlCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhYmVsIGZpbGVzeXN0ZW0gY29udGV4dApjb25maWd1cmVfc2VsaW51eCgpIHsKICAgIGxvY2FsIC1yIHJlbGFiZWw9IiR7MTotZmFsc2V9IgogICAgbG9nICJzdGFydGluZyIKCiAgICBhbHJlYWR5X2RlZmluZWRfaWdub3JlX2Vycm9yPSJGaWxlIGNvbnRleHQgZm9yIC92YXIvbG9nL2pvdXJuYWwoLy4qKT8gYWxyZWFkeSBkZWZpbmVkIgogICAgc2VtYW5hZ2UgZmNvbnRleHQgLWEgLXQgdmFyX2xvZ190ICIvdmFyL2xvZy9qb3VybmFsKC8uKik/IiB8fCBsb2cgIiRhbHJlYWR5X2RlZmluZWRfaWdub3JlX2Vycm9yIgogICAgY2hjb24gLVIgc3lzdGVtX3U6b2JqZWN0X3I6dmFyX2xvZ190OnMwIC92YXIvb3B0L21pY3Jvc29mdC9saW51eG1vbmFnZW50CgogICAgaWYgJHJlbGFiZWw7IHRoZW4KICAgICAgICByZXN0b3JlY29uIC1SRiAvdmFyL2xvZy8qIHx8IGxvZyAiJGFscmVhZHlfZGVmaW5lZF9pZ25vcmVfZXJyb3IiCiAgICBmaQp9CgojIHJlYm9vdF92bSByZXN0b3JlcyBhbGwgc2VsaW51eCBmaWxlIGNvbnRleHRzLCB0aGVuIHNjaGVkdWxlcyBhIHJlYm9vdCBmb3Igb25lIGhvdXIgbGF0ZXIKIyBSZWJvb3RzIHNob3VsZCBzY2hlZHVsZWQgYWZ0ZXIgYWxsIFZNIGV4dGVuc2lvbnMgaGF2ZSBoYWQgdGltZSB0byBjb21wbGV0ZQojIFJlZmVyZW5jZTogaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtbWFjaGluZXMvZXh0ZW5zaW9ucy9jdXN0b20tc2NyaXB0LWxpbnV4I3RpcHMKcmVib290X3ZtKCkgewogICAgbG9nICJzdGFydGluZyIKCiAgICBjb25maWd1cmVfc2VsaW51eCAidHJ1ZSIKICAgIChzaHV0ZG93biAtciBub3cgJikKfQojIS9iaW4vYmFzaAojIFJlcG9zaXRvcnkgYW5kIHBhY2thZ2UgbWFuYWdlbWVudCByZWxhdGVkIGZ1bmN0aW9ucwoKIyBjb25maWd1cmVfcnBtX3JlcG9zCiMgTmV3IHJlcG9zaXRvcmllcyBzaG91bGQgYmUgYWRkZWQgaW4gdGhlaXIgb3duIGZ1bmN0aW9ucywgYW5kIGNhbGxlZCBoZXJlCiMgYXJnczoKIyAxKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAyKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmNvbmZpZ3VyZV9ycG1fcmVwb3MoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGNvbmZpZ3VyZV9yaHVpX3JlcG8gIiQxIiAiJHsyOi19IgogICAgY3JlYXRlX2F6dXJlX3JwbV9yZXBvcwp9CgojIGRuZl9pbnN0YWxsX3BrZ3MKIyBhcmdzOgojIDEpIHBrZ3MgLSBuYW1lcmVmLCBzdHJpbmcgYXJyYXk7IFBhY2thZ2VzIHRvIGJlIGluc3RhbGxlZAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDMpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1vdW50IG9mIHRpbWVzIHRvIHJldHJ5IGNvbW1hbmQsIGRlZmF1bHRzIHRvIDUKZG5mX2luc3RhbGxfcGtncygpIHsKICAgIGxvY2FsIC1uIHBrZ3M9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICBsb2NhbCAtYSBjbWQ9KAogICAgICAgIGRuZgogICAgICAgIC15CiAgICAgICAgaW5zdGFsbAogICAgKQogICAgCiAgICAjIFJlZmVyZW5jZTogaHR0cHM6Ly93d3cuc2hlbGxjaGVjay5uZXQvd2lraS9TQzIyMDYKICAgICMgYXBwZW5kIHBrZ3MgYXJyYXkgdG8gY21kCiAgICBtYXBmaWxlIC1PICQoKCAkeyNjbWRbQF19ICsgMSApKSAtZCAnICcgY21kIDw8PCAiJHtwa2dzW0BdfSIKICAgIGxvY2FsIC1yIGNtZAoKICAgIGxvZyAiQXR0ZW1wdGluZyB0byBpbnN0YWxsIHBhY2thZ2VzOiAke3BrZ3NbKl19IgogICAgcmV0cnkgY21kICIkMiIgIiR7MzotfSIKfQoKCiMgZG5mX3VwZGF0ZV9wa2dzCiMgYXJnczoKIyAxKSBleGNsdWRlcyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheSwgb3B0aW9uYWw7IFBhY2thZ2VzIHRvIGV4Y2x1ZGUgZnJvbSB1cGRhdGluZwojICAgICAgIEVhY2ggaW5kZXggbXVzdCBiZSBwcmVmaXhlZCB3aXRoIC14IAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDMpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1tb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmRuZl91cGRhdGVfcGtncygpIHsKICAgIGxvY2FsIC1uIGV4Y2x1ZGVzPSIkezE6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1hIGNtZD0oCiAgICAgICAgZG5mCiAgICAgICAgLXkKICAgICAgICAjIFJlcGxhY2VkIHdpdGggZXhjbHVkZXMKICAgICAgICAiIgogICAgICAgIHVwZGF0ZQogICAgICAgIC0tYWxsb3dlcmFzaW5nCiAgICApCgogICAgaWYgWyAtbiAiJHtleGNsdWRlc30iIF07IHRoZW4KICAgICAgICAjIFJlZmVyZW5jZSBodHRwczovL3d3dy5zaGVsbGNoZWNrLm5ldC93aWtpL1NDMjIwNgogICAgICAgIG1hcGZpbGUgLU8gMiBjbWQgPDw8ICIke2V4Y2x1ZGVzW0BdfSIKICAgIGVsc2UKICAgICAgICAjIFJlbW92ZSBlbXB0eSBzdHJpbmcgaWYgd2UgYXJlbid0IHJlcGxhY2luZyB0aGVtLCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciwgYnV0IHdoeSBub3QgYmUgc2FmZQogICAgICAgIHVuc2V0ICJjbWRbMl0iCiAgICBmaQogICAgbG9jYWwgLXIgY21kCgogICAgbG9nICJVcGRhdGluZyBhbGwgcGFja2FnZXMgZXhjbHVkaW5nIFwiJHtleGNsdWRlc1sqXTotfVwiIgogICAgcmV0cnkgY21kICIkMiIgIiR7MzotfSIKfQoKCiMgY3JlYXRlX2F6dXJlX3JwbV9yZXBvcyBjcmVhdGVzIC9ldGMveXVtLnJlcG9zLmQvYXp1cmUucmVwbyByZXBvc2l0b3J5IGZpbGUKY3JlYXRlX2F6dXJlX3JwbV9yZXBvcygpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLXIgYXp1cmVfcmVwb19maWxlbmFtZT0nL2V0Yy95dW0ucmVwb3MuZC9henVyZS5yZXBvJwogICAgbG9jYWwgLXIgYXp1cmVfcmVwb19maWxlPSdbYXp1cmUtY2xpXQpuYW1lPWF6dXJlLWNsaQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZS1jbGkKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9eWVzCgpbYXp1cmVjb3JlXQpuYW1lPWF6dXJlY29yZQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZWNvcmUKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9bm8nCgogICAgd3JpdGVfZmlsZSBhenVyZV9yZXBvX2ZpbGVuYW1lIGF6dXJlX3JlcG9fZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3JodWlfcmVwbyBlbmFibGVzIGFsbCByaHVpLW1pY3Jvc29mdC1henVyZSogcmVwb3MKIyBhcmdzOgojIDEpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDIpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1vdW50IG9mIHRpbWVzIHRvIHJldHJ5IGNvbW1hbmQsIGRlZmF1bHRzIHRvIDUKY29uZmlndXJlX3JodWlfcmVwbygpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLXJhIGNtZD0oCiAgICAgICAgZG5mCiAgICAgICAgdXBkYXRlCiAgICAgICAgLXkKICAgICAgICAtLWRpc2FibGVyZXBvPScqJwogICAgICAgIC0tZW5hYmxlcmVwbz0ncmh1aS1taWNyb3NvZnQtYXp1cmUqJwogICAgKQoKICAgIGxvZyAicnVubmluZyBSSFVJIHBhY2thZ2UgdXBkYXRlcyIKICAgIHJldHJ5IGNtZCAiJDEiICIkezI6LX0iCn0KCiMgY29uZmlndXJlX2RuZl9jcm9uX2pvYgojIGNyZWF0ZSBjcm9uIGpvYiB0byBhdXRvIHVwZGF0ZSBycG0gcGFja2FnZXMKY29uZmlndXJlX2RuZl9jcm9uX2pvYigpIHsKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2NhbCAtciBjcm9uX3dlZWtseV9kbmZfdXBkYXRlX2ZpbGVuYW1lPScvZXRjL2Nyb24ud2Vla2x5L2RuZnVwZGF0ZScKICAgIGxvY2FsIC1yIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZT0iIyEvYmluL2Jhc2gKZG5mIHVwZGF0ZSAteSIKCiAgICB3cml0ZV9maWxlIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUgY3Jvbl93ZWVrbHlfZG5mX3VwZGF0ZV9maWxlIHRydWUKICAgIGNobW9kIHUreCAiJGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUiCn0KCiMgcnBtX2ltcG9ydF9rZXlzCiMgYXJnczoKIyAxKSBrZXlzIC0gbmFtZXJlZiwgc3RyaW5nIGFycmF5OyBycG0ga2V5cyB0byBiZSBpbXBvcnRlZAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZApycG1faW1wb3J0X2tleXMoKSB7CiAgICBsb2NhbCAtbiBrZXlzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3Iga2V5IGluICR7a2V5c1tAXX07IGRvCiAgICAgICAgaWYgWyAkeyNrZXlzW0BdfSAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZmkKICAgICAgICAgICAgbG9jYWwgLWEgY21kPSgKICAgICAgICAgICAgICAgIHJwbQogICAgICAgICAgICAgICAgLS1pbXBvcnQKICAgICAgICAgICAgICAgIC12CiAgICAgICAgICAgICAgICAiJGtleSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgbG9nICJJbXBvcnRpbmcgcnBtIHJlcG9zaXRvcnkga2V5ICRrZXkiCiAgICAgICAgICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iICYmIHVuc2V0IGtleQogICAgZG9uZQp9CiMhL2Jpbi9iYXNoCiMgQVJPIHNlcnZpY2Ugc2V0dXAgZnVuY3Rpb25zCgojIGNvbmZpZ3VyZV92bXNzX2Fyb19zZXJ2aWNlCiMgYXJnczoKIyAxKSByIC0gbmFtZXJlZiwgc3RyaW5nOyByb2xlIG9mIFZNU1MKIyAyKSBpbWFnZXMgLSBuYW1lcmVmLCBhc3NvY2lhdGl2ZSBhcnJheTsgQVJPIGNvbnRhaW5lciBpbWFnZXMKIyAzKSBjb25maWdzIC0gbmFtZXJlZiwgYXNzb2NpYXRpdmUgYXJyYXk7IGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHZlcnNpb25zLiBUaGUgdmFsdWVzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byB2YXJpYWJsZXMsIG5vdCBkZXJlZmVyZW5jZWQuCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIHZhbHVlIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBuYW1lcmVmIHZhcmlhYmxlcyBieSBoZWxwZXIgZnVuY3Rpb25zLgpjb25maWd1cmVfdm1zc19hcm9fc2VydmljZXMoKSB7CiAgICBsb2NhbCAtbiByPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlcz0iJDIiCiAgICBsb2NhbCAtbiBjb25maWdzPSIkMyIKICAgIGxvZyAic3RhcnRpbmciCiAgICB2ZXJpZnlfcm9sZSAiJDEiCgogICAgaWYgWyAiJHIiID09ICIkcm9sZV9nYXRld2F5IiBdOyB0aGVuCiAgICAgICAgY29uZmlndXJlX3NlcnZpY2VfYXJvX2dhdGV3YXkgIiR7Y29uZmlnc1sibG9nX2RpciJdfSIgIiR7aW1hZ2VzWyJycCJdfSIgIiQxIiAiJHtjb25maWdzWyJnYXRld2F5X2NvbmZpZyJdfSIKICAgIGVsaWYgWyAiJHIiID09ICIkcm9sZV9ycCIgXTsgdGhlbgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19ycCAiJHtpbWFnZXNbInJwIl19IiAiJDEiICIke2NvbmZpZ3NbInJwX2NvbmZpZyJdfSIKICAgICAgICBjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvciAiJHtpbWFnZXNbInJwIl19IgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwgIiR7aW1hZ2VzWyJycCJdfSIKICAgIGZpCgogICAgY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0ICIke2NvbmZpZ3NbImZsdWVudGJpdCJdfSIgIiR7aW1hZ2VzWyJmbHVlbnRiaXQiXX0iCiAgICBjb25maWd1cmVfc2VydmljZV9tZG0gIiQxIiAiJHtpbWFnZXNbIm1kbSJdfSIKICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QgIiQxIiAiJHtjb25maWdzWyJtZHNkIl19IgogICAgY29uZmlndXJlX2NlcnRzICIkMSIKICAgIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QgIiQxIgp9CgojIGVuYWJsZV9zZXJ2aWNlcyBlbmFibGVzIGFsbCBzZXJ2aWNlcyByZXF1aXJlZCBmb3IgYXJvIHJwCiMgYXJnczoKIyAxKSBzZXJ2aWNlcyAtIGFycmF5OyBzZXJ2aWNlcyB0byBiZSBlbmFibGVkCmVuYWJsZV9zZXJ2aWNlcygpIHsKICAgIGxvY2FsIC1uIHNlcnZpY2VzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQKCiAgICBsb2cgImVuYWJsaW5nIHNlcnZpY2VzICR7c2VydmljZXNbKl19IgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3Igc2VydmljZSBpbiAke3NlcnZpY2VzW0BdfTsgZG8KICAgICAgICBsb2cgIkVuYWJsaW5nIGFuZCBzdGFydGluZyAkc2VydmljZSBub3ciCiAgICAgICAgc3lzdGVtY3RsIGVuYWJsZSBcCiAgICAgICAgICAgICAgICAgIC0tbm93IFwKICAgICAgICAgICAgICAgICAgIiRzZXJ2aWNlIgogICAgZG9uZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19nYXRld2F5CiMgYXJnczoKIyAxKSBsb2dfZGlyIC0gbmFtZXJlZiwgc3RyaW5nOyBkaXJlY3RvcnkgdG8gbW91bnQgZm9yIGxvZ2dpbmcgZGlyZWN0b3J5IG9mIGNvbnRhaW5lcgojIDIpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBjb250YWluZXIgaW1hZ2UKIyAzKSByb2xlIC0gbmFtZXJlZiwgc3RyaW5nOyBWTVNTIHJvbGUKIyA0KSBjb25mX2ZpbGUgLSBuYW1lcmVmLCBzdHJpbmc7IGFybyBnYXRld2F5IGVudmlyb25tZW50IGZpbGUKY29uZmlndXJlX3NlcnZpY2VfYXJvX2dhdGV3YXkoKSB7CiAgICBsb2NhbCAtbiBsb2dfZGlyPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlPSIkMiIKICAgIGxvY2FsIC1uIHJvbGU9IiQzIgogICAgbG9jYWwgLW4gY29uZl9maWxlPSIkNCIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGFyby1nYXRld2F5IHNlcnZpY2UiCgogICAgbG9jYWwgLXIgYXJvX2dhdGV3YXlfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLWdhdGV3YXknCgogICAgd3JpdGVfZmlsZSBhcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lIGNvbmZfZmlsZSB0cnVlCgogICAgbG9jYWwgLXIgYXJvX2dhdGV3YXlfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tZ2F0ZXdheS5zZXJ2aWNlJwoKICAgIGxvY2FsIC1yIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9JHthcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lfQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnRQcmU9L3Vzci9iaW4vbWtkaXIgLXAgJHtsb2dfZGlyfQpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFDUl9SRVNPVVJDRV9JRCBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBHQVRFV0FZX0RPTUFJTlMgXAogIC1lIEdBVEVXQVlfRkVBVFVSRVMgXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtbSAyZyBcCiAgLXAgODA6ODA4MCBcCiAgLXAgODA4MTo4MDgxIFwKICAtcCA0NDM6ODQ0MyBcCiAgLXYgL3J1bi9zeXN0ZW1kL2pvdXJuYWw6L3J1bi9zeXN0ZW1kL2pvdXJuYWwgXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogIC12ICR7bG9nX2Rpcn06L2N0ci5sb2c6eiBcCiAgJGltYWdlIFwKICAke3JvbGUsLH0KRXhlY1N0b3A9L3Vzci9iaW4vZG9ja2VyIHN0b3AgLXQgMzYwMCAlTgpUaW1lb3V0U3RvcFNlYz0zNjAwClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CiAgICAiCgogICAgd3JpdGVfZmlsZSBhcm9fZ2F0ZXdheV9zZXJ2aWNlX2ZpbGVuYW1lIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfYXJvX3JwCiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgUlAgY29udGFpbmVyIGltYWdlCiMgMikgcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgVk1TUyByb2xlCiMgMykgY29uZl9maWxlIC0gbmFtZXJlZiwgc3RyaW5nOyBhcm8gcnAgZW52aXJvbm1lbnQgZmlsZQpjb25maWd1cmVfc2VydmljZV9hcm9fcnAoKSB7CiAgICBsb2NhbCAtbiBpbWFnZT0iJDEiCiAgICBsb2NhbCAtbiByb2xlPSIkMiIKICAgIGxvY2FsIC1uIGNvbmZfZmlsZT0iJDMiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8tcnAgc2VydmljZSIKCiAgICBsb2NhbCAtciBhcm9fcnBfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLXJwJwoKICAgIHdyaXRlX2ZpbGUgYXJvX3JwX2NvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICBsb2NhbCAtciBhcm9fcnBfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tcnAuc2VydmljZScKICAgIGxvY2FsIC1yIGFyb19ycF9zZXJ2aWNlX2ZpbGU9IltVbml0XQpBZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXQKV2FudHM9bmV0d29yay1vbmxpbmUudGFyZ2V0CgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPSR7YXJvX3JwX2NvbmZfZmlsZW5hbWV9CkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLWUgQUNSX1JFU09VUkNFX0lEIFwKICAtZSBBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIEFSTV9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIEFaVVJFX0FSTV9DTElFTlRfSUQgXAogIC1lIEFaVVJFX0ZQX0NMSUVOVF9JRCBcCiAgLWUgQ0xVU1RFUl9NRE1fQUNDT1VOVCBcCiAgLWUgQ0xVU1RFUl9NRE1fTkFNRVNQQUNFIFwKICAtZSBDTFVTVEVSX01EU0RfQUNDT1VOVCBcCiAgLWUgQ0xVU1RFUl9NRFNEX0NPTkZJR19WRVJTSU9OIFwKICAtZSBDTFVTVEVSX01EU0RfTkFNRVNQQUNFIFwKICAtZSBEQVRBQkFTRV9BQ0NPVU5UX05BTUUgXAogIC1lIERPTUFJTl9OQU1FIFwKICAtZSBHQVRFV0FZX0RPTUFJTlMgXAogIC1lIEdBVEVXQVlfUkVTT1VSQ0VHUk9VUCBcCiAgLWUgS0VZVkFVTFRfUFJFRklYIFwKICAtZSBNRE1fQUNDT1VOVCBcCiAgLWUgTURNX05BTUVTUEFDRSBcCiAgLWUgTURTRF9FTlZJUk9OTUVOVCBcCiAgLWUgUlBfRkVBVFVSRVMgXAogIC1lIEFST19JTlNUQUxMX1ZJQV9ISVZFIFwKICAtZSBBUk9fSElWRV9ERUZBVUxUX0lOU1RBTExFUl9QVUxMU1BFQyBcCiAgLWUgQVJPX0FET1BUX0JZX0hJVkUgXAogIC1lIFVTRV9DSEVDS0FDQ0VTUyBcCiAgLWUgT0lEQ19BRkRfRU5EUE9JTlQgXAogIC1lIE9JRENfU1RPUkFHRV9BQ0NPVU5UX05BTUUgXAogIC1tIDJnIFwKICAtcCA0NDM6ODQ0MyBcCiAgLXYgL2V0Yy9hcm8tcnA6L2V0Yy9hcm8tcnAgXAogIC12IC9ydW4vc3lzdGVtZC9qb3VybmFsOi9ydW4vc3lzdGVtZC9qb3VybmFsIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkaW1hZ2UgXAogICR7cm9sZSwsfQpFeGVjU3RvcD0vdXNyL2Jpbi9kb2NrZXIgc3RvcCAtdCAzNjAwICVOClRpbWVvdXRTdG9wU2VjPTM2MDAKUmVzdGFydD1hbHdheXMKUmVzdGFydFNlYz0xClN0YXJ0TGltaXRJbnRlcnZhbD0wCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSBhcm9fcnBfc2VydmljZV9maWxlbmFtZSBhcm9fcnBfc2VydmljZV9maWxlIHRydWUKfQoKIyBjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvcgojIGFyZ3M6CiMgMSkgaW1hZ2UgLSBuYW1lcmVmLCBzdHJpbmc7IFJQIGNvbnRhaW5lciBpbWFnZQpjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvcigpIHsKICAgIGxvY2FsIC1uIGltYWdlPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGFyby1tb25pdG9yIHNlcnZpY2UiCgogICAgIyBET01BSU5fTkFNRSwgQ0xVU1RFUl9NRFNEX0FDQ09VTlQsIENMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTiwgR0FURVdBWV9ET01BSU5TLCBHQVRFV0FZX1JFU09VUkNFR1JPVVAsIE1EU0RfRU5WSVJPTk1FTlQgQ0xVU1RFUl9NRFNEX05BTUVTUEFDRQogICAgIyBhcmUgbm90IHVzZWQsIGJ1dCBjYW4ndCBlYXNpbHkgYmUgcmVmYWN0b3JlZCBvdXQuIFNob3VsZCBiZSByZXZpc2l0ZWQgaW4gdGhlIGZ1dHVyZS4KICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLW1vbml0b3InCiAgICBsb2NhbCAtciBhcm9fbW9uaXRvcl9zZXJ2aWNlX2NvbmZfZmlsZT0iQVpVUkVfRlBfQ0xJRU5UX0lEPSckRlBDTElFTlRJRCcKRE9NQUlOX05BTUU9JyRMT0NBVElPTi4kQ0xVU1RFUlBBUkVOVERPTUFJTk5BTUUnCkNMVVNURVJfTURTRF9BQ0NPVU5UPSckQ0xVU1RFUk1EU0RBQ0NPVU5UJwpDTFVTVEVSX01EU0RfQ09ORklHX1ZFUlNJT049JyRDTFVTVEVSTURTRENPTkZJR1ZFUlNJT04nCkdBVEVXQVlfRE9NQUlOUz0nJEdBVEVXQVlET01BSU5TJwpHQVRFV0FZX1JFU09VUkNFR1JPVVA9JyRHQVRFV0FZUkVTT1VSQ0VHUk9VUE5BTUUnCk1EU0RfRU5WSVJPTk1FTlQ9JyRNRFNERU5WSVJPTk1FTlQnCkNMVVNURVJfTURTRF9OQU1FU1BBQ0U9JyRDTFVTVEVSTURTRE5BTUVTUEFDRScKQ0xVU1RFUl9NRE1fQUNDT1VOVD0nJENMVVNURVJNRE1BQ0NPVU5UJwpDTFVTVEVSX01ETV9OQU1FU1BBQ0U9QkJNCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCktFWVZBVUxUX1BSRUZJWD0nJEtFWVZBVUxUUFJFRklYJwpNRE1fQUNDT1VOVD0nJFJQTURNQUNDT1VOVCcKTURNX05BTUVTUEFDRT1CQk0KUlBJTUFHRT0nJGltYWdlJyIKCiAgICB3cml0ZV9maWxlIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlbmFtZSBhcm9fbW9uaXRvcl9zZXJ2aWNlX2NvbmZfZmlsZSB0cnVlCgogICAgbG9jYWwgLXIgYXJvX21vbml0b3Jfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tbW9uaXRvci5zZXJ2aWNlJwogICAgbG9jYWwgLXIgYXJvX21vbml0b3Jfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tbW9uaXRvcgpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFaVVJFX0ZQX0NMSUVOVF9JRCBcCiAgLWUgRE9NQUlOX05BTUUgXAogIC1lIENMVVNURVJfTURTRF9BQ0NPVU5UIFwKICAtZSBDTFVTVEVSX01EU0RfQ09ORklHX1ZFUlNJT04gXAogIC1lIEdBVEVXQVlfRE9NQUlOUyBcCiAgLWUgR0FURVdBWV9SRVNPVVJDRUdST1VQIFwKICAtZSBNRFNEX0VOVklST05NRU5UIFwKICAtZSBDTFVTVEVSX01EU0RfTkFNRVNQQUNFIFwKICAtZSBDTFVTVEVSX01ETV9BQ0NPVU5UIFwKICAtZSBDTFVTVEVSX01ETV9OQU1FU1BBQ0UgXAogIC1lIERBVEFCQVNFX0FDQ09VTlRfTkFNRSBcCiAgLWUgS0VZVkFVTFRfUFJFRklYIFwKICAtZSBNRE1fQUNDT1VOVCBcCiAgLWUgTURNX05BTUVTUEFDRSBcCiAgLW0gMi41ZyBcCiAgLXYgL3J1bi9zeXN0ZW1kL2pvdXJuYWw6L3J1bi9zeXN0ZW1kL2pvdXJuYWwgXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRpbWFnZSBcCiAgbW9uaXRvcgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIGFyb19tb25pdG9yX3NlcnZpY2VfZmlsZW5hbWUgYXJvX21vbml0b3Jfc2VydmljZV9maWxlIHRydWUKfQoKIyBjb25maWd1cmVfc2VydmljZV9hcm9fcG9ydGFsCiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgUlAgY29udGFpbmVyIGltYWdlCmNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwoKSB7CiAgICBsb2NhbCAtbiBpbWFnZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8gcG9ydGFsIHNlcnZpY2UiCgogICAgbG9jYWwgLXIgYXJvX3BvcnRhbF9zZXJ2aWNlX2NvbmZfZmlsZW5hbWU9Jy9ldGMvc3lzY29uZmlnL2Fyby1wb3J0YWwnCiAgICBsb2NhbCAtciBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlPSJBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUz0nJFBPUlRBTEFDQ0VTU0dST1VQSURTJwpBWlVSRV9QT1JUQUxfQ0xJRU5UX0lEPSckUE9SVEFMQ0xJRU5USUQnCkFaVVJFX1BPUlRBTF9FTEVWQVRFRF9HUk9VUF9JRFM9JyRQT1JUQUxFTEVWQVRFREdST1VQSURTJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpLRVlWQVVMVF9QUkVGSVg9JyRLRVlWQVVMVFBSRUZJWCcKTURNX0FDQ09VTlQ9JyRSUE1ETUFDQ09VTlQnCk1ETV9OQU1FU1BBQ0U9UG9ydGFsClBPUlRBTF9IT1NUTkFNRT0nJExPQ0FUSU9OLmFkbWluLiRSUFBBUkVOVERPTUFJTk5BTUUnClJQSU1BR0U9JyRpbWFnZSciCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlbmFtZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlIHRydWUKCiAgICBsb2NhbCAtciBhcm9fcG9ydGFsX3NlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLXBvcnRhbC5zZXJ2aWNlJwogICAgbG9jYWwgLXIgYXJvX3BvcnRhbF9zZXJ2aWNlX2ZpbGU9IltVbml0XQpBZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXQKV2FudHM9bmV0d29yay1vbmxpbmUudGFyZ2V0ClN0YXJ0TGltaXRJbnRlcnZhbD0wCgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL2Fyby1wb3J0YWwKRXhlY1N0YXJ0UHJlPS0vdXNyL2Jpbi9kb2NrZXIgcm0gLWYgJU4KRXhlY1N0YXJ0PS91c3IvYmluL2RvY2tlciBydW4gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLS1jYXAtZHJvcCBuZXRfcmF3IFwKICAtZSBBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUyBcCiAgLWUgQVpVUkVfUE9SVEFMX0NMSUVOVF9JRCBcCiAgLWUgQVpVUkVfUE9SVEFMX0VMRVZBVEVEX0dST1VQX0lEUyBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBQT1JUQUxfSE9TVE5BTUUgXAogIC1tIDJnIFwKICAtcCA0NDQ6ODQ0NCBcCiAgLXAgMjIyMjoyMjIyIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICBwb3J0YWwKUmVzdGFydD1hbHdheXMKUmVzdGFydFNlYz0xCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfZmlsZW5hbWUgYXJvX3BvcnRhbF9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QKIyBhcmdzOgojIDEpIG1vbml0b3Jpbmdfcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgY2FuIGJlICJnYXRld2F5IiBvciAicnAiCiMgMikgbW9uaXRvcl9jb25maWdfdmVyc2lvbiAtIG5hbWVyZWYsIHN0cmluZzsgbWRzZCBjb25maWcgdmVyc2lvbgpjb25maWd1cmVfc2VydmljZV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2NhbCAtbiBtb25pdG9yX2NvbmZpZ192ZXJzaW9uPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgImNvbmZpZ3VyaW5nIG1kc2Qgc2VydmljZSIKCiAgICB2ZXJpZnlfcm9sZSByb2xlCgogICAgbG9jYWwgLXIgbWRzZF9zZXJ2aWNlX2Rpcj0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZHNkLnNlcnZpY2UuZCIKICAgIG1rZGlyIC1wICIkbWRzZF9zZXJ2aWNlX2RpciIKCiAgICBsb2NhbCAtciBtZHNkX292ZXJyaWRlX2NvbmZfZmlsZW5hbWU9IiRtZHNkX3NlcnZpY2VfZGlyL292ZXJyaWRlLmNvbmYiCiAgICBsb2NhbCAtciBtZHNkX2NlcnRpZmljYXRlX3Nhbj0iJChvcGVuc3NsIHg1MDkgLWluIC92YXIvbGliL3dhYWdlbnQvTWljcm9zb2Z0LkF6dXJlLktleVZhdWx0LlN0b3JlL21kc2QucGVtIC1ub291dCAtc3ViamVjdCB8IHNlZCAtZSAncy8uKkNOID0gLy8nKSIKICAgIGxvY2FsIC1yIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgbWRzZF9vdmVycmlkZV9jb25mX2ZpbGVuYW1lIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlIHRydWUKCiAgICBsb2NhbCAtciBkZWZhdWx0X21kc2RfZmlsZW5hbWU9Ii9ldGMvZGVmYXVsdC9tZHNkIgogICAgbG9jYWwgLXIgZGVmYXVsdF9tZHNkX2ZpbGU9Ik1EU0RfUk9MRV9QUkVGSVg9L3Zhci9ydW4vbWRzZC9kZWZhdWx0Ck1EU0RfT1BUSU9OUz1cIi1BIC1kIC1yIFwkTURTRF9ST0xFX1BSRUZJWFwiCgpleHBvcnQgTU9OSVRPUklOR19HQ1NfRU5WSVJPTk1FTlQ9JyRNRFNERU5WSVJPTk1FTlQnCmV4cG9ydCBNT05JVE9SSU5HX0dDU19BQ0NPVU5UPSckUlBNRFNEQUNDT1VOVCcKZXhwb3J0IE1PTklUT1JJTkdfR0NTX1JFR0lPTj0nJExPQ0FUSU9OJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfQVVUSF9JRF9UWVBFPUF1dGhLZXlWYXVsdApleHBvcnQgTU9OSVRPUklOR19HQ1NfQVVUSF9JRD0nJG1kc2RfY2VydGlmaWNhdGVfc2FuJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfTkFNRVNQQUNFPSckUlBNRFNETkFNRVNQQUNFJwpleHBvcnQgTU9OSVRPUklOR19DT05GSUdfVkVSU0lPTj0nJG1vbml0b3JfY29uZmlnX3ZlcnNpb24nCmV4cG9ydCBNT05JVE9SSU5HX1VTRV9HRU5FVkFfQ09ORklHX1NFUlZJQ0U9dHJ1ZQoKZXhwb3J0IE1PTklUT1JJTkdfVEVOQU5UPSckTE9DQVRJT04nCmV4cG9ydCBNT05JVE9SSU5HX1JPTEU9JyRyb2xlJwpleHBvcnQgTU9OSVRPUklOR19ST0xFX0lOU1RBTkNFPVwiJChob3N0bmFtZSlcIgoKZXhwb3J0IE1EU0RfTVNHUEFDS19TT1JUX0NPTFVNTlM9MVwiIgoKICAgIHdyaXRlX2ZpbGUgZGVmYXVsdF9tZHNkX2ZpbGVuYW1lIGRlZmF1bHRfbWRzZF9maWxlIHRydWUKfQoKIyBjb25maWd1cmVfc2VydmljZV9mbHVlbnRiaXQKIyBhcmdzOgojIDEpIGNvbmZfZmlsZSAtIHN0cmluZzsgZmx1ZW5iaXQgY29uZmlndXJhdGlvbiBmaWxlCiMgMikgaW1hZ2UgLSBzdHJpbmc7IGZsdWVudGJpdCBjb250YWluZXIgaW1hZ2UgdG8gcnVuCmNvbmZpZ3VyZV9zZXJ2aWNlX2ZsdWVudGJpdCgpIHsKICAgIGxvY2FsIC1uIGNvbmZfZmlsZT0iJDEiCiAgICBsb2NhbCAtbiBpbWFnZT0iJDIiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBmbHVlbnRiaXQgc2VydmljZSIKCiAgICBta2RpciAtcCAvZXRjL2ZsdWVudGJpdC8KICAgIG1rZGlyIC1wIC92YXIvbGliL2ZsdWVudAoKICAgIGxvY2FsIC1yIGNvbmZfZmlsZW5hbWU9Jy9ldGMvZmx1ZW50Yml0L2ZsdWVudGJpdC5jb25mJwogICAgd3JpdGVfZmlsZSBjb25mX2ZpbGVuYW1lIGNvbmZfZmlsZSB0cnVlCgogICAgbG9jYWwgLXIgc3lzY29uZmlnX2ZpbGVuYW1lPScvZXRjL3N5c2NvbmZpZy9mbHVlbnRiaXQnCiAgICBsb2NhbCAtciBzeXNjb25maWdfZmlsZT0iRkxVRU5UQklUSU1BR0U9JGltYWdlIgoKICAgIHdyaXRlX2ZpbGUgc3lzY29uZmlnX2ZpbGVuYW1lIHN5c2NvbmZpZ19maWxlIHRydWUKCiAgICBsb2NhbCAtciBzZXJ2aWNlX2ZpbGVuYW1lPScvZXRjL3N5c3RlbWQvc3lzdGVtL2ZsdWVudGJpdC5zZXJ2aWNlJwogICAgbG9jYWwgLXIgc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldApTdGFydExpbWl0SW50ZXJ2YWxTZWM9MAoKW1NlcnZpY2VdClJlc3RhcnRTZWM9MXMKRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL2ZsdWVudGJpdApFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1zZWN1cml0eS1vcHQgbGFiZWw9ZGlzYWJsZSBcCiAgLS1lbnRyeXBvaW50IC9vcHQvdGQtYWdlbnQtYml0L2Jpbi90ZC1hZ2VudC1iaXQgXAogIC0tbmV0PWhvc3QgXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLS1jYXAtZHJvcCBuZXRfcmF3IFwKICAtdiAvZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZjovZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZiBcCiAgLXYgL3Zhci9saWIvZmx1ZW50Oi92YXIvbGliL2ZsdWVudDp6IFwKICAtdiAvdmFyL2xvZy9qb3VybmFsOi92YXIvbG9nL2pvdXJuYWw6cm8gXAogIC12IC9ldGMvbWFjaGluZS1pZDovZXRjL21hY2hpbmUtaWQ6cm8gXAogICRpbWFnZSBcCiAgLWMgL2V0Yy9mbHVlbnRiaXQvZmx1ZW50Yml0LmNvbmYKCkV4ZWNTdG9wPS91c3IvYmluL2RvY2tlciBzdG9wICVOClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9NQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgc2VydmljZV9maWxlbmFtZSBzZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QKIyBhcmdzOgojIDEpIHJvbGUgLSBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgpjb25maWd1cmVfdGltZXJzX21kbV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICBsb2NhbCBrZXl2YXVsdF9zdWZmaXggc2VjcmV0X3ByZWZpeAogICAgZ2V0X2tleXZhdWx0X3N1ZmZpeCByb2xlIGtleXZhdWx0X3N1ZmZpeCBzZWNyZXRfcHJlZml4CgogICAgZm9yIHZhciBpbiAibWRzZCIgIm1kbSI7IGRvCiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9kb3dubG9hZC0kdmFyLWNyZWRlbnRpYWxzLnNlcnZpY2UiCiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaCAkdmFyIgoKICAgICAgICB3cml0ZV9maWxlIGRvd25sb2FkX2NyZWRzX3NlcnZpY2VfZmlsZW5hbWUgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlIHRydWUKCiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfdGltZXJfZmlsZW5hbWU9Ii9ldGMvc3lzdGVtZC9zeXN0ZW0vZG93bmxvYWQtJHZhci1jcmVkZW50aWFscy50aW1lciIKICAgICAgICBsb2NhbCBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltUaW1lcl0KT25Cb290U2VjPTBtaW4KT25DYWxlbmRhcj0wLzEyOjAwOjAwCkFjY3VyYWN5U2VjPTVzCgpbSW5zdGFsbF0KV2FudGVkQnk9dGltZXJzLnRhcmdldCIKCiAgICAgICAgd3JpdGVfZmlsZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlbmFtZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlIHRydWUKICAgIGRvbmUKCiAgICBsb2NhbCAtciBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZW5hbWU9Ii91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoIgogICAgbG9jYWwgLXIgZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGU9IiMhL2Jpbi9iYXNoCnNldCAtZXUKCkNPTVBPTkVOVD1cJDEKZWNobyBcIkRvd25sb2FkIFwkQ09NUE9ORU5UIGNyZWRlbnRpYWxzXCIKClRFTVBfRElSPVwiXCQobWt0ZW1wIC1kKVwiCmV4cG9ydCBBWlVSRV9DT05GSUdfRElSPVwiXCQobWt0ZW1wIC1kKVwiCgplY2hvIFwiTG9nZ2luZyBpbnRvIEF6dXJlLi4uXCIKUkVUUklFUz0zCndoaWxlIFtbIFwkUkVUUklFUyAtZ3QgMCBdXTsgZG8KICAgIGlmIGF6IGxvZ2luIC1pIC0tYWxsb3ctbm8tc3Vic2NyaXB0aW9ucwogICAgdGhlbgogICAgICAgIGVjaG8gXCJheiBsb2dpbiBzdWNjZXNzZnVsXCIKICAgICAgICBicmVhawogICAgZWxzZQogICAgICAgIGVjaG8gXCJheiBsb2dpbiBmYWlsZWQuIFJldHJ5aW5nLi4uXCIKICAgICAgICBsZXQgUkVUUklFUy09MQogICAgICAgIHNsZWVwIDUKICAgIGZpCmRvbmUKCnRyYXAgXCJjbGVhbnVwXCIgRVhJVAoKY2xlYW51cCgpIHsKICBheiBsb2dvdXQKICBbWyBcJFRFTVBfRElSID1+IC90bXAvLisgXV0gJiYgcm0gLXJmIFwkVEVNUF9ESVIKICBbWyBcJEFaVVJFX0NPTkZJR19ESVIgPX4gL3RtcC8uKyBdXSAmJiBybSAtcmYgXCRBWlVSRV9DT05GSUdfRElSCn0KCmlmIFtbIFwkQ09NUE9ORU5UID0gXCJtZG1cIiBdXTsgdGhlbgogIENVUlJFTlRfQ0VSVF9GSUxFPVwiL2V0Yy9tZG0ucGVtXCIKZWxpZiBbWyBcJENPTVBPTkVOVCA9IFwibWRzZFwiIF1dOyB0aGVuCiAgQ1VSUkVOVF9DRVJUX0ZJTEU9XCIvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZS9tZHNkLnBlbVwiCmVsc2UKICBlY2hvIEludmFsaWQgdXNhZ2UgJiYgZXhpdCAxCmZpCgpTRUNSRVRfTkFNRT1cIiRzZWNyZXRfcHJlZml4LVwke0NPTVBPTkVOVH1cIgpORVdfQ0VSVF9GSUxFPVwiXCRURU1QX0RJUi9cJENPTVBPTkVOVC5wZW1cIgpmb3IgYXR0ZW1wdCBpbiB7MS4uNX07IGRvCiAgYXoga2V5dmF1bHQgXAogICAgc2VjcmV0IFwKICAgIGRvd25sb2FkIFwKICAgIC0tZmlsZSBcIlwkTkVXX0NFUlRfRklMRVwiIFwKICAgIC0taWQgXCJodHRwczovLyRLRVlWQVVMVFBSRUZJWC0ka2V5dmF1bHRfc3VmZml4LiRLRVlWQVVMVEROU1NVRkZJWC9zZWNyZXRzL1wkU0VDUkVUX05BTUVcIiBcCiAgICAmJiBicmVhawogIGlmIFtbIFwkYXR0ZW1wdCAtbHQgNSBdXTsgdGhlbiBzbGVlcCAxMDsgZWxzZSBleGl0IDE7IGZpCmRvbmUKCmlmIFsgLWYgXCRORVdfQ0VSVF9GSUxFIF07IHRoZW4KICBpZiBbWyBcJENPTVBPTkVOVCA9IFwibWRzZFwiIF1dOyB0aGVuCiAgICBjaG93biBzeXNsb2c6c3lzbG9nIFwkTkVXX0NFUlRfRklMRQogIGVsc2UKICAgIHNlZCAtaSAtbmUgJzEsL0VORCBDRVJUSUZJQ0FURS8gcCcgXCRORVdfQ0VSVF9GSUxFCiAgZmkKCiAgbmV3X2NlcnRfc249XCJcJChvcGVuc3NsIHg1MDkgLWluIFwiXCRORVdfQ0VSVF9GSUxFXCIgLW5vb3V0IC1zZXJpYWwgfCBhd2sgLUY9ICd7cHJpbnQgXCQyfScpXCIKICBjdXJyZW50X2NlcnRfc249XCJcJChvcGVuc3NsIHg1MDkgLWluIFwiXCRDVVJSRU5UX0NFUlRfRklMRVwiIC1ub291dCAtc2VyaWFsIHwgYXdrIC1GPSAne3ByaW50IFwkMn0nKVwiCiAgaWYgW1sgISAteiBcJG5ld19jZXJ0X3NuIF1dICYmIFtbIFwkbmV3X2NlcnRfc24gIT0gXCJcJGN1cnJlbnRfY2VydF9zblwiIF1dOyB0aGVuCiAgICBlY2hvIHVwZGF0aW5nIGNlcnRpZmljYXRlIGZvciBcJENPTVBPTkVOVAogICAgY2htb2QgMDYwMCBcJE5FV19DRVJUX0ZJTEUKICAgIG12IFwkTkVXX0NFUlRfRklMRSBcJENVUlJFTlRfQ0VSVF9GSUxFCiAgZmkKZWxzZQogIGVjaG8gRmFpbGVkIHRvIHJlZnJlc2ggY2VydGlmaWNhdGUgZm9yIFwkQ09NUE9ORU5UICYmIGV4aXQgMQpmaSIKCiAgICB3cml0ZV9maWxlIGRvd25sb2FkX2NyZWRzX3NjcmlwdF9maWxlbmFtZSBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZSB0cnVlCgogICAgY2htb2QgdSt4IC91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoCgogICAgJGRvd25sb2FkX2NyZWRzX3NjcmlwdF9maWxlbmFtZSBtZHNkCiAgICAkZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGVuYW1lIG1kbQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGVuYW1lPSIvZXRjL3N5c3RlbWQvc3lzdGVtL3dhdGNoLW1kbS1jcmVkZW50aWFscy5zZXJ2aWNlIgogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3NlcnZpY2VfZmlsZT0iW1VuaXRdCkRlc2NyaXB0aW9uPVdhdGNoIGZvciBjaGFuZ2VzIGluIG1kbS5wZW0gYW5kIHJlc3RhcnRzIHRoZSBtZG0gc2VydmljZQoKW1NlcnZpY2VdClR5cGU9b25lc2hvdApFeGVjU3RhcnQ9L3Vzci9iaW4vc3lzdGVtY3RsIHJlc3RhcnQgbWRtLnNlcnZpY2UKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGVuYW1lIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lPScvZXRjL3N5c3RlbWQvc3lzdGVtL3dhdGNoLW1kbS1jcmVkZW50aWFscy5wYXRoJwogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3BhdGhfZmlsZT0nW1BhdGhdClBhdGhNb2RpZmllZD0vZXRjL21kbS5wZW0KCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCcKCiAgICB3cml0ZV9maWxlIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkcz0nd2F0Y2gtbWRtLWNyZWRlbnRpYWxzLnBhdGgnCiAgICBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93ICIkd2F0Y2hfbWRtX2NyZWRzIiB8fCBhYm9ydCAiZmFpbGVkIHRvIGVuYWJsZSBhbmQgc3RhcnQgJHdhdGNoX21kbV9jcmVkcyIKfQoKIyBjb25maWd1cmVfc2VydmljZV9tZG0KIyBhcmdzOgojIDEpIHJvbGUgLSBuYW1lcmVmLCBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgojIDIpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBtZG0gY29udGFpbmVyIGltYWdlIHRvIHJ1bgpjb25maWd1cmVfc2VydmljZV9tZG0oKSB7CiAgICBsb2NhbCAtbiByb2xlPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIG1kbSBzZXJ2aWNlIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICBsb2NhbCAtciBzeXNjb25maWdfbWRtX2ZpbGVuYW1lPSIvZXRjL3N5c2NvbmZpZy9tZG0iCiAgICBsb2NhbCAtciBzeXNjb25maWdfbWRtX2ZpbGU9Ik1ETUZST05URU5EVVJMPSckTURNRlJPTlRFTkRVUkwnCk1ETUlNQUdFPSckaW1hZ2UnCk1ETVNPVVJDRUVOVklST05NRU5UPSckTE9DQVRJT04nCk1ETVNPVVJDRVJPTEU9JyRyb2xlJwpNRE1TT1VSQ0VST0xFSU5TVEFOQ0U9XCIkKGhvc3RuYW1lKVwiIgoKICAgIHdyaXRlX2ZpbGUgc3lzY29uZmlnX21kbV9maWxlbmFtZSBzeXNjb25maWdfbWRtX2ZpbGUgdHJ1ZQoKICAgIG1rZGlyIC1wIC92YXIvZXR3CiAgICBsb2NhbCAtciBtZG1fc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZG0uc2VydmljZSIKICAgIGxvY2FsIC1yIG1kbV9zZXJ2aWNlX2ZpbGU9IltVbml0XQpBZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXQKV2FudHM9bmV0d29yay1vbmxpbmUudGFyZ2V0CgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL21kbQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1lbnRyeXBvaW50IC91c3Ivc2Jpbi9NZXRyaWNzRXh0ZW5zaW9uIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLW0gMmcgXAogIC12IC9ldGMvbWRtLnBlbTovZXRjL21kbS5wZW0gXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRpbWFnZSBcCiAgLUNlcnRGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLUZyb250RW5kVXJsICRNRE1GUk9OVEVORFVSTCBcCiAgLUxvZ2dlciBDb25zb2xlIFwKICAtTG9nTGV2ZWwgV2FybmluZyBcCiAgLVByaXZhdGVLZXlGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLVNvdXJjZUVudmlyb25tZW50ICRMT0NBVElPTiBcCiAgLVNvdXJjZVJvbGUgJHJvbGUgXAogIC1Tb3VyY2VSb2xlSW5zdGFuY2UgJEhPU1ROQU1FCkV4ZWNTdG9wPS91c3IvYmluL2RvY2tlciBzdG9wICVOClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgbWRtX3NlcnZpY2VfZmlsZW5hbWUgbWRtX3NlcnZpY2VfZmlsZSB0cnVlCn0KIyEvYmluL2Jhc2gKIyBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgc291cmNlZCBieSBib290c3RyYXBwaW5nIHNjcmlwdHMgZm9yIGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25zCgojIGNvbmZpZ3VyZV9zc2hkCiMgV2UgbmVlZCB0byBjb25maWd1cmUgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB0byB5ZXMgaW4gb3JkZXIgZm9yIHRoZSBWTVNTIEFjY2VzcyBKSVQgdG8gd29yawpjb25maWd1cmVfc3NoZCgpIHsKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2NhbCAtciBzc2hkX2NvbmZpZz0iL2V0Yy9zc2gvc3NoZF9jb25maWciCgogICAgbG9nICJFZGl0aW5nICRzc2hkX2NvbmZpZyB0byBhbGxvdyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiIKICAgIHNlZCAtaSAncy9QYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vL1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzL2cnICIkc3NoZF9jb25maWciCgogICAgc3lzdGVtY3RsIHJlbG9hZCBzc2hkLnNlcnZpY2UgfHwgYWJvcnQgInNzaGQgZmFpbGVkIHRvIHJlbG9hZCIKfQoKIyBjb25maWd1cmVfZmlyZXdhbGxkX3J1bGVzCiMgYXJnczoKIyAxKSBwb3J0cyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheTsgcG9ydHMgdG8gYmUgZW5hYmxlZC4KIyAgICAgICBQb3J0cyBtdXN0IGJlIHBvc3RmaXhlZCB3aXRoIC90Y3Agb3IgL3VkcApjb25maWd1cmVfZmlyZXdhbGxkX3J1bGVzKCkgewogICAgbG9jYWwgLW4gcG9ydHM9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICAjIGh0dHBzOi8vYWNjZXNzLnJlZGhhdC5jb20vc2VjdXJpdHkvY3ZlL2N2ZS0yMDIwLTEzNDAxCiAgICBsb2NhbCAtciBwcmVmaXg9Ii9ldGMvc3lzY3RsLmQiCiAgICBsb2NhbCAtciBkaXNhYmxlX2FjY2VwdF9yYV9jb25mX2ZpbGVuYW1lPSIkcHJlZml4LzAyLWRpc2FibGUtYWNjZXB0LXJhLmNvbmYiCiAgICBsb2NhbCAtciBkaXNhYmxlX2FjY2VwdF9yYV9jb25mX2ZpbGU9Im5ldC5pcHY2LmNvbmYuYWxsLmFjY2VwdF9yYT0wIgoKICAgIHdyaXRlX2ZpbGUgZGlzYWJsZV9hY2NlcHRfcmFfY29uZl9maWxlbmFtZSBkaXNhYmxlX2FjY2VwdF9yYV9jb25mX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIGRpc2FibGVfY29yZV9maWxlbmFtZT0iJHByZWZpeC8wMS1kaXNhYmxlLWNvcmUuY29uZiIKICAgIGxvY2FsIC1yIGRpc2FibGVfY29yZV9maWxlPSJrZXJuZWwuY29yZV9wYXR0ZXJuID0gfC9iaW4vdHJ1ZQogICAgIgogICAgd3JpdGVfZmlsZSBkaXNhYmxlX2NvcmVfZmlsZW5hbWUgZGlzYWJsZV9jb3JlX2ZpbGUgdHJ1ZQoKICAgIHN5c2N0bCAtLXN5c3RlbQoKICAgIGxvZyAiRW5hYmxpbmcgcG9ydHMgJHtwb3J0c1sqXX0gb24gZGVmYXVsdCBmaXJld2FsbGQgem9uZSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA2OAogICAgZm9yIHBvcnQgaW4gJHtwb3J0c1tAXX07IGRvCiAgICAgICAgbG9nICJFbmFibGluZyBwb3J0ICRwb3J0IG5vdyIKICAgICAgICBmaXJld2FsbC1jbWQgIi0tYWRkLXBvcnQ9JHBvcnQiCiAgICBkb25lCgogICAgbG9nICJXcml0aW5nIHJ1bnRpbWUgY29uZmlnIHRvIHBlcm1hbmVudCBjb25maWciCiAgICBmaXJld2FsbC1jbWQgLS1ydW50aW1lLXRvLXBlcm1hbmVudAp9CgojIGNvbmZpZ3VyZV9sb2dyb3RhdGUgY2xvYmJlcnMgL2V0Yy9sb2dyb3RhdGUuY29uZgojIGFyZ3M6CiMgMSkgZHJvcGluX2ZpbGVzIC0gbmFtZXJlZiwgYXNzb2NpYXRpdmUgYXJyYXksIG9wdGlvbmFsOyBsb2dyb3RhdGUgZmlsZXMgdG8gd3JpdGUgdG8gL2V0Yy9sb2dyb3RhdGUuZAojICAgICAgIEtleSBuYW1lIGRpY3RhdGVzIGZpbGVuYW1lcyB3cml0dGVuIHRvIC9ldGMvbG9ncm90YXRlLmQuCmNvbmZpZ3VyZV9sb2dyb3RhdGUoKSB7CiAgICBsb2NhbCAtbiBkcm9waW5fZmlsZXM9IiR7MTotZW1wdHlfc3RyfSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLXIgbG9ncm90YXRlX2NvbmZfZmlsZW5hbWU9Jy9ldGMvbG9ncm90YXRlLmNvbmYnCiAgICBsb2NhbCAtciBsb2dyb3RhdGVfY29uZl9maWxlPScjIHNlZSAibWFuIGxvZ3JvdGF0ZSIgZm9yIGRldGFpbHMKIyByb3RhdGUgbG9nIGZpbGVzIHdlZWtseQp3ZWVrbHkKCiMga2VlcCAyIHdlZWtzIHdvcnRoIG9mIGJhY2tsb2dzCnJvdGF0ZSAyCgojIGNyZWF0ZSBuZXcgKGVtcHR5KSBsb2cgZmlsZXMgYWZ0ZXIgcm90YXRpbmcgb2xkIG9uZXMKY3JlYXRlCgojIHVzZSBkYXRlIGFzIGEgc3VmZml4IG9mIHRoZSByb3RhdGVkIGZpbGUKZGF0ZWV4dAoKIyB1bmNvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCB5b3VyIGxvZyBmaWxlcyBjb21wcmVzc2VkCmNvbXByZXNzCgojIFJQTSBwYWNrYWdlcyBkcm9wIGxvZyByb3RhdGlvbiBpbmZvcm1hdGlvbiBpbnRvIHRoaXMgZGlyZWN0b3J5CmluY2x1ZGUgL2V0Yy9sb2dyb3RhdGUuZAoKIyBubyBwYWNrYWdlcyBvd24gd3RtcCBhbmQgYnRtcCAtLSB3ZSB3aWxsIHJvdGF0ZSB0aGVtIGhlcmUKL3Zhci9sb2cvd3RtcCB7CiAgICBtb250aGx5CiAgICBjcmVhdGUgMDY2NCByb290IHV0bXAKICAgICAgICBtaW5zaXplIDFNCiAgICByb3RhdGUgMQp9CgovdmFyL2xvZy9idG1wIHsKICAgIG1pc3NpbmdvawogICAgbW9udGhseQogICAgY3JlYXRlIDA2MDAgcm9vdCB1dG1wCiAgICByb3RhdGUgMQp9JwoKICAgIHdyaXRlX2ZpbGUgbG9ncm90YXRlX2NvbmZfZmlsZW5hbWUgbG9ncm90YXRlX2NvbmZfZmlsZSB0cnVlCgogICAgaWYgWyAtbiAiJHtkcm9waW5fZmlsZXNbKl19IiBdOyB0aGVuCiAgICAgICAgbG9jYWwgLXIgbG9ncm90YXRlX2Q9Ii9ldGMvbG9ncm90YXRlLmQiCiAgICAgICAgbG9nICJXcml0aW5nIGxvZ3JvdGF0ZSBmaWxlcyB0byAkbG9ncm90YXRlX2QiCiAgICAgICAgZm9yIGRyb3Bpbl9uYW1lIGluICIkeyFkcm9waW5fZmlsZXNbQF19IjsgZG8KICAgICAgICAgICAgbG9jYWwgLXIgZHJvcGluX2ZpbGVuYW1lPSIkbG9ncm90YXRlX2QvJGRyb3Bpbl9uYW1lIgogICAgICAgICAgICBsb2NhbCAtciBkcm9waW5fZmlsZT0iJHtkcm9waW5fZmlsZXNbIiRkcm9waW5fbmFtZSJdfSIKICAgICAgICAgICAgd3JpdGVfZmlsZSBkcm9waW5fZmlsZW5hbWUgZHJvcGluX2ZpbGUgdHJ1ZQogICAgICAgIGRvbmUKICAgIGZpCn0KCiMgcHVsbF9jb250YWluZXJfaW1hZ2VzCiMgYXJnczoKIyAxKSBwdWxsX2ltYWdlcyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheQojIDIpIGF6X2xvZ2luIC0gYm9vbGVhbjsgbG9naW4gd2l0aCBheiBsb2dpbiBhbmQgYXogYWNyIGxvZ2luCiMgMykgcmVnaXN0cnlfY29uZiAtIG5hbWVyZWYsIHN0cmluZywgb3B0aW9uYWw7IHBhdGggdG8gZG9ja2VyL3BvZG1hbiBjb25maWd1cmF0aW9uIGZpbGUKcHVsbF9jb250YWluZXJfaW1hZ2VzKCkgewogICAgbG9jYWwgLW4gcHVsbF9pbWFnZXM9IiQxIgogICAgbG9jYWwgLXIgYXpfbG9naW49IiR7Mn0iCiAgICBsb2NhbCAtbiByZWdpc3RyeV9jb25mPSIkezM6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1yaSByZXRyeV90aW1lPTMwCiAgICAjIFRoZSBtYW5hZ2VkIGlkZW50aXR5IHRoYXQgdGhlIFZNIHJ1bnMgYXMgb25seSBoYXMgYSBzaW5nbGUgcm9sZWFzc2lnbm1lbnQuCiAgICAjIFRoaXMgcm9sZSBhc3NpZ25tZW50IGlzIEFDUlB1bGwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHByZXNlbnQgaW4gdGhlCiAgICAjIHN1YnNjcmlwdGlvbiB3ZSdyZSBkZXBsb3lpbmcgaW50by4gIElmIHRoZSBpZGVudGl0eSBkb2VzIG5vdCBoYXZlIGFueQogICAgIyByb2xlIGFzc2lnbm1lbnRzIHNjb3BlZCBvbiB0aGUgc3Vic2NyaXB0aW9uIHdlJ3JlIGRlcGxveWluZyBpbnRvLCBpdCB3aWxsCiAgICAjIG5vdCBzaG93IG9uIGF6IGxvZ2luIC1pLCB3aGljaCBpcyB3aHkgdGhlIGJlbG93IGxpbmUgaXMgY29tbWVudGVkLgogICAgIyBheiBhY2NvdW50IHNldCAtcyAiJFNVQlNDUklQVElPTklEIgogICAgaWYgJGF6X2xvZ2luOyB0aGVuCiAgICAgICAgY21kPSgKICAgICAgICAgICAgYXoKICAgICAgICAgICAgbG9naW4KICAgICAgICAgICAgLWkKICAgICAgICAgICAgLS1hbGxvdy1uby1zdWJzY3JpcHRpb25zCiAgICAgICAgKQoKICAgICAgICBsb2cgIlJ1bm5pbmcgYXogbG9naW4gd2l0aCByZXRyaWVzIgogICAgICAgIHJldHJ5IGNtZCByZXRyeV90aW1lCiAgICBmaQoKICAgICMgU3VwcHJlc3MgZW11bGF0aW9uIG91dHB1dCBmb3IgcG9kbWFuIGluc3RlYWQgb2YgZG9ja2VyIGZvciBheiBhY3IgY29tcGF0YWJpbGl0eQogICAgbWtkaXIgLXAgL2V0Yy9jb250YWluZXJzLwogICAgbWtkaXIgLXAgL3Jvb3QvLmRvY2tlcgogICAgdG91Y2ggL2V0Yy9jb250YWluZXJzL25vZG9ja2VyCgogICAgIyBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUgY2FzZSB0aGF0IGF6IGFjciBsb2dpbiBzZWFyY2hlcyBmb3IgdGhpcyBpbiBpdCdzIGVudmlyb25tZW50CiAgICBleHBvcnQgUkVHSVNUUllfQVVUSF9GSUxFPSIvcm9vdC8uZG9ja2VyL2NvbmZpZy5qc29uIgogICAgCiAgICBpZiBbIC1uICIke3JlZ2lzdHJ5X2NvbmZ9IiBdOyB0aGVuCiAgICAgICAgd3JpdGVfZmlsZSBSRUdJU1RSWV9BVVRIX0ZJTEUgcmVnaXN0cnlfY29uZiB0cnVlCiAgICBmaQoKICAgIGxvZyAibG9nZ2luZyBpbnRvIHByb2QgYWNyIgogICAgaWYgJGF6X2xvZ2luOyB0aGVuCiAgICAgICAgY21kPSgKICAgICAgICAgICAgYXoKICAgICAgICAgICAgYWNyCiAgICAgICAgICAgIGxvZ2luCiAgICAgICAgICAgIC0tbmFtZQogICAgICAgICAgICAiJChzZWQgLWUgJ3N8LiovfHwnIDw8PCIkQUNSUkVTT1VSQ0VJRCIpIgogICAgICAgICkKCiAgICAgICAgbG9nICJSdW5uaW5nIGF6IGxvZ2luIHdpdGggcmV0cmllcyIKICAgICAgICByZXRyeSBjbWQgcmV0cnlfdGltZQogICAgZmkKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBpIGluICR7cHVsbF9pbWFnZXNbQF19OyBkbwogICAgICAgIGxvY2FsIC1uIGltYWdlPSIkaSIKICAgICAgICBjbWQ9KAogICAgICAgICAgICBwb2RtYW4KICAgICAgICAgICAgcHVsbAogICAgICAgICAgICAiJGltYWdlIgogICAgICAgICkKCiAgICAgICAgbG9nICJQdWxsaW5nIGltYWdlICRpbWFnZSB3aXRoIHJldHJpZXMgbm93IgogICAgICAgIHJldHJ5IGNtZCByZXRyeV90aW1lCiAgICBkb25lCgogICAgaWYgJGF6X2xvZ2luOyB0aGVuCiAgICAgICAgY21kPSgKICAgICAgICAgICAgYXoKICAgICAgICAgICAgbG9nb3V0CiAgICAgICAgKQoKICAgICAgICBsb2cgIlJ1bm5pbmcgYXogbG9nb3V0IHdpdGggcmV0cmllcyIKICAgICAgICByZXRyeSBjbWQgcmV0cnlfdGltZQogICAgZmkKfQoKIyBjb25maWd1cmVfZGlza19wYXJ0aXRpb25zCmNvbmZpZ3VyZV9kaXNrX3BhcnRpdGlvbnMoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJleHRlbmRpbmcgcGFydGl0aW9uIHRhYmxlIgoKICAgICMgTGludXggYmxvY2sgZGV2aWNlcyBhcmUgaW5jb25zaXN0ZW50bHkgbmFtZWQKICAgICMgaXQncyBkaWZmaWN1bHQgdG8gdGllIHRoZSBsdm0gcHYgdG8gdGhlIHBoeXNpY2FsIGRpc2sgdXNpbmcgL2Rldi9kaXNrIGZpbGVzLCB3aGljaCBpcyB3aHkgbHZzIGlzIHVzZWQgaGVyZQogICAgbG9jYWwgLXIgcGh5c2ljYWxfZGlzaz0iJChsdnMgLW8gZGV2aWNlcyAtYSB8IGhlYWQgLW4yIHwgdGFpbCAtbjEgfCBjdXQgLWQgJyAnIC1mIDMgfCBjdXQgLWQgXCggLWYgMSB8IHRyIC1kICdbOmRpZ2l0Ol0nKSIKICAgIGdyb3dwYXJ0ICIkcGh5c2ljYWxfZGlzayIgMgoKICAgIGxvZyAiZXh0ZW5kaW5nIGZpbGVzeXN0ZW1zIgogICAgbG9nICJleHRlbmRpbmcgcm9vdCBsdm0iCiAgICBsdmV4dGVuZCAtbCArMjAlRlJFRSAvZGV2L3Jvb3R2Zy9yb290bHYKICAgIGxvZyAiZ3Jvd2luZyByb290IGZpbGVzeXN0ZW0iCiAgICB4ZnNfZ3Jvd2ZzIC8KCiAgICBsb2cgImV4dGVuZGluZyB2YXIgbHZtIgogICAgbHZleHRlbmQgLWwgKzEwMCVGUkVFIC9kZXYvcm9vdHZnL3Zhcmx2CiAgICBsb2cgImdyb3dpbmcgdmFyIGZpbGVzeXN0ZW0iCiAgICB4ZnNfZ3Jvd2ZzIC92YXIKfQoKIyBjb25maWd1cmVfY2VydHMKIyBhcmdzOgojIDEpIHJvbGUgLSBzdHJpbmc7IGNhbiBiZSAiZGV2cHJveHkiIG9yICJycCIKY29uZmlndXJlX2NlcnRzKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBjZXJ0aWZpY2F0ZXMgZm9yICRyb2xlIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUgdHJ1ZQoKICAgIGlmIFsgIiRyb2xlIiA9PSAiZGV2cHJveHkiIF07IHRoZW4KICAgICAgICBsb2NhbCAtciBwcm94eV9jZXJ0c19iYXNlZGlyPSIvZXRjL3Byb3h5IgogICAgICAgIG1rZGlyIC1wICIkcHJveHlfY2VydHNfYmFzZWRpciIKICAgICAgICBiYXNlNjQgLWQgPDw8IiRQUk9YWUNFUlQiID4gIiRwcm94eV9jZXJ0c19iYXNlZGlyL3Byb3h5LmNydCIKICAgICAgICBiYXNlNjQgLWQgPDw8IiRQUk9YWUtFWSIgPiAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHkua2V5IgogICAgICAgIGJhc2U2NCAtZCA8PDwiJFBST1hZQ0xJRU5UQ0VSVCIgPiAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHktY2xpZW50LmNydCIKICAgICAgICBjaG93biAtUiAxMDAwOjEwMDAgL2V0Yy9wcm94eQogICAgICAgIGNobW9kIDA2MDAgIiRwcm94eV9jZXJ0c19iYXNlZGlyL3Byb3h5LmtleSIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICBpZiBbICIkcm9sZSIgPT0gInJwIiBdOyB0aGVuCiAgICAgICAgbG9jYWwgLXIgcnBfY2VydHNfYmFzZWRpcj0iL2V0Yy9hcm8tcnAiCiAgICAgICAgbWtkaXIgLXAgIiRycF9jZXJ0c19iYXNlZGlyIgogICAgICAgIGJhc2U2NCAtZCA8PDwiJEFETUlOQVBJQ0FCVU5ETEUiID4gIiRycF9jZXJ0c19iYXNlZGlyL2FkbWluLWNhLWJ1bmRsZS5wZW0iCiAgICAgICAgaWYgW1sgLW4gIiRBUk1BUElDQUJVTkRMRSIgXV07IHRoZW4KICAgICAgICBiYXNlNjQgLWQgPDw8IiRBUk1BUElDQUJVTkRMRSIgPiAiJHJwX2NlcnRzX2Jhc2VkaXIvYXJtLWNhLWJ1bmRsZS5wZW0iCiAgICAgICAgZmkKICAgICAgICBjaG93biAtUiAxMDAwOjEwMDAgIiRycF9jZXJ0c19iYXNlZGlyIgogICAgZmkKCiAgICAjIHNldHRpbmcgTU9OSVRPUklOR19HQ1NfQVVUSF9JRF9UWVBFPUF1dGhLZXlWYXVsdCBzZWVtcyB0byBoYXZlIGNhdXNlZCBtZHNkIG5vdAogICAgIyB0byBob25vdXIgU1NMX0NFUlRfRklMRSBhbnkgbW9yZSwgaGVhdmVuIG9ubHkga25vd3Mgd2h5LgogICAgbG9jYWwgLXIgc3NsX2NlcnRzX2Jhc2VkaXI9Ii91c3IvbGliL3NzbC9jZXJ0cyIKICAgIG1rZGlyIC1wICIkc3NsX2NlcnRzX2Jhc2VkaXIiCiAgICBjc3BsaXQgLWYgIiRzc2xfY2VydHNfYmFzZWRpci9jZXJ0LSIgLWIgJTAzZC5wZW0gL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQgL14kLzEgInsqfSIgMT4vZGV2L251bGwKICAgIGNfcmVoYXNoICIkc3NsX2NlcnRzX2Jhc2VkaXIiCgogICAgIyB3ZSBsZWF2ZSBjbGllbnRJZCBibGFuayBhcyBsb25nIGFzIG9ubHkgMSBtYW5hZ2VkIGlkZW50aXR5IGFzc2lnbmVkIHRvIHZtc3MKICAgICMgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gMSwgd2Ugd2lsbCBuZWVkIHRvIHBvcHVsYXRlIHdpdGggY2xpZW50SWQgdXNlZCBmb3Igb2ZmLW5vZGUgc2Nhbm5pbmcKICAgIGxvY2FsIC1yIG5vZGVzY2FuX2FnZW50X2ZpbGVuYW1lPSIvZXRjL2RlZmF1bHQvdnNhLW5vZGVzY2FuLWFnZW50LmNvbmZpZyIKICAgIGxvY2FsIC1yIG5vZGVzY2FuX2FnZW50X2ZpbGU9InsKICAgIFwiTmljZVwiOiAxOSwKICAgIFwiVGltZW91dFwiOiAxMDgwMCwKICAgIFwiQ2xpZW50SWRcIjogXCJcIiwKICAgIFwiVGVuYW50SWRcIjogJEFaVVJFU0VDUEFDS1ZTQVRFTkFOVElELAogICAgXCJRdWFseXNTdG9yZUJhc2VVcmxcIjogJEFaVVJFU0VDUEFDS1FVQUxZU1VSTCwKICAgIFwiUHJvY2Vzc1RpbWVvdXRcIjogMzAwLAogICAgXCJDb21tYW5kRGVsYXlcIjogMAogIH0iCgogICAgd3JpdGVfZmlsZSBub2Rlc2Nhbl9hZ2VudF9maWxlbmFtZSBub2Rlc2Nhbl9hZ2VudF9maWxlIHRydWUKfQoKIyBydW5fYXpzZWNkX2NvbmZpZ19zY2FuCnJ1bl9henNlY2RfY29uZmlnX3NjYW4oKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1hciBjb25maWdzPSgKICAgICAgICAiYmFzZWxpbmUiCiAgICAgICAgImNsYW1hdiIKICAgICAgICAic29mdHdhcmUiCiAgICApCgogICAgbG9nICJTY2FubmluZyBjb25maWd1cmF0aW9uIGZpbGVzIHdpdGggYXpzZWNkICR7Y29uZmlnc1sqXX0iCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBzY2FuIGluICR7Y29uZmlnc1tAXX07IGRvCiAgICAgICAgbG9nICJTY2FubmluZyBjb25maWcgZmlsZSAkc2NhbiBub3ciCiAgICAgICAgL3Vzci9sb2NhbC9iaW4vYXpzZWNkIGNvbmZpZyAtcyAiJHNjYW4iIC1kIFAxRAogICAgZG9uZQp9CgojIGNyZWF0ZV9yZXF1aXJlZF9kaXJzCmNyZWF0ZV9yZXF1aXJlZF9kaXJzKCkgewogICAgY3JlYXRlX2RpcnM9KAogICAgICAgIC92YXIvbG9nL2pvdXJuYWwKICAgICAgICAvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZQogICAgICAgICMgRG9lcyBub3QgZXhpc3Qgb24gZGV2UHJveHlWTVNTCiAgICAgICAgL3Zhci9vcHQvbWljcm9zb2Z0L2xpbnV4bW9uYWdlbnQKICAgICkKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBkIGluICR7Y3JlYXRlX2RpcnNbQF19OyBkbwogICAgICAgIGxvZyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICRkIgogICAgICAgIG1rZGlyIC1wICIkZCIgfHwgYWJvcnQgImZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICRkIgogICAgZG9uZQp9CgojU3RhcnQgb2YgcnBWTVNTLnNoCiMhL2Jpbi9iYXNoCgpzZXQgLW8gZXJyZXhpdCBcCiAgICAtbyBub3Vuc2V0CgppZiBbICIke0RFQlVHOi1mYWxzZX0iID09IHRydWUgXTsgdGhlbgogICAgc2V0IC14CmZpCgptYWluKCkgewogICAgIyB0cmFuc2FjdGlvbiBhdHRlbXB0IHJldHJ5IHRpbWUgaW4gc2Vjb25kcwogICAgbG9jYWwgLXJpIHJldHJ5X3dhaXRfdGltZT0zMAogICAgbG9jYWwgLXJpIHBrZ19yZXRyeV9jb3VudD02MAoKICAgIGNyZWF0ZV9yZXF1aXJlZF9kaXJzCiAgICBjb25maWd1cmVfc3NoZAogICAgY29uZmlndXJlX3JwbV9yZXBvcyByZXRyeV93YWl0X3RpbWUgIiRwa2dfcmV0cnlfY291bnQiCgogICAgbG9jYWwgLWFyIGV4Y2x1ZGVfcGtncz0oCiAgICAgICAgIi14IFdBTGludXhBZ2VudCIKICAgICAgICAiLXggV0FMaW51eEFnZW50LXVkZXYiCiAgICApCgogICAgZG5mX3VwZGF0ZV9wa2dzIGV4Y2x1ZGVfcGtncyByZXRyeV93YWl0X3RpbWUgIiRwa2dfcmV0cnlfY291bnQiCgogICAgbG9jYWwgLXJhIHJwbV9rZXlzPSgKICAgICAgICBodHRwczovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsL1JQTS1HUEctS0VZLUVQRUwtOAogICAgICAgIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MKICAgICkKCiAgICBycG1faW1wb3J0X2tleXMgcnBtX2tleXMgcmV0cnlfd2FpdF90aW1lICIkcGtnX3JldHJ5X2NvdW50IgoKICAgIGxvY2FsIC1yYSByZXBvX3JwbV9wa2dzPSgKICAgICAgICBodHRwczovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsL2VwZWwtcmVsZWFzZS1sYXRlc3QtOC5ub2FyY2gucnBtCiAgICApCgogICAgZG5mX2luc3RhbGxfcGtncyByZXBvX3JwbV9wa2dzIHJldHJ5X3dhaXRfdGltZSAiJHBrZ19yZXRyeV9jb3VudCIKCiAgICBsb2NhbCAtcmEgaW5zdGFsbF9wa2dzPSgKICAgICAgICBhdAogICAgICAgIGNsYW1hdgogICAgICAgIGF6c2VjLWNsYW1hdgogICAgICAgIGF6c2VjLW1vbml0b3IKICAgICAgICBhenVyZS1jbGkKICAgICAgICBhenVyZS1tZHNkCiAgICAgICAgYXp1cmUtc2VjdXJpdHkKICAgICAgICBwb2RtYW4KICAgICAgICBwb2RtYW4tZG9ja2VyCiAgICAgICAgb3BlbnNzbC1wZXJsCiAgICAgICAgIyBoYWNrIC0gd2UgYXJlIGluc3RhbGxpbmcgcHl0aG9uMyBvbiBob3N0cyBkdWUgdG8gYW4gaXNzdWUgd2l0aCBBenVyZSBMaW51eCBFeHRlbnNpb25zIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZS9henVyZS1saW51eC1leHRlbnNpb25zL3B1bGwvMTUwNQogICAgICAgIHB5dGhvbjMKICAgICkKCiAgICBkbmZfaW5zdGFsbF9wa2dzIGluc3RhbGxfcGtncyByZXRyeV93YWl0X3RpbWUgIiRwa2dfcmV0cnlfY291bnQiCiAgICBjb25maWd1cmVfZG5mX2Nyb25fam9iCiAgICBjb25maWd1cmVfZGlza19wYXJ0aXRpb25zCgogICAgIyBLZXkgZGljdGF0ZXMgdGhlIGZpbGVuYW1lIHdyaXR0ZW4gaW4gL2V0Yy9sb2dyb3RhdGUuZAogICAgIyBsb2NhbCAtckEgbG9ncm90YXRlX2Ryb3BpbnM9KCkKICAgIGNvbmZpZ3VyZV9sb2dyb3RhdGUKICAgIGNvbmZpZ3VyZV9zZWxpbnV4CgogICAgbG9jYWwgLXJhIGVuYWJsZV9wb3J0cz0oCiAgICAgICAgIjQ0My90Y3AiCiAgICAgICAgIjQ0NC90Y3AiCiAgICAgICAgIjIyMjIvdGNwIgogICAgKQoKICAgIGNvbmZpZ3VyZV9maXJld2FsbGRfcnVsZXMgZW5hYmxlX3BvcnRzCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMTUzCiAgICBsb2NhbCAtciBtZG1pbWFnZT0iJHtSUElNQUdFJSUvKn0vJHtNRE1JTUFHRSMqL30iCiAgICBsb2NhbCAtciBycGltYWdlPSIkUlBJTUFHRSIKICAgIGxvY2FsIC1yIGZsdWVudGJpdF9pbWFnZT0iJEZMVUVOVEJJVElNQUdFIgogICAgbG9jYWwgLXJBIGFyb19pbWFnZXM9KAogICAgICAgIFsibWRtIl09Im1kbWltYWdlIgogICAgICAgIFsicnAiXT0icnBpbWFnZSIKICAgICAgICBbImZsdWVudGJpdCJdPSJmbHVlbnRiaXRfaW1hZ2UiCiAgICApCiAgICBwdWxsX2NvbnRhaW5lcl9pbWFnZXMgYXJvX2ltYWdlcyB0cnVlCgogICAgIyBMT0dLSU5EIGFwcGVhcnMgdG8gbm8gbG9uZ2VyIGJlIGEgdmFyaWFibGUgdGhhdCBpcyBjYXJyaWVkIG92ZXIgYnkgdGhlIGRlcGxveSBwaXBlbGluZQogICAgIyBTdWJzdGl0dXRpbmcgaXQgd2l0aCBhbiBlbXB0eSBzdHJpbmcKICAgIGxvY2FsIC1yIGZsdWVudGJpdF9jb25mX2ZpbGU9IltJTlBVVF0KTmFtZSBzeXN0ZW1kClRhZyBqb3VybmFsZApTeXN0ZW1kX0ZpbHRlciBfQ09NTT1hcm8KREIgL3Zhci9saWIvZmx1ZW50L2pvdXJuYWxkYgoKW0ZJTFRFUl0KCU5hbWUgbW9kaWZ5CglNYXRjaCBqb3VybmFsZAoJUmVtb3ZlX3dpbGRjYXJkIF8KCVJlbW92ZSBUSU1FU1RBTVAKCltGSUxURVJdCglOYW1lIHJld3JpdGVfdGFnCglNYXRjaCBqb3VybmFsZAoJUnVsZSAke0xPR0tJTkQ6LX0gYXN5bmNxb3MgYXN5bmNxb3MgdHJ1ZQoKW0ZJTFRFUl0KCU5hbWUgbW9kaWZ5CglNYXRjaCBhc3luY3FvcwoJUmVtb3ZlIENMSUVOVF9QUklOQ0lQQUxfTkFNRQoJUmVtb3ZlIEZJTEUKCVJlbW92ZSBDT01QT05FTlQKCltGSUxURVJdCglOYW1lIHJld3JpdGVfdGFnCglNYXRjaCBqb3VybmFsZAoJUnVsZSAke0xPR0tJTkQ6LX0gaWZ4YXVkaXQgaWZ4YXVkaXQgZmFsc2UKCltPVVRQVVRdCglOYW1lIGZvcndhcmQKCU1hdGNoICoKCVBvcnQgMjkyMzAiCgoKICAgIGxvY2FsIC1yIG1kc2RfY29uZmlnX3ZlcnNpb249IiRSUE1EU0RDT05GSUdWRVJTSU9OIgogICAgbG9jYWwgLXIgYXJvX3JwX2NvbmZfZmlsZT0iQUNSX1JFU09VUkNFX0lEPSckQUNSUkVTT1VSQ0VJRCcKQURNSU5fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FPSckQURNSU5BUElDTElFTlRDRVJUQ09NTU9OTkFNRScKQVJNX0FQSV9DTElFTlRfQ0VSVF9DT01NT05fTkFNRT0nJEFSTUFQSUNMSUVOVENFUlRDT01NT05OQU1FJwpBWlVSRV9BUk1fQ0xJRU5UX0lEPSckQVJNQ0xJRU5USUQnCkFaVVJFX0ZQX0NMSUVOVF9JRD0nJEZQQ0xJRU5USUQnCkFaVVJFX0ZQX1NFUlZJQ0VfUFJJTkNJUEFMX0lEPSckRlBTRVJWSUNFUFJJTkNJUEFMSUQnCkNMVVNURVJfTURNX0FDQ09VTlQ9JyRDTFVTVEVSTURNQUNDT1VOVCcKQ0xVU1RFUl9NRE1fTkFNRVNQQUNFPVJQCkNMVVNURVJfTURTRF9BQ0NPVU5UPSckQ0xVU1RFUk1EU0RBQ0NPVU5UJwpDTFVTVEVSX01EU0RfQ09ORklHX1ZFUlNJT049JyRDTFVTVEVSTURTRENPTkZJR1ZFUlNJT04nCkNMVVNURVJfTURTRF9OQU1FU1BBQ0U9JyRDTFVTVEVSTURTRE5BTUVTUEFDRScKREFUQUJBU0VfQUNDT1VOVF9OQU1FPSckREFUQUJBU0VBQ0NPVU5UTkFNRScKRE9NQUlOX05BTUU9JyRMT0NBVElPTi4kQ0xVU1RFUlBBUkVOVERPTUFJTk5BTUUnCkdBVEVXQVlfRE9NQUlOUz0nJEdBVEVXQVlET01BSU5TJwpHQVRFV0FZX1JFU09VUkNFR1JPVVA9JyRHQVRFV0FZUkVTT1VSQ0VHUk9VUE5BTUUnCktFWVZBVUxUX1BSRUZJWD0nJEtFWVZBVUxUUFJFRklYJwpNRE1fQUNDT1VOVD0nJFJQTURNQUNDT1VOVCcKTURNX05BTUVTUEFDRT0nJHtyb2xlX3JwXl59JwpNRFNEX0VOVklST05NRU5UPSckTURTREVOVklST05NRU5UJwpSUF9GRUFUVVJFUz0nJFJQRkVBVFVSRVMnClJQSU1BR0U9JyRycGltYWdlJwpBUk9fSU5TVEFMTF9WSUFfSElWRT0nJENMVVNURVJTSU5TVEFMTFZJQUhJVkUnCkFST19ISVZFX0RFRkFVTFRfSU5TVEFMTEVSX1BVTExTUEVDPSckQ0xVU1RFUkRFRkFVTFRJTlNUQUxMRVJQVUxMU1BFQycKQVJPX0FET1BUX0JZX0hJVkU9JyRDTFVTVEVSU0FET1BUQllISVZFJwpVU0VfQ0hFQ0tBQ0NFU1M9JyRVU0VDSEVDS0FDQ0VTUycKT0lEQ19BRkRfRU5EUE9JTlQ9JyRMT0NBVElPTi5vaWMuJFJQUEFSRU5URE9NQUlOTkFNRScKT0lEQ19TVE9SQUdFX0FDQ09VTlRfTkFNRT0nJE9JRENTVE9SQUdFQUNDT1VOVE5BTUUnCiIKCiAgICAjIHZhbHVlcyBhcmUgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMsIHRoZXkgc2hvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQgaGVyZQogICAgbG9jYWwgLXJBIGFyb19jb25maWdzPSgKICAgICAgICBbInJwX2NvbmZpZyJdPSJhcm9fcnBfY29uZl9maWxlIgogICAgICAgIFsiZmx1ZW50Yml0Il09ImZsdWVudGJpdF9jb25mX2ZpbGUiCiAgICAgICAgWyJtZHNkIl09Im1kc2RfY29uZmlnX3ZlcnNpb24iCiAgICApCgogICAgY29uZmlndXJlX3Ztc3NfYXJvX3NlcnZpY2VzIHJvbGVfcnAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyb19pbWFnZXMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyb19jb25maWdzCgogICAgbG9jYWwgLXJhIGFyb19zZXJ2aWNlcz0oCiAgICAgICAgImFyby1tb25pdG9yIgogICAgICAgICJhcm8tcG9ydGFsIgogICAgICAgICJhcm8tcnAiCiAgICAgICAgImF1b21zIgogICAgICAgICJhenNlY2QiCiAgICAgICAgImF6c2VjbW9uZCIKICAgICAgICAibWRzZCIKICAgICAgICAibWRtIgogICAgICAgICJjaHJvbnlkIgogICAgICAgICJmbHVlbnRiaXQiCiAgICAgICAgImRvd25sb2FkLW1kc2QtY3JlZGVudGlhbHMudGltZXIiCiAgICAgICAgImRvd25sb2FkLW1kbS1jcmVkZW50aWFscy50aW1lciIKICAgICkKCiAgICBlbmFibGVfc2VydmljZXMgYXJvX3NlcnZpY2VzCgogICAgcmVib290X3ZtCn0KCmV4cG9ydCBBWlVSRV9DTE9VRF9OQU1FPSIke0FaVVJFQ0xPVUROQU1FOj8iRmFpbGVkIHRvIGNhcnJ5IG92ZXIgdmFyaWFibGVzIn0iCgojIHV0aWwuc2ggZG9lcyBub3QgZXhpc3Qgd2hlbiBkZXBsb3llZCB0byBWTVNTIHZpYSBWTVNTIGV4dGVuc2lvbnMKIyBUaGlzIGlzIGJlY2F1c2UgY29tbW9uVk1TUy5zaCBpcyBjb25jYXRlbmF0ZWQgd2l0aCB0aGlzIHNjcmlwdAp1dGlsPSJ1dGlsLnNoIgppZiBbIC1mICIkdXRpbCIgXTsgdGhlbgogICAgIyBzaGVsbGNoZWNrIHNvdXJjZT11dGlsLnNoCiAgICBzb3VyY2UgIiR1dGlsIgpmaQoKbWFpbiAiJEAiCg==')))]" + "script": "[base64(concat(base64ToString('c2V0IC1leAoK'),'ACRRESOURCEID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('acrResourceId')),''')\n','ADMINAPICLIENTCERTCOMMONNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('adminApiClientCertCommonName')),''')\n','ARMAPICLIENTCERTCOMMONNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('armApiClientCertCommonName')),''')\n','ARMCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('armClientId')),''')\n','AZURECLOUDNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureCloudName')),''')\n','AZURESECPACKQUALYSURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackQualysUrl')),''')\n','AZURESECPACKVSATENANTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('azureSecPackVSATenantId')),''')\n','CLUSTERMDMACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdmAccount')),''')\n','CLUSTERMDSDACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdsdAccount')),''')\n','CLUSTERMDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdsdConfigVersion')),''')\n','CLUSTERMDSDNAMESPACE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterMdsdNamespace')),''')\n','CLUSTERPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterParentDomainName')),''')\n','DATABASEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('databaseAccountName')),''')\n','FLUENTBITIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fluentbitImage')),''')\n','FPCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fpClientId')),''')\n','FPSERVICEPRINCIPALID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('fpServicePrincipalId')),''')\n','GATEWAYDOMAINS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayDomains')),''')\n','GATEWAYRESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayResourceGroupName')),''')\n','GATEWAYSERVICEPRINCIPALID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('gatewayServicePrincipalId')),''')\n','KEYVAULTDNSSUFFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultDNSSuffix')),''')\n','KEYVAULTPREFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultPrefix')),''')\n','MDMFRONTENDURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdmFrontendUrl')),''')\n','MDSDENVIRONMENT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdEnvironment')),''')\n','PORTALACCESSGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalAccessGroupIds')),''')\n','PORTALCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalClientId')),''')\n','PORTALELEVATEDGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalElevatedGroupIds')),''')\n','RPFEATURES=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpFeatures')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMDMACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdmAccount')),''')\n','RPMDSDACCOUNT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdAccount')),''')\n','RPMDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdConfigVersion')),''')\n','RPMDSDNAMESPACE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMdsdNamespace')),''')\n','RPPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpParentDomainName')),''')\n','OIDCSTORAGEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('oidcStorageAccountName')),''')\n','CLUSTERSINSTALLVIAHIVE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clustersInstallViaHive')),''')\n','CLUSTERSADOPTBYHIVE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clustersAdoptByHive')),''')\n','CLUSTERDEFAULTINSTALLERPULLSPEC=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterDefaultInstallerPullspec')),''')\n','ADMINAPICABUNDLE=''',parameters('adminApiCaBundle'),'''\n','ARMAPICABUNDLE=''',parameters('armApiCaBundle'),'''\n','MDMIMAGE=''/distroless/genevamdm:2.2024.626.1539-d1a6e7-20240715t0935@sha256:372fbc981bbfdf2b9a9d0ffdca2c51ed389b291a3bcff0401e9afb0c01605823''\n','LOCATION=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().location),''')\n','SUBSCRIPTIONID=$(base64 -d \u003c\u003c\u003c''',base64(subscription().subscriptionId),''')\n','RESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().name),''')\n','\n',base64ToString('IyEvYmluL2Jhc2gKIyBJbnRlcm5hbCBGdW5jdGlvbnMgYW5kIENvbnN0YW50cwoKIyBlbXB0eV9zdHIgLSBjb25zdGFudDsgdXNlZCBieSBmdW5jdGlvbnMgZm9yIG9wdGlvbmFsIG5hbWVyZWYgc3RyaW5nIGFyZ3VlbWVudHMKIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CmRlY2xhcmUgLXIgZW1wdHlfc3RyPSIiCgojIHJvbGVfZ2F0ZXdheSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBWTVNTIGlzIGJlaW5nIGJvb3RzdHJhcHBlZAojIHRoaXMgc2hvdWxkIGJlIHJlZmVyZW5jZWQgYnkgc2NyaXB0cyBzb3VyY2luZyB0aGlzIGZpbGUKZGVjbGFyZSAtciByb2xlX2dhdGV3YXk9ImdhdGV3YXkiCiMgcm9sZV9ycCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBWTVNTIGlzIGJlaW5nIGJvb3RzdHJhcHBlZAojIHRoaXMgc2hvdWxkIGJlIHJlZmVyZW5jZWQgYnkgc2NyaXB0cyBzb3VyY2luZyB0aGlzIGZpbGUKZGVjbGFyZSAtciByb2xlX3JwPSJycCIKCiMgbG9nIGlzIGEgd3JhcHBlciBmb3IgZWNobyB0aGF0IGluY2x1ZGVzIHRoZSBmdW5jdGlvbiBuYW1lCiMgQXJncwojIDEpIG1zZyAtIHN0cmluZwojIDIpIHN0YWNrX2xldmVsIC0gaW50OyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gY2FsbGluZyBmdW5jdGlvbgpsb2coKSB7CiAgICBsb2NhbCAtciBtc2c9IiR7MTotImxvZyBtZXNzYWdlIGlzIGVtcHR5In0iCiAgICBsb2NhbCAtciBzdGFja19sZXZlbD0iJHsyOi0xfSIKICAgIGVjaG8gIiR7RlVOQ05BTUVbJHtzdGFja19sZXZlbH1dfTogJHttc2d9Igp9CgojIGFib3J0IGlzIGEgd3JhcHBlciBmb3IgbG9nIHRoYXQgZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlCmFib3J0KCkgewogICAgbG9jYWwgLXJpIG9yaWdpbl9zdGFja2xldmVsPTIKICAgIGxvZyAiJHsxfSIgIiRvcmlnaW5fc3RhY2tsZXZlbCIKICAgIGxvZyAiRXhpdGluZyIKICAgIGV4aXQgMQp9CgojIHdyaXRlX2ZpbGUKIyBBcmdzCiMgMSkgZmlsZW5hbWUgLSBzdHJpbmcKIyAyKSBmaWxlX2NvbnRlbnRzIC0gc3RyaW5nCiMgMykgY2xvYmJlciAtIGJvb2xlYW47IG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gZmFsc2UKd3JpdGVfZmlsZSgpIHsKICAgIGxvY2FsIC1uIGZpbGVuYW1lPSIkMSIKICAgIGxvY2FsIC1uIGZpbGVfY29udGVudHM9IiQyIgogICAgbG9jYWwgLXIgY2xvYmJlcj0iJHszOi1mYWxzZX0iCgogICAgaWYgJGNsb2JiZXI7IHRoZW4KICAgICAgICBsb2cgIk92ZXJ3cml0aW5nIGZpbGUgJGZpbGVuYW1lIgogICAgICAgIGVjaG8gIiRmaWxlX2NvbnRlbnRzIiA+ICIkZmlsZW5hbWUiCiAgICBlbHNlCiAgICAgICAgbG9nICJBcHBlbmRpbmcgdG8gJGZpbGVuYW1lIgogICAgICAgIGVjaG8gIiRmaWxlX2NvbnRlbnRzIiA+PiAiJGZpbGVuYW1lIgogICAgZmkKfQoKIyByZXRyeSBBZGRpbmcgcmV0cnkgbG9naWMgdG8geXVtIGNvbW1hbmRzIGluIG9yZGVyIHRvIGF2b2lkIHN0YWxsaW5nIG91dCBvbiByZXNvdXJjZSBsb2NrcwojIGFyZ3M6CiMgMSkgY21kX3JldHJ5IC0gbmFtZXJlZiwgYXJyYXk7IENvbW1hbmQgYW5kIGFyZ3VlbWVudChzKSB0byByZXRyeQojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZAojIDMpIHJldHJpZXMgLSBpbnRlZ2VyLCBvcHRpb25hbDsgQW1tb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CnJldHJ5KCkgewogICAgbG9jYWwgLW4gY21kX3JldHJ5PSIkMSIKICAgIGxvY2FsIC1uIHdhaXRfdGltZT0iJDIiCiAgICBsb2NhbCAtcmkgcmV0cmllcz0iJHszOi01fSIKCiAgICBmb3IgYXR0ZW1wdCBpbiB7MS4uNX07IGRvCiAgICAgICAgbG9nICJhdHRlbXB0ICMke2F0dGVtcHR9IC0gJHtGVU5DTkFNRVsyXX0iCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICAgICAgJHtjbWRfcmV0cnlbQF19ICYKCiAgICAgICAgd2FpdCAkISAmJiBicmVhawogICAgICAgIGlmIFsgIiR7YXR0ZW1wdH0iIC1sZSAiJHJldHJpZXMiIF07IHRoZW4KICAgICAgICAgICAgc2xlZXAgIiR3YWl0X3RpbWUiCiAgICAgICAgZWxzZQogICAgICAgICAgICBhYm9ydCAiYXR0ZW1wdCAjJHthdHRlbXB0fSAtIEZhaWxlZCB0byB1cGRhdGUgcGFja2FnZXMiCiAgICAgICAgZmkKICAgIGRvbmUKfQoKIyB2ZXJpZnlfcm9sZQojIGFyZ3M6CiMgMSkgdGVzdF9yb2xlIC0gbmFtZXJlZjsgcm9sZSBiZWluZyB2ZXJpZmllZAojIDIpIGNlcnRzIC0gYm9vbGVhbiwgb3B0aW9uYWw7IGRlZmF1bHRzIHRvIGZhbHNlLiBTZXQgdG8gdHJ1ZSB0byBhZGQgZGV2cHJveHkgdG8gYWxsb3dlZCByb2xlcwp2ZXJpZnlfcm9sZSgpIHsKICAgIGxvY2FsIC1uIHRlc3Rfcm9sZT0iJDEiCiAgICBsb2NhbCAtciBjZXJ0cz0iJHsyOi1mYWxzZX0iCgogICAgYWxsb3dlZF9yb2xlc19nbG9iPSIoJHJvbGVfcnB8JHJvbGVfZ2F0ZXdheSkiCiAgICBpZiAkY2VydHM7IHRoZW4KICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyAiKSIgYW5kIGFwcGVuZCBhZGRpdGlvbmFsIHJvbGUKICAgICAgICBhbGxvd2VkX3JvbGVzX2dsb2I9IiR7YWxsb3dlZF9yb2xlc19nbG9iJVwpKn18ZGV2cHJveHkpIgogICAgZmkKCiAgICBpZiBbWyAiJHRlc3Rfcm9sZSIgPX4gJGFsbG93ZWRfcm9sZXNfZ2xvYiBdXTsgdGhlbgogICAgICAgIGxvZyAiVmVyaWZpZWQgcm9sZSBcIiR0ZXN0X3JvbGVcIiIKICAgIGVsc2UKICAgICAgICBhYm9ydCAiZmFpbGVkIHRvIHZlcmlmeSByb2xlLCByb2xlIFwiJHt0ZXN0X3JvbGV9XCIgbm90IGluIFwiJHthbGxvd2VkX3JvbGVzX2dsb2J9XCIiCiAgICBmaQp9CgojIGdldF9rZXl2YXVsdF9zdWZmaXgKIyBhcmdzOgojIDEpIHJsIC0gbmFtZXJlZiwgc3RyaW5nOyByb2xlIHRvIGdldCBzaG9ydCByb2xlIGZvcgojIDIpIGt2X3N1ZmZpeCAtIG5hbWVyZWYsIHN0cmluZzsgc2hvcnQgcm9sZSB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoaXMgbmFtZXJlZgojIDMpIHNlY19wcmVmaXggLSBuYW1lcmVmLCBzdHJpbmc7IGtleXZhdWx0IGNlcnRpZmljYXRlIHByZWZpeCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoaXMgbmFtZXJlZgpnZXRfa2V5dmF1bHRfc3VmZml4KCkgewogICAgbG9jYWwgLW4gcmw9IiQxIgogICAgbG9jYWwgLW4ga3Zfc3VmZml4PSIkMiIKICAgIGxvY2FsIC1uIHNlY19wcmVmaXg9IiQzIgoKICAgIGxvY2FsIC1yIGtleXZhdWx0X3N1ZmZpeF9ycD0ic3ZjIgogICAgbG9jYWwgLXIga2V5dmF1bHRfcHJlZml4X2dhdGV3YXk9Imd3eSIKCiAgICBjYXNlICIkcmwiIGluCiAgICAgICAgIiRyb2xlX2dhdGV3YXkiKQogICAgICAgICAgICBrdl9zdWZmaXg9IiRrZXl2YXVsdF9wcmVmaXhfZ2F0ZXdheSIKICAgICAgICAgICAgc2VjX3ByZWZpeD0iJGtleXZhdWx0X3ByZWZpeF9nYXRld2F5IgogICAgICAgICAgICA7OwogICAgICAgICIkcm9sZV9ycCIpCiAgICAgICAgICAgIGt2X3N1ZmZpeD0iJGtleXZhdWx0X3N1ZmZpeF9ycCIKICAgICAgICAgICAgc2VjX3ByZWZpeD0iJHJvbGVfcnAiCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgYWJvcnQgInVua293biByb2xlICRybCIKICAgICAgICAgICAgOzsKICAgIGVzYWMKfQoKIyByZWJvb3Rfdm0gcmVzdG9yZXMgYWxsIHNlbGludXggZmlsZSBjb250ZXh0cywgdGhlbiBzY2hlZHVsZXMgYSByZWJvb3QgZm9yIG9uZSBob3VyIGxhdGVyCiMgUmVib290cyBzaG91bGQgc2NoZWR1bGVkIGFmdGVyIGFsbCBWTSBleHRlbnNpb25zIGhhdmUgaGFkIHRpbWUgdG8gY29tcGxldGUKIyBSZWZlcmVuY2U6IGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS92aXJ0dWFsLW1hY2hpbmVzL2V4dGVuc2lvbnMvY3VzdG9tLXNjcmlwdC1saW51eCN0aXBzCnJlYm9vdF92bSgpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgKHNodXRkb3duIC1yIG5vdyAmKQp9CiMhL2Jpbi9iYXNoCiMgUmVwb3NpdG9yeSBhbmQgcGFja2FnZSBtYW5hZ2VtZW50IHJlbGF0ZWQgZnVuY3Rpb25zCgpjb25maWd1cmVfcmVwb19tYXJpbmVyX2V4dGVuZGVkKCkgewogICAgbG9jYWwgLXIgZXh0ZW5kZWRfcmVwb19jb25maWc9Imh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9jYmwtbWFyaW5lci8yLjAvcHJvZC9leHRlbmRlZC94ODZfNjQvY29uZmlnLnJlcG8iCiAgICBjdXJsIC1zU0wgIiRleHRlbmRlZF9yZXBvX2NvbmZpZyIgLW8gL2V0Yy95dW0ucmVwb3MuZC9tYXJpbmVyLWV4dGVuZGVkLnJlcG8KCiAgICBsb2NhbCAtciByZXBvX25hbWU9ImNibC1tYXJpbmVyMi4wcHJvZGV4dGVuZGVkeDg2XzY0IgoKICAgIGxvY2FsIC1yYSBjbWQ9KAogICAgICAgIGRuZgogICAgICAgIHVwZGF0ZQogICAgICAgIC15CiAgICAgICAgLS1lbmFibGVyZXBvPSIkcmVwb19uYW1lIgogICAgKQoKICAgIGxvZyAiRW5hYmxpbmcgcmVwbyAkcmVwb19uYW1lIgogICAgcmV0cnkgY21kICIkMSIgIiR7MjotfSIKfQoKIyBjb25maWd1cmVfcnBtX3JlcG9zCiMgTmV3IHJlcG9zaXRvcmllcyBzaG91bGQgYmUgYWRkZWQgaW4gdGhlaXIgb3duIGZ1bmN0aW9ucywgYW5kIGNhbGxlZCBoZXJlCiMgYXJnczoKIyAxKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAyKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmNvbmZpZ3VyZV9ycG1fcmVwb3MoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGNvbmZpZ3VyZV9yZXBvX21hcmluZXJfZXh0ZW5kZWQgIiQxIiAiJHsyOi0xfSIKfQoKIyBkbmZfaW5zdGFsbF9wa2dzCiMgYXJnczoKIyAxKSBwa2dzIC0gbmFtZXJlZiwgc3RyaW5nIGFycmF5OyBQYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQKIyAyKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAzKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtb3VudCBvZiB0aW1lcyB0byByZXRyeSBjb21tYW5kLCBkZWZhdWx0cyB0byA1CmRuZl9pbnN0YWxsX3BrZ3MoKSB7CiAgICBsb2NhbCAtbiBwa2dzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9jYWwgLWEgY21kPSgKICAgICAgICBkbmYKICAgICAgICAteQogICAgICAgIGluc3RhbGwKICAgICkKICAgIAogICAgIyBSZWZlcmVuY2U6IGh0dHBzOi8vd3d3LnNoZWxsY2hlY2submV0L3dpa2kvU0MyMjA2CiAgICAjIGFwcGVuZCBwa2dzIGFycmF5IHRvIGNtZAogICAgbWFwZmlsZSAtTyAkKCggJHsjY21kW0BdfSArIDEgKSkgLWQgJyAnIGNtZCA8PDwgIiR7cGtnc1tAXX0iCiAgICBsb2NhbCAtciBjbWQKCiAgICBsb2cgIkF0dGVtcHRpbmcgdG8gaW5zdGFsbCBwYWNrYWdlczogJHtwa2dzWypdfSIKICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iCn0KCgojIGRuZl91cGRhdGVfcGtncwojIGFyZ3M6CiMgMSkgZXhjbHVkZXMgLSBuYW1lcmVmLCBzdHJpbmcgYXJyYXksIG9wdGlvbmFsOyBQYWNrYWdlcyB0byBleGNsdWRlIGZyb20gdXBkYXRpbmcKIyAgICAgICBFYWNoIGluZGV4IG11c3QgYmUgcHJlZml4ZWQgd2l0aCAteCAKIyAyKSB3YWl0X3RpbWUgLSBuYW1lcmVmLCBpbnRlZ2VyOyBUaW1lIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGNvbW1hbmQKIyAzKSByZXRyaWVzIC0gaW50ZWdlciwgb3B0aW9uYWw7IEFtbW91bnQgb2YgdGltZXMgdG8gcmV0cnkgY29tbWFuZCwgZGVmYXVsdHMgdG8gNQpkbmZfdXBkYXRlX3BrZ3MoKSB7CiAgICBsb2NhbCAtbiBleGNsdWRlcz0iJHsxOi1lbXB0eV9zdHJ9IgogICAgbG9nICJzdGFydGluZyIKCiAgICBsb2NhbCAtYSBjbWQ9KAogICAgICAgIGRuZgogICAgICAgIC15CiAgICAgICAgIyBSZXBsYWNlZCB3aXRoIGV4Y2x1ZGVzCiAgICAgICAgIiIKICAgICAgICB1cGRhdGUKICAgICAgICAtLWFsbG93ZXJhc2luZwogICAgKQoKICAgIGlmIFsgLW4gIiR7ZXhjbHVkZXN9IiBdOyB0aGVuCiAgICAgICAgIyBSZWZlcmVuY2UgaHR0cHM6Ly93d3cuc2hlbGxjaGVjay5uZXQvd2lraS9TQzIyMDYKICAgICAgICBtYXBmaWxlIC1PIDIgY21kIDw8PCAiJHtleGNsdWRlc1tAXX0iCiAgICBlbHNlCiAgICAgICAgIyBSZW1vdmUgZW1wdHkgc3RyaW5nIGlmIHdlIGFyZW4ndCByZXBsYWNpbmcgdGhlbSwgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIsIGJ1dCB3aHkgbm90IGJlIHNhZmUKICAgICAgICB1bnNldCAiY21kWzJdIgogICAgZmkKICAgIGxvY2FsIC1yIGNtZAoKICAgIGxvZyAiVXBkYXRpbmcgYWxsIHBhY2thZ2VzIGV4Y2x1ZGluZyBcIiR7ZXhjbHVkZXNbKl06LX1cIiIKICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iCn0KCiMgY29uZmlndXJlX2RuZl9jcm9uX2pvYgojIGNyZWF0ZSBjcm9uIGpvYiB0byBhdXRvIHVwZGF0ZSBycG0gcGFja2FnZXMKY29uZmlndXJlX2RuZl9jcm9uX2pvYigpIHsKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2NhbCAtciBjcm9uX3dlZWtseV9kbmZfdXBkYXRlX2ZpbGVuYW1lPScvZXRjL2Nyb24ud2Vla2x5L2RuZnVwZGF0ZScKICAgIGxvY2FsIC1yIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZT0iIyEvYmluL2Jhc2gKZG5mIHVwZGF0ZSAteSIKCiAgICB3cml0ZV9maWxlIGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUgY3Jvbl93ZWVrbHlfZG5mX3VwZGF0ZV9maWxlIHRydWUKICAgIGNobW9kIHUreCAiJGNyb25fd2Vla2x5X2RuZl91cGRhdGVfZmlsZW5hbWUiCn0KCiMgcnBtX2ltcG9ydF9rZXlzCiMgYXJnczoKIyAxKSBrZXlzIC0gbmFtZXJlZiwgc3RyaW5nIGFycmF5OyBycG0ga2V5cyB0byBiZSBpbXBvcnRlZAojIDIpIHdhaXRfdGltZSAtIG5hbWVyZWYsIGludGVnZXI7IFRpbWUgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgY29tbWFuZApycG1faW1wb3J0X2tleXMoKSB7CiAgICBsb2NhbCAtbiBrZXlzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3Iga2V5IGluICR7a2V5c1tAXX07IGRvCiAgICAgICAgaWYgWyAkeyNrZXlzW0BdfSAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZmkKICAgICAgICAgICAgbG9jYWwgLWEgY21kPSgKICAgICAgICAgICAgICAgIHJwbQogICAgICAgICAgICAgICAgLS1pbXBvcnQKICAgICAgICAgICAgICAgIC12CiAgICAgICAgICAgICAgICAiJGtleSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgbG9nICJJbXBvcnRpbmcgcnBtIHJlcG9zaXRvcnkga2V5ICRrZXkiCiAgICAgICAgICAgIHJldHJ5IGNtZCAiJDIiICIkezM6LX0iICYmIHVuc2V0IGtleQogICAgZG9uZQp9CiMhL2Jpbi9iYXNoCiMgQVJPIHNlcnZpY2Ugc2V0dXAgZnVuY3Rpb25zCgojIGVuYWJsZV9zZXJ2aWNlcyBlbmFibGVzIGFsbCBzZXJ2aWNlcyByZXF1aXJlZCBmb3IgYXJvIHJwCiMgYXJnczoKIyAxKSBzZXJ2aWNlcyAtIGFycmF5OyBzZXJ2aWNlcyB0byBiZSBlbmFibGVkCmVuYWJsZV9zZXJ2aWNlcygpIHsKICAgIGxvY2FsIC1uIHN2Y3M9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZAoKICAgIGxvZyAiZW5hYmxpbmcgc2VydmljZXMgJHtzdmNzWypdfSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjA2OAogICAgZm9yIHN2YyBpbiAke3N2Y3NbQF19OyBkbwogICAgICAgIGxvZyAiRW5hYmxpbmcgYW5kIHN0YXJ0aW5nICRzdmMgbm93IgogICAgICAgIHN5c3RlbWN0bCBlbmFibGUgXAogICAgICAgICAgICAgICAgICAtLW5vdyBcCiAgICAgICAgICAgICAgICAgICIkc3ZjIgogICAgZG9uZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19nYXRld2F5CiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgY29udGFpbmVyIGltYWdlCiMgMikgcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgVk1TUyByb2xlCiMgMykgY29uZl9maWxlIC0gbmFtZXJlZiwgc3RyaW5nOyBhcm8gZ2F0ZXdheSBlbnZpcm9ubWVudCBmaWxlCiMgNCkgbmV0d29yayAtIG5hbWVyZWYsIHN0cmluZzsgcG9kbWFuIG5ldHdvcmsgbmFtZSB0byBiZSBhdHRhY2hlZApjb25maWd1cmVfc2VydmljZV9hcm9fZ2F0ZXdheSgpIHsKICAgIGxvY2FsIC1uIGltYWdlPSIkMSIKICAgIGxvY2FsIC1uIHJvbGU9IiQyIgogICAgbG9jYWwgLW4gY29uZl9maWxlPSIkMyIKICAgIGxvY2FsIC1uIG5ldHdvcms9IiQ0IgogICAgbG9nICJzdGFydGluZyIKICAgIGxvZyAiQ29uZmlndXJpbmcgYXJvLWdhdGV3YXkgc2VydmljZSIKCiAgICBsb2NhbCAtciBhcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lPScvZXRjL3N5c2NvbmZpZy9hcm8tZ2F0ZXdheScKCiAgICB3cml0ZV9maWxlIGFyb19nYXRld2F5X2NvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLWdhdGV3YXkuc2VydmljZScKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9JHthcm9fZ2F0ZXdheV9jb25mX2ZpbGVuYW1lfQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL3BvZG1hbiBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vcG9kbWFuIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFDUl9SRVNPVVJDRV9JRCBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBHQVRFV0FZX0RPTUFJTlMgXAogIC1lIEdBVEVXQVlfRkVBVFVSRVMgXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtbSAyZyBcCiAgLS1uZXR3b3JrPSRuZXR3b3JrIFwKICAtcCA4MDo4MDgwIFwKICAtcCA4MDgxOjgwODEgXAogIC1wIDQ0Mzo4NDQzIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICAke3JvbGUsLH0KRXhlY1N0b3A9L3Vzci9iaW4vcG9kbWFuIHN0b3AgLXQgMzYwMCAlTgpUaW1lb3V0U3RvcFNlYz0zNjAwClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CiAgICAiCgogICAgd3JpdGVfZmlsZSBhcm9fZ2F0ZXdheV9zZXJ2aWNlX2ZpbGVuYW1lIGFyb19nYXRld2F5X3NlcnZpY2VfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfYXJvX3JwCiMgYXJnczoKIyAxKSBpbWFnZSAtIG5hbWVyZWYsIHN0cmluZzsgUlAgY29udGFpbmVyIGltYWdlCiMgMikgcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgVk1TUyByb2xlCiMgMykgY29uZl9maWxlIC0gbmFtZXJlZiwgc3RyaW5nOyBhcm8gcnAgZW52aXJvbm1lbnQgZmlsZQojIDQpIG5ldHdvcmsgLSBuYW1lcmVmLCBzdHJpbmc7IHBvZG1hbiBuZXR3b3JrIG5hbWUgdG8gYmUgYXR0YWNoZWQKY29uZmlndXJlX3NlcnZpY2VfYXJvX3JwKCkgewogICAgbG9jYWwgLW4gaW1hZ2U9IiQxIgogICAgbG9jYWwgLW4gcm9sZT0iJDIiCiAgICBsb2NhbCAtbiBjb25mX2ZpbGU9IiQzIgogICAgbG9jYWwgLW4gbmV0d29yaz0iJDQiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8tcnAgc2VydmljZSIKCiAgICBsb2NhbCAtciBhcm9fcnBfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLXJwJwoKICAgIHdyaXRlX2ZpbGUgYXJvX3JwX2NvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19ycF9zZXJ2aWNlX2ZpbGVuYW1lPScvZXRjL3N5c3RlbWQvc3lzdGVtL2Fyby1ycC5zZXJ2aWNlJwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBhcm9fcnBfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0ke2Fyb19ycF9jb25mX2ZpbGVuYW1lfQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL3BvZG1hbiBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vcG9kbWFuIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC1lIEFDUl9SRVNPVVJDRV9JRCBcCiAgLWUgQURNSU5fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FIFwKICAtZSBBUk1fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FIFwKICAtZSBBWlVSRV9BUk1fQ0xJRU5UX0lEIFwKICAtZSBBWlVSRV9GUF9DTElFTlRfSUQgXAogIC1lIENMVVNURVJfTURNX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURNX05BTUVTUEFDRSBcCiAgLWUgQ0xVU1RFUl9NRFNEX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTiBcCiAgLWUgQ0xVU1RFUl9NRFNEX05BTUVTUEFDRSBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBET01BSU5fTkFNRSBcCiAgLWUgR0FURVdBWV9ET01BSU5TIFwKICAtZSBHQVRFV0FZX1JFU09VUkNFR1JPVVAgXAogIC1lIEtFWVZBVUxUX1BSRUZJWCBcCiAgLWUgTURNX0FDQ09VTlQgXAogIC1lIE1ETV9OQU1FU1BBQ0UgXAogIC1lIE1EU0RfRU5WSVJPTk1FTlQgXAogIC1lIFJQX0ZFQVRVUkVTIFwKICAtZSBBUk9fSU5TVEFMTF9WSUFfSElWRSBcCiAgLWUgQVJPX0hJVkVfREVGQVVMVF9JTlNUQUxMRVJfUFVMTFNQRUMgXAogIC1lIEFST19BRE9QVF9CWV9ISVZFIFwKICAtZSBPSURDX0FGRF9FTkRQT0lOVCBcCiAgLWUgT0lEQ19TVE9SQUdFX0FDQ09VTlRfTkFNRSBcCiAgLW0gMmcgXAogIC0tbmV0d29yaz0kbmV0d29yayBcCiAgLXAgNDQzOjg0NDMgXAogIC12IC9ldGMvYXJvLXJwOi9ldGMvYXJvLXJwIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICAke3JvbGUsLH0KRXhlY1N0b3A9L3Vzci9iaW4vcG9kbWFuIHN0b3AgLXQgMzYwMCAlTgpUaW1lb3V0U3RvcFNlYz0zNjAwClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgYXJvX3JwX3NlcnZpY2VfZmlsZW5hbWUgYXJvX3JwX3NlcnZpY2VfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfYXJvX21vbml0b3IKIyBhcmdzOgojIDEpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBSUCBjb250YWluZXIgaW1hZ2UKIyAyKSBuZXR3b3JrIC0gbmFtZXJlZiwgc3RyaW5nOyBwb2RtYW4gbmV0d29yayBuYW1lIHRvIGJlIGF0dGFjaGVkCmNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19tb25pdG9yKCkgewogICAgbG9jYWwgLW4gaW1hZ2U9IiQxIgogICAgbG9jYWwgLW4gbmV0d29yaz0iJDIiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBhcm8tbW9uaXRvciBzZXJ2aWNlIgoKICAgICMgRE9NQUlOX05BTUUsIENMVVNURVJfTURTRF9BQ0NPVU5ULCBDTFVTVEVSX01EU0RfQ09ORklHX1ZFUlNJT04sIEdBVEVXQVlfRE9NQUlOUywgR0FURVdBWV9SRVNPVVJDRUdST1VQLCBNRFNEX0VOVklST05NRU5UIENMVVNURVJfTURTRF9OQU1FU1BBQ0UKICAgICMgYXJlIG5vdCB1c2VkLCBidXQgY2FuJ3QgZWFzaWx5IGJlIHJlZmFjdG9yZWQgb3V0LiBTaG91bGQgYmUgcmV2aXNpdGVkIGluIHRoZSBmdXR1cmUuCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvYXJvLW1vbml0b3InCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlPSJBWlVSRV9GUF9DTElFTlRfSUQ9JyRGUENMSUVOVElEJwpET01BSU5fTkFNRT0nJExPQ0FUSU9OLiRDTFVTVEVSUEFSRU5URE9NQUlOTkFNRScKQ0xVU1RFUl9NRFNEX0FDQ09VTlQ9JyRDTFVTVEVSTURTREFDQ09VTlQnCkNMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTj0nJENMVVNURVJNRFNEQ09ORklHVkVSU0lPTicKR0FURVdBWV9ET01BSU5TPSckR0FURVdBWURPTUFJTlMnCkdBVEVXQVlfUkVTT1VSQ0VHUk9VUD0nJEdBVEVXQVlSRVNPVVJDRUdST1VQTkFNRScKTURTRF9FTlZJUk9OTUVOVD0nJE1EU0RFTlZJUk9OTUVOVCcKQ0xVU1RFUl9NRFNEX05BTUVTUEFDRT0nJENMVVNURVJNRFNETkFNRVNQQUNFJwpDTFVTVEVSX01ETV9BQ0NPVU5UPSckQ0xVU1RFUk1ETUFDQ09VTlQnCkNMVVNURVJfTURNX05BTUVTUEFDRT1CQk0KREFUQUJBU0VfQUNDT1VOVF9OQU1FPSckREFUQUJBU0VBQ0NPVU5UTkFNRScKS0VZVkFVTFRfUFJFRklYPSckS0VZVkFVTFRQUkVGSVgnCk1ETV9BQ0NPVU5UPSckUlBNRE1BQ0NPVU5UJwpNRE1fTkFNRVNQQUNFPUJCTQpSUElNQUdFPSckaW1hZ2UnIgoKICAgIHdyaXRlX2ZpbGUgYXJvX21vbml0b3Jfc2VydmljZV9jb25mX2ZpbGVuYW1lIGFyb19tb25pdG9yX3NlcnZpY2VfY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19tb25pdG9yX3NlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLW1vbml0b3Iuc2VydmljZScKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgYXJvX21vbml0b3Jfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tbW9uaXRvcgpFeGVjU3RhcnRQcmU9LS91c3IvYmluL3BvZG1hbiBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vcG9kbWFuIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtLWNhcC1kcm9wIG5ldF9yYXcgXAogIC0tbmV0d29yaz0kbmV0d29yayBcCiAgLWUgQVpVUkVfRlBfQ0xJRU5UX0lEIFwKICAtZSBET01BSU5fTkFNRSBcCiAgLWUgQ0xVU1RFUl9NRFNEX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTiBcCiAgLWUgR0FURVdBWV9ET01BSU5TIFwKICAtZSBHQVRFV0FZX1JFU09VUkNFR1JPVVAgXAogIC1lIE1EU0RfRU5WSVJPTk1FTlQgXAogIC1lIENMVVNURVJfTURTRF9OQU1FU1BBQ0UgXAogIC1lIENMVVNURVJfTURNX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURNX05BTUVTUEFDRSBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtbSAyLjVnIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICBtb25pdG9yClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgYXJvX21vbml0b3Jfc2VydmljZV9maWxlbmFtZSBhcm9fbW9uaXRvcl9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwKIyBhcmdzOgojIDEpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBSUCBjb250YWluZXIgaW1hZ2UKIyAyKSBuZXR3b3JrIC0gbmFtZXJlZiwgc3RyaW5nOyBwb2RtYW4gbmV0d29yayBuYW1lIHRvIGJlIGF0dGFjaGVkCmNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwoKSB7CiAgICBsb2NhbCAtbiBpbWFnZT0iJDEiCiAgICBsb2NhbCAtbiBuZXR3b3JrPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGFybyBwb3J0YWwgc2VydmljZSIKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19wb3J0YWxfc2VydmljZV9jb25mX2ZpbGVuYW1lPScvZXRjL3N5c2NvbmZpZy9hcm8tcG9ydGFsJwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlPSJBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUz0nJFBPUlRBTEFDQ0VTU0dST1VQSURTJwpBWlVSRV9QT1JUQUxfQ0xJRU5UX0lEPSckUE9SVEFMQ0xJRU5USUQnCkFaVVJFX1BPUlRBTF9FTEVWQVRFRF9HUk9VUF9JRFM9JyRQT1JUQUxFTEVWQVRFREdST1VQSURTJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpLRVlWQVVMVF9QUkVGSVg9JyRLRVlWQVVMVFBSRUZJWCcKTURNX0FDQ09VTlQ9JyRSUE1ETUFDQ09VTlQnCk1ETV9OQU1FU1BBQ0U9UG9ydGFsClBPUlRBTF9IT1NUTkFNRT0nJExPQ0FUSU9OLmFkbWluLiRSUFBBUkVOVERPTUFJTk5BTUUnClJQSU1BR0U9JyRpbWFnZSciCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlbmFtZSBhcm9fcG9ydGFsX3NlcnZpY2VfY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19wb3J0YWxfc2VydmljZV9maWxlbmFtZT0nL2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tcG9ydGFsLnNlcnZpY2UnCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGFyb19wb3J0YWxfc2VydmljZV9maWxlPSJbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CldhbnRzPW5ldHdvcmstb25saW5lLnRhcmdldApTdGFydExpbWl0SW50ZXJ2YWw9MAoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tcG9ydGFsCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vcG9kbWFuIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9wb2RtYW4gcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLS1uZXR3b3JrPSRuZXR3b3JrIFwKICAtZSBBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUyBcCiAgLWUgQVpVUkVfUE9SVEFMX0NMSUVOVF9JRCBcCiAgLWUgQVpVUkVfUE9SVEFMX0VMRVZBVEVEX0dST1VQX0lEUyBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBQT1JUQUxfSE9TVE5BTUUgXAogIC1tIDJnIFwKICAtcCA0NDQ6ODQ0NCBcCiAgLXAgMjIyMjoyMjIyIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJGltYWdlIFwKICBwb3J0YWwKUmVzdGFydD1hbHdheXMKUmVzdGFydFNlYz0xCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSBhcm9fcG9ydGFsX3NlcnZpY2VfZmlsZW5hbWUgYXJvX3BvcnRhbF9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QKIyBhcmdzOgojIDEpIG1vbml0b3Jpbmdfcm9sZSAtIG5hbWVyZWYsIHN0cmluZzsgY2FuIGJlICJnYXRld2F5IiBvciAicnAiCiMgMikgbW9uaXRvcl9jb25maWdfdmVyc2lvbiAtIG5hbWVyZWYsIHN0cmluZzsgbWRzZCBjb25maWcgdmVyc2lvbgpjb25maWd1cmVfc2VydmljZV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2NhbCAtbiBtb25pdG9yX2NvbmZpZ192ZXJzaW9uPSIkMiIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgImNvbmZpZ3VyaW5nIG1kc2Qgc2VydmljZSIKCiAgICB2ZXJpZnlfcm9sZSByb2xlCgogICAgbG9jYWwgLXIgbWRzZF9zZXJ2aWNlX2Rpcj0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZHNkLnNlcnZpY2UuZCIKICAgIG1rZGlyIC1wICIkbWRzZF9zZXJ2aWNlX2RpciIKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlbmFtZT0iJG1kc2Rfc2VydmljZV9kaXIvb3ZlcnJpZGUuY29uZiIKICAgIGxvY2FsIC1yIG1kc2RfY2VydGlmaWNhdGVfc2FuPSIkKG9wZW5zc2wgeDUwOSAtaW4gL3Zhci9saWIvd2FhZ2VudC9NaWNyb3NvZnQuQXp1cmUuS2V5VmF1bHQuU3RvcmUvbWRzZC5wZW0gLW5vb3V0IC1zdWJqZWN0IHwgc2VkIC1lICdzLy4qQ04gPSAvLycpIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBtZHNkX292ZXJyaWRlX2NvbmZfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIG1kc2Rfb3ZlcnJpZGVfY29uZl9maWxlbmFtZSBtZHNkX292ZXJyaWRlX2NvbmZfZmlsZSB0cnVlCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBkZWZhdWx0X21kc2RfZmlsZW5hbWU9Ii9ldGMvZGVmYXVsdC9tZHNkIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBkZWZhdWx0X21kc2RfZmlsZT0iTURTRF9ST0xFX1BSRUZJWD0vdmFyL3J1bi9tZHNkL2RlZmF1bHQKTURTRF9PUFRJT05TPVwiLUEgLWQgLXIgXCRNRFNEX1JPTEVfUFJFRklYXCIKCmV4cG9ydCBNT05JVE9SSU5HX0dDU19FTlZJUk9OTUVOVD0nJE1EU0RFTlZJUk9OTUVOVCcKZXhwb3J0IE1PTklUT1JJTkdfR0NTX0FDQ09VTlQ9JyRSUE1EU0RBQ0NPVU5UJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfUkVHSU9OPSckTE9DQVRJT04nCmV4cG9ydCBNT05JVE9SSU5HX0dDU19BVVRIX0lEX1RZUEU9QXV0aEtleVZhdWx0CmV4cG9ydCBNT05JVE9SSU5HX0dDU19BVVRIX0lEPSckbWRzZF9jZXJ0aWZpY2F0ZV9zYW4nCmV4cG9ydCBNT05JVE9SSU5HX0dDU19OQU1FU1BBQ0U9JyRSUE1EU0ROQU1FU1BBQ0UnCmV4cG9ydCBNT05JVE9SSU5HX0NPTkZJR19WRVJTSU9OPSckbW9uaXRvcl9jb25maWdfdmVyc2lvbicKZXhwb3J0IE1PTklUT1JJTkdfVVNFX0dFTkVWQV9DT05GSUdfU0VSVklDRT10cnVlCgpleHBvcnQgTU9OSVRPUklOR19URU5BTlQ9JyRMT0NBVElPTicKZXhwb3J0IE1PTklUT1JJTkdfUk9MRT0nJHJvbGUnCmV4cG9ydCBNT05JVE9SSU5HX1JPTEVfSU5TVEFOQ0U9XCIkKGhvc3RuYW1lKVwiCgpleHBvcnQgTURTRF9NU0dQQUNLX1NPUlRfQ09MVU1OUz1cIjFcIiIKCiAgICB3cml0ZV9maWxlIGRlZmF1bHRfbWRzZF9maWxlbmFtZSBkZWZhdWx0X21kc2RfZmlsZSB0cnVlCn0KCiMgY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0CiMgYXJnczoKIyAxKSBjb25mX2ZpbGUgLSBzdHJpbmc7IGZsdWVuYml0IGNvbmZpZ3VyYXRpb24gZmlsZQojIDIpIGltYWdlIC0gc3RyaW5nOyBmbHVlbnRiaXQgY29udGFpbmVyIGltYWdlIHRvIHJ1bgojIDMpIG5ldHdvcmsgLSBuYW1lcmVmLCBzdHJpbmc7IHBvZG1hbiBuZXR3b3JrIG5hbWUgdG8gYmUgYXR0YWNoZWQKY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0KCkgewogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtbiBjb25mX2ZpbGU9IiQxIgogICAgbG9jYWwgLW4gaW1hZ2U9IiQyIgogICAgbG9jYWwgLW4gbmV0d29yaz0iJDMiCiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9nICJDb25maWd1cmluZyBmbHVlbnRiaXQgc2VydmljZSIKCiAgICBta2RpciAtcCAvZXRjL2ZsdWVudGJpdC8KICAgIG1rZGlyIC1wIC92YXIvbGliL2ZsdWVudAoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgY29uZl9maWxlbmFtZT0nL2V0Yy9mbHVlbnRiaXQvZmx1ZW50Yml0LmNvbmYnCiAgICB3cml0ZV9maWxlIGNvbmZfZmlsZW5hbWUgY29uZl9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHN5c2NvbmZpZ19maWxlbmFtZT0nL2V0Yy9zeXNjb25maWcvZmx1ZW50Yml0JwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBzeXNjb25maWdfZmlsZT0iRkxVRU5UQklUSU1BR0U9JGltYWdlIgoKICAgIHdyaXRlX2ZpbGUgc3lzY29uZmlnX2ZpbGVuYW1lIHN5c2NvbmZpZ19maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHNlcnZpY2VfZmlsZW5hbWU9Jy9ldGMvc3lzdGVtZC9zeXN0ZW0vZmx1ZW50Yml0LnNlcnZpY2UnCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHNlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKU3RhcnRMaW1pdEludGVydmFsU2VjPTAKCltTZXJ2aWNlXQpSZXN0YXJ0U2VjPTFzCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9mbHVlbnRiaXQKRXhlY1N0YXJ0UHJlPS0vdXNyL2Jpbi9wb2RtYW4gcm0gLWYgJU4KRXhlY1N0YXJ0PS91c3IvYmluL3BvZG1hbiBydW4gXAogIC0tc2VjdXJpdHktb3B0IGxhYmVsPWRpc2FibGUgXAogIC0tZW50cnlwb2ludCAvb3B0L3RkLWFnZW50LWJpdC9iaW4vdGQtYWdlbnQtYml0IFwKICAtLW5ldD1ob3N0IFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC0tY2FwLWRyb3AgbmV0X3JhdyBcCiAgLS1uZXR3b3JrPSRuZXR3b3JrIFwKICAtdiAvZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZjovZXRjL2ZsdWVudGJpdC9mbHVlbnRiaXQuY29uZiBcCiAgLXYgL3Zhci9saWIvZmx1ZW50Oi92YXIvbGliL2ZsdWVudDp6IFwKICAtdiAvdmFyL2xvZy9qb3VybmFsOi92YXIvbG9nL2pvdXJuYWw6cm8gXAogIC12IC9ldGMvbWFjaGluZS1pZDovZXRjL21hY2hpbmUtaWQ6cm8gXAogICRpbWFnZSBcCiAgLWMgL2V0Yy9mbHVlbnRiaXQvZmx1ZW50Yml0LmNvbmYKCkV4ZWNTdG9wPS91c3IvYmluL3BvZG1hbiBzdG9wICVOClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9NQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0IgoKICAgIHdyaXRlX2ZpbGUgc2VydmljZV9maWxlbmFtZSBzZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QKIyBhcmdzOgojIDEpIHJvbGUgLSBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgpjb25maWd1cmVfdGltZXJzX21kbV9tZHNkKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICBsb2NhbCBrZXl2YXVsdF9zdWZmaXggc2VjcmV0X3ByZWZpeAogICAgZ2V0X2tleXZhdWx0X3N1ZmZpeCByb2xlIGtleXZhdWx0X3N1ZmZpeCBzZWNyZXRfcHJlZml4CgogICAgZm9yIHZhciBpbiAibWRzZCIgIm1kbSI7IGRvCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9kb3dubG9hZC0kdmFyLWNyZWRlbnRpYWxzLnNlcnZpY2UiCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCgpbU2VydmljZV0KVHlwZT1vbmVzaG90CkV4ZWNTdGFydD0vdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaCAkdmFyIgoKICAgICAgICB3cml0ZV9maWxlIGRvd25sb2FkX2NyZWRzX3NlcnZpY2VfZmlsZW5hbWUgZG93bmxvYWRfY3JlZHNfc2VydmljZV9maWxlIHRydWUKCiAgICAgICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICAgICAgbG9jYWwgZG93bmxvYWRfY3JlZHNfdGltZXJfZmlsZW5hbWU9Ii9ldGMvc3lzdGVtZC9zeXN0ZW0vZG93bmxvYWQtJHZhci1jcmVkZW50aWFscy50aW1lciIKICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgICAgICBsb2NhbCBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlPSJbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltUaW1lcl0KT25Cb290U2VjPTBtaW4KT25DYWxlbmRhcj0wLzEyOjAwOjAwCkFjY3VyYWN5U2VjPTVzCgpbSW5zdGFsbF0KV2FudGVkQnk9dGltZXJzLnRhcmdldCIKCiAgICAgICAgd3JpdGVfZmlsZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlbmFtZSBkb3dubG9hZF9jcmVkc190aW1lcl9maWxlIHRydWUKICAgIGRvbmUKCiAgICBsb2NhbCAtciBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZW5hbWU9Ii91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZT0iIyEvYmluL2Jhc2gKc2V0IC1ldQoKQ09NUE9ORU5UPVwkMQplY2hvIFwiRG93bmxvYWQgXCRDT01QT05FTlQgY3JlZGVudGlhbHNcIgoKVEVNUF9ESVI9XCJcJChta3RlbXAgLWQpXCIKZXhwb3J0IEFaVVJFX0NPTkZJR19ESVI9XCJcJChta3RlbXAgLWQpXCIKCmVjaG8gXCJMb2dnaW5nIGludG8gQXp1cmUuLi5cIgpSRVRSSUVTPTMKd2hpbGUgW1sgXCRSRVRSSUVTIC1ndCAwIF1dOyBkbwogICAgaWYgYXogbG9naW4gLWkgLS1hbGxvdy1uby1zdWJzY3JpcHRpb25zCiAgICB0aGVuCiAgICAgICAgZWNobyBcImF6IGxvZ2luIHN1Y2Nlc3NmdWxcIgogICAgICAgIGJyZWFrCiAgICBlbHNlCiAgICAgICAgZWNobyBcImF6IGxvZ2luIGZhaWxlZC4gUmV0cnlpbmcuLi5cIgogICAgICAgIGxldCBSRVRSSUVTLT0xCiAgICAgICAgc2xlZXAgNQogICAgZmkKZG9uZQoKdHJhcCBcImNsZWFudXBcIiBFWElUCgpjbGVhbnVwKCkgewogIGF6IGxvZ291dAogIFtbIFwkVEVNUF9ESVIgPX4gL3RtcC8uKyBdXSAmJiBybSAtcmYgXCRURU1QX0RJUgogIFtbIFwkQVpVUkVfQ09ORklHX0RJUiA9fiAvdG1wLy4rIF1dICYmIHJtIC1yZiBcJEFaVVJFX0NPTkZJR19ESVIKfQoKaWYgW1sgXCRDT01QT05FTlQgPSBcIm1kbVwiIF1dOyB0aGVuCiAgQ1VSUkVOVF9DRVJUX0ZJTEU9XCIvZXRjL21kbS5wZW1cIgplbGlmIFtbIFwkQ09NUE9ORU5UID0gXCJtZHNkXCIgXV07IHRoZW4KICBDVVJSRU5UX0NFUlRfRklMRT1cIi92YXIvbGliL3dhYWdlbnQvTWljcm9zb2Z0LkF6dXJlLktleVZhdWx0LlN0b3JlL21kc2QucGVtXCIKZWxzZQogIGVjaG8gSW52YWxpZCB1c2FnZSAmJiBleGl0IDEKZmkKClNFQ1JFVF9OQU1FPVwiJHNlY3JldF9wcmVmaXgtXCR7Q09NUE9ORU5UfVwiCk5FV19DRVJUX0ZJTEU9XCJcJFRFTVBfRElSL1wkQ09NUE9ORU5ULnBlbVwiCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KICBheiBrZXl2YXVsdCBcCiAgICBzZWNyZXQgXAogICAgZG93bmxvYWQgXAogICAgLS1maWxlIFwiXCRORVdfQ0VSVF9GSUxFXCIgXAogICAgLS1pZCBcImh0dHBzOi8vJEtFWVZBVUxUUFJFRklYLSRrZXl2YXVsdF9zdWZmaXguJEtFWVZBVUxURE5TU1VGRklYL3NlY3JldHMvXCRTRUNSRVRfTkFNRVwiIFwKICAgICYmIGJyZWFrCiAgaWYgW1sgXCRhdHRlbXB0IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKaWYgWyAtZiBcJE5FV19DRVJUX0ZJTEUgXTsgdGhlbgogIGlmIFtbIFwkQ09NUE9ORU5UID0gXCJtZHNkXCIgXV07IHRoZW4KICAgIGNob3duIHN5c2xvZzpzeXNsb2cgXCRORVdfQ0VSVF9GSUxFCiAgZWxzZQogICAgc2VkIC1pIC1uZSAnMSwvRU5EIENFUlRJRklDQVRFLyBwJyBcJE5FV19DRVJUX0ZJTEUKICBmaQoKICBuZXdfY2VydF9zbj1cIlwkKG9wZW5zc2wgeDUwOSAtaW4gXCJcJE5FV19DRVJUX0ZJTEVcIiAtbm9vdXQgLXNlcmlhbCB8IGF3ayAtRj0gJ3twcmludCBcJDJ9JylcIgogIGN1cnJlbnRfY2VydF9zbj1cIlwkKG9wZW5zc2wgeDUwOSAtaW4gXCJcJENVUlJFTlRfQ0VSVF9GSUxFXCIgLW5vb3V0IC1zZXJpYWwgfCBhd2sgLUY9ICd7cHJpbnQgXCQyfScpXCIKICBpZiBbWyAhIC16IFwkbmV3X2NlcnRfc24gXV0gJiYgW1sgXCRuZXdfY2VydF9zbiAhPSBcIlwkY3VycmVudF9jZXJ0X3NuXCIgXV07IHRoZW4KICAgIGVjaG8gdXBkYXRpbmcgY2VydGlmaWNhdGUgZm9yIFwkQ09NUE9ORU5UCiAgICBjaG1vZCAwNjAwIFwkTkVXX0NFUlRfRklMRQogICAgbXYgXCRORVdfQ0VSVF9GSUxFIFwkQ1VSUkVOVF9DRVJUX0ZJTEUKICBmaQplbHNlCiAgZWNobyBGYWlsZWQgdG8gcmVmcmVzaCBjZXJ0aWZpY2F0ZSBmb3IgXCRDT01QT05FTlQgJiYgZXhpdCAxCmZpIgoKICAgIHdyaXRlX2ZpbGUgZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGVuYW1lIGRvd25sb2FkX2NyZWRzX3NjcmlwdF9maWxlIHRydWUKCiAgICBjaG1vZCB1K3ggL3Vzci9sb2NhbC9iaW4vZG93bmxvYWQtY3JlZGVudGlhbHMuc2gKCiAgICAkZG93bmxvYWRfY3JlZHNfc2NyaXB0X2ZpbGVuYW1lIG1kc2QgJgogICAgd2FpdCAiJCEiCgoKICAgICRkb3dubG9hZF9jcmVkc19zY3JpcHRfZmlsZW5hbWUgbWRtICYKICAgIHdhaXQgIiQhIgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3NlcnZpY2VfZmlsZW5hbWU9Ii9ldGMvc3lzdGVtZC9zeXN0ZW0vd2F0Y2gtbWRtLWNyZWRlbnRpYWxzLnNlcnZpY2UiCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19zZXJ2aWNlX2ZpbGU9IltVbml0XQpEZXNjcmlwdGlvbj1XYXRjaCBmb3IgY2hhbmdlcyBpbiBtZG0ucGVtIGFuZCByZXN0YXJ0cyB0aGUgbWRtIHNlcnZpY2UKCltTZXJ2aWNlXQpUeXBlPW9uZXNob3QKRXhlY1N0YXJ0PS91c3IvYmluL3N5c3RlbWN0bCByZXN0YXJ0IG1kbS5zZXJ2aWNlCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQiCgogICAgd3JpdGVfZmlsZSB3YXRjaF9tZG1fY3JlZHNfc2VydmljZV9maWxlbmFtZSB3YXRjaF9tZG1fY3JlZHNfc2VydmljZV9maWxlIHRydWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lPScvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbS93YXRjaC1tZG0tY3JlZGVudGlhbHMucGF0aCcKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgd2F0Y2hfbWRtX2NyZWRzX3BhdGhfZmlsZT0nW1BhdGhdClBhdGhNb2RpZmllZD0vZXRjL21kbS5wZW0KCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCcKCiAgICB3cml0ZV9maWxlIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGVuYW1lIHdhdGNoX21kbV9jcmVkc19wYXRoX2ZpbGUgdHJ1ZQoKICAgIGxvY2FsIC1yIHdhdGNoX21kbV9jcmVkcz0nd2F0Y2gtbWRtLWNyZWRlbnRpYWxzLnBhdGgnCiAgICBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93ICIkd2F0Y2hfbWRtX2NyZWRzIiB8fCBhYm9ydCAiZmFpbGVkIHRvIGVuYWJsZSBhbmQgc3RhcnQgJHdhdGNoX21kbV9jcmVkcyIKfQoKIyBjb25maWd1cmVfc2VydmljZV9tZG0KIyBhcmdzOgojIDEpIHJvbGUgLSBuYW1lcmVmLCBzdHJpbmc7IGNhbiBiZSAiZ2F0ZXdheSIgb3IgInJwIgojIDIpIGltYWdlIC0gbmFtZXJlZiwgc3RyaW5nOyBtZG0gY29udGFpbmVyIGltYWdlIHRvIHJ1bgojIDMpIG5ldHdvcmsgLSBuYW1lcmVmLCBzdHJpbmc7IHBvZG1hbiBuZXR3b3JrIG5hbWUgdG8gYmUgYXR0YWNoZWQKY29uZmlndXJlX3NlcnZpY2VfbWRtKCkgewogICAgbG9jYWwgLW4gcm9sZT0iJDEiCiAgICBsb2NhbCAtbiBpbWFnZT0iJDIiCiAgICBsb2NhbCAtbiBuZXR3b3JrPSIkMyIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIG1kbSBzZXJ2aWNlIgoKICAgIHZlcmlmeV9yb2xlIHJvbGUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIHN5c2NvbmZpZ19tZG1fZmlsZW5hbWU9Ii9ldGMvc3lzY29uZmlnL21kbSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgc3lzY29uZmlnX21kbV9maWxlPSJNRE1GUk9OVEVORFVSTD0nJE1ETUZST05URU5EVVJMJwpNRE1JTUFHRT0nJGltYWdlJwpNRE1TT1VSQ0VFTlZJUk9OTUVOVD0nJExPQ0FUSU9OJwpNRE1TT1VSQ0VST0xFPSckcm9sZScKTURNU09VUkNFUk9MRUlOU1RBTkNFPVwiJChob3N0bmFtZSlcIiIKCiAgICB3cml0ZV9maWxlIHN5c2NvbmZpZ19tZG1fZmlsZW5hbWUgc3lzY29uZmlnX21kbV9maWxlIHRydWUKCiAgICBta2RpciAtcCAvdmFyL2V0dwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBtZG1fc2VydmljZV9maWxlbmFtZT0iL2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZG0uc2VydmljZSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgbWRtX3NlcnZpY2VfZmlsZT0iW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApXYW50cz1uZXR3b3JrLW9ubGluZS50YXJnZXQKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvbWRtCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vcG9kbWFuIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9wb2RtYW4gcnVuIFwKICAtLWVudHJ5cG9pbnQgL3Vzci9zYmluL01ldHJpY3NFeHRlbnNpb24gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLS1jYXAtZHJvcCBuZXRfcmF3IFwKICAtLW5ldHdvcms9JG5ldHdvcmsgXAogIC1tIDJnIFwKICAtdiAvZXRjL21kbS5wZW06L2V0Yy9tZG0ucGVtIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkaW1hZ2UgXAogIC1DZXJ0RmlsZSAvZXRjL21kbS5wZW0gXAogIC1Gcm9udEVuZFVybCAkTURNRlJPTlRFTkRVUkwgXAogIC1Mb2dnZXIgQ29uc29sZSBcCiAgLUxvZ0xldmVsIFdhcm5pbmcgXAogIC1Qcml2YXRlS2V5RmlsZSAvZXRjL21kbS5wZW0gXAogIC1Tb3VyY2VFbnZpcm9ubWVudCAkTE9DQVRJT04gXAogIC1Tb3VyY2VSb2xlICRyb2xlIFwKICAtU291cmNlUm9sZUluc3RhbmNlICRIT1NUTkFNRQpFeGVjU3RvcD0vdXNyL2Jpbi9wb2RtYW4gc3RvcCAlTgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldCIKCiAgICB3cml0ZV9maWxlIG1kbV9zZXJ2aWNlX2ZpbGVuYW1lIG1kbV9zZXJ2aWNlX2ZpbGUgdHJ1ZQp9CgojIGNvbmZpZ3VyZV92bXNzX2Fyb19zZXJ2aWNlCiMgYXJnczoKIyAxKSByIC0gbmFtZXJlZiwgc3RyaW5nOyByb2xlIG9mIFZNU1MKIyAyKSBpbWFnZXMgLSBuYW1lcmVmLCBhc3NvY2lhdGl2ZSBhcnJheTsgQVJPIGNvbnRhaW5lciBpbWFnZXMKIyAzKSBjb25maWdzIC0gbmFtZXJlZiwgYXNzb2NpYXRpdmUgYXJyYXk7IGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHZlcnNpb25zLiBUaGUgdmFsdWVzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byB2YXJpYWJsZXMsIG5vdCBkZXJlZmVyZW5jZWQuCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIHZhbHVlIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBuYW1lcmVmIHZhcmlhYmxlcyBieSBoZWxwZXIgZnVuY3Rpb25zLgpjb25maWd1cmVfdm1zc19hcm9fc2VydmljZXMoKSB7CiAgICBsb2NhbCAtbiByPSIkMSIKICAgIGxvY2FsIC1uIGltYWdlcz0iJDIiCiAgICBsb2NhbCAtbiBjb25maWdzPSIkMyIKICAgIGxvZyAic3RhcnRpbmciCiAgICB2ZXJpZnlfcm9sZSAiJDEiCgogICAgaWYgWyAiJHIiID09ICIkcm9sZV9nYXRld2F5IiBdOyB0aGVuCiAgICAgICAgY29uZmlndXJlX3NlcnZpY2VfYXJvX2dhdGV3YXkgIiR7aW1hZ2VzWyJycCJdfSIgIiQxIiAiJHtjb25maWdzWyJnYXRld2F5X2NvbmZpZyJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgIGVsaWYgWyAiJHIiID09ICIkcm9sZV9ycCIgXTsgdGhlbgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19ycCAiJHtpbWFnZXNbInJwIl19IiAiJDEiICIke2NvbmZpZ3NbInJwX2NvbmZpZyJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgICAgICBjb25maWd1cmVfc2VydmljZV9hcm9fbW9uaXRvciAiJHtpbWFnZXNbInJwIl19IiAiJHtjb25maWdzWyJuZXR3b3JrIl19IgogICAgICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX2Fyb19wb3J0YWwgIiR7aW1hZ2VzWyJycCJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgIGZpCgogICAgY29uZmlndXJlX3NlcnZpY2VfZmx1ZW50Yml0ICIke2NvbmZpZ3NbImZsdWVudGJpdCJdfSIgIiR7aW1hZ2VzWyJmbHVlbnRiaXQiXX0iICIke2NvbmZpZ3NbIm5ldHdvcmsiXX0iCiAgICBjb25maWd1cmVfc2VydmljZV9tZG0gIiQxIiAiJHtpbWFnZXNbIm1kbSJdfSIgIiR7Y29uZmlnc1sibmV0d29yayJdfSIKICAgIGNvbmZpZ3VyZV9zZXJ2aWNlX21kc2QgIiQxIiAiJHtjb25maWdzWyJtZHNkIl19IgogICAgY29uZmlndXJlX2NlcnRzICIkMSIKICAgIGNvbmZpZ3VyZV90aW1lcnNfbWRtX21kc2QgIiQxIgp9Cgp1dGlsX2NvbW1vbj0idXRpbC1jb21tb24uc2giCmlmIFsgLWYgIiR1dGlsX2NvbW1vbiIgXTsgdGhlbgogICAgIyBzaGVsbGNoZWNrIHNvdXJjZT11dGlsLWNvbW1vbi5zaAogICAgc291cmNlICIkdXRpbF9jb21tb24iCmZpCiMhL2Jpbi9iYXNoCiMgVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIHNvdXJjZWQgYnkgYm9vdHN0cmFwcGluZyBzY3JpcHRzIGZvciBjb21tb25seSB1c2VkIGZ1bmN0aW9ucwoKIyBjb25maWd1cmVfc3NoZAojIFdlIG5lZWQgdG8gY29uZmlndXJlIFBhc3N3b3JkQXV0aGVudGljYXRpb24gdG8geWVzIGluIG9yZGVyIGZvciB0aGUgVk1TUyBBY2Nlc3MgSklUIHRvIHdvcmsKY29uZmlndXJlX3NzaGQoKSB7CiAgICBsb2cgInN0YXJ0aW5nIgogICAgbG9jYWwgLXIgc3NoZF9jb25maWc9Ii9ldGMvc3NoL3NzaGRfY29uZmlnIgoKICAgIGxvZyAiRWRpdGluZyAkc3NoZF9jb25maWcgdG8gYWxsb3cgcGFzc3dvcmQgYXV0aGVudGljYXRpb24iCiAgICBzZWQgLWkgJ3MvUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBuby9QYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcy9nJyAiJHNzaGRfY29uZmlnIgoKICAgIHN5c3RlbWN0bCByZWxvYWQgc3NoZC5zZXJ2aWNlIHx8IGFib3J0ICJzc2hkIGZhaWxlZCB0byByZWxvYWQiCn0KCiMgY29uZmlndXJlX2xvZ3JvdGF0ZSBjbG9iYmVycyAvZXRjL2xvZ3JvdGF0ZS5jb25mCiMgYXJnczoKIyAxKSBkcm9waW5fZmlsZXMgLSBuYW1lcmVmLCBhc3NvY2lhdGl2ZSBhcnJheSwgb3B0aW9uYWw7IGxvZ3JvdGF0ZSBmaWxlcyB0byB3cml0ZSB0byAvZXRjL2xvZ3JvdGF0ZS5kCiMgICAgICAgS2V5IG5hbWUgZGljdGF0ZXMgZmlsZW5hbWVzIHdyaXR0ZW4gdG8gL2V0Yy9sb2dyb3RhdGUuZC4KIyBFeGFtcGxlOiAKIyAgIEtleSBkaWN0YXRlcyB0aGUgZmlsZW5hbWUgd3JpdHRlbiBpbiAvZXRjL2xvZ3JvdGF0ZS5kCiMgICBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiMgICBsb2NhbCAtckEgbG9ncm90YXRlX2Ryb3BpbnM9KAojICAgICAgWyJnYXRld2F5Il09IiRnYXRld2F5X2xvZ19maWxlIgojICAgKQpjb25maWd1cmVfbG9ncm90YXRlKCkgewogICAgbG9jYWwgLW4gZHJvcGluX2ZpbGVzPSIkezE6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXIgbG9ncm90YXRlX2NvbmZfZmlsZW5hbWU9Jy9ldGMvbG9ncm90YXRlLmNvbmYnCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIGxvZ3JvdGF0ZV9jb25mX2ZpbGU9JyMgc2VlICJtYW4gbG9ncm90YXRlIiBmb3IgZGV0YWlscwojIHJvdGF0ZSBsb2cgZmlsZXMgd2Vla2x5CndlZWtseQoKIyBrZWVwIDIgd2Vla3Mgd29ydGggb2YgYmFja2xvZ3MKcm90YXRlIDIKCiMgY3JlYXRlIG5ldyAoZW1wdHkpIGxvZyBmaWxlcyBhZnRlciByb3RhdGluZyBvbGQgb25lcwpjcmVhdGUKCiMgdXNlIGRhdGUgYXMgYSBzdWZmaXggb2YgdGhlIHJvdGF0ZWQgZmlsZQpkYXRlZXh0CgojIHVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHlvdXIgbG9nIGZpbGVzIGNvbXByZXNzZWQKY29tcHJlc3MKCiMgUlBNIHBhY2thZ2VzIGRyb3AgbG9nIHJvdGF0aW9uIGluZm9ybWF0aW9uIGludG8gdGhpcyBkaXJlY3RvcnkKaW5jbHVkZSAvZXRjL2xvZ3JvdGF0ZS5kCgojIG5vIHBhY2thZ2VzIG93biB3dG1wIGFuZCBidG1wIC0tIHdlIHdpbGwgcm90YXRlIHRoZW0gaGVyZQovdmFyL2xvZy93dG1wIHsKICAgIG1vbnRobHkKICAgIGNyZWF0ZSAwNjY0IHJvb3QgdXRtcAogICAgICAgIG1pbnNpemUgMU0KICAgIHJvdGF0ZSAxCn0KCi92YXIvbG9nL2J0bXAgewogICAgbWlzc2luZ29rCiAgICBtb250aGx5CiAgICBjcmVhdGUgMDYwMCByb290IHV0bXAKICAgIHJvdGF0ZSAxCn0nCgogICAgd3JpdGVfZmlsZSBsb2dyb3RhdGVfY29uZl9maWxlbmFtZSBsb2dyb3RhdGVfY29uZl9maWxlIHRydWUKCiAgICBpZiBbIC1uICIke2Ryb3Bpbl9maWxlc1sqXX0iIF07IHRoZW4KICAgICAgICBsb2NhbCAtciBsb2dyb3RhdGVfZD0iL2V0Yy9sb2dyb3RhdGUuZCIKICAgICAgICBsb2cgIldyaXRpbmcgbG9ncm90YXRlIGZpbGVzIHRvICRsb2dyb3RhdGVfZCIKICAgICAgICBmb3IgZHJvcGluX25hbWUgaW4gIiR7IWRyb3Bpbl9maWxlc1tAXX0iOyBkbwogICAgICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgICAgICAgICAgbG9jYWwgLXIgZHJvcGluX2ZpbGVuYW1lPSIkbG9ncm90YXRlX2QvJGRyb3Bpbl9uYW1lIgogICAgICAgICAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgICAgICAgICAgbG9jYWwgLXIgZHJvcGluX2ZpbGU9IiR7ZHJvcGluX2ZpbGVzWyIkZHJvcGluX25hbWUiXX0iCiAgICAgICAgICAgIHdyaXRlX2ZpbGUgZHJvcGluX2ZpbGVuYW1lIGRyb3Bpbl9maWxlIHRydWUKICAgICAgICBkb25lCiAgICBmaQp9CgojIHB1bGxfY29udGFpbmVyX2ltYWdlcwojIGFyZ3M6CiMgMSkgcHVsbF9pbWFnZXMgLSBuYW1lcmVmLCBzdHJpbmcgYXJyYXkKIyAyKSByZWdpc3RyeV9jb25mIC0gbmFtZXJlZiwgc3RyaW5nLCBvcHRpb25hbDsgcGF0aCB0byBkb2NrZXIvcG9kbWFuIGNvbmZpZ3VyYXRpb24gZmlsZQpwdWxsX2NvbnRhaW5lcl9pbWFnZXMoKSB7CiAgICBsb2NhbCAtbiBwdWxsX2ltYWdlcz0iJDEiCiAgICBsb2NhbCAtbiByZWdpc3RyeV9jb25mPSIkezI6LWVtcHR5X3N0cn0iCiAgICBsb2cgInN0YXJ0aW5nIgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXJpIHJldHJ5X3RpbWU9MzAKICAgICMgVGhlIG1hbmFnZWQgaWRlbnRpdHkgdGhhdCB0aGUgVk0gcnVucyBhcyBvbmx5IGhhcyBhIHNpbmdsZSByb2xlYXNzaWdubWVudC4KICAgICMgVGhpcyByb2xlIGFzc2lnbm1lbnQgaXMgQUNSUHVsbCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgcHJlc2VudCBpbiB0aGUKICAgICMgc3Vic2NyaXB0aW9uIHdlJ3JlIGRlcGxveWluZyBpbnRvLiAgSWYgdGhlIGlkZW50aXR5IGRvZXMgbm90IGhhdmUgYW55CiAgICAjIHJvbGUgYXNzaWdubWVudHMgc2NvcGVkIG9uIHRoZSBzdWJzY3JpcHRpb24gd2UncmUgZGVwbG95aW5nIGludG8sIGl0IHdpbGwKICAgICMgbm90IHNob3cgb24gYXogbG9naW4gLWksIHdoaWNoIGlzIHdoeSB0aGUgYmVsb3cgbGluZSBpcyBjb21tZW50ZWQuCiAgICAjIGF6IGFjY291bnQgc2V0IC1zICIkU1VCU0NSSVBUSU9OSUQiCiAgICBjbWQ9KAogICAgICAgIGF6CiAgICAgICAgbG9naW4KICAgICAgICAtaQogICAgICAgIC0tYWxsb3ctbm8tc3Vic2NyaXB0aW9ucwogICAgKQoKICAgIGxvZyAiUnVubmluZyBheiBsb2dpbiB3aXRoIHJldHJpZXMiCiAgICByZXRyeSBjbWQgcmV0cnlfdGltZQoKICAgICMgU3VwcHJlc3MgZW11bGF0aW9uIG91dHB1dCBmb3IgcG9kbWFuIGluc3RlYWQgb2YgZG9ja2VyIGZvciBheiBhY3IgY29tcGF0YWJpbGl0eQogICAgbWtkaXIgLXAgL2V0Yy9jb250YWluZXJzLwogICAgbWtkaXIgLXAgL3Jvb3QvLmRvY2tlcgogICAgdG91Y2ggL2V0Yy9jb250YWluZXJzL25vZG9ja2VyCgogICAgIyBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUgY2FzZSB0aGF0IGF6IGFjciBsb2dpbiBzZWFyY2hlcyBmb3IgdGhpcyBpbiBpdCdzIGVudmlyb25tZW50CiAgICBleHBvcnQgUkVHSVNUUllfQVVUSF9GSUxFPSIvcm9vdC8uZG9ja2VyL2NvbmZpZy5qc29uIgogICAgCiAgICBpZiBbIC1uICIke3JlZ2lzdHJ5X2NvbmZ9IiBdOyB0aGVuCiAgICAgICAgd3JpdGVfZmlsZSBSRUdJU1RSWV9BVVRIX0ZJTEUgcmVnaXN0cnlfY29uZiB0cnVlCiAgICBmaQoKICAgIGxvZyAibG9nZ2luZyBpbnRvIHByb2QgYWNyIgogICAgY21kPSgKICAgICAgICBhegogICAgICAgIGFjcgogICAgICAgIGxvZ2luCiAgICAgICAgLS1uYW1lCiAgICAgICAgIyBUT0RPIHJlcGxhY2UgdGhpcyB3aXRoIHZhcmlhYmxlIGV4cGFuc2lvbgogICAgICAgICMgUmVmZXJlbmNlOiBodHRwczovL3d3dy5zaGVsbGNoZWNrLm5ldC93aWtpL1NDMjAwMQogICAgICAgICIkKHNlZCAtZSAnc3wuKi98fCcgPDw8IiRBQ1JSRVNPVVJDRUlEIikiCiAgICApCgogICAgcmV0cnkgY21kIHJldHJ5X3RpbWUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBpIGluICR7cHVsbF9pbWFnZXNbQF19OyBkbwogICAgICAgIGxvY2FsIC1uIGltYWdlPSIkaSIKICAgICAgICBjbWQ9KAogICAgICAgICAgICBwb2RtYW4KICAgICAgICAgICAgcHVsbAogICAgICAgICAgICAiJGltYWdlIgogICAgICAgICkKCiAgICAgICAgbG9nICJQdWxsaW5nIGltYWdlICRpbWFnZSB3aXRoIHJldHJpZXMgbm93IgogICAgICAgIHJldHJ5IGNtZCByZXRyeV90aW1lCiAgICBkb25lCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBjbWQ9KAogICAgICAgIGF6CiAgICAgICAgbG9nb3V0CiAgICApCgogICAgbG9nICJSdW5uaW5nIGF6IGxvZ291dCB3aXRoIHJldHJpZXMiCiAgICByZXRyeSBjbWQgcmV0cnlfdGltZQp9CgojIGNvbmZpZ3VyZV9jZXJ0cwojIGFyZ3M6CiMgMSkgcm9sZSAtIHN0cmluZzsgY2FuIGJlICJkZXZwcm94eSIgb3IgInJwIgpjb25maWd1cmVfY2VydHMoKSB7CiAgICBsb2NhbCAtbiByb2xlPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCiAgICBsb2cgIkNvbmZpZ3VyaW5nIGNlcnRpZmljYXRlcyBmb3IgJHJvbGUiCgogICAgdmVyaWZ5X3JvbGUgcm9sZSB0cnVlCgogICAgaWYgWyAiJHJvbGUiID09ICJkZXZwcm94eSIgXTsgdGhlbgogICAgICAgIGxvY2FsIC1yIHByb3h5X2NlcnRzX2Jhc2VkaXI9Ii9ldGMvcHJveHkiCiAgICAgICAgbWtkaXIgLXAgIiRwcm94eV9jZXJ0c19iYXNlZGlyIgogICAgICAgIGJhc2U2NCAtZCA8PDwiJFBST1hZQ0VSVCIgPiAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHkuY3J0IgogICAgICAgIGJhc2U2NCAtZCA8PDwiJFBST1hZS0VZIiA+ICIkcHJveHlfY2VydHNfYmFzZWRpci9wcm94eS5rZXkiCiAgICAgICAgYmFzZTY0IC1kIDw8PCIkUFJPWFlDTElFTlRDRVJUIiA+ICIkcHJveHlfY2VydHNfYmFzZWRpci9wcm94eS1jbGllbnQuY3J0IgogICAgICAgIGNob3duIC1SIDEwMDA6MTAwMCAvZXRjL3Byb3h5CiAgICAgICAgY2htb2QgMDYwMCAiJHByb3h5X2NlcnRzX2Jhc2VkaXIvcHJveHkua2V5IgogICAgICAgIHJldHVybiAwCiAgICBmaQoKICAgIGlmIFsgIiRyb2xlIiA9PSAicnAiIF07IHRoZW4KICAgICAgICBsb2NhbCAtciBycF9jZXJ0c19iYXNlZGlyPSIvZXRjL2Fyby1ycCIKICAgICAgICBta2RpciAtcCAiJHJwX2NlcnRzX2Jhc2VkaXIiCiAgICAgICAgYmFzZTY0IC1kIDw8PCIkQURNSU5BUElDQUJVTkRMRSIgPiAiJHJwX2NlcnRzX2Jhc2VkaXIvYWRtaW4tY2EtYnVuZGxlLnBlbSIKICAgICAgICBpZiBbWyAtbiAiJEFSTUFQSUNBQlVORExFIiBdXTsgdGhlbgogICAgICAgIGJhc2U2NCAtZCA8PDwiJEFSTUFQSUNBQlVORExFIiA+ICIkcnBfY2VydHNfYmFzZWRpci9hcm0tY2EtYnVuZGxlLnBlbSIKICAgICAgICBmaQogICAgICAgIGNob3duIC1SIDEwMDA6MTAwMCAiJHJwX2NlcnRzX2Jhc2VkaXIiCiAgICBmaQoKICAgICMgc2V0dGluZyBNT05JVE9SSU5HX0dDU19BVVRIX0lEX1RZUEU9QXV0aEtleVZhdWx0IHNlZW1zIHRvIGhhdmUgY2F1c2VkIG1kc2Qgbm90CiAgICAjIHRvIGhvbm91ciBTU0xfQ0VSVF9GSUxFIGFueSBtb3JlLCBoZWF2ZW4gb25seSBrbm93cyB3aHkuCiAgICBsb2NhbCAtciBzc2xfY2VydHNfYmFzZWRpcj0iL3Vzci9saWIvc3NsL2NlcnRzIgogICAgbWtkaXIgLXAgIiRzc2xfY2VydHNfYmFzZWRpciIKICAgIGNzcGxpdCAtZiAiJHNzbF9jZXJ0c19iYXNlZGlyL2NlcnQtIiAtYiAlMDNkLnBlbSAvZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydCAvXiQvMSAieyp9IiAxPi9kZXYvbnVsbAogICAgY19yZWhhc2ggIiRzc2xfY2VydHNfYmFzZWRpciIKCiAgICAjIHdlIGxlYXZlIGNsaWVudElkIGJsYW5rIGFzIGxvbmcgYXMgb25seSAxIG1hbmFnZWQgaWRlbnRpdHkgYXNzaWduZWQgdG8gdm1zcwogICAgIyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiAxLCB3ZSB3aWxsIG5lZWQgdG8gcG9wdWxhdGUgd2l0aCBjbGllbnRJZCB1c2VkIGZvciBvZmYtbm9kZSBzY2FubmluZwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBub2Rlc2Nhbl9hZ2VudF9maWxlbmFtZT0iL2V0Yy9kZWZhdWx0L3ZzYS1ub2Rlc2Nhbi1hZ2VudC5jb25maWciCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIG5vZGVzY2FuX2FnZW50X2ZpbGU9InsKICAgIFwiTmljZVwiOiAxOSwKICAgIFwiVGltZW91dFwiOiAxMDgwMCwKICAgIFwiQ2xpZW50SWRcIjogXCJcIiwKICAgIFwiVGVuYW50SWRcIjogJEFaVVJFU0VDUEFDS1ZTQVRFTkFOVElELAogICAgXCJRdWFseXNTdG9yZUJhc2VVcmxcIjogJEFaVVJFU0VDUEFDS1FVQUxZU1VSTCwKICAgIFwiUHJvY2Vzc1RpbWVvdXRcIjogMzAwLAogICAgXCJDb21tYW5kRGVsYXlcIjogMAogIH0iCgogICAgd3JpdGVfZmlsZSBub2Rlc2Nhbl9hZ2VudF9maWxlbmFtZSBub2Rlc2Nhbl9hZ2VudF9maWxlIHRydWUKfQoKIyBydW5fYXpzZWNkX2NvbmZpZ19zY2FuCnJ1bl9henNlY2RfY29uZmlnX3NjYW4oKSB7CiAgICBsb2cgInN0YXJ0aW5nIgoKICAgIGxvY2FsIC1hciBjb25maWdzPSgKICAgICAgICAiYmFzZWxpbmUiCiAgICAgICAgImNsYW1hdiIKICAgICAgICAic29mdHdhcmUiCiAgICApCgogICAgbG9nICJTY2FubmluZyBjb25maWd1cmF0aW9uIGZpbGVzIHdpdGggYXpzZWNkICR7Y29uZmlnc1sqXX0iCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBzY2FuIGluICR7Y29uZmlnc1tAXX07IGRvCiAgICAgICAgbG9nICJTY2FubmluZyBjb25maWcgZmlsZSAkc2NhbiBub3ciCiAgICAgICAgL3Vzci9sb2NhbC9iaW4vYXpzZWNkIGNvbmZpZyAtcyAiJHNjYW4iIC1kIFAxRAogICAgZG9uZQp9CgojIGNyZWF0ZV9yZXF1aXJlZF9kaXJzCmNyZWF0ZV9yZXF1aXJlZF9kaXJzKCkgewogICAgY3JlYXRlX2RpcnM9KAogICAgICAgIC92YXIvbG9nL2pvdXJuYWwKICAgICAgICAvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZQogICAgICAgICMgRG9lcyBub3QgZXhpc3Qgb24gZGV2UHJveHlWTVNTCiAgICAgICAgL3Zhci9vcHQvbWljcm9zb2Z0L2xpbnV4bW9uYWdlbnQKICAgICkKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBkIGluICR7Y3JlYXRlX2RpcnNbQF19OyBkbwogICAgICAgIGxvZyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICRkIgogICAgICAgIG1rZGlyIC1wICIkZCIgfHwgYWJvcnQgImZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICRkIgogICAgZG9uZQp9CgojIGNyZWF0ZV9wb2RtYW5fbmV0d29ya3MoKQojIGFyZ3M6CiMgMSkgbmV0cyAtIG5hbWVyZWYsIGFzc29jaWF0aXZlIGFycmF5OyBOZXR3b3JrcyB0byBiZSBjcmVhdGVkCiMgICAgICAgS2V5IGlzIHRoZSBuZXR3b3JrIG5hbWUsIHZhbHVlIGlzIHRoZSBzdWJuZXQgd2l0aCBjaWRyIG5vdGF0aW9uCmNyZWF0ZV9wb2RtYW5fbmV0d29ya3MoKSB7CiAgICBsb2NhbCAtbiBuZXRzPSIkMSIKICAgIGxvZyAic3RhcnRpbmciCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDY4CiAgICBmb3IgbiBpbiAkeyFuZXRzW0BdfTsgZG8KICAgICAgICBsb2cgIkNyZWF0aW5nIHBvZG1hbiBuZXR3b3JrIFwiJG5cIiB3aXRoIHN1Ym5ldCBcIiR7bmV0c1skbl19XCIiCiAgICAgICAgcG9kbWFuIG5ldHdvcmsgXAogICAgICAgICAgICBjcmVhdGUgXAogICAgICAgICAgICAtLXN1Ym5ldCAiJHtuZXRzWyIkbiJdfSIgXAogICAgICAgICAgICAiJG4iCiAgICBkb25lCn0KCiMgZmlyZXdhbGxkX2NvbmZpZ3VyZV9iYWNrZW5kCmZpcmV3YWxsZF9jb25maWd1cmVfYmFja2VuZCgpIHsKICAgIGxvZyAic3RhcnRpbmciCgogICAgbG9nICJDaGFuZ2luZyBmaXJld2FsbGQgYmFja2VuZCB0byBpcHRhYmxlcyIKICAgIGNvbmZfZmlsZT0iL2V0Yy9maXJld2FsbGQvZmlyZXdhbGxkLmNvbmYiCiAgICBzZWQgLWkgJ3MvRmlyZXdhbGxCYWNrZW5kPW5mdGFibGVzL0ZpcmV3YWxsQmFja2VuZD1pcHRhYmxlcy9nJyAiJGNvbmZfZmlsZSIKfQoKIyBmaXJld2FsbGRfY29uZmlndXJlCiMgYXJnczoKIyAxKSBwb3J0cyAtIG5hbWVyZWYsIHN0cmluZyBhcnJheTsgcG9ydHMgdG8gYmUgZW5hYmxlZC4KIyAgICAgICBQb3J0cyBtdXN0IGJlIHBvc3RmaXhlZCB3aXRoIC90Y3Agb3IgL3VkcApmaXJld2FsbGRfY29uZmlndXJlKCkgewogICAgbG9jYWwgLW4gcG9ydHM9IiQxIgogICAgbG9nICJzdGFydGluZyIKCiAgICBmaXJld2FsbGRfY29uZmlndXJlX2JhY2tlbmQKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yYSBzZXJ2aWNlPSgKICAgICAgICAiZmlyZXdhbGxkIgogICAgKQogICAgZW5hYmxlX3NlcnZpY2VzIHNlcnZpY2UKCiAgICBsb2cgIkVuYWJsaW5nIHBvcnRzICR7cG9ydHNbKl19IG9uIGRlZmF1bHQgZmlyZXdhbGxkIHpvbmUiCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwNjgKICAgIGZvciBwb3J0IGluICR7cG9ydHNbQF19OyBkbwogICAgICAgIGxvZyAiRW5hYmxpbmcgcG9ydCAkcG9ydCBub3ciCiAgICAgICAgZmlyZXdhbGwtY21kICItLWFkZC1wb3J0PSRwb3J0IiBcCiAgICAgICAgICAgICAgICAgICAgIC0tcGVybWFuZW50CiAgICBkb25lCgogICAgbG9nICJXcml0aW5nIHJ1bnRpbWUgY29uZmlnIHRvIHBlcm1hbmVudCBjb25maWciCiAgICBmaXJld2FsbC1jbWQgLS1ydW50aW1lLXRvLXBlcm1hbmVudAp9CgojU3RhcnQgb2YgcnBWTVNTLnNoCiMhL2Jpbi9iYXNoCgpzZXQgLW8gZXJyZXhpdCBcCiAgICAtbyBwaXBlZmFpbCBcCiAgICAtbyBub3Vuc2V0CgptYWluKCkgewogICAgIyB0cmFuc2FjdGlvbiBhdHRlbXB0IHJldHJ5IHRpbWUgaW4gc2Vjb25kcwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtcmkgcmV0cnlfd2FpdF90aW1lPTMwCiAgICBsb2NhbCAtcmkgcGtnX3JldHJ5X2NvdW50PTYwCgogICAgY3JlYXRlX3JlcXVpcmVkX2RpcnMKICAgIGNvbmZpZ3VyZV9zc2hkCiAgICBjb25maWd1cmVfcnBtX3JlcG9zIHJldHJ5X3dhaXRfdGltZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICIkcGtnX3JldHJ5X2NvdW50IgoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLWFyIGV4Y2x1ZGVfcGtncz0oCiAgICAgICAgIi14IFdBTGludXhBZ2VudCIKICAgICAgICAiLXggV0FMaW51eEFnZW50LXVkZXYiCiAgICApCgogICAgZG5mX3VwZGF0ZV9wa2dzIGV4Y2x1ZGVfcGtncyBcCiAgICAgICAgICAgICAgICAgICAgcmV0cnlfd2FpdF90aW1lIFwKICAgICAgICAgICAgICAgICAgICAiJHBrZ19yZXRyeV9jb3VudCIKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yYSBpbnN0YWxsX3BrZ3M9KAogICAgICAgIGF6dXJlLWNsaQogICAgICAgIGNsYW1hdgogICAgICAgIGF6c2VjLWNsYW1hdgogICAgICAgIGF6dXJlLWNsaQogICAgICAgIGF6dXJlLW1kc2QKICAgICAgICBhenVyZS1zZWN1cml0eQogICAgICAgIHBvZG1hbgogICAgICAgIHBvZG1hbi1kb2NrZXIKICAgICAgICBvcGVuc3NsLXBlcmwKICAgICAgICAjIGhhY2sgLSB3ZSBhcmUgaW5zdGFsbGluZyBweXRob24zIG9uIGhvc3RzIGR1ZSB0byBhbiBpc3N1ZSB3aXRoIEF6dXJlIExpbnV4IEV4dGVuc2lvbnMgaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2F6dXJlLWxpbnV4LWV4dGVuc2lvbnMvcHVsbC8xNTA1CiAgICAgICAgcHl0aG9uMwogICAgICAgICMgcmVxdWlyZWQgZm9yIHBvZG1hbiBuZXR3b3JraW5nCiAgICAgICAgZmlyZXdhbGxkCiAgICApCgogICAgZG5mX2luc3RhbGxfcGtncyBpbnN0YWxsX3BrZ3MgXAogICAgICAgICAgICAgICAgICAgICByZXRyeV93YWl0X3RpbWUgXAogICAgICAgICAgICAgICAgICAgICAiJHBrZ19yZXRyeV9jb3VudCIKCiAgICAjIFRPRE8gcmVtb3ZlIHRoaXMgb25jZSBNaWNyb3NvZnRDQkxNYXJpbmVyOmNibC1tYXJpbmVyOmNibC1tYXJpbmVyLTItZ2VuMi1maXBzIHN1cHBvcnRzIGF1dG9tYXRpYyB1cGRhdGVzCiAgICAjIFJlZmVyZW5jZTogaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtbWFjaGluZS1zY2FsZS1zZXRzL3ZpcnR1YWwtbWFjaGluZS1zY2FsZS1zZXRzLWF1dG9tYXRpYy11cGdyYWRlI3N1cHBvcnRlZC1vcy1pbWFnZXMKICAgIGNvbmZpZ3VyZV9kbmZfY3Jvbl9qb2IKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIxMTkKICAgIGNvbmZpZ3VyZV9sb2dyb3RhdGUKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIxNTMgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIG1kbWltYWdlPSIke1JQSU1BR0UlJS8qfS8ke01ETUlNQUdFIyovfSIKICAgIGxvY2FsIC1yIHJwaW1hZ2U9IiRSUElNQUdFIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBmbHVlbnRiaXRfaW1hZ2U9IiRGTFVFTlRCSVRJTUFHRSIKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXJBIGFyb19pbWFnZXM9KAogICAgICAgIFsibWRtIl09Im1kbWltYWdlIgogICAgICAgIFsicnAiXT0icnBpbWFnZSIKICAgICAgICBbImZsdWVudGJpdCJdPSJmbHVlbnRiaXRfaW1hZ2UiCiAgICApCgogICAgcHVsbF9jb250YWluZXJfaW1hZ2VzIGFyb19pbWFnZXMKCiAgICBsb2NhbCAtciBhcm9fbmV0d29yaz0iYXJvIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtckEgbmV0d29ya3M9KAogICAgICAgIFsiJGFyb19uZXR3b3JrIl09IjE5Mi4xNjguMjU0LjAvMjQiCiAgICApCiAgICBjcmVhdGVfcG9kbWFuX25ldHdvcmtzIG5ldHdvcmtzCgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtcmEgZW5hYmxlX3BvcnRzPSgKICAgICAgICAjIFJQIGZyb250ZW5kCiAgICAgICAgIjQ0My90Y3AiCiAgICAgICAgIyBQb3J0YWwgd2ViCiAgICAgICAgIjQ0NC90Y3AiCiAgICAgICAgIyBQb3J0YWwgc3NoCiAgICAgICAgIjIyMjIvdGNwIgogICAgICAgICMgSklUIHNzaAogICAgICAgICIyMi90Y3AiCiAgICApCgogICAgZmlyZXdhbGxkX2NvbmZpZ3VyZSBlbmFibGVfcG9ydHMKCiAgICAjIExPR0tJTkQgYXBwZWFycyB0byBubyBsb25nZXIgYmUgYSB2YXJpYWJsZSB0aGF0IGlzIGNhcnJpZWQgb3ZlciBieSB0aGUgZGVwbG95IHBpcGVsaW5lCiAgICAjIFN1YnN0aXR1dGluZyBpdCB3aXRoIGFuIGVtcHR5IHN0cmluZwogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBmbHVlbnRiaXRfY29uZl9maWxlPSJbSU5QVVRdCk5hbWUgc3lzdGVtZApUYWcgam91cm5hbGQKU3lzdGVtZF9GaWx0ZXIgX0NPTU09YXJvCkRCIC92YXIvbGliL2ZsdWVudC9qb3VybmFsZGIKCltGSUxURVJdCglOYW1lIG1vZGlmeQoJTWF0Y2ggam91cm5hbGQKCVJlbW92ZV93aWxkY2FyZCBfCglSZW1vdmUgVElNRVNUQU1QCgpbRklMVEVSXQoJTmFtZSByZXdyaXRlX3RhZwoJTWF0Y2ggam91cm5hbGQKCVJ1bGUgJHtMT0dLSU5EOi19IGFzeW5jcW9zIGFzeW5jcW9zIHRydWUKCltGSUxURVJdCglOYW1lIG1vZGlmeQoJTWF0Y2ggYXN5bmNxb3MKCVJlbW92ZSBDTElFTlRfUFJJTkNJUEFMX05BTUUKCVJlbW92ZSBGSUxFCglSZW1vdmUgQ09NUE9ORU5UCgpbRklMVEVSXQoJTmFtZSByZXdyaXRlX3RhZwoJTWF0Y2ggam91cm5hbGQKCVJ1bGUgJHtMT0dLSU5EOi19IGlmeGF1ZGl0IGlmeGF1ZGl0IGZhbHNlCgpbT1VUUFVUXQoJTmFtZSBmb3J3YXJkCglNYXRjaCAqCglQb3J0IDI5MjMwIgoKCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIwMzQKICAgIGxvY2FsIC1yIG1kc2RfY29uZmlnX3ZlcnNpb249IiRSUE1EU0RDT05GSUdWRVJTSU9OIgogICAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMDM0CiAgICBsb2NhbCAtciBhcm9fcnBfY29uZl9maWxlPSJBQ1JfUkVTT1VSQ0VfSUQ9JyRBQ1JSRVNPVVJDRUlEJwpBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUU9JyRBRE1JTkFQSUNMSUVOVENFUlRDT01NT05OQU1FJwpBUk1fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FPSckQVJNQVBJQ0xJRU5UQ0VSVENPTU1PTk5BTUUnCkFaVVJFX0FSTV9DTElFTlRfSUQ9JyRBUk1DTElFTlRJRCcKQVpVUkVfRlBfQ0xJRU5UX0lEPSckRlBDTElFTlRJRCcKQVpVUkVfRlBfU0VSVklDRV9QUklOQ0lQQUxfSUQ9JyRGUFNFUlZJQ0VQUklOQ0lQQUxJRCcKQ0xVU1RFUl9NRE1fQUNDT1VOVD0nJENMVVNURVJNRE1BQ0NPVU5UJwpDTFVTVEVSX01ETV9OQU1FU1BBQ0U9UlAKQ0xVU1RFUl9NRFNEX0FDQ09VTlQ9JyRDTFVTVEVSTURTREFDQ09VTlQnCkNMVVNURVJfTURTRF9DT05GSUdfVkVSU0lPTj0nJENMVVNURVJNRFNEQ09ORklHVkVSU0lPTicKQ0xVU1RFUl9NRFNEX05BTUVTUEFDRT0nJENMVVNURVJNRFNETkFNRVNQQUNFJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpET01BSU5fTkFNRT0nJExPQ0FUSU9OLiRDTFVTVEVSUEFSRU5URE9NQUlOTkFNRScKR0FURVdBWV9ET01BSU5TPSckR0FURVdBWURPTUFJTlMnCkdBVEVXQVlfUkVTT1VSQ0VHUk9VUD0nJEdBVEVXQVlSRVNPVVJDRUdST1VQTkFNRScKS0VZVkFVTFRfUFJFRklYPSckS0VZVkFVTFRQUkVGSVgnCk1ETV9BQ0NPVU5UPSckUlBNRE1BQ0NPVU5UJwpNRE1fTkFNRVNQQUNFPScke3JvbGVfcnBeXn0nCk1EU0RfRU5WSVJPTk1FTlQ9JyRNRFNERU5WSVJPTk1FTlQnClJQX0ZFQVRVUkVTPSckUlBGRUFUVVJFUycKUlBJTUFHRT0nJHJwaW1hZ2UnCkFST19JTlNUQUxMX1ZJQV9ISVZFPSckQ0xVU1RFUlNJTlNUQUxMVklBSElWRScKQVJPX0hJVkVfREVGQVVMVF9JTlNUQUxMRVJfUFVMTFNQRUM9JyRDTFVTVEVSREVGQVVMVElOU1RBTExFUlBVTExTUEVDJwpBUk9fQURPUFRfQllfSElWRT0nJENMVVNURVJTQURPUFRCWUhJVkUnCk9JRENfQUZEX0VORFBPSU5UPSckTE9DQVRJT04ub2ljLiRSUFBBUkVOVERPTUFJTk5BTUUnCk9JRENfU1RPUkFHRV9BQ0NPVU5UX05BTUU9JyRPSURDU1RPUkFHRUFDQ09VTlROQU1FJwoiCgogICAgIyB2YWx1ZXMgYXJlIHJlZmVyZW5jZXMgdG8gdmFyaWFibGVzLCB0aGV5IHNob3VsZCBub3QgYmUgZGVyZWZlcmVuY2VkIGhlcmUKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXJBIGFyb19jb25maWdzPSgKICAgICAgICBbInJwX2NvbmZpZyJdPSJhcm9fcnBfY29uZl9maWxlIgogICAgICAgIFsiZmx1ZW50Yml0Il09ImZsdWVudGJpdF9jb25mX2ZpbGUiCiAgICAgICAgWyJtZHNkIl09Im1kc2RfY29uZmlnX3ZlcnNpb24iCiAgICAgICAgWyJuZXR3b3JrIl09ImFyb19uZXR3b3JrIgogICAgKQoKICAgIGNvbmZpZ3VyZV92bXNzX2Fyb19zZXJ2aWNlcyByb2xlX3JwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm9faW1hZ2VzIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm9fY29uZmlncwoKICAgICMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjAzNAogICAgbG9jYWwgLXJhIGFyb19zZXJ2aWNlcz0oCiAgICAgICAgImFyby1tb25pdG9yIgogICAgICAgICJhcm8tcG9ydGFsIgogICAgICAgICJhcm8tcnAiCiAgICAgICAgImF6c2VjZCIKICAgICAgICAibWRzZCIKICAgICAgICAibWRtIgogICAgICAgICJjaHJvbnlkIgogICAgICAgICJmbHVlbnRiaXQiCiAgICAgICAgImRvd25sb2FkLW1kc2QtY3JlZGVudGlhbHMudGltZXIiCiAgICAgICAgImRvd25sb2FkLW1kbS1jcmVkZW50aWFscy50aW1lciIKICAgICAgICAiZmlyZXdhbGxkIgogICAgKQoKICAgIGVuYWJsZV9zZXJ2aWNlcyBhcm9fc2VydmljZXMKCiAgICByZWJvb3Rfdm0KfQoKZXhwb3J0IEFaVVJFX0NMT1VEX05BTUU9IiR7QVpVUkVDTE9VRE5BTUU6PyJGYWlsZWQgdG8gY2Fycnkgb3ZlciB2YXJpYWJsZXMifSIKCiMgdXRpbC5zaCBkb2VzIG5vdCBleGlzdCB3aGVuIGRlcGxveWVkIHRvIFZNU1MgdmlhIFZNU1MgZXh0ZW5zaW9ucwojIFRoaXMgaXMgYmVjYXVzZSBjb21tb25WTVNTLnNoIGlzIGNvbmNhdGVuYXRlZCB3aXRoIHRoaXMgc2NyaXB0CnV0aWw9InV0aWwuc2giCmlmIFsgLWYgIiR1dGlsIiBdOyB0aGVuCiAgICAjIHNoZWxsY2hlY2sgc291cmNlPXV0aWwuc2gKICAgIHNvdXJjZSAiJHV0aWwiCmZpCgptYWluICIkQCIK')))]" + } + } + }, + { + "name": "AzureMonitorLinuxAgent", + "properties": { + "publisher": "Microsoft.Azure.Monitor", + "type": "AzureMonitorLinuxAgent", + "typeHandlerVersion": "1.0", + "autoUpgradeMinorVersion": true, + "enableAutomaticUpgrade": true, + "settings": { + "GCS_AUTO_CONFIG": true } } } diff --git a/pkg/deploy/generator/resources_gateway.go b/pkg/deploy/generator/resources_gateway.go index 3bde84b1156..4bf7576036d 100644 --- a/pkg/deploy/generator/resources_gateway.go +++ b/pkg/deploy/generator/resources_gateway.go @@ -352,6 +352,23 @@ func (g *generator) gatewayVMSS() *arm.Resource { }, }, }, + { + // az-secmonitor package no longer needs to be manually installed + // References: + // https://eng.ms/docs/products/azure-linux/gettingstarted/aks/monitoring + // https://msazure.visualstudio.com/ASMDocs/_wiki/wikis/ASMDocs.wiki/179541/Linux-AzSecPack-AutoConfig-Onboarding-(manual-for-C-AI)?anchor=3.1.1-using-arm-template-resource-elements + Name: to.StringPtr("AzureMonitorLinuxAgent"), + VirtualMachineScaleSetExtensionProperties: &mgmtcompute.VirtualMachineScaleSetExtensionProperties{ + Publisher: to.StringPtr("Microsoft.Azure.Monitor"), + EnableAutomaticUpgrade: to.BoolPtr(true), + AutoUpgradeMinorVersion: to.BoolPtr(true), + TypeHandlerVersion: to.StringPtr("1.0"), + Type: to.StringPtr("AzureMonitorLinuxAgent"), + Settings: map[string]interface{}{ + "GCS_AUTO_CONFIG": true, + }, + }, + }, }, }, DiagnosticsProfile: &mgmtcompute.DiagnosticsProfile{ diff --git a/pkg/deploy/generator/resources_rp.go b/pkg/deploy/generator/resources_rp.go index c9deaa8b90b..30ed9755fb2 100644 --- a/pkg/deploy/generator/resources_rp.go +++ b/pkg/deploy/generator/resources_rp.go @@ -488,10 +488,11 @@ func (g *generator) rpVMSS() *arm.Resource { }, }, StorageProfile: &mgmtcompute.VirtualMachineScaleSetStorageProfile{ + // https://eng.ms/docs/products/azure-linux/gettingstarted/azurevm/azurevm ImageReference: &mgmtcompute.ImageReference{ Publisher: to.StringPtr("MicrosoftCBLMariner"), Offer: to.StringPtr("cbl-mariner"), - Sku: to.StringPtr("cbl-mariner-2-fips"), + Sku: to.StringPtr("cbl-mariner-2-gen2-fips"), Version: to.StringPtr("latest"), }, OsDisk: &mgmtcompute.VirtualMachineScaleSetOSDisk{ @@ -549,6 +550,23 @@ func (g *generator) rpVMSS() *arm.Resource { }, }, }, + { + // az-secmonitor package no longer needs to be manually installed + // References: + // https://eng.ms/docs/products/azure-linux/gettingstarted/aks/monitoring + // https://msazure.visualstudio.com/ASMDocs/_wiki/wikis/ASMDocs.wiki/179541/Linux-AzSecPack-AutoConfig-Onboarding-(manual-for-C-AI)?anchor=3.1.1-using-arm-template-resource-elements + Name: to.StringPtr("AzureMonitorLinuxAgent"), + VirtualMachineScaleSetExtensionProperties: &mgmtcompute.VirtualMachineScaleSetExtensionProperties{ + Publisher: to.StringPtr("Microsoft.Azure.Monitor"), + EnableAutomaticUpgrade: to.BoolPtr(true), + AutoUpgradeMinorVersion: to.BoolPtr(true), + TypeHandlerVersion: to.StringPtr("1.0"), + Type: to.StringPtr("AzureMonitorLinuxAgent"), + Settings: map[string]interface{}{ + "GCS_AUTO_CONFIG": true, + }, + }, + }, }, }, DiagnosticsProfile: &mgmtcompute.DiagnosticsProfile{ diff --git a/pkg/deploy/generator/scripts/gatewayVMSS.sh b/pkg/deploy/generator/scripts/gatewayVMSS.sh index 9a697ad9663..64fd6f88723 100644 --- a/pkg/deploy/generator/scripts/gatewayVMSS.sh +++ b/pkg/deploy/generator/scripts/gatewayVMSS.sh @@ -1,46 +1,36 @@ #!/bin/bash set -o errexit \ + -o pipefail \ -o nounset -if [ "${DEBUG:-false}" == true ]; then - set -x -fi - main() { # transaction attempt retry time in seconds + # shellcheck disable=SC2034 local -ri retry_wait_time=30 + # shellcheck disable=SC2068 local -ri pkg_retry_count=60 create_required_dirs configure_sshd - configure_rpm_repos retry_wait_time "$pkg_retry_count" + configure_rpm_repos retry_wait_time \ + "$pkg_retry_count" + # shellcheck disable=SC2034 local -ar exclude_pkgs=( "-x WALinuxAgent" "-x WALinuxAgent-udev" ) - dnf_update_pkgs exclude_pkgs retry_wait_time "$pkg_retry_count" - - local -ra rpm_keys=( - https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8 - https://packages.microsoft.com/keys/microsoft.asc - ) - - rpm_import_keys rpm_keys retry_wait_time "$pkg_retry_count" - - local -ra repo_rpm_pkgs=( - https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm - ) - - dnf_install_pkgs repo_rpm_pkgs retry_wait_time "$pkg_retry_count" + dnf_update_pkgs exclude_pkgs \ + retry_wait_time \ + "$pkg_retry_count" + # shellcheck disable=SC2034 local -ra install_pkgs=( - at + azure-cli clamav azsec-clamav - azsec-monitor azure-cli azure-mdsd azure-security @@ -49,53 +39,57 @@ main() { openssl-perl # hack - we are installing python3 on hosts due to an issue with Azure Linux Extensions https://github.com/Azure/azure-linux-extensions/pull/1505 python3 + # required for podman networking + firewalld ) - dnf_install_pkgs install_pkgs retry_wait_time "$pkg_retry_count" + dnf_install_pkgs install_pkgs \ + retry_wait_time \ + "$pkg_retry_count" + + # TODO remove this once MicrosoftCBLMariner:cbl-mariner:cbl-mariner-2-gen2-fips supports automatic updates + # Reference: https://learn.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-automatic-upgrade#supported-os-images configure_dnf_cron_job - configure_disk_partitions - - # log directory to be mounted to running container - local -r gateway_logdir='/var/log/aro-gateway' - local -r gateway_log_file="# Maximum log directory size is 100G with this configuration -# Setting limit to 100G to allow space for other logging services -# copytruncate is a critical option used to prevent logs from being shipped twice -${gateway_logdir} { - size 20G - rotate 5 - create 0600 root root - copytruncate - noolddir - compress -}" - - # Key dictates the filename written in /etc/logrotate.d - local -rA logrotate_dropins=( - ["gateway"]="$gateway_log_file" - ) - configure_logrotate logrotate_dropins - configure_selinux + # shellcheck disable=SC2119 + configure_logrotate - local -ra enable_ports=( - "80/tcp" - "8081/tcp" - "443/tcp" - ) - configure_firewalld_rules enable_ports - - # shellcheck disable=SC2153 + # shellcheck disable=SC2034 disable=SC2153 local -r mdmimage="${RPIMAGE%%/*}/${MDMIMAGE#*/}" local -r rpimage="$RPIMAGE" + # shellcheck disable=SC2034 local -r fluentbit_image="$FLUENTBITIMAGE" # values are references to variables, they should not be dereferenced here + # shellcheck disable=SC2034 local -rA aro_images=( ["mdm"]="mdmimage" ["rp"]="rpimage" ["fluentbit"]="fluentbit_image" ) - pull_container_images aro_images true + pull_container_images aro_images + + local -r aro_network="aro" + # shellcheck disable=SC2034 + local -rA networks=( + ["$aro_network"]="192.168.254.0/24" + ) + create_podman_networks networks + + # shellcheck disable=SC2034 + local -ra enable_ports=( + # RP gateway + "80/tcp" + "8081/tcp" + "443/tcp" + # JIT ssh + "22/tcp" + ) + + firewalld_configure enable_ports + + + # shellcheck disable=SC2034 local -r fluentbit_conf_file="[INPUT] Name systemd Tag journald @@ -113,40 +107,42 @@ DB /var/lib/fluent/journaldb Match * Port 29230" + # shellcheck disable=SC2034 local -r aro_gateway_conf_file="ACR_RESOURCE_ID='$ACRRESOURCEID' DATABASE_ACCOUNT_NAME='$DATABASEACCOUNTNAME' -AZURE_DBTOKEN_CLIENT_ID='$DBTOKENCLIENTID' -DBTOKEN_URL='$DBTOKENURL' MDM_ACCOUNT='$RPMDMACCOUNT' MDM_NAMESPACE='${role_gateway^}' GATEWAY_DOMAINS='$GATEWAYDOMAINS' GATEWAY_FEATURES='$GATEWAYFEATURES' RPIMAGE='$rpimage'" + # shellcheck disable=SC2034 local -r mdsd_config_version="$GATEWAYMDSDCONFIGVERSION" + # values are references to variables, they should not be dereferenced here + # shellcheck disable=SC2034 local -rA aro_configs=( ["gateway_config"]="aro_gateway_conf_file" ["fluentbit"]="fluentbit_conf_file" ["mdsd"]="mdsd_config_version" - ["log_dir"]="gateway_logdir" + ["network"]="aro_network" ) configure_vmss_aro_services role_gateway \ aro_images \ aro_configs + # shellcheck disable=SC2034 local -ra gateway_services=( "aro-gateway" - "auoms" "azsecd" - "azsecmond" "mdsd" "mdm" "chronyd" "fluentbit" "download-mdsd-credentials.timer" "download-mdm-credentials.timer" + "firewalld" ) enable_services gateway_services diff --git a/pkg/deploy/generator/scripts/rpVMSS.sh b/pkg/deploy/generator/scripts/rpVMSS.sh index 7e429b3148d..24b629dd7aa 100644 --- a/pkg/deploy/generator/scripts/rpVMSS.sh +++ b/pkg/deploy/generator/scripts/rpVMSS.sh @@ -1,46 +1,35 @@ #!/bin/bash set -o errexit \ + -o pipefail \ -o nounset -if [ "${DEBUG:-false}" == true ]; then - set -x -fi - main() { # transaction attempt retry time in seconds + # shellcheck disable=SC2034 local -ri retry_wait_time=30 local -ri pkg_retry_count=60 create_required_dirs configure_sshd - configure_rpm_repos retry_wait_time "$pkg_retry_count" + configure_rpm_repos retry_wait_time \ + "$pkg_retry_count" + # shellcheck disable=SC2034 local -ar exclude_pkgs=( "-x WALinuxAgent" "-x WALinuxAgent-udev" ) - dnf_update_pkgs exclude_pkgs retry_wait_time "$pkg_retry_count" - - local -ra rpm_keys=( - https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8 - https://packages.microsoft.com/keys/microsoft.asc - ) - - rpm_import_keys rpm_keys retry_wait_time "$pkg_retry_count" - - local -ra repo_rpm_pkgs=( - https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm - ) - - dnf_install_pkgs repo_rpm_pkgs retry_wait_time "$pkg_retry_count" + dnf_update_pkgs exclude_pkgs \ + retry_wait_time \ + "$pkg_retry_count" + # shellcheck disable=SC2034 local -ra install_pkgs=( - at + azure-cli clamav azsec-clamav - azsec-monitor azure-cli azure-mdsd azure-security @@ -49,38 +38,59 @@ main() { openssl-perl # hack - we are installing python3 on hosts due to an issue with Azure Linux Extensions https://github.com/Azure/azure-linux-extensions/pull/1505 python3 + # required for podman networking + firewalld ) - dnf_install_pkgs install_pkgs retry_wait_time "$pkg_retry_count" + dnf_install_pkgs install_pkgs \ + retry_wait_time \ + "$pkg_retry_count" + + # TODO remove this once MicrosoftCBLMariner:cbl-mariner:cbl-mariner-2-gen2-fips supports automatic updates + # Reference: https://learn.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-automatic-upgrade#supported-os-images configure_dnf_cron_job - configure_disk_partitions - # Key dictates the filename written in /etc/logrotate.d - # local -rA logrotate_dropins=() + # shellcheck disable=SC2119 configure_logrotate - configure_selinux - local -ra enable_ports=( - "443/tcp" - "444/tcp" - "2222/tcp" - ) - - configure_firewalld_rules enable_ports - - # shellcheck disable=SC2153 + # shellcheck disable=SC2153 disable=SC2034 local -r mdmimage="${RPIMAGE%%/*}/${MDMIMAGE#*/}" local -r rpimage="$RPIMAGE" + # shellcheck disable=SC2034 local -r fluentbit_image="$FLUENTBITIMAGE" + # shellcheck disable=SC2034 local -rA aro_images=( ["mdm"]="mdmimage" ["rp"]="rpimage" ["fluentbit"]="fluentbit_image" ) - pull_container_images aro_images true + + pull_container_images aro_images + + local -r aro_network="aro" + # shellcheck disable=SC2034 + local -rA networks=( + ["$aro_network"]="192.168.254.0/24" + ) + create_podman_networks networks + + # shellcheck disable=SC2034 + local -ra enable_ports=( + # RP frontend + "443/tcp" + # Portal web + "444/tcp" + # Portal ssh + "2222/tcp" + # JIT ssh + "22/tcp" + ) + + firewalld_configure enable_ports # LOGKIND appears to no longer be a variable that is carried over by the deploy pipeline # Substituting it with an empty string + # shellcheck disable=SC2034 local -r fluentbit_conf_file="[INPUT] Name systemd Tag journald @@ -110,25 +120,15 @@ DB /var/lib/fluent/journaldb Match journald Rule ${LOGKIND:-} ifxaudit ifxaudit false -[FILTER] - Name rewrite_tag - Match journald - Rule $LOGKIND outboundRequests outboundRequests false - -[FILTER] - Name modify - Match outboundRequests - Remove CLIENT_PRINCIPAL_NAME - Remove FILE - Remove COMPONENT - [OUTPUT] Name forward Match * Port 29230" + # shellcheck disable=SC2034 local -r mdsd_config_version="$RPMDSDCONFIGVERSION" + # shellcheck disable=SC2034 local -r aro_rp_conf_file="ACR_RESOURCE_ID='$ACRRESOURCEID' ADMIN_API_CLIENT_CERT_COMMON_NAME='$ADMINAPICLIENTCERTCOMMONNAME' ARM_API_CLIENT_CERT_COMMON_NAME='$ARMAPICLIENTCERTCOMMONNAME' @@ -158,29 +158,31 @@ OIDC_STORAGE_ACCOUNT_NAME='$OIDCSTORAGEACCOUNTNAME' " # values are references to variables, they should not be dereferenced here + # shellcheck disable=SC2034 local -rA aro_configs=( ["rp_config"]="aro_rp_conf_file" ["fluentbit"]="fluentbit_conf_file" ["mdsd"]="mdsd_config_version" + ["network"]="aro_network" ) configure_vmss_aro_services role_rp \ aro_images \ aro_configs + # shellcheck disable=SC2034 local -ra aro_services=( "aro-monitor" "aro-portal" "aro-rp" - "auoms" "azsecd" - "azsecmond" "mdsd" "mdm" "chronyd" "fluentbit" "download-mdsd-credentials.timer" "download-mdm-credentials.timer" + "firewalld" ) enable_services aro_services diff --git a/pkg/deploy/generator/scripts/util-common.sh b/pkg/deploy/generator/scripts/util-common.sh index 71782504802..4beb3fced16 100644 --- a/pkg/deploy/generator/scripts/util-common.sh +++ b/pkg/deploy/generator/scripts/util-common.sh @@ -2,6 +2,7 @@ # Internal Functions and Constants # empty_str - constant; used by functions for optional nameref string arguements +# shellcheck disable=SC2034 declare -r empty_str="" # role_gateway is used to determine which VMSS is being bootstrapped @@ -121,29 +122,11 @@ get_keyvault_suffix() { esac } -# configure_selinux -# args: -# 1) relabel - boolean, optional; defaults to false -# Relabel filesystem context -configure_selinux() { - local -r relabel="${1:-false}" - log "starting" - - already_defined_ignore_error="File context for /var/log/journal(/.*)? already defined" - semanage fcontext -a -t var_log_t "/var/log/journal(/.*)?" || log "$already_defined_ignore_error" - chcon -R system_u:object_r:var_log_t:s0 /var/opt/microsoft/linuxmonagent - - if $relabel; then - restorecon -RF /var/log/* || log "$already_defined_ignore_error" - fi -} - # reboot_vm restores all selinux file contexts, then schedules a reboot for one hour later # Reboots should scheduled after all VM extensions have had time to complete # Reference: https://learn.microsoft.com/en-us/azure/virtual-machines/extensions/custom-script-linux#tips reboot_vm() { log "starting" - configure_selinux "true" (shutdown -r now &) } diff --git a/pkg/deploy/generator/scripts/util-packages.sh b/pkg/deploy/generator/scripts/util-packages.sh index 763d218f45a..c115ba5d56d 100644 --- a/pkg/deploy/generator/scripts/util-packages.sh +++ b/pkg/deploy/generator/scripts/util-packages.sh @@ -1,6 +1,23 @@ #!/bin/bash # Repository and package management related functions +configure_repo_mariner_extended() { + local -r extended_repo_config="https://packages.microsoft.com/cbl-mariner/2.0/prod/extended/x86_64/config.repo" + curl -sSL "$extended_repo_config" -o /etc/yum.repos.d/mariner-extended.repo + + local -r repo_name="cbl-mariner2.0prodextendedx86_64" + + local -ra cmd=( + dnf + update + -y + --enablerepo="$repo_name" + ) + + log "Enabling repo $repo_name" + retry cmd "$1" "${2:-}" +} + # configure_rpm_repos # New repositories should be added in their own functions, and called here # args: @@ -9,8 +26,7 @@ configure_rpm_repos() { log "starting" - configure_rhui_repo "$1" "${2:-}" - create_azure_rpm_repos + configure_repo_mariner_extended "$1" "${2:-1}" } # dnf_install_pkgs @@ -70,46 +86,6 @@ dnf_update_pkgs() { retry cmd "$2" "${3:-}" } - -# create_azure_rpm_repos creates /etc/yum.repos.d/azure.repo repository file -create_azure_rpm_repos() { - log "starting" - - local -r azure_repo_filename='/etc/yum.repos.d/azure.repo' - local -r azure_repo_file='[azure-cli] -name=azure-cli -baseurl=https://packages.microsoft.com/yumrepos/azure-cli -enabled=yes -gpgcheck=yes - -[azurecore] -name=azurecore -baseurl=https://packages.microsoft.com/yumrepos/azurecore -enabled=yes -gpgcheck=no' - - write_file azure_repo_filename azure_repo_file true -} - -# configure_rhui_repo enables all rhui-microsoft-azure* repos -# args: -# 1) wait_time - nameref, integer; Time to wait before retrying command -# 2) retries - integer, optional; Amount of times to retry command, defaults to 5 -configure_rhui_repo() { - log "starting" - - local -ra cmd=( - dnf - update - -y - --disablerepo='*' - --enablerepo='rhui-microsoft-azure*' - ) - - log "running RHUI package updates" - retry cmd "$1" "${2:-}" -} - # configure_dnf_cron_job # create cron job to auto update rpm packages configure_dnf_cron_job() { diff --git a/pkg/deploy/generator/scripts/util-services.sh b/pkg/deploy/generator/scripts/util-services.sh index df4546dcd14..bae97ccc3fc 100644 --- a/pkg/deploy/generator/scripts/util-services.sh +++ b/pkg/deploy/generator/scripts/util-services.sh @@ -1,64 +1,36 @@ #!/bin/bash # ARO service setup functions -# configure_vmss_aro_service -# args: -# 1) r - nameref, string; role of VMSS -# 2) images - nameref, associative array; ARO container images -# 3) configs - nameref, associative array; configuration files and versions. The values should be a reference to variables, not dereferenced. -# This is because the value is used when creating nameref variables by helper functions. -configure_vmss_aro_services() { - local -n r="$1" - local -n images="$2" - local -n configs="$3" - log "starting" - verify_role "$1" - - if [ "$r" == "$role_gateway" ]; then - configure_service_aro_gateway "${configs["log_dir"]}" "${images["rp"]}" "$1" "${configs["gateway_config"]}" - elif [ "$r" == "$role_rp" ]; then - configure_service_aro_rp "${images["rp"]}" "$1" "${configs["rp_config"]}" - configure_service_aro_monitor "${images["rp"]}" - configure_service_aro_portal "${images["rp"]}" - fi - - configure_service_fluentbit "${configs["fluentbit"]}" "${images["fluentbit"]}" - configure_service_mdm "$1" "${images["mdm"]}" - configure_service_mdsd "$1" "${configs["mdsd"]}" - configure_certs "$1" - configure_timers_mdm_mdsd "$1" -} - # enable_services enables all services required for aro rp # args: # 1) services - array; services to be enabled enable_services() { - local -n services="$1" + local -n svcs="$1" log "starting" systemctl daemon-reload - log "enabling services ${services[*]}" + log "enabling services ${svcs[*]}" # shellcheck disable=SC2068 - for service in ${services[@]}; do - log "Enabling and starting $service now" + for svc in ${svcs[@]}; do + log "Enabling and starting $svc now" systemctl enable \ --now \ - "$service" + "$svc" done } # configure_service_aro_gateway # args: -# 1) log_dir - nameref, string; directory to mount for logging directory of container -# 2) image - nameref, string; container image -# 3) role - nameref, string; VMSS role -# 4) conf_file - nameref, string; aro gateway environment file +# 1) image - nameref, string; container image +# 2) role - nameref, string; VMSS role +# 3) conf_file - nameref, string; aro gateway environment file +# 4) network - nameref, string; podman network name to be attached configure_service_aro_gateway() { - local -n log_dir="$1" - local -n image="$2" - local -n role="$3" - local -n conf_file="$4" + local -n image="$1" + local -n role="$2" + local -n conf_file="$3" + local -n network="$4" log "starting" log "Configuring aro-gateway service" @@ -66,17 +38,18 @@ configure_service_aro_gateway() { write_file aro_gateway_conf_filename conf_file true + # shellcheck disable=SC2034 local -r aro_gateway_service_filename='/etc/systemd/system/aro-gateway.service' + # shellcheck disable=SC2034 local -r aro_gateway_service_file="[Unit] After=network-online.target Wants=network-online.target [Service] EnvironmentFile=${aro_gateway_conf_filename} -ExecStartPre=-/usr/bin/docker rm -f %N -ExecStartPre=/usr/bin/mkdir -p ${log_dir} -ExecStart=/usr/bin/docker run \ +ExecStartPre=-/usr/bin/podman rm -f %N +ExecStart=/usr/bin/podman run \ --hostname %H \ --name %N \ --rm \ @@ -88,15 +61,15 @@ ExecStart=/usr/bin/docker run \ -e MDM_ACCOUNT \ -e MDM_NAMESPACE \ -m 2g \ + --network=$network \ -p 80:8080 \ -p 8081:8081 \ -p 443:8443 \ -v /run/systemd/journal:/run/systemd/journal \ -v /var/etw:/var/etw:z \ - -v ${log_dir}:/ctr.log:z \ $image \ ${role,,} -ExecStop=/usr/bin/docker stop -t 3600 %N +ExecStop=/usr/bin/podman stop -t 3600 %N TimeoutStopSec=3600 Restart=always RestartSec=1 @@ -114,10 +87,12 @@ WantedBy=multi-user.target # 1) image - nameref, string; RP container image # 2) role - nameref, string; VMSS role # 3) conf_file - nameref, string; aro rp environment file +# 4) network - nameref, string; podman network name to be attached configure_service_aro_rp() { local -n image="$1" local -n role="$2" local -n conf_file="$3" + local -n network="$4" log "starting" log "Configuring aro-rp service" @@ -125,15 +100,17 @@ configure_service_aro_rp() { write_file aro_rp_conf_filename conf_file true + # shellcheck disable=SC2034 local -r aro_rp_service_filename='/etc/systemd/system/aro-rp.service' + # shellcheck disable=SC2034 local -r aro_rp_service_file="[Unit] After=network-online.target Wants=network-online.target [Service] EnvironmentFile=${aro_rp_conf_filename} -ExecStartPre=-/usr/bin/docker rm -f %N -ExecStart=/usr/bin/docker run \ +ExecStartPre=-/usr/bin/podman rm -f %N +ExecStart=/usr/bin/podman run \ --hostname %H \ --name %N \ --rm \ @@ -160,17 +137,17 @@ ExecStart=/usr/bin/docker run \ -e ARO_INSTALL_VIA_HIVE \ -e ARO_HIVE_DEFAULT_INSTALLER_PULLSPEC \ -e ARO_ADOPT_BY_HIVE \ - -e USE_CHECKACCESS \ -e OIDC_AFD_ENDPOINT \ -e OIDC_STORAGE_ACCOUNT_NAME \ -m 2g \ + --network=$network \ -p 443:8443 \ -v /etc/aro-rp:/etc/aro-rp \ -v /run/systemd/journal:/run/systemd/journal \ -v /var/etw:/var/etw:z \ $image \ ${role,,} -ExecStop=/usr/bin/docker stop -t 3600 %N +ExecStop=/usr/bin/podman stop -t 3600 %N TimeoutStopSec=3600 Restart=always RestartSec=1 @@ -185,14 +162,18 @@ WantedBy=multi-user.target" # configure_service_aro_monitor # args: # 1) image - nameref, string; RP container image +# 2) network - nameref, string; podman network name to be attached configure_service_aro_monitor() { local -n image="$1" + local -n network="$2" log "starting" log "Configuring aro-monitor service" # DOMAIN_NAME, CLUSTER_MDSD_ACCOUNT, CLUSTER_MDSD_CONFIG_VERSION, GATEWAY_DOMAINS, GATEWAY_RESOURCEGROUP, MDSD_ENVIRONMENT CLUSTER_MDSD_NAMESPACE # are not used, but can't easily be refactored out. Should be revisited in the future. + # shellcheck disable=SC2034 local -r aro_monitor_service_conf_filename='/etc/sysconfig/aro-monitor' + # shellcheck disable=SC2034 local -r aro_monitor_service_conf_file="AZURE_FP_CLIENT_ID='$FPCLIENTID' DOMAIN_NAME='$LOCATION.$CLUSTERPARENTDOMAINNAME' CLUSTER_MDSD_ACCOUNT='$CLUSTERMDSDACCOUNT' @@ -211,19 +192,22 @@ RPIMAGE='$image'" write_file aro_monitor_service_conf_filename aro_monitor_service_conf_file true + # shellcheck disable=SC2034 local -r aro_monitor_service_filename='/etc/systemd/system/aro-monitor.service' + # shellcheck disable=SC2034 local -r aro_monitor_service_file="[Unit] After=network-online.target Wants=network-online.target [Service] EnvironmentFile=/etc/sysconfig/aro-monitor -ExecStartPre=-/usr/bin/docker rm -f %N -ExecStart=/usr/bin/docker run \ +ExecStartPre=-/usr/bin/podman rm -f %N +ExecStart=/usr/bin/podman run \ --hostname %H \ --name %N \ --rm \ --cap-drop net_raw \ + --network=$network \ -e AZURE_FP_CLIENT_ID \ -e DOMAIN_NAME \ -e CLUSTER_MDSD_ACCOUNT \ @@ -256,12 +240,16 @@ WantedBy=multi-user.target" # configure_service_aro_portal # args: # 1) image - nameref, string; RP container image +# 2) network - nameref, string; podman network name to be attached configure_service_aro_portal() { local -n image="$1" + local -n network="$2" log "starting" log "Configuring aro portal service" + # shellcheck disable=SC2034 local -r aro_portal_service_conf_filename='/etc/sysconfig/aro-portal' + # shellcheck disable=SC2034 local -r aro_portal_service_conf_file="AZURE_PORTAL_ACCESS_GROUP_IDS='$PORTALACCESSGROUPIDS' AZURE_PORTAL_CLIENT_ID='$PORTALCLIENTID' AZURE_PORTAL_ELEVATED_GROUP_IDS='$PORTALELEVATEDGROUPIDS' @@ -274,7 +262,9 @@ RPIMAGE='$image'" write_file aro_portal_service_conf_filename aro_portal_service_conf_file true + # shellcheck disable=SC2034 local -r aro_portal_service_filename='/etc/systemd/system/aro-portal.service' + # shellcheck disable=SC2034 local -r aro_portal_service_file="[Unit] After=network-online.target Wants=network-online.target @@ -282,12 +272,13 @@ StartLimitInterval=0 [Service] EnvironmentFile=/etc/sysconfig/aro-portal -ExecStartPre=-/usr/bin/docker rm -f %N -ExecStart=/usr/bin/docker run \ +ExecStartPre=-/usr/bin/podman rm -f %N +ExecStart=/usr/bin/podman run \ --hostname %H \ --name %N \ --rm \ --cap-drop net_raw \ + --network=$network \ -e AZURE_PORTAL_ACCESS_GROUP_IDS \ -e AZURE_PORTAL_CLIENT_ID \ -e AZURE_PORTAL_ELEVATED_GROUP_IDS \ @@ -327,14 +318,18 @@ configure_service_mdsd() { local -r mdsd_service_dir="/etc/systemd/system/mdsd.service.d" mkdir -p "$mdsd_service_dir" + # shellcheck disable=SC2034 local -r mdsd_override_conf_filename="$mdsd_service_dir/override.conf" local -r mdsd_certificate_san="$(openssl x509 -in /var/lib/waagent/Microsoft.Azure.KeyVault.Store/mdsd.pem -noout -subject | sed -e 's/.*CN = //')" + # shellcheck disable=SC2034 local -r mdsd_override_conf_file="[Unit] After=network-online.target" write_file mdsd_override_conf_filename mdsd_override_conf_file true + # shellcheck disable=SC2034 local -r default_mdsd_filename="/etc/default/mdsd" + # shellcheck disable=SC2034 local -r default_mdsd_file="MDSD_ROLE_PREFIX=/var/run/mdsd/default MDSD_OPTIONS=\"-A -d -r \$MDSD_ROLE_PREFIX\" @@ -351,7 +346,7 @@ export MONITORING_TENANT='$LOCATION' export MONITORING_ROLE='$role' export MONITORING_ROLE_INSTANCE=\"$(hostname)\" -export MDSD_MSGPACK_SORT_COLUMNS=1\"" +export MDSD_MSGPACK_SORT_COLUMNS=\"1\"" write_file default_mdsd_filename default_mdsd_file true } @@ -360,24 +355,32 @@ export MDSD_MSGPACK_SORT_COLUMNS=1\"" # args: # 1) conf_file - string; fluenbit configuration file # 2) image - string; fluentbit container image to run +# 3) network - nameref, string; podman network name to be attached configure_service_fluentbit() { + # shellcheck disable=SC2034 local -n conf_file="$1" local -n image="$2" + local -n network="$3" log "starting" log "Configuring fluentbit service" mkdir -p /etc/fluentbit/ mkdir -p /var/lib/fluent + # shellcheck disable=SC2034 local -r conf_filename='/etc/fluentbit/fluentbit.conf' write_file conf_filename conf_file true + # shellcheck disable=SC2034 local -r sysconfig_filename='/etc/sysconfig/fluentbit' + # shellcheck disable=SC2034 local -r sysconfig_file="FLUENTBITIMAGE=$image" write_file sysconfig_filename sysconfig_file true + # shellcheck disable=SC2034 local -r service_filename='/etc/systemd/system/fluentbit.service' + # shellcheck disable=SC2034 local -r service_file="[Unit] After=network-online.target Wants=network-online.target @@ -386,8 +389,8 @@ StartLimitIntervalSec=0 [Service] RestartSec=1s EnvironmentFile=/etc/sysconfig/fluentbit -ExecStartPre=-/usr/bin/docker rm -f %N -ExecStart=/usr/bin/docker run \ +ExecStartPre=-/usr/bin/podman rm -f %N +ExecStart=/usr/bin/podman run \ --security-opt label=disable \ --entrypoint /opt/td-agent-bit/bin/td-agent-bit \ --net=host \ @@ -395,6 +398,7 @@ ExecStart=/usr/bin/docker run \ --name %N \ --rm \ --cap-drop net_raw \ + --network=$network \ -v /etc/fluentbit/fluentbit.conf:/etc/fluentbit/fluentbit.conf \ -v /var/lib/fluent:/var/lib/fluent:z \ -v /var/log/journal:/var/log/journal:ro \ @@ -402,7 +406,7 @@ ExecStart=/usr/bin/docker run \ $image \ -c /etc/fluentbit/fluentbit.conf -ExecStop=/usr/bin/docker stop %N +ExecStop=/usr/bin/podman stop %N Restart=always RestartSec=5 StartLimitInterval=0 @@ -426,7 +430,9 @@ configure_timers_mdm_mdsd() { get_keyvault_suffix role keyvault_suffix secret_prefix for var in "mdsd" "mdm"; do + # shellcheck disable=SC2034 local download_creds_service_filename="/etc/systemd/system/download-$var-credentials.service" + # shellcheck disable=SC2034 local download_creds_service_file="[Unit] Description=Periodic $var credentials refresh @@ -436,7 +442,9 @@ ExecStart=/usr/local/bin/download-credentials.sh $var" write_file download_creds_service_filename download_creds_service_file true + # shellcheck disable=SC2034 local download_creds_timer_filename="/etc/systemd/system/download-$var-credentials.timer" + # shellcheck disable=SC2034 local download_creds_timer_file="[Unit] Description=Periodic $var credentials refresh After=network-online.target @@ -454,6 +462,7 @@ WantedBy=timers.target" done local -r download_creds_script_filename="/usr/local/bin/download-credentials.sh" + # shellcheck disable=SC2034 local -r download_creds_script_file="#!/bin/bash set -eu @@ -527,10 +536,16 @@ fi" chmod u+x /usr/local/bin/download-credentials.sh - $download_creds_script_filename mdsd - $download_creds_script_filename mdm + $download_creds_script_filename mdsd & + wait "$!" + + $download_creds_script_filename mdm & + wait "$!" + + # shellcheck disable=SC2034 local -r watch_mdm_creds_service_filename="/etc/systemd/system/watch-mdm-credentials.service" + # shellcheck disable=SC2034 local -r watch_mdm_creds_service_file="[Unit] Description=Watch for changes in mdm.pem and restarts the mdm service @@ -543,7 +558,9 @@ WantedBy=multi-user.target" write_file watch_mdm_creds_service_filename watch_mdm_creds_service_file true - local -r watch_mdm_creds_path_filename='/etc/systemd/system/watch-mdm-credentials.path' + # shellcheck disable=SC2034 + local -r watch_mdm_creds_path_filename='/usr/lib/systemd/system/watch-mdm-credentials.path' + # shellcheck disable=SC2034 local -r watch_mdm_creds_path_file='[Path] PathModified=/etc/mdm.pem @@ -560,15 +577,19 @@ WantedBy=multi-user.target' # args: # 1) role - nameref, string; can be "gateway" or "rp" # 2) image - nameref, string; mdm container image to run +# 3) network - nameref, string; podman network name to be attached configure_service_mdm() { local -n role="$1" local -n image="$2" + local -n network="$3" log "starting" log "Configuring mdm service" verify_role role + # shellcheck disable=SC2034 local -r sysconfig_mdm_filename="/etc/sysconfig/mdm" + # shellcheck disable=SC2034 local -r sysconfig_mdm_file="MDMFRONTENDURL='$MDMFRONTENDURL' MDMIMAGE='$image' MDMSOURCEENVIRONMENT='$LOCATION' @@ -578,20 +599,23 @@ MDMSOURCEROLEINSTANCE=\"$(hostname)\"" write_file sysconfig_mdm_filename sysconfig_mdm_file true mkdir -p /var/etw + # shellcheck disable=SC2034 local -r mdm_service_filename="/etc/systemd/system/mdm.service" + # shellcheck disable=SC2034 local -r mdm_service_file="[Unit] After=network-online.target Wants=network-online.target [Service] EnvironmentFile=/etc/sysconfig/mdm -ExecStartPre=-/usr/bin/docker rm -f %N -ExecStart=/usr/bin/docker run \ +ExecStartPre=-/usr/bin/podman rm -f %N +ExecStart=/usr/bin/podman run \ --entrypoint /usr/sbin/MetricsExtension \ --hostname %H \ --name %N \ --rm \ --cap-drop net_raw \ + --network=$network \ -m 2g \ -v /etc/mdm.pem:/etc/mdm.pem \ -v /var/etw:/var/etw:z \ @@ -604,7 +628,7 @@ ExecStart=/usr/bin/docker run \ -SourceEnvironment $LOCATION \ -SourceRole $role \ -SourceRoleInstance $HOSTNAME -ExecStop=/usr/bin/docker stop %N +ExecStop=/usr/bin/podman stop %N Restart=always RestartSec=1 StartLimitInterval=0 @@ -614,3 +638,37 @@ WantedBy=multi-user.target" write_file mdm_service_filename mdm_service_file true } + +# configure_vmss_aro_service +# args: +# 1) r - nameref, string; role of VMSS +# 2) images - nameref, associative array; ARO container images +# 3) configs - nameref, associative array; configuration files and versions. The values should be a reference to variables, not dereferenced. +# This is because the value is used when creating nameref variables by helper functions. +configure_vmss_aro_services() { + local -n r="$1" + local -n images="$2" + local -n configs="$3" + log "starting" + verify_role "$1" + + if [ "$r" == "$role_gateway" ]; then + configure_service_aro_gateway "${images["rp"]}" "$1" "${configs["gateway_config"]}" "${configs["network"]}" + elif [ "$r" == "$role_rp" ]; then + configure_service_aro_rp "${images["rp"]}" "$1" "${configs["rp_config"]}" "${configs["network"]}" + configure_service_aro_monitor "${images["rp"]}" "${configs["network"]}" + configure_service_aro_portal "${images["rp"]}" "${configs["network"]}" + fi + + configure_service_fluentbit "${configs["fluentbit"]}" "${images["fluentbit"]}" "${configs["network"]}" + configure_service_mdm "$1" "${images["mdm"]}" "${configs["network"]}" + configure_service_mdsd "$1" "${configs["mdsd"]}" + configure_certs "$1" + configure_timers_mdm_mdsd "$1" +} + +util_common="util-common.sh" +if [ -f "$util_common" ]; then + # shellcheck source=util-common.sh + source "$util_common" +fi diff --git a/pkg/deploy/generator/scripts/util-system.sh b/pkg/deploy/generator/scripts/util-system.sh index 4964c72eea3..551bdefdf00 100644 --- a/pkg/deploy/generator/scripts/util-system.sh +++ b/pkg/deploy/generator/scripts/util-system.sh @@ -13,48 +13,23 @@ configure_sshd() { systemctl reload sshd.service || abort "sshd failed to reload" } -# configure_firewalld_rules -# args: -# 1) ports - nameref, string array; ports to be enabled. -# Ports must be postfixed with /tcp or /udp -configure_firewalld_rules() { - local -n ports="$1" - log "starting" - - # https://access.redhat.com/security/cve/cve-2020-13401 - local -r prefix="/etc/sysctl.d" - local -r disable_accept_ra_conf_filename="$prefix/02-disable-accept-ra.conf" - local -r disable_accept_ra_conf_file="net.ipv6.conf.all.accept_ra=0" - - write_file disable_accept_ra_conf_filename disable_accept_ra_conf_file true - - local -r disable_core_filename="$prefix/01-disable-core.conf" - local -r disable_core_file="kernel.core_pattern = |/bin/true - " - write_file disable_core_filename disable_core_file true - - sysctl --system - - log "Enabling ports ${ports[*]} on default firewalld zone" - # shellcheck disable=SC2068 - for port in ${ports[@]}; do - log "Enabling port $port now" - firewall-cmd "--add-port=$port" - done - - log "Writing runtime config to permanent config" - firewall-cmd --runtime-to-permanent -} - # configure_logrotate clobbers /etc/logrotate.conf # args: # 1) dropin_files - nameref, associative array, optional; logrotate files to write to /etc/logrotate.d # Key name dictates filenames written to /etc/logrotate.d. +# Example: +# Key dictates the filename written in /etc/logrotate.d +# shellcheck disable=SC2034 +# local -rA logrotate_dropins=( +# ["gateway"]="$gateway_log_file" +# ) configure_logrotate() { local -n dropin_files="${1:-empty_str}" log "starting" + # shellcheck disable=SC2034 local -r logrotate_conf_filename='/etc/logrotate.conf' + # shellcheck disable=SC2034 local -r logrotate_conf_file='# see "man logrotate" for details # rotate log files weekly weekly @@ -95,7 +70,9 @@ include /etc/logrotate.d local -r logrotate_d="/etc/logrotate.d" log "Writing logrotate files to $logrotate_d" for dropin_name in "${!dropin_files[@]}"; do + # shellcheck disable=SC2034 local -r dropin_filename="$logrotate_d/$dropin_name" + # shellcheck disable=SC2034 local -r dropin_file="${dropin_files["$dropin_name"]}" write_file dropin_filename dropin_file true done @@ -105,14 +82,13 @@ include /etc/logrotate.d # pull_container_images # args: # 1) pull_images - nameref, string array -# 2) az_login - boolean; login with az login and az acr login -# 3) registry_conf - nameref, string, optional; path to docker/podman configuration file +# 2) registry_conf - nameref, string, optional; path to docker/podman configuration file pull_container_images() { local -n pull_images="$1" - local -r az_login="${2}" - local -n registry_conf="${3:-empty_str}" + local -n registry_conf="${2:-empty_str}" log "starting" + # shellcheck disable=SC2034 local -ri retry_time=30 # The managed identity that the VM runs as only has a single roleassignment. # This role assignment is ACRPull which is not necessarily present in the @@ -120,17 +96,15 @@ pull_container_images() { # role assignments scoped on the subscription we're deploying into, it will # not show on az login -i, which is why the below line is commented. # az account set -s "$SUBSCRIPTIONID" - if $az_login; then - cmd=( - az - login - -i - --allow-no-subscriptions - ) + cmd=( + az + login + -i + --allow-no-subscriptions + ) - log "Running az login with retries" - retry cmd retry_time - fi + log "Running az login with retries" + retry cmd retry_time # Suppress emulation output for podman instead of docker for az acr compatability mkdir -p /etc/containers/ @@ -145,18 +119,17 @@ pull_container_images() { fi log "logging into prod acr" - if $az_login; then - cmd=( - az - acr - login - --name - "$(sed -e 's|.*/||' <<<"$ACRRESOURCEID")" - ) + cmd=( + az + acr + login + --name + # TODO replace this with variable expansion + # Reference: https://www.shellcheck.net/wiki/SC2001 + "$(sed -e 's|.*/||' <<<"$ACRRESOURCEID")" + ) - log "Running az login with retries" - retry cmd retry_time - fi + retry cmd retry_time # shellcheck disable=SC2068 for i in ${pull_images[@]}; do @@ -171,37 +144,14 @@ pull_container_images() { retry cmd retry_time done - if $az_login; then - cmd=( - az - logout - ) - - log "Running az logout with retries" - retry cmd retry_time - fi -} + # shellcheck disable=SC2034 + cmd=( + az + logout + ) -# configure_disk_partitions -configure_disk_partitions() { - log "starting" - log "extending partition table" - - # Linux block devices are inconsistently named - # it's difficult to tie the lvm pv to the physical disk using /dev/disk files, which is why lvs is used here - local -r physical_disk="$(lvs -o devices -a | head -n2 | tail -n1 | cut -d ' ' -f 3 | cut -d \( -f 1 | tr -d '[:digit:]')" - growpart "$physical_disk" 2 - - log "extending filesystems" - log "extending root lvm" - lvextend -l +20%FREE /dev/rootvg/rootlv - log "growing root filesystem" - xfs_growfs / - - log "extending var lvm" - lvextend -l +100%FREE /dev/rootvg/varlv - log "growing var filesystem" - xfs_growfs /var + log "Running az logout with retries" + retry cmd retry_time } # configure_certs @@ -244,7 +194,9 @@ configure_certs() { # we leave clientId blank as long as only 1 managed identity assigned to vmss # if we have more than 1, we will need to populate with clientId used for off-node scanning + # shellcheck disable=SC2034 local -r nodescan_agent_filename="/etc/default/vsa-nodescan-agent.config" + # shellcheck disable=SC2034 local -r nodescan_agent_file="{ \"Nice\": 19, \"Timeout\": 10800, @@ -291,3 +243,58 @@ create_required_dirs() { mkdir -p "$d" || abort "failed to create directory $d" done } + +# create_podman_networks() +# args: +# 1) nets - nameref, associative array; Networks to be created +# Key is the network name, value is the subnet with cidr notation +create_podman_networks() { + local -n nets="$1" + log "starting" + + # shellcheck disable=SC2068 + for n in ${!nets[@]}; do + log "Creating podman network \"$n\" with subnet \"${nets[$n]}\"" + podman network \ + create \ + --subnet "${nets["$n"]}" \ + "$n" + done +} + +# firewalld_configure_backend +firewalld_configure_backend() { + log "starting" + + log "Changing firewalld backend to iptables" + conf_file="/etc/firewalld/firewalld.conf" + sed -i 's/FirewallBackend=nftables/FirewallBackend=iptables/g' "$conf_file" +} + +# firewalld_configure +# args: +# 1) ports - nameref, string array; ports to be enabled. +# Ports must be postfixed with /tcp or /udp +firewalld_configure() { + local -n ports="$1" + log "starting" + + firewalld_configure_backend + + # shellcheck disable=SC2034 + local -ra service=( + "firewalld" + ) + enable_services service + + log "Enabling ports ${ports[*]} on default firewalld zone" + # shellcheck disable=SC2068 + for port in ${ports[@]}; do + log "Enabling port $port now" + firewall-cmd "--add-port=$port" \ + --permanent + done + + log "Writing runtime config to permanent config" + firewall-cmd --runtime-to-permanent +} diff --git a/pkg/deploy/generator/scripts/util.sh b/pkg/deploy/generator/scripts/util.sh index 002aebf01b6..ca1f36304ea 100644 --- a/pkg/deploy/generator/scripts/util.sh +++ b/pkg/deploy/generator/scripts/util.sh @@ -4,6 +4,10 @@ # e. g. scp copying the script to a test VM # During normal deployment operations, the other util-*.sh files are prefixed to the VMSS scripts +if [ "${DEBUG:-false}" == true ]; then + set -x +fi + util_common="util-common.sh" if [ -f "$util_common" ]; then # shellcheck source=util-common.sh