Repository navigation
Commit de24373
fix(verify): bootStack composes the artifact-less MetadataPlugin os serve gives a host config, so declared apis endpoints answer under the harness (#23127)
Fixes #23088
Clause-②: no
`bootStack` now fills its `metadata` slot the way `objectstack serve`
fills it for a host configuration: `@objectstack/metadata`'s
`MetadataPlugin` with no artifact, the composition PR #23078 gave
`serve`. Before, the slot was the kernel's in-memory fallback, which has
no `matchEndpoint`. So a stack's declared `apis` answered `404
ENDPOINT_NOT_FOUND` under the harness and their declared answer under
`os serve`, and every such boot logged `AppPlugin`'s no-matcher warning.
**Patch round 1 is applied at `0c232d83fb`.** The seat's ruling (comment
6136737187) extended the claimed surface by two files,
`packages/verify/vitest.config.ts` and
`packages/qa/dogfood/test/external-validate-start-ordering.dogfood.test.ts`,
and ruled the open question **A**. Two comment sentences rode the same
round. `check:test-source-alias` and the moved precondition are green.
The PR stays a draft for the seat. The whole dogfood suite has one red
left: a `main`-side interaction of PR #22900 with PR #22993 that reds
with or without this PR's composition (measured below).
## What changes
- **`packages/verify/src/harness.ts`, `bootStack`'s composition.**
- It composes `new MetadataPlugin({ watch: false, config: { bootstrap:
'lazy' }, rootDir: hostRoot })`. These are the options `serve.ts` passes
to `hostConfigMetadataDoor`, read at `:3335`-`:3347`: no
`artifactSource`, no `artifactWatch`, `registerSystemObjects` left at
its default.
- The slot is right after `HonoServerPlugin` and before `AppPlugin`.
That is `serve`'s order: HTTP server, then the door (`:3606`), then the
app wrap and the app's plugins. As in `serve`, the `kernel.use` has no
catch.
- A `MetadataPlugin` the caller hands in `extraPlugins`, or one the app
declares in its own `plugins`, takes the composed one's place. The check
reads the two keys `serve`'s condition reads (`name ===
'com.objectstack.metadata'`, or constructor name `MetadataPlugin`). In
that case the door is never registered, so the kernel logs no supersede.
- The docblock's composition sentence now names the plugin. Its
exception list stays the two it names: the MCP endpoint and pinyin
search.
- **`packages/verify/package.json`** gains `@objectstack/metadata`
(`workspace:*`). `@objectstack/metadata` depends on neither `verify` nor
`runtime`, so this adds no cycle (`check:workspace-manifest-cycles` exit
0). `pnpm-lock.yaml` was regenerated by `pnpm install`, as was the merge
of `main` that brought PR #22993's `verify` dependency line.
- **`packages/verify/src/harness.metadata-door.test.ts`** (new; 2 cases,
2 boots).
- The harness's own composition: the slot has `matchEndpoint`. The
declared path answers `401 UNAUTHENTICATED` without a session and `200`
with one. An undeclared path under the same mount answers `404
ENDPOINT_NOT_FOUND`. No no-matcher warning is logged. The case asserts
all of these as one composite.
- A caller's `MetadataPlugin` in `extraPlugins`: the `metadata` service
is that instance's manager (by identity), no supersede warning names
`com.objectstack.metadata`, and the declared path answers `401`.
- Warnings are matched by their structured fields (`appId`, `plugin`),
never by their prose.
-
**`packages/qa/dogfood/test/showcase-declarative-endpoints.dogfood.test.ts`**:
the hand-added artifact-backed `MetadataPlugin` is removed, and its
header is corrected. The reason it goes:
- The file's own stated intent is "boot the showcase the way a
deployment boots it". The showcase is a host configuration, and `os
serve` / `os start` of it now compose the artifact-less door (PR
#23078). So the harness's own composition is that deployment. The old
hybrid (an artifact door, with `AppPlugin` still the registrar) was a
boot no production composition runs.
- The file now pins `bootStack` of the showcase with no `MetadataPlugin`
in `extraPlugins`: 401 without a session and 200 with one, on `GET
/api/v1/apps/showcase/tasks`.
- The artifact door's `apis:` ingestion keeps its own dogfood proofs:
`declarative-endpoint-policy` and
`declarative-endpoint-anonymous-guest`, both green.
- The stand-in artifact is still written through the build's own schema
parse, so section 0 and the E7 publish-gate proof keep their subject.
- **`.changeset/23088-verify-bootstack-metadata-plugin.md`**:
`@objectstack/verify` `patch`, with `Clause-②: no`.
- **`packages/verify/vitest.config.ts`** (patch round 1): the one
anchored `@objectstack/metadata` alias that `check:test-source-alias`
prescribes, beside the `core` entry.
-
**`packages/qa/dogfood/test/external-validate-start-ordering.dogfood.test.ts`**
(patch round 1, option A): the precondition pins the composed door. The
header drops the fallback framing and names the seam pin of the #21876
ordering repair. The federation cases are unchanged.
- **`multi-package-artifact.dogfood.test.ts`,
`external-validate-sees-runtime-save.dogfood.test.ts`** (patch round 1):
one comment sentence each.
## Reach, before
On `origin/main` `965a1bfc72`, `bootStack` of `examples/app-showcase`
(`hostRoot` = the app, `OS_CLOUD_URL=off`):
- `GET /api/v1/apps/showcase/tasks` answered `404 ENDPOINT_NOT_FOUND`,
both without a session and with one. `POST …/inquiries/purge` answered
the same 404.
- The boot logged the warning once, with
`{"appId":"com.example.showcase","count":2}`.
- The slot was the fallback: constructor `Object`, `matchEndpoint`
undefined, `__serviceInfo.status` `degraded`.
## Census, before and after
How it was measured: a scratch script booted each app through the BUILT
`@objectstack/verify`. BEFORE is the `965a1bfc72` build. AFTER is the
build with only the composition commit (`a23a3b8cc6`) on top. Both ran
under the shared verification lock. The script and its logs stayed in
the scratchpad and are not committed.
| item | showcase BEFORE | showcase AFTER | crm BEFORE | crm AFTER |
|:--|:--|:--|:--|:--|
| `metadata` occupant | fallback (`degraded`, no `matchEndpoint`) |
`NodeMetadataManager`, `matchEndpoint` | fallback |
`NodeMetadataManager` |
| plugins on the kernel | 34 | 35 (+ `com.objectstack.metadata`) | 22 |
23 |
| declared `GET …/tasks`, no session | 404 `ENDPOINT_NOT_FOUND` | **401
`UNAUTHENTICATED`** | n/a (no `apis`) | n/a |
| the same, admin session | 404 | **200, 10 records** | n/a | n/a |
| undeclared path under the mount | 404 | 404 | n/a | n/a |
| no-matcher warning | 1 | **0** | 0 | 0 |
| `/meta/TYPE`, 22 types: status, count, body hash | baseline | **22 of
22 equal** | baseline | **22 of 22 equal** |
| security registrar | `Registered stack-declared security metadata`
once, count 23 | same, once, 23 | once, 5 | once, 5 |
| `position` / `permission` / `capability` / `sharing_rule` on `/meta` |
16 / 17 / 11 / 2 | equal bodies | — | equal bodies |
| registry objects (`registerSystemObjects`) | 104 | 104 (the door logs
`Registered system metadata objects` once, and the set does not grow) |
79 | 79 |
| `sys_metadata` / `_history` / `_commit` / `_audit` rows after boot | 0
/ 0 / 0 / 0 | 0 / 0 / 0 / 0 | 0 each | 0 each |
| `hostRoot/.objectstack/metadata` written | no | no
(`FileSystemRepository attached`, writes nothing) | no | no |
| `GET /api/v1/discovery`, `services.metadata.status` | `degraded` |
**`available`** | `degraded` | **`available`** |
| `GET /api/v1/dev/metadata-events` | 404 | **200 `text/event-stream`**
(development posture, as under `os dev`) | 404 | **200** |
| verify CRUD family summary | 24 objects / 15 verified / 1 needs
fixture / 8 skipped / 0 gaps | identical | 6 / 4 / 1 / 1 / 0 | identical
|
| verify RLS family summary | — | — | 6 objects, 6 probe-blocked |
identical |
| boot, median of 7 interleaved boots (shared box) | 4750 ms | 4745 ms |
— | — |
The four security collections keep one registrar, `AppPlugin`
(`'app-plugin'`). The door reads none of the stack: `lazy bootstrap` is
logged once, and no artifact is named. The CRM row is the CONTROL: a
stack with no `apis` gives the same proof answers before and after.
Across the whole dogfood suite (next section), the two answers that
move, discovery's `metadata` status and the development-only HMR route,
are read by no pin.
## The dogfood suite, whole
`pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2`,
under the lock:
- **at `0c232d83fb` (patch round 1, after merging `main`):** `Test Files
1 failed | 258 passed | 1 skipped (260)`, `Tests 2121 passed | 18
skipped (2139)`.
- The one failed file is `mail-message-pool-read-gate.dogfood.test.ts`.
It fails in its `beforeAll` (`fixture permission set
mail_pool_22870_read seeded: expected undefined to be truthy`), so its 9
tests are skipped. **That red is not this PR's**, as measured below.
- Every file this PR touches is green: `showcase-declarative-endpoints`
17/17, `external-validate-start-ordering` 3/3,
`external-validate-sees-runtime-save` 3/3 and `multi-package-artifact`
9/9. The artifact-door proofs are green too:
`declarative-endpoint-policy` 8/8 and
`declarative-endpoint-anonymous-guest` 6/6.
- The no-matcher warning appears 0 times in the whole run's log.
- **Earlier, before the ruling:** at `d072256c13` `1 failed | 257 passed
| 1 skipped (259)` files, and at `96eaff46d0` `1 failed | 256 passed | 1
skipped (258)` files. Both times the one red was the precondition that
patch round 1 moved.
**The `mail-message-pool-read-gate` red, measured on this tree with and
without the composition.** Both legs ran inside the lock, with a
trap-armed restore.
- With the door, as built: `Test Files 1 failed (1)`, `Tests 9 skipped
(9)`, the same assertion.
- With the door removed (blob `704910003254` → `5b13a59a72e7`, verify
rebuilt, the marker preflight-absent from all 6 built files): the same
`1 failed (1)`, `9 skipped (9)`, the same assertion.
- Restore: blob equal to HEAD, rebuilt, the marker present again, and
`git status --porcelain` empty.
- The file was green in this branch's run at `82ccd6962d`. Between that
head and this one, `main` landed PR #22900 ("no seeder or materializer
writes a `sys_permission_set` row; the boot seeds no row for a declared
set"), and this file's fixture reads such a row. So it is a `main`-side
interaction of PR #22900 with PR #22993, which reds `main`'s full
battery whatever this PR does. It is reported to the seat, not fixed
here.
## Patch round 1: the seat's ruling (comment 6136737187)
The seat extended the claimed surface by two files and ruled the open
question **A**. Each item is its own commit.
1. **`packages/verify/vitest.config.ts`** (`3867e0a312`): one anchored
alias line beside the `core` entry, `{ find: /^@objectstack\/metadata$/,
replacement: path.resolve(HERE, '../metadata/src/index.ts') }`. That is
exactly the remedy `check:test-source-alias` prescribed, and the gate
now prints `check-test-source-alias OK`.
2.
**`packages/qa/dogfood/test/external-validate-start-ordering.dogfood.test.ts`**
(`8b2647eb19`), option A:
- The precondition case now asserts the composed door's identity and its
matcher: `kernel.hasPlugin('com.objectstack.metadata')`, the `metadata`
service `toBeInstanceOf(MetadataManager)` (`@objectstack/metadata`), and
`matchEndpoint` a function.
- The header drops the "`objectstack start` shape" and "the verify
harness composes no metadata plugin" framing. It names the seam pin that
holds the #21876 init-ordering fix:
`packages/services/service-datasource/src/__tests__/external-validate-reads-live-registry.test.ts`.
- The `describe` title follows the header. The two federation cases are
unchanged: the diff has no line inside either of them.
- It uses no stand-in plugin and deletes nothing.
- The pin bears weight: with the door removed, it reds at `hasPlugin`
(`expected false to be true`), and the two federation cases stay green
(ablation leg 3 below).
3. **Two comment sentences** (`cf2065001e`):
`multi-package-artifact.dogfood.test.ts` about `:163` and
`external-validate-sees-runtime-save.dogfood.test.ts` about `:24`. A
non-comment-line filter over that commit's diff counts **0** changed
lines outside `//` comments.
`main` was then merged (`480dcb717e`, and again `0c232d83fb` when it
moved during the first lock wait). **The new head is `0c232d83fb`.** All
the measurements below are at it.
## Ablations
Each leg ran inside `scripts/pm/os-verify-lock.sh` through `node
scripts/ablation-replace.mjs`. The anchor was `await kernel.use(new
MetadataPlugin({ watch: false, config: { bootstrap: 'lazy' }, rootDir:
hostRoot }));`, x1 → x0. Each restore was trap-armed and proved by the
blob equal to HEAD (`704910003254`) and an empty `git diff HEAD`.
- **Leg 1: the verify test, source-resolved.** It ran in wrap mode, with
blob `704910003254` → `082b863f6fb3`. Result: `Tests 1 failed | 1 passed
(2)`.
- The composite case received `matcher: "undefined"`, `anonymous: {
status: 404, code: "ENDPOINT_NOT_FOUND" }` and `signedIn: 404`.
- It also received one matcher warning, carrying
`{"appId":"com.example.mdoor","count":1}`.
- The caller's-own-plugin case stayed green.
- **Leg 2: the showcase dogfood pin, which resolves `verify` through
`dist/`.** The mutation was `void MetadataPlugin; // ablation-23088…`,
blob → `8efaf19cc8cf`. Then `pnpm --filter @objectstack/verify build`,
and `ablation-dist-preflight.mjs @objectstack/verify 'kernel.use(new
MetadataPlugin(' --absent` read the marker as absent from all 6 built
files.
- Result: `Tests 7 failed | 10 passed (17)`. The 401 cases received
`{"code":"ENDPOINT_NOT_FOUND"}` 404, and the run logged the showcase's
warning once.
- Restore: rebuild, and the preflight found the marker present again in
`dist/index.js`, with the tree clean.
- A first attempt at this leg never ran. Its plain comment replacement
left the import unused, and the DTS build refused that (`TS6133`). The
trap restored the file and the rebuilt dist. The successful run above is
the second attempt, with the import kept referenced.
- **Leg 3 (patch round 1): the moved precondition, which resolves
`verify` through `dist/`.**
- Mutation, the same anchor: blob `704910003254` → `8efaf19cc8cf`. Then
a rebuild, and the marker read absent from all 6 built files.
- CONTROL run with the door, as built: `Test Files 1 passed (1)`, `Tests
3 passed (3)`. Without the door: `Tests 1 failed | 2 passed (3)`. The
precondition reds at `hasPlugin` (`expected false to be true`), and both
federation cases stay green.
- Restore: blob equal to HEAD, rebuilt, the marker present again, and
`git status --porcelain` empty.
## Tests at `0c232d83fb`
All of these ran through `scripts/pm/os-verify-lock.sh`, under one
acquisition of slot `dev-23088-test`. Each exit code was captured before
any pipe.
- Build of the closure: exit 0.
- `pnpm --filter @objectstack/verify exec vitest run --maxWorkers=2`:
`Test Files 37 passed (37)`, `Tests 291 passed (291)`.
- `pnpm --filter @objectstack/verify typecheck`: exit 0,
`check:test-typecheck: OK`.
- `pnpm check:test-source-alias`: exit 0, `check-test-source-alias OK —
74 packages with tests scanned`.
- `pnpm --filter @objectstack/dogfood typecheck`: exit 0.
- The whole dogfood suite: exit 1, the one `main`-side red above.
- At `82ccd6962d`, before the ruling, `@objectstack/cli` `verify-*` (7
files) gave `Test Files 7 passed (7)`, `Tests 21 passed (21)`. Patch
round 1 touches no file those tests load.
## Gates at `0c232d83fb`
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`, with no paths: 80 commands, over a change
set of 10 paths vs merge base `f931e765b` (committed 10, working tree
0). Each command ran with its exit code captured before any pipe.
- **All 80 exit 0.**
- `--ran` printed `Run reconciliation — 80 derived, 80 run, 0
NOT-MEASURED, 0 UNRUN` and `a DERIVED zero — all 80 recorded an exit
code and none of them is 3`.
- After this run, `origin/main` moved 5 commits to `d206d08cab`. None of
them touches this diff's paths, `packages/verify` or
`packages/qa/dogfood`.
## Lint, a proven narrowing at `0c232d83fb`
The repo-wide `pnpm lint` is CI's.
1. Population, from eslint's own config: `--no-inline-config
--print-config` resolves rules for all 7 changed TypeScript files (6 for
`harness.ts` and `vitest.config.ts`, 5 for each test file). It resolves
none for the changeset, `package.json` or `pnpm-lock.yaml`.
2. Count, from `--format json`: `files=7 errors=0 warnings=0`, exit 0.
3. Invariance: `eslint.config.mjs` enables no type-aware linting (no
`parserOptions.project` and no `projectService`: 0 hits). Its only file
reads are two baseline JSONs this diff does not touch.
## Acceptance notes
- The four security collections, `/meta`, persistence and the object set
are unmoved (census). Two answers of a test boot move with the slot:
discovery's `metadata` status, and the development-only HMR route. The
changeset says so.
- **`main`-side red, not this PR's:**
`mail-message-pool-read-gate.dogfood.test.ts` (PR #22993) reds after PR
#22900 on any tree, measured with and without this PR's composition
(above). It is reported to the seat for the main-red convention.
- `packages/services/service-datasource/src/plugin.ts` about `:83` says
"`objectstack start` composes no metadata plugin". That has been stale
for a host config since PR #23078. Noted by the seat, not filed.
- 17 dogfood files `chdir` into `examples/app-showcase` and leave
`.objectstack/data/showcase_external.db` there (gitignored). This is
pre-existing. Noted by the seat, not filed.
- No governed surface is touched. The diff is 10 files, +256 / −56.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01VoSxBQujKLZKPwK2u5ehQ6)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 54f062b commit de24373
10 files changed
Lines changed: 256 additions & 56 deletions
File tree
- .changeset
- packages
- qa/dogfood/test
- verify
- src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | | - | |
| 3 | + | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
27 | 29 | | |
28 | 30 | | |
29 | 31 | | |
| |||
41 | 43 | | |
42 | 44 | | |
43 | 45 | | |
| 46 | + | |
44 | 47 | | |
45 | 48 | | |
46 | 49 | | |
| |||
82 | 85 | | |
83 | 86 | | |
84 | 87 | | |
85 | | - | |
| 88 | + | |
86 | 89 | | |
87 | 90 | | |
88 | 91 | | |
| |||
107 | 110 | | |
108 | 111 | | |
109 | 112 | | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
114 | 121 | | |
115 | 122 | | |
116 | 123 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
163 | | - | |
164 | | - | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
165 | 166 | | |
166 | 167 | | |
167 | 168 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
56 | | - | |
57 | 56 | | |
58 | 57 | | |
59 | 58 | | |
| |||
82 | 81 | | |
83 | 82 | | |
84 | 83 | | |
85 | | - | |
| 84 | + | |
86 | 85 | | |
87 | 86 | | |
88 | 87 | | |
89 | 88 | | |
90 | 89 | | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
100 | 103 | | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | | - | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
105 | 108 | | |
106 | 109 | | |
107 | 110 | | |
| |||
137 | 140 | | |
138 | 141 | | |
139 | 142 | | |
140 | | - | |
141 | | - | |
142 | | - | |
143 | | - | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | 143 | | |
148 | 144 | | |
149 | 145 | | |
| |||
156 | 152 | | |
157 | 153 | | |
158 | 154 | | |
159 | | - | |
| 155 | + | |
160 | 156 | | |
161 | 157 | | |
162 | 158 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| 31 | + | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
| |||
| 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 | + | |
0 commit comments