Commit c61e38b
feat: native container steps for workflows and custom commands (#2626)
* feat: native container steps for workflows and custom commands
Add a native `type: container` step (build/push/run) to the shared step
library used by workflows and custom commands, plus a formal step-outputs
contract so one step can build an image and later steps push/run the exact
produced artifact. Built on the existing pkg/container Docker/Podman runtime
(ephemeral one-shot runner, image build/tag/push/inspect helpers) with
per-step identity for registry auth and Docker Buildx Bake support.
Includes the examples/container-step example, a hermetic GitHub Actions job
that exercises build -> push -> run against a registry:2 service on
localhost:5000 (plus failure-propagation), workflow step-type docs, a
changelog blog post, and a roadmap update marking container steps and step
outputs shipped.
Also lands the design PRDs for the follow-on primitives (container
components, compose components, and membership-based compositions) and trims
the container-step PRD to cover only the procedural step. The earlier
targets-based composition scaffolding is removed in favor of those PRDs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: fix dead core-concepts links in compositions PRD
lychee resolves /core-concepts/* as repo-relative file paths, which do not
exist; use plain text in the PRD intro instead of website-route links.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(container): parse container ID from last line of docker create output
DockerRuntime.Create() returned the full CombinedOutput of `docker create`
as the container ID. When the image was missing locally, `docker create`
pulled it inline and the pull progress was captured alongside the ID, so the
multi-line blob was passed to `docker start`, producing
"Error response from daemon: page not found" (the container-step example job).
Extract the container ID as the last non-empty line of output via a shared
extractContainerID() helper, used by both the Docker and Podman runtimes
(de-duplicating Podman's inline loop). Add an empty-ID guard and a regression
test covering the exact inline-pull output from CI.
Also bundles related container refinements already in the worktree: runtime
resolution/recovery ordering in detector.go, error wrapping and
cancellation-safe cleanup in ephemeral.go, and PRD doc link fixes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(container): inject runtime env into container CLI subprocesses
Adds an EnvSetter seam so container runtimes (Docker/Podman) run their CLI
subprocesses with a materialized environment (e.g. DOCKER_CONFIG for ECR
login) instead of always inheriting os.Environ(). Wires the env through the
runner container steps (build/push/run) and updates the container-step
example, step-type docs, and the native-container-steps blog post.
Includes new env_test.go and container_env_test.go coverage.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: run linux acceptance tests on the `large` runner to avoid OOM
The linux Acceptance Tests job runs `make testacc-cover` with
`-coverpkg=./...` across the whole repo, which is memory-heavy. It ran on the
`terraform` runner whose RunsOn config has an 8 GiB RAM floor (`ram: [8, 64]`),
so spot instances as small as 8 GiB were provisioned. The coverage build was
killed (exit 137, "runner received a shutdown signal") at the coverage step on
consecutive runs — every test package passed; only the coverage collection OOMed.
Switch the linux matrix entry to `runner=large` (`ram: [16, 128]`, `disk: large`),
the same runner the `release` job already uses. macos/windows run plain
`testacc` (no coverage instrumentation) and are unaffected.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(container): combine create+pull errors with errors.Join
createEphemeralContainer used a single fmt.Errorf with two %w verbs to wrap the
create and pull errors. Per the project error-handling guidelines, combine
multiple error causes with errors.Join: wrap each cause with its context label
and join them under the outer message. Preserves both error chains for errors.Is.
Addresses CodeRabbit review on PR #2626.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Revert "ci: run linux acceptance tests on the `large` runner to avoid OOM"
This reverts commit b13f9e9.
* fix(commands): stop routing shell/atmos custom-command steps through step handlers
Custom-command step dispatch had a broad pre-check that sent every *registered*
step type (except `exec`) — including `shell` and `atmos` — through the new
pkg/runner/step handlers, making the legacy switch cases dead code. That
regressed two ways:
- Windows: the shell handler hardcodes `exec.Command("sh", "-c", ...)`, so
shell-based custom commands (greet/echo/deploy/show) failed with
`exit status 126`, breaking their golden snapshots.
- Linux: the handler path spawned `atmos` grandchildren without process-group
cleanup, leaking orphaned `atmos` processes (32 in one acceptance run vs 0 on
main). Accumulated coverage-instrumented `atmos` processes exhausted memory and
the on-demand runner was torn down (exit 137 / "runner received a shutdown
signal") — which looked like an OOM/spot flake but was a process leak.
Gate on stepPkg.IsExtendedStepType instead (matching internal/exec/workflow_utils.go
and pkg/workflow/executor.go): shell/atmos/exec keep the legacy, cross-platform,
child-reaping paths; only genuinely-extended types (container, input, …) route
through the registered handlers via the default case, which now also carries the
resolved step env. Removes the now-dead runRegisteredStepHandler helper.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Add container workflow sandbox
* fix(workflow): normalize rel path in container workspace-escape guard
filepath.Rel returns OS-native separators, so the "../" prefix check in
mapHostWorkDirToContainer missed escapes on Windows (..\tmp\outside),
letting out-of-workspace working_directory values through. Normalize with
filepath.ToSlash before the guard so it is separator-agnostic.
Fixes the failing Windows acceptance test
TestWorkflowSandboxExecShellRejectsWorkingDirectoryOutsideWorkspace.
Also resolve pre-existing golangci-lint findings in the container-sandbox
code surfaced by the --new-from-rev gate:
- schema: wrap the dynamic container-decode error with a static sentinel
(ErrInvalidWorkflowContainer) for err113.
- container: pass SandboxConfig by pointer (hugeParam), name the
sandbox-name length constant, add perf.Track to Sandbox.ID/Name.
- workflow: introduce SandboxParams to keep StartWorkflowSandbox,
RunStepContainerOverride and ExecShell within the argument limit;
split mergeWorkflowContainer and extract Execute/runCommand helpers to
satisfy cyclomatic/function-length; use homedir.Dir over os.UserHomeDir;
name the "." constant; convert the shell-dispatch if-else to a switch.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(workflow): rename container sandbox file and symbols to container/session
The workflow-level container feature is driven by the `container:` block on
workflows/steps; "sandbox" leaked in from the lower pkg/container runtime
primitive and read as an implementation detail at this layer. Rename the file
and the workflow-package symbols to match the feature name.
- pkg/workflow/container_sandbox.go -> container.go (+ _test.go)
- WorkflowSandbox -> ContainerSession
- SandboxParams -> ContainerStepParams
- StartWorkflowSandbox -> StartWorkflowContainer
- internal helpers/fields: sandboxContainer -> containerBackend,
buildSandboxConfig -> buildContainerConfig, ensureWorkflowSandbox /
cleanupWorkflowSandbox -> ...Container, ContainerSession.sandbox ->
.backend, Executor.sandbox -> .containerSession.
The shared pkg/container layer (container.Sandbox, StartSandbox,
NewWorkflowSandboxConfig, SandboxConfig, SandboxLabel*, SandboxTypeWorkflow)
is left unchanged - it is the correct runtime primitive there. No behavior
change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(container): make workflow sandbox teardown immediate
The long-lived workflow sandbox (and step-override ephemeral containers) run
`/bin/sh -c "sleep infinity"` as PID 1. The kernel applies no default signal
disposition to PID 1, so SIGTERM is ignored — `docker stop`/`podman rm -f`
then block for the full 10s stop grace period before sending SIGKILL, adding
~10s to every workflow that uses a container.
Set `--stop-signal=SIGKILL` at create time for these keep-alive containers
(scoped to OverrideCommand). SIGKILL cannot be caught or ignored, even by
PID 1, so stop/rm -f are immediate on both docker and podman. Also drop the
now-redundant graceful Stop from Sandbox.Cleanup, aligning it with the
ephemeral path which already only force-removes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(container): scope credential mounts, add build spinner, clarify create errors
Three fixes to the `type: container` step path, surfaced by running
`atmos container build-run` against examples/container-step:
1. credentialFileMounts bind-mounted every absolute-path value in the step env.
Because the custom-command path hands the step the entire host environment,
it mounted SHELL=/bin/zsh (absent in the runtime VM) and SSH_AUTH_SOCK (a
unix socket podman cannot statfs), so `podman create` failed with
"statfs … operation not supported". Restrict to an allowlist of credential
env keys and only mount existing regular files (skip dirs/sockets/devices).
2. The container build was silent (runtime.Build swallows output on success).
Wrap it in spinner.ExecWithSpinner like the devcontainer build path, so the
build shows a spinner and a ✓ "Built image <tag>" line (degrades off-TTY).
3. createEphemeralContainer pulled-and-retried on ANY create failure, masking
the real cause behind a misleading "pull localhost/<image>" error. Only
retry when the create error actually indicates a missing image.
Adds the missing unit coverage that let #1 through: credentialFileMounts was
untested, and the build-config test fed a curated 2-var env instead of a
realistic full host environment.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(container): add `inspect` step action and rename example command
Add a `type: container, action: inspect` step that renders curated image
metadata (ID, digest, tags, created, size, platform, layers, notable OCI
labels) as a themed table — not a raw JSON dump. Enrich the runtime ImageInfo
and inspect parser with size/created/architecture/os/labels/layers, available
from the existing `image inspect --format {{json .}}` output.
Also polish the example for newcomers:
- Rename the `container` custom command to `example` so it's clear these are
user-defined custom commands, not a built-in `atmos container` subcommand.
- The `example build-run` flow now builds, inspects (shows metadata), then runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(config): preserve case of nested step-level env keys
Viper lowercases all YAML map keys, so a custom-command step's `env:` block
(e.g. `EXAMPLE_MESSAGE`) reached the step as `example_message` — a container
step's `echo "$EXAMPLE_MESSAGE"` then found nothing. The existing case-sensitive
env support (pkg/config/casemap) only collected the top-level `env:` keys.
Collect env-var key casing recursively from every `env:` mapping at any depth
(top-level, custom-command, and step-level) into the shared "env" case map, and
apply it to a custom-command step's declared env before merging it over the
command/process env. Command-level `env:` written as a {key,value} list is
already case-preserved by Viper and is intentionally left untouched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(container): address PR review feedback
CodeRabbit review on #2626:
- sandbox: gate the create→pull-retry on image-missing errors only
(createSandboxContainer), matching the ephemeral path, so a non-image
create failure (e.g. a bad mount) surfaces as-is instead of being masked
by a misleading pull error. Join create+pull errors when both fail.
- workflow/container: add perf.Track to the public StartWorkflowContainer,
ContainerSession.ExecShell, and RunStepContainerOverride entry points;
guard params.WorkflowDef/params.Step before dereferencing them; extract
resolveStepHostWorkspace to keep RunStepContainerOverride under the
cyclomatic limit.
- schema: wrap the WorkflowContainer mapping-decode error with
ErrInvalidWorkflowContainer so errors.Is works across all input forms.
- tests: correct the mismatched doc comment on TestIsImageMissingError and
restore it on TestRunEphemeralContainer_PullMissingNonImageErrorDoesNotPull;
add createSandboxContainer pull-gating coverage.
- docs: document container.shell, container.user, and container.run_args in
the workflows parameter reference.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test(container): raise patch coverage on the container-step paths
Codecov flagged the PR patch coverage at 59% (below the 80% gate), driven by
under-tested new code. Add focused unit tests for the testable logic (no
container runtime required):
- pkg/workflow/container.go (25.7% -> ~93%): config build + validation, the
scalar/collection/toggle merge, host-workdir mapping incl. the
workspace-escape guard, mount/port/env conversion, env-slice merge, home
expansion, runtime/pull/cleanup validators, dry-run StartWorkflowContainer
and RunStepContainerOverride, ExecShell nil guards + dry-run, and the
executor's cleanup/ensure/runShellStep container helpers.
- pkg/container/sandbox.go (57% -> ~84%): NewWorkflowSandboxConfig,
normalizeSandboxConfig, buildSandboxCreateConfig, matchesSandboxLabels,
isContainerRunning, sanitizeSandboxName, Sandbox ID/Name/Exec.
- pkg/runner/step/output_mode.go (17% -> ~92%): the new ExecuteWithIO family
across every mode + error propagation.
- pkg/runner/step container handlers: buildSpinnerMessage, validateBuildAction,
resolveBuildBake, validateInspectAction, executeInspect dry-run, and the
effective-step/resolve helpers.
Tests only; no production code changes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test(container): cover dry-run actions and executor container branches
Second coverage pass on the container-step paths, targeting the remaining
unit-testable lines Codecov flagged:
- step handlers: the dry-run branches of executeRun/executeBuild/executePush
(which build their config and render a preview without a runtime), plus
validatePushAction, effectivePushStep, metadataString, containerStepName,
expandHostPath, resolveRunCommand, and writeOutput.
- pkg/workflow/executor.go (51% -> ~90%): the runShellStep step-override and
workflow-container branches (both via dry-run / a cached dry-run session) and
envSliceToMap.
- pkg/container: buildImageInspectArgs.
The still-uncovered lines are integration-only: the docker/podman runtime
methods that shell out to the real CLI (no injection seam), and the
custom-command / workflow execution loops. Those are exercised by the
container-step acceptance job, not unit tests. Tests only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test(container): end inline test comments with periods (godot)
CodeRabbit flagged inline trailing comments missing a terminal period per the
repo's godot guideline (godot's default `declarations` scope doesn't catch
inline comments, so local lint stayed green). Add the missing periods across the
container-step test files. Comments only — no code changes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(container): top-level container.runtime namespace + auto-start flag
Introduce the top-level `container:` config namespace (forward-compatible with the
upcoming container component kind / `atmos container` command) and standardize the
docker/podman selector on Atmos's pluggable-system vocabulary, `provider`:
```yaml
container:
runtime:
provider: podman # docker | podman (default: auto-detect)
auto_start: true # auto-init/start the Podman machine when none is running
```
- schema: add `ContainerConfig`/`ContainerRuntimeConfig` and the top-level
`Container` field; rename the per-step docker/podman selector `runtime:` →
`provider:` across ContainerBuild/Push/Run/InspectStep, WorkflowContainer, and
WorkflowStep/Task (the buildx `engine:` field is unrelated and unchanged).
- config: bridge `container.runtime.auto_start` → the
ATMOS_CONTAINER_RUNTIME_AUTO_START env var via PromoteAtmosEnv (env wins over
config), so the global default reaches the runtime detector which has no
atmosConfig.
- container: DetectRuntimeWithPreferenceAndRecovery now ORs in the env flag, so a
stopped Podman machine is auto-started for every action and the workflow sandbox
without per-step config. Fixes `atmos example build-run` failing with
"neither docker nor podman is available" when the machine is stopped.
- example: enable `container.runtime.auto_start` so the demo works out of the box.
- docs/schema: document the namespace + env override; add the JSON config schema
entry; rename the `runtime` step param to `provider`.
Adds schema-decode, config-bridge (incl. env-precedence), and detector
auto-start (executor-mocked) tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(container): render inspect metadata as a borderless key/value list
The inspect output used a Markdown table; glamour padded the "Property" column
to a fixed, absurdly wide size. Replace it with a theme-aware, borderless
two-column layout: bold keys, no header row, and a column width driven by the
longest present key so values align tightly to the content.
- renderImageInspect builds the styled string (theme styles, graceful no-color
degradation) and the caller prints it via ui.Writeln instead of ui.Markdown.
- Extract collectInspectRows so renderImageInspect stays under the cyclomatic
limit.
- Tests strip ANSI and assert on plain content.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(container): restore Markdown heading title for image inspect
The flat `Image: <name>` title rendered all-blue (the same Label/Title style as
the body keys), so it had no visual hierarchy. Restore the previous Markdown
heading (`## Image <name>` → bold heading + the image name as cyan inline code)
for the title, while keeping the new borderless bold-key/value body.
renderImageInspect now renders only the body; executeInspect prints the heading
via ui.Markdown and the body via ui.Writeln.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style(container): left-margin the inspect body to align under the heading
The key/value body rendered flush-left while the Markdown heading is indented,
so they didn't line up. Indent the body block with a lipgloss MarginLeft(2)
(idiomatic left margin) so it aligns under the heading.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* style(container): bottom margin + strip lipgloss padding on inspect table
Add a one-line bottom margin under the inspect table to separate it from the
following step output, and strip lipgloss's uniform-block right-padding with the
shared ANSI-aware per-line trimmer (ansi.TrimLinesRight) so rows carry no
trailing whitespace.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test(container): regenerate describe-config snapshots for container.runtime
The new top-level `container:` namespace surfaces a `container.runtime` block in
`atmos describe config` output. Regenerate the two affected golden snapshots
(via -regenerate-snapshots) so the Acceptance Tests match.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test: raise container coverage
* test: share fake container runtime helper
* docs: reorganize workflow docs sidebar
* docs(workflows): standardize step Intros, document container nested fields, fix dev-server OOM
Website/docs:
- Reorder reference sidebar so Workflows sits between Vendor and How-To Guides.
- Add the <Intro> component to every workflow step reference page: the parent
`type` page, all 27 `type/*` step-type pages, and the remaining
workflow-level and step-level field pages. Step-type intros lead with the
value: each type exposes an Atmos CLI primitive (interactive prompts,
spinner, tables, themed output, command/container execution, structured
logging) so users can build their own custom commands and workflows.
- Workflow-level `container` field page: example now uses every field, plus
dedicated Mounts, Ports, and Per-step overrides sections with concrete
nested YAML and accurate merge-vs-replace semantics.
- `type: container` step page: per-action Build (+ Bake), Push, Run
(+ Mounts/Ports), and Inspect sections with full nested YAML and sub-field
definitions, verified against pkg/schema/workflow.go and pkg/workflow.
Tooling:
- Add website/.npmrc raising Node's heap ceiling (node-options=
--max-old-space-size=8192) to stop the Docusaurus dev server and build from
running out of memory on this large site.
Verified with `pnpm build` (exit 0; no new broken links or anchors).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(commands): split Custom Commands page into per-key subpages
The 1,284-line `cli/configuration/commands.mdx` is replaced by a browsable tree
mirroring the workflows docs, so each command key has its own reference page and
the shared-step-types relationship with workflows is obvious.
- New `cli/configuration/commands/` tree (autogenerated under CLI Configuration via
`_category_.json`): index (the `commands` array) → `command/` object → per-key
pages: arguments, flags, env, steps, component, dependencies, working_directory,
identity, and nested commands. Index slug `/cli/configuration/commands` preserved.
- The `steps` page leads with "commands run the same step engine as workflows" and
links to the shared `/workflows/steps` + `/workflows/steps/type` reference (reusing
the `<StepTypes/>` partial) instead of duplicating the 27 step-type pages —
confirmed in source: command `Tasks` dispatch through the same `pkg/runner/step`
registry as workflow steps.
- Repoint all inbound anchor links that moved to subpages, across docs, blog posts,
`roadmap.js`, the file-browser plugin (custom-components example sidebar), and two
user-facing doc URLs in `cmd/cmd_utils.go`.
Verified with `pnpm build` (exit 0) and `go build ./cmd/...`; no new broken links or
anchors (the only remaining warning is the pre-existing /changelog page).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(commands): fix two carried-over inaccuracies flagged in review
- arguments: drop `required: true` from the `name` example that sets
`default: John Doe` (a defaulted argument is optional; the prose already
says it falls back when omitted).
- identity: separate the temporary credential-file vars
(AWS_SHARED_CREDENTIALS_FILE, AWS_CONFIG_FILE) from the profile selector
(AWS_PROFILE), which is not a file path.
Both were carried over verbatim from the original commands page. Verified with
`pnpm build` (exit 0; no new broken links/anchors).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci(link-check): exclude no-color.org (unreachable from CI runners)
The "Check Markdown Links" job failed with a network connection error to
https://no-color.org/ (referenced from docs/prd/help-system-architecture.md and
docs/prd/io-handling-strategy.md). The URL is the canonical NO_COLOR spec site
and resolves in a real browser; it just intermittently refuses connections from
CI runners. Add it to the lychee exclude list, consistent with the existing
entries for gnu.org, tldp.org, kubernetes.io, nx.dev, and other valid-but-flaky
external links.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent 49ce1d3 commit c61e38b
163 files changed
Lines changed: 13677 additions & 2983 deletions
File tree
- .claude/skills/docs
- .github/workflows
- cmd
- docs/prd
- examples
- container-sandbox
- workflows
- container-step
- workflows
- internal/exec
- pkg
- config
- casemap
- container
- datafetcher/schema/config/global
- devcontainer
- runner
- step
- schema
- workflow
- tests
- snapshots
- testhelpers
- website
- blog
- docs
- cli
- commands
- configuration
- commands
- command
- components
- stacks/components/terraform
- tutorials
- workflows
- _partials
- workflows
- workflow
- steps
- type
- plugins/file-browser
- src/data
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
40 | 51 | | |
41 | 52 | | |
42 | 53 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
765 | 765 | | |
766 | 766 | | |
767 | 767 | | |
| 768 | + | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + | |
| 803 | + | |
| 804 | + | |
| 805 | + | |
| 806 | + | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
| 813 | + | |
| 814 | + | |
| 815 | + | |
| 816 | + | |
| 817 | + | |
| 818 | + | |
| 819 | + | |
768 | 820 | | |
769 | | - | |
| 821 | + | |
770 | 822 | | |
771 | 823 | | |
772 | 824 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
724 | 724 | | |
725 | 725 | | |
726 | 726 | | |
727 | | - | |
| 727 | + | |
728 | 728 | | |
729 | 729 | | |
730 | 730 | | |
| |||
734 | 734 | | |
735 | 735 | | |
736 | 736 | | |
737 | | - | |
| 737 | + | |
738 | 738 | | |
739 | 739 | | |
740 | 740 | | |
| |||
897 | 897 | | |
898 | 898 | | |
899 | 899 | | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
900 | 908 | | |
901 | 909 | | |
902 | 910 | | |
| |||
937 | 945 | | |
938 | 946 | | |
939 | 947 | | |
| 948 | + | |
| 949 | + | |
| 950 | + | |
| 951 | + | |
| 952 | + | |
| 953 | + | |
| 954 | + | |
| 955 | + | |
| 956 | + | |
| 957 | + | |
| 958 | + | |
| 959 | + | |
| 960 | + | |
| 961 | + | |
940 | 962 | | |
941 | 963 | | |
942 | 964 | | |
| |||
975 | 997 | | |
976 | 998 | | |
977 | 999 | | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
978 | 1015 | | |
979 | 1016 | | |
980 | 1017 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
27 | 43 | | |
28 | 44 | | |
29 | 45 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
0 commit comments