From ba9638d189434c331e748fce41b222ab8772bc41 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:31:53 +0100 Subject: [PATCH 01/29] feat(side-quests): add Seqera Platform Automation side quest Port the Platform Automation training module from the standalone m42-platform-advanced-training repo into the training collection as a single-page side quest, following the side_quests convention. - docs/en/docs/side_quests/platform_automation/index.md: the guide, with codespace badge, asset paths, and cd commands retargeted to nextflow-io/training and side-quests/platform_automation/. - side-quests/platform_automation/{terraform,seqerakit}: the Terraform (compute-env, pipeline) and seqerakit assets, verbatim aside from path/reference fixes and repaired code fences in the seqerakit README. - .editorconfig: add 2-space rule for *.tf/*.tfvars (terraform fmt style). Intentionally not added to the mkdocs nav or the side_quests index table. Passes pre-commit (prettier, editorconfig, whitespace, eof), the heading checker, terraform validate, and a non-strict mkdocs build. Generated by Claude Code --- .editorconfig | 4 + .../side_quests/platform_automation/index.md | 513 ++++++++++++++++++ .../platform_automation/seqerakit/README.md | 55 ++ .../seqerakit/add-rnaseq.yml | 19 + .../seqerakit/launch-rnaseq.yml | 22 + .../terraform/compute-env/README.md | 66 +++ .../terraform/compute-env/main.tf | 187 +++++++ .../compute-env/terraform.tfvars.example | 28 + .../terraform/compute-env/variables.tf | 83 +++ .../terraform/pipeline/README.md | 66 +++ .../terraform/pipeline/main.tf | 43 ++ .../pipeline/terraform.tfvars.example | 17 + .../terraform/pipeline/variables.tf | 39 ++ 13 files changed, 1142 insertions(+) create mode 100644 docs/en/docs/side_quests/platform_automation/index.md create mode 100644 side-quests/platform_automation/seqerakit/README.md create mode 100644 side-quests/platform_automation/seqerakit/add-rnaseq.yml create mode 100644 side-quests/platform_automation/seqerakit/launch-rnaseq.yml create mode 100644 side-quests/platform_automation/terraform/compute-env/README.md create mode 100644 side-quests/platform_automation/terraform/compute-env/main.tf create mode 100644 side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example create mode 100644 side-quests/platform_automation/terraform/compute-env/variables.tf create mode 100644 side-quests/platform_automation/terraform/pipeline/README.md create mode 100644 side-quests/platform_automation/terraform/pipeline/main.tf create mode 100644 side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example create mode 100644 side-quests/platform_automation/terraform/pipeline/variables.tf diff --git a/.editorconfig b/.editorconfig index 5e6d11b4b4..252370594c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,10 @@ indent_style = space [*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 +# Terraform's canonical `terraform fmt` style uses 2-space indentation +[*.{tf,tfvars}] +indent_size = 2 + # ignore python and markdown [*.{py,md}] indent_style = unset diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md new file mode 100644 index 0000000000..7fc5800ecd --- /dev/null +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -0,0 +1,513 @@ +# Seqera Platform Automation + +The Seqera Platform does not run your work. It is an API and a control plane over your cloud. It hands jobs to a compute environment, the compute environment runs them on cloud VMs, and the Platform reads back state, logs, and exit codes. + +Everything the web UI does, it does by calling the Platform API. So everything is automatable: with the API, Terraform, and the CLI you can manage compute environments, pipelines, and runs as code, with no clicking. This side quest walks that programmatic surface from the most privileged role to the least. + +### Learning goals + +In this side quest, we'll drive the Platform across three workspace roles of decreasing permission: **Admin**, **Maintain**, and **Launch**. Each role does one job and hands an artifact to the next. You'll learn how to: + +- Create a compute environment two ways, with increasing control over the cloud: the UI (Batch Forge) and Terraform +- Add a pipeline to the Launchpad declaratively with Terraform, and see idempotency +- Launch a pipeline using the GUI, CLI and seqerakit. +- Tell declarative existence (Terraform) apart from imperative actions (the UI, seqerakit, `tw`) and learn when to use each + +### Prerequisites + +Before taking on this side quest, you should: + +- Have a Seqera Platform account on Seqera Cloud (`https://cloud.seqera.io`), or an Enterprise install +- Be a member of a workspace with a role: Admin, Maintain, or Launch +- Have credentials for your cloud provider already added to that workspace (not covered here) +- Ideally, a GitHub access token added too, to avoid GitHub rate limits +- Be comfortable with the command line and basic Nextflow concepts + +New to running pipelines on Seqera at all? Start with the gentler "Run pipelines on Seqera" module in the [Nextflow Triathlon](https://training.nextflow.io/) (sign up, launch in the UI, the `tw` CLI). This side quest is the automation layer on top of it: roles, Terraform, seqerakit, and Actions. + +--- + +## 0. Get started + +### Open the training codespace + +The Codespace contains all the tools you need (Terraform, `tw`, seqerakit); you +install nothing yourself. Open it now and read on while it builds. It ends with "Toolchain ready" in the terminal. + +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/nextflow-io/training?quickstart=1&ref=master) + +The assets for this side quest live under `side-quests/platform_automation/`: +`terraform/compute-env/`, `terraform/pipeline/`, and `seqerakit/`. Each section +below tells you where to `cd`. + +### Create an access token + +We authenticate to the Platform to tell it who we are. That is what grants the permissions of our role. Seqera uses a **personal access token**: a bearer token you create once and send with every API call, in an `Authorization: Bearer ` header. The token carries your identity and role, so the Platform knows who you are and what you can do. Anyone with the token can act as you, so keep it secret. In this training we save it as an environment variable. + +1. In the Platform, open the user menu (top right) and choose **Your tokens**. +2. Click **Add token**, name it (e.g. `platform-automation`), and click **Add**. +3. Copy the token now. The Platform shows it only once. +4. In the Codespace terminal, export it under both names: + +```bash +export TOWER_ACCESS_TOKEN= +export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN +``` + +Terraform, `tw`, and seqerakit all read the token from these variables. Check it worked: + +```bash +tw info +``` + +This prints the API endpoint and the authenticated user. If it errors, the token is wrong or not exported. + +!!! warning + + This only exists in a single terminal session, if you open a new terminal you will need to export them again. + +For Seqera Enterprise, also set `SEQERA_API_URL` (and the `server_url` Terraform variable) to your install's API URL. Everything else is identical. + +### Find your organization and workspace IDs + +Later steps need the **numeric workspace ID**. The web UI navigates by name, so the number is not in the URL; find it like this: + +1. In the Platform, click your organization name to open the organization page. +2. Open the **Workspaces** tab. Each workspace is listed with its numeric ID. That + number is the `workspace_id` the Terraform and API steps ask for. +3. You only need the numeric organization ID if you list workspaces over the API; if you read the workspace ID from the Workspaces tab, you can skip it. + +Or list everything your token can reach from the terminal: + +```bash +tw workspaces list +``` + +This prints a table with the workspace ID, the workspace name, and the organization name. + +Two forms of the same workspace turn up in this module. Terraform and the API want the **numeric** ID (`workspace_id`). `tw` and seqerakit accept either the numeric ID or the `Organization/Workspace` **name** (e.g. `my-org/platform-automation`). Export the numeric ID once so `tw` targets the shared workspace without a `--workspace` flag on every command: + +```bash +export TOWER_WORKSPACE_ID= +``` + +#### Know your role + +The work is split by role, from most to least privileged. Start at the highest tier your access allows: + +| Tier | Role | Can change | Produces | +| ------------------------------------------------------- | ------------- | ---------------------------------------- | -------------------- | +| [Admin](#1-admin-compute-environments-and-cloud) | Owner / Admin | Compute environments and cloud resources | a `compute_env_id` | +| [Maintain](#2-maintain-add-a-pipeline-to-the-launchpad) | Maintain | Pipelines on the Launchpad | a Launchpad pipeline | +| [Launch](#3-launch-run-a-pipeline) | Launch | Nothing; can only run | pipeline runs | + +Admin users create compute environments and assign roles to everyone else. If you only have Maintain, an Admin on your team hands you a `compute_env_id`; start at section 2. If you only have Launch, they hand you a Launchpad pipeline (and optionally an Action) to run; start at section 3. Each section opens with what it requires. + +--- + +## 1. Admin: compute environments and cloud + +**Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI. + +The same compute environment can be created with increasing control over the cloud. We build it two ways. + +### 1.1. Click-ops a compute environment with Batch Forge + +Batch Forge is the hands-off option: the Platform reaches into your cloud and creates the resources for you. Most convenient, least control. + +In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your cloud platform, and select the credentials for that cloud. The rest of the form differs by provider; recommended settings: + +**AWS** + +- Region +- Work directory (S3 bucket) +- Wave, Fusion, Fast Instance should all be enabled +- Config mode should be Batch Forge +- Provisioning model should be Spot, using Spot instances for nodes which run Nextflow tasks. + +**Azure** + +- Location +- Work directory (Azure Storage container) +- Wave and Fusion should be enabled. +- Select "Separate head and worker pools" to create one pool for the Nextflow head job and a separate pool for the tasks. +- For the head pool VM type, select a VM you have sufficient quota for. Standard_D2s_v3 (2 CPUs) is a good starting choice. +- Set the head pool VM count to 1. The head pool runs a single Nextflow head job; it does not need more. +- For the worker pool, select a VM type you have sufficient quota for. Standard_D4s_v3 (4 CPUs) is a good starting choice. +- Set the worker pool VM count to 4 +- Leave autoscaling enabled for both pools + +Leave the other settings at their defaults. Keep **Dispose resources** enabled so the pool is torn down when you delete the compute environment. Click **Add** in the top right. + +Watch your cloud console and you will see Forge create the resources: an identity and roles for Nextflow (access to blob storage and the Batch service), a more limited role for the worker tasks (storage only), the pools, and their networking. Many moving parts, all handled for you. + +That convenience is the trade-off: Forge owns those resources and gives you little control. A lab that already runs on managed infrastructure wants the opposite, to describe the resources itself and wire the Platform to them. That is the Terraform path. + +### 1.2. Provision the cloud with Terraform + +Terraform manages cloud resources declaratively: you describe what should exist and Terraform makes it so. It does not run your work; it only creates the compute environment. `side-quests/platform_automation/terraform/compute-env/` does it in a single `main.tf`, two providers in one apply: + +- data sources: the existing Batch account, managed identity, and vnet/subnet, + referenced, not created. +- `azurerm`: creates a head pool and a worker pool on that account and subnet, + as that identity. +- `seqera`: stores the Azure credentials and creates the compute environment. + +The manual marker: `head_pool` is set to the pool Terraform just made and there is **no `forge` block**. That one difference is what makes the compute environment manual instead of Forge. `nextflow_config` routes tasks to the worker pool. + +Let's walk `terraform/compute-env/main.tf` from top to bottom. + +The first block declares the providers and pins their versions. The `seqera` provider is pinned to exactly `0.30.5`: + +```terraform +terraform { + required_version = ">= 1.9" + + required_providers { + seqera = { source = "seqeralabs/seqera", version = "0.30.5" } + azurerm = { source = "hashicorp/azurerm", version = ">= 3.0" } + random = { source = "hashicorp/random", version = ">= 3.0" } + } +} +``` + +Next we configure the providers. The `seqera` provider reads `TOWER_ACCESS_TOKEN` from the environment, so there is no token argument here: + +```terraform +provider "azurerm" { + features {} + subscription_id = var.subscription_id +} + +provider "seqera" { + server_url = var.server_url +} +``` + +Pool sizing and the VM image live in a `locals` block, so you edit them in one place rather than wiring every value through as a variable: + +```terraform +locals { + head_vm_size = "Standard_D4ds_v5" + worker_vm_size = "Standard_E16ds_v5" + worker_max_nodes = 8 + worker_max_tasks = 16 + node_agent_sku_id = "batch.node.ubuntu 22.04" +} +``` + +The cloud resources the lab already owns, the Batch account, the managed identity, and the subnet, are referenced with data sources. Terraform reads them; it does not create or manage them: + +```terraform +data "azurerm_batch_account" "existing" { + name = var.batch_account_name + resource_group_name = var.batch_account_rg +} + +data "azurerm_user_assigned_identity" "existing" { + name = var.managed_identity_name + resource_group_name = var.managed_identity_rg +} + +data "azurerm_subnet" "existing" { + name = var.subnet_name + virtual_network_name = var.vnet_name + resource_group_name = var.vnet_rg +} +``` + +Now the resources Terraform does create. The head pool runs the Nextflow head job, so one fixed node is enough: + +```terraform +resource "azurerm_batch_pool" "head" { + name = "rnaseq-head-${random_string.suffix.result}" + resource_group_name = var.batch_account_rg + account_name = var.batch_account_name + vm_size = local.head_vm_size + node_agent_sku_id = local.node_agent_sku_id + + fixed_scale { + target_dedicated_nodes = 1 + } + + storage_image_reference { + publisher = "microsoft-dsvm" + offer = "ubuntu-hpc" + sku = "2204" + version = "latest" + } + # identity, container, and network_configuration omitted for brevity +} +``` + +The worker pool runs the pipeline tasks, so it autoscales from zero up to `worker_max_nodes` based on the number of pending tasks: + +```terraform +resource "azurerm_batch_pool" "worker" { + name = "rnaseq-worker-${random_string.suffix.result}" + vm_size = local.worker_vm_size + node_agent_sku_id = local.node_agent_sku_id + max_tasks_per_node = local.worker_max_tasks + # ...same account, image, identity, and network as the head pool + + auto_scale { + evaluation_interval = "PT5M" + formula = <<-FORMULA + pending = avg($PendingTasks.GetSample(180 * TimeInterval_Second)); + $TargetDedicatedNodes = min(${local.worker_max_nodes}, pending); + $NodeDeallocationOption = taskcompletion; + FORMULA + } +} +``` + +Both pools run the same `ubuntu-hpc` `2204` image, which is why `node_agent_sku_id` is `batch.node.ubuntu 22.04` for both. + +The `seqera` provider stores the Azure credentials in the Platform: + +```terraform +resource "seqera_azure_credential" "main" { + name = "azure-batch" + workspace_id = var.workspace_id + batch_name = var.batch_account_name + batch_key = var.azure_batch_key + storage_name = var.azure_storage_name + storage_key = var.azure_storage_key +} +``` + +Finally, the compute environment itself. This is the manual marker in code: `head_pool` points at the pool we just created, there is no `forge` block, and `nextflow_config` routes tasks to the worker pool's queue. Because it references `azurerm_batch_pool.head.name` and `azurerm_batch_pool.worker.name`, Terraform knows to create the pools first: + +```terraform +resource "seqera_compute_env" "main" { + workspace_id = var.workspace_id + + compute_env = { + name = "azure-batch-manual" + platform = "azure-batch" + credentials_id = seqera_azure_credential.main.credentials_id + + config = { + azure_batch = { + region = var.region + work_dir = var.work_dir + head_pool = azurerm_batch_pool.head.name + managed_identity_client_id = data.azurerm_user_assigned_identity.existing.client_id + nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" + } + } + } +} +``` + +The last block is the output the next tier needs: + +```terraform +output "compute_env_id" { + value = seqera_compute_env.main.compute_env_id +} +``` + +Terraform reads those references and works out the order itself: credentials and pools first, then the compute environment that depends on them. Run it: + +```bash +az login +cd side-quests/platform_automation/terraform/compute-env +terraform init +terraform plan +terraform apply +``` + +See `side-quests/platform_automation/terraform/compute-env/README.md` for the full variable list and the `terraform.tfvars` setup. + +### 1.3. See both sides + +The compute environment now exists in two places, and as an Admin with cloud access you can see both. + +On the Platform side, read the ID Terraform produced: + +```bash +terraform output compute_env_id +``` + +On the Azure side, open the Batch account in the portal. You will see the head and worker pools Terraform created, sitting idle with no jobs yet. Once you launch a pipeline (sections 2 and 3), jobs and tasks stack onto these pools, and you can drill into a task's logs and exit code. That is the whole point of the Admin tier: the Platform submits to Azure Batch, and Azure Batch runs the work. Maintain- and Launch-role users see only the compute environment in the workspace, not the cloud behind it. + +### Takeaway + +One compute environment, two levels of control: Forge in the UI (easiest, the Platform owns the pool) and Terraform (you own the pools and the wiring, end to end). The artifact you hand to the Maintain tier is a `compute_env_id`. + +--- + +## 2. Maintain: add a pipeline to the Launchpad + +**Requires:** Maintain role, and a `compute_env_id` (from section 1 or an Admin on your team) plus the numeric `workspace_id`. Maintain manages pipelines, not compute environments. That split is deliberate: Admin owns the compute environment, you own your pipelines. + +You add the same pipeline, `rnaseq-nf-$USER`, four ways. The first three are imperative, you run a command and it acts. The last, Terraform, is declarative. Watch what happens when you run each one twice. + +### 2.1. Add a pipeline via the UI + +In the workspace, open the **Launchpad** and click **Add pipeline**. Fill in the form: + +- **Name**: `rnaseq-nf-` (unique in a shared workspace). +- **Compute environment**: the one from section 1, e.g. `azure-batch-manual`. +- **Pipeline to launch**: `https://github.com/nextflow-io/rnaseq-nf`. +- **Revision**: `master`. +- **Work directory**: your Azure Blob work dir, e.g. `az://nf-work/work`. + +Click **Add**. The pipeline appears on the Launchpad with no run started. Adding a pipeline only saves a launch configuration; it does not run anything. + +### 2.2. Add a pipeline via `tw` + +The CLI does the same thing in one command: + +```bash +tw pipelines add \ + --name="rnaseq-nf-$USER" \ + --compute-env="azure-batch-manual" \ + --work-dir="az://nf-work/work" \ + --revision="master" \ + https://github.com/nextflow-io/rnaseq-nf +``` + +Run it again and `tw` errors: a pipeline with that name already exists. The command is imperative, so each invocation tries to add a pipeline; it has no notion of "already in the desired state". + +### 2.3. Add a pipeline with seqerakit + +`seqerakit` is a wrapper over `tw` that reads a YAML file and runs the underlying `tw` commands. It keeps the configuration as code, so a teammate can reproduce the exact same pipeline. `seqerakit/add-rnaseq.yml` describes the pipeline: + +```yaml +pipelines: + - name: "rnaseq-nf-${USERNAME}" + url: "https://github.com/nextflow-io/rnaseq-nf" + workspace: "my-org/platform-automation" + description: "rnaseq-nf for ${USERNAME}, added with seqerakit" + compute-env: "azure-batch-manual" + work-dir: "az://nf-work/work" + revision: "master" +``` + +`seqerakit` expands `${USERNAME}` from the environment, so set it first, then add the pipeline: + +```bash +cd side-quests/platform_automation/seqerakit +export USERNAME=$USER +seqerakit add-rnaseq.yml +``` + +If you run it again, it errors, the same way `tw` did, because the pipeline already exists: + +```console +ERROR: A pipeline with name 'rnaseq-nf-' already exists. +``` + +You can force it through with `seqerakit add-rnaseq.yml --overwrite`, which deletes and recreates the pipeline. But that is you telling it to repeat the action. By default, adding twice is an error. To make "add once, and leave it alone after that" the _default_ behaviour, we need a tool that manages existence rather than actions: Terraform. + +### 2.4. Add a pipeline with Terraform + +`side-quests/platform_automation/terraform/pipeline` adds the same pipeline declaratively. You describe the pipeline that should exist; Terraform makes the workspace match: + +```bash +cd side-quests/platform_automation/terraform/pipeline +terraform init +terraform plan -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" +terraform apply -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" +``` + +Tip: copy `terraform.tfvars.example` to `terraform.tfvars` so you stop passing `-var` flags. + +Open the Launchpad: `rnaseq-nf-$USER` is there, with no run. Now apply again: + +```bash +terraform apply -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" +``` + +```console +No changes. Your infrastructure matches the configuration. +``` + +That is the difference. `tw` and `seqerakit` errored on the second run because they perform an action every time. Terraform manages whether the pipeline **exists**: it is already there, so there is nothing to do. Apply ten times, still one pipeline. This is what keeps you from accumulating competing, half-duplicated resources in a shared workspace. To remove the pipeline, `terraform apply -destroy` with the same vars. + +### Takeaway + +Four ways to add one pipeline, two mental models. `tw` and `seqerakit` are imperative: each run is an action, and adding twice is an error. Terraform is declarative: it manages existence, so a second apply is a no-op. The artifact you hand to the Launch tier is the Launchpad pipeline `rnaseq-nf-$USER`. + +--- + +## 3. Launch: run a pipeline + +**Requires:** Launch role and a token with that role, plus a pipeline on the Launchpad (added by a Maintainer in section 2). Launch can only run things; it cannot create or modify compute environments, pipelines, or Actions. + +Everything in this section runs the pipeline the Maintainer already configured. None of it changes the pipeline; launching is an action, not a state. + +### 3.1. Use the GUI + +Open the **Launchpad**, select `rnaseq-nf-$USER`, and click **Launch**. The compute environment, revision, and work directory are already filled in by the Maintainer, so a Launch user just clicks the button. Submit it and the run appears under **Runs**. + +### 3.2. Use the `tw` CLI + +```bash +tw launch rnaseq-nf-$USER +``` + +One command, no flags: everything is pre-configured on the Launchpad entry. The CLI submits the run and prints its URL. + +For an automated launch, pin the parameters in a version-controlled file and pass it with `--params-file params.yaml`. That keeps each run reproducible, which is the whole reason to drive launches from code rather than the form. + +### 3.3. Use `seqerakit` + +`seqerakit` launches a pipeline that already exists on the Launchpad, filling in the `tw launch` command from `seqerakit/launch-rnaseq.yml`. Set `USERNAME`, dry run first, then launch: + +```bash +cd side-quests/platform_automation/seqerakit +export USERNAME=$USER + +seqerakit launch-rnaseq.yml --dryrun # prints the tw command, changes nothing +seqerakit launch-rnaseq.yml # launches for real +``` + +The dry run shows the underlying `tw` command. Run it twice and you get two runs. That is the imperative model: do the thing, now. It is the opposite of Terraform (section 2.4), which manages existence. See `side-quests/platform_automation/seqerakit/README.md`. + +### 3.4. Examine the cloud resources + +A run does not create one neatly named cloud job. Nextflow submits **many** Batch jobs and tasks, one per process invocation, so you will not find a single resource named after the Platform run. Open the run on the Platform (**Runs** → your run), which mirrors the underlying Batch service: the task table here is the same work you can see in the cloud console. + +If you have cloud access, the prefixes Nextflow uses in each Batch service are: + +- **Azure Batch**: jobs named `job--`, tasks named `nf-`. +- **AWS Batch**: job names of the form `_`, with unsupported characters stripped (max 128 chars). +- **GCP Batch**: job IDs of the form `nf--`. + +The relationship is the point: the Platform hands work to Batch, Batch runs it on the pool VMs, and the Platform reads back state, logs, and exit codes. + +### 3.5. Side note: launch Actions + +There is one more way to launch, built for automation rather than people. An **Action** is a saved launch configuration behind a single URL: call that URL and the pipeline runs, with no Launchpad and no `tw`. A Maintainer creates one in the UI under **Actions** → **Add action**, picks the pipeline and compute environment, and saves it. The Platform then shows a ready-made `curl` command for the Action's endpoint. + +The split mirrors the roles: _creating_ an Action needs the Maintain role, but _triggering_ it needs only a Launch token. That is the point of the stratified launch: a Maintainer hands launchers (or an automation system) a URL they can call to run the pipeline, and nothing more. + +### Takeaway + +Several ways to launch, all imperative: the GUI button, `tw launch`, `seqerakit`, and a launch Action's URL. Each does the thing, now; run it twice and you get two runs. That is the opposite of Terraform, which manages whether something exists. + +--- + +## Summary + +You drove the Seqera Platform programmatically across three roles, each handing an artifact to the next: Admin builds the compute environment and owns the cloud, Maintain adds pipelines and Launch triggers a run. + +### Key patterns + +- **Everything is one API.** The GUI, Terraform, `tw`, and seqerakit all call the same Platform API. Anything you can click, you can automate. +- **Use the right tool.** Terraform manages resources as state: what should exist, where. `tw` and `seqerakit` act on the Platform imperatively: they do the thing, now. + +| | Terraform | seqerakit / tw / Action | +| ------------ | ------------- | ----------------------- | +| Manages | existence | actions | +| Run twice | no-op | two runs | +| Mental model | desired state | do the thing, now | + +- **Roles stratify what each token can do.** A Maintain token defines pipelines and Actions; a Launch token can only trigger an Action and nothing else. The Action is the safe handoff from maintainers to launchers (and to automation). + +## What's next? + +- The AI half of the workshop is the CoScientist side quest in [nextflow-io/training](https://github.com/nextflow-io/training), published at training.nextflow.io. It uses the same `rnaseq-nf` pipeline and API endpoints, but interacts with them via AI agents. diff --git a/side-quests/platform_automation/seqerakit/README.md b/side-quests/platform_automation/seqerakit/README.md new file mode 100644 index 0000000000..f22e28d9f2 --- /dev/null +++ b/side-quests/platform_automation/seqerakit/README.md @@ -0,0 +1,55 @@ +# seqerakit + +The imperative asset, used in two tiers. See the Platform Automation side quest, §2 (Maintain) and §3 (Launch). seqerakit wraps `tw` and reads a YAML file: + +- `add-rnaseq.yml` (Maintain) adds `rnaseq-nf-$USERNAME` to the Launchpad. Re-running errors unless `--overwrite`, the imperative contrast to Terraform's idempotent `apply`. +- `launch-rnaseq.yml` (Launch) launches that pipeline. Run it twice and you get two runs. + +Terraform owns the pipeline's existence; seqerakit and `tw` act on it. This is the imperative contrast to the API Action and to Terraform. + +## Declarative vs imperative + +| | Terraform | seqerakit / tw | +| ------------ | ------------------------------------ | -------------------- | +| Manages | existence (does the pipeline exist?) | actions (run it now) | +| Run twice | no-op, still one pipeline | two runs | +| Mental model | desired state | do the thing, now | + +You added `rnaseq-nf-$USERNAME` with Terraform. Now you launch it. + +## Setup + +```bash +export TOWER_ACCESS_TOKEN= +export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN +export USERNAME=$USER +``` + +Edit `workspace` and `compute-env` in the YAML to match the workshop workspace if they differ. + +## Dry run first + +Always dry run first. `--dryrun` prints the `tw` command seqerakit would run and changes nothing: + +```bash +seqerakit launch-rnaseq.yml --dryrun +``` + +Then launch for real: + +```bash +seqerakit launch-rnaseq.yml +``` + +## The tw equivalent + +seqerakit is a wrapper over `tw`. The dry run shows you the underlying command. +It is the same as: + +```bash +tw launch rnaseq-nf-$USERNAME \ + --workspace=my-org/platform-automation \ + --compute-env=azure-batch-manual +``` + +This is the callback to the Azure mechanics: launching here submits jobs to the Platform, which hands them to Azure Batch, which stacks tasks onto the pool VMs. Same handoff the Admin tier showed in the portal. diff --git a/side-quests/platform_automation/seqerakit/add-rnaseq.yml b/side-quests/platform_automation/seqerakit/add-rnaseq.yml new file mode 100644 index 0000000000..4de2081787 --- /dev/null +++ b/side-quests/platform_automation/seqerakit/add-rnaseq.yml @@ -0,0 +1,19 @@ +# Add rnaseq-nf-$USERNAME to the Launchpad (the imperative contrast to Terraform). +# +# This ADDS a pipeline to the Launchpad. It does not launch it. Re-running errors +# unless you pass --overwrite, because the pipeline already exists. That is the +# imperative model: each run is an action, not a desired state. +# +# seqerakit expands ${USERNAME} from the environment, so set it first: +# +# export USERNAME=$USER +# +# Set the workspace and compute-env names to match your workshop workspace. +pipelines: + - name: "rnaseq-nf-${USERNAME}" + url: "https://github.com/nextflow-io/rnaseq-nf" + workspace: "my-org/platform-automation" + description: "rnaseq-nf for ${USERNAME}, added with seqerakit" + compute-env: "azure-batch-manual" + work-dir: "az://nf-work/work" + revision: "master" diff --git a/side-quests/platform_automation/seqerakit/launch-rnaseq.yml b/side-quests/platform_automation/seqerakit/launch-rnaseq.yml new file mode 100644 index 0000000000..afd1ebd0bf --- /dev/null +++ b/side-quests/platform_automation/seqerakit/launch-rnaseq.yml @@ -0,0 +1,22 @@ +# Launch rnaseq-nf-$USERNAME against the shared compute environment. +# +# This LAUNCHES a pipeline that already exists on the Launchpad. Terraform +# added it (see ../terraform/pipeline). seqerakit does not create it here. +# +# Declarative vs imperative: +# Terraform manages existence. apply twice = no second pipeline. +# seqerakit/tw do the thing, now. Run this twice = two runs. That is the +# point. Launching is an action, not a state. +# +# A bare `pipeline:` name (not a git URL) means "the saved Launchpad pipeline +# with this name". seqerakit expands ${USERNAME} from the environment, so set +# it first: +# +# export USERNAME=$USER +# +# Set the workspace and compute-env names to match your workshop workspace. +launch: + - name: "rnaseq-nf-${USERNAME}-run" + workspace: "my-org/platform-automation" + pipeline: "rnaseq-nf-${USERNAME}" + compute-env: "azure-batch-manual" diff --git a/side-quests/platform_automation/terraform/compute-env/README.md b/side-quests/platform_automation/terraform/compute-env/README.md new file mode 100644 index 0000000000..9a8f997fad --- /dev/null +++ b/side-quests/platform_automation/terraform/compute-env/README.md @@ -0,0 +1,66 @@ +# terraform/compute-env + +The Admin tier's compute-environment asset. See the Platform Automation side quest, §1 (Admin). You run this +only if you have the **Admin** (or Owner) role and permissions in the cloud +environment. In a workshop the presenter builds the shared compute environment +before the session; Maintain-role attendees do not run this and instead get a +`compute_env_id` to build pipelines against. + +## What it does + +The realistic, complex path. One config, two providers, end to end: + +1. **azurerm** creates a head pool and a worker pool on the customer's existing + Azure Batch account, on their existing subnet, running as their existing + managed identity. +2. **seqera** stores the Azure credentials and creates a manual Azure Batch + compute environment that uses the head pool and routes tasks to the worker + pool. + +This is what "manage your cloud as code" looks like for a lab that already +owns its Azure footprint. Terraform does not create the Batch account, the +network, or the identity. Those exist under change control and are referenced +with data sources (in `main.tf`). Terraform adds the pools and the Platform +wiring. + +## Three tiers, for context + +The session shows compute environments at three levels of control: + +1. **Batch Forge (UI)**: the Platform creates and scales the pool. Easiest. +2. **Manual CE pointing at an existing pool**: you already have a pool, the + Platform just submits to it. +3. **This config**: Terraform provisions the pools on your existing account and + network, then wires the Platform. Full infrastructure as code. + +## Manual vs Forge + +The compute environment is manual: `head_pool` is set and there is no `forge` +block. The Platform submits to the pools this config created. It never creates +or scales a pool itself. A `forge` block would flip it to Batch Forge. + +## Run it + +```bash +az login +export TOWER_ACCESS_TOKEN= +export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN + +cp terraform.tfvars.example terraform.tfvars +# edit terraform.tfvars: subscription, workspace, existing resource names, keys + +terraform init +terraform plan +terraform apply +``` + +After apply, note the `compute_env_id` output. The Maintain tier needs it for +`terraform/pipeline`. + +## The cloud side + +With Admin and cloud access you can also see the Azure side: the Batch account, +the pool VMs, jobs and tasks stacking onto them, a task's logs and exit code. +That is the whole point of the tier: the Platform submits to Azure Batch, which +runs the work. Maintain- and Launch-role users see only the compute environment +in the workspace, not the cloud behind it. diff --git a/side-quests/platform_automation/terraform/compute-env/main.tf b/side-quests/platform_automation/terraform/compute-env/main.tf new file mode 100644 index 0000000000..e90f9aeb3c --- /dev/null +++ b/side-quests/platform_automation/terraform/compute-env/main.tf @@ -0,0 +1,187 @@ +# Admin tier: Terraform creates the Azure Batch pools, then wires a manual +# Seqera compute environment to them. Manual = head_pool is set and there is no +# forge block, so the Platform submits to these pools but never creates or +# scales them. One config, two providers, end to end. +# +# Auth: run `az login`, then export TOWER_ACCESS_TOKEN (the seqera provider +# reads it from the environment). Sensitive keys come from terraform.tfvars or +# TF_VAR_ env vars; never commit them. + +terraform { + required_version = ">= 1.9" + + required_providers { + seqera = { source = "seqeralabs/seqera", version = "0.30.5" } + azurerm = { source = "hashicorp/azurerm", version = ">= 3.0" } + random = { source = "hashicorp/random", version = ">= 3.0" } + } +} + +provider "azurerm" { + features {} + subscription_id = var.subscription_id +} + +provider "seqera" { + server_url = var.server_url +} + +# Pool sizing and image. Edit here rather than exposing every value as a knob. +locals { + head_vm_size = "Standard_D4ds_v5" + worker_vm_size = "Standard_E16ds_v5" + worker_max_nodes = 8 + worker_max_tasks = 16 + node_agent_sku_id = "batch.node.ubuntu 22.04" +} + +# Keeps pool names unique across re-creates. +resource "random_string" "suffix" { + length = 6 + special = false + upper = false +} + +# Existing Azure resources the customer owns. Referenced, not managed. +data "azurerm_batch_account" "existing" { + name = var.batch_account_name + resource_group_name = var.batch_account_rg +} + +data "azurerm_user_assigned_identity" "existing" { + name = var.managed_identity_name + resource_group_name = var.managed_identity_rg +} + +data "azurerm_subnet" "existing" { + name = var.subnet_name + virtual_network_name = var.vnet_name + resource_group_name = var.vnet_rg +} + +# Let the managed identity read and write the work directory's storage. +resource "azurerm_role_assignment" "batch_data_contributor" { + scope = data.azurerm_batch_account.existing.id + role_definition_name = "Azure Batch Data Contributor" + principal_id = data.azurerm_user_assigned_identity.existing.principal_id +} + +# Head pool: runs the Nextflow head job. One node is enough. +resource "azurerm_batch_pool" "head" { + name = "rnaseq-head-${random_string.suffix.result}" + display_name = "rnaseq head pool" + resource_group_name = var.batch_account_rg + account_name = var.batch_account_name + vm_size = local.head_vm_size + node_agent_sku_id = local.node_agent_sku_id + + fixed_scale { + target_dedicated_nodes = 1 + } + + storage_image_reference { + publisher = "microsoft-dsvm" + offer = "ubuntu-hpc" + sku = "2204" + version = "latest" + } + + container_configuration { + type = "DockerCompatible" + } + + identity { + type = "UserAssigned" + identity_ids = [data.azurerm_user_assigned_identity.existing.id] + } + + network_configuration { + subnet_id = data.azurerm_subnet.existing.id + public_address_provisioning_type = "NoPublicIPAddresses" + } +} + +# Worker pool: runs the pipeline tasks. Autoscales 0..worker_max_nodes. +resource "azurerm_batch_pool" "worker" { + name = "rnaseq-worker-${random_string.suffix.result}" + display_name = "rnaseq worker pool" + resource_group_name = var.batch_account_rg + account_name = var.batch_account_name + vm_size = local.worker_vm_size + node_agent_sku_id = local.node_agent_sku_id + max_tasks_per_node = local.worker_max_tasks + + auto_scale { + evaluation_interval = "PT5M" + formula = <<-FORMULA + pending = avg($PendingTasks.GetSample(180 * TimeInterval_Second)); + $TargetDedicatedNodes = min(${local.worker_max_nodes}, pending); + $NodeDeallocationOption = taskcompletion; + FORMULA + } + + storage_image_reference { + publisher = "microsoft-dsvm" + offer = "ubuntu-hpc" + sku = "2204" + version = "latest" + } + + container_configuration { + type = "DockerCompatible" + } + + identity { + type = "UserAssigned" + identity_ids = [data.azurerm_user_assigned_identity.existing.id] + } + + network_configuration { + subnet_id = data.azurerm_subnet.existing.id + public_address_provisioning_type = "NoPublicIPAddresses" + } + + # Terraform manages the pool, not its live node count. + lifecycle { + ignore_changes = [auto_scale] + } +} + +# Azure credentials stored in the Platform. Keys are write-only. +resource "seqera_azure_credential" "main" { + name = "azure-batch" + workspace_id = var.workspace_id + batch_name = var.batch_account_name + batch_key = var.azure_batch_key + storage_name = var.azure_storage_name + storage_key = var.azure_storage_key +} + +# Manual Azure Batch compute environment: uses the head pool, routes tasks to +# the worker pool. References to the pool names make Terraform create them first. +resource "seqera_compute_env" "main" { + workspace_id = var.workspace_id + + compute_env = { + name = "azure-batch-manual" + description = "Azure Batch CE on Terraform-managed pools" + platform = "azure-batch" + credentials_id = seqera_azure_credential.main.credentials_id + + config = { + azure_batch = { + region = var.region + work_dir = var.work_dir + head_pool = azurerm_batch_pool.head.name + managed_identity_client_id = data.azurerm_user_assigned_identity.existing.client_id + nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" + } + } + } +} + +# The Maintain tier (terraform/pipeline) needs this compute_env_id. +output "compute_env_id" { + description = "ID of the Azure Batch compute environment." + value = seqera_compute_env.main.compute_env_id +} diff --git a/side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example b/side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example new file mode 100644 index 0000000000..44e1a3bbc9 --- /dev/null +++ b/side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example @@ -0,0 +1,28 @@ +# Copy to terraform.tfvars and fill in. terraform.tfvars is gitignored. +# Do NOT put your access token here. Export TOWER_ACCESS_TOKEN in the shell, +# and run `az login` first. + +subscription_id = "00000000-0000-0000-0000-000000000000" +workspace_id = 123456789 +region = "uaenorth" +work_dir = "az://nf-work/work" + +# Existing Azure resources (referenced, not created) +batch_account_name = "mybatch" +batch_account_rg = "batch-rg" +managed_identity_name = "nextflow-identity" +managed_identity_rg = "identity-rg" +vnet_name = "nf-vnet" +vnet_rg = "network-rg" +subnet_name = "batch-subnet" + +# Pool sizing lives in main.tf (locals), not here. + +# Seqera credential keys (sensitive). Prefer TF_VAR_azure_batch_key / +# TF_VAR_azure_storage_key environment variables over this file. +azure_storage_name = "mystorage" +azure_batch_key = "REPLACE_ME" +azure_storage_key = "REPLACE_ME" + +# server_url defaults to Seqera Cloud; uncomment only for Enterprise. +# server_url = "https://platform.example.com/api" diff --git a/side-quests/platform_automation/terraform/compute-env/variables.tf b/side-quests/platform_automation/terraform/compute-env/variables.tf new file mode 100644 index 0000000000..7fc99ffd1b --- /dev/null +++ b/side-quests/platform_automation/terraform/compute-env/variables.tf @@ -0,0 +1,83 @@ +# Inputs for the Admin tier compute-environment config. The Platform token is +# NOT here; it comes from TOWER_ACCESS_TOKEN. Sensitive Azure keys come from a +# gitignored terraform.tfvars or TF_VAR_ environment variables. + +variable "server_url" { + description = "Seqera Platform API endpoint. Cloud by default." + type = string + default = "https://api.cloud.seqera.io" +} + +variable "subscription_id" { + description = "Azure subscription ID." + type = string +} + +variable "workspace_id" { + description = "Numeric ID of the Platform workspace that owns the compute environment." + type = number +} + +# Existing Azure resources (referenced via data sources, not created). +variable "batch_account_name" { + description = "Name of the existing Azure Batch account." + type = string +} + +variable "batch_account_rg" { + description = "Resource group of the existing Azure Batch account." + type = string +} + +variable "managed_identity_name" { + description = "Name of the existing user-assigned managed identity for Batch nodes." + type = string +} + +variable "managed_identity_rg" { + description = "Resource group of the existing managed identity." + type = string +} + +variable "vnet_name" { + description = "Name of the existing virtual network the pools attach to." + type = string +} + +variable "vnet_rg" { + description = "Resource group of the existing virtual network." + type = string +} + +variable "subnet_name" { + description = "Name of the existing subnet the pool nodes join." + type = string +} + +variable "region" { + description = "Azure region code of the Batch account, e.g. uaenorth." + type = string +} + +variable "work_dir" { + description = "Azure Blob Storage work directory, e.g. az://nf-work/work." + type = string +} + +# Seqera credential keys (sensitive). +variable "azure_batch_key" { + description = "Azure Batch account access key." + type = string + sensitive = true +} + +variable "azure_storage_name" { + description = "Azure Storage account name for the work directory." + type = string +} + +variable "azure_storage_key" { + description = "Azure Storage account access key." + type = string + sensitive = true +} diff --git a/side-quests/platform_automation/terraform/pipeline/README.md b/side-quests/platform_automation/terraform/pipeline/README.md new file mode 100644 index 0000000000..4bde95d596 --- /dev/null +++ b/side-quests/platform_automation/terraform/pipeline/README.md @@ -0,0 +1,66 @@ +# terraform/pipeline + +The Maintain tier's pipeline asset. This adds your own pipeline, +`rnaseq-nf-$USERNAME`, to the Launchpad with Terraform. It adds it. It does not +launch it. See the Platform Automation side quest, §2 (Maintain). + +## Before you start + +You need the **Maintain** role and two values from the Admin tier (or your +presenter): + +- `workspace_id`: the shared workspace. +- `compute_env_id`: the shared Azure Batch compute environment. + +And create a Platform token (User menu, Your tokens, Add token), then: + +```bash +export TOWER_ACCESS_TOKEN= +export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN +``` + +## The flow + +```bash +cd side-quests/platform_automation/terraform/pipeline + +# 1. Set your inputs. Either copy the example file: +cp terraform.tfvars.example terraform.tfvars +# and edit it, or pass -var flags on each command below. + +# 2. Initialise (downloads the seqera 0.30.5 provider). +terraform init + +# 3. Preview. One resource to add. Nothing changes yet. +terraform plan -var="username=$USER" + +# 4. Add the pipeline to the Launchpad. +terraform apply -var="username=$USER" +``` + +Open the workspace Launchpad. `rnaseq-nf-$USERNAME` is there. No run has +started. + +## Idempotency + +Run apply again: + +```bash +terraform apply -var="username=$USER" +``` + +"No changes. Your infrastructure matches the configuration." Terraform manages +existence, not actions. Applying ten times does not launch ten runs. It +launches zero. To actually run the pipeline, use seqerakit/tw (see +`../../seqerakit`). That is the imperative half: do the thing, now. + +## Teardown + +Remove your pipeline when you are done: + +```bash +terraform apply -destroy -var="username=$USER" +``` + +It deletes only the pipeline you added. The shared compute environment and +workspace are untouched. diff --git a/side-quests/platform_automation/terraform/pipeline/main.tf b/side-quests/platform_automation/terraform/pipeline/main.tf new file mode 100644 index 0000000000..ff1eb26033 --- /dev/null +++ b/side-quests/platform_automation/terraform/pipeline/main.tf @@ -0,0 +1,43 @@ +# Maintain tier: add one rnaseq-nf pipeline to the Launchpad. This ADDS the +# pipeline; it does not launch it. Terraform manages existence, not runs: +# +# terraform apply creates rnaseq-nf- +# terraform apply (again) no-op; idempotent, never launches a run +# terraform apply -destroy removes it +# +# Launching is imperative, done with seqerakit/tw (see ../../seqerakit). +# +# Auth: export TOWER_ACCESS_TOKEN; the seqera provider reads it from the env. + +terraform { + required_version = ">= 1.6" + + required_providers { + seqera = { + source = "seqeralabs/seqera" + version = "0.30.5" + } + } +} + +provider "seqera" { + server_url = var.server_url +} + +resource "seqera_pipeline" "rnaseq_nf" { + name = "rnaseq-nf-${var.username}" + description = "rnaseq-nf for ${var.username}, added with Terraform" + workspace_id = var.workspace_id + + launch = { + pipeline = "https://github.com/nextflow-io/rnaseq-nf" + revision = "master" + compute_env_id = var.compute_env_id + work_dir = var.work_dir + } +} + +output "pipeline_name" { + description = "Launchpad pipeline name. Use this when you launch it." + value = seqera_pipeline.rnaseq_nf.name +} diff --git a/side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example b/side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example new file mode 100644 index 0000000000..ac5950cc13 --- /dev/null +++ b/side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example @@ -0,0 +1,17 @@ +# Copy to terraform.tfvars and fill in. terraform.tfvars is gitignored. +# Do NOT put your access token here. Export TOWER_ACCESS_TOKEN in the shell. + +# Your username. Or pass it on the command line: terraform apply -var="username=$USER" +username = "your-username" + +# Shared workshop workspace ID (the presenter gives you this). +workspace_id = 123456789 + +# Shared compute environment ID (the presenter gives you this). +compute_env_id = "REPLACE_ME" + +# Optional: defaults to az://nf-work/work +# work_dir = "az://nf-work/work" + +# server_url defaults to Seqera Cloud; uncomment only for Enterprise. +# server_url = "https://platform.example.com/api" diff --git a/side-quests/platform_automation/terraform/pipeline/variables.tf b/side-quests/platform_automation/terraform/pipeline/variables.tf new file mode 100644 index 0000000000..f7ac7f2080 --- /dev/null +++ b/side-quests/platform_automation/terraform/pipeline/variables.tf @@ -0,0 +1,39 @@ +# Inputs for the Maintain tier pipeline config. + +variable "server_url" { + description = "Seqera Platform API endpoint. Cloud by default." + type = string + default = "https://api.cloud.seqera.io" +} + +# Your username makes the pipeline name unique in a shared workspace. No +# default on purpose, so you must set it. Set it with -var or in terraform.tfvars: +# +# terraform apply -var="username=$USER" +variable "username" { + description = "Your username. Makes the Launchpad pipeline name unique." + type = string + + validation { + condition = can(regex("^[a-zA-Z0-9._-]{2,80}$", var.username)) + error_message = "username must be 2-80 chars: letters, numbers, dot, dash, underscore." + } +} + +variable "workspace_id" { + description = "Numeric ID of the shared workshop workspace." + type = number +} + +# The Admin tier built the shared compute environment with terraform/compute-env +# and shared its ID. This is a string ID, not the numeric workspace ID. +variable "compute_env_id" { + description = "ID of the shared Azure Batch compute environment to launch against." + type = string +} + +variable "work_dir" { + description = "Azure Blob Storage work directory for runs of this pipeline." + type = string + default = "az://nf-work/work" +} From bd5bccaf528f3aae1a2716b578403abfc680ba06 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:40:51 +0100 Subject: [PATCH 02/29] feat(devcontainer): add Terraform, tw, and seqerakit to the toolchain The platform_automation side quest needs Terraform, the Seqera CLI (tw), and seqerakit. Add them to the dev image the same way the rest of the toolchain is managed (features baked into the codespaces-dev/local-dev image), not via setup.sh: - terraform: official devcontainers/features/terraform feature, pinned to 1.9.8 with tflint/terragrunt disabled. - tw: new local-features/seqera-cli feature, mirroring tower-agent but arch-aware (x86_64/arm64) so the multi-arch image build stays green. - seqerakit: added to the existing uv-tools feature (pure-Python uv tool). - hashicorp.terraform VS Code extension added to all three configs. The tools land in the prebuilt image once docker-devcontainer rebuilds on merge to master; the production devcontainer pulls that image. Generated by Claude Code --- .../codespaces-dev/devcontainer.json | 9 ++++++- .devcontainer/devcontainer.json | 3 ++- .devcontainer/local-dev/devcontainer.json | 9 ++++++- .../seqera-cli/devcontainer-feature.json | 13 +++++++++ .../local-features/seqera-cli/install.sh | 27 +++++++++++++++++++ .../local-features/uv-tools/install.sh | 2 ++ 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 .devcontainer/local-features/seqera-cli/devcontainer-feature.json create mode 100644 .devcontainer/local-features/seqera-cli/install.sh diff --git a/.devcontainer/codespaces-dev/devcontainer.json b/.devcontainer/codespaces-dev/devcontainer.json index 84812c4ccf..3628394fab 100644 --- a/.devcontainer/codespaces-dev/devcontainer.json +++ b/.devcontainer/codespaces-dev/devcontainer.json @@ -20,8 +20,14 @@ "version": "latest" }, "ghcr.io/va-h/devcontainers-features/uv": {}, + "ghcr.io/devcontainers/features/terraform:1": { + "version": "1.9.8", + "tflint": "none", + "terragrunt": "none" + }, "../local-features/apptainer": {}, "../local-features/tower-agent": {}, + "../local-features/seqera-cli": {}, "../local-features/nextflow": {}, "../local-features/conda-channels": {}, "../local-features/uv-tools": {} @@ -47,7 +53,8 @@ "vscode": { "extensions": [ "nf-core.nf-core-extensionpack", - "ms-vscode.live-server" + "ms-vscode.live-server", + "hashicorp.terraform" ], // Use Python from conda "settings": { diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index fa99bfe859..01ddd2ea77 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -27,7 +27,8 @@ "vscode": { "extensions": [ "nf-core.nf-core-extensionpack", - "ms-vscode.live-server" + "ms-vscode.live-server", + "hashicorp.terraform" ], // Use Python from conda "settings": { diff --git a/.devcontainer/local-dev/devcontainer.json b/.devcontainer/local-dev/devcontainer.json index 130b120d66..b8bd743d95 100644 --- a/.devcontainer/local-dev/devcontainer.json +++ b/.devcontainer/local-dev/devcontainer.json @@ -20,8 +20,14 @@ "version": "latest" }, "ghcr.io/va-h/devcontainers-features/uv": {}, + "ghcr.io/devcontainers/features/terraform:1": { + "version": "1.9.8", + "tflint": "none", + "terragrunt": "none" + }, "../local-features/apptainer": {}, "../local-features/tower-agent": {}, + "../local-features/seqera-cli": {}, "../local-features/nextflow": {}, "../local-features/conda-channels": {}, "../local-features/uv-tools": {} @@ -49,7 +55,8 @@ "vscode": { "extensions": [ "nf-core.nf-core-extensionpack", - "ms-vscode.live-server" + "ms-vscode.live-server", + "hashicorp.terraform" ], // Use Python from conda "settings": { diff --git a/.devcontainer/local-features/seqera-cli/devcontainer-feature.json b/.devcontainer/local-features/seqera-cli/devcontainer-feature.json new file mode 100644 index 0000000000..14c7ee69b5 --- /dev/null +++ b/.devcontainer/local-features/seqera-cli/devcontainer-feature.json @@ -0,0 +1,13 @@ +{ + "id": "seqera-cli", + "name": "Install Seqera CLI (tw)", + "description": "Install the Seqera Platform CLI, tw", + "options": { + "version": { + "type": "string", + "proposals": ["latest", "0.32.0"], + "default": "0.32.0", + "description": "Select or enter a tower-cli version (without the leading v), or 'latest'." + } + } +} diff --git a/.devcontainer/local-features/seqera-cli/install.sh b/.devcontainer/local-features/seqera-cli/install.sh new file mode 100644 index 0000000000..6b6d3e4add --- /dev/null +++ b/.devcontainer/local-features/seqera-cli/install.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# Install the Seqera Platform CLI (tw). +# Arch-aware so the multi-architecture image build works on both amd64 and arm64. +# Only downloads the binary (no execution), so it is safe under QEMU emulation. +set -eu + +VERSION="${VERSION:-0.32.0}" + +case "$(uname -m)" in + x86_64 | amd64) ARCH="x86_64" ;; + aarch64 | arm64) ARCH="arm64" ;; + *) + echo "Unsupported architecture: $(uname -m)" >&2 + exit 1 + ;; +esac + +if [ "${VERSION}" = "latest" ]; then + URL="https://github.com/seqeralabs/tower-cli/releases/latest/download/tw-linux-${ARCH}" +else + URL="https://github.com/seqeralabs/tower-cli/releases/download/v${VERSION}/tw-linux-${ARCH}" +fi + +echo "Installing Seqera CLI (tw) ${VERSION} for ${ARCH}..." +curl -fSL "${URL}" -o /usr/local/bin/tw +chmod +x /usr/local/bin/tw diff --git a/.devcontainer/local-features/uv-tools/install.sh b/.devcontainer/local-features/uv-tools/install.sh index 8537c04973..d6465a6be7 100644 --- a/.devcontainer/local-features/uv-tools/install.sh +++ b/.devcontainer/local-features/uv-tools/install.sh @@ -5,3 +5,5 @@ uv tool install pre-commit uv tool install nf-core==3.5.2 uv tool install "mkdocs-quiz>=1.5.2" +# seqerakit: used by the platform_automation side quest +uv tool install "seqerakit==0.5.7" From a3e2dab170bf01457623599b2189968cdef4ae2f Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:53:24 +0100 Subject: [PATCH 03/29] fix(platform_automation): make navigation coherent after the repo move The assets moved from the repo root into side-quests/platform_automation/, so the root-relative `cd` commands broke mid-sequence: after cd-ing into terraform/compute-env, a later `cd side-quests/platform_automation/seqerakit` fails. Make every `cd` absolute (/workspaces/training/...) so each step works from wherever the previous one left the learner, matching the absolute-path convention used elsewhere in the side quests. Also drop the stale "ends with 'Toolchain ready'" line: that string came from the standalone repo's setup.sh and is not printed by the training devcontainer. Generated by Claude Code --- docs/en/docs/side_quests/platform_automation/index.md | 11 ++++++----- .../platform_automation/terraform/pipeline/README.md | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 7fc5800ecd..ab349a195a 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -32,7 +32,8 @@ New to running pipelines on Seqera at all? Start with the gentler "Run pipelines ### Open the training codespace The Codespace contains all the tools you need (Terraform, `tw`, seqerakit); you -install nothing yourself. Open it now and read on while it builds. It ends with "Toolchain ready" in the terminal. +install nothing yourself. Open it now and read on while it builds; it is ready +when the terminal returns to a prompt. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/nextflow-io/training?quickstart=1&ref=master) @@ -312,7 +313,7 @@ Terraform reads those references and works out the order itself: credentials and ```bash az login -cd side-quests/platform_automation/terraform/compute-env +cd /workspaces/training/side-quests/platform_automation/terraform/compute-env terraform init terraform plan terraform apply @@ -389,7 +390,7 @@ pipelines: `seqerakit` expands `${USERNAME}` from the environment, so set it first, then add the pipeline: ```bash -cd side-quests/platform_automation/seqerakit +cd /workspaces/training/side-quests/platform_automation/seqerakit export USERNAME=$USER seqerakit add-rnaseq.yml ``` @@ -407,7 +408,7 @@ You can force it through with `seqerakit add-rnaseq.yml --overwrite`, which dele `side-quests/platform_automation/terraform/pipeline` adds the same pipeline declaratively. You describe the pipeline that should exist; Terraform makes the workspace match: ```bash -cd side-quests/platform_automation/terraform/pipeline +cd /workspaces/training/side-quests/platform_automation/terraform/pipeline terraform init terraform plan -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" terraform apply -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" @@ -458,7 +459,7 @@ For an automated launch, pin the parameters in a version-controlled file and pas `seqerakit` launches a pipeline that already exists on the Launchpad, filling in the `tw launch` command from `seqerakit/launch-rnaseq.yml`. Set `USERNAME`, dry run first, then launch: ```bash -cd side-quests/platform_automation/seqerakit +cd /workspaces/training/side-quests/platform_automation/seqerakit export USERNAME=$USER seqerakit launch-rnaseq.yml --dryrun # prints the tw command, changes nothing diff --git a/side-quests/platform_automation/terraform/pipeline/README.md b/side-quests/platform_automation/terraform/pipeline/README.md index 4bde95d596..6cae02825d 100644 --- a/side-quests/platform_automation/terraform/pipeline/README.md +++ b/side-quests/platform_automation/terraform/pipeline/README.md @@ -22,7 +22,7 @@ export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN ## The flow ```bash -cd side-quests/platform_automation/terraform/pipeline +cd /workspaces/training/side-quests/platform_automation/terraform/pipeline # 1. Set your inputs. Either copy the example file: cp terraform.tfvars.example terraform.tfvars From 626683d6a10d68456e966df2c2119d94a0dc2e82 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Tue, 16 Jun 2026 18:06:18 +0100 Subject: [PATCH 04/29] fix(platform_automation): gitignore terraform secrets, link CoScientist next step Add Terraform ignore rules so learner-generated terraform.tfvars and *.tfstate (both contain Azure credentials) are not committed; the committed *.tfvars.example files stay tracked. Point the "What's next?" cross-reference at the in-site Building with Seqera AI (CoScientist) side quest instead of a generic GitHub link. Generated by Claude Code --- .gitignore | 9 +++++++++ docs/en/docs/side_quests/platform_automation/index.md | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 68936ef169..7ba8953eab 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,12 @@ _scripts/.venv/ # Tutorial working directories (created by learners during exercises) hello-nf-core/core-hello/ + +# Terraform (platform_automation side quest) +**/.terraform/* +*.tfstate +*.tfstate.* +*.tfvars +!*.tfvars.example +crash.log +crash.*.log diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index ab349a195a..3dd605338f 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -511,4 +511,4 @@ You drove the Seqera Platform programmatically across three roles, each handing ## What's next? -- The AI half of the workshop is the CoScientist side quest in [nextflow-io/training](https://github.com/nextflow-io/training), published at training.nextflow.io. It uses the same `rnaseq-nf` pipeline and API endpoints, but interacts with them via AI agents. +- The AI half of the workshop is the [Building with Seqera AI (CoScientist)](../co_scientist/index.md) side quest. It uses the same `rnaseq-nf` pipeline and API endpoints, but drives them via AI agents. From f9a5ef7c574be554149b8740dbb4bfbc6b4756a4 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 17 Jun 2026 11:47:25 +0100 Subject: [PATCH 05/29] fix(devcontainer): install tw via JAR on arm64 tower-cli publishes no tw-linux-arm64 asset, so the multi-arch image build 404'd on the arm64 leg. Keep the native binary on x86_64 and fall back to the arch-independent tw-jar.jar (run via Java) on arm64. Generated by Claude Code --- .../local-features/seqera-cli/install.sh | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/.devcontainer/local-features/seqera-cli/install.sh b/.devcontainer/local-features/seqera-cli/install.sh index 6b6d3e4add..184af807eb 100644 --- a/.devcontainer/local-features/seqera-cli/install.sh +++ b/.devcontainer/local-features/seqera-cli/install.sh @@ -2,26 +2,38 @@ # Install the Seqera Platform CLI (tw). # Arch-aware so the multi-architecture image build works on both amd64 and arm64. -# Only downloads the binary (no execution), so it is safe under QEMU emulation. +# tower-cli only publishes a native Linux binary for x86_64; on arm64 we install +# the architecture-independent JAR (Java is provided by the java feature). +# Only downloads files (no execution), so it is safe under QEMU emulation. set -eu VERSION="${VERSION:-0.32.0}" +if [ "${VERSION}" = "latest" ]; then + BASE="https://github.com/seqeralabs/tower-cli/releases/latest/download" +else + BASE="https://github.com/seqeralabs/tower-cli/releases/download/v${VERSION}" +fi + case "$(uname -m)" in - x86_64 | amd64) ARCH="x86_64" ;; - aarch64 | arm64) ARCH="arm64" ;; + x86_64 | amd64) + echo "Installing Seqera CLI (tw) ${VERSION} native binary for x86_64..." + curl -fSL "${BASE}/tw-linux-x86_64" -o /usr/local/bin/tw + chmod +x /usr/local/bin/tw + ;; + aarch64 | arm64) + # No native Linux arm64 binary is published; use the JAR via Java. + echo "Installing Seqera CLI (tw) ${VERSION} JAR for arm64..." + mkdir -p /usr/local/lib/tw + curl -fSL "${BASE}/tw-jar.jar" -o /usr/local/lib/tw/tw.jar + cat > /usr/local/bin/tw <<'EOF' +#!/usr/bin/env bash +exec java -jar /usr/local/lib/tw/tw.jar "$@" +EOF + chmod +x /usr/local/bin/tw + ;; *) echo "Unsupported architecture: $(uname -m)" >&2 exit 1 ;; esac - -if [ "${VERSION}" = "latest" ]; then - URL="https://github.com/seqeralabs/tower-cli/releases/latest/download/tw-linux-${ARCH}" -else - URL="https://github.com/seqeralabs/tower-cli/releases/download/v${VERSION}/tw-linux-${ARCH}" -fi - -echo "Installing Seqera CLI (tw) ${VERSION} for ${ARCH}..." -curl -fSL "${URL}" -o /usr/local/bin/tw -chmod +x /usr/local/bin/tw From 7a190c7002a2d2511b1fc13866fa14fe0329f1bf Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:25:43 +0100 Subject: [PATCH 06/29] docs(platform_automation): orient participants and cd into project dir Section 0 jumped from opening the Codespace straight to creating a token, never walking participants into the working directory or showing its contents. Add "Move into the project directory" (cd + code .) and "Review the materials" (directory tree) subsections, matching the debugging side quest pattern. Generated by Claude Code --- .../side_quests/platform_automation/index.md | 67 ++++++++++++++----- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 3dd605338f..eecf74e9a0 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -10,8 +10,8 @@ In this side quest, we'll drive the Platform across three workspace roles of dec - Create a compute environment two ways, with increasing control over the cloud: the UI (Batch Forge) and Terraform - Add a pipeline to the Launchpad declaratively with Terraform, and see idempotency -- Launch a pipeline using the GUI, CLI and seqerakit. -- Tell declarative existence (Terraform) apart from imperative actions (the UI, seqerakit, `tw`) and learn when to use each +- Launch a pipeline using the GUI, CLI and `seqerakit`. +- Tell declarative existence (Terraform) apart from imperative actions (the UI, `seqerakit`, `tw`) and learn when to use each ### Prerequisites @@ -23,7 +23,7 @@ Before taking on this side quest, you should: - Ideally, a GitHub access token added too, to avoid GitHub rate limits - Be comfortable with the command line and basic Nextflow concepts -New to running pipelines on Seqera at all? Start with the gentler "Run pipelines on Seqera" module in the [Nextflow Triathlon](https://training.nextflow.io/) (sign up, launch in the UI, the `tw` CLI). This side quest is the automation layer on top of it: roles, Terraform, seqerakit, and Actions. +New to running pipelines on Seqera at all? Start with the gentler "Run pipelines on Seqera" module in the [Nextflow Triathlon](https://training.nextflow.io/) (sign up, launch in the UI, the `tw` CLI). This side quest is the automation layer on top of it: roles, Terraform, `seqerakit`, and Actions. --- @@ -31,15 +31,50 @@ New to running pipelines on Seqera at all? Start with the gentler "Run pipelines ### Open the training codespace -The Codespace contains all the tools you need (Terraform, `tw`, seqerakit); you +The Codespace contains all the tools you need (Terraform, `tw`, `seqerakit`); you install nothing yourself. Open it now and read on while it builds; it is ready when the terminal returns to a prompt. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/nextflow-io/training?quickstart=1&ref=master) -The assets for this side quest live under `side-quests/platform_automation/`: -`terraform/compute-env/`, `terraform/pipeline/`, and `seqerakit/`. Each section -below tells you where to `cd`. +### Move into the project directory + +The Codespace terminal opens at the repository root (`/workspaces/training`). All the assets for this side quest live under `side-quests/platform_automation/`, so move there now: + +```bash +cd /workspaces/training/side-quests/platform_automation +``` + +Focus VSCode on this directory so the file explorer shows the assets you'll edit: + +```bash +code . +``` + +### Review the materials + +The directory holds the Terraform and `seqerakit` configurations for each role. Each section below tells you which subdirectory to `cd` into: + +??? abstract "Directory contents" + + ```console + . + ├── terraform + │ ├── compute-env # section 1 (Admin): provision the cloud + compute environment + │ │ ├── main.tf + │ │ ├── variables.tf + │ │ ├── terraform.tfvars.example + │ │ └── README.md + │ └── pipeline # section 2 (Maintain): add a pipeline to the Launchpad + │ ├── main.tf + │ ├── variables.tf + │ ├── terraform.tfvars.example + │ └── README.md + └── seqerakit # sections 2 & 3: add and launch a pipeline + ├── add-rnaseq.yml + ├── launch-rnaseq.yml + └── README.md + ``` ### Create an access token @@ -55,7 +90,7 @@ export TOWER_ACCESS_TOKEN= export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN ``` -Terraform, `tw`, and seqerakit all read the token from these variables. Check it worked: +Terraform, `tw`, and `seqerakit` all read the token from these variables. Check it worked: ```bash tw info @@ -86,7 +121,7 @@ tw workspaces list This prints a table with the workspace ID, the workspace name, and the organization name. -Two forms of the same workspace turn up in this module. Terraform and the API want the **numeric** ID (`workspace_id`). `tw` and seqerakit accept either the numeric ID or the `Organization/Workspace` **name** (e.g. `my-org/platform-automation`). Export the numeric ID once so `tw` targets the shared workspace without a `--workspace` flag on every command: +Two forms of the same workspace turn up in this module. Terraform and the API want the **numeric** ID (`workspace_id`). `tw` and `seqerakit` accept either the numeric ID or the `Organization/Workspace` **name** (e.g. `my-org/platform-automation`). Export the numeric ID once so `tw` targets the shared workspace without a `--workspace` flag on every command: ```bash export TOWER_WORKSPACE_ID= @@ -372,7 +407,7 @@ tw pipelines add \ Run it again and `tw` errors: a pipeline with that name already exists. The command is imperative, so each invocation tries to add a pipeline; it has no notion of "already in the desired state". -### 2.3. Add a pipeline with seqerakit +### 2.3. Add a pipeline with `seqerakit` `seqerakit` is a wrapper over `tw` that reads a YAML file and runs the underlying `tw` commands. It keeps the configuration as code, so a teammate can reproduce the exact same pipeline. `seqerakit/add-rnaseq.yml` describes the pipeline: @@ -498,14 +533,14 @@ You drove the Seqera Platform programmatically across three roles, each handing ### Key patterns -- **Everything is one API.** The GUI, Terraform, `tw`, and seqerakit all call the same Platform API. Anything you can click, you can automate. +- **Everything is one API.** The GUI, Terraform, `tw`, and `seqerakit` all call the same Platform API. Anything you can click, you can automate. - **Use the right tool.** Terraform manages resources as state: what should exist, where. `tw` and `seqerakit` act on the Platform imperatively: they do the thing, now. -| | Terraform | seqerakit / tw / Action | -| ------------ | ------------- | ----------------------- | -| Manages | existence | actions | -| Run twice | no-op | two runs | -| Mental model | desired state | do the thing, now | +| | Terraform | `seqerakit` / `tw` / Action | +| ------------ | ------------- | --------------------------- | +| Manages | existence | actions | +| Run twice | no-op | two runs | +| Mental model | desired state | do the thing, now | - **Roles stratify what each token can do.** A Maintain token defines pipelines and Actions; a Launch token can only trigger an Action and nothing else. The Action is the safe handoff from maintainers to launchers (and to automation). From 09082f876f0e450dc871f922bac6511c6364d273 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 17 Jun 2026 18:31:15 +0100 Subject: [PATCH 07/29] docs(platform_automation): align doc with assets, fix exercise, unify workshop handle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review pass on the Platform Automation side quest: - Reset terraform/pipeline revision to master so the §2.4 pin-a-tag exercise starts from the right state - Sync §1.3 walkthrough with compute-env/main.tf (head VM size, worker ignore_changes, random_string, a note on the azcopy/Fusion start task) - Replace the $USER/$USERNAME interpolation mess with a single, dot-free WORKSHOP_USER handle set once and reused across the UI, tw, seqerakit and Terraform; tighten the Terraform username validation to reject dots - Register the page in mkdocs nav; refresh the §0 directory tree - Add seqerakit/launch-rnaseq-multiple.yml; drop per-directory READMEs - gitignore agent/terraform local state (.omc, .claude/.local, lock files) Generated by Claude Code --- .gitignore | 5 + .../side_quests/platform_automation/index.md | 371 +++++++++++++----- .../platform_automation/seqerakit/README.md | 55 --- .../seqerakit/add-rnaseq.yml | 15 +- .../seqerakit/launch-rnaseq-multiple.yml | 24 ++ .../seqerakit/launch-rnaseq.yml | 16 +- .../terraform/compute-env/README.md | 66 ---- .../terraform/compute-env/main.tf | 148 ++++--- .../compute-env/terraform.tfvars.example | 24 +- .../terraform/compute-env/variables.tf | 52 +-- .../terraform/pipeline/README.md | 66 ---- .../terraform/pipeline/main.tf | 5 +- .../pipeline/terraform.tfvars.example | 9 +- .../terraform/pipeline/variables.tf | 13 +- 14 files changed, 449 insertions(+), 420 deletions(-) delete mode 100644 side-quests/platform_automation/seqerakit/README.md create mode 100644 side-quests/platform_automation/seqerakit/launch-rnaseq-multiple.yml delete mode 100644 side-quests/platform_automation/terraform/compute-env/README.md delete mode 100644 side-quests/platform_automation/terraform/pipeline/README.md diff --git a/.gitignore b/.gitignore index 7ba8953eab..9bf9616195 100644 --- a/.gitignore +++ b/.gitignore @@ -30,9 +30,14 @@ hello-nf-core/core-hello/ # Terraform (platform_automation side quest) **/.terraform/* +.terraform.lock.hcl *.tfstate *.tfstate.* *.tfvars !*.tfvars.example crash.log crash.*.log + +# Agent/tooling local state +.omc/ +**/.claude/.local/ diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index eecf74e9a0..659cb48781 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -63,17 +63,15 @@ The directory holds the Terraform and `seqerakit` configurations for each role. │ ├── compute-env # section 1 (Admin): provision the cloud + compute environment │ │ ├── main.tf │ │ ├── variables.tf - │ │ ├── terraform.tfvars.example - │ │ └── README.md + │ │ └── terraform.tfvars.example │ └── pipeline # section 2 (Maintain): add a pipeline to the Launchpad │ ├── main.tf │ ├── variables.tf - │ ├── terraform.tfvars.example - │ └── README.md + │ └── terraform.tfvars.example └── seqerakit # sections 2 & 3: add and launch a pipeline ├── add-rnaseq.yml ├── launch-rnaseq.yml - └── README.md + └── launch-rnaseq-multiple.yml ``` ### Create an access token @@ -127,6 +125,16 @@ Two forms of the same workspace turn up in this module. Terraform and the API wa export TOWER_WORKSPACE_ID= ``` +#### Pick a workshop handle + +In a shared workspace, every pipeline you add needs a name no one else is using. Pick a short handle and export it once; everything from section 2 onward reuses this one variable. Use only letters, numbers, and hyphens. Launchpad names cannot contain dots or spaces: + +```bash +export WORKSHOP_USER= # e.g. ada, jdoe, team-rocket +``` + +We set this by hand rather than reading `$USER`: in the Codespace everyone shares the same Linux user, so `$USER` is identical for all learners and would collide. + #### Know your role The work is split by role, from most to least privileged. Start at the highest tier your access allows: @@ -179,28 +187,92 @@ Watch your cloud console and you will see Forge create the resources: an identit That convenience is the trade-off: Forge owns those resources and gives you little control. A lab that already runs on managed infrastructure wants the opposite, to describe the resources itself and wire the Platform to them. That is the Terraform path. -### 1.2. Provision the cloud with Terraform +### 1.2. Read it back over the API with `tw` + +The form you just filled in did nothing special: it sent a configuration to the Platform API. +Ask the API for what you made, from the terminal, with nothing retyped. + +`tw` reads the same workspace the UI does. List the compute environments and the one you created in 1.1 is there: + +```bash +tw compute-envs list +``` + +Now export its full configuration to a file. +Use the name you gave it in 1.1: + +```bash +tw compute-envs export forge-ce.json --name="" +``` + +`tw` reads the workspace from `TOWER_WORKSPACE_ID` (set in section 0), so no `--workspace` flag is needed. +The file `forge-ce.json` is the compute environment as the API stores it: + +```json title="forge-ce.json" +{ + "computeEnv": { + "name": "azure-batch", + "platform": "azure-batch", + "config": { + "workDir": "az://work", + "region": "eastus", + "waveEnabled": true, + "fusion2Enabled": true, + "forge": { + "headPool": { + "vmType": "Standard_D2s_v3", + "vmCount": 1, + "autoScale": true + }, + "workerPool": { + "vmType": "Standard_D4s_v3", + "vmCount": 4, + "autoScale": true + }, + "disposeOnDeletion": true + } + } + } +} +``` + +The `forge` block is exactly what the checkboxes set in 1.1. Its presence is what tells the Platform to create and scale the pools for you. In the next section, the absence of this block is what makes the Terraform compute environment manual. + +Close the loop: import the file to recreate the compute environment, with nothing retyped. + +```bash +tw compute-envs import forge-ce.json --name="azure-batch-copy" +``` + +The UI sent this JSON to create the compute environment; `tw export` reads it back, and `tw import` sends it again. The GUI and the CLI are two clients of the same API. + +The exported JSON does not include a credentials ID. If your workspace has more than one credential for this cloud, `tw` cannot tell which to use and fails with `Multiple credentials match this compute environment`. Name one explicitly with `-c` (see `tw credentials list`): + +```bash +tw compute-envs import forge-ce.json --name="azure-batch-copy" --credentials="" +``` + +### 1.3. Provision the cloud with Terraform Terraform manages cloud resources declaratively: you describe what should exist and Terraform makes it so. It does not run your work; it only creates the compute environment. `side-quests/platform_automation/terraform/compute-env/` does it in a single `main.tf`, two providers in one apply: -- data sources: the existing Batch account, managed identity, and vnet/subnet, - referenced, not created. -- `azurerm`: creates a head pool and a worker pool on that account and subnet, - as that identity. -- `seqera`: stores the Azure credentials and creates the compute environment. +- data sources: the existing Batch account and the Azure credentials already + stored in the Platform, referenced, not created. +- `azurerm`: creates a head pool and a worker pool on that account. +- `seqera`: creates the compute environment pointing at those pools. The manual marker: `head_pool` is set to the pool Terraform just made and there is **no `forge` block**. That one difference is what makes the compute environment manual instead of Forge. `nextflow_config` routes tasks to the worker pool. -Let's walk `terraform/compute-env/main.tf` from top to bottom. +Let's walk the key blocks of `terraform/compute-env/main.tf`. -The first block declares the providers and pins their versions. The `seqera` provider is pinned to exactly `0.30.5`: +The first block declares the providers and pins their versions. The `seqera` provider is pinned to exactly `0.40.1`: ```terraform terraform { required_version = ">= 1.9" required_providers { - seqera = { source = "seqeralabs/seqera", version = "0.30.5" } + seqera = { source = "seqeralabs/seqera", version = "0.40.1" } azurerm = { source = "hashicorp/azurerm", version = ">= 3.0" } random = { source = "hashicorp/random", version = ">= 3.0" } } @@ -220,47 +292,56 @@ provider "seqera" { } ``` -Pool sizing and the VM image live in a `locals` block, so you edit them in one place rather than wiring every value through as a variable: +Next we can define some variables we can use throughout our deployment. In this case, we will set the node sizes and details once and reuse them throughout the configuration: ```terraform locals { - head_vm_size = "Standard_D4ds_v5" + head_vm_size = "Standard_E4ds_v5" worker_vm_size = "Standard_E16ds_v5" worker_max_nodes = 8 - worker_max_tasks = 16 - node_agent_sku_id = "batch.node.ubuntu 22.04" + node_agent_sku_id = "batch.node.ubuntu 24.04" + + # The Platform requires a pool's task slots to equal the node's vCPU count. + # Azure VM size names embed that count (Standard_E16ds_v5 -> 16), so derive it + # from the size rather than hardcoding a number that can drift out of sync. + head_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.head_vm_size)[0]) + worker_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.worker_vm_size)[0]) } ``` -The cloud resources the lab already owns, the Batch account, the managed identity, and the subnet, are referenced with data sources. Terraform reads them; it does not create or manage them: +Next we can refer to resources that already exist. These are called `data` in Terraform. Here we refer to the Azure Batch account: ```terraform +# Existing Azure resources the customer owns. Referenced, not managed. data "azurerm_batch_account" "existing" { name = var.batch_account_name resource_group_name = var.batch_account_rg } +``` -data "azurerm_user_assigned_identity" "existing" { - name = var.managed_identity_name - resource_group_name = var.managed_identity_rg -} +Now the resources Terraform does create. The pool names must stay unique across re-creates, so we first generate a short random suffix to append to them: -data "azurerm_subnet" "existing" { - name = var.subnet_name - virtual_network_name = var.vnet_name - resource_group_name = var.vnet_rg +```terraform +# Keeps pool names unique across re-creates. +resource "random_string" "suffix" { + length = 6 + special = false + upper = false } ``` -Now the resources Terraform does create. The head pool runs the Nextflow head job, so one fixed node is enough: +Then the node pools themselves. Terraform creates two pools in Azure Batch with the `azurerm_batch_pool` resource. You can add as many as you like, but the details must match the values the Azure provider expects. Here we start a fixed-size head pool and a dynamically sized worker pool: ```terraform +# Head pool: runs the Nextflow head job. One node is enough. resource "azurerm_batch_pool" "head" { name = "rnaseq-head-${random_string.suffix.result}" + display_name = "rnaseq head pool" resource_group_name = var.batch_account_rg account_name = var.batch_account_name vm_size = local.head_vm_size node_agent_sku_id = local.node_agent_sku_id + max_tasks_per_node = local.head_vm_cores fixed_scale { target_dedicated_nodes = 1 @@ -269,22 +350,24 @@ resource "azurerm_batch_pool" "head" { storage_image_reference { publisher = "microsoft-dsvm" offer = "ubuntu-hpc" - sku = "2204" + sku = "2404" version = "latest" } - # identity, container, and network_configuration omitted for brevity -} -``` -The worker pool runs the pipeline tasks, so it autoscales from zero up to `worker_max_nodes` based on the number of pending tasks: + container_configuration { + type = "DockerCompatible" + } +} -```terraform +# Worker pool: runs the pipeline tasks. Autoscales 0..worker_max_nodes. resource "azurerm_batch_pool" "worker" { - name = "rnaseq-worker-${random_string.suffix.result}" - vm_size = local.worker_vm_size - node_agent_sku_id = local.node_agent_sku_id - max_tasks_per_node = local.worker_max_tasks - # ...same account, image, identity, and network as the head pool + name = "rnaseq-worker-${random_string.suffix.result}" + display_name = "rnaseq worker pool" + resource_group_name = var.batch_account_rg + account_name = var.batch_account_name + vm_size = local.worker_vm_size + node_agent_sku_id = local.node_agent_sku_id + max_tasks_per_node = local.worker_vm_cores auto_scale { evaluation_interval = "PT5M" @@ -294,25 +377,44 @@ resource "azurerm_batch_pool" "worker" { $NodeDeallocationOption = taskcompletion; FORMULA } + + storage_image_reference { + publisher = "microsoft-dsvm" + offer = "ubuntu-hpc" + sku = "2404" + version = "latest" + } + + container_configuration { + type = "DockerCompatible" + } + + # Terraform manages the pool, not its live scale. + lifecycle { + ignore_changes = [auto_scale, fixed_scale] + } } ``` -Both pools run the same `ubuntu-hpc` `2204` image, which is why `node_agent_sku_id` is `batch.node.ubuntu 22.04` for both. +Each pool in `main.tf` also carries a `start_task` (elided above) that runs once per node at startup. Forge adds an equivalent task to the pools it creates; manual pools get nothing, so we replicate the essential parts: install `azcopy` (Nextflow's Azure Batch executor uses it to stage data) and register the AppArmor profile Fusion needs on Ubuntu 24.04 nodes. See the `node_start_task_script` local in the file for the full script. -The `seqera` provider stores the Azure credentials in the Platform: +Once we've built the Azure Batch node pools, we add the Seqera Platform compute environment that points to them. The compute environment needs Azure credentials to talk to your cloud. We added those to the workspace earlier (see Prerequisites), so we look them up by name rather than storing keys here. The `seqera_credentials` data source lists the credentials in the workspace, and we pick out the one whose name matches: ```terraform -resource "seqera_azure_credential" "main" { - name = "azure-batch" +# Azure credentials already stored in the Platform, looked up by name. +data "seqera_credentials" "all" { workspace_id = var.workspace_id - batch_name = var.batch_account_name - batch_key = var.azure_batch_key - storage_name = var.azure_storage_name - storage_key = var.azure_storage_key +} + +locals { + azure_credentials_id = one([ + for c in data.seqera_credentials.all.credentials : c.id + if c.name == var.azure_credential_name + ]) } ``` -Finally, the compute environment itself. This is the manual marker in code: `head_pool` points at the pool we just created, there is no `forge` block, and `nextflow_config` routes tasks to the worker pool's queue. Because it references `azurerm_batch_pool.head.name` and `azurerm_batch_pool.worker.name`, Terraform knows to create the pools first: +Finally, the compute environment itself. This is the manual marker in code: `head_pool` points at the pool we just created and `nextflow_config` routes tasks to the worker pool's queue. `enable_wave` and `enable_fusion` turn on Wave (container provisioning) and the Fusion file system, the same checkboxes you would tick in the UI; with Fusion enabled, Wave must be too. Because it references `azurerm_batch_pool.head.name` and `azurerm_batch_pool.worker.name`, Terraform knows to create the pools first: ```terraform resource "seqera_compute_env" "main" { @@ -320,16 +422,18 @@ resource "seqera_compute_env" "main" { compute_env = { name = "azure-batch-manual" + description = "Azure Batch CE on Terraform-managed pools" platform = "azure-batch" - credentials_id = seqera_azure_credential.main.credentials_id + credentials_id = local.azure_credentials_id config = { azure_batch = { - region = var.region - work_dir = var.work_dir - head_pool = azurerm_batch_pool.head.name - managed_identity_client_id = data.azurerm_user_assigned_identity.existing.client_id - nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" + region = var.region + work_dir = var.work_dir + head_pool = azurerm_batch_pool.head.name + enable_wave = true + enable_fusion = true + nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" } } } @@ -344,19 +448,26 @@ output "compute_env_id" { } ``` -Terraform reads those references and works out the order itself: credentials and pools first, then the compute environment that depends on them. Run it: +Terraform reads those references and works out the order itself: pools first, then the compute environment that depends on them. + +Now, we can run Terraform to apply these changes. ```bash -az login -cd /workspaces/training/side-quests/platform_automation/terraform/compute-env +# you may need to log in to the cloud provider with `az login` terraform init -terraform plan terraform apply ``` -See `side-quests/platform_automation/terraform/compute-env/README.md` for the full variable list and the `terraform.tfvars` setup. +After you run `terraform apply`, it will ask you to fill in the details defined in `variables.tf` + +!!! tip "Tearing it down" + + You can save them as a .tfvars file and Terraform will read them automatically, so you don't have to type them each time. See `terraform.tfvars.example` for the full variable reference. + Alternatively, you can save them as an environment variable preceded by `TF_VAR_`, for example `TF_VAR_subscription_id=00000000-0000-0000-0000-000000000000`. -### 1.3. See both sides +Terraform will show you a preview, if it looks accurate, type `yes` to apply the changes. It will create the pools and the compute environment, and print the `compute_env_id` you hand to the Maintain tier. + +### 1.4. See both sides The compute environment now exists in two places, and as an Admin with cloud access you can see both. @@ -370,7 +481,11 @@ On the Azure side, open the Batch account in the portal. You will see the head a ### Takeaway -One compute environment, two levels of control: Forge in the UI (easiest, the Platform owns the pool) and Terraform (you own the pools and the wiring, end to end). The artifact you hand to the Maintain tier is a `compute_env_id`. +One compute environment, three levels of control: Forge in the UI (easiest, the Platform owns the pool), `tw` (export and import the same config over the API), and Terraform (you own the pools and the wiring, end to end). The artifact you hand to the Maintain tier is a `compute_env_id`. + +!!! note "Tearing it down" + + Terraform manages the cloud resources it created, so it can remove them too. From `terraform/compute-env`, run `terraform apply -destroy` to delete the compute environment and the Batch pools in one step. The existing Batch account and credentials are referenced, not managed, so they are left untouched. --- @@ -378,83 +493,91 @@ One compute environment, two levels of control: Forge in the UI (easiest, the Pl **Requires:** Maintain role, and a `compute_env_id` (from section 1 or an Admin on your team) plus the numeric `workspace_id`. Maintain manages pipelines, not compute environments. That split is deliberate: Admin owns the compute environment, you own your pipelines. -You add the same pipeline, `rnaseq-nf-$USER`, four ways. The first three are imperative, you run a command and it acts. The last, Terraform, is declarative. Watch what happens when you run each one twice. +You add the same pipeline, `rnaseq-nf-$WORKSHOP_USER`, four ways. The first three are imperative, you run a command and it acts. The last, Terraform, is declarative. Watch what happens when you run each one twice. ### 2.1. Add a pipeline via the UI In the workspace, open the **Launchpad** and click **Add pipeline**. Fill in the form: -- **Name**: `rnaseq-nf-` (unique in a shared workspace). +- **Name**: `rnaseq-nf-` followed by your handle, e.g. `rnaseq-nf-ada` (the handle you exported as `WORKSHOP_USER` in section 0). - **Compute environment**: the one from section 1, e.g. `azure-batch-manual`. - **Pipeline to launch**: `https://github.com/nextflow-io/rnaseq-nf`. - **Revision**: `master`. -- **Work directory**: your Azure Blob work dir, e.g. `az://nf-work/work`. +- **Work directory**: your Azure Blob work dir, e.g. `az://work`. Click **Add**. The pipeline appears on the Launchpad with no run started. Adding a pipeline only saves a launch configuration; it does not run anything. +To remove from the workspace, you can click the hamburger menu on the top right and click **Delete**. + ### 2.2. Add a pipeline via `tw` The CLI does the same thing in one command: ```bash tw pipelines add \ - --name="rnaseq-nf-$USER" \ + --name="rnaseq-nf-$WORKSHOP_USER" \ --compute-env="azure-batch-manual" \ - --work-dir="az://nf-work/work" \ + --work-dir="az://work" \ --revision="master" \ https://github.com/nextflow-io/rnaseq-nf ``` Run it again and `tw` errors: a pipeline with that name already exists. The command is imperative, so each invocation tries to add a pipeline; it has no notion of "already in the desired state". +To remove the pipeline, you can use the `tw` command line again: + +```bash +tw pipelines delete --name="rnaseq-nf-$WORKSHOP_USER" +``` + ### 2.3. Add a pipeline with `seqerakit` `seqerakit` is a wrapper over `tw` that reads a YAML file and runs the underlying `tw` commands. It keeps the configuration as code, so a teammate can reproduce the exact same pipeline. `seqerakit/add-rnaseq.yml` describes the pipeline: ```yaml pipelines: - - name: "rnaseq-nf-${USERNAME}" + - name: "rnaseq-nf-${WORKSHOP_USER}" url: "https://github.com/nextflow-io/rnaseq-nf" - workspace: "my-org/platform-automation" - description: "rnaseq-nf for ${USERNAME}, added with seqerakit" + workspace: "${TOWER_WORKSPACE_ID}" + description: "Added with seqerakit" compute-env: "azure-batch-manual" - work-dir: "az://nf-work/work" + work-dir: "az://work" revision: "master" ``` -`seqerakit` expands `${USERNAME}` from the environment, so set it first, then add the pipeline: +`seqerakit` expands variables like `${TOWER_WORKSPACE_ID}` and `${WORKSHOP_USER}` from the environment. Both were set in section 0, so just add the pipeline: ```bash cd /workspaces/training/side-quests/platform_automation/seqerakit -export USERNAME=$USER seqerakit add-rnaseq.yml ``` If you run it again, it errors, the same way `tw` did, because the pipeline already exists: ```console -ERROR: A pipeline with name 'rnaseq-nf-' already exists. +The pipelines resource already exists and will not be created. Please set 'on_exists: overwrite' to replace the resource or set 'on_exists: ignore' to ignore this error. ``` You can force it through with `seqerakit add-rnaseq.yml --overwrite`, which deletes and recreates the pipeline. But that is you telling it to repeat the action. By default, adding twice is an error. To make "add once, and leave it alone after that" the _default_ behaviour, we need a tool that manages existence rather than actions: Terraform. ### 2.4. Add a pipeline with Terraform -`side-quests/platform_automation/terraform/pipeline` adds the same pipeline declaratively. You describe the pipeline that should exist; Terraform makes the workspace match: +`side-quests/platform_automation/terraform/pipeline` adds the same pipeline declaratively. You describe the pipeline that should exist; Terraform makes the workspace match. Like the imperative methods above, the config tracks the `master` branch; you will pin it to a release tag below to see Terraform update the pipeline in place. ```bash cd /workspaces/training/side-quests/platform_automation/terraform/pipeline terraform init -terraform plan -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" -terraform apply -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" +terraform apply -var="username=$WORKSHOP_USER" -var="workspace_id=" -var="compute_env_id=" ``` -Tip: copy `terraform.tfvars.example` to `terraform.tfvars` so you stop passing `-var` flags. +!!! Tip + + copy `terraform.tfvars.example` to `terraform.tfvars` and fill it in so you stop passing `-var` flags. -Open the Launchpad: `rnaseq-nf-$USER` is there, with no run. Now apply again: +Open the Launchpad: `rnaseq-nf-$WORKSHOP_USER` is there, with no run. Now apply again: ```bash -terraform apply -var="username=$USER" -var="workspace_id=" -var="compute_env_id=" +terraform apply -var="username=$WORKSHOP_USER" -var="workspace_id=" -var="compute_env_id=" ``` ```console @@ -463,9 +586,59 @@ No changes. Your infrastructure matches the configuration. That is the difference. `tw` and `seqerakit` errored on the second run because they perform an action every time. Terraform manages whether the pipeline **exists**: it is already there, so there is nothing to do. Apply ten times, still one pipeline. This is what keeps you from accumulating competing, half-duplicated resources in a shared workspace. To remove the pipeline, `terraform apply -destroy` with the same vars. +**Update in place.** Terraform does more than create-or-skip; it reconciles the pipeline to whatever the config says. The config tracks the `master` branch, which moves as the pipeline gets new commits. Pin it to a fixed release tag instead, so every launch runs the same code. Edit one line: in `main.tf`, line 35 of the `launch` block, change the revision from the `master` branch to the `v2.4` release tag. + +=== "After" + + ```hcl title="main.tf" hl_lines="4" linenums="32" + launch = { + pipeline = "https://github.com/nextflow-io/rnaseq-nf" + # The master branch moves; pin a release tag (e.g. v2.4) for reproducible launches. + revision = "v2.4" + compute_env_id = var.compute_env_id + work_dir = var.work_dir + } + ``` + +=== "Before" + + ```hcl title="main.tf" hl_lines="4" linenums="32" + launch = { + pipeline = "https://github.com/nextflow-io/rnaseq-nf" + # The master branch moves; pin a release tag (e.g. v2.4) for reproducible launches. + revision = "master" + compute_env_id = var.compute_env_id + work_dir = var.work_dir + } + ``` + +Then apply: + +```console +Terraform will perform the following actions: + + # seqera_pipeline.rnaseq_nf will be updated in-place + ~ resource "seqera_pipeline" "rnaseq_nf" { + ~ launch = { + ~ revision = "master" -> "v2.4" + # (4 unchanged attributes hidden) + } + } + +Plan: 0 to add, 1 to change, 0 to destroy. +``` + +One pipeline, modified; not a second pipeline, and not an error. That is the third declarative behaviour, alongside create and no-op: update to match. Moving from a branch to a release tag is exactly the kind of change you want under version control: the pinned revision is now recorded in `main.tf`. + +!!! note "Pinning a revision vs. Launchpad versions" + + The Platform also has a separate concept of **Launchpad pipeline versions**: several saved launch configurations on one pipeline, with one marked as the default (most recent). You can use this to maintain and control pipeline versions within one concept of a "pipeline". + + The Terraform provider can also publish and promote those versions, and flag drift if someone changes the default in the UI. See the provider's [pipeline versioning guide](https://github.com/seqeralabs/terraform-provider-seqera/blob/master/docs/guides/pipeline-versioning.md). + ### Takeaway -Four ways to add one pipeline, two mental models. `tw` and `seqerakit` are imperative: each run is an action, and adding twice is an error. Terraform is declarative: it manages existence, so a second apply is a no-op. The artifact you hand to the Launch tier is the Launchpad pipeline `rnaseq-nf-$USER`. +Four ways to add one pipeline, two mental models. `tw` and `seqerakit` are imperative: each run is an action, and adding twice is an error. Terraform is declarative: it manages existence, so a second apply is a no-op or an update-in-place. The artifact you hand to the Launch tier is the Launchpad pipeline `rnaseq-nf-$WORKSHOP_USER`. --- @@ -477,35 +650,53 @@ Everything in this section runs the pipeline the Maintainer already configured. ### 3.1. Use the GUI -Open the **Launchpad**, select `rnaseq-nf-$USER`, and click **Launch**. The compute environment, revision, and work directory are already filled in by the Maintainer, so a Launch user just clicks the button. Submit it and the run appears under **Runs**. +Open the **Launchpad**, select `rnaseq-nf-$WORKSHOP_USER`, and click **Launch**. The compute environment, revision, and work directory are already filled in by the Maintainer, so a Launch user just clicks the button. Submit it and the run appears under **Runs**. ### 3.2. Use the `tw` CLI ```bash -tw launch rnaseq-nf-$USER +tw launch rnaseq-nf-$WORKSHOP_USER +``` + +It should show something like: + +```console + Workflow 2ZXaU1AzEn7Onk submitted at [Organization / Workspace] workspace. + + https://cloud.seqera.io/orgs/Organization/workspaces/Workspace/watch/2ZXaU1AzEn7Onk ``` -One command, no flags: everything is pre-configured on the Launchpad entry. The CLI submits the run and prints its URL. +You can monitor the run by clicking the provided URL. -For an automated launch, pin the parameters in a version-controlled file and pass it with `--params-file params.yaml`. That keeps each run reproducible, which is the whole reason to drive launches from code rather than the form. +!!! Note Using a params.yml + + If you wish to provide parameters to the pipeline, you can do so with the `--params-file` flag. ### 3.3. Use `seqerakit` -`seqerakit` launches a pipeline that already exists on the Launchpad, filling in the `tw launch` command from `seqerakit/launch-rnaseq.yml`. Set `USERNAME`, dry run first, then launch: +`seqerakit` launches a pipeline that already exists on the Launchpad, filling in the `tw launch` command from `seqerakit/launch-rnaseq.yml`. `WORKSHOP_USER` is set from section 0; set the compute environment name, dry run first, then launch: ```bash cd /workspaces/training/side-quests/platform_automation/seqerakit -export USERNAME=$USER +export COMPUTE_ENVIRONMENT= seqerakit launch-rnaseq.yml --dryrun # prints the tw command, changes nothing seqerakit launch-rnaseq.yml # launches for real ``` -The dry run shows the underlying `tw` command. Run it twice and you get two runs. That is the imperative model: do the thing, now. It is the opposite of Terraform (section 2.4), which manages existence. See `side-quests/platform_automation/seqerakit/README.md`. +The dry run shows the underlying `tw` command. Run it twice and you get two runs. That is the imperative model: do the thing, now. + +One advantage of using Seqerakit is the YAML forms a template of actions to perform. Because of this we can do two more things: firstly, we can save it and re-use it later. Secondly, we can launch the same pipeline several times by adding more launch blocks to the YAML file. This is useful if you want to launch the same pipeline with different parameters or on different compute environments. Let's try and launch the pipeline now with + +```bash +seqerakit launch-rnaseq-multiple.yml +``` + +### 3.4. Side note: Examine the cloud resources -### 3.4. Examine the cloud resources +It's worth taking a second to examine the cloud resources here. -A run does not create one neatly named cloud job. Nextflow submits **many** Batch jobs and tasks, one per process invocation, so you will not find a single resource named after the Platform run. Open the run on the Platform (**Runs** → your run), which mirrors the underlying Batch service: the task table here is the same work you can see in the cloud console. +A run does not create one neatly named cloud job. The platform submits a single job to the compute environment who's only job is to configure and run Nextflow. The Nextflow running within this job submits **many** Batch jobs and tasks, one per process invocation. Overall, this means you will not find a single resource named after the Platform run. Open the run on the Platform (**Runs** → your run), which mirrors the underlying Batch service: the task table here is the same work you can see in the cloud console. If you have cloud access, the prefixes Nextflow uses in each Batch service are: @@ -517,7 +708,7 @@ The relationship is the point: the Platform hands work to Batch, Batch runs it o ### 3.5. Side note: launch Actions -There is one more way to launch, built for automation rather than people. An **Action** is a saved launch configuration behind a single URL: call that URL and the pipeline runs, with no Launchpad and no `tw`. A Maintainer creates one in the UI under **Actions** → **Add action**, picks the pipeline and compute environment, and saves it. The Platform then shows a ready-made `curl` command for the Action's endpoint. +There is one more way to launch, built for automation rather than people. An **Action** is a saved launch configuration behind a single URL: call that URL and the pipeline runs, with no Launchpad and no `tw`. A Maintainer creates one in the UI under **Actions** → **Add action**, picks the pipeline, compute environment and other settings, and saves it as a configuration. The Platform then shows a ready-made `curl` command for the Action's endpoint. The split mirrors the roles: _creating_ an Action needs the Maintain role, but _triggering_ it needs only a Launch token. That is the point of the stratified launch: a Maintainer hands launchers (or an automation system) a URL they can call to run the pipeline, and nothing more. diff --git a/side-quests/platform_automation/seqerakit/README.md b/side-quests/platform_automation/seqerakit/README.md deleted file mode 100644 index f22e28d9f2..0000000000 --- a/side-quests/platform_automation/seqerakit/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# seqerakit - -The imperative asset, used in two tiers. See the Platform Automation side quest, §2 (Maintain) and §3 (Launch). seqerakit wraps `tw` and reads a YAML file: - -- `add-rnaseq.yml` (Maintain) adds `rnaseq-nf-$USERNAME` to the Launchpad. Re-running errors unless `--overwrite`, the imperative contrast to Terraform's idempotent `apply`. -- `launch-rnaseq.yml` (Launch) launches that pipeline. Run it twice and you get two runs. - -Terraform owns the pipeline's existence; seqerakit and `tw` act on it. This is the imperative contrast to the API Action and to Terraform. - -## Declarative vs imperative - -| | Terraform | seqerakit / tw | -| ------------ | ------------------------------------ | -------------------- | -| Manages | existence (does the pipeline exist?) | actions (run it now) | -| Run twice | no-op, still one pipeline | two runs | -| Mental model | desired state | do the thing, now | - -You added `rnaseq-nf-$USERNAME` with Terraform. Now you launch it. - -## Setup - -```bash -export TOWER_ACCESS_TOKEN= -export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN -export USERNAME=$USER -``` - -Edit `workspace` and `compute-env` in the YAML to match the workshop workspace if they differ. - -## Dry run first - -Always dry run first. `--dryrun` prints the `tw` command seqerakit would run and changes nothing: - -```bash -seqerakit launch-rnaseq.yml --dryrun -``` - -Then launch for real: - -```bash -seqerakit launch-rnaseq.yml -``` - -## The tw equivalent - -seqerakit is a wrapper over `tw`. The dry run shows you the underlying command. -It is the same as: - -```bash -tw launch rnaseq-nf-$USERNAME \ - --workspace=my-org/platform-automation \ - --compute-env=azure-batch-manual -``` - -This is the callback to the Azure mechanics: launching here submits jobs to the Platform, which hands them to Azure Batch, which stacks tasks onto the pool VMs. Same handoff the Admin tier showed in the portal. diff --git a/side-quests/platform_automation/seqerakit/add-rnaseq.yml b/side-quests/platform_automation/seqerakit/add-rnaseq.yml index 4de2081787..804d3a3819 100644 --- a/side-quests/platform_automation/seqerakit/add-rnaseq.yml +++ b/side-quests/platform_automation/seqerakit/add-rnaseq.yml @@ -1,19 +1,18 @@ -# Add rnaseq-nf-$USERNAME to the Launchpad (the imperative contrast to Terraform). +# Add rnaseq-nf-$WORKSHOP_USER to the Launchpad (the imperative contrast to Terraform). # # This ADDS a pipeline to the Launchpad. It does not launch it. Re-running errors # unless you pass --overwrite, because the pipeline already exists. That is the # imperative model: each run is an action, not a desired state. # -# seqerakit expands ${USERNAME} from the environment, so set it first: -# -# export USERNAME=$USER +# seqerakit expands ${WORKSHOP_USER} from the environment. Export it first +# (see section 0): a short, unique, dot-free handle for the shared workspace. # # Set the workspace and compute-env names to match your workshop workspace. pipelines: - - name: "rnaseq-nf-${USERNAME}" + - name: "rnaseq-nf-${WORKSHOP_USER}" url: "https://github.com/nextflow-io/rnaseq-nf" - workspace: "my-org/platform-automation" - description: "rnaseq-nf for ${USERNAME}, added with seqerakit" + workspace: "${TOWER_WORKSPACE_ID}" + description: "Added with seqerakit" compute-env: "azure-batch-manual" - work-dir: "az://nf-work/work" + work-dir: "az://work" revision: "master" diff --git a/side-quests/platform_automation/seqerakit/launch-rnaseq-multiple.yml b/side-quests/platform_automation/seqerakit/launch-rnaseq-multiple.yml new file mode 100644 index 0000000000..20c4928a03 --- /dev/null +++ b/side-quests/platform_automation/seqerakit/launch-rnaseq-multiple.yml @@ -0,0 +1,24 @@ +# Launch rnaseq-nf-$WORKSHOP_USER against the shared compute environment. +# +# This LAUNCHES a pipeline that already exists on the Launchpad. Terraform +# added it (see ../terraform/pipeline). seqerakit does not create it here. +# +# Declarative vs imperative: +# Terraform manages existence. apply twice = no second pipeline. +# seqerakit/tw do the thing, now. Run this twice = two runs. That is the +# point. Launching is an action, not a state. +# +# A bare `pipeline:` name (not a git URL) means "the saved Launchpad pipeline +# with this name". seqerakit expands ${WORKSHOP_USER} from the environment; +# export it first (see section 0). +# +# Set the workspace and compute-env names to match your workshop workspace. +launch: + - name: "rnaseq-nf-${WORKSHOP_USER}-run-1" + workspace: "${TOWER_WORKSPACE_ID}" + pipeline: "rnaseq-nf-${WORKSHOP_USER}" + compute-env: "${COMPUTE_ENVIRONMENT}" + - name: "rnaseq-nf-${WORKSHOP_USER}-run-2" + workspace: "${TOWER_WORKSPACE_ID}" + pipeline: "rnaseq-nf-${WORKSHOP_USER}" + compute-env: "${COMPUTE_ENVIRONMENT}" diff --git a/side-quests/platform_automation/seqerakit/launch-rnaseq.yml b/side-quests/platform_automation/seqerakit/launch-rnaseq.yml index afd1ebd0bf..9253657b1e 100644 --- a/side-quests/platform_automation/seqerakit/launch-rnaseq.yml +++ b/side-quests/platform_automation/seqerakit/launch-rnaseq.yml @@ -1,4 +1,4 @@ -# Launch rnaseq-nf-$USERNAME against the shared compute environment. +# Launch rnaseq-nf-$WORKSHOP_USER against the shared compute environment. # # This LAUNCHES a pipeline that already exists on the Launchpad. Terraform # added it (see ../terraform/pipeline). seqerakit does not create it here. @@ -9,14 +9,12 @@ # point. Launching is an action, not a state. # # A bare `pipeline:` name (not a git URL) means "the saved Launchpad pipeline -# with this name". seqerakit expands ${USERNAME} from the environment, so set -# it first: -# -# export USERNAME=$USER +# with this name". seqerakit expands ${WORKSHOP_USER} from the environment; +# export it first (see section 0). # # Set the workspace and compute-env names to match your workshop workspace. launch: - - name: "rnaseq-nf-${USERNAME}-run" - workspace: "my-org/platform-automation" - pipeline: "rnaseq-nf-${USERNAME}" - compute-env: "azure-batch-manual" + - name: "rnaseq-nf-${WORKSHOP_USER}-run" + workspace: "${TOWER_WORKSPACE_ID}" + pipeline: "rnaseq-nf-${WORKSHOP_USER}" + compute-env: "${COMPUTE_ENVIRONMENT}" diff --git a/side-quests/platform_automation/terraform/compute-env/README.md b/side-quests/platform_automation/terraform/compute-env/README.md deleted file mode 100644 index 9a8f997fad..0000000000 --- a/side-quests/platform_automation/terraform/compute-env/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# terraform/compute-env - -The Admin tier's compute-environment asset. See the Platform Automation side quest, §1 (Admin). You run this -only if you have the **Admin** (or Owner) role and permissions in the cloud -environment. In a workshop the presenter builds the shared compute environment -before the session; Maintain-role attendees do not run this and instead get a -`compute_env_id` to build pipelines against. - -## What it does - -The realistic, complex path. One config, two providers, end to end: - -1. **azurerm** creates a head pool and a worker pool on the customer's existing - Azure Batch account, on their existing subnet, running as their existing - managed identity. -2. **seqera** stores the Azure credentials and creates a manual Azure Batch - compute environment that uses the head pool and routes tasks to the worker - pool. - -This is what "manage your cloud as code" looks like for a lab that already -owns its Azure footprint. Terraform does not create the Batch account, the -network, or the identity. Those exist under change control and are referenced -with data sources (in `main.tf`). Terraform adds the pools and the Platform -wiring. - -## Three tiers, for context - -The session shows compute environments at three levels of control: - -1. **Batch Forge (UI)**: the Platform creates and scales the pool. Easiest. -2. **Manual CE pointing at an existing pool**: you already have a pool, the - Platform just submits to it. -3. **This config**: Terraform provisions the pools on your existing account and - network, then wires the Platform. Full infrastructure as code. - -## Manual vs Forge - -The compute environment is manual: `head_pool` is set and there is no `forge` -block. The Platform submits to the pools this config created. It never creates -or scales a pool itself. A `forge` block would flip it to Batch Forge. - -## Run it - -```bash -az login -export TOWER_ACCESS_TOKEN= -export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN - -cp terraform.tfvars.example terraform.tfvars -# edit terraform.tfvars: subscription, workspace, existing resource names, keys - -terraform init -terraform plan -terraform apply -``` - -After apply, note the `compute_env_id` output. The Maintain tier needs it for -`terraform/pipeline`. - -## The cloud side - -With Admin and cloud access you can also see the Azure side: the Batch account, -the pool VMs, jobs and tasks stacking onto them, a task's logs and exit code. -That is the whole point of the tier: the Platform submits to Azure Batch, which -runs the work. Maintain- and Launch-role users see only the compute environment -in the workspace, not the cloud behind it. diff --git a/side-quests/platform_automation/terraform/compute-env/main.tf b/side-quests/platform_automation/terraform/compute-env/main.tf index e90f9aeb3c..79d9ced4e5 100644 --- a/side-quests/platform_automation/terraform/compute-env/main.tf +++ b/side-quests/platform_automation/terraform/compute-env/main.tf @@ -11,7 +11,7 @@ terraform { required_version = ">= 1.9" required_providers { - seqera = { source = "seqeralabs/seqera", version = "0.30.5" } + seqera = { source = "seqeralabs/seqera", version = "0.40.1" } azurerm = { source = "hashicorp/azurerm", version = ">= 3.0" } random = { source = "hashicorp/random", version = ">= 3.0" } } @@ -28,11 +28,16 @@ provider "seqera" { # Pool sizing and image. Edit here rather than exposing every value as a knob. locals { - head_vm_size = "Standard_D4ds_v5" + head_vm_size = "Standard_E4ds_v5" worker_vm_size = "Standard_E16ds_v5" worker_max_nodes = 8 - worker_max_tasks = 16 - node_agent_sku_id = "batch.node.ubuntu 22.04" + node_agent_sku_id = "batch.node.ubuntu 24.04" + + # The Platform requires a pool's task slots to equal the node's vCPU count. + # Azure VM size names embed that count (Standard_E16ds_v5 -> 16), so derive it + # from the size rather than hardcoding a number that can drift out of sync. + head_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.head_vm_size)[0]) + worker_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.worker_vm_size)[0]) } # Keeps pool names unique across re-creates. @@ -42,30 +47,52 @@ resource "random_string" "suffix" { upper = false } +# Manual pools (head_pool set, no forge block) don't receive the node start task +# that Forge adds to auto-created pools, so we replicate its essential parts: +# 1. Install azcopy on the shared node path. Nextflow's Azure Batch executor +# uses it to stage data; manual pools must provide it. +# 2. Register the AppArmor profile Fusion needs on Ubuntu 24.04+ nodes. Without +# it, container init fails with "unable to apply apparmor profile" +# (COMP-1248, moby/moby#50013, launchpad #2111105). +locals { + node_start_task_script = <<-SCRIPT + set -euo pipefail + + # azcopy: Nextflow's Azure Batch executor uses it to transfer files. + curl -sL https://aka.ms/downloadazcopy-v10-linux -o /tmp/azcopy.tgz + tar -xzf /tmp/azcopy.tgz --strip-components=1 -C /tmp + mkdir -p "$AZ_BATCH_NODE_SHARED_DIR/bin/" + cp /tmp/azcopy "$AZ_BATCH_NODE_SHARED_DIR/bin/" + + # AppArmor profile for Fusion containers on Ubuntu 24.04+. + mkdir -p /etc/apparmor.d/containers + printf '%s\n' \ + 'abi ,' \ + 'include ' \ + '' \ + 'profile seqera-fusionfs-container flags=(default_allow) {' \ + ' userns,' \ + ' mount fstype=fuse.fusion -> /fusion/,' \ + ' mount fstype=fuse.fusion -> /fusion/**,' \ + ' umount,' \ + ' include ' \ + ' include ' \ + ' include if exists ' \ + '}' > /etc/apparmor.d/containers/seqera-fusionfs-container + apparmor_parser -r /etc/apparmor.d/containers/seqera-fusionfs-container + SCRIPT + + # Batch parses the command line itself (no shell), so multi-line scripts with + # quoting don't survive. Base64-encode the script and decode it on the node. + pool_start_command = "/bin/bash -c 'echo ${base64encode(local.node_start_task_script)} | base64 -d | bash'" +} + # Existing Azure resources the customer owns. Referenced, not managed. data "azurerm_batch_account" "existing" { name = var.batch_account_name resource_group_name = var.batch_account_rg } -data "azurerm_user_assigned_identity" "existing" { - name = var.managed_identity_name - resource_group_name = var.managed_identity_rg -} - -data "azurerm_subnet" "existing" { - name = var.subnet_name - virtual_network_name = var.vnet_name - resource_group_name = var.vnet_rg -} - -# Let the managed identity read and write the work directory's storage. -resource "azurerm_role_assignment" "batch_data_contributor" { - scope = data.azurerm_batch_account.existing.id - role_definition_name = "Azure Batch Data Contributor" - principal_id = data.azurerm_user_assigned_identity.existing.principal_id -} - # Head pool: runs the Nextflow head job. One node is enough. resource "azurerm_batch_pool" "head" { name = "rnaseq-head-${random_string.suffix.result}" @@ -74,6 +101,7 @@ resource "azurerm_batch_pool" "head" { account_name = var.batch_account_name vm_size = local.head_vm_size node_agent_sku_id = local.node_agent_sku_id + max_tasks_per_node = local.head_vm_cores fixed_scale { target_dedicated_nodes = 1 @@ -82,7 +110,7 @@ resource "azurerm_batch_pool" "head" { storage_image_reference { publisher = "microsoft-dsvm" offer = "ubuntu-hpc" - sku = "2204" + sku = "2404" version = "latest" } @@ -90,14 +118,18 @@ resource "azurerm_batch_pool" "head" { type = "DockerCompatible" } - identity { - type = "UserAssigned" - identity_ids = [data.azurerm_user_assigned_identity.existing.id] - } + # Install azcopy and load the Fusion AppArmor profile on each node at startup. + start_task { + command_line = local.pool_start_command + task_retry_maximum = 1 + wait_for_success = true - network_configuration { - subnet_id = data.azurerm_subnet.existing.id - public_address_provisioning_type = "NoPublicIPAddresses" + user_identity { + auto_user { + elevation_level = "Admin" + scope = "Pool" + } + } } } @@ -109,7 +141,7 @@ resource "azurerm_batch_pool" "worker" { account_name = var.batch_account_name vm_size = local.worker_vm_size node_agent_sku_id = local.node_agent_sku_id - max_tasks_per_node = local.worker_max_tasks + max_tasks_per_node = local.worker_vm_cores auto_scale { evaluation_interval = "PT5M" @@ -123,7 +155,7 @@ resource "azurerm_batch_pool" "worker" { storage_image_reference { publisher = "microsoft-dsvm" offer = "ubuntu-hpc" - sku = "2204" + sku = "2404" version = "latest" } @@ -131,30 +163,37 @@ resource "azurerm_batch_pool" "worker" { type = "DockerCompatible" } - identity { - type = "UserAssigned" - identity_ids = [data.azurerm_user_assigned_identity.existing.id] - } + # Install azcopy and load the Fusion AppArmor profile on each node at startup. + start_task { + command_line = local.pool_start_command + task_retry_maximum = 1 + wait_for_success = true - network_configuration { - subnet_id = data.azurerm_subnet.existing.id - public_address_provisioning_type = "NoPublicIPAddresses" + user_identity { + auto_user { + elevation_level = "Admin" + scope = "Pool" + } + } } - # Terraform manages the pool, not its live node count. + # Terraform manages the pool, not its live scale. lifecycle { - ignore_changes = [auto_scale] + ignore_changes = [auto_scale, fixed_scale] } } -# Azure credentials stored in the Platform. Keys are write-only. -resource "seqera_azure_credential" "main" { - name = "azure-batch" +# Azure credentials already stored in the Platform. We look them up by name +# rather than creating them, so no keys appear in this config. +data "seqera_credentials" "all" { workspace_id = var.workspace_id - batch_name = var.batch_account_name - batch_key = var.azure_batch_key - storage_name = var.azure_storage_name - storage_key = var.azure_storage_key +} + +locals { + azure_credentials_id = one([ + for c in data.seqera_credentials.all.credentials : c.id + if c.name == var.azure_credential_name + ]) } # Manual Azure Batch compute environment: uses the head pool, routes tasks to @@ -166,15 +205,16 @@ resource "seqera_compute_env" "main" { name = "azure-batch-manual" description = "Azure Batch CE on Terraform-managed pools" platform = "azure-batch" - credentials_id = seqera_azure_credential.main.credentials_id + credentials_id = local.azure_credentials_id config = { azure_batch = { - region = var.region - work_dir = var.work_dir - head_pool = azurerm_batch_pool.head.name - managed_identity_client_id = data.azurerm_user_assigned_identity.existing.client_id - nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" + region = var.region + work_dir = var.work_dir + head_pool = azurerm_batch_pool.head.name + enable_wave = true + enable_fusion = true + nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" } } } diff --git a/side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example b/side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example index 44e1a3bbc9..532f993e13 100644 --- a/side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example +++ b/side-quests/platform_automation/terraform/compute-env/terraform.tfvars.example @@ -4,25 +4,17 @@ subscription_id = "00000000-0000-0000-0000-000000000000" workspace_id = 123456789 -region = "uaenorth" -work_dir = "az://nf-work/work" +region = "eastus" +work_dir = "az://work" -# Existing Azure resources (referenced, not created) -batch_account_name = "mybatch" -batch_account_rg = "batch-rg" -managed_identity_name = "nextflow-identity" -managed_identity_rg = "identity-rg" -vnet_name = "nf-vnet" -vnet_rg = "network-rg" -subnet_name = "batch-subnet" +# Existing Azure Batch account (referenced, not created). +batch_account_name = "mybatch" +batch_account_rg = "batch-rg" -# Pool sizing lives in main.tf (locals), not here. +# Azure credentials already stored in the Platform workspace, referenced by name. +azure_credential_name = "my-azure-credentials" -# Seqera credential keys (sensitive). Prefer TF_VAR_azure_batch_key / -# TF_VAR_azure_storage_key environment variables over this file. -azure_storage_name = "mystorage" -azure_batch_key = "REPLACE_ME" -azure_storage_key = "REPLACE_ME" +# Pool sizing lives in main.tf (locals), not here. # server_url defaults to Seqera Cloud; uncomment only for Enterprise. # server_url = "https://platform.example.com/api" diff --git a/side-quests/platform_automation/terraform/compute-env/variables.tf b/side-quests/platform_automation/terraform/compute-env/variables.tf index 7fc99ffd1b..c6ff497d28 100644 --- a/side-quests/platform_automation/terraform/compute-env/variables.tf +++ b/side-quests/platform_automation/terraform/compute-env/variables.tf @@ -1,6 +1,6 @@ # Inputs for the Admin tier compute-environment config. The Platform token is -# NOT here; it comes from TOWER_ACCESS_TOKEN. Sensitive Azure keys come from a -# gitignored terraform.tfvars or TF_VAR_ environment variables. +# NOT here; it comes from TOWER_ACCESS_TOKEN. The Azure credentials are not here +# either: they are already stored in the Platform and referenced by name. variable "server_url" { description = "Seqera Platform API endpoint. Cloud by default." @@ -18,7 +18,7 @@ variable "workspace_id" { type = number } -# Existing Azure resources (referenced via data sources, not created). +# Existing Azure Batch account (referenced via a data source, not created). variable "batch_account_name" { description = "Name of the existing Azure Batch account." type = string @@ -29,28 +29,10 @@ variable "batch_account_rg" { type = string } -variable "managed_identity_name" { - description = "Name of the existing user-assigned managed identity for Batch nodes." - type = string -} - -variable "managed_identity_rg" { - description = "Resource group of the existing managed identity." - type = string -} - -variable "vnet_name" { - description = "Name of the existing virtual network the pools attach to." - type = string -} - -variable "vnet_rg" { - description = "Resource group of the existing virtual network." - type = string -} - -variable "subnet_name" { - description = "Name of the existing subnet the pool nodes join." +# Azure credentials already stored in the Platform (added to the workspace +# beforehand). Referenced by name; the keys never appear in this config. +variable "azure_credential_name" { + description = "Name of the existing Azure credentials in the Platform workspace." type = string } @@ -60,24 +42,6 @@ variable "region" { } variable "work_dir" { - description = "Azure Blob Storage work directory, e.g. az://nf-work/work." - type = string -} - -# Seqera credential keys (sensitive). -variable "azure_batch_key" { - description = "Azure Batch account access key." - type = string - sensitive = true -} - -variable "azure_storage_name" { - description = "Azure Storage account name for the work directory." - type = string -} - -variable "azure_storage_key" { - description = "Azure Storage account access key." + description = "Azure Blob Storage work directory, e.g. az://work." type = string - sensitive = true } diff --git a/side-quests/platform_automation/terraform/pipeline/README.md b/side-quests/platform_automation/terraform/pipeline/README.md deleted file mode 100644 index 6cae02825d..0000000000 --- a/side-quests/platform_automation/terraform/pipeline/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# terraform/pipeline - -The Maintain tier's pipeline asset. This adds your own pipeline, -`rnaseq-nf-$USERNAME`, to the Launchpad with Terraform. It adds it. It does not -launch it. See the Platform Automation side quest, §2 (Maintain). - -## Before you start - -You need the **Maintain** role and two values from the Admin tier (or your -presenter): - -- `workspace_id`: the shared workspace. -- `compute_env_id`: the shared Azure Batch compute environment. - -And create a Platform token (User menu, Your tokens, Add token), then: - -```bash -export TOWER_ACCESS_TOKEN= -export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN -``` - -## The flow - -```bash -cd /workspaces/training/side-quests/platform_automation/terraform/pipeline - -# 1. Set your inputs. Either copy the example file: -cp terraform.tfvars.example terraform.tfvars -# and edit it, or pass -var flags on each command below. - -# 2. Initialise (downloads the seqera 0.30.5 provider). -terraform init - -# 3. Preview. One resource to add. Nothing changes yet. -terraform plan -var="username=$USER" - -# 4. Add the pipeline to the Launchpad. -terraform apply -var="username=$USER" -``` - -Open the workspace Launchpad. `rnaseq-nf-$USERNAME` is there. No run has -started. - -## Idempotency - -Run apply again: - -```bash -terraform apply -var="username=$USER" -``` - -"No changes. Your infrastructure matches the configuration." Terraform manages -existence, not actions. Applying ten times does not launch ten runs. It -launches zero. To actually run the pipeline, use seqerakit/tw (see -`../../seqerakit`). That is the imperative half: do the thing, now. - -## Teardown - -Remove your pipeline when you are done: - -```bash -terraform apply -destroy -var="username=$USER" -``` - -It deletes only the pipeline you added. The shared compute environment and -workspace are untouched. diff --git a/side-quests/platform_automation/terraform/pipeline/main.tf b/side-quests/platform_automation/terraform/pipeline/main.tf index ff1eb26033..196ceb1652 100644 --- a/side-quests/platform_automation/terraform/pipeline/main.tf +++ b/side-quests/platform_automation/terraform/pipeline/main.tf @@ -15,7 +15,7 @@ terraform { required_providers { seqera = { source = "seqeralabs/seqera" - version = "0.30.5" + version = "0.40.1" } } } @@ -30,7 +30,8 @@ resource "seqera_pipeline" "rnaseq_nf" { workspace_id = var.workspace_id launch = { - pipeline = "https://github.com/nextflow-io/rnaseq-nf" + pipeline = "https://github.com/nextflow-io/rnaseq-nf" + # The master branch moves; pin a release tag (e.g. v2.4) for reproducible launches. revision = "master" compute_env_id = var.compute_env_id work_dir = var.work_dir diff --git a/side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example b/side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example index ac5950cc13..c8cca42dec 100644 --- a/side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example +++ b/side-quests/platform_automation/terraform/pipeline/terraform.tfvars.example @@ -1,8 +1,9 @@ # Copy to terraform.tfvars and fill in. terraform.tfvars is gitignored. # Do NOT put your access token here. Export TOWER_ACCESS_TOKEN in the shell. -# Your username. Or pass it on the command line: terraform apply -var="username=$USER" -username = "your-username" +# Your workshop handle (letters, numbers, dash, underscore; no dots). +# Or pass it on the command line: terraform apply -var="username=$WORKSHOP_USER" +username = "your-handle" # Shared workshop workspace ID (the presenter gives you this). workspace_id = 123456789 @@ -10,8 +11,8 @@ workspace_id = 123456789 # Shared compute environment ID (the presenter gives you this). compute_env_id = "REPLACE_ME" -# Optional: defaults to az://nf-work/work -# work_dir = "az://nf-work/work" +# Optional: defaults to az://work +# work_dir = "az://work" # server_url defaults to Seqera Cloud; uncomment only for Enterprise. # server_url = "https://platform.example.com/api" diff --git a/side-quests/platform_automation/terraform/pipeline/variables.tf b/side-quests/platform_automation/terraform/pipeline/variables.tf index f7ac7f2080..1bfdd9835c 100644 --- a/side-quests/platform_automation/terraform/pipeline/variables.tf +++ b/side-quests/platform_automation/terraform/pipeline/variables.tf @@ -6,17 +6,18 @@ variable "server_url" { default = "https://api.cloud.seqera.io" } -# Your username makes the pipeline name unique in a shared workspace. No +# Your workshop handle makes the pipeline name unique in a shared workspace. No # default on purpose, so you must set it. Set it with -var or in terraform.tfvars: # -# terraform apply -var="username=$USER" +# terraform apply -var="username=$WORKSHOP_USER" variable "username" { - description = "Your username. Makes the Launchpad pipeline name unique." + description = "Your workshop handle. Makes the Launchpad pipeline name unique." type = string + # No dots: Launchpad pipeline names reject them. validation { - condition = can(regex("^[a-zA-Z0-9._-]{2,80}$", var.username)) - error_message = "username must be 2-80 chars: letters, numbers, dot, dash, underscore." + condition = can(regex("^[a-zA-Z0-9_-]{2,80}$", var.username)) + error_message = "username must be 2-80 chars: letters, numbers, dash, underscore (no dots)." } } @@ -35,5 +36,5 @@ variable "compute_env_id" { variable "work_dir" { description = "Azure Blob Storage work directory for runs of this pipeline." type = string - default = "az://nf-work/work" + default = "az://work" } From 9e8dc32a58f4180a840a85a7ef25b6c394d90b64 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Wed, 17 Jun 2026 18:51:34 +0100 Subject: [PATCH 08/29] docs(platform_automation): fix two malformed admonitions - !!! Tip -> !!! tip (lowercase type) - !!! Note Using a params.yml -> !!! note "Using a params file" (the unquoted title was parsed as CSS classes and dropped) Generated by Claude Code --- docs/en/docs/side_quests/platform_automation/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 659cb48781..fb4dc0a371 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -570,9 +570,9 @@ terraform init terraform apply -var="username=$WORKSHOP_USER" -var="workspace_id=" -var="compute_env_id=" ``` -!!! Tip +!!! tip - copy `terraform.tfvars.example` to `terraform.tfvars` and fill it in so you stop passing `-var` flags. + Copy `terraform.tfvars.example` to `terraform.tfvars` and fill it in so you stop passing `-var` flags. Open the Launchpad: `rnaseq-nf-$WORKSHOP_USER` is there, with no run. Now apply again: @@ -668,7 +668,7 @@ It should show something like: You can monitor the run by clicking the provided URL. -!!! Note Using a params.yml +!!! note "Using a params file" If you wish to provide parameters to the pipeline, you can do so with the `--params-file` flag. From 92dd53252a98ed64e3d244063db29890d7e67e1e Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 14:24:07 +0100 Subject: [PATCH 09/29] Apply suggestions from code review Co-authored-by: Luisa Santus Co-authored-by: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> --- docs/en/docs/side_quests/platform_automation/index.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index fb4dc0a371..e16cdc86eb 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -17,13 +17,12 @@ In this side quest, we'll drive the Platform across three workspace roles of dec Before taking on this side quest, you should: -- Have a Seqera Platform account on Seqera Cloud (`https://cloud.seqera.io`), or an Enterprise install +- Have a Seqera Platform account on Seqera Cloud [https://cloud.seqera.io](`https://cloud.seqera.io`), or an Enterprise install - Be a member of a workspace with a role: Admin, Maintain, or Launch -- Have credentials for your cloud provider already added to that workspace (not covered here) -- Ideally, a GitHub access token added too, to avoid GitHub rate limits +- Have credentials for your cloud provider already added to that workspace (not covered here, see [credentials overview](https://docs.seqera.io/platform-cloud/credentials/overview)) +- Ideally, GitHub credentials are added to your workspace. This is optional, but it would help prevent incidents caused by GitHub rate limits. - Be comfortable with the command line and basic Nextflow concepts -New to running pipelines on Seqera at all? Start with the gentler "Run pipelines on Seqera" module in the [Nextflow Triathlon](https://training.nextflow.io/) (sign up, launch in the UI, the `tw` CLI). This side quest is the automation layer on top of it: roles, Terraform, `seqerakit`, and Actions. --- @@ -151,7 +150,7 @@ Admin users create compute environments and assign roles to everyone else. If yo ## 1. Admin: compute environments and cloud -**Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI. +**Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI (e.g. `aws sso login`). The same compute environment can be created with increasing control over the cloud. We build it two ways. From 19c3285804bdac982e70257648f643cf4dfdadf8 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 10:16:15 +0100 Subject: [PATCH 10/29] docs(platform_automation): move "Know your role" before section 0 Surface the role/tier table at the top of the side quest so participants pick their starting section before any setup. Reword the Admin/Maintain/Launch guidance and update the table's Produces column. Generated by Claude Code --- .../side_quests/platform_automation/index.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index e16cdc86eb..8ecca0e84d 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -24,6 +24,18 @@ Before taking on this side quest, you should: - Be comfortable with the command line and basic Nextflow concepts +### Know your role + +The work is split by role, from most to least privileged. Start at the highest tier your access allows: + +| Tier | Role | Can change | Produces | +| ------------------------------------------------------- | ------------- | ---------------------------------------- | --------------------- | +| [Admin](#1-admin-compute-environments-and-cloud) | Owner / Admin | Compute environments and cloud resources | a Compute environment | +| [Maintain](#2-maintain-add-a-pipeline-to-the-launchpad) | Maintain | Pipelines on the Launchpad | a Launchpad pipeline | +| [Launch](#3-launch-run-a-pipeline) | Launch | Nothing; can only run | pipeline runs | + +An Admin user will learn how to create compute environments. If you only have Maintain, your workspace must already include one valid compute environment; start at section 2. If you only have Launch, your workspace must have a pre-configured pipeline (and optionally an Action) to run; start at section 3. Each section opens with what it requires. + --- ## 0. Get started @@ -134,18 +146,6 @@ export WORKSHOP_USER= # e.g. ada, jdoe, team-rocket We set this by hand rather than reading `$USER`: in the Codespace everyone shares the same Linux user, so `$USER` is identical for all learners and would collide. -#### Know your role - -The work is split by role, from most to least privileged. Start at the highest tier your access allows: - -| Tier | Role | Can change | Produces | -| ------------------------------------------------------- | ------------- | ---------------------------------------- | -------------------- | -| [Admin](#1-admin-compute-environments-and-cloud) | Owner / Admin | Compute environments and cloud resources | a `compute_env_id` | -| [Maintain](#2-maintain-add-a-pipeline-to-the-launchpad) | Maintain | Pipelines on the Launchpad | a Launchpad pipeline | -| [Launch](#3-launch-run-a-pipeline) | Launch | Nothing; can only run | pipeline runs | - -Admin users create compute environments and assign roles to everyone else. If you only have Maintain, an Admin on your team hands you a `compute_env_id`; start at section 2. If you only have Launch, they hand you a Launchpad pipeline (and optionally an Action) to run; start at section 3. Each section opens with what it requires. - --- ## 1. Admin: compute environments and cloud From cb2b04eaf8863f20cdc304c6688e06244858d7ca Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:09:38 +0100 Subject: [PATCH 11/29] feat: Add clarification about workspace --- docs/en/docs/side_quests/platform_automation/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 8ecca0e84d..9a347d3185 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -85,6 +85,10 @@ The directory holds the Terraform and `seqerakit` configurations for each role. └── launch-rnaseq-multiple.yml ``` +### Check workspace access + +This training requires you to be in a workspace. Navigate to [Seqera Platform](https://cloud.seqera.io/) or your Enterprise install and check you can see the relevant workspace which should be under an organization. There should already be credentials pre-configured and if you have Maintain or lower permissions, a compute environment and/or pipeline should already exist. If you cannot see the workspace, please ask your workspace owner to add you to one. + ### Create an access token We authenticate to the Platform to tell it who we are. That is what grants the permissions of our role. Seqera uses a **personal access token**: a bearer token you create once and send with every API call, in an `Authorization: Bearer ` header. The token carries your identity and role, so the Platform knows who you are and what you can do. Anyone with the token can act as you, so keep it secret. In this training we save it as an environment variable. From e532fe6c2ccd15f74c58677615fa1f9ff72e8e15 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:10:46 +0100 Subject: [PATCH 12/29] fix: Remove SEQERA_ACCESS_TOKEN --- docs/en/docs/side_quests/platform_automation/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 9a347d3185..5bc4f76238 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -23,7 +23,6 @@ Before taking on this side quest, you should: - Ideally, GitHub credentials are added to your workspace. This is optional, but it would help prevent incidents caused by GitHub rate limits. - Be comfortable with the command line and basic Nextflow concepts - ### Know your role The work is split by role, from most to least privileged. Start at the highest tier your access allows: @@ -100,7 +99,6 @@ We authenticate to the Platform to tell it who we are. That is what grants the p ```bash export TOWER_ACCESS_TOKEN= -export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN ``` Terraform, `tw`, and `seqerakit` all read the token from these variables. Check it worked: From f4c4132c446f8aeafc21eeb6b109e7d48f733376 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:13:03 +0100 Subject: [PATCH 13/29] fix: Add examples of setting the server URL --- .../docs/side_quests/platform_automation/index.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 5bc4f76238..6f60cc0c70 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -113,7 +113,19 @@ This prints the API endpoint and the authenticated user. If it errors, the token This only exists in a single terminal session, if you open a new terminal you will need to export them again. -For Seqera Enterprise, also set `SEQERA_API_URL` (and the `server_url` Terraform variable) to your install's API URL. Everything else is identical. +For Seqera Enterprise, also set the environment variable `TOWER_API_ENDPOINT` to your install's API URL. Everything else is identical. + +```bash +export TOWER_API_ENDPOINT= +``` + +In Terraform, you must set the `server_url` variable to the same value. + +```hcl +provider "seqera" { + server_url = "" +} +``` ### Find your organization and workspace IDs From 1b406116384d6f2d5e68094500cc9822a7592052 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:32:38 +0100 Subject: [PATCH 14/29] docs: Detail the requirement to have credentials --- docs/en/docs/side_quests/platform_automation/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 6f60cc0c70..46e01f692e 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -164,7 +164,7 @@ We set this by hand rather than reading `$USER`: in the Codespace everyone share ## 1. Admin: compute environments and cloud -**Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI (e.g. `aws sso login`). +**Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI (e.g. `aws sso login`). There must be valid credentials in the workspace to perform the operations in the Cloud and build compute environments, please check the Seqera documentation for further details. The same compute environment can be created with increasing control over the cloud. We build it two ways. From 45abe339f685bfe2d3de8b3c9853dc0c0ed782c7 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:34:48 +0100 Subject: [PATCH 15/29] Apply suggestion from @pinin4fjords Co-authored-by: Jonathan Manning --- docs/en/docs/side_quests/platform_automation/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 46e01f692e..2b4364c790 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -1,6 +1,8 @@ # Seqera Platform Automation -The Seqera Platform does not run your work. It is an API and a control plane over your cloud. It hands jobs to a compute environment, the compute environment runs them on cloud VMs, and the Platform reads back state, logs, and exit codes. +The Seqera Platform does not run your work. +It is an API and a control plane over your cloud. +It hands jobs to a compute environment, the compute environment runs them on cloud VMs, and the Platform reads back state, logs, and exit codes. Everything the web UI does, it does by calling the Platform API. So everything is automatable: with the API, Terraform, and the CLI you can manage compute environments, pipelines, and runs as code, with no clicking. This side quest walks that programmatic surface from the most privileged role to the least. From 46b64176742ff68f8e8f74561db7289bf21bc0f6 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:41:10 +0100 Subject: [PATCH 16/29] Update docs/en/docs/side_quests/platform_automation/index.md Co-authored-by: Jonathan Manning --- docs/en/docs/side_quests/platform_automation/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 2b4364c790..ba1580e42a 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -253,7 +253,7 @@ The file `forge-ce.json` is the compute environment as the API stores it: The `forge` block is exactly what the checkboxes set in 1.1. Its presence is what tells the Platform to create and scale the pools for you. In the next section, the absence of this block is what makes the Terraform compute environment manual. -Close the loop: import the file to recreate the compute environment, with nothing retyped. +This file can be used to recreate the compute environment, with nothing retyped. ```bash tw compute-envs import forge-ce.json --name="azure-batch-copy" From 99e5227941d3426b73119444167c28b51231586a Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:41:48 +0100 Subject: [PATCH 17/29] docs: Clarify it depends on your cloud setup --- docs/en/docs/side_quests/platform_automation/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index ba1580e42a..e8f821e255 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -174,7 +174,7 @@ The same compute environment can be created with increasing control over the clo Batch Forge is the hands-off option: the Platform reaches into your cloud and creates the resources for you. Most convenient, least control. -In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your cloud platform, and select the credentials for that cloud. The rest of the form differs by provider; recommended settings: +In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your cloud platform, and select the credentials for that cloud. The rest of the form differs by provider and your cloud setup; recommended settings: **AWS** From 4bff163be036296708e5540ed1e10ea95e552173 Mon Sep 17 00:00:00 2001 From: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:43:38 +0100 Subject: [PATCH 18/29] Update docs/en/docs/side_quests/platform_automation/index.md Co-authored-by: Jonathan Manning --- docs/en/docs/side_quests/platform_automation/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index e8f821e255..9c7e15417e 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -86,6 +86,8 @@ The directory holds the Terraform and `seqerakit` configurations for each role. └── launch-rnaseq-multiple.yml ``` +We'll cover the content of these files in a moment. + ### Check workspace access This training requires you to be in a workspace. Navigate to [Seqera Platform](https://cloud.seqera.io/) or your Enterprise install and check you can see the relevant workspace which should be under an organization. There should already be credentials pre-configured and if you have Maintain or lower permissions, a compute environment and/or pipeline should already exist. If you cannot see the workspace, please ask your workspace owner to add you to one. From e880543e9ad64b23f2792f6152c95c17e8d17af8 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 18:59:17 +0100 Subject: [PATCH 19/29] docs: tighten up Terraform section and focus on the key points --- .../side_quests/platform_automation/index.md | 118 ++++-------------- 1 file changed, 25 insertions(+), 93 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 9c7e15417e..8a216cc86d 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -176,7 +176,7 @@ The same compute environment can be created with increasing control over the clo Batch Forge is the hands-off option: the Platform reaches into your cloud and creates the resources for you. Most convenient, least control. -In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your cloud platform, and select the credentials for that cloud. The rest of the form differs by provider and your cloud setup; recommended settings: +In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your cloud platform, and select the credentials for that cloud. The rest of the form differs by provider; recommended settings: **AWS** @@ -282,7 +282,7 @@ The manual marker: `head_pool` is set to the pool Terraform just made and there Let's walk the key blocks of `terraform/compute-env/main.tf`. -The first block declares the providers and pins their versions. The `seqera` provider is pinned to exactly `0.40.1`: +The first block declares the providers, pins their versions and sets them up. The `seqera` provider is pinned to exactly `0.40.1`: ```terraform terraform { @@ -294,11 +294,7 @@ terraform { random = { source = "hashicorp/random", version = ">= 3.0" } } } -``` - -Next we configure the providers. The `seqera` provider reads `TOWER_ACCESS_TOKEN` from the environment, so there is no token argument here: -```terraform provider "azurerm" { features {} subscription_id = var.subscription_id @@ -309,6 +305,14 @@ provider "seqera" { } ``` +Let's initialise the Terraform provider: + +```bash +terraform init +``` + +You should see Terraform install the relevant providers and create a lockfile. This makes sure anyone using this Terraform is using the same provider versions. Terraform can and should be shared, so it is very important to make sure everyone uses the same versions! + Next we can define some variables we can use throughout our deployment. In this case, we will set the node sizes and details once and reuse them throughout the configuration: ```terraform @@ -347,7 +351,7 @@ resource "random_string" "suffix" { } ``` -Then the node pools themselves. Terraform creates two pools in Azure Batch with the `azurerm_batch_pool` resource. You can add as many as you like, but the details must match the values the Azure provider expects. Here we start a fixed-size head pool and a dynamically sized worker pool: +Then the node pools themselves. Terraform creates two pools in Azure Batch with the `azurerm_batch_pool` resource. You can add as many as you like, but the details must match the values the Azure provider expects. We won't go into the details of the resource here, you can check them yourself, but you can see how some details refer to variables and outputs of other steps: ```terraform # Head pool: runs the Nextflow head job. One node is enough. @@ -359,79 +363,10 @@ resource "azurerm_batch_pool" "head" { vm_size = local.head_vm_size node_agent_sku_id = local.node_agent_sku_id max_tasks_per_node = local.head_vm_cores - - fixed_scale { - target_dedicated_nodes = 1 - } - - storage_image_reference { - publisher = "microsoft-dsvm" - offer = "ubuntu-hpc" - sku = "2404" - version = "latest" - } - - container_configuration { - type = "DockerCompatible" - } -} - -# Worker pool: runs the pipeline tasks. Autoscales 0..worker_max_nodes. -resource "azurerm_batch_pool" "worker" { - name = "rnaseq-worker-${random_string.suffix.result}" - display_name = "rnaseq worker pool" - resource_group_name = var.batch_account_rg - account_name = var.batch_account_name - vm_size = local.worker_vm_size - node_agent_sku_id = local.node_agent_sku_id - max_tasks_per_node = local.worker_vm_cores - - auto_scale { - evaluation_interval = "PT5M" - formula = <<-FORMULA - pending = avg($PendingTasks.GetSample(180 * TimeInterval_Second)); - $TargetDedicatedNodes = min(${local.worker_max_nodes}, pending); - $NodeDeallocationOption = taskcompletion; - FORMULA - } - - storage_image_reference { - publisher = "microsoft-dsvm" - offer = "ubuntu-hpc" - sku = "2404" - version = "latest" - } - - container_configuration { - type = "DockerCompatible" - } - - # Terraform manages the pool, not its live scale. - lifecycle { - ignore_changes = [auto_scale, fixed_scale] - } -} + # Etc... ``` -Each pool in `main.tf` also carries a `start_task` (elided above) that runs once per node at startup. Forge adds an equivalent task to the pools it creates; manual pools get nothing, so we replicate the essential parts: install `azcopy` (Nextflow's Azure Batch executor uses it to stage data) and register the AppArmor profile Fusion needs on Ubuntu 24.04 nodes. See the `node_start_task_script` local in the file for the full script. - -Once we've built the Azure Batch node pools, we add the Seqera Platform compute environment that points to them. The compute environment needs Azure credentials to talk to your cloud. We added those to the workspace earlier (see Prerequisites), so we look them up by name rather than storing keys here. The `seqera_credentials` data source lists the credentials in the workspace, and we pick out the one whose name matches: - -```terraform -# Azure credentials already stored in the Platform, looked up by name. -data "seqera_credentials" "all" { - workspace_id = var.workspace_id -} - -locals { - azure_credentials_id = one([ - for c in data.seqera_credentials.all.credentials : c.id - if c.name == var.azure_credential_name - ]) -} -``` - -Finally, the compute environment itself. This is the manual marker in code: `head_pool` points at the pool we just created and `nextflow_config` routes tasks to the worker pool's queue. `enable_wave` and `enable_fusion` turn on Wave (container provisioning) and the Fusion file system, the same checkboxes you would tick in the UI; with Fusion enabled, Wave must be too. Because it references `azurerm_batch_pool.head.name` and `azurerm_batch_pool.worker.name`, Terraform knows to create the pools first: +Once we've built the Azure Batch node pools, we add the Seqera Platform compute environment that points to them. This is the manual marker in code: `head_pool` points at the pool we just created and `nextflow_config` routes tasks to the worker pool's queue. Because they reference `azurerm_batch_pool.head.name` and `azurerm_batch_pool.worker.name` respectively, Terraform knows to create the pools on Azure Batch first: ```terraform resource "seqera_compute_env" "main" { @@ -457,27 +392,24 @@ resource "seqera_compute_env" "main" { } ``` -The last block is the output the next tier needs: - -```terraform -output "compute_env_id" { - value = seqera_compute_env.main.compute_env_id -} -``` - -Terraform reads those references and works out the order itself: pools first, then the compute environment that depends on them. - -Now, we can run Terraform to apply these changes. +Now, we can run Terraform to apply these changes, where it will create our Azure Batch pools and then the Seqera Platform compute environment. ```bash -# you may need to log in to the cloud provider with `az login` -terraform init terraform apply ``` After you run `terraform apply`, it will ask you to fill in the details defined in `variables.tf` -!!! tip "Tearing it down" +- `subscription_id` is the subscription of your Azure account, which you can find in the Azure Portal under **Subscriptions**. +- `workspace_id` is the numeric workspace ID you exported in section 0. +- `region` is the Azure region you want to deploy to, e.g. `eastus`. +- `work_dir` is the Azure Blob work directory you want to use, e.g. `az://work`. +- `batch_account_name` is the name of the Azure Batch account you want to use, which you can find in the Azure Portal under **Batch accounts**. +- `batch_account_rg` is the resource group of the Azure Batch account you want to use, which you can find in the Azure Portal under **Batch accounts**. +- `azure_credentials_name` is the ID of the Azure credentials you want to use, which you can find in the Platform under **Credentials**. +- `server_url` is the URL of your Seqera Platform instance, which you can find in the Platform under **Settings**. This will default to the cloud instance of Seqera Platform by default. + +!!! tip "Re-using variables" You can save them as a .tfvars file and Terraform will read them automatically, so you don't have to type them each time. See `terraform.tfvars.example` for the full variable reference. Alternatively, you can save them as an environment variable preceded by `TF_VAR_`, for example `TF_VAR_subscription_id=00000000-0000-0000-0000-000000000000`. @@ -494,7 +426,7 @@ On the Platform side, read the ID Terraform produced: terraform output compute_env_id ``` -On the Azure side, open the Batch account in the portal. You will see the head and worker pools Terraform created, sitting idle with no jobs yet. Once you launch a pipeline (sections 2 and 3), jobs and tasks stack onto these pools, and you can drill into a task's logs and exit code. That is the whole point of the Admin tier: the Platform submits to Azure Batch, and Azure Batch runs the work. Maintain- and Launch-role users see only the compute environment in the workspace, not the cloud behind it. +If you have access to the Azure side, open the Batch account in the portal. You will see the head and worker pools Terraform created, sitting idle with no jobs yet. Once you launch a pipeline (sections 2 and 3), jobs and tasks stack onto these pools, and you can drill into a task's logs and exit code. That is the whole point of the Admin tier: to create cloud resources for other users to work on. Maintain- and Launch-role users see only the compute environment in the workspace, not the cloud behind it. ### Takeaway From ffa1ee02936af8115404a2d64d78006cd41f5a9e Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 19:02:41 +0100 Subject: [PATCH 20/29] docs: remove 'hamburger' --- docs/en/docs/side_quests/platform_automation/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 8a216cc86d..a6be59cda6 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -456,7 +456,7 @@ In the workspace, open the **Launchpad** and click **Add pipeline**. Fill in the Click **Add**. The pipeline appears on the Launchpad with no run started. Adding a pipeline only saves a launch configuration; it does not run anything. -To remove from the workspace, you can click the hamburger menu on the top right and click **Delete**. +To remove from the workspace, you can click the menu button on the top right and click **Delete**. ### 2.2. Add a pipeline via `tw` From b4de114828c9b695a58502a5fa12eb97700b27f2 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Thu, 18 Jun 2026 19:28:49 +0100 Subject: [PATCH 21/29] docs: apply Jon's review feedback to Platform Automation quest - Correct forge-ce.json to the flat discriminator-keyed shape tw export emits - Add titles and hl_lines to the Terraform/pipeline code blocks - Wrap command output in collapsible ??? success blocks (house style) - Add tw pipelines list step so the Launchpad pipeline is visible - Note the quest assumes Azure Batch after 1.1 - Make the tw compute-env a placeholder and delete an explicit pre-Terraform step - Voice/casing/run-on cleanups; drop the removed seqerakit add-rnaseq.yml Generated by Claude Code --- .../side_quests/platform_automation/index.md | 195 ++++++++---------- .../seqerakit/add-rnaseq.yml | 18 -- 2 files changed, 85 insertions(+), 128 deletions(-) delete mode 100644 side-quests/platform_automation/seqerakit/add-rnaseq.yml diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index a6be59cda6..95aec85ca2 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -80,8 +80,7 @@ The directory holds the Terraform and `seqerakit` configurations for each role. │ ├── main.tf │ ├── variables.tf │ └── terraform.tfvars.example - └── seqerakit # sections 2 & 3: add and launch a pipeline - ├── add-rnaseq.yml + └── seqerakit # section 3 (Launch): launch a pipeline ├── launch-rnaseq.yml └── launch-rnaseq-multiple.yml ``` @@ -99,13 +98,13 @@ We authenticate to the Platform to tell it who we are. That is what grants the p 1. In the Platform, open the user menu (top right) and choose **Your tokens**. 2. Click **Add token**, name it (e.g. `platform-automation`), and click **Add**. 3. Copy the token now. The Platform shows it only once. -4. In the Codespace terminal, export it under both names: +4. In the Codespace terminal, export it: ```bash export TOWER_ACCESS_TOKEN= ``` -Terraform, `tw`, and `seqerakit` all read the token from these variables. Check it worked: +Terraform, `tw`, and `seqerakit` all read the token from this variable. Check it worked: ```bash tw info @@ -170,7 +169,13 @@ We set this by hand rather than reading `$USER`: in the Codespace everyone share **Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI (e.g. `aws sso login`). There must be valid credentials in the workspace to perform the operations in the Cloud and build compute environments, please check the Seqera documentation for further details. -The same compute environment can be created with increasing control over the cloud. We build it two ways. +The same compute environment can be created with increasing control over the cloud. +You'll build it two ways. + +!!! note "This quest uses Azure Batch" + + Section 1.1 covers both AWS and Azure, but everything after it (the `tw` export, the Terraform, and the `az://work` work directory used throughout) assumes an Azure Batch compute environment. + AWS and GCP users can follow the same pattern, but the provider-specific resources and work-directory paths will differ. ### 1.1. Click-ops a compute environment with Batch Forge @@ -225,30 +230,26 @@ tw compute-envs export forge-ce.json --name="" `tw` reads the workspace from `TOWER_WORKSPACE_ID` (set in section 0), so no `--workspace` flag is needed. The file `forge-ce.json` is the compute environment as the API stores it: -```json title="forge-ce.json" +```json title="forge-ce.json" hl_lines="2 7" { - "computeEnv": { - "name": "azure-batch", - "platform": "azure-batch", - "config": { - "workDir": "az://work", - "region": "eastus", - "waveEnabled": true, - "fusion2Enabled": true, - "forge": { - "headPool": { - "vmType": "Standard_D2s_v3", - "vmCount": 1, - "autoScale": true - }, - "workerPool": { - "vmType": "Standard_D4s_v3", - "vmCount": 4, - "autoScale": true - }, - "disposeOnDeletion": true - } - } + "discriminator": "azure-batch", + "region": "eastus", + "workDir": "az://work", + "waveEnabled": true, + "fusion2Enabled": true, + "forge": { + "headPool": { + "vmType": "Standard_D2s_v3", + "vmCount": 1, + "autoScale": true + }, + "workerPool": { + "vmType": "Standard_D4s_v3", + "vmCount": 4, + "autoScale": true + }, + "disposeOnDeletion": true, + "dualPoolConfig": true } } ``` @@ -280,11 +281,12 @@ Terraform manages cloud resources declaratively: you describe what should exist The manual marker: `head_pool` is set to the pool Terraform just made and there is **no `forge` block**. That one difference is what makes the compute environment manual instead of Forge. `nextflow_config` routes tasks to the worker pool. -Let's walk the key blocks of `terraform/compute-env/main.tf`. +The whole file is in the repo to read at your own pace, and most of it is standard Terraform: the providers, the locals, and the two Azure Batch pools. +Only one block encodes the lesson that makes this compute environment _manual_, so we'll focus there and treat the rest as reference. The first block declares the providers, pins their versions and sets them up. The `seqera` provider is pinned to exactly `0.40.1`: -```terraform +```terraform title="terraform/compute-env/main.tf" hl_lines="5" terraform { required_version = ">= 1.9" @@ -315,7 +317,7 @@ You should see Terraform install the relevant providers and create a lockfile. T Next we can define some variables we can use throughout our deployment. In this case, we will set the node sizes and details once and reuse them throughout the configuration: -```terraform +```terraform title="terraform/compute-env/main.tf" hl_lines="2 3" locals { head_vm_size = "Standard_E4ds_v5" worker_vm_size = "Standard_E16ds_v5" @@ -332,7 +334,7 @@ locals { Next we can refer to resources that already exist. These are called `data` in Terraform. Here we refer to the Azure Batch account: -```terraform +```terraform title="terraform/compute-env/main.tf" # Existing Azure resources the customer owns. Referenced, not managed. data "azurerm_batch_account" "existing" { name = var.batch_account_name @@ -342,7 +344,7 @@ data "azurerm_batch_account" "existing" { Now the resources Terraform does create. The pool names must stay unique across re-creates, so we first generate a short random suffix to append to them: -```terraform +```terraform title="terraform/compute-env/main.tf" # Keeps pool names unique across re-creates. resource "random_string" "suffix" { length = 6 @@ -353,7 +355,7 @@ resource "random_string" "suffix" { Then the node pools themselves. Terraform creates two pools in Azure Batch with the `azurerm_batch_pool` resource. You can add as many as you like, but the details must match the values the Azure provider expects. We won't go into the details of the resource here, you can check them yourself, but you can see how some details refer to variables and outputs of other steps: -```terraform +```terraform title="terraform/compute-env/main.tf" # Head pool: runs the Nextflow head job. One node is enough. resource "azurerm_batch_pool" "head" { name = "rnaseq-head-${random_string.suffix.result}" @@ -368,7 +370,7 @@ resource "azurerm_batch_pool" "head" { Once we've built the Azure Batch node pools, we add the Seqera Platform compute environment that points to them. This is the manual marker in code: `head_pool` points at the pool we just created and `nextflow_config` routes tasks to the worker pool's queue. Because they reference `azurerm_batch_pool.head.name` and `azurerm_batch_pool.worker.name` respectively, Terraform knows to create the pools on Azure Batch first: -```terraform +```terraform title="terraform/compute-env/main.tf" hl_lines="14 17" resource "seqera_compute_env" "main" { workspace_id = var.workspace_id @@ -442,76 +444,33 @@ One compute environment, three levels of control: Forge in the UI (easiest, the **Requires:** Maintain role, and a `compute_env_id` (from section 1 or an Admin on your team) plus the numeric `workspace_id`. Maintain manages pipelines, not compute environments. That split is deliberate: Admin owns the compute environment, you own your pipelines. -You add the same pipeline, `rnaseq-nf-$WORKSHOP_USER`, four ways. The first three are imperative, you run a command and it acts. The last, Terraform, is declarative. Watch what happens when you run each one twice. - -### 2.1. Add a pipeline via the UI +You add the same pipeline, `rnaseq-nf-$WORKSHOP_USER`, two ways. The first, `tw`, is imperative: you run a command and it acts. The second, Terraform, is declarative. Watch what happens when you run each one twice. -In the workspace, open the **Launchpad** and click **Add pipeline**. Fill in the form: +### 2.1. Add a pipeline via `tw` -- **Name**: `rnaseq-nf-` followed by your handle, e.g. `rnaseq-nf-ada` (the handle you exported as `WORKSHOP_USER` in section 0). -- **Compute environment**: the one from section 1, e.g. `azure-batch-manual`. -- **Pipeline to launch**: `https://github.com/nextflow-io/rnaseq-nf`. -- **Revision**: `master`. -- **Work directory**: your Azure Blob work dir, e.g. `az://work`. - -Click **Add**. The pipeline appears on the Launchpad with no run started. Adding a pipeline only saves a launch configuration; it does not run anything. - -To remove from the workspace, you can click the menu button on the top right and click **Delete**. - -### 2.2. Add a pipeline via `tw` - -The CLI does the same thing in one command: +The CLI adds a pipeline in one command. +Set `--compute-env` to a compute environment in your workspace (if you ran section 1, that is `azure-batch-manual`): ```bash tw pipelines add \ --name="rnaseq-nf-$WORKSHOP_USER" \ - --compute-env="azure-batch-manual" \ + --compute-env="" \ --work-dir="az://work" \ --revision="master" \ https://github.com/nextflow-io/rnaseq-nf ``` -Run it again and `tw` errors: a pipeline with that name already exists. The command is imperative, so each invocation tries to add a pipeline; it has no notion of "already in the desired state". +Run it again and `tw` errors: a pipeline with that name already exists. The command is imperative, so each invocation tries to add a pipeline; it has no notion of "already in the desired state". To make "add once, and leave it alone after that" the _default_ behaviour, we need a tool that manages existence rather than actions: Terraform. -To remove the pipeline, you can use the `tw` command line again: +The next section adds a pipeline with the same name using Terraform, so delete this one first to start from a clean slate: ```bash tw pipelines delete --name="rnaseq-nf-$WORKSHOP_USER" ``` -### 2.3. Add a pipeline with `seqerakit` - -`seqerakit` is a wrapper over `tw` that reads a YAML file and runs the underlying `tw` commands. It keeps the configuration as code, so a teammate can reproduce the exact same pipeline. `seqerakit/add-rnaseq.yml` describes the pipeline: - -```yaml -pipelines: - - name: "rnaseq-nf-${WORKSHOP_USER}" - url: "https://github.com/nextflow-io/rnaseq-nf" - workspace: "${TOWER_WORKSPACE_ID}" - description: "Added with seqerakit" - compute-env: "azure-batch-manual" - work-dir: "az://work" - revision: "master" -``` - -`seqerakit` expands variables like `${TOWER_WORKSPACE_ID}` and `${WORKSHOP_USER}` from the environment. Both were set in section 0, so just add the pipeline: - -```bash -cd /workspaces/training/side-quests/platform_automation/seqerakit -seqerakit add-rnaseq.yml -``` - -If you run it again, it errors, the same way `tw` did, because the pipeline already exists: - -```console -The pipelines resource already exists and will not be created. Please set 'on_exists: overwrite' to replace the resource or set 'on_exists: ignore' to ignore this error. -``` - -You can force it through with `seqerakit add-rnaseq.yml --overwrite`, which deletes and recreates the pipeline. But that is you telling it to repeat the action. By default, adding twice is an error. To make "add once, and leave it alone after that" the _default_ behaviour, we need a tool that manages existence rather than actions: Terraform. - -### 2.4. Add a pipeline with Terraform +### 2.2. Add a pipeline with Terraform -`side-quests/platform_automation/terraform/pipeline` adds the same pipeline declaratively. You describe the pipeline that should exist; Terraform makes the workspace match. Like the imperative methods above, the config tracks the `master` branch; you will pin it to a release tag below to see Terraform update the pipeline in place. +`side-quests/platform_automation/terraform/pipeline` adds the same pipeline declaratively. You describe the pipeline that should exist; Terraform makes the workspace match. Like the imperative `tw` command above, the config tracks the `master` branch; you will pin it to a release tag below to see Terraform update the pipeline in place. ```bash cd /workspaces/training/side-quests/platform_automation/terraform/pipeline @@ -523,23 +482,31 @@ terraform apply -var="username=$WORKSHOP_USER" -var="workspace_id=" -var="co Copy `terraform.tfvars.example` to `terraform.tfvars` and fill it in so you stop passing `-var` flags. -Open the Launchpad: `rnaseq-nf-$WORKSHOP_USER` is there, with no run. Now apply again: +Confirm it landed, in the UI (open the Launchpad) or from the terminal, the same way you read the compute environment back in section 1.2: ```bash -terraform apply -var="username=$WORKSHOP_USER" -var="workspace_id=" -var="compute_env_id=" +tw pipelines list ``` -```console -No changes. Your infrastructure matches the configuration. +`rnaseq-nf-$WORKSHOP_USER` is there, with no run. Now apply again: + +```bash +terraform apply -var="username=$WORKSHOP_USER" -var="workspace_id=" -var="compute_env_id=" ``` -That is the difference. `tw` and `seqerakit` errored on the second run because they perform an action every time. Terraform manages whether the pipeline **exists**: it is already there, so there is nothing to do. Apply ten times, still one pipeline. This is what keeps you from accumulating competing, half-duplicated resources in a shared workspace. To remove the pipeline, `terraform apply -destroy` with the same vars. +??? success "Command output" + + ```console + No changes. Your infrastructure matches the configuration. + ``` + +That is the difference. `tw` errored on the second run because it performs an action every time. Terraform manages whether the pipeline **exists**: it is already there, so there is nothing to do. Apply ten times, still one pipeline. This is what keeps you from accumulating competing, half-duplicated resources in a shared workspace. To remove the pipeline, `terraform apply -destroy` with the same vars. **Update in place.** Terraform does more than create-or-skip; it reconciles the pipeline to whatever the config says. The config tracks the `master` branch, which moves as the pipeline gets new commits. Pin it to a fixed release tag instead, so every launch runs the same code. Edit one line: in `main.tf`, line 35 of the `launch` block, change the revision from the `master` branch to the `v2.4` release tag. === "After" - ```hcl title="main.tf" hl_lines="4" linenums="32" + ```hcl title="terraform/pipeline/main.tf" hl_lines="4" linenums="32" launch = { pipeline = "https://github.com/nextflow-io/rnaseq-nf" # The master branch moves; pin a release tag (e.g. v2.4) for reproducible launches. @@ -551,7 +518,7 @@ That is the difference. `tw` and `seqerakit` errored on the second run because t === "Before" - ```hcl title="main.tf" hl_lines="4" linenums="32" + ```hcl title="terraform/pipeline/main.tf" hl_lines="4" linenums="32" launch = { pipeline = "https://github.com/nextflow-io/rnaseq-nf" # The master branch moves; pin a release tag (e.g. v2.4) for reproducible launches. @@ -563,19 +530,21 @@ That is the difference. `tw` and `seqerakit` errored on the second run because t Then apply: -```console -Terraform will perform the following actions: +??? success "Command output" - # seqera_pipeline.rnaseq_nf will be updated in-place - ~ resource "seqera_pipeline" "rnaseq_nf" { - ~ launch = { - ~ revision = "master" -> "v2.4" - # (4 unchanged attributes hidden) + ```console + Terraform will perform the following actions: + + # seqera_pipeline.rnaseq_nf will be updated in-place + ~ resource "seqera_pipeline" "rnaseq_nf" { + ~ launch = { + ~ revision = "master" -> "v2.4" + # (4 unchanged attributes hidden) + } } - } -Plan: 0 to add, 1 to change, 0 to destroy. -``` + Plan: 0 to add, 1 to change, 0 to destroy. + ``` One pipeline, modified; not a second pipeline, and not an error. That is the third declarative behaviour, alongside create and no-op: update to match. Moving from a branch to a release tag is exactly the kind of change you want under version control: the pinned revision is now recorded in `main.tf`. @@ -587,7 +556,7 @@ One pipeline, modified; not a second pipeline, and not an error. That is the thi ### Takeaway -Four ways to add one pipeline, two mental models. `tw` and `seqerakit` are imperative: each run is an action, and adding twice is an error. Terraform is declarative: it manages existence, so a second apply is a no-op or an update-in-place. The artifact you hand to the Launch tier is the Launchpad pipeline `rnaseq-nf-$WORKSHOP_USER`. +Two ways to add one pipeline, two mental models. `tw` is imperative: each run is an action, and adding twice is an error. Terraform is declarative: it manages existence, so a second apply is a no-op or an update-in-place. The artifact you hand to the Launch tier is the Launchpad pipeline `rnaseq-nf-$WORKSHOP_USER`. --- @@ -609,11 +578,13 @@ tw launch rnaseq-nf-$WORKSHOP_USER It should show something like: -```console - Workflow 2ZXaU1AzEn7Onk submitted at [Organization / Workspace] workspace. +??? success "Command output" - https://cloud.seqera.io/orgs/Organization/workspaces/Workspace/watch/2ZXaU1AzEn7Onk -``` + ```console + Workflow 2ZXaU1AzEn7Onk submitted at [Organization / Workspace] workspace. + + https://cloud.seqera.io/orgs/Organization/workspaces/Workspace/watch/2ZXaU1AzEn7Onk + ``` You can monitor the run by clicking the provided URL. @@ -635,7 +606,11 @@ seqerakit launch-rnaseq.yml # launches for real The dry run shows the underlying `tw` command. Run it twice and you get two runs. That is the imperative model: do the thing, now. -One advantage of using Seqerakit is the YAML forms a template of actions to perform. Because of this we can do two more things: firstly, we can save it and re-use it later. Secondly, we can launch the same pipeline several times by adding more launch blocks to the YAML file. This is useful if you want to launch the same pipeline with different parameters or on different compute environments. Let's try and launch the pipeline now with +One advantage of `seqerakit` is that the YAML forms a template of actions to perform. +This buys you two things. +First, you can save it and re-use it later. +Second, you can launch the same pipeline several times by adding more launch blocks to the YAML file, which is useful for launching with different parameters or on different compute environments. +Launch the pipeline now with: ```bash seqerakit launch-rnaseq-multiple.yml diff --git a/side-quests/platform_automation/seqerakit/add-rnaseq.yml b/side-quests/platform_automation/seqerakit/add-rnaseq.yml deleted file mode 100644 index 804d3a3819..0000000000 --- a/side-quests/platform_automation/seqerakit/add-rnaseq.yml +++ /dev/null @@ -1,18 +0,0 @@ -# Add rnaseq-nf-$WORKSHOP_USER to the Launchpad (the imperative contrast to Terraform). -# -# This ADDS a pipeline to the Launchpad. It does not launch it. Re-running errors -# unless you pass --overwrite, because the pipeline already exists. That is the -# imperative model: each run is an action, not a desired state. -# -# seqerakit expands ${WORKSHOP_USER} from the environment. Export it first -# (see section 0): a short, unique, dot-free handle for the shared workspace. -# -# Set the workspace and compute-env names to match your workshop workspace. -pipelines: - - name: "rnaseq-nf-${WORKSHOP_USER}" - url: "https://github.com/nextflow-io/rnaseq-nf" - workspace: "${TOWER_WORKSPACE_ID}" - description: "Added with seqerakit" - compute-env: "azure-batch-manual" - work-dir: "az://work" - revision: "master" From cf8756d9d81b476064993deab27bb92b25958c00 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Fri, 19 Jun 2026 17:31:43 +0100 Subject: [PATCH 22/29] docs: Minor fixups and touchups of the guide --- .../side_quests/platform_automation/index.md | 48 +++++++++++++++---- .../terraform/compute-env/main.tf | 4 +- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 95aec85ca2..7e770e108b 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -230,7 +230,7 @@ tw compute-envs export forge-ce.json --name="" `tw` reads the workspace from `TOWER_WORKSPACE_ID` (set in section 0), so no `--workspace` flag is needed. The file `forge-ce.json` is the compute environment as the API stores it: -```json title="forge-ce.json" hl_lines="2 7" +```json title="forge-ce.json" { "discriminator": "azure-batch", "region": "eastus", @@ -307,9 +307,10 @@ provider "seqera" { } ``` -Let's initialise the Terraform provider: +Let's move into the compute env directory and initialise the Terraform provider: ```bash +cd terraform/compute-env terraform init ``` @@ -320,12 +321,12 @@ Next we can define some variables we can use throughout our deployment. In this ```terraform title="terraform/compute-env/main.tf" hl_lines="2 3" locals { head_vm_size = "Standard_E4ds_v5" - worker_vm_size = "Standard_E16ds_v5" + worker_vm_size = "Standard_E8ds_v5" worker_max_nodes = 8 node_agent_sku_id = "batch.node.ubuntu 24.04" # The Platform requires a pool's task slots to equal the node's vCPU count. - # Azure VM size names embed that count (Standard_E16ds_v5 -> 16), so derive it + # Azure VM size names embed that count (Standard_E8ds_v5 -> 8), so derive it # from the size rather than hardcoding a number that can drift out of sync. head_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.head_vm_size)[0]) worker_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.worker_vm_size)[0]) @@ -449,12 +450,15 @@ You add the same pipeline, `rnaseq-nf-$WORKSHOP_USER`, two ways. The first, `tw` ### 2.1. Add a pipeline via `tw` The CLI adds a pipeline in one command. -Set `--compute-env` to a compute environment in your workspace (if you ran section 1, that is `azure-batch-manual`): + +!!! note + + Set the compute-env name to the one you created in section 1.4, or the one your Admin provided. We've left it as `azure-batch-manual` to match the Terraform example above, assuming you won't delete the compute environment in between. ```bash tw pipelines add \ --name="rnaseq-nf-$WORKSHOP_USER" \ - --compute-env="" \ + --compute-env="azure-batch-manual" \ --work-dir="az://work" \ --revision="master" \ https://github.com/nextflow-io/rnaseq-nf @@ -594,6 +598,9 @@ You can monitor the run by clicking the provided URL. ### 3.3. Use `seqerakit` +`seqerakit` is a command-line tool that wraps `tw`, driving it from YAML instead of flags. +Each YAML file declares the resources or actions to perform: here a `launch:` block lists the pipeline, workspace, and compute environment to run, with `${...}` values pulled from the environment. + `seqerakit` launches a pipeline that already exists on the Launchpad, filling in the `tw launch` command from `seqerakit/launch-rnaseq.yml`. `WORKSHOP_USER` is set from section 0; set the compute environment name, dry run first, then launch: ```bash @@ -606,11 +613,34 @@ seqerakit launch-rnaseq.yml # launches for real The dry run shows the underlying `tw` command. Run it twice and you get two runs. That is the imperative model: do the thing, now. +The file you just ran is a single `launch` block: + +```yaml title="seqerakit/launch-rnaseq.yml" +launch: + - name: "rnaseq-nf-${WORKSHOP_USER}-run" + workspace: "${TOWER_WORKSPACE_ID}" + pipeline: "rnaseq-nf-${WORKSHOP_USER}" + compute-env: "${COMPUTE_ENVIRONMENT}" +``` + One advantage of `seqerakit` is that the YAML forms a template of actions to perform. This buys you two things. First, you can save it and re-use it later. -Second, you can launch the same pipeline several times by adding more launch blocks to the YAML file, which is useful for launching with different parameters or on different compute environments. -Launch the pipeline now with: +Second, you can launch the same pipeline several times by adding more launch blocks to the YAML file, which is useful for launching with different parameters or on different compute environments: + +```yaml title="seqerakit/launch-rnaseq-multiple.yml" +launch: + - name: "rnaseq-nf-${WORKSHOP_USER}-run-1" + workspace: "${TOWER_WORKSPACE_ID}" + pipeline: "rnaseq-nf-${WORKSHOP_USER}" + compute-env: "${COMPUTE_ENVIRONMENT}" + - name: "rnaseq-nf-${WORKSHOP_USER}-run-2" + workspace: "${TOWER_WORKSPACE_ID}" + pipeline: "rnaseq-nf-${WORKSHOP_USER}" + compute-env: "${COMPUTE_ENVIRONMENT}" +``` + +Launch both runs now with: ```bash seqerakit launch-rnaseq-multiple.yml @@ -661,4 +691,4 @@ You drove the Seqera Platform programmatically across three roles, each handing ## What's next? -- The AI half of the workshop is the [Building with Seqera AI (CoScientist)](../co_scientist/index.md) side quest. It uses the same `rnaseq-nf` pipeline and API endpoints, but drives them via AI agents. +- [Building with Seqera AI (CoScientist)](../co_scientist/index.md) side quest uses the same `rnaseq-nf` pipeline and API endpoints, but drives them via AI agents instead of manually. diff --git a/side-quests/platform_automation/terraform/compute-env/main.tf b/side-quests/platform_automation/terraform/compute-env/main.tf index 79d9ced4e5..9626893ca2 100644 --- a/side-quests/platform_automation/terraform/compute-env/main.tf +++ b/side-quests/platform_automation/terraform/compute-env/main.tf @@ -29,12 +29,12 @@ provider "seqera" { # Pool sizing and image. Edit here rather than exposing every value as a knob. locals { head_vm_size = "Standard_E4ds_v5" - worker_vm_size = "Standard_E16ds_v5" + worker_vm_size = "Standard_E8ds_v5" worker_max_nodes = 8 node_agent_sku_id = "batch.node.ubuntu 24.04" # The Platform requires a pool's task slots to equal the node's vCPU count. - # Azure VM size names embed that count (Standard_E16ds_v5 -> 16), so derive it + # Azure VM size names embed that count (Standard_E8ds_v5 -> 8), so derive it # from the size rather than hardcoding a number that can drift out of sync. head_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.head_vm_size)[0]) worker_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.worker_vm_size)[0]) From 11f86365c100ff4312e1724491f72446444c477c Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:57:36 +0100 Subject: [PATCH 23/29] build(devcontainer): install platform tools at startup Move terraform, tw (Seqera CLI), and az installs out of devcontainer features and into install-platform-tools.sh, run at container startup via setup.sh. The production training image is only rebuilt on pushes to master, so feature additions never reach an already-published image; installing at startup makes the platform_automation tooling available in every container immediately. The script is idempotent and architecture-aware (amd64 + arm64). Removes the now-unused seqera-cli local feature. Generated by Claude Code --- .../codespaces-dev/devcontainer.json | 6 -- .devcontainer/install-platform-tools.sh | 87 +++++++++++++++++++ .devcontainer/local-dev/devcontainer.json | 6 -- .../seqera-cli/devcontainer-feature.json | 13 --- .../local-features/seqera-cli/install.sh | 39 --------- .devcontainer/setup.sh | 3 + 6 files changed, 90 insertions(+), 64 deletions(-) create mode 100755 .devcontainer/install-platform-tools.sh delete mode 100644 .devcontainer/local-features/seqera-cli/devcontainer-feature.json delete mode 100644 .devcontainer/local-features/seqera-cli/install.sh diff --git a/.devcontainer/codespaces-dev/devcontainer.json b/.devcontainer/codespaces-dev/devcontainer.json index 3628394fab..288df68f74 100644 --- a/.devcontainer/codespaces-dev/devcontainer.json +++ b/.devcontainer/codespaces-dev/devcontainer.json @@ -20,14 +20,8 @@ "version": "latest" }, "ghcr.io/va-h/devcontainers-features/uv": {}, - "ghcr.io/devcontainers/features/terraform:1": { - "version": "1.9.8", - "tflint": "none", - "terragrunt": "none" - }, "../local-features/apptainer": {}, "../local-features/tower-agent": {}, - "../local-features/seqera-cli": {}, "../local-features/nextflow": {}, "../local-features/conda-channels": {}, "../local-features/uv-tools": {} diff --git a/.devcontainer/install-platform-tools.sh b/.devcontainer/install-platform-tools.sh new file mode 100755 index 0000000000..7095802ef1 --- /dev/null +++ b/.devcontainer/install-platform-tools.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash + +# Install the tooling used by the platform_automation side quest: +# - terraform : provision compute environments and pipelines declaratively +# - tw : the Seqera Platform CLI (tower-cli) +# - az : the Azure CLI, used by Terraform's azurerm provider (az login) +# +# These run at container startup (via setup.sh -> onCreateCommand) rather than +# as devcontainer features. The production image (ghcr.io/nextflow-io/training) +# is only rebuilt on pushes to master, so feature additions don't reach an +# already-published image. Installing here makes the tools available in every +# container immediately. +# +# Idempotent (skips tools that are already present) and architecture-aware +# (amd64 + arm64) so re-runs and both CPU families are safe. +set -euo pipefail + +TERRAFORM_VERSION="1.9.8" +TW_VERSION="0.32.0" + +ARCH="$(uname -m)" + +# Make sure the download/extract tools the installs below rely on exist. +ensure_pkg() { + local cmd="$1" pkg="$2" + if ! command -v "${cmd}" >/dev/null 2>&1; then + echo "Installing ${pkg}..." + apt-get update -qq && apt-get install -y -qq "${pkg}" >/dev/null + fi +} + +ensure_pkg curl curl +ensure_pkg unzip unzip + +# --- Terraform ------------------------------------------------------------- +if command -v terraform >/dev/null 2>&1; then + echo "terraform already installed: $(terraform version | head -n1)" +else + case "${ARCH}" in + x86_64 | amd64) tf_arch="amd64" ;; + aarch64 | arm64) tf_arch="arm64" ;; + *) echo "Unsupported architecture for terraform: ${ARCH}" >&2; exit 1 ;; + esac + echo "Installing Terraform ${TERRAFORM_VERSION} (${tf_arch})..." + tmp="$(mktemp -d)" + curl -fSL "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_${tf_arch}.zip" -o "${tmp}/terraform.zip" + unzip -q "${tmp}/terraform.zip" -d "${tmp}" + install -m 0755 "${tmp}/terraform" /usr/local/bin/terraform + rm -rf "${tmp}" +fi + +# --- Seqera CLI (tw) ------------------------------------------------------- +# tower-cli only publishes a native Linux binary for x86_64; on arm64 install +# the architecture-independent JAR (Java is provided by the java feature). +if command -v tw >/dev/null 2>&1; then + echo "tw already installed: $(tw --version 2>/dev/null | head -n1)" +else + base="https://github.com/seqeralabs/tower-cli/releases/download/v${TW_VERSION}" + case "${ARCH}" in + x86_64 | amd64) + echo "Installing Seqera CLI (tw) ${TW_VERSION} native binary for x86_64..." + curl -fSL "${base}/tw-linux-x86_64" -o /usr/local/bin/tw + chmod +x /usr/local/bin/tw + ;; + aarch64 | arm64) + echo "Installing Seqera CLI (tw) ${TW_VERSION} JAR for arm64..." + mkdir -p /usr/local/lib/tw + curl -fSL "${base}/tw-jar.jar" -o /usr/local/lib/tw/tw.jar + cat > /usr/local/bin/tw <<'EOF' +#!/usr/bin/env bash +exec java -jar /usr/local/lib/tw/tw.jar "$@" +EOF + chmod +x /usr/local/bin/tw + ;; + *) echo "Unsupported architecture for tw: ${ARCH}" >&2; exit 1 ;; + esac +fi + +# --- Azure CLI (az) -------------------------------------------------------- +# Microsoft's deb installer sets up the apt repo and pulls the right package +# for the host architecture (amd64 + arm64 are both published). +if command -v az >/dev/null 2>&1; then + echo "az already installed: $(az version --output tsv --query '"azure-cli"' 2>/dev/null | head -n1)" +else + echo "Installing Azure CLI (az)..." + curl -sL https://aka.ms/InstallAzureCLIDeb | bash +fi diff --git a/.devcontainer/local-dev/devcontainer.json b/.devcontainer/local-dev/devcontainer.json index b8bd743d95..0d7a262372 100644 --- a/.devcontainer/local-dev/devcontainer.json +++ b/.devcontainer/local-dev/devcontainer.json @@ -20,14 +20,8 @@ "version": "latest" }, "ghcr.io/va-h/devcontainers-features/uv": {}, - "ghcr.io/devcontainers/features/terraform:1": { - "version": "1.9.8", - "tflint": "none", - "terragrunt": "none" - }, "../local-features/apptainer": {}, "../local-features/tower-agent": {}, - "../local-features/seqera-cli": {}, "../local-features/nextflow": {}, "../local-features/conda-channels": {}, "../local-features/uv-tools": {} diff --git a/.devcontainer/local-features/seqera-cli/devcontainer-feature.json b/.devcontainer/local-features/seqera-cli/devcontainer-feature.json deleted file mode 100644 index 14c7ee69b5..0000000000 --- a/.devcontainer/local-features/seqera-cli/devcontainer-feature.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "seqera-cli", - "name": "Install Seqera CLI (tw)", - "description": "Install the Seqera Platform CLI, tw", - "options": { - "version": { - "type": "string", - "proposals": ["latest", "0.32.0"], - "default": "0.32.0", - "description": "Select or enter a tower-cli version (without the leading v), or 'latest'." - } - } -} diff --git a/.devcontainer/local-features/seqera-cli/install.sh b/.devcontainer/local-features/seqera-cli/install.sh deleted file mode 100644 index 184af807eb..0000000000 --- a/.devcontainer/local-features/seqera-cli/install.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -# Install the Seqera Platform CLI (tw). -# Arch-aware so the multi-architecture image build works on both amd64 and arm64. -# tower-cli only publishes a native Linux binary for x86_64; on arm64 we install -# the architecture-independent JAR (Java is provided by the java feature). -# Only downloads files (no execution), so it is safe under QEMU emulation. -set -eu - -VERSION="${VERSION:-0.32.0}" - -if [ "${VERSION}" = "latest" ]; then - BASE="https://github.com/seqeralabs/tower-cli/releases/latest/download" -else - BASE="https://github.com/seqeralabs/tower-cli/releases/download/v${VERSION}" -fi - -case "$(uname -m)" in - x86_64 | amd64) - echo "Installing Seqera CLI (tw) ${VERSION} native binary for x86_64..." - curl -fSL "${BASE}/tw-linux-x86_64" -o /usr/local/bin/tw - chmod +x /usr/local/bin/tw - ;; - aarch64 | arm64) - # No native Linux arm64 binary is published; use the JAR via Java. - echo "Installing Seqera CLI (tw) ${VERSION} JAR for arm64..." - mkdir -p /usr/local/lib/tw - curl -fSL "${BASE}/tw-jar.jar" -o /usr/local/lib/tw/tw.jar - cat > /usr/local/bin/tw <<'EOF' -#!/usr/bin/env bash -exec java -jar /usr/local/lib/tw/tw.jar "$@" -EOF - chmod +x /usr/local/bin/tw - ;; - *) - echo "Unsupported architecture: $(uname -m)" >&2 - exit 1 - ;; -esac diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh index 0811dfc1c1..5ebc9c136c 100644 --- a/.devcontainer/setup.sh +++ b/.devcontainer/setup.sh @@ -30,4 +30,7 @@ cd /workspaces/training rm -rf /tmp/nf-test ~/.m2/repository echo "nf-test updated with v2 parser support" +# Install the platform_automation side quest tools (terraform, tw, az) +bash "$(dirname "$0")/install-platform-tools.sh" + cat /usr/local/etc/vscode-dev-containers/first-run-notice.txt From b4e6c22a983e5af66816876e29cb34ef1ac913d0 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:35:04 +0100 Subject: [PATCH 24/29] fixups and tidy --- .../side_quests/platform_automation/index.md | 114 ++++++++++-------- .../terraform/compute-env/main.tf | 48 +++----- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 7e770e108b..5273218b34 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -43,9 +43,13 @@ An Admin user will learn how to create compute environments. If you only have Ma ### Open the training codespace -The Codespace contains all the tools you need (Terraform, `tw`, `seqerakit`); you -install nothing yourself. Open it now and read on while it builds; it is ready -when the terminal returns to a prompt. +For this tutorial you will need the following tools: + +- [`tw`](https://github.com/seqeralabs/tower-cli/) +- [`seqerakit`](https://github.com/seqeralabs/seqerakit) +- [Terraform](https://www.terraform.io/) + +The Codespace should already contain all of these tools, but you can verify them by trying their respective CLI commands. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/nextflow-io/training?quickstart=1&ref=master) @@ -54,7 +58,7 @@ when the terminal returns to a prompt. The Codespace terminal opens at the repository root (`/workspaces/training`). All the assets for this side quest live under `side-quests/platform_automation/`, so move there now: ```bash -cd /workspaces/training/side-quests/platform_automation +cd side-quests/platform_automation ``` Focus VSCode on this directory so the file explorer shows the assets you'll edit: @@ -174,38 +178,69 @@ You'll build it two ways. !!! note "This quest uses Azure Batch" - Section 1.1 covers both AWS and Azure, but everything after it (the `tw` export, the Terraform, and the `az://work` work directory used throughout) assumes an Azure Batch compute environment. - AWS and GCP users can follow the same pattern, but the provider-specific resources and work-directory paths will differ. + Section 1.1 covers AWS, Azure, GCP, on-prem HPC, and Kubernetes, but everything after it (the `tw` export, the Terraform, and the `az://work` work directory used throughout) assumes an Azure Batch compute environment. + Users on other providers can follow the same pattern, but the provider-specific resources and work-directory paths will differ. + +### 1.1. Create a compute environment in the UI + +On the cloud Batch providers (AWS, Azure, GCP), the UI offers **Batch Forge**: the hands-off option where the Platform reaches into your cloud and creates the resources for you. Most convenient, least control. On-prem HPC clusters and Kubernetes use a different, non-Forge flow: the cluster already exists and you point the Platform at it. + +In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your platform, and select the credentials for it. The rest of the form differs by provider. Select yours below for recommended settings: + +=== "AWS" -### 1.1. Click-ops a compute environment with Batch Forge + - Region + - Work directory (S3 bucket) + - Config mode should be Batch Forge + - Provisioning model should be Spot, using Spot instances for nodes which run Nextflow tasks. -Batch Forge is the hands-off option: the Platform reaches into your cloud and creates the resources for you. Most convenient, least control. +=== "Azure" -In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your cloud platform, and select the credentials for that cloud. The rest of the form differs by provider; recommended settings: + - Location + - Work directory (Azure Storage container) + - Select "Separate head and worker pools" to create one pool for the Nextflow head job and a separate pool for the tasks. + - For the head pool VM type, select a VM you have sufficient quota for. Standard_D2s_v3 (2 CPUs) is a good starting choice. + - Set the head pool VM count to 1. The head pool runs a single Nextflow head job; it does not need more. + - For the worker pool, select a VM type you have sufficient quota for. Standard_D4s_v3 (4 CPUs) is a good starting choice. + - Set the worker pool VM count to 4 + - Leave autoscaling enabled for both pools -**AWS** +=== "GCP" -- Region -- Work directory (S3 bucket) -- Wave, Fusion, Fast Instance should all be enabled -- Config mode should be Batch Forge -- Provisioning model should be Spot, using Spot instances for nodes which run Nextflow tasks. + - Location (region) + - Work directory (Cloud Storage bucket, e.g. `gs://my-bucket`) + - Enable Spot instances under GCP Resources to reduce cost. + - Config mode should be Batch Forge -**Azure** +=== "On-prem / HPC" -- Location -- Work directory (Azure Storage container) -- Wave and Fusion should be enabled. -- Select "Separate head and worker pools" to create one pool for the Nextflow head job and a separate pool for the tasks. -- For the head pool VM type, select a VM you have sufficient quota for. Standard_D2s_v3 (2 CPUs) is a good starting choice. -- Set the head pool VM count to 1. The head pool runs a single Nextflow head job; it does not need more. -- For the worker pool, select a VM type you have sufficient quota for. Standard_D4s_v3 (4 CPUs) is a good starting choice. -- Set the worker pool VM count to 4 -- Leave autoscaling enabled for both pools + This is **not** Batch Forge: no pools are created for you. The cluster already exists and the Platform submits to it over SSH or the Tower Agent. -Leave the other settings at their defaults. Keep **Dispose resources** enabled so the pool is torn down when you delete the compute environment. Click **Add** in the top right. + - Compute platform: your scheduler (Slurm, LSF, PBS Pro, Grid Engine, Moab) + - Credentials (SSH key or Tower Agent) + - Login hostname: the cluster's login node + - Work directory: an absolute path on the shared filesystem + - Launch directory (defaults to the work directory if omitted) + - Head queue name: the queue the Nextflow head job submits to + - Compute queue name: the queue Nextflow submits tasks to -Watch your cloud console and you will see Forge create the resources: an identity and roles for Nextflow (access to blob storage and the Batch service), a more limited role for the worker tasks (storage only), the pools, and their networking. Many moving parts, all handled for you. +=== "Kubernetes" + + Also **not** Batch Forge: a manual flow against a cluster you prepare first (apply a YAML manifest creating the service accounts and role bindings). + + - Credentials (service-account token or X509 client certificate) + - Control-plane URL (from `kubectl cluster-info`) + - SSL certificate (from `~/.kube/config`) + - Namespace (default `tower-nf`) + - Head service account (default `tower-launcher-sa`) + - Storage claim name (default `tower-scratch`) + - Storage mount path (default `/scratch`) + - Work directory: the storage mount path or a subdirectory of it + - Head job CPUs and memory + +On the cloud Batch providers (AWS, Azure, GCP), leave the other settings at their defaults, keep **Dispose resources** enabled so the pool is torn down when you delete the compute environment, and click **Add** in the top right. + +Watch your cloud console and you will see Forge create the resources: an identity and roles for Nextflow (access to blob storage and the Batch service), a more limited role for the worker tasks (storage only), the pools, and their networking. Many moving parts, all handled for you. The on-prem and Kubernetes paths have nothing to forge; they submit to infrastructure you already run. That convenience is the trade-off: Forge owns those resources and gives you little control. A lab that already runs on managed infrastructure wants the opposite, to describe the resources itself and wire the Platform to them. That is the Terraform path. @@ -333,28 +368,7 @@ locals { } ``` -Next we can refer to resources that already exist. These are called `data` in Terraform. Here we refer to the Azure Batch account: - -```terraform title="terraform/compute-env/main.tf" -# Existing Azure resources the customer owns. Referenced, not managed. -data "azurerm_batch_account" "existing" { - name = var.batch_account_name - resource_group_name = var.batch_account_rg -} -``` - -Now the resources Terraform does create. The pool names must stay unique across re-creates, so we first generate a short random suffix to append to them: - -```terraform title="terraform/compute-env/main.tf" -# Keeps pool names unique across re-creates. -resource "random_string" "suffix" { - length = 6 - special = false - upper = false -} -``` - -Then the node pools themselves. Terraform creates two pools in Azure Batch with the `azurerm_batch_pool` resource. You can add as many as you like, but the details must match the values the Azure provider expects. We won't go into the details of the resource here, you can check them yourself, but you can see how some details refer to variables and outputs of other steps: +Now the resources Terraform does create. In this code, Terraform creates two pools in Azure Batch with the `azurerm_batch_pool` resource. You can add as many as you like, but the details must match the values the Azure provider expects. We won't go into the details of the resource here, you can check them yourself, but you can see how some details refer to variables and outputs of other steps: ```terraform title="terraform/compute-env/main.tf" # Head pool: runs the Nextflow head job. One node is enough. @@ -386,9 +400,9 @@ resource "seqera_compute_env" "main" { region = var.region work_dir = var.work_dir head_pool = azurerm_batch_pool.head.name + worker_pool = azurerm_batch_pool.worker.name enable_wave = true enable_fusion = true - nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" } } } diff --git a/side-quests/platform_automation/terraform/compute-env/main.tf b/side-quests/platform_automation/terraform/compute-env/main.tf index 9626893ca2..ee00b4d61b 100644 --- a/side-quests/platform_automation/terraform/compute-env/main.tf +++ b/side-quests/platform_automation/terraform/compute-env/main.tf @@ -12,14 +12,15 @@ terraform { required_providers { seqera = { source = "seqeralabs/seqera", version = "0.40.1" } - azurerm = { source = "hashicorp/azurerm", version = ">= 3.0" } + azurerm = { source = "hashicorp/azurerm", version = ">= 4.0" } random = { source = "hashicorp/random", version = ">= 3.0" } } } provider "azurerm" { features {} - subscription_id = var.subscription_id + subscription_id = var.subscription_id + resource_provider_registrations = "none" } provider "seqera" { @@ -36,25 +37,8 @@ locals { # The Platform requires a pool's task slots to equal the node's vCPU count. # Azure VM size names embed that count (Standard_E8ds_v5 -> 8), so derive it # from the size rather than hardcoding a number that can drift out of sync. - head_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.head_vm_size)[0]) - worker_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.worker_vm_size)[0]) -} - -# Keeps pool names unique across re-creates. -resource "random_string" "suffix" { - length = 6 - special = false - upper = false -} - -# Manual pools (head_pool set, no forge block) don't receive the node start task -# that Forge adds to auto-created pools, so we replicate its essential parts: -# 1. Install azcopy on the shared node path. Nextflow's Azure Batch executor -# uses it to stage data; manual pools must provide it. -# 2. Register the AppArmor profile Fusion needs on Ubuntu 24.04+ nodes. Without -# it, container init fails with "unable to apply apparmor profile" -# (COMP-1248, moby/moby#50013, launchpad #2111105). -locals { + head_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.head_vm_size)[0]) + worker_vm_cores = tonumber(regex("^Standard_[A-Z]+([0-9]+)", local.worker_vm_size)[0]) node_start_task_script = <<-SCRIPT set -euo pipefail @@ -87,10 +71,11 @@ locals { pool_start_command = "/bin/bash -c 'echo ${base64encode(local.node_start_task_script)} | base64 -d | bash'" } -# Existing Azure resources the customer owns. Referenced, not managed. -data "azurerm_batch_account" "existing" { - name = var.batch_account_name - resource_group_name = var.batch_account_rg +# Keeps pool names unique across re-creates. +resource "random_string" "suffix" { + length = 6 + special = false + upper = false } # Head pool: runs the Nextflow head job. One node is enough. @@ -207,14 +192,15 @@ resource "seqera_compute_env" "main" { platform = "azure-batch" credentials_id = local.azure_credentials_id + config = { azure_batch = { - region = var.region - work_dir = var.work_dir - head_pool = azurerm_batch_pool.head.name - enable_wave = true - enable_fusion = true - nextflow_config = "process.queue = '${azurerm_batch_pool.worker.name}'\n" + region = var.region + work_dir = var.work_dir + head_pool = azurerm_batch_pool.head.name + worker_pool = azurerm_batch_pool.worker.name + enable_wave = true + enable_fusion = true } } } From f31229a6a7cedd5424ddfe984d301229c38d31f2 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:38:49 +0100 Subject: [PATCH 25/29] build(devcontainer): add seqerakit to platform tools install Generated by Claude Code --- .devcontainer/install-platform-tools.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.devcontainer/install-platform-tools.sh b/.devcontainer/install-platform-tools.sh index 7095802ef1..646c164f0b 100755 --- a/.devcontainer/install-platform-tools.sh +++ b/.devcontainer/install-platform-tools.sh @@ -3,6 +3,7 @@ # Install the tooling used by the platform_automation side quest: # - terraform : provision compute environments and pipelines declaratively # - tw : the Seqera Platform CLI (tower-cli) +# - seqerakit : YAML-driven wrapper around tw for declarative Platform setup # - az : the Azure CLI, used by Terraform's azurerm provider (az login) # # These run at container startup (via setup.sh -> onCreateCommand) rather than @@ -76,6 +77,17 @@ EOF esac fi +# --- seqerakit ------------------------------------------------------------- +# Pure-Python (arch-independent) wrapper that drives tw from YAML. Installed +# with the conda pip (python.defaultInterpreterPath = /opt/conda/bin/python), +# so no PEP 668 override is needed. Depends on tw being on PATH (installed above). +if command -v seqerakit >/dev/null 2>&1; then + echo "seqerakit already installed: $(seqerakit --version 2>/dev/null | head -n1)" +else + echo "Installing seqerakit..." + pip install --quiet seqerakit +fi + # --- Azure CLI (az) -------------------------------------------------------- # Microsoft's deb installer sets up the apt repo and pulls the right package # for the host architecture (amd64 + arm64 are both published). From f2a8430c9259d8ca5088c2a0a26287cd3b0b0845 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 22 Jun 2026 17:07:46 +0100 Subject: [PATCH 26/29] docs: add One API architecture diagram to Platform Automation intro Add an excalidraw-style SVG illustrating the "one API, every interface" thesis: Web/CLI/Terraform clients drive a single Seqera Platform API, which orchestrates GitHub, the cloud, and containers underneath. Placed after the opening paragraphs of the side quest intro. Filled shapes use (not ) so they survive the repo's `.excalidraw svg rect { fill: transparent }` rule, and text uses font-family="inherit" to match the site font. Generated by Claude Code --- .../img/one-api.excalidraw.svg | 91 +++++++++++++++++++ .../side_quests/platform_automation/index.md | 4 + 2 files changed, 95 insertions(+) create mode 100644 docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg diff --git a/docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg b/docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg new file mode 100644 index 0000000000..1d9c24661b --- /dev/null +++ b/docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + Web + + + + + + + CLI + + + + + + + + Terraform + + + + + + + + + API + + STANDARD INTERFACE + + + + + + + seqera + PLATFORM + + + + + + + + + + + + GitHub + + + + + + + Cloud + + AWS + + Azure + + GCP + + + + + + + + + + + + + Containers + diff --git a/docs/en/docs/side_quests/platform_automation/index.md b/docs/en/docs/side_quests/platform_automation/index.md index 5273218b34..335bc40645 100644 --- a/docs/en/docs/side_quests/platform_automation/index.md +++ b/docs/en/docs/side_quests/platform_automation/index.md @@ -6,6 +6,10 @@ It hands jobs to a compute environment, the compute environment runs them on clo Everything the web UI does, it does by calling the Platform API. So everything is automatable: with the API, Terraform, and the CLI you can manage compute environments, pipelines, and runs as code, with no clicking. This side quest walks that programmatic surface from the most privileged role to the least. +
+--8<-- "docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg" +
+ ### Learning goals In this side quest, we'll drive the Platform across three workspace roles of decreasing permission: **Admin**, **Maintain**, and **Launch**. Each role does one job and hands an artifact to the next. You'll learn how to: From f0c984fb45278477bb4b05d32eecb5c947a77342 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Mon, 22 Jun 2026 18:27:19 +0200 Subject: [PATCH 27/29] [ DO NOT MERGE ] Side quest/co scientist (#963) * Scaffold CoScientist side quest nav and image dir Co-Authored-By: Claude Opus 4.8 (1M context) * Add CoScientist side quest overview page * Polish CoScientist overview prose * Add CoScientist orientation page Co-Authored-By: Claude Sonnet 4.6 * Fix admonition indentation on orientation page * Add CoScientist intro and MCP concept page Co-Authored-By: Claude Sonnet 4.6 * Add CoScientist Platform exploration page * Add CoScientist development page (fork, change, run) Co-Authored-By: Claude Sonnet 4.6 * Add CoScientist debugging page Co-Authored-By: Claude Sonnet 4.6 * Add CoScientist fix-and-PR page * Add CoScientist nf-test feature page Co-Authored-By: Claude Sonnet 4.6 * Add CoScientist survey and next-steps pages Co-Authored-By: Claude Sonnet 4.6 * Make CoScientist What's-next sections clickable links Co-Authored-By: Claude Opus 4.8 (1M context) * Validation fixes for CoScientist side quest Remove em-dash elaborations and backtick process names in the overview. Co-Authored-By: Claude Opus 4.8 (1M context) * Final review fixes for CoScientist side quest Normalize run-status casing to lowercase, add a dataset prompt and checkpoint to the explore-platform page, and flag the chat URL and status casing for verification. Co-Authored-By: Claude Opus 4.8 (1M context) * Restructure CoScientist module for depth expansion Renumber pages to make room for an agent-literacy page and rename the testing page to cover skills. Update nav, cross-links, objectives, and time estimate (~3h). Co-Authored-By: Claude Opus 4.8 (1M context) * Add CoScientist agent-literacy page Co-Authored-By: Claude Opus 4.8 (1M context) * Expand CoScientist testing page with reusable nf-test skill Co-Authored-By: Claude Opus 4.8 (1M context) * Add CoScientist capabilities tour to next-steps * Reinforce agent-literacy with verify steps; fix em-dashes Add verify-the-change and verify-the-diff/PR steps to development and fix pages, and remove em-dash elaborations from the agent-literacy page. Co-Authored-By: Claude Opus 4.8 (1M context) * Polish expanded CoScientist pages from final review Distinguish grounding from intent, flag the MCP log-reading claim, fix checkpoint tense, clarify the skill-file copy step, and trim a redundant verify sentence. Co-Authored-By: Claude Opus 4.8 (1M context) * Reframe MCP and skills to match Seqera docs The CoScientist docs do not describe MCP as CoScientist's internal transport. Scope MCP to the Seqera MCP Server (the interface for external AI assistants) in the concept page, neutralize MCP-as-mechanism claims elsewhere to 'directly / on your behalf', and reframe the skills section as 'Enhance CoScientist with your own skills'. Co-Authored-By: Claude Opus 4.8 (1M context) * Deslop agent-literacy page: cut restated lines Co-Authored-By: Claude Opus 4.8 (1M context) * Ground CoScientist module in real docs and rnaseq-nf facts Resolve flags from authoritative sources: exact seqera ai CLI (install, login, goal mode), documented SKILL.md format under .agents/skills/, sourced MCP explanation, and the AWS/Bedrock enterprise model. Fix the non-existent "test profile" (use -profile docker), make the QUANT break exact (withName memory = 10.MB, OOM exit 137), specify real rnaseq-nf output files in the snapshot table, and ship a SKILL.md plus an illustrative QUANT nf-test under solutions/. Ground the capabilities tour in documented modes, commands, approval, and sessions. Co-Authored-By: Claude Opus 4.8 (1M context) * Consolidate orientation, meet, and explore into one lesson Merge orientation + meet-coscientist + explore-platform into a single "Meet CoScientist" lesson (7 sections: connect, confirm, capabilities, MCP, survey, add pipeline, inspect CE), preserving all content except the enterprise/foundational-model note, which moves to the wrap-up. Drop the not-yet-true "connected GitHub account" claim and the /seqera-mcp CLI reference from the web-first lesson. Renumber remaining pages to six lessons and fix nav, cross-links, and the get-started button. Co-Authored-By: Claude Opus 4.8 (1M context) * Deslop the agent-literacy lesson tone Replace AI-style section headers and aphorisms (binary contrasts, the "search box" simile, "drifts"/"grounded"/"course-correct" metaphors, the tricolon takeaway) with the plainer imperative voice used across the other side quests. Co-Authored-By: Claude Opus 4.8 (1M context) * Make the agent-literacy lesson hands-on Rebuild lesson 2 around a concrete user-level exercise: launch rnaseq-nf with a bad transcriptome parameter, then practise prompting for intent, verifying the diagnosis against the real error, and redirecting the agent to fix the launch parameter without touching pipeline code. Every section now has an action and a checkpoint instead of pure prose. Co-Authored-By: Claude Opus 4.8 (1M context) * Clarify lesson 2 fix is reverting to the bundled default Make explicit that rnaseq-nf ships its default transcriptome, so the fix is dropping the bad override rather than sourcing data. Avoids implying CoScientist needs separate data access. Co-Authored-By: Claude Opus 4.8 (1M context) * Surface the CLI switch and add a why-use-the-CLI section Co-Authored-By: Claude Opus 4.8 * Restructure dev journey and apply Slack review feedback Replace the contrived QUANT out-of-memory break/debug/fix arc with a constructive developer journey, removing the redundant second failure (the user-level debugging journey in lesson 2 is the only staged failure). New CLI-based arc: - 03 Develop on the CLI: switch to the CLI (why-CLI + install), fork rnaseq-nf, add a fastp step via an nf-core module, run it. - 04 Test, add CI, and open a PR: nf-tests (goal mode, snapshot stability), an nf-test GitHub Actions workflow, open the PR. - 05 Build a reusable skill: package the nf-test workflow as a skill. Delete the old development/debugging/fix-and-pr/testing-and-skills lessons; update nav, cross-links, and objectives. Also from review: remove the unsupportable MCP-as-transport claim from lesson 1, deduplicate the lesson 2 intro, and add the bi-directional "Explain with AI" round-trip (Platform to CoScientist) to lesson 2. Co-Authored-By: Claude Opus 4.8 (1M context) * Restructure web/CLI journeys and apply review feedback Web-first developer journey then an explicit CLI switch, plus content fixes from Slack review, a structure/content review, and validation against the real seqera CLI: - Lessons: 01 Meet CoScientist (web; adds a pipeline overview + mermaid DAG, drops the redundant "how it reaches assets" section), 02 Working with the agent (web; user-level failure fix, bidirectional "Explain with AI"), 03 Develop with CoScientist (web; GitHub key, fork, add a fastp step via an nf-core module, open a PR), 04 Move to the CLI (why-CLI, install, pipeline-level nf-test, snapshot stability, goal mode, GHA workflow, update the PR), 05 Build a reusable skill. - Rename/replace old development/debugging/fix/testing lessons; update nav, cross-links, and objectives. - Remove the unsupportable MCP-as-transport claim; move the enterprise foundational-model note to the wrap-up; motivate each lesson intro. - Make the skill scope-agnostic (process or pipeline) to match the pipeline-level test; ship solutions/pipeline.nf.test and an updated SKILL.md. CLI facts validated against seqera 1.10.0 (seqera ai/-c, approval modes, /goal, Plan/Goal modes, SKILL.md, /nextflow-config). Co-Authored-By: Claude Opus 4.8 (1M context) * Fill in TODOs: screenshots, UI labels, manual fork - Confirm the chat URL and embed the landing screenshot (img/chat-landing.png) - Name the Workspace selector in the top nav; drop its flags (visible in landing shot) - Embed the Explain with AI screenshot (img/explain-with-ai.png) - Narrow the lesson-2 failure flag (fast INDEX failure confirmed; overridden-param launch still to verify) - Lesson 3 step 2: the user forks rnaseq-nf manually rather than via CoScientist Co-Authored-By: Claude Opus 4.8 (1M context) * clean up prompts * Correct skills chapter and resolve more TODOs - Skills (lesson 5): SKILL.md files are loaded as SESSION CONTEXT, not exposed as slash commands (only backend skills are). Rewrite "Use the skill" so you don't /-invoke it; you ask for a test and it follows your rules. Add the mkdir+touch step. (Confirmed against the actual docs.) - Lesson 4: restructure into "Fork the repository" (clone + checkout the fastp branch) and "Install the CLI"; restore admonition formatting a formatter had mangled; ground the branch-name pattern. - Resolve TODOs: Launchpad screenshot (#5), overridden-param launch (#6), GitHub token mechanism (#8/#9), fastp/PR flow (#10), PR screenshot (#13). Remaining: web goal mode (#11), generated GHA workflow (#12), Typeform (#14). Co-Authored-By: Claude Opus 4.8 (1M context) * CLI is pre-installed; flag new-session-after-token - Lesson 4: the training environment already has the seqera CLI, so "Start the CLI" just signs in (no npm install). - Lesson 3: after adding the GitHub token, start a new session or CoScientist keeps using the old token. Co-Authored-By: Claude Opus 4.8 (1M context) * docs: consolidate CoScientist prompts to cut agent wait time Lesson 01: merge the connection-check and workspace-survey prompts into one, and add a note on writing good prompts. Lesson 04: fold the assertion-steering guidance into the test-creation prompt and merge the CI-workflow and commit/push prompts, reducing the nf-test flow from five prompts to three. Generated by Claude Code * Update docs/en/docs/side_quests/co_scientist/03_develop_with_coscientist.md Co-authored-by: Jonathan Manning * Update docs/en/docs/side_quests/co_scientist/01_meet_coscientist.md Co-authored-by: Jonathan Manning * Update docs/en/docs/side_quests/co_scientist/02_working_with_the_agent.md Co-authored-by: Jonathan Manning * Update docs/en/docs/side_quests/co_scientist/03_develop_with_coscientist.md Co-authored-by: Jonathan Manning * add seqera cli install instructions * Refine GitHub token instructions in CoScientist develop lesson Co-Authored-By: Claude Opus 4.8 (1M context) --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com> Co-authored-by: Jonathan Manning --- .../co_scientist/01_meet_coscientist.md | 109 ++++++++++++++ .../co_scientist/02_working_with_the_agent.md | 103 ++++++++++++++ .../03_develop_with_coscientist.md | 69 +++++++++ .../co_scientist/04_move_to_the_cli.md | 134 ++++++++++++++++++ .../co_scientist/05_build_a_skill.md | 88 ++++++++++++ .../side_quests/co_scientist/img/.gitkeep | 0 .../co_scientist/img/chat-landing.png | Bin 0 -> 171324 bytes .../co_scientist/img/explain-with-ai.png | Bin 0 -> 190966 bytes .../co_scientist/img/launchpad-rnaseq-nf.png | Bin 0 -> 152972 bytes .../en/docs/side_quests/co_scientist/index.md | 45 ++++++ .../side_quests/co_scientist/next_steps.md | 66 +++++++++ .../co_scientist/solutions/pipeline.nf.test | 27 ++++ .../solutions/write-nf-test/SKILL.md | 29 ++++ .../docs/side_quests/co_scientist/survey.md | 7 + docs/en/docs/side_quests/index.md | 2 + docs/en/mkdocs.yml | 9 ++ 16 files changed, 688 insertions(+) create mode 100644 docs/en/docs/side_quests/co_scientist/01_meet_coscientist.md create mode 100644 docs/en/docs/side_quests/co_scientist/02_working_with_the_agent.md create mode 100644 docs/en/docs/side_quests/co_scientist/03_develop_with_coscientist.md create mode 100644 docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md create mode 100644 docs/en/docs/side_quests/co_scientist/05_build_a_skill.md create mode 100644 docs/en/docs/side_quests/co_scientist/img/.gitkeep create mode 100644 docs/en/docs/side_quests/co_scientist/img/chat-landing.png create mode 100644 docs/en/docs/side_quests/co_scientist/img/explain-with-ai.png create mode 100644 docs/en/docs/side_quests/co_scientist/img/launchpad-rnaseq-nf.png create mode 100644 docs/en/docs/side_quests/co_scientist/index.md create mode 100644 docs/en/docs/side_quests/co_scientist/next_steps.md create mode 100644 docs/en/docs/side_quests/co_scientist/solutions/pipeline.nf.test create mode 100644 docs/en/docs/side_quests/co_scientist/solutions/write-nf-test/SKILL.md create mode 100644 docs/en/docs/side_quests/co_scientist/survey.md diff --git a/docs/en/docs/side_quests/co_scientist/01_meet_coscientist.md b/docs/en/docs/side_quests/co_scientist/01_meet_coscientist.md new file mode 100644 index 0000000000..d895d33bd9 --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/01_meet_coscientist.md @@ -0,0 +1,109 @@ +# Meet CoScientist + +Working on the Seqera Platform means moving between the Launchpad, compute environments, datasets, and runs. +CoScientist can drive all of that from a conversation, once it is connected to your workspace. +In this lesson you open the chat, connect it to your training workspace, and have it inspect and register real Platform assets, so the rest of the course has a working agent to build on. + +--- + +## 1. Open the chat and connect to your workspace. + +Navigate to [https://ai.seqera.io/chat](https://ai.seqera.io/chat) and sign in with your Seqera credentials. + +![The CoScientist chat after signing in](img/chat-landing.png) + +Use the **Workspace** selector in the top navigation to choose the provided training workspace. + +## 2. Confirm the connection and survey the workspace. + +!!! tip "Writing good prompts" + + Be specific and state the action or output you want. + [Working with the agent](02_working_with_the_agent.md) covers prompting for intent in depth. + +Send one prompt to confirm CoScientist can see your workspace and to get a snapshot of what is already in it: + +```text +Which Seqera workspace am I connected to? List the compute environments, the pipelines on the Launchpad, and the datasets you can see. +``` + +??? example "What CoScientist typically does" + + It names the connected workspace and lists the compute environment(s), Launchpad pipelines, and datasets it can see. + The exact wording and the number of items will differ depending on the workspace state. + +The same access also covers reference genomes and data links. + +!!! note "Checkpoint" + + CoScientist correctly names the **training workspace** and lists at least one compute environment, along with any pipelines and datasets (or reports that none exist yet). + If it cannot name the workspace, the connection is not set up; revisit step 1. + +## 3. Ask CoScientist what it can do. + +Get a baseline picture of the agent's capabilities in this workspace: + +```text +What can you help me with in this workspace? What can you see and what actions can you take? +``` + +??? example "What CoScientist typically does" + + It describes that it can help develop pipelines, launch and monitor runs, browse data, and act on GitHub. + The exact wording will differ from run to run. + +## 4. Add rnaseq-nf to the Launchpad. + +Ask CoScientist to register a pipeline on your behalf: + +```text +Add the pipeline https://github.com/nextflow-io/rnaseq-nf to the Launchpad in this workspace, using the available compute environment and a tag to identify it as created by me. +``` + +CoScientist will confirm the action or ask which compute environment to use if more than one is available. + +!!! note "Checkpoint" + + In the Seqera Platform web app, open **Launchpad**: an entry for `rnaseq-nf` is now present. + +![rnaseq-nf on the Launchpad](img/launchpad-rnaseq-nf.png) + +## 5. Understand what rnaseq-nf does. + +`rnaseq-nf` is a small RNA-seq quantification pipeline, a good size to develop and test against. +It builds a Salmon index from a transcriptome (`INDEX`), runs quality control on the reads (`FASTQC`), quantifies transcript expression with Salmon (`QUANT`), and aggregates the results into a single report (`MULTIQC`). +It ships a small chicken (`ggal`) test dataset, so a full run finishes in minutes. + +```mermaid +graph LR + T[Transcriptome] --> INDEX[INDEX
salmon index] + R[Reads] --> FASTQC[FASTQC
quality control] + R --> QUANT[QUANT
salmon quant] + INDEX --> QUANT + FASTQC --> MULTIQC[MULTIQC
report] + QUANT --> MULTIQC + MULTIQC --> OUT[multiqc_report.html] +``` + +## 6. Inspect the compute environment. + +Ask CoScientist to read the configuration for the compute environment attached to the pipeline: + +```text +Show me the details of the compute environment this pipeline will run on. +``` + +CoScientist reads the compute-environment configuration and returns the key fields. + +!!! note "Checkpoint" + + CoScientist reports the compute environment name and platform (for example AWS Batch) matching the training compute environment. + +### Takeaway + +You connected CoScientist to your training workspace, had a first conversation, and used it to register and inspect a pipeline. +It acts on real Platform assets on your behalf, with your own permissions. + +### What's next? + +In the next lesson, [learn how to work effectively with the agent](02_working_with_the_agent.md) before you start changing code. diff --git a/docs/en/docs/side_quests/co_scientist/02_working_with_the_agent.md b/docs/en/docs/side_quests/co_scientist/02_working_with_the_agent.md new file mode 100644 index 0000000000..f874d2a7cf --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/02_working_with_the_agent.md @@ -0,0 +1,103 @@ +# Working with the agent + +CoScientist takes real actions on your workspace, so how you prompt and check it matters. +In this lesson you launch a run that fails on a simple mistake, then drive the agent to fix it from the user side, without editing any pipeline code. +Along the way you practise the habits that keep you in control: prompt for intent, verify what the agent did, and redirect it when it goes wrong. + +--- + +## 1. Launch a run that will fail. + +`rnaseq-nf` ships its own test transcriptome and uses it by default. +To create a failure to work with, launch the pipeline but override that default with a path that does not exist: + +```text +Launch my rnaseq-nf on the Launchpad, but set the transcriptome parameter to /tmp/missing.fa so we have a failed run to work with. +``` + +The run fails almost immediately at the indexing step, because the file you pointed it at is not there. + +!!! note "Checkpoint" + + A run for rnaseq-nf appears in the Runs list and fails quickly with a file-not-found error. + +## 2. Open the failed run from the Platform. + +CoScientist works in both directions. +You launched this run from the chat; you can also reach the agent from a run in the Platform. +Open the **Runs** list, select the failed run, and choose **Explain with AI**. +This starts a CoScientist conversation loaded with that run's context, so you do not have to describe the failure yourself. + +![The Explain with AI button on a failed run](img/explain-with-ai.png) + +!!! note "Checkpoint" + + Selecting **Explain with AI** opens a CoScientist conversation about the failed run. + +## 3. Prompt for intent. + +Ask the agent to work the problem, giving it the symptom and a clear goal rather than a vague instruction. + +=== "Better" + + ```text + This rnaseq-nf run failed. Read the run log, tell me the cause, and propose how to fix the launch settings before changing anything. + ``` + +=== "Vague" + + ```text + Fix the pipeline. + ``` + +The better prompt points the agent at the run log, asks it to explain before acting, and limits it to the launch settings. +The vague one invites it to guess, and the guess is often wrong. + +??? example "What CoScientist typically does" + + It reads the run log, reports that the transcriptome file could not be found, and proposes correcting the parameter to the default path. + The exact wording will differ from run to run. + +## 4. Verify what the agent says. + +Do not take the agent's diagnosis, or its "Done", at face value. +Check its explanation against the actual run error, and confirm the cause is the parameter you set, not a problem in the pipeline. + +!!! warning + + Treat the agent's "Done" as a claim to check, not a fact. + The Checkpoints in this side quest exist for this reason: each one is a real Platform state you confirm yourself, whatever the agent says it did. + +!!! note "Checkpoint" + + From the run's own error, you have confirmed the failure is the missing transcriptome file you set at launch. + +## 5. Redirect the agent when it goes too far. + +The fix here is a launch parameter, not a code change. +The default transcriptome ships with the pipeline, so fixing the run means dropping your override, not finding new data. +If the agent offers to edit the pipeline, steer it back to the smallest fix: + +```text +Don't change the pipeline code. Just remove the transcriptome override so the pipeline uses its default, and relaunch. +``` + +!!! note "Checkpoint" + + The agent corrects only the launch parameter and leaves the pipeline code untouched. + +## 6. Re-launch and confirm the fix. + +With the parameter corrected, the run gets past the step that failed. + +!!! note "Checkpoint" + + The new run launches and proceeds past the indexing step instead of failing immediately. + +### Takeaway + +You fixed a failed run entirely from the user side, without touching pipeline code, by prompting for intent, verifying the agent's diagnosis against the real error, and redirecting it to the smallest fix. + +### What's next? + +In the next lesson, [start developing with CoScientist](03_develop_with_coscientist.md), where you change the pipeline itself. diff --git a/docs/en/docs/side_quests/co_scientist/03_develop_with_coscientist.md b/docs/en/docs/side_quests/co_scientist/03_develop_with_coscientist.md new file mode 100644 index 0000000000..2d52352560 --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/03_develop_with_coscientist.md @@ -0,0 +1,69 @@ +# Develop with CoScientist + +Adding a step to a pipeline normally means finding a tool, writing a process, wiring its inputs and outputs, and getting the change reviewed. +CoScientist can do that legwork for you, and the developer journey starts here, still in the web chat. +You fork `rnaseq-nf`, give CoScientist scoped access to your fork, and have it add a new process by reusing an nf-core module and open a pull request, letting it work until the change is done. + +--- + +## 1. Fork rnaseq-nf. + +Fork the pipeline into your own GitHub account so you have a copy to change, and so you can scope CoScientist's access to just this repository. +On GitHub, open [nextflow-io/rnaseq-nf](https://github.com/nextflow-io/rnaseq-nf) and select **Fork**. + +!!! note "Checkpoint" + + The repository `your-user/rnaseq-nf` exists on your GitHub account. + +## 2. Give CoScientist access to your fork. + +CoScientist commits changes and opens pull requests on your behalf using a GitHub token. +Create a **fine-grained personal access token** scoped to only your fork, rather than a broad token, so the agent can touch nothing else. + +On GitHub, go to **Settings → Developer settings → Personal access tokens → Fine-grained tokens** and generate a token with: + +- **Repository access**: only your `rnaseq-nf` fork +- **Permissions**: Contents (read and write) and Pull requests (read and write) + +Add the token to your CoScientist session by clicking your name at the bottom left and selecting **GitHub access token**. +After adding the token, start a new session so CoScientist picks it up; an existing session keeps using the old token. + +!!! note "Checkpoint" + + CoScientist reports that it can access your fork. + +## 3. Add a trimming step and open a pull request. + +Ask CoScientist to add a `fastp` read-trimming step before quantification, reusing the nf-core fastp module, and to open a pull request with the change: + +```text +In my fork of rnaseq-nf, add a fastp read-trimming step before quantification, reusing the nf-core fastp module, wire its trimmed reads into the QUANT process, and open a pull request. My GitHub user is ''. +``` + +Reusing the nf-core module keeps the work small: CoScientist pulls in a tested process and mainly has to get the input and output wiring right, rather than reimplementing fastp. +This exercises its nf-core module discovery. + +??? example "What CoScientist typically does" + + It finds the nf-core/fastp module, adds it under `modules/nf-core/fastp/`, wires the trimmed reads into the workflow, commits to a branch on your fork, and opens a pull request titled something like "add fastp trimming step before quantification". + The exact wording will differ from run to run. + +## 4. Let the agent work until it is done. + +Adding a process rarely lands in one attempt. +Let CoScientist iterate: when something is wrong it adjusts the wiring and tries again, until the change is complete and the pull request is open. +Keep it on track with the habits from the previous lesson: check what it changed, and redirect it if it goes too far. + + + +!!! note "Checkpoint" + + A pull request with the `fastp` step is open on your fork. + +### Takeaway + +Working entirely in the web chat, you connected GitHub, forked `rnaseq-nf`, and had CoScientist add a real processing step by reusing an nf-core module and open a pull request. + +### What's next? + +In the next lesson, [move to the CLI](04_move_to_the_cli.md) to test the change and see why the CLI suits development work. diff --git a/docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md b/docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md new file mode 100644 index 0000000000..f91ff3ff9a --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md @@ -0,0 +1,134 @@ +# Move to the CLI + +You developed the change and opened the pull request in the web chat. +You can keep working there, but running and iterating on tests is faster in your own terminal, so now you move to the `seqera ai` command-line agent. + +--- + +## 1. Why move to the CLI. + +Developing and testing a pipeline is better suited to your own terminal than the browser: + +- Compute: the CLI uses your machine, which has more resources than the in-browser environment. +- Docker: it is available locally, so containerized processes and test runs work. +- Local access: the agent works against your own files, repos, editor, and personal credentials and config. +- Iteration: you edit, run, and see results in one terminal, without round-tripping through the web chat. + +## 2. Open your fork in the devcontainer. + +You forked `rnaseq-nf` in the previous lesson, and CoScientist opened a pull request with the `fastp` step. +Open your fork in the devcontainer, which comes with the tools you need already installed. +Then switch to the pull request's branch so you can run and test the change: + +```bash +git checkout # CoScientist names it like seqera-co-scientist/add-fastp-trimming-... +``` + + + +!!! note "Checkpoint" + + You are in the devcontainer for your fork, on the branch with the `fastp` change. + +## 3. Install and start the CLI. + +The devcontainer already includes the `seqera` CLI. +To install it yourself, or to work outside the devcontainer, run the install script: + +```bash +curl -fsSL https://ai.seqera.io/install | bash +``` + +Then authenticate with a Seqera Platform access token. +Create one at [cloud.seqera.io/tokens](https://cloud.seqera.io/tokens) and export it before starting the CLI: + +```bash +export TOWER_ACCESS_TOKEN= +``` + +Then start an interactive session in the cloned directory: + +```bash +seqera ai +``` + +!!! note "Checkpoint" + + `seqera ai` is running in your local clone. + +## 4. Ask for an nf-test and run it to green. + +`rnaseq-nf` has no `nf-test` coverage. +If you are new to `nf-test`, see [Testing with nf-test](../nf_test/index.md) for background on snapshot assertions. + +The simplest place to start is a pipeline-level test that runs the whole pipeline on its test data and checks the outputs. +Before writing the prompt, decide what is safe to assert on: not all output is stable, and snapshotting unstable output causes tests to fail on every run for reasons unrelated to correctness. + +| Output | Snapshot? | Why | +| ----------------------------------------------------- | --------- | ------------------------------------------------------- | +| `quant_/quant.sf` (Salmon per-transcript counts) | Yes | Deterministic counts for fixed inputs and version | +| Output file and directory existence | Yes | Structural, stable | +| `quant_/cmd_info.json`, `aux_info/meta_info.json` | No | Embed the command line, Salmon version, and metadata | +| `quant_/logs/salmon_quant.log` | No | Contains timestamps and runtimes | +| `multiqc_report.html` | No | Embeds a timestamp, tool versions, and an absolute path | +| FastQC `*_fastqc.zip` / `*_fastqc.html` | No | Zips embed timestamps and the FastQC version | +| Any path containing the work-directory hash | No | Changes every run | + +!!! tip + + Salmon can introduce tiny nondeterminism across threads. + Run it single-threaded (`--threads 1`) when you want a byte-stable `quant.sf` to snapshot. + +With those rules in mind, ask CoScientist to create the test, telling it what to snapshot and what to leave out: + +```text +Add a pipeline-level nf-test that runs the whole pipeline on its test data. Assert on the quant.sf columns and that the expected output files exist; do not snapshot the MultiQC HTML, Salmon logs, cmd_info.json, or anything containing timestamps, versions, or work directory paths. +``` + +??? example "What CoScientist typically does" + + It scaffolds a `tests/` directory and a pipeline-level `.nf.test` that runs the pipeline end to end and asserts on the stable outputs. + The exact wording will differ from run to run. + +For a reference of what the generated test looks like, see [`solutions/pipeline.nf.test`](solutions/pipeline.nf.test). + +Then use **goal mode** to run the test repeatedly until it passes, fixing the test along the way: + +```text +/goal run the nf-tests until they pass and fix any issues in the tests +``` + +Goal mode keeps working toward an objective across several attempts and stops once the goal is met. +The agent runs `nf-test`, reads any failure, narrows the assertion or updates the snapshot, and re-runs, repeating until the test passes. +By default the CLI asks for your approval before it runs a command, so you see each `nf-test` invocation before it executes. + +!!! note "Checkpoint" + + `nf-test test` reports a passing test for the pipeline. + +## 5. Add the tests and CI to your pull request. + +A CI workflow runs the tests automatically on every change, so a regression is caught before it merges. +The pull request you opened earlier contains the `fastp` step. +Ask the agent to create the workflow and commit it and the tests to the same branch, so the pull request picks them up, in one prompt: + +```text +Add a GitHub Actions workflow that installs nf-test and runs the test suite on every push and pull request, then commit the workflow and the nf-test to the branch of my open pull request and push. +``` + + + +!!! note "Checkpoint" + + A workflow file exists under `.github/workflows/` that runs `nf-test`, and the open pull request now contains the `fastp` step, the tests, and the workflow. + +Open the pull request and confirm the diff contains the `fastp` step, the tests, and the workflow, and that it targets the branch you intend. + +### Takeaway + +You moved to the CLI, added test coverage the pipeline lacked, chose what was safe to snapshot, and wired the tests into CI. +All of it joined the pull request you opened from the web chat. + +### What's next? + +[Package this into a reusable skill](05_build_a_skill.md). diff --git a/docs/en/docs/side_quests/co_scientist/05_build_a_skill.md b/docs/en/docs/side_quests/co_scientist/05_build_a_skill.md new file mode 100644 index 0000000000..7f5d520362 --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/05_build_a_skill.md @@ -0,0 +1,88 @@ +# Build a reusable skill + +In the last lesson you hand-wrote a pipeline-level `nf-test` and learned which output is safe to snapshot. +Capture that discipline as a reusable skill, so CoScientist applies the same rules in every session without you re-explaining them. + +--- + +## 1. Enhance CoScientist with your own skills. + +CoScientist ships with built-in skills, and you can add your own. +A skill is a small instruction set that CoScientist loads as session context, so it follows your guidance automatically whenever you ask for related work. +Packaging the testing rules you just applied makes a good first skill. + +## 2. Author the skill. + +A skill lives in its own directory with a `SKILL.md` file: YAML frontmatter with a `name` and a `description` (both required, or the skill is skipped), followed by a markdown body of instructions. +CoScientist discovers skills from your project and user skill directories and sends them to the session as context. +A project directory like `.agents/skills/` takes priority, so a repository can override a global skill. + +Create the directory and the empty skill file: + +```bash +mkdir -p .agents/skills/write-nf-test +touch .agents/skills/write-nf-test/SKILL.md +``` + +Then open `.agents/skills/write-nf-test/SKILL.md` and add this content: + +```markdown +--- +name: write-nf-test +description: Generate an nf-test that asserts on stable output and excludes unstable content. +--- + +# Write nf-test + +When asked to write an nf-test for a process or a pipeline, follow the rules below. + +## Steps + +1. Scaffold the test under `tests/`. + For a process use a `nextflow_process` block; for a pipeline use a `nextflow_pipeline` block. + Provide representative inputs or test data so the test runs end to end. + +2. Assert on deterministic output only: + + - Numeric or tabular result files, such as a Salmon `quant.sf` table + - The existence of the expected output files and directories + +3. Do NOT snapshot unstable content: + + - Reports that embed timestamps or versions, such as MultiQC HTML + - Log files, and files that record the command line or tool version (for example Salmon `cmd_info.json` and `meta_info.json`) + - Any path or value containing the work-directory hash + - Version strings + +4. Run `nf-test test` on the generated file. + When it fails, narrow the assertion rather than snapshotting unstable content, and re-run until it passes. +``` + +Keep skills small: CoScientist caps each discovered skill's context at 5 KB. +The `.agents/skills/` location follows the cross-agent Agent Skills convention, so the same skill works in other compatible agents. + +## 3. Use the skill. + +Restart `seqera ai` so it discovers the new skill and loads it into the session context. +Your own skills do not appear as slash commands; the `/` palette is reserved for built-in, backend-provided skills. +Instead, CoScientist now follows your skill whenever you ask for a test: + +```text +Add an nf-test for the FASTQC process. +``` + +It applies the stable-versus-unstable rules from your skill automatically, without you restating them. +To make the skill available across all your projects rather than one, place the same directory under `~/.agents/skills/` instead. + +!!! note "Checkpoint" + + With the skill in place, asking for a test produces one that asserts on stable output and excludes unstable content, without you re-explaining the rules. + +### Takeaway + +You captured the testing discipline as a reusable skill that CoScientist loads as session context. +You and your teammates now get a consistent `nf-test` on demand, without re-explaining the rules each time. + +### What's next? + +[Wrap up the side quest](next_steps.md). diff --git a/docs/en/docs/side_quests/co_scientist/img/.gitkeep b/docs/en/docs/side_quests/co_scientist/img/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/en/docs/side_quests/co_scientist/img/chat-landing.png b/docs/en/docs/side_quests/co_scientist/img/chat-landing.png new file mode 100644 index 0000000000000000000000000000000000000000..c281b871932dd0529017d1f092efb966095b4933 GIT binary patch literal 171324 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

Tpt4T*W0AbdUR$kFx7l=jOyE;x269by-Nv4 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/side_quests/co_scientist/img/explain-with-ai.png b/docs/en/docs/side_quests/co_scientist/img/explain-with-ai.png new file mode 100644 index 0000000000000000000000000000000000000000..24ec7fc7ad6be0bfeb241fc6697a84335db700e5 GIT binary patch literal 190966 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

KCh<*1#4Se{4KkU_`Syiw_x z`**DAfV+1XpwBzj&Y)#692N(mw5`Oe$qWNSJo=j^8wyRFx^`*?<^)0C!MP5Z88&{Y zFX=+F!#=(wnrhN$qP(%~bmJsmoj=5EJTaX`#Mw-?7|@WkanK&_fw?Hx>AU=t(Eg!B z!s#`cAF*pnDK|@SM>jih_MGju`8|UuPk)0Lt~gGx`geF0J)%l7Bg_FGbKNJMl7|lqD+@!!NImEIzfkeuN!JNY+IVdTaP!)USVAR-VV`_NLo7hPX>jF_k8(!+u=uDLuFz zA`sS13uuufTuzwX6I@?kJqs;_s1aOJGeZvfj_F+`!{F;`{Iw&WPwMbQpXLnADu1#v z9|UUR=n{8z2nmGX{WQsvhIDo-QbQV8@y@o@V?IsPl($qknPhN?!jHxMjMSG$*J5>t z0dI&Pu+vTfMd7DT8}`XFI^9+|{TB<}Ce)iVemT%*$m9Hbm&>b4WEM8q4Bs#=9e*|R zIVOurn|W`dBL26@>3ACn1PHizjH<2t4vTXXoQwJu z?%N%5?$RN=@KD@`wY_eYbP|SSi+CrQU7U|EVf%)KXVv$qFA?^vo3qRd5W(`%R&lC7 z%Mvxz`zB=T^ZwtOR@THj&X|g0LRIG(%500@7s#~r{tClgDA>T|ONrhG$L$lWhVmxb zg#5w2rI=J&VXiL$t&&`ip~jh_ye_eAE}1FEcn8yLJd>}f<*DB-P#B`jPSZXTta4&# zVdJ4@BRC<(P2W)u2_Zd3YISy1zk13lk2FPTJvFK~GoEC~Nmes79%q0D{9a~SeVOa^ z6eCH7#noqu@Xd}4Or2patMUANe$1mLmJU58>|XtoCR|AQaP#oM3lGQ8f%5S;s0Lju zTgE+HU^n-84)YYJGhn9(P%fPo)hge%Gs_qPO$tJGlWK2SqIN} zN}OGWcq_1Gw4@Xn8He4Z1J9Q6gXQifXg{WY{CECP{a~Zz!v+z}M-2jlsp5Tu5udGTYBwyLw7OABDK8LDmnm_3KL(yu_b~23bUiJYn2Yvy{n?-%tY6 z*?`~c1eJg^6`w`T#9)T-JK?aBcJTxcesZr$R3o3|WH+F^@F8U%ZOfP0#A0S|v~!ZSauyEsHl0;Xb2mfmLhQO^DD`KbwYui|;@YW7V@L9x z28(A%6EV{{8T#z!Yw*#^F(4wwZH&#VsGZ$dFG?_;u`tugl=Sk)DdYfZLxOO*naioB zhQ$_XNJ&etkVK9^oUr$ML`h=EYUr=OH9p7EHNRJ!NlhweYLKF=>q|Z%t+G0ngo!mW zLn6FsULc!{?&Y+;`T%F?*eh#k&9J%Yp@X-`eS&A40mLSdu3X(s3G%kYL^WgbF#*K6 z!d9|?!(>{tXH_x-!m}o5Z2#njV@E(SP#8l{YB=!xc;@}l!bx)Kyn8Yb^ZlwlF82S6 z=KS${z*jpa`U_C;sLix z+r!P3s&mjXwBiyF&I8Nylb4N7E4|Zsk;K#OOw~bUzvwZpVfQ2W`{Q9gIza$f#0x4c ztQ)<)T&~bDl3Rtxj_B!4{cdQE!U}!5q7Ii?+Mo)3mvK=W>v+aR+)s)_iU;a?C&*S| zN)pPu&TRfuw22eT*5zIw^MkY+7L3k(GU53;0rKY*u>_J7s1|7fl?$Vr2&^*ZCFpg; zX9gHdV3xtoIcKUjDmLjS?u`0&Ute0O1R!o~{M$Ci)%)3)YG8xcC*#!DC~tRm3pU|eNMY4X=3rt zS2^wd;g^6(ZyLS@Xv@__KS}Z2ev?i}H-eKBf7Q(Xoshv5@Wsa^zs=U1tl}x5#I9nM zP|soux9U`96zP?MD4~RXM{Tb&HW2Cwi|;GGe{AugEN*a;aH|U=Y9tv`_@_Sy>z=D1 zUc0H4#=+9>)(Z5brc(5sL6}38jD_s~uAg4frwzMSz3|g(i>{8bI4iq#&pEk*qVEh& z9-Jn#Ge=bwHa}$8jc6&rTUlZ^a4})C;m!Nk(-^~@b?3Pg4yQeK8}n+{G-!t)hq!?_lwaQiYNFhQpv)L5R3G< zKc`eIRBJy5iU<(wbxumpj#^`j{r?!|uwf>Up_{l+HBLiWz(ca>H<`Gv+b)5F&4JJwBQ}jZ_v%txh6(6nM%=Hp(RYqY+fP*n+7;g_E z!y}jYF`xMwr%Tuk^*w^d?x}%w$uedZUDR6mM!sz3yPxS6ah)+U`RVn+d-@qBcUAu^ zF816C5C+t!zoTF)=6?Vtw?5vlKQ{;)&s15aJmmxD0T5l;bL_nY%-BM{#qA1ssZv9N5*BeMj8)XX?(&vDv0;q9QJp$A9}YQXSWW8 zXyXu4V!$W-UkIl&#MIG$4fC`q-4`47HP|pN|8oiO@v1JiIb9{1k#ODOcK|#<|D*TF9*=6ZIZ_V?E+jN-24%43}CW-G~c7Ap^eD1@~_l$1){MxVTN$)jRdm! zf?9_k0txswAhag^XC7}EQ;uxpL?6S;nM+r1nex-`^KH@qQ&%~;-H->)2NUuc|8!ms zT#7scu1gJ`R8FrzZoUp#_Fuje1Da>Qx4>k)A?R*=&beL+!6*0VTuW_im$sXP4`*Vz zgj_4{h2rHw!#TBgx69=^lK-CHgS3A(4sG9SXwBEq#ij!w?O3M?4Mj|!U2EZL5-Ka8 zaAy;(aV3p`{UJM+%QY;*6Z0E7+k3WrQoZ0m(DvjXF?xv@Y@zAJMN=TG<7PD5?#Ck7 z(UgD?eMuC`i8X$*a(0W@1XMJ2n*yTxiKW((rVyn@{#O8ln<^0Vo8#2l=<~+J7a)`5 zyDL^q<`E0bT9wnZefHnd(WfZ(^~8Gxmn1FA?XlvSqj*os+H3%SJM9)p|1r&ZxNYp@ zdzZDs*Bs6p0Fh1_eE6)LY8&8a(e71n@R;~Dyz=S@c^GeXKTOR}n#eF z=EAd1Bp`04zeb?JVZS*_v%YW#|1_w4K%r>ac#m@b#sw+_xR`& z??wQ1JQ4c=cjydKvEn*FH}%6325#Rt_>poOumf#Llce6`Ja(pf5NuWDiu+07UV(rL z10e7#GbN`e-ea%r?-Bg1%j=$RRqmsccxyitSpe;swW2*hRl$<#e}H@^s*k!3z%Q4n z0f2lnYjN{?UUW|`0GB@;wwcfWA6$M3zpRzspMm`$FbSuCq`Lba{NEoBPj(4=5$5FlVN`y8mnd+x{D^EkzR# zu*HCh<;w>M`I`1UyNybgVfTU=%LBS&_w4FC+@O?U5q%p#nbK+qT&w~7aulEg!YnZRpR7%?8lZ}>w$ZX@dOspX%QL*P)@-S%UtfR^ zCIT#~XO~XRf2el8$M<9C@yjd{0`4x=pJvPEKrzJw)yVsw$}0Vj!C!%A8hL;JQ2NwF5%_;XK^6GGmM7S<1U8MZ(XE0v zpePo>qn5%141w(b41p{VFU5l_-4d82Hqm3x-T$_mtgNR329@*wl@TBYmH|atQUIK- zbP8alZ6DV0{3ob^^$d^^kV)#^Ezkv4I#WKM7pS9A9}d3%SRN|>TZQ@cXzTkwlmh;P zU1CGke+ov0^1vjOt)-0pCnUkl*AFa1!pA)h6fuwdW46LERzQ2AqLbK2e zQ~>)N+cI$^!tPC--Z9 zzspnsSf_?15XM!sTmt?9ktD(Y$KH2GMU`!DDxzXSQAr}8D2Ad45=A653MeQ@t|F%b z$&xb&7>O!UBng7#TqMbY0!opQoD?j{AUVVAYrpsAw`SfnyqQ_E=8s;BWlIZn&pl_K z9l!nU*SnB^7-2xpxs3H5l`0D`EU?}QvUve>34%I`6yXt@Cq`1T&+B5h=A?lpm1-mk z&Uq>fC5ikd9cVxXN#Xs$?!TV_^SfY}!%6Gg#vpUQ;1N!zR)5RGkOVT2q9n<$zYk8q z*{QwbdTxJD*`MOhY1l>wiC4T?>#`&y4&;6ByRRT{0ZQ75*;69mD znPfAw$8yLhz{3w=3A@EQSP>!B`HT!cnLVs9i@Y;jA1|O=&;Bgg_lV-oNtk1BBDk*z z3$JnDToaC7RCnabls)jF7oq9Ry!Nr9i&uWCSGEXEA4aCX(3t0U>FAD(A;;h3^*>?0lrrnqQaB}$*urUZd zF0>iu4@5^L|7+w45l*;)`+=q`@~)B(K~+$FKF|8+z*L;=6FGJ2F#R!zaM zucwa1y#43YnU6nxX&$rZJKprh7)HestS+1|M_ zHYDM!H8hF*R2h(zr59qUXd{^#YRl zJQu@iqSS$to?kAAog1Aho^HUGKllu6Zx5~RfZW!msd_w7*1H(UO)_sJj&>Zzb zavsx|Y(&3;qgFJpginyg=}X^4wEh!+5IbEWRs8Q+OZ(*DQQzjoF2glIZh{9gZbmfF z?kNkG1xUXCKPMjO96`nonP$XV=14%ZT^EZmO9%Z0UHZ@e)5IkzA8DAa^5OjP|8d|_ zk19EeVa-SNB`k~g49p?f%^Ue!_2?tRXF`p#EdHElrgI54o$((7>r9Y2Bzy3bzsI^z zo#TqYtv`E9zw!f2#VodS^2p%`$UqefHzq%bL}5W_V-Tyxu4to>B$GWR{f*+01LRj^K^){_z%Bs{qIg^ z{JqG~TM)_IHOQwOfSH?BX1V|Q_^k`b^wXeMt<=+sl?0y{+fJAs-!LT1IKJhnox|mu z?T0gv%ul1j9XcyvAY*XApXKt|SDEYvM3u!z3VDLTm*cpjT}!Mt@Md@QiCk-S(K3N&eNk z{<-8BroH6EF{^e%z39C}LzWDw6My|afBs(5iQN^1Yhg*)w!0MsEbFB3juvR53JbI! zPCyBtK&Kuo4mrM~M_qIY?%ut=h!w-_fH|*w0{8Ch3#1mk#0EIv z>3nxbha~`q<*b;qJBk(4zANZH#f}!}d?#s|q_&8)O$!>^9piR|wqu6qw} z&*+6aB3!ypYDepnA@jm%>X}6Ok`u#?GW=ivQ_BA8mtiKD7jE(k@2FJ;;X2}_^omHp0lb;uR_)sUzGA39oeJ`;(fH7ioWtCyHZ>j(8kO)&pN~S%< zypm4Sw?B;g-_9k-aa?CPLeKp!G0;YI`?HMEB_}7IGDNu;oyj|iW>^@M8EsS5o{aQ# zI_N1&PNQktocr}v^w#B0RCw=CY)s245$p1kixV=ucZSSRPI%+a>he%vP%Vz<*|7Dtx-RA{NarbQ zwPMjEll_10^5O^Yu3aMKt0v;OzG!KOh8VF&L?*{yZznSNM9Q5{aT|O-EK)(*UWz@d zsX!sVDVzv?sU(D1?49$Fvn-jBlxa(nXi<>i=wj2KJw~QUO}8-U+eHXHC+T;K$X2M72aIY0|(7ycMn_EhQCChydc)$Ke&RDE1=@x>Ra>#yRf_fs~9>Cj4 z)eHNdhwpFY7^An{E-?oyN?~uf|KSEFB2pz49d3Y-bQ%Qx1 zFOj`5=J$WR?M)uZfVXxaothV^Anc38d>kXd_aVs|xBlwx|Nd0oEM&jrEF7L(z_c^+ zE%CmB@6XjIWN&|8`lyeg$1^m%`!8bJV@{Z2G-=>_?%+e)UNz5s@RO$BzDzbW!Pdn6 zjFLnw?z=8tn(g4AmIr23Db_j0;MXwvEnIy*>b{Eg?KZGY8 zci;Yv4Usqg*=4Ce;eQP60wwO&XH@5Wn%PT!RU#=Z8MoE>%K;0vLx8@%^_1D&aWNDb zM`WB+&p+ONu0zXZ(iX-g7%l-8qu6+)>8+-F0}O=^$#_5LGqE}x?IFURQ^&1YR*-Y3 zQE>Q8F8q{Hh~|Tey~fZOH9CP0v)&v9bw<_e%WwVTv+Wnwkh<4PubEL8mG-RdZ69wc zh(u0xF%`UaL6j{-Qx-ZDRH zEkqub8&*9qrTd92_h>2z_Xjo?3tG(!`tVvF8wL^xABzmM!xR)P@!g z-)#uJqTgbgS&Hw=fx&f&yZ7uf=;1kzj^M^gJFiU^_&)3*5IG`N7bhcxjbM10>=Lwk z=5Ih$nDF+-Q$uK%GAf?Tmr>QQlCU40YZQ&fV-3UXEhD&e#rXr^XF1ukK9CuIe@rV2 z5~5z*5e=s^rgVAG*Z9*jD&yr}-_3;yt@<8?lZzAKi0Vx2DB4zy96QsL1PAJW zEvN6asxWMS?n%$s<~S*%IOxGxYW;Xr^bLQfj<=Zyh`t=cP#`=aA$UoI^9!7WJn zzw>~Wwkn>%E(XgIt7|Y?t@WbF%=1A?m(s_5_ZJ zr3Z?ZtuVLl#f7`!uYW?*?)>+s%!UU+f>fTKjZ6BRH{iZTt=!NZt8P_A-MTuS87(Wa z@?*kQy@Eg?WDcEKqfstX#^Y37+0*Vz#g|e3^?p9MD*?#3xY45V4AZ3zE4|V9kcN~Z z3F;hcHaM10dw4Y?>W^a%aAYeo zk@3h3FfYmqP39`*GX@v3&{0p$x5~-6OcfgCgFG5V+NpHw2MYTrI!UBg(Q03ZQM&b` z4MNlC1`>n$USdAXz&okjI7_oT1M`Fj|6%!hw`|ZOiC)7#_ z7}kZRDPSiCpjv4h=g(g&E0LE?A(7WM7-db$0GaO@^*Y3HYh!hRjl*LiyGG&B>)Lc~ z42=x8JAkS#bF9GZt>D;e*uqHI;I5WeB>hrqw6EycY)c>&-WP{nn;%syfyt3kGDtbd z_ns=u6&@(}uquPkc$-P##7_9kQpI=TqHG<0*9P=@zhU$h>lB3{LA)?MjJD%uC`YA! zbLAxHE?J;DlCs(y3KW%v`({W**`xcEu?2|ERo+Zr!YsDPaK^KSXmA(vM=`d2-*=Qr zqnDv^vv*h|M9cB}2Jok8yK;mtll0 z^akEp^1FHu+m=?~g`1gx4G|p$-iq6njxio z0=?Q|O=MRk|H@*3=af1{44`Bdxn9gFZbVf}Tp~6;N8x1H^OUSEp^_oGIo|{OVGlPm z;pI6g!wv}wu1pox>q)qCWVYG8Bk-I)6fdSM!CE~lP2rQswqA6TAE@5?tK*D*g<9UY z2s6U%d?noBNo3vz6*uu|5van1AUP4i9^r2f_p|^zNJuowy#Q{qZ9QLy!5R$F%v2=* z)NRt5a975rQP_bh0kxlqYV<$Fmy(pCypom}<(#7YAzi>57d&lZx&>z6Io}ocrg$tR zm4G`xH(pyo2uLZZT99J2Q@S>h^^u^C=*q+(*=v`3%6?TI@|8A+fovYvHkXHThRin< z^8<0{xE4%qfEUi8&rUV@h8JCD50g_T!-=kEa> z8Npskcac~@K#XcV%&DysR!q2a+ih);eUZp8R1+xYz3&K$vOZ0x3;r=kdCF%@le2u? zda)dtE$PoBT;%AWr0hFp;sn~YJ9Qsk8^#8ABtYt!y9b#>p)esO^y|YOup*CIXH6b- zeev;Nd4VrT5}|GT8f$kFy*3gT*n+qMh=a1;j!vT8(1iXM!h`OIyZ89mX!e0ilk$3e z+pK}7B;sKH=$fqV9J_+CA4^V50EL)HHwh|9(`=YQF;SL1#iS}5bHV!K5rH~6qjE4n z=#O;i=?~QG2R*hxZ!mSe3e8rh#BYH9Z>*HHa?NW~k)gUjp5!*B7%ja8GZzUm&Jh2t z4Qz=-I`lhT7B`5@gCmshV^1l`>tM-Rgn?$)gfy9KoNhNQPMME8Dv1gGcyWWE$hem{ z=v5BwxR)!&9rm- zluEcVq~@?jWsz1L>RA)XiBYw9Q8S~fj7%Aa1B3UN$Qz@@6(;i*@s)ll`rtolTlM_- z5~Nt}zTvYmTm9Z@sO4LQx9^QoWfT+v?_d%JxYmCt=vwWQZ)#{7x*dKq22Ais7^7n%z^9!4ZaE*j?>T zI)*Rsx`rU3TGq$>Us+j%9in7Po*!- z)zV1_pK%>gP&bes4h8hxQy=^oi7IXkI&s~ok_wS7w znGvUh?Nt}7UU!l|YX!F%SFIjn3*4)@Q@nvMn>YwYs}3OITNdB z)X_a25J4#lF3*=vyIB^IPDX>K%Y`V5cBw`ZH!}8w!Qxi-xzKS%YcR1t0mUBCr*v)JMb;2wWpTc2w*`lD<;DyaeS2jY_Q7+7byP-sRiS9EK`3V<$(5!jcy|`aE1Se;PD^M+)}T@G-2iEm_eXm; zD24cgzj4b^lPR^%__Ntw)~*9j{7` zSb+Md=kUFURiY;LKyVT!3nOq{3qI;#>3%joXW;L%ZOv_#WWY@?Bgq4nZ%dVjI8QeE zeESa5oYf}^3eIBMqx^=p*&DHkVm!$8YBh7vOogaiAfZFhM>kUECn}XaHA#b`53g^^SjX z0Whgw#Wy0pI+g_V9_v}IjzyDp?bwTlN`u+L?Ub_7OvqGq`=SyY`CzPCS4Y`m-e`YU zJD9e7rPJrOO>l1=hKKfhDY*X&D`D2!djCS4BbgJU-ax4^GnWfD?c zpQEUhn@~NFEqn7gPwzktg|I|KvrZSpYf9wb^ulU!cx*zODT`PE_)K!N6uzvN<63$k zUc>7ZHr|()NIzZTgJX37buiJp(4ifTSYNcCD%KcO4wBlU`bxC8KNKw=Cm9csLRtMW zOx*yL)ajQ<)IR!?Ys%N*CWD~0K@p6sPH7etL)wmi9@@kjw?Ss5e^9qwy!(YW5vD_4;w+po65klB#dY zef?^`+lSb5@6qfU@5mhR6G`alsA&nMy6&4lK_Di4|M=8l4NK+jvOZIzI4_Ft(Quuq z%9+d%;Yz`mLT7Q91iHSk*P0k_{g{v;l9)cu@|jjfTk-+dYTih!Z$9>q^mG?u4LPy) zRQ?XEC#17X+ruo4dLbD4aJ82g6vADewtdpuy2iF=AX&XzmM7{s+O!%g@DoV}V?Xk5 zuXEB6opWt&(hmX;M!KgFlCX2e3Eg7bFP0J_*J~e)s}+9-BGnq;jsAzO59q}`Ll0V^ z2*_8j#ISuGugMeMYX8-GM{rc=jru}~uy)*$p6yjf4q|r3>k4=*DhT#Er!7u_ASHyE z>|xzjlCFV2GrlX4UJf$*Lum{)SlFI4-H2_Io%dDX5r&Z~_SN7$Q2Kqmdk)TrSJ6CX z`^D~uw_^OpJCyuisw1OwshRkn;J6yTA=A%@{Q#FL6sha*-v1Rd|Cp~MO;4^QeA`8x zxu*%M8e8q??MY=syG*T=CkpgCo?|Z>VKGi-4M`JZW;8MLl;XHi-{%Y~%ega3;A7Iq19#b2dUo7$8!8>@vY4TmY+%}<*PEM>mlc}L{_vo|*)9&Ef zofT|HG(h5P;u4Bt@m{#yqV^M=^Nk$?x2DUMEKV)WyiW)}n~CqWz58e4iafi~>9dShE92pcw-Yy&=QYVfKlJBHtB_6M)~`ZBLo%R63N?Q4#J*lZ4P1hvE6^1E6-cZ%>(e{GuZR1Mpdx;{eBXRRH@2%QCCRGR=W#YY5f2HO$Unh^|4loVJ?w<$a zCmCL^MJEG>1F>!M^2Dv&(Y;8V_A}h3VN~v__>MGU2xvs-0|a>{#X}X`!L`@6!j(A2 zdp}d}WP|$<`v_Am`mvKbUAe}sEujwm#z zJ@_1?tp0vxNPXdpY!6s2$~)i^7_YsH+sT5+oe@WOPl;qn9{2GmEa#aCbWz0$g`=&?kdF0|KFdw|V(fLiT3imSrmna4U@NR{|QN54knDAIJ{XHM#N3=~WQI;#?rC ziw8{n8R5A)o@DKEcjM=*_*+mzQ9mW(x?Jbzt;^Bc`M{S zyV^-z*&bVK1EWapBwVzH< zjbhWH+MTWY@d@=>r1__-fspRAMGE&0qrywQL6UxSFWa>}Hh7)qM<&*hY&PUuMf>t7 zcOU>`ny@MTMp+?i1NSQkfP+aKQu7jzQ}@!E%*%8ou^AKD3(V%`Q!~rL5gO7#4W&$< zU-G$-ExU+hK&lE|^}BP8M~9`DBl}&)(|M;$<`SS#@A@P)j?_3dQIJ?cfC;A8+@L7R zrZopuL_XL7Y?XVNyp!f>px&SBK3vCW^@(Z}8KY-;7hovvG}S1|x=;R)aAje1{N`E3 zFa^_B5pWI-ynHW|agE{qL#GIUNjTpJ)!?of1fz2qH6XFpUQiZ{B-G7%M7O{Dp8r4$ zO+3!#Rm++HB#$hB9cm4JLdq!@5_dS|e59tBHmD+--zqB<&)1GQH^AIE!{W~yy(5VvBhgb#6+JaA9x@NfZa#0w22GorTw zQrz@8Xbz#5S#Fl)nLo-41*RKw)4KEvCgVM9tZ8ncx1#!-=# zKpw+KMADJ#r{MKLfp8scg}(P+S)||k^S%yT=zUSWQ-{-EdcnxAd4+2r(mYQP97%AE zA!IzgNJu5qD9Xt&U-TX8Jv$8<9HCZB8ST5==&{KISx0AMxOnv$8wipjme7{9m*&>f z0;OS80iZ90)ya4QB%YZE-Q~X=J+&|ywT~EkgDR>B%9*}p8&Jjx&p6(Lu=&{5Fgl#< z_*AVR!yc?R`o-D>Fea@jsTpdgknn28U2|hfg!HOMI49lcclim zebF;b55Y$$<%FF_ZLh+2~GO_s$E#YZz)-x_O8l(TX- zG@F;qLRUj)@pQMAnUL<{=Z)FOBcNK_y4}cU5H)L73EC5&Z>Qb`^3>S}PVa z49Y(seHAbQvpJ(@@G64dW6 zM!RyaxyN#A%)6|RLK;&BNR5F5bgF)wmfu&B<=jvM_3i^ESQS39faci7)bxC{{K&1j znHpx=0q4`|w#^bk8f3PRz8pmgNS2M_w(`nT&_h^vC$1cd>UKWy+QdbG5_$Yo?p-eT z=c*5R#$H}LE6kRbC4TC<;{%l$&i*Y>UGZ`rtF2vYLzPX9}PY(-=?T zSbaPxdaZXjVJ^Tysh|05eSr$kibta6nFJjVU255vB=67IYS$4S%$UH=7qt2x}lNgxEvQ6ZP%H)?6|D} zyQQ+)rJikad!F3@E=esFOg0HTbs3Wn*~mmBn_m%6A(KZP@a&94*{7l3we)+`C#(SW zl32s!f=+FqKAU_WDX7rU`Eb<+y3fZ=VAf9r7sjTjk{dvGe^#!Tj6_aYpYu5kjb{kx z^MVl*rO9ig*NQ$HbXx*tGyZy_m7FUrVMftz_CE2PbM`=|9uGAE&VhO|M@SJ{XEXm% zenXASf$DvVnf&fam~@Q7zd=WHJ}q>g4T^pT>WRIocy!jU({d1p zGO17$>aa@wa(}EGNyQ0@Gl6SGYkk$FGXpVuj$Y@|1ZYLJdTy355QgV$m3^|zy{baF z{#yWs`YGBNZJYi`|H%~q?VgzRQl)*zw_Nyf)O16ZXSRwP0&6T?120C}Dx?ZFG)j@G zr+PyMrbD*TASUWy1M`QC@Jku;UbwBzrSjHB_r;t#PQ1Qf{OKN3r!$G^@$7(|?6(C? zjVq93eM`ZM)YZB+1;AfOFR$3wWlyd=ixbfQQir)_qmtWCftL`CE0-6%toBHqWjT2N z49h(`S0eY@=1OkVA0(NZ?qDsxh}(93!F$xo+^){1Seu_75Ea@8^jJTKV6x1gs1gos zE;WMaggg$bt*PA|LE*gtLx0($8^q-!_X0FgC4-B$Er;daN!=8RN!zc6=RpE;d^w7e z;%acRGo?S2i&);A2p*cH8Nett)%K{dw=Kq6YxTRY5VaH1)ym3C7@G;_#{nAkW;y|> zK&4()KAqJ0tg!Q&$AHBfAD!=j&+HpZp}4xhi&0sLx~rbD*$0Kb^nS(u=Yp#(A!SM; zUw_(@Y=)w0=sqQ^&y z1AXk|aarjf3|C5LBK=Ma5?n7G@{hEtrcVd2>jaThJ#eR=#jHJYZFX&A8^2C$5}I?` zHc!{LF!4)gp~>z#wWa%)ueRkn$tb5Rswu6kfcw<~FbDc>Nm6xRC!xZp{N%0PZDPqmS3ke8%{Hu;QqzEpM>);RiL;p>CHl%Xj7JborM1!5mCVcHGR*rQqQdjqJ42rAJ1O zc;ilK6$Y0l&d$_ME=Dm7e1&pf)ZU}S0kvL_g*H{%0V9{C8avWVjdiNdJVn5;zKSm23#BVH3ZEdP=PQ@L>qK6oiCuV7M^OjwnSzb)(3TAs5oZ9ElEGnYz z!&?sK0R%y4d;kG+LY*CkrV%W;%82*-N;4fpk8BfVB^?5frYJN4+wn#60A50e6`$=# zL+#9B(5&S9URL9-elUU5;|27 zRHEFHUzlAC)aa-v*ZP;rRBd_0WvH}#nxOK+u6jCw|z8|EWzEoh^ zxwQkb2_}l@vqfO0egxhshYGsSK^rSB)V<)4H1yMmL09r*mJfVj7^*FrW4V<|*esU@ zJUsXdoJ0p59~rUm=0VMj6hd82#pD9EBxj@3B9%q4kP`~>xLxS}6T3^3e$lXtOKY1S z5XA41qq6Xgk;h%)Br{)`eIx$`J4;1DLLD4IFUk2GKQy6MydkTQibGgJ4p z*@ASPHh_0W43@4qL=Lp}JI>9`2%W1SEEoH&`0|^4O`1@59*%S%Y%C8yzZey2q2(L2 z)pI{{3&DBVOOT5XF*Jm5`g9fb0XRh{ z@9Hv&F6~*OKAQi>Hkk%H=%Z1gZRH)m)^(|Z09bTRO{lfeYdk{NeovCFr{EF>*5R)2 z6vri~2^skiViZxtN$gEY!t=7JTY`F=pYLjP&mUPuZ0)?S_BxBr<^6Z{4%7lNIsrq& zYl%3$2yQ`xDIp*x-EQnQ5WRD6Lzqup3**tx6JJamQt) zlzcUEzq_fP&$)kec5bGpO{WV$gjh6v!~pZ|EbI99fK)7LEsv|+e5&dvq^-sq#WEk|l=h_BXMUe~Z?x z=J$Bebv0$7%7ZzsiaTonEZ`iG@T(6g-Y%RIr8`?%I}Fa$df0Y73Na#(85+}%GQ@H+ zuwoYP%iNn#W%ta!pPj2NSR((NJ~&egYMm1g1nHEWG)eAgPKR5>#aW%ljmYd;pLr_xH1{At=*^n-9@PJ4xSzW)vWV@eN`yIhB8|KWJQ8HeSP!& zA_QRds25fCxz?d$(~{`LOmt-wDq1KsMk~b zj_Em>rp~I6kKi?|zpTGfAs&(>6~iFW*sCD}+8NH&%KfvfT5~DZR&u=z?3Gf1qMMGX z50z&=v`E6~XlQ2GV)L>2mTae~Y3%?%4*cinH5YXGIaFpBy~2PPqUZ#7Ay((#ve4Q3aAv+^p2Q5kJIUCimhJTp;y z26x(*m7Pe`l{~|b7xW)<0#KidMoWrYI&SnE<~Z+95ma#S9v3TJhiTJ=N%VD&*6VaZTSyeUONhe|0MBI+B#BDfr2q*rPOm?j zV=I-&BVyCDDi2~M(v$G73m_Q7TvSt{^~Lec;rGYRZmbKWa7Zk~mjv&T)I1{&Wbu-93DSu-oxt>@)N2|0h~3U|Xkj&X2dDm?F}c&J z6I+NTj6J1>D~9TP3j}g%rvq5;og-Is@=)Ix8+A~}R&Zo~Q?>o+!9XJMgR#q_9`hyf z5g&c1_lVJFk3YJ%*jle%)9$@J<~CS|<)#<;do$OLG3EH1k9d99KBZgw>^ zz2K6DO}wfa%3i|vfx4hr5aYym(NcPJ>fx4~56-9fl7a(jJ)@HnlqqL#zOaCp4<#AI z8A!iB_LQO$uC@mWddOFPzDU8^~r`;3x%wIqZ2Yf1l8!Hg)*M!Nk7_<9~9CfsoBwJr#46_vz& zX?DK@j4}=Jg{1O(%wkr_BjZPmLo1Pa8RV(6M!5q0>#pl6LYVe`0cGsoY50J8RJ9!r zQC|AD8!;-}mI%xI%)s+?%sL35Xx+~%`E2D84HIl^->P_6zII}ZAw8nTe)P1*n$-j} zI9M*VFJ}y{p$ew@Ro$PMZ|77XCG76Vh?My>@ct3_GJ@+PeCYh0?Fhlsp+9cIW#LG9 zP-Pt^ADo)A2zt>#Mn{q^ojaFicPa%(JzQfX6Zi%7x{CYp(d)m&eB#faJN-2RK|3Sa zK^e|c+vZXV>EIA5zhhsn&(#G*24+jeTs|79ti>Q>BALa}4WlliV!KuPXXAP1Hr5L? z_Ob^AdtZ&*Yc^}7w2#P=lmls%f`fHw5T9W$Wm!9wJ4(uV;YhWLGigc7G`dyRscBr) zZoaiDPQE7kRNs7QHlT}x>YfkH+vp@p+OuDZr^|$dXxav5zhO^*4r#2Dwf`lj>ZQCg ziCYV;fvDkkoEcm@oD>d4l9R zn6HH8VlI4={9^NGV?7qG= zRJ4BdcHx)|5{~_h8!I(_t%DUqK12eSr0LMdmtHbk+qzOc8;Bs~?5~pvQJox5lMwrX zbnD$v6PJ<7LwgG9e0VsBhkPBo#JvlZOxd=YxfHRL!`(5MRS(!M}>Kz{BykR2t-o-+MvfDUqVADc1!r4QB#T> zlOC7OLV3t4Mfi?sIzkque=RARje=0KO27`uj~A+;$bU`(K=BLe1L=DW zMY$#W!EHZZmiLUQtA2p!sb#aBig6V-52^@-UGs|Wg4>V6LpA7%bu!Q zhCZ4S%oYZ5soN;@fz*@TUsMkACEwNOgr~*vNFKBAH zL|MfhP89&H%C}AlSZMfUX%${mdlRVdG;WbK0g3WPd}-QY&MKR8muM@}tjEFZ)P-JY z-FpI=?9S3e=hlgMu_()#{v-=kElKN^celG1oaj)~>bjyOe zUdUwMsoQ0*ia6W(+^=b=2UzIniJ_8vKR}dpeOzu+&H;p}qKwmRROWKZR+UF;ak3Rf0Fkkz`Jd{RxQE&2e|D&o$;e-3OA)J5@Rbj~)cxO+A1+&; z2w{+>G_aRLYZpxB_dsQWSsl+-QW)>0NZu7-aX?Yx{kcl>#_Mx;R=*~S1S3hTI}UPk zl=JpkY1|Kjme|D&kanN4h>bF&i4cH5!(BkIL%o%r${4XL)RZAT@jB`*jlaYZ#i19+m%k$s#Hod)(W1>zPGg>Ll{?VJw z9^4!&kz^(&6LZO9NdN-ZlhnS>ISck#=+%7a;fcpcX7#ersTP)Kh2F&F*P7}ZH_y(- ztl0EJMmkMT)#-Nay2hqD{jS=;B}js=GRVYA?qahH4sM28m+$Z3(f~IkB=0jR-`yezTcQn6upbU%Oe60e@u$S zbAG}4>tNAwYFh4jgg8}gH@j76>QX%&^>SwEN3lPxB01r3z z48wrpqg_HKU_9Mb>eHYuScRj?N2{{3$-d?voSp?-zM1mN%;KeBCextptPTQ;s=jz% z#UZm9K-^2ZGVdq4@g@@4XuU#-<;y7xH#<`S0ZdYCH6MVY6Ot|c9Kh`Qs{-kujhYHy zhj!lUO{n=3H62)^$XqBf42R5jPuD>v@Yx8IK{T6dl9XtuiQOhh8#-xiCq5U3_)K1;@3Z*VMp+d=_tVL^M`^|Gd%~Pc1=;YhblB(m+k>=4< zu3qT2Q%AGY58PmS;j?*Dn@wGH^|;KzYU@YYy(WbceCZSgBxC_H=P$vdiZlJ9_ELsdh0pjdv?6f!SeTYBdY<)W)jwIxFbwtB~&H6+uBRFwh# zubr2zwC`iBjMEb*@(LP_2NiY2IZY#ecdF}_EtbGJwuM$d!@g%Y#cA-%=to;@JE}c~ z`%SQ$0;dNpO`y*pGNb#Ot-!{#*rQfG`euNDb4k#pYp`aPx(qrxOplL*HBkLE^^VvA z@Ia)9?&oXsmZZeDowVh&OMt$Fvz=kocaR`FHP|LVyAv!F6h7fF|9{z zacVtMTk0tSDHpZCsY%bs-WH{j0th@6_LWm^nL1d1**ijg02tn1{rw3|5+J3~iL20+ zOKU?VlkN^>iaJzjA9x(2;74$XL&p9=R_Xk>w6BRFf({=8w2dl&W&aZ@eBTqPveRn2X44Hpb07Z6VS0s$j=^dq0(e}96bj8&h)9cT)fN=?-%4ZI zWkW@_JMH7>IjTRQ9P)EQzr*}%+tYR&OOiqIsc-VbI*b8jVI;&8g~ssnC<$+;D-mp; zSXP}tlXT2~!OSQ}Pvo*UWono6PB*8c04Preik>S+ zwpM<90l}x+K`pN@D~@&N7e`M24+yp5HM*s3r0yU4 z^(ReC_)sMve)*mj$?s^Flh_gU93Geg{zTfCV$7bMyass+2VB&J%Sq{!;H9>^j%<6w z5hdwq0zR$sjnXFrKnnITD9&_8k1~7-Tpehyj1T}*wGr=(UffQZ{C-r}MbJ`nX5+J8 zyl{4c=GV3-MuDpoqYAp(IXGvN`2t2|%jQ1$juz;Qf-_aD*jEfR3KbW=KKLu?`ImOJ zy#Zbh!+n2O8KBWhkc|vaxD)nj&;cMk{&y_RcJf@l3r&e~(O)4_{R&roqM*7+K(QFH zm`>x<-+@0X0mcd)92Blz z@Q~zAw(y=WnS7}kWGpkQG8UYpVK*al%a}30;fZ5w3@t9(I16xgV&@L=%8q0nrRsi2?7_81%{!VfPBclc;`rn1bkygYNU_8QJ3P z(L%5VAJ8;(S08*syAP$gMFJzEaLxJ#OlVef(TbSX@sqO4 z9V04?`8@gvA`*MhrurwbZAW{d^+6%@a-T;zEMaRlWw{#80^v3RQB{!Gow*aSI@6Rb z2CdC4W;ylkGZJ?0?FylGBA%sv8~-@g3$kxIdp^!y-(D<0$CX~-g6{1^s1`4F&za2p z0lw2!HsuLL*xf6(%EXlA-Hv=a*`KFm_4m@zyP(Hu{c!lS0XsQSTsQ?UvB159t`CsU zbc&n7gd~;r!_YZRZ|JnI8pBpW7$E?)8C&i`!_wsR)_7NP%NM96LO;GL-J?EVa*e0SgQvfm9;DBdvp8MQDT z(lU{=aNB#|;$7&8Gd4V^|3Bf_*F_f_$lZO7w}u9k)NXdus#Q^ka13^HSg~JL7f|mg z3+6M}Y9)0qXIt(Bh-&Wx0YZS(WO!k9 zBPvYLsNs!MW0*}t-4f5h4YKoM|L*IBD%nXqiTWZ>DvDfX>sRXf`|4Cwq9V<(e1R-q za=~*{J>9K`MGzs^5OhXeZ4elqx1dte{?1>+z0Mq zRKn(+CSqB#47!S9QAZC2F?c5UUq%!C&n#W|PhRyQ879N@&1Sl}p7R3b+;HOMca*)qmoni^k16NAqz{YMAz_iFyvXZQEs{D*r(y~XMZ z?8La)A78AY4EmX)ctT-)ui=5Jx$D>>+vF9~EQGjm6K~7#744%9_UHzgj4g0IMR8^S>e)D%0eMPu0XWMQMxmPbIL4&FF z$lIsVc_wWNla-F3f6x?Z8ifi#KSdRGMgK`%w5aweezQx^%;OHfd(1@@>5(5bgH z&ZhG%9HDTv2143{W7f%!_)ObB17+}eVC6h;vQR3J$r|udVdj9XOuWAS>!aZcSi#ps zj$-r+JX@%^f70(ZcLz4Ek6)xMHh{0^ zO5=@VQDqD5>eMRk6kk^7N6$ecC-xg%L9ey%{6rT|mOtCSH`@0oki+|91%L}L0R4Ue zIXo{nIPaP?=rfWk5qo-U*LSF03vd!`>T^&N+Lv^(nTk@&l>{0Tnt?w{Rr!Oe?eINR zCHJ#C9;>4lqX&R=`V6$grIkmS=t4z&)?;hQ!=2la%yTK;bw9<2Gd>cXQ0(2{Ki@Ny zhRLp^AU>FalXwkiyLvh%LVe(x@?lTqRFyA#X*F~nc_aty`Z#!3pzr+MaNgU&xh+Fd z{-;>M`4J%9Z%+%eo$l|WEB}^_V1l`Obl=locg(^9k980Ux>YjftyS%Jw;1pLoKDD8 zaIRs#`XHtkxBxEzSHci#!TagF^c%Mn+cERSLL0e|T_tJ=Y29qojidCIffgE$^!>zd z&-aSw_#8f#;W7K=qU0z0mfIJVf4rT2<&YdKz-?kbf#UA6XGom=WH)`_2WokhXTOZk!78^hFvvKTybw-v6lMx z4$o)&uE#j+3l|_U+^aqKbWcKKmg4dS7ctPW?+9WHNX( z6-A1Uqr}7AB!u`>HuBnS$P@3i(_5VA;x??K8*-vFKJ(fYB)=~A6^65Y*HKgGGJbW% ztQ0yK38M)S7fw=Z*?)^aBK}-aR`4;?!s~n2CU+IGD#ge4emmuzT9k#3bXI>&oBZkE z#0CiUGgbLauY@Mb4gj*b<6tz0Qeo`Fsgnt;&(>bot(EQW;>z)21ua8O71phn7H|7(? zhjy3H?k*nRe^VA-$_DzQ;u_2tlpHUu>W8ch=>vigHzY@=wGmh(5EQuu0NqUrb@hD!F?F z-Y*>k_B^zCPd*F@6k3 zw2v9nXtnjPQ2y?RwPf2wiMx6SnsAl!U2hjl3!O-1RX_F286ii^QG01_m3$yiI=y7k z8Q(Gu?*~T-Wk6dyE5H z7y?j}2xB%Hb~S_Rm9`^Ie*i;-ZbFm{UnzM)1wu0Y1K1P!73*^EH&;3ed3DeU*+sg9 zkN!9I-YTlfu4^BsJ2v2^Q&K>>q#Fe!q@`17kdW>Y2^A$J1f{#Xdm}B~-6>uF#q+-J z_d9vM@%SG7Prehz9*n*3d)@1vbIrQuHQiVPpDuKg*?+z`UQg0L{IUX^nk5UI~CHL=a6#dyACL`|q>HBM`z;J7P@8Wy+igj}-;^LzBRzMa2&VbO1p z?_yEYcekXQQ`OTsoarKEIi30K5#|^siTrczu`Fe(3qThUF^;1+9^`7g92vviCK7(- zIazAHX3qWfnJ5^n@F>_EQYgX03?QvTv_G?oP84TgX z=3*kKgTd>0Fo()Ile#l*kK<)V-~A{L`2jmXl99nlneN>_KUHDGIGwdGX1_3&T+2}GC5;8Wxyf+C5 z^A%_Eb;`U3GO|-uQ{H}npu9q(15i$V2`U_Ak#5A1(Mrpa&QX0gntZjaC}GgB%3yzm zd$#obSxny+;6UA33z`RwvFEZ5EB^I1#qLIe1Hcm+SL6)+eP1XXKLGs6oFi{1f1h`F z2XXlV9)rwT_`0>9NlA~kJx+HlGX-5nUJc`XhZU4=`Fk3y)|0=&axGc}#@#G4Oe)o1 z6b0eoC~pM%*@P+XNWYw;^S;(JRoZh2-6)SxPxJSWD>>At(;v$<5kYNkWc4!7o-&+_ ziSV7aofCSaTs8uZ7J0CvWGxLtjozO8kK%k89ROaq8yv2Eq{4AJ$}En4gH5I{ckdZm zESN>gVeuA|C{;N3G$R2`X7H`liWIJc5~vp_ZqsXw*87|&E!+eF6wzsS&CYi5K3Hlu z-@shTKrLRylZef4F~9sJW5?h4tv?^t8rAq68vpWvH}p~x?b{0xsVT4C&9`7YXDM)L z&^w1-cO9srbhhTSg0Va+_m=6|DX^P#wpSbs;wka2&~emds|ZKxb4d! zqXU!UzO@KaZC9T&tI=7cb)2mppdN~Jpz^)}j0TZfx^Bi+v$YkAQLm6@)N&B& zdlwC)lOk@0v=&IuG(Nv!+9iSr4l&kv>;( zLy?&d^2FUG=p^E+J`uC)i##Px=LrHe?OxFO#h4Ua?QSOIddU4=CyXF=^##hAXh<>E zHedAs^J`zLv3$#nKKsgDC2E4gzt5Y9V*uas2i)gp&Y7*H$e4u0oE<=5;(l|uS%z<# zq&J3#NT8ss0pROAv06Hpe+!DiD?NXCW@8d8?l=RF9AVIp%b-9!Wo+gsRoUfw%v8Dh zf*>}Mlv|3D?2xMAbf|2kRrZZZQU9CklDg~`y2R6!9H-U7tE^4Txp{nin;IGKn!`l9 zH&-G>-K@|EnsUooaTE~;Me1E;v4WT@Dt9RZkBcV%-97mX*`%jU$7f&k-`cI(6%O9t zW|5xPpwg6?63I<9K!8EV4V= z>GhTpaQ>CnbM@|v`9B4vu@|uRu*lH-#sN=|314#=oUrG2vIQAjM9eV6^!5ObotCnM zWFO|Q>{#?1GwF6gfx1l~R1!4Jm$?hMWg<_%R3heBe9p**MJYT{bjQ&zNgWCocm(8b zJxJg9yR?m;Jd(L(i z<{8B&b~e7-RP24S^((U>aD$gw9D-n<-bGG8jw>Mf#Q-!z4OG{e`qm~V*B>QH=~o(XJsD~!X5Zzu0$Gn)X~k!YP?WivfNV{MCPHG zcA|x^W^>OCXyKnC+d5oL9%w(@`T%*blz~5k=w?^ZQgGMPIrH>=v;fEkn7g(Kad|zp z3`~-%G$l&Xnz8>{%o@k_y*Ao5f!e@H3<>sQw#5A??(e)$KcrzAkZ~0JJggY=t{BVm zP;#pAb?_l#hy!r$C5Y9KwGn@VDOdb8Agm;icLW{cq(dYR4_pLK@1gFB$wDmfB?f>voaI))2(R%KjG zxbts6m)lP>6&Ivy0(+0r#*7sNaME?0c5Tge4ZhNx0peJ)GQ>Ft_+$?$iJyH!hYhkd zvtTt6hN9(xCXCFV;vQZN(WfYLeAGJvl;FuVoqG>Ti+3&G0F>#W=XaSlj5;vJc%792($PTG2uv#HT8##$UyN zfsK62sYl?}7U!FEOo&FWyp``WJmoV7+;2(}-RO=a!WqphBwO*j<3Hhlr}8$N zh-ev;v_BzMXuiVj#6PGE|OWb4Bs3=u|A? ze&{spm#A*NEh1(jZx$L`90$khXyQESVm#iPN^+nqGSmx86#G^F051L!a3tePUrMm{ zzPoyFECN4HjH61}-nNNS-jl7hQART+A!Hk<8(NANJIN=e;~BlqQa*&{DjaZ%?~Ru7 zZ7@m_34VwzB~OK)I$cV<2_7$r3`56YCIiBscGn^RS(Tntl~Wx9shqCgZ*w|7*_g9PN=f>Z@}nBQAqO{9TrG}RLd zQ^&W=4K`f}YjBtBh5D6_2S=#U4#c?MC;^jOVaN%fM6m5#=*Ijym~!8D&S!l$egX+~ zejT%z<9@i*v37w#$$_^(Lby(O`oenO^7o^I4;P@VBasuovz$24B*L=GbFxwG5L34k z)6w)D2jRFWi6~a>YOL-xo!w0|snc}OCI+mOqHbcj{bq^}=>-2Km2Bp?yBurJ8!OuU zR0J-iq97ipOLDe?N_}-|uiAW_>+f^t-yeR+DaK-#Ciw(W2@J?m(@qqFI?+F?@G0}a zJRI4ADJn-g`Ty3|YKwT5(P^b@D37{SQVRGi;@!ThwJA~?U{j?uI&&Rfz8F_y$MO+A zDqS75EW6&-2BTYU7rS!S6U4vPecCOV6%Mz(Ncz#_7JNQ^H~7sUON5fcSKm`O<&cxH z;XI*9>}b;aPOhHJ&UZG6&->firLLhT|LjFb)jB*PqGd|*c~i5asO~{v)jmxiqGgnj zOF6&UdFY(bKKo%v)OmMX?c=N)k?V<%{$8EJSM%bD2DJlq+_8x~n2mbNG>ylixEGfF zwGJjmci}7gHYY4P?v?XCo=yWfs0=aE4VVco$!i^I_9P$caux@r>in*>WwIEa14Lk- zU}b0^hK|TdpUKiMx8+TR3kUqNpKCdt#X)?}u%B4?lB-2lpkJ8=PFGSVlWvMYaiudm zWTE4U!WuT8Kgb5l+#afze}F`vYRZWCkn&!m4rgz4xBF*ccp*4ys~$#XEj@{m66`PQr>_t}gy}CvK88NnD5BZ=sw4yr>%y4Q&;=SFBz5j1W0*yy78K*o zjB*0|W-=Jm*i|r(E+j;@wD-|@>+z+oXLL^3RFC`3!zn_jcmfZxA-4^6TB}Z~es#gj z2j+`U9*?-M@_^7htilOS)j~jb>8PyOYT+SY%|Yv1iN2-RDPG3YMOEMV^g+F&DJ9%r z(LivvB+Fz?JW(=Mt06Pt&4!!|<0j^FP2#& zFymD&w0Pu{{P%`=={_$cHnEX$JNhwl{Z>_*P>P$tm?X&1ZK!BO#Z5a3gF}6qNdA)7 zjQX9=kL|8a9z1`6y7XKLT=p5wLOo0Vgn6?NTw>Fm!*ncez8JkI+heBA`S1r%YTVbE zSp(f*7!3zPUZeR)C1Yx)V(8yD-CMK86OEPovD)8?Syi8PXjvmzQe$n8Ik{2mYiqm0 z^hXd6)iS+Fx)Ik!cHSk-b=;kOIy+c6YshwsdoCLHz9dTKOAiLjIhTl_fHLy>N+pXU ze5%9Aa7ot@tv$cmHzUY=E1`Knt)WwT?OmiG{fAVgtWnJG3SAugm5({{=?P9IA_|5W zSy@MN1ifh;tL$d+BkWy$Ph{6}P?2a=K(}?ktc{Pc3L@^w=!1#9`?#2;bMSLMw(Cgj z$PwU=v7L~R{#cZjB6wX3Iv=&@e~uO8L5ONw3Jf853zu@p#GJNmQ_@^zVNHZsYDP0vLR-I(f>B)07_*|Xzto$R(g(vX{@M8w*1`R7=xW0Il1 zFQBCRYD5BjvX8}_6Ad9-6daGBXz8j{gV7Q^8z^T!GKruQv~I}XeA<^rUz=_x`~iYc zu;z^CW7bB+tUF2XN*B-D>x*wQ<3+911(Z>Jh-zj5T(j8*8eXohil5LiPTp9Y;)40r zg6dC=6FlS;UV2sSc7;mVF`2m+ppj8QrIEeTf*e13xJHJvZQBy3E*WS=&$uu9an{?4 zEp<)`B4?$t3ETaYt9wr%PtPiqsMm$yxLZm_M6c3y$hjBtfw(U{s5UmngXsN(mT6&- zxVAlNj#m-+WL!qI!;KQ<|0>VyTW;g{Q`g3eIZFOmhv?wLG>_=xZQt`{ysF#Kt|&Xv zf7zqzF8Ru@g@1XPw5%|>x|kjEn*T+V)9*{WGW0Op1T@(2lc1|~wb>a|*P%xg*F;VS zQ=i^(JnTJKY(yHf6h`R6C|Y^5<6zKHo}#R(re{!t1{1w>lM(NBd6Qa#F3IM(!#&{3 z_Th9Ecgz!C%4@%|r8>^=<{?)qQ5GB83LatX?Ad`Y!XYH_vB3-C0sB+om>WX1*>DyG zZS9cqQ1UlnHBF0nk9K}S4##L?u3D!^*ML}Zq_h-&l4nAqAr|(cDNuU+PU?b&qOE?q zvN=gR*CGSf2qn|H6?AvYiLgvdHVu;{RmW+Wa$?x>5!aj>Ds6aM2?_F*Zu%U-y}=U-nJDatKf6hM-T+O{Sp!G_DR_sO5g9%btxF(WUsE4~Ch*XpU4mD}g)9 zcfvUIod;(RT5zKcVe+NK@9j53o0`(tu3WGB$z!^pT6#2FB6Q&R;bsIuDaZ6wl|8%F zYa%GZ(=v;n2%D`e%W%6qOcKrw=ntGu*im*=)&t-} zz=NFe99pxBBdWfVmpt=|A=o=#P8|(>kGX4ZV|#oqV{YeklmzUEd}sBEMfRjfcz)aZ zj;!9C#x=Q4PUWWpW*43FlQWANkCRBV*7%VhA-5rI_j!r7D9RmsyOCOdERO|Z-QXfh&*ppq=B-Jq z(#G{Dh-8H|I`hL2QE?t5qjZXecnCg##w5BVi^@7v&BNjzTOg# zFJBk}&Tk`rx!Wz6Z<)RbdKl^Z8=iQ6cR+E-x6Q=Z3#{REdI*wgpo+jVBZ}Qf52a6l z%<;Kw6!~V?w}z3;p}tzu@b7>s!bh(bllduu_o4l#@q8UM^?XL=b^_=b+8D_v0u|G& z>?#Gz;qULVnb_T1u}o|z)ECq5=RJqd9s?#TyyWoy@Au{2a;smxtaT^b|0%*+if%PX zj(%XWTKRN8jFTq$v2t}v9r~=`cM~~P#|Ww$Fi%Xz8IHc%w<{8}(%&b2o`{1|r6ta$ zb~7{GfE!^5)HFl0Rr_tEno?O88Y|9dFK<8qeerBoc&$GQc4NUdIbu1V$|jmJMBXIHP`27h;!5lrz#?Mg>)x%t(yu z+8b4YWY4DDr>di-I!5yc;iPvmS+5C_8}&z7K2zr4AtZ; z&W7u0ui4Z~aT^=Vc|!~4r$K`+258;vhH+`H%TH5e=hLY+E~YaGbC*0Lvybz`Y(afn z;}&ooe>A!-q>`d9FR{D9jjoyXnsr2-5{JIH9I~Tad9~Q z^=lCqt6udWm1poaU+>Z!V@@S26Bg8*lvEQ9xUK^4OEBUa1>v_doB z6u~3OdM0zVp|u-L1k(sJOQQpChH`TxD|$m6!C${}=8eJ-d)5!nvpob;g9(8pQc(n< zt#Bnd+WVQpZceQpm0e2R*+3{Z~iQBpYMr?S;MERiU8^DAg3{4_Qu;S>G6k;JuE zgB{X*a64@?D}6fGkW4;hdleAgC$FQOImalS<-ilbO&sRzAw-o2)tAr?IBg@fSqd@- zbhClkL=drPXTnj~C(9(8DQB!>yXjB8Xc1n2d0J)cJ7m08beF$sA4_&NLHb%9Rx9%W zP60nTyn}ddP?pbjif7p??-B=sb6-)<-1i$I4@uJtEC>{=$jM$$nAib@j_vm?)ExeU zNHj5*<}xTy8rHx@%7<^lil}#jnz`AU{rDW0+5^yFOF{gV5nDq)XQm;zxv$i98ayh1 zzQ~gFf$F?o#>)u-ZJQHnhgS2-CDOpA#{Gx#RofIqZW9pU;QRUn%JU%NpFohryICs5ZpFGP2NU0Q9o@bhGD=j zUn=ppRl5>x4nt#Cx$X_*^3u$)!?cZ-cF1aqh-dAyk(VKGy8xPSI>O-Dc|ah5sd3m4 z;^YCX-H4)hpso)sg-1{l9+`skXBRzqhcP*NCt$2oX&RSZ8eBEGKAP?LhHo8@-cEs@ z6{b~3Aj)4D^S4+)adH5NTiP%qj(bg!hA* z)pIKW*X*De+huLd*ELSxb?N|NyhFhH)MWE*hnw%ny9PnnyM{4L9vqP^RjB2))zVaj zEmQQ&+j1b=3m*LM@ndOjMlFxcM&n7id|Sc~_HI2gLR@~_K~Z~Lr}>VnG*%=ZVZxe` zJ9j~qlB|sYD-NQwm=Z{%n3d0C0J~3hQyFs^lOW|o-kERNl!B5Y7Z6mjyZ@2yh!_%Y zqtAg_cy1k1%dE_gX#X`WBd9Hp5k&q(O@TFIFVTizBT<``Q}VY3#9-$P8@}15 zZl|?ti0lPZ1|Bsw>tvPw7Fjia(Ujkv_AtnNgPn%8&AsIu9oO2iWiBcBK%0=UUV_BX zZ4p^*oztKM-V_dvcEKEN8D|B)NJ1b%3Z9Hn;u?rAND!nz7dzO=7i{mxHS?ay2^8v$ zFK$98CGe;dd%i2n)cL)Ng0g7Rxv{%!tK@P9+a3e2a9Bpd2q(w`3@pf2X7!p;}sJ696Y@}55eO@N}w2Tndrx-*ui&~i-j%+B@ zi0h5^9<9PepvG>O73F7u&Z=kr4A8Fp9@YKW^xkK6uj^a=Wkp?9I*&5;szsg8=H8~( zC!b4a!eJ3tL3a(!MEls=CFqjjIk5;EKjkr=EqKP{dlyHZE#mi!6~B4EwH7DUc7%;G?CmYU&p9;vw* z1$5_2vhI5~Q+03m!7C2;K;m9~vJ^&(Ftj_H~5vCkry{59(#t+LGX6k9ci zru)f@sy#4QvP&(Ye(|Q1XDZ_pJ|gNZnnqexI31CX)OWV4Y{4u#Q)=A&jnViu;$)$> zN?~PWJ8nn=$~gf_vzu``BBGZ)m^ub`X-(`KsHiC(B_|G46Svqd&;eHf`LPsm*C{e3 ze|@E2?y`w;!_*gH&(Y})ddzQTL8W_rok&Z07l+x0XY&_X-mIC=z2eX&lMb#Fsa2vJ zRk2(UW42eo933mM&NYgBMfpb!$<$}|?8l>Lch(|&cSR_CI-fFT7hl5ZhCK_ERNduQq z`Romp>qnh0TWjf~kw&brio$wV`4=C@D)^N#zkB-}t@}*HTt#5FHyn_nY&b{1X`jxF*<6&1|#sR%ZtgS*imc@NC z6&Qd#)MqrGC8WP{3ha^AzFvwbv-2$mByDwdAU#uTJiS~tASwh&jsBN7zitm#(%RQK zB-tT&zH{&KHb7q&dAq0Ai1k$7zS@^N5rmPS~%J=W3E^HiNi$FNW%1x`) zskSET(|uw@Or?KBPHX1w^Dgy2N_BKJMfW84YBt@c@DhFi9X6 z%2=myDw)IZfA?1=ULFw9Gq>?+sfUz+MPf3CK;RLtu%K$KuP4DYr zC+~TU0i2$x;e>#F(^eNuEZJv-kbaSW+LX~uU7Czpa^}I8S3vYS6nsu=oym6IH@ME8 z(cl`iwsu`?EJNq^uEdtIrmxZ@=2|<%E;bi7`#kX4?4z5+Hoa>c3aFy58?~!Dg_f!r zK`x-RRLkIMnC$li>Kt^uerMKaUf2J|Het_WVOJa|12-dA^7GW9`G>hLOJv>=#A1Vr zdpSHu@y2hxIRM@>8p{w4(cyghxr=Mu?HHseJ7Q6R<5eHDm{KL{pS?^wQe8>EmDUp> zTIeW|g%v*aYd(Yzb9VwDhIZ`R5T;C55bb&blzL41(e+3IkO1q?qT&AiEQcJpsXb&V zJ|vpTC_prZ%GY~cy97xVWQD93vg(w!2cBbH1YtKOjIvvQ&Ih};2k%)3kz~LuB>KT* zoM8P_HZ_@58`o060>~_jk^())EPzP&)o272=TB@&aLuh2i}VxkjKPYlMB^fb`Xi3D zQSeZOWx)lEXocBaVV`zIJ}KP=M++}JVw{PqHg~-mE*@9m*MGv+R`(q`F8*{QJRs)K zZ7V11+Lecusr+ifF+hp;H9!4z6e(}-03%f^ms`0!;mmQwk(*BTQ94y~gMW#V`k>{F zaQWf}x3kr7Hl29`wgH+gRn(zUE*!3A_V@&<_mfUqyXH_6J~q3VoROQ0uHf?lY&+dJ zTac5w&lGVIh7m+}bkwYGS7sH0V)o8Cxyc-dH9zhQYLBRR$yxf1K-VmLy&iPlI%uFI zeGGUgr}1vG8&ef|hG&QQBskfKt~_kU#EGO;QkrawpUJEeD-A*zJfI&Y2ke8={5DRE!4wo){6xAYiZ5{zlsb`k=?DlM{Cyyk=ta9UkkaMD!q=HKzNV@^y5KzOE3Z1m#9vdOPz*VC~!e zy*NhJOz8_uRfC9ktabMo6pW<9TZ@sj-B)P%;zDHr1$=peuxnh6TjgmaF9?QCZFK>v zD4WlB)?EW(p-hx6!sLUoIv)i(SHPGX8R}=EQ~GAF8y=XFQ$YVmGgiS71t^J~ZoNYe z8H1jwws^=RY5k_RD?W1u#&_Dz{8Fhy#Gr<)E0SK10q_%_7Fm{B-$Qw0Q06{m)SsvS z>=3cI>($qe1xnE%tM~VwZ6@5)Tn`r;OR3sprW;DXZ`>f@&Ai8-%NTyXZ)NGb?N*Cqu+V9mAWZ($JV1om zt(&zD@&3jLS_~eXd}XkbJ|0*Jy~{W1gHM20?O-5L7RA*CM;mX*Z}DJL3bV3$V+4RX&4Uh*PLXDKByR?R%2FMeEK z+GS^JwwV6qwq&Z@jyjN1pi`O8v)`oV;OOvHFjqVDG;%e1y6OYHf@Y6g8DUTEFR_b5 zp}oNud)0>=z6}qF68Uga>}4of;_6+PMO00HWb@;wB0iJUWF{tnx?fB?+Rr(5QQX$* zZ;ThED#mk2fT0aEPHTN7NjHY&sIFqr)E>b5%5b@40Oqe_s!HWWPzY&`cGGUHww9Av z!F{N8*}l9oH3r=;1iZxwZqT@Q;Z@Suj>Gvn+%aq#)A-$rT2Z2xuT=*$Gs$V?qCj4e zSX2E0gVooV&PX!Msb)kRf#&iUrhNcBeD3b3Sng@1_W|HGM+Y)|?{3o#6hY>fLmJx_ zVT@UjfVVgC#zjz(ph(Ro!Sq7NsRg2f_aWPVRL{vK+pwvz#)4Ux#|6%NbZ4?mrlCLn z7Qs?|(7bv)ud1=3m5)rloNj9tmcR5e`>B+=4LxXGBH~30_h901Ax1x)vSwE;;$$ee ziFLl$Yts_gG9^bp3X?|$V; zOKQeabP}rWiZk1FsN>=*6-Mx3kqfBYXN=vz46RJ>@~qS?(kbWt#;d~n&V&4=TG!3t z4%vjmJPPYd>v1K~yKASBF)A<=jv*Q2#p*ru&Qx*c4viSL#j|HIc@wuS5>U_nWql3~ z4yW>&w1oPLU%I2dzpK!Ql{3hhg*i=MePz6qjtIqDn!=7rQ@mSDSOLV!_&3ZwkY+dO zti;&+W~uvpW(#jBzkSN4?=R2XXKHzxk5!FBv-z{1T5T;3ue^I&{;XPdOJk^9mzjqE znw{Y2kFh5s){6%XfA7JCy%KyGSsU!`HAX3-b43sTRn*sC_9*&nmV=~Ouz zE$fEnG9GIxzj(^F_3YX2463r7TNY_|PBsKB4kXiv=w{-x$pBH$a> zNVa)|uLJli9^f9Mz3(F0BpT|sZa82Kzgk*2qI}#ACZs!rgWAmos+aZ*V34`u3p#v z2m>gc14l>SNk@)TsivI}AXk&+n-d|Ixl{%5oIF#mC&TO$sHTp(><&L2cWt}JMa+&B zPT#+M!;BP3&bXe3<%Uvbnp?d-syCf%w%)z_zrZ z%#eeb0Y$>+1AT+yzpX9mtPCn&(rSU)rnDPPo?7#TtgTJp5V8punGy9+4qpUZyPZOp z0B!~n))t3>I8Q*_7DwsChuxCh+m3Tx(63c|B`c$QQ{*eL#;%R`zVswE3FdNBCl4b$ zp&gOXb3H>GQJ?tCl)GJR%U!dV3yOHYqU=uV1w~mPFU>`9yW+`pw0X8tWw^|n<+(qk zba}G-@Puztpp^AuPFn-iRZS$FEf6DUIX(qR-9vhHw|b;PaH%LKpdsYe>QYGUoWK@E z7}=5%lszNc8R9H~;C>xfba2?t)XlEh4RFJ{!}G zrf9Ax!l=hi?kdd5uOZ z3HbD%*>IeXkl3=b&?YfpD*H4B6#)t>!B)04&3FaE(vGdAELt+o_{5aHC!(RQQ#K!#7$W7tGoT*)- z@M9(Fqc6=nY)-WcjV36f7fh)lTz0f+^bCiZ#0ST|KO;!eSg3-m%FJhssFUG+6%i0s zc`=ag`YXbkx>WA274lp>YlHVpBxu1A-UZGDN%C#O9Gm#< z!&C>|I1mqZiHmfh+S%0wzcJeJo4?1+w3|9Q#=`rkp~IR9&Ui0L$Ob6`n>_8#)8Lmp zyqK0z&Qe^vlI=+A?p^K)r@W2%d&v33UOYS%-$EeMnP_uEfaeAn(Sp5iHRf0_)RYz} zn^vsYSJ$RDMS=L~?tkeueSQxqM`unp18{;5R1r2DPnTtitc}`;5(Q;47xMIy3A@P! z<+Vf5>eJd_mTr$qP#`v;Pq71{!8oKbx2qODvSHr-x)8h-WZI8cN9;+a(_9ah?H_@M zu-~0>;aZ!-H6MQOgfE=NYonrt^W?SelUg}OC~7-qjb_2+GlRrSLt4tK+pCJwRl*bV zB%J3fMf#Ov+YKMTj@#Sh7h{=U%xA$?zDbNc7j#oE`)2WTYgn`4tIMxaa@TGTc6YwQ zbl<#ikW%1n91WEtaufAiN8k1yG>@0pwiwy^?bQhjIY~6Cl9CQ6YNRnh$Mmovy>1nP z2E7uD{4j}SjL|4s6+*fFjiHw;Jqb5feD`O3At1Zi?>)EWKH=o^eRG z(8iG&eIMW4h=}9Vn|F9xwcqL!j32wGo&D;-HK>u?#LOrcx&g^Hr-mMYJ{+9v9_ zD_+}qXp)V3dJQ||?Xc8;}X)XN21Ju-JHxT8M74^Cix+6(f0%} zcd3F(_*Oub=ss+nG+pNZ0-{!jqKpAJ<(>nqDT<&D1~DdI`xz|(^&X9W12xLH8MNSL3aormwfeS zC4`a6e2_3ew-sJ%ZZznkd%T5>d$Lyx4{YH@>}ke`VN zUzvN%uX{v)SF;~#`u3H{9-zd{0r_*DRa`dpI-(D;{X$|(24N>@O#}(Gptu3#vy{yT z%VKZht*=6R&ln_IN&wuzx<11sAIVXN;ahs|b}W24S48w+s)xGsTo}BxMNn;Q<8rEn=J#i%dZN;!tWsh2OwA8frraNF)!C0q7 zezR5DUoyi%tax2_W%%7iZj~e#lWL6zBi$52FA3(D8pL z7W}UXKriQ=VuI;Ad?rR?65;S!mph(|*JINDD(tdv*JKYSN%(_yk?;Vq&C=#{r-z zc=O`d2u9SnKZrkpq!s6r7ry!RL=FR%+h4Jg@b?`}|0%bwq=H84i&wqm3ZKQFpu-mY zcZTyAyXCl>PKz{eep)Gn7LY1rgd`ESkYtuSx1CP&#tGRA)(>Y^I>SEoa|N4ks+f=h z#swQRBdak`7*4b-EWQI=`j13Bet!T1mZucYLLMc7(2EfSV-FOALpDbk6yuFDAHmk# zW81gk><8$M?=;ovNuk43LePPnuf`d!fRrAO=l!&xHy|Tv z@e%Vajejdd0QjD(pvg5BpjCQ6)>}6|@QCT}o$>$as8xA*&o1*3v%^GF*dO5SYRt3> zU$U@hUcZ($2bl+l40$`yQva#WjFkiZGmrng&((8)n4#MqD~Qo7c)3~L@?&|iV%LYiT`N8w!sHq9^0!Sjt2SmIPJ|2+!R^)PFuW2dyv)~ zeXR9hLG{K7*D?d!>e>l6g;ov@9tk4;kAF%Z#Pi!56o&vr6}{d_UjjGnavmP*d$)t{ zen@Ds(7~SaP|4!_;(kWCKsW?6YQKN_17!hhrX~%OFDWr0pl>}!EkvJITN8zcP~sn# z^4Ds^!Cenuh^IXT-0#K>55N+}E>>Ru!Gl1=(@c;7>3KfCF3i+F)mO(@v#@WO!fc$2 zFxy}@{$xDwAEwU_GaZ_*(;nNJ{Jd7`EJ0F>#DDa3aQ^am;7X5n zYrB!6_NBL(oPe3Efb8I+N-^gD2RV;zJ@%w^cO+>9o9cv%3oJixkW&N_0GpX{%2|be?stocl!5U{NL{V`-u7f zK_YD2F?M_wc2{dW#`Ied_8UEXknKPI{6k#{rUfUrLqEOTryp=FrL6GBHjV-2?yiy( z6n|nzAlWZ~*5r$NFDqtiOprpb$V(<|+hJ$?}P#Y5r)- z|7G3NAi(TFmvmO+|C<}K0y}H&-#1tl!`7aiSp$deWCPgC({f}(wzjmTq68wnJjWztgSlokjpuCd8dE^9tq&ELD zaUX*3HU2>R!GEzhCTaKp^I$j4Ck+3EtWslwAL%TVF#Q*cQwakH3&vso8^!+!;vZ~> zI3f5^X|t*7f3dj#Q>1@w*8eHey_WxHjR!|8pyVMM9=x)xFr3 zJf41)nk2T?&&@)_{;1ul`@isv#Ocx04YMk9Ces>qJg;n@N4jilwo-ncXTTKHt~^gZ z>$9iwe(B?p|7St?zg|x9_BQ&hJQU@j(d`&p;P z?cKMRIyFtM6Mx{Z{O2of2!&QUCoWb=*wI3rNiR-Nz%u#H{Lx!n!>;4&AKdef+`sAecAE8O8Mn;l;>~f^O_j;2e1;tFdg=oX}^*`7bVF?7tf6ydlf{gB;Lx8IlixCbM4NocWGPIF+MOA4C&nmyNx& zXqc*C`RQ+@^J6G$j-#b?R8;W~#Foj+f3;G6@>=G7MDCZNd*kDq?w1>DtCAI^(}15F zhsO#V(IN-2u?Xi5;XnJ);=yRwC0;cbhvSAn4SnzQX{JqS!P^jT{A))iU(dQcFZiWZ zG^kIft@&*x!9K!BXHB#3-G2n~e}8@zZG>EPzOy((v@g&x%TSuyj5NQ>AXt+P zyq6AimH`>`*e_XZ+p_;0Ds{i|ry^ucyMlR%O6-s!ps9!Z)ppou7a0WGCK>4jtH#+$ zA;IL=J7)esl!9pvV4vtMhW49?I$Inb+&^v<@>YIDtWJ^ZE_o5};TBpfy=%_z5+oS& z&4XgZKe!~6^&o2(LG4#Bm*p0l)8X(Bi^){qL@0}vMJd|x{U*6Hs$_V$l*#@~v`FS1 z@2gHy(0HtNQhH;^Wm6UExKrz{#jhw(Tm;E{6E z{Bl1QBuVg=PVog*-U@DizQV(2WqG?)Y72tI$r){oe?Gg?tT3)m&gL!pmBoI{UR+=j zCC=ZS)5hC_25WBYt#STsb@AqhyHT8oK&n(w{5$wmgx<~xAD@iRBPkSV=+0B+) zPdT??{{(sBAIa=VBtW|}w4z{OC31S2k^d|-AKoG~J=V2YV}JSiO_Sb_(h3`mRQ5t!|t?R^uCKt#^dpMU&h(}ec#*3eC?WH zFkA5v9s#%u9FpFzQqo^}Ns;4*Vw-pc;H;bkuPH`ppaUtuyhepJ)CHt&P}Md6K(9Yk zAsF7BoA!ENWxl>N{)zki2^9gbIsUn99Ohe?Ei^WjL$Z%>&5wCT)Y!hZNC%jcP-}Fu z0!@-iw*7ct9*>d?2Fl zTf!SZLOKLFJ8NwiS{582P$4;ET7wTcX$%<>1AKUw7gSKaQJ`p3(G zJ7)jO(*Ep(WaEQU4jT`JkSkBL@X^!arhBsKtQ3#jCxFxM=jC>h;iIktu(e6|w9jCc z!CV9xKifnofwJ(>J+n$C;DdNF$p~(5jHM-6%=+EvpUY(5z`vnlR!PP)^*7!cy7ittTy|FC2d)Cm89xOg~DNkSKk!-((-qrJdbp z>#jz|rq;aUce*>nM0u=d1Q19Tr*VdfUs$x_Bl%{!dGZa#2F~JV^R^IRaqRqt0|};l z(`E!}fVd^sM_@SyWYPWXHPTJZfc8prJLJ=#(U5curs`jiAL~Vi?sXZdK1raf0M$8xyp11Gk z`}}^-ANS`!e{dX*_i33yw->5YF*+)=i$jr7UT<5rmb>dA5WA>DG-baT7Py~)2oCo5zW zwxifIzy8t1*{8_`b0m5LTwp6wu9`JFG<@ZsJ_2KL(Yq^_$2$*bbgC_-a#%bIQX@4-FMh)(EN}j7GTj$!RN)=HH_|`@o4636I2yre zIc?+flN^?8y5_e6o`bE;9$Ya?0INY2U9>hyYS{3O_n}t3(xq^vxI^oL z%l&}y=Xbb@OQZ;Dq{#{NdZ)CW_~6lQznWMgpiNHzj7yS%3scpyRTkMRR|}kKAYAu7 zK z9?~}v5f_c&cWIzUF8cMod|J(~bkqv&kx7;FDEV2Y)&1Ho?Qcz`_ZUVuv1)=-$?mU@ zW#>#KtUuQTH0`?f4U0rc1?_LMq)TXzoIDy_?pk)KxBsI+ty`Promjc#UO*8_3wfe+ z&Uz#DrUBh&;vQErS3O@zTf_|;+PHI-#WwIa&x@Rl*#5O;1--sW3bLV$RZ6fad_yn1 zxxZ=cuE`5105bx0?T0@Ai5-c6$**#bQT8)(Az}c+E%oU@^$}{g z%mP%Or*9kX^n(O+tK#9wG1)M6oNn3>R`0wmiHu`_A9;<-w%qVtYmENjyRkzGNNy7` zP5>ANml8d93agTWXar?(O|4^VI!~pWat-Fi69~#{{@8@7+bXkyhQmJ{4K~M;UG9$0 zomD0B=zW_$ixY2 z=|x?8d@5K(`)_=#k21sB*YtzWxtal*e1ei<*3^vaJ0?~jZuaJTY2EuD)f?D<*teeN zyln_XW$65Chjeg?Y2&e>XFl}x$Y<3TmEnw+t1zr zq#M}wDDGUaOObMn0|cJ$f5y4qKIJ2%4Ui};NI&KtsBuf!eyy1dWVsza0R)dA0QOY$ zhp@D9TPoQ6Ln}vPwiMoUz;Ays*S7vH)7NRNT`dXXe;S+e0>XPfZm#W7R%Ld99zuJx z6LmR}#9J1NdmD`HDt8;r2mJ0P7;8bUUVr53Qx}Q#u-$Ri18RX7?h)#OZ5>o;S$JTk zu4uiFYz3Q=o%*`KG%sNC#(h}?CH%a(uReY;Z|Z5`Z4ZcC1xq)SBHL(39n)7H8T$ zDE?w27a7Xy+o7H)-g?7#;V1cru4ewib1T^6OC8b~P(bsYU_XF(Nqa%P1}ag*|4&i( zsdvn083TeVvQ2~&(kSrSh)crmmur0P8pd(Ae;sxkm=byW#~{ukQQv!gvj<`7V#Gh8 z;`VTsP3Ing=B9Q(&k8SiP_u63{MqSugiLj=En|Br@mi0P zg?l6_bzLB)H@d13xP+!WNdj&dou7woS*}y*QKn0q$H{ZAawI*v<9-mhf;QDc-MHo_KH+5tSk_x61ahoP!cZTiF+zQJBEJ5CT5Fk$b7L5w;HvPpndk*_0-U7@ zP7*HaolgU8TJI|>F-+I8pVlIIdVz`8PZJA$0Om><^EL{ynH#!CHla2+YEnHQEjGi0 z`G`MqeGab`ovt<8Ar$x$dlVC;wwdIQ+Ueg^?A7_WenohqzYo*!-~$2U3dItsV~G#cyMFA985wS?Z=O1?j_w!m3ASPoQ<~kA^Dy{XIX)goJez+OoRiuC;MR8;tR9Nl(Yr?=D zy^|L9%fHy=x!0=S3u%k=mK|p)Sjswtud>@*`Uw#JQr0mo?#cJ<@U*|7=Sa#umo-_;arpGUS=y*wA;3K8sl2kmmgWLHN zq0Z?e4yy?UfEoOuu&;=NUzt17-a#(S+!-^tG_mGVTP(-FTv!Wvh5@OKxUCpl+c7KK=}z)FK5X_p>sH%}+i1EIZN)-Y zZW!>90lzCxn#UZ`)BV$nY&}OjYqP2NT~DORfbmO&@gkf1{Fnn2b2a$waIt~d;+_B& zY74;-&dFxd=p5t*&QH+#8hf&Y56_yUNx(lY8iQgAbb(wREnM7 z8Gcq=TnO|7zv_pL8!May<81cRKD1Lk+X9G=DFLZlJX^fOQd;;19EFRzJD*`=9|lsr1e4n9jPtC8cZQab9Z_lgq*+g=|oc3Bz~Zw)IdKNLT7wJ%OREQ3@_ zrr&}j?poO^%wU&l%wT}&p2iydD8BGa;==V=^C}4j(A&5h3|k~B$yBfv4V4jv`Q@Z# zz|@yKxsHouug&%U!g1rc^R2j1oa?GPbAF%|(p2A!XyHH~J%inXQAsQHCQ?K$!-9ph zmk)2#NZ;?NH9bPJ&A^Xs2+KWk2LSMIH>cz^MFUluC-|hVsuvd1$(HyW7 z;c~J9!?fI4V3-F)#>5MHKIuci?o=q*07m-2Z*te}6pRWM8GWqt`3(eVTm`6$`Ny|| zX=%$cG~PfbDZoykXY!AICQ}95>f!g*r%PTGhpyXs+;5Ep|4Cdp^v~SB$30Jb>Y3x* z9KtHW1@_QsYK7FTtGIXGi@%#fR=Et6#Wr9jMs*bYtYK3>N3+Yyis~p}yfG+Lmp1{v zZk$Mz=p$%zsm@GL#ePY|Rk`jPev==k+`+rF$6Mbf5stF`+@E`jZ?-m+?uA~wZfz_X z701SCo6yFP^rdS9n!H_{3(k0z@u^SVl*<;+ zmqWQm+$E9>)2j+_aN2?NyRG-`13aw(Pct?jLHn~`?Y`@qeo1Z&<$Gk+78T`jFMm64 zKkd)a6zY>567i(_Q#-E|vP=da;(CB^PID(;L*Uj6n=`_b(-wX7uP*n_7}vB0{?k+L zna;i!D&cc#Ak9zk91n44GRU?UCljnY$W(~VjHvQxcW=wjO&ZXYD}CXuw;aZ&t4bfk zl<3;I?=W^$1-Tu}nC=q@(0r3WWhfa67e7xt-!tg)aSy!cVSBcmAX;0kbB`Ch!Rsaz z#^*SHk*C{-r{@uVLb4_ASr%!3YsG$SbU8Z7?2f_31sAjRH&TuVQz*4@$9)OFII zN2)h0i>S)K$9;B)ex|ejl&I zOh|Jw$J$jobMIyD54y+T?)mS(Kyd|R+N1}pC`b3%jOtr6(K@|oj9cNM{EEDZ702_5 zh5v2BNQl}gdI{c#7MmT0mQJzl>v3I4vudGM8l71>d`&T!-4hX3wV2#~0SolEAss%}?&;)fs)y|hVd~#L(Y0)3>0j#GwI;%UamcqGWf?R$c&#Ty7VPN~I zJ;M>qMmKvkcx6>_@^kZ@7+xNCOrK+N$iL%+d$*1YRB$V#W-jj1Yp|)HY)qcOr#L6$ z%sn-EQG!KcpfccWZC5>7HQ_6?F|LsS_$EIdnh?^}?QlSe7?(sdvizl>B9HqfV0y{Q z0S$W_Sg{CXZvA>2ccbi1IQGc4#M@w4*2IZh9ahNrI6K4*m z%|I3)m{8+zOK;h8U^c^lc&{GNW#ghI>h(0_0nDe{XTtwR03-3D&<)RA2ABcF0bVk~ z#3^rd+zDC-tPLEShH4ncBH=`!X_pS;ce!BE*Qu4`AL{b-D>QQujM#rza{@$gCC*`F$Du(m|kcBa4kXUS~N9rl$&A z5hK61a?>s%3v>LQRE}%H*e&lXm(lJW8n)c@;C`2NtGCrJ8q=(Y zm@8L^G?w9~bPBcjKBc4y={4c56;@)L$;8+xRaQ*i`8Le1tPjR39qh7i7O^JWb!a{V zw$p1}=-x!XXtFr0Te`jrB=VIPS57lWu2XJ6N07ZLg1Ys5`(wx``1bEz-^)x`Js)H) z>*u{&mjjN*OD2|^i)uyBnLC&o1=`pU;|OOJ1+@u3mwjFSn=9+`{h1*>YHvw|tv+p*+&3AYguMCXaK z)x>jr67|D((VpnoAKMZwBIyyi!|N4{sXVIGDcy!c$#f;a7xC)V0}I0>i^O9T#hvSD zBF4UCrIbHiGJfZ%>f*ika{OWF_2Cyx3iJ_krE2{#Dih=}@4t>cPcjZpZ%7%E(TyIe zX-Ii>87&`0TW;Y2xWH-2ioAKj;J69DOj698NDmRq@Nu#ZCsmbzO#9kB~IYpy4;CEnbT zJSV0A5o)hSbluEN@khauXgVjDiR1eD8u)1$L!$RlA6xd_0zVHVk#e3Btz5aR0lNfOde(>aOC1d~mY_djj>y{;E}PHQ z#)Sh`qg5l&Chmo#N_;{XE$ELF2=kWXm%6ci&(vhW5l?>8R+@%=x|?Uk*l_bs#G~3P zIqMu(VT(fs&0u>U>+qWv3o3bUM|Jp9Z#0}C?pjCjqa19C7IjUdUv0*E@-SN|ircDR z)mHOLBQ^k^-)4WTtKyxJeU$3dYf#49DzBo}sLlwj9mBCVUOQuA#X+I08dYPiz9co+ z=#oEwXivF6oBhiiMg8DMTZf4@M}qf2^0|y_Pp@|2bjK*wbNky%&SRVmrr@?#JUd%l z?C^_^(e2K`s!;6S%AkPsnnw-6qe&I>&PbZzCS*{Z-x|hmd%)|71$mZqQ&iFI-m#ic z%kgou(D8X&^xO^!#wRg$82i<+hM7N>Hf~SfSIVF=6~)qw*)g6Dilgul>*aih5ACCX zTO(pQQ!t?|x!_XbBGd$1OFdm9=e15%Ogw|VauSrIi)ro2PxcI9{j-m+#==aU{wNgg zvayW&Dg67&Vqu=?ugx z$^da+CCacdOX%7BhY9Ab8XR4bCG|%SJaU%I{+J8F8aY9a?+)vNG8uX!1wd330#Sc< z_~-M`41%TzHJx42Ko=xasM}Zq;HUTs;icADag$3nYm?Ixjge*bzXbl8cY+=i<+~*# z*Y=2>`;Fo<>AY-Jium_O9?D0^f+A-0i|yQa&k+vKK1Onb7?2X=JrwfD?`V-~Qh3LYz%ME8-G+aI-jTj{RPEdVoILW9M?`MO<9&3*CMf zjbvU=hS$%+lo>CO3>MxCwlDB%X|F-Pi{Gm04@pmB+38~wUOY9O7o+t>FY&FE2(%}6 z$(lsaD-*OASeUFjA^p*B<3oFB*70>b4c)7rheUKc4Czat6AOD|jms=XHKhIJryKej z6;^@xm=YgpQv?IPO!Nv8w1OxxN$90^NHJ**x_F}h`i#!ktrW-P6EHJT_V&`H9Hq8( zhe_8IJx%ZalL6I&Zb!TS3|t0h~8JFVG# zeoP9glgqtYRP)ccI{oGRug&mNkgzz=OAgGkLg9`$J^mD(TJP1XOjDCEmpbK4>Venp z(B!*M(1OM)cjY9_WO~^g$GQirCXn~%y%h5o4NU!BuNe=yqBno}41QOM@@Cxgb8788AS?C7&jTZLXF@tj{fmU(>n_R*VpNEpJotIgVT3d4OIa?ec zl0bpIT7KpE%io#nGr_4o)@N@hvC&ahrz6{ICp<6%mrQN2TIEx|wP6-<);-2q6)#^u ze>7C`(Z`3Z4uiDCovQ$*rlNxN?Uo>$Fm=)T5);>n;ey(t#BG|1?eA@w7qlVJaDTi3 zbUokQoyOEBx`9wqdTrVmKedm-cvm{1IDY*;^x91IN~m3}$1Ae(4i!2G5m?_h?{DJ@ zP^RmOY~$ulcg+KB&}ONwE2U3mDvKMG3R>o0DRd|0$;Bfd@>cgWG?ro*hcL1q{Z#6a z@8+pipcvhg^J<*$>1#ht1m`D=dSX| zNc%AsD(pB^?d01-c82JeMQ-mk@fd zQJg9K3i1tJdc-2=a(N#8Ia8&nu2-CiQ)#dc^bymi!7H3Vf^N?n5BsZZj|9HuSo~mdk;^T8@$50zztHFRTLRp1BbH@ z6*$eSY~2V@mg4}G=xxXJO3erZ-Hr}6!J4_ZipV!{$iV!?t5+Tp0J!>2cwVvw*EijB z0NX(6GjL}}J=U?LivHclHGgQU1As4U2W{)_1jkYYEv+0~zLiV^J(a{m0Kff=u2dK= zP;2Ez+@+OE_sGe$Ms6F10Ai2=WN#jwp=UhIdKST)EA_tj=8B45F-yHlY{08Qpd1za z-*Utf=kF*Kt5Ly$6}JZfn6Yv1`q7p%xo)E#(eKAIU)}}MbeyY_Pf=PQnlZYd;T}~Y z^FGamRiA37&;o;Ky=%>w$3;jXWJ4zH3#$h7tN%w=;58eN`%^h5&L|S#P*^WWYjr7c z7(MGG?oB1`xE6#d+-Htc-0ip%{l?k&rrEVl^G>o|Ep2?N zJA*~GDuuSEWD++(rD@9i(xQ44CExSb!@m#ZyjM?1gGKrf;?g}Rhf`jO{$KX@BS|fu zn-!>AaZjc9esQwNFCzAS<%`{ASOBqwRtGl(f9KxRBg#RWMt^*#LSn|@f8`rgt&*LJ zPyaHz(_ZoT@nwsvk30-73BIjvtXw`Kk}Ar~)lE&TF?o5nlSu~-c94Us1Tk8r4C@E2 zpvlbPV#F7DdRtegC&fE*ak$1^7IWsxH$ClsshxfNrpNrK2zwO`KSh4rfuJ(ps1$1@ zUSA*d%MY{(i=6i(AnFbj z;RFy`E5$dO!b(4SXS^y_gf^mo?gWE}K5Le8Z0UhIq%bG-L?@nyMS_aim>Nvg^o&Ff zeZOKDy+((=R_3@f#NI76l!ddZ?mK^G)#i0?iEhl>^_^}k({<)}h2ie; zZj~s!tCRCP%C>=XRke;~Y!`~Bn4k##QitEHOjIW5%(+W);2<9$wc=#35GlRbqys%ZXSYwjRY(xmRa;nVY01WGrgcIC2wd)lH`plNFD?oL|&X{=em zvIZf7>NB-2@M@ft;-#vIGBj(qyJVpR!{B$TZ&ua%G!uiUQf%ss}hQ^ zjbE4(_ZrL8wL17{6F>O&-LU!eR>0;)+ItKQbhQcv-3Xi!=Z^w~*BtLRmcfa&+K25H8m6K50}`X2yB3Kc`XJ zROWjO#a{y?>5e1yczb0-cy|`k*?FQOg>(j%LB-BeOy@YpHeo;zPTrSP7KFeS4Rgfk z(GXv^NMyMeA~E~^cdAzEvbu?aZ0=4D`V43@3fyDv3yixhwzmPRK$}*<|4a~{EsP*R zHgYxV%y&iAH^MXwt03m%d=<#=d5+m^E1@|M?b_kKxM4kLiWuflF7Fk&ZMl!l2-x5h zCcYOks3C`@j>{?@TF^i1ul;t3aW;rd=7P>$#Wea3FH+R0SNvt#gKU`dTWaB(LIryS zXmjGk3r&u{_8RrA<+F!MA+e2Cb>VMh)=8*3g!%TeY_gnz&4Wsq)7a6ziGFbQR-MVb zD8jMtEV@a6IX_QeOR627udVC->elT_@1Z2?`CAE(X`~_Pdd0&&)uz(*jELkl(rCFx z0jd@JK0j$Z1K#(>d1>`6(d@n>^WHdgv$rEY#rvD;P{kSF962I->%>y%4aQ8A7r$U` zF2B;1^Q`X`pBm&#kC%su1Rz}-{}8B`&SbnzwX0(D{RMm~M0-|79y%bIF^4RxAHz7( zX)JpQ4Iv+6k3fIW?&?1L`-bwTi9-TIVwPM!BXMH!4)GxE*g`}x#UJI*Uy zWq@rHadt`Zin2b__=NXVYX?_zI=M$iBU1FDlmk$dB7Ga2M#anNjeTNzJ)=v3$sDnQ zkuIuO1)G3{5#MkTsjK$u4pE0Nr3PMQLr#pDp2>ZS|LX-HD48j$$1VllIr#GJu)+4S zFt!zCODO9@`Yy;E?XN~rJ&jy8Qy46~_&4mHouCZZ`m;14Jsr>Q$CP5$eTK`9=SGmmAm! zPBpQME^2Z@@8j*UTk=mu|D@6c4(oFz8_Qy)SBT^A9c`Ou`1^o!87r2uly-)+xJCRU z#Wc^6k^Aq|oG0+}dio{8MhV@ED*zz%6e_NW){bN;sP@@1{QFk9DKPuU>KcTKzCs9s zi&)g4toa#6ndH!f!C=I*SDi`dcPRip=;59+YW`+$g{gaE{tKYt*D6zm&gV1h72O^K z(mO9Hcx~n$&-Xr{Q9)kL!Chdd5^7o3znYG$%QsF=@+0{!7h1^n1;A}2>QSb#61ZjR zyh5^AFZ{0K;bR?{SBxgpN#M(Pr{yg+6rg(#N*BDS%$R(-o|Lj7DyAO4 z0ff`vGk!Td({)+6c6>reuTmPnw7XTO7B5QvBTpT)2m`o#37;&CN?)3> z0^}M05@C4Ea4=_^;z7w`0Aq6PpcZMg{>E0+@G_flei=3|^HYI-e~~VK*6NI@8mD02 zR=NI)R@&f@y&?#eEsVt zx*DX?WH!~2c_J7HCQg_A18-B85q$AgC9_^|OU*cVdr4Xt)3Z{)ALI!54 zBCD}{HnqD7(i`K7>$QjdvP_}F`Cvi|UMI;S)x-v4kb z1YRu~IJ>Fz{BFA(&cx~o=D=vAeN!|U5Qc-gT2<*|CP^jZZ`Uf&1viv z!DO58i+5SRSZ>i`SaLqxpvW}|*_OXp3M$ZV zEa4L#fIS%+?8>TfdXAt8Ug+(efO%QUrjh`UuFgRuNN7ZnhYHXQ`5GXS;LW1aw(Ivi z(=Ci1oo_6A7hZQA+0`ii6aWJ;xKgma?O0cqkh(MM5TGTtsTRJ;MEmb8RN`?Q(m%GU z@uaeV=Za>pRbo3sMjF0R(;rS0-p+#{1nr7io8PfTq6sUOwe&ZGqANo}{jr&R&(xqn zQhn$H*H@W~iJv&c>%&q6|GJDxawRbDtrQ<)!ldtP!0VpY(w3f7 zK23G>^V0L{jv7Y5ld*rHvrSjo0!r}-^I4yZw^F_8kKD1~BH&g&sPcesUr0Lc`%>g7 zAS6{Wzld%1^EA~3++&9N38{~pA>Liye4c*iSh?{p9MTTuk6q{D_Lz}ZIoJ~JA)g^0 zCXypUyCjSGQa13Z1(wQ&!$3Y!))#|O6cE#t08n5am_`W3=D#y41KtiZpE(Zq3`&lG z5%*)a>_zMF@;tC53|~!7a%?gJy9(-*sMqH&j8xPizvMXDoR7OVR)k3{JA+k;;&uKb zw=5h0y2e^is}41mFSO zSaIxHtq=t-`BhKZa|TTD&d2w7TH6QN_=-qF#%0S!!$r{#HvHbNn8ooWY}x_5l3z~& z!};6AAsZrw_fwKDMun7hv8+tbr;8MW&Vpz6KwfD+3sW~|C()W;3{sNT7P8352ZgTPv%eFQncebH+8)zVcgI6tJkQfMtTFeCG&?1lKa=8+_W)L+}5*7c$;6ADN-sd0(D}CH)CLDOA+@TqFq6&^ZolRUu{3bG3Ya?U*=?Mep6^Zm;kg!rw~MWQtPI`va6imZR1=1MrSQQz zeou>OLPFqpGpqY!;w3ir?5j00c^77r-zzS)frd=p3;?ZIfFcL5fx@k~6kM_$Bfhhb z>P#oG@-KbSIx)N?J@U;SI|O?$usQ#qgWeO%BMfVzQQ-EN28h?2?U4c#FLx9}?R=&8 z+FhMiG*I*#E@H$@{N`B%3=vkaxov!Rp;yF1Dt!0pf%csq8|B7Brh)4(18#i}cYSL= zAs?N(p7w)mJR`z+t$WVym62lQ^Ce!ly21(B{l*W`OL@_$BED`*=lPQg#A=1b1qJ|^ zR@Q6G6*$C+W<7e3K(WiF?xaTJG0gC0?JKz3!Rf5kQ2T#n(%t+Pa1!|M-EViEv}KNH z&D|qfqvx=jkMND+pbuj}*^WTVc{ulGJSCTnP$P(viu<<^9*t!Hkecu(RsL*vL2}da zIAaPboBV-vuY?fC>eiZArs^P1EK7(h{?owX5j$>0<*QxN+q)vnZ3D}b1AM)RqIL(> z04F^e@PrK62;(9c{JBqPmTlev@@6%5gs3J+h``0Ldm50R;XOclSAei5c;SnO)ESl-(t?T%->D91+mCn}*Dw{8%`~F@C3dq;Btzyk%?^B(*l7h)4c9 zMoj~{3AO1-L#RdZLLLpYE4kqBL(h-6+RA@hxUs4;XkMXg?q@jUCH*Bf2n>*gA1`Ic zL?GktIW#+u;%(2q)E%gbxM2w??}Xv6NU!+Wp52k$v#NBkE!U7fk8t!UY?p#^%jTIY z??`5~@A`N?ZP;yE?{bH82+FwBu_!{H>Q`y<$UOGe``jCRMk=%22dpulc{kv|+dA{6 zZKiauz7Xv9GL=}Y&VJk+MTnor-W#Lw1svLYI{Il_ehKlYsZ2x=df#eR&}3 zSsXwEF7i3biVDn#;#>0E+^)dyxR0g(tq>6!)8!_d<3p|X|E%0rEM)_Li5n6v6mxq; zqMNVYwm69Hw-dC3gYm(w&B_7_V-_SjgG+0C?bGty8o66RK^1(7)bq&b zrsx(0*{uH+LHKhVNlzQGV%w42SO`s6ZJIT%4} zXv>M`Bw?#(zpHhh=TEWlB>8)l$JMJ+jalgOlbtdAXSFs33~4RwTAzq2sLEjdwlVrs z8~aYb%Y|5F{?0%f%)v%@J|M}c-tCGNx?>dT`mFCC%pX-}9o}HZ;Kn0EPAa)<;gY!T zw{X(SJkBo|G5GG(*@29wL0^Xr#@;w~>dVdCv$|q?tKMrSo9Y8dG2wJ8A z8wp(9(FqB6^?i5-$3^)J|Ju(i*$nPcF*|U5BH#B#IZq-D`69!kUw3MdOlB8+VV@Df8P4ke+c_tLBg;Ny` zFvMfn?KB{0^L!Wc3+J5!zV*S*GH7nP15??j>+{?w~?16K5V_$EwIJ8rf_#` z-FHKB*R4;63^S&)`PG|GbB!*COgMQwAFK3cDz*tYu=I54AJLE&iE^^E9UH8W=UctM z3*Zk97iFi{T$O@5u4KD9Z`_GW!T~P&iW>C109&$RKGDv(d_;*RI7G?y&8+DlTDQswcit{GKZ4P}3O;b49-x7)_RoafKa61*;L8w5D? z0RQ2_XjSoOFYR7^xW7NOfz9-`zyxJp&54_Q{4mY3)Mg0#bz^uqW zvZM$9{F16%&o=b7-n02sHUg+A?G~sul&>Xer1}H~~Qya^0_%EwS9n5;h>d^`uGj=eiUs-kqFqM@!+B zsX-b3o$T}PAFG`+zu44_46leaJQUH22r-HY_MHLWj=yh6Tgz_O;G^%miNIN*Gc&7m zJi;aw-lh3g^z0o%J59`DYi|J~!)D*#GXB^a#MEVaL+#+ef!?VUpfc{2zDKKdp+L2$ z7@lq#E&eaGlC5uHA36ps@4j~}lk%fg7n{GBl=pV35}=6;or@?}zT0px*8S=)6LzuM zywJr-(BHWKj5VnAC72d+IVcXQLGq$G3=b+w?WcLwQPK>-DQJYU;CuIj^;LnW|ML3T z9mD3J^~^xSneyoqlOFKBpa7a>S5zVaJpKG9NnHrjGfR! z$m5;r{Q9#8lq%Ah<4cPWz0VP-OK9OdlW0YS#^&7Hd|e@WlybbzKl&fy|HuSZXTZ@r z*%|e^0&OuqOoNlSXbtg6WD#*#P$ko=RSu#_k6WCoWvfj{b(Veol(mvc8bt9ri~PXlrAYGl;(xQP zcFNIWpnD+Abo-vh$4{v{B(3leO32}3_uL2S}c5O*sg<{TF3J#k$*y7&P{Q! zA)-Y2>x4%;<@$vr(#!Wnk@sSD{?w(z#Z?KtzxdE;`@45Hi$hr5-6&tv@c`w{dZwl~ z?kr|Atri!`7x1p2t)AV_Q_-rn2*nJKrtZ9aNPc3xWc93FbQ(?-4 z-3skwR%YyAj#w`?2RmxYQzRwe2fG%gWxWY}@7~_jc$$TC`WfyW9_r6IGA#sz44cWC z0M9KAbv1-g>}}C4vf{Oz_hEhSd!flDA_=irG*lIAYHE;-K8mrYV<+s0(oG->-t{l z?9LgTF7T>kh#x{GdVn}NggOvasXQERuaIo#ajzKNGEYvphBALo+@eKXSxea8orz|9 zBa-_?^O#_D<_@mdBl|r1d;qXEenIYI$8fh?W{>%*{a5MUhxXvuKFMVCV%@mDdmro4 zF;ZOzd2VIEiXQIXTdj2!SyBNJ^O5#E?P;D4*60F1gedN!J=Cc>o@rK)#+isRxR7;>^5rVcL24ov8Ke2*E=t1n4@JboA(j{XO>uchMbCwW)cXs`1M!p@(W7g#x%r39j^8quzp7{Jv7!2y6$)jk#dy zZe&qO`~l5G`_cM$C4-RmUms11xSb+Plx1t;{KrP9~aj_jE z|B3zTzdI~JxD7>KzCiG2QvcrpM4l3qR?dZqVmtO(w$S;TIg(D{gWtCC%OK zW-eC1xH=HYRuOQHh@U71>F%!Dz+7Cb3?C%{>^Y?c$l$fsS`G~|`!7jadVuCzCagyq zH=*f55z!9j^Z1T_$E1Xbh0R%5zt2> zCAS!(sUSN(_}x6ux#4(VX7!NqhTd9rg##!RI1%;Ysf-9cYg<|NonnsB;E< zBz~ExkF_eNEroX!2HNADcPZnmMDbL`ymK>WXF>prfNPJ*4X!>+`n;8(U#7v8Q#%t@ zA!9`bVBMF=uV;8KD35!LFNO3M=gp8cXuH)SbBlqGl2nO>g0l&Wa#sX>n+~_1DpHG2 zUuJTeCg2@ANh+B;Do4v_lRu!|X=aiInQ~a-VrkwL=E$$8Xf9w+tofbk4L}55yz0Uy z)io|RUGyR}+12!5Kj#0tVAq7zyfY>`yjx2>=mo3vF|S3Z2~B%$<)~RYk8V8*VtM5xIDw{jZ~M#sXoP?Z5`OBF+1p)DW6j0o;w&g2o!>9A7`* z>F2fuBB*nAoxrAQu3o~khDp&TQx zUJB9&8a5Q4uo#dX<>VM*w(H{ONoSJS?WjPwp3KCN?Peoq0I;j8)A{s&Y%vM|yZ zLSB(H#xJL~vpuQ_t`I~1GnA*3b<-O0B!P4pTALs&yZuc>wzo~F%PpTV0}aM|kmx{z zD!nw_3p(Xa=%}(V(za+m(`h;<6^xC1Ois9&%|Ec?to3l|*&tLczesf`7{T{PjXV=M z8USFBNC2IE++%w!1jZyk$Z8$VDWVPtEl-jF>RbrDlITfD1XkEGby0mz#0g?8 zz5HcJ3~?}`+dBP$9zyWeF%ii6EdWABUkgv$ow^jU5oFWoZc?K%1u)m%V9(KiPQKB% z^<{q?!(E3t*e_Uw@7Y`n#uhCO;8RABu^7kbsTlbbd!@C0a?)??y2WjHq)2Nrgr}?@*jPACJ7+MSWr^O8sf0ml zi7Eb#dsDM78q4^|IEm03$<>1k&NQ)G7ahlhom<77Zw}1p^v?WAh6wg?nBOl3JM#ky zglF1#lDM$!{X#L&vITvupyvm96Jdw8`fC4B_)qh4*;!&|pPMs6h8q}S`c=Nx{ zh)9{=rx!rp4JktIPnDsh2cdKK6z>pvJ@o`M@%R^%q0XM*#x7IfE@`JZ*E($n#jjJ4 z-+v-?YxKt~65;>!OCLZ$z%D$`U2d{VNCTf1|0xT5#}E5&bBY(Si|4 zDdARqzIyemnL?sH3!C%9jrg-5YDEf3ynZ+v?HLE~y(y~FX-g0TJOuM4#l+>{gO`bv zTZa_>H2CBGfH*@l!^Z8y>RW$m=j{F@6{b*EXutm}O>XhLu7Bmwfzh>pck%hCz}|tk zNK7#GN{Ah0MbMhr;ud}GYy8YPmLnuU0rQNf_a1R|Usv!h(b*QqEJk?`NzGK)4+QqD zXG9)1mAR@>-*?al+XA~;Uu@Qahb4z3pYFSquR^>A&;rWxYhQyV-(ssQ5^0M8sNAe9 z=N>^(Q^bd`q)40Z^)mH9klKs;{F`CjdRr~Z{EGl^GdiK+p~(kZDSc7E-0oaCq;FeR zFNVQM6F$vIeghs8km+X7*C;|-zj00n-@?_2vX^eO378A(8A?XbMR5t+ZdWbV#`DFTX%v5L(|^wvk;yT{gdn6_pU5`SHGlB;6IZOM%oh38j>C23V}5-Yo?4WQ z4>)k5&6Cs4@;;1GW>hH4UDXd3gr4#o3*%1${37BK;L#c#O7hS*vheW^ou}tSZv4$X zg7u`5L%F6K#c^<|tVtp6Oy>bP6g@2i8Hy#QK8I}Bv4ucQ+eaUMb?ihcEw<54(=9!Y zKCRyi^f5-wMT@Ab0$Zj?RMd)|2t3G;sG}r_uD+gNLUS_-+$`k}$Cy^gEj@5&VCc1- zHopJkicoLGp8h=e&R}6G8ncCck5b%8d9{`k!T6qiNuv(uH^b^4SGYp1@@C=#{n5Es zT*{{LHN{*c>&f$&Qx_%com`z}LRc9?FG4s3YkTyct5saYc{kR~pDBKc2U}QM(qEY0 zpu#5)Z+@FO>wD#kUXBP8`M~vUrbXg#J|4H-9P$!P9o#h|qLa%h%ae_&yeRM>>u_Gi zwrp|1q7%I-vP!T04m&7MZh*#Um^#DV!o^Cv6@xEA7dW|X=}c`bF>m)h>cb$<@guG# z*kb&~t<06fkUO1P#ATjpYQt;%Hyp5I*vSuAJwSpFHCvlgdldH#dl}i}Fmo9XMQx@g zlhx~xQ(=Ah!XjAein+pr(?%MMcwdnL2DrhmCNXdM3#Lor!Th;>`B4os(EJpdbw|&P9t($lmnN7*a+B z)6V`jp-9`-NlUn?FVTu&^P;xvE^4>&E8d@_VtUw|#dynTwc=2E)*BOGQ6u1uqo==4 zD%!-5%wXKmngUUO_DZLy*1~~$FBL+MA_n_T1}vTG%ryjWm6X9LBGAL{(>(B+INi9O zOCs~esI>i*n&WY~UD}k_1?f6ET|!0-B=TH_ABAD6V*L4CmvOZ5oc)QIMc_5XR-rt0 zE!$O_hlwk&pN{R35YGQHFy7Px{Bd%W9|68HpC5M~e)P8=Q=+d}+2WEogxwMuSzf`N zgOZ29IHF;gXGL2XwFQ<9tmJ`!V`UQX-9u(>A<~^()N@Da?xMdCK7$tl7Q@Yq^7Q(E zA9+K?=E@6#x*T=n(Ptd+0qQ<|WcoVLCqFO+iOGOt`$9(Pk%}k~`8G!O6yh_HkQZSmi$~NcU zh)7qE(3|vLLXi>>QBV<4dPjN<1PHy0fb?DiM5Kfol#&2}-TPF&dl$e zGqeABhDjmMv(~-Vy32K4_eY7H3p}S4s@lzC5t?Qh#mcy>n)!#RyWWJ`+shw~x|W1& zMhkX?`M2!xJ_YL9p7tU}!+FO2p~BgKR_!UAUG(v4!yw{zz{RtXe1sSWX+R0K>6z9q zahgv3LQ%uzJ*4n$I>|xOJh6aJHFr0Im)~|U+kt7=@x>EuJmGhi>TMC7> z6u98Hs#iQJTMVLmc6o>3j`cFzCRNI1Yx56Fg~`i_#YT{bVl@UU=mw|vW~lszomC!j zG3FGxP&hm-wIy$NRNtEzHM;4SD7GA{$_!g*hQBbkwBrCo|6v#hNYa)R?_`7#*o=m{Mg{xTtTxT+QlB zWr&X-a~UW#-LK(9wf4Uqv9$;K3`f=|>mRvTkA$!8@edI8D7`21A@)KgfY=mQYWJ-~ z@H%7b*Ln|-|%wwaO5aSHyp%B@jdVCB)6KTJ%sJHW_mWds@#_1x>jv_*Koyx z7>;mHs56#-Otskalv^6SK#JZW{eMF)9h-$BIsv;PcG7shV=S1mql}M>eI1xEd1T+9 z{d^Q|s-XoprBbF+zpORKw?E+Jf$*zY^XQ0O-Q~9NoDAIsE>{;Ghu_*|sm=AD`^bsf zACWwgST2f7N{YMVE9TLLjW@5Z?dM6(dkV2Giw*XKmZCw`###9FNKpgB*26qdTljw8 z(F$l@O$nIhj)~YC$}{ENL3F-~%J9;W)4B#Fw6h(6OJp3#L6qcD%`tpHoHV=QG*XL? zi(ji@OVBacd|T$%ckkyCSN?m9pE1UYDeN{Cd6f|P=?X7GA2uj!cFvFby&BJ~7UGW| z^@|^O*x0=P<43c1f#^^!QFNB-#MLAIH)mQY>2K8UxWBFJio)VhlI4?0#V8X$!@&QA z9_B*6E~yQv6x%6rduF}^<)!viixaedY|$BG@}nEKByN<;Ia^KQ`*Z7|+(_$*iXzXQ zx#*H{OQ0hDJyJWySm$V1J4?#bSTt4G4%6|2s?wir44%no(r=GN@k(Vkzd!0h0?8Xe zwm@2?TOsfNmyEXGfqv3j0{b`{01Q7m8*S_Ff0#0^4)7Jr>``$=rmgc{TXV&A18UNf zKsl@X_}Lo`n~MXSdG<~CLCPi->f>u1i-)ba|9JEzq61F>=?*(LrGJ)*J zTv2QS91297GIdHU8h7jV)|E<{8T8Cb9sXx%PTl*LrUq!qVdT4Cy6E~4?E_1zn`ttTwj%(L4o<}^rIC)>>zK4>6$IIuJxh_8bYIH_U_s-(H zG#Vo|vobY_Vx+)HVk*SHcXpN(TDpHvAc&$l>l}Nwer^{RX~A*Re91z>FxPE)xESd8 zK!d;^3T1XF>*_bvy{2xR8p9mFyJ7g?=|PSICu?3Sws9j(>e!Uh!%y;f6mt_QD&xz zREZN*PzQ~{z9lSR!Q&Yey+obn2_6kf`?+QR`|m%|eQF$=6%^Ec$w`BJ#rmeB4d=6o z8USNICN zFq~OXuZ`5mQk{&LN>_|jO!8W~cFnM+VzAK22nz%rZ>>=_7FTd^Xfu>2>Hm^?9y6B= zVkOW8Dsbe)Hw4fTtYA6+%-ngoZRkIz@jqv}A_XjPhpQqYVCSL(_7IF}1XK5a>ZkpP zThaQ}zLE=)bQh#~wF(R)_jcCX4Lm04kt~$p_WkvAz5s(=pVLCkzPgc-%Y77f*}9(!^$B;ev3QiaWnc$9?9r%>UwFJH>R-mUme(;xesbgGrldVK46mW! zs;h1%VXZp!sZP3$AV|R$Qd@mk`Sza8VpnO^be&ycHfb=2Z511UpW;4xn*Alxz>W!6 zVu+zck`jXFf^((d-#_qEPV&p~v;$bAL1pLEJkW+cQNeN~RXs;p8WR#jp|K{5P^Oot z0Q=pS54{{ehv5A+H|+m}zQT3x^?5Pp%Zm64yHZIQu|~hbRiQw?mMH^jb=8)UjeJSy!GBI(J%w5gz*jzENR*CN6H-)-vOH?w~kf|ECu)et}2 zu;tmoXTK#sgENphsiSdm6n48sQQyrC3W zD0gqmWYyPjYUVQQ=5%5i8u|4;ny!IDw(v#QUuX*VCG%*41oWP2qPWKZwkHJa`~LBl z-f?-lD1`IRbybvBayAyn-(&qA0@mkB(=YT@@$WrVVW!C^4$LW`h-iAC2Jc|$AJG=p zW-#oh3tzF|1<#!6djx+)o8b^`&@b%ZcOVA~&V~3@uF`3zSihK9?Xs1-AjJTz=L_V_ z{g{jX6YsCSXRq5(Rj}EQ=21A+2Q$>Bit;o$L$(PNeSbUS{_|kqX9m_l1L`F1vN36X zr-Ai|%pCvwh4ja!`;r+b(K^qZ#b|-!1(U9S;*U4}y6S%ZS}N#A#Pj-rNY%N2ONqLVxtF_8?MKGep~-}8~!Ii zx25^M+gHHFKSl3X{Ei>D^!({>jr^gs{0EoglfT^F>EaRKVR*W}TQ!cAua+PG;fP`ivbs#U(IH zou&Z}lpX!iT=PXqeZSTr?Z@<2Op?b?52UdvBRbO#%l`V4P#pqBb%Dj~;BvO=#h>%{ zv+eLNugOq>_FEeZ7f*vrL+|xpHsU)nz)6&+j6JvnI{fmoIYIWrnm+&k!lu|eyvNhKCkEcY+v2V*GTSk7#`d0 zS;DCrHlZdtXIBEEu7`{ZLRKHnOFOFfKi#OJmEQ6xr=BahFI#Gbz)}!##Y)&+jbro%_~!qtbn~>S*x2O~(P` zSjij^X%WC!w#Piw6|!G~!eyAX3Jt>PZHGUPRJ*s~62<3w-#4uDamum`r6*t;Pu`B zItmF+VR7jxWZ!PSEnDrUjhzjJIhQ%uc(X+UnItPva*s?1mAoPfm2mJRsfArp_zIQw zo|&kG_SgDJSNe#qpeellKH%k9+jv8k28Duf`#V|3Sp-`0rHKn^{a?C74ktb)*54bL6sYJjPkgU&1B?8Xx8A)r;y z5}7A;EsrJqL63l%^!1V}%5T1Xy3Ka)^QUtIY<6k>iG2YSul%eAN$AWjZiwQp_nKS5 z)+(L!{YWv#*wxB#&W-`mWY@Plg=csS^#y-3<3owqMMPXvAB~@$;xnq_Ve#60H)s3t znH-Tu@T|z=1{qH&BPo*Xy3LFAb&P*Dc?a2klJyPyiNT!df;{ofx^Vfo#ZtE2Pg_l^ zpdUA_`A2h?&W@?qs&g!kmnEu|jK0w@>yfV#v^F0fErM*{$m@}GoB7t4rk=fNJB_0p z|Naq5Zua%t^n5Q!p=RiBEfrg?Ia+u(*LbcwF`$=?DxN%i9d+F{>D+45IOwYc`(R5# zCrPT8?K00l7$`?aWjcyb4ZeZ>O&Ie;6*$G1K=yoDL)xfFZcVN`rB}9=T9ry8s2tlH z-!Z* zt0ivH4UKrFzu2Go-qCOSA;Wc}d8C1`_gjheZ%y6qc3Q~XiKQ)8@#r19Wk%H#J^Li` zoec@@!su%=$brbwH{s&inJGdB-3gN1(pciyQQw@IPUji9yx>Yk4}@~wl;rnqQ*4ve zG84ORHO?=xZNg;cl$_Cf6BuC^nJi`bcJmzn=*sdyhHXX9iUaVX;f-SdH7C;mXFqVb z)8>YZV~HodgN0TZkC7Rk2E*KGn;b;Ec;fV-#NF>wTFnJ9`fR-2udETB^JG4WFivt&{{ z+@QZ^ms?EFwf*c(G1rwViZQ*Fg%sU_PcoJ8xYdmDW%@+Zs>hTaToJr%uxj@$QHHTV z105AY<#v;fi^tMn_chz$!e|e1qzFokd{KOBS-kbDmmIf*%{G_Pd}pzj?C;&`)Ps{uPKCmiF1si9>fGQ@2kOPu!TzlK~#LFIs(LohSebCa5g`d$W{_Q+pIg{+Jfbf z^arCV*S3kivi17?oPn&_H9ytZNihTces+bu_!xUPQkM&Ht{k1e1dZ)v?Op?zy{Gp3 z9!r(F`|_lBNn%3=!`o*3`#48S$K+d{{g09rBCft)*qE-@uW-8k_JX*Dlt<>9bBR4` zK$W~Z`_*Z)w)V*R&C+9xJ4W~V(a=zKmAFAmQc6?M+{|iHWym$5s#6nr=yeH zHjbzd(mkXUa8E1$rXRmNt%gB6Y}I&~$zj|wq;EQH*zsdVN0?&r@*BGQEx+~Tk%Tr4 z3Ai9NpVCvnx1B7;cHUajoilKC>HT{ zuDr)7IK2Pyb1HLuG{>*U3UyRQd&~Jna}VZPyN58{y8pUvub6<)FY%>>N<^bq^3+qF zZ7%foVV)=lnD6SPV3tnhD?+x)m*W*3#b67AeQ7Z4a(xQAdDUo55FL~)(SzMEJ;f8; zc1sTDGui|CXZ*_(tLQ~7G=gmkHAyKK?? zUkHWuYmpq}_6l zu2u95SP$*$&@1!nHAcuNE#_)=3F^^zM3sKzjy3nu|hK?|2MK`;S_W(kRxg=Wb#r#w?k{2r+fbm9>;~VLBTaU|4Q6whL$6 zLUsH>&lg(q1xr+sb2!Ol$8{OvNtm3sAWgJs@T?_R7__>6UU)b?PKoL(+o_H+&_40W z!8AyG#U5YnXMP@E6rv{;e($9$^;le) z$)~8Tc71PR+VWC0L#xb8;oLW0IzohYeZ66I)M6F{=UMu|B=1zjT50L!X_@6%Un!$H zC;aO!{AiuFa(%EDQNmWNk*?*fTjo?rVUA|JSgC_4Ea?uez-g_zj-)EKwK69`a6i0H z>tVH%bjEX$!#ldCIxwI`E#9W33DZ!|yo(xu8xWrQ-?v}?o*B|_`$gt7*M_vw;Zg(8 z6zldClIhLKvH)}3j);IUBvoB*Q|!vr^1BfrPiO-VJ`ltiyBL5!n8wW^^0O1)1JEWTza{nglHvlr23 zkD1A(oG?WlZ&>l^klq<4}r`H5f-mGDUJz+O$ahP5w^;^z!P2 z%AOidK?!MRHqz4sTR***_jHjJwkj8JOUyjR+nKUs1-ey1aR=!VTx)gT^m`ENYd=l6 zb%~`CI;Bp-bPTglZ3x}1C|XBonzZ{B1(=_l)aubGw<=l;CGFgtl(NyhHz19(McijB zZ3iR_sg#)V{C9HI9(uQis*#D1J}#q@Kxh(VyzfL{?VI1-7U9F>J;*S9W?RLwp=IeZ zwVOk;;D}jyo-Ft#i(XGX^ZqolFESWn1uvx+(<^rl=>_ivME4TT8VHxHQ!)HqLr0Wfw+oVny zHS*(YCzf%r=$=^au@dtVk*;d+9Y4;^iEN+HEwZ8=Uey>W6^hVJ8uwk-?(wt3<%JPf zcVCkn#)w_2Io2;AVA!m5cY5~;)6%u6lkV%CvHZqQv|n8IP9{~W9h+JrlmCDMM{ zpaQBJ?%|XdM^_yI)Y#Y1<2SQVAsXWu$eQS-Q1cSZ_9J&-nVb4F6xJNPG=U47R;yKR zr@_g!?n|Im-`X1Ks;WC+I;-a@YHOaLNwsd^90^x@rMg&d)$Fn;Z5Lymm-19JoKqY# z#_f(!E-&r6n#UAPVT0t44n*Elqdq2L#Zj07+a1kn-mNXwEV9{&8=4o>g)276RV7G4 z?|~qUn~A5_JWO*3ZcM~oLl4b{}aEaPSeHX>ntPCMBWyy|*9N z=g45L8}b+sHihj4D~5~P#4V~Gz~=?JsB^{+#kaUEw^fG_^IXz6D|&{wR1@_|qm-j6 zRVAxF<@#o(TsEMd?{VBhiCi?JlogCQ?b%#RdS>3LmT-gqb>|B>BYZtWv%&SKAZ$|7 zdf-JoL_G_fXw<9bv)e~iZ}9@#_e10tYVH)+<*27>T=A{x%T)*Q`{@;(tv(+C`&<|u zY~;%a$g%zmxtSLAp4>ZGJxEnnT@Wu>)YpB|LMRu)d;B3`{fq2E5!o8mDhW3Y=whw+ zUA?67UqSRiT<{4s-7s)fyOf2VsT=l?D&LYEZuor9w#Hj`xN2czW3gRRihc|EY^3DH zvDl*CHSB1Ltjg89sO3jBU8quME~f(;aZ}&8pO$3hz4e)(>>%)BL27xz8NyLQt`xm= zNkg-nm=wn{9K5f;?B3C$lJ5HIRAzB3F%xcxFB(`go|Ywu-Sh$akHuD@D<-eovHz8$N1>02#=+MjsH3^nGP6kKcAIAMePq!32P z$?6=;(p;)B$90wZVh(G@B>W!5Ap6iCX4}Fc}JlKZ~6SVEUVJxJa<&RbbEq`vF%le!Yx(!CF^@5Z`!iHmA z*NMIolXB;J)IgKX+%V&@Gfu3J532kBEr-)XeNf)%eFC;?ePX2N#B(-^wnF_-C>-kE&qo9!G14XsBN7)I@;={+m>Z`)k;_hQEcADM0k)tB}BFHj9#X% z$6z2%7hWRN9OvD~b(b%a%lhMG?Bdjf{X}G&>#jngOP+3R)%s+pbeu&a7klaI@K78X zG%`m$(|#{+ZS)cu>Gf@|hXnmnZJ<1~;Cs(i>^9Bz82xD7zFn|db{B2n5ijA*@j49? z3fe%c>Zt(AjyIK1SD}wwl9{*PG2#VI4jJowFixp{{LW8^hvtgZ!;3s8vJI1U=Npq2 zw~t4`ip_G&I^Q+E@3mYD@!FbY&g+MKD0U9Iar5YqpAQg#32P zMg|bJw@%haV{r=M?2(bIu-O^LX!?%La;yDJm1290sz8Rt_seqZ*8S;N-n$hJr1%r> z-^2VtyieGn+N?egqHi2W%vQK)(z~2AdDJ8gz5qRRC&LI@C-21qgB(@~XTr|)zGYFBd>AMQ+oX?1cz0*_#1D_oo?+HY=Zt@1@YU zxwhXqu)w_l)A4(-KttD$NYVu>gFn~K(FJBbT+<8+plW%jk zXEZC$!vn$7%UZH}BT{$@*G3`0@u7$OF(M`M-D}O`c~!!xq~APCou-|%tOtuTa{6%~ zQ^OD4+jeR#CDWp}jcaE0SQBnVevDBK%~JZXc(Loya&wXmuQq+uwGt^;vI}TC;vj}@ z23JXM$ZgN1I5vVr3)LW&WP!LhViqbAQU5clS+$z7PE~I~%dE z@ANzaxwrjut14w*8Tr;sarT~yUvsvr3qHuP$#q1>+W7mECF~MX_5tfw2$oWPc_?+R zBSSV6fmnmL)Xx)M77NFl#p1E2xN?(m!WU{3m4Z7fS zgW9rL?KC`HWQ5x1Er_g+wk#wfKcZ^!6Q`v`LRvH@8&h7Y9uvHWTMJ@w=)ahV9YBZk z<+nRY>u8>4%hk@*_zk6TMmS%i^-=VIRHs43gDM^R%Wh+44aL%!JO@*H>_hLje^Zur68};AzUn2aojCv_*GuY3)Z3&(Vw+j+AARI}A2n>( zE5mD8brs~d*c=}n&%2RMm~1TOg=`ftLFoBNa-`9`0csoVds)@UXwaFhJ&LbhP$L2+ z=oVLt@*J_grKFW-Qx>#|HPwvu91_h0jswpq>$@$wJqU+3N+mX>T01ba%}*W9W$#GE;oB@NTAvQ&22YOyh%0 ze4wio;c?z#sJPX%)Cfx_)yVgYpsns_I1^92hwNXuu}WfcW38m` zxZpW{F1sboQg^Mu5>)BZL|gvSnyQGcjWYhR7Q7#}>r)4*sgU@-V7l%!oWDLwA~HHG zDdQ{Mom!@{>e+Nvt{-HDD%`MLRIZDH4J_U`!N>}v5q7O;vM2sKmX?;hs-9Se2mKc& z@XDz1dREYDVc#)O6&8oX3ZA6sn5eJBF20x~Ngc-y=^2)Ay(8BX{7~V!j45uRHZ7R^ z_Db!ETEHM1-1^b!N-p~)w-sX@T>eXEWy~@9HBRsUWq6VG{<9CvT31 z5Tz~%3r>DROIE{)nT&Z48uz4M)v7gRj=|An2Y8{M6b%1-&B5{q)WV>UqT`t+>GjK- zT>cTpm}=7Yc^++sm5I+}*RbC-!3o}oWscv+zLPZ@d39Ag6Z7`0ba&2dI*NO~D?F&= z2$8Kq{CuW8o8E-~8GL2RS)PI3R8>EWVJZ{PF$V2QoyKBMh-O{^j1Uw0^@8c-$$zcs z_le8ycq0$6=Y{S#Qc_2;fQpD`iE|ntpKk62I@X$ND&$?krz>InLP+vHkgZI*q5A zySyUT=Q8A55x=F5oooz-$PDBdt=d?Q5BiDePg?$&933)vsOtbwa=xS4Z^0?@610kw z{Z6kK{Wh$`4|FYUXM7UXPjj zpk~!_93QO8!erIwB%2|Ej!4GueLas$4(k&&hF3J1Fom`6R5(6ppA>$W`nryp@gL>7O~1c`VI$-u};gI7_VTUszd zbnch!2NmAr)KQg9S^}*h(Q!1)F&kv$9X5K6x8YCD^||=%ZWcT5ynY$?T)d1BZIoU^ zZ!;j5XBNVW^H*agh+k-LEY5zbfxt9Tge*OZxk(eng2?3K-Cf&k7UL)nq_fn$ZEx@| zPo|{@KSK2Rn*{PjCjo%PpH$wb!m1#6j&p*|dABP*K8G19fs5fukYY=~kygjp%=79^ zaNb3a$AV@!V{$e=x=B!rPYh`aZl~VnG>Ga-VhfenbE@D5lX9I|@U2t3eat~R*4wjW4SnkkY< zzbG^Td+pH7j~9Szl+di6hFt2zj)1z)+$*x4*sg8rD01qm1)9kLkzK8l*Fa=q)Q52< z_wg8=khHg$Q2=>a1fd@BFcQf#)7_{~0CkT)qqs@VW=2O6}%?%u@XT?2=8Q)IW z^2T@8YxLP@Rysp8`3?5`qz?+Um4;q@=Yvs26C#JIeF;-w^wwxn|_?Ncrr53t{JUo#kf zCI9 z{2tSH6kO#mpA&!bGQA#OuV}}{`6l}P@EKUu$^=pebfL5uUS;&4hZ}1KBUj<4cn0d` zi|+8bkFLdcC5sKAH%Eh5VeFEWfs&5ENjk=G_a2 z*EO4AFmcReT_JIbayfqB76W$?P&00yQ&9Nw+R8 z%?#-B@O(e(8y0TUD{B19H)-<6V6%T0X7U}-XBHMt@El`~0Z`G20Xr3@n;+wd*Yl|( zBxkW)>}dNP3H{L}3!nhusB0icI(y-2y4!B&xxU_p*b+;Qo`K4PC>hs!b4^!8ArGUwwBf-Z<9#O&Y;KzsNlVxim56s*!bi(8d;< zVcz<-cxlGXBHGVsp?A7Ty~6GsRJkdPDbAHodWEP^wWoKp0CeS9*DZS7J-z0;_wb5d zR2 zg<*i&8&|sG;jtw%iP@5gom_kQOcq4(;eaL^lj*2qv8snestK&&Jldpr7HMfwoZHf@ zSf}3M(q;CpNe`4tS2YD{o#C2Y%K)kRmicf{w};S!p*u7eY@R$wCil45R(BiJYOt>Z z#p=TEJ>M@tjZ9j;n0~G4Gif)RV+ce5txQ;{@dYHq&KPkmDZ=`(jWva?T+L^yi%eKE zTX}upi}9@<oyY*6s99+NCX)j2@T?bQT zDGeg;kQ==#13jbfSnICJhk`T>4Sr^J&CtMgP&sB=M*?4Qv zUJzqvih%NY(In2RM^EqXR?{i896!g7nF)=D6~$6(@Hwq)J705nA-$4oj%8jPd?`;9 zv-#*xG-2?lj>)&pU?ZICz47Vkg*Cn8Ye9Q%D=}7|TYSrGAUTgU=dEX;!J|JCc7x7b z>IM0W!BVWC3rWPDXHw)oC0#pkZf*{EEZyFhh==6A12VHsS!nmC@*XytT<~w{XiA#M zt@F2fa{}jBkpti64>EeTi!kw0o9mTHKI&mQ17B8mr@i|u9p&SslV{~mPA56=Z;e2&sAIu5&V8`E3$q3`bR4_F$bIGNc^ zK0ePJ!y5U%Ul+=acay|TiL1ad{GpZT%p_R@C%vy%=$_R#^iPY^|mo(%Y>+_8kvf?d>t6A?FTvTK#(Dxw5<1*ZK71N z?4i|Gume@m{xUr+4`{NRq(_F3oY~T&93Nb@h@k$rI3fEamRu*+0XNcvSKhmVq%!}q zNsZ?%!rGZ5BR8~?FUjUR^)qnprCv(whCI!2pSd>=J;+HX6M(he!n^qy!i48llTKm9 zK~Pm>C=K#__}WRBTcItzBu(iqpKjw~$nI9+YfoaUo8I9#rol}k!CL~4_im9UrBJ%l zj$;XxSN0aAz7VCV@Pxv=tpUgvp@Jv?n7K58taEl--L85oe(OxO7iv34!yHsg=W!v+ z!{HvxLM~OOco69{69Y3#Wdso!Zq+$%-A5iu9~7~uM)zDzXq?>a2}Zrjs210RO?~`E3d%n!DN*bIuhzukLfP?=WfPU+Kl`dFD881F zSN~n=Tzf2aUd z0_>UWc8DvMHN0$Be)Trwfo-^^WJl7ldSRO1mja{eGR^6Enq+C00|#gPS+2voU@kNtt?xjnt3hj)GNsa<@_~M%9l}Fgv{)Ksc#9lCZrtnry9VCrB9eP;2_y`C(|{ zG?CyYFp+A~ophK&EV5&QMsRN|(^G)^5iZ@^<9-1hi-2y6O6+5)YQL9?9!vN%nIbKg zct>f}WkALiM%7Z#6zA4=(UWp+Y<=P7exh0GV1SXpJ3f_CbBhn$Cx#$e7KZM;NN~r} zdt5B{!0@UU*=cV{fD#mga*XigZWo~uGv+nFnAJ6yw`)hP`}j1^!15yU^RDvp{v_$% zLQ%PGz4g9@@X!zyBU}n+G1H>@#O4W!IGy>%-KfDJrK1+@C;0%ulR1+<;tt#q@5TCQ zF%H*8%zChIGTC(y%BYmw>4gQ+-i$sj2oP?3`}hI_Jc6s>B>9m6nC;0G7%o|Mv3%)`u+FU7NE2%eW#2io{ETQ3vQ8*vPvy z@2UY~do!lS6visVR zCh7b1X%@&=c)C70xEzpsoY}v%&3E;uyX8IAQhF~@>FS8S-5zoE5l_p-Q{9kcjUHQG%MUMZ9P6QCUC+Yw@#2F;_{CAqv33;-5Vx1NQP8h}5 zD1@;`b<&xISwb;UuGRy)=YxYoKn4BtG@CpJG*el<%&e`Vf_(&}9qEqh*ZUe|`fR5p zi2F@#=K8LVhY2d2qT6~`@YgE%ADF(szV-)1Qtlr*+5Z%r{^2D3#Bl#%0{)MI{Q1`( zywZP&Eq~cm{-Kloq&oBuo$MzVt^eb6vJ+g5#Vq3PpEH!A6Hcla+v|IjNmKyItbl+! z(f_@u_m_96PWnFpNV%z6J=G+M#Ww)U8T5?)Z-Sq{d|jqN>*Awl<^I9F#@tVJ^;Gay@zrQ<8eh0KsNG4XV)rAXKc7wbw=_=wEL?ZrN7*waJN{wSxUsU>$ ze4m;79Qy0{{Q03jE2{tYuD>x^3Ik6G3!uSAefhh@^Ixas+i4&0PYt4RP8SCG!9 z*~x8?%KCR6=>LqxiOWB@5WWA9)BiFb|Lkl3V<3P2_4~e7tQBB>;Ln4Uq)y!qR(xk3 zwKkj5NvAk9QOQ9n@toW7*^$UyggYck`x#bkEptcn8NFAWYgcUC>uFY?+^RajLX2?f z6{nx^{oZ`5l9%y71m!P-|MLX`K0+n=BW!~5QFPQzl`7@d8%Sqs$6It|0Mx_nQ0PVF zFNLP9v(4%pUH3r6Z8qd}1xX7Jsv9#oAC>6@0)2go1dt3!A*!l^DVPf)hqQqvsk#NL7??Q#Dwk_ zx4x(42R~sekude-y0)-2NM8en!yh#$ zici2eOskCkg2v8|$@_90e13|FE=$DlSd@^%R+8QJrbgTMQPX0l-Q!uwxb~OdXUqma zy|UP-zMkBX=rLu@y6!3MyZ(G-e}+!fWiuPFbxO_Jx1RzwlENwW`(FmSr*1i~rzePd zLr!rhvIF9j@tXS-AE@Zc!*e*c_LR>FP}IJi@*w#KxPT0NrTczWdOc^N#HO*u043(} z$^1R&QiKnoiOyxNo!%2Lc`7*#s;G2H9t+#APOtmb6S;OpFZg^p zT5lQTr?GZGp@Ez`{6=qE;MYft1B{p<6OEQp4FeCic1?wqcJ@cxj10$ehk~R)ICguU zSqJG;Ic7D5NC7ok!(?G51e2H-veT&QlV!bw#Kz`8f2F4FY26L!(OM(v*b*oI^!rKr z?sgNie%ex#Rhm=2<&|U79_wd3#Vl39x2c$K>>buYxaRcudZ$@La`k8KREM!UKL!L2 zLcv;nxT>UgTT*TP&dSI;?VzYNh4;~h>tl|NR_|;(XBAXOyQfH2IQevM0&e}@zL$m8 z@8-YKROAKVz7ezBx`X;@u;3_{FTIyy0SUH8XvnL9AgN5%1N$)Y!Ji*GB~fAvu<-}g zS8NmDyBH-OHUQ|T+by&#HpBZyb>l^{HX;tQD;Fm6%4;C`F(qBUdbU5s|HwSN0R!2g zv0yGRWDf8oamJ5aM^zK0t`9Ab&@pzq7|8~hc3AYBBrQSujzy`Ifu>SbeB3m;HQe#i zqzTJp(!H@T4wcb%KN8N-U9pRTCSekvrRK<0bWk!aSqrG!Pv5RL;kC>v{aWy4eyVVp zNwK8xBw#A6E}P_WCGgsKgH>8mz~@Dxhhh{SYsFw&C#&bS#!HpsjW0kMc_SS5cjJU* zz3}hV3+oOZSPZ{3clx5wbR`+T^OI4*T%!HhuV~60Y-HauftZiu+u#G@RGWZhT&{_t z!Fr@t#=}XmFiBKXF{a#TF0EN9UlH_tx*EZ)skrOmhqk;6QitNMvoAs6Z(N_xd)ThO zR@U3rriF8s)>gNRges92+rn}%W%rx!hh<1<*c+B-cKDPzT{``_{~Bv4;CK4xbbuau z*Sg?}rU(2iJ4ZC)AwYYX3~$M0Mfxn3s$1yE8pskhBLRf^MD2V_k5u>-xSpu}47YZs zNbd<_)O;65Y;)SP|I`lnGKKV)oVYggnuZ~H)GVcXw zOW{kAK3NG8Rx0$BlW`w47-@VnDhUo?uDwayvWgH|+d>%c!%ccnD_Yqldgs`X&$`C) z+aS+;jvvWi4u;$xP_(YvTo_fzjo@<}UX4yklW(iY(de=O@Ib*{+|aHX`+NG-5=Q)^ zD5h`B<5{5q=G3ECqg{ntv>yf(H}=Sm{gJhUf*|)?N37|4O?b7}R&G8TsZh2$aZQxf zPyaRJwNrx6=LZf6|H>J6aQI2Efl{u3>@@2AK~;g!_R+BxU0>g6cmsWYbbm-VnF7>v ztu>2_htM}h^0dqHH<5P?kDk7=S?P-i0nk^apbI8L17-P!Y=F|dW$m>(F4Xp2-?yZv z{_;rB#=L?Ww{lj;_={k6kZ(JHTC`D*X=ZB<*d1i;RYT(Xv6Bd=c$g8aJnyY!-2O=& ze%mO*y8}MQL3JEASDbk!QNXhp>htx@BEQuqsuD@tk9R#m4m{EHmxMkKOk%?Khtru^ z4%&!~exI>mYCFxT7H56QewQN;5=X67#S-0E91IacUN&!k30dl&BW^BcD8C9@|J+2^ z(WF!IGB6KYF+&UOB$@9at@+Ic@0WNRhbA35Yz-Il;BQ4|Ybyv|wBW-+J?tjfbtOA% zE3(?(6dLOQM%8@)EuJVBTD~ss9-+xv7%nq3jl7L9tTiL{b7Zbkb6>Tjq zOj4JS)o`|h!8MYuwL%>Gs~!`NTb&r0ry(z&nH%Xf7SH-N7T3RJ31?J_6x4bR8fP5i z)`m#>Ae5V&xQ7d9n0QcI`yRt*l0lz3rr{hmfFOGhkbajBD0&24K?k0YrROYkGL5{y z6(?wtDW|a7YU|V zs3QoEe5tC%bPhxdO6V!hOZg@MXi~FJom((N{DZg+6CJ^&%=dq20sQ)y|2Si`Yk{1A zdR@)t!dYSR^mr_gLRcRFEwl}K=DV+ZWGGt?m#^Nu zL@}H}e^po?O_cq_daR($Sbu`J$GVxP7$#h5gcg~i;ZmSeZ+JyH`O3JXL1xG~HXs48 zEa(x`4$0-Oq;AnEJ7T>VQY5S&}Kg*AjQ7$e6eX z8MQLIRSE$45yYmz*nK0N6gb$k`IoW#zYCMlV<#>g-tEZW+34~m8IOHFI%7Wj{OJ5> zw@N&RPO+I3rbiEXzY4c%ii7W3)g2JilV?ua=kL#+ww|g>wC*pp7tb-w2^;X4t8!a6 z%zA6#J+n@qI$&|n?ZC-#T^s2UG!k87Ym4Ft?#V&#Z>K%-T~;aKt9xc%nhOb69X|7c z7(Au5MlySQe!Xwdni$lDlg?6AAZopibF4g+p zT=#@)-^6^w7{NH);_FPy(6;Mu1)nTm2WOO^EebMhKVgh(2BmvGV%NMH2Oyx#OYIh~ z^+;!EH;;6=SE^^E|DY%lxmT+^!a0ToW3U_#wuJD`-upnzfWOI$;sAcsw&BW~qf`2N z0U5{h*W>oToyg^H4|E9MMgrX%;CJaWA)ky`Np3eBPQ48$NhTPm5@G$+2`b@R@xrmD zZn+~jTJ44pkf8wPcr#vy-;x1-Jc?6`SK+Zr(9ZIjcLq>!DW2=#Tb=*P$|DZKi8FZ* zZg(e%b6yMMjOK-0UEZnLncW-{;CJ3V4!r4D(egWs{Qc#&S{SjaRR5Ck5aw7|W&Sn( z<)K^-QJ`oIlnL2Ubwu4Oez!Dy(d9kolf^w>3x!yymN?Yc=%&={9l+-XPe6cg90p|M zUkA2((VkyOsP0_~G8{1k-X_P3j)!6zHnJ=YQu z9}F5!kG}ff(pvww;r=2D0*fT(Fa#|q%4XIw2|1^}IV;VZ9itj9YV+k{GMCPHgF)H&hly#9ZpPz?wh)fe zDwX(lMpXG&HCY`a3^W%KHU0oL;RZ|vWZNsv7uM&bhmdQs0cb8dk0;oVFZ$s|XeWYO z5X22tf)|1EfJGW=;dj?}YD1}ku)GHPSAc}^l$-gtlC zroi?=ost9tK1ou|oBxZw_l|};?f?Hbg=|DglLSE|M509W=t)F$5@i@=wCE+eFoqyV zB!cKYL?5H~E{NV4orp3REf^EV@VzE`?|t8&-~Gwwv;Te1_x$#sJ=wFnXAke|x?b)1 ze7u-<4Ptsk8vb%sVE*&Pwy3$nrJgf(X0h|LY3F=3v$ykniSJk^*%<|FM)zm`j*@;6 z&ig_}`_6Ry?jM}q=S?O{);a@k`_+5SZQ0*wfx*DG)E9#HA|~9AS|3bT*xMTDsLJ=w z;#$p$p)dhb&Zs@bOP#ZyWY?w^^_y&Q)+15E$Xb?m6z=|82p5C6W143b&WZi^%(aqz zow+Jp*HFTtj{rdw1lYoiV{3Cxus5msBs@gAXYfh}v{xlD&9QQ8_jaMj$VXVxL!NkR z3zsl&sSg+~}Wl?~mJcI%+If z7UwthY*2bYAE^k^YB6hy!Kw_)a1UI%dsDzuk#5URCbc7RW&*{uqDnT(@Q%M+3t0bD zEWB`+0Ez{nDq7j&8@ifbN<=poy8O;7WchK?zt{-(AK~FEDWak``@|dhXk5sZ|7sd` z|5^tr_bq7xgToRNi@)BvfBF+4n)vgVDqZ|n%cQffkAugQX^ljGUAq$Z*XgepNd>0` zJD|T>wDxiR#r*i#$<&|pS1}U(RV={le^XriGa#HLBV}si?WDi(3jB4J@U5RLVHFZf z_(TvDSm#s@c&z%E(sv@zNdO3Ha}Xb0~QgR zbre^Um4TYTVsm@=7WR34tTd)0OggV>B`573RqJ0sfxmVn9gf=HNC)!gS$v^j*!iAu zphRDHFk_ujR1T>AC5G$LER_7|1?Q0`3_88@Dj&P%&s+n0M3jRD?UnxbgW+=vEHqi{ zKSL^({0{-2on`(eQ=G-$D&><(7(0k_eXMHSI3I^Y*w}1H=1bDM+a3EkvElDHFGr1 ziHZjP`U-#TxJddLyx6oCXLvn@~N9Zz`v>MS}87q>+Ds_O5?ewQM1I)XVw-PsyxEN-wW*# zO;=2Y4Wy|sI_mP|Upd&v^38P%D_w~0ahKkj?@4^tt*I-B&VJJ9%V*m)$||OnMlJqg z=vFK*UKwLgD6@^;fp{CVs~c}HYZb|>)s``P@3)_HuP3e-9PEu4cx5h+RTk?d-wvPQ zBglJh44;YO3X|BVf4;GZ*DkR)%6^jZZlectM`;-0pL|2HDGNqE4-=p+bV#1{kZG9pm2NQvXL=hUxrzO_%IPeJ)iS z7g~~?&@Q$kFe@$OBKRVtCLbfb#!LzaANn}ARp~^G(!ZlRU2;4g5lAK2op{&tmH76| zQGm^UKzDq)DMrPtwr=_dxwtgbT`~w@jWzC+lk0r=G_zB6Fu&c~&50xx#_Z9j#OxPEA|2y@u0rZV*f$$bNn{w*M(aDr$v_;nl0rBCFC#k529fBdvJY zl*xT>XoU^5&twQ*nc-|VCAw7AX*4?#FC>rEs*cIXixE>@?~cSeTI|wJeX%&GE3+NB zV>!7vK(H7-Ap5{+-ov_v>BJE{Kcw2*|LU^)bSjW;clBGt*nE?oWGNm~B*fvNu#RBn z<^|OtaxO@&J|{rC2{1%)LKOmVYuNT_R_(=hyYEV$CTX+yX6!$S1OA`a@N!PA_HDEk z{f75Wn9WqB`g+wiwfnRO^GRe+n&#mpF8y!#IJebllbok)viI9Jn$LNvr97tETWJ_c zJ(eoLAk+bNa4~KzX+12k8APK7YD`XT(}&-%$!Su^gVj&#h3MSA-PtW1xP$8mno&Kn zlVm8_GWebq54^YEV3r@q;@tVTOMGkq%eyMFa43E_f=1d-_~&Y85SlSC zB6`czOl)d8DJmaoVs<)e?7H}4g=_SFrk7DcRoGmLwq$QyqYWeV%Lk*xJ#~g>0SrI`@GBi0yJ;QTmO{*&=e3PDeGfr(x9EL|s#O zq$OAtr2j?f?6GQ&h=5PKc9Zj$InEThH(wI8o>38cK9j^1nSUK^G2&BK;B_%i8<_ze z_z2-%9xaNrw(T0@WC0XLKC0;DlFpoFmpLloX3rF^H^8G@<^71Z2xolsV_VgIH8yq8 zG}>cVgig@ju;|>RR)f|;gdwyjOt$+?DzA3b`9!d8gl$NK{Z|RxeO7Q8Wz_h6Td!*` zHYHe6L4_@bfEr1cuG5!A`lQd%ayW8>`74d4@@T) zz%VV?Zl2tJbcmO7zxy0kdE3bh zKO1f{eQ2Z==*-CfOfCVlw-;@o)W$LzAWEqVHgox*f(p43fREzf-ixJBcU9A3j&#dm z{#um}P6GtrX=Y~%p^|i1xQFfdATVpC^`4#S%e^4`J|bbPXad;QpiWlnJGGrlc$i`;;9KvH~C0 zOGZn`A@72?+EjHkN$RKYPBdeBRYBWnb|AegBgL1yK3S4mbRPBvo5vp+zU#f8y+kwa z(c2Htj9VSA*5cE_7sxVs-ukjPwGrJQqz__%h~3vM!(LV5R`FF452ccBkBypzjIIxB zJ=Mmj#b?ayDFj%}i>EtYv^E`~lC_gIID@R)YIyfr)s@oCPdE>pvqb(_&i7BlYJ5zCpD z{T65Qd}`#-j=`#4&dcB}Qr`h3Wj0kVMc7irin%;S?i(!b>A?>}&DB@KE&66%A3n&wCzH7S66${1_2bM&Or6hq@gXy-q z{h^P)mY8CwEv-<4mOCFC`5YE0_a^s`bxACr^=H&ArPwoxsa@N5n+}8Mi^gYmPA72U zp;8~n;}6TcUUm~6H5wux-XUyF;UDHHc2O`w3N}Jhwhrq;j92rdmMmK;Rw7|rx|t7( z5+T}bb%Vak{PVM?m^LTG3yEo``cpPQ%Zb$*l@dG|P93jP^}=C!IzJg&vx|~Rovmn) zM}Bj`PV~}2hGF?qeJg!tElFPEun5+W(^LUFOyb%l6tDuz_EnMZO#3{%V0f7cdMr?B zs=PPfy*P+^4$CvO)p{oS?D7(c#h;<7k+Rsz9UKQay9VmyB-2X7m~WjRiaC>GzfD!vVHer_W{gA(b;F9kGfFR`?k< zkJlcgm~*xn7PXLLEhHQo`k#6m!9C~3L})LT32LiIX$}peK+{q zBz-*aOG8ll(p}Adta&XDjKiQ2#@OHbYFcV%9xNA5rR_8+k;zY7UlVI4NS>ejO>60R zy&<$!Wecbb9O?$-rjTp!rw=)z(uZnwnw;~Y4?L=iQiIcGii31%XU26m$Pyu4iR}2r z4%2*BCYM`%V0bIqlsv(?Q+0LdlX)(_v)L;O>z3bMY}S!=`oikqp2Ui|bZ?LT{O<4M zU6aY@_G=Y5?NJ(*me66}-e+P@RU{gwawD_T!(-Si^&;QjGwSPkpr zO@p;@w+%Du%d2$;HQ&zg=G`VtIv_$+x^T1p8{50sxpTj4n)}Fss`u?HKObIM0zIVc&T?kI+qK<>Oid3&GUovS3=rx)*IPMr)Fv;PWXx|eTsjEbsRX!%JZ zNIV7OZD56JMLM*$zRI_W(h-M!(EaodUa!?NHr9r6*Hff4$RSZ@GLuVe>3@t31n*~G_=_03crW4H5)s;s7Y#k{nYmK za~@Zw_#q^_s^mHYh4SUc9J!%=hOyKV6aD*P@TrVol?lg%w%e`V_hw&ULyqWs6mnLS zcHaowj9mvsmVheUb^Yp%)hy2Q^jyFb46J%(sw}QC(w8k>aNpIAo65PjyEfZoM&RJ7 zxrV6P_ZmWzt@phocsTcBUFq%g&53e(w2*Ic9hxYs&mkV~o=9hmH}Vm*$E84;SCSm} zGEcJK>b_`gv8TU*V3NI`Y4Aizlx?+ZtV!Vhr^w5Id~?CX#TXx~QNZ=sPw&jbDNJVl z_khy_l|oda3@>^qtDcHq4uBu^<+uvc3++_jIj)Kt8SQZ2Cgue<*yinE=vj-UpX}=# z9bi@WNJ(-h`s>#m1Eh`E_-JnMd}L;SX_zhbJx&18<62zDCTy zJZ1(vvWR)=XR=?bN-&>FZQA{m{xb}252n6p_)N*_D!`v1|w_KO|v3FYgV2Am$o1lAwHdJ@Et z#byJ2zK0F?W|NRkyf15{?9`Pq@Q+5;4JqP6wzZ)ZY^&5W)e zUF6n6(_3Mm)!>;x2^PWq^z#@DPh7*#Bw%#QHtacWvY7(9M`)gl^-yS8zJPFKrn6i= z6df9&ldX_xhGUSkM)E<_R9tVV^cI>oefcQOwXz8f3}JGJE40K4Ar*o)Jo;AjeTK1o z0Ijb@_l4T&Vq3C-nQF|fb!(JKCxnzutGj@CdiLV}SfO3wcGB;ZR2G}L;hL37-d{(q zX_VI?Ok0ztGHkzRpWMwBq})(+v5H^A!TRcC&R|?B%_qS%@fdl64A6Di_w0o^)k?uu z>9#!^tR?1KFv-H(`?3>=gFxm4Os3ai3!T-yJl7SkUU7q-RisZDEZ>#)K|3;cRuacF z+D$PvI$NU*`Pi*bWKTf2ER8>}lbA1ony&~yH}a)u2k?}tb=yAGMG5I?o4 z`*&?->$w|v8#WV*dU*OTj6m{n+J}rFPE8rLd^glI zH%9}cIm$Eqd%3e9jjMCUaj3s}I%1jLx(D%>!(UuCuM~4mJL>!TU6z@*={nXeULL~6 zUw!-&x$%iWR=4sSEZaWG=XAOY6LGOQ$M_h(AxHwQ(5Lm)5DtUsjm>pQbdXizL`m2x z+P=x7J2+8%EM}QHU%=uPD(*+!jpc3o`ut_y^J2?@22wBGwt`tHkVGWTPP(m6nbbKg z;|mQDxfmNuDpZ|OrRl z-D9t;tCb(dB|NjblPYF^R-5sGFujOZf>Kd{^}y}CAjrN68WbkoWj@jeG5#!vtY%B7 zvw=Y)-wM@lc8=aw?<(s=eSBhQu{PH$$xj;xx_un#jhxCWLk~i%X}Te)+PwVlEc$}= z&NMBvQ-x45@PE0=JsOhl0&rJ!)P2c9W|mluP2N_YLS7g39-uIjAa3*pHcrQ-w z_o*j)shvhst|6GEHiyE^_^St^53ksry5o`sqq?;+PfcY}Ust`%D8+*+*wTv!H zdLhjh=lH)Rc7HomDMjGzFwB=MmU7{z4E$9Hlj}y`gteRasslfwS@<|dkk-C64hSap z9YP%9uvy#+X9%}&B(|Q07C-wg_D*bPKLxk9;H6xZ;>CUkG$k?2Cvt(}OLDZnm#z$U z;shXc>= z`(7tXo7xbEK>Mq|gHd!%yIRGrBVjDR^0|(b9lq4}q9_@8XH=dJTmJ5M&H1s)9tyIl zr88t>r|fA=hl(67SlVeCD+aaia=>=z=s>;hs~R?1;H!^QJn@RYB*>aWqbM!=xF*s{ za2b85CU_GrB{r1Si?^M)vpkqtt|hb6k6>bSRY#UKn=9A=c8`#yy&SvP*TQa!)M;a~ zr&CRnRrxG#7S}YcJPI@%o}Ku%HNsqW2FfBpMX->mEjR0-*mJaHaHIWV39RaUyq{Va zRSJ3;b9mM+u!7E6URTzz%f61ZUk3F#$iAUu3|^ZnZPXq|U6p80siL}=fh791}W zIaE@WORYtBZ}~|vy$4zz`N~SOxWRG`%{`F%iRW47tSRb4rsnugRsUU5M}%zs{EoXP zkOVlf=7q>jO8M5Ez4YttyrD{GQWH!+D5xmSSb;DHbtr(Wd4xz{Xy4v z)0)oF-qvf=VC<)m_mMs|K0zjVb2qS~c_$o!SlUbwrG$Phu^W7BxxIokb1*Eh*~*3T z8Bb~#+hqx|su!G9A`LtDK}G!`3EdYX&pQSK*i*~WC~>kgG12*&`ax3LN|Y2thZ&}6 z-h$(X?}D4O4dKf)?GxzS@5qyvCXCcMv@dbI7%#Kdf>t|7Cq$-9PnXE+=r$>=3}J@z z)Y6SxLV5Vv{7f;qR$48&MuMbn5^rCkAqf$jT!d4RIWA6Cp*u3 zBzs%$@wubw^F`n5H}*_jax;|xegiL2mk!E3F!+waXyf=g@Od}aeY*@tb>r`|vUA&o2k#~L@ z$2ToU8Zmo7m`Y=fg;|B*Z8^#9UPOzg^t-aaLteW7?+a&J;MmDk$B&Y7klHxHc`7b#tyoR!R#Pk+;%uS&x^YEXZUML6?{{md}iGYsK@e z8lSe=IKGjv6{Oj%vJv7F4*vf-(z10=$`aC4qwm<4u2PxIH2AUI)Q;*S)PUckjdnR0 z@yH+QW|UaQMf;l4+h5_^cY)gZ^UcLwXB+~jD%#>VK}q$uU%+B}sI;^Wkvs3U%ZkQ# zCUTxU6Ea=qH->WH@%F8K-(VV6qczc(@+6XWD!KJEbrhp0>p~8Mx0{BNvC_}fC!c52 zy`XoCId?V^D`0IE08#{4GS)m8;zpVKn%-vO$DQpnQT{*Py#@+gn1tm-m+;9#!lbB; zb%@W2uGG=}dnq#`lNhf4l~4D!yC#wB}N&0brjEC)^MGqU=HiEY%bPFL8%IyVd1|F35PU z-K4*q)&!eMln5jY74{gsZ{#CBsFoY!TXc#1W3a-2wN_d-j1^Mh1Z>HIr$T^{&5Wp# zdfcWIC>$?h=h;W$12UTc`E|pwiMP>mWnvr7!i|)@kP3KcGM)^O6*?5hsGk%^06Ln4%RJ; zIohd9Z{nwfrN)t7>8IKjpWMl1nv#G`MA=YG(?c>hmvz(2?K|Io+ZcLd}KMU}Oa31Hwv(@9P3 zPrtGW=DJ0MT71`+{TmSwp~2-E+>Kdj^xgNO%LQU*P%Jzryq(AE;N=2VQyn(a1zmTW ze|&1PVgyZOWL3A7IRBL4)bP8Sj5+qA@{68rwXHTJltjZI=zL1Dl_7sP~-V%1J{;9!74FC@_ zfYOOgiP)ZYOXiA|z??s*cRF(W`Z5CSfe=5FYqoHh5He)G2bfb`QsR9ad9Dqxz~?s8 z1xD}6*vuZJ`I-h>jfCxT>oi+@u4#FjhX2}VRyo2ECGmZ9jzq=2V*9@LIO=5fOl%29 zMgVbjC1yb}I*O$h4ARb;#lIr&JWi9)_wznB2yI^dbysd4Oy8pt#!ue^%ORN2*bD3( zua*b9!d2bYqL6u29jf2Md!;Tj-jU0Eb3<04|Dk_(4MZ>d$)|wW=OZ=#0(o;2U$}nY zd#jWg(t~kLRVpVt4`tpgq|6i;K}xg8%-$|IVHDQ&@F%CnsTEq-wJ+I8)$XBn2i%s< z4!&<-?k8EcXfAnlSeh6D{O}EYlqOQ9>Fw=50&%wD_aL4&ylhC^Z^7i2AK;Gl1_W2^ z%}CCg(2qCMzzHA$t81kLuh^Cbiokbf15MW>vU$Oj zB747mmTx0A)k*HeY-gy1%QAV~`Z7zPq~mhB%+1#cbn4&UJi5!eY8We+W@m0a+FX$l zQKdCu1f@FgEHJfxXI7P8-(VQ4AIvvYr=wry5RYDrIb+@x5x8DIBjTmz6_s3)^H`Gj ze7LQdvT{j)&+sM~QZaRS%|v_URlK`;_uAK`>o>jx7yIJ)ySI8>H%{-388Nd<&Wso* zu=<=4SjzAzAN@R3$fzcDA->caLrEn8l0*Kq4bX}1w#%ov%F33E5Gs?thy6?yHFhd! z19$EXArPU$^lL?z+-V?Mxt+ok;smCqES26$l(}jtx|B?U3OlU|i6n8#&m!(dAIpn8Ekh^uW};^=yWezk9_E@KTsoeR*{!}_*$gUGuTO4_Q`ucDrXn$ zz<)gfp?%BGH%(80BO;i`kgRvLT@RX1yJsA1n;{B~YQ{x!QBG-Xs)=nq9~3in!r z=HC&U>_C9@prU8pj^+~LX(3LZ#*KSWUcGh(mC_*avfQr!+Z9@@GcnV^lLbsJFAy7r zH}_AwO#Zl2&N;rcyP-o{aGdk(7niH}TCl7j1?;Ws*LJJSZOmAd9huq|FL5pjAnGa-l~7~!ewD0BrG zgoQSO!Bj=Qe0NQnX)D^mJCa@TqA<3)%$lbZsd=VyjSrbKi)Iw-_MoaiNiH}uR;CPF z{wg+N%_#PU+Qm$DcGa4>i5PRWk&h8lWHZch^G7BIGQ-!R_&R_Y0^OzmSddu(#MkA| zqp9;TgmP$@XXI1-_Tw_^0r3oJv+Hx<#xm1fo-9qMlBNP~$lxbhM< zE(I&^TyZ*6N8yRp^Pn?dM#DDi8HJTn>FWp;)%2PrbI-Yd3{xRGw~qfoDZ5(k#H9+l z#vb*#=Kka-*u^~c{*i}zA=i4JQ+->0QX_2Ivzj{s+RT@o@AVoIL>YAWPw&+&PV?|? zBS-3Osg$RuR_Rxn*_Vjzhbnv(=J{7>EoOA;lwjD6YVWaR^LpZ8bwr`0qVpBg(!PzG z!ZXh53Egi&S59q2*3mmTJzfV>Kv%?PhlZ3%|Zpp9imY#&LgzC}*#` z*4ou&lOQW`Iz9bjj%rK0PBsBE+p|RTdB3SZMO0~g8{PM?(s4eNIX8$AKJBd<5Wi z7*n4{K7ETL!~AXfYaF{fgQ>OyPoOg?(usYqsk_sCLegT+pQr3+ekXWsAxZLZl|L5r zn4xLX#-`PCD&{WxJIf2pnRhg8ogmu$>&))k5}O}2a-P8W^rQQ0-&7Df^m&yyPq-F+ zexl<(KhYE@Gcx9LTw-SaX+D9GeUiNurJ&L)zHz3J)wzw6Fgb%bs*T9qNp;U@nzPbY zKcT&wCcV7al{DqW;rg2Ed}Gl=@M6na%XLlIbzcWjm7)Jh1E~MHD<4x`y`^)S-M$D} zy|iUGV)u1-UwqOq7N+YFJT^%3C+ZV+c~x;qn_b>K{_mYrc1vLCgh5m0JXt<{<5HWRte9Y^3U zPOjLHa3JfPWHFyI2y`CAic6|LTxTXo5r-%^_r-T4K1R-MVLI8Db7$`g&WjoTupg^* z%XiZ8HKq19Xt;Ivin}FJ(TSAxKj4+9B2RcLq5mk)Rr7i6cXDiX!;R>=GihMT=r>8P zGc3P>@|d#L6eltX18WKf?vqDD2{`6P^k-KltAfR!P2K286k~s@m3KGAY>H>lk3 zS})LJ`;#V(Y^b>NVLzgldGzZYu$L_R`!C0#H*Q{d{4P`@TWzd5uJ;r%!CrMd-{WY6 zG*n;LT-<&j#qJz5j|)qf!4P3*ReyaaU%v!*^7m^uTUdaGO>OFrOm$_z_oWE&nA3EL zr6Uk={6O{3);MeP;M1hEEw%5nGd{Ff`$Ao3yrMaa@>jDqS6t7qS_<>b%|X z^$ExxbxK2EREX&TChiWaVKBS6VE^n$={S0!Qbd)$55s5n~ z76>0(j6{+oKW1SN)|}`53<9s{CrCvZA3Em>=5SUj0Rfr_vzG&c)+VdKvvsI~YXsv* z4{?+Qzy190^^#~SQB7FZtp#h15oM)@#q=%OF3$ofSJUfo{f#^M3d5HXEOKyY7Ac7A zToFAe4p5s6CpbNAN)z45Qt`oC;U)WpHuCgnlMSJ)8^fesr#|-y)ruc$$+a?rD=!|P zais28U=yXyC&`iDA{eu%z({1DTP*jZxtKwpdh#iieVX6Rw57$ZLhsm9V2URhb7;i# zh`!nZ&q1VDxRFo`RPvqaRScz4Zs zO0+<8vUZKx9BA;2+1MK*^}VgT``UrO zE~<=ywwdiQH{CAieud-?+n032RL2D!UV$yWVSmKQXOSMzAn$jcwCWqIW^DeQy3}T} zImZyvM`v~Cu6CKz29u?sznwD$r2VlU^KPh-k55E{>#J?O6PHN_BCxqAW|nQLHORR@ zDTD~5%JTI_P0zM>ZB>5jmCOu?&=It>dPtXj!uRg3(C#O4%P-1_*9nq)tX~|CH&M)j zPMIX(DM1D~HrB+Nr&oRlv})Efn=Gva%hsyh_DVH5tpt!W4I0#rfrhJ2GAsRH-4h!< zRc*773}5a?O#eq;$cHiFG@Lh&N1qw2(*PvZ-sngyI_`e3WO*hBEvLeqsEc3S?TkJlhU4qhVah8z^;~ zyUE$Mg#58cO|^9PgU>wxy9otm1|~z0I1PCbU0A`UE?^!2Sdb%fchM!B8Ym!&>yo31M?Nxn9zKcyh5?x^ z$^5mE4kgj6#nU_`K{~uhijOKj4^9yTCqmX&q&<@L1+2@QxW^`5c__6Jr9+JBPXRaP zqMIC5&(f36vM5(MbjQgxP$ig{`jiZ z>y&`cx&2uwr`20_^;P}$bZSQ=R?8u$}0H#UanFbzO(?gQ!j=^XazF6cqfl& z?u*7lo20C1W$#jAfK7D2 z`t{LI14my*f$wuGi}t0f8s0S{EDm`^0X_rFU+4HO4ZpP}d+|v_Eh}ar$j>S|oJ)-t zt6#TnCz=J8MFx^P z%e4WeWBUx+C5m5H=nZ$mGPPnYzGv~ZX8W7I&bK2*UghhIQc&rH<&b5NQ6_xEtKTDh zK{~V-guzGKeIz_|W-rb>$xBf|ZLm|#S-!q`+b?%_4_CZ13J4;t%-(HO5VBjfm=^X| z#v8qJ3pYab@K)t*B+=rwyGOsr(Tp8g(fNI1g;}c19X`|S8I@eTJ}9Lv z&66zR2C-{%u6e*cz6P_zn3~&ZfLYHTBBx_I1QK+(^{rNSZ=5<`Fr&o+ms%7 zC5$-*M$`H0^6qs$h=e~B*tT6kH=ZtGP~YJ=yZ1pq{ln5yPnWOO+vAdBm7MLLRkf}r z1;UTs-Q^bKG-Wfw#IRVv7z|(CHEV#D7XVgS_AtS%gwpi^P0Vk zTu*r7V8`2|>ZMmumlOzEPsF>?R9&Xcou%v77>GYRVNoRe3XJ>@w@hdFaayaP%`;9F z4A3mY2Xy`3_k9Bg9hv>yPoBSiRt3z}Fh&y*m#+XpT2~CgtS`VK%Lb$;AK2a2KVqT( zyWQ!9K1tjSfBlDl!(GjAJym9Fo2UMstzslc;2;4Yv%-p;aF52^-G zCEPwb*bWib{P>b2gKKxt=?Oc2e8P3@Lx>ciYolvKAC7ufja6~q`hNVw9b27x7x7>F zFaBg7-C_S}X5#+a%=EA3_3<}C9DlL^e*b^e*z~WT=70Lr{l7hF|2aXw_J7%v_CI~F ze?{ECKiz-R-TwR2{p*1I^G|;}LH`VP|CXNoZQ}hi^ZB>u=I>bdPh0!Hj>_Nu>;EQu z{@XhLuLJVupM3uRWu5=GcjLb~Ab_{nTrf2LdE1jrcX-%c>}XO`86&0{pC7n4Uy_Zq;bX+BEq@Q5gfW5!s+EC&&Nn zas1~~lXvB3BTxazcz{~bz)HaCidya;{w!1|7J81(M~z35udzt2SCah`IrY1)2O$4gDZT8+E}08XmA9nfLy^HRH_V0m@2LiZ17r^vk7*BoHaV1Sw#P2! z)=r{om@w#X_DUU*lx`i38+DOl&+GLaCnJ^BGF2FzC!8?7oiyyK3V>s!_m$|$;S}eOyNoRuw zGc`3wvrfCkH7SQ$n8fsDfVPx6c%inXt@&H&)c9dV2AEZ4dhJ1{k2Y`oq(*RCqbpR} zJ^sptIQ#ng&l_QrPu58h$#t9lVYYTz0_Ex$f512iM>L>`?Aij_Es_XqwLCbWm|Q0% zo@BUgGFu_1r}qGmndPYk&Gt|hzZuD7&%;WMJl$3$}rUmC;yFux%jiuv1WZv%A)=vj@2W5a%(m2g@fvn2r$;d8}P9^6>$mcf0Xm-5=Ph z=m5=9hFZh+^K=rHA1ZrRP4}}>GK~;~*w7ewCEN>)jJEch-|+4Z-#0F&W=wz4pSs@N zeXxSVrUPG8-JbuM1v}17Op-uFWWB|?;;cV(yvqFfMqdC!ph`H{1;g0o(NBRES8fjN0HM_*q(mk1Jy6P2C6m8%j)f0=?K_Rk ziB%y%%rT0QeA_@wM{P)imKax(xU*jLJB4<^^aJU^JQ}9Yzfwnyb^1!wY1H}d6#MG< z4E|I4gDwc$pBS!omKk^T7k`Mk?8=ihuuI8$BUL* z-Wc1c={))Qi%Jrgq85Q8v3B5NibW|u+%d3eyxf9Cr_=^Ov>}?vH)i3%ol%`@=uHHV zu-&tO=3KzEqFf)I$US3jAkjc){h}KnBt(32c>Mz98e6w?BP#~l?jS!8y*$^Hcz8EK_Q#gZ59T@D3ZY$n-R^SZ>jrJ+-iWzF)1<~ zw&M59rarUpiL+8^DaR>B#icO0FvIu%p^x1zxqo=T*G2LBIPHe(`qT{o2N#0vF}--Q zsG4lIVa7B?uo@OcW#HTVXkuM$3IpuctfAPnM%0=$dS6pl5xCp(gPUYSV&+zom37NS zM$*Vfontic5iE#+EBTdwA{4p36T^FKd&GlVNN zYa+KCK_L;^mSYw2xtaqBRDbcJWc@?{+SPsVH5Hwl*%GvVgjBID2;g$2Nzanzf#hk8 zP|{`(=Ps(muI#)PyJ~i-VESn3M)p`*p$NLCd`4*EeZpPX&F&Z$9ewLzUotc3J;KVd zx*sc?>=7Evds}MRp6*V1gkB(TP_9r)4q1}A-*J)0E`RGx)beK7jZ>8N=;f|9up0#E zBh1FI=)Nc*XhwHonW-*GkgVM`dhKfHv!RGY7t!thR%S&Ytm-O~JJl(QTQ#EcsYKtq zQ||i=;C8-?xy=coOega6&yT9^K88!ZFj&!U@>@x3ihs`_+NE*6IPmV;AH>Vl+RE*v zJj!zS1rDU6)+O`A9wqNND)yn>*(j9PNC@13kx5W>ebS4t3velm+^}a+wIc38KL@nQ zqlU3gFTKtG%!GP}xZU#L$A!Pc4?%R7GeQ<6QFH4KQVhA22dp@&>IAPZ^Q9}tvpgt9+dbZ z`(2lE?x6!3^pgOYjwoKFSeXqQmDRALkc$>q{67*UzT-0GsuUiY<#N$hOa$tr z6^*R{1()#0?}K=AKiT1}Hl{PI6047#Dg|zQEVU(+PddHkFk2pP-hf+)xEwzzl!1xTDL4O(>(aY~3X&nY7uc4PJ z@~f|pMU2RHdMA4hJU2k7t)we#0YJz(MvB2HReJ3+mt1wKtRg|GGf~nyrMgbO(ihD$ zXiaQMu8jpXX~_W!P1AQe~rq%9Gj5C|Fa z&XwWtvToQLmbyNArsCH7GxlNY4QdLfI?=Y{w-AApg2QNIf$`F7cdsr2d*!ISwCeip zy2he^7;)v@a`^HK4hwEGE{7vd_pv8aJ8S4Q(U z)y8yS!<|3fuW$3e6)$om(5(DR`Zv-Zg4&P;|I2BrBX+#7Z*Ric7vARA@pUr8=g(EH zk6U-wz+cNywUs>Yzy75T__jYx`<;qkSXa;nKQ(eHH=C3*Whi%IdLkz)*S}l4*=V+2 z*DSQz${GRU?W8TSe97Ce?_?wpBP#=iIs^Ys9U00(` zkrR9It_l2@jwU)Vp$T)#R&dW6}g+WlwUnNbt)|0?N9q^|$1(0Q#v1wNo3l z?6^2Wz$zt#h;2xbR?D-Zb?PFeHZ6_|##aq4vkGYM`njxK+{2I4{Q+&czU1J?t<;Xa zp$*p#_#X@IKkHSkJd)yR7X?c1^-V3q`%9^`t~q+;?>!F}qCbG_6k7Uq;O^^=3G2RV zvGvaiEq-9uS`_Cqx?&k|#pb<1=|ptI~r5!s()#jwBx8wIj@bz3Z{R#ooQx@RO@ z?XZ4LA6Vp9!ZwzV;s7(J6y=R!v>Z+^hB7Z3LjNH%OU-vDF?<55hH%MV-~EAQR%KBs z;bK#odM{HEfb$FrQPo%yCTYuE%&`|zLJQbu7X*-fvQm&~HLAnI%)wQR?)RgwSYyJYyExh`f4>%J` zR-ywcCPBD3-xAcm^q?+9*(IK&0#vfT_cT$o-0lVr<~7ze;r%}O9!qb8_q2Go*NFbW z2)z}Kg|peEqe@b;ATRj61dJam5L1EZ)~WpBQIZL~6^exv3yC=W@v=zYJ?3!G=y(&b zDbSY{PM%Sg2jeC+7~J!`onz2Cpw=c3B>6f^k_|i$-7k3Rnrlum@Qvf?OG$5AIN0kg zN~kigBY>0ux-3&HSB_GztunaJsnwJ4fgkRQzcXOo27;hP7!;jmr=JZ?&!LmtB_WuH z#+;rtMRl9$w??7T9-wr*2#;6x?E`P%P6lI#B3-)?O)>k4q3nO@kvbdsGlf_KANF>5 zwXgbJAyk2&-BQ7o$UNtXunS*0)9Cnp*UX|cxpaFp-W3Hl4*7#un(z&opJt3wWD&Lv z0ZhOHEKj0fWX7t3Hpr$dE3zI2(=Uqqcne%}*`0(Az6Z(fj^6tJY46L!*<822+r4$` zNOeGst!`}=S}K$trRy-yQ}X?&U>WuxI) zdh+A&gg|w4X$bC`bO8t;`jj`_P2%lc6O^_(^snGf$nEwabh?_VT}cBjWFWF=z|F3s z;LcVf1`E{Ay=@%KQM{d(^t_o2hJU2PhF>CMm0q(3!Ll|Y!|9YyG( z1h~vQ=Kx~J*P^lDR@RN4ESH{FB3pyYV!1&l!LzF->SH$H<4lmAFPHb9c-92RzM1TKU zvOTon`!_>~OC!Kcit*d^!PsEoD3)hL$R-eiU6P#+TTA#gl4m&jrY+?(1Wfj@*2#bV z&(v^wL0n%uV8l35YjH?KK`Uw2)uR7Sen-uDmS;TRoQMaU6SZckK}YVn=E$a3boEPm z8duFg>vstmRxNY1-zt@FXrKte$hJ`TApIqTW=XAfhm|y3t0YxD_a%o1As990)_-B|Wg&eEUO}n7M6@RAFOxsb(uW zggCd0W_A-7fsD0BfKTvuum@qN;!I6v;X@pcI7njPakZ`op2}adF`FMx?Guo*Nq`br z&&tcjUN=K&ZPh|=HfQ~U7MVnYJ(tc5B=PucY{}a;(ANs8BFoD} z?BAt3++%Mn68Z>i{LcF?u(|&W$v%(Ujncl5)1U+}81G3p`AaV6KaZ5Be1Foxhx{X) z`2Vp&z%~)T8B2r^cJ^#bJ$c5z#Rt!?bn-jBCUfkp>CrQ~p|8yq?IVtsN_={mXpYlc z)Sd%bROsrj>J=Kh^-Acj28>P9N79&EW48$G7G*u=GUpX@Xxb-}3Gc$kwFXg_&s=-D zXYVgu`;VUfPhYMb-@hOIu;O#5<4M_I7jL!cyo`1D^bAXGh?V`ow-JW#Ie=_)gUHp$5UJZHr2&@w=1N8LK zh5zSM{&%a8b4QQL#Eh&FX%Kt?h|E<3MK2!caQ~rNG=nHNit7bKF_tFl@ z-L=k5y>w*6HLs#?BHF0O%O8L<*Axz>p}t7Y43{eBHY3-YDp*fLTuET3_ZnfF!BqXe z@!t#!g^24_#GF@H-5fJpxa=we?`VNa_fzLsr2Q{2?a>l|&dzl)q_qI*Ch7AT-}l98 zAOm4^Mu3n9lTrn>@Gfl@@+kMNZ@5D*N*#kuGlHA%jMnCK=cTD39nN=xw%QeD+I_k@ zid9_VKs{DIokK6oc9{6SYOl$j=}c5cZi@e~hK5S18Eka0bfy!|H0X8O6xZ^lee#D! zG0vxZ>B7cyl6rddFQrs6d-J@D**QtJhS-*ux9`)F(d;iqJtRx_`!)V(;g!YnnQu|3 zH88;~;*`?`=!cbH^WyTEb2z1WkY`oJvOl>Wov&t+xEbucQNK8q8nkEOnSkvb@!)m4 ze0}lCo$VR8Lf44f=m5gbt$%&+)!E(}0owrzuud4Y4uf z{C+?e)O%+X%`DKb||^oadv+#0Ptr(fAz3%|BOKO(2<_UV9Y%tKSx z>W;6AzoY^|DjSm~MpS8%#S@(G@WNy(bna6P@H2=J^nEY;WO3d4>y;)Q{+UntJ1m=`48g=#aE6KR@M&RdW9Ofc>jIwC zd{B5;(-na3!WwD3svIue;gSm&SXF+j>YRxPB@<(Xb4_E6R2UV$B=$7*G3CpRY!)TB z?e}NNc@VV$r4;3 zbkhaf@z6&@X3yz;KQj^<26T7lmUB!d-_UM*Wm+rGhWsQ|`Bq7RnqNu+dOzAA%6O9{ zwL5%9m2~Wd!}%v<$jFALD`Y(jSc0YJHhX!D=067Ms^`{gEX(%ZR>C$AHP=tembc8Z z^^1F)D^EeXQ;LB_QovdN)b4oqVb^MsK5I^@ybQ%J`@`6Y#5`pROd7GBx$}0Yt`ozb z4Bfsxd*%l=PV-Ke2Fq$=6H+{dcj-{>(s0dU3*4e?uT_z4-gy|n!yHj?YT`;}J;J*8 zd?pej7EH^!x>LUlD4!K9r@afma050~j55%d!}Z;a?ATxtchajiSCz*;M|yF}>?*gn z*wZtK#2pZ^We&`1x2w^baT)N%X9XZB+4}Flupt>v7}r@FyH)`$&O+156d9_l(amzo zQ0=%n`SM6r^H;&&=C@GW3Q%apX4ssS5opU7w$-70B~!JBmq7IN=iEK6p{W!eP_32P zuOc#mL!ug=8N)*znfM(fY~suLUSRj4(H6mreSRdcuub`#2BV@kH)slzKaRX#PTM;x zOj*~(1kBeg6ORONgbHMA^t=1E>zHVGaXshY%(v@dQT=R+ZgCazLi<`@^&DtG#OEy( zLARV4n$9%pa%M7;Z37$knFMD{)*eqihih4#e$fS#)^=vanc3=##|S44_+;(lzomd= z)veZ5f@23Z=6p~Fa?Y6@z>`3;>W^#J8Qdw68H<*~bG*goHclU^^quLE>;MgNgNDA-mR8_Zz zPsXs9WX*PRD+$Rdc*uYh>9{%IMt~BR4Wmkou~PHP@k^t9-KKyD%`qp>KC{Bw*FPRCF zWi~zbNaM(lFPWQKJ5;$DacF%8|K@nyl8_M%E)`+9^CRA9>D);QWR)RJp+r%9S2xYi z{ZtG2MgT(Me8H$ik*lo*t0VZMI^O7xnRUSEdSXt^lQQo5O-89Rrs(=D88OogL?e4< zZn>-LSN)u(rAQh#XVy##CeAK#`23gj&MvY{>9 zVwZ#!&dK6`7~>F8DS-_^3*WM4iZ+?jrc{*kRwme(GG>`;?N1wUL&$v6{!ArVNZS&b z^L5j_Dh?`NmnzzgkeFDtm2aF7=OBdMG_-z|Q~`hkMU9T@aAtfZW3+C((j3eqnhqbH zaiwVU+~$*zF$!Y|Cv2?D_FvXG!HeV;SCkn=vPP-eOSMJmtC!1-{0YfLzyYI?HsF@$ zKE9~6C10+2g;zSEsyU1*IPBi>&`h@2a4}%$I5QETn^@=SW_V+{199mQ2z91?kwj6`_X=AU-ja%=1O8R5%zV{A>1v+E|&*f zk}GM=ZVM%LGhgXNPdq=ZKU{?F6V2bV=aAX$o7W#SToJP}bis@~0;fS23tFRTheLXtJ%TO5#}l3L%--#U zO!T8>C3U8i2qy9fR-j-adC=3C-^rX6-C$Gdu)rt!ms8gLxF*w9zkynN9b9m%UD*gO++s*Xm4$NvA$GQsG`Rw1M!WMT}!b*k%eW* z&Q+s5hGY+A9gHPVed}>N;3fv(##v_EdIqf<;3b)Mxgn_M6f$B1Qg*`yxs6U^`S?UG zau>F-*xqOJfKoT1k997ncJ4GriuZl|X_C$tbU~#^dVW|LFH|V9Pbrf zX0jLYrP$<$%YJWLL|u1)z##-!cw$S0N#B@BDDQMXeo=Z&3e|P>Ai96YCYnXH@@WSj z3U3aYP`BR!vD{YSvM?|?FtrduT%Ki8`Mjh3oBJ*VqM-}CKZn%ufK8%ypcbD5%$X0q zD!y|I;y%~|H{{Zb5DC1dba(vNOzP0l@Ez7%`ONpZ>mGa~wOhkHr^OZcb75_{F|V#sDY3cM6TG2JB6}*B(5)3OEE7Ezeo4?zcdW^nVr>D#4nkR= zC9x1g&E1YKL_`y&u|-keDOaVVywqN_?lv zSqlG7A9tHXLgif&798$6G2)ySXs^lTG`DF_nj91ZGk>=e>pdGVmPpu4XZ~1j)*=!( zWxhWaW%2KBre{~mTYE7SgWkwbVUut)M><_ohu2-)@l1*RZ2W4&F^@L6a(6XPW@Xj~ z_H;@We?_#z*TypQORUc)@Usk`Tl&>y|JdS6q1U_X^ttw6m7BJB)eHDlR5?$7?M0_n zuAC6q^ncqTA3XmRR6AX)(CPQJv^B@0jiX_p&`~iHQoyRj8VcU08x-76cErluy;qM~ zqdek`rc*Mc3y#C{LqVynHvlS_!3|-z%%2r z7RKN^_+d$AEsNkg@ve87x-^Zg)OO7UBxY&4uvLy^ShqqxBU`q>>ODVn8Hoyj4x^V*6zKerfyX7}D%$rpN<9z?bVcf}2DT_F_Pe?XybUUu)7gWZX~ zH~2zNG~EoKI99JLvO>POsbT-4lf8Zpt)!2qBInAXsaegx%~wI6tbeM5R(pju(GtbC zV}!hJSU4m;jMBf#vE<^360@BMnRzW;^am5J$B#^f7uA$;eDn0zR2A+v3Ev0U?e3s-3c>MF*C+3epj6_bPO5wZRpI*76Z3d4cT6E2FtGw)>F5xF43^$!!I`0Gq)2~g>c%)TET3eXO2m-nQHy4yZ%(R zz>g=Ea_Y_+pJFo%i}19GtJJpgWp%E+=e=`gx@{gI>8&~YQ@qhsCWCfe8s;X0iu}QyxII&_85|xyDR#^R zdz7^H>u-G#m;zp&L=3rTXk8P8SfLHei#uKKwHKuCmzQIeXZBZ~RQPp+Wu(xdVnPtq zJ||#Tt%F(!Q`$S}y#R_3jrnGLGH6me*qv@_9cLj6NG^uxMn$t(=CMEP}< zI1mL%fS-$|+>!s}7W9sxo7p{Kjymw4-=hLAE7B!To0GsjjC!CF#3A#VfJ~Yl#AWS! zvB*W&^N{?}Hf>F7C8xU`7gh?mv<>yYTmU!9B`_4 zOWCopOb*ul;*8+H*jsAj)cr7CgH(^f%GLyl2lrMI;xm8W%oCB3X1#gn9{1F;%C;a; z>xUI0CvjPt0LyV`T}!Rl#1YbX3Z3PI%vbBR+R4A1pe9BH>=r zP`{j0S~ZGcny%EFqS_P83A8Bbo@F`0gk=6C&6LfZ^Qqu)kqJUJ32BECH`x9|vYFOvI7YLFt4re|9 zX0f&7gwU6WQy5MeD+Vv+m+nW(KES3dA&@}Wv4!<%%jaW@rn6(mo{QE~-e~N3Ks16U zP1b1=mdya$#Fz9rei*)#1vT`m*i(SF$wc!R_4jfN1x_5ZI zcGtK=B1mAW0Xvv;i7aubL;%E`A1+1-DdtLkQ<03Ef8t{&{SyEVY)-~e7t*7lonMPT WUL;zbF`(@MKDTuYZx-En6#8FZ&UK*x literal 0 HcmV?d00001 diff --git a/docs/en/docs/side_quests/co_scientist/img/launchpad-rnaseq-nf.png b/docs/en/docs/side_quests/co_scientist/img/launchpad-rnaseq-nf.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e7ab95d8a3c79ad4ebc9ef353547c317bd5456 GIT binary patch literal 152972 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%0D1%4L5h_HlQgB>e}82#FbPaPF%>Y^>!c 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 WBARq2+rNQ-FGOWU3ZLt}`~LvKK?H#S literal 0 HcmV?d00001 diff --git a/docs/en/docs/side_quests/co_scientist/index.md b/docs/en/docs/side_quests/co_scientist/index.md new file mode 100644 index 0000000000..f9da131db2 --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/index.md @@ -0,0 +1,45 @@ +--- +title: Building with Seqera AI +hide: + - toc +--- + +# Building with Seqera AI + +CoScientist is Seqera's AI assistant for bioinformatics, integrated directly into the Seqera Platform. +It can take on the repetitive parts of pipeline work, from finding modules and wiring processes to launching runs, debugging failures, and writing tests, so you spend less time on plumbing and more on the science. +This side quest drives it hands-on against the [`nextflow-io/rnaseq-nf`](https://github.com/nextflow-io/rnaseq-nf) demo pipeline, taking you from a first conversation through development, debugging, a pull request, a test, and your own reusable agent skill. + +## Audience & prerequisites + +This side quest is designed for learners who have completed the [Hello Nextflow](../../hello_nextflow/index.md) course and are comfortable working on the command line with basic Nextflow concepts. + +**Prerequisites** + +- Completed [Hello Nextflow](../../hello_nextflow/index.md) or equivalent. +- Comfortable with the CLI and familiar with basic Nextflow concepts. + +**Provided sandbox:** a training Platform workspace with CoScientist enabled, a working compute environment, and a GitHub account to fork into. + +## Learning objectives + +By the end of this side quest, you will be able to: + +- Converse with CoScientist in the web chat UI to explore and plan pipeline work. +- Understand how CoScientist takes real actions on the Seqera Platform and GitHub on your behalf. +- Register a pipeline on the Launchpad and inspect compute and data assets. +- Work effectively with the agent: prompt for intent, verify what it did, and redirect it when it goes wrong. +- Fix a failed run from the user side, through launch parameters, without changing code. +- Fork `rnaseq-nf`, add a process by reusing an nf-core module, and open a pull request, all from the web chat. +- Move to the `seqera ai` CLI to write an nf-test and run it to green. +- Add a GitHub Actions workflow that runs the tests on every change. +- Package the nf-test workflow into a reusable CoScientist skill and invoke it as a slash command. + +## The example pipeline + +[`nextflow-io/rnaseq-nf`](https://github.com/nextflow-io/rnaseq-nf) is a minimal RNA-seq pipeline that runs `INDEX` and `FASTQC` in parallel, followed by `QUANT` (Salmon) and `MULTIQC`. +It ships test data in `data/ggal/` and has no nf-test suite yet. That makes it a good target for adding one. + +**Time estimate:** ~3 hours + +[Get started :material-arrow-right:](01_meet_coscientist.md){ .md-button .md-button--primary } diff --git a/docs/en/docs/side_quests/co_scientist/next_steps.md b/docs/en/docs/side_quests/co_scientist/next_steps.md new file mode 100644 index 0000000000..a8482646f3 --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/next_steps.md @@ -0,0 +1,66 @@ +# Next Steps + +Congratulations on completing the **Building with Seqera AI** training course. + +As you put CoScientist to work on your own pipelines, keep doing what you practised here: let the agent move fast, and stay the reviewer who checks its output before relying on it. + +--- + +## 1. What else CoScientist can do. + +This side quest followed one end-to-end flow, but CoScientist does considerably more. + +- **Build, plan, and goal modes**: make changes directly, plan read-only before acting, or let goal mode keep working until an objective is met. +- **Built-in slash commands**: ready-made workflows in the CLI such as `/debug-last-run-on-seqera`, `/nextflow-config`, and `/nextflow-schema`. +- **Session resumption**: continue your most recent session from the CLI with `seqera ai -c`. +- **Command approval**: choose how much the agent runs automatically (`basic`, `default`, or `full`) so you stay in control of what executes. +- **Code intelligence**: language-server support for Nextflow, Python, and R that flags errors as code is written. +- **Script conversion**: convert R and Python scripts and Jupyter notebooks toward Nextflow. +- **Wave containers**: build containers from `conda` or `pip` packages without writing a Dockerfile. +- **nf-core modules**: discover and reuse from over 1,000 standardized nf-core modules. + +See the [CoScientist documentation](https://docs.seqera.io/platform-cloud/co-scientist/) for the full feature set. + +!!! info "Cloud and Enterprise" + + This training runs on Seqera Cloud, which uses Seqera's hosted model and meters usage through credits. + On Seqera Enterprise (currently AWS only), CoScientist can run Claude inference inside your own AWS account through Amazon Bedrock, so prompts and data stay within that account. + +--- + +## 2. Keep building with CoScientist. + +Here are three ways to continue developing with CoScientist. + +### 2.1. Apply CoScientist to your own pipelines. + +Try CoScientist against one of your own Nextflow pipelines or a real nf-core pipeline. +Working on a codebase you know well is the fastest way to see where CoScientist adds value and where you need to steer it. + +### 2.2. Use the CLI in your development environment. + +The `seqera ai` CLI brings the same agent into your local terminal. +Install it and run it alongside your usual development tools so CoScientist can read and edit files directly in your working directory. + +### 2.3. Read the documentation. + +The [CoScientist documentation](https://docs.seqera.io/platform-cloud/co-scientist/) covers capabilities, configuration, and usage patterns in detail. +Refer to it when you want to understand what the agent can and cannot do, or when you need to configure it for a specific environment. + +--- + +## 3. Get help from the community. + +- [Nextflow Slack](https://www.nextflow.io/slack-invite.html): Ask questions and share your work +- [Community forum](https://community.seqera.io/): Discuss ideas and get advice + +--- + +## 4. Continue your Nextflow training. + +If you haven't already, check out our other training courses: + +- **[Hello Nextflow](../../hello_nextflow/index.md)**: Foundational Nextflow concepts +- **[Testing with nf-test](../nf_test/index.md)**: Writing and running tests for workflows +- **[Troubleshooting Workflows](../debugging/index.md)**: Identifying and fixing common workflow errors +- **[Side Quests](../index.md)**: Deep dives into specific topics diff --git a/docs/en/docs/side_quests/co_scientist/solutions/pipeline.nf.test b/docs/en/docs/side_quests/co_scientist/solutions/pipeline.nf.test new file mode 100644 index 0000000000..5485def23d --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/solutions/pipeline.nf.test @@ -0,0 +1,27 @@ +// Illustrative pipeline-level nf-test for rnaseq-nf. +// +// This is a reference example for the side quest, not a validated test. +// It runs the whole pipeline on the bundled ggal_gut test data and checks the +// published outputs. Run `nf-test test` against your fork and adjust the output +// paths and snapshot to match what nf-test actually produces before relying on it. + +nextflow_pipeline { + + name "Test rnaseq-nf end to end" + script "main.nf" + + test("Default ggal_gut run") { + + then { + // The whole pipeline completes. + assert workflow.success + + // Stable: snapshot the Salmon quantification table. + // Do NOT snapshot multiqc_report.html, the FastQC zips, or the Salmon + // logs and cmd_info.json; those embed timestamps, versions, and paths. + assert snapshot( + path("${launchDir}/results/quant/ggal_gut/quant.sf") + ).match() + } + } +} diff --git a/docs/en/docs/side_quests/co_scientist/solutions/write-nf-test/SKILL.md b/docs/en/docs/side_quests/co_scientist/solutions/write-nf-test/SKILL.md new file mode 100644 index 0000000000..d737925081 --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/solutions/write-nf-test/SKILL.md @@ -0,0 +1,29 @@ +--- +name: write-nf-test +description: Generate an nf-test that asserts on stable output and excludes unstable content. +--- + +# Write nf-test + +When asked to write an nf-test for a process or a pipeline, follow the rules below. + +## Steps + +1. Scaffold the test under `tests/`. + For a process use a `nextflow_process` block; for a pipeline use a `nextflow_pipeline` block. + Provide representative inputs or test data so the test runs end to end. + +2. Assert on deterministic output only: + + - Numeric or tabular result files, such as a Salmon `quant.sf` table + - The existence of the expected output files and directories + +3. Do NOT snapshot unstable content: + + - Reports that embed timestamps or versions, such as MultiQC HTML + - Log files, and files that record the command line or tool version (for example Salmon `cmd_info.json` and `meta_info.json`) + - Any path or value containing the work-directory hash + - Version strings + +4. Run `nf-test test` on the generated file. + When it fails, narrow the assertion rather than snapshotting unstable content, and re-run until it passes. diff --git a/docs/en/docs/side_quests/co_scientist/survey.md b/docs/en/docs/side_quests/co_scientist/survey.md new file mode 100644 index 0000000000..cb8ba7731f --- /dev/null +++ b/docs/en/docs/side_quests/co_scientist/survey.md @@ -0,0 +1,7 @@ +# Feedback survey + +Before you move on, please complete this short 5-question survey to rate the training, share any feedback you may have about your experience, and let us know what else we could do to help you in your Nextflow journey. + +This should take you only a minute or two to complete. Thank you for helping us improve our training materials for everyone! + + diff --git a/docs/en/docs/side_quests/index.md b/docs/en/docs/side_quests/index.md index 37d109dc8e..573536998a 100644 --- a/docs/en/docs/side_quests/index.md +++ b/docs/en/docs/side_quests/index.md @@ -16,6 +16,7 @@ additional_information: - Work efficiently with files using Nextflow file operations - Debug common workflow issues systematically - Use and build Nextflow plugins + - Use Seqera AI (CoScientist) to develop, debug, and test pipelines on the Platform audience_prerequisites: - "**Audience:** This collection is designed for learners who have completed the Hello Nextflow beginner course and want to go deeper into specific topics." - "**Skills:** Experience with the command line and familiarity with basic Nextflow concepts and tooling is assumed." @@ -47,6 +48,7 @@ If this is your first time exploring the Side Quests, start with the [Orientatio | [Troubleshooting Workflows](./debugging/index.md) | Identifying and fixing common workflow errors | 1 hour | | [Workflows of Workflows](./workflows_of_workflows/index.md) | Composing complex pipelines from reusable named workflow modules | 30 mins | | [Plugin Development](./plugin_development/index.md) | Using and building Nextflow plugins | 3 hours | +| [Building with Seqera AI](./co_scientist/index.md) | Use Seqera AI (CoScientist) to develop, run, debug, and test pipelines | 3 hours | [Get started :material-arrow-right:](orientation.md){ .md-button .md-button--primary } diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index 41ab59ce40..bbda02fb68 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -72,6 +72,15 @@ nav: - side_quests/nf_test/index.md - side_quests/debugging/index.md - side_quests/workflows_of_workflows/index.md + - Building with Seqera AI: + - side_quests/co_scientist/index.md + - side_quests/co_scientist/01_meet_coscientist.md + - side_quests/co_scientist/02_working_with_the_agent.md + - side_quests/co_scientist/03_develop_with_coscientist.md + - side_quests/co_scientist/04_move_to_the_cli.md + - side_quests/co_scientist/05_build_a_skill.md + - side_quests/co_scientist/survey.md + - side_quests/co_scientist/next_steps.md - Plugin Development: - side_quests/plugin_development/index.md - side_quests/plugin_development/01_plugin_basics.md From 0eca3c4f40a34001683ba6685a9d10d31d970092 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 22 Jun 2026 19:49:20 +0100 Subject: [PATCH 28/29] excalidraw fixup --- .../platform_automation/img/one-api.excalidraw.svg | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg b/docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg index 1d9c24661b..7a3f55c89c 100644 --- a/docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg +++ b/docs/en/docs/side_quests/platform_automation/img/one-api.excalidraw.svg @@ -27,8 +27,8 @@ - - + + Terraform @@ -60,14 +60,16 @@ - + + + GitHub - + Cloud AWS From f6c073703ae54c8e3e369e42f1911d0cc42ce7c7 Mon Sep 17 00:00:00 2001 From: adamrtalbot <12817534+adamrtalbot@users.noreply.github.com> Date: Mon, 22 Jun 2026 19:52:03 +0100 Subject: [PATCH 29/29] docs: Add guidance on how to switch to the right Seqera AI organization --- .../co_scientist/04_move_to_the_cli.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md b/docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md index f91ff3ff9a..72969c31fd 100644 --- a/docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md +++ b/docs/en/docs/side_quests/co_scientist/04_move_to_the_cli.md @@ -46,15 +46,26 @@ Create one at [cloud.seqera.io/tokens](https://cloud.seqera.io/tokens) and expor export TOWER_ACCESS_TOKEN= ``` -Then start an interactive session in the cloned directory: +The Seqera AI credits are charged on a **per-organization** basis, so you must select the right organization before using the ```bash -seqera ai +seqera org switch +``` + +The interactive prompt will tell you which org to select + +```console +Available organizations: + + 1. community (pro) + 2. Your-Org + +Enter selection (1-2), or 'q' to cancel: ``` !!! note "Checkpoint" - `seqera ai` is running in your local clone. + `seqera ai` is running in your local clone, configured to use your Seqera Platform workspace AI credits. ## 4. Ask for an nf-test and run it to green.