mindoodb 0.0.4 → 0.0.6
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-server.md +34 -5
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +9 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +226 -130
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +12 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +192 -10
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +3 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +26 -4
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +6 -3
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +79 -10
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -1
- package/dist/core/BaseMindooDB.d.ts +5 -0
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +223 -108
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +1 -0
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +69 -21
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/MindooDBServerAdmin.d.ts +3 -0
- package/dist/core/MindooDBServerAdmin.d.ts.map +1 -1
- package/dist/core/MindooDBServerAdmin.js +57 -1
- package/dist/core/MindooDBServerAdmin.js.map +1 -1
- package/dist/core/appendonlystores/AttachmentReadPlanner.d.ts +22 -0
- package/dist/core/appendonlystores/AttachmentReadPlanner.d.ts.map +1 -0
- package/dist/core/appendonlystores/AttachmentReadPlanner.js +124 -0
- package/dist/core/appendonlystores/AttachmentReadPlanner.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +8 -4
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +22 -9
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/MaterializationPlanner.d.ts +35 -0
- package/dist/core/appendonlystores/MaterializationPlanner.d.ts.map +1 -1
- package/dist/core/appendonlystores/MaterializationPlanner.js +1 -0
- package/dist/core/appendonlystores/MaterializationPlanner.js.map +1 -1
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +19 -1
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +33 -0
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.js +2 -0
- package/dist/core/appendonlystores/network/types.js.map +1 -1
- package/dist/core/appendonlystores/types.d.ts +91 -3
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/types.d.ts +37 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +28 -7
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +115 -17
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts +7 -0
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +232 -16
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/TenantManager.d.ts +17 -2
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +142 -20
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/types.d.ts +9 -4
- package/dist/node/server/types.d.ts.map +1 -1
- package/dist/node/server/types.js.map +1 -1
- package/package.json +2 -1
package/README-server.md
CHANGED
|
@@ -16,7 +16,7 @@ A Node.js/Express server implementing the MindooDB sync API with:
|
|
|
16
16
|
|
|
17
17
|
## Quick Start
|
|
18
18
|
|
|
19
|
-
The fastest way to get a server running is the interactive setup script. It prompts for a server name
|
|
19
|
+
The fastest way to get a server running is the interactive setup script. It prompts for the data directory first, detects whether this is a fresh setup or an existing deployment, and then asks only for the values needed for the chosen path (for example server name and password for fresh setup, or just bind settings for safe update). It then builds the Docker image and initialises the server identity when needed (including optional system admin creation):
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
# 1. Clone and enter the repo
|
|
@@ -38,6 +38,18 @@ The setup script:
|
|
|
38
38
|
- initialises the server identity and optionally creates a system admin keypair interactively
|
|
39
39
|
- writes a `docker-compose.override.yml` with your current host uid/gid, bind mounts, and one or more published port bindings based on your chosen bind address
|
|
40
40
|
|
|
41
|
+
For an existing deployment, use one of these update paths instead of reinitialising blindly:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Safe interactive update for an existing server
|
|
45
|
+
bash serversetup.sh --update
|
|
46
|
+
|
|
47
|
+
# Or rebuild the image and restart without touching setup files
|
|
48
|
+
docker compose up -d --build
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`bash serversetup.sh --update` preserves the existing `server.identity.json`, `server.keybag`, `config.json`, tenant data, `trusted-servers.json`, and `.server_unlock`, while still rebuilding the Docker image and regenerating `docker-compose.override.yml`. Before the override is rewritten, the script now saves the previous file as `docker-compose.override.<timestamp>.yml`.
|
|
52
|
+
|
|
41
53
|
After setup, manage the server with:
|
|
42
54
|
|
|
43
55
|
```bash
|
|
@@ -47,6 +59,14 @@ docker compose logs -f # follow logs
|
|
|
47
59
|
docker compose up -d --build # rebuild image and restart
|
|
48
60
|
```
|
|
49
61
|
|
|
62
|
+
When rerunning `bash serversetup.sh` without `--update`, the script now detects an existing `server.identity.json` and offers three choices:
|
|
63
|
+
|
|
64
|
+
- safe update (preserve identity, keybag, config, tenant data, and password file)
|
|
65
|
+
- overwrite identity (destructive re-init)
|
|
66
|
+
- abort
|
|
67
|
+
|
|
68
|
+
Only choose overwrite if you intentionally want to replace the server identity and reinitialise the deployment.
|
|
69
|
+
|
|
50
70
|
For identity utilities on a Docker-deployed server, use the wrapper script from the repository root:
|
|
51
71
|
|
|
52
72
|
```bash
|
|
@@ -626,7 +646,7 @@ Generated by `npm run server:init`. Contains a `PrivateUserId` with encrypted pr
|
|
|
626
646
|
| `MINDOODB_SERVER_PASSWORD` | If `server.identity.json` exists and `MINDOODB_SERVER_PASSWORD_FILE` is unset | Password to decrypt server identity and per-tenant keybags |
|
|
627
647
|
| `MINDOODB_SERVER_PASSWORD_FILE` | No | Path to a file whose contents are the server password (trimmed). If set, **used instead of** `MINDOODB_SERVER_PASSWORD`. Prefer for Docker: env only holds the path, not the secret. |
|
|
628
648
|
| `MINDOODB_SYSTEM_ADMIN_PASSWORD` | No | For `server:add-to-network`: password for `--identity` (if not using `--password-file` or interactive prompt). May be visible in `ps` on shared hosts. |
|
|
629
|
-
| `MINDOODB_CORS_ORIGIN` | No | Allowed CORS origin (e.g., `https://app.example.com`). If not set, CORS is disabled. |
|
|
649
|
+
| `MINDOODB_CORS_ORIGIN` | No | Allowed CORS origin or comma-separated allowlist (e.g., `https://app.example.com` or `http://localhost:4174,https://otherserver.com`). If not set, CORS is disabled. |
|
|
630
650
|
| `MINDOODB_ADMIN_ALLOWED_IPS` | No | Optional comma-separated client IPs/CIDRs allowed to call **`/system/*`** (all system admin routes, including `/system/auth/*`). If unset or `*`, any source IP may reach `/system/*` (JWT + `config.json` capabilities still apply). Example: `127.0.0.1,::1,172.23.248.0/24,2001:db8::/32`. Behind a reverse proxy, configure Express `trust proxy` so `req.ip` is the real client. |
|
|
631
651
|
|
|
632
652
|
> **Note:** The old `MINDOODB_ADMIN_API_KEY` variable has been removed. System admin **authorization** is enforced by `config.json` capabilities and JWTs. **`MINDOODB_ADMIN_ALLOWED_IPS`** is an optional **network** layer for `/system/*` only. See [Server Security](docs/server-security.md).
|
|
@@ -771,10 +791,12 @@ The **`curl`** examples in this document use **`$SYSTEM_ADMIN_JWT`** as a placeh
|
|
|
771
791
|
| `POST` | `/:tenantId/sync/findNewEntries` | Find entries we don't have |
|
|
772
792
|
| `POST` | `/:tenantId/sync/findNewEntriesForDoc` | Find entries for specific document |
|
|
773
793
|
| `POST` | `/:tenantId/sync/getEntries` | Get specific entries |
|
|
794
|
+
| `POST` | `/:tenantId/sync/getEntryMetadata` | Get metadata for a single entry |
|
|
774
795
|
| `POST` | `/:tenantId/sync/putEntries` | Push entries to server |
|
|
775
796
|
| `POST` | `/:tenantId/sync/hasEntries` | Check which entry IDs exist |
|
|
776
797
|
| `GET` | `/:tenantId/sync/getAllIds` | Get all entry IDs |
|
|
777
798
|
| `POST` | `/:tenantId/sync/resolveDependencies` | Resolve dependency chain |
|
|
799
|
+
| `POST` | `/:tenantId/sync/planAttachmentReadByWalkingMetadata` | Build an attachment read plan on the server |
|
|
778
800
|
| `POST` | `/:tenantId/sync/findEntries` | Find entries by type/date |
|
|
779
801
|
| `POST` | `/:tenantId/sync/scanEntriesSince` | Cursor-based entry scanning |
|
|
780
802
|
| `POST` | `/:tenantId/sync/getIdBloomSummary` | Get Bloom filter summary |
|
|
@@ -794,7 +816,7 @@ The server includes the following hardening measures:
|
|
|
794
816
|
- **Input validation** -- all identifiers (tenantId, dbId, serverName) are validated to prevent path traversal. Only lowercase alphanumeric characters and hyphens are allowed, max 64 characters. Tenant IDs that collide with server route prefixes (`admin`, `health`, `statics`) are rejected as reserved names.
|
|
795
817
|
- **Rate limiting** -- tiered per-IP rate limits: auth endpoints (20/min), admin endpoints (30/min), sync endpoints (200/min), global fallback (500/min). Returns `429 Too Many Requests` when exceeded.
|
|
796
818
|
- **Security headers** -- `helmet` middleware sets X-Content-Type-Options, X-Frame-Options, Content-Security-Policy, Strict-Transport-Security, and others.
|
|
797
|
-
- **CORS** -- disabled by default. Set `MINDOODB_CORS_ORIGIN` to allow
|
|
819
|
+
- **CORS** -- disabled by default. Set `MINDOODB_CORS_ORIGIN` to allow one specific origin or a comma-separated allowlist of origins.
|
|
798
820
|
- **Constant-time key comparison** -- tenant creation API keys are compared using `crypto.timingSafeEqual()` where applicable.
|
|
799
821
|
- **Error sanitization** -- internal errors never leak file paths or stack traces to clients. Only known auth/validation errors return specific messages.
|
|
800
822
|
- **Request size limits** -- JSON body limited to 5MB. Array sizes capped (100k IDs, 10k entries for putEntries).
|
|
@@ -902,7 +924,7 @@ Available DNS plugins include Cloudflare, Route53, Google Cloud DNS, DigitalOcea
|
|
|
902
924
|
|
|
903
925
|
The server ships with a multi-stage `Dockerfile` under `src/node/server/` that produces a minimal Alpine-based image. The build context must be the **repository root** so the library and server compile together.
|
|
904
926
|
|
|
905
|
-
**Recommended:** use `bash serversetup.sh`
|
|
927
|
+
**Recommended:** use `bash serversetup.sh` for first-time setup, and `bash serversetup.sh --update` for safe interactive updates to an existing deployment. The rest of this section covers manual Docker commands for advanced use cases.
|
|
906
928
|
|
|
907
929
|
### docker-compose.yml
|
|
908
930
|
|
|
@@ -913,6 +935,8 @@ The generated override also contains the published port bindings. This supports
|
|
|
913
935
|
- bind a single specific IP (for example a VPN address)
|
|
914
936
|
- bind both `127.0.0.1` and one specific extra IP
|
|
915
937
|
|
|
938
|
+
If you only changed application code and do not need to adjust ports or bind addresses, `docker compose up -d --build` is usually enough.
|
|
939
|
+
|
|
916
940
|
### Manual Docker commands (without serversetup.sh)
|
|
917
941
|
|
|
918
942
|
If you prefer not to use the setup script, here are the individual steps:
|
|
@@ -947,10 +971,12 @@ On SELinux hosts, append `:Z` to the `/data` bind mount and `,Z` to the read-onl
|
|
|
947
971
|
|
|
948
972
|
### Bind to a specific IP
|
|
949
973
|
|
|
950
|
-
To restrict the server to a specific network interface (e.g. a VPN), rerun `bash serversetup.sh` and provide the bind address when prompted.
|
|
974
|
+
To restrict the server to a specific network interface (e.g. a VPN), rerun `bash serversetup.sh --update` and provide the bind address when prompted. Update mode preserves the existing server identity, keybag, config, tenant data, and password file while regenerating `docker-compose.override.yml`.
|
|
951
975
|
|
|
952
976
|
If you also want local checks from the same host, answer `y` when asked whether to also bind `127.0.0.1`. The generated `docker-compose.override.yml` will then contain both mappings.
|
|
953
977
|
|
|
978
|
+
Avoid the overwrite path unless you intentionally want to replace `server.identity.json`. Replacing the server identity breaks the relationship to server-owned encrypted state such as `server.keybag`, so it should be treated as a destructive reinitialization step, not a normal upgrade.
|
|
979
|
+
|
|
954
980
|
### Additional flags
|
|
955
981
|
|
|
956
982
|
Environment variables and CLI flags can be added to `docker-compose.override.yml`:
|
|
@@ -959,12 +985,15 @@ Environment variables and CLI flags can be added to `docker-compose.override.yml
|
|
|
959
985
|
services:
|
|
960
986
|
mindoodb:
|
|
961
987
|
environment:
|
|
988
|
+
MINDOODB_CORS_ORIGIN: "http://localhost:4174,https://otherserver.com"
|
|
962
989
|
MINDOODB_ADMIN_ALLOWED_IPS: "127.0.0.1,10.0.0.0/8"
|
|
963
990
|
command: ["--port", "8443", "--auto-sync"]
|
|
964
991
|
ports:
|
|
965
992
|
- "0.0.0.0:8443:8443"
|
|
966
993
|
```
|
|
967
994
|
|
|
995
|
+
If `serversetup.sh` needs to regenerate the override later, it first creates a timestamped backup such as `docker-compose.override.20260407-103000.yml` and tells you where to find it so custom settings can be merged forward if needed.
|
|
996
|
+
|
|
968
997
|
### Password handling
|
|
969
998
|
|
|
970
999
|
Prefer **`MINDOODB_SERVER_PASSWORD_FILE`** over **`MINDOODB_SERVER_PASSWORD`** so the plaintext secret is not stored in the process environment block (visible via `docker inspect`, `/proc/<pid>/environ`). The setup script and `docker-compose.yml` use file-based passwords by default. See [Server Security](docs/server-security.md) for details on Docker secrets.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ContentAddressedStore } from "../../core/types";
|
|
2
2
|
import type { StoreEntry, StoreEntryMetadata, StoreEntryType, StoreScanCursor, StoreScanFilters, StoreScanResult, StoreIdBloomSummary, StoreCompactionStatus } from "../../core/types";
|
|
3
|
-
import type { DocumentMaterializationBatchPlan, DocumentMaterializationPlan, MaterializationPlanOptions } from "../../core/appendonlystores/types";
|
|
3
|
+
import type { AttachmentReadPlan, AttachmentReadPlanOptions, DocumentMaterializationBatchPlan, DocumentMaterializationPlan, MaterializationPlanOptions } from "../../core/appendonlystores/types";
|
|
4
4
|
import type { CryptoAdapter } from "../../core/crypto/CryptoAdapter";
|
|
5
5
|
import type { NetworkTransport } from "../../core/appendonlystores/network/NetworkTransport";
|
|
6
6
|
import type { NetworkSyncCapabilities } from "../../core/appendonlystores/network/types";
|
|
@@ -29,6 +29,7 @@ export declare class ClientNetworkContentAddressedStore implements ContentAddres
|
|
|
29
29
|
private cryptoAdapter;
|
|
30
30
|
private accessToken;
|
|
31
31
|
private tokenExpiry;
|
|
32
|
+
private authenticationPromise;
|
|
32
33
|
private logger;
|
|
33
34
|
private capabilitiesCache;
|
|
34
35
|
private syncAuthOverride;
|
|
@@ -58,6 +59,8 @@ export declare class ClientNetworkContentAddressedStore implements ContentAddres
|
|
|
58
59
|
* @returns The entries with decrypted payloads
|
|
59
60
|
*/
|
|
60
61
|
getEntries(ids: string[]): Promise<StoreEntry[]>;
|
|
62
|
+
getEntryMetadata(id: string): Promise<StoreEntryMetadata | null>;
|
|
63
|
+
planAttachmentReadByWalkingMetadata(lastChunkId: string, attachmentSize: number, options: AttachmentReadPlanOptions): Promise<AttachmentReadPlan>;
|
|
61
64
|
/**
|
|
62
65
|
* Check which IDs exist in the remote store.
|
|
63
66
|
*
|
|
@@ -80,6 +83,7 @@ export declare class ClientNetworkContentAddressedStore implements ContentAddres
|
|
|
80
83
|
* Find entries by type and creation date range from the remote store.
|
|
81
84
|
*/
|
|
82
85
|
findEntries(type: StoreEntryType, creationDateFrom: number | null, creationDateUntil: number | null): Promise<StoreEntryMetadata[]>;
|
|
86
|
+
private supportsReceiptOrderCursorProtocol;
|
|
83
87
|
/**
|
|
84
88
|
* Get all entry IDs from the remote store.
|
|
85
89
|
* Used for synchronization to identify which entries the remote has.
|
|
@@ -115,6 +119,7 @@ export declare class ClientNetworkContentAddressedStore implements ContentAddres
|
|
|
115
119
|
* Ensure we have a valid access token, authenticating if necessary.
|
|
116
120
|
*/
|
|
117
121
|
private ensureAuthenticated;
|
|
122
|
+
private performAuthentication;
|
|
118
123
|
/**
|
|
119
124
|
* Sign a challenge with the user's private signing key.
|
|
120
125
|
*/
|
|
@@ -130,6 +135,9 @@ export declare class ClientNetworkContentAddressedStore implements ContentAddres
|
|
|
130
135
|
* Call this if you need to force re-authentication.
|
|
131
136
|
*/
|
|
132
137
|
clearAuthCache(): void;
|
|
138
|
+
private refreshAuthentication;
|
|
139
|
+
private isInvalidTokenError;
|
|
140
|
+
private withTransparentReauth;
|
|
133
141
|
/**
|
|
134
142
|
* Set or clear a temporary per-sync authentication override.
|
|
135
143
|
* Intended for bootstrap scenarios (for example authenticating as admin).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientNetworkContentAddressedStore.d.ts","sourceRoot":"","sources":["../../../src/appendonlystores/network/ClientNetworkContentAddressedStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,gCAAgC,EAChC,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sDAAsD,CAAC;AAC7F,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,2CAA2C,CAAC;AAGnD,OAAO,EAAE,MAAM,EAAoC,MAAM,oBAAoB,CAAC;AAG9E;;;;;;;;;;;;;GAaG;AACH,qBAAa,kCAAmC,YAAW,qBAAqB;IAC9E,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,aAAa,CAAgB;IAGrC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,gBAAgB,CAIR;IAEhB;;;;;;;;;;OAUG;gBAED,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,EACrB,oBAAoB,EAAE,SAAS,GAAG,MAAM,EACxC,MAAM,CAAC,EAAE,MAAM;IAejB,KAAK,IAAI,MAAM;IAIf,gBAAgB,IAAI,MAAM;IAK1B;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD;;;;;OAKG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ClientNetworkContentAddressedStore.d.ts","sourceRoot":"","sources":["../../../src/appendonlystores/network/ClientNetworkContentAddressedStore.ts"],"names":[],"mappings":"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"}
|