harness-everything 0.21.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +18 -0
- package/README.md +30 -0
- package/benchmarks/results/system-one/cua-s1-forms-resident-async-cpu-2026-09-23/README.md +87 -0
- package/benchmarks/results/system-one/cua-s1-forms-resident-async-cpu-2026-09-23/paired-latency.json +107 -0
- package/benchmarks/results/system-one/cua-s1-forms-resident-async-cpu-2026-09-23/report.json +856 -0
- package/benchmarks/results/system-one/cua-s1-forms-resident-cpu-2026-09-23/README.md +74 -0
- package/benchmarks/results/system-one/cua-s1-forms-resident-cpu-2026-09-23/report.json +856 -0
- package/benchmarks/results/system-one/pre-merge-review-2026-09-23/README.md +92 -0
- package/benchmarks/results/system-one/pre-merge-review-2026-09-23/haiku-spec-conformance.md +241 -0
- package/benchmarks/results/system-one/pre-merge-review-2026-09-23/luna-adversarial.md +212 -0
- package/benchmarks/results/system-one/pre-merge-review-2026-09-23/skill-top1-probe.js +83 -0
- package/benchmarks/results/system-one/pre-merge-review-2026-09-23/skill-top1-probe.json +7700 -0
- package/ci/fixtures/system-one-resident-stub.py +28 -0
- package/ci/fixtures/system-one-worker-probe.js +15 -0
- package/ci/mechanism-packaging-bytecode.test.js +61 -0
- package/ci/mechanism-system-one-install.test.js +11 -0
- package/ci/mechanism-system-one-resident.test.js +296 -0
- package/ci/mechanism-system-one-router.test.js +25 -0
- package/ci/system-one-adapter-test.py +166 -0
- package/docs/platform-capabilities.md +8 -0
- package/docs/system-one-routing.md +91 -3
- package/evals/pilot-router-nonsoftware/graders/no-tier-language.md +6 -0
- package/evals/pilot-router-nonsoftware/graders/skill-not-fired.md +9 -0
- package/evals/pilot-router-nonsoftware/prompt.md +8 -0
- package/evals/pilot-router-tier3/graders/skill-fired.md +6 -0
- package/evals/pilot-router-tier3/prompt.md +8 -0
- package/evals/pilot-tdd-bugfix/graders/skill-fired.md +6 -0
- package/evals/pilot-tdd-bugfix/prompt.md +8 -0
- package/evals/pilot-tdd-trivia/graders/no-red-phase-claim.md +7 -0
- package/evals/pilot-tdd-trivia/graders/skill-not-fired.md +9 -0
- package/evals/pilot-tdd-trivia/prompt.md +8 -0
- package/evals/pilot-verify-discussion/graders/no-verification-claim.md +7 -0
- package/evals/pilot-verify-discussion/graders/skill-not-fired.md +9 -0
- package/evals/pilot-verify-discussion/prompt.md +8 -0
- package/evals/pilot-verify-preship/graders/skill-fired.md +6 -0
- package/evals/pilot-verify-preship/prompt.md +8 -0
- package/harness-everything/SKILL.md +1 -1
- package/harness-everything/scripts/system-one/cua_adapter.py +265 -6
- package/harness-everything/scripts/system-one/install.js +17 -8
- package/harness-everything/scripts/system-one/provider.js +18 -3
- package/harness-everything/scripts/system-one/resident.js +200 -0
- package/harness-everything/scripts/system-one/router.js +18 -2
- package/harness-everything/scripts/tier-router.js +13 -4
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/scripts/lib/packaging-noise.js +6 -0
- package/plugins/harness-everything/scripts/lib/skills.js +2 -0
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
- package/plugins/harness-everything/skills/harness-everything/scripts/system-one/cua_adapter.py +265 -6
- package/plugins/harness-everything/skills/harness-everything/scripts/system-one/install.js +17 -8
- package/plugins/harness-everything/skills/harness-everything/scripts/system-one/provider.js +18 -3
- package/plugins/harness-everything/skills/harness-everything/scripts/system-one/resident.js +200 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/system-one/router.js +18 -2
- package/plugins/harness-everything/skills/harness-everything/scripts/tier-router.js +13 -4
- package/sbom.cdx.json +7 -7
- package/scripts/build-openai-submission.js +2 -0
- package/scripts/evaluate-system-one.js +18 -9
- package/scripts/lib/packaging-noise.js +6 -0
- package/scripts/lib/skills.js +2 -0
- package/scripts/sync-openai-plugin.js +2 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "harness-everything",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
|
|
13
|
-
"version": "0.
|
|
13
|
+
"version": "0.22.1",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Miya Daniel"
|
|
16
16
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harness-everything",
|
|
3
3
|
"description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.22.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Miya Daniel"
|
|
7
7
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.22.1](https://github.com/dyphn1/Harness-everything/compare/v0.22.0...v0.22.1) (2026-09-23)
|
|
6
|
+
|
|
7
|
+
### Performance Improvements
|
|
8
|
+
|
|
9
|
+
* **router:** pre-score system one asynchronously in the hook entry ([fcf2de2](https://github.com/dyphn1/Harness-everything/commit/fcf2de2a843d106636c10a318d0832c2b57d64f6)), closes [#233](https://github.com/dyphn1/Harness-everything/issues/233)
|
|
10
|
+
|
|
11
|
+
## [0.22.0](https://github.com/dyphn1/Harness-everything/compare/v0.21.0...v0.22.0) (2026-09-23)
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* **router:** add resident system one provider ([eee8cb7](https://github.com/dyphn1/Harness-everything/commit/eee8cb763d2ed65722a2578c83700b02bdc3e668)), closes [#233](https://github.com/dyphn1/Harness-everything/issues/233)
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **distribution:** keep python bytecode out of every package ([58135ae](https://github.com/dyphn1/Harness-everything/commit/58135aef92089d731eb44d55efb0ae77ea4d64dd)), closes [#233](https://github.com/dyphn1/Harness-everything/issues/233)
|
|
20
|
+
* **router:** harden resident system one server from adversarial review ([ee5ab0f](https://github.com/dyphn1/Harness-everything/commit/ee5ab0fec9f03808f12a88e66b769b210803baa2)), closes [#233](https://github.com/dyphn1/Harness-everything/issues/233)
|
|
21
|
+
* **router:** replace the whole windows dacl for resident state ([e59af73](https://github.com/dyphn1/Harness-everything/commit/e59af735de1337b3bcb10cbca05500ab6b03b64c)), closes [#233](https://github.com/dyphn1/Harness-everything/issues/233)
|
|
22
|
+
|
|
5
23
|
## [0.21.0](https://github.com/dyphn1/Harness-everything/compare/v0.20.7...v0.21.0) (2026-09-23)
|
|
6
24
|
|
|
7
25
|
### Features
|
package/README.md
CHANGED
|
@@ -270,6 +270,7 @@ For a deep dive into individual modules and the underlying philosophy, explore o
|
|
|
270
270
|
* [Harness Routing & Triage](docs/routing.md): Detailed trigger criteria for Tiers 1, 2, and 3.
|
|
271
271
|
* [Harness Reflection & Memory](docs/reflection.md): WAL session handoffs and workspace rules immunization.
|
|
272
272
|
* [Harness Audit Log](docs/audit.md): Dated historical self-audit scorecards, methodology, and per-cycle change log.
|
|
273
|
+
* [System One Routing (experimental, off by default)](docs/system-one-routing.md): Optional local option scorer for tier routing, its gates and evidence.
|
|
273
274
|
|
|
274
275
|
Fable model selection is documented in [fable-mode/references/model-matrix.md](fable-mode/references/model-matrix.md); the explicit entrypoints are `fable-haiku`, `fable-sonnet`, and `fable-opus`.
|
|
275
276
|
|
|
@@ -277,6 +278,35 @@ Maintainers **MUST** follow [RELEASING.md](RELEASING.md) for tag-driven npm rele
|
|
|
277
278
|
|
|
278
279
|
---
|
|
279
280
|
|
|
281
|
+
## Experimental: System One routing (off by default — keep it off for now)
|
|
282
|
+
|
|
283
|
+
Issue [#233](https://github.com/dyphn1/Harness-everything/issues/233) adds an optional local "System One" scorer. It scores the fixed tier catalog for each prompt. The lexical router stays authoritative:
|
|
284
|
+
- `HARNESS_SYSTEM_ONE_MODE` defaults to `off`.
|
|
285
|
+
- `shadow` only logs a diagnostic.
|
|
286
|
+
- `prefer` can raise a tier but never lower it below the deterministic structural floor, and only for a `harness-routing-v1` checkpoint.
|
|
287
|
+
|
|
288
|
+
**Honest status: it is not useful yet, so do not enable it for normal work.**
|
|
289
|
+
|
|
290
|
+
- **No usable model yet.** The only available checkpoint, `cua-ai/cua-s1-forms`, is a form-filling model, so every decision abstains as `domain-mismatch` and routing never changes. On historical routing keywords its top-1 skill choice is at chance level: 8.2% against 11.6% for a random guess, and 5.9% against 3.8% on eval prompts. It is kept only to prove the pipeline. The feature should stay `off` until a Harness-trained checkpoint passes the Phase 4 gates.
|
|
291
|
+
- **It costs something when on.** The resident transport keeps one Python/PyTorch server per manifest alive until 30 minutes idle. The measured cost on one Windows CPU host is about 85–110 ms per prompt, and the warm p95 of 108.6 ms misses the 100 ms target. The first prompt after a cold start uses the lexical route while the server loads.
|
|
292
|
+
- **Setup downloads a lot.** `npm run system-one:install` needs Python 3.11–3.13 and downloads CPU PyTorch (~124 MB on Windows), the pinned `cua_s1` source and the pinned checkpoint. It never runs from hooks and never turns the mode on.
|
|
293
|
+
|
|
294
|
+
**Enabling it depends on the host, and most options are process-wide:**
|
|
295
|
+
|
|
296
|
+
| Surface | How System One gets its configuration | Caveat |
|
|
297
|
+
| --- | --- | --- |
|
|
298
|
+
| Claude Code (plugin or `--claude` install) | `env` in `~/.claude/settings.json` (`HARNESS_SYSTEM_ONE_MODE`, `HARNESS_SYSTEM_ONE_CONFIG`) | The values reach hooks **and every command the agent runs** (tests, builds), and are hot-reloaded into running sessions. |
|
|
299
|
+
| Codex (plugin or `--codex` install) | Hooks inherit the environment of the `codex` process | A Codex started from Claude Code inherits Claude's `env`. A Codex started from an ordinary terminal only sees the variables if they are set **at user/OS level** (Windows user environment variables, or your shell profile on macOS/Linux), which then applies to every program you start. |
|
|
300
|
+
| Skills-only / public OpenAI bundle | No hooks | It runs only if the agent itself runs `harness-everything/scripts/kernel-router.js`. |
|
|
301
|
+
|
|
302
|
+
**Evidence so far:**
|
|
303
|
+
- **Mechanism:** Linux, macOS and Windows CI.
|
|
304
|
+
- **Real CPU inference:** on one Windows machine.
|
|
305
|
+
- **Live host:** one Windows + Claude Code observation, where a hook-spawned server outlived the host. macOS/Linux hosts and Codex hosts are not live-verified.
|
|
306
|
+
- **Details:** [docs/system-one-routing.md](docs/system-one-routing.md) and [benchmarks/results/system-one/](benchmarks/results/system-one/pre-merge-review-2026-09-23/README.md).
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
280
310
|
## Benchmarks & Testing
|
|
281
311
|
|
|
282
312
|
**If you are an agent asked to verify a Harness install, start at [VERIFICATION.md](VERIFICATION.md), not here.** It separates package/integrity checks, mechanism evidence, live-host evidence, and behavioral evidence so one kind of pass is not mistaken for another.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# System One: async hook pre-score on the resident CPU provider (2026-09-23)
|
|
2
|
+
|
|
3
|
+
Evidence layer: **local real-checkpoint inference through the resident transport**,
|
|
4
|
+
paired against the previous synchronous client. It is not live-host evidence, not
|
|
5
|
+
a reviewed holdout, and not a Harness routing quality claim. Issue
|
|
6
|
+
[#233](https://github.com/dyphn1/Harness-everything/issues/233); previous resident
|
|
7
|
+
run: [cua-s1-forms-resident-cpu-2026-09-23](../cua-s1-forms-resident-cpu-2026-09-23/README.md).
|
|
8
|
+
|
|
9
|
+
## Change under test
|
|
10
|
+
|
|
11
|
+
The hook entry (`tier-router.js` run as a script) now pre-scores over a direct
|
|
12
|
+
async loopback call (`scoreAsync`) and routes with that result. The synchronous
|
|
13
|
+
client starts a worker thread for every call. Decisions, reason mapping and the
|
|
14
|
+
router contract are unchanged; see [docs/system-one-routing.md](../../../../docs/system-one-routing.md).
|
|
15
|
+
|
|
16
|
+
## Setup
|
|
17
|
+
|
|
18
|
+
Same host, venv, pinned `cua-s1` source (`pinned`) and `cua-ai/cua-s1-forms`
|
|
19
|
+
checkpoint as the previous runs: Intel Core Ultra 5 225H, Windows 11 (win32
|
|
20
|
+
10.0.26200 x64), Node v24.18.0, CPython 3.13.6, one torch thread. "main" is
|
|
21
|
+
`f9d70ed`, which uses the synchronous worker bridge.
|
|
22
|
+
|
|
23
|
+
## Evaluator
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
node scripts/evaluate-system-one.js benchmarks/fixtures/system-one-routing.json \
|
|
27
|
+
~/.agents/harness-everything/system-one/manifest.json \
|
|
28
|
+
benchmarks/results/system-one/cua-s1-forms-resident-async-cpu-2026-09-23/report.json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
[`report.json`](report.json) is the unmodified output of this command. The
|
|
32
|
+
server was not running beforehand, so the evaluator started it, waited for
|
|
33
|
+
readiness, and stopped it afterwards. That gives 32 warm samples with p50
|
|
34
|
+
31.5 ms and p95 76.6 ms. `warmLatency` passes, repeatability is 1.0 and
|
|
35
|
+
`sourceProvenance` passes. Decisions are unchanged: 30 are `domain-mismatch`
|
|
36
|
+
and 2 are the over-limit `provider-exit`. Coverage is 0 and `rolloutReady` is false.
|
|
37
|
+
|
|
38
|
+
**A single run does not separate the two clients.** main, run once right
|
|
39
|
+
after this report under the same conditions, also passed (p95 75.9 ms). The
|
|
40
|
+
earlier 108.6 ms was also a single run. So [`paired-latency.json`](paired-latency.json) records
|
|
41
|
+
three alternating rounds against one already-warm server:
|
|
42
|
+
|
|
43
|
+
| Round | main p50 / p95 | branch p50 / p95 |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| 1 | 50.8 / 82.3 ms | 24.6 / 47.6 ms |
|
|
46
|
+
| 2 | 51.4 / 75.9 ms | 26.8 / 51.1 ms |
|
|
47
|
+
| 3 | 58.4 / **116.8** ms | 24.3 / 62.9 ms |
|
|
48
|
+
|
|
49
|
+
main fails the ≤100 ms gate in one of three rounds and the branch in none. The
|
|
50
|
+
branch roughly halves p50. The branch's single worst sample (189.6 ms, round 3)
|
|
51
|
+
shows that outliers remain. Three rounds of 32 samples are a small sample.
|
|
52
|
+
|
|
53
|
+
## Hook entry
|
|
54
|
+
|
|
55
|
+
**Fresh process.** This matches how the hook runs. Each of 20 fresh processes
|
|
56
|
+
loads the modules and scores once.
|
|
57
|
+
|
|
58
|
+
| | module load p50 | one score p50 / p95 |
|
|
59
|
+
| --- | --- | --- |
|
|
60
|
+
| sync | 9 ms | 77.8 / 105.4 ms |
|
|
61
|
+
| async | 9 ms | 35.9 / 67.6 ms |
|
|
62
|
+
|
|
63
|
+
**Wall time.** `kernel-router-core.js "fix a typo in README"` runs for 40
|
|
64
|
+
rounds against a warm server. Each round runs `off`, main `shadow` and branch
|
|
65
|
+
`shadow` in turn. Overhead is paired against `off` in the same round.
|
|
66
|
+
|
|
67
|
+
| | p50 | p95 |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| `off` | 182 ms | 339 ms |
|
|
70
|
+
| main `shadow` overhead | +63 ms | +179 ms |
|
|
71
|
+
| branch `shadow` overhead | **+44 ms** | **+111 ms** |
|
|
72
|
+
|
|
73
|
+
The router plans were identical in all 40 rounds for all three variants, and
|
|
74
|
+
every shadow diagnostic was `domain-mismatch`.
|
|
75
|
+
|
|
76
|
+
## Limitations
|
|
77
|
+
|
|
78
|
+
- These are single-host Windows numbers with high run-to-run variance.
|
|
79
|
+
macOS/Linux and other CPUs are not measured.
|
|
80
|
+
- Most of the remaining ~44 ms hook overhead is first-call cost in a fresh
|
|
81
|
+
process (connect plus a cold client path) on top of server scoring (≈7–12 ms).
|
|
82
|
+
It is not reduced further here.
|
|
83
|
+
- The seed corpus is 16 unreviewed cases, and the forms checkpoint cannot drive
|
|
84
|
+
Harness routing. The `reviewedHoldout`, `coverage`, `acceptedPrecision`,
|
|
85
|
+
`macroF1`, `policyEvidence` and `liveHostEvidence` gates remain unmet.
|
|
86
|
+
- The hook host was not live-tested for this change. Only the CLI entry points
|
|
87
|
+
above were run.
|
package/benchmarks/results/system-one/cua-s1-forms-resident-async-cpu-2026-09-23/paired-latency.json
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"note": "Summaries of unmodified evaluator reports; each round runs main (sync worker bridge, f9d70ed) then this branch (async) against one already-warm resident server.",
|
|
4
|
+
"evaluatorRounds": [
|
|
5
|
+
{
|
|
6
|
+
"main": {
|
|
7
|
+
"p50Ms": 50.8,
|
|
8
|
+
"p95Ms": 82.3,
|
|
9
|
+
"maxMs": 105.8,
|
|
10
|
+
"warmLatencyGate": true,
|
|
11
|
+
"agreement": 1
|
|
12
|
+
},
|
|
13
|
+
"branch": {
|
|
14
|
+
"p50Ms": 24.6,
|
|
15
|
+
"p95Ms": 47.6,
|
|
16
|
+
"maxMs": 50.8,
|
|
17
|
+
"warmLatencyGate": true,
|
|
18
|
+
"agreement": 1
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"main": {
|
|
23
|
+
"p50Ms": 51.4,
|
|
24
|
+
"p95Ms": 75.9,
|
|
25
|
+
"maxMs": 90.5,
|
|
26
|
+
"warmLatencyGate": true,
|
|
27
|
+
"agreement": 1
|
|
28
|
+
},
|
|
29
|
+
"branch": {
|
|
30
|
+
"p50Ms": 26.8,
|
|
31
|
+
"p95Ms": 51.1,
|
|
32
|
+
"maxMs": 52.1,
|
|
33
|
+
"warmLatencyGate": true,
|
|
34
|
+
"agreement": 1
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"main": {
|
|
39
|
+
"p50Ms": 58.4,
|
|
40
|
+
"p95Ms": 116.8,
|
|
41
|
+
"maxMs": 155.7,
|
|
42
|
+
"warmLatencyGate": false,
|
|
43
|
+
"agreement": 1
|
|
44
|
+
},
|
|
45
|
+
"branch": {
|
|
46
|
+
"p50Ms": 24.3,
|
|
47
|
+
"p95Ms": 62.9,
|
|
48
|
+
"maxMs": 189.6,
|
|
49
|
+
"warmLatencyGate": true,
|
|
50
|
+
"agreement": 1
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"freshProcessScore": {
|
|
55
|
+
"runs": 20,
|
|
56
|
+
"sync": {
|
|
57
|
+
"moduleLoadMs": {
|
|
58
|
+
"p50": 9,
|
|
59
|
+
"p95": 23.6
|
|
60
|
+
},
|
|
61
|
+
"scoreMs": {
|
|
62
|
+
"p50": 77.8,
|
|
63
|
+
"p95": 105.4
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"async": {
|
|
67
|
+
"moduleLoadMs": {
|
|
68
|
+
"p50": 9,
|
|
69
|
+
"p95": 22.7
|
|
70
|
+
},
|
|
71
|
+
"scoreMs": {
|
|
72
|
+
"p50": 35.9,
|
|
73
|
+
"p95": 67.6
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"hookWallTime": {
|
|
78
|
+
"rounds": 40,
|
|
79
|
+
"prompt": "fix a typo in README",
|
|
80
|
+
"offMs": {
|
|
81
|
+
"p50": 182,
|
|
82
|
+
"p95": 339
|
|
83
|
+
},
|
|
84
|
+
"mainShadowMs": {
|
|
85
|
+
"p50": 236,
|
|
86
|
+
"p95": 343
|
|
87
|
+
},
|
|
88
|
+
"branchShadowMs": {
|
|
89
|
+
"p50": 224,
|
|
90
|
+
"p95": 311
|
|
91
|
+
},
|
|
92
|
+
"pairedOverheadVsOffMs": {
|
|
93
|
+
"main": {
|
|
94
|
+
"p50": 63,
|
|
95
|
+
"p95": 179
|
|
96
|
+
},
|
|
97
|
+
"branch": {
|
|
98
|
+
"p50": 44,
|
|
99
|
+
"p95": 111
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"identicalPlans": 40,
|
|
103
|
+
"shadowReasons": {
|
|
104
|
+
"domain-mismatch": 80
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|