Proxmox Deploy LXC Container
Octopus.Script exported 05/04/2023 by domrichardson belongs to 'Proxmox' category.
Creates a new Proxmox LXC container using the Proxmox API.
Requires a Proxmox API token to authenticate to the Proxmox Server/Cluster
Parameters
When steps based on the template are included in a project's deployment process, the parameters below can be set.
Proxmox Host
The hostname or IP address of the Proxmox cluster/host
Proxmox Port
Port number for Proxmox Cluster/Host
Proxmox User Account
The Proxmox user account associated with the api token.
Proxmox Node
The Proxmox node in the cluster.
Proxmox Token ID
This is token id that was used to create an API token in proxmox.
Proxmox API Token
The API Token secret key
LXC VM ID
The new VMID for the new LXC container default is -1 to find the next ID
LXC Hostname
The new LXC hostname
LXC OS Template
The template image or backup image for the LXC
LXC Root Password
This will be the root password once the LXC container has been created
LXC Storage
Where the rootfs for this LXC will be stored.
LXC Networks
The list of network connections this LXC has. Each network connection on a new line.
name=,bridge=,firewall=<0|1>,gw=,ip=
More Info: https://pve.proxmox.com/pve-docs/api-viewer/#/nodes/{node}/lxc
LXC CPU Cores
The amount of CPU cores the LXC is assigned
LXC Memory
The amount of Memory the LXC is assigned.
LXC Rootfs Size
The size of the root volume for this LXC, Size is in GB
LXC Start Once Created
Should the LXC start once the LXC has been created
LXC Overwrite Container
Overwrites an existing LXC with the same VMID
Script body
# Proxmox Connection Variables
$ProxmoxHost = $OctopusParameters["Proxmox.Host"];
$ProxmoxPort = [int]$OctopusParameters["Proxmox.Port"];
$ProxmoxUser = $OctopusParameters["Proxmox.User"];
$ProxmoxNode = $OctopusParameters["Proxmox.Node"];
$ProxmoxTokenID = $OctopusParameters["Proxmox.TokenID"];
$ProxmoxToken = $OctopusParameters["Proxmox.Token"];
# LXC Variables
$LXC_VMID = [int]$OctopusParameters["Proxmox.LXC.VMID"];
$LXC_Hostname = $OctopusParameters["Proxmox.LXC.Hostname"];
$LXC_OSTemplate = $OctopusParameters["Proxmox.LXC.OSTemplate"];
$LXC_Storage = $OctopusParameters["Proxmox.LXC.Storage"];
$LXC_CPU = [int]$OctopusParameters["Proxmox.LXC.Cores"];
$LXC_Memory = [int]$OctopusParameters["Proxmox.LXC.Memory"];
$LXC_RootSize = [int]$OctopusParameters["Proxmox.LXC.RootSize"];
$LXC_Networks = $OctopusParameters["Proxmox.LXC.Network"];
$LXC_Password = $OctopusParameters["Proxmox.LXC.Password"];
$BaseURL = "https://$($ProxmoxHost):$($ProxmoxPort)/api2/json"
$header = @{
"Authorization" = "PVEAPIToken=$($ProxmoxUser)!$($ProxmoxTokenID)=$($ProxmoxToken)"
}
Write-Host "Testing Connection To Proxmox Server/Cluster ..."
try{
Invoke-RestMethod -Method GET -uri "$($BaseURL)" -Headers $header | out-null
}catch{
throw "Couldn't Connect to the Proxmox Server/Cluster"
}
Write-Host "Successfully Connected To Proxmox Server/Cluster"
$LXC_Start = 0
try {
$Start = [System.Convert]::ToBoolean($OctopusParameters["Proxmox.LXC.StartOnCreate"])
if($Start -eq $True){
$LXC_Start = 1
}
} catch {}
$LXC_Force = 0
try {
$Force = [System.Convert]::ToBoolean($OctopusParameters["Proxmox.LXC.Force"])
if($Force -eq $True){
$LXC_Force = 1
}
} catch {}
if($LXC_CPU -lt 1){
$LXC_CPU=1;
}
if($LXC_Memory -lt 16){
$LXC_Memory = 16;
}
if($LXC_RootSize -lt 1){
$LXC_RootSize = 1;
}
if($LXC_Hostname -eq $null -or $LXC_Hostname -eq ""){
throw "LXC Hostname must be provided!"
}
if($LXC_OSTemplate -eq $null -or $LXC_OSTemplate -eq ""){
throw "LXC OS Template must be provided!"
}
if($LXC_Storage -eq $null -or $LXC_Storage -eq ""){
throw "LXC Storage must be provided!"
}
if($LXC_Networks -eq $null){
throw "You must provide at least one network property"
}
if($LXC_Password -eq $null -or $LXC_Password -eq ""){
throw "LXC Password must be provided!"
}
if($LXC_VMID -eq "-1"){
$LXC_VMID=(Invoke-RestMethod -Method GET -uri "$($BaseURL)/cluster/nextid" -headers $header).data
Write-Host "Found next vm id: $($LXC_VMID)"
}
if($LXC_VMID -lt 1){
throw "The LXC VMID was not valid ($LXC_VMID), Set this to -1 to automatically find the next id"
}
$LXCData = @{
"vmid" = $LXC_VMID
"hostname" = $LXC_Hostname
"ostemplate" = $LXC_OSTemplate
"rootfs" = "volume=$($LXC_Storage):$($LXC_RootSize)"
"cores" = $LXC_CPU
"memory" = $LXC_Memory
"storage" = $LXC_Storage
"password" = $LXC_Password
"start" = $LXC_Start
"force" = $LXC_Force
}
$NetworkIndex = 0;
$Networks = $LXC_Networks.replace("\n", "`n").split("`n")
if($Networks.Count -lt 1){
throw "You must provide at least one network property"
}
foreach ($network in $Networks){
$LXCData["net$($NetworkIndex)"] = $network;
$NetworkIndex++;
}
$existingLXC = $null;
try{
$existingLXC = Invoke-RestMethod -Method GET -uri "$($BaseURL)/nodes/$($ProxmoxNode)/lxc/$($LXCData.vmid)" -Headers $header
}catch{}
if($existingLXC -ne $null -and $LXCData.force -eq 0){
throw "LXC with VMID: $($LXCData.vmid) already exists. Use Force parameter to overwrite this LXC."
}elseif($existingLXC -ne $null -and $LXCData.force -eq 1){
Write-host "Deleting existing LXC with VMID: $($LXCData.vmid)"
$LXCDestroyAsyncTask =Invoke-RestMethod -Method DELETE -uri "$($BaseURL)/nodes/$($ProxmoxNode)/lxc/$($LXCData.vmid)" -Headers $header
$count = 1;
$maxCount = 10;
$TaskID = $LXCDestroyAsyncTask.Data;
DO
{
Write-Host "Checking if LXC has finished Deleting.."
$LXCDestroyAsyncTaskStatus = (Invoke-RestMethod -Method GET -uri "$($BaseURL)/nodes/$($ProxmoxNode)/tasks/$($TaskID)/status" -Headers $header).data
if($LXCDestroyAsyncTaskStatus.status -eq "stopped"){
if($LXCDestroyAsyncTaskStatus.exitstatus -ne "OK"){
Write-Error "LXC destroy task finished with error: $($LXCDestroyAsyncTaskStatus.exitstatus)"
}else{
Write-Host "LXC destroy task has successfully completed!"
}
break;
}
Write-Host "LXC destroy task has not finished yet, retrying in 5 seconds.."
Write-Host "Task Status: $($LXCDestroyAsyncTaskStatus.status)"
sleep 5
If($count -gt $maxCount) {
Write-Warning "Task Timed out!"
break;
}
$count++
} While ($count -le $maxCount)
}
Write-Host ""
Write-Host "New LXC Summary:"
$LXCData | Convertto-json -depth 10
$LXCCreateAsyncTask = (Invoke-RestMethod -Method POST -uri "$($BaseURL)/nodes/$($ProxmoxNode)/lxc" -Headers $header -Body $LXCData)
$count = 1;
$maxCount = 10;
Write-Host ""
DO
{
$TaskID = $LXCCreateAsyncTask.Data;
Write-Host "Checking if LXC has finished creating.."
$LXCCreateAsyncTaskStatus = (Invoke-RestMethod -Method GET -uri "$($BaseURL)/nodes/$($ProxmoxNode)/tasks/$($TaskID)/status" -Headers $header).data
if($LXCCreateAsyncTaskStatus.status -eq "stopped"){
if($LXCCreateAsyncTaskStatus.exitstatus -ne "OK"){
Write-Error "LXC create task finished with error: $($LXCCreateAsyncTaskStatus.exitstatus)"
}else{
Write-Host "LXC create task has successfully completed!"
}
break;
}
Write-Host "LXC create task has not finished yet, retrying in 5 seconds.."
Write-Host "Task Status: $($LXCCreateAsyncTaskStatus.status)"
sleep 5
If($count -gt $maxCount) {
Write-Warning "Task Timed out!"
break;
}
$count++
} While ($count -le $maxCount)
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
Show JSON{
"Id": "ab90cb93-96ae-4841-8058-1cc5ec6feebe",
"Name": "Proxmox Deploy LXC Container",
"Description": "Creates a new Proxmox LXC container using the Proxmox API.\n\nRequires a Proxmox [API token](https://pve.proxmox.com/wiki/Proxmox_VE_API#API_Tokens) to authenticate to the Proxmox Server/Cluster",
"Version": 3,
"ExportedAt": "2023-05-04T10:44:27.968Z",
"ActionType": "Octopus.Script",
"Author": "domrichardson",
"Packages": [],
"Parameters": [
{
"Id": "c75c69c5-bdfb-4cbf-8b5a-aeb6ef93c274",
"Name": "Proxmox.Host",
"Label": "Proxmox Host",
"HelpText": "The hostname or IP address of the Proxmox cluster/host",
"DefaultValue": "1.2.3.4",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "eddd73e2-cb63-4c1b-8100-05e8e9586180",
"Name": "Proxmox.Port",
"Label": "Proxmox Port",
"HelpText": "Port number for Proxmox Cluster/Host",
"DefaultValue": "8006",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "eae18957-8977-4f51-8e09-2402453fd531",
"Name": "Proxmox.User",
"Label": "Proxmox User Account",
"HelpText": "The Proxmox user account associated with the api token.",
"DefaultValue": "root@pam",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "b413ee30-ba94-4ff3-8b4e-148c1fbc52f6",
"Name": "Proxmox.Node",
"Label": "Proxmox Node",
"HelpText": "The Proxmox node in the cluster.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "3f70fe63-2b55-44f5-af8e-27d8717ade20",
"Name": "Proxmox.TokenID",
"Label": "Proxmox Token ID",
"HelpText": "This is token id that was used to create an API token in proxmox.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "741c3b80-af85-47c6-b49e-36aea9b2bc9a",
"Name": "Proxmox.Token",
"Label": "Proxmox API Token",
"HelpText": "The API Token secret key",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Id": "003db066-99a7-4d4c-a794-7a6310c2c86b",
"Name": "Proxmox.LXC.VMID",
"Label": "LXC VM ID",
"HelpText": "The new VMID for the new LXC container default is -1 to find the next ID",
"DefaultValue": "-1",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "63ba1450-8c9e-4d06-bedf-00389a63ef3f",
"Name": "Proxmox.LXC.Hostname",
"Label": "LXC Hostname",
"HelpText": "The new LXC hostname",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "0a13d075-3a2f-4718-9793-f9b2f5963455",
"Name": "Proxmox.LXC.OSTemplate",
"Label": "LXC OS Template",
"HelpText": "The template image or backup image for the LXC",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "55f7937b-4a5f-49bb-b129-f589c3ce51cc",
"Name": "Proxmox.LXC.Password",
"Label": "LXC Root Password",
"HelpText": "This will be the root password once the LXC container has been created",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Id": "671751a5-d213-445a-a73f-dd9f1f33d754",
"Name": "Proxmox.LXC.Storage",
"Label": "LXC Storage",
"HelpText": "Where the rootfs for this LXC will be stored.",
"DefaultValue": "local",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "e796b021-0c31-4e03-8825-23c19cbf8876",
"Name": "Proxmox.LXC.Network",
"Label": "LXC Networks",
"HelpText": "The list of network connections this LXC has. Each network connection on a new line.\n\n\n`name=<name>,bridge=<bridge>,firewall=<0|1>,gw=<IPv4>,ip=<IPv4/CIDR|dhcp|manual>`\n\n\nMore Info: [https://pve.proxmox.com/pve-docs/api-viewer/#/nodes/{node}/lxc](https://pve.proxmox.com/pve-docs/api-viewer/#/nodes/{node}/lxc)",
"DefaultValue": "name=eth0,bridge=vmbr0",
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
}
},
{
"Id": "c9e865ea-a7b2-42d3-aca6-8772e54b893a",
"Name": "Proxmox.LXC.Cores",
"Label": "LXC CPU Cores",
"HelpText": "The amount of CPU cores the LXC is assigned",
"DefaultValue": "1",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "74b64687-8aed-433d-bce3-714bfd738927",
"Name": "Proxmox.LXC.Memory",
"Label": "LXC Memory",
"HelpText": "The amount of Memory the LXC is assigned.",
"DefaultValue": "2048",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "85c52eb6-a25f-4f8e-a068-2a165160d94d",
"Name": "Proxmox.LXC.RootSize",
"Label": "LXC Rootfs Size",
"HelpText": "The size of the root volume for this LXC, Size is in GB",
"DefaultValue": "60",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "fd072ced-1c8b-4205-a724-e9456b5152c6",
"Name": "Proxmox.LXC.StartOnCreate",
"Label": "LXC Start Once Created",
"HelpText": "Should the LXC start once the LXC has been created",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
}
},
{
"Id": "dfea6eea-47ff-4489-9434-8ff80bbb8694",
"Name": "Proxmox.LXC.Force",
"Label": "LXC Overwrite Container",
"HelpText": "Overwrites an existing LXC with the same VMID",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
}
}
],
"Properties": {
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "# Proxmox Connection Variables\n$ProxmoxHost = $OctopusParameters[\"Proxmox.Host\"];\n$ProxmoxPort = [int]$OctopusParameters[\"Proxmox.Port\"];\n$ProxmoxUser = $OctopusParameters[\"Proxmox.User\"];\n\n$ProxmoxNode = $OctopusParameters[\"Proxmox.Node\"];\n\n$ProxmoxTokenID = $OctopusParameters[\"Proxmox.TokenID\"];\n$ProxmoxToken = $OctopusParameters[\"Proxmox.Token\"];\n\n# LXC Variables\n$LXC_VMID = [int]$OctopusParameters[\"Proxmox.LXC.VMID\"];\n$LXC_Hostname = $OctopusParameters[\"Proxmox.LXC.Hostname\"];\n$LXC_OSTemplate = $OctopusParameters[\"Proxmox.LXC.OSTemplate\"];\n$LXC_Storage = $OctopusParameters[\"Proxmox.LXC.Storage\"];\n$LXC_CPU = [int]$OctopusParameters[\"Proxmox.LXC.Cores\"];\n$LXC_Memory = [int]$OctopusParameters[\"Proxmox.LXC.Memory\"];\n$LXC_RootSize = [int]$OctopusParameters[\"Proxmox.LXC.RootSize\"];\n$LXC_Networks = $OctopusParameters[\"Proxmox.LXC.Network\"];\n$LXC_Password = $OctopusParameters[\"Proxmox.LXC.Password\"];\n\n$BaseURL = \"https://$($ProxmoxHost):$($ProxmoxPort)/api2/json\"\n\n$header = @{\n\t\"Authorization\" = \"PVEAPIToken=$($ProxmoxUser)!$($ProxmoxTokenID)=$($ProxmoxToken)\"\n}\n\n\nWrite-Host \"Testing Connection To Proxmox Server/Cluster ...\"\n\ntry{\n\tInvoke-RestMethod -Method GET -uri \"$($BaseURL)\" -Headers $header | out-null\n}catch{\n\tthrow \"Couldn't Connect to the Proxmox Server/Cluster\"\n}\n\nWrite-Host \"Successfully Connected To Proxmox Server/Cluster\"\n\n$LXC_Start = 0\ntry {\n $Start = [System.Convert]::ToBoolean($OctopusParameters[\"Proxmox.LXC.StartOnCreate\"])\n \n if($Start -eq $True){\n \t$LXC_Start = 1\n }\n \n} catch {}\n\n$LXC_Force = 0\ntry {\n $Force = [System.Convert]::ToBoolean($OctopusParameters[\"Proxmox.LXC.Force\"])\n \n if($Force -eq $True){\n \t$LXC_Force = 1\n }\n \n} catch {}\n\nif($LXC_CPU -lt 1){\n\t$LXC_CPU=1;\n}\n\nif($LXC_Memory -lt 16){\n\t$LXC_Memory = 16;\n}\n\nif($LXC_RootSize -lt 1){\n\t$LXC_RootSize = 1;\n}\n\nif($LXC_Hostname -eq $null -or $LXC_Hostname -eq \"\"){\n\tthrow \"LXC Hostname must be provided!\"\n}\n\nif($LXC_OSTemplate -eq $null -or $LXC_OSTemplate -eq \"\"){\n\tthrow \"LXC OS Template must be provided!\"\n}\n\nif($LXC_Storage -eq $null -or $LXC_Storage -eq \"\"){\n\tthrow \"LXC Storage must be provided!\"\n}\n\nif($LXC_Networks -eq $null){\n\tthrow \"You must provide at least one network property\"\n}\n\nif($LXC_Password -eq $null -or $LXC_Password -eq \"\"){\n\tthrow \"LXC Password must be provided!\"\n}\n\nif($LXC_VMID -eq \"-1\"){\n\t$LXC_VMID=(Invoke-RestMethod -Method GET -uri \"$($BaseURL)/cluster/nextid\" -headers $header).data\n Write-Host \"Found next vm id: $($LXC_VMID)\"\n}\n\nif($LXC_VMID -lt 1){\n\tthrow \"The LXC VMID was not valid ($LXC_VMID), Set this to -1 to automatically find the next id\"\n}\n\n$LXCData = @{\n\t\"vmid\" = $LXC_VMID\n \"hostname\" = $LXC_Hostname\n \"ostemplate\" = $LXC_OSTemplate\n \"rootfs\" = \"volume=$($LXC_Storage):$($LXC_RootSize)\"\n \"cores\" = $LXC_CPU\n \"memory\" = $LXC_Memory\n \"storage\" = $LXC_Storage\n \"password\" = $LXC_Password\n \"start\" = $LXC_Start\n \"force\" = $LXC_Force\n}\n\n$NetworkIndex = 0;\n\n$Networks = $LXC_Networks.replace(\"\\n\", \"`n\").split(\"`n\")\n\nif($Networks.Count -lt 1){\n\tthrow \"You must provide at least one network property\"\n}\n\nforeach ($network in $Networks){\n $LXCData[\"net$($NetworkIndex)\"] = $network;\n $NetworkIndex++;\n}\n\n$existingLXC = $null;\n\ntry{\n $existingLXC = Invoke-RestMethod -Method GET -uri \"$($BaseURL)/nodes/$($ProxmoxNode)/lxc/$($LXCData.vmid)\" -Headers $header\n}catch{}\n\nif($existingLXC -ne $null -and $LXCData.force -eq 0){\n throw \"LXC with VMID: $($LXCData.vmid) already exists. Use Force parameter to overwrite this LXC.\"\n\n}elseif($existingLXC -ne $null -and $LXCData.force -eq 1){\n\n Write-host \"Deleting existing LXC with VMID: $($LXCData.vmid)\"\n $LXCDestroyAsyncTask =Invoke-RestMethod -Method DELETE -uri \"$($BaseURL)/nodes/$($ProxmoxNode)/lxc/$($LXCData.vmid)\" -Headers $header\n\n $count = 1;\n $maxCount = 10;\n $TaskID = $LXCDestroyAsyncTask.Data;\n\n DO\n {\n Write-Host \"Checking if LXC has finished Deleting..\"\n $LXCDestroyAsyncTaskStatus = (Invoke-RestMethod -Method GET -uri \"$($BaseURL)/nodes/$($ProxmoxNode)/tasks/$($TaskID)/status\" -Headers $header).data\n \n if($LXCDestroyAsyncTaskStatus.status -eq \"stopped\"){\n \t if($LXCDestroyAsyncTaskStatus.exitstatus -ne \"OK\"){\n \t Write-Error \"LXC destroy task finished with error: $($LXCDestroyAsyncTaskStatus.exitstatus)\"\n }else{\n \t Write-Host \"LXC destroy task has successfully completed!\"\n }\n \n break;\n }\n \n\t Write-Host \"LXC destroy task has not finished yet, retrying in 5 seconds..\"\n Write-Host \"Task Status: $($LXCDestroyAsyncTaskStatus.status)\"\n sleep 5\n \n If($count -gt $maxCount) {\n Write-Warning \"Task Timed out!\"\n break;\n }\n $count++\n\n } While ($count -le $maxCount)\n}\n\nWrite-Host \"\"\n\nWrite-Host \"New LXC Summary:\"\n\n$LXCData | Convertto-json -depth 10\n\n$LXCCreateAsyncTask = (Invoke-RestMethod -Method POST -uri \"$($BaseURL)/nodes/$($ProxmoxNode)/lxc\" -Headers $header -Body $LXCData)\n\n\n$count = 1;\n$maxCount = 10;\n\nWrite-Host \"\"\n\nDO\n{\n \n $TaskID = $LXCCreateAsyncTask.Data;\n Write-Host \"Checking if LXC has finished creating..\"\n $LXCCreateAsyncTaskStatus = (Invoke-RestMethod -Method GET -uri \"$($BaseURL)/nodes/$($ProxmoxNode)/tasks/$($TaskID)/status\" -Headers $header).data\n \n if($LXCCreateAsyncTaskStatus.status -eq \"stopped\"){\n \tif($LXCCreateAsyncTaskStatus.exitstatus -ne \"OK\"){\n \tWrite-Error \"LXC create task finished with error: $($LXCCreateAsyncTaskStatus.exitstatus)\"\n }else{\n \tWrite-Host \"LXC create task has successfully completed!\"\n }\n \n break;\n }\n \n\tWrite-Host \"LXC create task has not finished yet, retrying in 5 seconds..\"\n Write-Host \"Task Status: $($LXCCreateAsyncTaskStatus.status)\"\n sleep 5\n \n If($count -gt $maxCount) {\n Write-Warning \"Task Timed out!\"\n break;\n }\n $count++\n\n} While ($count -le $maxCount)\n"
},
"Category": "Proxmox",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates/proxmox-deploy-lxc.json",
"Website": "/step-templates/ab90cb93-96ae-4841-8058-1cc5ec6feebe",
"Logo": "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CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmM2NTNiYTk5LWUwYTctNGVmMC1hNjc2LTg2NDRmMzYwOWEyNiIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4Yzc4MDlmOC02ZGQxLTQ3YTAtYjY3OS0yZWIyMGY5ZTBkMDMiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZWFiZDZkNC04MWFjLTQ5NzgtYmU0ZC0yODljNTVmNjY4NTEiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJXaW5kb3dzIgogICBHSU1QOlRpbWVTdGFtcD0iMTY3ODgzNTI4ODI3NDc3OSIKICAgR0lNUDpWZXJzaW9uPSIyLjEwLjMwIgogICB0aWZmOk9yaWVudGF0aW9uPSIxIgogICB4bXA6Q3JlYXRvclRvb2w9IkdJTVAgMi4xMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmM1MGQ1MGY0LTIxMmYtNDhkYS1iODBiLTYxZWJkM2ZkODk3YyIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChXaW5kb3dzKSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMy0wMy0xNFQyMzowODowOCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz6CzfBpAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAB3RJTUUH5wMOFwgIv4E7tgAAIABJREFUeNrtnXl8XWWZx7/ZmrTpXtoCty1LoYLsFKFsLiMMLuMIIzPq4MKIio6CraVsAtViWVppIsugw4CIOKyDirIoouwUoUgByyLSBQOltGm6JE2zzh/P7zQnh5ubm+Q9TXL7/D6f+4EmN+e85z3v733W93nA4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HI5+QJFPwbvmowIYCxwCHAccBuwBjANKgDrg78DzwB+BR4A1QAPQNkCeoxgYBowHjgE+BBwETAFGaZzrgOXAEuAB4M9ALdAItPtScCRRDkwFvgU8rQXfBLRoQbXr0wa06ndbgNeAS4H9tSj7G8OA/YDvA69qjE0a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",
"$Meta": {
"Type": "ActionTemplate"
}
}Provided under the Apache License version 2.0.