@numairbaseer/scifcode 0.1.6 → 0.3.0
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/README.md +78 -28
- package/bin/scifcode.js +1 -1
- package/package.json +4 -3
- package/sbom/SHA256SUMS +1 -0
- package/sbom/SHA256SUMS.sigstore.json +1 -0
- package/sbom/scifcode-0.3.0-all-platforms.cdx.json +677 -0
- package/src/cli.js +75 -14
- package/src/code-usage.js +86 -0
- package/src/constants.js +28 -5
- package/src/control-plane-auth.js +143 -0
- package/src/ensure-scifcode-config.js +12 -11
- package/src/paths.js +1 -0
- package/src/run-runtime.js +48 -10
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Scifcode is the user-facing configuration wrapper for the Scifcode coding agent powered by Poolside Laguna.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
It installs one global `scifcode` command, configures the Scifcode runtime to use Laguna, and launches the coding agent with Scifcode defaults.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -21,23 +21,68 @@ Supported runtime packages cover:
|
|
|
21
21
|
- Windows: arm64 and x64
|
|
22
22
|
- baseline x64 builds for CPUs without AVX2
|
|
23
23
|
|
|
24
|
-
##
|
|
24
|
+
## Offline install and update
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
Each `v*` GitHub release includes platform archives containing a standalone
|
|
27
|
+
`scifcode` launcher and its pinned `scifcode-runtime`. The target machine does
|
|
28
|
+
not need Node.js, Bun, npm, or network access.
|
|
29
|
+
|
|
30
|
+
Transfer the archive, the versioned offline `SHA256SUMS` file, and its
|
|
31
|
+
`.sigstore.json` bundle through the approved media process. Verify the signed
|
|
32
|
+
checksum manifest and the archive, then extract it and run the included
|
|
33
|
+
installer:
|
|
28
34
|
|
|
29
35
|
```bash
|
|
30
|
-
|
|
36
|
+
cosign verify-blob scifcode-0.3.0-offline-SHA256SUMS \
|
|
37
|
+
--bundle scifcode-0.3.0-offline-SHA256SUMS.sigstore.json \
|
|
38
|
+
--certificate-identity \
|
|
39
|
+
https://github.com/numairbaseer/scifcode/.github/workflows/release-cli.yml@refs/tags/v0.3.0 \
|
|
40
|
+
--certificate-oidc-issuer https://token.actions.githubusercontent.com
|
|
41
|
+
sha256sum -c scifcode-0.3.0-offline-SHA256SUMS
|
|
42
|
+
tar -xzf scifcode-0.3.0-linux-x64-baseline.tar.gz
|
|
43
|
+
cd scifcode-0.3.0-linux-x64-baseline
|
|
44
|
+
./install.sh
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
On Windows, extract the archive and run:
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
.\install.ps1
|
|
31
51
|
```
|
|
32
52
|
|
|
33
|
-
|
|
53
|
+
Installing a newer archive performs an offline update. Versions are retained
|
|
54
|
+
under the installation root so an administrator can restore an earlier
|
|
55
|
+
version. Unix installs default to `~/.local/share/scifcode`; Windows installs
|
|
56
|
+
default to `%LOCALAPPDATA%\Programs\Scifcode`.
|
|
57
|
+
|
|
58
|
+
The release workflow signs every offline archive and the release-level
|
|
59
|
+
checksum manifest with a keyless Sigstore certificate tied to the tagged
|
|
60
|
+
GitHub Actions workflow. It verifies every signature before publishing the
|
|
61
|
+
release assets; no long-lived signing key is required.
|
|
62
|
+
|
|
63
|
+
Publish the matching `runtime-vX.Y.Z` runtime release before tagging the CLI as
|
|
64
|
+
`vX.Y.Z`. The CLI workflow downloads the exact platform runtime package pinned
|
|
65
|
+
in `package.json`, compiles the launcher, and attaches the completed offline
|
|
66
|
+
archives to the CLI release.
|
|
67
|
+
|
|
68
|
+
## Log in
|
|
69
|
+
|
|
70
|
+
Authenticate once through the Scifcode control-plane portal. The CLI opens a
|
|
71
|
+
short-lived authorization page and receives its own revocable session after you
|
|
72
|
+
approve it:
|
|
34
73
|
|
|
35
74
|
```bash
|
|
36
|
-
|
|
75
|
+
scifcode login
|
|
37
76
|
```
|
|
38
77
|
|
|
39
|
-
|
|
40
|
-
|
|
78
|
+
The session is stored at `~/.scifcode/session.json` with owner-only permissions.
|
|
79
|
+
Scifcode uses it only to authenticate with the control plane; upstream model
|
|
80
|
+
URLs and credentials remain server-side.
|
|
81
|
+
|
|
82
|
+
The control plane defaults to `http://localhost:8080` for local development.
|
|
83
|
+
Self-hosted customers pass their URL once with
|
|
84
|
+
`scifcode login --control-plane https://scifcode.customer.example`; the URL is
|
|
85
|
+
stored with the session and reused. Non-local control planes must use HTTPS.
|
|
41
86
|
|
|
42
87
|
## Run
|
|
43
88
|
|
|
@@ -64,9 +109,10 @@ This happens before the runtime launches, so no separate initialization command
|
|
|
64
109
|
|
|
65
110
|
| Variable | Required | Default | Description |
|
|
66
111
|
| --- | ---: | --- | --- |
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
| `
|
|
112
|
+
| `SCIFCODE_CONTROL_PLANE_URL` | no | `http://localhost:8080` | Alternative to `login --control-plane`; useful for managed installation and automation |
|
|
113
|
+
| `SCIFCODE_SESSION_TOKEN` | no | stored login session | Ephemeral process override for the control-plane session |
|
|
114
|
+
| `SCIFCODE_CONTEXT_WINDOW` | no | `32768` | Context window reported for `scifcoder-1.0` |
|
|
115
|
+
| `SCIFCODE_MAX_TOKENS` | no | `8192` | Maximum output tokens reported for `scifcoder-1.0` |
|
|
70
116
|
| `SCIFCODE_RUNTIME_BIN` | no | installed platform package | Override path to a compiled Scifcode runtime binary |
|
|
71
117
|
| `SCIFCODE_SOURCE_DIR` | no | adjacent `../scifcode` | Development-only path to the Scifcode source fork |
|
|
72
118
|
| `SCIFCODE_BUN_BIN` | no | auto-detected | Development-only Bun executable used to run the fork from source |
|
|
@@ -78,23 +124,25 @@ Scifcode also loads private env defaults from:
|
|
|
78
124
|
./.scifcode.env
|
|
79
125
|
```
|
|
80
126
|
|
|
81
|
-
Shell environment variables win over these files.
|
|
82
|
-
|
|
127
|
+
Shell environment variables win over these files. Do not put session tokens in
|
|
128
|
+
project env files or commit them to source control.
|
|
83
129
|
|
|
84
130
|
## Troubleshooting
|
|
85
131
|
|
|
86
|
-
### `Scifcode requires
|
|
132
|
+
### `Scifcode requires a control-plane session`
|
|
87
133
|
|
|
88
|
-
|
|
134
|
+
Log in through the browser. If you already have a portal session, you only need
|
|
135
|
+
to approve the CLI. Otherwise, complete the portal's email verification first:
|
|
89
136
|
|
|
90
137
|
```bash
|
|
91
|
-
|
|
138
|
+
scifcode login
|
|
92
139
|
```
|
|
93
140
|
|
|
94
|
-
|
|
141
|
+
Inspect or revoke the current session with:
|
|
95
142
|
|
|
96
143
|
```bash
|
|
97
|
-
scifcode
|
|
144
|
+
scifcode whoami
|
|
145
|
+
scifcode logout
|
|
98
146
|
```
|
|
99
147
|
|
|
100
148
|
### Invalid Scifcode config
|
|
@@ -111,22 +159,24 @@ If this file contains invalid JSON, fix it or move it aside and rerun:
|
|
|
111
159
|
scifcode
|
|
112
160
|
```
|
|
113
161
|
|
|
114
|
-
### Modal A100 endpoint
|
|
115
|
-
|
|
116
|
-
Scifcode can also point at an OpenAI Chat Completions-compatible endpoint
|
|
117
|
-
served from Modal. See `docs/modal-a100.md` for a Laguna XS.2 vLLM scaffold.
|
|
118
|
-
|
|
119
162
|
## Security
|
|
120
163
|
|
|
121
|
-
Scifcode
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
164
|
+
Scifcode never receives the upstream model credential. The control plane owns
|
|
165
|
+
the model endpoint, model-ID translation, and upstream authentication. The CLI
|
|
166
|
+
stores only a revocable user session token in an owner-readable file and injects
|
|
167
|
+
it into the runtime through `SCIFCODE_SESSION_TOKEN`.
|
|
125
168
|
|
|
126
169
|
Scifcode launches the installed platform runtime directly with argument arrays
|
|
127
170
|
and does not use shell string execution. Bun/source execution remains available
|
|
128
171
|
only as a local-development fallback.
|
|
129
172
|
|
|
173
|
+
For usage analytics, Scifcode snapshots the Git working tree when an agent
|
|
174
|
+
session starts and reports the aggregate number of added and deleted lines when
|
|
175
|
+
the session ends. The snapshot uses an isolated temporary Git index, so staged,
|
|
176
|
+
unstaged, and untracked work that existed before the session is preserved and
|
|
177
|
+
excluded from the count. Source code and file names are never sent to the
|
|
178
|
+
control plane.
|
|
179
|
+
|
|
130
180
|
## Third-party notices
|
|
131
181
|
|
|
132
182
|
Scifcode uses third-party open-source software internally. See `THIRD_PARTY_NOTICES.md`.
|
package/bin/scifcode.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@numairbaseer/scifcode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Scifcode: a coding CLI agent powered by Poolside Laguna.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -18,17 +18,18 @@
|
|
|
18
18
|
"bin",
|
|
19
19
|
"src",
|
|
20
20
|
"assets",
|
|
21
|
+
"sbom",
|
|
21
22
|
"README.md",
|
|
22
23
|
"LICENSE",
|
|
23
24
|
"THIRD_PARTY_NOTICES.md"
|
|
24
25
|
],
|
|
25
26
|
"scripts": {
|
|
26
27
|
"test": "node --test",
|
|
27
|
-
"lint": "node --check bin/scifcode.js && node --check src/cli.js && node --check src/constants.js && node --check src/env-config.js && node --check src/ensure-scifcode-config.js && node --check src/paths.js && node --check src/run-runtime.js",
|
|
28
|
+
"lint": "node --check bin/scifcode.js && node --check src/cli.js && node --check src/code-usage.js && node --check src/constants.js && node --check src/control-plane-auth.js && node --check src/env-config.js && node --check src/ensure-scifcode-config.js && node --check src/paths.js && node --check src/run-runtime.js",
|
|
28
29
|
"prepack": "npm test && npm run lint"
|
|
29
30
|
},
|
|
30
31
|
"dependencies": {
|
|
31
|
-
"@numairbaseer/scifcode-runtime": "0.
|
|
32
|
+
"@numairbaseer/scifcode-runtime": "0.3.0"
|
|
32
33
|
},
|
|
33
34
|
"engines": {
|
|
34
35
|
"node": ">=22.19.0"
|
package/sbom/SHA256SUMS
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0cffa66b37db6ac57f8674c4333a7d7538f1fa8c1290073b53f5daaf5e45bc78 scifcode-0.3.0-all-platforms.cdx.json
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"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"},"tlogEntries":[{"logIndex":"2670340931","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1788228290","inclusionPromise":{"signedEntryTimestamp":"MEYCIQCNThOoX9+RP8aK+xIGZCAig0S90RsmalBfsMzZ9xtLuAIhALwurxlXxal0mHGdmIi4VXbddgFPwPkStcaOrMQGZfFF"},"inclusionProof":{"logIndex":"2548436669","rootHash":"YoAnB5VLJUYhx8XLqMqhUBIj2NCaSWnDxbCJW0WMcwA=","treeSize":"2548436688","hashes":["MHpRHAfk9ew2epuavTPtp55QwT/aYkHD4O+1VMyhekY=","uEK78hAhOJYtxzGucUdhvLIcru8aTSgt2Pvr/ocsOPo=","WKMTJCh9xSA0JlvsC2pkxsROsyTLrXOkTFJRxhF/Ml4=","xCEM/MXK/TMOydPcTPTi3HN1C/k22ZuniihkVskaoGk=","VIGKZ4THxvJ0K+6Jzw75JVxxUWl+mDau2BjSC/yRjg8=","fwEheFWEE6If6/2zr00OBc47rcn5x7UK5o/iY2kgDbY=","Dg3J/nrjcbfDFZ95U3E2k+MigcpD0rTYzyIIUzvmKxg=","DfYNZ8ZruiXAOuQwlMedsYnaK8/QftEZ+XdioF06AkI=","yxm1n7WV1D9Ocx/PAatNvrH4sPbKRT7G2fC1Tk/KuI0=","iDGA2apU6OrdVY64HuuevCjq1OLTD0dTNjzpAHUzjIE=","teOA0aoFI4b4vp2Yey4S54m0vCXTtmwt4iFnHHiCKNg=","p07sZPiNhS3OKedAe6eZnpNiY4alN/6vFHSwmzD+XeM=","0x+NthETNYNp/FuWTune0hSsB75R/jw5TVMLuguVBt0=","xyOt2GKNFZJCSWNl1S4wKoCid/PFKOYR1XcNE/ZPkJ8=","zY/PhpISrIBFRZyHncbk1o+GE9n0L8P+0JwBnaBs+FM=","88k9bhVfFtycpvkQKEbIw1Ql9DnXkT/cvWFa/NEgXeQ=","fABv5KbTDQGTSJg+5k8zHZQKwnOUQHo6srePRzgEpf8=","ddECIA46kQzLbMwjR1L9WCHUWrsqVGYIgRiw6XlG1xs=","0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=","SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2548436688\nYoAnB5VLJUYhx8XLqMqhUBIj2NCaSWnDxbCJW0WMcwA=\n\n— rekor.sigstore.dev wNI9ajBEAiB+YTa7sjFBaarIcZvV7b36/lJ0nwj/myPeMUdBCSjhnQIgMuZQ1wTHTz4vCb/hvbTruX7javMh4EvWa754FbK3MvA=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJmNmZhODJkZjE4Zjg3ZGJkOWFlOTY4MWQxMGQxNjI5ZjA5NGE1M2ZiNmMzOWQzNGUyNWMyMWYxMTAxMzQ3OWMzIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURqblppcWF3L1hTS0VoSlEvNmQ2bUJqaEJnTWx2R1piOWhWWWVGdVh0SnJRSWdOazBZUEVMbGRyQ1o3amdjVXpjSmJ5b0RzMURqeVd0RzQrS0lzdGlORUxnPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFNla05EUW5NeVowRjNTVUpCWjBsVlRuSTBhRmRJYnpaVUwyUkRjRkF4TkhBdlVDOVdia3RWUkdSWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUVhoTlJFbDNUa1JSTlZkb1kwNU5hbGwzVDFSQmVFMUVTWGhPUkZFMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZpWW5aS2IxRlVRMmQ2TUZOa2NEaERTWFJCVFVoR2F6UlVaV3BLUVVKWk9XMUxWWFlLYTBkcmJUaFdZM2d3Tm0xNU1EZERNelFyVUVjeVJ6WTBOVkVyV0d4R01IUjVWMEp1WTJocVFsQnVSMlZCVTFsUll6WlBRMEpsZDNkbloxaHZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZzT1dwSENtZG5NVzVOWTBKUGNsa3ZUemRwU0hkd05tNXdZVGRKZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGUldVUldVakJTUVZGSUwwSkdPSGRZV1ZwaVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERJMU1XSlhSbkJqYlVwb1l6SldiQXBqYVRsNldUSnNiVmt5T1d0YVV6aDFXakpzTUdGSVZtbE1NMlIyWTIxMGJXSkhPVE5qZVRsNVdsZDRiRmxZVG14TVYwNXpZVk0xTldKWGVFRmpiVlp0Q21ONU9UQlpWMlI2VEROWmQweHFUWFZOUkVFMVFtZHZja0puUlVWQldVOHZUVUZGUWtKRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhZS1ltNU5kVm95YkRCaFNGWnBaRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOUWtsSFEybHpSMEZSVVVKbk56aDNRVkZKUlVKSVFqRmpNbWQzVG1kWlN3cExkMWxDUWtGSFJIWjZRVUpCZDFGdlQxZFNhRTlFVFRWTlYxVXlXV3BOZDFwcVZYcGFhbFpxV2tkTk5GcEVaR2xOTWxKb1dXcEdiVmt5UlRSTk1scHRDazVIVFROTmVrRnFRbWR2Y2tKblJVVkJXVTh2VFVGRlJVSkNWbE5hVjNoc1dWaE9iRWxHVGtSVFZWbG5VVEk1YTFwVFFrUlVSV3QzU1hkWlMwdDNXVUlLUWtGSFJIWjZRVUpDVVZGV1ltNVdkRmxYYkhsWmJVWjZXbGRXZVV3elRtcGhWMXBxWWpKU2JFMUNORWREYVhOSFFWRlJRbWMzT0hkQlVWbEZSVWhLYkFwYWJrMTJaRWRHYm1ONU9USk5RelI2VEdwQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacUNtUkhiSFppYmsxMVdqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUhjMGREYVhOSFFWRlJRbWMzT0hkQlVXdEZXRkY0WW1GSVVqQUtZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWpVeFlsZEdjR050U21oak1sWnNZMms1ZWxreWJHMVpNamxyV2xNNGRWb3liREJoU0ZacFRETmtkZ3BqYlhSdFlrYzVNMk41T1hsYVYzaHNXVmhPYkV4WFRuTmhVelUxWWxkNFFXTnRWbTFqZVRrd1dWZGtla3d6V1hkTWFrMTFUVVJCTkVKbmIzSkNaMFZGQ2tGWlR5OU5RVVZMUWtOdlRVdEViR3RaVkdkNlQxUkdiRTV0U1hwTlIxa3hUVEpaTVZreVVtcFBSMUV6V1dwT2ExbFhTWGhhYlU1b1QwUk9iVnBxVW1vS1RucE5kMGhSV1V0TGQxbENRa0ZIUkhaNlFVSkRkMUZRUkVFeGJtRllVbTlrVjBsMFlVYzVlbVJIVm10TlJHZEhRMmx6UjBGUlVVSm5OemgzUVZGM1JRcExaM2R2WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREkxTVdKWFJuQmpiVXBvWXpKV2JHTnBPWHBaTW14dFdUSTVhMXBVUVRSQ1oyOXlDa0puUlVWQldVOHZUVUZGVGtKRGIwMUxSR3hyV1ZSbmVrOVVSbXhPYlVsNlRVZFpNVTB5V1RGWk1sSnFUMGRSTTFscVRtdFpWMGw0V20xT2FFOUVUbTBLV21wU2FrNTZUWGRKUVZsTFMzZFpRa0pCUjBSMmVrRkNSR2RSVTBSQ1FubGFWMXA2VEROU2FGb3pUWFprYWtGMVRYazBkMDFDYjBkRGFYTkhRVkZSUWdwbk56aDNRVkU0UlVSQmQwdE5WRTB3VG1wVk1VMVVWWGxPUkVGMlFtZHZja0puUlVWQldVOHZUVUZGVVVKRFJVMUlNbWd3WkVoQ2VrOXBPSFphTW13d0NtRklWbWxNYlU1MllsTTVkV1JYTVdoaFdFcHBXVmhPYkZwWVNYZEhRVmxMUzNkWlFrSkJSMFIyZWtGQ1JWRlJTMFJCWjNoTmFsa3pUMFJCTWs5RVFuSUtRbWR2Y2tKblJVVkJXVTh2VFVGRlUwSkdNRTFYTW1nd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemwxWkZjeGFHRllTbWxaV0U1c1dsaEpkZ3BqTWs1d1dtMU9kbHBIVlhaTWJXUndaRWRvTVZscE9UTmlNMHB5V20xNGRtUXpUWFpqYlZaeldsZEdlbHBUTVdwaVIydDFaVmN4YzFGSVNteGFiazEyQ21SSFJtNWplVGt5VFVNMGVreHFRWGRQUVZsTFMzZFpRa0pCUjBSMmVrRkNSWGRSY1VSRFp6VmFSMFUwVFhwcmVGcFVXbWxOZWtKdFRsUk9iVTVYVG1zS1dYcG9hMDR5U1hwYVIwWnBUVmRhYWxsVVozcGFiVmt3V1hwamVrMUNVVWREYVhOSFFWRlJRbWMzT0hkQlVsRkZRbWQzUldOSVZucGhSRUpqUW1kdmNncENaMFZGUVZsUEwwMUJSVlpDUlRSTlZFZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZtbE1iVTUyWWxNNWRXUlhNV2hoV0VwcFdWaE9iRnBZU1haak1rNXdDbHB0VG5aYVIxVjJXVmRPTUdGWE9YVmplVGw1WkZjMWVreDZUWHBPUkZsNFRWUlZlRTFFU1hsTU1rWXdaRWRXZEdOSVVucE1la1YzUm5kWlMwdDNXVUlLUWtGSFJIWjZRVUpHWjFGS1JFRmtkMk50YkRKWldGSnNUVUpOUjBOcGMwZEJVVkZDWnpjNGQwRlNZMFZDVVhkRVltNUNkRTFGTkVkRGFYTkhRVkZSUWdwbk56aDNRVkpuUlZGQmR5dGpiVlozWW5wd2RXUlhNV2hoV0VwcFdWaE9iRnBZU2tGTlZFa3lUbnBuZDA1cVozWmpNazV3V20xT2RscEhWa0ZOVkUwd0NrNXFWVEZOVkZWNVRrUndiR0p1V25CamJUbDFZbGRXZFdSRWNIVmpSekIzWjFselIwTnBjMGRCVVZGQ01XNXJRMEpCU1VWbVVWSTNRVWhyUVdSM1JHUUtVRlJDY1hoelkxSk5iVTFhU0doNVdscDZZME52YTNCbGRVNDBPSEptSzBocGJrdEJUSGx1ZFdwblFVRkJZVUpoZEd0U1VVRkJRVVZCZDBKSlRVVlpRd3BKVVVRMlUyTnRWVFZPWmtsRWJGUndUM0YwVDJSTloxRklZVGhyTldVdlFUYzFOMWR1VERsaFdFZEhjbkJCU1doQlRraHBNVVIzWm1kRVVWbHZaVVI0Q2xWQk1IZFNORmRSY0c5cGFGTkZSVEY2VERST2FETmFaWFozTm1WTlFXOUhRME54UjFOTk5EbENRVTFFUVRKblFVMUhWVU5OUnpSb1drbE5ZWGxITlU4S2QxbEVPVGt6VGtZM1ltTkJWV2t4VGk5blFsWlJVRWxOSzNKT2FHOWxValZ0Y1ZNNVNIcDFibHBtUmpSVFJuRnlXamw0VFhGUlNYaEJTelZ5YUZkRFFncG1OREJrT1Zsd1JYQnlZMFpPUkVodEswTXZVWGxGUlZSR2RFRTBZMGgzV0hjNU4zSm5iVWRrVW5ZdmExSk5lVnBuZWxwU1EwUmFPVVZSUFQwS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgIf5OgasegNyGoUrQSdiIVwVr8eSV5+Vx7qj9FUmRgzkCFD9x3QCN1L+z5zonTPlYv4KsRu0tGA8yMDI2MDkwMTAyMDQ0OVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwOTAxMDIwNDQ5WjAvBgkqhkiG9w0BCQQxIgQg2YwWnzGPhehuka8MMdfng0VJn1yOOrSuAB99cMrORJkwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIwAy4JghX669DtMAxHnCcvK0+fbiy+qKeRZFtGoxenFhubOLdOvLpMyygY4Os1Yc0eAjEAsAIqcKWQ/rc8jY0vLBECry1zQLzH5tirL8IymyAFOqIRnXIsKZlh1gT12UEMGJjk"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"9vqC3xj4fb2a6WgdENFinwlKU/tsOdNOJcIfEQE0ecM="},"signature":"MEUCIQDjnZiqaw/XSKEhJQ/6d6mBjhBgMlvGZb9hVYeFuXtJrQIgNk0YPELldrCZ7jgcUzcJbyoDs1DjyWtG4+KIstiNELg="}}
|