Repository navigation
Commit 288cb53
<!-- claude-projects-attribution: {"github_login":"os-project-manager"}
-->
_Requested by **Leehom** · [project
thread](https://claude.ai/code/project/chan_01TenzsRopZj4jMbvjX8uz1X?thread=cmsg_01TenzsRopZj4jMbvjX8uz1X7JKgiM29GUcitRvoGGj5BU)_
Part of #25467
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6270097840
Cut 25 of the `protocol.ts` split (#24586 ruling A, recorded in
`6270097840`). Cuts 1–24 landed as #25494, #25518, #25538, #25589,
#25601, #25623, #25642, #25719, #25731, #25740, #25797, #25939, #25972,
#26014, #26104, #26168, #26264, #26317, #26350, #26366, #26404, #26449,
#26654 and #26704. The claim is `6446194706`. It takes the cut 25
proposal of the cut 24 report (`6443136164`), a themed group. All four
members passed the AST screen and the read-seam census, and all four
moved unedited.
Four `ObjectStackProtocolImplementation` members move unedited into one
new module,
`packages/metadata-protocol/src/protocol-mutation-fan-out.ts` (#23050
shape B). Together they are the post-persistence mutation fan-out:
- `runMutationProjector`: the registered projector for a just-persisted
mutation (ADR-0094). It is awaited and never throws.
- `notifyMutationListenersLocal`: the local half of
`emitMetadataMutation` (#2588, #13331). Each listener is isolated.
- `publishMetadataMutation`: the cluster half of `emitMetadataMutation`
(#13331). It publishes the mutation's address to peers, fire-and-forget,
and skips drafts.
- `emitMetaItemPublished`: the per-item publish listeners (#10219),
awaited and isolated.
`protocol.ts` loses 25 net lines (29,152 to 29,127). The cut is
move-only, and the card stays open for later cuts.
Branch `claude/project-thread-ybjm3h` is the harness-pinned branch for
this thread. It was restarted from `main` `0f3d068cf1` (after cut 24's
merge). It names no issue, so the claim comment is the identity record.
It holds the move commit `62c90d6199` and one merge of `main`,
`02bc68c682` (13 commits). The merge touches no file of
`packages/metadata-protocol/`. The package's `src/` tree is `91361684`
at the move commit and at the merge.
## Serial with the file's in-flight PRs
Measured just before this PR was opened, against the merged head
`02bc68c682`: of the 26 open PRs, **none edits `protocol.ts`**, and none
names any of the four members, `MutationFanOutHost` or the new module.
Four touch other files of `packages/metadata-protocol/src/`:
- **#26769**: one test file.
- **#26782**: nine `migrations/` files.
- **#26786**: one test file.
- **#26799**: one test file.
Each one's `git merge-tree` is clean against this head.
`main` moved three commits after the merge: #26787, #26788 (dogfood
tests) and #26796 (`create-objectstack`). None touches this package,
`git merge-tree` with this head is clean, and the derivation found
nothing stale, so `main` was not merged again.
## The order's screen (private statics, `new Error(`, the read-seam
census, the call-site counts)
All four members passed:
- **No private-static read.** The AST walk found no access on the
`ObjectStackProtocolImplementation` identifier and none on
`this.constructor`.
- **No error constructed.** No body has `new Error(`, so no `PRODUCERS`
row is owed.
- **Read-seam census.** `check-durability-degradation-log-level --list`
was taken on the base and again on the cut. Both read `88 read seam(s)`;
the base count has grown from 82 since cut 24, through `main`. The lists
are identical once `[@:][0-9]+` is stripped. The full readings are under
"The durability `--list`".
- **The recovery-doors call-site counts hold.**
`protocol.recovery-doors-emit-mutation.test.ts` and
`protocol.recovery-doors-mutation-projector.test.ts` read `protocol.ts`
by path and count its text. The counts at base and head:
| Pattern counted in `protocol.ts` | Base | Head |
|---|---|---|
| `this.emitMetadataMutation(` | 7 | 7 |
| `private emitMetadataMutation(` | 1 | 1 |
| `this.notifyMutationListenersLocal(` | 2 | 2 |
| `private notifyMutationListenersLocal(` | 1 | 1 |
| `this.runMutationProjector(` | 7 | 7 |
| `private async runMutationProjector(` | 1 | 1 |
The callers that are counted stay in the class: `emitMetadataMutation`
(local, then cluster), `applyRemoteMetadataMutation` (local only), the
seven projecting doors and the per-item publish door. That test file
also slices `applyRemoteMetadataMutation`'s body by text, and that body
does not move. Both files pass at both ends, in the package suite.
## What moves
| Member | Base line | Visibility | Body lines | AST tokens (params +
return + body) | Reads |
|---|---|---|---|---|---|
| `runMutationProjector` | `:7493` | private async | 12 | 113 |
`mutationProjectors` (field) |
| `notifyMutationListenersLocal` | `:7563` | private | 10 | 66 |
`metadataMutationListeners` (field) |
| `publishMetadataMutation` | `:7675` | private | 16 | 115 |
`clusterPubSub`, `clusterNodeId` (fields) |
| `emitMetaItemPublished` | `:7864` | private async | 15 | 80 |
`metaItemPublishedListeners` (field) |
`protocol-mutation-fan-out.ts` has 152 lines.
## The shape (#23050 shape B, as cuts 1–24 apply it)
- **The class keeps all four members.** Each keeps its name, docblock,
signature and position. Each body now delegates, marked `[#25467 cut
25]`.
- **Every member read is a field, so each is handed over as a getter.**
`MutationFanOutHost` types each field as the class member itself
(`ObjectStackProtocolImplementation['…']`). Each function types its
`this` as the `Pick` of what it reads, and each stub annotates its
literal as `ThisParameterType<typeof …>`.
- The getters read the protocol's own listener arrays, projector map and
cluster wiring at call time.
- `attachMetadataMutationPubSub`/`detachMetadataMutationPubSub` reassign
`clusterPubSub` and `clusterNodeId`, and the getter sees the current
values, exactly as the body did. This is the field hand-over cuts 20, 23
and 24 used.
- No body reassigns a field; the listener arrays and the projector map
are only iterated or read.
- **None of the four reads another**, so no closure is owed.
- **No member changes visibility.**
- **Every caller still calls the class method.** The sites (base) are:
- `this.runMutationProjector(` at `:21364`, `:22976`, `:26599`,
`:26718`, `:27073`, `:27923` and `:28121`.
- `this.notifyMutationListenersLocal(` at `:7550` and `:7787`.
- `this.publishMetadataMutation(` at `:7551`.
- `this.emitMetaItemPublished(` at `:22394`.
None of them changes.
## Module-level declarations, by reader
Measured by an AST walk over each body's identifiers, against
`protocol.ts`'s top-level declarations and import bindings (property
names excluded):
| Name | Where `protocol.ts` has it | Other readers in `protocol.ts` |
What this cut does |
|---|---|---|---|
| `METADATA_MUTATION_CLUSTER_CHANNEL` | exported `const`, `:5926` | yes
(`attachMetadataMutationPubSub`, and docblocks) | none (already
exported); the new module imports it from `./protocol.js` |
| `ClusterMetadataMutationPayload` | exported interface | yes
(`attachMetadataMutationPubSub`) | none; imported as a type |
| `MetadataMutationEvent`, `MutationProjectionOutcome`,
`MetaItemPublishedEvent` | exported interfaces | yes (the stubs'
declared signatures and others) | none; imported as types |
No import of `protocol.ts` loses its last reader, and no declaration
gains `export`.
## The published `.d.ts`: one emitter trap, met and avoided
The series bar is ruling `6348891160`: sorted-union identity, measured
first, with raw identity reported when it holds. **Both hold for this
cut, as pushed.**
**Disclosed: the first layout of this cut failed the bar, and only
through comments.** The cut's first import comment was 16 characters
longer. With it, the head `.d.ts` moved to `0105198c6b324117…` (782,358
bytes; normalised `c211e183dfe9c5e8…`). The diff against base was one
hunk: an inferred type from `@objectstack/spec` printed as `generatedBy
/** … */ ? /** … */ : string | undefined` instead of `generatedBy?:
string | undefined;`. Both comments were `protocol.ts`'s own `:967`
docblock ("Zod schemas used to validate overlay items…"), which has
nothing to do with that type.
- The two files print identically with comments stripped (TypeScript
printer, `removeComments`; sha `99dc518ed3a640f9…` for both). So no type
moved.
- The mechanism, as measured: tsc's declaration emitter reuses a node
whose source is another file, but reads its comment ranges from
`protocol.ts`'s text at the same offset. The cut's added import comment
had shifted that docblock to start at exactly that offset (50,150).
- Shortening the cut's own import comment by 16 characters moved the
docblock off that offset, and raw identity returned (below). The
bundles' JS does not change with comment text (`index.js`
`8ef90e4aa9cbf4b4…` both ways).
- The trap is latent on `main`: any edit that moves the docblock onto
that offset would trigger it. Diff the `.d.ts` hunk before blaming a
change for it.
Base `0f3d068cf1` and head `62c90d6199` were built with `pnpm --filter
@objectstack/metadata-protocol build` against one dependency tree. The
closure was built at head by a full `pnpm build` (116/116). For the base
build, the package's `src/` was swapped tree-only to base (the new
module removed) and restored from `HEAD` under a trap. Afterwards `git
diff HEAD` was empty, `git status` was clean, and both touched blobs
equalled `HEAD`'s.
- **Normalised sha256** (the ruling's bar):
`310d157f1455a7b76c3d9a60e905ac5e07debb23ec4a6a615b510870341bdbec` at
both ends, on `dist/index.d.ts` and `dist/index.d.cts`. The normaliser
sorted 80 string-literal union runs. **Sorted-union identity holds.**
- **Raw sha256**:
`724eaa784128c37a7e4b59d85e21212ba6378a5b07279853c97828cd8368e932` at
both ends, 777,143 bytes. **Raw identity holds.** It is also the hash
cut 24 measured, since the base is cut 24's merge.
- **Again on the merged tree** `02bc68c682` (closure rebuilt by a full
`pnpm build`, 116/116): the same raw and normalised sha256, and the same
`index.js`/`index.cjs` hashes, as the pre-merge head.
- **The two builds differ where they should.**
- `index.js` hashes `0cb9bc1754636851…` at base and `8ef90e4aa9cbf4b4…`
at head (`index.cjs` `40c568bf03d0672b…` → `65ffd5926831fb5d…`).
- Each of the four `….call(host` spellings occurs 0 times in the base
bundles and once in the head bundles (ESM and CJS alike).
- Each `function …(` declaration goes 0 → 1.
- **Positive control** on the head tree. `private` was dropped from
`runMutationProjector` on disk (restored from `HEAD` under a trap) and
the package rebuilt. Both `.d.ts` files move to `c996c4705a6c30f8…`
(normalised `5db8ebd53a1498a3…`, which differs from the bar's
`310d157f…`). So the bar can see a change on these members.
- **Export tables.** The ESM and CJS bundles, loaded at runtime from the
package, each export the same 78 names at base and head. The sorted list
hashes to `9f18a0177ac736ed…` on all of them. None of the four
functions, and not `MutationFanOutHost`, appears.
No changeset: `skip-changeset`, per ruling `6348891160`.
## The durability `--list`
`check-durability-degradation-log-level` exits 0 at both ends with
identical output: `88 read seam(s)` at both ends. Its `--list` is
**identical once `[@:][0-9]+` is stripped** (164 lines, and no entry
changes file).
- Three of the bodies have a `try` (`runMutationProjector`, and the two
listener loops). Each guards a callback, not a call in the gate's read
vocabulary (`find`/`findOne`/`count`).
- Each catch logs at `warn`, as before. No seam enters or leaves the
census.
- On the merged tree the verdict still reads `88 read seam(s)`.
## Proof of move-only
**Bodies, by AST token.** The compare reads the TypeScript compiler's
AST leaf tokens, with JSDoc skipped, over the parameters (less the added
`this`), the return type and the body. It compares base `protocol.ts` at
`0f3d068cf1` against the head module:
```
runMutationProjector: base tokens 113, head tokens 113, differ 0, text-equal(ws-collapsed, comments incl.) true
notifyMutationListenersLocal: base tokens 66, head tokens 66, differ 0, text-equal(ws-collapsed, comments incl.) true
publishMetadataMutation: base tokens 115, head tokens 115, differ 0, text-equal(ws-collapsed, comments incl.) true
emitMetaItemPublished: base tokens 80, head tokens 80, differ 0, text-equal(ws-collapsed, comments incl.) true
TOTAL tokens=374 differ=0 members=4
CLASS members base=301 head=301 order-same=true byte-identical=297 stubs-with-identical-docblock+signature=4 other=[]
TOP base=254 head=255 byte-identical=254
```
**Negative controls**, one per member. Each changed one token in an
in-memory copy of the head module, and only the mutated member moved
(differ 1; the other three stayed 0):
```
"return { success: true };" -> "return { success: false };" runMutationProjector differ 1
"listener(evt);" -> "listener(e);" notifyMutationListenersLocal differ 1
"if (evt.state === 'draft') return;" -> "if (evt.state !== 'draft') return;" publishMetadataMutation differ 1
"await listener(evt);" -> "void listener(evt);" emitMetaItemPublished differ 1
```
- **Class side.** There are 301 members at base and at head, in the same
order. The 297 that did not move are byte-identical to base, leading
comments included. All four stubs sit at their base positions and keep
their docblocks and signatures byte-identical.
- **Top level of `protocol.ts`.** All 254 base statements are
byte-identical, leading comments included. Head adds one statement, the
new module's import.
- **Size.** +179 / −52 over 2 files, 231 changed lines (the proposal's
estimate was 200–260).
## Readers of the moved lines
The tests and scripts that read `protocol.ts` by path were grepped for
the four member names, the fields they read, and the bodies' log text:
`mutation projector failed`, `metadata-mutation listener failed`,
`cluster metadata-mutation publish failed`, `post-publish re-bind
announce FAILED`, `partitionKey`. These are the files that name
`protocol.ts` and call `readFileSync`. So were the test files in
`packages/`, `docs/qa/` and the `@objectstack/spec` liveness ledgers.
- **By path, two readers name the members, and neither reads a moved
body.** They are the two recovery-doors tests above. They count call
sites and declarations, which stay, and their table holds at both ends.
The emit-mutation test also names `publishMetadataMutation` in a
comment.
- **Behaviour through the class method, no edit owed.** These drive the
four members through the protocol:
- `protocol.cluster-mutation-fanout.test.ts`,
`mutation-listeners.test.ts` and both recovery-doors tests
(metadata-protocol).
- `plugin-publish-announce.test.ts`, `plugin-authored-hooks.test.ts` and
`plugin-authored-actions.test.ts` (objectql).
The metadata-protocol ones pass at both ends, in the package suite.
- **The liveness ledgers.** No row points at any of the four. Carried
forward: `manifest.json`'s `dependencies` row →
`protocol.ts#resolveWritePackageScope` (cut 19), and `seed.json` →
`protocol.ts#applySeedBodies` (cut 14). `check:liveness` checks only
that the `#symbol` is named in the file. Re-pointing them is a
`packages/spec/**` edit, outside this card.
- **ADR anchors.** `check-adr-anchors` exits 0 at both ends.
- The decision-letter count is unchanged at 1,898. No moved body cites
an ADR letter.
- The citation count goes 59,968 → 59,969 and the file count 8,393 →
8,394, from the new module's header (ADR-0094).
- **Engine-double contract** (`check-engine-double-contract`): exits 0
at both ends.
- The `updateData`/`deleteData` seams keep their entries at new line
numbers (13863 → 13838, 13888 → 13863).
- `productionFiles` is 3,798 at base and 3,800 at head. The +2 are the
new file and the gitignored `packages/spec/src/migrations/registry.ts`
that the spec build writes in the head tree, as in cuts 20–24.
- **Identical output at both ends:** `check-adr-symbol-anchors`,
`check-system-context-census`, `check-tenant-audit-census`,
`check-query-options-erasure-ratchet`, `check-filter-alias-parity` and
`check-durability-degradation-log-level`. `check-nul-bytes` differs only
in the scanned file count, +1. The base-end readings were taken in a
clean detached worktree at `0f3d068cf1`.
## Verification
- `tsc --noEmit` in `packages/metadata-protocol` exits 0 at head and on
the merged tree.
- `pnpm exec eslint --no-inline-config packages/metadata-protocol` exits
0 with no output (the whole touched package, with the root `lint`
script's flags).
- **`packages/metadata-protocol` suite**, base and head, compared per
test name and status. Each leg ran vitest `--maxWorkers=2` with the JSON
reporter under the shared verify lock.
- Base `0f3d068cf1`: 21,635 tests (21,616 passed, 0 failed, 19 skipped),
272 files.
- Head `62c90d6199`: 21,635 tests (21,616 passed, 0 failed, 19 skipped),
272 files.
- None lost, none added, none changed status. The base leg is the
package `src/` swapped tree-only from `0f3d068cf1` (the new module
removed) and restored from `HEAD` under a trap.
- The merged head `02bc68c682` gives the same 21,635 tests, per test
identical to the pre-merge head (0 lost, 0 added, 0 changed).
- `check-platform-checklist --changed-from origin/main` (merged tree):
OK. 1 anchored file is in the change set, 29 anchors were judged, and 0
were lost.
- **Governed surface.** `check-governed-merges --branch
claude/project-thread-ybjm3h` finds 0 of 2 paths in the register (13
surfaces), so the PR is NOT governed. It has 231 changed lines, under
the 3,000-line human-merge bar.
- **Derived gates.** `dispatch-gates --commands --repo
objectstack-ai/objectstack` derives 46 gates on 2 changed paths from
`02bc68c682`, with no stale-tree finding. All 46 exit 0 after the full
`pnpm build` (116/116). `dispatch-gates --ran` reports 46 derived, 46
run, 0 NOT-MEASURED and 0 UNRUN, and exits 0.
- `check-durability-degradation-log-level --list` on `02bc68c682`: `88
read seam(s)`.
## Carry-forward
These stay in `protocol.ts`:
- **The read-seam members** (cut 21). A member named in a `protocol.ts`
read-seam entry of `check-durability-degradation-log-level --list`, as
the guarded wrapper or the guarding member, stays until the gate follows
imported wrappers or a ruling accepts the loss.
- This is the census-negative set that cuts 22–23 measured:
`findEnvironmentRows`, `packagelessAddress`, `findServedOverlayRow`,
`foldStoredCollection`, `applyObjectRegistryMutation`,
`unmanagedImportCollisions`, `rollBackUnmanagedImport`,
`readRevertableCommit` and `storedFlowBindingAgrees`.
- `rethrowUnlessMetadataStoreUnprovisioned` cannot move at all.
- This cut re-trialled only its own members and the cut 26 candidates.
- Public members whose return type is inferred.
- **The bodies kept by a by-path reader:**
- `probeRecord`, `getMetaItemCached`, `findReferencesToMeta`,
`refuseUnmintableMetaType` and `metaTypeNamespaceExists`.
- `viewContainerNameCollisionRefusal` with
`overlaidShippedContainerViewNames`, and
`reportPageRequiresAbsentAtLoad`.
- The 7 `applyRegistryWriteThrough` callers (among them
`applyRemoteMetadataMutation`), `readCodeLayerForCarryForward` and
`ensureObjectStorage`.
- `emitMetadataMutation`, a counted call site.
- The private-static readers: `refusePackagedBaseRemoval`,
`packagedBaseRefusal`, `runPublishSideEffects`,
`promoteDraftForPublish`, `publishPackageDrafts` and
`discardPackageDrafts`.
- The field writers: `warnClosureReadUnavailable` and
`resolveSduiManifest`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_016SP1spj613tyGCgxoD1An6
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 13dc413 commit 288cb53
2 files changed
Lines changed: 179 additions & 52 deletions
| 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 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
417 | 417 | | |
418 | 418 | | |
419 | 419 | | |
| 420 | + | |
| 421 | + | |
420 | 422 | | |
421 | 423 | | |
422 | 424 | | |
| |||
7493 | 7495 | | |
7494 | 7496 | | |
7495 | 7497 | | |
7496 | | - | |
7497 | | - | |
7498 | | - | |
7499 | | - | |
7500 | | - | |
7501 | | - | |
7502 | | - | |
7503 | | - | |
7504 | | - | |
7505 | | - | |
7506 | | - | |
7507 | | - | |
| 7498 | + | |
| 7499 | + | |
| 7500 | + | |
| 7501 | + | |
| 7502 | + | |
| 7503 | + | |
7508 | 7504 | | |
7509 | 7505 | | |
7510 | 7506 | | |
| |||
7561 | 7557 | | |
7562 | 7558 | | |
7563 | 7559 | | |
7564 | | - | |
7565 | | - | |
7566 | | - | |
7567 | | - | |
7568 | | - | |
7569 | | - | |
7570 | | - | |
7571 | | - | |
7572 | | - | |
7573 | | - | |
| 7560 | + | |
| 7561 | + | |
| 7562 | + | |
| 7563 | + | |
| 7564 | + | |
| 7565 | + | |
7574 | 7566 | | |
7575 | 7567 | | |
7576 | 7568 | | |
| |||
7673 | 7665 | | |
7674 | 7666 | | |
7675 | 7667 | | |
7676 | | - | |
7677 | | - | |
7678 | | - | |
7679 | | - | |
7680 | | - | |
| 7668 | + | |
| 7669 | + | |
| 7670 | + | |
| 7671 | + | |
| 7672 | + | |
| 7673 | + | |
7681 | 7674 | | |
7682 | | - | |
7683 | | - | |
7684 | | - | |
7685 | | - | |
7686 | | - | |
7687 | | - | |
7688 | | - | |
7689 | | - | |
7690 | | - | |
7691 | | - | |
| 7675 | + | |
7692 | 7676 | | |
7693 | 7677 | | |
7694 | 7678 | | |
| |||
7862 | 7846 | | |
7863 | 7847 | | |
7864 | 7848 | | |
7865 | | - | |
7866 | | - | |
7867 | | - | |
7868 | | - | |
7869 | | - | |
7870 | | - | |
7871 | | - | |
7872 | | - | |
7873 | | - | |
7874 | | - | |
7875 | | - | |
7876 | | - | |
7877 | | - | |
7878 | | - | |
7879 | | - | |
| 7849 | + | |
| 7850 | + | |
| 7851 | + | |
| 7852 | + | |
| 7853 | + | |
| 7854 | + | |
7880 | 7855 | | |
7881 | 7856 | | |
7882 | 7857 | | |
| |||
0 commit comments