Convex - Smoke Test HTTP Action

Octopus.Script exported 05/29/2026 by itsmebenwalker belongs to 'Convex' category.

Performs a smoke test against a Convex HTTP action endpoint after a deployment. Validates that the deployment is live and responding correctly by checking the HTTP status code and optionally asserting on the response body.

Use this as a post-deploy verification step to catch failed or partial deployments early.

Parameters

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

Deployment URL

ConvexSmokeTest.DeploymentUrl

The base URL of your Convex deployment.

Example: https://happy-animal-123.convex.site

Find this in your Convex dashboard under Settings → URL & Deploy Key.

Action Path

ConvexSmokeTest.ActionPath = /health

The path to the HTTP action endpoint to test.

Example: /health or /api/ping

This is the route registered in your Convex http.ts file.

HTTP Method

ConvexSmokeTest.HttpMethod = GET

The HTTP method to use for the request.

Expected HTTP Status Code

ConvexSmokeTest.ExpectedStatusCode = 200

The HTTP status code the endpoint should return for the test to pass. Defaults to 200.

Response Body Assertion

ConvexSmokeTest.ResponseBodyAssertion

Optional. A string that must be present in the response body for the test to pass.

Example: {"status":"ok"} or simply ok

Leave blank to skip body assertion.

Request Body (JSON)

ConvexSmokeTest.RequestBody

Optional. A JSON body to send with the request. Only relevant for POST or PUT requests.

Leave blank for GET requests.

Max Retries

ConvexSmokeTest.MaxRetries = 3

The number of times to retry the request if it fails. Useful for allowing a brief warm-up period after deployment. Defaults to 3.

Retry Delay (seconds)

ConvexSmokeTest.RetryDelay = 5

Seconds to wait between retry attempts. Defaults to 5.

Request Timeout (seconds)

ConvexSmokeTest.CurlTimeout = 30

Maximum seconds to wait for each individual HTTP request to complete. Defaults to 30.

Script body

Steps based on this template will execute the following Bash script.
Show script
deploymentUrl=$(get_octopusvariable "ConvexSmokeTest.DeploymentUrl")
actionPath=$(get_octopusvariable "ConvexSmokeTest.ActionPath")
expectedStatus=$(get_octopusvariable "ConvexSmokeTest.ExpectedStatusCode")
bodyAssertion=$(get_octopusvariable "ConvexSmokeTest.ResponseBodyAssertion")
httpMethod=$(get_octopusvariable "ConvexSmokeTest.HttpMethod")
requestBody=$(get_octopusvariable "ConvexSmokeTest.RequestBody")
maxRetries=$(get_octopusvariable "ConvexSmokeTest.MaxRetries")
retryDelay=$(get_octopusvariable "ConvexSmokeTest.RetryDelay")
curlTimeout=$(get_octopusvariable "ConvexSmokeTest.CurlTimeout")

if [ -z "$deploymentUrl" ]; then
  echo "ERROR: ConvexSmokeTest.DeploymentUrl is required."
  exit 1
fi

if [ -z "$actionPath" ]; then
  echo "ERROR: ConvexSmokeTest.ActionPath is required."
  exit 1
fi

if [ -z "$expectedStatus" ]; then
  expectedStatus="200"
fi

if [ -z "$httpMethod" ]; then
  httpMethod="GET"
fi

if [ -z "$maxRetries" ]; then
  maxRetries="3"
fi

if [ -z "$retryDelay" ]; then
  retryDelay="5"
fi

if [ -z "$curlTimeout" ]; then
  curlTimeout="30"
fi

deploymentUrl=$(echo "$deploymentUrl" | sed 's|/$||')
actionPath=$(echo "$actionPath" | sed 's|^/||')
targetUrl="${deploymentUrl}/${actionPath}"

echo "Smoke test target: $targetUrl"
echo "Method: $httpMethod | Expected status: $expectedStatus | Max retries: $maxRetries"

attempt=0
success=false

while [ $attempt -lt $maxRetries ]; do
  attempt=$((attempt + 1))
  echo "Attempt $attempt of $maxRetries..."

  curlArgs=(
    -s
    -o /tmp/convex_smoke_body
    -w "%{http_code}"
    -X "$httpMethod"
    --max-time "$curlTimeout"
  )

  if [ -n "$requestBody" ]; then
    curlArgs+=(-H "Content-Type: application/json" -d "$requestBody")
  fi

  actualStatus=$(curl "${curlArgs[@]}" "$targetUrl")
  responseBody=$(cat /tmp/convex_smoke_body)

  echo "Response status: $actualStatus"

  if [ "$actualStatus" != "$expectedStatus" ]; then
    echo "WARNING: Expected status $expectedStatus but got $actualStatus."
    echo "Response body: $responseBody"
    if [ $attempt -lt $maxRetries ]; then
      echo "Retrying in ${retryDelay}s..."
      sleep "$retryDelay"
    fi
    continue
  fi

  if [ -n "$bodyAssertion" ]; then
    if echo "$responseBody" | grep -qF "$bodyAssertion"; then
      echo "Body assertion passed: '$bodyAssertion' found in response."
    else
      echo "WARNING: Body assertion failed. '$bodyAssertion' not found in response."
      echo "Response body: $responseBody"
      if [ $attempt -lt $maxRetries ]; then
        echo "Retrying in ${retryDelay}s..."
        sleep "$retryDelay"
      fi
      continue
    fi
  fi

  success=true
  break
done

if [ "$success" = false ]; then
  echo "ERROR: Smoke test failed after $maxRetries attempt(s). Deployment may be unhealthy."
  exit 1
fi

echo "Smoke test passed. Convex deployment is healthy."

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

Show JSON
{
  "Id": "e4bb4066-1919-49a4-a6f6-61b1fd97bb1f",
  "Name": "Convex - Smoke Test HTTP Action",
  "Description": "Performs a smoke test against a Convex [HTTP action](https://docs.convex.dev/functions/http-actions) endpoint after a deployment. Validates that the deployment is live and responding correctly by checking the HTTP status code and optionally asserting on the response body.\n\nUse this as a post-deploy verification step to catch failed or partial deployments early.",
  "Version": 1,
  "ExportedAt": "2026-05-29T00:00:00.000Z",
  "ActionType": "Octopus.Script",
  "Author": "itsmebenwalker",
  "Packages": [],
  "Parameters": [
    {
      "Id": "8e928a76-2256-4b34-886f-473bf53a4e21",
      "Name": "ConvexSmokeTest.DeploymentUrl",
      "Label": "Deployment URL",
      "HelpText": "The base URL of your Convex deployment.\n\nExample: `https://happy-animal-123.convex.site`\n\nFind this in your Convex dashboard under **Settings → URL & Deploy Key**.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "8734c4d8-9d6c-4c33-93c8-66608f3c450e",
      "Name": "ConvexSmokeTest.ActionPath",
      "Label": "Action Path",
      "HelpText": "The path to the HTTP action endpoint to test.\n\nExample: `/health` or `/api/ping`\n\nThis is the route registered in your Convex `http.ts` file.",
      "DefaultValue": "/health",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "fc465072-d618-4487-ac00-95b40027d253",
      "Name": "ConvexSmokeTest.HttpMethod",
      "Label": "HTTP Method",
      "HelpText": "The HTTP method to use for the request.",
      "DefaultValue": "GET",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "GET|GET\nPOST|POST\nPUT|PUT\nDELETE|DELETE"
      }
    },
    {
      "Id": "961a2dc5-1bdf-46b7-bb63-08541f20c241",
      "Name": "ConvexSmokeTest.ExpectedStatusCode",
      "Label": "Expected HTTP Status Code",
      "HelpText": "The HTTP status code the endpoint should return for the test to pass. Defaults to `200`.",
      "DefaultValue": "200",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "313c7f55-0291-4591-a941-dab64822b6b2",
      "Name": "ConvexSmokeTest.ResponseBodyAssertion",
      "Label": "Response Body Assertion",
      "HelpText": "Optional. A string that must be present in the response body for the test to pass.\n\nExample: `{\"status\":\"ok\"}` or simply `ok`\n\nLeave blank to skip body assertion.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "e405bd82-b839-4de7-be5b-a6619b637631",
      "Name": "ConvexSmokeTest.RequestBody",
      "Label": "Request Body (JSON)",
      "HelpText": "Optional. A JSON body to send with the request. Only relevant for POST or PUT requests.\n\nLeave blank for GET requests.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "MultiLineText"
      }
    },
    {
      "Id": "2766feca-344e-45c9-b02b-e05b24725837",
      "Name": "ConvexSmokeTest.MaxRetries",
      "Label": "Max Retries",
      "HelpText": "The number of times to retry the request if it fails. Useful for allowing a brief warm-up period after deployment. Defaults to `3`.",
      "DefaultValue": "3",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "5f841ad3-12bd-4ba4-b065-26b15c1e5d71",
      "Name": "ConvexSmokeTest.RetryDelay",
      "Label": "Retry Delay (seconds)",
      "HelpText": "Seconds to wait between retry attempts. Defaults to `5`.",
      "DefaultValue": "5",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "f6063486-b004-4c6a-953d-2dc8190c8635",
      "Name": "ConvexSmokeTest.CurlTimeout",
      "Label": "Request Timeout (seconds)",
      "HelpText": "Maximum seconds to wait for each individual HTTP request to complete. Defaults to `30`.",
      "DefaultValue": "30",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "Bash",
    "Octopus.Action.Script.ScriptBody": "deploymentUrl=$(get_octopusvariable \"ConvexSmokeTest.DeploymentUrl\")\nactionPath=$(get_octopusvariable \"ConvexSmokeTest.ActionPath\")\nexpectedStatus=$(get_octopusvariable \"ConvexSmokeTest.ExpectedStatusCode\")\nbodyAssertion=$(get_octopusvariable \"ConvexSmokeTest.ResponseBodyAssertion\")\nhttpMethod=$(get_octopusvariable \"ConvexSmokeTest.HttpMethod\")\nrequestBody=$(get_octopusvariable \"ConvexSmokeTest.RequestBody\")\nmaxRetries=$(get_octopusvariable \"ConvexSmokeTest.MaxRetries\")\nretryDelay=$(get_octopusvariable \"ConvexSmokeTest.RetryDelay\")\ncurlTimeout=$(get_octopusvariable \"ConvexSmokeTest.CurlTimeout\")\n\nif [ -z \"$deploymentUrl\" ]; then\n  echo \"ERROR: ConvexSmokeTest.DeploymentUrl is required.\"\n  exit 1\nfi\n\nif [ -z \"$actionPath\" ]; then\n  echo \"ERROR: ConvexSmokeTest.ActionPath is required.\"\n  exit 1\nfi\n\nif [ -z \"$expectedStatus\" ]; then\n  expectedStatus=\"200\"\nfi\n\nif [ -z \"$httpMethod\" ]; then\n  httpMethod=\"GET\"\nfi\n\nif [ -z \"$maxRetries\" ]; then\n  maxRetries=\"3\"\nfi\n\nif [ -z \"$retryDelay\" ]; then\n  retryDelay=\"5\"\nfi\n\nif [ -z \"$curlTimeout\" ]; then\n  curlTimeout=\"30\"\nfi\n\ndeploymentUrl=$(echo \"$deploymentUrl\" | sed 's|/$||')\nactionPath=$(echo \"$actionPath\" | sed 's|^/||')\ntargetUrl=\"${deploymentUrl}/${actionPath}\"\n\necho \"Smoke test target: $targetUrl\"\necho \"Method: $httpMethod | Expected status: $expectedStatus | Max retries: $maxRetries\"\n\nattempt=0\nsuccess=false\n\nwhile [ $attempt -lt $maxRetries ]; do\n  attempt=$((attempt + 1))\n  echo \"Attempt $attempt of $maxRetries...\"\n\n  curlArgs=(\n    -s\n    -o /tmp/convex_smoke_body\n    -w \"%{http_code}\"\n    -X \"$httpMethod\"\n    --max-time \"$curlTimeout\"\n  )\n\n  if [ -n \"$requestBody\" ]; then\n    curlArgs+=(-H \"Content-Type: application/json\" -d \"$requestBody\")\n  fi\n\n  actualStatus=$(curl \"${curlArgs[@]}\" \"$targetUrl\")\n  responseBody=$(cat /tmp/convex_smoke_body)\n\n  echo \"Response status: $actualStatus\"\n\n  if [ \"$actualStatus\" != \"$expectedStatus\" ]; then\n    echo \"WARNING: Expected status $expectedStatus but got $actualStatus.\"\n    echo \"Response body: $responseBody\"\n    if [ $attempt -lt $maxRetries ]; then\n      echo \"Retrying in ${retryDelay}s...\"\n      sleep \"$retryDelay\"\n    fi\n    continue\n  fi\n\n  if [ -n \"$bodyAssertion\" ]; then\n    if echo \"$responseBody\" | grep -qF \"$bodyAssertion\"; then\n      echo \"Body assertion passed: '$bodyAssertion' found in response.\"\n    else\n      echo \"WARNING: Body assertion failed. '$bodyAssertion' not found in response.\"\n      echo \"Response body: $responseBody\"\n      if [ $attempt -lt $maxRetries ]; then\n        echo \"Retrying in ${retryDelay}s...\"\n        sleep \"$retryDelay\"\n      fi\n      continue\n    fi\n  fi\n\n  success=true\n  break\ndone\n\nif [ \"$success\" = false ]; then\n  echo \"ERROR: Smoke test failed after $maxRetries attempt(s). Deployment may be unhealthy.\"\n  exit 1\nfi\n\necho \"Smoke test passed. Convex deployment is healthy.\"\n"
  },
  "Category": "Convex",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates/convex-smoke-test-http-action.json",
  "Website": "/step-templates/e4bb4066-1919-49a4-a6f6-61b1fd97bb1f",
  "Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAeGVYSWZNTQAqAAAACAAEARoABQAAAAEAAAA+ARsABQAAAAEAAABGASgAAwAAAAEAAgAAh2kABAAAAAEAAABOAAAAAAAAASAAAAABAAABIAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAyKADAAQAAAABAAAAyAAAAAAO6ld3AAAACXBIWXMAACxLAAAsSwGlPZapAAAoyUlEQVR4Ae19CWBVxbn/zDnnLllIIGETwiIisQ+BIrjU5YFtrftaxbo+a/vKe7alsuP/9f3/edUqq1itttr35LkrioC7dQG1KAiRhEUJhkU2Zc2+3HvPmfn/vpsEbm62m+Tec85NZjTcs87M+c188y3zzTeMqaQQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgGFgEJAIaAQUAgoBBQCCgEHEOAOlNmti5QTh/rLA2mp0tIzhWBpOuOplpA+zrkRBkbThDDNoKVrtVxjVVKa5ayaVfbZurUajSW6NXgOfLwikASBfmjkyHQ91RiiMZYrpTyNMy2XMTlYMtlPcp7NJUtB0T78eXRQB54LJ4l/LYmnGDPxF0QD1eKvDH+HBePfcSZ34HoRZ7xIytDOXsP+aT9/+WWr/nX1E2cEFIHECdCjZw/P4GbaaGR3PuPyB4zx0wFujodzr8HRrXFD4F+BA2IDIJrwNSqe7kWmhkYJ/+IfjYG88ICGfOiXng9KQXmV4vYuZFXINf6pNPnnpZklRSev3l0bmZ867jgCDW3R8Ry68Zvl48b1Fjw0QXLtSvT4CwDFsBRNCxOAiV5bzwkSghA1HP0R8YEDhcuoFSKEgyIwpE+kFO/o0vNpRn7+kfBN9U+HEFAE0k7Yvhs9Oi3Fq03AazeCE1zk4ewk6qChBBNELNVsIBhwLchnYQI9ACr6UHC+7JilrzolP78slnzUMycQUARyAotWj+TEiUZpRekVGme/lFyei/7Xq6FDEoHQsQXhx4L8k0jO0Wolo25Svbz4o/qEJNuBOi4LMvli3w2FG6MeVactIKAIpAVgoi/LG5heWTw2i3tDkKFSuGVZ6SFuZkOi6qtLbbDgcgRoI5dJPhziVo5P5z5YqMIjOY3mTpufSBQjYoEYFkCjv8+5fPxgSfXfTy0uDkR/qzo/gYAikBNYxOWIRDDDMAZz3RptMH4OaONcqOMj/ZqWRsp1gygWl8I6kAk1uA9UTVwFpq8NXMqHyz2prwz67LOaDmTX5V9RBJLgJpZ5TKt4a8xw2J4uEJJfDg5zgU/jvcmiFYQZiojGqUQcBf+TPbkAdVj4tdCXjs/PJ0VfpXoEFIHY3BWOnj06R7f0i2HsvRGd8wIf1/wBGs3x51QiQqEEjrLGZOK+7PWb3nGqLm4rVxFIVIssGD0jzR/QMkOmlip0bmBi2yNMzTJ0ywoxEZQGr0ljaZWH+7DavNV5ZtTr7TotOWvsGMyb3y44u9HPtYGkq5AI5lQCZ2OmwAwNZy+ZQvxX7/zN25yqi1vK7fYEcv9p92T7mTiXCzYRHWMsusdQCB4ZEH78mGmAni0NyEGkY9NstQnAatGHayCblGD671t0530617ZDZNpuWNrXNbq1d3bR/Ir2NHDFuaP7mgF+KyYCf+nR2PfIEuYUoVCHgL5E5R/FVOTcwyXVj3RnRb7bEsiDp80eBaKYjP5wNRw9ctDJMTONLkFaASigpXE8DBjJ7viPZrgxKRemBQvvWtIK4mQ/rm3hkn8GBXhNisUKJ++cF9P8w+Hzcnt4gym3oQK/83JtRBD1cEr0IhNx/XzKanzUrN7rC9aHP7Sb/dPtCGTxaXOGMiH+Az37JoMbaaa0woQRj3YPkw06lk6kg9+QgATG+TcguM/And7kMrhq2vbF+9sq69i4cZmMW5N1LqdCR+lfA6/Glgi2rbw6e98PsQtzKBVgon/ITMt6iK9e3SmxsrP1sfv9bkUgi3Jn34quO9/g+knUeVvmE/FrBg2ciQiGEjjMYTCd1aDIFwMW/2BOG5ylZOzYIdwQ/weE93O4+npImXciNUw4wuq20pL6lKz8/D1O1MOJMrsFgeSNvCs9I5Q+T+P6XUQUJEo5kUgk06HWUB0gkhVLxp+DB+Lz07c9sL21+hw5a/QPPVKbB2vT+AC4iTO1Z4z8zKCb7AgyMbn3+k0ftFbnrnKvyxPIgtwZJ+vMWOLh+oQQfPmcGYObdhfSeXT8F8J6D3CIFzVde+R3X92/pemTdVdIPzGC/lk6YzNAaH7ST5xIZBJGydUglNlZGwr/7EQd7CyzSxPIglNnnA0941mM2sND0p3zX6S3eDSDCKUKDb8U/f5P07fPK2ypE5SM//5E6CaPQIk/3SndREevITca6CYP9ZT6LN6FJxe7LIE8mDvzEozRz6IDZpMi7vbUQCioawUG6f+GC/2CqV/d/21z9f527Ng+qYZ8EHrJrWQOdkLkoo5DIletFC/JEP+3XgUFpc3VNdmvdUkCWXjq9OsMzfMUGiedzK/JlE4QirkHnij3Ddq+88lJrPkVg0fHj5rq4dr9eMdPhOJEStNBJELC+dH7s4zPPz/qRB0SWWaXI5AHc2dPgoy+BN0l1SllPB4NRjoK/Wcx620wwJnTiudtbS7fY+NHXYpnn4RjZH+nrFzESWDhWhOU+g198vOb5XrN1T0ZrnUpAlk4fNb18A15GnMOKclMHJEdx4NYDiCSY8ISv59evOAvkfcajo+NGzVK17QXoJeMJL3EiZRaJ26tNTTrmvR1Ww46UYdElNllCGThiOmXGtz7CkyoSc05mmvkMC8BRwGhPA93lrunFD9wOPq5o2eePgjWumcQHmWCU0RCnARc7LPagLim/6ZNh6LrmIznXYJAQBxn6tzzNj4mO9l0jvZ0Gq/mgWu6tcky2Z0zdszNj363dNSoXnCkegGOjxdXO8hJaoT1vtBTfpq9bl15dB2T7bxuijfZah1R34UnT0doHc/zGGW7NHHQJwcxjwPz6mjdYO8uPHXWdREwhA97bt5cclQYN4KDvEkijxOJCDNV03/Mrdon5LhxHifqEM8ynUExTl9Aruncqz9laPpwU3YPF6EQNHbilKRzPDhi1l3RUFJgBtNXe1ONJd5wikiqQCQQt24s4aE/Rtcv2c6TWsRaOGLmn32a99c0snbVRA1Epl8KLRf+pXNMlNB/5OdVawXmGqI6b0rxI43WlpPDI+fmCriuT3RCJ6F60zp4tMzkrPUFTyRr+yQtgSwcMes2zAE8ZUosN+pCiTp9nVLO4TMmmcmgcUhZAv+Og4jI+B1c4cmMegh9Dy70OtadCOjF5sszti9qEv8K6+P7+r38ba+mnYFgDbajFI72IlklePslWRsK1thegTgUmJSd66HcWQjnyT/BWNrHOde9OKCPLIgThOc8QBhh93isJ4El7ktcz8f8f6Gh69vNYHBflT+9NG9rHq03aVcqO+OM4Uy33oPuMtQJ/y1Y1cjBsSigWxP6JaH5N+kIJG9knjc9VPW2l3t+CP+ldnUWtzxMRAGX+3B1oFOAE8gvcGkVmOFHmjdly7StecfiWddD48acj+W0b6KxM2hZr92JdCHoJS/BufFm1MF+VtaJD046All46szfwdz5UDISB7m609oQ8uAFQXwEwlguNM+HM7764zedaMOYXj0yfvTtMP8uwWiu2U8idaGGIAsmnT6SVAQy/3szTzWEthbLWbOSRbRq4BZYLEXyFHGKF0KmWD6reMGOmHp2HB86Om7MIvhOTXNijqQ+gPfRIKJS9vm8sNX1L3H85E5nVbcnRaezsScDzeL3wTU8K+hS1/VIFIgwyI3dFGYNJvfeYVw8UW6kfdgRPSIy384cB5jxn1xa42HZ+me7lXYS7WD6zbYEWwAOdi1G5qQQtZKGgyweMftSmDffwEy5q+du6jgG+U+Z1bA8LdUFf3hK8VzXxMKtOHPMSPRMMnD0ciIgBC24Cgp2S1Z+wfOdIXa73k0KAlkKxXxvqPoTLH46y80TgmHHQonwWYy9YHJr0cyihZvsasj2lFNy5tgpPs7+ZDcXoTrWR0rZqWuBszI+3+Z69/ikELH2BqtuxvoO1xIHmWlJwYAz4bvgb3+Yvm3ep+3psHY/e6Sk4vHsnmk3IGLJ+VjLYWvxtG4FVq1htcI7FQX/3tbCO1CY6znIowi4UBNK3wCzaG5Y0e3ARybqlRN6hlVscZE3vWje87hmb4/r4McdHTvqBx7D+BDLAvx2KwO0ZBdxistCQhvf94svijv4Cba85mp5nhCoDaZd7+WG64iDTLYAD9Pc5qOmZZ43o2j+c8lCHIRr9sbNn8EL4SmKomh3osiRKRrPNLggLuLq5GoO8mDO1BSR6vkMEUnGuGldOSYp4QJiFsEOM33q1/PedHULt1K5GsTdChgyH3FK4AndyoMJuFVPlhUg0rPcHAPY/uGjPWCneX8C0co1xEHugjQDHmLms6GAmJjMxEHNkLJx4zfYFesxRG9sT6vE5VkS68C9esD37O64ZJigTOxHJsYPwYDGpZD/Tp3SDSnsGsI5PCbElGlF826btXsBHAeTP8Ec/RisWd/RRJ7dCRFR4JnMJlEESbvLjrU81xLIglNnjsG8x0Q3iFZkvsXM/W7TYleAazwSK7jJ8Fzf9Vu/sxBmqGGPEDvrTAa0FK71Erp1h53ltqcs1xKIpvGbMRPtozCdTqbwMldm0R7kF80snrvaybokrGxNPl4jxbE698mEldJsxuRhDOPG7RQ5stkHHL7oSgJ5dGReOoyl1znNPWA9I1eRV5kRvHLajrmuNkd2ph9lr9u0DwPRS7R3od2JXFC8Gh+mBXw/sbvsWMqzH5EYahUwq87H5NspTobuIc4BZfyZsmDKLdO2Lo6r+3kMENj+iGDaEsS2CtqviTCYy2lGid1m+0fHUKArCQSDyk9pnsGp5IEZF4Gun0hLL/1F3u68WqfqYWe52ZcX5GPp4qdYfWhnseGyguHol3wihS6yvfA2CrQfjTYq9PDw32bgkYucmjUnhRz+Xn8rH5D668n5T3Tdxe5R7cDzGK1dfsYJDhJW1jUtE6vYL4mqluOnriMQS08bj308hjgR3yo8ASjNp8oHpNzV2Q06HW/ZDlTAK4234Zt1FJtK2Z7IFIMJy6tsL7iNAl1HINhE86LwnEMbFY/3bdI5sM7kjbQeqd2SOAjPNIqrK+UHTkwchkjMkuycg2ef3i/ebduZ/FxFIHksD/qamGC3ck5iFZbBbvBp+h2T8/OqOwNo0r+rsdftdl4kzMjVBXMxvTVLO9tNGLqKQPzDanKgoI+0U7wiYwBC6+zHfhy3/GbbA65fn5DoziOCbBW2eSt1omPQbD6i1E9I9De2J38ncGixfh6P/D4WRdEe5S0+E88bYeMikwFm8Tvb2icwnuW6Oa/swsIDwGWDxwFFhOZEEJn/XLS+a/qlaypCnQb6x9kUOM2uRLoOJiPzphXP/btdZbq9HOjn6KZsFW2xZnciAkHKrT5vbH+7y26pPPt6Y0s1iLgOBWQsiCTiSuIO6/WONyoHpC1MXCnJmTPn1j8gZtnTEBEQke5jSNazulbkRlx29NA1BEKBqNEip9kRzoe4FOZZvtU07bfd0ZzbVo/ThfdLdNZDFDrU7uSBE56hyVF2l9tSea4hEG+IDwB370/xaBOdSPfAOojZU7fN3Z3ospIx/x75+UfRCl8Z9tNHWLBDWNmRbsHNNQQCb9mhsCilJFpBD7uuS7ESWy0/65ZGcFs9wnqIlIVO6CEYuMhEc4pbMHENgSAayCkU1TyRiZzioJSXwTFvDrhI4llVIj8mwXlrnG9yAqB6zWegnDjUn+BPjCn7xPbImKpQ9xACN59M+14kMhmIdAjZ+k8ztj+wLZHldIW8Q1wUk6Ke2BZpihQp6uiUvSrLerlifYhrCAR6MyYJEzdmUewqbLSzK1TLH2raLOpKNAIe0/gGnbXKbgKhPoBekBb0Wr7oOjlx7hoCYVL0T6T+USe+8UX37Jlb4gTQyVammZpKa2AOQ9RyourYPcgdGyO5gkCW3nCDjuX7WYniH8Q94Gu13eTyaSdaOxnL7L1mTSVI47DdHaRezK7xgeG7ATe7v7/Zb/6maIgfjZGeKA5C3AMD4eLZRfOxZZlKsSCA9iCB96DdHKSOX/GytBqtMpZ6JvoZVxBILyud5M3URHwsEQeCvO0JeLWXEpF/V84TGvrRug5r31fWrSMV+9imTa7wqnYFgVRWBz0YrXzhMSvObUH+VhgKn7tns9I92gsttqIqsZ1AwOoxUVhIHKy99U3E864gEIHZO8xLEJHENdGMeVCaiE9mqUnBDiCLOQnbRdKwR69G29O5I7mCQLA7Geoh4x6loS4aIvt4RvGir9wBd3LVAqN4jZ01Jt+vgJCHfH7tEzvLba0sVxBIaxXs9D2IV8gj3syp09VKhgxAIEE7gaMtoyFgrezxycbDbsHHFQQCNYEmUOkvbqlOvAod0UP6u3HLtLtlpHHsPGpPAjGCe4igposn7CkxtlJcQSA+j8fC0BHXEDskXnGmrbp71/0HY4NCPRWNALzVvNRx7Ui0TwmocXnPz7dssKO8WMtwBYFIKxCCEBRIgC/WG7ECoZ5rioCJOApNr8b/CnVCcI8qJo0/xj/3zuXoCgLhui+Az4ib3ZvEq5C0yg2Tre4cPN37bXSOVDs4CHEPhLD+W1Z+/ma3Ie4KAjnch1F4T7g2xKc56jbVZAVTds7d6zbAk6o+UvRMtJJOu97WCLE3qJtz3YiNKwiElr1yLuM2KVUX+EGuAsElun3d2KZxq5PkPDuRANJwWDckyt/3W7fFlbqiKwgk3KJS+y5eHATrzSWI5OO49ZRumhE6R2+RQAt5CkQr2JFf67lhk2snct1DIEzuj4eSTqsGEXjusG7xRvJs5ZtD+1eu7OuqsJZupjs5bhx5NvRNVGwTChIXkOIQvKyngYs0MvHLDeM8S5eyuE8cdwRv1xAIuMeueCyYqo+rtW1K8QNHIgGRpnWNkJ75kdfUccsIfMtYJryr+zTquS0/3q479aKVtASf2i9/y47IlyUIo2LfoVtvGDbOFX3TFZUggCQXO+LBzusIhBdSlpHAwwNuXIpfu61y+SBX7mTUqK4uOPEZoi8GraxERJkh0Sok5WNZ+QXPR39quTHoBlybyMfnx3VeLLqcWM9dQyBCGrsRUKG2s3pImAsJXhAJAI1KGLVGYW0D5g7lw+WvDsyOvK+OmyLAQ2IYLEzexqNM0+fae4WIo1qKT3oF5ezodyve6t/H42EL4W7SiKtEP2fnuWsIxOLWfgBzsLN6CDa/kcwjvowE8TAb2gcNfUogIFiKl+cyjT8QeV8dN0VA6vI0MsHGM9FOutA7dmtc/gvftKkqMm+0D5cBY1FKCh+IAB4kAbgiuYZAaLUfQPq6M6F/iPtAbi5jQXN/JLo+rzkEsZizBATqmoBkPoP9smzFwNsjn1HHjREAaYyNJ/cgpRyuJKXwKbql5+ebdjUujbGKV3N+6ffx26qrRK1Xt1wTdcY1BEKAoYPnd2aJZ/hdrh3KsjIaeYPqkg/zejjW/9QpJrDMcI/OF5cuG3JGdEOpc8Y2wILFpHZ6fTDpTkNCbuwYumrhT/SL7PUFn0ZnWL085yyPwSFawZwl2F5fQNsT/YxT5y4jEG1dZzbPgYIBCpD7fx618SYMAMMg+h5PJoYyQ+NZhsd6quLVfn2P31AHYQQGMTYYnPgUKw5hmMhWC+hNMO5f9V5f+Go0xFXvDDkJQQOf1nVGe1MytNNmPmmfretQousUeR7RbSIvO3OMEaQQPlSIxdQx2beO+/BG4lXdl2g5UTYtFghJ5vfw07nmWbJ3aU6KM1/szlINZp3h13haZ028YeJAqPiQkL/tvaHwmeivla8PSJUB8ZQfeiG1B21JAiPLP6Kfc/LcVQQycMyOb8CKv6z3peoYLlx81/RFCord9CrpIyk+flmmh/0Zg6WrsGhaW/uuwO1nQmfj8pLOgQErGGTWv2flF/41uvbh+Q6hPZ7iZRdRO9CQWBuUlib5muhnnTx3VaeY9PLLEH74J/WTfR3CBdznUDMvZrckLVDjpPr4nVWv5SjLFoCTw4dThJkJmKdoBsbYLpG1Cm+XByW/JXv95r9Fv4WseaUv56FUD7+V8KcEEYv2KdxdXpG1Nfp5J89dRSAEBEav9zq8R3od1hQR8HgKz4FwxNxqob3pci3Yu9fgsypXKCIp7ZX+PXSK3I4q6PULn/aELHFt9oaNrxxviIiDipU5D8Dc/hvCvaFZgD+JWB/1v72x+TfiNUcO3UcggdBaTBju7wgXIbhhRmwUiWMfy/FCrvU3NERzKBPxBDF94vPyOeUrBi2gEa6557rDNXz7Zejk7Y4wQ4Cl0Qy5EOuCUvyk9xebPozGS+YxrXJlzjzofrMhTkHfOPEEGU4QbfT1E1fcceQ6Apm6+6FSgL3KQLjQ9qbw7lRW40gcPhYA80ZIoYjGaC5fuk+KYqqXzah6bdCDOG9/BZrLOImuyYkTsQOavMY8Pq7HVnky49KkYrUQS4TJL+mzYVNR9Jty6Uhv9dicv/o8fBYNRpHtQeIVrh2QIflx9HtOn7uyE2AAX9ZhHyCEPe4oqNRoxPZ9HnY3dJKnDy3tk97RvJLxvdLKklEGY2NgdYq5+rB20RzHsaCU/9ZrQ+GdvQoKSqNfLluak1XjK3sO1qp/DURxDnrWB/EKJPNu5qR9jcTj6HycOHclgeipwdUQs75p76w6NavURaec3MJEgkaEjHxLut+3onrZwBwnGsaJMi3ObvRpWkz+V8Q16pwO2fs1lnVh1obCx5urM/zeRnj87E2Ir9dXQyFvjvSCYFka119o7n2nr7mSQKYWQMySfIWhgfe2I4UVB4G96COSmeIhjoK2b1+ixsTs+4+4l79/bNng89r3dvI9ffTs4RlwNbgBnKDVyhOOqdA18Hu4VohpGUK/rN8XWzY191LZipzLDJ1/gFnycwjP5hIp56YlN6d5vK4Tr6i+riQQqhiX4mkspgm2Z9KQGg8jWyMCOenAAeIoiJhCubYvkQkSm67mgsberlgx6K72vZ1cT3Mr9TIEbhvWkvWK4KsTp5gISPms1Nh5EKkW8/ymbulboW9UrRz0e6/Ol2s6zyGFvKVkYAxELN6n+WXFFLjDdcm1BHJ38fyNsD59Eg4fGiNs5GqCfUYa7W3HJ4fjbVV11C4VrDNF9vB62KPVr+U8U7VsyEkxVidpHpPYnwVD0mTaIyI6NRAGiVSYG/kADObHmesLbstcV/B19LN0Xv76gNOGpZS/5vOye7GDmzcEhbylpKP31QTlEfy6UryieruWQMA5EDOAP9G81No85MRtEMu9yd52aOQScmPoaLIgpIXCyju/lXusj6uWD7qmo3m58b0ju4vPBwFcECR35/pEHYN0DMI0JNh7pmBXZKwvvKhXfuGqhmcif1etYgasf3cZTPvYo7OLifu2pevDokU6yXNpV+89EJmXm44biSNuqhjVpTw95Y0eFdVbwUVGQmlvu3ogAmHJZhZD8UPNDI5t5xfxBI2DJEdDnh4uuHwVIsSSWmnlZV9zYG/EY0l5qEtxt1fT9FqwBzLX0h9C8VRBH3kTH/TfGRsK3ge0LbKCstcGnemtZPcaBruY5jPAFdrEAbRHz1V4NO+jbT7s4AOu5SCESV5+XjU4yEPt0kM01icaT4xlmHiMvtqxcxIZMNByiBB3purapzRqyrfC7hkdy9Dht8rGjzkLflNXU0cgIoAH72Ysavq/hqGfCVHqxp4bCt5riTgwSAyoxJwRfONXQ5e4mHQNIpBYEiYLCcel/it3NiuqxZKHHc+4mkAIgBRP1YtYJVikI9ZumwkDF+ZQmugIEBR2R0gPbWbT1gNk6Kn3IcrxGuzRGrN2ddVrA69o6z233ZcjR3pNzuZgqcxWWKQWw0n0wpL0srMy1xfe22PtF1+1VN/S5wb3qn49ZybcgtameNhU4JHamiIenU+d7sFKoey7PoiGq0UsAvbXWx+rXHzqnLnQR5ZEAx19TkEfEMRyYJPrXO4ItdvQG51L03MaLWGixMQiPwfHr2NEfQ9Wr3kpV+75oOnTLrzi9xsWs/7grwp8mbJ1a5ubZtKEn5HCb5JCTMHk3giaEW/JfNva12LCkFXWysf7XLd/e2vPueFenASPxH7KkqF5/mO+6jUG089oTRchN3nExCrm1aHR0/YtPr7opnTZ4GG6LgohZqW3pTh29EtIxyGlE50Gk17s70LyvxwwfO+c6lLzZXu+k/DzecStsHLdAVHq5LDRohXrVGt5Q4FnUPj3SCt0Zo/rDjbned3a67bfc72IRYiEVwgK+f+gj7Sq/dW5p8i+oofWaJVgZrl2AG8e0Cm2SYIS1azeAY9jcuxiEMmKgWbtP0hHOQxZPUHFJixb0qtqVg68sOb1Qf9rGDIfk6b/BQH2ZPrG1ky3bVVIBzAYTP6QDMRB35K4HtMWUu28D+Lgi0bMfsXHjeuw72CLb5NCDy4xYcbX8z6OfKh8ec4KrPu4OhYLS+R7HT0mYGHxCq9zqA2yg2Bub4KGXqosCa7pf/vBqo7mm8j3QOQafNBOB4ZXgxiuQ1nfh4tI2IkzHjoc3HfIcvVBeubwS/iFq1tuxER+ZDvzdr0O0vA9aDS5SLvnHohYF8JHq1fYc7fhZsSvRzNYUARH4VIjAuFSrucaNbw9iVgdyejYg5pBKe0Hl4o7cX5neqanCOtO3sXY9Jbll+szL3HWQU/CIbMmxTsKs9kXVb/GLoUad4bfx7wmdDbiFA0LmjqLGinmmHStRDvMSBbioG9OGgKhyk7f9sD2hSNm3uvlngdbDO5APZNrTaOV6OxT8iSlkZ0esTORzN7Q0RBNJddjsFwQyxRs+rCvamXO54hB/xHqsy4UZF8n2qO1ZPnQnlyzhnu4GMelfkE1E+dIwYZhdOfQDcJE0RHFuy08yecK+d6bce3+RkH92nrP6ftJI2I1APX4uF95Kit6vo2do38EX62Gy8d/yRyMFYmF6T1Kz5yc/wT5YYUTRVMEB9mCkaw/dVg3JPJDAsGEPTzQeYhuD0AU2wYK3gKRZjMCFe30eLQ9Pk2WMN++cn4h8aO2E3LiJS8Py9D8VpZPEzmWyYYzLkbCcWI03HdOQw4DsRY/rH8SlyA8wqW3nXWHnkBZGCDY++nBjMv5pLatZR0qJEEvJR2BEA4P5c7KhUiAxf08O1rUIh1EclmN1f/fn/XVgkaTUBUrBq70e7Wr2mOzTxDuTbIlKxiJIaTE0i9RCy3gAqGQNe4YLpTg047hrwTHlbhWg0exazKOwhPg0iu5loYXwCG0bPR4YMN645k0MqtSQ5MeYeKFRBMEijqewC1RHv9Ot9j5/mv37jh+I0kOkkrEasD07qL5RYtGzJymc+OpcE9quIFf8t3yMCMVPidn47QRgTCh/R0d5qqIx11zSCN4w7xKQ6WoU6O+KRjrByJCCP4wJDT84R4dU6ob/TEwIA8BN9u6X9yv5wwN4l3d0/b9S/VFXSwrJO9K++m+pCMOQirMZu2DLH4lTd++4OmQMP/i1TxNMg1zESmbRHGXuvU+OguNvEmRiDkQh7AwIUmiEHEU4n7U4UlPqKqt+6Nj+iMLHT1DxgEiNnqX8nAqEefCYqj7Mn66b7lTdehsuUlLIOEPT5EzQzL0kYc3JhKTQjcw9s/zcmc18uztsfHA1+gw68j8qlJiEUj1QymvZUszeg6/L7ElJTb3pCaQmZsWVnGu3QFfrZ2R60bIwoVZ9cFeqZGYdTzxPCagEy8jT1KVEocAzXfUBuSn6emeXyWTSbc5RJK+q0zdNnc3BImb4Id1JDIiI6xZHDPrNNnVKNVUi5UQR0oVkTSCJW4nJFYFTPZVrRQ/4xftLItbxg5llPQEQrhN2z7/cyGtf4FaWt0QT4t8tmDNuvKBwXN6RWKbfRPWb0j2BvlNqRRfBAhT6Eo7Ed/q+q6wTobQ6RIEQh8Cpf2tIDPvwKQblHAsvYWYhbmSHJ9fXkz3IxNI43+gyDqpv0ZWp0scE3FgonE/1pJc3+OaPY02MErmD+wyBEKNMKtowcshZt6J9R+1DZxEcvZz8uOKbKT0nvv+AVeKTxUXiUSl48ckVsHtf2/Q5Ff3uvrAxo7n5L43uxSBELwzty98McSCt+EQk2mYUpZ84qJT7mnkekIz0phVf1jxkM53yHri2I6lzlf1vHZPfudzdFcOXY5ACN4ZRYteCZnWDZgnO+bXvV64bDQJ2ZNueFdCzNqouEjHOyS8o6FzsPyA1C9JTzIfq1i/uksSCH38rB0L3hGadXlQhHbAfeOWB0fOGR4JSjgOE+fzlSISiUpsxzSDn4Z5DoRpfVvIwOU9r/pmV2xvJt9TXZZAqCmmfzV/bQ2XP4ZPRgECI/9HdPOkZ5zySjDE1pCYoFJsCJCfGE20wvnw0TIurk+/+tDB2N5Mzqe6Rc+YO2x2pteQ/2lx8fTMooWbIpuqcvngHxke8Q5cMwylk0Qi0/SYxFEEg6vA+v45Pa7Z+1jTJ7relS7NQRqaa87OeWXl21NnGZq30e63dD/92j0fBELsRZr9Val5BEikIn0DXsBbgkK7tLsQB6GhegVAqFl20hBhGOswu96PopSodAIBEqeIs4JzPFlWJWYPuPnAkRN3u/6RIpD6Ni5fho3s/fxv9bF4u37Lt/GFxDWIq8LSt8eSfE76VXtdGz+3jU/p1O1uIWLFglCP6/b9D1zJnyQv1O6eSNcACqLWZE9WW+L87koc1A9Ub4igBgpgUOX1vQIiuZjWWnS3RDGrKDQSxMy1QYvnZV6zF8ElundSHCSi/fmkw5WQtW+BCfNdsvOTmNEdEq2NJyUcwe52Y2Pz3xypYT9UxFHX8t2kC7Svm8vXB6RWCe0RCtVjYVkerc7riokIg6KNYBUiAuvxv1ZWGU/0u3lXl57XaG87KgJpBbGq5Tm/0Ax+LzbPOYmWusYjeForxdlyixq8IaAdJkl3wfv5SbjkPOnmPTpsAaaFQhSBtABMw+WaZScPkR5zFsStW0AomWTlSkaOQjPgCB8a3ggIuzfkI4Db/4Z87HmnA9c14OzWX0UgMbZM+coBuVileDs8hH+G2LvDoMuGgyO4JcZWc59BwSmIKKiRIUYdxXzGu4bBn/ZVZ6xKtvhUzX2fHdcUgbQTZfnesMzKavMnWJI1Ca9OhAzfm5T5ECYYKfqIk7YvqkfYVwrUS/WACIUlr3ItqrXMkOKd1C6wG1Y7m6vTjysC6QSE2ERmIPSSC2EtvxId8QfooIPCOyehd9KMfKIDtBGHoEBzpGwTcdQH5t6DVTBrcf62ofGP/Vfs2dmJT+z2ryoCiVMXKH1jcC89JMYg0tv5GL/PxiJGhPqUAyHieKkDU4wqUvLrfim8He7SP5Tw23BIp+FGwT8Nv0QICByHLanDgeTokQaOVYX89uN0MwSptZjDWOs3tS382t2l4YfUP51GINwGnc5FZdAEgcMrc3v4reohuiFzLZOfhoCHIzQuB8Gc2g/LHLNAEakA3wfCwP6ZjBMnoITYuQ2ch4zLQVBJLZ6txN0jOP4OyvUubP+7HSExiwIa21Few/YNmrTv+GZB4UzUP3FDQBFI3KCMLaNdS4b6s9LMVK9u9TC50QM75qZyqXm5btVFv4NPvtRESNc9tVYgVK179PLaiqrKrIGjq5M9xlRsCKmnFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBQCCgEFAIKAYWAQkAhoBBg/x/a0A19OBcKvQAAAABJRU5ErkJggg==",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History »