Register Listening Deployment Target with Octopus

Octopus.Script exported 2021-03-17 by adamoctoclose belongs to ‘Octopus’ category.

Step template to Register an Listening Deployment Target with Octopus Deploy using the API. Useful when spinning up machines and you want to wait to register until the machine finishes installing all additional software.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Octopus Base Url

RegisterListeningTarget.Octopus.Base.Url =

The base url of your Octopus Deploy instance. Example: https://samples.octopus.app

Octopus Api Key

RegisterListeningTarget.Octopus.Api.Key =

The API key of a user in Octopus Deploy who has permissions to register the cluster.

Machine Name

RegisterListeningTarget.Machine.Name =

The name of the machine to register with Octopus Deploy.

Machine Address

RegisterListeningTarget.Machine.Address =

The machine address (IP Address or Domain Name) to connect to

Port Number

RegisterListeningTarget.Machine.Port = 10933

The port the tentacle is listening on

Role CSV List

RegisterListeningTarget.Roles.List =

Comma separated list of environments to assign to the machine in Octopus Deploy.

Environment CSV List

RegisterListeningTarget.Environment.List =

Comma separated list of environments to assign to the the machine in Octopus Deploy.

Tenant CSV List

RegisterListeningTarget.Tenant.List =

(Optional) If this is for a tenant, the a comma separated list of tenants to assign the machine to in Octopus Deploy

Tenanted Deployments

RegisterListeningTarget.Tenant.DeploymentType = Untenanted

Choose the kind of deployment where this deployment target should be included.

Machine Policy Id Or Name

RegisterListeningTarget.MachinePolicy.IdOrName = Default Machine Policy

Enter in the name or the Id of the Machine Policy in Octopus Deploy for the AKS Cluster.

Overwrite Existing Registration

RegisterListeningTarget.Overwrite.Existing = False

Indicates if the existing listening tentacle should be overwritten in Octopus.

Script body

Steps based on this template will execute the following PowerShell script.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$OctopusAPIKey = $OctopusParameters["RegisterListeningTarget.Octopus.Api.Key"]
$RegistrationName = $OctopusParameters["RegisterListeningTarget.Machine.Name"]
$RegistrationAddress = $OctopusParameters["RegisterListeningTarget.Machine.Address"]
$OctopusUrl = $OctopusParameters["RegisterListeningTarget.Octopus.Base.Url"]
$Roles = $OctopusParameters["RegisterListeningTarget.Roles.List"]
$Environments = $OctopusParameters["RegisterListeningTarget.Environment.List"]
$SpaceId = $OctopusParameters["Octopus.Space.Id"]
$MachinePolicyIdOrName = $OctopusParameters["RegisterListeningTarget.MachinePolicy.IdOrName"]
$Tenants = $OctopusParameters["RegisterListeningTarget.Tenant.List"]
$DeploymentType = $OctopusParameters["RegisterListeningTarget.Tenant.DeploymentType"]
$PortNumber = $OctopusParameters["RegisterListeningTarget.Machine.Port"]
$OverwriteExisting = $OctopusParameters["RegisterListeningTarget.Overwrite.Existing"]
$OverwriteExisting = $OverwriteExisting -eq "True"

Write-Host "Machine Name: $RegistrationName"
Write-Host "Machine Address: $RegistrationAddress"
Write-Host "Machine Port: $PortNumber"
Write-Host "Octopus Url: $OctopusUrl"
Write-Host "Role List: $Roles"
Write-Host "Environments: $Environments"
Write-Host "Machine Policy Name or Id: $MachinePolicyIdOrName"
Write-Host "Tenant List: $Tenants"
Write-Host "Deployment Type: $DeploymentType"
Write-Host "Overwrite Existing: $OverwriteExisting"

$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("X-Octopus-ApiKey", $OctopusAPIKey)

# If tenanted only deployments is set then you require at least one tenant in the tenant list
if($tenantList -eq $null -and $DeploymentType -eq "Tenanted"){
	Fail-Step "Tenanted only deployments require at least one associated tenants!"
}

$baseApiUrl = "$OctopusUrl/api"
$baseApiInformation = Invoke-RestMethod $baseApiUrl -Headers $header
if ((Get-Member -InputObject $baseApiInformation.Links -Name "Spaces" -MemberType Properties) -ne $null)
{  	
	$baseApiUrl = "$baseApiUrl/$SpaceId"    
}

Write-Host "Base API Url: $baseApiUrl"

$existingMachineResultsUrl = "$baseApiUrl/machines?partialName=$RegistrationName&skip=0&take=1000"
Write-Host "Attempting to find existing machine with similar name at $existingMachineResultsUrl"
$existingMachineResponse = Invoke-RestMethod $existingMachineResultsUrl -Headers $header
Write-Host $existingMachineResponse

$machineFound = $false
$machineId = $null
foreach ($item in $existingMachineResponse.Items)
{
	if ($item.Name -eq $RegistrationName)
    {
    	$machineFound = $true
        if ($OverwriteExisting)
        {
        	$machineId = $item.Id 
        }
        break
    }
}

if ($machineFound -and $OverwriteExisting -eq $false)
{
	Write-Highlight "Machine already exists, skipping registration"
    Exit 0
}

$roleList = $Roles -split ","
$environmentList = $Environments -split ","
$environmentIdList = @()
Write-Host "Getting the ids for all environments specified"
foreach($environment in $environmentList)
{
	Write-Host "Getting the id for the environment $environment"
    $environmentEscaped = $environment.Replace(" ", "%20")
    $environmentUrl = "$baseApiUrl/environments?skip=0&take=1000&name=$environmentEscaped"
    $environmentResponse = Invoke-RestMethod $environmentUrl -Headers $header 

    $environmentId = $environmentResponse.Items[0].Id
    Write-Host "The id for environment $environment is $environmentId"
    $environmentIdList += $environmentId
}
$tenantList = $Tenants -split ","
$tenantIdList = @()

# If tenant list is null then no need to go trhough this or it will pick the first tenant from all the tenants in Octopus
if($tenantIdList -ne $null){

	foreach($tenant in $tenantList)
	{
		Write-Host "Getting the id for tenant $tenant"
		$tenantEscaped = $tenant.Replace(" ", "%20")
		$tenantUrl = "$baseApiUrl/tenants?skip=0&take=1000&name=$tenantEscaped"
		$tenantResponse = Invoke-RestMethod $tenantUrl -Headers $header 
	
		$tenantId = $tenantResponse.Items[0].Id
		Write-Host "The id for tenant $tenant is $tenantId"
		$tenantIdList += $tenantId
	}
	
}



$machinePolicyId = $machinePolicyIdOrName
if ($machinePolicyIdOrName.StartsWith("MachinePolicies-") -eq $false)
{
	Write-Host "The machine policy specified $machinePolicyIdOrName appears to be a name"
	$machinePolicyNameEscaped = $machinePolicyIdOrName.Replace(" ", "%20")
	$machinePolicyResponse = Invoke-RestMethod "$baseApiUrl/machinepolicies?partialName=$machinePolicyNameEscaped" -Headers $header
        
    $machinePolicyId = $machinePolicyResponse.Items[0].Id
    Write-Host "The machine policy id is $machinePolicyId"
}

$discoverUrl = "$baseApiUrl/machines/discover?host=$RegistrationAddress&port=$PortNumber&type=TentaclePassive"
Write-Host "Discovering the machine $discoverUrl"
$discoverResponse = Invoke-RestMethod $discoverUrl -Headers $header 
Write-Host "ProjectResponse: $discoverResponse"

$machineThumbprint = $discoverResponse.EndPoint.Thumbprint
Write-Host "Thumbprint = $machineThumbprint"

$rawRequest = @{
	Id = $machineId;
	MachinePolicyId = $machinePolicyId;
	Name = $RegistrationName;
	IsDisabled = $false;
	HealthStatus = "Unknown";
	HasLatestCalamari = $true;
	StatusSummary = $null;
	IsInProcess = $true;
	Endpoint = @{
    		Id = $null;
		CommunicationStyle = "TentaclePassive";
		Links = $null;
		Uri = "https://$RegistrationAddress`:$PortNumber";
		Thumbprint = "$machineThumbprint";
		ProxyId = $null
	};
	Links = $null;	
	Roles = $roleList;
	EnvironmentIds = $environmentIdList;
	TenantIds = $tenantIdList;
	TenantTags = $null;
	TenantedDeploymentParticipation = $DeploymentType
}

$jsonRequest = $rawRequest | ConvertTo-Json -Depth 10

Write-Host "Sending in the request $jsonRequest"

$machineUrl = "$baseApiUrl/machines"

$method = "POST"
if ($OverwriteExisting -and $machineId -ne $null)
{
	$machineUrl = "$machineUrl/$machineId" 
  	$method = "PUT"
}
Write-Host "Posting to url $machineUrl"
$machineResponse = Invoke-RestMethod $machineUrl -Headers $header -Method $method -Body $jsonRequest

Write-Host "Create machine's response: $machineResponse"

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "6f95a351-a1a1-43d1-a378-410a9acf0e60",
  "Name": "Register Listening Deployment Target with Octopus",
  "Description": "Step template to Register an Listening Deployment Target with Octopus Deploy using the API.  Useful when spinning up machines and you want to wait to register until the machine finishes installing all additional software.",
  "Version": 2,
  "ExportedAt": "2021-03-17T15:37:29.866Z",
  "ActionType": "Octopus.Script",
  "Author": "adamoctoclose",
  "Packages": [],
  "Parameters": [
    {
      "Id": "e98dc4e2-0766-4d2d-a753-eafe294fdeea",
      "Name": "RegisterListeningTarget.Octopus.Base.Url",
      "Label": "Octopus Base Url",
      "HelpText": "The base url of your Octopus Deploy instance.  Example: https://samples.octopus.app",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "cb3cdd41-3d1f-49c6-820e-acfa24bf5a88",
      "Name": "RegisterListeningTarget.Octopus.Api.Key",
      "Label": "Octopus Api Key",
      "HelpText": "The API key of a user in Octopus Deploy who has permissions to register the cluster.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    },
    {
      "Id": "ca9d9733-2032-466b-9e80-2aa6abd3c977",
      "Name": "RegisterListeningTarget.Machine.Name",
      "Label": "Machine Name",
      "HelpText": "The name of the machine to register with Octopus Deploy.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "1d3d8695-27a3-4d3e-9457-6b483253a609",
      "Name": "RegisterListeningTarget.Machine.Address",
      "Label": "Machine Address",
      "HelpText": "The machine address (IP Address or Domain Name) to connect to",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "ea762a1e-07ee-4eec-af7a-b6e29bf274d8",
      "Name": "RegisterListeningTarget.Machine.Port",
      "Label": "Port Number",
      "HelpText": "The port the tentacle is listening on",
      "DefaultValue": "10933",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "fa4bd89d-bb86-4d3f-87ff-17125cd88f24",
      "Name": "RegisterListeningTarget.Roles.List",
      "Label": "Role CSV List",
      "HelpText": "Comma separated list of environments to assign to the machine in Octopus Deploy.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "0c80326d-cdc1-439d-be6b-fbab4da42cda",
      "Name": "RegisterListeningTarget.Environment.List",
      "Label": "Environment CSV List",
      "HelpText": "Comma separated list of environments to assign to the the machine in Octopus Deploy.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "667a18b3-1694-4333-87a4-9be712b59122",
      "Name": "RegisterListeningTarget.Tenant.List",
      "Label": "Tenant CSV List",
      "HelpText": "(Optional) If this is for a tenant, the a comma separated list of tenants to assign the machine to in Octopus Deploy",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "db2de612-45bb-4e4a-ab95-64083dd80393",
      "Name": "RegisterListeningTarget.Tenant.DeploymentType",
      "Label": "Tenanted Deployments",
      "HelpText": "Choose the kind of deployment where this deployment target should be included.",
      "DefaultValue": "Untenanted",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "Untenanted|Exclude from tenanted deployments (default)\nTenanted|Include only in tenanted deployments\nTenantedOrUntenanted|Include in both tenanted and untenanted deployments"
      }
    },
    {
      "Id": "5ef91f37-b13b-413d-955c-872c7f274c7e",
      "Name": "RegisterListeningTarget.MachinePolicy.IdOrName",
      "Label": "Machine Policy Id Or Name",
      "HelpText": "Enter in the name or the Id of the Machine Policy in Octopus Deploy for the AKS Cluster.",
      "DefaultValue": "Default Machine Policy",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "5b2e0993-7f96-4447-b47b-029c8f225688",
      "Name": "RegisterListeningTarget.Overwrite.Existing",
      "Label": "Overwrite Existing Registration",
      "HelpText": "Indicates if the existing listening tentacle should be overwritten in Octopus.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.RunOnServer": "true",
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n\n$OctopusAPIKey = $OctopusParameters[\"RegisterListeningTarget.Octopus.Api.Key\"]\n$RegistrationName = $OctopusParameters[\"RegisterListeningTarget.Machine.Name\"]\n$RegistrationAddress = $OctopusParameters[\"RegisterListeningTarget.Machine.Address\"]\n$OctopusUrl = $OctopusParameters[\"RegisterListeningTarget.Octopus.Base.Url\"]\n$Roles = $OctopusParameters[\"RegisterListeningTarget.Roles.List\"]\n$Environments = $OctopusParameters[\"RegisterListeningTarget.Environment.List\"]\n$SpaceId = $OctopusParameters[\"Octopus.Space.Id\"]\n$MachinePolicyIdOrName = $OctopusParameters[\"RegisterListeningTarget.MachinePolicy.IdOrName\"]\n$Tenants = $OctopusParameters[\"RegisterListeningTarget.Tenant.List\"]\n$DeploymentType = $OctopusParameters[\"RegisterListeningTarget.Tenant.DeploymentType\"]\n$PortNumber = $OctopusParameters[\"RegisterListeningTarget.Machine.Port\"]\n$OverwriteExisting = $OctopusParameters[\"RegisterListeningTarget.Overwrite.Existing\"]\n$OverwriteExisting = $OverwriteExisting -eq \"True\"\n\nWrite-Host \"Machine Name: $RegistrationName\"\nWrite-Host \"Machine Address: $RegistrationAddress\"\nWrite-Host \"Machine Port: $PortNumber\"\nWrite-Host \"Octopus Url: $OctopusUrl\"\nWrite-Host \"Role List: $Roles\"\nWrite-Host \"Environments: $Environments\"\nWrite-Host \"Machine Policy Name or Id: $MachinePolicyIdOrName\"\nWrite-Host \"Tenant List: $Tenants\"\nWrite-Host \"Deployment Type: $DeploymentType\"\nWrite-Host \"Overwrite Existing: $OverwriteExisting\"\n\n$header = New-Object \"System.Collections.Generic.Dictionary[[String],[String]]\"\n$header.Add(\"X-Octopus-ApiKey\", $OctopusAPIKey)\n\n# If tenanted only deployments is set then you require at least one tenant in the tenant list\nif($tenantList -eq $null -and $DeploymentType -eq \"Tenanted\"){\n\tFail-Step \"Tenanted only deployments require at least one associated tenants!\"\n}\n\n$baseApiUrl = \"$OctopusUrl/api\"\n$baseApiInformation = Invoke-RestMethod $baseApiUrl -Headers $header\nif ((Get-Member -InputObject $baseApiInformation.Links -Name \"Spaces\" -MemberType Properties) -ne $null)\n{  \t\n\t$baseApiUrl = \"$baseApiUrl/$SpaceId\"    \n}\n\nWrite-Host \"Base API Url: $baseApiUrl\"\n\n$existingMachineResultsUrl = \"$baseApiUrl/machines?partialName=$RegistrationName&skip=0&take=1000\"\nWrite-Host \"Attempting to find existing machine with similar name at $existingMachineResultsUrl\"\n$existingMachineResponse = Invoke-RestMethod $existingMachineResultsUrl -Headers $header\nWrite-Host $existingMachineResponse\n\n$machineFound = $false\n$machineId = $null\nforeach ($item in $existingMachineResponse.Items)\n{\n\tif ($item.Name -eq $RegistrationName)\n    {\n    \t$machineFound = $true\n        if ($OverwriteExisting)\n        {\n        \t$machineId = $item.Id \n        }\n        break\n    }\n}\n\nif ($machineFound -and $OverwriteExisting -eq $false)\n{\n\tWrite-Highlight \"Machine already exists, skipping registration\"\n    Exit 0\n}\n\n$roleList = $Roles -split \",\"\n$environmentList = $Environments -split \",\"\n$environmentIdList = @()\nWrite-Host \"Getting the ids for all environments specified\"\nforeach($environment in $environmentList)\n{\n\tWrite-Host \"Getting the id for the environment $environment\"\n    $environmentEscaped = $environment.Replace(\" \", \"%20\")\n    $environmentUrl = \"$baseApiUrl/environments?skip=0&take=1000&name=$environmentEscaped\"\n    $environmentResponse = Invoke-RestMethod $environmentUrl -Headers $header \n\n    $environmentId = $environmentResponse.Items[0].Id\n    Write-Host \"The id for environment $environment is $environmentId\"\n    $environmentIdList += $environmentId\n}\n$tenantList = $Tenants -split \",\"\n$tenantIdList = @()\n\n# If tenant list is null then no need to go trhough this or it will pick the first tenant from all the tenants in Octopus\nif($tenantIdList -ne $null){\n\n\tforeach($tenant in $tenantList)\n\t{\n\t\tWrite-Host \"Getting the id for tenant $tenant\"\n\t\t$tenantEscaped = $tenant.Replace(\" \", \"%20\")\n\t\t$tenantUrl = \"$baseApiUrl/tenants?skip=0&take=1000&name=$tenantEscaped\"\n\t\t$tenantResponse = Invoke-RestMethod $tenantUrl -Headers $header \n\t\n\t\t$tenantId = $tenantResponse.Items[0].Id\n\t\tWrite-Host \"The id for tenant $tenant is $tenantId\"\n\t\t$tenantIdList += $tenantId\n\t}\n\t\n}\n\n\n\n$machinePolicyId = $machinePolicyIdOrName\nif ($machinePolicyIdOrName.StartsWith(\"MachinePolicies-\") -eq $false)\n{\n\tWrite-Host \"The machine policy specified $machinePolicyIdOrName appears to be a name\"\n\t$machinePolicyNameEscaped = $machinePolicyIdOrName.Replace(\" \", \"%20\")\n\t$machinePolicyResponse = Invoke-RestMethod \"$baseApiUrl/machinepolicies?partialName=$machinePolicyNameEscaped\" -Headers $header\n        \n    $machinePolicyId = $machinePolicyResponse.Items[0].Id\n    Write-Host \"The machine policy id is $machinePolicyId\"\n}\n\n$discoverUrl = \"$baseApiUrl/machines/discover?host=$RegistrationAddress&port=$PortNumber&type=TentaclePassive\"\nWrite-Host \"Discovering the machine $discoverUrl\"\n$discoverResponse = Invoke-RestMethod $discoverUrl -Headers $header \nWrite-Host \"ProjectResponse: $discoverResponse\"\n\n$machineThumbprint = $discoverResponse.EndPoint.Thumbprint\nWrite-Host \"Thumbprint = $machineThumbprint\"\n\n$rawRequest = @{\n\tId = $machineId;\n\tMachinePolicyId = $machinePolicyId;\n\tName = $RegistrationName;\n\tIsDisabled = $false;\n\tHealthStatus = \"Unknown\";\n\tHasLatestCalamari = $true;\n\tStatusSummary = $null;\n\tIsInProcess = $true;\n\tEndpoint = @{\n    \t\tId = $null;\n\t\tCommunicationStyle = \"TentaclePassive\";\n\t\tLinks = $null;\n\t\tUri = \"https://$RegistrationAddress`:$PortNumber\";\n\t\tThumbprint = \"$machineThumbprint\";\n\t\tProxyId = $null\n\t};\n\tLinks = $null;\t\n\tRoles = $roleList;\n\tEnvironmentIds = $environmentIdList;\n\tTenantIds = $tenantIdList;\n\tTenantTags = $null;\n\tTenantedDeploymentParticipation = $DeploymentType\n}\n\n$jsonRequest = $rawRequest | ConvertTo-Json -Depth 10\n\nWrite-Host \"Sending in the request $jsonRequest\"\n\n$machineUrl = \"$baseApiUrl/machines\"\n\n$method = \"POST\"\nif ($OverwriteExisting -and $machineId -ne $null)\n{\n\t$machineUrl = \"$machineUrl/$machineId\" \n  \t$method = \"PUT\"\n}\nWrite-Host \"Posting to url $machineUrl\"\n$machineResponse = Invoke-RestMethod $machineUrl -Headers $header -Method $method -Body $jsonRequest\n\nWrite-Host \"Create machine's response: $machineResponse\""
  },
  "Category": "Octopus",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/octopus-register-listening-target.json",
  "Website": "/step-templates/6f95a351-a1a1-43d1-a378-410a9acf0e60",
  "Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAC1QTFRFT6Tl////L5Pg8vj9Y67omsvwPJrisdfzfbzs5fL7y+T32Ov5isLucLXqvt31CJPHWwAABMJJREFUeNrs3deW4jAMAFDF3U75/89dlp0ZhiU4blJEjvQ8hYubLJsA00UCBCIQgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIhD8kJm+t+QprfdKfB9HbYpx6CWfspj8HMi+gMgHL/AmQA8W3JTKH+ALFvzCeL0RbpyoCPE9IJeNOSQwh5Z3qd6yRGWQ2qi2cZQWxqj1WzQYSjeoJmJlAklOd4VlArOqPhQEkqBERToeMcfRJBkC0Uep8CfBpjz4JsHJ0zF3dkEWNje0kiB/sUC6eApndaIiCMyAa1PiwJ0AWhRGJHJJQHG2dC7h1rNbO1QOxSA7lNCkkKrQIpJCAB1GREILYIC1NAiwbpKFJgGWDNExcwGstfExcZBCHC6nOglshHtmhViLIig1RNBCN7qjtW8C0Z1UvJcC1Z9XmwMBzzvobmgAyEzgq91dtEEsBsQSQQAFZCSBAATEEEApHZbrVBIkkEIUPSVeB+KtALA0kXQUSrwKZBCIQBnk8Y4i5CsReBeKvkqLM+BCSDWJlrZFvGk9SRTHshkgjZCGAaArIxm3H3grhVzFlW2msfl1ca79UJ1bofYvsDHHlNdTZnlh5MghuPd5NdBDUNZHyCkfktIh03XzALGRPlBDPac7qgWjHZzWcmF5zmmkhidMQ6boKiDXcDTUEaylZqCGJ0Vjvu/fLJtHqhSANEvqb2OYqkOUqEHuVMbJcZdZCGiPhKhC4yjqiIjEE7XThMp8fAWII3mY3kUIQD+AMKQTzPiBhgQ63HlT/KSvgtoi0dq5mCPah1UIE0eh3sT0NhOByvKeAkFzi8PgQomumFhsyOxpIzZN4gLOj5plVwNpR0b2AuePWKBEHQu24pSsJA+LVCeHHQxZ1SiyDIdqok8IOhSSnTottHEQTdyt4ettAj4KkzA4dMikk2Dht2S5ptm1vswnPDxn0YyDZ5oDM3iToo2T5voWaYe+Q+vdjH80QyAzZhCgcDtLMI1Tmtz9w++XHgziHQHJJu/OZ3bs9Xn8gQ72NcP3dKqEfkp10F51xhoIi2I91R+LurXV/5q7pH+wx061CzO16oSQleMyr8fXvwMA0Pro8432DPD/ySx8XrHfSuDAM8n6UhnjQabaiXf5Bq/lREHvEeNtn1rJ08+C/uXkQZHeguxAPC3UvtcJYUogLzZX5hhZZvS6onG5lxXtzWGaygwb79vT/IXhdlNibwlKYOR6T8xjI7W8n+xV7T+GH4tMzWwR+lZhRkJYSsC0thpmCYqyngOz3rN2FLBZ2wZflBCggUHF0Vnp88JKienzIXLSEZCZqU7IKr/gQW9yx3pzV7Y9kvWZWTRRIqDmTtRUnU7b2lLcTYmoqHqnmiO1poER0SPkAeZMAZxaJx0Y3TCdAclsIqDz03ALcyxfTCZBsthoGXWmigGyVhWPLFJJfuuKQWycoEFdXbH4dJJoJxNR1eD/kshz6yn48cF8yW8sFoitflB1w6Q8n+/15Za7oA17/pYNmYgP5fmWm8L1NOHPWgK8kuFew1/JXtOA0yJCv7ah7X8ObUuT5kObU30+fDZm8+zqP+HTIpK0xQ796b5Kv2hSIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAEIpBf8UeAAQAEjtYmlDTcCgAAAABJRU5ErkJggg==",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Wednesday, March 17, 2021