Commit 71ab228
feat(self-hosting): sign and attest published images, and correct the self-hosting docs (#7437)
* feat(supply-chain): sign and attest every published image, and inventory the chart's images
Enterprise security reviews ask for artifacts Sim did not publish: a signature
proving who built an image, SLSA provenance describing how, and an SBOM listing
what is inside. A new attest-subjects job resolves the tags this run actually
published to their digests, and attest-images signs each with cosign keyless
signing and attaches provenance and, for single-architecture subjects, a Syft
SBOM. All of it is pushed to the registry as referrers, so a mirrored registry
carries the attestations with the image.
Resolving tags rather than assuming them is what makes the coverage complete.
`imagetools create` writes an index even from one manifest, so `:version-amd64`
has a different digest from the `:sha-amd64` manifest it wraps, and which tags
exist depends on whether the run is a release and whether the latest guard held.
A moving alias is taken only when it resolves to this run's index, and that read
is retried so registry lag is not mistaken for a deliberate skip.
The SBOM is generated from the plain `<sha>-<arch>` manifest rather than the
subject digest. Syft resolves an index against the runner's platform, so an
arm64-only index fails outright on an amd64 runner — and the plain manifest is
identical content, shared by both subjects for that architecture.
helm/sim/images.yaml is the set of images a complete install pulls, generated
from the rendered chart because an image can be referenced from a template that
no values key names. Each entry carries the reference to pull from and the path
the chart resolves to under a mirror; those differ, and the second is derived
from a second render rather than described as a rule that could drift.
The NVIDIA device plugin was hardcoded, so an air-gapped cluster could not
redirect it. It now takes its image from `ollama.gpu.devicePlugin.image` through
the shared helper, and the chart minor is bumped for the new key.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* docs(self-hosting): add sandboxes and reference architectures, and correct the existing pages
An audit of 27 pages checked every concrete claim against the code it describes.
It found claims that made a documented path fail outright, and claims that
understated what ships.
Errors that broke a documented path:
- `openssl rand -hex 32` prints 64 hex characters, not the "32 hex chars" five
entries claimed, and only two of those secrets are length-validated at all.
- `API_ENCRYPTION_KEY` was missing from the whole Kubernetes path. It is
optional, and unset means API keys are stored in plain text behind one warning.
- Bucket fallback behaviour was wrong for all three object-storage providers, in
both directions.
- The remote-sandbox table omitted the immutable template and snapshot refs, so
the documented configuration could not work.
- The GKE snippet set a values key no template renders.
- Retention deletion is scheduled by neither shipped deployment, so a deployment
that followed the docs deleted nothing.
- Every "Settings → Enterprise/Security → X" path named nav groups that do not
exist, across eleven pages.
Claims that understated what ships:
- The outbound-proxy section said no platform traffic can be proxied. The server
runs on Bun, whose fetch honors the proxy variables, so provider and Resend
traffic already proxies; the guarded egress, SMTP, S3 and OTLP do not. Replaced
with a per-path table and the NO_PROXY guidance internal services need.
- Telemetry is off by default on Helm, not on.
- The CronJob count was 18 in two places; there are 22.
- The permission-group table was stale throughout, named a deployment key that
does not exist, and inverted the checkbox semantic.
Adds two pages. Sandboxes carries the base-image runbook that was buried in an
enterprise enablement page. Reference architectures answers what an operator
provisions versus what the chart provisions, per cloud — the question behind "do
you have Terraform or CloudFormation templates?".
Also documents around 25 environment variables nothing described, the migration
advisory lock and its operational knobs, and `sim-setup doctor`. Removes
redundancy where a page restated itself: FAQ blocks repeating their own body, and
four drifting copies of the same tables.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the first review round on the combined PR
The mirror override in the inventory header double-prefixed. It told operators
to override the device plugin with `<your-registry>/nvidia/k8s-device-plugin`
while global rewriting stayed on, so `sim.image` prepended the registry a second
time and the DaemonSet landed in ImagePullBackOff. Verified by rendering both
forms; the override has to be the bare repository. The plugin's DaemonSet also
now carries `global.imagePullSecrets`, which it was the only workload to omit —
an authenticated mirror could not pull it.
The resolver skipped `latest*` whenever the alias did not resolve to this run's
index, which conflated "the guard withheld it" with "the read was stale".
create-ghcr-manifests now publishes its guard decision and the resolver fails
instead of skipping when the guard says latest was published this run.
Docs corrections, each verified against source:
- The loopback carve-out does lift plain HTTP and the private-address block; it
leaves only the denied-port list in force. `egress.ts` skips the port check
for allowlist vouching alone, which is what makes `http://localhost:5432`
stay refused.
- Not every guarded response is capped — the pinned fetch used by provider SDKs
sets no limit.
- A partially configured storage backend is skipped when a later one is
complete; it fails only when none is.
- GCE Ingress can serve a provisioned TLS Secret, so cert-manager is an
alternative to a ManagedCertificate rather than requiring a different
controller.
- Workload Identity needs roles/iam.serviceAccountTokenCreator to sign GCS URLs.
- NEXT_PUBLIC_BRAND_BACKGROUND_COLOR is a contrast flag, not a background.
- NEXT_PUBLIC_SANDBOXES_ENABLED is a browser gate, not provider readiness.
- An incomplete certificate chain is not fixed by NODE_EXTRA_CA_CERTS; the
endpoint has to serve the intermediate.
- Script migrations run once — the eight retries are for SQL lock timeouts.
- NO_PROXY belongs in the application environment, not a shell assignment, and
the GKE annotate command no longer hard-codes a release name and namespace.
- Pi's own image, the Microsoft login callback, the custom-block identity split,
the whitelabeling surfaces that ignore configured URLs, and sim-setup's
Compose-only scope are all now stated.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the second review round
Two chart defects, both the same shape as the uploads-path bug this branch
already documents: a path that looks right but sits outside where the app
actually serves from.
- `branding.mountPath` defaulted to `/app/public/branding`, while the standalone
build places the public directory at `/app/apps/sim/public`. Every branded
asset the docs tell operators to reference would have 404'd. Corrected in the
chart and the example.
- The device plugin was the only `sim.image` call site not passing
`chartAppVersion`, so `tag: ""` — a natural way to ask for the chart default —
errored instead of falling back.
Docs, each verified against source:
- Local disk is selected unless a backend's *activating* variables are set;
credentials alone activate nothing.
- Six backoff retries follow the initial failure, so up to seven attempts.
- The migrations init container reads only the database Secret, and the chart's
Secret templates carry just the password — so `MIGRATION_DATABASE_URL` needs
an operator-supplied Secret, not the generated one.
- The Ollama stack's missing Redis also breaks CLI authentication outright,
while the idempotency store and progress markers fall back to Postgres.
- `sim-setup reset` leaves the PostgreSQL PVC on Kubernetes.
- The copilot ingress route renders only when `copilot.enabled` is set.
- The Postgres exposure applies to whichever Compose file started the install.
- The GKE annotate command resolves the Service name from the release rather
than assuming it.
- `API_ENCRYPTION_KEY` warns on every use, not once, and the whitelabeling
coverage claim now describes the two surfaces that only partially honour it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the third review round
Two of these were fixes from earlier rounds that never landed — the edits were
in batches that aborted partway, and I reported them applied without
re-verifying. The LM Studio recreate command still hard-coded the production
Compose file, and the proxy table still claimed "four exceptions" above a row
listing fifteen providers.
The rest:
- The NO_PROXY example omitted `ollama`, so on the Ollama stack local model
requests would go to the external proxy.
- The `lock_timeout` sentence had its trade-off backwards: it trades a
table-wide stall for a failed migration, not the reverse.
- `NEXT_PUBLIC_CUSTOM_CSS_URL` has to be same-origin or CSP-allowlisted;
`style-src` blocks a stylesheet from another origin.
- Any of a storage backend's keys activates it — a dedicated bucket,
`S3_ENDPOINT`, an Azure credential — so a half-configured backend fails at
startup rather than falling back to local disk.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the fourth review round
- The LM Studio recreate snippet now shows both Compose assignments instead of
describing the alternative in a comment.
- `sim-setup logs` on a source checkout prints where the logs are rather than
following a stream; the table said it follows.
- The GKE BackendConfig annotation targeted `<release>-realtime`, but the chart
names the Service `<fullname>-realtime` — and the fullname is `<release>-sim`
unless the release name already contains `sim`. It now selects by the release
and component labels, which holds for either.
- The Helm `NO_PROXY` example listed only the `.svc` suffixes, which match none
of the bare Service names the chart wires into `SOCKET_SERVER_URL`,
`PII_URL`, and `OLLAMA_URL`. Those requests would still have gone to the
proxy.
- `sim-setup` detects only the production and local Compose files, so an
Ollama-stack install is invisible to it. The upgrade section now says so and
gives the direct commands.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the fifth review round
- The Ollama upgrade commands ran unprofiled, so Compose would have skipped the
profile-scoped `ollama` service and left `OLLAMA_URL` pointing at nothing.
Both commands now carry the install's `--profile`.
- `start` / `stop` / `restart` are only whole-install operations on Compose.
On a source checkout they manage just the Postgres and Redis containers, and
on Kubernetes they print kubectl commands rather than acting.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the sixth review round
- The Ollama upgrade commands hard-coded `--profile gpu` while the comment said
to use the install's profile. It is a variable now.
- `sim-setup reset` on Kubernetes runs `helm uninstall`, which leaves the
Postgres volumes behind — they come from a StatefulSet's
`volumeClaimTemplates`, which Kubernetes does not delete. The row promised a
full data wipe.
- Noted that the command table drops the `npx` prefix for brevity.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the seventh review round
- "`statement_timeout` is 0, so a long migration is never cut off" was
absolute, and `0076_damp_vector.sql` disproves it — it sets 180s locally.
It is the session default now, with the override named.
- The migration-log command hard-coded the production Compose file, so a
source-built or Ollama install would have inspected the wrong stack.
- The Compose rollback applied `SIM_VERSION` to every install, but the local
and Ollama stacks build from source and ignore it. Those now get the
checkout-and-rebuild path.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: address the eighth review round
`docker-compose.ollama.yml` builds the app, realtime server, and migrator from
source, which I had missed:
- The Ollama upgrade block ran `pull` then `up -d`. That refreshes only the
Ollama and Postgres images and leaves every Sim service on its old build. It
is a checkout plus `build --pull` now.
- The source rollback showed only the local file and no profile; the Ollama
stack needs both.
- Dropped the Ollama mention from the `COMPOSE_FILE` comment above, since that
stack is covered by its own profile-aware commands rather than the CLI.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: audit the docs against source instead of one review round at a time
Eight review rounds kept finding defects because I was patching what the last
round flagged and writing new prose in the process, which nothing then checked.
This is a full pass over the Compose files, the sim-setup CLI, and the chart.
The mirror inventory (Greptile's blocker): the bare device-plugin override
changes where the chart pulls from, to `<registry>/nvidia/k8s-device-plugin`,
while the inventory tells operators to mirror to `<registry>/nvcr.io/nvidia/...`.
Following both instructions produced an unpopulated path. Verified by rendering
the chart both ways; the header now names the override's destination.
Compose:
- Nine `docker compose` commands across troubleshooting, verify, and
background-jobs had no `-f`. The repo ships no default compose file, so every
one of them failed with "no configuration file provided".
- `simstudio` declares `env_file: .env` in all three files, so the LM Studio
fix does not need a hand-edited `environment:` block — and hand-editing a
managed Compose file makes `sim-setup update` refuse.
- `OLLAMA_URL` as a one-shot shell prefix reverts to the localhost default on
the next `up -d`, pointing the container at itself. It belongs in `.env`.
- `pg_dump` through `exec` without `-T` corrupts the dump; the restore beside
it already used `-T`.
- Live cross-process status is a Redis consequence, not a cron one.
- The local Compose file was missing from three "the file that started your
install" lists and from the exposed-Postgres warning.
- No shipped Compose file defines a `pii` service.
- The rollback said "edit .env" but appended a second SIM_VERSION line.
sim-setup CLI — the table stated Compose behavior as universal:
- `down` runs `helm uninstall` on Kubernetes and removes only Postgres and
Redis on a source checkout; both prompt first.
- `reset` archives four env files on anything but Compose, including when no
install is detected.
- `--no-open` was described backwards: the link always prints, the flag skips
the download prompt.
- `start`/`restart` print port-forward hints on Kubernetes, not equivalents.
- `--dir` is a global option and scopes the lifecycle commands.
- `--quick` only preselects the setup style; `add` and `desktop` have refusals
worth knowing; the update hand-edit refusal is narrower than stated.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: parameterize the Ollama rollback profile
The rollback hard-coded `--profile gpu` while the upgrade example above it uses
a variable, so a CPU install would have started the GPU service.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: correct the Kubernetes and chart claims the audit found
The install command was the serious one: the cloud values files hardcode a
placeholder domain in six places, and the documented command overrode only
`NEXT_PUBLIC_APP_URL`. Following the page literally left sign-in pointed at the
placeholder, realtime rejecting every socket upgrade, and the Ingress serving
the wrong host — the exact failure the page warns about further down.
- The PII recipe's `INTERNAL_API_BASE_URL` self-call is blocked by the
NetworkPolicy the same page recommends enabling: the app policy permits
Postgres, Redis, realtime, Ollama, PII, telemetry, DNS, and 443, but has no
app-to-app rule. Redaction would fail closed.
- The GPU device-plugin DaemonSet is not `restricted`-compliant — it sets only
two of the four controls and mounts three `hostPath` volumes — so enforcing
the label namespace-wide breaks a GPU install.
- Under External Secrets the chart writes nothing from `app.env`; an unmapped
key fails the render. The page said the two modes behave alike.
- The CronJob pods have no NetworkPolicy either.
- `app.env.DATABASE_URL` is silently discarded: the chart computes it and
inlines it on the container, so the PgBouncer advice pointed at a key that
does nothing.
- The PDB also renders from `autoscaling.minReplicas`, the reference topology
could not render without an `externalDatabase.password`, `copilot`'s
security-context keys nest one level deeper, and `NO_PROXY` needs the app's
own Service name.
- Untangled a garbled `externalSecrets.apiVersion` comment that contradicted
its own default.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: correct the env-var and runtime-behavior claims the audit found
- White-labeling, session policies, and the inbox are already on wherever
billing is disabled, which is every self-hosted deployment. The docs told
operators to enable white-labeling with a flag it does not need, and listed
all thirteen features as symmetric opt-ins.
- `NEXT_PUBLIC_CUSTOM_CSS_URL` must be same-origin. The CSP's `style-src` is a
hardcoded literal that takes no configured hosts, so both the
"point them at absolute URLs" advice and my own earlier "or a host you have
added to style-src" were wrong — there is no such remedy short of editing
source.
- Client variables are read at boot from the container environment, not baked
at build. The troubleshooting note invited a pointless image rebuild.
- Script migrations run with `lock_timeout = 0` and `statement_timeout = 0`, so
one blocked on an app-held lock hangs forever rather than failing with
`55P03`. The table described only the SQL phase.
- With no mail provider the mailer logs recipient, subject, and sender at
`info` and reports success — never the body, and nothing at all at the
production default of `ERROR`.
- A malformed storage backend stops startup; it does not fall through to a
later fully configured one.
- `EMAIL_PASSWORD_SIGNUP_ENABLED=false` disables sign-in and OTP too, and
`SIGNUP_MX_VALIDATION_ENABLED` covers only email signup.
- The Pi template accepts an immutable ref; the page forbade one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: correct the audit pass's own errors, and six it missed
Four of these are defects I introduced in the audit commits by applying
suggested replacement text without verifying the replacement the way I verified
the finding:
- `postgresql.enabled: false` alone renders an empty `DATABASE_URL`;
`externalDatabase.enabled: true` is required too. I dropped it.
- The external-database password check is skipped under `existingSecret` and
External Secrets, so "the chart refuses to render" was false. Under ESO the
mapping is what matters.
- `LOG_LEVEL` is an uppercase-only enum, so the `info` I told operators to set
would fail validation.
- `add cache` writes `REDIS_URL`, which `realtime` reads too, so recreating
only the app container leaves Socket.IO pointed at the old Redis.
Six the audits missed:
- `PII_URL` used `<release>-pii`, the same fullname bug already fixed for the
realtime Service. A manual value is also ignored when `pii.enabled`.
- External Redis does not need `redis.enabled: false` — a non-empty
`app.env.REDIS_URL` overrides the bundled URL and suppresses its Deployment.
- `sim-setup doctor` was recommended to Ollama-stack users, which it cannot
detect.
- The CA-bundle snippet said "in either case" directly after explaining that an
incomplete chain must be repaired server-side.
- `update` refuses only the `dev` mode; a source checkout on
`docker-compose.local.yml` is a Compose install and does update.
- Doctor cannot tell whether migrations are current on a standalone install —
the published package ships no migration journal.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: describe the PDB activation condition accurately
The autoscaling term is computed once from the global `autoscaling` block and
reused for both PodDisruptionBudgets, so `minReplicas > 1` creates realtime's
even when `autoscaling.realtime.enabled` is false and no realtime HPA exists.
Calling the two independent was wrong.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
* fix: use a renderable placeholder for externalDatabase.password
The chart validates the password against ^[a-zA-Z0-9._-]+$, so the
`<password>` placeholder I added last round made the reference topology fail to
render if copied as-is. Replaced with a compliant placeholder and documented
the character restriction, which is a real constraint operators hit when
generating one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>1 parent 7395a37 commit 71ab228
48 files changed
Lines changed: 2139 additions & 674 deletions
File tree
- .github/workflows
- apps
- docs/content/docs/platform
- enterprise
- self-hosting
- sim
- content/library/govern-ai-agents-multiple-teams-enterprise-workspace
- lib/copilot/generated
- helm/sim
- templates
- scripts
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 | |
|---|---|---|---|
| |||
554 | 554 | | |
555 | 555 | | |
556 | 556 | | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
557 | 562 | | |
558 | 563 | | |
559 | 564 | | |
| |||
611 | 616 | | |
612 | 617 | | |
613 | 618 | | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 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 | + | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + | |
| 824 | + | |
| 825 | + | |
| 826 | + | |
| 827 | + | |
| 828 | + | |
| 829 | + | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
| 836 | + | |
| 837 | + | |
| 838 | + | |
| 839 | + | |
| 840 | + | |
| 841 | + | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
| 850 | + | |
| 851 | + | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
614 | 893 | | |
615 | 894 | | |
616 | 895 | | |
| |||
652 | 931 | | |
653 | 932 | | |
654 | 933 | | |
655 | | - | |
656 | | - | |
| 934 | + | |
| 935 | + | |
| 936 | + | |
| 937 | + | |
| 938 | + | |
| 939 | + | |
| 940 | + | |
| 941 | + | |
| 942 | + | |
| 943 | + | |
657 | 944 | | |
658 | 945 | | |
659 | 946 | | |
| 947 | + | |
| 948 | + | |
| 949 | + | |
660 | 950 | | |
661 | 951 | | |
662 | 952 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
9 | 13 | | |
10 | 14 | | |
11 | 15 | | |
12 | 16 | | |
13 | 17 | | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
14 | 22 | | |
15 | 23 | | |
16 | 24 | | |
| |||
43 | 51 | | |
44 | 52 | | |
45 | 53 | | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
46 | 61 | | |
47 | 62 | | |
48 | 63 | | |
| |||
0 commit comments