diff options
Diffstat (limited to '17.md')
| -rw-r--r-- | 17.md | 115 |
1 files changed, 55 insertions, 60 deletions
| @@ -4,34 +4,40 @@ NIP-17 | |||
| 4 | Private Direct Messages | 4 | Private Direct Messages |
| 5 | ----------------------- | 5 | ----------------------- |
| 6 | 6 | ||
| 7 | `draft` `optional` | 7 | `draft` `optional` `relay` |
| 8 | 8 | ||
| 9 | This NIP defines an encrypted direct messaging scheme using [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps. | 9 | This NIP defines an encrypted chat scheme which uses [NIP-44](44.md) encryption and [NIP-59](59.md) seals and gift wraps. |
| 10 | 10 | ||
| 11 | ## Direct Message Kind | 11 | Any event sent to an encrypted chat MUST NOT be signed, and MUST be encrypted as described in [NIP-59](./59.md) and illustrated below. Omitting signatures makes messages deniable in case they are accidentally or maliciously leaked, while still allowing the recipient to authenticate them. |
| 12 | |||
| 13 | By convention, `kind 14` direct messages, `kind 15` file messages, and [`kind 7` reactions](./25.md) may be sent to an encrypted chat. | ||
| 14 | |||
| 15 | ## Kind Definitions | ||
| 16 | |||
| 17 | ### Chat Message | ||
| 12 | 18 | ||
| 13 | Kind `14` is a chat message. `p` tags identify one or more receivers of the message. | 19 | Kind `14` is a chat message. `p` tags identify one or more receivers of the message. |
| 14 | 20 | ||
| 15 | ```jsonc | 21 | ```jsonc |
| 16 | { | 22 | { |
| 17 | "id": "<usual hash>", | 23 | "id": "<usual hash>", |
| 18 | "pubkey": "<sender-pubkey>", | 24 | "pubkey": "<sender-pubkey>", |
| 19 | "created_at": "<current-time>", | 25 | "created_at": "<current-time>", |
| 20 | "kind": 14, | 26 | "kind": 14, |
| 21 | "tags": [ | 27 | "tags": [ |
| 22 | ["p", "<receiver-1-pubkey>", "<relay-url>"], | 28 | ["p", "<receiver-1-pubkey>", "<relay-url>"], |
| 23 | ["p", "<receiver-2-pubkey>", "<relay-url>"], | 29 | ["p", "<receiver-2-pubkey>", "<relay-url>"], |
| 24 | ["e", "<kind-14-id>", "<relay-url>"] // if this is a reply | 30 | ["e", "<kind-14-id>", "<relay-url>"] // if this is a reply |
| 25 | ["subject", "<conversation-title>"], | 31 | ["subject", "<conversation-title>"], |
| 26 | // rest of tags... | 32 | // rest of tags... |
| 27 | ], | 33 | ], |
| 28 | "content": "<message-in-plain-text>", | 34 | "content": "<message-in-plain-text>", |
| 29 | } | 35 | } |
| 30 | ``` | 36 | ``` |
| 31 | 37 | ||
| 32 | `.content` MUST be plain text. Fields `id` and `created_at` are required. | 38 | `.content` MUST be plain text. Fields `id` and `created_at` are required. |
| 33 | 39 | ||
| 34 | An `e` tag denotes the direct parent message this post is replying to. | 40 | An `e` tag denotes the direct parent message this post is replying to. |
| 35 | 41 | ||
| 36 | `q` tags MAY be used when citing events in the `.content` with [NIP-21](21.md). | 42 | `q` tags MAY be used when citing events in the `.content` with [NIP-21](21.md). |
| 37 | 43 | ||
| @@ -39,9 +45,7 @@ An `e` tag denotes the direct parent message this post is replying to. | |||
| 39 | ["q", "<event-id> or <event-address>", "<relay-url>", "<pubkey-if-a-regular-event>"] | 45 | ["q", "<event-id> or <event-address>", "<relay-url>", "<pubkey-if-a-regular-event>"] |
| 40 | ``` | 46 | ``` |
| 41 | 47 | ||
| 42 | Kind `14`s MUST never be signed. If it is signed, the message might leak to relays and become **fully public**. | 48 | ## File Message |
| 43 | |||
| 44 | ## File Message Kind | ||
| 45 | 49 | ||
| 46 | ```jsonc | 50 | ```jsonc |
| 47 | { | 51 | { |
| @@ -65,21 +69,20 @@ Kind `14`s MUST never be signed. If it is signed, the message might leak to rela | |||
| 65 | } | 69 | } |
| 66 | ``` | 70 | ``` |
| 67 | 71 | ||
| 68 | Kind 15 is used for sending encrypted file event messages: | 72 | Kind `15` is used for sending encrypted file event messages: |
| 69 | 73 | ||
| 70 | - `file-type`: Specifies the MIME type of the attached file (e.g., `image/jpeg`, `audio/mpeg`, etc.). | 74 | - `file-type`: Specifies the MIME type of the attached file (e.g., `image/jpeg`, `audio/mpeg`, etc.) before encryption. |
| 71 | - `encryption-algorithm`: Indicates the encryption algorithm used for encrypting the file. Supported algorithms may include `aes-gcm`, `chacha20-poly1305`,`aes-cbc` etc. | 75 | - `encryption-algorithm`: Indicates the encryption algorithm used for encrypting the file. Supported algorithms: `aes-gcm`. |
| 72 | - `decryption-key`: The decryption key that will be used by the recipient to decrypt the file. | 76 | - `decryption-key`: The decryption key that will be used by the recipient to decrypt the file. |
| 73 | - `decryption-nonce`: The decryption nonce that will be used by the recipient to decrypt the file. | 77 | - `decryption-nonce`: The decryption nonce that will be used by the recipient to decrypt the file. |
| 74 | - `content`: The URL of the file (`<file-url>`). | 78 | - `content`: The URL of the file (`<file-url>`). |
| 75 | - `x` containing the SHA-256 hexencoded string of the file. | 79 | - `x` containing the SHA-256 hexencoded string of the encrypted file. |
| 76 | - `size` (optional) size of file in bytes | 80 | - `ox` containing the SHA-256 hexencoded string of the file before encryption. |
| 77 | - `dim` (optional) size of the file in pixels in the form `<width>x<height>` | 81 | - `size` (optional) size of the encrypted file in bytes |
| 82 | - `dim` (optional) size in pixels in the form `<width>x<height>` | ||
| 78 | - `blurhash`(optional) the [blurhash](https://github.com/woltapp/blurhash) to show while the client is loading the file | 83 | - `blurhash`(optional) the [blurhash](https://github.com/woltapp/blurhash) to show while the client is loading the file |
| 79 | - `thumb` (optional) URL of thumbnail with same aspect ratio (encrypted with the same key, nonce) | 84 | - `thumb` (optional) URL of thumbnail with same aspect ratio (encrypted with the same key, nonce) |
| 80 | - `fallback` (optional) zero or more fallback file sources in case `url` fails | 85 | - `fallback` (optional) zero or more fallback file sources in case `url` fails (encrypted with the same key, nonce) |
| 81 | |||
| 82 | Just like kind 14, kind `15`s MUST never be signed. | ||
| 83 | 86 | ||
| 84 | ## Chat Rooms | 87 | ## Chat Rooms |
| 85 | 88 | ||
| @@ -87,34 +90,34 @@ The set of `pubkey` + `p` tags defines a chat room. If a new `p` tag is added or | |||
| 87 | 90 | ||
| 88 | Clients SHOULD render messages of the same room in a continuous thread. | 91 | Clients SHOULD render messages of the same room in a continuous thread. |
| 89 | 92 | ||
| 90 | An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p`-tags room. There is no need to send `subject` in every message. The newest `subject` in the thread is the subject of the conversation. | 93 | An optional `subject` tag defines the current name/topic of the conversation. Any member can change the topic by simply submitting a new `subject` to an existing `pubkey` + `p` tags room. There is no need to send `subject` in every message. The newest `subject` in the chat room is the subject of the conversation. |
| 91 | 94 | ||
| 92 | ## Encrypting | 95 | ## Encrypting |
| 93 | 96 | ||
| 94 | Following [NIP-59](59.md), the **unsigned** `kind:14` & `kind:15` chat messages must be sealed (`kind:13`) and then gift-wrapped (`kind:1059`) to each receiver and the sender individually. | 97 | Following [NIP-59](59.md), the **unsigned** chat messages must be sealed (`kind:13`) and then gift-wrapped (`kind:1059`) to each receiver and the sender individually. |
| 95 | 98 | ||
| 96 | ```jsonc | 99 | ```js |
| 97 | { | 100 | { |
| 98 | "id": "<usual hash>", | 101 | "id": "<usual hash>", |
| 99 | "pubkey": randomPublicKey, | 102 | "pubkey": randomPublicKey, |
| 100 | "created_at": randomTimeUpTo2DaysInThePast(), | 103 | "created_at": randomTimeUpTo2DaysInThePast(), |
| 101 | "kind": 1059, // gift wrap | 104 | "kind": 1059, // gift wrap |
| 102 | "tags": [ | 105 | "tags": [ |
| 103 | ["p", receiverPublicKey, "<relay-url>"] // receiver | 106 | ["p", receiverPublicKey, "<relay-url>"] // receiver |
| 104 | ], | 107 | ], |
| 105 | "content": nip44Encrypt( | 108 | "content": nip44Encrypt( |
| 106 | { | 109 | { |
| 107 | "id": "<usual hash>", | 110 | "id": "<usual hash>", |
| 108 | "pubkey": senderPublicKey, | 111 | "pubkey": senderPublicKey, |
| 109 | "created_at": randomTimeUpTo2DaysInThePast(), | 112 | "created_at": randomTimeUpTo2DaysInThePast(), |
| 110 | "kind": 13, // seal | 113 | "kind": 13, // seal |
| 111 | "tags": [], // no tags | 114 | "tags": [], // no tags |
| 112 | "content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey), | 115 | "content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey), |
| 113 | "sig": "<signed by senderPrivateKey>" | 116 | "sig": "<signed by senderPrivateKey>" |
| 114 | }, | 117 | }, |
| 115 | randomPrivateKey, receiverPublicKey | 118 | randomPrivateKey, receiverPublicKey |
| 116 | ), | 119 | ), |
| 117 | "sig": "<signed by randomPrivateKey>" | 120 | "sig": "<signed by randomPrivateKey>" |
| 118 | } | 121 | } |
| 119 | ``` | 122 | ``` |
| 120 | 123 | ||
| @@ -124,9 +127,9 @@ Clients MUST verify if pubkey of the `kind:13` is the same pubkey on the `kind:1 | |||
| 124 | 127 | ||
| 125 | Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata. | 128 | Clients SHOULD randomize `created_at` in up to two days in the past in both the seal and the gift wrap to make sure grouping by `created_at` doesn't reveal any metadata. |
| 126 | 129 | ||
| 127 | The gift wrap's `p`-tag can be the receiver's main pubkey or an alias key created to receive DMs without exposing the receiver's identity. | 130 | The gift wrap's `p` tag can be the receiver's main pubkey or an alias key created to receive DMs without exposing the receiver's identity. |
| 128 | 131 | ||
| 129 | Clients CAN offer disappearing messages by setting an `expiration` tag in the gift wrap of each receiver or by not generating a gift wrap to the sender's public key | 132 | Clients MAY offer disappearing messages by setting an `expiration` tag in the gift wrap of each receiver or by not generating a gift wrap to the sender's public key. This tag SHOULD be included on the `kind 13` seal as well, in case it leaks. |
| 130 | 133 | ||
| 131 | ## Publishing | 134 | ## Publishing |
| 132 | 135 | ||
| @@ -144,15 +147,13 @@ Kind `10050` indicates the user's preferred relays to receive DMs. The event MUS | |||
| 144 | } | 147 | } |
| 145 | ``` | 148 | ``` |
| 146 | 149 | ||
| 147 | Clients SHOULD publish kind `14` events to the `10050`-listed relays. If that is not found that indicates the user is not ready to receive messages under this NIP and clients shouldn't try. | 150 | Clients SHOULD publish the gift-wrapped `kind 1059` events that contain the sealed rumors to the relays listed in the recipient’s kind 10050 event. If that is not found that indicates the user is not ready to receive messages under this NIP and clients shouldn't try. |
| 148 | 151 | ||
| 149 | ## Relays | 152 | ## Relays |
| 150 | 153 | ||
| 151 | It's advisable that relays do not serve `kind:1059` to clients other than the ones tagged in them. | 154 | Relays MAY protect message metadata by only serving `kind:1059` events to users p-tagged on the event (enforced using [NIP 42 AUTH](./42.md)). |
| 152 | 155 | ||
| 153 | It's advisable that users choose relays that conform to these practices. | 156 | Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread them to as many relays as viable. |
| 154 | |||
| 155 | Clients SHOULD guide users to keep `kind:10050` lists small (1-3 relays) and SHOULD spread it to as many relays as viable. | ||
| 156 | 157 | ||
| 157 | ## Benefits & Limitations | 158 | ## Benefits & Limitations |
| 158 | 159 | ||
| @@ -169,12 +170,6 @@ This NIP offers the following privacy and security features: | |||
| 169 | 170 | ||
| 170 | The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme. | 171 | The main limitation of this approach is having to send a separate encrypted event to each receiver. Group chats with more than 100 participants should find a more suitable messaging scheme. |
| 171 | 172 | ||
| 172 | ## Implementation | ||
| 173 | |||
| 174 | Clients implementing this NIP should by default only connect to the set of relays found in their `kind:10050` list. From that they should be able to load all messages both sent and received as well as get new live updates, making it for a very simple and lightweight implementation that should be fast. | ||
| 175 | |||
| 176 | When sending a message to anyone, clients must then connect to the relays in the receiver's `kind:10050` and send the events there but can disconnect right after unless more messages are expected to be sent (e.g. the chat tab is still selected). Clients should also send a copy of their outgoing messages to their own `kind:10050` relay set. | ||
| 177 | |||
| 178 | ## Examples | 173 | ## Examples |
| 179 | 174 | ||
| 180 | This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`. | 175 | This example sends the message `Hola, que tal?` from `nsec1w8udu59ydjvedgs3yv5qccshcj8k05fh3l60k9x57asjrqdpa00qkmr89m` to `nsec12ywtkplvyq5t6twdqwwygavp5lm4fhuang89c943nf2z92eez43szvn4dt`. |
| @@ -188,7 +183,7 @@ The two final GiftWraps, one to the receiver and the other to the sender, respec | |||
| 188 | "created_at":1703128320, | 183 | "created_at":1703128320, |
| 189 | "kind":1059, | 184 | "kind":1059, |
| 190 | "tags":[ | 185 | "tags":[ |
| 191 | [ "p", "918e2da906df4ccd12c8ac672d8335add131a4cf9d27ce42b3bb3625755f0788"] | 186 | ["p", "918e2da906df4ccd12c8ac672d8335add131a4cf9d27ce42b3bb3625755f0788"] |
| 192 | ], | 187 | ], |
| 193 | "content":"AsqzdlMsG304G8h08bE67dhAR1gFTzTckUUyuvndZ8LrGCvwI4pgC3d6hyAK0Wo9gtkLqSr2rT2RyHlE5wRqbCOlQ8WvJEKwqwIJwT5PO3l2RxvGCHDbd1b1o40ZgIVwwLCfOWJ86I5upXe8K5AgpxYTOM1BD+SbgI5jOMA8tgpRoitJedVSvBZsmwAxXM7o7sbOON4MXHzOqOZpALpS2zgBDXSAaYAsTdEM4qqFeik+zTk3+L6NYuftGidqVluicwSGS2viYWr5OiJ1zrj1ERhYSGLpQnPKrqDaDi7R1KrHGFGyLgkJveY/45y0rv9aVIw9IWF11u53cf2CP7akACel2WvZdl1htEwFu/v9cFXD06fNVZjfx3OssKM/uHPE9XvZttQboAvP5UoK6lv9o3d+0GM4/3zP+yO3C0NExz1ZgFmbGFz703YJzM+zpKCOXaZyzPjADXp8qBBeVc5lmJqiCL4solZpxA1865yPigPAZcc9acSUlg23J1dptFK4n3Tl5HfSHP+oZ/QS/SHWbVFCtq7ZMQSRxLgEitfglTNz9P1CnpMwmW/Y4Gm5zdkv0JrdUVrn2UO9ARdHlPsW5ARgDmzaxnJypkfoHXNfxGGXWRk0sKLbz/ipnaQP/eFJv/ibNuSfqL6E4BnN/tHJSHYEaTQ/PdrA2i9laG3vJti3kAl5Ih87ct0w/tzYfp4SRPhEF1zzue9G/16eJEMzwmhQ5Ec7jJVcVGa4RltqnuF8unUu3iSRTQ+/MNNUkK6Mk+YuaJJs6Fjw6tRHuWi57SdKKv7GGkr0zlBUU2Dyo1MwpAqzsCcCTeQSv+8qt4wLf4uhU9Br7F/L0ZY9bFgh6iLDCdB+4iABXyZwT7Ufn762195hrSHcU4Okt0Zns9EeiBOFxnmpXEslYkYBpXw70GmymQfJlFOfoEp93QKCMS2DAEVeI51dJV1e+6t3pCSsQN69Vg6jUCsm1TMxSs2VX4BRbq562+VffchvW2BB4gMjsvHVUSRl8i5/ZSDlfzSPXcSGALLHBRzy+gn0oXXJ/447VHYZJDL3Ig8+QW5oFMgnWYhuwI5QSLEyflUrfSz+Pdwn/5eyjybXKJftePBD9Q+8NQ8zulU5sqvsMeIx/bBUx0fmOXsS3vjqCXW5IjkmSUV7q54GewZqTQBlcx+90xh/LSUxXex7UwZwRnifvyCbZ+zwNTHNb12chYeNjMV7kAIr3cGQv8vlOMM8ajyaZ5KVy7HpSXQjz4PGT2/nXbL5jKt8Lx0erGXsSsazkdoYDG3U", | 188 | "content":"AsqzdlMsG304G8h08bE67dhAR1gFTzTckUUyuvndZ8LrGCvwI4pgC3d6hyAK0Wo9gtkLqSr2rT2RyHlE5wRqbCOlQ8WvJEKwqwIJwT5PO3l2RxvGCHDbd1b1o40ZgIVwwLCfOWJ86I5upXe8K5AgpxYTOM1BD+SbgI5jOMA8tgpRoitJedVSvBZsmwAxXM7o7sbOON4MXHzOqOZpALpS2zgBDXSAaYAsTdEM4qqFeik+zTk3+L6NYuftGidqVluicwSGS2viYWr5OiJ1zrj1ERhYSGLpQnPKrqDaDi7R1KrHGFGyLgkJveY/45y0rv9aVIw9IWF11u53cf2CP7akACel2WvZdl1htEwFu/v9cFXD06fNVZjfx3OssKM/uHPE9XvZttQboAvP5UoK6lv9o3d+0GM4/3zP+yO3C0NExz1ZgFmbGFz703YJzM+zpKCOXaZyzPjADXp8qBBeVc5lmJqiCL4solZpxA1865yPigPAZcc9acSUlg23J1dptFK4n3Tl5HfSHP+oZ/QS/SHWbVFCtq7ZMQSRxLgEitfglTNz9P1CnpMwmW/Y4Gm5zdkv0JrdUVrn2UO9ARdHlPsW5ARgDmzaxnJypkfoHXNfxGGXWRk0sKLbz/ipnaQP/eFJv/ibNuSfqL6E4BnN/tHJSHYEaTQ/PdrA2i9laG3vJti3kAl5Ih87ct0w/tzYfp4SRPhEF1zzue9G/16eJEMzwmhQ5Ec7jJVcVGa4RltqnuF8unUu3iSRTQ+/MNNUkK6Mk+YuaJJs6Fjw6tRHuWi57SdKKv7GGkr0zlBUU2Dyo1MwpAqzsCcCTeQSv+8qt4wLf4uhU9Br7F/L0ZY9bFgh6iLDCdB+4iABXyZwT7Ufn762195hrSHcU4Okt0Zns9EeiBOFxnmpXEslYkYBpXw70GmymQfJlFOfoEp93QKCMS2DAEVeI51dJV1e+6t3pCSsQN69Vg6jUCsm1TMxSs2VX4BRbq562+VffchvW2BB4gMjsvHVUSRl8i5/ZSDlfzSPXcSGALLHBRzy+gn0oXXJ/447VHYZJDL3Ig8+QW5oFMgnWYhuwI5QSLEyflUrfSz+Pdwn/5eyjybXKJftePBD9Q+8NQ8zulU5sqvsMeIx/bBUx0fmOXsS3vjqCXW5IjkmSUV7q54GewZqTQBlcx+90xh/LSUxXex7UwZwRnifvyCbZ+zwNTHNb12chYeNjMV7kAIr3cGQv8vlOMM8ajyaZ5KVy7HpSXQjz4PGT2/nXbL5jKt8Lx0erGXsSsazkdoYDG3U", |
| 194 | "sig":"a3c6ce632b145c0869423c1afaff4a6d764a9b64dedaf15f170b944ead67227518a72e455567ca1c2a0d187832cecbde7ed478395ec4c95dd3e71749ed66c480" | 189 | "sig":"a3c6ce632b145c0869423c1afaff4a6d764a9b64dedaf15f170b944ead67227518a72e455567ca1c2a0d187832cecbde7ed478395ec4c95dd3e71749ed66c480" |
| @@ -202,7 +197,7 @@ The two final GiftWraps, one to the receiver and the other to the sender, respec | |||
| 202 | "created_at":1702711587, | 197 | "created_at":1702711587, |
| 203 | "kind":1059, | 198 | "kind":1059, |
| 204 | "tags":[ | 199 | "tags":[ |
| 205 | [ "p", "44900586091b284416a0c001f677f9c49f7639a55c3f1e2ec130a8e1a7998e1b"] | 200 | ["p", "44900586091b284416a0c001f677f9c49f7639a55c3f1e2ec130a8e1a7998e1b"] |
| 206 | ], | 201 | ], |
| 207 | "content":"AsTClTzr0gzXXji7uye5UB6LYrx3HDjWGdkNaBS6BAX9CpHa+Vvtt5oI2xJrmWLen+Fo2NBOFazvl285Gb3HSM82gVycrzx1HUAaQDUG6HI7XBEGqBhQMUNwNMiN2dnilBMFC3Yc8ehCJT/gkbiNKOpwd2rFibMFRMDKai2mq2lBtPJF18oszKOjA+XlOJV8JRbmcAanTbEK5nA/GnG3eGUiUzhiYBoHomj3vztYYxc0QYHOx0WxiHY8dsC6jPsXC7f6k4P+Hv5ZiyTfzvjkSJOckel1lZuE5SfeZ0nduqTlxREGeBJ8amOykgEIKdH2VZBZB+qtOMc7ez9dz4wffGwBDA7912NFS2dPBr6txHNxBUkDZKFbuD5wijvonZDvfWq43tZspO4NutSokZB99uEiRH8NAUdGTiNb25m9JcDhVfdmABqTg5fIwwTwlem5aXIy8b66lmqqz2LBzJtnJDu36bDwkILph3kmvaKPD8qJXmPQ4yGpxIbYSTCohgt2/I0TKJNmqNvSN+IVoUuC7ZOfUV9lOV8Ri0AMfSr2YsdZ9ofV5o82ClZWlWiSWZwy6ypa7CuT1PEGHzywB4CZ5ucpO60Z7hnBQxHLiAQIO/QhiBp1rmrdQZFN6PUEjFDloykoeHe345Yqy9Ke95HIKUCS9yJurD+nZjjgOxZjoFCsB1hQAwINTIS3FbYOibZnQwv8PXvcSOqVZxC9U0+WuagK7IwxzhGZY3vLRrX01oujiRrevB4xbW7Oxi/Agp7CQGlJXCgmRE8Rhm+Vj2s+wc/4VLNZRHDcwtfejogjrjdi8p6nfUyqoQRRPARzRGUnnCbh+LqhigT6gQf3sVilnydMRScEc0/YYNLWnaw9nbyBa7wFBAiGbJwO40k39wj+xT6HTSbSUgFZzopxroO3f/o4+ubx2+IL3fkev22mEN38+dFmYF3zE+hpE7jVxrJpC3EP9PLoFgFPKCuctMnjXmeHoiGs756N5r1Mm1ffZu4H19MSuALJlxQR7VXE/LzxRXDuaB2u9days/6muP6gbGX1ASxbJd/ou8+viHmSC/ioHzNjItVCPaJjDyc6bv+gs1NPCt0qZ69G+JmgHW/PsMMeL4n5bh74g0fJSHqiI9ewEmOG/8bedSREv2XXtKV39STxPweceIOh0k23s3N6+wvuSUAJE7u1LkDo14cobtZ/MCw/QhimYPd1u5HnEJvRhPxz0nVPz0QqL/YQeOkAYk7uzgeb2yPzJ6DBtnTnGDkglekhVzQBFRJdk740LEj6swkJ", | 202 | "content":"AsTClTzr0gzXXji7uye5UB6LYrx3HDjWGdkNaBS6BAX9CpHa+Vvtt5oI2xJrmWLen+Fo2NBOFazvl285Gb3HSM82gVycrzx1HUAaQDUG6HI7XBEGqBhQMUNwNMiN2dnilBMFC3Yc8ehCJT/gkbiNKOpwd2rFibMFRMDKai2mq2lBtPJF18oszKOjA+XlOJV8JRbmcAanTbEK5nA/GnG3eGUiUzhiYBoHomj3vztYYxc0QYHOx0WxiHY8dsC6jPsXC7f6k4P+Hv5ZiyTfzvjkSJOckel1lZuE5SfeZ0nduqTlxREGeBJ8amOykgEIKdH2VZBZB+qtOMc7ez9dz4wffGwBDA7912NFS2dPBr6txHNxBUkDZKFbuD5wijvonZDvfWq43tZspO4NutSokZB99uEiRH8NAUdGTiNb25m9JcDhVfdmABqTg5fIwwTwlem5aXIy8b66lmqqz2LBzJtnJDu36bDwkILph3kmvaKPD8qJXmPQ4yGpxIbYSTCohgt2/I0TKJNmqNvSN+IVoUuC7ZOfUV9lOV8Ri0AMfSr2YsdZ9ofV5o82ClZWlWiSWZwy6ypa7CuT1PEGHzywB4CZ5ucpO60Z7hnBQxHLiAQIO/QhiBp1rmrdQZFN6PUEjFDloykoeHe345Yqy9Ke95HIKUCS9yJurD+nZjjgOxZjoFCsB1hQAwINTIS3FbYOibZnQwv8PXvcSOqVZxC9U0+WuagK7IwxzhGZY3vLRrX01oujiRrevB4xbW7Oxi/Agp7CQGlJXCgmRE8Rhm+Vj2s+wc/4VLNZRHDcwtfejogjrjdi8p6nfUyqoQRRPARzRGUnnCbh+LqhigT6gQf3sVilnydMRScEc0/YYNLWnaw9nbyBa7wFBAiGbJwO40k39wj+xT6HTSbSUgFZzopxroO3f/o4+ubx2+IL3fkev22mEN38+dFmYF3zE+hpE7jVxrJpC3EP9PLoFgFPKCuctMnjXmeHoiGs756N5r1Mm1ffZu4H19MSuALJlxQR7VXE/LzxRXDuaB2u9days/6muP6gbGX1ASxbJd/ou8+viHmSC/ioHzNjItVCPaJjDyc6bv+gs1NPCt0qZ69G+JmgHW/PsMMeL4n5bh74g0fJSHqiI9ewEmOG/8bedSREv2XXtKV39STxPweceIOh0k23s3N6+wvuSUAJE7u1LkDo14cobtZ/MCw/QhimYPd1u5HnEJvRhPxz0nVPz0QqL/YQeOkAYk7uzgeb2yPzJ6DBtnTnGDkglekhVzQBFRJdk740LEj6swkJ", |
| 208 | "sig":"c94e74533b482aa8eeeb54ae72a5303e0b21f62909ca43c8ef06b0357412d6f8a92f96e1a205102753777fd25321a58fba3fb384eee114bd53ce6c06a1c22bab" | 203 | "sig":"c94e74533b482aa8eeeb54ae72a5303e0b21f62909ca43c8ef06b0357412d6f8a92f96e1a205102753777fd25321a58fba3fb384eee114bd53ce6c06a1c22bab" |