Mission
Our mission is to evolve the world’s data, embracing new standards of security and economics. That doesn’t mean rebuilding everything from scratch, we believe that the path to the future involves Weaving existing technology into the patterns that are commonly known as Web3.
Our view is Web3 data has the following features:
- Security: Faking identities or tampering with data should be nearly impossible through the use of cryptographic guarantees that are hardened through the signed activity of trust network members.
- Lineage: Every interaction with data should be tracked to give confidence that data isn’t being leaked or used inappropriately.
- Privacy: Confidential Computing should be used as often as possible to minimize both the leaking of sensitive information as well as the unnecessary copying of data.
- Economics: Data flows should have a cost associated with them, to make it easy to compensate sources of data directly instead of through weak promises.
- Interoperability: Data should conform to standards and be made available to authorized parties programmatically, both via Web2 APIs and Web3 Oracles.
We built Weavechain because it was impossible to give data these features in a way that was easy or compliant. Storing even encrypted data on Public Web3 solutions like IPFS, Arweave, or natively in a smart contract on Ethereum or Solana is neither GDPR nor HIPAA compliant. To be GDPR compliant means that you have to satisfy an erasure obligation commonly known as “the right to be forgotten”, and you can’t delete data from Public Web3 by design. To be HIPAA requires a “physical safeguard” like a firewall, a “technical safeguard” like encryption isn’t sufficient. And rebuilding applications using Private Web3 solutions like Hyperledger is rip and replace on steroids, dramatically more difficult than what’s feasible for most.
Weavechain changes this pattern by attaching to databases, dynamically creating blockchain anchors for security, and acting as an API gateway to manage economics. By making it easy, our hope is that we can minimize the barriers to establishing Web3 data and push its adoption. Our children will look back on data transfers that lack the above features as barbaric, wondering why we allowed such critical activity to happen in such a loose fashion. We believe that Web3 data will become as pervasive as the HTTPS lock icon in your browser, a passive part of all of our lives that is flat out a better way of doing things.
Features
Weavechain is a complex infrastructure layer that can be configured to act differently for each data and compute sharing agreement, depending on the needs of the specific use case. The complexity is hidden with a simple normalized API that allows access to data stored on different types of databases or file storages and provides an easy way to enable sharing, confidential compute or monetization on top of that data. One or many of the features below can be enabled for each private network. The nodes can perform data and compute tasks on their own or private dApps can be built on top of them.
- Private or Public Data Storage
- Databases and File Storages
- Role Based Access Control
- Dynamic Row Level Access Rights
- Full Audit, including for reads
- Data Replication
- Non-Replicated private collections or Replicated to a Trust Network
- Storage and Integrity Proofs
- Scheduled Integrity Checks or Random Sampling
- Data Recovery
- Self-Sovereign Data Sharing
- Polling or streaming connections
- Custom Encryption In Transit that can be enabled on top of or when SSL/TLS is not available
- Custom Encryption At Rest
- Personal Identifiable Information and Time Series Obfuscation
- Data Brokerage
- Caching
- Proxy Re-Encryption
- Data Streaming
- Data Monetization
- pre-paid gating using NFTs, marketplace smart contracts or direct payment subscriptions
- custodial wallet dynamic payments based on usage
- custodial wallet transfers with periodic bridging on-chain
- live data access, datasets snaphots or rolling datasets
- Multiple blockchains supported for authentication, integrity proofs or monetization
- Multiple Web3 and Web2 Authentication methods
- Compute Monetization
- Integrity Proofs
- off-chain and on-chain (private or public blockchains)
- Integrity Signatures from source
- Threshold Signatures
- Time Series Immutability Proofs, records batching
- Merkle Trees and signed root hashes
- Merkle Proof ZKP
- Snapshot or Live Merkle Trees
- Table Update Zero-Knowledge Proof
- Confidential Compute
- Compute To Data
- Docker
- WebAssembly
- in-process node plugins
- Multi-Party Computing (SPDZ, using FRESCO from Alexandra Instituttet)
- Homomorphic Encryption (CKKS, using SEAL/EVA from Microsoft)
- Federated and Split Learning
- Zero-Knowldege Proofs for Data (Bulletproofs)
- Compute To Data
- Secure Enclaves support (SGX)
- Data Lineage, Row Level Traceback
- Computational Lineage
- Verifiable Credentials issuing
- Monetization for any existing 3rd party service using generic API forwarding
- Integrity guarantees for any existing 3rd party service using API forwarding
- Privacy preserving ring signatures
- Wallet-to-wallet and session-to-session Messaging
- Optional Quantum Resistant Signatures and Hashing
- Oracle Middleware
- Data or Compute Marketplaces
- Private or Public node access
- Node API limiting to reduce the attack surface and enable only the features needed to be exposed
- Fully customizable whitelisting and blacklisting by account, IP, wallets or NFT ownership
Supported Storages
Databases
- PostgreSQL
- MongoDB
- MySQL
- SQLite
- InfluxDB
- Microsoft SQL Server
- LevelDB
- RocksDB
- RethinkDB
- CouchDB
- Cassandra
- Riak
- kdb+
- GridDB
- KairosDB
- QuestDB
- QuasarDB
- CockroachDB
- ArangoDB
- YugabyteDB
- Elastic
- TileDB
- Firebase
- Amazon DynamoDB
- Amazon Aurora
- OpenTSDB
- Cloudant
- Oracle
File Storages
- local file storage
- Google Big Query
- IPFS
- Amazon S3
Supported File Formats
- Raw
- JSON
- CSV
- Feather
- Avro
- Parquet
- ORC
- TOML
- YAML
- Protobuf
Supported Blockchains
- internal ledger
- Polygon
- Solana
- Optimism
- Hyperledger Sawtooth
- Internet Computer
- Rootstock
- Hedera
- Ethereum
- Avalanche
- Celo
- Fantom
- Harmony
- Base
- Aurora
- BNB Chain
- Klatyn
- Algorand
- Arbitrum
- Corda
- Polkadot
Supported Transports
- HTTP and HTTPS
- WS and WSS
- Kafka
- RabbitMQ
- ZeroMQ
Supported encryption at rest
Data can be optionally encrypted with an additional layer, besides the [potentially available] encryption at rest of the underlying storage.
Encryption can be enabled at field level
- AES/GCM
- ChaCha20-Poly1305
Supported Data Obfuscation Methods
- Erasure
- Redaction (with custom values depending on input)
- Hashing
- Unique Random IDs (consistent within tables)
- Linked Random IDs (consistent across tables)
- Noise Addition
- Quantization, with optional scaling and non-linear transformations, eventually combined with noise addition
- Encryption at read
Supported Authentication Methods
Multiple authentication methods can be combined, depending on the needs
- private/public key pair
- verifiable credentials
- wallet ownership (for any of the supported blockchains)
- NFTs ownership
- Zero-Knowledge Proofs
- on-chain direct payments or subscriptions
- on-chain smart contract state or function result
- on-chain token ownership or staking
- email magic link
The authentication methods above can also be used to control access dynamically at row level, meaning that - if a table is configured to have this functionality - a user that has write access to the table can specify the roles that are authorized to read it or set custom rules using any of the methods above.
Supported Hashes
- SHA-256
- SHA-512
- HmacSHA256
- HmacSHA512
- Keccak-256
- Keccak-512
- MiMC
- Poseidon
- Salted Keccak-256
- Salted Keccak-512
- Blake2
- Salted SHA512-SPHINCS256
- Salted XMSS256
- Salted XMSS512
Supported Signatures
Weavechain uses secp256k1 for its private/public keys authentication, but also maintains and can handle keys for few other different signature schemes that can be enabled, depending on the needs of the app built on top of the nodes.
- Ed25519
- Threshold Ed25519
- Crystals Dilithium
- Blind RSA Signature
- Borromean Ring Signature
- BLS
Fees
Fees can be configured depending on the use case and there are two major ways to handle them:
- Paying on-chain or in a smart contract before having access to data or compute
- Pay as you go
Fees can be configured as:
- one time payments or subscriptions, pre-paid on-chain or based on smart-contract logic
- records count
- records size
- time based fees
- tiered or capped fees
- compute tasks pricing based on CPU usage or dynamic based on custom logic
Instalation
Weavechain nodes are built in java and can run on-prem as a docker or in standalone capacity. The installation steps are described below:
Docker Image
Standalone
Configure Compute To Data
Docker Installation
Linux/MacOS
- create and go to a folder where the node data and configs should be kept
curl -O https://public.weavechain.com/file/install.sh
chmod a+x install.sh
./install.sh
eventually, if you did not configure docker to run by your user (sudo usermod -aG docker $USER), run
sudo ./install.sh
- subsequent start/stop of the node
docker stop weave_node
docker start weave_node
Windows
- create and go to a folder where the node data and configs should be kept
- open Docker Desktop, go to Settings -> Resources -> File sharing and add the path to this folder, then Appy & Restart docker
- save install.bat in that folder or get it using
curl -O https://public.weavechain.com/file/install.bat
-
run it
-
subsequent start/stop of the node
docker stop weave_node
docker start weave_node
Standalone Installation
Linux/MacOS
-
install java 17 or newer (brew install java on MacOS, sudo apt install openjdk-17-jre on Debian/Ubuntu, check a how-to for your psecific system)
-
extract the weavechain node
wget https://public.weavechain.com/file/node-1.39.tar.bz2
tar -xf node-1.39.tar.bz2
chmod a+x node-1.39/bin/node
- create the folders for config files and storage
mkdir config
mkdir storage
- generate a new key pair and demo configs
node-1.39/bin/node -kfs config
- start the node
node-1.39/bin/node config/demo.config
Windows
- install Chocolatey: https://chocolatey.org/install
- start a new Powershell with Adminstrator rights
- install wget, bzip2 and Java if not already present
choco install wget
choco install bzip2
choco install openjdk17
- create a new folder for the node and go to it, for example
mkdir c:\weavechain
cd /d c:\weavechain
- extract the weavechain node
curl -O https://public.weavechain.com/file/node-1.39.tar.bz2
tar -xf node-1.39.tar.bz2
- create the folders for config files and storage
mkdir config
mkdir storage
- generate a new key pair and demo configs
node-1.39\bin\node.bat -kfs config
- start the node
node-1.39\bin\node.bat config\demo.config
Configure Compute
Docker
In order to run compute-to-data, you need to configure a service to run the tasks. The easiest to configure is a docker server.
- if running in a docker container, make sure it's present or add a compute section in the node config:
'compute': {
'dockerServiceURL': 'http://host.docker.internal:2375',
'keyStore': 'keystore.jks',
'keyStorePass': 'password'
},
- if running as a standalone service
'compute': {
'dockerServiceURL': 'http://host.docker.internal:2375',
'keyStore': 'keystore.jks',
'keyStorePass': 'password'
},
- if running the node itself as a docker, replace localhost with host.docker.internal or the host ip obtained via /sbin/ifconfig or ipconfig
- host.docker.internal works on windows or MacOS, while on Linux the host ip should be used or the docker network interface gateway, which is usually 172.17.0.1, but can differ if there are multiple docker networks
- consider using https and authentication for production
Linux/MacOS/Windows:
- run the following command
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 0.0.0.0:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
- ARM
-
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 0.0.0.0:2375:2375 alpine/socat@sha256:9e59291bebb792982c7d162fb821f7a46b1a587bc3a585240f813f135ae09b85 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
**Windows**
- open Docker Desktop
- go to Settings -> General -> enable "Expose daemon on tcp://localhost"
Local Jupyter Installation
How to install a local jupyter server docker image preconfigured to easily connect to a local Weavechain node, having the python API and few demo notebooks, as well as pre-built libraries for homomorphic encryption (for x86-64 processors):
Linux/MacOS
- go to the folder where the node was installed and the configs folder lives, then run
curl -O https://public.weavechain.com/file/install_jupyter.sh
chmod a+x install_jupyter.sh
./install_jupyter.sh
eventually, if you did not configure docker to run by your user (sudo usermod -aG docker $USER), run
sudo ./install_jupyter.sh
Windows
- save install_jupyter.bat or get it using
curl -O https://public.weavechain.com/file/install_jupyter.bat
-
run it
-
subsequent start/stop of the node
docker stop weave_jupyter_public
docker start weave_jupyter_public
Connecting
- check the weave_jupyter_public docker image logs, either by opening Docker Desktop (if it's the case) and clicking on its name, or by running
docker logs weave_jupyter_public
- get the URL with the token shown in the logs. It should look something like http://localhost:18888/?token=1234567890abcdef
- in case of docker restart, the token will change
Standalone
For the standalone node installation, jupyterlab-desktop can be a convenient choice.
Samples
Hello World
Bounty Instructions
Thanks for running our Hello World! After you’ve followed the steps below, click here to claim your WEV NFT to unlock early access to our future exclusive bounties, hackathon fellowships, events, token launch, and DAO.
Context on What's Happening
In this exercise, we're going to walk you through the basics of connecting to a Weavechain node, writing data, and reading it.
- In the first step, you'll create a public / private keypair that represents your account. Normally you'd save this to be able to 'login again' with the same account, but for this exercise we don't need to keep it.
- The first step also includes a step to write "Hello World!" to the node, with many fields nulled out to be filled automatically by the server.
- The second step creates a second user, connects to the node, and then reads the last record written by the previous user.
- The third step is purely informational, describing the definition of the remote table.
Javascript
Import the API library
import { WeaveAPI, WeaveHelper } from "@weavechain/weave-js-api"
1. Create a new session, then write a message
(hover the code block and click ⏵ to run it)
// Generate a key pair
const [ pub, pvk ] = WeaveHelper.generateKeys();
console.log("Public key: ", pub);
console.log("Private key: ", pvk);
// Connect to a public node (which was configured to allow writes from anyone)
const node = "https://public.weavechain.com:443/92f30f0b6be2732cb817c19839b0940c";
const organization = "weavedemo";
const encrypted = node.startsWith("http://");
// Create a new session
const cfg = WeaveHelper.getConfig(node, pub, pvk, encrypted)
const nodeApi = new WeaveAPI().create(cfg);
await nodeApi.init();
// Write a new record in a pre-defined table
// hosted by the public node in an SQLite database
// Note: the table is public for this example, but it could have full RBAC
const scope = "shared";
const table = "hello";
const session = await nodeApi.login(organization, pub, scope || "*");
// The target table can optionally have some special columns that are auto-filled by the backend
const record = [
null, //id, filled server side
null, //timestamp, filled server side
null, //writer public key, filled server side
null, //signature, filled server side
null, //writer IP, filled server side. Erasure is applied to obfuscate it on read
"*", //row level read access control (could be roles, accounts, blockchain wallets, NFTs etc.)
"Hello World!"
];
const records = new WeaveHelper.Records(table, [ record ]);
await nodeApi.write(session, scope, records, WeaveHelper.Options.WRITE_DEFAULT);
2. Create a new session, read the last inserted record
const [ pub, pvk ] = WeaveHelper.generateKeys();
console.log("Public key: ", pub);
console.log("Private key: ", pvk);
// Connect
const node = "https://public.weavechain.com:443/92f30f0b6be2732cb817c19839b0940c";
const organization = "weavedemo";
const encrypted = node.startsWith("http://");
// Create a new session
const cfg = WeaveHelper.getConfig(node, pub, pvk, encrypted)
const nodeApi = new WeaveAPI().create(cfg);
await nodeApi.init();
const scope = "shared";
const table = "hello";
const session = await nodeApi.login(organization, pub, scope || "*");
// Read the last record
const limit = 1;
const filter = new WeaveHelper.Filter(null, {"id": "DESC"}, limit, null, null, null);
const result = await nodeApi.read(session, scope, table, filter, WeaveHelper.Options.READ_DEFAULT_NO_CHAIN);
console.log(result);
3. Remote table definition
{
"columns": {
"id": { "type": "LONG", "isIndexed": True, "isUnique": True, "isNullable": False },
"ts": { "type": "LONG" },
"pubkey": { "type": "STRING" },
"sig": { "type": "STRING" },
"ip": { "type": "STRING", "readTransform": "ERASURE" },
"roles": { "type": "STRING" },
"message": { "type": "STRING" }
},
"idColumnIndex": 0,
"timestampColumnIndex": 1,
"ownerColumnIndex": 2,
"signatureColumnIndex": 3,
"sourceIpColumnIndex": 4,
"allowedRolesColumnIndex": 5,
"isLocal": False,
"applyReadTransformations": True
}
- idColumnIndex: specifies the column to contain an autogenerated ID
- timestampColumnIndex: fills the column automatically with the network time
- ownerColumnIndex: fills the column automatically with the public key of the writer
- signatureColumnIndex: fills the column with details about the record at write time (hash and signature)
- sourceIpColumnIndex: fills the IP column automatically with the source writer
- allowedRolesColumnIndex: Optional feature: row-level read access (controlled by the writer). "*" allows anyone to read it
- isLocal": set to False allows reading by remote clients
- applyReadTransformations: set to True enables data transformations at read
My First Node
Install docker images
- Install a Weavechain node locally if not done already, the easiest way is by starting it as a docker
- Install a local jupyter jupyter server to connect to the node (if not done already)
Run the notebook
- make sure both the node and jupyter server dockers are running
- connect to the local jupyter server http://127.0.0.1:18888/notebooks/hello-world.ipynb
- use the token taken from the weave_jupyter_public docker logs
- OR, if you're not using the provided docker server, download the notebook from here and run it in your locally configured jupyter server
- run the cells one by one, in case of errors check for the docker images running properly and without errors in their logs and for the ports being open
- contact us on Telegram or via email support@weavechain.com
- see below a non-interactive output of how the notebook should look like
Sample of expected notebook:
In this demo notebook we will showcase a self-sovereign data scenario:
- we will create a table in a shared data collection, that can be read by anyone in the network
- mark some fields as personal information that is not to be shared
- write a record
- read it locally (and be able to see all fields)
- read all records from a remote server
The default Weavechain node installation is preconfigured to support this scenario (by connecting to a public weave, having a shared data collection defined and mapped to a in-process SQLite instance and read rights for that collection already given).
1. Create an API session
import pandas as pd
from weaveapi.records import *
from weaveapi.options import *
from weaveapi.filter import *
from weaveapi.weaveh import *
WEAVE_CONFIG = "config/demo_client_local.config"
nodeApi, session = connect_weave_api(WEAVE_CONFIG)
scope = "shared"
table = "directory"
{"res":"ok","data":"pong 1674668207181"}
2. Create a local table
- we drop the existing table if already existing and re-create it from scratch
- a weavechain node can also connect to existing tables, reading their structure, but in this case we create it via the API
layout = {
"columns": {
"id": { "type": "LONG", "isIndexed": True, "isUnique": True, "isNullable": False },
"name_nickname": { "type": "STRING" },
"name_last": { "type": "STRING" },
"name_first": { "type": "STRING" },
"birthday": { "type": "STRING" },
"email_personal": { "type": "STRING" },
"phone_number": { "type": "STRING" },
"address_country": { "type": "STRING" },
"address_summary": { "type": "STRING" },
"address_timezone": { "type": "STRING" },
"linkedin_url": { "type": "STRING" },
"discord_username": { "type": "STRING" },
"telegram_username": { "type": "STRING" },
"ethereum_wallet_address": { "type": "STRING" }
},
"idColumnIndex": 0,
"isLocal": False,
"applyReadTransformations": True
}
nodeApi.dropTable(session, scope, table).get()
reply = nodeApi.createTable(session, scope, table, CreateOptions(False, False, layout)).get()
print(reply)
{'res': 'ok', 'target': {'operationType': 'CREATE_TABLE', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'shared', 'table': 'directory'}}
3. Mark some fields for erasure
- the purpose is to protect certain fields when shared
reply = nodeApi.getTableDefinition(session, scope, table).get()
#print(reply)
layout = json.loads(reply["data"])["layout"]
layout["columns"]
newLayout = layout.copy()
del newLayout["layout"]
del newLayout["indexes"]
del newLayout["columnNames"]
newLayout["columns"] = { i["columnName"]: i for i in layout["columns"]}
newLayout["columns"]["phone_number"]["readTransform"] = "ERASURE"
newLayout["columns"]["address_summary"]["readTransform"] = "ERASURE"
newLayout["columns"]["ethereum_wallet_address"]["readTransform"] = "ERASURE"
newLayout["columns"]["birthday"]["readTransform"] = "ERASURE"
reply = nodeApi.updateLayout(session, scope, table, newLayout).get()
print(reply)
{'res': 'ok', 'target': {'operationType': 'UPDATE_LAYOUT', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'shared', 'table': 'directory'}}
4. Write a record in the local storage
records = Records(table, [
[ 1, 'Nickname', 'Last Name', 'First name', '1980-01-01', 'email@gmail.com', '+40712345678', 'US', 'Secret', 'EST', 'https://www.linkedin.com/in/linkedin/', 'discord#1234', '@telegram', '0xwallet' ]
])
reply = nodeApi.write(session, scope, records, WRITE_DEFAULT).get()
print(reply)
{'res': 'ok', 'target': {'operationType': 'WRITE', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'shared', 'table': 'directory'}, 'data': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg,USr/yA9isOGMQ3/gNenSpZLi2VhwIP9x6UacGTkuBVc=,4YjeYJpUrcrpCf4oTEvuAspeJYiQYEy1AvTgbLsTo8UNzYbHKbNiV6jZihb7si5yc8MbXcr16kmGrieJgNW8s75e'}
5. Read the local record, from the local storage
- since we read with the owner key and from the local node, we expect the records to have all fields visible
scope = "shared"
table = "directory"
reply = nodeApi.read(session, scope, table, None, READ_DEFAULT_NO_CHAIN).get()
#print(reply)
df = pd.DataFrame(reply["data"])
df.head()
id | name_nickname | name_last | name_first | birthday | email_personal | phone_number | address_country | address_summary | address_timezone | linkedin_url | discord_username | telegram_username | ethereum_wallet_address | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Nickname | Last Name | First name | 1980-01-01 | email@gmail.com | +40712345678 | US | Secret | EST | https://www.linkedin.com/in/linkedin/ | discord#1234 | @telegram | 0xwallet |
5. Connect to proxy server
WEAVE_CONFIG_REMOTE = "config/demo_client_remote.config"
nodeApi2, session2 = connect_weave_api(WEAVE_CONFIG_REMOTE)
{"res":"ok","data":"pong 1674668209764"}
6. Read all shared records
- we expect the records that we don't own to have certain fields erased for privacy
scope = "shared"
table = "directory"
reply = nodeApi2.read(session2, scope, table, None, READ_DEFAULT_MUX_NO_CHAIN).get()
#print(reply)
df = pd.DataFrame(reply["data"].get("result"))
df.head()
id | name_nickname | name_last | name_first | birthday | email_personal | phone_number | address_country | address_summary | address_timezone | linkedin_url | discord_username | telegram_username | ethereum_wallet_address | _nodeKey | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1.0 | Nickname | Last Name | First name | email@gmail.com | US | EST | https://www.linkedin.com/in/linkedin/ | discord#1234 | @telegram | weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg |
7. Check the local node for all operations on the shared data
reply = nodeApi.history(session, scope, table, None, HISTORY_DEFAULT).get()
#print(reply)
df = pd.DataFrame(reply["data"]).transpose()
#display(df)
pd.DataFrame(df.iloc[0]["history"])
account | operation | timestamp | ip | apiKey | |
---|---|---|---|---|---|
0 | weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg | write | 1674668207300999936 | 127.0.0.1 | d2f86331322b497fb644e09862b681fdc2a9aa5180d0011c |
1 | weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg | read | 1674668207315000064 | 127.0.0.1 | d2f86331322b497fb644e09862b681fdc2a9aa5180d0011c |
2 | weavexUTKAe7J5faqmiq94DXXWntyRBA8bPwmrUbCtebxWd3f | read | 1674668211353999872 | 34.28.85.136 | 1e2f9e5e7c9f406081256bf5709dd1eae5ccf2e324469e1c |
Confidential Compute
Install docker images
- Install a Weavechain node locally if not done already, the easiest way is by starting it as a docker
- Install a local jupyter jupyter server to connect to the node (if not done already)
- Allow running local docker images by running
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 0.0.0.0:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
Prepare the data
- go to the folder where the node was installed, download the sample.csv and save it under storage/files/private_files (create the private_files folder if missing), or do it from command line once in the weavechain node folder
mkdir -p storage/files/private_files
cd storage/files/private_files
curl -O https://public.weavechain.com/file/sample.csv
Run the notebook
- make sure both the node and jupyter server dockers are running
- connect to the local jupyter server http://127.0.0.1:18888/notebooks/sample-compute.ipynb
- use the token taken from the weave_jupyter_public docker logs
- OR, if you're not using the provided docker server, download the notebook from here and run it in your locally configured jupyter server
- run the cells one by one, in case of errors check for the docker images running properly and without errors in their logs and for the ports being open
- contact us on Telegram or via email support@weavechain.com
- see below a non-interactive output of how the notebook should look like
Sample of expected notebook:
In this demo notebook we will showcase running a compute to data:
- we will create a table in a private data collection that cannot be accessed remotely
- we'll populate it with data
- run a compute to data task to train a model without having access to the data
- verify the task lineage
- generate a ZK proof for the data
The default Weavechain node installation is preconfigured to support this scenario (by connecting to a public weave, having a private data collection defined and mapped to a in-process SQLite instance and read rights for that collection already given).
1. Create an API session
import pandas as pd
from weaveapi.records import *
from weaveapi.options import *
from weaveapi.filter import *
from weaveapi.weaveh import *
WEAVE_CONFIG = "config/demo_client_local.config"
nodeApi, session = connect_weave_api(WEAVE_CONFIG)
{"res":"ok","data":"pong 1674717913804"}
2. Read data from the prepared file
- go to the folder where the local node was installed
- download sample.csv and place it under storage/file/private_files folder
- theoretically we could have used the file from the jupyter server, using this step to show how to connect a local storage to the node
- the private_files storage is already configured in the node at install time, the following config section marking it as non-replicated and as storing raw files (many formats are supported, from CSV to feather or ORC, for those each file being treated as a table)
'private_files': {
'connectionAdapterType': 'file',
'replication': {
'type': 'none',
},
'fileConfig': {
'rootFolder': 'weavestorage/files',
'format': 'file'
}
}
file_storage = "private_files"
file = "sample.csv"
import csv, base64
from io import StringIO
reply = nodeApi.downloadTable(session, file_storage, file, None, "file", READ_DEFAULT_NO_CHAIN).get()
data = base64.b64decode(reply["data"]).decode("utf-8-sig")
df = pd.read_csv(StringIO(data), sep=",")
display(df.head())
id | name | age | gender | air_pollution | alcohol_use | dust_allergy | occupational_hazards | genetic_risk | chronic_lung_disease | ... | fatigue | weight_loss | shortness_of_breath | wheezing | swallowing_difficulty | clubbing_of_fingernails | frequent_cold | dry_cough | snoring | level | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Lorenzo Rasmussen | 33 | 1 | 2 | 4 | 5 | 4 | 3 | 2 | ... | 3 | 4 | 2 | 2 | 3 | 1 | 2 | 3 | 4 | 1 |
1 | 2 | Zechariah Gallegos | 17 | 1 | 3 | 1 | 5 | 3 | 4 | 2 | ... | 1 | 3 | 7 | 8 | 6 | 2 | 1 | 7 | 2 | 2 |
2 | 3 | Lukas Jenkins | 35 | 1 | 4 | 5 | 6 | 5 | 5 | 4 | ... | 8 | 7 | 9 | 2 | 1 | 4 | 6 | 7 | 2 | 3 |
3 | 4 | Trey Holden | 37 | 1 | 7 | 7 | 7 | 7 | 6 | 7 | ... | 4 | 2 | 3 | 1 | 4 | 5 | 6 | 7 | 5 | 3 |
4 | 5 | Branson Rivera | 46 | 1 | 6 | 8 | 7 | 7 | 7 | 6 | ... | 3 | 2 | 4 | 1 | 4 | 2 | 4 | 2 | 3 | 3 |
5 rows × 26 columns
2. Create a local table private table starting from the file
- we drop the existing table if already existing and re-create it from scratch
- a weavechain node can also connect to existing tables, reading their structure, but in this case we create it via the API
- we create the table in a pre-configured data collection that will be not replicated and stored in a local SQLite
'private_files': {
'connectionAdapterType': 'sqlite',
'replication': {
'type': 'none',
},
'jdbcConfig': {
'database': 'weavestorage/storage_private.db'
}
}
data_collection = "private"
table = "oncology_data"
columns = {}
for c in df.columns:
if c == "id":
coldef = { "type": "LONG", "isIndexed": True, "isUnique": True, "isNullable": False }
elif c == "name":
coldef = { "type": "STRING", "readTransform": "ERASURE" }
else:
coldef = { "type": "DOUBLE" }
columns[c] = coldef
layout = {
"columns": columns,
"idColumnIndex": 0,
"isLocal": False,
"applyReadTransformations": True
}
#print(layout)
nodeApi.dropTable(session, data_collection, table).get()
reply = nodeApi.createTable(session, data_collection, table, CreateOptions(False, False, layout)).get()
print(reply)
records = Records(table, df.to_numpy().tolist())
reply = nodeApi.write(session, data_collection, records, WRITE_DEFAULT).get()
print(reply)
{'res': 'ok', 'target': {'operationType': 'CREATE_TABLE', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'private', 'table': 'oncology_data'}}
{'res': 'ok', 'target': {'operationType': 'WRITE', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'private', 'table': 'oncology_data'}, 'data': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg,4RKj6WTnS2AQrLXz04Sr2UnBxcS7dn0am5ymb2KiHDs=,3pHcKrG2afiuoMQ6x6w8GaArkn5TjjfwCcwiCqWotW1kUKMPh4kAv32yBmU8Lr85dcYcv1g68TexDb4riPMZAyQB'}
reply = nodeApi.read(session, data_collection, table, None, READ_DEFAULT_NO_CHAIN).get()
#print(reply)
df = pd.DataFrame(reply["data"])
df.head()
id | name | age | gender | air_pollution | alcohol_use | dust_allergy | occupational_hazards | genetic_risk | chronic_lung_disease | ... | fatigue | weight_loss | shortness_of_breath | wheezing | swallowing_difficulty | clubbing_of_fingernails | frequent_cold | dry_cough | snoring | level | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Lorenzo Rasmussen | 33 | 1 | 2 | 4 | 5 | 4 | 3 | 2 | ... | 3 | 4 | 2 | 2 | 3 | 1 | 2 | 3 | 4 | 1 |
1 | 2 | Zechariah Gallegos | 17 | 1 | 3 | 1 | 5 | 3 | 4 | 2 | ... | 1 | 3 | 7 | 8 | 6 | 2 | 1 | 7 | 2 | 2 |
2 | 3 | Lukas Jenkins | 35 | 1 | 4 | 5 | 6 | 5 | 5 | 4 | ... | 8 | 7 | 9 | 2 | 1 | 4 | 6 | 7 | 2 | 3 |
3 | 4 | Trey Holden | 37 | 1 | 7 | 7 | 7 | 7 | 6 | 7 | ... | 4 | 2 | 3 | 1 | 4 | 5 | 6 | 7 | 5 | 3 |
4 | 5 | Branson Rivera | 46 | 1 | 6 | 8 | 7 | 7 | 7 | 6 | ... | 3 | 2 | 4 | 1 | 4 | 2 | 4 | 2 | 3 | 3 |
5 rows × 26 columns
3. Mark the table private
layout["isLocal"] = True
nodeApi.updateLayout(session, data_collection, table, json.dumps({ "layout": layout})).get()
{'res': 'ok',
'target': {'operationType': 'UPDATE_LAYOUT',
'organization': 'weavedemo',
'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg',
'scope': 'private',
'table': 'oncology_data'}}
and data cannot be read any longer except from the local node (we expect a Not authorized reply here)
reply = nodeApi.read(session, data_collection, table, None, READ_DEFAULT_NO_CHAIN).get()
print(reply)
{'res': 'err', 'target': {'operationType': 'READ', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'private', 'table': 'oncology_data'}, 'message': 'Not authorized'}
4. Train an ML model on the private data
- run on the node machine
docker pull gcr.io/weavechain/oncology_xgboost:latest
- use latest-arm64 if your machine is ARM
- the data owner needs to purposely enable running a certain image
- the node needs to be able to connect to the local docker instance
- in the default configuration file installed with the node, the sample script is pre-authorized with the following line
'allowedImages': [ 'gcr.io/weavechain/oncology_xgboost' ]
- in case of error, uncomment the #print(reply) below to see details
- (compute to data is just one of the patterns of confidential computing supported, MPC and Homomorphic Encryption could also be used)
reply = nodeApi.compute(session, "gcr.io/weavechain/oncology_xgboost", COMPUTE_DEFAULT).get()
#print(reply)
output = reply["data"]["output"]
print(output[:1200] + "...")
output = json.loads(output)
{"model": "YmluZgAAAD8XAAAAAwAAAAEAAAAAAAAAAQAAAAcAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAG11bHRpOnNvZnRwcm9iBgAAAAAAAABnYnRyZWUsAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAsAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAAAAAgAAAAIAAIAAAJBAAAAAgAMAAAAEAAAACgAAgAAAYEAAAAAABQAAAAYAAAAJAACAAADwQAEAAIAHAAAACAAAABYAAIAAAKBAAQAAAAkAAAAKAAAACQAAgAAAIEACAACA//////////8AAAAA1mVlvgIAAAD//////////wAAAADmFLw+AwAAgP//////////AAAAAEGE5D4DAAAA//////////8AAAAA5RlPvgQAAID//////////wAAAADkGc8+BAAAAP//////////AAAAAG0+Y779nEdD4zjeQ1p2i70AAAAASfgoQ3EcU0P6hyI/AAAAAGRhoUFUVWlDjUE0vwAAAADk9SNC4zgCQycHqz8AAAAAz+gWQhzHoUJlQ/6+AAAAAAAAAACN42RDMio/vwAAAAAAAAAA4ziOQBW8nD8AAAAAAAAAAKqq8kI2br4/AAAAAAAAAADjOA5BlJUsvwAAAAAAAAAA4zgOQZOVrD8AAAAAAAAAAP//j0KwXj2/AAAAAAEAAAAVAAAAAAAAA...
5. Check the variable importance in the trained model
- we can now use the model that was trained on data that is not seen by the researcher
- we need to install xgboost in order to do so, run the section below only once (ARM machines might xgboost encounter version mismatches)
!pip install scikit-learn
!pip install xgboost
!pip install matplotlib
import base64
from xgboost import XGBClassifier
f = open("model.serialization", "wb")
f.write(base64.b64decode(output["model"]))
f.close()
model = XGBClassifier()
model.load_model('model.serialization')
if output.get("features") is not None:
model.get_booster().feature_names = output["features"]
#print(model)
vimp = model.get_booster().get_score(importance_type='weight')
#print(vimp)
keys = list(vimp.keys())
values = list(vimp.values())
data = pd.DataFrame(data=values, index=keys, columns=["score"]).sort_values(by = "score", ascending=False)
data.nlargest(30, columns="score").plot(kind='barh', figsize = (20, 10)).invert_yaxis()
/usr/local/lib/python3.9/dist-packages/xgboost/sklearn.py:782: UserWarning: Loading a native XGBoost model with Scikit-Learn interface.
warnings.warn("Loading a native XGBoost model with Scikit-Learn interface.")
6. Verify signature for the output model
- the signature is done on the hash of all input data, the hash of the docker image and the hash of the output
- these hashes could be put on a blockchain as a proof of the ML model lineage
- somebody with access to data can verify the input hashes
- if multiple people have access to the data (and the training is deterministic), the same hashes are expected to be signed by different nodes
import base58
data = reply["data"]
signature = data["outputSignature"]
check = nodeApi.verifyLineageSignature(signature, data.get("inputHash"), data.get("computeHash"), data.get("paramsHash"), data["output"])
print("Signature:", data["outputSignature"])
print("Valid:", check)
print("\nInput Hash:", data["inputHash"])
print("Compute Hash:", data["computeHash"])
print("Output Hash:", data["outputHash"])
print("Output:", data["output"][:400] + "..." + data["output"][-400:])
Signature: 2psqu7mwhn3KLy1Vzb9uSBh1QSNuka4aynk7m7VwXvdvDe5cAzXd3HP4NGtgWNV2pzToEsadGJNTpPwtxmNgcE3z
Valid: True
Input Hash: 6LfKoQQMqb8fYgA1PwBPKMhFaJ59Fn3DWw6qTRri4zjN
Compute Hash: 3ia9p7Ayg6PBmFg9zUXVyrmUYbt4jz4YCUY3Cx7nXE1Q
Output Hash: YWuSGd184YZhfDWw758gPJaEmsCNqe6rfGBkznbWuF5
Output: {"model": "YmluZgAAAD8XAAAAAwAAAAEAAAAAAAAAAQAAAAcAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAG11bHRpOnNvZnRwcm9iBgAAAAAAAABnYnRyZWUsAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...6IjMifX0=", "features": ["age", "air_pollution", "alcohol_use", "balanced_diet", "chest_pain", "chronic_lung_disease", "clubbing_of_fingernails", "coughing_of_blood", "dry_cough", "dust_allergy", "fatigue", "frequent_cold", "gender", "genetic_risk", "obesity", "occupational_hazards", "passive_smoker", "shortness_of_breath", "smoking", "snoring", "swallowing_difficulty", "weight_loss", "wheezing"]}
7. Generate zk proofs for data
- Bulletproofs are used and multiple gadgets are supported (see the API)
- generating proofs can be very time consuming as the volume of data grows
options = ZKOptions(False, 300, ["*"], 2048, DEFAULT_COMMITMENT)
reply = nodeApi.zkProof(session, data_collection, table, "numbers_are_non_zero", json.dumps({}), [ "age" ], None, options).get()
proof = reply["data"]
print(proof[:400] + "..." + proof[-400:])
A1BoqCGaWqcPbn46SdNoWUgC3T3i3D9TXHLdauL55MDxpCosaRwtFoMHDj8MFchaStvrMUk7EkGDGEptdyGk5vh2RjYSAFZBio1XuDRTkau2AYED4eA1zZV26GEX6rytpvH8SJ4DJevS2WKeDsL2fHPQ4zwuLqkqSNUhWCJPeoZmsQ56VPNJoqKewC6sDLPE1so33wA5bJpot8oFUpiETCEiMFF4J72ZDHbR46ix9kcVdZugiJJhFaVanyq8U7SATHLZyNxH4abjQ2aXEuVWtfnU3guuqggUFLg8R5BwmkMtvwZXXrxJAR3gHnxs3EFv887csDyTyxiPsj2U51gd4E32AXbDADH9b5DUFLWVWsqfxV7QDmG9yT2k2nuhoByTgL9jhMjwErgAKw24...UErC2vvTcKwUbpZXcoaKuyKj4S3gzUaWVt3ZamD7yEmu8nb1EFR9wPNF8pDj5ErfQT4JbGLK86d3DfunZ5DxvF9zaXneALTedwdjviyQNykK7uMR2kyqvbwZ75apJhMrQNemigN5ndYX5QymEStKrTKgm1QVaLLxGAtjJHdqAeXtRDnd2bGQ2uFMCSJJQqFxFrKNWK2CK6dxg52jB6xRKzbN3GH4jXFDrjQUgXtvgBThd7VYBtZGK9STmcpsGPKujzu7Ls9NEuXHgTFJaXQdZ1CaUCvcGxrqE3EDooiE13gkqDkpbqBg2Mo9SzmreYugnWY9PiHrLfRzgthssH4hh63MAfmPwSa7oFp8c1RarNUeScXQw4YPGtAZJvC23m2SLhySyDxedHckZs3c
Verify proof
reply = nodeApi.verifyZkProof(session, proof, "numbers_are_non_zero", json.dumps({ "count": 1000 }), None, 2048).get()
print(reply)
{'res': 'ok', 'data': 'true'}
Connecting a local database
Install docker images
- Install a Weavechain node locally if not done already, the easiest way is by starting it as a docker
- Install a local jupyter jupyter server to connect to the node (if not done already)
- Allow running local docker images by running
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 0.0.0.0:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
Prepare the data
- go to the folder where the node was installed, download the sample.csv and save it under storage/files/private_files, or do it from command line
cd storage/files/private_files
curl -O https://public.weavechain.com/file/sample.csv
Run the notebook
- make sure both the node and jupyter server dockers are running
- connect to the local jupyter server http://127.0.0.1:18888/notebooks/sample-localdb.ipynb
- use the token taken from the weave_jupyter_public docker logs
- OR, if you're not using the provided docker server, download the notebook from here and run it in your locally configured jupyter server
- run the cells one by one, in case of errors check for the docker images running properly and without errors in their logs and for the ports being open
- contact us on Telegram or via email support@weavechain.com
- see below a non-interactive output of how the notebook should look like
Sample of expected notebook:
In this demo notebook we will showcase connecting a local database
1. Create an API session
import pandas as pd
from weaveapi.records import *
from weaveapi.options import *
from weaveapi.filter import *
from weaveapi.weaveh import *
WEAVE_CONFIG = "config/demo_client_local.config"
nodeApi, session = connect_weave_api(WEAVE_CONFIG)
data_collection = "localdb"
table = "oncology_data"
{"res":"ok","data":"pong 1674727453166"}
2. Install a local database (if not already having one)
- it can be any database or file storage from the ones supported
- for the example we will assume a local postgres server is installed
- or you can start a new postgres instance as a docker following the "How to use this image" step from here. Sample:
docker run --name some-postgres -p 0.0.0.0:5432:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres
Create a table and populate it with data
- go to the folder where the node is installed
- download a sample file
curl -O https://public.weavechain.com/file/sample.csv
- start the psql command prompt
psql -U postgres -d postgres -h localhost -p 5432
- if psql is not available, install it (see this guide from timescale) or run it from docker
docker run -it postgres /bin/bash -c "psql -U postgres -d postgres -h host.docker.internal -p 5432"
- ideally create a new database and user, but to simplify the steps we'll use the default postgres database and user
- in the psql prompt, create a new table
CREATE TABLE "oncology_data" ("id" BIGINT NOT NULL,"name" TEXT,"age" NUMERIC,"gender" NUMERIC,"air_pollution" NUMERIC,"alcohol_use" NUMERIC,"dust_allergy" NUMERIC,"occupational_hazards" NUMERIC,"genetic_risk" NUMERIC,"chronic_lung_disease" NUMERIC,"balanced_diet" NUMERIC,"obesity" NUMERIC,"smoking" NUMERIC,"passive_smoker" NUMERIC,"chest_pain" NUMERIC,"coughing_of_blood" NUMERIC,"fatigue" NUMERIC,"weight_loss" NUMERIC,"shortness_of_breath" NUMERIC,"wheezing" NUMERIC,"swallowing_difficulty" NUMERIC,"clubbing_of_fingernails" NUMERIC,"frequent_cold" NUMERIC,"dry_cough" NUMERIC,"snoring" NUMERIC,"level" NUMERIC, CONSTRAINT pk_oncology_data PRIMARY KEY ("id"));
- and, in the same psql prompt, populate it with data (keep the \ at the beginning)
\COPY oncology_data FROM 'sample.csv' DELIMITER ',' CSV HEADER;
3. Add a new connection in the configuration file
- go to the node installation folder and edit config/demo.config
- add a new item in the databases section
'localdb': {
'connectionAdapterType': 'pgsql',
'replication': {
'type': 'none',
'allowedCachingIntervalSec': 604800
},
'jdbcConfig': {
'host': 'host.docker.internal',
'port': 5432,
'schema': 'public',
'database': 'postgres',
'user': 'postgres',
'pass': 'mysecretpassword'
}
},
- If the node was started from docker, the address must point to the docker host machine, host.docker.internal will work on MacOS and windows. Use localhost if the node was started as standalone rather than a docker. Or the internal IP obtained via ipconfig/ifconfig. On linux 172.17.0.1 can also be used most of the time (usually assigned for the host machine to be visible from the docker if it's the single docker network interface)
Flag the node to reload the configuration file from disk
- execute the following command in the notebook
reply = nodeApi.resetConfig(session).get()
print(reply)
{'res': 'ok', 'data': 'weaveconfig/demo.config'}
Restart the node
- run from the command prompt
docker stop weave_node
docker start weave_node
4. Read data from the newly added table
nodeApi, session = connect_weave_api(WEAVE_CONFIG)
reply = nodeApi.read(session, data_collection, table, None, READ_DEFAULT_NO_CHAIN).get()
#print(reply)
df = pd.DataFrame(reply["data"])
df.head()
{"res":"ok","data":"pong 1674727467726"}
id | name | age | gender | air_pollution | alcohol_use | dust_allergy | occupational_hazards | genetic_risk | chronic_lung_disease | ... | fatigue | weight_loss | shortness_of_breath | wheezing | swallowing_difficulty | clubbing_of_fingernails | frequent_cold | dry_cough | snoring | level | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Lorenzo Rasmussen | 33 | 1 | 2 | 4 | 5 | 4 | 3 | 2 | ... | 3 | 4 | 2 | 2 | 3 | 1 | 2 | 3 | 4 | 1 |
1 | 2 | Zechariah Gallegos | 17 | 1 | 3 | 1 | 5 | 3 | 4 | 2 | ... | 1 | 3 | 7 | 8 | 6 | 2 | 1 | 7 | 2 | 2 |
2 | 3 | Lukas Jenkins | 35 | 1 | 4 | 5 | 6 | 5 | 5 | 4 | ... | 8 | 7 | 9 | 2 | 1 | 4 | 6 | 7 | 2 | 3 |
3 | 4 | Trey Holden | 37 | 1 | 7 | 7 | 7 | 7 | 6 | 7 | ... | 4 | 2 | 3 | 1 | 4 | 5 | 6 | 7 | 5 | 3 |
4 | 5 | Branson Rivera | 46 | 1 | 6 | 8 | 7 | 7 | 7 | 6 | ... | 3 | 2 | 4 | 1 | 4 | 2 | 4 | 2 | 3 | 3 |
5 rows × 26 columns
5. Make the table private
reply = nodeApi.getTableDefinition(session, data_collection, table).get()
#print(reply)
layout = json.loads(reply["data"])["layout"]
layout["isLocal"] = True
reply = nodeApi.updateLayout(session, data_collection, table, json.dumps({ "layout": layout})).get()
print(reply)
{'res': 'ok', 'target': {'operationType': 'UPDATE_LAYOUT', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'localdb', 'table': 'oncology_data'}}
and fail to read the data
- we expect a Not authorized reply here
reply = nodeApi.read(session, data_collection, table, None, READ_DEFAULT_NO_CHAIN).get()
print(reply)
{'res': 'err', 'target': {'operationType': 'READ', 'organization': 'weavedemo', 'account': 'weaveyh5R1ytoUCZnr3JjqMDfhUrXwqWC2EWnZX3q7krKLPcg', 'scope': 'localdb', 'table': 'oncology_data'}, 'message': 'Not authorized'}
6. Compute a Merkle Tree from a subset of columns in the private table
salt = "salt1234" # Same salt used for records hashes, this can be improved to have different salts for *each distinct writer*
filter = Filter(None, None, None, None, [ "name", "age" ])
reply = nodeApi.merkleTree(session, data_collection, table, filter, salt, READ_DEFAULT_NO_CHAIN).get()
tree = reply["data"]["tree"]
rootHash = reply["data"]["rootHash"]
ts = reply["data"]["timestamp"]
rootHashSignature = reply["data"]["signature"]
print("Generated at", ts)
print("Root Hash", rootHash)
print("Signature", rootHashSignature)
print("")
print(tree[:400] + "..." + tree[-400:])
Generated at 1674727577162
Root Hash iax9Vpupq3bXG3DnBTQyKdWr2s3Uh4Q6qcZAPNVJAgb
Signature 4RdBCQgKWfJqCvD7PrEkYyWSR3KtT8S8eYTdyveDyLFA6RNiwp28R1LvuEtMPAw8ceRzjNddQvQhKFQiRFy9nZoL
iax9Vpupq3bXG3DnBTQyKdWr2s3Uh4Q6qcZAPNVJAgb;SH3Ch1Jwxcs363PwaCYvREgmPVfqr8NcPovZNgXa4js,FE8mTPPJ3uDXTJNxppNa4CeHvfu2Zeo9sjeL71YS12zK;HKgnz9cLoWn4nDapvnGm6K6gH6H5Y2rrgMguaMoKgyek,7s52zKzog488LkgMdEKrkFRoF8opVB9AdrDKtSdSF92j,9tnJTNhSKpZmDViGXtPB2SpoiozEpGkFVNk7FgtLtBQv,A5tNHAHQs61pSzqLJbT9v2ca8ix53kNzzDXKSZ9b6HFy;7oyQ7nq5bLX4J9Es6GQdZcxUpc8FetPZLeyJVFpEnydd,BybqudmZBw54NJhebTWt8yJMf4ar6jnxLRhD2MFsZ7...DhvjP86uY7x4eK7QRrcocBct5XJNGsVUWWREc6zd,E9QLrZqb5M6oXoEQpQ3B5KMvmHJ13Xdb9jUxRgJ3FaJA,F7dfae6vFLs3a2a2w9uET87Euw2uxE2qssvqYcmHPUeP,5Am75Eu1NYQbLuEfTTGDUiH5sWhPcumC3deC4yVYpYkn,HrsDMUrxxgjoXrfeMfSaks8mGK6hbDnyDQjhZwuXnCT7,DL96tTVtfEyRCZCv3EeNd4cStYqX4hR8r5anUi8eAMcC,Gaocem33txtM2KMJbUaMGrEDFrYH1H1oJB25Qb565Ao2,7u4EXgwGPmoqgz6cvAFyfvjAP7cvJcBeHwrK9XpYz9RZ,FpT72W53qoU3YXAZg1DKMCUVSpyLmjA6j52nSXYR9yRn
Check root hash signature
toSign = rootHash + " " + ts
check = nodeApi.verifySignature(rootHashSignature, toSign)
print("Check signature:", check)
Check signature: True
Verify the presence of a known record in the dataset
row = [ 'Lorenzo Rasmussen', 33.0 ]
recordHash = nodeApi.hashRecord(row, salt)
print(recordHash)
ARMe28cMdZvxBCYgBSALyncPnec4ijERrn2cDJgwgEHA
reply = nodeApi.verifyMerkleHash(session, tree, recordHash).get()
print(reply["data"])
true
7. Train a ML model on the private data hosted in our local database
- we do it similarly how it is done in the Compute Sample, where we also check the model lineage
- run on the node machine
docker pull gcr.io/weavechain/oncology_xgboost:latest
- use latest-arm64 if your machine is ARM
- the data owner needs to purposely enable running a certain image
- the node needs to be able to connect to the local docker instance
- in the default configuration file installed with the node, the sample script is pre-authorized with the following line
'allowedImages': [ 'gcr.io/weavechain/oncology_xgboost' ]
- in case of error, uncomment the #print(reply) below to see details
- (compute to data is just one of the patterns of confidential computing supported, MPC and Homomorphic Encryption could also be used)
reply = nodeApi.compute(session, "gcr.io/weavechain/oncology_xgboost", COMPUTE_DEFAULT).get()
#print(reply)
print(reply["data"]["output"][:1200] + "...")
{"model": "YmluZgAAAD8XAAAAAwAAAAEAAAAAAAAAAQAAAAcAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAG11bHRpOnNvZnRwcm9iBgAAAAAAAABnYnRyZWUsAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAsAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAAAAAgAAAAIAAIAAAJBAAAAAgAMAAAAEAAAACgAAgAAAYEAAAAAABQAAAAYAAAAJAACAAADwQAEAAIAHAAAACAAAABYAAIAAAKBAAQAAAAkAAAAKAAAACQAAgAAAIEACAACA//////////8AAAAA1mVlvgIAAAD//////////wAAAADmFLw+AwAAgP//////////AAAAAEGE5D4DAAAA//////////8AAAAA5RlPvgQAAID//////////wAAAADkGc8+BAAAAP//////////AAAAAG0+Y779nEdD4zjeQ1p2i70AAAAASfgoQ3EcU0P6hyI/AAAAAGRhoUFUVWlDjUE0vwAAAADk9SNC4zgCQycHqz8AAAAAz+gWQhzHoUJlQ/6+AAAAAAAAAACN42RDMio/vwAAAAAAAAAA4ziOQBW8nD8AAAAAAAAAAKqq8kI2br4/AAAAAAAAAADjOA5BlJUsvwAAAAAAAAAA4zgOQZOVrD8AAAAAAAAAAP//j0KwXj2/AAAAAAEAAAAVAAAAAAAAA...
Verifiable compute
Install docker images
- Install a Weavechain node locally if not done already, the easiest way is by starting it as a docker
- Install a local jupyter jupyter server to connect to the node (if not done already)
- Allow running local docker images by running
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 0.0.0.0:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
Prepare the compute tasks
- run in a command line on the server where the node is running
docker pull gcr.io/weavechain/download_dataset
docker pull gcr.io/weavechain/faucet_once
docker pull gcr.io/weavechain/train_model_dummy
Run the notebook
- make sure both the node and jupyter server dockers are running
- connect to the local jupyter server http://127.0.0.1:18888/notebooks/sample-verifiable.ipynb
- use the token taken from the weave_jupyter_public docker logs
- OR, if you're not using the provided docker server, download the notebook from here and run it in your locally configured jupyter server
- run the cells one by one, in case of errors check for the docker images running properly and without errors in their logs and for the ports being open
- contact us on Telegram or via email support@weavechain.com
- see below a non-interactive output of how the notebook should look like
Sample of expected notebook:
In this demo notebook we will showcase verifiable computation and checking inclusion of input data in the trainig set of an AI model training.
Create an API session
import pandas as pd
from weaveapi.records import *
from weaveapi.options import *
from weaveapi.filter import *
from weaveapi.weaveh import *
WEAVE_CONFIG = "config/demo_ailineage_owner.config"
nodeApi, session = connect_weave_api(WEAVE_CONFIG)
data_collection = "vault"
articles_table = "medium_posts"
token = "USDC"
decimals = 6
{"res":"ok","data":"pong 1691601050445"}
Check initial node owner balance
Bridge address: https://mumbai.polygonscan.com/address/0xB485e0813b567E1629B8083026307d4d9E2cDE0B
account = session.publicKey
reply = nodeApi.balance(session, account, "", token).get()
print("Custodial wallet", account, float(reply["data"]) / pow(10, decimals) if "data" in reply else 0)
Custodial wallet weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q 880016.0
Create table to store medium articles
layout = {
"columns": {
"id": { "type": "LONG", "isIndexed": True, "isUnique": True, "isNullable": False },
"ts": { "type": "LONG" },
"pubkey": { "type": "STRING" },
"sig": { "type": "STRING" },
"ip": { "type": "STRING" },
"roles": { "type": "STRING" },
"link": { "type": "STRING" },
"title": { "type": "STRING" },
"author": { "type": "STRING" },
"text": { "type": "STRING" }
},
"idColumnIndex": 0, # Autogenerates IDs
"timestampColumnIndex": 1, # Fills the column automatically with the network time
"ownerColumnIndex": 2, # Fills the pubkey column automatically with the public key of the writer
"signatureColumnIndex": 3, # Fills the column with an EdDSA signature of the record hash
"sourceIpColumnIndex": 4, # Fills the column with an EdDSA signature of the record hash
"allowedRolesColumnIndex": 5, # Allowed readers, specified by the writer
"isLocal": False,
"applyReadTransformations": True
}
nodeApi.dropTable(session, data_collection, articles_table).get()
reply = nodeApi.createTable(session, data_collection, articles_table, CreateOptions(False, False, layout)).get()
print(reply)
{'res': 'ok', 'target': {'operationType': 'CREATE_TABLE', 'organization': 'weavedemo', 'account': 'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q', 'scope': 'vault', 'table': 'medium_posts'}}
Run compute task to import data
- this task performs an import from a dataset (kaggle in this case)
- the task has full compute lineage, i.e. it has hashes for input/compute and output as a guarantee that the output datasetis the result of running this task at a given moment in time
- we generate key pairs for the authors, which could be claimed later (not done in this sample, but if the dataset had an email field, we can enable tokens claims using email magic link authentication)
- there is a separate flow in which authors can write data with their own keys
reply = nodeApi.compute(session, "gcr.io/weavechain/download_dataset", COMPUTE_DEFAULT).get()
display(reply)
{'res': 'ok',
'target': {'operationType': 'COMPUTE',
'organization': 'weavedemo',
'account': 'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q'},
'data': {'inputHash': '6LfKoQQMqb8fYgA1PwBPKMhFaJ59Fn3DWw6qTRri4zjN',
'console': '{"res":"ok","data":"pong 1691601070062"}\nDownloading dataset...\nWriting record for Justin Lee\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveyHb6WF1WBk5ZMQpMm1eG9uugi4MXnSgoAetTARcR9izE for Justin Lee\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyHb6WF1WBk5ZMQpMm1eG9uugi4MXnSgoAetTARcR9izE\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Ol5So58BXoJIStjW9SuILYLUS8onZE1/mU90DZ3RFuY=,2vtap1n9cDCwMQh5hwzVVZvTKZ4e6CmjAzAYvHzDNX7KCZXK7GTvd83oKeLN2M3qkxEzoLaQp21y3NUZpxjZ4AX7\', \'ids\': \'1\'}\nWriting record for Conor Dewey\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavebvDnoef2cPLbRtqqH5uA2M1t6Svdz1C3d8zx43481W3z for Conor Dewey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavebvDnoef2cPLbRtqqH5uA2M1t6Svdz1C3d8zx43481W3z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BUeRSwKjw8TtWO57SW26Sqn8x/cQKbXSDdtXrfoOvfU=,63WS3rTVYY4YvPN4XTz6sYfu6wnyCVLPBw3Pw6YZTbAK76nQrK2B8PguLLW3iA8xR5PnJAdZ2RmLzaJyte8NihCE\', \'ids\': \'2\'}\nWriting record for William Koehrsen\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavejZRDVDvctwquT1eQGM38v1tHubtPryRxq6K6rniVhkFq for William Koehrsen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavejZRDVDvctwquT1eQGM38v1tHubtPryRxq6K6rniVhkFq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,TLSK2rMTMrAVVCYsjygSRzvw4Uo6PE4KrI8R/C9/UrE=,4kbbmUDgnpV8tZGrCVLEDEirSTWEmUmfCGZGnoa7Tey5ehYAaPeK51wEyKdghpu3LzzCDNh4bWdibeXD3adLzjnM\', \'ids\': \'3\'}\nWriting record for Gant Laborde\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveiWV2dK7p3AHhBkwMBjPqpM6vVM78D62HdUUBYxmMzdKb for Gant Laborde\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiWV2dK7p3AHhBkwMBjPqpM6vVM78D62HdUUBYxmMzdKb\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,hXPM1qHN2hiRAR2C27TxevCIQg6Pcf4w4v3HyEL4mao=,3jaembVRGeBGNbK6sQuqRn5Ru6QvR3Njn79LwG6rzE6SRHMmV9sXzR4g4k7TysbcGPfRaE1xxnYhacbPNNzamcDU\', \'ids\': \'4\'}\nWriting record for Emmanuel Ameisen\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavez2Lr5qDk5LC3zPUxFakrxyRJUNb1LQ9QzEDHRG2Gm8ix for Emmanuel Ameisen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavez2Lr5qDk5LC3zPUxFakrxyRJUNb1LQ9QzEDHRG2Gm8ix\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,bUvZcqXP0WP2+UIrD1fdCSEK+tW2E7jjB04FXUYJ1U0=,2x77REhTMMTJGUnjJ66Dm3SxiA3tJmBP1nP6Xx4iabD9FpgrU4kAjRy5qvuasS2e1xfQDVkbm47cTt31giDxx1Wu\', \'ids\': \'5\'}\nWriting record for Irhum Shafkat\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave21Jj2Zs46JsdG9AxgrABy3pr6CBsjZBV862q7SAvs6Jj4 for Irhum Shafkat\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21Jj2Zs46JsdG9AxgrABy3pr6CBsjZBV862q7SAvs6Jj4\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Dec+fcVRWGl22qcXhBiYMp+7/AZzkJAYLFnXrXeEq9I=,4cj5kwqo3M534xDheSgJ1g5x3jbWcJf84epJaPif6hpaCj4TGyjtBqxQrbXYShoEjoaegmM9emY9engCmpt9nYRG\', \'ids\': \'6\'}\nWriting record for Sam Drozdov\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave21P5vXr69n69QZ6gk9NLz5BbkDFiUYNgjm2RzEsePnYPQ for Sam Drozdov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21P5vXr69n69QZ6gk9NLz5BbkDFiUYNgjm2RzEsePnYPQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,i5e3InP9pYLsPPMXmd37PQGfYL2eNcbHCX9WKtxgzpA=,2RB6puHmhoxwVbqNPoQjhXjA8QfhH2iYyJANbjtaWTDDHhZgomBCbgYGykShDMSudeUNpfqQUaQmLbkPt2mi79hQ\', \'ids\': \'7\'}\nWriting record for Conor Dewey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavebvDnoef2cPLbRtqqH5uA2M1t6Svdz1C3d8zx43481W3z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,gpGfPkB925ckB3GOMIFecalo2YhArh6UJH5w9I6xSns=,3iTi5tLsse6g79mvvnZg3XNtGdvq35xBJsP3oapg3Qjrf6Zv8Nz53V5xfgsZRuQWrfYZZrukp7W4d75frn7yofeR\', \'ids\': \'8\'}\nWriting record for Abhishek Parbhakar\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavewYC94Hwi5bGhFeorEp2sghZKXBWx1yreFYBAs5Qjnmz7 for Abhishek Parbhakar\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewYC94Hwi5bGhFeorEp2sghZKXBWx1yreFYBAs5Qjnmz7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,f/Fd0javNefBjNUZgdioAxNjTXc/uvdn9wZnoUk8hi0=,4QUPXLrAfqa22WpsNxm8PuPbfdtjfyJRx9Zw2Tm7ci9gv2QH2e8zEuLhBJUGFC7bCnU6SvHYVSN8VWT15L9mroVM\', \'ids\': \'9\'}\nWriting record for Aman Dalmia\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexjioGxCmvk2znFELkHXASjMbJzqMGX53a3wTjdmVo2q5 for Aman Dalmia\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexjioGxCmvk2znFELkHXASjMbJzqMGX53a3wTjdmVo2q5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,1yeEdKmBhSg94p10DP2ES5f5eGrCA6yPsnVyutFA+wQ=,JFfvt1jrNBMEhcUH9Vy6rut983suu2G1fiLedUAfgN8rooUpr6jFjdqDcXVqwZWND3tEKbJcr6rMfF18Zk1912s\', \'ids\': \'10\'}\nWriting record for Sophia Arakelyan\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavecd1LPk6JgVEBxkxgTrSGGYQ625qTzbgrB3WoLozGtFLT for Sophia Arakelyan\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavecd1LPk6JgVEBxkxgTrSGGYQ625qTzbgrB3WoLozGtFLT\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,MJ0IR/RIokI5a25NanNHkClHZN4CiHqYzlO0/JsD9jg=,3YE5wqRGyFY8RooJR8YizFLdmGdwEqT6hyTiLRmHDXxp4ouZYYSY2Hcxuht5dDWMctYKKUZNTiUo7bCQTzrHAhAW\', \'ids\': \'11\'}\nWriting record for Dr. GP Pulipaka\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavefJHY7kHgG9cPmv6Kt1GBu7XnB71jBxCbrZvxoWPe3Exa for Dr. GP Pulipaka\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefJHY7kHgG9cPmv6Kt1GBu7XnB71jBxCbrZvxoWPe3Exa\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,p5Y9VgLs+jBovbvx967wCALgpmXdZWHLQJ1+kDjBfUI=,25krdGcdtzAJetEBhDtZthYjkubyGNDiMVLnuEphb8wVeXKRt295RMtr5VxbJAnvyRKrdCaqK7sPxNB2nPyTueTm\', \'ids\': \'12\'}\nWriting record for Scott Santens\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavevrXLcK18w9PjPMPgdpASHSXzWmgdDPP7AkUzpBm8rjqP for Scott Santens\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevrXLcK18w9PjPMPgdpASHSXzWmgdDPP7AkUzpBm8rjqP\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BeyC+7SPKHN19J7urq0IFDGWHBeMj1nGSR1pzD//kC0=,4nSwNSa7QmgYv7c7BUMBXXDJ1nZpR4ZisRiLkiawfshQYeU6PxbHiEAg1pD3raZ64fRuo1t8d4X86Ait3pmKgzRa\', \'ids\': \'13\'}\nWriting record for Adam Geitgey\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Ce3Az18B6la45OfF1TsbhU3zMTLG5rn9K/4yh45fN/U=,erLLecXwc2qS8QhzRfB6Sqrer6h4bsyQjrLUsC74miCiiWDF1UDCun9qWmHm6ovwBnsnWzdgTP6zoc6PtmdaSSk\', \'ids\': \'14\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,WrsfO//Vik3pptOMuEhf7MrUSLk0XkdZ8carSffWhMc=,bHPgvYBfheT4wqRumtKkEcFyxGSjrJg1J5YAjyexAN94iQ4mybQ1YH8YfgPrG8xGJu2Fewr94jCW5BKfB7fxD61\', \'ids\': \'15\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3NzsGRzc1rZklINoqsZYBQeA8mvkd0JGRLQBupMByYE=,G63JbyhiV4wTpu8RDcvVXVCKK2oMUXJULdsYRapnyjpNdwEdCrG9pmGB1e37gvMDzcUvL7HCtDiUPu3HcJpw5Mu\', \'ids\': \'16\'}\nWriting record for Xiaohan Zeng\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave274mgR5wCdAZHhj985J8cjNaxtcRGuhGWXcunoqPqLctE for Xiaohan Zeng\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave274mgR5wCdAZHhj985J8cjNaxtcRGuhGWXcunoqPqLctE\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xzfp+XSQhjEzf7quITIdPU+IAuoN8+Nr3keiQpyJFnc=,5sCqXZbJLAthqr5aSapLt1VpwBirghNfao5zyxEJGTRzryPmBQSb5pwzGNWXXD7LKHdDwtfFCUrPWVe3UJn2TPNn\', \'ids\': \'17\'}\nWriting record for Gil Fewster\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave28hJgLv9G3ku9ozEiukbaTgCR7TVxx2Q84aS1Ly9eWM1Z for Gil Fewster\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28hJgLv9G3ku9ozEiukbaTgCR7TVxx2Q84aS1Ly9eWM1Z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,dGLki4ln5Ua0ZiRgxsPKNEwY1Kw5HOoZMYKRz1LFkgE=,4Mz1nimQha3Z9aTfqrzr9CJTzCSsUVRPBKPTXZgG85oJmuezRqZriijGPFgCPXHFm65wCS6krKpbTLgFEoNR4tDK\', \'ids\': \'18\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Tl+INgvqVYVpGI1uMVLtUxpTa7fqcpOaIj0aqW30uo4=,2zNsM4XMXHDVF5aUtze9VAMqrGhbxAxpJfuKmNJQ5yQ43SYSFYmFrXyJir7o7TvERvewA9HCUaawFqUaYqbHjhcn\', \'ids\': \'19\'}\nWriting record for David Venturi\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavepqSu5eoLj9AKrE8VU1eRHqpLNYEiVYW93kEUx1hknugq for David Venturi\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepqSu5eoLj9AKrE8VU1eRHqpLNYEiVYW93kEUx1hknugq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,qfNP8xYLBXMu12S+7zvnxzEbwxgmM9jEQ2BmB9Qc0n4=,ULqvW8W1jp7oABnk8Wo9YpMHpV4YtevmghQedikHQ2vn3AXBFPTfvhmvY36nEXpAsxSF5K7dxBhg5aj7GHjKnBz\', \'ids\': \'20\'}\nWriting record for Michael Jordan\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave22UJH4ZLA5GyPhwAJGVHAKW941yHS2f865YT536hB2ERF for Michael Jordan\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22UJH4ZLA5GyPhwAJGVHAKW941yHS2f865YT536hB2ERF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,MDGbFUQ8LBRjc75zIrt49MwutWqstZUOa6i1BZErT0g=,5xyZdq3n3PWhm1hRQigjciEz8XTMNHy4UEd3bi6Tfc73fxPX2JtE9d5XuVLpsa6R9AE81f54AMtDTXhSBU65wkwk\', \'ids\': \'21\'}\nWriting record for Eran Kampf\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2AKhG7VDWkaXH9JJu7qntzjL7VG73pN8RsXR2WfnM6i5W for Eran Kampf\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AKhG7VDWkaXH9JJu7qntzjL7VG73pN8RsXR2WfnM6i5W\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,R4zTcHZwRZ7cInjsRmshFwX2imOwy+cypTPOR7lYtqw=,5nooqTmbZALb6SKtMVW1DRLbPCKtyDyVcfEYn64gcfQXGGPn9p1jwAhmZVMhKcD4CNBmFZuULoBtQMoXFgT9Zpz4\', \'ids\': \'22\'}\nWriting record for Oliver Lindberg\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavef17NKLEAN6HMixT3Fo35axqjQbQvAk7bmycrjD2Qy6Wp for Oliver Lindberg\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavef17NKLEAN6HMixT3Fo35axqjQbQvAk7bmycrjD2Qy6Wp\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,JoRbwNncqtJ0SrBduuP4/jihnE0szaDnN4JpFP101VY=,5dq1LudQp1ZBYaKr4inzVpB3jvqx3WSpgN8aotbUaPg8Z2u2PYR8mZ8UVWCGuB2Zn66CjTHJr6HuUVRVRt1QFxqF\', \'ids\': \'23\'}\nWriting record for Xu Wenhao\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavekLfLRHGf2jKSCRQLSZa6SRBsR8kBMEBNXRehypxbzNq1 for Xu Wenhao\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavekLfLRHGf2jKSCRQLSZa6SRBsR8kBMEBNXRehypxbzNq1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,j7hrslO7IlJbsVPne3AfVs9qA9S/GL4V7+3w1ufQbxc=,3dNC95bh2wr6RbiRTiEbhTzVinLMGfC9vQS9eLX1Bifi8SQPdSBHi7xE6ppysUmw9tv7KCcLifz8WC2GXBjwskcd\', \'ids\': \'24\'}\nWriting record for Netflix Technology Blog\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2Bd6edL5Zoa6qkTrBXSEGTrG5DrrGsRPmCt9fbcsbzPHW for Netflix Technology Blog\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2Bd6edL5Zoa6qkTrBXSEGTrG5DrrGsRPmCt9fbcsbzPHW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,jK1Qt/c87qPPyk+MidIfUifx7DTCM6wBmOYYTVrjFnk=,5d42fKGdLHcFv4qeF2CBwknQgKqL71oxTtFkGa8Pcrh6S9ZdpBoqMJrFerodLRTcL6KkY2uwW59rWDsVkhMEQcas\', \'ids\': \'25\'}\nWriting record for Netflix Technology Blog\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2Bd6edL5Zoa6qkTrBXSEGTrG5DrrGsRPmCt9fbcsbzPHW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,9/BVG7eh0qrMv/+LDm/uBWZlV2thZ1ZHS7Tn7csMang=,cs6rdwpr6Lgo7q95o7ZSJSkvKyMRRGPVm64KckJEADfK23nLuy5P9EZ2UXbihgARa7or11sB5LX9xXChBXMdUPZ\', \'ids\': \'26\'}\nWriting record for Wolf Garbe\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave276LFjhW5EJ37LZ7URktYndr66ZYeyKX2ZxEvNH7EpQbx for Wolf Garbe\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave276LFjhW5EJ37LZ7URktYndr66ZYeyKX2ZxEvNH7EpQbx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,/180MIct6jzCjSJFlSLfbfbKgOHwbdDEMo0NugztfP8=,551vUQJT4FrzjupRvpvAA5LDUTDkzTPD2HMmxa4NifadSPK5cuSY5gHzgm2URidjfJjrsVBiPdSKx9NMh56j3a2X\', \'ids\': \'27\'}\nWriting record for Paul Christiano\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveeiDPX3Hra1aPQta1cza7ZbBf3QqYHtUA6zxA39Q7QyMn for Paul Christiano\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveeiDPX3Hra1aPQta1cza7ZbBf3QqYHtUA6zxA39Q7QyMn\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,CWYqpKBUuVTUmvv0ntBQQchicOZ/g7kepe7DEdvViy4=,4kfbrTupV6RysfyCY92nnNkE8HaXA2ivefnfDdwEQ3WLr7gdXMGWRyJtQy9vFc8evUNJg3ACnRPps7iXJw81949q\', \'ids\': \'28\'}\nWriting record for Robbie Tilton\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave27gK8P6bst6V28DZ98p9KeRD13tFvZMA63sriWMWu4odQ for Robbie Tilton\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave27gK8P6bst6V28DZ98p9KeRD13tFvZMA63sriWMWu4odQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,DhMrYaW87mslljnR36iKhIxRTLCbotU9dye6WI0fgkk=,crdsqqWLmYJyNfjZ21jFxednzmtsYaNk7D3aAcVzAqgbLBHkSor36ztXwi3W4Z7umFUBDgTQr9e5Xpr5UsZ2M1P\', \'ids\': \'29\'}\nWriting record for Netflix Technology Blog\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2Bd6edL5Zoa6qkTrBXSEGTrG5DrrGsRPmCt9fbcsbzPHW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BPFv+CdN7hsg8q/WrUNoNfItHpB+hHQYIoMwurij/qk=,3FFfEXMKwnfvWU3HNVBnUUkaYUqVc3H3CdUaLY2nVosLi8MhF4ydoFGA6bnF5seyxtBJ6HAwT8Jqhp7Gd1gcdYeL\', \'ids\': \'30\'}\nWriting record for James Faghmous \n56f3b1f203e31c31208abb493ebb5d40\nUsing weavey8yQeryZ1E5hMFMMMmV6nC9CogLjWUv6g1KYs7WiSus9 for James Faghmous \n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavey8yQeryZ1E5hMFMMMmV6nC9CogLjWUv6g1KYs7WiSus9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,cgBOW92S/0z/wpTjbLwO9yAYx1cfS2mF0pY1b4KGyI4=,uWNoz1kCNRkhfM6CLNqWFu81SHGJbCaikJBTr5uLT4LvGNaUwyZQXTd5cGvkcEbAQuga288Ep6KounSyLxf3NQ7\', \'ids\': \'31\'}\nWriting record for Datafiniti\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavecbRsqUaiG8rA68QP4aC4Wb62xC3gk8w1KdpAtWqQuyTK for Datafiniti\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavecbRsqUaiG8rA68QP4aC4Wb62xC3gk8w1KdpAtWqQuyTK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HsQH1VqyBsz+QNisMG1Lxu1ZrwWpYciV02gjR67FtWQ=,5hykrLgPDpr5JTJEV7jnYA16RdWjpaYW6N6SfS7zFCjm3cWvgn5uWKf8Xbx9B9wqdtSRyR3d6DfSs6ZDjCnU4hwd\', \'ids\': \'32\'}\nWriting record for Arjan Haring 🔮🔨\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave28gtaXE6CKcV34Wnt34dvTvZiJpvVRMuSqLUfkDASoNG7 for Arjan Haring 🔮🔨\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28gtaXE6CKcV34Wnt34dvTvZiJpvVRMuSqLUfkDASoNG7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Y+KckQDYtMI960AMJOfh28HGDssW1RO01obaxJb1ttk=,2SdTE4c7vRDZx5SiidZiKEJJouNCyFfTUcX4UZ3psvbE5nbGn8RwWSsm8EshJWvbetkf2taUdiCrdfhkbBAvVCH6\', \'ids\': \'33\'}\nWriting record for Eventbrite\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavegsfgroTnDRgcLiSEDM1DRqpFV8uZYXHUa8tifGmJncyW for Eventbrite\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavegsfgroTnDRgcLiSEDM1DRqpFV8uZYXHUa8tifGmJncyW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,8IT0Iu0ulIqYrMgDpyIuKnE39AWPRgmLAXmizbiSCvc=,51Uzfvbpkz5Sf9Y3JPjQCSri8MDGuqmEsLDuDA5VycSnGSC5fGVcMAVnPxZxNDsgB1iTGbpByZ6iDYNBfjbG3qht\', \'ids\': \'34\'}\nWriting record for Akash Shende\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavewSycCHhUWb4vkoC4GwwDQ7pXfMJYnyqYZ8BDpFj2yxU8 for Akash Shende\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewSycCHhUWb4vkoC4GwwDQ7pXfMJYnyqYZ8BDpFj2yxU8\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Aj7urI0Y66Q13l6etwoGIRKP8bePlTZUWZKCDvzD3eM=,2DTrkTPqWkZBVebPGH1NtsueSkthFoE93mVz6fvtRSTifWPEsvLQQacRt7vbauX6MMzG8W8nUfVN43ddtavWSFa1\', \'ids\': \'35\'}\nWriting record for Hrishikesh Huilgolkar\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveifdAvRgVhzhgCj1G1vdZLtPG9aFcMsJx1wCVhvfVNbLb for Hrishikesh Huilgolkar\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveifdAvRgVhzhgCj1G1vdZLtPG9aFcMsJx1wCVhvfVNbLb\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,9ff8UFF56r3R/KCESMtdCm4GXaYzA7rHCB1bs++OOXM=,65L8shztnuZ3q4SgkcnQu7qHSxeJ2ugXz7PJPmcSTSj9JTVhN6qRME9fzb1pboHTfQrAAf3dJNtcgkYbmr7anLw2\', \'ids\': \'36\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,DDg+YR0JNdRiNKBxTKPn8EpLTLv01Z/FYW8BR0MQFK0=,4XS1E3mQeATeP3nymZzm6jGVXLduGrmFBemWnt9zQKaFAfViJ7azfZ8CyuU9HgD75bSzHYabmtPYRioxq8gaf1c2\', \'ids\': \'37\'}\nWriting record for Shivon Zilis\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavezxfoPwdvth7EwN9hKF73fQcTzJKywTkpo1bMhi33PHc5 for Shivon Zilis\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavezxfoPwdvth7EwN9hKF73fQcTzJKywTkpo1bMhi33PHc5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,cmOLtm/dts/18aV9wB/j1Ktzx8pDfWGRj97UXgpR15g=,hYSYsmcz4HWMcHqBuHeHmSykCK4bgogy1TAbZJHrrqiUrQCSzJgNStuYJiaxpLsGrjKcyf2WrHwcSDJHe7oLN1v\', \'ids\': \'38\'}\nWriting record for AirbnbEng\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveyoiyAyPiaUrqdc6TynF2qp9SV5xXCBsMmUYb7Yec6urD for AirbnbEng\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyoiyAyPiaUrqdc6TynF2qp9SV5xXCBsMmUYb7Yec6urD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,2fZEkN3WAO/fyOiKEzThLkF0b2JRh43S/IQJ1hHuiUg=,6641peeXM9Px559gR24oRfYertXgwMNLeGJhFKnCa4tQxJCDmX5ejkfPwQ46PUPAPPSPJrB8cs8WNCbEfHy8v3qh\', \'ids\': \'39\'}\nWriting record for Yingjie Miao \n56f3b1f203e31c31208abb493ebb5d40\nUsing weavegbF6z3K5Yu6245Tm64QWDXwEakDgWV8E8BUJ1SH5nXEt for Yingjie Miao \n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavegbF6z3K5Yu6245Tm64QWDXwEakDgWV8E8BUJ1SH5nXEt\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,ktuEpZd1pJvg81H8WYqpYzd7ey+4NzQTc6hsjFH47/Q=,DRRsek9sFzSUdTQQaT4K5aEdpwhUvkxvqWWKZ3NipcUVXtiJHL8DHkgx1VMxEqCmchHcEFqN6nHZjCVnWAXhTyo\', \'ids\': \'40\'}\nWriting record for Pinterest Engineering\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveu7vhCJxM8Z1JTZNZPrmn3EeV5NEM1kdZ8mpGDcPArfjK for Pinterest Engineering\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveu7vhCJxM8Z1JTZNZPrmn3EeV5NEM1kdZ8mpGDcPArfjK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,uP3FkYDHpELQld1VNWfZQ+unktmHXRlXsGOa9sDadl8=,3nNJ3NFSWAk5Gyd7XTzuRhPDbZxw1Jb1CMUTT2pXEzVsYitQa4E2D67tib7oUVGmUqTYC9NbnSptJcr8cFycLWN5\', \'ids\': \'41\'}\nWriting record for Nikhil Dandekar\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2AbhabBWegLrtcwTfxAgGfSfPY5yinBtQMAJBFp4Qd7Ja for Nikhil Dandekar\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AbhabBWegLrtcwTfxAgGfSfPY5yinBtQMAJBFp4Qd7Ja\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,n4niPTFLztSg5Fr+KpjfcxQOb62T2IDQNpil2yctTyc=,5QnqR6NdkqVQBdofh6xzupsnZGEic71qfUcNUcMbaWJ6uxmjDTEAVTwKpgLVFXV5sGc3mbAsfRMGDa26MmLDvubU\', \'ids\': \'42\'}\nWriting record for Jeff Smith\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavesqpXLE6sBdse76aTmJ9i43XHarQsNZ1XX3GDPSM3qNeW for Jeff Smith\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavesqpXLE6sBdse76aTmJ9i43XHarQsNZ1XX3GDPSM3qNeW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6GigpiPV1r9StTNcplLcF+EwqaIRSyIy1EUdOsAnarY=,2VNTuLm1dhUJP8cRGh7uqtR43A2tZGmQzn9GojtZy6JuFGmeZwdAKyCxNztVgsg3iSeKHt5XLagCwDJGGh92cVPN\', \'ids\': \'43\'}\nWriting record for Chris Jagers\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavetx2LeihsqoHqTAvsNQJRp53G79SuXqXSoESzbyE3rVjj for Chris Jagers\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavetx2LeihsqoHqTAvsNQJRp53G79SuXqXSoESzbyE3rVjj\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HXtvJLYjrM9CBC/SQZEbJ/kSTA7WZfckVqlgH0P9nVI=,5ZXyA3RoXTe1AvDMj9reK6NafbTps8rjJLQXzxzN9idpYJH7sa2urnHzYcZrHGpn2ooB7sc3bkJND52wqqz2S1VK\', \'ids\': \'44\'}\nWriting record for John Wittenauer\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveqanAgFhbb8CQJyMKX6jFDfLKpz3iGBcTBkqRGhsSG9TF for John Wittenauer\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqanAgFhbb8CQJyMKX6jFDfLKpz3iGBcTBkqRGhsSG9TF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6gE6i3WvrJSrjG5b35OtP09PpCsaThDF4h2k9ZIFwg8=,3pnkXAqeQEUXFi4ftcbXqfiEiajmhGrNuhRd66B7Wh5smuQ5f3ycoJ8ztDwbVgfMMU6BSTtVy6CGBbbKxD1FFJTk\', \'ids\': \'45\'}\nWriting record for Pinterest Engineering\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveu7vhCJxM8Z1JTZNZPrmn3EeV5NEM1kdZ8mpGDcPArfjK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,zlClyv9pGQZWJkpp77Y3a5Y0GO/RjQQ/CgklsiJwttw=,5NB5qkTAyubMMzAy1PzFTUjd5gUJWvAeqFXDiqhAujVC3tt6eUAuNAAZKyV4XSchhWs4qXKKPYQwNjs2in5HxpaS\', \'ids\': \'46\'}\nWriting record for Christopher Nguyen\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavevwbbRwepYQb5NJGCptLkNZ4xPgsxwoHKMvdMGgZw75hu for Christopher Nguyen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevwbbRwepYQb5NJGCptLkNZ4xPgsxwoHKMvdMGgZw75hu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,McHNMLLRI3Dj/51xSEqsMP3ULc1pOnGkEK3JmIXn7CY=,4dp7C4NXQvR9be9YnAm3F5XncAZXdTouNSmhNpVWMUN4xTtjATXCfCfiTG1W8EuZsqAny681HVXKcVSEnnkuN28m\', \'ids\': \'47\'}\nWriting record for Per Harald Borgen\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveq2xt72H3CMNktaFK6Yf4Y6qm1q4bhWXts8QByyz7pCck for Per Harald Borgen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveq2xt72H3CMNktaFK6Yf4Y6qm1q4bhWXts8QByyz7pCck\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xosPECQBwa01U1m2C8O70vmsCuqRlb+jVO8F7OtSBh0=,26mRoDpwRhJ5ZwSxB8C2vdhcSVkGXpeNiTSXQmqEmLyaR3yDwHErpZbA4ADELoN86cgrfe2M613CEnJmjtQbpGwR\', \'ids\': \'48\'}\nWriting record for Ahmed El Deeb\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavepmGSuFp8cQhfXDGqKvECPdMvUJFrTpn6wmen2v1EZTUj for Ahmed El Deeb\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepmGSuFp8cQhfXDGqKvECPdMvUJFrTpn6wmen2v1EZTUj\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,tqZ2ll/GHhUSXF3U0FRWani0qbS8Xo7agwzZGOKPUaQ=,qF9FqHsui23G1cpBWXTJ3hPXBGApbscJWjSvj2fQzk3McbjkeUPXFsF3tgXR1ofSVgRfwaz9jQUqcTVeGhePvof\', \'ids\': \'49\'}\nWriting record for Matt Fogel\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveiFZoogh8MZSckp5MhxhNJ2c4qUJ9LqeJnYdtNrA3oNd5 for Matt Fogel\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiFZoogh8MZSckp5MhxhNJ2c4qUJ9LqeJnYdtNrA3oNd5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xLTOvxHgwaa+LPW0uDU5HeToHZ6Tf3UdxSyaN/rYvoA=,3hhu12KhCMzfyHwtBWLZE8YvjTrBrbeR56ET1HJ9LBB19AWYgtyCnRXGV2kdUcJc5Jyo7kRpaoTqwStffRo3Lsr7\', \'ids\': \'50\'}\nWriting record for Illia Polosukhin\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavekgh9mDUynkbusDL1wjYT6jrgGterAXMEm1JPHSTPtEQJ for Illia Polosukhin\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavekgh9mDUynkbusDL1wjYT6jrgGterAXMEm1JPHSTPtEQJ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,L8R+YRnIwW9X9yOK97DpaG7TkpKjI78UleUEECh9MR0=,Ko1vtMSzTn1re38n1ZtQ5RQuh4zpUiDeM8LcgQ4r1h3oVeEZWMhvcpv9ABXctKiEFDQpqDPe9TB38vPWnTNeiYe\', \'ids\': \'51\'}\nWriting record for Ahmed El Deeb\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepmGSuFp8cQhfXDGqKvECPdMvUJFrTpn6wmen2v1EZTUj\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,U1mljuR92mofWLbOC0e9igXcLZD2cotueigU6H01YGw=,3ZGxWU5Eao95fuCFkwGS1VxxRkXm7o7SjSFKubPHYjiVsSWY2BJaFVKWRXL7WjWx7GjgBqBnbC6xTSwzXBKfbjxt\', \'ids\': \'52\'}\nWriting record for Christophe Bourguignat\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave24eiJL4tu8LbexzxW4nFG25gfGEStgh9cLPbGF7mVYoXR for Christophe Bourguignat\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave24eiJL4tu8LbexzxW4nFG25gfGEStgh9cLPbGF7mVYoXR\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,jWCaaDRTEAd8+ylpT2/8OtjAPkKM9uPVbCnS92BlH/E=,5fWBvkNULMg3FHXfxwa6yNAAn79BtEtDgGwoDHUrWR9re8oj8cvCFEDnVty6aswFVXwxxczDnvWRU5sJ1mVQGMc7\', \'ids\': \'53\'}\nWriting record for I\'Boss Potiwarakorn\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavejFmwrMcXDQkNtNXS4JnSYYQ7A9hEzmBM7uhmRkV23Pjo for I\'Boss Potiwarakorn\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavejFmwrMcXDQkNtNXS4JnSYYQ7A9hEzmBM7uhmRkV23Pjo\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,cIae2Gxud8gSwytDUF3m3HiyPCrioobbuw5jTdlXNEA=,4pwxL1bxqQb8pnt1V2K7p7GBoo6DnmK3yogUddKYASiCKMQgytwHLHeX9PN5sX7FkjTN5S39REaZL232vHExXWFF\', \'ids\': \'54\'}\nWriting record for samim\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavev2ENed3oJ1NLhietvN2UxJ3MN1NtP2FEwJhhmgm6458w for samim\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavev2ENed3oJ1NLhietvN2UxJ3MN1NtP2FEwJhhmgm6458w\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,swUAvVtDUZ9Gi4c5MpXR3xf61J8nYWOliNRzjbd5Wd8=,4yMQuHuFHhEjLbsmVyT5JyfVx6EYamCxtS2dctqFSUv9ob3m1NZ7L5SAyDSWHhNVRPR5cKNpBCfY6ozuoSQtE2cY\', \'ids\': \'55\'}\nWriting record for AirbnbEng\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyoiyAyPiaUrqdc6TynF2qp9SV5xXCBsMmUYb7Yec6urD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,tCVztlQ7jQhl4c0bHCvCiJRNFbnNM1Ciu76u6rARG+w=,3ent9Q3Gr1cMik8Dmfaxkg9AZppuKzJykqQ1rtZRP1WXf7CB36JKtc74gjex4Q2dD3xXMXGqJQt8bxkh46oTpC14\', \'ids\': \'56\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,VXmFjm9D/U7a9Zz7vL/9Scs/+KwtPk2DUnxIhebIRCw=,2xUsFGHFETs1c1QVGJFQeaYEyE6HdFTrpp2JNjdLDTaBhdF8mNjCAFVYV652nU9waWRfPkABU4Q3iChGCcGenubF\', \'ids\': \'57\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,DLg3/kFJA0psku7CEzp0F5bfVMpG4+N4UlRMeWmszyE=,zrBiMPvFfSqqWmg7j62iNajod3jrebKBbHwtJGTRxQJ3jw2TA9ew9kV7eivdVgixV4LnFrLcJZyksSLTvyQbKir\', \'ids\': \'58\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,XQsbqQFgatTAfgmeo5Ngh7VPrw3HU61RitcUwgMrZ20=,4wkk3Hcbc8GtphVFBmH3W4Uhmutpab6TeEmpMJRhPuvGPuNAMSc31oJj2G4s1YAXQGQZR4ZaeuEdzZo7KjxRrQSP\', \'ids\': \'59\'}\nWriting record for Arthur Juliani\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,XLJP5Oa/uliklxTMv7iQCZBFXaVTkSsIg4uuE9Kx1P4=,sHiNU74ej7rNLPhfQLC2FarVra2T25qv48q8xzsHvtZBkBjhjdjoXc85LsvXUZ8gFxsEEaepUz7yWsWwjoweSYM\', \'ids\': \'60\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,w1ILvJklrx+NXNri9VWpU5mll29MhF9vr499RlTm4yk=,4rHCF8NgVL3e1XuaGH22uz71vaNq1imUHef8XgA6BzWkq9CTK2MpJTf2yKoCwksNytFmKU99pCHvDQRLngu4aEct\', \'ids\': \'61\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,0hbPuLBgy5jOzLn6TUABNVGt4a5F+o+lHk4ItUUNVBM=,3wjVBbpPfTRP6jCAKmMd3fVVtGVCMDYzJU9eH8z6cPAXNNf3PEd4Jvu9T6aF7t2GrXiRihJnmvBJg1pbnGBTvwJq\', \'ids\': \'62\'}\nWriting record for Tal Perry\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavemQ83gdkjq27b1HTv8m4mj2fRB32HP6T1GYWePAsPg99E for Tal Perry\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemQ83gdkjq27b1HTv8m4mj2fRB32HP6T1GYWePAsPg99E\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,awNYlLFVHI1GYLkqoGTi/UWeJn3Pp3e9TQCb4Bk66sM=,4uHKTKixRFSBBMKGHU6341kMMWSQj6w48j6wh2RV4Qc9XTmf8Sdyx48eWU9ax5bmsQhof3JpfjGRgg93sG9LeYur\', \'ids\': \'63\'}\nWriting record for Andrej Karpathy\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2AJvcy86CZgw3hdwnoXahQuVko8VXPMTpm7VwU7Zpoxhx for Andrej Karpathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AJvcy86CZgw3hdwnoXahQuVko8VXPMTpm7VwU7Zpoxhx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,jffIuUqXklaSVsE70d/2BJ5Ca6u+gqtVj0pR55+0GQg=,5NzMc3NExhBFdnnffiw618KR8wQyff2NXzuju1uoy9U9N588WMP9vPi7USbLLaEq6uWbW36asma3neX1HoBBchMA\', \'ids\': \'64\'}\nWriting record for Per Harald Borgen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveq2xt72H3CMNktaFK6Yf4Y6qm1q4bhWXts8QByyz7pCck\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,YwFWkSYsgDk+cbjSuLbUu23TjS6o+VwZIcTTixOUH9s=,3QbwN2kqfgSfgtB4wpjYSDsYrb5rPtzCBxbxpKSTSgB1aYmYh7mdkjCKs8Hm1zRLwgu2bbXFbyjFRWjyrdR3AJGx\', \'ids\': \'65\'}\nWriting record for Xiaohan Zeng\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave274mgR5wCdAZHhj985J8cjNaxtcRGuhGWXcunoqPqLctE\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,cRHBeyah8PBPMrv0zgBB4nvBtweRaQzwPL8mE3JxHJA=,2ZYDfQuEczpLQdxFaobh3LzpPoqLSPPcv5mKA4fbH1TVfLrxZwNRiN9jhXTZcbHWqhEC3L2uy9146t8y8vjT5h1h\', \'ids\': \'66\'}\nWriting record for Gil Fewster\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28hJgLv9G3ku9ozEiukbaTgCR7TVxx2Q84aS1Ly9eWM1Z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,9yyEBpNKcBoxKVKOa0aFi9w1mtE+tLmKD1bq2i/07d4=,5ZtA65E4UxMaX6q7ewpb1Ea5Zw4hRLTAmGAErvT41TygQ6zPkwDjx7GpAcvALqQzZDKswVwV18q1LxmshjW4W1Ry\', \'ids\': \'67\'}\nWriting record for David Venturi\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepqSu5eoLj9AKrE8VU1eRHqpLNYEiVYW93kEUx1hknugq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,AWbpPT5cC/WtUBHvS3+Wb27UlWD8yeLi+0VYXpQN4GI=,5AgumQ6uoazzA4MooX2ntfJ863bQPAPqmo3BTHRWxp4Ng12VqyQLfidjt4pyUxWrPVrVBdLtQucH117xQUpRWyVd\', \'ids\': \'68\'}\nWriting record for Vishal Maini\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave28KtG4u3HdMjyBKkiv4rQjDwx1mr19E92BZgxYvYEwncM for Vishal Maini\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28KtG4u3HdMjyBKkiv4rQjDwx1mr19E92BZgxYvYEwncM\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,WnkR1hVxShpms8ATmsK1fBJT1UxQnB9Rm6kzS70+N64=,4XDG2LE9RV6WJsnBueGqoeYzUDpcAaZGuUdMqUe6oikDueTKihnxVpWqLCSWUZxKmtCcAWug5Sg5BgXRn9mgpfXb\', \'ids\': \'69\'}\nWriting record for Tim Anglade\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveiRAqixNQ6m9pa5jGYAATnGriDenB6Aahi5XCuGjp67Eo for Tim Anglade\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiRAqixNQ6m9pa5jGYAATnGriDenB6Aahi5XCuGjp67Eo\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,mtShpMaMzvYoFP0KMXKzLYVG+Gh+B7qHSnCDHAk4cfY=,45usFxkZEPk9HdsNT552EsNsUJ2tyiZj7r4EANERDKdiUgjL5MsYS5HvcQX8BAbQ2XExqbvdWRYj5hAeiCVkWmpz\', \'ids\': \'70\'}\nWriting record for Sophia Ciocca\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave29ubKDvoREb2xApQWaJKnrBnt9Qw9iJ3MhCtueBb3ersc for Sophia Ciocca\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave29ubKDvoREb2xApQWaJKnrBnt9Qw9iJ3MhCtueBb3ersc\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3qfpg+fS1N7mGr6h+BpZoERDOojAAwH2hpv42hnB0OA=,385iX37Q6tSjQAh4GppwnRKhQvoVKnNtdgHQRrhgVfcvpqNbQHCk98MMZED5MJzT6XkwiKdNenyXVSSNSrjzddSP\', \'ids\': \'71\'}\nWriting record for Dhruv Parthasarathy\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaven4oGoFxRccnvaCzqY7RQhuZdhSs1ZA9By3fFft2QGvzu for Dhruv Parthasarathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4oGoFxRccnvaCzqY7RQhuZdhSs1ZA9By3fFft2QGvzu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,5XkYfEUToO/KcYdcg9d6VUIOOixK1lfwtCtaSEiv3jI=,5UzgNeZYy9Jo7AYCBwJfVmBufrrDwWMRSedgMGkskGx9eUEwXJkxJbM9ZefwB7JTfMznXRUcE9H1Vaz9yxtZRNtf\', \'ids\': \'72\'}\nWriting record for Andrej Karpathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AJvcy86CZgw3hdwnoXahQuVko8VXPMTpm7VwU7Zpoxhx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HvMzrDDqNb+ryArUh589cXMH/3n0O+PdHnAE3Avu7SI=,4yUAvLnt5rwbxVCxaa41SKVmXftmaWmLsGW3GkpxrZWXkGH3Y5rkrqkwiKuHFK7fXkyv9uymi9268DTogR3RfUJs\', \'ids\': \'73\'}\nWriting record for Sebastian Heinz\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave22zZtvUz3DRVDLcaBkA7mCwgE62HxY895N4rLfVsq56fP for Sebastian Heinz\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22zZtvUz3DRVDLcaBkA7mCwgE62HxY895N4rLfVsq56fP\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,TSG32VSs8cfN5aznOk0aFKFby+QyilABtTxsMHoqNQc=,5khQtag7uAn4f5iwEh3j4db3cd1nwBLiM2sPLspoafY4fZnHD5jSZPgbonJzo62dY9HB5JFHLvuvRRe7zet9MC21\', \'ids\': \'74\'}\nWriting record for Netflix Technology Blog\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2Bd6edL5Zoa6qkTrBXSEGTrG5DrrGsRPmCt9fbcsbzPHW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,LaQI9FBvMh9h39y52BeXooCZj0E+Mq7jFrWnDj7FJZA=,43URjphUTQvTntm2FC8SncL8awEPo5pcatEtiZYbA3xcqSrWtaXR4phME6w4WsMM6ec2EwYV2GAc5eVbbuLmRpcb\', \'ids\': \'75\'}\nWriting record for Michael Jordan\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22UJH4ZLA5GyPhwAJGVHAKW941yHS2f865YT536hB2ERF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rqW6WGMfoetvwh6iPn1BytISC+ynSDHSm4IKBqhVAbk=,yEscTrZYDQugtzuVhgn5TEc1eN5qjC3Kb9xLqZCLhgeRKcukF4ocuTAHXTM6iXuG7862D6vPm6ufrH2zqJCRwuV\', \'ids\': \'76\'}\nWriting record for Blaise Aguera y Arcas\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave25FmmS1C3HkoQEe4scEiy4cEC4hzmQ6AXbRWcDZUuBtC9 for Blaise Aguera y Arcas\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave25FmmS1C3HkoQEe4scEiy4cEC4hzmQ6AXbRWcDZUuBtC9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,LmREpHgqx9NyIdA+DdPGGBSEPqtcGVZ4/8y/M4TSZC8=,3bbhgLLqv9vZZVxjMrhfwCrf9WkgrAQMqFiFroQGrPJxzc4F38d1q5n2dsDb8Prkz3XnNrP656sMjNKyTQNE3Kx8\', \'ids\': \'77\'}\nWriting record for James Le\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveksdiyEuknX381n4PU68M5MeGpLAWRWLGkGSawiz7Hf5Y for James Le\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveksdiyEuknX381n4PU68M5MeGpLAWRWLGkGSawiz7Hf5Y\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,C4Sh7/VpEJTs3mfb+uwxYYXr058a+whHdUDN1kc5aRo=,VGMwiwvgjispoKnmi61uBGj6H7c3AwyMGsh9GPd5SixLPWBnBWBfqTEjoLXDehVnQgKv4bzXczcB12pad63rQnp\', \'ids\': \'78\'}\nWriting record for Emmanuel Ameisen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavez2Lr5qDk5LC3zPUxFakrxyRJUNb1LQ9QzEDHRG2Gm8ix\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,pYXSKgJiQQFBDAe4YsmahuhCML/Z0kIuHOmHKSIe/oo=,3gamd7W9V6aPMeeVMtUUNvGstk2jo22pTUKWNUY8uy9388pTxoWViHuoJZ6TpMELKfiYP63vacVdL8DbbPSESG1H\', \'ids\': \'79\'}\nWriting record for Mybridge\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveyg6tSP8HtD5Zt62AjLBRjXFkCeYF1F5WLLrL2VapTTU1 for Mybridge\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyg6tSP8HtD5Zt62AjLBRjXFkCeYF1F5WLLrL2VapTTU1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,kagoWMyq0O+XtuTKO/7f+iY464876YJt7q2Q6EEqHqw=,2uCkX9fSq8DUVP9KnUJv8oUEjHGi634DQ3G3WG61zfRgqcQyX96XKUcYQAGVDiKEfeFgBi7bKcqg2PxxJNFbUywS\', \'ids\': \'80\'}\nWriting record for David Foster\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavecXvMjKVHcPsjrDa3b5VN9YVdhKDjWDzhuDjhzfqswAdT for David Foster\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavecXvMjKVHcPsjrDa3b5VN9YVdhKDjWDzhuDjhzfqswAdT\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,LUeOm/h1sgFu+J/XSqGKK494IkTEC6TdAG2bZuwAjgU=,5MZTjPwVsjCaLFYg1uFLFRiH1v4stgBhQgWP3BTKiZNwzK7N6RQJxbFZKzckqYRLodxQVzi2vCSz5mZp95tiH3ND\', \'ids\': \'81\'}\nWriting record for George Seif\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavewsHzhnmUY4J7AJbpqzxHARcCrTMYhNuZMRXKM5vxhdeD for George Seif\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewsHzhnmUY4J7AJbpqzxHARcCrTMYhNuZMRXKM5vxhdeD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,T7v11ACdtSJGrfOoJNOPqe3yivVwgq7MFR4J4+DvSNM=,4g7VGVgzqoJBNokbHY6iZywdB7xMDtYFSpYVZprG2a76bZemEStFFep5YTgjTViKsvFHSSdRcBn5dY2vpiqnJsX3\', \'ids\': \'82\'}\nWriting record for Mybridge\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyg6tSP8HtD5Zt62AjLBRjXFkCeYF1F5WLLrL2VapTTU1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rBUmBDC0voaCiGqHrV9DEEm9HeTeQgTDak/4JWsRb+Y=,5x9J6LoRr2rZ1DJojFkkTevp5Jg483jD5EWAQqAzLzoPgDp9DcYgHWeTuyg4o1W75VkhaHMfEVpQfPEVouEDgpVV\', \'ids\': \'83\'}\nWriting record for Simon Greenman\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavesFxt4k745VEruF2fQdNQt9nXvaCxPkQBvwqMqyoJxGDM for Simon Greenman\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavesFxt4k745VEruF2fQdNQt9nXvaCxPkQBvwqMqyoJxGDM\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,GWhQ6OtuZ1N9mVQqe150znQ9iUdXEquv4ZHTpnqB2qo=,5Esocmz5ymwnu9abaAsVqJbDUpjcFi3PgBBhPLrt6oWX1AvdbzYqcGJq7hWAKcr83SZhNPogCttRsAfSVuGVd25u\', \'ids\': \'84\'}\nWriting record for Eugenio Culurciello\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavepxPwEkHfD7sDabbEMN4Rj9F92LiY6ZN7oKpwGWeUYzZN for Eugenio Culurciello\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepxPwEkHfD7sDabbEMN4Rj9F92LiY6ZN7oKpwGWeUYzZN\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,DrWRB1SfWO8WO3t/eBtNSiiJCVCpp3N7gQlHYAlbG+Y=,4bDZBGv9AWosif7tPhGiExppWUAXt4wDn41n5t3MB233GChSySm13ChDJxL6qDQjS2iha3QUQV7StgEbby28oXaK\', \'ids\': \'85\'}\nWriting record for WiseWolf Fund\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavekSyF5QmERBNwMwgxG65mzo2NK2czaFP3V434PPm5vWyC for WiseWolf Fund\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavekSyF5QmERBNwMwgxG65mzo2NK2czaFP3V434PPm5vWyC\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6K1e1Qak1lt31LxhOOiOlPjGvtAt8jZq3AUJC7O3S24=,35inoi3utXPCK2LVCEUv98qbAYm4szzYvGDE9SWtUPBqFChL2e6fAsp2JGnWBCUPoWntgCH8DxvNkZQC1GYgdbEV\', \'ids\': \'86\'}\nWriting record for Justin Lee\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyHb6WF1WBk5ZMQpMm1eG9uugi4MXnSgoAetTARcR9izE\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,QpdJ3VI7r2U9Jjkc2CzW2+hgfJeqGQ8Rs2SwYpo/POU=,357VivoJeUJYFEwjpRuwDR6TK3qsfnd8fpWCzmskadMP7RfYySgPXeV2BWSiKx3SHv41Ej8L5gZ2F7UqMoZVxt1A\', \'ids\': \'87\'}\nWriting record for Michael Solana\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave224xRqfQ2wfYniYUtJKmC3Agj2aZML1pBbzERdBMyz7XY for Michael Solana\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave224xRqfQ2wfYniYUtJKmC3Agj2aZML1pBbzERdBMyz7XY\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rzw8gd3MP7hdzZ5v373XHEPzRypJLFikooRgBWKeaPU=,41K17Ag37cAYNHWzXWPYy2kr9Cwgw9fZhKnvxdHHtSPXKomvPYsccCCNBXTix9T8v3tZhihdpmNP3qqFYcL3q2U1\', \'ids\': \'88\'}\nWriting record for Emmanuel Ameisen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavez2Lr5qDk5LC3zPUxFakrxyRJUNb1LQ9QzEDHRG2Gm8ix\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,tAKxJXMjyJmlsVRx9QL8DzbUyMeHdiwOQkRoJxsWkyc=,5ES8P8f5Gr4ALtnQGyHkwe5dGXZCEeaq2zFsXhAyubcnEuQsWEabd79Vp5bXRhaKKEQcZRiYyBot1GaakHC3NYJJ\', \'ids\': \'89\'}\nWriting record for Irhum Shafkat\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21Jj2Zs46JsdG9AxgrABy3pr6CBsjZBV862q7SAvs6Jj4\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Hrd1oows4Zew3wy1am3wdTwXpsbNyyQ/0BTLyUGKxnU=,5ZJEDCtQCY9r6kzepFo7Ey1VhxcnkrK8TYNw925zJyYRiJyqLccCjGfphPRLGF7h5JVi36DSArKUsNGxn5qAyGYH\', \'ids\': \'90\'}\nWriting record for Sam Drozdov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21P5vXr69n69QZ6gk9NLz5BbkDFiUYNgjm2RzEsePnYPQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,k8pyI3+J4wBIkD0HhcoOxUFghMXAHxdF5vT0wYH25k0=,2sGQNwpyi5jYme5Nk95tQW3dCpRWptDVkf5eTxHtKg8nU7skLksLqDjU3JjuMf3giXK6j2mU7gkU8cbemEFWP2H4\', \'ids\': \'91\'}\nWriting record for Conor Dewey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavebvDnoef2cPLbRtqqH5uA2M1t6Svdz1C3d8zx43481W3z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,dwBBttNxHvoEB8G6sk7tv0ilE6TaCevgp8kC7Uws6aI=,RHCg4E8NqNNpVFWhcTh4ijay4WwV55RpuW4Sworgm4RdKBzfXrv7fLkkcz3p2DYgU4vUTrux7nvhkwby1e84P9J\', \'ids\': \'92\'}\nWriting record for Abhishek Parbhakar\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewYC94Hwi5bGhFeorEp2sghZKXBWx1yreFYBAs5Qjnmz7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Oq8qkqCDeAVhc39bUAEMRQf5c8i+Gi4Vj4I+U74FSlY=,2N6EC8YcvryrpUAuH4GHX6ZC88ywLwea5BL3U66UAjAGSsqpvBcXh6qgXzZFUxPHuX3w2La4yQQa77wwqz6usCEP\', \'ids\': \'93\'}\nWriting record for Aman Dalmia\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexjioGxCmvk2znFELkHXASjMbJzqMGX53a3wTjdmVo2q5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,9s/he88OPeU1BpwGQm8a+8yAE2/11RIrmXCGtEIOFVo=,4SrzJifQDbApCeVc5PLZ8Eq6QXyCh8LBoujWB61Pc81UC9TF8Rp432kcXmaSmLY7DAYtJT7CX2stWsookdQRwLM8\', \'ids\': \'94\'}\nWriting record for Lance Ulanoff\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavehnFy2boRD47pcHqfkDJRJNNtdrZfgyRvjRg3G2cuVTsg for Lance Ulanoff\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavehnFy2boRD47pcHqfkDJRJNNtdrZfgyRvjRg3G2cuVTsg\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,/0MPgJjAwgnLwv5NB+fhL6MxgEHKjGOwngo/MH2Vuz8=,6X74F9eRgX6tx2hfTdBzEJRZ2ByWcA3m5JUhyqtnia93zvFctk2sKiuWS6FZttcDy7PeL2fU7v7BU8GdPG7qqVr\', \'ids\': \'95\'}\nWriting record for Sophia Arakelyan\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavecd1LPk6JgVEBxkxgTrSGGYQ625qTzbgrB3WoLozGtFLT\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,UVCbkSwdyNCj2Z6LswlF9MBklg1LnNzrhlfa+9uqNfE=,4CSoWViUmRwTVX5hURt6ZRvFp1Z1Sz1mCJYNfxoufdJcrtiouEdHWT3H87stRuFiu7XApCRstJn3UAUdn9bFiHSQ\', \'ids\': \'96\'}\nWriting record for Matt Schlicht\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave25CnzND8fziyxiK7G42YdLXTkrTL1zn2SL1LuLzHB6JS3 for Matt Schlicht\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave25CnzND8fziyxiK7G42YdLXTkrTL1zn2SL1LuLzHB6JS3\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,WslizXjytFavABD5+Ac1+e9HOvJol2tgNIGKvNTpQyA=,3Sy1hkaw4jtnE6fdpxPBz9NuqPsR5GbNdvU9TA9rbNkPyTB4CQUZBkPR4En9F5jnz4vCqY8HkhMU68CdhKQSgCzD\', \'ids\': \'97\'}\nWriting record for Gil Fewster\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28hJgLv9G3ku9ozEiukbaTgCR7TVxx2Q84aS1Ly9eWM1Z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,dJFjCgGUkRsDGowVNIxBrnsB3O1SFgPjosdA+uOIUkQ=,53sAJMxMBhyJz1iTWiSqkP5mEfRr39r2sGepPhrr9Psq6su3MHE7HipRNo8fFa2ZSnyVHdrHmPRBwxav5yP6Gvmz\', \'ids\': \'98\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,PVC5ulvTOQJYwgxmdsdTOBzvXuWhIsxgHTDvaJFthT8=,2eUKccfPsLSTZyzTBv6z7TPby1M4CreEVPpSw4sk2TxeLTyVZiDsBj9tuHj6NaarErtoWQhP632rLG6X1tqrhh6y\', \'ids\': \'99\'}\nWriting record for David Venturi\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepqSu5eoLj9AKrE8VU1eRHqpLNYEiVYW93kEUx1hknugq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,PuNNQBuKjlJHMV1YJIwm9ZQuhNZuhKMu67+CZ0u01lk=,5Xr1R7jaExSyYMWfVWQfq9V5ehDGqF4P24PtjED2hRusFWDfuSWgcwxEpcjgzkhhizUnXL6izc6q5GhDRe56uQGu\', \'ids\': \'100\'}\nWriting record for Michael Jordan\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22UJH4ZLA5GyPhwAJGVHAKW941yHS2f865YT536hB2ERF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,17tph3SawgwiEIob0i7nrj+T634fDhmCE8Y62uMkTpo=,2skP66QkVUQ79b36b4LmTBpZFFs7zcuRLR2YMnhKSCevYCpinB3GgFTjG3pHEYQuqDoF8TsS95orrh8SYqr4BToG\', \'ids\': \'101\'}\nWriting record for Milo Spencer-Harper\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,XjacDTRfB2d7Ivvy9i1ndOuflPvZSpke6cLCEWNG7y0=,4gQGyWv3HAaxauysRWWfRRf9R33vhE5HYUkFHYWg2xc6jJJMKdg144MmNEmGQv9PK8LtJjHAhZQXdUwjdbJVkJJn\', \'ids\': \'102\'}\nWriting record for Greg Fish\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavep3mB88tqGxPagZMHtBoB5rHcj5ShCAhVVVCcyvC66iw1 for Greg Fish\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavep3mB88tqGxPagZMHtBoB5rHcj5ShCAhVVVCcyvC66iw1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,XIPOYcN2v+4z+iw0UDIgy7kCd8UJudhwcMq6ExNTAIs=,2bTrt3uEB4bbAruHqKKgmibvspTiJWHYmDD8mqYd93aaq11gP5t8pnPhSExfmim4Bj3aKQBMG79sUYdN9fept4qq\', \'ids\': \'103\'}\nWriting record for Oliver Lindberg\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavef17NKLEAN6HMixT3Fo35axqjQbQvAk7bmycrjD2Qy6Wp\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,MmURnKaurxl+/5agQYcywOR6F34/FF8Iji6dApSpIIo=,5mxuSYjyW8ojto3Qi9MHtQV5sA41RTVQLgGubJjbsRFZsZzgR2oZWkHX2h4tUA4bdhDf8LXaFdsgDgBhapD7t6dS\', \'ids\': \'104\'}\nWriting record for Greg Fish\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavep3mB88tqGxPagZMHtBoB5rHcj5ShCAhVVVCcyvC66iw1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,76hKAzohAPdiLjlYNlzt/0z/xVKyIWBFux3CqoM5K34=,5ptpGowaau4mRSfiV3daG1vKQ55VvXULT6Mgxof4m1Ms52Zn7QrKQvfyqCpLmTuwAFpPGtthNMcQv6kFKdHXe3r5\', \'ids\': \'105\'}\nWriting record for Frank Diana\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavehKPzp4iGNsyh3URCQXDwfwGpwgXPkpXp7xF8UHf9Rpfq for Frank Diana\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavehKPzp4iGNsyh3URCQXDwfwGpwgXPkpXp7xF8UHf9Rpfq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,sn5D0mwhrNIbtHoQBBFcDFYtQoFpgH0bPRCVtCp78b0=,Xwr8RJcCsTzz3yj84QYAwf2h541hPKr3eqYsx3PUW8YGHm7RfcEBA9hxT6aw1YHgqiaepdkdjBbMnDpMe8mFTkR\', \'ids\': \'106\'}\nWriting record for Paul Christiano\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveeiDPX3Hra1aPQta1cza7ZbBf3QqYHtUA6zxA39Q7QyMn\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,EhsND0vNa5t2K348Ew9TtJRc2c2ARo2dmxnHPE2IjzA=,3qTE7FAYbFHtCNSv2Xy5fUVfAHdTL9BdRFhoawZfYkQkx2T6QSiVrLEpi1UsQNW4peNrsZfseharpBjQEQMe6mn\', \'ids\': \'107\'}\nWriting record for Robbie Tilton\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave27gK8P6bst6V28DZ98p9KeRD13tFvZMA63sriWMWu4odQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,K2D/hUyLpkADU6yyiHanFKra0JFAPqboooalw0Hny3M=,5TP2HnEKYQguRmjmdDtFoxyZpsgmzFmvx6qPVwvzujHfDWSwVogLxknS9CMREazzLY6dkt1vVJmts5dsLtRBfPPd\', \'ids\': \'108\'}\nWriting record for Wildcat2030\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavekuv4Ea3CqA1Xz6r2BWdi7Laq72cyXC6UvhyPCirFuxiM for Wildcat2030\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavekuv4Ea3CqA1Xz6r2BWdi7Laq72cyXC6UvhyPCirFuxiM\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,1TXqDma/6oYB7CgFbGpNIagi2YVXOUMVTGCL3HHWdz0=,3o4gRMmZri8Q4VmRsn4x3xhfW36npFjVBY72J9tsQjBZtAhySmPbAgwfLQqqgvdbZpzjpWKnjaNVT5WCdz3gdfvP\', \'ids\': \'109\'}\nWriting record for Greg Fish\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavep3mB88tqGxPagZMHtBoB5rHcj5ShCAhVVVCcyvC66iw1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rUHi5bQ5UoU9MJ98UBL/yz3rTmOJ6lmeIJSIQF3KHnU=,5LfmxxVFLqHqXFFYQNDn6FHbVDH3oUM1s1K7M3K4Ps12LGntiirWvwFD7baNyrqPMwQyySjwyXtNZEJaz8r7ALpG\', \'ids\': \'110\'}\nWriting record for Greg Fish\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavep3mB88tqGxPagZMHtBoB5rHcj5ShCAhVVVCcyvC66iw1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,mNe3QhtEPZpe4E40sFpnhuMGT5YupH7gwqdP+bgwvJs=,33VHSviTV1E2w8JvK8j2DW2bNaGLnTyBJ4qyDYTDWgZyzGMm2zVYNYjRNPW5crgZSmGRVJ7KATGHDUQaEXnfziym\', \'ids\': \'111\'}\nWriting record for James Faghmous \n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavey8yQeryZ1E5hMFMMMmV6nC9CogLjWUv6g1KYs7WiSus9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,x3G4TPmR9dSynNslkTv7EShLZCvfhbuPUAb/EaXXPfk=,29t7sK6SK6BTKJxi54VyjkVbdCAY8ZJYBHuPHUPxqBpjCXFfMMghrvyKTfJnHiKx9Vc29EsbztVE9yxoCeMcvU3M\', \'ids\': \'112\'}\nWriting record for Datafiniti\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavecbRsqUaiG8rA68QP4aC4Wb62xC3gk8w1KdpAtWqQuyTK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Q+OF3Par20ZqfXhZTwW/qV2B4ISkrkdje4dT6M0w66I=,4Eicq5hwew9JiVyDW9SP3A3ogY3s5S4pVTVsey27mtQo3XwLrXFghJ7C1qQkPQGGY8Ww6zhTwmjpgXy2d1XZ5Nb1\', \'ids\': \'113\'}\nWriting record for Theo\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavebkWwnxF9FsBwcYntnj2EPdBW9rxhUb76J3nygWtTWoGF for Theo\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavebkWwnxF9FsBwcYntnj2EPdBW9rxhUb76J3nygWtTWoGF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,8kLBYI/J6QQJdFbMwnT0dJTq2RSBmKkDP/8sE1yJjGc=,3pQPjiUVkLiu6wCevSQuhNJbDRmofsLc4dx2pNtDVHWpjQwMszcrzScTFf8xom3mZKrTht9mCsJhSxkdijnHU9ep\', \'ids\': \'114\'}\nWriting record for x.ai\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexB2nNrzRvPAQE4FBASyM9kHMWnoh5K4FEc5EaXugWAh4 for x.ai\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexB2nNrzRvPAQE4FBASyM9kHMWnoh5K4FEc5EaXugWAh4\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Yy7VrVIXBh1JRPf0QYrclB5olCo/kvVGdTAK+72sxl8=,6fxRmE7aAtmermR7wG36mHAAF37RnGN3qSYXQejoiy5uJrJUZHFKHRB73VydfrxJ1wFVJ2jaAZUXxEGWeFoUGQd\', \'ids\': \'115\'}\nWriting record for Arjan Haring 🔮🔨\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28gtaXE6CKcV34Wnt34dvTvZiJpvVRMuSqLUfkDASoNG7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,qwMSSI1yp7Gt/lYCTRJE/K9hafIZcpc+akSod1cGze4=,3qe4QHxC3YddQLTCwy4dA9gURjBsC8ivgnWAoLi2exufjyt23vZNXP9VR1wJw5xnMNbw7AycFTDasuK9DjbBKQGq\', \'ids\': \'116\'}\nWriting record for Arjan Haring 🔮🔨\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28gtaXE6CKcV34Wnt34dvTvZiJpvVRMuSqLUfkDASoNG7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,PZ+EAy2Z5MWBlG1MPA/eUam/Rk9+8zEyvELRlqIoEuE=,JxnPPgkxvju3sycQziHGkdJr6ZPmvEiDjxkJuS3HGfhFKgw2PXfrfiH6gTeojK2asGjk6pc3TxvkAJYaL6NPZFu\', \'ids\': \'117\'}\nWriting record for Shivon Zilis\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavezxfoPwdvth7EwN9hKF73fQcTzJKywTkpo1bMhi33PHc5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xa3A5NG+832PdIM4JDIWWQ7rMCEoZI7eePl7R/ZaZzI=,27npCE6Q7s8AsBM9ZDkw2i5WT7WGx54xQL796i5Cagpa4KXFgnwXjCtfSkeuJ5jEJUKYUpo9ZGUjEbcowAHBUy1E\', \'ids\': \'118\'}\nWriting record for Roland Trimmel\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2An5cNgeC6mmBgGKRgwWeT9SywRSJQ16SKjnJhYnVgoeF for Roland Trimmel\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2An5cNgeC6mmBgGKRgwWeT9SywRSJQ16SKjnJhYnVgoeF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,yxh5mSANpHF9WycvCHKgcXWfKC3Klckbp2j25QCahgs=,3yMZJFP9BJirFoNyua4U2ii47ipF5MLYXNrNdvEuPEpSkVmJJ5SYusQRkAUhLFR31jYjBjiJU61CMVFcxgLDGhKQ\', \'ids\': \'119\'}\nWriting record for Espen Waldal\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavehA4uxz7o3EDpHZQ45dq3vAG1bh54AUXuTaomKcvoCkaf for Espen Waldal\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavehA4uxz7o3EDpHZQ45dq3vAG1bh54AUXuTaomKcvoCkaf\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,TK3pDcej/F/sE/We5s7LTqTzDuNOOqPHo3UVA232w50=,4TgMu69HwasoVDaQiTp4JcVb6KtLVapUG2XCcRR2RjNTneeYjcvAMRYcDc2c6NZFtADvmbLnUHAChbDUeMj7ktuw\', \'ids\': \'120\'}\nWriting record for Joe Johnston\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveuTaAWEGFUWnxZd6d5eBBN2KnDkTzfLEHquYZP8NrGGYC for Joe Johnston\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveuTaAWEGFUWnxZd6d5eBBN2KnDkTzfLEHquYZP8NrGGYC\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,dSZ832vqC/8tG1VZZr4sJErr81m+44HitaopDxAoqkI=,4rvcEwQXqdnGFFRpexy7bsSaS7RVyQVEGXZ34M9QE3TgjSyuHLTtkhhu7ZiMZ4sPVRGbHjpppgKgWnrc9Zk3m1rB\', \'ids\': \'121\'}\nWriting record for Nadav Gur\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavepb26zAmHhJk1w34UieXGg6XBD9xYsm6sNpPZNF5TjRFK for Nadav Gur\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepb26zAmHhJk1w34UieXGg6XBD9xYsm6sNpPZNF5TjRFK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,izwMZ03FW1Crc4AP3dPByMSb+nqfrnIgqhUw54upBoY=,MP7qNRXAAVQVrWxoSgQLKpm8VnQb2oWyuUiLVLzCUyBuY9qgX2M6V9ReSfoxsaWtb823tJH38DuUnKy9eATUCpY\', \'ids\': \'122\'}\nWriting record for Pandorabots\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavesThBF3wC5RkKK2NsQaYkaQDppuXxxzjBq4nz2fEiDBqD for Pandorabots\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavesThBF3wC5RkKK2NsQaYkaQDppuXxxzjBq4nz2fEiDBqD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6VMNOsF9bVmhCzA5UqBnv1jJV2HKEnX+pgNz5s+WbCc=,56oXKWUVEbo4r7Ki68MSY3mMejbyYLZNLYQT514jqESd7VrePPTYFYXFhfuHT1Uk4miLMjhfZMCnYooFgGhHYuMY\', \'ids\': \'123\'}\nWriting record for Denny Vrandečić\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavenVcn8s3b2KBZ2yRvctF7tT7swwtrhsP3cuiAgb2sCgUs for Denny Vrandečić\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavenVcn8s3b2KBZ2yRvctF7tT7swwtrhsP3cuiAgb2sCgUs\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BgdfnV1q3Mw6fH9o2fmZulQ3sLpS71upGq/dElvyelY=,2CCKHJvdkUvziiydT96K6UPUwumWZ9zfjWeQzzkR55B4kqCGnLDBX5TwGrrwZmaVAsX6nc7sCNFNKeVrXqWkAtRo\', \'ids\': \'124\'}\nWriting record for Thaddeus Howze\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavesqrejVuUAX6mRFNQfrSEeYkmSudT7hbmzbP3opYkyV3F for Thaddeus Howze\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavesqrejVuUAX6mRFNQfrSEeYkmSudT7hbmzbP3opYkyV3F\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,RR5yCzfCNQ2/6y+2haE+TOETICCgeyy8sGZnBsKtkmA=,5T8BoCQugbph6rGEsvDhFJVT2f2kGR23PR6gsLxyczu7vUVbgpAfC94hCPwBFG9iUuVpraGgwfzCQj1rrtpNDxsa\', \'ids\': \'125\'}\nWriting record for Tommy Thompson\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave23i66NEYuhPtHEFRhru48iGSsQMCe3A48uEVm7mFXcrRK for Tommy Thompson\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave23i66NEYuhPtHEFRhru48iGSsQMCe3A48uEVm7mFXcrRK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Ad8T1xEzaKw2ZA+yUuT/4HLjJdNDMAsN++HaD7pnVJ8=,3voNdTodHemKa6oLnoBXW9B1LZoqDUAC7fEQM6rxjUCr6La3yGzqLDXaR3iFis7uFLnMLieSVubgEaMDyfcLeQVS\', \'ids\': \'126\'}\nWriting record for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,+6U91X1hNK84qBWfM6c5MnoULIdKlt9+Zvqd3ey5yvk=,Ep34fpkicdjPhvjN3fmiiB1h94C5oBHc7Tk3waiNqCku3kXgRRVAMAazJkKXTxaj7RfbYumMHEgFpzek3XUxSim\', \'ids\': \'127\'}\nWriting record for Arik Sosman\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveuSWocRyXm5xLWY5dgr7LRgSbsRiakck1pxZY8DaQAQ1R for Arik Sosman\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveuSWocRyXm5xLWY5dgr7LRgSbsRiakck1pxZY8DaQAQ1R\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,OtMWoBK1zIS0XBcdSfLabGHnURe8fFUsE8Os6vPZj/g=,3Ekr5DDkSvMf7t8GBcJZ4X9UhysFL55fWGg9hv3gZajEv36gchki5K8ULeYZZiXRj894F5NxJdA1AuAWF5Hn8vWU\', \'ids\': \'128\'}\nWriting record for Tony Aubé\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavedHmvvzDuqDudKGoj8p9gWDX7sPr4Sqt9oXSBS8bjjRAC for Tony Aubé\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedHmvvzDuqDudKGoj8p9gWDX7sPr4Sqt9oXSBS8bjjRAC\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,gKcm1/FfqJ1KYXK3tx1+Re5RRKGqKGxrOw3hgcdWvHQ=,4aBftfD22sedGP3gstRAMnAgoQtELfDJboj3msKtVio5F8rbZ4gmyUqV6GNoyyEWWKfvnTMkQMfCW6XN7pU76zAt\', \'ids\': \'129\'}\nWriting record for Matt O\'Leary\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveqBoMYrbXKtmgpk7obJ2XQKWimtoC3b1ps971CNdmyC4p for Matt O\'Leary\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqBoMYrbXKtmgpk7obJ2XQKWimtoC3b1ps971CNdmyC4p\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,64NU+g/SlWbZSvDTS/Z2CtS4YILmlp6yFlp9d17Q/sI=,49Jw3hSrc9UBafKhG93NX79QDdXRcpqqKSCbpNZJb8UEqTp76EVK3WuGynStafVanyeVdifDhGpAmc1HEWPgdoJb\', \'ids\': \'130\'}\nWriting record for Tanay Jaipuria\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave255CjBZgnaMJEBEhEt11BEymxiXQemi5nKeBcv57j8gLp for Tanay Jaipuria\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave255CjBZgnaMJEBEhEt11BEymxiXQemi5nKeBcv57j8gLp\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,k6gwZeWmtIu3K0aXJt7WDgvyuesHqzGliqnaifrPdCs=,63eR29rUdTA8d9Q3iaMiprK825nCot4muGZBWJLphEiMhEuVPMXQ4ftUWaC8M67wHmvYLK7uTivhccDLVqHjEnY4\', \'ids\': \'131\'}\nWriting record for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,g3RkFImFpf+DtT8/eIWdFWblJoq7QGHNRagU3YcIrbA=,ptRsyuHBXTjs67oAUrrbBt19Jr3UwLx66pq2dQCVa55cYWDUPvXUzjFgGdaLvPnHnLkjgjF4qKJeivU39ZBKbXC\', \'ids\': \'132\'}\nWriting record for Ben Brown\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexWXdL6NRPxJY1MM2hpLyWLXa2MdEM4jTMNsoV3Z3VaD7 for Ben Brown\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexWXdL6NRPxJY1MM2hpLyWLXa2MdEM4jTMNsoV3Z3VaD7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,o7FEFxG2yKAnb2UCWO4uhZp8UI4pqdf8PLBTj2UJJRs=,4FiQZAeUyTsWSv1YRxDTQXgc8NK85ZP1gMGaA6QuqvjBSXuxJURLQunKtxWcLQQBjovpZT2Z7mfwPTcDWA9M6PYf\', \'ids\': \'133\'}\nWriting record for Frank Diana\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavehKPzp4iGNsyh3URCQXDwfwGpwgXPkpXp7xF8UHf9Rpfq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,FGK1QIu9/w2wCm1fDiIVmzNUHAupmJKn/X2mERoE2hc=,5RRn125ZvjWAPqGR4drQc5w9yBeDbsD4nJgkxUzXZgYow6sEMJXLWxAHWFkLPsAECyAf1wsiJavhqc9qMMUXzyx6\', \'ids\': \'134\'}\nWriting record for Rand Hindi\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2AQYKQv3YjNW9ZiajUPTSbXrn9ntDDTMBcFBi26Wv9rS1 for Rand Hindi\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AQYKQv3YjNW9ZiajUPTSbXrn9ntDDTMBcFBi26Wv9rS1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,z0iiuy3WwogYQ47DvH8n2bsG6Q57cXoLDC4LedrbFek=,2ckV5wpae8KibWr789vatXdna5S2ZjYvU5CLea8fhfNqv6UJxbfuN59Wb7L3JDqztQqPgELPrzYQfn3pf2Wq5eHx\', \'ids\': \'135\'}\nWriting record for samim\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavev2ENed3oJ1NLhietvN2UxJ3MN1NtP2FEwJhhmgm6458w\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,gU5JFUWuR1uguf/kKmIh+cZ/l4DU1y4zQGWzdWmn0RA=,5bZQnURHiCfuaVgt6qb1GsihjMF6g3P6ECkPtfv64zyfrSwWPFYpiLRvsCAeGmq4oj3gJgJjECEkbKbeMEcrB8QS\', \'ids\': \'136\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,SPp8yJxXHIj+ffacx5B/E4rS0gN9g9BuFXSz4fcB+aE=,2RrNAj6pB21MAMYSMBXvu1mZRfRYkso8PLxUwccF7gyawXb5XoPeRB4xM5bRTsh9u9bhjpDgGsr6jBs6NrWUq9bY\', \'ids\': \'137\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,e842UP2UAJjTmL09Y7jx1f18M+kBYtjb64LG7ehvdqo=,23N1t71DkjQEaDcf1D4yvYZzzNTsXFsSyGRDLRSZnT6aEC8VxvPfHLVtqWfEJ3e6juKprwX1YEQLAVSFRUX55e37\', \'ids\': \'138\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,iBW6lU4RUDkw4vngu7eY6VK+yWfXUteFwNzE2V2RMwM=,5VVEvNwRZNDxStAHuEoy5AAm3Pe5jH7zn4ofVhsF7tfDtbLwd6JbnLUkzEMe51niXEBZw9Y5q6uVdWbcYE3rmiBL\', \'ids\': \'139\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Y613k9CcyxwdedEttO9oelu8l/flkhYKT+Ew1AIQJF8=,5gFFfnuo2MgNVdpJaoC3pprsivRu5fCbRmCeyreyoPLQd3iiy1qtWG4ZTribABejosLEBgBnHTYHytz2d6Rz9etq\', \'ids\': \'140\'}\nWriting record for Chris Dixon\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavemmX9QA8PxjLzBChMb571x5fiZkyWJ51ZWaRFrvMGCNtz for Chris Dixon\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemmX9QA8PxjLzBChMb571x5fiZkyWJ51ZWaRFrvMGCNtz\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,nqDSjhWGYgoETbKhJ7DHc5zFNIpdfmet0nLCjRzS2pU=,2TfrCNUQxXKmU3TDfifNdqLTwZbP5CusRUCa3z8eDnd4L9b8t3MWdydRq7cQVWh64Q4XvWGSXQ8YKy24zUZD1Sa4\', \'ids\': \'141\'}\nWriting record for Tal Perry\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemQ83gdkjq27b1HTv8m4mj2fRB32HP6T1GYWePAsPg99E\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,NR19uwI87vLmMAGeXhWZIqFqeY6bLotShmzWrTpEwp4=,5EQnzHw5om5FpnEVN6cYGo54C3bvWgfxMoyiwUgzUMUzD4JwjQU97d79kSDLi5jYLE6SBx5ibwXNSy8AtccdL2j5\', \'ids\': \'142\'}\nWriting record for Gil Fewster\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28hJgLv9G3ku9ozEiukbaTgCR7TVxx2Q84aS1Ly9eWM1Z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,QUYKv4wOBPHgBI9AyHH734mgELJ+k8BBu4oOf9AtVDY=,459DtQvtKdqtCgY9WkfA6gt4aG11jGLGnaGaNt9J5k3jdhxLit6rV4uWYYxMrkxkGcrE1gk98xRNQvSrszGzWshv\', \'ids\': \'143\'}\nWriting record for David Venturi\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepqSu5eoLj9AKrE8VU1eRHqpLNYEiVYW93kEUx1hknugq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,riONWo3sIs6HcvIZr1I/Afi9NQr8AlBPmKZCh43JOts=,5ABb4oqpWcRWZJjCKmLzQWkqXXqYEVZb3WsQ2m6xaamEFgiG2kAd1BP5nRafM1hDCG97iggJKTiY3TiUtHoXSwsJ\', \'ids\': \'144\'}\nWriting record for Vishal Maini\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28KtG4u3HdMjyBKkiv4rQjDwx1mr19E92BZgxYvYEwncM\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xex9PFjBIfWv9+fGuTWVKas7zHFfHx+JwFOK0kjPpIQ=,Y1f3mWpNNs2DiUsiN2Pc8B2H371L6Dg1aFFUh1sQ2afE3ErHE9P1nDVGmib7aWfiXtA6uExqk7rwwaViwAS8PHA\', \'ids\': \'145\'}\nWriting record for Tim Anglade\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiRAqixNQ6m9pa5jGYAATnGriDenB6Aahi5XCuGjp67Eo\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Fa6HiVTE89aZw8Lb4VOZcWfINUDV6FQyhgerQm3kPAA=,53GL7KNgmhhP7U1TM27LbVmUm1MQuVMxNFLYthPvMZGx4o9zaTKMQv85k98zW1WaNxxParRJrHs7L2aBYbfXbbrp\', \'ids\': \'146\'}\nWriting record for Sophia Ciocca\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave29ubKDvoREb2xApQWaJKnrBnt9Qw9iJ3MhCtueBb3ersc\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,/eb/kU2SmUpxp7LQbvDd3sTfb38+3HpdSCegebQZvUw=,29J3qJh47WvfUuFvN5dRpcQ3dfKNZaaKcKf9eoXhLgcYEEUDD2XnSP7yvjyg7r9McWUvKCcmoDPvFTKUeX2VXGSw\', \'ids\': \'147\'}\nWriting record for François Chollet\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveyo5qHhU9cuj8uRfB83AasS6qcDhLEMTjjquVQ4ihwpc9 for François Chollet\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyo5qHhU9cuj8uRfB83AasS6qcDhLEMTjjquVQ4ihwpc9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Jnu+CGvawFaOlNuaQdEBVXER0GxuEg5BWRdXg4OfmmY=,2rKmeWdV9dK2368FFhEBNBHt8zJ6KLmS45HwU532Up7cGfUYMwq4kJJ5yKcDpW7qQGoRBCi1LhQ3YSVYLjS6kjGG\', \'ids\': \'148\'}\nWriting record for Max Pechyonkin\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave22pdghXa46iy1DQdJAz92d5Tzx1wS3KneCJyo6fiA7FTQ for Max Pechyonkin\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22pdghXa46iy1DQdJAz92d5Tzx1wS3KneCJyo6fiA7FTQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,wAz51r01ByRU+EgRhLR/ppWt8mow0jZQIFsI32IgzGI=,LECFebP8GVGG6zTswzJBkbmNGiCC2Lc8BamunZGQsy3Adexun1gcVuqoWYYrpzQ6dqdsSCz19VvtQHu1v56T2bQ\', \'ids\': \'149\'}\nWriting record for Slav Ivanov\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,kpgHEbyD97Ztmg9A81SSTRZRYgaP+PQVproF+OMpgxA=,2DraXAtjBa9umREi15koNZjWtw7eFhTw2t4zrmVNrc5xstNWLvmYmcjg7Z7zdUq4PL5U4yH8d2fVpbVkL9NigPxw\', \'ids\': \'150\'}\nWriting record for Geoff Nesnow\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavesW7noqhibzaNLwuwhhMfxJUjmX5pQ65kcpJhb1FbtZUn for Geoff Nesnow\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavesW7noqhibzaNLwuwhhMfxJUjmX5pQ65kcpJhb1FbtZUn\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,aRSX4N339MnzB7ZTzz1I3d7xfv6PiN7OY9tKlCnxfLk=,3yegAUnScGgDuXAekJTYd4KMdey523ZzkjrYs5CC268oiPuHAVZF9eMbdgkNsmDkyyvsK1qUnsKuZDHrv2xiiPNQ\', \'ids\': \'151\'}\nWriting record for Blaise Aguera y Arcas\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave25FmmS1C3HkoQEe4scEiy4cEC4hzmQ6AXbRWcDZUuBtC9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,OvJYZs7dHiYJ5hpXy8z8/Sw+5KuJFkMqEjmbcJy4o1E=,5pmRVgitEA8fK4E5AuSZ886eBFt6vcbiQnQ1skuTm9dTi9Qu2udmztgkN7GjQAt9zUR654QgHQSvXeRM5NhGpYYe\', \'ids\': \'152\'}\nWriting record for François Chollet\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyo5qHhU9cuj8uRfB83AasS6qcDhLEMTjjquVQ4ihwpc9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Jf4g+LI4LCQg4Clf9gwKFZtFYiZ/OLqXr5SwZADewG0=,3YwBsLaX26V8pv7vfgNABw52myyXNahQh6UfDo7KTRV9FbtjkZGNyraqu9PuKhY4wxxZv9pYALiCxH9JxWJTp149\', \'ids\': \'153\'}\nWriting record for Simon Greenman\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavesFxt4k745VEruF2fQdNQt9nXvaCxPkQBvwqMqyoJxGDM\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,tV3yYjopHT3Zod330G1hllP6xm6T44YBcFU6ONdIbAY=,4Bz1jNZC7vw1fVcvXRCLnChCB7fnqmojrcg18Ve85hCdnSaffrGa9Z88EGjdfBXuRergJdkCroW1YJr4qZyGfLBx\', \'ids\': \'154\'}\nWriting record for Aman Agarwal\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveyKrGCkmrGL18pWHik3iKkzxZQknMv586jAhJR2MR73wq for Aman Agarwal\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyKrGCkmrGL18pWHik3iKkzxZQknMv586jAhJR2MR73wq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,+3+rKzbeAne88lQHkaI48VlZGsb0u+iA1k4io96N9+M=,3dMpqS4ZKxqzFUKtuqgLipxEutrRtxnCLr1idYrQBnWPYshSU1vFJgRLXffHJZ3eCCXpCddZ6rwXhtWkSuCvjQeo\', \'ids\': \'155\'}\nWriting record for Lance Ulanoff\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavehnFy2boRD47pcHqfkDJRJNNtdrZfgyRvjRg3G2cuVTsg\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,r1V8LmL6ijmxxdpq5P4WxgcvKnGy4YyRtrQ5+hP1UQU=,2DeUjr1rsksMDCdwnxUACMTRt4HeYJJuz7UvQxoGifXS9Qo9pj32Ji2XYq5TcrQAo53QgQoLBm6XmvrtVhBMVHbv\', \'ids\': \'156\'}\nWriting record for Gant Laborde\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiWV2dK7p3AHhBkwMBjPqpM6vVM78D62HdUUBYxmMzdKb\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,q6S1QY3Z9aEJXw98KWrojQ3yhBxqaA6TYmHM/aL3d98=,4h7JWuZNFsHukZ9z8LYVT5nHWQFF7znHUW8vs2d6rZUWuKEPiihfUiiWBFLpLRMXZ8cJNuLAEaoLoxaZFzQLddoP\', \'ids\': \'157\'}\nWriting record for Emmanuel Ameisen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavez2Lr5qDk5LC3zPUxFakrxyRJUNb1LQ9QzEDHRG2Gm8ix\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,KW44vJhoMnFwojO/WlVOMzvyQVxZFvT1QXcmyu/cqcM=,6433bm5DAmrUmJTb47wPhU2rGBw9w34ttwhUfmNAYDtZq7BeSsXt9VizotVgThSGuxfzVAi9o7aFCZoucBoXsGxE\', \'ids\': \'158\'}\nWriting record for Irhum Shafkat\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21Jj2Zs46JsdG9AxgrABy3pr6CBsjZBV862q7SAvs6Jj4\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,QIN6VcssYhx1INXsmrbvndHMmRJxaDKtEFN0SuuQpzo=,2sE5PZ9cmL2AAhX3QbGsRCfn5JhY2tWYk4KfT7FXJqu6NXb3iKfERUo9Muzt7eBaBMUhN6o2X27Wgac2JKpE8Mue\', \'ids\': \'159\'}\nWriting record for Abhishek Parbhakar\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewYC94Hwi5bGhFeorEp2sghZKXBWx1yreFYBAs5Qjnmz7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,iGdANQ2ivD2z2mVXxPKBIsTPTZaEhHrlNTDl8VtsEik=,2N3YBYPgTwJsX2GYP1Pn3bRyDPdgSURHHsd6kc2RZVsgFmS9nbGFBmD6aKpZS56cXQLA4KE5ykwXKynypJe6k2P5\', \'ids\': \'160\'}\nWriting record for Aman Dalmia\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexjioGxCmvk2znFELkHXASjMbJzqMGX53a3wTjdmVo2q5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BrKPBLRz+ScjdzVFjK0TYHz4kO7NqDPYOdw2GE7kjhk=,3CcY6QPXpBK9mbN8R6ShjvS69bGae2FwdDuF8Ep2k7KjafbpmVLcq7uKLNLSbZWdz6t7wm1PuHwffYs6Jfu7p8bR\', \'ids\': \'161\'}\nWriting record for Gaurav Kaila\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaven4V4PMvAtbutzGc5DPmnorMSxxZuPFeBdGKgR59UvhZx for Gaurav Kaila\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4V4PMvAtbutzGc5DPmnorMSxxZuPFeBdGKgR59UvhZx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,pi1ax8Es0k6KiXES3T9vsLJY6znUGMLeJXgPeVpvdtg=,4pJxjhmmV58jqsBQADGY9QnqTptWnWujK3NFASrP9cA2nA6eHsmmh9PmRGwjxakPQHk9MVXhzrbuyur333du4XPQ\', \'ids\': \'162\'}\nWriting record for James Loy\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavev1mxEYma2r1MD2Q99PJKj1ct7jmAC35KWSYPitijrCTt for James Loy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavev1mxEYma2r1MD2Q99PJKj1ct7jmAC35KWSYPitijrCTt\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,8Jq3IdrAEsITCXwcKTquZD8XQIYVuy2kirkdSZ/tBto=,2BuuyuXjQq9J52mgLP7Y9p8hWbExRMnpLeHo6we8GjKNpjVUZfmY1vKUWxyJUb3fNxz5SCRrYJYNWq6Uok2peZBo\', \'ids\': \'163\'}\nWriting record for Chintan Trivedi\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave23i56eNqQx7UGf4R5Cp6whMST6e9LGK96SGmeVtUXeD3U for Chintan Trivedi\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave23i56eNqQx7UGf4R5Cp6whMST6e9LGK96SGmeVtUXeD3U\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,myHPQY0/YYt4rf28xU6WQEwNJd2sGPinbMssYbXCD/w=,3bxbPyuXsJM8Kec8Zk63QxLhQ5Mdt3M1EFq52XNJsCB4136iZsKRKa9tz86xuz6g8SQTbTN9jhBUepSxQSu4gWZq\', \'ids\': \'164\'}\nWriting record for Abhishek Parbhakar\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewYC94Hwi5bGhFeorEp2sghZKXBWx1yreFYBAs5Qjnmz7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,UxzYFgvpUmUbS5Og1EaOTBe3ulCrAQz9Lcmi8jyuUUA=,4Rh7VDKSsR7q9aDa46zTvfqHQVuTUqgJdb7ANLWVyJvX3yzerUx9wwoEy9oHGqZcTRPZckWPGVDHKxpX7SbRHqfs\', \'ids\': \'165\'}\nWriting record for Leon Zhou\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavem3zUDmYscSE2p1PRfUwWAB4ec5v3LuLXDETmQZq91co1 for Leon Zhou\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavem3zUDmYscSE2p1PRfUwWAB4ec5v3LuLXDETmQZq91co1\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,TpgK7sVdTbNZzcePBlmAFL1ShXdbB6oNhDpAiC1SznU=,td7mg6PXE8VoRizZcbyeQJddqsgavaaaJtsMUw6sTHPJmKe5RbVeAQhiNmKYRPaZbEMuJboVtqmHTaxybWsySmC\', \'ids\': \'166\'}\nWriting record for Dr. GP Pulipaka\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefJHY7kHgG9cPmv6Kt1GBu7XnB71jBxCbrZvxoWPe3Exa\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,GogdGjUYiEL+YIRGh+/VupxgODPK6CQCLAr3sR4YH/4=,5d3ff3CBockuXH81pCmAokuqnP5SGVUVfjgQeDcKmECGoiVd9aL6KJLE61Ej4MCiiQQrAQ8u8CzLu9Qnp5jCc3Sg\', \'ids\': \'167\'}\nWriting record for Erick Muzart Fonseca dos Santos\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavehgKrz5jmXKLLxQJSsJSAUCVV1hkHL1cXJt6m4D1Vz1zV for Erick Muzart Fonseca dos Santos\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavehgKrz5jmXKLLxQJSsJSAUCVV1hkHL1cXJt6m4D1Vz1zV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,d8RzFq1ILVJtc2XF3GEACkIfQcEoWtOY2z8AUnGGDJg=,2FDw2zeo7RWHxUfuEWfBJu3jpQWxvVMpPMpgySgeB5N6n4D1Pv96DEaMZTebjibHzYEmZ2Fsi1oAY5BtMN37hMh5\', \'ids\': \'168\'}\nWriting record for Chris Kalahiki\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveigT5ZLKaLdBbFRLNQ536NtDj97WPoMGyKjcJVKNDdGRx for Chris Kalahiki\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveigT5ZLKaLdBbFRLNQ536NtDj97WPoMGyKjcJVKNDdGRx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,deioWDV1f3adhrerIboSSgE6NuZeX7LaY+az2oTlo4o=,4xwFju9spTPNn3y6U7gFSVhFaQXWuUJtoQNoT8eqkWLAvCADNUF5exLbFfcxEZ9pB3VSyEHxiDfuVZ9Pa1Cc81nj\', \'ids\': \'169\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Xuz41ZG3/IWrhR7aPTMRlMLb6sTgE/HaekuV3RzWBBk=,2NKdTSsJdhNP6nsBSYqxG9PuFe9rwTADAG6wtKpKTqxng6dccXoEP4o43sxs1ftCmdjpzurh1Jorfdz49DjjbVgR\', \'ids\': \'170\'}\nWriting record for Adam Geitgey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevSc8shf3NN6ufVKNHh7avoAzKcPFopmr5uj5vL2BmMEF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,5nJy92HpMonWBkTopLMblwAF+r5Qtk+JlhVj+AmY6rE=,F7UtuUnfuazQTBDRZjAqugyKX2usW9qq3YKH7K51wKTUMRTgx3UArrFE7vDeUyz5ZPKg82ppev8QaAWYP5Tw7oy\', \'ids\': \'171\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,RmPD6coJnecrwl+Grqu+XlZ4AupriUWYrq9sBfHHMqg=,C1xeNukbx69SUnWbhrddty85Q86FZMZWG2r5wD33GcjWUVf6wvZtdY9iH6F3yDaR2hgXYwb7LLXDPX9cLJTGNFH\', \'ids\': \'172\'}\nWriting record for Dhruv Parthasarathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4oGoFxRccnvaCzqY7RQhuZdhSs1ZA9By3fFft2QGvzu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,yNIs8/qPXulNwu1+Ymt2DTPo1S86MA9PKL2VhmQky6M=,3yGgwzcqqvD4fUuXdRUyf6qEsixUS2Tyw2ABHnLiTQjrsHa987XkxAA3RcuN1MK1bPMT1hNTut5sY1xZYUhomSaF\', \'ids\': \'173\'}\nWriting record for Sebastian Heinz\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22zZtvUz3DRVDLcaBkA7mCwgE62HxY895N4rLfVsq56fP\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,RmK5OUYX5OubR7+ihfhtY/q37GxNr/4ZS37UhP7XatM=,22szeLckiPqJB6CNPtEXqkhzadKiMiv4XGzhgPn4GKEb41jHZDQ2x9Svd7tRZv3pTJfRGS2JvNKPmne5nBfH6V3S\', \'ids\': \'174\'}\nWriting record for Max Pechyonkin\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22pdghXa46iy1DQdJAz92d5Tzx1wS3KneCJyo6fiA7FTQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,42FDDv7v5VqMMywrhKdYO2zzHQe0dqz3FVJ2B3u1lI4=,2zdvY3uweVYdRwPKVsf1SkHzVvvVaJncaCFtxwGJFScP7NBRErUgMoYeJ2mGpWy76jvw6sNcCjyyEqPNQp6u4aQG\', \'ids\': \'175\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,AVMO4uLQPzoEtiPqJ+59Rn9Rtgi7BSTTrkENvGRuwto=,5YLPEHvHVpSqMszETSGZ4MrrtQhcPtXjw1X6cUkfRchp2S4bnxQLhNv8n4UQX4229JpPGpUyNVQ5DRqxqCc65vuu\', \'ids\': \'176\'}\nWriting record for Stefan Kojouharov\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavefKjV59wbQoUWdfp2BtH9JdhkeHoAyDgZS7ERk8kWUWyA for Stefan Kojouharov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefKjV59wbQoUWdfp2BtH9JdhkeHoAyDgZS7ERk8kWUWyA\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3+9SZ9URq3q2IktMLQbZ+43spH69/KlTeqpf3ljMsfE=,4A23wZkDAJYRRQyJ2yBGRteK6Ytecjc3tNGPv7ctzjoJebdkRDbneF8tbQmirotWWMfQmkpNjHij3mGUQjM4zz7D\', \'ids\': \'177\'}\nWriting record for Netflix Technology Blog\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2Bd6edL5Zoa6qkTrBXSEGTrG5DrrGsRPmCt9fbcsbzPHW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,uDfmS3fKRr1LdCYOrJb1kjun8Usqo9V+z7X7Kerzi3I=,5TcNW8sVy1Utm99Xjhup7oRqrh91UJGzQxvBjt6EG7xJR9GWNddr77UupYdfh3sAT9onLdLhkBeWfPohSaXua9cJ\', \'ids\': \'178\'}\nWriting record for Francesco Gadaleta\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveyN8fDvhiVCna5sENACMye5aU8VNvY6KbqmwV7x2Aq7yz for Francesco Gadaleta\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyN8fDvhiVCna5sENACMye5aU8VNvY6KbqmwV7x2Aq7yz\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,dKs2fagwovdZQD/Oz+vvgRTB6VoqVFVwL8kwqf7lAVo=,3N7ZhuYKY8qCZPtXywBt827S4kEXtyDc3NSKf7CQt6HMYoBLAwtxhXFbFMaqrzkMUPCLDL7nVXFsoLqyWWEV7GLB\', \'ids\': \'179\'}\nWriting record for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,kxG/MZ5K5oBbZwPJL+rzkQ+wEXiSJumJGnXNmS5DV7s=,4hrpMTv4HPG8kn8xfcdoDRdKoQ7WB1KpGMHLt13ptLxRYhtWXEkmyck9qoVeqokYdLW5rMUZxsy3Yqf9Hgfm86Nw\', \'ids\': \'180\'}\nWriting record for Jim Fleming\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2BEbhqFoJmvhsAhniXVChxzBUeG2emHD2aXdHoVWjveh7 for Jim Fleming\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2BEbhqFoJmvhsAhniXVChxzBUeG2emHD2aXdHoVWjveh7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,FEy2GXlFhi8A0jgtZftrhcaebA54wOxhc/IHWDviZ8Q=,mEVHjt8NKtx9p7pqybiFxVAHhPo14MEgDoudvK9mpys1JV9HwxYBbZihdPHRoqxup5d4WkZeBuSVAFAGvZp5n2p\', \'ids\': \'181\'}\nWriting record for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,tsJag46dFyvCM8xFuZkiZrodDHyeq0/Ca7ibpibX9vw=,5yQvTMy8U9r3EJC8xt1LKUx3MnFcJaVUJ8GbAAgV4asAh88wkv2piwXoeDfiCKAi1T93c58aCKDfrwY1WrinTUXo\', \'ids\': \'182\'}\nWriting record for Christian Hernandez\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavevucDPnpf5XQmTvi2GHLrfkfSsqfFzytVbXu7PcSpc1f4 for Christian Hernandez\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevucDPnpf5XQmTvi2GHLrfkfSsqfFzytVbXu7PcSpc1f4\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,g3qsO85AHYoJazmm/QWWCcxy9HraEIYIxVCZVyykeO8=,3LLLqD8vg4chNfAVSvuYhqpPuaUFUYfKspy6Yu3MRvu2gB6SnXfodpEK2cD45y3iidLqRRGkTceeFrX2yQMomw7S\', \'ids\': \'183\'}\nWriting record for Venture Scanner\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavedHXGEpYq9zfqVyiwzX6GPMVhkZuhEAxBmFhMjzhhfkoH for Venture Scanner\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedHXGEpYq9zfqVyiwzX6GPMVhkZuhEAxBmFhMjzhhfkoH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HffshCvNpGgYlLZwAviELzM++RWsyqMnGRllf+RdlFc=,brVqy5Mm6NBrJDQ2gGCFgEDt4oYSpQRg8SgETTPFGZnYd9Ln1EnJ9GFw2UUYNZqLwgQn67bHafxn4oyz37SspKu\', \'ids\': \'184\'}\nWriting record for Illia Polosukhin\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavekgh9mDUynkbusDL1wjYT6jrgGterAXMEm1JPHSTPtEQJ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rRGE/81fOHycrk4JLhj7eJ6+WTnC6993RCVxuu5PIY4=,52nUiCMJ8bAHoERkvCvQwqiMxLnjnyDkhkNiariLUcNDHnqmi9BPYb17ZEdYMxkekKQZmDuXMnpchJB7S6zs2PdW\', \'ids\': \'185\'}\nWriting record for Derrick Harris\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavevZyzEBYFswwSCgTqivvCx1WMT25aXQ1SBrPTifYLqETg for Derrick Harris\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevZyzEBYFswwSCgTqivvCx1WMT25aXQ1SBrPTifYLqETg\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,57K4HABlWMWRFAzyLyQiLjP+8YTIowTQ3Ef2w61eEgg=,5UFpTui2hpf2XGWyu5g2SFsgrsGr5Yt77hQdmJH6F91J1oN1q7d5SSAjUozX3bGg3vF4YSu6tY2e9Ygy6o3XVmQW\', \'ids\': \'186\'}\nWriting record for Kyle McDonald\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2BsRWpXq7vdJ2GbpK9c1DhauvHf5ZQS8U6PzMHceCjqwR for Kyle McDonald\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2BsRWpXq7vdJ2GbpK9c1DhauvHf5ZQS8U6PzMHceCjqwR\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6vr5OGFnDg/mtCfilTQZsFvmkBoXlt1wk4m7PLv4OP8=,5DmdJTufzTnyYdKwTGL9jGXCuboPYZ1Jh3YzNtSrG5rmJCouKzCQ4cznDg7NJtpZCBVqjZRCxhcdBCaMSMninaYi\', \'ids\': \'187\'}\nWriting record for Jim Fleming\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2BEbhqFoJmvhsAhniXVChxzBUeG2emHD2aXdHoVWjveh7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,aSqpglG6Ab7b3hB6T58jR+yDXlTBjMShnETYUKwTc5c=,4o98FmWRHjuer2NMa9fXVeFPFrPuayDiiBoR6s9eJHiq1eDw7J93kx5EFxrp2skN5SL3edRaSJRnsoUQ5u1EyMCj\', \'ids\': \'188\'}\nWriting record for Nathan Benaich\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavewDdiuSxiQpLzG1yjgFiX7Livv9wh6BpiPo82oygK7pCK for Nathan Benaich\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewDdiuSxiQpLzG1yjgFiX7Livv9wh6BpiPo82oygK7pCK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,pp2gU0d7dBFL1pabl4TzY2g9pecCil8Lk6DIQlu8icU=,21zuzCxL614NFNGeJhCnCLUCjgmsiLfamcec1qF4WSnk6zxs31xDNPV9avVCMYBj5efoJKEwysFwr1dsZbHbh637\', \'ids\': \'189\'}\nWriting record for Tal Perry\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemQ83gdkjq27b1HTv8m4mj2fRB32HP6T1GYWePAsPg99E\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,lrM+ikKe24tzoMNdcnd/TdoF2ENkCDpwir/IeUumBc0=,2Nt29NZVkqJX6SnBph5kXrHBbFPmEbajy2c5tcSyWf6RvZQC2Qv3TXv9tMchnQsqCPbv767WiuZam5fJmhCKbMub\', \'ids\': \'190\'}\nWriting record for Andrej Karpathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AJvcy86CZgw3hdwnoXahQuVko8VXPMTpm7VwU7Zpoxhx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3+m6OcmK92/HTUSplcTElizSY9oJ7woyxCjfJ6Hm32Q=,2DNwLrx47n8TFHVmVYtnF2nsrQvUwjmcC25KwKm9xZgSzhih9JYzSiXShh2sMPDw7GihRV8nbLarTJ4QpDj9niTR\', \'ids\': \'191\'}\nWriting record for Erik Hallström\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveqeDXhRVJwtzvmHLdtWur4i599kSMkBYeTxWYkyRHdkEr for Erik Hallström\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqeDXhRVJwtzvmHLdtWur4i599kSMkBYeTxWYkyRHdkEr\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,+c0dqP9ds5kO9jK/eSqNIBMqvONQsjMsCWt4ez8WknY=,4KqDvxL7rQgsrk4cdJWySWDY7LG2g3GLYBm16srZAf14t2AuJLjiCJkqL9czvCq3MctoPLrSSvDgj6WHG7DFRgQp\', \'ids\': \'192\'}\nWriting record for Stefan Kojouharov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefKjV59wbQoUWdfp2BtH9JdhkeHoAyDgZS7ERk8kWUWyA\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,bQk/GrYOdt/fYyM1lmMzAts+wHIrw2BJpjck/gs69qA=,5Qs8Pssqi2xW98HiW8hTmhniCVXdjAcQrUrMvq9L8vuLrARSQZW53VYUfGU7a3JBCdM6cffFe1dsSrofjawBUc6T\', \'ids\': \'193\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,1ics+scyR942AxFNj49tpsbOt/qD2bVmHcQTeYcaNjc=,2AGkeL3LhxBygtzoAgijp385vnXUJYWnm8fndznsamDDBsNV8b6pFhLc3wQ6TihvTRaH9vkBC7xfedJeV9BXA6uA\', \'ids\': \'194\'}\nWriting record for Alexandr Honchar\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave25dWGtpRM3txtG1xt5XfPVYFApU4J2CRPRyPoiZFoDW3H for Alexandr Honchar\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave25dWGtpRM3txtG1xt5XfPVYFApU4J2CRPRyPoiZFoDW3H\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BSVLaPK3ShDba3TT2MTOSFrSwTe2zeIkUiFGkwsfGHo=,TCkfQGaXRSqaWw5hSmsLb1y9p7d4rtRmhCBaPEYqrER1Zp56YFfu6qQVHP46tAJ1NCpdf4xzDJkK4jUSJctKbf6\', \'ids\': \'195\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Mzzvntdb1zNPlbaPP+58+ya/92YmDIXg12xOSqlNF8k=,5C2uLpP8mkN4w9XnNykmc4x4hNb3WYbwqKgRH9g8G68UWYoEtZyHaezVMx5aVoDTKGD4ocTtKreqtTh2uSRFbAL1\', \'ids\': \'196\'}\nWriting record for Vishal Maini\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28KtG4u3HdMjyBKkiv4rQjDwx1mr19E92BZgxYvYEwncM\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,B+8FyNH97zdmBZqr5FhRdT9zx8WhM5R3iPYeCMtZ1zM=,5zxHikWanAZxjSZH1dn6jxGHzk4gLabKZTuiyxcXXYGDo3DSda95gy8c3ZvVDWzZjmx2HWmaoMeLEyENxNP2Dm2k\', \'ids\': \'197\'}\nWriting record for Tim Anglade\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiRAqixNQ6m9pa5jGYAATnGriDenB6Aahi5XCuGjp67Eo\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,1/TFZOsXTYG2wdGOphdgDg+lPI0S2zv9Ww9EH1wWIS0=,47yViQf5VDtRMdwewqYvEXYQbYDjmvScCdCR2w2YrNprkKkzsqhAR4DfiDsgtyKhXV15QY6CdiPzSNRWcH4Jj8A8\', \'ids\': \'198\'}\nWriting record for Dhruv Parthasarathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4oGoFxRccnvaCzqY7RQhuZdhSs1ZA9By3fFft2QGvzu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,WorZ7gWkasu9+EeWXsZ/GMA6xjfxZLuxK/ZpYzszsHc=,5aSbgJdNRMpC417ydmjVfQYay8SADgQ9ftssWsU71h8V7sxJQ7JpQqDAjto6A3tTFvrSVpdqtdf4sruE86peoE3W\', \'ids\': \'199\'}\nWriting record for Sebastian Heinz\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22zZtvUz3DRVDLcaBkA7mCwgE62HxY895N4rLfVsq56fP\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xb58KZsWv1LiX/Xc7AesWxlmVcTxBIAa07DOcVi9gf4=,wv93GpRJA7oyosShcWD6gywniLNYn5EAzvo1PbH7uSC9SbToF1o6eLgdTAbE5ctT5PWdnWk8eaZE4KLt6vecajs\', \'ids\': \'200\'}\nWriting record for Max Pechyonkin\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22pdghXa46iy1DQdJAz92d5Tzx1wS3KneCJyo6fiA7FTQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rr9Htn1ZPlQ1f4PysJNQfD040kxz/FijcF/5qESrYr4=,ZgzKu8vzJ6hWz6bqS7rmftEfQXtN9SzHE8uHy9guMjnWUmFtUHTaA7oAcM4uqDi9NTn6j8XHqsv7Sr7yShmeA9d\', \'ids\': \'201\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Ym6+x/fd7KXtxttLrZYWbdZ9plckwx8CglxQFOZKuYQ=,2hwSa1FkX68idy6udP7rmWXwo5W6jpTwRtYyFKXVkzY7irQKNWSYEfbxa91qwPvZPj2yLNMq1oVt3igf8tTcMriF\', \'ids\': \'202\'}\nWriting record for Stefan Kojouharov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefKjV59wbQoUWdfp2BtH9JdhkeHoAyDgZS7ERk8kWUWyA\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,9Ji0dRXJZkJg9YokrIq+UujPRe0jZM/o/Af9yEUA7jk=,62K4SXNmUgYWCSoMByqrjEYMaqre9koheXRsN5VnifhSJeMWd1DSnCs775DGs26Rsn9F2ZTKtaLwwFuZ65UsBvRS\', \'ids\': \'203\'}\nWriting record for Vishal Maini\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28KtG4u3HdMjyBKkiv4rQjDwx1mr19E92BZgxYvYEwncM\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Ly03IK1WbuZpcqzAYKZp/u+hA+jyhxnFtNGJ9SSjvKI=,3z3kqiu3wG1V63bXGTXVxg5EmZR3vrUN1eYRvHTvspiuEGUnkFCGxcDKZ7befYz77rSx1hLd56jBUUW9SM9piS46\', \'ids\': \'204\'}\nWriting record for Arvind N\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavequm9hcVc4VVnZ7ic9mB9TwepoxNYodXw4FxbdoGhex2m for Arvind N\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavequm9hcVc4VVnZ7ic9mB9TwepoxNYodXw4FxbdoGhex2m\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Os5qDrKX8MPhGVl/M/leWE1JOtz64v9SU2R6EbUp65Y=,4tHPdc8cMQ9brqmDi4xSmw9GYaswyy55zufm4FMHDJyrBaVWZEZDBoJiayg61EN343WJkM9a37x261VDy9eUGG4G\', \'ids\': \'205\'}\nWriting record for Blaise Aguera y Arcas\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave25FmmS1C3HkoQEe4scEiy4cEC4hzmQ6AXbRWcDZUuBtC9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,N5Wymx82T6Qqi7c1v+3KwVN1sGWNEzsJdE7NekezUJU=,bssN5xypJX4cyz6Uxw16t52Yw6aduL3wDzcyvdCMZgEieAYCsh77iErevwQoxsigAooXngJjXdfQpoSuccGUJJ4\', \'ids\': \'206\'}\nWriting record for David Foster\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavecXvMjKVHcPsjrDa3b5VN9YVdhKDjWDzhuDjhzfqswAdT\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,5Vj3kdY/pG0TkxNVonuEAn2YHu0PWmFBfo2miSgqYKg=,5PtjhNZU12XehCn7esg7mEjXHXydDAs38wCoaZ5sWBwZtiPeEt8un2USMmFdtwLV4DQ5VkTp4mqh7cyYmbwmLHNC\', \'ids\': \'207\'}\nWriting record for Aman Agarwal\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyKrGCkmrGL18pWHik3iKkzxZQknMv586jAhJR2MR73wq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,040KsuK0I00Q5CvuUh3fuAdcSRjzQpxHAxFIbHXdygU=,2dXDS2PGVrQweUBzJjxcDVa8pSSSpJbHSBa1CpyLLUrsWWFHn5svU5eBWr8pztRdVLkiCMH8LkY6GDgcSvWQXgxG\', \'ids\': \'208\'}\nWriting record for Eugenio Culurciello\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepxPwEkHfD7sDabbEMN4Rj9F92LiY6ZN7oKpwGWeUYzZN\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,TnTFIrwrq0BJM4AiLbgyvDPD73uLQ/0YJFw3RoA2VhE=,2u2ME3fEBMJnmjq35mqz777ohdvfywzy7vx1X9GXcvLzL9mSf7BfJujK26xRgFeP1YaQhRsW4wjFY2NdB1i6X9hu\', \'ids\': \'209\'}\nWriting record for Gary Marcus\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave27YN1kFxk22HfUb4fW6x7nLkb6UmMWjacJXsdFBAgPLX5 for Gary Marcus\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave27YN1kFxk22HfUb4fW6x7nLkb6UmMWjacJXsdFBAgPLX5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,bJ3ODTd5c/g/W+EBp5WDE1JyhRP0ZNaHVQ9Pcj0Lyj0=,2HENr8fePNjy5fForiqjkXb9QNKTRsnqeAZbU7xx4MW15BnCyyH1gpDbkxfPjKDRnLzaukvwZgsTtf3G5aQaX4FC\', \'ids\': \'210\'}\nWriting record for Bargava\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavefmtJc8vJseWZsnGkNo3acqoDTE9rJW5NYbTqyDFx7MKQ for Bargava\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefmtJc8vJseWZsnGkNo3acqoDTE9rJW5NYbTqyDFx7MKQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BxRsfjnYr26JUcbWCSmNThx2S0REsxzFsRw/LrhGsTc=,2htnDzjNvSERiEqYRtUAciW84qCrZRr9xrrVbSUm6kj7xjpWry6gqez8B7bYvjHE7SY1ZN3Qnt98LWcsgCZRb7mo\', \'ids\': \'211\'}\nWriting record for Seth Weidman\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveh9JzMvaA1djtsoXprS9NeYidkqwxJCh2vSTiWFEi9Naq for Seth Weidman\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveh9JzMvaA1djtsoXprS9NeYidkqwxJCh2vSTiWFEi9Naq\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,MZP+zfOoeCfHtVcbtZEG6FZBJtbPL9WEE4+OHdcGwrg=,51ri94kr6rYLL3sE6ALcmRBcTN8zBaLX9r5umCpjKDAxQ31UpzG58wkdt2ik5j2ffNuhEyWSdhuiCXLUPizS5pLE\', \'ids\': \'212\'}\nWriting record for Gabriel Aldamiz...\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavenDgagjbwCDfQ3rQ8B3HCt7EjDEcWtqUTugD7KsLyjwR9 for Gabriel Aldamiz...\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavenDgagjbwCDfQ3rQ8B3HCt7EjDEcWtqUTugD7KsLyjwR9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6Q//3jc5ibmG0aEc51N6ocwgF4y0y0jzfG/gRAUd5Nw=,cJPU4RDgJ9vFJJQFopwXf9kvgZJaER7AJkfL9KQVAGLkQAs3gjJZwEezY8PfiKWL8GXvWy5Tw69v9dGhqcgrdzQ\', \'ids\': \'213\'}\nWriting record for Sarthak Jain\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexNBJK7CwQhjRGHPf2Mcsd4az5gAH16YJFQ8wCBVkX8Re for Sarthak Jain\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexNBJK7CwQhjRGHPf2Mcsd4az5gAH16YJFQ8wCBVkX8Re\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,smpoWEZe9So4XPN9UCe8+wvQY27vdU5ruwzU5Bomrgs=,3e5JJcMjKS47fpY5EkHD2WcE7QEcm6gkpKanLwBkEVHebF1d7T4BASaUyAYN6RhKksFVC7C8KLYZQFUBNHoqHwCu\', \'ids\': \'214\'}\nWriting record for Emil Wallner\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavek1WcjV4cvTewhjZWurTsgRXSmHjgAomkpf5TUJA8WMYu for Emil Wallner\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavek1WcjV4cvTewhjZWurTsgRXSmHjgAomkpf5TUJA8WMYu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,IJytYblQkgTiZSaIK5V2XMYysiknxWHlzyyYHdNYd8Y=,5JJciswenGnQhk4igD4f6EZhKA6qjtEz24EqUoNgsLcQh3SThmNHezzLbdZY1a3L3rZPJAgXaqWqvB5zL17cmiDu\', \'ids\': \'215\'}\nWriting record for Gant Laborde\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiWV2dK7p3AHhBkwMBjPqpM6vVM78D62HdUUBYxmMzdKb\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,TdFaHlnplmxlfOn6QEDPQdtx9gNQfvkFqB4NaXGR7ks=,59T59Lvubs3Ucq8Rtimu2wfrik2fKhbAXegjtVMqSPfTqg5JP8Job6eF7FDn9LD6FrtHqk7Tjz8aEnBThYsYwhEG\', \'ids\': \'216\'}\nWriting record for James JD Sutton\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaven4NJPnGkv279TaLfxBAm9QPkkekHAxDnpLQuLsG5JX1w for James JD Sutton\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4NJPnGkv279TaLfxBAm9QPkkekHAxDnpLQuLsG5JX1w\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,JGjq614zBbh90mwjA0YVHiLw/ZsKEv1zQaz4Qku0B90=,jKGSjBWBAoDnLuKX7wTXeC7xrFLJX9WfCvNHsQy7RhKgg6sGfRrcQHJHa2yJitTCSozR9FGr1T3VPz2w6oFBbDW\', \'ids\': \'217\'}\nWriting record for Justin Lee\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyHb6WF1WBk5ZMQpMm1eG9uugi4MXnSgoAetTARcR9izE\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,CWRnsA4YfzFGmoqvWUMWp4K179odkAGjwOMj0Gma6Ck=,49cqiEHBg9tG4Zw89KwhDQstEQPT98WcMNPMD9A1ajfSpGH3hjytf91jsr42mZR4d1PXbG17ZeJqt9oFo2f61QLg\', \'ids\': \'218\'}\nWriting record for Kai Stinchcombe\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveqj4CCk3YwxrXiGRL8htNuJkx9m2ihNWXu89QKrw5Wkd5 for Kai Stinchcombe\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqj4CCk3YwxrXiGRL8htNuJkx9m2ihNWXu89QKrw5Wkd5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,wNo0O9qM7eSQK1tMJarWqGdJU5WpBC5ik0WUSaxXNdg=,3bssdCJFGw2iW1DkzcdzH5gxJF63jdCUj723TcAuvjjeqfkSwDh6pC5DGaJzypvbGKAzfiXYXXd52uZTgVkchNFP\', \'ids\': \'219\'}\nWriting record for savedroid ICO\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavezcDwigwgTRRn97YRX7AcXSF3tRaM4poeMqUqSzVsv7go for savedroid ICO\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavezcDwigwgTRRn97YRX7AcXSF3tRaM4poeMqUqSzVsv7go\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,37pm1xkVBJL4uGRU27JBkkMjFUAhvdcyb62hTRL6IEw=,pjd5UvG16ePjjmrwyw9UKynY7CrSzXiUiuYFPr1kvXu6uCqmxi2hqYQEQyNLJMGvtUYUDrmZju72ShAcW7Dy85h\', \'ids\': \'220\'}\nWriting record for Brandon Morelli\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveg2tZnZxXAqJrPscmJHNzRygPwsJ4ndgUXqxmTfUroeXT for Brandon Morelli\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveg2tZnZxXAqJrPscmJHNzRygPwsJ4ndgUXqxmTfUroeXT\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,91aNoiP0p56m9NVIZ52BnfS48vKH/QKYsKUisIg8X04=,2f36gkKJbyVasiqtffqWnnebggcX4Ukm3hS6kFLLnnTYWjzTwVFComGpn9Gx5kuAGRsKJXmqb591xoGh3ZV1MhyX\', \'ids\': \'221\'}\nWriting record for Sarthak Jain\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexNBJK7CwQhjRGHPf2Mcsd4az5gAH16YJFQ8wCBVkX8Re\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,CCmZTNaYF9lXGmrsdHzBElwSdy+Ko2NhWkivxvNVs2M=,4BC7bD7HBirGTFKrTaz3Xg63ybhr7LeeydykFDSvCYvjT6rpjjkKTuw8YdPeJMZeQCBPFvtoWoJDr3mjY3HGvs4U\', \'ids\': \'222\'}\nWriting record for Dr. GP Pulipaka\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefJHY7kHgG9cPmv6Kt1GBu7XnB71jBxCbrZvxoWPe3Exa\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,ghftrfs+EpolRAYQAqqdoNGTbBRiXjH7HERIf2CbQPA=,2XTWiYoJ4HteweUoFTZmHxzEsxBxwhTpkpKKVK4G5vEx4Zrp9gJEKUEjGkxEdwCzwFopXaKm3uKXgLaaUyNJwSsD\', \'ids\': \'223\'}\nWriting record for Gabriel Jiménez\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2BUHDoC27o6bHRWtEgCFYz7czfbyf5rGtcLBWUcq9Tr9L for Gabriel Jiménez\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2BUHDoC27o6bHRWtEgCFYz7czfbyf5rGtcLBWUcq9Tr9L\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,QgHnoD7QIuDqI2x4DBkUtgvm35YCPQrBePtaBxwKaTs=,64WvE7HFt3BJ9rm8h7Fm5DNpTGNeXUJYv5anQXWmD8pWwVFM2okxUQHq2FP6oQyxzPzYorCiEdvZNgTwbRsLw1mv\', \'ids\': \'224\'}\nWriting record for Kai Stinchcombe\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqj4CCk3YwxrXiGRL8htNuJkx9m2ihNWXu89QKrw5Wkd5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,uZCiX6efpXXjNqfrran5cuCnNRPfOGjsdYkqF8zusNw=,3gitVrCxhdsBbvgneJpU73FyJrYYnTdvSjhnmaSjg7NnLm1vDurmuETeMymgYuWutA4z5bTxUyvjUEa9AxAUuz6s\', \'ids\': \'225\'}\nWriting record for Dhruv Parthasarathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4oGoFxRccnvaCzqY7RQhuZdhSs1ZA9By3fFft2QGvzu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,u73xwjnv1IXor2b+Hs2k5qk2TkW6rsX4e+H/fqjkCco=,5EFSsx2rtqdnXBHP1rb5SBZKueLQFRg428vV6V6CeqscNT7rzk1mGv9cVgzkqtbmBTeWbmR55VfmHBQUJeLNkHhH\', \'ids\': \'226\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,8DW060E/9FOPwMMMcUJPG8+/k9zd9QqNOcbgw20iEJ8=,5cb2S2QVnDGHELyNuBWwKVsPqvY2T22dcZpS3gHKMHnoSavqJK1qswaik86WLvGUSiuCKYq6ZiyaCUNc8YWcHYeu\', \'ids\': \'227\'}\nWriting record for Tyler Elliot Bettilyon\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveq2yJtqYPE6afHfBkXUxVssB91ZwGuevU6iERvnimvZiT for Tyler Elliot Bettilyon\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveq2yJtqYPE6afHfBkXUxVssB91ZwGuevU6iERvnimvZiT\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Ozf+jCxCt1whzyf2pZ0HdDFg2s3ZTPwf/FvmdZabgf0=,4ZWeBRvNNBrHvQDCaFrSoVJ7d8RkY9SGFZ1g3tgxMKMgnAD39AfjERcZdQcny66RpmwBeN7fkpM5hiWiPFzG2RBj\', \'ids\': \'228\'}\nWriting record for Blaise Aguera y Arcas\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave25FmmS1C3HkoQEe4scEiy4cEC4hzmQ6AXbRWcDZUuBtC9\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,KlfEPV/B0MFCE12WDnH5hf5Fo3VXwgiAwhJ8DR3qJl8=,2crBXvGnKhAMmCanMjQGoddFizUeNjuKhaRP7QNsGzqqPpUQ73kK4Aga44cZgNe9Xm1DnGuwtdd1hijf48ayN6tc\', \'ids\': \'229\'}\nWriting record for Arvind N\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavequm9hcVc4VVnZ7ic9mB9TwepoxNYodXw4FxbdoGhex2m\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,IsuQj+6T4ByhTgVFGROmW8Cvg12AO59CBh3LBV2/D9o=,4te6UgUgNgkiL7potVaK9EKvt1mMxgAd8EynnBdkf7CnMnDZaxpx88G2eJLURx6R4oyvBabh1qgpGHhXMZgxK7xP\', \'ids\': \'230\'}\nWriting record for Berit Anderson\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave22ETeUTydGzGLLsdW3dp3qZ4nbz5HvLwePwpD3YUPJiJD for Berit Anderson\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22ETeUTydGzGLLsdW3dp3qZ4nbz5HvLwePwpD3YUPJiJD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,V+7E90rrpGBf0HXzKyLQQ7hK3wfNE++SvBLEkOgLi+E=,4pife5gM9Nh37koAoCQd4qUF1JccBZFDYy1WkbrZKWHvbQJvKTjnmrVXSxuCfmLQqpcfzhPVWjXmpDgiemvhqYmU\', \'ids\': \'231\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,DF7/WrxqDapQAqJxvbB/C5wgz65NcqvuW6fQ90qBWWQ=,2jHgjcf8kZZgCHEwXcAHNd85HQmM3wXmcwhS5W8hwY8iscVQem1GEHhfWpG7xyxuQ33czaC7KswV5B4vczBmC4Em\', \'ids\': \'232\'}\nWriting record for Sirui Li\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2AJG3ZzxHh7sAXHeikHrdacxR7wrSE3JenZZxK4wBpSKR for Sirui Li\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AJG3ZzxHh7sAXHeikHrdacxR7wrSE3JenZZxK4wBpSKR\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,KXRGuJ69wMkiFdT/9j2qJl2YszsP541EkemkqlKsODc=,4FvMtRpcBaxskYRkzDjzjUnDxWi7fKiSNiZJ7xwQy9DC4dM1wnVqDAh32p1y2yHQpcjEY42DkexLxg3JZQmMGNQB\', \'ids\': \'233\'}\nWriting record for Theo\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavebkWwnxF9FsBwcYntnj2EPdBW9rxhUb76J3nygWtTWoGF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,x4JJRrPUql5Zflps9GU1o7SxE4kg7Elz0C4oSvJH+lQ=,3r68XRu5bVAK3f2FjiffhdNdY97xNBK9UShcdarZE5PW3xbBE5uerNCdtqQ1FTy25mRHC1BSUtY69UQtuCyJWALd\', \'ids\': \'234\'}\nWriting record for Diana Filippova\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavenLYu9HDJy2GnJX7NpqjXEZx3XeaVQvcspdVZXkKWpP7p for Diana Filippova\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavenLYu9HDJy2GnJX7NpqjXEZx3XeaVQvcspdVZXkKWpP7p\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,YaOV7K1l4OtLuTCuE7VTHn2h6h83zxatWnJCa6ASsXQ=,3cQYtyWpVTyeu9gx4ApMud6CWmtmHrtQG8svB9Y9tuY1wsH8tCi9oK3qqA1rqZWfQB5hjpd3KXNGecKBqk13wy91\', \'ids\': \'235\'}\nWriting record for Peter Sweeney\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveegnFJx1up11tZe16WjDnVRq4EwdRMKuA4BizwdsUoUjW for Peter Sweeney\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveegnFJx1up11tZe16WjDnVRq4EwdRMKuA4BizwdsUoUjW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,qcWWy5UAGsj6u7ljosIHL5SSKC1v9px21duimdsHeyM=,3msLgSRy36XNEQChRbY8o2qVfREhyShkVeJd1avfWrkHpn1pMF5X46WHuPWHnTkdSJRtLmSZXsqSs52orgCPHKxH\', \'ids\': \'236\'}\nWriting record for E.C. McCarthy\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexa9NWpkxThWocbnHTbNfqPCW2rHucCVQmRXBWxo36hhQ for E.C. McCarthy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexa9NWpkxThWocbnHTbNfqPCW2rHucCVQmRXBWxo36hhQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,7xIbRhQTLb0yD4stPStVKPaoDGPPJy6OUwtegbQfxjk=,5Ga5xVvQ8htThqcBYreF6SskxHZidbRb6B5c5jzVBHbHoqGNDd923N1eP8RPS5vqSCHuHu44gpw9v63pPtkE2oc7\', \'ids\': \'237\'}\nWriting record for Jorge Camacho\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave21GCC5E9stevvKqaXaTNRx7R7AVSnFMXN1m5TVzcZwxPf for Jorge Camacho\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21GCC5E9stevvKqaXaTNRx7R7AVSnFMXN1m5TVzcZwxPf\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,ZtXwETUzyAPFW3v6soNn3BMCAxvKCRqIWr8C3WdIkhQ=,5UaNXzXoSLTVkjarpijJePAAGwCLweoxkxCkJL3MFRi52cXT86qVhixF7xJVGdDoMZ4DrRt8YxRE3ZYRvLNpu9oL\', \'ids\': \'238\'}\nWriting record for Tommy Thompson\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave23i66NEYuhPtHEFRhru48iGSsQMCe3A48uEVm7mFXcrRK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,ZH+TzHa/WEJ1P1QZ5Z8cmFAqlYeHlbR6d+dKyLjNVeo=,yTb6NedJDXheNDJ4MgSduqbgeWvoYrxrnGJjuz2RxZ7jGRHMdu5ZAw7UojjGR9dGFJ2WgRYEitCtbLLt9dvHEiW\', \'ids\': \'239\'}\nWriting record for Matt Wiese\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave24vrvGux2vSARnTYtuqjL5pqzXMuQUsg9sGLCHZAbpQxD for Matt Wiese\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave24vrvGux2vSARnTYtuqjL5pqzXMuQUsg9sGLCHZAbpQxD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Mr8bwxAkre6DizghCfFUS7fdnH284dwGD0GDa8ujn4A=,3KEDAR9JU6ePD27pFqkCLeHkhP36dz33N5Nn3h7gQ8LLKNgGGn2AtpLsiEwrfEkpVzZDSdgq9EAF5rauYHNTTD5S\', \'ids\': \'240\'}\nWriting record for Matt O\'Leary\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqBoMYrbXKtmgpk7obJ2XQKWimtoC3b1ps971CNdmyC4p\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,5m4sbps0avaV6Ywy+Mxiwa2470hAVF/E7eg5H1qfaOg=,5xwnkTMnJTvLadyiFXUsZCoF2Y2Z4bLawai8oFKki6KuCWRi8dqJB2XYkL7y9HNwNUYyNwMEoWKekBp8P5q8XcmA\', \'ids\': \'241\'}\nWriting record for Tim O\'Reilly\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave25STMXr7wxbrHEo7sshTmPhpWwyvamWMKSdHm2iF97WsJ for Tim O\'Reilly\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave25STMXr7wxbrHEo7sshTmPhpWwyvamWMKSdHm2iF97WsJ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,XPHsic3h7lMx6d8cjqqGIQ+3yYrl+B1wmNs0Nfrt/TI=,63NBR7cUC1YEN8TAoxdsDFyDx3L6JKrxg37uzLgfN669o7HHE4eyHSeTd7wYxagC3m6x62ENDC7xo95BeAStgQzs\', \'ids\': \'242\'}\nWriting record for James Cooper\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveqxCD65SCe1V2QnuNNdm2LC9dBETrfJw2B79Mtj81Cb9D for James Cooper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqxCD65SCe1V2QnuNNdm2LC9dBETrfJw2B79Mtj81Cb9D\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3zP2gHX+txumGP4Ksd21UlNOW6VTVKCuDEh5AxoiazA=,2Vv2VY8pzt97XSNwebUUojgwPD5YbZmEGSMaQcZhd4tCFajfoqWwa38McfwKuyM73KwY31z9CFZ9ibDv1jjAL8k3\', \'ids\': \'243\'}\nWriting record for Joel Leeman\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexNGiAo8PfCYJn6CsRebVknCMgimjZRSWuntqbs2y8m7k for Joel Leeman\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexNGiAo8PfCYJn6CsRebVknCMgimjZRSWuntqbs2y8m7k\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,/cTX8ELq7RqR9A2DsXKQ2blrz8B4WOnq8o1ZchvGdTY=,3MbrJdkCqKVZRZrsq9PqyvXC2zq9AWueVWNCeLHcgCfecXjF1bVg2SwVvUQvN86ktfFGCBXAgrxQ37SUAQ4BdVHH\', \'ids\': \'244\'}\nWriting record for Scott Smith\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavevHPpKT5CBM5pCtUAwHqh4E8KvyA4ccynfypkM68Cy7hb for Scott Smith\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavevHPpKT5CBM5pCtUAwHqh4E8KvyA4ccynfypkM68Cy7hb\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,ZECyTUjZWuZOjlEf6l0pxG707hKKZwyx37Risx+RJAI=,3QotEdSeiBoKVEXgmQyo1aPRB2PU5eRUWo7956S8TYgvsHYqRKpH2GER46sMecSyTgyq7jyTrNG61mZTX8VVBW74\', \'ids\': \'245\'}\nWriting record for iDanScott\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave221jAcb6vUZe94jZTMfD3hMJDJ96uUDnXz9j75pidfNuN for iDanScott\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave221jAcb6vUZe94jZTMfD3hMJDJ96uUDnXz9j75pidfNuN\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Z/6YkVX2O1ARrD4RDOdjZW8agkLJVzMki/c2IE6d/9o=,4VYzGmcY2K2G1c27MkDdsTZ2QZ1JbQaxPKfuwFzamzdH2qAb3sKaHJ1AXHshf9tRVfbdVZnH9DRfbV1X2UyF5ELX\', \'ids\': \'246\'}\nWriting record for Josh\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2A7P85zScCTD4fAwL8iH7qktH5TjQYPtd4ZrDfbkFZtR5 for Josh\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2A7P85zScCTD4fAwL8iH7qktH5TjQYPtd4ZrDfbkFZtR5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6JQfJOoI6Mm693XPiZrhncedPbIp0XAU9xlVpYa/4RY=,2mUhzGdHCWDV5WTrnZVVuQBPXgbJJ5BZP2R4pRFD4hnGikZyF1gfTj7ThbfXWc6ecJTKUX2WHcJzzXojuaU46E5m\', \'ids\': \'247\'}\nWriting record for paulson\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaverL9dAr8JYY3o24AN8Nw2zFXC6xxVGnVjJzuWRHop8ZLF for paulson\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaverL9dAr8JYY3o24AN8Nw2zFXC6xxVGnVjJzuWRHop8ZLF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,9GyR3Z5ffq0Q5Fu4tZivnOHqsN3gA3vKAkAduaevzq8=,56QAzL2szW3jnxqeVGbr84G15HLpmYddGerbznNGNxLsa6ffU2SKEFAHA2H4LeNEF6NDEDGtSA364A7TFrkHTsXC\', \'ids\': \'248\'}\nWriting record for Christopher Wolf Nordlinger\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexJqJhZ5xrybA6hZ9GSPFzSKyzJFXSpJjE1TmmfBibQCz for Christopher Wolf Nordlinger\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexJqJhZ5xrybA6hZ9GSPFzSKyzJFXSpJjE1TmmfBibQCz\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,nsA4WmvVNuZB4rZa2PK51cmSgXEqYZVTYHr8DTkOaq0=,4U56BCoJDWePtNLPk86qugea6oHpEWKGw9Gjp3jNzx4utZngE1ojo2cKstn1HXwAGquqGYPs7s8gBcXSt4TFJGNe\', \'ids\': \'249\'}\nWriting record for Louis Rosenfeld\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavephpFaJQEVXe495aViS2xgGoEREA6BATyCTeTauaQW4CL for Louis Rosenfeld\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavephpFaJQEVXe495aViS2xgGoEREA6BATyCTeTauaQW4CL\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,e5YB655y9QJ4DdG+kIXa8r2aOWycb3HwqMsJqwDcdSE=,4pPXovTuY64Z2yRwjeQzSMs5A5v4RFQGj2wkyTnb2AnjNHcb9hY7R5HyxQEkRibazGEBwJyuD4q9RNHmTDwrukh4\', \'ids\': \'250\'}\nWriting record for Matt Harvey\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavegeWkSkgzonRG39z2U1tzvYdUWCusxA3mSWV1nuXq5Kxu for Matt Harvey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavegeWkSkgzonRG39z2U1tzvYdUWCusxA3mSWV1nuXq5Kxu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,OXQ7GLuDbVUpG02dp/S9WI3gyd1Vj97nhB2kIPkuICs=,3e56YYsrsmY43tWjJr9B9hmNyhSDju2P3vLZJdwpEnxydZCg1Em6dTYENTEfDhcpB9j2qTgiEABy4GPJTGcjPvq5\', \'ids\': \'251\'}\nWriting record for Vivek Yadav\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveuVv4YmEidAwpsJFbzV1ctj7ng3E8nZWaUwU129jmrnpp for Vivek Yadav\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveuVv4YmEidAwpsJFbzV1ctj7ng3E8nZWaUwU129jmrnpp\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,I/KTjDCkGc7pTnHZaMSv9TLuLHpxDP67w1FtzaEwfVE=,378T55KYthUcR5W4hcx4DxmyWKTMMGdcd4e2iGVkqy1Gud3tdybR4Aqh6KmhjKPayNiwPBdZf6VDU7SPsYWtgoQv\', \'ids\': \'252\'}\nWriting record for Carlos Beltran\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavezek5AzGLAGxqL45VnPtvAAUDZtMMVRfokYHdEaQXVkXh for Carlos Beltran\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavezek5AzGLAGxqL45VnPtvAAUDZtMMVRfokYHdEaQXVkXh\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,23sHTMuRQmg2NA6KWCoZJnDrV+ZmXF5hIq2wjnniI0w=,3gbh9nK5sG7FmFxbdGQnpKLSiAQUK6oRJ96ahMmSmyZAKujNhdUgdC9WbKCAHHzday1V63fd5dViwcx34KiqSe2P\', \'ids\': \'253\'}\nWriting record for Matt Harvey\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavegeWkSkgzonRG39z2U1tzvYdUWCusxA3mSWV1nuXq5Kxu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,d55mWR26joyzTH9Whgadji+9XVpOCSWMQllerDcaVpE=,pbfjqAm6vUJwPeaSWtZqCdYs17DGJtnPupGkAnwRodNjdXPpfGEM35vm7RFLtpW8DDYLJ5krCAfV1qTsQFZVGmM\', \'ids\': \'254\'}\nWriting record for Oxford University\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave28aw7u5ot8vZF55XdsKyF7MugRfau5twbeyiiMQ6KHtXy for Oxford University\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave28aw7u5ot8vZF55XdsKyF7MugRfau5twbeyiiMQ6KHtXy\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,4hZuYVkPlVhkRA6XTnkVUlTzumfE3Y+SgtPS7VBNAwQ=,44hs8hqsEznZ3cXZ2jseaSXfYBuUgZ55ZoruJ44fdehttuzyTCixB4n4fFu6XVaKsZAxtt4Y5k5wWDaW8z1ui8Mc\', \'ids\': \'255\'}\nWriting record for Maciej Lipiec\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavewZ8gzMnajEiXo31RvpcPgH6uZCX9RCha5cXqRAXtnNbZ for Maciej Lipiec\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewZ8gzMnajEiXo31RvpcPgH6uZCX9RCha5cXqRAXtnNbZ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rl357x6UybRtmE8JQ/QLc6RdhhnXAxCrNAoRjemlvsI=,45FbEXDjDTUfe1rENZ2FQEjvc3Y4JXNzXuvx9BZwpHqVZYAwrfGpFujdSSDjuskq2VqMGLZZ6yg2bgkxTxiS4pcP\', \'ids\': \'256\'}\nWriting record for Camron Godbout\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave23vzTG37CTDnoA95yqxn7xCgBPxk2omnVzna8RtHQvwoc for Camron Godbout\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave23vzTG37CTDnoA95yqxn7xCgBPxk2omnVzna8RtHQvwoc\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,w7bRuG9CzkiRd49CHpxXXnULy6yqG1aS16ywnuik/ow=,4VqzzA42vy71DiMcHtiNWNNfrYmyC9HbDRfX5ydaYzxoX8aKhPcciHpKzCXRLiKPFwvUqEAnYLE8jHyJieyXBFJ9\', \'ids\': \'257\'}\nWriting record for Dominik Felix\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavepKCBnsSWCkeT56Kmbh7uozwLc1PrNiro6FMiy75e8i1Z for Dominik Felix\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepKCBnsSWCkeT56Kmbh7uozwLc1PrNiro6FMiy75e8i1Z\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,pAco/hpKYz9vFynZOseRZyWXkwJSs7EwKDyyAYI3iK0=,41bUaL67krERuhNZo6aZQ3c9hD3ZZs6rjvHMuTLZFCXRttgssWvwEYd6MwDJxDQqBeP7mf1H1UX9m75tWdJxJ7gc\', \'ids\': \'258\'}\nWriting record for Greg Gascon\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavekBhRer8cCaY8XsKxkg2vuVJcx44rDBrzVv9bvPAVz3u7 for Greg Gascon\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavekBhRer8cCaY8XsKxkg2vuVJcx44rDBrzVv9bvPAVz3u7\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,frN1VasDtNzPATCRvq5dRtApBb/eDgxbyDom5v4IXwk=,n2cdb3gwCZNjxQdU4MXQyUKKykecpGzuus929Ls2Q1weWxEsjcmDaHs1rTG17PmSvjeV64YhXEA5C2D1UUE2xWd\', \'ids\': \'259\'}\nWriting record for Dhruv Parthasarathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4oGoFxRccnvaCzqY7RQhuZdhSs1ZA9By3fFft2QGvzu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HjJ7cJcpO+cw8a5Hl7M33LN6oU1jcLcpLxpJZkdNW2c=,3B96SRJEqkYKpruzvwpVuTiUKjwu3cdGYBY5qfJyZ4f4WbmriMiXr2Bg1e3cHvLJzCg6LZfZtJm2D9z1FSsoUL8i\', \'ids\': \'260\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,briujeSMWo8jejpOCita/AOAfu0oaqF5KlTj1+OvMdw=,4jTHBMheGwMb7pCW8fYgKZNEXfVjzf6Fhg74QvzYykpVgdw2fGnscQEUZeBAvoZRBxLZBy4cVK2rUCoY8BEatJGM\', \'ids\': \'261\'}\nWriting record for Tyler Elliot Bettilyon\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveq2yJtqYPE6afHfBkXUxVssB91ZwGuevU6iERvnimvZiT\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3htiKGYVVNQGYxSK6CWTyN5kEI1e3HE/k24sGDqEjXk=,32KpEjBnUnDrBaGvPYoNLvRo1afchUy51oX2ZsSrwRPXnqzDYLFWB3hX1nFQSRS8KNsrmNJ6vzjBdpPFPqUe2XeP\', \'ids\': \'262\'}\nWriting record for Arvind N\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavequm9hcVc4VVnZ7ic9mB9TwepoxNYodXw4FxbdoGhex2m\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,EL3f/dIkDnwsAtyNxKuQ/zNEM7SqdZNHeKBPyY80/44=,4DDCwJXo8ugeFjMCFqNHPzCiVYNPFZcc3TtutRkoNcpiqtp7awhPLukTW6Wnr4p5oGhtyCcTLpLGxMdfEv3wfEXW\', \'ids\': \'263\'}\nWriting record for Berit Anderson\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22ETeUTydGzGLLsdW3dp3qZ4nbz5HvLwePwpD3YUPJiJD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,+KGqn3KGAKSu4AodaKa2sbZcrIknnE6KAMIYeDOsd6A=,5n3NVRYZtNtegJ5H1CKUZscNC2oLGsA7rvrXGua7DH23zrsDWBLJxCXQ3FRw9nnNnWGaA58YUf6ssEwSFPQwwBXY\', \'ids\': \'264\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,VDz++jcaSSzXBzGRiyuqXyvkxcJoMkEwRdLocMY3+Pw=,4NGJMtbNResJcHAqmm5d5gJrHMzTfPfXjoQpCJiEAUnmxCaXn2j4gccPUL5yiHSS2PTsY93y9zCdTqERKWsTL19d\', \'ids\': \'265\'}\nWriting record for Keval Patel\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave23QAoH6JpT2HZNVbjoAtYdgH45yvLDFuqjpAxJJdgKDkC for Keval Patel\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave23QAoH6JpT2HZNVbjoAtYdgH45yvLDFuqjpAxJJdgKDkC\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,XqJfzQZMpt8r4AxesT/h4SJpr8rKT70WmPZ0coUA+ME=,4zoLkchjFE6v7sMQ4ywXZJUsVWtd1tNJ559nRRLq24iFR24rUiroyAuJShN7F3H6bBVRkNjf8fUvers7bbFCGP3o\', \'ids\': \'266\'}\nWriting record for Eduard Tyantov\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave23hgHebZtEpJN7QrRjmTa6fKBBQzdi73HdZ6HyvCgS4j5 for Eduard Tyantov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave23hgHebZtEpJN7QrRjmTa6fKBBQzdi73HdZ6HyvCgS4j5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,XFxKnKl4wL7td8uB9cHVh/Vhi1kCFixM41fAjt7BL3M=,2csTqCiXrKwtTRimF6NxmsAMyLzeDC2PMoPGN5QsgHW23ixeMRKeqWfCzkQMVZrEqwV4vX4dQVcybQasctjintSW\', \'ids\': \'267\'}\nWriting record for Maruti Techlabs\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave22gMBu6v5nmXdHx7i9VTHu1ouGmTkwobmhQpJFnXKSzRP for Maruti Techlabs\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22gMBu6v5nmXdHx7i9VTHu1ouGmTkwobmhQpJFnXKSzRP\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Rwts77MaagmS31gYXK0SAUHYEHevEn2ECkkVOJstZUM=,2c63fzyxuAnhwaea5kDdS64dPyCTtuY88NQbKfoJWGePgMDUG3xDf2xG6etNQsF9Aw4PzWosoPBjLytuaoge9Ry6\', \'ids\': \'268\'}\nWriting record for Jerry Chen\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave26KKNhGwp5q86UZnmAip7uj7Krtox4qpX5znnf51eLsPj for Jerry Chen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26KKNhGwp5q86UZnmAip7uj7Krtox4qpX5znnf51eLsPj\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Hk6Seyn0yiwRdZSrKxvCTGf944CtdUvUSn/aXMSO6W0=,p4Ub1voMCepnZLiG6iSLB64muz4FPFrNGzsL8XVAokwi3Kig4Mg7kutXrDkCp9BTo2rhvMF6uCEYW6EToUbr1Sw\', \'ids\': \'269\'}\nWriting record for Sarthak Jain\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexNBJK7CwQhjRGHPf2Mcsd4az5gAH16YJFQ8wCBVkX8Re\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,IF9z84a0nW40Bfts7sN4KGu9gLjvSmozVHqlJqJ0nDk=,3HrbtRXDdbYTzV9cwgKUUsGD3zMYhst7mKjdxjVxrKLKgZeSar9AhVBup3bftFtcWzZ3pFH16jUQphVqsnc4ayS9\', \'ids\': \'270\'}\nWriting record for Gaurav Oberoi\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2BrmzbsdKuygoBfQKJPyuLaxMhersmKyFnDbgMfWyiAJw for Gaurav Oberoi\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2BrmzbsdKuygoBfQKJPyuLaxMhersmKyFnDbgMfWyiAJw\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,bfmEBhpcWB5e25riOMpTvbvJeXqHpRdJ43lX0bzqvP8=,29JQiee4eAtnDssFwA8v1qF8rJfJVQ4r2wLgpyVEQCefJwo4f7eR1wdP1LK95Wv5TH7SHSmJjAh4uZ9G9Luh9D2e\', \'ids\': \'271\'}\nWriting record for Nick Bourdakos\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveh7cJf8xyhtCwQXuQntwb98cCTkiQ5QLZmR1AihoQ99gr for Nick Bourdakos\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveh7cJf8xyhtCwQXuQntwb98cCTkiQ5QLZmR1AihoQ99gr\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rtMlni0kumVdaaC5+P51JZOEeLUXLpzLpnvoiACZi2g=,2yh2mp78Uku2x4Hi8ixXp6GDhZ7n7yXdZhDEc3PnDMM473xh2UwSbCaYdGVJwKRG8uZkCxsfkfu6LWFrBCYKGwyc\', \'ids\': \'272\'}\nWriting record for Mark Johnson\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavedtja9GB8E7yByEtHSd9Z1XpTPmMfLfDuipzFHPzC9keD for Mark Johnson\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedtja9GB8E7yByEtHSd9Z1XpTPmMfLfDuipzFHPzC9keD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,uFjn4fCrHFL4vVKXFwxTSOHTpM4QV/zq7OADdpIdLXU=,5ExEWFbacVbwxwj7LVDVXoRAah4WSFfMWazqC28cKBfoV9YAb6F7qEj2eHi7LXzgjXgvqRnrqxnuFwhmiJoZy7Np\', \'ids\': \'273\'}\nWriting record for Justin Lee\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyHb6WF1WBk5ZMQpMm1eG9uugi4MXnSgoAetTARcR9izE\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,BJtnA1lhlod5exN5yOHQe3hqdWTBCRtPMXgOq4RhU4k=,cNxDgUtnYEoynxh9YdC4PhibvPRvkZm91Pjo4bZ1BxPMVK2DAPhiDjDTbow8erwZeAgzcLcBkGaeDKezF4hgibN\', \'ids\': \'274\'}\nWriting record for Leigh Alexander\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavetY4ALxM2HAqTqrkJXszgCmv9BLD2BgKPfvPHYiVdxo1N for Leigh Alexander\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavetY4ALxM2HAqTqrkJXszgCmv9BLD2BgKPfvPHYiVdxo1N\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HCROTeFh/HGXilyjFCgal6eHxnGwdqwWhjeY4fF/nUk=,62P6FB2jBd6ewyfWxULRAzN9ZAMnhuoq7H8KqydDBbR6WUGvn2kDCjQPyqHErUpkjiFKrxPBbRgveTN2FzH2X8YD\', \'ids\': \'275\'}\nWriting record for Daniel Simmons\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveyTJyuUJw7VW71peNmXiN8zzgP4NgzCuXdQbfe2d8NL33 for Daniel Simmons\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyTJyuUJw7VW71peNmXiN8zzgP4NgzCuXdQbfe2d8NL33\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,X9NPUwBGUVK2RKFPzOwQrOG/wT6YN8ymz38kDMA2xcQ=,4Y6Bcsrp8Z3edm4HDDrdx7jTSKJdGfGbJAodKdN7RWV9DVuEbAknZ3opu79AzCmpUinz9Wk45gnper4yixSc8nxW\', \'ids\': \'276\'}\nWriting record for Logan Spears\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2BgNHvVH1mgqUyrWE8pcMvHjkEnhqLoNZWjojhs8NK4XW for Logan Spears\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2BgNHvVH1mgqUyrWE8pcMvHjkEnhqLoNZWjojhs8NK4XW\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,75fXfQDiqaaQg0YQsjQuz5/NV7PS5CK7TEBhDHzrw9w=,65C5sHusH6m9mEooyJAvQAr13oqiBBWsb4KaJZMPc6GNY4qjZuK7qAnbmxxoMwD44hmGZopomtXmnHUcM4pe9iCP\', \'ids\': \'277\'}\nWriting record for James Le\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveksdiyEuknX381n4PU68M5MeGpLAWRWLGkGSawiz7Hf5Y\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,4l6MQCzyx7gzweBu6pZY359ro9D+Sx8+KDAal0pJsRM=,44hyMm9x2q9YfbjoCGKz3ZsnFikcGKvbgx7ZQ7URrJRaU1emJ6geADZWVpxgiEr2a2DEZF7p5cZ5xWjuWPRQMmrt\', \'ids\': \'278\'}\nWriting record for Sarthak Jain\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexNBJK7CwQhjRGHPf2Mcsd4az5gAH16YJFQ8wCBVkX8Re\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,UlzFRhCTBHFTYojXmafml7wHSpfhXQIba9uWJlthy0A=,613AmQNKAfos3UaJAqMgdBYUnGSrCpyKUWxQKmeURA9S4tv2kS3Lj9WzCZxCy3JtsoNRDHiYBmvdDXjkj97xMw9\', \'ids\': \'279\'}\nWriting record for Bharath Raj\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavenJdSgqcpeLqWJwMroo213xtxjGcmGW9mVJRgP2riA6pA for Bharath Raj\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavenJdSgqcpeLqWJwMroo213xtxjGcmGW9mVJRgP2riA6pA\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,5eSY1NbxMwfK7TQuWyIap+2JKO2VL9f8ctnnvB3w7fI=,5U63aE19cY8W9R9D1YwMtw73MnhxjeR3rsiXJNaJXMDsF7hErYSC1hpE1xKo1NKV6EHGM8BmuPgviwg11D2PoEmJ\', \'ids\': \'280\'}\nWriting record for Daniel Rothmann\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavefSrjk2u7WYwuJG47D9VE8uDmB3R6m5Xh5gKb2pTyp24K for Daniel Rothmann\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefSrjk2u7WYwuJG47D9VE8uDmB3R6m5Xh5gKb2pTyp24K\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,x//v2evpb2sQ+ljePiLSy3O5Vqv697yGeLnkgeu9TZw=,4Gp32CJEetvGLUQKVuyqgmKtGm6Dp5czRdeewMdSbeUbft96aCzLgmCypH7EtfWgpKEothVgZvmKc5BUjjdZv3Le\', \'ids\': \'281\'}\nWriting record for Amine Aoullay\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveqxVnyaMvM8RzRA7z8SUrUCh82bWyq2tS5uGfZNjMv6eF for Amine Aoullay\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqxVnyaMvM8RzRA7z8SUrUCh82bWyq2tS5uGfZNjMv6eF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,s8k/9p8IY3cfr+EdIkrEOuPMRwka5nPx9/2ugdTHbjM=,22RpnMXp1YvjMmZKm4Rohf7pMLG86M3jbWW4k3LRUauszPK6qSD4H7aooWfxdULZ5cKoTUEAGjzsg3VjdCrpHYbe\', \'ids\': \'282\'}\nWriting record for Jonathan Balaban\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavefTfneyuQW4WThhCoyfij5tYT2dKNmHdrMS2srzXF235W for Jonathan Balaban\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefTfneyuQW4WThhCoyfij5tYT2dKNmHdrMS2srzXF235W\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,65nVKDzlIj9UUKU7ucBKR4nDdtwi9k1P12Grco1/GBI=,5fpSzRw2pkKZd2zvRDKghYngwxaxHkvZLJE95N4bLKpjJUwFHYTq5hYqFtr3RARh4H4PiQ39ssp4c4tdcUtu37io\', \'ids\': \'283\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3qEaxYOVYMs7CmUeUlPLVx7FJ9uLNred2tryrmQ7tLk=,3TPBKH7XTTcYbanDgbgPKD4bBaFy6Tx5G7taMcXrQWXLC2N29awon1HS5C5XWp2YFTXeVbpEhhVozEyrciQbWdAm\', \'ids\': \'284\'}\nWriting record for SAGAR SHARMA\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavewbSSSk1NcutDfEk6gF23UNzpfE5brPDio2T4Y6zXn4ae for SAGAR SHARMA\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewbSSSk1NcutDfEk6gF23UNzpfE5brPDio2T4Y6zXn4ae\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,EVCWFiQY2QPaFv1phZuirSxrxkONLISv45oIMBX5LZ8=,3LSi531JQP7tbMDvYGeZksNVxUemYgZ9oBriUezawMYqfnKhPygwhyEegVN8A63SzE6FFgya59ARdjZjfH2eZFKD\', \'ids\': \'285\'}\nWriting record for Jae Duk Seo\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavezfxNzJS9Mrvbr1p8B87sm37fLLVuw2VC1Qu5xDFRi5dS for Jae Duk Seo\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavezfxNzJS9Mrvbr1p8B87sm37fLLVuw2VC1Qu5xDFRi5dS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,3lDyN3qQG4JPufBnL9atueICdYOzNE2xyRY7cAOtPp0=,2LkRhTNWU1i1XnwsyZSHYwbS16sVS4mixULtT9cTBC9sqy3WHvVk4af79xeEr5yfZL8oUu8KiN8dP5L5tQUs2iNX\', \'ids\': \'286\'}\nWriting record for Jae Duk Seo\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavezfxNzJS9Mrvbr1p8B87sm37fLLVuw2VC1Qu5xDFRi5dS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,QJW4hl2wlQR3VF+TcfNf558kfqNQKh86RPj3Mkdqp8w=,62dUQuqjDNpN3SD3MCugtXjHamkfGQ4ZubcLCWrTRQ2jGLsQQXcQzpKgNrV8odXQdFiLncBiH1sLKgd8ojV68PM1\', \'ids\': \'287\'}\nWriting record for Wallarm\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexzqFZ1JPiicdsCxZEFMpuCELYuEU4Zeyjawhqf131xCr for Wallarm\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexzqFZ1JPiicdsCxZEFMpuCELYuEU4Zeyjawhqf131xCr\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,E42Opg+PzL1XUVvojRkiChZf4i7eZ/6rPnCu9XzQPPY=,5bHsupEYp3yppBfTev5jGr9ZsDVpZJKJjqdNFAEyaTtbGH1YYpVSTwUCRyYeJvdjSxDprUwrRL8ED8hh3rjT1RoV\', \'ids\': \'288\'}\nWriting record for Maryna Hlaiboroda\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavegNYLwsycxi6WTu9nedLPLvda4JZ8Ng9G6VLQCTtLCH7E for Maryna Hlaiboroda\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavegNYLwsycxi6WTu9nedLPLvda4JZ8Ng9G6VLQCTtLCH7E\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6X7Gg92SePTJWdncMROjwCzkY69hjXL8RJ47bZ8zEIE=,5QNh7eXGqGBTih9XDmjeUgD5sEQGAmtUU8Ud7CvisSwcTUh9w457xJ8BHeSZwMz3M9EHJqMs3cY3DLKvB5F8AbpA\', \'ids\': \'289\'}\nWriting record for Amine Aoullay\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveqxVnyaMvM8RzRA7z8SUrUCh82bWyq2tS5uGfZNjMv6eF\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HuizlR57rUEKPi93F/PsT2wX5OYrdY+/+4Ney+srym0=,3BZzpQXHBo7q9XEhrzY3Vc8ELg47ZNsjbnDYsRpNdqjNZMyRg2XzwDpij7sGwzid4CFkpXXpnmayv2fq4jX6gc5B\', \'ids\': \'290\'}\nWriting record for Kelvin Li\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaverL1Dvi1iSDqHEF3C3NUUhcZuEe4SZeeL9p215k5FeFWG for Kelvin Li\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaverL1Dvi1iSDqHEF3C3NUUhcZuEe4SZeeL9p215k5FeFWG\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,ugN9xO0qQxHUlV/KnBWxpQcE/foHM2a0TL5DbLOisZU=,5oXa3a766Vk4AYnPHRXTYEG789BaAXPiZd3gtYzWXVxNgCBTvSahTUYqKAMsLpweUxLY6Ws8JjQmKrAiKa7p9Fbk\', \'ids\': \'291\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,qoa34RNUbmzmW1uOMLF/XfNmQUSZ6FGGdbhqQJN8bZY=,XaE6zpuceGiCW6523GxFC1adZUcAgBcGsjpbuEVRiVSYhUfCGujxC8k1SKHEM6ztUGoq4qgSF36JUAyjxS2YTPZ\', \'ids\': \'292\'}\nWriting record for Stefan Kojouharov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefKjV59wbQoUWdfp2BtH9JdhkeHoAyDgZS7ERk8kWUWyA\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,VD1n4eK13LYx/FTdSnyRaqfiKr3SfMhIVGVpHDtsnrs=,4uM1mMTMN9j2hKpfZP3wxVkwGXDShRaQzF1kAjtkEsPg2woEHJUW8P5CXB7ijEx3vdRHt7fZAgCmXvuLsuritKQf\', \'ids\': \'293\'}\nWriting record for Andrej Karpathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AJvcy86CZgw3hdwnoXahQuVko8VXPMTpm7VwU7Zpoxhx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,rq6edg3hrQIOuvFepjZoneYcKbFaJAQ/uJEPkXUvK9M=,3VKY5abiKMWu1XvYJQkLqkaVt712aYy6A5GJ14VqnEtfEMb6U7PeezZUPLpXyqMuCm2pgC3UP63ovHXnk2HNn7Tv\', \'ids\': \'294\'}\nWriting record for Avinash Sharma V\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveu3JP7nHmL6cPHG7m9qGw2UJWkrAjzLmN993ifHBnEsbk for Avinash Sharma V\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveu3JP7nHmL6cPHG7m9qGw2UJWkrAjzLmN993ifHBnEsbk\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,d586oRlxgsMxZHHtoNgQslm8QvH06EljQ0d+5/cHyQ0=,5e27sjAjEV75yuuFTEjF4atmSKxuzZoC7cQApEFevKa4VCUNULAtKxket9J2kYdMtjWKYFXACT8nfVXRej91N6mQ\', \'ids\': \'295\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,HhgWeJLChL2vsezl3EokXMny+ZjevQAAOM5q31nSvzM=,66XgxH6K31AHwbjLBE7BjNXYdVYxuP1q2otm3HLb1mqYVuxCVDNjKQ9PPzSdZchnJMhb89jsL1meHo5z1xbMQ7do\', \'ids\': \'296\'}\nWriting record for Elle O\'Brien\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavexU4p6bM3jr14JhFSg9x5zLGBaSyTpjEKNZhBNTy8xNVQ for Elle O\'Brien\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexU4p6bM3jr14JhFSg9x5zLGBaSyTpjEKNZhBNTy8xNVQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Wot1n1UIrKXk5T8ZxCs0O3WuSpN7+LGHuvyMlyhPgew=,2mfLgyLST23bd5ApWvJiScqfnk5pGnL1HXWpc1Fdt8yXuCiptmvoKpi1vi1DUe8pH65UT2Wp4LDiQQ9CxzWzHnN7\', \'ids\': \'297\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,7LzITJ/iv1pAZgxAS1xidx2CmSzHrrgFYQoOvC1sfxM=,3TJAXLRcMpMeXfRAeCvJZh5JmV6Lb9R5AYLhC489UKgUDVpBmsH3WRdpSQN8m7i4LmnJF4NxftS4sH7KKPkzkQvc\', \'ids\': \'298\'}\nWriting record for Datafiniti\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavecbRsqUaiG8rA68QP4aC4Wb62xC3gk8w1KdpAtWqQuyTK\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,lbhPF/5KspYYipKuiGNjEVRgjNhSJCS5CPNjQ25x0Zg=,CZsGUvNDMGqJhp2Kb3GnkqshyoecVUx6tWnxqqgvKE7X61BRmEdunypGw8u4MEzXYqbZpNmsTk9QLxhZ1W5dLs9\', \'ids\': \'299\'}\nWriting record for Yingjie Miao \n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavegbF6z3K5Yu6245Tm64QWDXwEakDgWV8E8BUJ1SH5nXEt\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,O+Yx+Azj3L12LYwZBr4bCoIY0m3XjyqeQbiclfNBe4Q=,24dKp3zJUZRUA1dPbRvGetZPA6bSUPNRXRZRFcxt9NNqf5v12EoZqKEqPYqEeBc3uoPhZuDCWejkk24QdpAQL9Pi\', \'ids\': \'300\'}\nWriting record for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,LetCFy15YzS2Wh1pymj4DIpnufKlzbKHEdT8Ks62WRs=,2wae83WRBVY7hkYyctBmnPVi4moePcP4xHAhJBuPKmk8C3DtbCjamomM3LmW1eFbtc7ij3Z9kP3uWcZdoJ3zJNdt\', \'ids\': \'301\'}\nWriting record for Josh\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2A7P85zScCTD4fAwL8iH7qktH5TjQYPtd4ZrDfbkFZtR5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,669Y2mprNoxdmMve+lE/2BV60Yd7nRjPr/J/OnhITbc=,2bhaCLb187CKcTGvozsZEZVFAiKWDYKJ7XtCrsrDh6VYBmGKrMzRLSujNFRgNJDX8CfSJgC61Gq9cZjugJXTM7Du\', \'ids\': \'302\'}\nWriting record for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,g8dnTb1gtdUQyqxj9U/OtZS0PnM6cBvr8h8w8hK5+AY=,2Fipky3DE9cY95YJHPCc27A4np53jRH2DXgb7ckXhQ6PuKHX4hDrrZ86sKqxMdjwnfHprVBdYzioS9jGnpu1MsPg\', \'ids\': \'303\'}\nWriting record for Karl N.\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavedt58mukKQoqVnQaU8SYLXckyg4oFSscC6aXeNQ4bPtXx for Karl N.\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedt58mukKQoqVnQaU8SYLXckyg4oFSscC6aXeNQ4bPtXx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,toN0+Qq4h7H9A6a8Lqm8PxtOJ1R++OOkttKQaVBHmgY=,2DZQsHN4eLMcurFRiqq5c4qEystXMYVyD8PJTQrNssqtiyv7z1nwwonhTaZwfRBQK54KSrME9AeB5Xfg3ZcZcaYB\', \'ids\': \'304\'}\nWriting record for Milo Spencer-Harper\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavemC6X9c5CrsZkU91XLbh2fnfueGrKZc8cfXhzbphSi8uH\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xU0Uo2sJogeljBLwg5bEzc1GvWgF0rgUrqfK2QN5tvs=,5e9LkZAYVkvzHGhfnrt7SyYoWZUcCNWkeNqUxqCFLbr94pFVhXWPZJCz4Ku2VB9ttXd9KvEMQWnDcp4pvBQBkPKd\', \'ids\': \'305\'}\nWriting record for Nikolai Savas\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave22gXPEMzgsELu5qFcUtoAVADwxhgZTqCh9GjrJBoBpj7s for Nikolai Savas\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22gXPEMzgsELu5qFcUtoAVADwxhgZTqCh9GjrJBoBpj7s\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,P63zvcDd64legq4FyhB/9whg91xOsPW36LVj4Zedgjs=,3kTy8PTK2nKzuSet3PzfakMjtG4U9GDYBjRgVwuSo91zgGoZUpQF3zFW7zViFdJrJ37fxaWCzGMLDBu5zP8gZcwC\', \'ids\': \'306\'}\nWriting record for Dr Ben Medlock\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave27HqivHpE7duSBnCoU9LRQEYYCiF2P4E3HMtGP9Wr6f9j for Dr Ben Medlock\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave27HqivHpE7duSBnCoU9LRQEYYCiF2P4E3HMtGP9Wr6f9j\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,7zAp9IRsCw4dpsLYV4mnuJlso5K2Q6PLboUUAL60gSc=,yqtw6CfaQatGbGtJek6QJv8PV8fwcPoxenAKPraL6CQnLZAppij1nJfupPoD4UYYrizGXwTgayRrSDWdmCFFYfW\', \'ids\': \'307\'}\nWriting record for Nieves Ábalos\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavet3AavRPNg3bC81P4UH9REDguN5YPJ7evQKLPSJpK3U5M for Nieves Ábalos\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavet3AavRPNg3bC81P4UH9REDguN5YPJ7evQKLPSJpK3U5M\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,2IIgA4Xpty8DzuR9gGTF20JLXtNEEvAx/Qpy1OJN/mc=,Gq7KijRjmKsWygp1z6hJsvGbNkqRqpSE9bimPqcPxCDgecmuEVc1dAuF1c3USp6czHwxQVGKZ6A377iGqCYhMxs\', \'ids\': \'308\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,63x4RXAFwZLhDf1hzLm1BYZV+kioPPaF0NUwlatIt+s=,3m7oCGWghP3XmXcV6YmsLDibUfM79RXrp94DJ3aEe2oQP3KpfirVccpDpYTrjfPSBmRyLRT3ondfXktghARf9FUE\', \'ids\': \'309\'}\nWriting record for Andrej Karpathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2AJvcy86CZgw3hdwnoXahQuVko8VXPMTpm7VwU7Zpoxhx\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6XHTIhDAgPNYZjHDb9zynXHT9yWszlP9v2STck4js3Q=,2fNVcyLsDo4W9iGb5Aw4pXUTMW8NsvJAjFXYkmdqQhjPqFocUrVaWGCki8cbpp4k5g371PaTozbmoMB9H69Df1Tq\', \'ids\': \'310\'}\nWriting record for Arthur Juliani\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavedFL29ooZtwQG1ErgJrRpzigVbZMrLoXA58arW2Tw8YnS\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,fFyRJ2e5y8Ga9GP9x5ZDgWzneWEd1r4oW06xR+FMZJQ=,2t5y4TpAbYbRFUs2XacZHQURpYNXmnPmVefmE44EvNsmSETuuMFUwXYtFmFqX3CUX1BKiBcLoRhdqFcZoRAhR9gx\', \'ids\': \'311\'}\nWriting record for Rohan Kapur\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave27mCtghKmJFa34uGas2A1xf7iGGD1dR9Vg1u4rLK96gYr for Rohan Kapur\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave27mCtghKmJFa34uGas2A1xf7iGGD1dR9Vg1u4rLK96gYr\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,FyXQcwt+GS+Zg139K7g4/mG+sy1itvdpHtERCL20o9c=,4X97HKWwQAYXizFbMht1mnxW3HKsyDmzow1BFvTGhXeYFYDhpDoC5eG3uV6oxT2nJVAcjSYddYarJYzFEzYCDYTX\', \'ids\': \'312\'}\nWriting record for Per Harald Borgen\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveq2xt72H3CMNktaFK6Yf4Y6qm1q4bhWXts8QByyz7pCck\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,FBaUC19et2sV3IvgXlhOMhZ1lZP8zchVAtYfapBh9gU=,2yDBqgyaimJKyqfKNWvadTL76dW2MS2FMh7BGfrkZe9N8FG3YHV7TottvfR4kqvR16mHn7v8yDvGeaGvXqjyQPGo\', \'ids\': \'313\'}\nWriting record for Shi Yan\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavejKtyA2eNWLbR8asv3KdrqS8CF7C64Voytf4JNpyFZGaj for Shi Yan\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavejKtyA2eNWLbR8asv3KdrqS8CF7C64Voytf4JNpyFZGaj\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,NPajege/pAbOYsR1LwY2lfr2mb96yKJDuxpaeBUzmp8=,5FZ8WapyDmBTDvE7LxMy7JhqLcavnJpuXyqLAHRzED7TdJ6aPMs2pywp8yGeryK1gZoL9oJVsXsy5XBGSQcATwar\', \'ids\': \'314\'}\nWriting record for Ross Goodwin\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavehiAh1QgrLubTRUUy8PjKVeeTY4aWF98RjtX2YeKhqfiD for Ross Goodwin\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavehiAh1QgrLubTRUUy8PjKVeeTY4aWF98RjtX2YeKhqfiD\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,wm8kzKQO1RByp3grEYx4kIyr3kUm0J94F2YEijJhY38=,4KdHABip2Fe7sUup3jrNxcC6MLrJYN989ayE3hRGjAAtQKfxbtCYcY4T3o4LRDC6sLJVTZcFmLE6NLibEdF5agNW\', \'ids\': \'315\'}\nWriting record for Eric Elliott\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavezu9fSEE8oipgopXME8hSR6YcCA5mqoAVebxRVm7GFrBk for Eric Elliott\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavezu9fSEE8oipgopXME8hSR6YcCA5mqoAVebxRVm7GFrBk\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,OU5DJwSRa86OmyioQKQzI9yd+h7xSnin1qN58nKKifM=,b4unEz21EkjU94NEhfVZ5x6Q7iRSN88xV9HzwsbMTfyQazEUKcDUHEzfUEncamfZAhoQ3X1zbErJcCT3F2ncAnn\', \'ids\': \'316\'}\nWriting record for Dhruv Parthasarathy\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaven4oGoFxRccnvaCzqY7RQhuZdhSs1ZA9By3fFft2QGvzu\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,eoSs4NDiKaoAnEmqynvu7BkNZkRiyhi8PRJFjQXnBoI=,55kUFeCHNpAXsDp9FtDbiWoxWboSVf4z13VhLrYaQ9Q3ZuTxR6sSUNnR634jNBKBfgFmhEJMbwzZnw3XVQqZFpLq\', \'ids\': \'317\'}\nWriting record for Waleed Abdulla\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave21k8ypkEmDmwxAPDEQfCYZHNzwWuMN8oBsqMm7ECdDwPt for Waleed Abdulla\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21k8ypkEmDmwxAPDEQfCYZHNzwWuMN8oBsqMm7ECdDwPt\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,QHaAj7622ACUpIKzQvybxw3jbnkYOQ0JC99wEE3KblI=,CzMHVSZoYACCzkoDe9k1KhRhetcSjt3djd7apBFA56YgMqY9RYVXKtYjnJkoorVGuHXh2f6HcyE3L9YQSPfXiaw\', \'ids\': \'318\'}\nWriting record for Stefan Kojouharov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefKjV59wbQoUWdfp2BtH9JdhkeHoAyDgZS7ERk8kWUWyA\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,/x7WPM+D6ow2l4aQCTdgdoZ8TgpUKu+SgrA0JyF+F8k=,61pwsvchR8VeSwhzqyZ2yfCLghQUXZvgrRBPoz9R6kmZzjazWUjSaTSXMpa3uJcJ9r57wDRNjL31UrG69XfJpXUG\', \'ids\': \'319\'}\nWriting record for Avinash Sharma V\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveu3JP7nHmL6cPHG7m9qGw2UJWkrAjzLmN993ifHBnEsbk\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,1iq7W6eW60O+q4a4zn3Yom+RYRr6bXw0rfiQrPdrZjc=,4UpjMtpJ1uDXnRfcWWtmWTBDD4WZtz8i7xLeZssmGzu4ueyUCNHPuDGPL37mLxMgpn5nKrEtN3tzSN2rqV1cStfn\', \'ids\': \'320\'}\nWriting record for Elle O\'Brien\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexU4p6bM3jr14JhFSg9x5zLGBaSyTpjEKNZhBNTy8xNVQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,w1lWIt8uZu/YO6MKk7udWij5dxiJC+X0bP6xwjB7B9k=,ndsedYQhmsnHjU2UdBsjoqAg9SrwkqsBnwEN5HXXLJb7uCdraHTz19FwbxE6wY7JxwFfT5SrtbR83U2jMriqKpb\', \'ids\': \'321\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,pjoqVE4jqdpAzvR0GMK5/SB5UeoDNj/zLecPNMRk9+8=,3SuHJJsbf2Wxk36HdQPK1bKRJ4a2VXEmB364xqTwr11prLgHeZckDmE86QMPBsgGDpsbuZFEMKqfsqPZ7NPrVtZq\', \'ids\': \'322\'}\nWriting record for Slav Ivanov\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave26MivJGH5aepdnznAym38RtysyTBEq9yjUf2wr2TAjwVV\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,E3zDvWLnWcUmsTWMT7V1nO7Axl9TFGxrrLd0My7TSOc=,5eEb9GMCTwfVVz9pFeADdZUbgx5q28KBGfe9ZFo7V4JgrC1ZEkMKfqNC5MeZBYsJRjvpNPY4fB4VrXvSZDaH8G1p\', \'ids\': \'323\'}\nWriting record for gk_\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave21ZndPm4dPjLwfbjfsHsrC9yPBBunx9TwUqJcL9nxca3i for gk_\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave21ZndPm4dPjLwfbjfsHsrC9yPBBunx9TwUqJcL9nxca3i\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Rn23Dh5gOXeygbPFNGB/8ljtXov6AFaTzQYG5WKHmnA=,UWKiPhQCzAJG1kgVhmfVuN2f9Xe44nJB4WeSQXWdGXYoGRqGB85uVdvHzUhBCbrNb14fSMpspaF3iBbdoQ36svo\', \'ids\': \'324\'}\nWriting record for nafrondel\n56f3b1f203e31c31208abb493ebb5d40\nUsing weave2BYv46kfgYy5jJqZpgXXaQCVV3bNmWF4yaZz2Qtq7bhQv for nafrondel\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave2BYv46kfgYy5jJqZpgXXaQCVV3bNmWF4yaZz2Qtq7bhQv\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,JO9zzabP5oEFHk2Zu5Oudrvh1z33RtOlktiyc6+3XcM=,66tLHjuXjwtNAoJXzZe8YsWvuXEKGQ1zfczAN4zEtJAjWF6KEY316kkPVyKQHrpX9QKurNnVt4XGteL4vM2h3CCC\', \'ids\': \'325\'}\nWriting record for Neelabh Pant\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavebnHtY43y4UZXddkL4ExTdMJ4o1N1FZYE6dH9q4aB7JeY for Neelabh Pant\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavebnHtY43y4UZXddkL4ExTdMJ4o1N1FZYE6dH9q4aB7JeY\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,+QchGZpyyTWaAi9zlnKfeyBNqRdzic7njrJpTXqdnXk=,3YQBjtvQLceJrbh5rtpJxi7MU31Wxtpe9ih6ftkurav6NV1GnC4hw4ZFv5B4UuusjcPQuLUBF6bskw2s8swfsdqn\', \'ids\': \'326\'}\nWriting record for Eugenio Culurciello\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepxPwEkHfD7sDabbEMN4Rj9F92LiY6ZN7oKpwGWeUYzZN\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,CxBuaZDTs1Dy/cLOURdvasRKyGKJaKkR8oN46sQFACI=,5qf1M7XGYH1uEUWQ7rVAjSLcWK5NoZcpL6cSzZuNYHE9DCC71FXJ7Rqq8vpEKbtUF94qZtiZCnjsE8ZeK868VAA6\', \'ids\': \'327\'}\nWriting record for Gary Marcus\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave27YN1kFxk22HfUb4fW6x7nLkb6UmMWjacJXsdFBAgPLX5\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,Kf9EuusG6Yp4513gymgLtDsUMoU5l87isWrFzlwwNd8=,64eCcMr95oRpiSjVkEP64eovSR2vQwqSoyfn7G2Tm1jY9kigG7SzhSM7mtsUATPQgQQPzSD4dBbBWpuGU6qwWM7m\', \'ids\': \'328\'}\nWriting record for Sarthak Jain\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavexNBJK7CwQhjRGHPf2Mcsd4az5gAH16YJFQ8wCBVkX8Re\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,NcZbNqfw2eL7Cyb67r35aNaMHbGrTW4b2xpSvM7TcvY=,4QKWySjCimVkXEADMCNmeCx9s8QiUMMMB7BEn3vdhBDvBfMdd9fpikjwLAwLqJfaMMXmZP4op3CFrWXeNFpP9kTS\', \'ids\': \'329\'}\nWriting record for Favio Vázquez\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveiB55xBMybfaQj4TYnv2YvAc4Xk4SHhaC3XtmEvcqy12y for Favio Vázquez\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveiB55xBMybfaQj4TYnv2YvAc4Xk4SHhaC3XtmEvcqy12y\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,YKIlMbjhAfoWJk8oPYJsz8pt2Db6t8Fdg0NZvSa9ddw=,3DH4Gb4VuCsXTufYqjp9u6u6HKur7UNkVHxqzNwVTufDJr7CZ3jZLrkxFS74ZspoFwLW32tZhd89FmQdzRG1PueD\', \'ids\': \'330\'}\nWriting record for Oleksandr Savsunenko\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavefVH9dRBw6crs84RwFH2EnU46JK17fTguticMFhh8bKV8 for Oleksandr Savsunenko\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavefVH9dRBw6crs84RwFH2EnU46JK17fTguticMFhh8bKV8\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,tCXNoEpr5Gr7Kq2Q51Hsqli58uP5OfbTkJCqQykqxJE=,3jrDvvdEFPRkaESDvVg8gWUUCMvChWsUchJ88FJQEGg6nu2tDuBG6Fakm3v7QNj5Zq5tQzUhxLCDoSpXyku5mxuV\', \'ids\': \'331\'}\nWriting record for Max Pechyonkin\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weave22pdghXa46iy1DQdJAz92d5Tzx1wS3KneCJyo6fiA7FTQ\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,6y4crl/xt8TzxBDgZKF1MuGAq8MXFFAaCvoJKCFU5cQ=,fxcKhtYUmEUV7a3em39yVKdDt8pi1n3mSkD8J5WovgFuxt8yuHdkeuGwLccn5JDbaAFRSATpidMjaSwyzq1yRRr\', \'ids\': \'332\'}\nWriting record for Daniel Simmons\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveyTJyuUJw7VW71peNmXiN8zzgP4NgzCuXdQbfe2d8NL33\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,sawdNj3J94URCcqlndvwG+SIuIBtr9yfd3wlvnwEgz8=,5U8vuK31r1p7mMQvqEvhYbyYCb3665TZLUyRpw5ehYZ4ZyNhQDZY5NXU3w5LhJmSCB9KGQjHiwRaDqBsDUSqQ3bJ\', \'ids\': \'333\'}\nWriting record for Eugenio Culurciello\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavepxPwEkHfD7sDabbEMN4Rj9F92LiY6ZN7oKpwGWeUYzZN\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,OWjPq61eHNmP1DSNGAZhP+xW0Jo+HNrXxGlk905217o=,56fHvaDK3eYhsWbCSC5d8hP2QYgSnbGCFeYXuLU6Zo84bDkFL7D9FGvBACCAjTLhu9cdvo6adDEMrGG8FpkATz8t\', \'ids\': \'334\'}\nWriting record for Devin Soni\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavewtrC9kGB8NJm7tKDBY6vVYC2oyyG93Gv39akdSGEpWCi for Devin Soni\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavewtrC9kGB8NJm7tKDBY6vVYC2oyyG93Gv39akdSGEpWCi\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,wFj4vn4J3T1ufS4ZLjaEU1j65SKLxq80SNwh5ex0WFY=,5eapFwYFnJhZhtnFsw9ZZHQ7Mt4J2qfLnPu2bhQ6mwV4k23eWCMmJvnGvAnmW7bQK4TBsqbDiBnhqhTNLYaFbMEx\', \'ids\': \'335\'}\nWriting record for Carlos E. Perez\n56f3b1f203e31c31208abb493ebb5d40\nUsing weaveySdqTVS2dqjxAozJZo3sLAEjNu3EAWq41Fq9HwndqTra for Carlos E. Perez\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weaveySdqTVS2dqjxAozJZo3sLAEjNu3EAWq41Fq9HwndqTra\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,++G3QgfD+IuuXo7ckmVrbaCK/afNVbJr2UiEePtMXtM=,2dmR14zyQrpXGZjQimUE4Ps7zLQLyVG6UqFfhnheHRcJwxDrT678eAnNWrwdXHEJLQERq79y2j6VvN6oqMPcrNZz\', \'ids\': \'336\'}\nWriting record for Nityesh Agarwal\n56f3b1f203e31c31208abb493ebb5d40\nUsing weavee2pD9gD5q3ZXFxJL6TDA6q6jXj6c5Tf4HnB39FMmxgps for Nityesh Agarwal\n{\'res\': \'ok\', \'target\': {\'operationType\': \'WRITE\', \'organization\': \'weavedemo\', \'account\': \'weavee2pD9gD5q3ZXFxJL6TDA6q6jXj6c5Tf4HnB39FMmxgps\', \'scope\': \'vault\', \'table\': \'medium_posts\'}, \'data\': \'weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q,xf3ZPdM6LUOgNmOhxwDBXtZNQ2NHx1dWg23gEb7xmlc=,4aDaVDCSPDm49Zz5Ej7o1kECtHzmThULagnRhve1h4v5QJQbX9FgPq96e61HyP5Mk3GtVDV8bN4GtYuohcGrSPJ5\', \'ids\': \'337\'}\nDone.\n',
'rootHashes': '"{}"',
'writesSignature': '42w7GhxAj385wuzGzpU1AwE1cYnEv1VaVj3evN512bCZNgjwAx3r6txEXvaMCS4hzB6uGtumZDahu5saBSQ5h5L7',
'outputHash': '36UaD8YjacqVUxbbCoAssrkruugmmAWjC7sQLvKEJcNC',
'outputSignature': '4FYAToD4tDshwzddtm81cMpAVzKZCtb4dkiHXB45qsFweUbmsLBJQWecS5NnNXgNnn6T1t1m3LqdJchnjnbNR78F',
'computeHash': '4M5CUV9uRi6EE42YEKxYyPkd35Kf1CMfUWig1VUMfnWu',
'WEAVE_API_KEY': '7e85df2cacf74d1baa9a8a90e702126586d6dc3f9d76f773',
'output': '{count=337}',
'input': '[]',
'writesHash': '6LfKoQQMqb8fYgA1PwBPKMhFaJ59Fn3DWw6qTRri4zjN',
'paramsHash': 'GKot5hBsd81kMupNCXHaqbhv3huEbxAFMLnpcX2hniwn',
'writes': '[]',
'outputSignatureTs': '5RZUsTFSxN19RAfSEeTkNGHPcLzrdyqU3wZj5TRYrSpvc4xck5U24Z2EUZ7Pwa8LaMwppPzpZbHfhhqXTvB2yBZJ',
'taskId': '665884fa5bc444ebbcbbd2e9c5fb695c',
'consoleSignature': '3Cpie6emfN9Tfv7jnimECZXGbvR65SmAHEBPLvP7r6SYQbs2YQVPonyZEgD6ywHJmmNbrTJaih25niuNqR24iJBn',
'ts': '1691601087449'}}
Compute lineage
task_reply = reply["data"]
#print(reply)
print("Compute Task Hash:", task_reply["computeHash"])
print("Input Hash:", task_reply["inputHash"])
print("Output Hash:", task_reply["outputHash"])
print("Output Signature:", task_reply["outputSignatureTs"])
signature = task_reply["outputSignature"]
match = nodeApi.verifyLineageSignature(signature, task_reply.get("inputHash"), task_reply.get("computeHash"), task_reply.get("paramsHash"), task_reply["output"])
print("\nSignature Match:", match)
Compute Task Hash: 4M5CUV9uRi6EE42YEKxYyPkd35Kf1CMfUWig1VUMfnWu
Input Hash: 6LfKoQQMqb8fYgA1PwBPKMhFaJ59Fn3DWw6qTRri4zjN
Output Hash: 36UaD8YjacqVUxbbCoAssrkruugmmAWjC7sQLvKEJcNC
Output Signature: 5RZUsTFSxN19RAfSEeTkNGHPcLzrdyqU3wZj5TRYrSpvc4xck5U24Z2EUZ7Pwa8LaMwppPzpZbHfhhqXTvB2yBZJ
Signature Match: True
Test read records
reply = nodeApi.read(session, data_collection, articles_table, None, READ_DEFAULT_NO_CHAIN).get()
#print(reply)
df = pd.DataFrame(reply["data"])
sample = df.iloc[-1]
sample_article = sample["text"]
print(sample_article[0:200] + "...")
display(df.tail())
I believe, we all have that psychologist/philosopher in our brains that likes to ponder upon how thinking happens.
There.
A simple, clear bird’s eye view of what neural networks learn — they learn “in...
id | ts | pubkey | sig | ip | roles | link | title | author | text | |
---|---|---|---|---|---|---|---|---|---|---|
332 | 333 | 1691601083484 | weaveyTJyuUJw7VW71peNmXiN8zzgP4NgzCuXdQbfe2d8NL33 | [{"sig":{"recordsHash":"sawdNj3J94URCcqlndvwG+... | 172.17.0.4 | * | https://itnext.io/you-can-build-a-neural-netwo... | Daniel Simmons | You can build a neural network in JavaScript e... | Click here to share this article on LinkedIn »... |
333 | 334 | 1691601083503 | weavepxPwEkHfD7sDabbEMN4Rj9F92LiY6ZN7oKpwGWeUYzZN | [{"sig":{"recordsHash":"OWjPq61eHNmP1DSNGAZhP+... | 172.17.0.4 | * | https://towardsdatascience.com/artificial-inte... | Eugenio Culurciello | Artificial Intelligence, AI in 2018 and beyond... | These are my opinions on where deep neural net... |
334 | 335 | 1691601083547 | weavewtrC9kGB8NJm7tKDBY6vVYC2oyyG93Gv39akdSGEpWCi | [{"sig":{"recordsHash":"wFj4vn4J3T1ufS4ZLjaEU1... | 172.17.0.4 | * | https://towardsdatascience.com/spiking-neural-... | Devin Soni | Spiking Neural Networks, the Next Generation o... | Everyone who has been remotely tuned in to rec... |
335 | 336 | 1691601083590 | weaveySdqTVS2dqjxAozJZo3sLAEjNu3EAWq41Fq9HwndqTra | [{"sig":{"recordsHash":"++G3QgfD+IuuXo7ckmVrba... | 172.17.0.4 | * | https://medium.com/intuitionmachine/neurons-ar... | Carlos E. Perez | Surprise! Neurons are Now More Complex than We... | One of the biggest misconceptions around is th... |
336 | 337 | 1691601083641 | weavee2pD9gD5q3ZXFxJL6TDA6q6jXj6c5Tf4HnB39FMmxgps | [{"sig":{"recordsHash":"xf3ZPdM6LUOgNmOhxwDBXt... | 172.17.0.4 | * | https://towardsdatascience.com/wth-does-a-neur... | Nityesh Agarwal | “WTH does a neural network even learn??” — a n... | I believe, we all have that psychologist/philo... |
Records have hashes and signatures from the source
display(json.loads(df.iloc[-1]["sig"]))
[{'sig': {'recordsHash': 'xf3ZPdM6LUOgNmOhxwDBXtZNQ2NHx1dWg23gEb7xmlc=',
'count': '1',
'pubKey': 'weavee2pD9gD5q3ZXFxJL6TDA6q6jXj6c5Tf4HnB39FMmxgps',
'sig': 'SpGY2Qpoc6XmXRzhEibQY7RstmnYUY31gRg6DxYBd7bQgpVzoUM9mhje6B3Qh3eA2xwwXHp6gcisnSB8MhCWce2'}}]
Check balance for one of the authors
account = sample["pubkey"]
reply = nodeApi.balance(session, account, "", token).get()
print("Custodial wallet:", session.publicKey, float(reply["data"]) / pow(10, decimals) if "data" in reply else 0)
Custodial wallet: weave29LwVcvu5rrg9bfbp7UhQ89unqStMzQvtn7Td5ioSu38Q 0
Set read fees to 1 USDC per row
amount = 1
fees = { "fees": [
{ "operation": "read", "fee": { "count": "1", "fee": amount * pow(10, decimals), "type": "count" } }
] }
reply = nodeApi.updateFees(session, data_collection, json.dumps(fees)).get()
print(reply)
{'res': 'ok', 'data': [{'tableExpression': '.*', 'tables': [], 'operation': 'read', 'fee': {'count': '1', 'fee': 1000000, 'type': 'count'}, 'version': 1}]}
Train model
Blockchain anchors for immutability proofs
Records have immutability proofs on blockchain
https://mumbai.polygonscan.com/address/0xf1e724671af7b7591bDd1501A7f3F6cf81bbDE69
reply = nodeApi.hashes(session, data_collection, articles_table, None, READ_DEFAULT_NO_CHAIN).get()
#print(reply)
dh = pd.DataFrame([ [x, reply["data"][x]] for x in list(reply["data"]) ], columns=["ID", "Hash"])
display(dh)
ID | Hash | |
---|---|---|
0 | 1 | +OS5Or+l5QQopMePffNnEg62E2uSjsZRcja9ohjORMY= |
1 | 45 | 08AWqU3V3OT4oIb0amJ6M9yOYf4G+c0lnLsd1maseAU= |
2 | 102 | 9PuksDOy7BmvzFK9/o5ssY90q4y7pTjmqXqwF93an0I= |
3 | 159 | dyRjUZ1znJZH9GEwBgP8kYAHhRsHZfUuw6BNc4EWM9g= |
4 | 218 | aR7crHv1hYe9X4GqgFbEuNBShcVtERSZ+fG9FZ4IbHE= |
Merkle Tree Proofs
Records have a different type of immutability proof offering the ability to check inclusion via merkle trees
https://mumbai.polygonscan.com/address/0x4a2DEA252D04c9da1029689c4907Ac36a5854d24
from binarytree import Node
def showtree(tree):
prev = None
root = None
lvl = 1
for l in tree.split(";"):
level = l.split(",")
print(lvl, level)
lvl += 1
nodes = []
for i in range(len(level)):
pidx = int(i / 2)
node = Node(level[i][:3] + ".." + level[i][-3:])
if root is None:
root = node
nodes.append(node)
if prev is not None:
parent = prev[pidx]
if parent.left is None:
parent.left = node
else:
parent.right = node
prev = nodes
print(root)
salt = "salt1234" # Same salt used for records hashes, this can be improved to have different salts for *each distinct writer*
digest = "SHA-256"
filter = Filter(None, None, None, None, [ "text" ])
reply = nodeApi.merkleTree(session, data_collection, articles_table, filter, salt, digest, READ_DEFAULT_NO_CHAIN).get()
tree = reply["data"]["tree"]
rootHash = reply["data"]["rootHash"]
ts = reply["data"]["timestamp"]
rootHashSignature = reply["data"]["signature"]
print("Generated at", ts)
print("Root Hash", rootHash)
print("Signature", rootHashSignature)
print("")
showtree(tree)
# We've built a Merkle Tree at a specific time, signed by the node that created it.
# The Merkle Leaves are salted hashes of the data in the table. Binance did an enumeration of coins.
Generated at 1691601135368
Root Hash GNgTXXfKtbH9ZwkKVwxTML7gd91FZLY6gnaM5Kr397JV
Signature 5nfrVJ1FwUhm8wWnjkHaBYEq4CcfdNWmtY7HV75Vm7YAqeq3LmWmxqQ5mzn5AMkYTJbL2axvN2sRrhGA5fLUJUC4
1 ['GNgTXXfKtbH9ZwkKVwxTML7gd91FZLY6gnaM5Kr397JV']
2 ['eXchZzqyGmuUf5inuchRjwkKX543MHi8YJUSZg4xYsz', '7QdfPwEZcCSNym8Tmm5MaN4imUPSe4eCroeHnRp4t8M5']
3 ['8uXdwYFH6Wdcr4Vs2Fwb3BrutWh6pDcnCkk61YM5E8i', 'CkRbcbEs9WZi2RpEULtvVBtt8JYTKpo5BFdF67dsohrS', '7QdfPwEZcCSNym8Tmm5MaN4imUPSe4eCroeHnRp4t8M5']
4 ['8oGaYtp62vQ88bu73rYD2oueqMD9wUEvDAEYbmHRD1Ti', 'Bunp59ZQN8gv4xbZe7t6UvSDFGg5ZEUNMXaryurGYt95', '7EV1gr8ZPK3ryc1Yw1gNrty7e3tNx7x9PP6qAcuMFPRk', '6xzbgmGNKsNxNnHNJagxhMhtG3Yw2J2NuGBxzazaWEMF', 'GjS8hiFKJMBbGERrnFdx7qHjvgBzuvE93mXzd9anbcwD', '8EnykTr6mqRZyiDnC2NznsZnHmugYU4MxEqYPDdu2b7o']
5 ['7D3BorZbk1cY4FsMgoRtb8RubfzjFrE4zPweTT7G4cho', 'GvPQjhxgJth9CagFwkCi3FkKkPyxgndvR7826hrL4uy6', '7JM9uumriu5vs2aQ1sUNuWLJSqd3XFpVR7LdANNEqiUh', '6FLYr7yXs4v6osFVYrnyuiA53aEa7DHs3EugkyY8QYP1', '826ZoPqNujfiSQEZUt6MhojEicQMjyADNpy9hZESHBaB', 'AGn8SKuoaWKdXxfaxwFrTCAiBEmjiDK8bvJEG7oqWgYS', '5ZmuxjeKiBzyENdjxVEvDxcu4LrVaMkvV3RuckRd3s7k', 'Ek4YCvM3BMWN3g2wrs3qNkHk2xBeHJno5Nv6EN8x2ZSo', 'BTHVgBzYT4XbrpXLZNAmW6yvTmag1PLAebjEkAGHGJBT', '5JPM3JSMxkxYeCcDDwAEyh6xDyvi6oEKLN8yy1df9HHP', '8EnykTr6mqRZyiDnC2NznsZnHmugYU4MxEqYPDdu2b7o']
6 ['4VLTwgfbmG7kDKKdyTWwSmZXx4jVRvhzWZ1cRriX7TSf', 'EK82QX8H8ggwqEXdnKz7BgdDk6Ua7uiQHmE8fD5L81pN', 'CpTUkrEVhCbyh2SA1RMmS3io6D8gMAHjbMS3pRoVxs9i', '5tKtFjUkgAbixP1n1UqJBLYFPGTu4voGf2EncaZoU4Tn', 'Gf3bgJRshgXPJsMFfDtZTDR7wSHN1zSWmREF39ebu9mE', 'CH6cUKco6bz5oE5DsR1f712KW5EyJPRNHsoj7QBRkFmk', 'DCoSYfDcCGxwSENf7kq95uz1oGLGTAsAyGRet6VkdJHx', '6PJa5Y9qYKzAR7UEch1JjuMkMgbhmK4HVXdRptsSU8PC', '4teytPzX4PNywYbMSkJaz4AY7xJn5uBJ8i2dtRarJXsC', 'CKP3xZsZYhn4xcvg2N36Jqn6m1nyTqj4gifmvLPzB8do', '6hBKcB5Ycj7EGGUirvpZMcaadtFx6TX5orHrgKAEVYBi', 'J6iAmyJWiJDq7fELajbtrfUkBHzXWrvqgaXCzriUdE8N', 'Fd1aKg8rPWhsSgCSVxDVPKA5QGsT77xRHYfjv1ajZCcf', 'ArFqDArQXhddpkpUSqENjFdxL2655yNhEkKtUrWWZNpe', '6UjvaXQjYy3xjHwsjKwAg5bT6gZLyjaQAoi5mWSt2YKH', '8LndfLarY62L1cV78JkZ2uHJzfKknJCFzqG5mXdp5bCq', '417dLyNUyUqHTqKTN7zm4vAUFthz8U6u3JJTDHWLdHKZ', 'Db13UMnkT1W8ZtHK6xLWqAppg551sFK64Sqh2Cc4LEnC', 'AbhJRtztRX5nRtHv6h89YKa7PoDRDiYPjHeSmt5fAj8g', 'Biad4AYAx3fsUSNYqCrz1MPsSZdPBy3rSzBtCgws2MAr', '4jCJGXd5SfZWQaB1EoxcLGTtYwWLKL9Z4RvUvCvSdCsg', '2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc']
7 ['5m3BraGweaesYZZVgNKoRQgFWGCt8RV3TViJAX3KTYzC', '2Gb2BPSEEJFtAdwHMrv8fiTeMzDCMxdw71CKzWUxuZP8', 'EPF7PixygWmJAmcyTxVBa7urqaKhqtzd63cMmj917iNN', 'DAKDjgMtwDgbiEmK5BxGrdQbB1mRc5RUmzhmFz6quCh2', '3aSbwH7VaHiBEfuyBzdAxHhubUnnnYMGb6Rbftb8ThyU', '7v5KK5grwMbT6e3UyxhfYYkyXqeXraZiaWjRbgHPhLjx', 'Ac5oJ1QwiLFBGUy16nVBP5VBksMFK6tgUCKR9Gkn4aRL', 'Awttzuvobz2xDevLnm9XaVZambaxPudyWnHcUmyDhd3q', 'GqXQhPUQbzk3JqdQ5BmdMscVJBKJAXuKDHETBAmxSwXD', '3ng3oSowqHM1ATEVhcnesYJMYEhq92jhhXDCvRnmnZZf', '8UCPnB5sZh5Yd8pyNHeXntUY3Spgi5M2bBgUXfigoXya', 'iatNTaayU5Kya97gehs4yjzuZmnpaX34XBF3vWgEhQH', '6DcFuA7hPsZXKQuE5y9cMBuWgRgXnUmzqs4zmnguvLzu', 'G5pqUNc7hY7abKvaPGpAEU1NKk6ziMCbUU2rZuuJsJCW', 'EK4UhcWwjAmeUNzbVKrxbqgVifgTKAeHSTKESVeVvMrP', 'Byx4mgJ9nJjTwcjSiUvkSP99YrhDGuirgxgjcZ2DE81Z', 'DQEUaw6U6bRmQjGkhhRzH9jzZEbZbn8iVd3ArAjh97JH', 'ApuTPbHRKrQxG3QnTVT84QcEZR4nGkaWE5cc5Rkxkqat', '3CK2f5UfUpVLGYC6QT4S4CHqZJTnCmJ4mqPHUwuDE26K', 'CN8R5FTWFkwBnGp75b3jRAS7Dvm9gdYdHQUYuonDfyLK', 'FpqjZUhvKrRCtm6eCkVf2LsN39eLn7d3LGtGFRHTbGFm', '34ZHcDGhxLbrkPjvewb8h7etuKRTHnzojEs5Xdoj33Gf', '5ia7FtZgcPz4hrMD6eSJ8ajg6fY2SMRjznT5rPdTmTen', '92ZtKnag8isTYVFV3Z2CJH6eCzpFZWQjVUZT8vTZBGFY', 'Gm4CYsxQnLMcxvwdZk3pBYvWfMcLTUNaBWYUcpVmeqXz', 'Fpgvr3F5p3ZiVf9XSwtn1edeBHCeg9g4FSZkRXPkejSu', 'AnFtj8CArnVGfcVpsrQxLbiS9LM1KGobhmpcNVVb8FZ9', 'BzuMHaRJVzxR7wV4wRS8xY3uSPyNFhvHaFbocFaSZv4N', '3xCNqFs5gY28K7ok1TaokvjC6zRaCHm7fLeqqn7pYapC', 'EMzxtA2xPupfHbpzwWNG5z4nqAMLGnMsKGJg1p48RXj3', 'CSDKxsZm78PT41XYz2yP4XpwChAf4jscpFXXA7qjWhnL', '6N5USNuDUR3HiksijDsDkdj5P8e8cf7XztmVcCFBSu8v', 'GRcQ7RWtiL7jjpMkirhhHV1GwKFsHb56zs6ecPANGWDH', '5YY3rcZLstrjitYynL3Jdxk1JATEaipMbdWyLkoArqC1', 'CVvzKACaynMvDuZvnjkzusdDzrKpKnfqxCCS1K81mT8k', '3F3GTZ2R82oBvfvho6Uktbnc8QrHCwhxGqoQJrKX3R7w', 'GRzXU3Y8osZMfM7GexR25ec8hxsrrNVcxwDNGPfRrfzW', '3xUkmHK23EEVBESNG7TYUQgvgv3Mpg9UJkbkCtwd1rwd', 'FDEEqVYzmbCD4bP2Z9VuiF6aXggQZm9XNAoBnwA8uwY5', 'DdwBYZwzfgvfupdkM8KF2hQnq6Gf3Ppt6pELzU7JurRk', 'EsCtaXL98pGFZRVKE5oizGdRK7GgWyabJEfBnthuEJAG', 'D1YWGxsZuAq7aSChqQX9SVM8Z9f1JpFWyADVfZjgfuLP', '2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc']
8 ['FNo6KaYaintjcy3xX7FUPHVjVGMFj9KGmVPAhgEoQxZi', '8Rdx5eqXkL6PXyufTg3BffW3iExYuMWmVXWj4D2BM8DA', '3JVWbWwkkTo1MLX9ukPxMRrcNjonpJDmUSXFM2nrQQtU', 'CVX8SMAGxSeaRKssVbEcUd1YgZqsE2k957BnLYz7Zjk', '268D9oayah61bPrXuExqAjTmZZP3UMkHGm7fNVxjXzdm', 'EkTni31NJzEQv5rQaThQkqjSFvrsm8hQtKGtvg7ruzEj', '5XMcEKj86Qzz4PRfLxULbuizNhGjNvvfhHoHrsiik7oy', 'Bmje6KKGa2L4uJoE5iDF9AVFqXhLjRxKYT4TBqkUrLLv', '7vgfyoJTmnaT1ZfoXCZCQhQ8nk7u49B4w7eYar6fovHC', '3T9JVobxcCytyKyCnDwAqmeUfk5nW6DpoNJ4myDg6hUc', 'DBSL5mrQfdvfXz1XTMWvFX1pYPwtT4ThgjP5L4LS6qWP', '3obvyCZkb5aybrBR6SETK19QxgyKCvorgLMb4Dq8vRhB', 'BSpuPajTjue7tZwzRnp1Lp8r4CNxo9ZbUquPHR7nvDwb', '26oLtPAj7wprR5rdVSWi3zBRMqzqudWdqeQ6JiogRkbA', 'Fte8przgTj7vYneUpVvqgP4mWuDkYgNZsvkxkErGsqMJ', 'JCq5NbkSeF3daa4zE5RHwjUUyqaAzuxLuzVRpHKkaiX6', 'EQuKb9QTRyXcBeoQ7ZcPANpwwSMhshvVzAigqs8XFW93', 'EEGJ6nMahpJPyf1FJof231HiY7ABx2sHBcQ72fFUgrYY', 'HZ7RY2sqZNoyMkFWynksRijPMASHRWWKE7Sc7CnVUBVS', 'GMM46QQj7TeBEygPKn4wzcAyUYWVcq1h6qvGtPz7o4Xd', '5CXz7wgnhPVzYWjeeVRLhAhKzbSRyZph6wUAHqMkuXi5', 'Qj4kG4JsaHCVevc5XmanKt7ffenVTzGaEsjh7a7ZShP', '8Rdx5eqXkL6PXyufTg3BffW3iExYuMWmVXWj4D2BM8DA', 'FSEnzRhVkRnuHCSiTGSnBfRFGaGVvVqYU1iYUShHcDTH', 'DJA7XwD7w62v4dAzmkSiM9DwyRHBQ9ZeQJ3oz7hnhbxw', 'DcQpvhHiAM1rj6tJAPPdWmwUkQhP26C7EkTx7az3Xx3k', '5FpgsMrkwPUhdGN22hjX5X7dv3omR9cQPmZhhzq2AWLN', 'Ez7y94j3tNbJxST5T2BtxxxFyjmTHjG82brFbwEKsXoa', 'BM6RnCxkNsXAwhgw8GECaQ1qnkEH5uoWfxAQSKXGP91A', '54rWiPMRdPQGN7HBmw8G6XuiWgDUQz6JQrMwTR2RN9At', '8MF6qj6oFyLk83RCEwA5UejbssH1CJ78m4PbrXRnBVGt', 'HD1VThU7MwRzsbVgC7jcmTEyBArHjFJH5tCJamwdwV3t', 'vjGkGe8kAzNrKXWXiZUQ44Gi9CLJQbw72aimPh27uAn', '3n3nQsUGjvQAVta6vvU7BKTr3EbyaxjESrRafKaxShqN', 'A3AEX4q1qAQoRNRe7Xmq666s5a4WsD99xfshuG5MUJUd', 'HbYbmYGAw1k7439kS7JF9dhKsNh2fAKkDV5B4DLtpUp9', 'CqhJZSrhMQKLncQp4pTCRejsHntisLdtavxwXhxScZj8', 'BYR8xdwiQpCZ7zXrb6aDa6UnVM48UhKEJdTVZP58L1Fy', 'GjZksdGn1G1hToC6KRZUa5svsGHV2XJ6R5XryE4N5cVj', 'AvqQ3NaWzDm5QhPMENegr2p6A2DMC65LYCY5fQRaYJyW', '6YAvoAndGYcCFdi8vewJDDPj3iNEbS5hXnMqMPfRLz6Q', '52AoAZQ1x53xypMxa1mQFQjvb2LuGmFgJbNiqmYKMaAc', 'FDnXmxaxA26qi327i4vN4DZ7bfsDUMgkfNS1LF3ossRd', 'DGoHR4CG4kHybmyxH32XDVWMqJYLCKknXQtkEpWjgz5m', 'CSaGo4XMdid9XRQ4jCk8aWSoBzVCAzhDv5Rg8C6UYep4', 'JDRRHHJfVr6ocGfxZQRLnarKYcENyfXFzMR8orctmBnf', 'E9GwgipCpHLrBf1vGRQFsEUMRDxb3hA9zpjSZDRqc8of', '8fGNMeer5tgQj47wDjBZhobrD6jQuQVcjXZi81rLu2St', 'DZqyDkWYGt4VrzNaD9BwaF1ifGtEp52MrWrwN6YgJ62F', '6QJRoFFohc3hRMCuwd7qca5K4cn5m3MTmyTHw1xYEBvv', '9y9bXinK6dY1BFQeZhBGax4vumceJatgQtYfz6xyHsqJ', '3P7asxJErLt4H3d4SSenqKkDCSK2Li8iK5qceDD7axrj', 'Bfn1gzr6vvuUNVsVa3NyKF8f7Cz5SnewA6ux7d5oWWPL', 'jbxpxT6kzbvYyiRRNB6FVUyvxKNPLSah6LeMZN8rhAp', 'EDPQLUqNMSWvUpnxzsv1PLkMz9LSYUpp1cCThqmMa15s', '13wF8FdedqzQwX2RF8G9a77av5e8APKiuFPpVvPVw8t', 'AxQZgUrsemdjbDRtGpv5qCd7PEkojbD9qvaVTs5XtwAL', '9qzAs6AVuCSwS6myCsdyCqJG3vWmrPJBAX2oJqEXDUyC', 'DP4ZJJiJRfG4DU1rnGkcZzdY3ZGViwQ4qcgM8KWZbV4r', 'DYMdsUPWr3GWTcZ3JVsbJZ5rpwjm8rx2MpzL3QngDWWC', 'CxXiGU3MhurevMdEQegdGhrHYcsFD62yq9NCiNDve8o9', 'Fv5JvuGYBouGKJkCDBjxc8XHJ5487yjcDPq22F5a52nu', '6QNXRyQpYS1kh39WGfehwL5vMAe9C9UEcwNJbkqSwsr8', '5iNbq86w2im3tLW99YupgJboXkNWbeEMo2WbFb3VMecJ', '2NkvgL6g8pWaRHcYNjEBk25G15jLXEtiJxUV4M21WqEH', '9xBEgEJPwCsj9HahA28m2F94sb8UcJ5UukEaKf2K9zvb', 'AtKR6RXqxHcYFjazT1rCLrEmVosvNv6dTTrtsCRMfa67', '9N43gkYtyJGuEZi3AZcr9vkapgwyudwaffzprA2xFiuZ', '3zRTcWLS3HgWWZNfzV4oGkgwpkuWzmrovCbHCqT9gHaD', '2v4wAu4LTw826fY9rUd6bHec2f3ggQsJ8VjWeV8LgmsH', 'AdQtCvteyp31yqMfrnWQE5H8qJK3Gopu8PsXNpvygueD', '5GR8FuuNMPnSXVUhAcU7SHuxMF6bEBH2qNkR1B1AijNR', '6gsdn3y8Fv94453CCQ6bPgEJKBEvWfQt4X9ZbmfLwSj1', '6NJtpQELr2JJru64aVsiwHgm55MWVeYEHNbeWvAYYrgF', 'mofYyDc1mC7QCNQtUHm9dkYtZ4NoJMy7eFogRLBeQ5m', 'EbyoDx6rVgvN6rSvKbvfyYtRkAVDCadrLBCLWhFpXLZW', 'UJDbgfqcifM7Z4ZCh7o6ZiUQUX5zHGd3pcrmVXreAgY', '7EXQRZnFdK2pG16UDH596HTo4kPrS5PphpfSL26EYfcy', 'iptYazFXJcDWQQWKN1SRSw5JTP8UjK4YzXg2RoYaETJ', '2mPJYySoiGW7A5HRwXgLQeJ3Wy1bNPrcoRE5DGNQsVi1', '4bTXWN3ssvqtADkzqjRpmpKjwe9hWakvuA67FcLAWKhd', 'A4bdbNyGMJTLY8q3RmvNSC4A3pUPuHQRvJWQ2mUqe76R', '5ouqRD7q8u2pTZaFwZgJw2LoS1WvDusiYi5XGYaJ7QYA', '8LiDnwSTeGv4PFYC2JZ2f1wZ9HPrbBVWvm6wYMH2ggow', '2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc']
9 ['e63HtptGnGLbKifWdck6A2d8Jwo3Wvqpw2125AZX19L', '3soAawbWgbgTxFtK61FdxNgLcPNQ9XMai2xhzAbVjiAs', 'B99j5deUMbaMJXW6jFz4Jt8fQshLtD2RvgvFJv1E5o1v', '2vSTexMcq7SNhTU7HqsL4zBoRRC5NF2e3ec5yVCSHuXh', 'YbJ83wNZSbhwkooLcgh8BTuiERxpwKG1PqUcRLmBLHi', 'AEQzVexTyULgp2SwMVtnkvqVjeoTpzrPkfrPLVfUVtjt', 'AKbLamktexeLEEcEgkjsQujfi1KVvzwkhy1h4NtoNWuY', '5biVdWvryJePm4mL1ZigNdKBbVCafPuCxR7GzmRVG5Hs', 'GrPN2F7PVE5Y9bDjYEvqv1T73ZBiXJ9M15tNPDFVguTs', 'H7xTx4Qjd2jEtiuBgZkTd2wT82hEk8SVYbGSxdFwBbhK', 'EYZ3AwntJiV85Tm5Dtasck4hz9zvQPVPbyp1j4bF9TLz', 'Hgtk163wMBp7QsZHQRb2arfrKCAcHon7fBmaNcVznJy2', '2iCJVnSCay13PtfDj2BVkjNsvyHhbxan9QMC5tk54HdB', 'mogQZhGAkDrqdN7vhiB49g9zpW5AhyhM6CBK6wTfezk', '7xPqSv2TiWMvFzqhtUPdmizCgX9bivPHnwK7B9AZEBjU', '3ASRmKQphko3cj5Vzux8L9XFVX4SS5zKKAN4D9pbUsQK', 'BoGs6Gxvayo6xbugkPii7RVrYXqzrxB4RCe3Yn7jfMju', '9UT7mLBQWn6kpf3vGNTR4xA58epXx4jnDL4GcKgLhTWj', 'BfKXFWTPNBHwAsvH5Jpc6t7FUiEpJSK8zTejqq2ckhpK', 'BxEjaMwi7prFPVqSDAZygXkWqy3av16J85NAeDQSAQke', '2VYkeddEhJ1V74WyqSP66DrFmWN6kBjKa22DUM9WhdpG', 'FWTs3k8rSPxbDP7ExkUoeqquPJf5mCnSdpM6ERduTfXa', 'CNVS2G9v55cUzti8m9yB6a1P9HG2tJNG2jKDZ8X4meVG', '83NXJEnF8UVS8GLYTC2EkCySwy42exkuaiKBZ3WFWb2p', '8AgANL13xSYgbVVMkxPHm2ASbcAoEFNzUU5EuYgTqRXE', '4AXgt5qmgCNGqCJoLiqMetWWt1gDC258F66UtAhsRGA4', 'JDaN719Uo12fo3UpfKAgrS65ijfEN8g2QZWforJ9oUhD', 'PSsaJ4Gw3PJvFrqjxQjidhqyFDFFG9TSrZLjWEZXte6', '5biVdWvryJePm4mL1ZigNdKBbVCafPuCxR7GzmRVG5Hs', '4SFEKFD6j65ELUA8dyb7u9T5NV9UB5V6VfrqKPM7E2mJ', '5pKHKvMsY21zAahzSLwobFTDibG62zaQJ8tv2oWkriGu', '4eEFnE8cuwMYXW2YAqvyxZKLgmumbHSYwWZZ1dqRZJXB', 'Aw1eqxVDRqZPVdA7QYEn1crGs36Z8gGDNiWZpvLbePDE', 'FvCsDMrwQdLPvPX5UHAkXJ4eQqNGjp2xstKtWS45zDvN', '6GeW3MKw2wBARzApFmnTTwqBZaYwqgAjftBMQnimELKv', '2aTCseFFK3jZ1YJtYA4fRSnnuroZzVTqFUpoeZLKR9nH', 'CYby5ceeaoMcSHWDdtbz8CV8bWchBazErQVspUoLnXQe', '2Xn9Csv6gpawMU5RJUVwXCZX1Ngn6s7j7z7Wu2pQDeJY', 'GRgfZ2vtpFNH9h77tb5HZxHAthwJ9iqXLMdQRRWgACM2', 'ATNwbwApM65r59UaXWYksjtaVdftcqwfFXAZEBhxtUCi', '9TtTVa62Nne66raxrzHJNRdmWuMge7eXtwvSvARD1JaM', 'AVQTQXD1bYYknZKf66YsHEuSUuTBG7iSmwKdzxzFN5gv', '5w49uLjgua3iDvciSTpG1TMuWTYpvsrKD1EEPiSiqFCm', 'Ao1YbdFfKBRiEbmB6Vs5LLB61PkHUsfbcaiebqNDLjKX', 'B99j5deUMbaMJXW6jFz4Jt8fQshLtD2RvgvFJv1E5o1v', '2vSTexMcq7SNhTU7HqsL4zBoRRC5NF2e3ec5yVCSHuXh', 'YbJ83wNZSbhwkooLcgh8BTuiERxpwKG1PqUcRLmBLHi', '52BiiX9JyBdn9zEanXiyDvkFJW4xNUYvDSGiWQExoT2b', '5V8JcVa1XUEDXmnHU52fvDKBhwVDNv7mR79UDT5niEQ2', 'H7xTx4Qjd2jEtiuBgZkTd2wT82hEk8SVYbGSxdFwBbhK', 'CsyUa8ormbYeaPnW6xRg2EWQUWko27m7fKeYuT6ehTcR', 'mDtooTT7LgcoH4yimiPRARdtr4C6tRfhDuhWwKkDkSp', '5jruodeVipsFme74BbW6EU4c1QDrDM6jPH1aVSmyvuBh', 'AUHQRVjsuiNZSqdJVQzsF3MwjHijtdZZKHwCs3yKSVCu', '4zjzMdoexQ4JrqmxkCEHANuibBSTE2tnPXcJcmpxX1X', 'CeUCENuWkUYJu4a9CQsRfWxgrpXJYfCnJVzgwRBbR2Ts', '2FoADkb1R3pFYSUfdnFLGRVJkPmYFUvdjxejJXefRq8d', '9t19qHuECmHmVm5hSbedSYj1QHxGBJcV7bzEBcj5J6q4', 'HX1yscCLqdy5GmDppHPFK5rsvNv1LwwfMPjyJaBa4jcR', '2tjta4gc97sHyYtTh7G2beMsJmmspbh6Cq8hib9CAmpq', '4a5x3PqKoqAYS2NaNsE2AQSDVWafXDMRrsuCXTLdtJca', 'ADBJbVhTj5eYegqXC3bLbQjeiVM3KFEGFhP9WiJkmnJi', 'T2i8SaZ7b795AS68yKsG9sSdJhwisKjF2VncMNtbRLx', '4rpw7MybEtVg48s5YhCFAVbSjHRRoeUPjw9bQMn54Wje', 'BWXsz6BfGvicY3yBzYt31vazuHDxfnYvtrczh3AazUza', '5WABaSFtgKDtFrqEULe5ypMHPWDsMnKaZCTzQrTZZ5gr', '7NK7cdrgY8teGWfsBx3EWsTPBwcW3VcGeV8d2mJSKoro', 'FkLSCh73fxi8mfB6bBdibAA9FMwj425X2oSESkht44NE', '4SFEKFD6j65ELUA8dyb7u9T5NV9UB5V6VfrqKPM7E2mJ', '5pKHKvMsY21zAahzSLwobFTDibG62zaQJ8tv2oWkriGu', '7hhZRngbE41utfAX1t3o1JqPWZuQYFc1HHT2uiQEWQT7', 'FvCsDMrwQdLPvPX5UHAkXJ4eQqNGjp2xstKtWS45zDvN', '6GeW3MKw2wBARzApFmnTTwqBZaYwqgAjftBMQnimELKv', '3gKxdSHnh9uWfnaPRtgDVcuTWp3JGpskrcxKsGDZFCUQ', '7qXLLxAWNi4BH7E9z1qexsHS621NGWR8fETxSGLLqxxx', 'DAYQYHFen9KK8L8ahwVzqRPqbah4jr56gmFBdXBrLezR', 'HLZvKA4wBXFVXREzGRenNjXzAjiBkYqPHadVGnZ5yrqz', '7VZPUb1pPrVTdhYF2u6SiTsLLFKvSwkeZ1ZzwH1UMYK8', '3jeiZC4xZu1Y85yKC9VQuZPd6uv1qnt5fMTYeMtis8dv', '5EcYiTtxYxFAzPf2kqN1cYWgDTrSPUUbKyaYvEPBo2wo', 'BBqqPKbpmtavmsVZg4STmdraX3VYhVJ5XcU2krVC9vPw', 'H4grdN2KvfXpcr54fpXtEUHMSx3pY2avbgv5QpTsNWQT', 'GQuZEodcskZY8fqsjiBFyGftxxnLxtwMFQ6uHeycQnpZ', '9F4DhB1oxDGs7V2LZQogJQQGYQMsinGJoL8dvBm6dozP', '8AQyZNMJT3AtqzTeMkVoGnnhpCPbTqy6EVkmBo8HbBH7', '7wPyNZERwf3cghbDMiB5NyAYNDtnVnJJn4wZS8hZCLKX', 'Fnsytky5ABfp3CKXdvehEk1wsSg9cAkEwvCCHiUzEaME', '7qXLLxAWNi4BH7E9z1qexsHS621NGWR8fETxSGLLqxxx', '3JRHmLaEAEW9MDirQ2H6s8S4dpbv222X5NGDPoucut6K', 'ATApZPaWKQ78cuwwq5srUpphi8ARkPwyzBr53CvdGYZE', 'BteivVSy3xWmpZMChbqs7UUcy5MxFiGs19tvJfuaVMSM', 'HjjbF72FaknwyfgMcPVqDMc8oLxTLSYuousGZLqCtYJG', '63z2SuLznTBCzb6RPy5zUkkmgkyzEdbpGfuUcT3vHTt3', 'A8bwqdw3yWVqGksiXZhKPjrdQfb2pCedEsRzVmxEzSxB', 'AuqZm96iHD8Z9daQcpfYsF7Jg1F46WHiXhRLx2ks8S83', '5Vth5LjbZfPirVcfeCTv2nznJvoD457KswBh6Fu9BUnJ', 'JCX7yC8Jy3JbBZGhYxUK42s27zPb9wrB4SAc5Chb4EjJ', '47HxWn9z9HioX6NwfAorqbzDyLisqjZpsFTMufHEi643', '6GeW3MKw2wBARzApFmnTTwqBZaYwqgAjftBMQnimELKv', 'Fnsytky5ABfp3CKXdvehEk1wsSg9cAkEwvCCHiUzEaME', '7qXLLxAWNi4BH7E9z1qexsHS621NGWR8fETxSGLLqxxx', 'm38FNAZz22EPUrcu7nZsMKqXh6njDjyJHeCzZkfXYY7', 'GEm3nNvKYVKFnnjGyaUZznHfRacAgP3ri4cNvg6nc7KX', '4HKDgL9w4FNXETeJEMkgSN4FDDi84NDHrT4UrZMVy6fx', 'G7ScLsNBiTnfXzxwcUg56WLVQRXV6bbjxpYqvWzRgM8T', '3eBrAB8aawMK5xz5NxHkcF2iKXPHorv1pPcg23Jbv2dr', '45YxLnFQYyRQZg83V5w3au3ycR6D6VxF3prsyXjJKwz1', '3uEAdg78QFzMZpj9YbMyz28xDU9HGgSyRqR66teS7WQb', 'EVCVD3265cQeJPZSUk3ir8cHSe7bZGxXEHCxvGFM7Nrm', '7LAHdA3CMugC79fPvigPzSsr6BRNjH7pQnLQLGzgKNL6', '8RV6QRZMiGfT2Zu15BARLKHAGhvtrqoXSr8Aa8zsFAfn', 'HZJxjPoPBfoYXWLgefuqpYGEVowpP3DdKMpo4b12zLx', 'F3TRjJjqjv4UcXjWpNqCJWePiUF8sFFPBmiMMyDqbCuR', 'BhbktrKqFamcYswz1TafyNHoog1ARLbk1YJYLTck2H9E', '5UdH61rpcYA373TH1ZysuiZGjExYCdhwLjg7PeZ3Bgzt', '8kvbnKHdQHjy4A9msL6nEVCgv33Z1aByWd69QSpUPbBc', '6aNvTWbEY3gVGSPjXwc4UPeAkVn85dmhF5EAn3KQrxDt', 'FEaQi65Rh8AWEVjpY9dtdFbjqKDPkiQS8KjpWsmzUxMd', '23QU2i5vShiSJatTAmtQtq4YcKqBjSqMoFpvrMPPtZm2', 'EHT7SpEcYRoAjKQ8DHeFm9oPCnTeRjHjHxFPbCfu8rdP', 'Eoy1QLEqoQgmQCGiqQDiXiE3RGMKAjSx8hTHMcoJ87Eo', '71hLh5u2vk9xtSATZMjP5vhgtHtyxoDxjBAqtgeQtULo', '5ihG423P5HJ9BpiXm3jQrp26CcD8J46YpKKwVMdN9Xxx', 'Et6Q421Aa3ANntiReTt1cWbKheXZH1z9Enrcs52YD3nB', '5Kpgqwp84afAUL5DF7LjtVPWAvK7QdbkomWdAHZFp18N', '9JE5nbmX4qSGiC2u19ZBGxTvkvR1mur1PmAD6VE4HoBH', 'J8BGyR2zHe49Xo8UcGXwSUz6Zs6Ao6CLVqLQ6ECZ36Yi', 'HuiNaP3wNCLGJ7R6FXRRbncGgTYkybsnaWpej1Cz4akb', '9yM35DoJ3TW3vfzogEXupCYNtJjVHuQ2Po6DoUZNYeBm', 'Bqdr3tFJ7CfPqgSNV2EM1ik2QYnuimRXmGZAQqKHuyaF', 'BhbktrKqFamcYswz1TafyNHoog1ARLbk1YJYLTck2H9E', 'Ak8xVoMqJKZx1JBN2od42gvCqeVprdL8a6ry8WtUwp4r', 'A4mWLaK41W7KtxkAfaNpPPgqga5b4h9Z38TxjeMSkKTr', 'GoJSvFsTi4xAENBAdqpp7qGM7xtuSGKi3LABr5EbNcYR', '7wFB2SGBwjJfrRvnmVNe3G52dy8atWFyqXRvJxwUXovY', 'BXqKkyfwJtCWvg9p1doLDfUwiX9kTaTYxCRie9hgZDGy', 'DYNfuub2VhrHjVLxddzdgxQ9k2DYzqBVoPDARKEMVpzR', 'iVTuf3ni5cUG5qdp8T4SeixJ2XJMKsFMBX763AxM21V', 'Fr6dwWDU6fZA9WixDrYANBSyH2iTb8XokuoaV8iYWW2m', 'FSvfKn9nX8MpZgXkrfo9Ud5o3Xm7c8UUecGve8e5wvC3', '86nPPyKXxjMTqeEAhVMDWzPDovuMqZjxLi8b68Nm8i8T', 'BmJLMvDipCqaewKMWkkEhoEf3Rtrn7odTULUNKi84iXj', 'JcdRjnjg4mLxppH3nuKTompQ6TKwVPHm6ge5dFyT3DE', '3ubCAyHpQ5nGEGof49JfL1GbSQEpwgpxFsoboV6rapNQ', 'AeamfFaCJa2eWtUtWRgVfZTXF3xXUqZYrz7wtEYP5L9x', 'HD1BW2Jt4w99mBmBTMps8B2WRDnx7tUbirv7YTajXD4d', '5ERDarTk5RB79EWxeWF4dK7pRaiXqM9c9SB3MKckmzR1', '8sQDo3BRCPtmKf9XuEBie28zCxstNBHPpYbFGt22DG3j', 'CVycfVUX4tw4M2ArcnKJZEA2feAasJFQUBumD2aUhmvn', '6dnRUek3KcRjJssG38xmZnxapmNWkXbKfMu68bMD4ctF', 'Ayi6MmLqFmFmpjLic87ps3xxVq36fKw3G827Yck2oJM8', 'Ha3ruoJXeBaBesn642MyJRCnTroi5Hx9bzpnfivYxdVJ', '8u4iWTjJnbK8EKbMVx3qzPmNFzvu8mBAoQnttoyj1CRy', '9V3fpAJUBL1EKwjvcAQBGeXcvfydgUi2jVzbaLFzHsb3', 'GK3UfwRPUEGdLSq9igTvR86xU2YFgxMw7h7PSHuEimVi', 'AmoyDGE84cSBrJ9erByf59bS2NraHm7i1paqVXJSnpnv', 'Uxx2HmfZ7RLjfedcxyvFiJYcs4RzkbisPE1dztqT5Cn', 'EpG6VLyAajkHua3iu3xDbRUnYVzeGQC1NRK9XMhmSyE', '7K56MivxNmwdSQEDSt8REfJmBjGSMykAxFjgRchFiLc3', '9mDR9426iSX7epocZvzPQUGH99uE5mEQrkYrm7qv12i7', '57MHkkVaMyxWHb8KTc5WJBfhASaq4SeVfMsVxtLAbG3A', '8fe25ZQdmgftUoEKiYJxj2orWNqtiipepGeQCqya5tLn', '9vvtooXE6CrBT6Q1j9y4adRQkSykdP6RuWiQPjUTowdT', '8A3wpEYQR9kUrZofxLYBBJDvqx45sJAF8Utdvbj3FjRE', '9ZwEHL2jMcqucxjbAdn2oZxq3LW3qtgcShv7wAnyvwaU', 'AHbdKE8YKPoD2yeyh9jvN5QrMbpxCp2SYLuoN9NNNTWA', '7MPQZQ13tzhTToV3azKwxSHjzTrqtFV43o2hQZreAhZn', 'EnCpEoLiRVdZkwW9QhQ71FdqEoTVWnCMw1vDWF25F2wo', '2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc']
10 ['CtX5jvVspj2iARfiw1N8yZJmBSHzshFHCKr7NU82jsnW', 'AMck8vKmJxqn76n6Szeu1AUxKKogFjjkmi3FZnnLhpbP', '3WeD1dPXd4Pz5FiNdAr4HPpA6BAmoZnbDEJQEqShWcgi', '4onaZ7ZWgg4wojWN5H7riCrXEXhVBJmXNEANKwZeqzDe', 'FoGPYj43AtEeGwnxnu4zoqDngpQvBwuU2VigYKkoK2yp', '3wGJ6MgnfEqJsXUvCjJPptX5zy821qaXjeJ1WV2PiHMd', 'Eb9N4HXwEwRyBwCax34LAkt7SudtD74iU89UAhSukVaj', '28LypfjnjCpKYHRpzSXA5kUbGz5WF7ymG44jsjQb7boH', '2whR8s4bAhBuTDTLy5VRD5w4WUspWGNxKWoxuB7kC4Rr', 'HdMwixykYU2M6C24QUvgH7rRJQn2aLMCtEdBTMe4QGYh', 'ANLwpisqfmpAVc9m4MiL5p63W3ZP392xB9ySY3XmbYvq', 'CidYb4QiCSKvQ3DK211sNrtHhLqQrvGifcs1PNqNTzFN', 'Agi9nz4Hd3NC52BmYkgFwwChhrhxdQh8SnzJi7wcjPfP', 'EveBS4ZQJkQoMvdiJUHmaZfRSWZipeNDDzvg8LjJjmf1', 'DbB1eZtQYmWbyWRa36qZfz928vzQmQ64G9dqrBrUeKgA', 'J7wpviNRs7eN1x1Gis2rDyr9cxzBW81p8QwWSVQYCzp6', 'BJigP1KGvCnGco78pCaGxW92BtE68NqGNwKQg4qPBR3n', 'CTZyT6x13wACYaKcqYPuqyNTKXH6UWWSBkKVoEwgg877', '7zceGFnT3BfHjVyvGSqHfZpDfVsZfWL3r7PAHJZMmRPF', 'MgTT9evQqqoEq6hnYWZaUsMfUko8e5uc5hXWFZMpq6q', '5mQ2ooqyN5o4McUt9YRko2ucEFqenoYpYMifLFHUQ7aG', 'EKhyM1gfewgwmoQFXULS593VdaPcBar8a9LjbauAhij', 'GoJHKCL5LjtFYSxk5hsVE78aeMcLUmg17dNMzRAt51GH', 'DL5DmM6XYX34xb1BVbJQAZGR85Z4Pqf7eZ4AeXpRSjW6', 'B8WdW6cUZTxgkeVLEyKCuDuTLwUYGp7CDiYTmKmMfHmb', '7fmFQ6rbvGN6cFwnky1LaQpCTJ8XAkCG8SwbXyuYU5iL', 'DFKq1Hehjioh9dqUEjrVgKMiWxZjMMMBa8C8ofq1XX6E', '5RwCSfNRJPtDYqiUmxLigfTxUteh4fguTUTgaPhbpBXn', 'Hr9DkpsJgLpyQzYuk4poFFY7uZj6hoMim7wdB5PjbNoB', '13QpePqWT68pKQthaYNzBcRw5j5RvWsHb8qAyFkbewU8', 'AgR7uTu9jHp3aW24f6UKU9m5wHnyLtd5xZuiUkQEmT8a', 'Dea14PHM6xRwxcTsKVKAS1Rvz3zAn1fhELS7jhuNN2tt', 'HLMrqNDQB4K81MQWkLqQq5TZAVnsAxyySLLawKkZE5yp', 'DFLGuMkV4kKjCmXetC533BJKtre5fTC4doXPDGwKttf1', 'Gw3DbLRjT86BAgVyP6uQwRNSnzj4vkwGVEizGkxYUNo9', '6WedwXazVNqgwRbHJyZGXw9G9z1XrZWp1hXefc4Ctcr5', 'EveBS4ZQJkQoMvdiJUHmaZfRSWZipeNDDzvg8LjJjmf1', '8KoqktzyVFwcVtvTmcspbPqQ1McDXevkTkZtibRq63cb', 'EiqDaUs2FnZZCh6S9ZbrvHcJPUzrzBHPf8qBM7C1BgB', 'HWiUFkdgu53gmxnCp1kipz8HqkJHP6ME8Mxm4oqWNscd', 'ApJjgXNUju8dpfynKKvrqeiVtsGY1QLGrmDZbw8XTdgp', '9kQyDPZJjE3qbvxvVrnDoGteWvmjAuMdVDZiYBZSZ3JV', '3rfgWLQWNkms3CK2kQwkcuhYwbih8Re2iACmWsLkvAAQ', 'CvBDJuwPEBJ1pobL4WMF4x9fyAbsKrjDvLMJ2QhK1aWE', 'FjZyTphDXVENddoY7vCsZp4ZF36rKgMyL3RQAzquwKZY', '6hyJXuS3BhKN54aiWkjBSo98aQdoWfrNvRHURGU6GoPX', 'Gcak7EayCx4StsT52UhLzJzfVBx1nuuteqxNZEJWKmwR', '9wMp9uskCFm3WiP6rRaGKSrdoxLvUKfKMu8PDiHxhw5s', 'C6N8yx1GqECWCudn8gxHY4ox8g7mEqS6SLJbjKNVjtsS', '5iFXLrwU3ABpRVYuDp3Db1iP6rQH1d9Qpw63ptYhs7oX', 'CF4Jn3vvKw3U2rLVzib84emZBwjWWUrMzDsDP7CoE7jJ', '7QPRSjDnkvh5mHkwZvkQevTesKMvq3FiHBz4iMyrQQGG', 'CdG51KNpHTbac34mM7qFreeqoan329WoiXJ8jdUiNdKM', 'm7qUKu2AoEBCNjvJfVt4okBfTAFy2ShjSEdzXCYjUrU', '6M4RDpACDdr2prWDuPgApcWkAKFp6vxYWNaSdioVrkNA', '7ygawjiQ1BztjzP9QMMtX4DXfMtYe59fjvMsJKVhyLdp', 'DbB1eZtQYmWbyWRa36qZfz928vzQmQ64G9dqrBrUeKgA', 'J7wpviNRs7eN1x1Gis2rDyr9cxzBW81p8QwWSVQYCzp6', '7zceGFnT3BfHjVyvGSqHfZpDfVsZfWL3r7PAHJZMmRPF', '5g93oyTHE7aD52ptSusjBZFAosNbUXpxJ6eHNagTDbop', 'EhP4mGpPHiLaAoKz7HSzwm65sF972emgmYZEHsRFeTsA', '4tjWaeM8aXdbcqrwD2jzSHwy9NkD9TVkBKuH6c2momB1', '91ywVkqzLXo8xrCtdnjKWc8asnk14TPHpi643DcNdnTg', '8oNL11Z1KXVwXfXeKhx7FrUuCoXFtJDZJPUY9xbzoNjC', 'CgVesjzjij25cbgxXHdKuT8M9epdNB6v7fQSyGeF9VNY', 'BJigP1KGvCnGco78pCaGxW92BtE68NqGNwKQg4qPBR3n', 'CTZyT6x13wACYaKcqYPuqyNTKXH6UWWSBkKVoEwgg877', 'MgTT9evQqqoEq6hnYWZaUsMfUko8e5uc5hXWFZMpq6q', 'BbVcUJPJn6L2CswyKrex6NbdTDcYasFtyJbQESzJhmvs', 'CLMWnqo9xpjtWg6viDLxXDhKLQ7un1Tth4289HQHnsoG', 'DkBFM7moJgtYAXdhXadjw8YmNGjPBHquxzkAQaHUaF9A', '3YWtjAyscP58wmSWYwubpsUr1rNgekfqtf61qmAvdvqL', '4WpZkSmiw5mwHXkMsH2gpFdH6zYke4X8Rvbx5Ygi9w1N', '9UpdKJ15tUEC6dvcKohUSv63LfdLHGjA3NRNExi8tLRz', '62PekWPnju47HY7gPdx1H5HTuSCX7Cf6yiub31Awdpk4', '5mQ2ooqyN5o4McUt9YRko2ucEFqenoYpYMifLFHUQ7aG', 'F2eriUDvWwhuYn2wtBnp3oNgAEjHMsgR447Atsabh2A4', '6zMWLT1f2JB1X5dQpYYD63doPwyLR14veEAB7dymbLZb', 'GxbCjKFvAtVnV86cGZmzuwfFTawBJjqLZuZ96UheLCsB', '49TYF88mwgba7CowwfqVYbTudpZoKNe15jPaH693oXbJ', 'HEmvLttFUXztyHQH9g3PufzSY5tS2dA83uvUXhj672py', '9XCrFY7PSTopXw5V81Y5REUgdf2GjGi7b6BShAFMhesN', '8ctZ83oZ1qk7j37P4255krSKNhpMXnuefv6qPNChvbsX', 'CKW6uRyC34dYhgTrYQaJWSeL7Mq8Lz74MyuPvEEbjUGE', 'EKYnA9mhtLWjPBvByR4xaPdAEp9aAWX6NbdMyLUr7rbx', 'DB3vtZwq5kPUwtbgGzKdRbfZiVbudXvZofCeCezdjKNX', 'CtX5jvVspj2iARfiw1N8yZJmBSHzshFHCKr7NU82jsnW', 'FWx4Agtqf1tAvho5LpLctZqb2o66Vku87eaNwvgH2rTM', 'FoGPYj43AtEeGwnxnu4zoqDngpQvBwuU2VigYKkoK2yp', '3wGJ6MgnfEqJsXUvCjJPptX5zy821qaXjeJ1WV2PiHMd', 'Eb9N4HXwEwRyBwCax34LAkt7SudtD74iU89UAhSukVaj', '28LypfjnjCpKYHRpzSXA5kUbGz5WF7ymG44jsjQb7boH', '2whR8s4bAhBuTDTLy5VRD5w4WUspWGNxKWoxuB7kC4Rr', 'HdMwixykYU2M6C24QUvgH7rRJQn2aLMCtEdBTMe4QGYh', 'EunTEz7P7AuNL7zFxSV7q68sn66FDy9icYsGUSRz41Cn', 'ANLwpisqfmpAVc9m4MiL5p63W3ZP392xB9ySY3XmbYvq', 'EVN3XtZfMhbejV9eJPaAC1KBZru8ec5yVF2TnPkme1WP', 'CTZyT6x13wACYaKcqYPuqyNTKXH6UWWSBkKVoEwgg877', '7zceGFnT3BfHjVyvGSqHfZpDfVsZfWL3r7PAHJZMmRPF', 'MgTT9evQqqoEq6hnYWZaUsMfUko8e5uc5hXWFZMpq6q', '5mQ2ooqyN5o4McUt9YRko2ucEFqenoYpYMifLFHUQ7aG', '5egripSgJnuNZwmDqpAsNxya6LqxpAEtcuSPS9qdcwr8', '34dDNpjGkDDmWnPnTCx32zwbDwsbUPUtWtaQf9F3JxoN', 'GoJHKCL5LjtFYSxk5hsVE78aeMcLUmg17dNMzRAt51GH', 'BEq6sSF7FWBuQQo915xEKwCBfi3kFd58JQuHM4qsKFZz', 'DZxHgYwmECpHeKMqPZsm3Q2rh6dpqwqrSvazjKnfgZRm', '5RwCSfNRJPtDYqiUmxLigfTxUteh4fguTUTgaPhbpBXn', 'Hr9DkpsJgLpyQzYuk4poFFY7uZj6hoMim7wdB5PjbNoB', 'FHrCgbr8tWopkM3FxdKdH5rfp3r4P6rbxDWi7naPPWVY', 'mAqp7MYEN2JsJtQ4RvgJSPbS9sM9zcY5M4oEymEDSr9', '9EFgbbeCUGMo6Gyb5ufkLp2GE49Zo8skZqVKwkE2bJFi', 'AgR7uTu9jHp3aW24f6UKU9m5wHnyLtd5xZuiUkQEmT8a', 'Dea14PHM6xRwxcTsKVKAS1Rvz3zAn1fhELS7jhuNN2tt', '7GPBVsjnW1LXawdeVU61bcWGofvnnKPy8pG8Bj2C8nKC', '6haubKb72ZWngsJi1u2j4f46RsSyaRG9jkfg4PV2yfws', '4ihMauM7xhWEJQ5grJNwBWoMkpqmf2sVPHEebsLC2r4T', '4v41Cj7Cz2UZZP9a6NAANQcKpQNkfSpY1zJjx2V3aTq9', '8KoqktzyVFwcVtvTmcspbPqQ1McDXevkTkZtibRq63cb', 'D4jbdaPEm4PrGUwoGdyd7UA3rGo2SLS4NZdKHhafHvbv', '3XUaM4L3nhb6D5nVt2cxgWWTNdgrqbN2HetX97sq9Psb', '2QTVS6PQes37DZeV97EpFDiGTXARSKiJALqYgAbVZiRu', '2GHAZbdSMrycdQHFjhqoYxDHRLigBZDwnfchPGz4bup7', 'GkdbFaBMaEZd1YwtLuuBkL8S7wz2t91dKxKLQuEvMDdE', 'C7rgvavqkXok15kKutzSH85nsDTgMbAySP51EtdWow9P', 'FMLemb5xvMFKKoLMsfMUgHDsd8qUdZssWKbYS7vPWjig', '8d9ykKoQ4qjU3zr1E6H4hPwH54Pj5bZMHRcs1xnyxM4U', '5egripSgJnuNZwmDqpAsNxya6LqxpAEtcuSPS9qdcwr8', '4fWawA8xozUu3dxv2wFxKq5MgLAiJzW9NDskqXHQPmbr', '745hxBsv92E2QMYzp7ugAgMDmbhyzgumhZ5JFY7nrD79', '2bLJSJA3YsNMRw1et3BHevyQNAJNyLKYB4HhAZpfv9MX', 'CfHkYy4bpRpvdxrewhuSPBnnhfhxnR4YfdGZhhqpsu6a', 'FRjUqtDzb3ctDKDJEiAYuV9avmxogy3rprG4ohV4oA7Z', '43z11s6Xzcje2EMzcHvDQ9AC1EuSnoV2NdwhvYEVYpu9', 'BEEiqaPTeqMmHAFJ5ECSbHnb37oE2HDHDs9EzM7pquXd', 'CBCgLtzJbkQW2mi8r1WCn4hJpr5nRm1nCqkusTGkbjSH', 'HsPc5WxRwjbdqppc7XBoDAm4QqWgzjAs9DsFSHU9jf3n', '7zceGFnT3BfHjVyvGSqHfZpDfVsZfWL3r7PAHJZMmRPF', '5g93oyTHE7aD52ptSusjBZFAosNbUXpxJ6eHNagTDbop', 'EhP4mGpPHiLaAoKz7HSzwm65sF972emgmYZEHsRFeTsA', '4tjWaeM8aXdbcqrwD2jzSHwy9NkD9TVkBKuH6c2momB1', 'CeGKta9xm5fyQgEp9Ab61oohjk5un2KRF8qfqib4ocuG', '91ywVkqzLXo8xrCtdnjKWc8asnk14TPHpi643DcNdnTg', 'CTZyT6x13wACYaKcqYPuqyNTKXH6UWWSBkKVoEwgg877', 'MgTT9evQqqoEq6hnYWZaUsMfUko8e5uc5hXWFZMpq6q', 'BbVcUJPJn6L2CswyKrex6NbdTDcYasFtyJbQESzJhmvs', 'CLMWnqo9xpjtWg6viDLxXDhKLQ7un1Tth4289HQHnsoG', 'DkBFM7moJgtYAXdhXadjw8YmNGjPBHquxzkAQaHUaF9A', '6vH7w3pBrfSQwoMTfyAe1WhVXAPC1SCJDmXGor13FiRx', 'DR97cTwkQV61Uid1JLWqio66UFR5KuSUwwh3Hq9z6nrD', '7Fvee1D3ydW9qApc9TtYeHLUXEiSxEwTmpN1k4crXxnn', 'DLLLmjmUj4aYiZmR6hrgaUM2ZXqqiAg8TCL7Eeh9weyM', 'F2eriUDvWwhuYn2wtBnp3oNgAEjHMsgR447Atsabh2A4', 'GtZZaw72nwZwWe3cA8zBxCjrbxLrWNb2X5811hedwwvv', 'CKW6uRyC34dYhgTrYQaJWSeL7Mq8Lz74MyuPvEEbjUGE', '8yDDi128CzKjSw2iPn3yWfeLd5wrPSZm8gBEN4ndwix3', 'EunTEz7P7AuNL7zFxSV7q68sn66FDy9icYsGUSRz41Cn', '4onaZ7ZWgg4wojWN5H7riCrXEXhVBJmXNEANKwZeqzDe', 'FoGPYj43AtEeGwnxnu4zoqDngpQvBwuU2VigYKkoK2yp', '3wGJ6MgnfEqJsXUvCjJPptX5zy821qaXjeJ1WV2PiHMd', '2whR8s4bAhBuTDTLy5VRD5w4WUspWGNxKWoxuB7kC4Rr', 'HdMwixykYU2M6C24QUvgH7rRJQn2aLMCtEdBTMe4QGYh', 'J7bJgrWKfDh83RvyDZaogguCGYfajzaVNKBn2LYTarQX', 'Fw7CebJgjxjqMHrFyyJ548tAfGXWdb9MnXuxZxCGLbh1', 'Ef95eSm1vCgvJPA2AAcFhZrAEmsqhPm7BxoaUbsSqQH6', '2kjre4m44M1CzpVZdHGpyGK1vU4Cq2C52qCAJuZZEiUD', '2vXUgViwCEybZuvZuGH9bjZpJVbiDNwqZnYve2tZ3R5R', 'CidYb4QiCSKvQ3DK211sNrtHhLqQrvGifcs1PNqNTzFN', 'FEafcgrtbBS6bXpnZM9yuGyys4auThgf7LB3fkiq1Qxw', 'EPjXjcg81r1QVELd6qAa7AeHwAm4i6nrugRnR2wfmgNH', 'DbB1eZtQYmWbyWRa36qZfz928vzQmQ64G9dqrBrUeKgA', 'J7wpviNRs7eN1x1Gis2rDyr9cxzBW81p8QwWSVQYCzp6', '5g93oyTHE7aD52ptSusjBZFAosNbUXpxJ6eHNagTDbop', '3YWtjAyscP58wmSWYwubpsUr1rNgekfqtf61qmAvdvqL', '9UpdKJ15tUEC6dvcKohUSv63LfdLHGjA3NRNExi8tLRz', 'DR97cTwkQV61Uid1JLWqio66UFR5KuSUwwh3Hq9z6nrD', '7Fvee1D3ydW9qApc9TtYeHLUXEiSxEwTmpN1k4crXxnn', '3J1zvQdDJnZ68aGFjxuJxpUTDUFjWSy5JZqJT1z12XzL', '5uRoFbB9aqVv5rcPL93RNy7SosEoSzDxdXPqwBCrfHuF', '9oDHNr1jm2w9VUzZAp6bsvynRJVdL5TugjGPkg2Z88AV', 'FRjUqtDzb3ctDKDJEiAYuV9avmxogy3rprG4ohV4oA7Z', 'GQzff4MrxztxVAJwc3y5Ryj4TJhRgThYinBuhuUzG9iQ', '6mJEqpSyz6EzEyErroBRrWeMcv4sLUVYfBTCvujG8s3s', 'ByvdUWyKFnrzMExadRWk7VNTw55ofxsFtG3MFz2Doh6F', 'QXxNW4nDadvZvjZSbk7nd4qFGdg7tpqadsbFaL9K8tG', 'CKwoqtSvEiiNGsZUQ4DKfifJWzcR3wtNuztwayzWWUMJ', '7SbHAG9P6Eo8Evu2ocfnvbLZptxpNKmb4NXEJqMHL4ca', '8AiFxdkRLds27qVEWg9t46RdDGpzAvshA5RC57starE4', 'B4ntE8NWR8bLRZWPj9qfUv2KN8FtWwoQgDfbm93qmzjx', 'Fvr5K2fp4hBDK8eDYhtWS2az3taqydpUNXFtBhV9DS7N', '91ywVkqzLXo8xrCtdnjKWc8asnk14TPHpi643DcNdnTg', '8oNL11Z1KXVwXfXeKhx7FrUuCoXFtJDZJPUY9xbzoNjC', '6jSnVRP25bnDcXP1C5YfNvX6cBdDUYmnkZbEgaRXFbXJ', '7iF4Y1ZCqYn8VxRr1yCAtLnWZj96sctr3rKysDNYvWZ4', 'DQicn2cs1BC9nhnXZjBGfrfERYPw9WdCsYfKnU4QUKhH', '9GzndswNUDzDeo3SeuCzRN3EBwucogGv5E3NVCQ6yxZu', 'H3sTLiBBkTieijPsEs5BEBmC7STffGbLU8vnRW5KPRoJ', 'BbVcUJPJn6L2CswyKrex6NbdTDcYasFtyJbQESzJhmvs', 'CLMWnqo9xpjtWg6viDLxXDhKLQ7un1Tth4289HQHnsoG', '3YWtjAyscP58wmSWYwubpsUr1rNgekfqtf61qmAvdvqL', '9UpdKJ15tUEC6dvcKohUSv63LfdLHGjA3NRNExi8tLRz', 'DR97cTwkQV61Uid1JLWqio66UFR5KuSUwwh3Hq9z6nrD', '7Fvee1D3ydW9qApc9TtYeHLUXEiSxEwTmpN1k4crXxnn', '3J1zvQdDJnZ68aGFjxuJxpUTDUFjWSy5JZqJT1z12XzL', 'GrUnQrqjKXdQBP2naoxKD4vLgzKtwFm57Deyuib1iE7Z', '26B2sZGH43w9FE1XFS1DmqjYYcNwbhjnFHVPk3CHgwwT', 'F2eriUDvWwhuYn2wtBnp3oNgAEjHMsgR447Atsabh2A4', 'HEmvLttFUXztyHQH9g3PufzSY5tS2dA83uvUXhj672py', '8yDDi128CzKjSw2iPn3yWfeLd5wrPSZm8gBEN4ndwix3', 'EKYnA9mhtLWjPBvByR4xaPdAEp9aAWX6NbdMyLUr7rbx', 'NKwwDZJwf8bjuE66fRGj2txPK8rg7KdPX2zTQi9p65V', '9QjeGWUqJU9oiPEwAbwTv6WNDX9WRP9AphwNRsdP3MBV', '6BXXhf7boVmLCsJrLw2PhZeSUAnGc9EVvAPhk76e9851', 'Gn4L11s75Ezxvk6k8LNBmZbQoggMtNQdtLvHdmNkUecC', '8rgLXu4aKti7MYEcCxLYMo5QtFmf9Wek3TDvouTotLeG', 'ES8fnNSwKYxkXK9zcgtsgVkjKT5AtCQUp2UzXBTtuFZD', '4onaZ7ZWgg4wojWN5H7riCrXEXhVBJmXNEANKwZeqzDe', 'DH4JMrEquBKpUBe8zJMoyKWkojovRb5TGXetufhrvw5Y', 'GQg8P155LYeCxhrfzLMRBfhDa5bhZ77JonUeCuP4TKBt', 'G79MeXntkLoPCph5PcXoUEd1cMUsJzhZPCwu7dTig2N', 'YL71PpRUHSLqwQxJxoPubQYu2387poCwP6tXkLRBu6D', '8AwZEL4hfCaAB6z4TD1K57km1hMGLaAmZrhCuHXjZbgm', '8rgLXu4aKti7MYEcCxLYMo5QtFmf9Wek3TDvouTotLeG', 'CidYb4QiCSKvQ3DK211sNrtHhLqQrvGifcs1PNqNTzFN', '4L6meBjT3b3xMBXfU8qYWF9XDUtxY7v6zzg7vTmaBoDg', 'G79MeXntkLoPCph5PcXoUEd1cMUsJzhZPCwu7dTig2N', '3YWtjAyscP58wmSWYwubpsUr1rNgekfqtf61qmAvdvqL', '7Fvee1D3ydW9qApc9TtYeHLUXEiSxEwTmpN1k4crXxnn', '4Aqu6rcthMnomHVZiZaGfqxY5oYGBFMUkbpctufQq7w9', 'F2eriUDvWwhuYn2wtBnp3oNgAEjHMsgR447Atsabh2A4', '26B2sZGH43w9FE1XFS1DmqjYYcNwbhjnFHVPk3CHgwwT', 'FruEt9Sa8oYM64nBmQwKwA1UykZrz1V2zRsKG7k4Fb3n', 'Ck8N6WhE645rKqvNKicYyTrB8WcqtQSdLbiWmR8nEgUT', '5cvqwZDaUFAkVmmMh7Q7Fw1yjW28fv3wZR5TugBduPgH', '7GPBVsjnW1LXawdeVU61bcWGofvnnKPy8pG8Bj2C8nKC', 'GPLFLCUKcZGaYjW8pQhPpFf6oNEL9K7aGfonGwF9pxTF', 'Ex4khH8pUHJdH5RMXus6qrsm5qdukifPL8gdQG8Xmqdv', 'AprERwWyUDKtxzNEeL7ZnKtiaeKsmYQQrAoQDY1iBnJj', 'AE2bhphcvbE1ewE6GDakj4M9fMNh4r6vrYnjjyEb9CqW', '8d9ykKoQ4qjU3zr1E6H4hPwH54Pj5bZMHRcs1xnyxM4U', '6Bx653Uin3P9WT2p7BqgCF7353Ra2ZrgsM3ubZHvpYis', '2bLJSJA3YsNMRw1et3BHevyQNAJNyLKYB4HhAZpfv9MX', 'wLQHSLVSjUKAwZqKrN3KacSjt98ox45maLG8Cc9p4KA', '6FXdSqebE25Kvsa39my5kfDzGbVKgLfbTyY5rzMcyjpY', 'GCbUCXq3LMSAim3HgTigrHbVkr1VpBGAJGUFPwJuhCkg', 'Dvm9eKpN79qpmZSeB3Na1bhCF4rseYmitZa2MJWUymVz', 'CqLzS3MNQP82tp3AkCXmX9tYytDPxXnsW3b1HPbrsaRx', '2Qw8ndQSycQxjssiyXK6fjqHxEFTggZsFwXhPtavu1k9', 'EWSSL3EtHqTxZTpwSn67WnDWiG8ZQEXQkUDCbjmnETto', 'Dfg3RRzBy2f3XowxXS3HvHAGYFUgKQMfNaz3zyNaCU1i', 'H9csnmUnq7SJXG3Fvh6dsruwdJUTghsW7UgHeb2yGPAN', '7Q7DoXv54NHcPNSTSpc4PCPAsJDWUtyvmPbZnsMQuAvn', '2CSwuG73zQXYXUi8GybYhA6xgNbLzKmhdA3Wp8KNbPuu', '4HYeA8vXVtanuLBFyuvNWBgB2Y58iut9nLt1Qr1RMxuH', 'D9XuJe9pVMkZsNXxjwjgFjEpHhydrnz5rMM24gJhGowN', '9itXxyRknL468KzHzj51VVPYhaYDuoCTVGaHYjUXkExP', '2D6Q48pLDp2S9ww8GajGR6gVQFETRi2dG1s8GMphNFNV', 'GSvqPtic1bFgFJmoKnjUGM4JGE8N8Rg4kkSQUip6hUkv', 'ARALoUNzedzGFDRNSj1xbSQRsKehPPh5YzNRRXEUt28', 'HCpbHHQCE6GwY4YQg6zquuZuVyTdLLCuJBFnNWcC91GB', '3YWtjAyscP58wmSWYwubpsUr1rNgekfqtf61qmAvdvqL', '7Fvee1D3ydW9qApc9TtYeHLUXEiSxEwTmpN1k4crXxnn', '4Aqu6rcthMnomHVZiZaGfqxY5oYGBFMUkbpctufQq7w9', '26B2sZGH43w9FE1XFS1DmqjYYcNwbhjnFHVPk3CHgwwT', 'FruEt9Sa8oYM64nBmQwKwA1UykZrz1V2zRsKG7k4Fb3n', 'Ck8N6WhE645rKqvNKicYyTrB8WcqtQSdLbiWmR8nEgUT', 'HZcFkpF2b4mX4DhPWCZGUhXQbtciitbmR5weVkBT2Pmo', '64rfW7UDVjUJ563SaxkrYXFkFQe3mKUXApekTcqrL5vo', 'GaWnVDfQ85EM3o3NZc7C7wrfoJN9G7c8QVsA7sYnDRy3', '8xPz9BeUfmX5inH1rGtAfrdQ8JV6XsGt8rdr9t8eWqRB', '8rgLXu4aKti7MYEcCxLYMo5QtFmf9Wek3TDvouTotLeG', '2wmo7xurn32vrRUSCtwR8B8d35WkmUgXZH4nnj4J5gEg', '4ExjQbH3cetocYcHkqZoKQqJw1n1Y7FqRm8A9Cn6UQ6E', 'CzErmm7DWJZ8Wp1PiSGhNHnr6UbgPe4wxyTv29eAACi4', 'CtX5jvVspj2iARfiw1N8yZJmBSHzshFHCKr7NU82jsnW', 'AMGUsRswYiw6HXwYNpxS6xz6cbW1zphXTA2MP4y3aWnH', '6cKqxRf749RdTbm487kHty38uQXbUihmQfBHkhUgtrEL', 'A7ag1vkyixmSs5HwodByXpNuoXxbFwo846iLugpRmFvb', 'G6WPvtp3kDWZ8njvuh4jfFsZNqHyEgQq4FpSG5q9D41F', '8rgLXu4aKti7MYEcCxLYMo5QtFmf9Wek3TDvouTotLeG', 'Hr2CjJd3YXvXoG8xmMeL82YQPFFXaUaK8QEFNJz1z95r', 'AhnGag7zxvkyBtMbYoPqbc1qFCXLam5jX4wTLVoYZwne', 'HNRnk8DGZq5t26A1jXLRo8FmKpdiQa59iQRxvqsxkBpY', 'nvbGJvTunuZ68SL1rddArXrAVR4DJ5aJzfuw36nvBgF', '5g93oyTHE7aD52ptSusjBZFAosNbUXpxJ6eHNagTDbop', 'CRmGtyA5QTUozWtMCf2dpeSAJWPdgxq24UucWHvn7YeS', 'J57dAALYsPX91x8hF3gfLxa1qisWFRtu4Ujefh8dpuQC', '6YbQgSi9563RYiUyCijsxKyxjRGpm914gCcKBZMAPMwS', '5CoCYnHDbbZPrF2uBmJ8wFFXgMyzhsNwNgdZmkxCnHhv', 'BA5vpBrKMVjUKAoHizRkMaULz7mCGSfcbfQyxc3YZvm7', 'HNRnk8DGZq5t26A1jXLRo8FmKpdiQa59iQRxvqsxkBpY', 'FA87YPbKJ312PnU4ATTi91fMHaX2VuBBwqzq74cF5VoC', '5g93oyTHE7aD52ptSusjBZFAosNbUXpxJ6eHNagTDbop', '3J1zvQdDJnZ68aGFjxuJxpUTDUFjWSy5JZqJT1z12XzL', '8oNL11Z1KXVwXfXeKhx7FrUuCoXFtJDZJPUY9xbzoNjC', 'HJedE4JdEZe388aeb7AivHQrkn2cAFifGd7jme2uLnsJ', 'DQicn2cs1BC9nhnXZjBGfrfERYPw9WdCsYfKnU4QUKhH', 'CU519kDMJJgpHWVpEZpb72aCSYmsnRf5gnB3kUKK7Dvm', 'HeyXHXEQdbKZHTUkk3k9aVs6MK4t35MYqnMRJBozRRGv', 'Dea14PHM6xRwxcTsKVKAS1Rvz3zAn1fhELS7jhuNN2tt', 'HWiUFkdgu53gmxnCp1kipz8HqkJHP6ME8Mxm4oqWNscd', 'FRjUqtDzb3ctDKDJEiAYuV9avmxogy3rprG4ohV4oA7Z', 'Cei1wBHukyMbq6xFfNT9UpJWFDstuoPixjQTVU6YTpWw', 'FZL8GToNcV8k6wWF4j46uW4RaQHrGZb4DafpsUeK8qjD', 'A6rXASKxX5SP6aArpXJDNadVMU67wChTiXUe7VAzHpAV', '3pYpoMZ36tGfNYBBidKmrVHR6wa8SRvAJBH9JWDZFsr5', '3z2ZJn9PBKu7LmLodhaQhW8JqxAVEALqH3U8c7qRK5pZ', 'AVwNPuG3diMD6vXuptKnnMQR6SyzJaiqm4dHbat7Szgm', '288ohixVtbW66ByPsu5NmJweYfZVZirC3fNb7tRyjUrA', '5g93oyTHE7aD52ptSusjBZFAosNbUXpxJ6eHNagTDbop', '8oNL11Z1KXVwXfXeKhx7FrUuCoXFtJDZJPUY9xbzoNjC', 'DQicn2cs1BC9nhnXZjBGfrfERYPw9WdCsYfKnU4QUKhH', '6Jn9DtsAj8n14UTXzn8Nk1Yk9EozixpLo6rAP7RUaumP', '57q9szYoGThW5FVapcJG2LQkHnekwdgrS6XJT89gJyvS', 'HAuFjqvxc8QL6HxPa1zSy1MxpjsnxkUyQD82iYpD7pvo', '4skqGdJ4uv8VnpDmrcNwRzhaY74aJsigHNX8yWqtJQ29', '4P7i9Jbua5RdBtv5Fx2ZMmkTUGv7WzMJ13x2n1DHG35i', 'D2R7Ph6m1xm6wgQhKwxnzPpeV7pr1RbQ1kMP3jvk2rqN', 'ECSuzaLBWMm3TpkdRaMvaGo1dbqgd2PgK98r9zqd5vyv', '3J1zvQdDJnZ68aGFjxuJxpUTDUFjWSy5JZqJT1z12XzL', 'HJedE4JdEZe388aeb7AivHQrkn2cAFifGd7jme2uLnsJ', 'CU519kDMJJgpHWVpEZpb72aCSYmsnRf5gnB3kUKK7Dvm', 'Ck8N6WhE645rKqvNKicYyTrB8WcqtQSdLbiWmR8nEgUT', 'HeyXHXEQdbKZHTUkk3k9aVs6MK4t35MYqnMRJBozRRGv', '5WVj9duxKKMJ8qA81scpsCSnBzQbkU7ponMQK6TVJh8X', 'GXHiGc3xPvnpgw5N3dVoq8qsi8bjX3ZFPJmJTs1tUCiB', 'CYNoxWB7trkej7U7wN9hrrEvRn6WRZb4uJMe8urNBf6y', 'F2WfBiJkezmtGt3bXKTz2o5pUkPB71e2a7DUP5v9Rma5', 'NKwwDZJwf8bjuE66fRGj2txPK8rg7KdPX2zTQi9p65V', '8rgLXu4aKti7MYEcCxLYMo5QtFmf9Wek3TDvouTotLeG', 'HWYPzd25rsrmSPH2r6CnQvXSQefhPiXwM6froMDqUW2y', 'EdbYcwZnKFdn2iqhvR3AnPSjhwSBYTLVgX9JENBPinBV', '4YkSrFrKBSMGPvhwwRETAdqwKVh1yGLW4syU2DjWRWcK', '6cKqxRf749RdTbm487kHty38uQXbUihmQfBHkhUgtrEL', 'G7cQbzYzon64B65U5QURkWGYMYRrtHBk6DWmb2P8KgvP', '9ahyXP2xAEt9dodQ62oTTNs9kA9tWzq3JzVELML8a6qX', 'GVR6NbmNNakZCEboVMUHQ5Ne1sQDPuN665g9cC24kNZC', '2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc']
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________GNg..7JV_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
/ \
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________eXc..Ysz__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________7Qd..8M5
/ \ /
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________8uX..E8i__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________CkR..hrS__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________7Qd..8M5________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
/ \ / \ / \
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________8oG..1Ti__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Bun..t95__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________7EV..PRk__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________6xz..EMF__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________GjS..cwD__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ _________________________________________________8En..b7o
/ \ / \ / \ / \ / \ /
___________________________________________________________________________________________________________________________________________7D3..cho__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________GvP..uy6__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________7JM..iUh__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________6FL..YP1__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________826..BaB__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________AGn..gYS__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________5Zm..s7k__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________Ek4..ZSo__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________BTH..JBT__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________5JP..HHP__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________8En..b7o_______________________________________
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
___________________________________________________________________4VL..TSf__________________________________________________________________ ___________________________________________________________________EK8..1pN__________________________________________________________________ ___________________________________________________________________CpT..s9i__________________________________________________________________ ___________________________________________________________________5tK..4Tn__________________________________________________________________ ___________________________________________________________________Gf3..9mE__________________________________________________________________ ___________________________________________________________________CH6..Fmk__________________________________________________________________ ___________________________________________________________________DCo..JHx__________________________________________________________________ ___________________________________________________________________6PJ..8PC__________________________________________________________________ ___________________________________________________________________4te..XsC__________________________________________________________________ ___________________________________________________________________CKP..8do__________________________________________________________________ ___________________________________________________________________6hB..YBi__________________________________________________________________ ___________________________________________________________________J6i..E8N__________________________________________________________________ ___________________________________________________________________Fd1..Ccf__________________________________________________________________ ___________________________________________________________________ArF..Npe__________________________________________________________________ ___________________________________________________________________6Uj..YKH__________________________________________________________________ ___________________________________________________________________8Ln..bCq__________________________________________________________________ ___________________________________________________________________417..HKZ__________________________________________________________________ ___________________________________________________________________Db1..EnC__________________________________________________________________ ___________________________________________________________________Abh..j8g__________________________________________________________________ ___________________________________________________________________Bia..MAr__________________________________________________________________ ___________________________________________________________________4jC..Csg__________________________________________________________________ ____2VD..oTc
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
_______________________________5m3..YzC______________________________ _______________________________2Gb..ZP8______________________________ _______________________________EPF..iNN______________________________ _______________________________DAK..Ch2______________________________ _______________________________3aS..hyU______________________________ _______________________________7v5..Ljx______________________________ _______________________________Ac5..aRL______________________________ _______________________________Awt..d3q______________________________ _______________________________GqX..wXD______________________________ _______________________________3ng..ZZf______________________________ _______________________________8UC..Xya______________________________ _______________________________iat..hQH______________________________ _______________________________6Dc..Lzu______________________________ _______________________________G5p..JCW______________________________ _______________________________EK4..MrP______________________________ _______________________________Byx..81Z______________________________ _______________________________DQE..7JH______________________________ _______________________________Apu..qat______________________________ _______________________________3CK..26K______________________________ _______________________________CN8..yLK______________________________ _______________________________Fpq..GFm______________________________ _______________________________34Z..3Gf______________________________ _______________________________5ia..Ten______________________________ _______________________________92Z..GFY______________________________ _______________________________Gm4..qXz______________________________ _______________________________Fpg..jSu______________________________ _______________________________AnF..FZ9______________________________ _______________________________Bzu..v4N______________________________ _______________________________3xC..apC______________________________ _______________________________EMz..Xj3______________________________ _______________________________CSD..hnL______________________________ _______________________________6N5..u8v______________________________ _______________________________GRc..WDH______________________________ _______________________________5YY..qC1______________________________ _______________________________CVv..T8k______________________________ _______________________________3F3..R7w______________________________ _______________________________GRz..fzW______________________________ _______________________________3xU..rwd______________________________ _______________________________FDE..wY5______________________________ _______________________________Ddw..rRk______________________________ _______________________________EsC..JAG______________________________ _______________________________D1Y..uLP______________________________ ____2VD..oTc
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
_____________FNo..xZi____________ _____________8Rd..8DA____________ _____________3JV..QtU____________ _____________CVX..Zjk____________ _____________268..zdm____________ _____________EkT..zEj____________ _____________5XM..7oy____________ _____________Bmj..LLv____________ _____________7vg..vHC____________ _____________3T9..hUc____________ _____________DBS..qWP____________ _____________3ob..RhB____________ _____________BSp..Dwb____________ _____________26o..kbA____________ _____________Fte..qMJ____________ _____________JCq..iX6____________ _____________EQu..W93____________ _____________EEG..rYY____________ _____________HZ7..BVS____________ _____________GMM..4Xd____________ _____________5CX..Xi5____________ _____________Qj4..ShP____________ _____________8Rd..8DA____________ _____________FSE..DTH____________ _____________DJA..bxw____________ _____________DcQ..x3k____________ _____________5Fp..WLN____________ _____________Ez7..Xoa____________ _____________BM6..91A____________ _____________54r..9At____________ _____________8MF..VGt____________ _____________HD1..V3t____________ _____________vjG..uAn____________ _____________3n3..hqN____________ _____________A3A..JUd____________ _____________HbY..Up9____________ _____________Cqh..Zj8____________ _____________BYR..1Fy____________ _____________GjZ..cVj____________ _____________Avq..JyW____________ _____________6YA..z6Q____________ _____________52A..aAc____________ _____________FDn..sRd____________ _____________DGo..z5m____________ _____________CSa..ep4____________ _____________JDR..Bnf____________ _____________E9G..8of____________ _____________8fG..2St____________ _____________DZq..62F____________ _____________6QJ..Bvv____________ _____________9y9..sqJ____________ _____________3P7..xrj____________ _____________Bfn..WPL____________ _____________jbx..hAp____________ _____________EDP..15s____________ _____________13w..w8t____________ _____________AxQ..wAL____________ _____________9qz..UyC____________ _____________DP4..V4r____________ _____________DYM..WWC____________ _____________CxX..8o9____________ _____________Fv5..2nu____________ _____________6QN..sr8____________ _____________5iN..ecJ____________ _____________2Nk..qEH____________ _____________9xB..zvb____________ _____________AtK..a67____________ _____________9N4..iuZ____________ _____________3zR..HaD____________ _____________2v4..msH____________ _____________AdQ..ueD____________ _____________5GR..jNR____________ _____________6gs..Sj1____________ _____________6NJ..rgF____________ _____________mof..Q5m____________ _____________Eby..LZW____________ _____________UJD..AgY____________ _____________7EX..fcy____________ _____________ipt..ETJ____________ _____________2mP..Vi1____________ _____________4bT..Khd____________ _____________A4b..76R____________ _____________5ou..QYA____________ _____________8Li..gow____________ ____2VD..oTc
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
____e63..19L___ ____3so..iAs___ ____B99..o1v___ ____2vS..uXh___ ____YbJ..LHi___ ____AEQ..tjt___ ____AKb..WuY___ ____5bi..5Hs___ ____GrP..uTs___ ____H7x..bhK___ ____EYZ..TLz___ ____Hgt..Jy2___ ____2iC..HdB___ ____mog..ezk___ ____7xP..BjU___ ____3AS..sQK___ ____BoG..Mju___ ____9UT..TWj___ ____BfK..hpK___ ____BxE..Qke___ ____2VY..dpG___ ____FWT..fXa___ ____CNV..eVG___ ____83N..b2p___ ____8Ag..RXE___ ____4AX..GA4___ ____JDa..UhD___ ____PSs..te6___ ____5bi..5Hs___ ____4SF..2mJ___ ____5pK..iGu___ ____4eE..JXB___ ____Aw1..PDE___ ____FvC..DvN___ ____6Ge..LKv___ ____2aT..9nH___ ____CYb..XQe___ ____2Xn..eJY___ ____GRg..CM2___ ____ATN..UCi___ ____9Tt..JaM___ ____AVQ..5gv___ ____5w4..FCm___ ____Ao1..jKX___ ____B99..o1v___ ____2vS..uXh___ ____YbJ..LHi___ ____52B..T2b___ ____5V8..EQ2___ ____H7x..bhK___ ____Csy..TcR___ ____mDt..kSp___ ____5jr..uBh___ ____AUH..VCu___ ____4zj..X1X___ ____CeU..2Ts___ ____2Fo..q8d___ ____9t1..6q4___ ____HX1..jcR___ ____2tj..mpq___ ____4a5..Jca___ ____ADB..nJi___ ____T2i..RLx___ ____4rp..Wje___ ____BWX..Uza___ ____5WA..5gr___ ____7NK..oro___ ____FkL..4NE___ ____4SF..2mJ___ ____5pK..iGu___ ____7hh..QT7___ ____FvC..DvN___ ____6Ge..LKv___ ____3gK..CUQ___ ____7qX..xxx___ ____DAY..ezR___ ____HLZ..rqz___ ____7VZ..YK8___ ____3je..8dv___ ____5Ec..2wo___ ____BBq..vPw___ ____H4g..WQT___ ____GQu..npZ___ ____9F4..ozP___ ____8AQ..BH7___ ____7wP..LKX___ ____Fns..aME___ ____7qX..xxx___ ____3JR..t6K___ ____ATA..YZE___ ____Bte..MSM___ ____Hjj..YJG___ ____63z..Tt3___ ____A8b..SxB___ ____Auq..S83___ ____5Vt..UnJ___ ____JCX..EjJ___ ____47H..643___ ____6Ge..LKv___ ____Fns..aME___ ____7qX..xxx___ ____m38..YY7___ ____GEm..7KX___ ____4HK..6fx___ ____G7S..M8T___ ____3eB..2dr___ ____45Y..wz1___ ____3uE..WQb___ ____EVC..Nrm___ ____7LA..NL6___ ____8RV..Afn___ ____HZJ..zLx___ ____F3T..CuR___ ____Bhb..H9E___ ____5Ud..gzt___ ____8kv..bBc___ ____6aN..xDt___ ____FEa..xMd___ ____23Q..Zm2___ ____EHT..rdP___ ____Eoy..7Eo___ ____71h..ULo___ ____5ih..Xxx___ ____Et6..3nB___ ____5Kp..18N___ ____9JE..oBH___ ____J8B..6Yi___ ____Hui..akb___ ____9yM..eBm___ ____Bqd..yaF___ ____Bhb..H9E___ ____Ak8..p4r___ ____A4m..KTr___ ____GoJ..cYR___ ____7wF..ovY___ ____BXq..DGy___ ____DYN..pzR___ ____iVT..21V___ ____Fr6..W2m___ ____FSv..vC3___ ____86n..i8T___ ____BmJ..iXj___ ____Jcd..3DE___ ____3ub..pNQ___ ____Aea..L9x___ ____HD1..D4d___ ____5ER..zR1___ ____8sQ..G3j___ ____CVy..mvn___ ____6dn..ctF___ ____Ayi..JM8___ ____Ha3..dVJ___ ____8u4..CRy___ ____9V3..sb3___ ____GK3..mVi___ ____Amo..pnv___ ____Uxx..5Cn___ ____EpG..SyE___ ____7K5..Lc3___ ____9mD..2i7___ ____57M..G3A___ ____8fe..tLn___ ____9vv..wdT___ ____8A3..jRE___ ____9Zw..waU___ ____AHb..TWA___ ____7MP..hZn___ ____EnC..2wo___ ____2VD..oTc
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
CtX..snW AMc..pbP 3We..cgi 4on..zDe FoG..2yp 3wG..HMd Eb9..Vaj 28L..boH 2wh..4Rr HdM..GYh ANL..Yvq Cid..zFN Agi..PfP Eve..mf1 DbB..KgA J7w..zp6 BJi..R3n CTZ..877 7zc..RPF MgT..q6q 5mQ..7aG EKh..hij GoJ..1GH DL5..jW6 B8W..Hmb 7fm..5iL DFK..X6E 5Rw..BXn Hr9..NoB 13Q..wU8 AgR..T8a Dea..2tt HLM..5yp DFL..tf1 Gw3..No9 6We..cr5 Eve..mf1 8Ko..3cb Eiq..BgB HWi..scd ApJ..dgp 9kQ..3JV 3rf..AAQ CvB..aWE FjZ..KZY 6hy..oPX Gca..mwR 9wM..w5s C6N..tsS 5iF..7oX CF4..7jJ 7QP..QGG CdG..dKM m7q..UrU 6M4..kNA 7yg..Ldp DbB..KgA J7w..zp6 7zc..RPF 5g9..bop EhP..TsA 4tj..mB1 91y..nTg 8oN..NjC CgV..VNY BJi..R3n CTZ..877 MgT..q6q BbV..mvs CLM..soG DkB..F9A 3YW..vqL 4Wp..w1N 9Up..LRz 62P..pk4 5mQ..7aG F2e..2A4 6zM..LZb Gxb..CsB 49T..XbJ HEm..2py 9XC..esN 8ct..bsX CKW..UGE EKY..rbx DB3..KNX CtX..snW FWx..rTM FoG..2yp 3wG..HMd Eb9..Vaj 28L..boH 2wh..4Rr HdM..GYh Eun..1Cn ANL..Yvq EVN..1WP CTZ..877 7zc..RPF MgT..q6q 5mQ..7aG 5eg..wr8 34d..xoN GoJ..1GH BEq..FZz DZx..ZRm 5Rw..BXn Hr9..NoB FHr..WVY mAq..Sr9 9EF..JFi AgR..T8a Dea..2tt 7GP..nKC 6ha..fws 4ih..r4T 4v4..Tq9 8Ko..3cb D4j..vbv 3XU..Psb 2QT..iRu 2GH..up7 Gkd..DdE C7r..w9P FML..jig 8d9..M4U 5eg..wr8 4fW..mbr 745..D79 2bL..9MX CfH..u6a FRj..A7Z 43z..pu9 BEE..uXd CBC..jSH HsP..f3n 7zc..RPF 5g9..bop EhP..TsA 4tj..mB1 CeG..cuG 91y..nTg CTZ..877 MgT..q6q BbV..mvs CLM..soG DkB..F9A 6vH..iRx DR9..nrD 7Fv..xnn DLL..eyM F2e..2A4 GtZ..wvv CKW..UGE 8yD..ix3 Eun..1Cn 4on..zDe FoG..2yp 3wG..HMd 2wh..4Rr HdM..GYh J7b..rQX Fw7..bh1 Ef9..QH6 2kj..iUD 2vX..R5R Cid..zFN FEa..Qxw EPj..gNH DbB..KgA J7w..zp6 5g9..bop 3YW..vqL 9Up..LRz DR9..nrD 7Fv..xnn 3J1..XzL 5uR..HuF 9oD..8AV FRj..A7Z GQz..9iQ 6mJ..s3s Byv..h6F QXx..8tG CKw..UMJ 7Sb..4ca 8Ai..rE4 B4n..zjx Fvr..S7N 91y..nTg 8oN..NjC 6jS..bXJ 7iF..WZ4 DQi..KhH 9Gz..xZu H3s..RoJ BbV..mvs CLM..soG 3YW..vqL 9Up..LRz DR9..nrD 7Fv..xnn 3J1..XzL GrU..E7Z 26B..wwT F2e..2A4 HEm..2py 8yD..ix3 EKY..rbx NKw..65V 9Qj..MBV 6BX..851 Gn4..ecC 8rg..LeG ES8..FZD 4on..zDe DH4..w5Y GQg..KBt G79..g2N YL7..u6D 8Aw..bgm 8rg..LeG Cid..zFN 4L6..oDg G79..g2N 3YW..vqL 7Fv..xnn 4Aq..7w9 F2e..2A4 26B..wwT Fru..b3n Ck8..gUT 5cv..PgH 7GP..nKC GPL..xTF Ex4..qdv Apr..nJj AE2..CqW 8d9..M4U 6Bx..Yis 2bL..9MX wLQ..4KA 6FX..jpY GCb..Ckg Dvm..mVz CqL..aRx 2Qw..1k9 EWS..Tto Dfg..U1i H9c..PAN 7Q7..Avn 2CS..Puu 4HY..xuH D9X..owN 9it..ExP 2D6..FNV GSv..Ukv ARA..t28 HCp..1GB 3YW..vqL 7Fv..xnn 4Aq..7w9 26B..wwT Fru..b3n Ck8..gUT HZc..Pmo 64r..5vo GaW..Ry3 8xP..qRB 8rg..LeG 2wm..gEg 4Ex..Q6E CzE..Ci4 CtX..snW AMG..WnH 6cK..rEL A7a..Fvb G6W..41F 8rg..LeG Hr2..95r Ahn..wne HNR..BpY nvb..BgF 5g9..bop CRm..YeS J57..uQC 6Yb..MwS 5Co..Hhv BA5..vm7 HNR..BpY FA8..VoC 5g9..bop 3J1..XzL 8oN..NjC HJe..nsJ DQi..KhH CU5..Dvm Hey..RGv Dea..2tt HWi..scd FRj..A7Z Cei..pWw FZL..qjD A6r..pAV 3pY..sr5 3z2..5pZ AVw..zgm 288..UrA 5g9..bop 8oN..NjC DQi..KhH 6Jn..umP 57q..yvS HAu..pvo 4sk..Q29 4P7..35i D2R..rqN ECS..vyv 3J1..XzL HJe..nsJ CU5..Dvm Ck8..gUT Hey..RGv 5WV..h8X GXH..CiB CYN..f6y F2W..ma5 NKw..65V 8rg..LeG HWY..W2y Edb..nBV 4Yk..WcK 6cK..rEL G7c..gvP 9ah..6qX GVR..NZC 2VD..oTc
Check the root hash stored on chain
reply = nodeApi.rootHash(session, data_collection, articles_table).get()
data = reply["data"]
display(data)
chainRootHash = data["rootHash"]
print("\nMatching:", rootHash == chainRootHash) # data hashes are salted. The salt needs to match what's configured on the network to have a match
{'signature': '3zQLpiZfxMkr7RbVbu1LwywrGb5uFgNEKSMQHEqnUhuHhY53oM9Sfow6wF4XyzWjprRjX4bSS2iYfnZMVTtFtjyw',
'rootHash': 'GNgTXXfKtbH9ZwkKVwxTML7gd91FZLY6gnaM5Kr397JV',
'timestamp': '1691601135574'}
Matching: True
Verify root hash signature
signingKey = nodeApi.sigKey().get()["data"]
print("Node Public Key:", signingKey)
Node Public Key: GfHq2tTVk9z4eXgyXVRvnn4hnpsfgFCfen9n1KoqnLp9ANhnmj9BsdJvv9Gg
toSign = rootHash + " " + ts
#print(rootHash)
check = nodeApi.verifySignature(rootHashSignature, toSign)
print("Check signature from merkleTree() call:", check)
toSign = data["rootHash"] + " " + data["timestamp"]
check = nodeApi.verifySignature(data["signature"], toSign)
print("Check signature from blockchain:", check)
# Note, verifySignature isn't unique to Weavechain, it's EdDSA public key cryptography and the verification is done locally
Check signature from merkleTree() call: True
Check signature from blockchain: True
Create a new session
WEAVE_CONFIG = "config/demo_ailineage_researcher.config"
nodeApiResearcher, sessionResearcher = connect_weave_api(WEAVE_CONFIG)
{"res":"ok","data":"pong 1691601135704"}
Get some tokens for testing
reply = nodeApiResearcher.compute(sessionResearcher, "gcr.io/weavechain/faucet_once", COMPUTE_DEFAULT).get()
display(reply)
{'res': 'ok',
'target': {'operationType': 'COMPUTE',
'organization': 'weavedemo',
'account': 'researcher'},
'data': {'console': '{"res":"ok","data":"pong 1691601136442"}\nDone.\n',
'fees': '{"USDC":-10000}',
'computeHash': 'HQ6z4kheRFZsZ1ne9FmpuFVX8vkY8v4V29yeDTzs25kE',
'paramsHash': 'GKot5hBsd81kMupNCXHaqbhv3huEbxAFMLnpcX2hniwn',
'WEAVE_API_KEY': 'c4a65d3625ab441296c7492b53611a8f0827a41d78e52746',
'taskId': '251de82065fc47b0980c5fca8f655374',
'consoleSignature': '2sdJDwcSKjsvpMDET27DDW4QqvQ6qKcAMMutULWwXhevzFg88PFUWvcFjFPdWAHp8rnbBS8nrSmSYJ58ghe3PV9X'}}
Check researcher balance
account = sessionResearcher.publicKey
reply = nodeApiResearcher.balance(sessionResearcher, account, "", token).get()
print("Custodial wallet", account, float(reply["data"]) / pow(10, decimals) if "data" in reply else 0)
Custodial wallet weavenGcGQRs4tLvgKAGBMDb9ZjhRd8VeBiQ9r8kX5sJwVMBt 10000.0
Train a model on the data
In this payments sample the researcher will pay 400 USDC and each contributor to the dataset will receive 1 USDC per article
reply = nodeApiResearcher.compute(sessionResearcher, "gcr.io/weavechain/train_model_dummy", COMPUTE_DEFAULT).get()
display(reply)
{'res': 'ok',
'target': {'operationType': 'COMPUTE',
'organization': 'weavedemo',
'account': 'researcher'},
'data': {'inputHash': 'HPyYW1p6Ze5LwH33dUy7t16YWjBKusosUBaqVdjgC7bF',
'console': '{"res":"ok","data":"pong 1691601143564"}\nDone.\n',
'rootHashes': '"{vault={medium_posts=GNgTXXfKtbH9ZwkKVwxTML7gd91FZLY6gnaM5Kr397JV}}"',
'fees': '{"USDC":400}',
'writesSignature': '4qy1wDsMnSmzgkcy7K88emGNVbVkvh6GnKoSLtVs8FZfnNRJcdmk4VDbACUp7rHFXDJDQfE4rfrktxwzFVBhq3oJ',
'outputHash': '36UaD8YjacqVUxbbCoAssrkruugmmAWjC7sQLvKEJcNC',
'outputSignature': 'LJTyKJH5Sa9J1V5JyX8QgU5FRWJqpdeN4EmnsokxyvqxmaML7fjWRi1X3Bo3GehUSty2aK54zZRjhimpYuU9mcz',
'computeHash': 'A7QbDaGoRziyxW2d8QCn4pPZQGY92RVcHRPnxeUdEkCx',
'WEAVE_API_KEY': 'be325a4cabee43ed9c79b7bdfa9e576e5d48abf92eb06f65',
'output': '{count=337}',
'input': '[{"hash":"hw/qXIEEVvZonVH0Eqi/WUguCgGpqQfqYFJXjLzaL5k=","scope":"vault","table":"medium_posts"}]',
'writesHash': '6LfKoQQMqb8fYgA1PwBPKMhFaJ59Fn3DWw6qTRri4zjN',
'paramsHash': 'GKot5hBsd81kMupNCXHaqbhv3huEbxAFMLnpcX2hniwn',
'writes': '[]',
'outputSignatureTs': '555XwrvzWGPmZnJmF8KFXyBTa3Us9Co7jiQbZFrbRNmiMz6jKCisVnmPxyRnV79E3v6B5zC8LYuYR7zUD3vZkKzz',
'taskId': '1f79a579e9a948528bf2ffe53c8d84fa',
'consoleSignature': '3WQatMFKUKkvM5mZ7gs5d34vvV36axBgSBPioWT8vBNRubAdKCRnMkifmMkCG7EkhP5qwBvGpCs28KpXkdCJxj5q',
'ts': '1691601147577'}}
Model lineage
task_reply = reply["data"]
print("Compute Task Hash:", task_reply["computeHash"])
print("Input Hash:", task_reply["inputHash"])
print("Root Hashes:", task_reply.get("rootHashes"))
print("Output Hash:", task_reply["outputHash"])
print("Output Signature:", task_reply["outputSignatureTs"])
signature = task_reply["outputSignature"]
match = nodeApi.verifyLineageSignature(signature, task_reply.get("inputHash"), task_reply.get("computeHash"), task_reply.get("paramsHash"), task_reply["output"])
print("\nSignature Match:", match)
Compute Task Hash: A7QbDaGoRziyxW2d8QCn4pPZQGY92RVcHRPnxeUdEkCx
Input Hash: HPyYW1p6Ze5LwH33dUy7t16YWjBKusosUBaqVdjgC7bF
Root Hashes: "{vault={medium_posts=GNgTXXfKtbH9ZwkKVwxTML7gd91FZLY6gnaM5Kr397JV}}"
Output Hash: 36UaD8YjacqVUxbbCoAssrkruugmmAWjC7sQLvKEJcNC
Output Signature: 555XwrvzWGPmZnJmF8KFXyBTa3Us9Co7jiQbZFrbRNmiMz6jKCisVnmPxyRnV79E3v6B5zC8LYuYR7zUD3vZkKzz
Signature Match: True
Check the researcher balance
account = sessionResearcher.publicKey
reply = nodeApiResearcher.balance(sessionResearcher, account, "", token).get()
print("Custodial wallet:", account, float(reply["data"]) / pow(10, decimals) if "data" in reply else 0)
Custodial wallet: weavenGcGQRs4tLvgKAGBMDb9ZjhRd8VeBiQ9r8kX5sJwVMBt 9600.0
Check the balance for few of the authors
for i in range(5):
account = df.iloc[i]["pubkey"]
reply = nodeApi.balance(session, account, "", token).get()
#print(reply)
print("Custodial wallet", account, float(reply["data"]) / pow(10, decimals) if "data" in reply else 0)
Custodial wallet weaveyHb6WF1WBk5ZMQpMm1eG9uugi4MXnSgoAetTARcR9izE 4.0
Custodial wallet weavebvDnoef2cPLbRtqqH5uA2M1t6Svdz1C3d8zx43481W3z 3.0
Custodial wallet weavejZRDVDvctwquT1eQGM38v1tHubtPryRxq6K6rniVhkFq 1.0
Custodial wallet weaveiWV2dK7p3AHhBkwMBjPqpM6vVM78D62HdUUBYxmMzdKb 3.0
Custodial wallet weavez2Lr5qDk5LC3zPUxFakrxyRJUNb1LQ9QzEDHRG2Gm8ix 4.0
Verify inclusion
With SHA-256 hash
Compute the hash of one of the articles
row = [ sample_article ]
recordHash = nodeApi.hashRecord(row, salt)
print(recordHash)
2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc
Check the hash presence and validate the Merkle Tree
reply = nodeApi.verifyMerkleHash(session, tree, recordHash).get()
print(reply["data"])
true
Or get a Merkle Proof for the record hash and verify it
reply = nodeApi.merkleProof(session, data_collection, articles_table, recordHash).get()
#print(reply)
data = reply["data"]
display(data)
hashes = [ h.split(",") for h in data["proof"].split(";") ]
display(hashes)
proofSignature = data["signature"]
toSign = data["proof"] + " " + data["timestamp"] # the node signed the proof and the timestamp
check = nodeApi.verifySignature(proofSignature, toSign)
print(check)
{'signature': '3UxXK4pv34y49y24Mz4U9KCUREfw8sa8b3hEgpj24n2H2ggxiDp5VYfXn8tX7Lg7pBp9beV5PuQYL91kBsv7HgmM',
'rootHash': 'GNgTXXfKtbH9ZwkKVwxTML7gd91FZLY6gnaM5Kr397JV',
'proof': '4jCJGXd5SfZWQaB1EoxcLGTtYwWLKL9Z4RvUvCvSdCsg,2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc;GjS8hiFKJMBbGERrnFdx7qHjvgBzuvE93mXzd9anbcwD,8EnykTr6mqRZyiDnC2NznsZnHmugYU4MxEqYPDdu2b7o;eXchZzqyGmuUf5inuchRjwkKX543MHi8YJUSZg4xYsz,7QdfPwEZcCSNym8Tmm5MaN4imUPSe4eCroeHnRp4t8M5',
'timestamp': '1691601151380'}
[['4jCJGXd5SfZWQaB1EoxcLGTtYwWLKL9Z4RvUvCvSdCsg',
'2VDBUvpuQsZsxK79GFH1c3dujLG8GbwxGo2Xjxd3HoTc'],
['GjS8hiFKJMBbGERrnFdx7qHjvgBzuvE93mXzd9anbcwD',
'8EnykTr6mqRZyiDnC2NznsZnHmugYU4MxEqYPDdu2b7o'],
['eXchZzqyGmuUf5inuchRjwkKX543MHi8YJUSZg4xYsz',
'7QdfPwEZcCSNym8Tmm5MaN4imUPSe4eCroeHnRp4t8M5']]
True
With LSH + SHA-256
Check merkle tree of LSH hashes
salt = "salt1234" # Same salt used for records hashes, this can be improved to have different salts for *each distinct writer*
digest = "LSH(10)+SHA-256"
filter = Filter(None, None, None, None, [ "text" ])
reply = nodeApi.merkleTree(session, data_collection, articles_table, filter, salt, digest, READ_DEFAULT_NO_CHAIN).get()
tree = reply["data"]["tree"]
rootHash = reply["data"]["rootHash"]
ts = reply["data"]["timestamp"]
rootHashSignature = reply["data"]["signature"]
print("Generated at", ts)
print("Root Hash", rootHash)
print("Signature", rootHashSignature)
print("")
showtree(tree)
Generated at 1691601157023
Root Hash 5DnyzKSBmxcsVD32V5bE6AUxuNtAAx8mrcsPFK9EbVn8
Signature 5hN4D7vJuHUtYm62WcqaQBHduVnPZ2P7DKAsiWxXCX3wWSokLJcrGQibqz4N1yM9EjdF3YAQY7uoW2Bj3FeHe6kn
1 ['5DnyzKSBmxcsVD32V5bE6AUxuNtAAx8mrcsPFK9EbVn8']
2 ['8tXAuHYtu6mkA9QGTMpXjXdzeKjYKEEPUYn3GuMhcvk9', '4ZSiXeC5uoJiJPLf2T8cgvZACruUYhExbJhDB2pNjC5p']
3 ['EL3GfDjJQQqpFPgpgsyTxob72EkuZ3Ghhpu6m2bXGT6v', '38cjBvSUFjv5KHKPQLrnsqVfzWBtp5RCY9TaNLy8Gwdv', '4ZSiXeC5uoJiJPLf2T8cgvZACruUYhExbJhDB2pNjC5p']
4 ['4yULNsbmvt1u6bKvSvoRbH7DopXKMojm7GvoJ3UrtitK', 'Cx4HjHHehQ5m1ihwkh953UEvRvMFjQYsWShD4WFZrcpu', '8dveuxRKcKrpN1JpiHyiY8U47ndmhTAKJuKKih4KAHVX', '37WLFxzvwcfZoYAFZgvSCfxY1aeHmXhdnnnBmVDgo57o', 'H6c5BYzru6r7Uuay4NrffADTN78qPPQ7YeXj7RJ16TPD', 'DGrVuXYdcvNBvjZiQHh2NKemFjYyKfbtHQthTHMWMwZe']
5 ['7mLjHdYTpvRLo7yUrZnk9ex9pTkGfH5MRmnXeWkkJjsK', 'CiUQWt4X5SeQT7s7UVY3BWcZ8qvZ49ENkuXiSoKcm3r8', 'DGXfe1jerX79pp3XbkQbBuZhsnRRGZfNUrRsPxkizsUL', '9skdsALnq3Tu59ieY2pTUns28EicUSWaXkzrhYzF8bdN', '215rv4b6h6qLPfCwTvXw2Ua9ZhiAzge3tmwgLGZCuPtY', 'CAprMrzbNcRHpD85sJeFtH7qUG5ctMAaVjtqkTq8xrJD', '7cEPBG4zGSRZNco1bN5H39uu294kxXtrdq24ntfLvYk5', 'CJ4GuTDqcfKdXF8GE38rk6T1yb6A7aFH7yHv4bDwfuUK', 'J1Hg87BCzZT7TqvnVV8F2bjg2VmjUkSfcyLz41a5civN', '4jjTfXeXx3SSnPGtTWyGhb55nBd4CSgaTKAq72bvB74N', 'DGrVuXYdcvNBvjZiQHh2NKemFjYyKfbtHQthTHMWMwZe']
6 ['CND4exZZbJpUS37P6eVZauvZfZ76DbuLGuaUYmGvxpFF', '4CRd3YRxri9wfPKUUW5UDMT7xvtAERS2Cf7ufJmyztJ1', '3PG8wSPpwxqpWU71Fqx6Bb4GgxZRE3NKU8QniU6SL6Zy', '6Xpr93DypuyEikiyR6w2zKb8WFXUZk5edVFrVxFvH4Mm', 'Azo6R39Pf7HLzdr369yM9rg4Tmu28fLCJDQyktsZBjZ1', '5c1VV866TGxQ9NhvUR2PsUfFiGr4995QMHn6T7xVs8MF', 'HmSHTCE4mUBRNLxQjQpqG4BWMSvW2dTMCbxbCngy7wLv', 'FRxFferiA6zaeQy7LYcDnZWK6BmkMRSwgjYsfr5JMw4M', 'G1UKKQRVBXZu7ru7KT5GPEN4nGsAxZGseeHBXGYhGrW7', 'FFHZZ9LoM3nfzirRp5G4dN4U6rsH2dZqMqxxTLtQvLJy', 'GG6ESrvibgcnukgxirQ6NNusaZ85RdyQneCQwAGc2kWy', 'ECvo3LB6xDdiMhwL9ntZE3gytwQ3f3BfH7GyNUwFwtkL', 'CXVcm4HHeE6GMgCxpaVbhHqUxFV6Z5FWMkJUQov5sRzi', '6qyDjVHYZfFwyDP6XRkY3WzobN5eZUgsSs6N1hf94aKC', 'GreJaBHkC4Q3g9hxW14oZYF5ZvEYHPQKnv1xbDSoD8QE', '8ou7AXQUU19KXGYKnAv7DeNYnYVZ4h3CQms6Cr85eNLW', '5BxmXrjnzZNGUs4bdqCjYe1xJ4vCSbTPYimKiX1UkuzT', '5F1XmeB2ctvEmKE8tQEH956gNcgAzvFmv6TxD1MmdDkp', '9xE58CxcjJsKHTbWexm7B6pN9au4r1QKGep1Ui37Adkq', 'CkrbWb7WQDyEciBxKJRs9GL3btjHH3LhH2F929hZ3syR', '2GF5o2kbjto9qhrV3rDoPAycLF4b2kQ9hGXTBE8DqnCM', '65zuMnox82FoazB1N4reAyPfTQE7ChAMHzS8NG4Rm37D']
7 ['3g2GfWGaBwZuUdy8K1ogwB3ojJb3ErHKPQpXUvSYgQRQ', 'Bj4dbeBbcV1DuQuw8fNHGvdJKaFvsHpSvGsA81h8rFK7', 'BCBhPthi3nQhq8YXx51XkWizcuRx3xSDqey6wYHnFws3', '3fXH8VYh8p3RvCNtJ9tXu58sAjCeBPkamKQtpS19Uq7g', '6pf3yhckErMU7gLD1tf4XMb3LLAdPPtfbATCdiF5zVWz', 'GRTVbxN8vrRUp8crt4uiijQdEbAWEYGykQzntHNPes4d', '5XF7YcHE2DrRtGtsyHdgkwAaocbo1xcyJfortLubha9q', '3E6Z6aP3nyco3R8q4e71b4C7PXq7Zvxsh9X4yZzGa5p8', 'F7YpKjyVwK3Nv47d4NK5BZRJ5LkyKmpYdQuyTHzjWp6V', 'CfHCmSDkmEEvdj542r5CBii3CanaN5xfRHaf2dX1qxKo', 'EN2cmRkVsyrUF4PGRWKoV79ohMbgdgRBcxFFDDcsBjEB', '2gqgi3CWfzfUQLXsfABBYRNVZaUgmfubfw1XoQbYKrqB', 'Hh7T9Kfu61cXZCztkvn5wYn33UHn2oYDYciheDYz92Mo', '2SfgwUETkXRXebkFPeZ8jwf22MnCUYWsccNCQ5uoxctW', 'BRZzYsFqWY154qoS95okLR5ejqeyZRXYtkLumT2qkwQg', 'CGkx4kRnZZKRRFo8BnXmaFUh9VXM1fnFDFdoSZ2yBhZQ', 'J27zCiYdeejVzToAsnvf92xtUR7eU3srVpcsqHVhRNFd', 'GMGJ5rzNBLqStu84XXTqLt7c6ZSMYzNEuKtppm5sW8Q6', '8YHiBeEDYXeWcCZXXgdpQ2QEVtH9anrzxji5w2sBxRii', '5sEMmkzJwggWuni6vHFNhHUXaMa7GH7xHF5MQK1ZA3CK', 'DtKccqfXT3s5SNYLixzS6RkCfX1py9nmYAWEWZ57aDPw', '6JEEGmNSyBgsR3r5Gmy1wrNJ5imNqSnsHurybbdm8KHt', 'GiSDi6Rw8U4k5aKXAkNbW7S5yZKYacXCaAX7PX2RUzn1', '6PT4kHSzM9ywsoBEoLyoqatkSYu8cBZMm2QQZsQAHpcG', 'H4ftP3b5EddnA62xHq8S4tKyjswq6Qbwk6UXiW8LoNqP', '2SKC2t9PVgMhhq9pc9ZdzEMoGqKfcVkVXZFxT2mKXKf7', 'CMAmDTPGjxw5zB8DE7WYQqUGNckBPXaujhC8NCRowmjy', 'CdjnycyLfzWqyowP33ybcfxa7rZfCqjmKvjLVvsCJ6g2', '2uodcynQ51innctsffTDC1M4hyadChxogTYpN4qwtweQ', '2LEpHmP8w6jGAvtQxTscLvR9UfMAES2AxKaFGrhR8iym', '4BNpohqKLJPBFrKErS9WDRVittjZQp8fp2o2BtPzJmmK', '7Dj8jMXrJrhCTMZh75sszNExqNpoB9GMq5zrwpU3tG1h', 'FLNo4i8fHo98oTuFH5r7kXhHgWwf8uZAx55NeT3iKXu4', '7L5Yf8cCAPqh9wu6D4BsSS3myNe5THALv5weBZBXPBpx', 'G7ZtKYotoXxZ1CiPCj2xjE68bfC7oxeKDQVg4At2S2mk', 'BCe9RpBbZ9F1q8NKKSZz5KgT1e5EBNXhLjpxKiutToaK', 'ADtbXGs8Vz8xjYpMtC9wwt7HYDTtkHr3PwzaPoKtMv7e', '8TVGMTBi4YCg2SJ68KiaYizZf18kVAc19RBKytkbTVfS', 'C6R3RnmmzqAEv5o4iHsRE9MdULhgF6QnRMjDAupdK7yv', 'EBWbhzgNKNUi9DUBD9UTEPdNqZuS3vU1SSdaDqA6b2L', '2fvM8PhxUq4SUmAJkMaFdtFX5y8WymhVDtnyLmeLtZzM', 'JBnfr4QPNDeyZEVX9am38SGcJB9ykZ3XgmXcDEhMkzPo', '65zuMnox82FoazB1N4reAyPfTQE7ChAMHzS8NG4Rm37D']
8 ['7TpCcubzqWskGDDrGKYzuqDDJHBboEFJLcv3DajxSQ3t', 'B7Y1n4VYKcGDtrgyQ2JwnWBR7tyjh6gbPm4Q5hVZ3eKe', 'AVog3iVnibDXLSsqKoZygnJxgkPP3QM8DDQTzba3NTwC', 'CfTfzt5paaHBBefhxrQwmR7DsbTuLYTfvWT9dBcVkq7W', 'FEAhcgxigPaZpDVKbKGKsPwkHPgdQKbpZEJWvpsxiWf9', 'HEXYhoDRYjH3FocmwQ8ncKBt4TkvZsvQWyeGP31ppQBo', 'pezu8Dx4XHiCvJW87ccuBk4xYCcgECuL54sVABaGvYm', '7vPyjEcwDn4DJjbFBipzxhVS5shGoMFdVCKzxpGSZ8ft', '4VdMEH4h33GyWobNoHUS6xdLt6DM7chx8n3UrE8ZyS3m', '2NfnAMhMTVk2EduJATeWTq7FrTQiJjdq7GzAn5AZqRcM', '4Vcyaxt7WZZx9Qzvkq4HZAUUPjkjmrmZRzGZ5o8zAVrK', 'CQRpnL4otPB9qWNKMiPhAvL9DL8xmBeveVQUg2QZ68ef', '7XTXP9s3psgpvANG5hbNPRMrMaw6djLiFcJozYktrMUC', 'DhYBc1C99kNGGn1rrAh6dnf2JoVyuRnL6dgoxDm8GDYU', 'CuEofjziVMpwzJPPtUBvZkjVcPo45Qwck6QcAKTfdtqm', '62h89uBNC3UvNYwagKLjgLuuzeUcakaqvw7zuqLmTQiX', '7QrXkTA2ZzkmeD7pJDqZeN4Gy6qT9tnDKxpRYnSeZqDk', 'FScqSrg9oYqZro72vao7ycPBTn3GesAsgx92BwgiTYSC', '22C5VZFp9JVZyLTeA5k4ZrXRYF6QtgFDG9MZ1aviv4F9', '6jV1kS7af1tFQ6HncUaVBLaqt6L3ygY3j1XMBoB49KDM', 'ApF8VdymwfxYgPvefpBCDNJkFUo8rVqsPGAAtbZjbWkh', 'ESPuAX4o9LfHeBuXaVBwrfnhCT65JXWGEP9vdKjT27bf', 'B7Y1n4VYKcGDtrgyQ2JwnWBR7tyjh6gbPm4Q5hVZ3eKe', '29dkzkC1PnvTv3uSLvoWhFivdHQAeyC9yv1jPuowuZQa', 'JE3M5SAvmJXhi1U2ppKDNLjCz76cmvtPrgmzTdGpSkKb', 'GTYWvs1YUsuJgRrKmFXCtqWnxVw4aAVq8fffGcWgrV1j', '9he48AyMfAuksqymVYbXusNSmohk39iB13DgtNCPKgdc', '34Cdue5kThi8s7QwUnGXS5fzBwvijgEGmKAYDySaQ2jx', 'BizedqknzTvY1nzcR8a2nR2Q7LNTvXvGbMWUGmCaTjcp', 'AaS2zJAQMsmnBqwsdAXZZonp2m7WqN2v9UrZSvXWFMPk', 'Ae1VTE9V2NfxF2SmhN1TaLQ5yUAH16RSQJ6an7r3dsij', '4DeZCyGZpqRnUH5Es37TWwDQo5xcWzCW1KKyq1KqGxp9', '594MMdbaSXESu2zFZFPYhT4GBawe2MShFkmWjmh9sdCU', 'VMkYvqRuX3YuXvMCnvjxTcYats4sjKhtNFj5NWQFCZx', 'DhspwYSJb1imPkzwJ6Bhma8kh1zQPqMtBJbFSdQnPSLV', 'mkDvvbvTv1xXvBa3sqKgAmzpBA5GrYDy6cJTJSVjCKG', 'BLJhw9Wp2fZp2sJZF85AKszYCnBchfYWmhsMZMTbXX14', 'VacSeWLy51YXvZ2z5po22aghYWzg77wqTLJMwaGP2M5', '5T4RerCzGB7xAycnH2Q6UfnbRyMiM6umWuVGQPWV2STr', '9mXRWWWKhLY3rzfXgfociMArNm9tbgXx3WLzJ3twxfaE', '2AdFiraDTenvqTPzoLbKigKPddUYvYwiEi9vx548qER3', '6jdqqDWrNE4FZw6sVaBYM6vXtXe4qSTcnGNygpCCAXya', '7kck81fvEhqXfjN72xcaGwhg2mCzR3BEmeJxhwP5VBFW', '4C8u5RU3B1YMwG61SDK4ML7TXECyM7TDa2UrjSUzLRRc', '56W6R6c4rvz36arZgahe9GL4d6JC2J4UcQygDq2fNGvf', '7Ktsvk2vj4K62XDoABx174sortLhECZMEJMnfE47DtGw', '8apsm5Y6eXRv5xTcLLMVkjxCq4HFqnW9AJHKTrnjUGr6', 'EGjPMXx8urd2UEzuNw4ysfGHipL4owmYYUHQKymZpMr4', 'FKQKQ8h4Yq6cJAbCiTbRxMcYQM2kHcw7dihs64zfiUYW', '6S81Jdar6wiCCj6DinsRn9UUEFGP8V3f3Dggo6H7Z8km', 'FWUvq1DaXRHkV395nG58xv4LLdxmn8u9vJ7TtMu5eyPW', '9H8tBpk82DGJoMGqjkUUkRu3Co1arfPpKuGhQiT41uq6', 'EeUAFT3GrNk8a3xkwZFzt3SABwdgg4qGFiMUgzxweoyX', 'BkyENsjLuaMJugkhbJ7cBBqsA8315nzJ4CVL7gTnrPu8', 'ABbbZbkHsyQs78y32zL2fsv2b2DarmB8hxw4JcoAmeMF', 'ChykxhqWnriimg3futJkoLvzsxeZU16VqXHXXcgEXwww', 'GkjrwbFnhUtnVvjw7vskUU99ZjZPU2CQoyq67qNvZZmJ', '8MzsuGYiqUa8veaXx22H36JFLMN6jKn6yw7nTqbxa7g6', 'AHRLhD47cW4mLJzoBKMvt8iUg4KxRt7vVSqEhGxrdE65', '8Y5VELLR6FVToRZFDutBk8Er4bgPB3T6KfnovgjYr979', 'FpkiFDBR1SZLVMjPEDMPUVWVbUNrCEE4dVuafeft1gwu', 'H3nL3Dgv9yw8csTrSefVgkh47imn2niuBB4Lwu2QEPNw', 'CrQimzZSsBnA9k3JXnJ1RSav8qPeDFyc8UJ1HPsa2kXJ', 'BGVKr4CRjRqeHZTJeMwmML5fMDhrxz3JCZjNNGncGv4Y', '41rFakgQCRAXroc8D81WjFgEFMFdtizLkV7g7gdjRnaP', '4rXEfTTLBEMMGwTdeTZ6yRxDcGrzgaesGi6maGYPFsWv', 'AaQPKu3UPtcVfqKScuKymB9jpxheENPE4SNSNLsotHtN', '6cdy1zWLoVT63M546FfHD6Yz5weBEUV33qtEgbaNEKSz', '2zVF2piy1HUNDucnLdsqEDfa2TpWPi9Gb4WHdjhvzyFw', 'CtsSTH2xBqrHTSTm1DFQX8xz1qBj95dXK6dU4v6j1ddH', 'FDthbgvTpFJDJ4kEAnZcSgQUJrDUh3GfDNNQVm87KXCx', 'DAZYazTdDYjouMTMiKUv9FhbVqUexMQjih4wksWBpzX8', '83gEie3ZT1GNJr1c9aUBnst6pS53HmVfjwdD2DHJ8oKz', '6bwVt5CQa7P8vKiLC4eLBC1wBwgfHcWd5xEHu2i2Mp86', 'HVRSo2Bfqdc9vQJUwVSAcSAoe9Bmn9T9A6QrQDQYH2sT', 'HixE4qFRcd4RMKEdcDcLn2Mh6emrzaS379GpGjH9jFRa', '8JRNovT4ZZquEThmZPP5CyN42cdi8RWaANQcyQ2V9CmE', '8oEBEvxXPoRNEnDQEYPkostqjLCPNQP9wT8c5Nom8uWz', 'G3Z1XHa2KJSwkPwxULSbjrnuyc75M6ge6Vb85nVZiEe1', 'AZYQtZDfzTZFZ6KfT78sAt8xmatfiwZowhZKz6kiYu53', '8aRMf3XQsCGFQBw39NBfp3QmVfQcH6hddcinebsSML4P', '339JqRehJQLo2xBDuWSx2TvNMpcLFJoDnS97piEVMUQN', '7vWnemmJz41b1JzBeCFNzMxkLSt6enSKKUWuq18kSrL3', 'FGCVeJ8bJL38EaFv6j98KQDfWeFZEUyLH93fShjFAZDR', '65zuMnox82FoazB1N4reAyPfTQE7ChAMHzS8NG4Rm37D']
9 ['H7SVTWDYUukpHtBKdzLupysc2Jhg2wAcyL8wWaGgvRjg', '696wtSJRePQJga7zpAwma29GbS5CjjdRRaSDk8cuQzHN', '2cQytS6gDR2YRNv7zuvosTkcp2riEZVk7ux5gbsbJiY2', 'G5CRGmfEFsS7ZGxk1q1Czaz42wKjA7a1ksWT4tYJe5KD', 'uvZt2s2W9gTGgVbM8PWrS8frULPCRrDx1kGjbEXn5db', '7bMN95JWEKQmJzzhHi5Ubcydk6eTHtbX3R1NjeoAJnfv', 'CqHuVwt5o1VSzxNaqPJ3qUAyiTLfrS7qHqqgTYppziSB', '545L3WLhCM8ipm75TJiheDzLVs6TeKWuH5ZTtd35KY7G', '3oNNnxeX89qtJbbFH5t4UWht2pDmaZeoRqhYE3gGmC7j', '4qGfjvdUwugqNS9dch8RaWVr3QSmFdzYX7zgtUaKPrsT', '4b2R6b9MRzgg66g2g4uDWvs8urs7Pf2othZCxQY3VbGo', '56uAMaJsxS5d5rowomBnR34dxdGgMBB1mQLvz1oaf76o', '9Tr5ZyJQniwTabG6kARQBKB69gSZRn881P3yGHCnfcVZ', 'H1RtH9umbrsgwoyMZe8FA6J8UiY3FGrHkQxfwcMSE79W', 'DVF9cf2hyyhfrHsqRMbRAfryRcr2fsZ9Vmttp6GrgL1m', '6ahWAemEBEQewaKnT6pxCoCcyVRGKMFpHwV2jvncXV4h', '72pqFsXCWd7pMjjTg3YgAoiunGJaqZzaqxrrVpyZRUuo', 'ChvNqmSULa3ZqvH292YUDC1x4aJtUWwQnLYajtk7hSPU', '6E3Jy7q2ToPUCsiJZJFEpB1C1sSVBu4dE76qtJJ4A47N', '3TZ7oESfmYgZoD8r3DvLJBHudLNuaLSw5Qu9CcpndSDt', '4BL5LKPEZSkHcJ3vkKUqywWCN5b6XVVRxQHVpuYRNwhL', '6KGMTGKmreRukyEe1pXwZEqhKdXT8Te9pBcFyYvds5H3', '2ah68AzDuAp7sjEkeE3YPLSX6xYaeukhJ9QtrkdmfLyy', 'HGVh8RDfNDw5Jrk8LBox2HAkyoP2EwWEVeNavAiAoCXq', 'Gs2yT5XpSz53herNNkhYTMyJHDbH7KgHPXYnmyG3bUCv', 'ErhcAfsEQmn84TUFAizp6LPRJwscKLRai853E28eLcsR', 'yqYbaZ4vpi52qhtypJMkmsxW6RSXKbP2vfw9HL7RoDQ', 'GZ2eTHraJEvXPq973SshRacb6HNAzBeAKoJPG6i8K5h', '545L3WLhCM8ipm75TJiheDzLVs6TeKWuH5ZTtd35KY7G', '2cKd1dAwDTDrhtMpXZrpF9b3wskvYnkWyDMpeLriG6PK', '48K4upph7sxFf6WPFSufA4ewYTq5FTmg9ca4NgELPvT6', '24AZFmzoZyopJMSfiazeGLqdhfr4Ln1qpVVSFve5v2zR', '7biFP8s7dfdCgdKHTAae88qdZCdoks7ot7haWgB2Kqgv', '4FQEf25SuKkyLQV7BeeSs9JNsAUtymcKAcgQ7GTARJrW', '85xyBkHY8fjCdxr4f1ZGztHkcuTXoXLYJeZYiVah2vt8', '8VskhAzPWoptfyZvBsnxUUPuR7azkyDRiVZmPETtzhna', 'HiQifjHZvcXHXtq95QwLcrQ3ipBGv5hX27wVHU9k9jr3', 'BCcg4R3SoQyWcyP7y8HGAk2U2DBvRUawT2FDW7JfEURY', 'APJmE1om5g9K71Ub5wDkLB8SZ9t7rPZhgq3YcMs1F8pg', 'B1rvYQkhZEgWamSP8hV95mxntFoqU8viG2TWfhtjB9NQ', '2htpNZYnn3XqmLguJXLwSddstSUVFacbegczcPG1GeP3', '9EHfReiSDucWAYGcy1ezktjuibERZFQrNDjZgAjJ8mDD', '2XULJEmoaaBALBAzJGR28hn4RYodekq73jRBUbX3affG', '52VYh2awgjgR7iBsirgNdWW2haXUrFpdPsRfxjLDskDA', '2cQytS6gDR2YRNv7zuvosTkcp2riEZVk7ux5gbsbJiY2', 'G5CRGmfEFsS7ZGxk1q1Czaz42wKjA7a1ksWT4tYJe5KD', 'uvZt2s2W9gTGgVbM8PWrS8frULPCRrDx1kGjbEXn5db', 'CUU9wUYG2KBQ53CFPHg8KwmSqSs7DJ3Q9jZ7KS8wUpUw', '39jUhgWDx2AKgKYhiponfTfgnN6pYp29uRcEDZZSdXca', '4qGfjvdUwugqNS9dch8RaWVr3QSmFdzYX7zgtUaKPrsT', '3RBfTZyWTwvyA5ws1hs2Y76jCuUGeipuLe99uKKYymH4', 'BBPXeJZdkeVuaTV27JpiXQqA6Z1Mzwmh2q4SPq66PXmt', 'GxJ898ei36BESj8RbncRs58VCsBR5KbzXDvZTWbZXiRn', 'CowW7aVe2ftLe2AreAgNx1zz6NahtL2Mpxu4AWJYq4rY', 'DytQJUasoq7pXLbWJifBKG2UYLFHus9yHqQzWumSfxuQ', '9wxaJcF9YRpkbBZ2ZbMkpWcYjsoPDwhDXpbHxskAW9gk', '7n9nn22BvdyCpQDwc2edF4FWNgBj47TCQPMvVvsyoQEF', '2CDrBm4inc9RaSkQbt3CYXFBTmzk7axuCThXq2w3rx73', '99i491Da16ToszUmXUTjdRCHKeRL5TtrRnZicVh2WFbQ', 'CMk6N9X7YqUqkuMHnzJfUjXWuTm12e5CaXcuordoxzvW', 'GkCAMtXxnae39vAZ22J7wR1A9e9YoH6NRkK7cYDLSnNs', 'exraesNFKyJpjaEqEUYAQZV9FuNGB3BaHRoRXACELE7', '7hgDy9iYNFWe3gCrQsQQen8ApzetbRom5VqUDoCy12xA', '9CnkQe9i3UnyugqQAb8pfTvumwyboYz65vMPT1xEVKns', 'Er6CGYZ3rqMKf7tgMUmCFa7LNqK5J67UBmLbjxGrw9ov', 'MWHi6uLAB6ykTqMPe7FwkaCBRy39wE2wDfHrwKxtGBQ', '3keMQ5HHLtdXHzDvR5mTcEcpZiS3QxcdtZrhWmf76swa', '9BNofyxxMQ9YxLEMPjaeuWBHWsHfN7nC6vjZCq39fZbq', '2cKd1dAwDTDrhtMpXZrpF9b3wskvYnkWyDMpeLriG6PK', '48K4upph7sxFf6WPFSufA4ewYTq5FTmg9ca4NgELPvT6', '2dQT5ukGcWneTna5DfkgBW8aPsapBdN1jbZkt4Buw3ZB', '4FQEf25SuKkyLQV7BeeSs9JNsAUtymcKAcgQ7GTARJrW', '85xyBkHY8fjCdxr4f1ZGztHkcuTXoXLYJeZYiVah2vt8', 'C1urqczVRoQKjgYZFqv9arYsyRbJpxoCjhv6kgETM3DQ', 'EVyN9hCmoUg8FQrV7V7XvjhS9uqVmTd95tnooZWrsAJR', 'EwYU1S3QtQHJsLKsJQMH5dGRW9JafgEkx4fFr8MVwJ4A', 'F7mcMxnHKSyG8Ka3K6i8ruxpcjrRarCgwmjbCLwnruvU', 'Bd3MRR5vbhDGqu5YYWVkaxV6jCLrsD5dfoZTkBVDTuPi', 'wbdB1yFvne6RpZNGE51TqUwLcX7FPUCaoWn83qoSngc', 'CBFmnv2mupnf3wipTfoHs5nJyhKiFGog4HckyVW4V89a', '4MGMJp8dDyvmRYnbTVdHHC5v6huLhfXRr5kjCZLtpLzv', 'CjJ9tnu3TFDnUcuN3krHWSSkNCipW8PgFZoZLMhuYXMP', 'GWAgyviqMDVt3p8cigo4VS1JgqbtLCfbT1g3v8zFyGPw', 'CW4ad4gMbXByPPjTovMicqaup3Q6XX8BTviJ31FD7i4Z', 'EPUJeToht7dtCQ2VQDVAo4umXbVgq2odpuEkozQpMQAa', 'HajpbSe3ZCqmHx6ursBhkSSMecqUu85o4qDvyUZWDHUm', '2crGpRUYFP1jVLFXvjegFJ3aWPzBznJtcUpRMGtdhagS', 'EVyN9hCmoUg8FQrV7V7XvjhS9uqVmTd95tnooZWrsAJR', '4g9hWBuW4S41P7HPbjs7CwiA1WUxK4pkyX2UtQsWVHor', 'FfGZiE11Cp4114hPGQDA3en6GzYQ8E22DP6Gion16UB2', 'wg5G87HFLtG5wKX8aPPfm1DhrfwqRzvxw27NpbjrMC6', 'EhoYnRraq3b2X3ny8YqgvAWYzg5wj2eJKFdMgeSdyeW6', 'CM6PPsSe9rQDY1Ym32mU2LjWxY9AGeT5AAzCoCsG4ora', 'ABtywC4qMfAknQGhkVDdqTnNu1t7zVeY3PSLKiVttM5S', 'xJn1PpjogWgDRGY4Gr25fVZT89mpeW27RLsirjdtviW', '3HrVQyek1zqB3NhUgkiNpVK5UnwGhgDaWQDoUgdapKt2', '39EneUMe6Af9nxYQQhYZhCv5WkQfkiGmFiX37KeyQkQ3', 'EiDGsjAPULGFtHS2FFPMednPRw7kFUZzEZDECbsZxqeE', '85xyBkHY8fjCdxr4f1ZGztHkcuTXoXLYJeZYiVah2vt8', '2crGpRUYFP1jVLFXvjegFJ3aWPzBznJtcUpRMGtdhagS', 'EVyN9hCmoUg8FQrV7V7XvjhS9uqVmTd95tnooZWrsAJR', 'HisYyFzSqmxN83KwJ8L2ZKZLuiSKXfQw5pVg5WvTbHSX', '8fSEU2B5enVMKYYhA51FFVS8NLK4H9hWDRXbexMqTNW6', '4CfB1U34XrSLgJjhafWUEhPbtesGajEN5yQhPuyth2cx', '12W6PVUZyNWqy9yPn3HjeScgnYqiJQB5XY3vmSbDdKMK', '2j6Pv3GctMTDyiTHLeR85GCZBnjXnRJRGKDy8jxMckTk', 'GWJSUoZGuMAHZBpEhhdRz9uxTM61SwWwdpwHWNjaLghm', 'Fx6jwMCtfnYYj4j9UxEvtvg3ceMA5wFhFkyXrzfHbzy5', '9CKa5B7BuYaWDszp9B2fwvwFbRzucPWcDCSfTYdqmukt', 'EJqZPqkEGgCTmaej3LjoYRWCgA7kHnLEHHxw8RCV4onz', 'DQH2GuiZXYrgATQQZFsTnRUaTLDtykFBBsCKLRQwCXk9', 'GnniPaU87qqdfUEEktW28uJZmqRdPqq4T3Qbg3xJ9AQT', 'AXHPGK4ZKqAx4XhxEPWCE1xw225i6oimdyJZc3HSdcRf', '58hBQPJqjLQ5qJnJqjjiWE2Pm8LTrVhJjBfCKE3ZVYTM', '58hChDh7AVTxGmnTXKrqhuHBXUkBUNGF68uwEHvjfz3C', 'GALTA6ZUE67QNRvdqYSMeu3wVTFxaYHPoa3VCTBxdhD4', '5FYVgr4a5WVsFd7Z3hBtoNBzJeoh57tBqSwkNhfSvquw', 'DSMZXtEMm5zcvxHRg6K1wufH2e2PDUYb32XYaLqChDMW', '4MPqLbrqSKWZn1xaQ6xv4qryuLbgq6SBu45CuHnaBebh', 'DwnEg8tEL9XG1ZDYuamb8BryRFkQHggWhqXwBknwk8Kz', 'EXaGFKPKavYZp1iibUn66yw9icnBTANqdwPEFcfz8JfN', '9o5L7MsTDJsra1RCH7N6yyTLBhusfNryC73j4mHXXcej', '4pMQ8aCWgU5cLhyosMCvoqND7fZjxqqES4ZbxizcKjSy', '4GezMAEKhMzGrW4VtgHPmpzoApu7ZVBgHfubpmfuAixQ', '23rFFegKPxcq2QAZGP5uXW4sVVRoPM3AitT4Tt7veEMH', '7z3YSe4qbBzBzuG6ACkncvLqcnkjFmzNBLumq389ZHYA', '8tMpSTi2Abnpwu27hDY5d8zmtEZoTAM3Xus58NQMMJMB', 'BJDj9KFYo5eUbrrrQGpjboEPf45RfDRZY7vuEZ6hPkdP', 'BAcrJWHrifNPpUB2mppXVByS9fraH6kfZC8REfqjQqZm', 'CyeQy7eJVpSXso7ofdhGxMguQTjFamPjtbvcsjzJ92q', '58hBQPJqjLQ5qJnJqjjiWE2Pm8LTrVhJjBfCKE3ZVYTM', '6u6zFNo1kFaJqzC6RBputkZQLnw1ZC8Ao5uK8N1doHXv', 'DGMED2QZr4hjWRsVRe4AW8j7e1YhBXtK7xHWYmFz3KFX', 'Fs1WDEJ2R7hrFaGyrgp54vqLknzxt4NzkSKRq8GejmpF', '97Rx2gv3pKacwPR4AkGEzxQ2CCRCWcPpczScLm4objNL', 'BTuJGEWegxyDA4Jb2QW3Wqmoc86PTQoLyyfYkazD8BJf', 'GG7YeoXxLDdF3XDHaXtwCUUAnW3d96pEatQySFrkEE6s', 'GarJwAdQxFUFWYSeJKu6nTnKsLEw5xXEzDGpcRK6P3ni', '6ys67Fcapm9gKDapa9tD3jcycMsuKzfVVbttRBF6aJRy', 'HgAb71wAEYyQxPv92kZ27pvdaguHMhARgXk8Z5guZmD6', '2zTU1nZ7NZWEH2FYV3wfNuuutrLcieDyvNCTBr77iA5q', '43E5UJW3gLDbnpr62LSRvMWtJYWAqYLwDFTGAUJH276a', '6PhAgop4SoQ2r4j5DF5jQ6JBoYoUCzhadgfQynLCmFyz', '7misxpFLVQoUJnG8hm5pg5uj9WY5soQ4YRjqWQSTiMe3', '2vRpWyrssmKohguTaWpXJb6Hh3fA1HENwXCJiMDcinL7', '67JKJKzXfcxBuHggachqbtRriMYLLKtq7DheCvHb6koG', '7r8xHFGS7KNGHVSXqkavXoLUoQDYywMbseXbxf2fiAkL', '5jzx4sveSspKKwwG5tSC15PEb7TBx7pjryrU9hiTF8zo', '5ed4utEtp8m1RBwyP4g2fbc5N8ecJdiyNZ5Fu9cHVRJ8', '3QhAX8bwiAzafyxtTc5UocAkePn9xQvXCWo4XN7d2kGD', '9jbAyRXJpLkFCf3MCMJT5a6x7YhFGeWeFH369SjJyBxH', 'A5KnbY3hEHEmnkG19wLBi1zbR3fCkcSnaXNhtydmBwYp', 'H2x4mEx8Yba98eGWzHMhcDZ9tGxjRN98M3LKVfx6zPo', 'Ajfiaa5Kb1phTshYLScD9aFmmd3bCZLPZVpEasRXqnnU', '5P9MnxnfFJQnqHSUBLnMdEPkcDtiADHQQfZXJCL9PvyS', '5VywifDnpTHYMVUHjpPqV5Ht4mS53iVXkqMn1AcCxfUP', '69osWdwJoAwLbuEJ838hSjARdsYDHcg2Uukbd8UyvwF3', '8u54H5yEaMSno647eifKs5hTc37Mmzz46gYvmBmyBPzD', 'ELZyTcVxqj8B2K7aXSBYJba6UwnU85Cyb9aNucFJJ7wA', '6NnTQFbZTcVwhNvfX7mdHhQQDuxJSU7YLSEj6ozUcL2o', 'B3aU2Awcn95hZPWj7AsNZCZ8kk4BNqMa5r37AjSyRnYd', 'EVksp51D2wzJgq7W3jtHrfDgetJ1dcwSwHTyUtf9x8aG', '8DaZ6k6H4NJWofjXmt8kaBpkJjjdr5YoRv1ZxvPFSZwK', 'CtM5dDKwsRVTvi1wZaV5gWMUATnX1tuuGp2DaJ4PXAi5', 'AXZPaKxJqkPgPLKx5n12HNtWw1vpiKP38crtQQZfXhKK', 'H4pkAUncR5AFHeSbJ55SUWeLUdLxebJ7N7PKXhxSvmNT', '4jMXgKJHZFLw8XzUiDKa6rboWBBzhbNWSjuLEWV1bvNT', 'BDhfG3ZxemJcLe5PjbHHj7MNsvHWXh5eUdaFKDUiBvAw', '65zuMnox82FoazB1N4reAyPfTQE7ChAMHzS8NG4Rm37D']
10 ['5kYEqKVqfrcFJp2iWzeXxsCSkHCqw7Q4whu6GrRz3uzT', 'Ggf3f2ktDwNLd7FNee9gd69Y66PSapLGAFnkjP2Ygjef', 'DZjrP1TsiZiWkZGLD9VrxFce45fpveCnAEyJwmkAjisT', 'CDWWYPz5ia3T2LvFbSACefyzpojGadbUe83sXcymsQNJ', '7weGjcd2dyHtxpmTUG2AGLeY3JZXd3hdLNQgS9pBcnM6', 'Gujac3ihn6DTeSKV57Bf4v33XGYd6VZ1D2x7N2FCnfUm', 'GnEAfeSvACmZ3YAoWyFrqRtLiaBB6z3n4KK6sYUv7KD7', 'A4BDf2TPFuvP7hz4wiq52DygdRRLkB3pu5htt41XzQLM', 'FHf1SCuxaWhhvK5jNWz4ZU2GM2pWQYJdT2tkmzMdqdiA', 'BmmyJGuqmZV5y9ZcXgK2GkbgweaeZAeR43596ZDMP66M', 'ChrrnRxQhzr9yzDWqsqRwwUxRbzutZDPcyoiTkfShqrJ', 'EyCW9Vu1XPtTmMES5WcwspWRP16GMDb8vYpR1JNHQvpm', 'EZDG32TbJpG1ivXmPVHAyi3ZLjds1k75K3joGaY1AXZF', '4L6ZcDfKibBGpjArLYVy9WrAk4hAuLBk6F4qvd4nSMyJ', 'EinK3jmumoZBziZtBCyMuSXn994YPd4F2bJ9BYoHdsBQ', 'CMkRjBPvKv1Xt3FxYJHRBHwpRJ6SxNv64EJNvdmRzNSq', 'CLwQQRt9tMMij843C4UttzfaieuSVtQZsmrZFnhsqU6o', 'GnJfxCVngfEuwRVLrTgb2FsiA5yjWMsQHEKeuG27csHt', 'DCvvSXYCfrvvyV5VSQSmFNntiXoUAjmwRvgfY41C1Eif', 'H6ZsLzwqkCFuB4fMTLHPPhfV2Zo59Sqv6gTaGwg7App3', '4eyFbr4PzXotACP6BbBYSy9bnCjsjxfY3PcZY4aXBvuD', 'EkGdQnBN9woCeTF8ig6gkFE4sEBvaPrEGJkGBKMnWWTG', '73A2ArhkHsr6MjnP7YyF4m6Js7FduyX8etfWrDRxpjDd', 'DoQnLNMYnSLgW5DhJtiqq38h52bcSiLLC8auAguSbuhb', 'AnnD9UcTCujjXCSUKHbRjMfwKJM8CTVGK9ZHXUudLDYa', '9KQAausvMzZ5673HzZbqYGJk6fHHEjReQkc1bv3gHeSn', '5fjXTCXGr4G3GPHi16MiC6ZEXt8DTd4fyRpsACPVwNo3', 'GiNUPpkdGaR6fd8opRrERLYXsMHMEdevMnxQHfxHdFii', '9PW8KY6Qc4dWD7RwSyZhCtsEj39cs2WMMoVBoL8sZgHW', 'BNNsPkcnZXcM7SsoQaaJ4HZFnWLoWFZKAbf56FiX15SH', '3ZYfkJTBevY5mqWvoLoBP6LdMPu4nPE7tveG5LvCtz7o', '5ETN9qpGcoCTcaGKWpPnR3pYTE8ScgvLaPVbZ6Fpxbop', 'FUkdB9EnAuKT1RV6HrdMhUb4NWiMz4YH5uUZtDth5zNa', 'CTBMvQpM4qePGN1etFTpDiwbRYCtQhMfwP8JiBYSV9um', 'GP61Ht2ukk96N9q7mzJxjjrhnivjjBGoHF4YDuhPhzgP', '2xEiZYB7GqdMNKJzx4aBBUpBoZfap7Gt1vF4iRV5PGhL', '4L6ZcDfKibBGpjArLYVy9WrAk4hAuLBk6F4qvd4nSMyJ', 'eCnPZpfXgA59iDVV76BkDycGeWezmYrZ7JXXH275v6K', '6t4qjK4LYVdgw59NYRSRKGd4T4uvNYLC5VMpUXY3z86k', 'EsZayZVcuA5BmwkpPVghF6TwASbmf72vG4PwidEf3qx1', 'ESR1UCxtmSD1X6eebg33ikGtDjLvdN8UwH3q8h9BNHCY', '89vq2NpsqnVrbZnfLRNSHV2a48no9npcWmmSNA3C3Kcf', 'C3yB7EK1XCX1pgZwqQZjqQRQ8Kj5xfiYWs1kFJaRgSci', 'H78Ci4EKiP7uumY8yP54kgAWjHTRvbmb2f4WehH5Jsf8', '6i5iUSSaszNkbZ3z3JpyhgQ1vMQsNA5kn4fXyFUS53XH', '2itJHLfpWmwyz1MpdX71yNX8eZgHazG1643RuXjeSY2n', '7s1m2YYuxfwxZm4KN8Nnzdds4HnF9FFL47bo71ukikqd', '2DEpChGEiYnxrdGJU4n21XesJs1Q9VU4Q8QDTrLxLnUJ', 'CL4GtX1dr5WkxHAcD9PqgzXCgFuncib2TxUoTU2L4XVB', '6VreXm8TJUB1dDNZqW9zwo19GSy83QuCRvDXwAuMts6M', 'Fe8EaTUQGhJgUFiJmghUGtTpzbHqe6sNgiMAX4GSTVHy', '7dqYcsZveVfkyTjqFHoafPQoG9qRdH1Z1MQRn9HwZteW', 'Hk77grob4Wk4MHFCYG86wzEdjtLxa5AyqssYxKj5woww', 'BwoGuchkRWtNcfEfJNkMi676pziXjfqhZBtQrBqcfc8q', 'GnWDJS6Gyr94gdv9KKX8WJUmDpDmxj1P45HzxEoL3HQm', 'E5DhX8pxdUNC4xKWKuS2WtmWn1L7WBwryo9HQ2TA8quv', 'EinK3jmumoZBziZtBCyMuSXn994YPd4F2bJ9BYoHdsBQ', 'CMkRjBPvKv1Xt3FxYJHRBHwpRJ6SxNv64EJNvdmRzNSq', 'DCvvSXYCfrvvyV5VSQSmFNntiXoUAjmwRvgfY41C1Eif', 'B5k2VFdXyLh8bssntUe9gbhQVou2EaMHfptdr8DpnS5w', '5nTGNWfzKdYyqmwyRSVyoSNgq5WNqi2zKa1WKBi3ubXs', '7Z6dRBi31kFnqiHMMMb8QQxtsrY9oN5dZyXo6xwTrC1k', '7U45qMKRfE4DEbzre65FSd3dudmneq1h44LxpMoTLFsq', 'H8EhNbSV9W6pkrh4EGyA8rE5xwjVpsHLKHQBdXuLPKA3', 'F94q1ERB6tHyL2Cvt6E8TCf3KNcCzQbPmtL3XUhddpTc', 'CLwQQRt9tMMij843C4UttzfaieuSVtQZsmrZFnhsqU6o', 'GnJfxCVngfEuwRVLrTgb2FsiA5yjWMsQHEKeuG27csHt', 'H6ZsLzwqkCFuB4fMTLHPPhfV2Zo59Sqv6gTaGwg7App3', '6GsSP3p3JxTNKZ8dHtbYw6MyKrebR13FL2dZjRSkniam', '7Z46mpB84suuqRPQFxU8cfrSamGmcUMSrA8eAwA15qXy', '2krqz8X6aW1dYzTBS9cH2Q6yQAzFNGvt4Z56Ybk6VW1H', '9QmdjiF5hDpgKeGvfUoufUx3yw8dQXhKz1ksn6Yh38f', 'EyjVC26qqHvj94SJknDmhtkBv6bbz9ZqY6yCe515WCbe', 'Dp9hRD9iS9popeJEumEs284kv8eiTMWaMDgDxKkwPZvp', 'AYqoSivhfqe3JXh8a19izzU9i4HypdyCcKdLpkwQqgS6', '4eyFbr4PzXotACP6BbBYSy9bnCjsjxfY3PcZY4aXBvuD', 'BYCRjUQvQQstWc3BC5mjNFT6KzypPrDWSt4QD7xaL9yN', 'JDeT7Jf1oB4hUgHZdFP7bJFPQkHEaV11BmTCMyAHCA9D', '2c5G5hxgAgdPbJbNL2RiQti2Q69r6YusNcnLsWJDBQ52', '9RXaY1Po6an53iLgwQnwMtcTjQp1e14mxpYa6mbtdjrM', '6HKyEy6w2dswGkmBn645MCnypeECgznFMANC5pHRSLDQ', 'G96fBbYZL9cZ9nqSrtzcqCQJbSiiXD2ekBt9E2A7YjTD', 'EFWr3DxAU16jnVfUTAn23YbBkNz3jVFmQp41YbVFRye9', 'AP5UxfLkXwksaGJcZLEWAoJUqQ84CT5HdvYP3QY9RsMX', 'FRcA5WAgwXbiUAjfiaSeyCZovnAicq4yDeLn5SsGwfuv', 'HAEqC9JGaEMG3Bxy6Wcya8Baz6e86hhaYX7z49XjmoZX', '5kYEqKVqfrcFJp2iWzeXxsCSkHCqw7Q4whu6GrRz3uzT', 'CcomifE7J2uJBysEgqXx6NYm2c3zHcr6UQpR8d84XZ9R', '7weGjcd2dyHtxpmTUG2AGLeY3JZXd3hdLNQgS9pBcnM6', 'Gujac3ihn6DTeSKV57Bf4v33XGYd6VZ1D2x7N2FCnfUm', 'GnEAfeSvACmZ3YAoWyFrqRtLiaBB6z3n4KK6sYUv7KD7', 'A4BDf2TPFuvP7hz4wiq52DygdRRLkB3pu5htt41XzQLM', 'FHf1SCuxaWhhvK5jNWz4ZU2GM2pWQYJdT2tkmzMdqdiA', 'BmmyJGuqmZV5y9ZcXgK2GkbgweaeZAeR43596ZDMP66M', '5mDjrMv8djEFUiJ4TWGgh58yf56yCuVrkVXP6wXwaU6Y', 'ChrrnRxQhzr9yzDWqsqRwwUxRbzutZDPcyoiTkfShqrJ', '7rUa5kTnNzQMWCQ4aYoMEWrxVSoFJxLjmUzjgMuUPATX', 'GnJfxCVngfEuwRVLrTgb2FsiA5yjWMsQHEKeuG27csHt', 'DCvvSXYCfrvvyV5VSQSmFNntiXoUAjmwRvgfY41C1Eif', 'H6ZsLzwqkCFuB4fMTLHPPhfV2Zo59Sqv6gTaGwg7App3', '4eyFbr4PzXotACP6BbBYSy9bnCjsjxfY3PcZY4aXBvuD', 'CJrZyCEz1JZZoHXoq5YFdDCB9JHxkGHhZX6uy7ZqPdbm', 'J8AWSezEmBgHYrYs9HyUQ8nYpVBB999Anj8MYjM9WjfX', '73A2ArhkHsr6MjnP7YyF4m6Js7FduyX8etfWrDRxpjDd', 'GpJCXHUfk2g5fXSaHHJiu6S1AfvPBrCKxyis5b2g2Nsw', 'B2m56YmFruAzBpr5Ry98ibAtHUvxNBpeNuQr7tHsR5Dx', 'GiNUPpkdGaR6fd8opRrERLYXsMHMEdevMnxQHfxHdFii', '9PW8KY6Qc4dWD7RwSyZhCtsEj39cs2WMMoVBoL8sZgHW', '97EbTPz4omvmHGkfzZjifqfQT7SF3CY5pJMMd8QDq1HN', 'FXhehPq4FK4u4AjfdMt6AepZKn5HAJK44rsGsKffkU2X', 'HT2YgG2QzcUvrpTkW2jtYvBd5kKr2GRyeSiXF97SAhza', '3ZYfkJTBevY5mqWvoLoBP6LdMPu4nPE7tveG5LvCtz7o', '5ETN9qpGcoCTcaGKWpPnR3pYTE8ScgvLaPVbZ6Fpxbop', 'GfcUagd4Toab3pDWxMUyE9T9dHH2fMSL5FtBkiN5ZhL3', '9Hf9LNbpanJy5vRowSbwyeThEvmDdEJMmpT4qxuKrriV', 'rNZUp3BiiwZmXg2FgxSYWiSbsK85nVMtcfjUZWnziAb', '5vhEEg8Tz1bT8mfvmFeSVHCYsgSRJneYxbkJFEAnWXAk', 'eCnPZpfXgA59iDVV76BkDycGeWezmYrZ7JXXH275v6K', '5c1dysFnJFqJpFUtWs4Kjr663xRDi8sNUTqkcGdNcczA', '9taZqsRnXtQYZBYg7m8Zy89PDxJvFMeykhNdhv1xcYWi', 'AfCA3cBD4vhkqfRVwb6ZvcaFtSHmgtfuM6QUXCnb53KV', '9zQsjb9FxJ5tofsZYoX7rteBYu9bsXas1LNGQ2583zCP', '6ehd7N7aGg3PxfhGazw6Do53bJnwZPTCLYQruvbeLUrH', '8mMMiD2jijpCgNNCcEExXWm8UHR6HdVAKXYz48UpnFRQ', 'CttvgEpZ6s4wa6DTgZmT5coK27P8uoYz38seyaoKJvvo', '8P6MSapsiinU5nZun4sXt2s12mbgRhHe4pEUx4iQvhz2', 'CJrZyCEz1JZZoHXoq5YFdDCB9JHxkGHhZX6uy7ZqPdbm', '4BJvqqXR85Xmu9a1wHfekvNd7yvGyKaiA15Lr6WKos2s', '3jDTR95fpAa1SZ1kDjETr45iy3iaXhfdgcX95XVha4Gu', 'FpTCRWMtxmjvowPiAhkfWU9AD2u6yfdueHW9KNeDBAfX', 'ERMzpCgKTfT9zYyyTi5YSXw9419mT4J2CXXwdN4b1mkP', 'AjZrobCLSQqjbwbeGjBX8Jgksf3CyoieQpEwZYHnHMj4', 'CY9vDKmMfTfRXc2SgbcduBguoeXR4dbz986omkvTPpRW', '98TGStt5aSML5A37MDkwifQRqUibt3E8wkKgadnqjdXK', '7k2DuatzTMX3tQdm9fJGenPqe49KD8Dh3h83TTwt7bkY', 'A4VcgfhnXSNkgBC2RegiXaUWRyy7VgnGXNV3f3kpg4Mo', 'DCvvSXYCfrvvyV5VSQSmFNntiXoUAjmwRvgfY41C1Eif', 'B5k2VFdXyLh8bssntUe9gbhQVou2EaMHfptdr8DpnS5w', '5nTGNWfzKdYyqmwyRSVyoSNgq5WNqi2zKa1WKBi3ubXs', '7Z6dRBi31kFnqiHMMMb8QQxtsrY9oN5dZyXo6xwTrC1k', '79kTSYvLn5QjcdbX5mk26pHeXEurr5Df5HSEfronv9kF', '7U45qMKRfE4DEbzre65FSd3dudmneq1h44LxpMoTLFsq', 'GnJfxCVngfEuwRVLrTgb2FsiA5yjWMsQHEKeuG27csHt', 'H6ZsLzwqkCFuB4fMTLHPPhfV2Zo59Sqv6gTaGwg7App3', '6GsSP3p3JxTNKZ8dHtbYw6MyKrebR13FL2dZjRSkniam', '7Z46mpB84suuqRPQFxU8cfrSamGmcUMSrA8eAwA15qXy', '2krqz8X6aW1dYzTBS9cH2Q6yQAzFNGvt4Z56Ybk6VW1H', 'AkkmwV6UBrG9MxqxCrRQUd2b5FytCd4zfo72BZCEvxQg', 'G2GaCdtRp4EoVuMRpGYpkp9LGHnWVqtay5wZTiJ4sVmA', 'DFtmMUb7KuiEQnEDkZaVuCaGVpgo9hCqrR5viTLEQ58E', '9W4A1ncr5Pe8fKEyZUcreF7cLPKHUxBKVpsLgds5cQ1L', 'BYCRjUQvQQstWc3BC5mjNFT6KzypPrDWSt4QD7xaL9yN', 'AAZMAPAJw6JCmMm3CLWgnuiAW5HiDE7LkoFSy924CZa5', 'AP5UxfLkXwksaGJcZLEWAoJUqQ84CT5HdvYP3QY9RsMX', '9ufMHVfuhn66GAYbAYu77hjwbczfaWXDYLdQsLS5w9oH', '5mDjrMv8djEFUiJ4TWGgh58yf56yCuVrkVXP6wXwaU6Y', 'CDWWYPz5ia3T2LvFbSACefyzpojGadbUe83sXcymsQNJ', '7weGjcd2dyHtxpmTUG2AGLeY3JZXd3hdLNQgS9pBcnM6', 'Gujac3ihn6DTeSKV57Bf4v33XGYd6VZ1D2x7N2FCnfUm', 'FHf1SCuxaWhhvK5jNWz4ZU2GM2pWQYJdT2tkmzMdqdiA', 'BmmyJGuqmZV5y9ZcXgK2GkbgweaeZAeR43596ZDMP66M', 'Db7cQh5M5qdfwCA6nSf5ssJPpGoaZcUX2onZ9ymFfP6S', 'GpeJNbxbmE5VaQGk9ucqKvonzgLyc2uuVRCXuRUGQ52V', 'H6dkZhAe5p1XkzQsk4MM2JjZvvPwWY2GpRFwAv5j1MMU', '7S6mFtCR6khFachHKxi84xvoZZPHGbQf15ny9i3gVDm', 'GVST932cD69DvNM7D5QUFxfTcxjyR4VT35AnNdyHnTrz', 'EyCW9Vu1XPtTmMES5WcwspWRP16GMDb8vYpR1JNHQvpm', '79jDZ8o742Yp3gs4nK1yRE1SqGU9MAMSZrS3Fd16c7FJ', '9eZanbdj9RCYF4U1wqqBYVNWeF1RKjXB62LkYnCizWjL', 'EinK3jmumoZBziZtBCyMuSXn994YPd4F2bJ9BYoHdsBQ', 'CMkRjBPvKv1Xt3FxYJHRBHwpRJ6SxNv64EJNvdmRzNSq', 'B5k2VFdXyLh8bssntUe9gbhQVou2EaMHfptdr8DpnS5w', '9QmdjiF5hDpgKeGvfUoufUx3yw8dQXhKz1ksn6Yh38f', 'Dp9hRD9iS9popeJEumEs284kv8eiTMWaMDgDxKkwPZvp', 'G2GaCdtRp4EoVuMRpGYpkp9LGHnWVqtay5wZTiJ4sVmA', 'DFtmMUb7KuiEQnEDkZaVuCaGVpgo9hCqrR5viTLEQ58E', 'Hs4UCJdQcXJQmwyTMWow5ytMvEQhu9ZXDZ17TF8Xtw5E', 'B2gm9yzBL5XK6Gaz4yY7VzbWbpqwQT8EBg4zKSjty3EG', '6z5UpfSvf7UrJDVEK3FtvM2SjMFQkoxSWtH4ZKKPRjrW', 'AjZrobCLSQqjbwbeGjBX8Jgksf3CyoieQpEwZYHnHMj4', 'FuD1JmdXomsxkBS4pmzXDgrTfoM9XXpt9GU7Zm9xM55K', 'CjymTMX1xsJUwHF6D2xvNTdJAfSGk5eSXuejgt8wKoVs', 'C3Lq1xJWCv1ymTD9bWcb4dAppRPmQZdmTTVwiCrVvBEB', 'M4kXUCxvwqpLpi6bUahkkUGYzX6eaAXMZ77cgFukNiH', '7mVoWB9aJXUqHKPwgDZDx63UrnDmRFvW5n2te6C9HXPP', '95hjLqiZajwgq1GCfjGHzvtE5gKumoHx6e22W1J4fthK', 'WUbP34jFSw8C58C7jCLjA4QZkd8YL6wiB11vGGaSzMF', 'D1CgVKYdxQiHoHs73bbY9Z4GK4183Vi9QAbEG1UiGBC4', 'FX5KX3NFnP4huqXLEdZDkzQa44b9FgrNGc3PvdT3E1AD', '7U45qMKRfE4DEbzre65FSd3dudmneq1h44LxpMoTLFsq', 'H8EhNbSV9W6pkrh4EGyA8rE5xwjVpsHLKHQBdXuLPKA3', '4UEpZFHX5wvxXpfWxcyqGZt6TWzHiHv56ci6HDJcfyyG', '9iveazmjBHasDCyWjv3VGHxoFCTVm2hMucfRqBmNwVEh', '69yJGrMMHjLKGgY4sNkPVG6WYkRavstQtH9P2sro3djF', 'BkfCwCS1dopwqLEjj5eKPhNLS73XvS1VAzmNDXLEFJFb', 'BkJDMRMwZ5zfsF5i2Ugt4FXyDRjKb5xqvUXQy4pjB2zL', '6GsSP3p3JxTNKZ8dHtbYw6MyKrebR13FL2dZjRSkniam', '7Z46mpB84suuqRPQFxU8cfrSamGmcUMSrA8eAwA15qXy', '9QmdjiF5hDpgKeGvfUoufUx3yw8dQXhKz1ksn6Yh38f', 'Dp9hRD9iS9popeJEumEs284kv8eiTMWaMDgDxKkwPZvp', 'G2GaCdtRp4EoVuMRpGYpkp9LGHnWVqtay5wZTiJ4sVmA', 'DFtmMUb7KuiEQnEDkZaVuCaGVpgo9hCqrR5viTLEQ58E', 'Hs4UCJdQcXJQmwyTMWow5ytMvEQhu9ZXDZ17TF8Xtw5E', 'WLBzAEWikmF8Tfc7MqNGjdwkVtqD9vLCuwXrQfZ9JX1', '47ifF538fR1hRUpHau3cGW6LKKvM92RrYSumoWzz8CEZ', 'BYCRjUQvQQstWc3BC5mjNFT6KzypPrDWSt4QD7xaL9yN', '6HKyEy6w2dswGkmBn645MCnypeECgznFMANC5pHRSLDQ', '9ufMHVfuhn66GAYbAYu77hjwbczfaWXDYLdQsLS5w9oH', 'FRcA5WAgwXbiUAjfiaSeyCZovnAicq4yDeLn5SsGwfuv', '6SMUWEn7TuK3PVsrfk4rcgSJE7FMuX16wBQQfn6avim', '51DW6Ei8Ei3jcjupmm4yznainGFWxs4pMauZFYGj8fHo', '588F61xSTcVMRAareK4LQBgxgSNdYYZre5w1S5oy383n', '9N9v6phq1qzpbSv2UR19NDyvqvCQQAMwwp9617xMKwAR', '6gAqRAqdgc69dWVkopNZH2mEpgidZZWp9og54KVUkZJJ', 'CxXGmST5mBanaKGKJ2e8juer4eb1Bv3TjhNeJUr7UD8G', 'CDWWYPz5ia3T2LvFbSACefyzpojGadbUe83sXcymsQNJ', '75KkPs4CHTpTr7zpX4bRgCuPmhhBHdJaCBmoYfyaqWsL', 'AqHMu4ssdKYvG9Uo9KaUbK8xnGjZm8FY7nNSErXWGtRL', '5pE1qaUJLicwWPbYsZF8LdEKEQ7hnj4mNMoKQY8TA9D6', '3aTBHcoBDZ8Bq1Hg3c6xyVHkzpx92YzT17SzGiX3KHaV', 'EYn9uQ2m57jtU9ZcGsBXdzz7bxkYKQLgSFVe3XvB21vM', '6gAqRAqdgc69dWVkopNZH2mEpgidZZWp9og54KVUkZJJ', 'EyCW9Vu1XPtTmMES5WcwspWRP16GMDb8vYpR1JNHQvpm', '8HYsH95dLyHrPxDZauqokV94TMpGvZReKKhe9FYASQd6', '5pE1qaUJLicwWPbYsZF8LdEKEQ7hnj4mNMoKQY8TA9D6', '9QmdjiF5hDpgKeGvfUoufUx3yw8dQXhKz1ksn6Yh38f', 'DFtmMUb7KuiEQnEDkZaVuCaGVpgo9hCqrR5viTLEQ58E', '7Kxm61hfejNp9Z7wSyaaxZKeZpsRzBGkoqbZz1fBxQ3n', 'BYCRjUQvQQstWc3BC5mjNFT6KzypPrDWSt4QD7xaL9yN', '47ifF538fR1hRUpHau3cGW6LKKvM92RrYSumoWzz8CEZ', 'FnGsMjtjF8dL4HE8UvHviyieeVmM2KUPeBfL8QtyXkkS', 'AfGiDdHt5AC6DUw9qphrZe6ZAdxUz4sWfmj7P8e9qEmX', 'GYNA9xJkmDd8N5FaKTDVhKvNhB6v2WqtDdk1zTuw96b8', 'GfcUagd4Toab3pDWxMUyE9T9dHH2fMSL5FtBkiN5ZhL3', '5EY3KBsGQHRfGVKe7AFNZp11wdvbweJGfcC4j2LqvRRp', '7RKLgEuNkduvm3eswmZCrwpoysbi6EUxBUp9MxR6i13v', 'DfCbPoZopWE4ih4VwMFCicvqDhCWVVC6P7pcuiwyLsGg', 'AgXBuET6USvd8GEd6snhbBUzS3xuv1bfyHr21D8ENNab', '8P6MSapsiinU5nZun4sXt2s12mbgRhHe4pEUx4iQvhz2', 'EKuZbJiEKzHQBFHk64ULZcntKaJMvA1rJA9na5FAUQM7', 'FpTCRWMtxmjvowPiAhkfWU9AD2u6yfdueHW9KNeDBAfX', 'HJWTbv1TUPfBM8buZc42E7hRKzRniZKEBtnWwCJcEBdR', '9owrYVVBTKhjCUtdpy2JjWCf7Ek3APNAAKBBgiN4ia2b', '3fLzoYNw2BAyH12bxHHF7TCruQqbNZ9G4XSVTr4ijDRt', '497iY7r4WwuHwWSnYKmhf9sVezoPkEqcz68qtGBchnqE', '8CkMXScX8jXpdqji5JbkU8QTaLtTYuNCu1xDeFnTj8hc', 'DzYEXiZnoADvpuhUPACujojCuA5PAVy1ms9bevgchDfV', 'Aq8RSwGiwEx6ohscqNGtxLE3wvZXCZMCFkgPaeJpd4yY', '6FpbYYgg1vmEc5mf22NYsg3EsCnSKRCGLwJmfuDqjF3R', '8SUBCiYmbQk9BjcgyqruWnDFEdXgAjQLy1WdgLzY5Uff', 'HBF4caJffM3YdW9xxM64uBeJQK4evV8KBqgjeWF46y46', 'oBXQq8MdA9wSmc2UoXUgR756RLx3Z6tQoymQ2DhFgWf', '4ypVS4iT1QU4LfA7RikCYzkmMFZ5L67WjoYZXgBA4Mr9', 'En8NBMRfBAt8FD2dDPdhiCH5npziq3mmp2kTszKMCZG', 'GKtMBZnDNTtpRdofJ3DCaL1cbAmDzdkfbKFQPzHuv82N', 'GNQMJun1u9Lv51eWarRGxFZrHCMiYXFAkSjSXR3XzEFA', '5kZto5i6qL2a8Ks23mPEz4GRwWNxnQ73wbSe4j9Lf1ds', 'EFYRTMA9DPANTax78YvWMThKXrLFK28pFX8En8kSfySK', 'J1oqqJme8KB2km1UdMVfsowSgcxGHLjCNss7xsDPSn1K', '9QmdjiF5hDpgKeGvfUoufUx3yw8dQXhKz1ksn6Yh38f', 'DFtmMUb7KuiEQnEDkZaVuCaGVpgo9hCqrR5viTLEQ58E', '7Kxm61hfejNp9Z7wSyaaxZKeZpsRzBGkoqbZz1fBxQ3n', '47ifF538fR1hRUpHau3cGW6LKKvM92RrYSumoWzz8CEZ', 'FnGsMjtjF8dL4HE8UvHviyieeVmM2KUPeBfL8QtyXkkS', 'AfGiDdHt5AC6DUw9qphrZe6ZAdxUz4sWfmj7P8e9qEmX', 'Gcxyrmy5e6NJwVjf2ySUpCaGtuYawD8tkDCSHjQ15UmA', '5Qrz9rBXEfDmHsYqaS4rkTcLBAHVCz1oNfvvhr5DbcgJ', '6W6oXarNB3U9Z6gcxvAERo8Ztw989xBm3nbRas5PbJqn', 'Fa9fjfzhKQ2MrS7CZ5pXViTF4YRC1gudhBxXBhWzxgCq', '6gAqRAqdgc69dWVkopNZH2mEpgidZZWp9og54KVUkZJJ', 'ByQ1Pf1eZih4qUaJA8BJjWiaDwSPbyYjKNG3RN8XFKRP', '6MziYC6iGqQep56C1JwcU8sAYtrjqa8Efv1bs4Pvxhoo', 'C1iJKreHn2PZXgW1jbZCiDtm22ihEX4YouJuCLg7eC31', '5kYEqKVqfrcFJp2iWzeXxsCSkHCqw7Q4whu6GrRz3uzT', '6GVSvWHrDsLWg3Bjz1MUkhHZwu22z9SuLK9P7Md3iDyp', 'GbFP7mVrjBYdtrikrzDmuX4tciCnrmfBASUVyppv4Ea8', '9wvELzsAw197Q2gKP8oKMKCF4ktoLSGnorzUM1mMrkqY', 'CCGkeLALtLsx9BVpjg4B4HhvQCDPeJA8DwkDtkhxBtMM', '6gAqRAqdgc69dWVkopNZH2mEpgidZZWp9og54KVUkZJJ', 'BukKiQcQGXaHHmSpAoocbmeqrw7b6QoeeZb8YMPABhTb', '9eo8zheG7QepXfieAo353YVFPQoNG5KB6kDARXxa8fpv', 'FUJMbpv4GBJcjDNtGD7ab6gMP9BEZt6Vje2b8NUjgxQU', '3HmgrY1YLB5sETk75zFskouuCbssLZks1WGmhcQHMXFQ', 'B5k2VFdXyLh8bssntUe9gbhQVou2EaMHfptdr8DpnS5w', '1quEnmuwhnSM2hfPQbXcZSXZ8rixzSpff1sVr3yrCob', '5VremuHGxPmTDaeHwbEAx2DsjoVwjYbSs5Zmu5eXWLgP', '9MqtZQ7ZHcNWsEDgPxiGptm77pqfo46JCnwWUHZejMkA', '69835KX9yCPsQVMWWG7Zu1fpTxpxbeTNUZeZB1BNjD7U', '5UgBoSzjjhFWeqE4o6N3XgwphENAP7evvuZ5PFghYNd8', 'FUJMbpv4GBJcjDNtGD7ab6gMP9BEZt6Vje2b8NUjgxQU', 'vCf4mmhmfTBxfSga482prmez7w3h3327DKwpMNaohkH', 'B5k2VFdXyLh8bssntUe9gbhQVou2EaMHfptdr8DpnS5w', 'Hs4UCJdQcXJQmwyTMWow5ytMvEQhu9ZXDZ17TF8Xtw5E', 'H8EhNbSV9W6pkrh4EGyA8rE5xwjVpsHLKHQBdXuLPKA3', 'xgMSrcXibq4pgqUHPbsMy4VKVLXpteJ1b5Fgg9aywA5', '69yJGrMMHjLKGgY4sNkPVG6WYkRavstQtH9P2sro3djF', '6XwkZXvkP95GXvD66AGcRxvU4dsbPHE2caTUW8TENo1b', '9QvmBDjDVWQtctm3w8cquvpSKxwrcruD5626ycVE7BEo', '5ETN9qpGcoCTcaGKWpPnR3pYTE8ScgvLaPVbZ6Fpxbop', 'EsZayZVcuA5BmwkpPVghF6TwASbmf72vG4PwidEf3qx1', 'AjZrobCLSQqjbwbeGjBX8Jgksf3CyoieQpEwZYHnHMj4', '5qi9ZGQuQ3rLkprQfRUNmUm1AFK5LUorj9mep8Jzcutp', 'CaBVSqjhBqWEvpzRbcsCuZ31xigsv7hxrwwFyVfBfGFq', 'CpSCYYJ7zF66qzNXdgSeNBPZ74JsrPWpvbDUMTc4NsRM', '4eHGCMA8LExhDkMFVmFq8XWPZddkNXkBLo5vmihK6fy5', 'GCnHo7mkzT8fS69S3zy6Tf6M77J2SNmz1m1zTNZjbZdy', 'Efee7Mruc4XU5vGMxJrw6ZgHuAXV8gD7mCueL7neF7su', 'FfuXLjQN3XaE55UamrgxKnzRiQt8LhKtp9goRPDQpVM7', 'B5k2VFdXyLh8bssntUe9gbhQVou2EaMHfptdr8DpnS5w', 'H8EhNbSV9W6pkrh4EGyA8rE5xwjVpsHLKHQBdXuLPKA3', '69yJGrMMHjLKGgY4sNkPVG6WYkRavstQtH9P2sro3djF', 'JCJjksdy8XKsFjjqDeHSh3WnkohVaQ4Tz7Uufnyu9Jj3', 'AbebiA73pL6HF4LoSyKmakj2cSxbnj5ghHCtcUy2E5QA', 'GDATQarHLakGzDUA1GGt3QVB33bSWVtzmchy7KwPXGQL', '3cmdxhMiUHcTqFVNqSuJknkHSKw4Hb7GveTKJFR4SU7f', 'F9n6CGVhpnD2wCTTJNJrB1j1SphcYg2XwpwrfRbqvqo4', 'Fuf9xNxFuRzZviXEPGKHnakLvxALtzXfhzVx1HbTr4Ci', 'J1AVx77hioWweQS5VcYpQ335smqV192DcSByeViZvU5p', 'Hs4UCJdQcXJQmwyTMWow5ytMvEQhu9ZXDZ17TF8Xtw5E', 'xgMSrcXibq4pgqUHPbsMy4VKVLXpteJ1b5Fgg9aywA5', '6XwkZXvkP95GXvD66AGcRxvU4dsbPHE2caTUW8TENo1b', 'AfGiDdHt5AC6DUw9qphrZe6ZAdxUz4sWfmj7P8e9qEmX', '9QvmBDjDVWQtctm3w8cquvpSKxwrcruD5626ycVE7BEo', 'P8EtXYkUbC5yYR7v8apaoCN2g9E73L29VdgHkdgYWTx', '9yC3yTHSUpsPP2Qr21ikcMrPzxDtSt8rmBCGcBtu2fKw', '2kxnQzpdGaxVrpC7eaX3yCCSHS32N8bHEJvj2NbHmWef', 'FdQ3Jqdh5ALxmpv86BPz6pUWaevE7bTnYEgCJQ7EsGiv', '6SMUWEn7TuK3PVsrfk4rcgSJE7FMuX16wBQQfn6avim', '6gAqRAqdgc69dWVkopNZH2mEpgidZZWp9og54KVUkZJJ', 'DyhaC3dasjTk95977st9kvkWBNsumhVYHHbhNF41i235', '8DRFoXNoX6ux4oA59C3dHEPXAyupSCWQaKBB8YG5bC9C', 'A8tcSbBgzknNJt2o7t84BnDmHMHSFEMWw5U3ZNGp4gwh', 'GbFP7mVrjBYdtrikrzDmuX4tciCnrmfBASUVyppv4Ea8', '7PtkpXTHuWGjiKbctd2rgLYYh7xCBPkkoR96u2kCu93o', 'Frb85cLtAQvLs4cBZxtQ1cbostKPExbNtepV5t63NMXV', '3d5JpVXM8j9YDRRQHhB6jDZYttx84qAyNGY2aYvkLwwb', '65zuMnox82FoazB1N4reAyPfTQE7ChAMHzS8NG4Rm37D']
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________5Dn..Vn8_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
/ \
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________8tX..vk9__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________4ZS..C5p
/ \ /
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________EL3..T6v__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________38c..wdv__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________4ZS..C5p________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
/ \ / \ / \
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________4yU..itK__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________Cx4..cpu__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________8dv..HVX__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________37W..57o__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________H6c..TPD__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ _________________________________________________DGr..wZe
/ \ / \ / \ / \ / \ /
___________________________________________________________________________________________________________________________________________7mL..jsK__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________CiU..3r8__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________DGX..sUL__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________9sk..bdN__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________215..PtY__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________CAp..rJD__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________7cE..Yk5__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________CJ4..uUK__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________J1H..ivN__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________4jj..74N__________________________________________________________________________________________________________________________________________ ___________________________________________________________________________________________________________________________________________DGr..wZe_______________________________________
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
___________________________________________________________________CND..pFF__________________________________________________________________ ___________________________________________________________________4CR..tJ1__________________________________________________________________ ___________________________________________________________________3PG..6Zy__________________________________________________________________ ___________________________________________________________________6Xp..4Mm__________________________________________________________________ ___________________________________________________________________Azo..jZ1__________________________________________________________________ ___________________________________________________________________5c1..8MF__________________________________________________________________ ___________________________________________________________________HmS..wLv__________________________________________________________________ ___________________________________________________________________FRx..w4M__________________________________________________________________ ___________________________________________________________________G1U..rW7__________________________________________________________________ ___________________________________________________________________FFH..LJy__________________________________________________________________ ___________________________________________________________________GG6..kWy__________________________________________________________________ ___________________________________________________________________ECv..tkL__________________________________________________________________ ___________________________________________________________________CXV..Rzi__________________________________________________________________ ___________________________________________________________________6qy..aKC__________________________________________________________________ ___________________________________________________________________Gre..8QE__________________________________________________________________ ___________________________________________________________________8ou..NLW__________________________________________________________________ ___________________________________________________________________5Bx..uzT__________________________________________________________________ ___________________________________________________________________5F1..Dkp__________________________________________________________________ ___________________________________________________________________9xE..dkq__________________________________________________________________ ___________________________________________________________________Ckr..syR__________________________________________________________________ ___________________________________________________________________2GF..nCM__________________________________________________________________ ____65z..37D
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
_______________________________3g2..QRQ______________________________ _______________________________Bj4..FK7______________________________ _______________________________BCB..ws3______________________________ _______________________________3fX..q7g______________________________ _______________________________6pf..VWz______________________________ _______________________________GRT..s4d______________________________ _______________________________5XF..a9q______________________________ _______________________________3E6..5p8______________________________ _______________________________F7Y..p6V______________________________ _______________________________CfH..xKo______________________________ _______________________________EN2..jEB______________________________ _______________________________2gq..rqB______________________________ _______________________________Hh7..2Mo______________________________ _______________________________2Sf..ctW______________________________ _______________________________BRZ..wQg______________________________ _______________________________CGk..hZQ______________________________ _______________________________J27..NFd______________________________ _______________________________GMG..8Q6______________________________ _______________________________8YH..Rii______________________________ _______________________________5sE..3CK______________________________ _______________________________DtK..DPw______________________________ _______________________________6JE..KHt______________________________ _______________________________GiS..zn1______________________________ _______________________________6PT..pcG______________________________ _______________________________H4f..NqP______________________________ _______________________________2SK..Kf7______________________________ _______________________________CMA..mjy______________________________ _______________________________Cdj..6g2______________________________ _______________________________2uo..weQ______________________________ _______________________________2LE..iym______________________________ _______________________________4BN..mmK______________________________ _______________________________7Dj..G1h______________________________ _______________________________FLN..Xu4______________________________ _______________________________7L5..Bpx______________________________ _______________________________G7Z..2mk______________________________ _______________________________BCe..oaK______________________________ _______________________________ADt..v7e______________________________ _______________________________8TV..VfS______________________________ _______________________________C6R..7yv______________________________ _______________________________EBW..b2L______________________________ _______________________________2fv..ZzM______________________________ _______________________________JBn..zPo______________________________ ____65z..37D
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
_____________7Tp..Q3t____________ _____________B7Y..eKe____________ _____________AVo..TwC____________ _____________CfT..q7W____________ _____________FEA..Wf9____________ _____________HEX..QBo____________ _____________pez..vYm____________ _____________7vP..8ft____________ _____________4Vd..S3m____________ _____________2Nf..RcM____________ _____________4Vc..VrK____________ _____________CQR..8ef____________ _____________7XT..MUC____________ _____________DhY..DYU____________ _____________CuE..tqm____________ _____________62h..QiX____________ _____________7Qr..qDk____________ _____________FSc..YSC____________ _____________22C..4F9____________ _____________6jV..KDM____________ _____________ApF..Wkh____________ _____________ESP..7bf____________ _____________B7Y..eKe____________ _____________29d..ZQa____________ _____________JE3..kKb____________ _____________GTY..V1j____________ _____________9he..gdc____________ _____________34C..2jx____________ _____________Biz..jcp____________ _____________AaS..MPk____________ _____________Ae1..sij____________ _____________4De..xp9____________ _____________594..dCU____________ _____________VMk..CZx____________ _____________Dhs..SLV____________ _____________mkD..CKG____________ _____________BLJ..X14____________ _____________Vac..2M5____________ _____________5T4..STr____________ _____________9mX..faE____________ _____________2Ad..ER3____________ _____________6jd..Xya____________ _____________7kc..BFW____________ _____________4C8..RRc____________ _____________56W..Gvf____________ _____________7Kt..tGw____________ _____________8ap..Gr6____________ _____________EGj..Mr4____________ _____________FKQ..UYW____________ _____________6S8..8km____________ _____________FWU..yPW____________ _____________9H8..uq6____________ _____________EeU..oyX____________ _____________Bky..Pu8____________ _____________ABb..eMF____________ _____________Chy..www____________ _____________Gkj..ZmJ____________ _____________8Mz..7g6____________ _____________AHR..E65____________ _____________8Y5..979____________ _____________Fpk..gwu____________ _____________H3n..PNw____________ _____________CrQ..kXJ____________ _____________BGV..v4Y____________ _____________41r..naP____________ _____________4rX..sWv____________ _____________AaQ..HtN____________ _____________6cd..KSz____________ _____________2zV..yFw____________ _____________Cts..ddH____________ _____________FDt..XCx____________ _____________DAZ..zX8____________ _____________83g..oKz____________ _____________6bw..p86____________ _____________HVR..2sT____________ _____________Hix..FRa____________ _____________8JR..CmE____________ _____________8oE..uWz____________ _____________G3Z..Ee1____________ _____________AZY..u53____________ _____________8aR..L4P____________ _____________339..UQN____________ _____________7vW..rL3____________ _____________FGC..ZDR____________ ____65z..37D
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
____H7S..Rjg___ ____696..zHN___ ____2cQ..iY2___ ____G5C..5KD___ ____uvZ..5db___ ____7bM..nfv___ ____CqH..iSB___ ____545..Y7G___ ____3oN..C7j___ ____4qG..rsT___ ____4b2..bGo___ ____56u..76o___ ____9Tr..cVZ___ ____H1R..79W___ ____DVF..L1m___ ____6ah..V4h___ ____72p..Uuo___ ____Chv..SPU___ ____6E3..47N___ ____3TZ..SDt___ ____4BL..whL___ ____6KG..5H3___ ____2ah..Lyy___ ____HGV..CXq___ ____Gs2..UCv___ ____Erh..csR___ ____yqY..oDQ___ ____GZ2..K5h___ ____545..Y7G___ ____2cK..6PK___ ____48K..vT6___ ____24A..2zR___ ____7bi..qgv___ ____4FQ..JrW___ ____85x..vt8___ ____8Vs..hna___ ____HiQ..jr3___ ____BCc..URY___ ____APJ..8pg___ ____B1r..9NQ___ ____2ht..eP3___ ____9EH..mDD___ ____2XU..ffG___ ____52V..kDA___ ____2cQ..iY2___ ____G5C..5KD___ ____uvZ..5db___ ____CUU..pUw___ ____39j..Xca___ ____4qG..rsT___ ____3RB..mH4___ ____BBP..Xmt___ ____GxJ..iRn___ ____Cow..4rY___ ____Dyt..xuQ___ ____9wx..9gk___ ____7n9..QEF___ ____2CD..x73___ ____99i..FbQ___ ____CMk..zvW___ ____GkC..nNs___ ____exr..LE7___ ____7hg..2xA___ ____9Cn..Kns___ ____Er6..9ov___ ____MWH..GBQ___ ____3ke..swa___ ____9BN..Zbq___ ____2cK..6PK___ ____48K..vT6___ ____2dQ..3ZB___ ____4FQ..JrW___ ____85x..vt8___ ____C1u..3DQ___ ____EVy..AJR___ ____EwY..J4A___ ____F7m..uvU___ ____Bd3..uPi___ ____wbd..ngc___ ____CBF..89a___ ____4MG..Lzv___ ____CjJ..XMP___ ____GWA..GPw___ ____CW4..i4Z___ ____EPU..QAa___ ____Haj..HUm___ ____2cr..agS___ ____EVy..AJR___ ____4g9..Hor___ ____FfG..UB2___ ____wg5..MC6___ ____Eho..eW6___ ____CM6..ora___ ____ABt..M5S___ ____xJn..viW___ ____3Hr..Kt2___ ____39E..kQ3___ ____EiD..qeE___ ____85x..vt8___ ____2cr..agS___ ____EVy..AJR___ ____His..HSX___ ____8fS..NW6___ ____4Cf..2cx___ ____12W..KMK___ ____2j6..kTk___ ____GWJ..ghm___ ____Fx6..zy5___ ____9CK..ukt___ ____EJq..onz___ ____DQH..Xk9___ ____Gnn..AQT___ ____AXH..cRf___ ____58h..YTM___ ____58h..z3C___ ____GAL..hD4___ ____5FY..quw___ ____DSM..DMW___ ____4MP..ebh___ ____Dwn..8Kz___ ____EXa..JfN___ ____9o5..cej___ ____4pM..jSy___ ____4Ge..ixQ___ ____23r..EMH___ ____7z3..HYA___ ____8tM..JMB___ ____BJD..kdP___ ____BAc..qZm___ ____Cye..92q___ ____58h..YTM___ ____6u6..HXv___ ____DGM..KFX___ ____Fs1..mpF___ ____97R..jNL___ ____BTu..BJf___ ____GG7..E6s___ ____Gar..3ni___ ____6ys..JRy___ ____HgA..mD6___ ____2zT..A5q___ ____43E..76a___ ____6Ph..Fyz___ ____7mi..Me3___ ____2vR..nL7___ ____67J..koG___ ____7r8..AkL___ ____5jz..8zo___ ____5ed..RJ8___ ____3Qh..kGD___ ____9jb..BxH___ ____A5K..wYp___ ____H2x..zPo___ ____Ajf..nnU___ ____5P9..vyS___ ____5Vy..fUP___ ____69o..wF3___ ____8u5..PzD___ ____ELZ..7wA___ ____6Nn..L2o___ ____B3a..nYd___ ____EVk..8aG___ ____8Da..ZwK___ ____CtM..Ai5___ ____AXZ..hKK___ ____H4p..mNT___ ____4jM..vNT___ ____BDh..vAw___ ____65z..37D
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
5kY..uzT Ggf..jef DZj..isT CDW..QNJ 7we..nM6 Guj..fUm GnE..KD7 A4B..QLM FHf..diA Bmm..66M Chr..qrJ EyC..vpm EZD..XZF 4L6..MyJ Ein..sBQ CMk..NSq CLw..U6o GnJ..sHt DCv..Eif H6Z..pp3 4ey..vuD EkG..WTG 73A..jDd DoQ..uhb Ann..DYa 9KQ..eSn 5fj..No3 GiN..Fii 9PW..gHW BNN..5SH 3ZY..z7o 5ET..bop FUk..zNa CTB..9um GP6..zgP 2xE..GhL 4L6..MyJ eCn..v6K 6t4..86k EsZ..qx1 ESR..HCY 89v..Kcf C3y..Sci H78..sf8 6i5..3XH 2it..Y2n 7s1..kqd 2DE..nUJ CL4..XVB 6Vr..s6M Fe8..VHy 7dq..teW Hk7..oww Bwo..c8q GnW..HQm E5D..quv Ein..sBQ CMk..NSq DCv..Eif B5k..S5w 5nT..bXs 7Z6..C1k 7U4..Fsq H8E..KA3 F94..pTc CLw..U6o GnJ..sHt H6Z..pp3 6Gs..iam 7Z4..qXy 2kr..W1H 9Qm..38f Eyj..Cbe Dp9..Zvp AYq..gS6 4ey..vuD BYC..9yN JDe..A9D 2c5..Q52 9RX..jrM 6HK..LDQ G96..jTD EFW..ye9 AP5..sMX FRc..fuv HAE..oZX 5kY..uzT Cco..Z9R 7we..nM6 Guj..fUm GnE..KD7 A4B..QLM FHf..diA Bmm..66M 5mD..U6Y Chr..qrJ 7rU..ATX GnJ..sHt DCv..Eif H6Z..pp3 4ey..vuD CJr..dbm J8A..jfX 73A..jDd GpJ..Nsw B2m..5Dx GiN..Fii 9PW..gHW 97E..1HN FXh..U2X HT2..hza 3ZY..z7o 5ET..bop Gfc..hL3 9Hf..riV rNZ..iAb 5vh..XAk eCn..v6K 5c1..czA 9ta..YWi AfC..3KV 9zQ..zCP 6eh..UrH 8mM..FRQ Ctt..vvo 8P6..hz2 CJr..dbm 4BJ..s2s 3jD..4Gu FpT..AfX ERM..mkP AjZ..Mj4 CY9..pRW 98T..dXK 7k2..bkY A4V..4Mo DCv..Eif B5k..S5w 5nT..bXs 7Z6..C1k 79k..9kF 7U4..Fsq GnJ..sHt H6Z..pp3 6Gs..iam 7Z4..qXy 2kr..W1H Akk..xQg G2G..VmA DFt..58E 9W4..Q1L BYC..9yN AAZ..Za5 AP5..sMX 9uf..9oH 5mD..U6Y CDW..QNJ 7we..nM6 Guj..fUm FHf..diA Bmm..66M Db7..P6S Gpe..52V H6d..MMU 7S6..VDm GVS..Trz EyC..vpm 79j..7FJ 9eZ..WjL Ein..sBQ CMk..NSq B5k..S5w 9Qm..38f Dp9..Zvp G2G..VmA DFt..58E Hs4..w5E B2g..3EG 6z5..jrW AjZ..Mj4 FuD..55K Cjy..oVs C3L..BEB M4k..NiH 7mV..XPP 95h..thK WUb..zMF D1C..BC4 FX5..1AD 7U4..Fsq H8E..KA3 4UE..yyG 9iv..VEh 69y..djF Bkf..JFb BkJ..2zL 6Gs..iam 7Z4..qXy 9Qm..38f Dp9..Zvp G2G..VmA DFt..58E Hs4..w5E WLB..JX1 47i..CEZ BYC..9yN 6HK..LDQ 9uf..9oH FRc..fuv 6SM..vim 51D..fHo 588..83n 9N9..wAR 6gA..ZJJ CxX..D8G CDW..QNJ 75K..WsL AqH..tRL 5pE..9D6 3aT..HaV EYn..1vM 6gA..ZJJ EyC..vpm 8HY..Qd6 5pE..9D6 9Qm..38f DFt..58E 7Kx..Q3n BYC..9yN 47i..CEZ FnG..kkS AfG..EmX GYN..6b8 Gfc..hL3 5EY..RRp 7RK..13v DfC..sGg AgX..Nab 8P6..hz2 EKu..QM7 FpT..AfX HJW..BdR 9ow..a2b 3fL..DRt 497..nqE 8Ck..8hc DzY..DfV Aq8..4yY 6Fp..F3R 8SU..Uff HBF..y46 oBX..gWf 4yp..Mr9 En8..CZG GKt..82N GNQ..EFA 5kZ..1ds EFY..ySK J1o..n1K 9Qm..38f DFt..58E 7Kx..Q3n 47i..CEZ FnG..kkS AfG..EmX Gcx..UmA 5Qr..cgJ 6W6..Jqn Fa9..gCq 6gA..ZJJ ByQ..KRP 6Mz..hoo C1i..C31 5kY..uzT 6GV..Dyp GbF..Ea8 9wv..kqY CCG..tMM 6gA..ZJJ Buk..hTb 9eo..fpv FUJ..xQU 3Hm..XFQ B5k..S5w 1qu..Cob 5Vr..LgP 9Mq..MkA 698..D7U 5Ug..Nd8 FUJ..xQU vCf..hkH B5k..S5w Hs4..w5E H8E..KA3 xgM..wA5 69y..djF 6Xw..o1b 9Qv..BEo 5ET..bop EsZ..qx1 AjZ..Mj4 5qi..utp CaB..GFq CpS..sRM 4eH..fy5 GCn..Zdy Efe..7su Ffu..VM7 B5k..S5w H8E..KA3 69y..djF JCJ..Jj3 Abe..5QA GDA..GQL 3cm..U7f F9n..qo4 Fuf..4Ci J1A..U5p Hs4..w5E xgM..wA5 6Xw..o1b AfG..EmX 9Qv..BEo P8E..WTx 9yC..fKw 2kx..Wef FdQ..Giv 6SM..vim 6gA..ZJJ Dyh..235 8DR..C9C A8t..gwh GbF..Ea8 7Pt..93o Frb..MXV 3d5..wwb 65z..37D
Compute the hash of one of the articles
#!pip install java-random
import re
import hashlib
from javarandom import Random
class MinHash(object):
def __init__(self, num_perm=128, seed=42):
self.num_perm = num_perm
self.seed = seed
self.prime = int((1 << 61) - 1)
self.proj_bits = 60
self.max_hash = int((1 << 32) - 1)
rng = Random(seed)
self.perm1 = []
self.perm2 = []
self.hashes = []
for i in range(num_perm):
self.perm1.append(self._getrnd(rng))
self.perm2.append(self._getrnd(rng))
self.hashes.append(self.max_hash)
def _getrnd(self, rng):
b = [ 0 ] * int((self.proj_bits + 7) / 8)
rng.nextBytes(b)
v = 0
for t in b:
v = (v << 8) + (t if t >= 0 else 256 + t)
return v % self.prime
def update(self, item):
h = int(hashlib.sha1(item).hexdigest(), 16)
for i in range(self.num_perm):
proj = ((self.perm1[i] * h + self.perm2[i]) % self.prime) & self.max_hash
if proj < self.hashes[i]:
#print(item, proj)
self.hashes[i] = proj
def digest(self):
return self.hashes
print("LSH sample")
text1 = "This is a test, checking texts similarity"
h1 = MinHash(10)
for w in re.split("[\\s.,/]+", text1):
h1.update(w.encode('utf8'))
print("\n" + text1)
print(h1.digest())
text2 = "This is a test, checking paragraphs similarity"
h2 = MinHash(10)
for w in re.split("[\\s.,/]+", text2):
h2.update(w.encode('utf8'))
print("\n" + text2)
print(h2.digest())
text3 = "Paris is nice in the autumn"
h3 = MinHash(10)
for w in re.split("[\\s.,/]+", text3):
h3.update(w.encode('utf8'))
print("\n" + text3)
print(h3.digest())
LSH sample
This is a test, checking texts similarity
[34496072, 64928703, 1518827583, 1855999512, 168639963, 449703904, 1025577060, 1762278405, 300275871, 418448513]
This is a test, checking paragraphs similarity
[34496072, 64928703, 1518827583, 1855999512, 168639963, 449703904, 1025577060, 1575904496, 300275871, 418448513]
Paris is nice in the autumn
[64757976, 64928703, 312058313, 500879909, 579335646, 821197043, 93461980, 1212287570, 1585736204, 979023225]
We take one of the articles and replace or Google references with Microsoft
text = sample_article
#print(text)
minhash = MinHash(num_perm=10)
for w in re.split("[\\s.,/]+", text):
minhash.update(w.encode('utf8'))
print(minhash.digest())
text = sample_article.replace("Google", "Microsoft")
minhash2 = MinHash(num_perm=10)
for w in re.split("[\\s.,/]+", text):
minhash2.update(w.encode('utf8'))
print(minhash2.digest())
recordHash = "LSH(10):" + json.dumps([ int(x) for x in minhash2.digest()])
print("Exact match: ", text==sample_article)
print("Locality Sensitive Hash match: ", minhash.digest()==minhash2.digest())
[646865, 617261, 1346772, 16793851, 8068838, 4173180, 15452610, 2220349, 18864302, 2868003]
[646865, 617261, 1346772, 16793851, 8068838, 4173180, 15452610, 2220349, 18864302, 2868003]
Exact match: False
Locality Sensitive Hash match: True
Check the locality sensitive hash presence and validate the Merkle Tree
reply = nodeApi.verifyMerkleHash(session, tree, recordHash, "LSH(10)+SHA-256").get()
#print(reply)
print(reply["data"])
true
Split Learning
In this sample, we configure 3 local nodes for collaborative training. The reason for doing it locally is to make it easier to understand how the protocol works and to have access to every node in the network to make the whole process more transparent.
Node configuration
- to have 3 nodes participating in split learning, install the Weavechain nodes if not done already, the easiest way is by starting them as a docker, using the following method:
curl -O https://public.weavechain.com/file/install_nodes.sh
chmod a+x install_nodes.sh
./install_nodes.sh 3
- this installer will handle the creation of the directory structure for the 3 nodes. After running the installer, the directory structure will look like this:
.
└── nodes
├── weave_node1
│ ├── config
│ └── storage
│ └── files
├── weave_node2
│ ├── config
│ └── storage
│ └── files
└── weave_node3
├── config
└── storage
└── files
- to subsequently start/stop the nodes:
docker stop weave_node1
docker start weave_node1
docker stop weave_node2
docker start weave_node2
...
- install a local jupyter jupyter server to connect to the node (if not done already)
- run the jupyter installer in the root directory, so that the config directory of the jupyter notebook container is next to the nodes:
.
├── config
└── nodes
├── weave_node1
...
- allow running local docker images by running
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 0.0.0.0:2375:2375 bobrik/socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
- to run split learning, we will need to connect to one of the node's API and for that we will use weave_node1, making that node the initiator of the split learning process
- to do that, we will need to copy the node's config directory to the jupyter notebook's config directory
- run the following from the parent directory:
cp nodes/weave_node1/config/* ./config/
- with the config and keys copied into the jupyter container, we can use the API to run split learning
Sample of split learning
In this demo we use 3 nodes for collaborative training using this dataset:
- we will preprocess and split the data, so each node has its own part
- since we are using 3 nodes, we will have 3 CSV files
- we will copy the CSV files into each node's private file storage so they can access it
mkdir nodes/weave_node1/storage/files/private_csv_files
mkdir nodes/weave_node2/storage/files/private_csv_files
mkdir nodes/weave_node3/storage/files/private_csv_files
cp melanoma1.csv nodes/weave_node1/storage/files/private_csv_files/melanoma.csv
cp melanoma2.csv nodes/weave_node2/storage/files/private_csv_files/melanoma.csv
cp melanoma3.csv nodes/weave_node3/storage/files/private_csv_files/melanoma.csv
- out of the 3 nodes, one will initiate the training and notify the other 2 about it
- we will access the initiator node from the notebook
- the other 2 nodes will start their model's training using the data that we copied into their private file storage
Docker images structure
- split learning executes similarly to a compute task, here is a sample for that: Confidential Compute Sample
- this means that we will use docker images to execute the training
- since in the network we have 1 initiator and the others are participants, we will have two docker images:
- one for the participants
- one for the initiator
The participant image
- for this sample we can use the following image for the participant: gcr.io/weavechain/split_nn_participant
- the participant image will be the docker image each participant uses in a compute task to trigger the training process.
Participant image structure
- the steps for every participant within the compute task are the same:
1. Connecting to the node
from weaveapi.records import *
from weaveapi.options import *
from weaveapi.filter import *
from weaveapi.weaveh import *
nodeApi, session = connect_weave_api(None)
2. Fetching the training data
reply = nodeApi.read(
session,
".internal_task_params",
os.environ["WEAVE_TASKID"],
None,
READ_DEFAULT_NO_CHAIN,
).get()
params = reply["data"]
- the params contain the data necessary for the training, e.g. scope, table, input/output fields, nr of epochs, etc.
- example for fetching and preparing training data:
reply = nodeApi.read(session, scope, table, filter, READ_DEFAULT_NO_CHAIN).get()
trainingData = {
"data": reply["data"],
"input_fields": input_fields,
"output_field": output_field,
"epochs": epochs,
}
3. Training the model
- for example, we assume that we have the model built for the dataset
traindata = TrainingData(data, device, input_fields, output_field)
model = Model()
- create and configure a train loader, optimizer, etc.
splitNN = SplitNN(
[model.client_model, model.server_model], [optimizer, server_optimizer]
)
server_model_state, server_optimizer_state = train(
splitNN, train_loader, epochs
)
4. Sending the model to the node base64 encoded
- we encode the server model from the step before
result = {
"server_model": server_model_base64,
"server_optimizer": server_optimizer_base64,
}
weave_task_output(nodeApi, session, json.dumps(result))
These are the summarized steps that a participant's compute task executes. After these steps are finished by the participant during the compute task, the trained model is sent to the initiator.
The initiator image
- for this sample, we can use the following image for the initiator: gcr.io/weavechain/split_nn_initiator
- Similarly to the participant image, the initiator image will be the docker image the initiator uses to aggregate the models from the participants and train the main model.
Initiator image structure
- the steps within the compute task are the following:
1. Connecting to the node
from weaveapi.records import *
from weaveapi.options import *
from weaveapi.filter import *
from weaveapi.weaveh import *
nodeApi, session = connect_weave_api(None)
2. Fetching the models from the participants
reply = nodeApi.read(
session,
".internal_task_params",
os.environ["WEAVE_TASKID"],
None,
READ_DEFAULT_NO_CHAIN,
).get()
params = reply["data"]
models = params["data"]
3. Training the main model
- here the training happens by using the models from the participants
4. Sending the results to the initiator node base64 encoded
result = {"server_model": server_model_base64}
weave_task_output(nodeApi, session, json.dumps(result))
These are the summarized steps that the initiator's compute task executes.
Jupyter Notebook example for the API
- we will trigger split learning via the API call using the jupyter notebook we configured above
- more information about the jupyter server configuration here
- after opening the notebook in a browser, create a new notebook in the main directory
- the following code segments can be copied into the notebook, each segment in this documentation representing a separate cell in the notebook
1. Connecting to the initiator node
from weaveapi.records import *
from weaveapi.options import *
from weaveapi.filter import *
from weaveapi.weaveh import *
nodeApi, session = connect_weave_api("config/demo_client_local.config")
2. Configuring the params
scope = "private_csv_files"
table = "melanoma"
initiator_image = "gcr.io/weavechain/split_nn_initiator:latest"
participant_image = "gcr.io/weavechain/split_nn_participant :latest"
output_field = "target"
epochs = 10
sources = ["<pubkey1>", "<pubkey2>", ...]
params = { "scope": scope, "table": table, "output_field": output_field, "epochs": epochs }
Notes on parameters:
- scope is the scope configured above for the training data
- table is the name of the CSV file
- initiator_image is the name of the initiator node's docker image used for the training
- participant_image is the name of the participant node's docker image used for the training
- output_field & epoch are training configs
- sources is a list of the participant node's public keys; this can also be configured to be every peer of the initiator using "*"
- params are the parameters that the nodes will pass to the docker images
3. Connecting to the participant nodes
- before we can trigger the split learning process, we have to connect the participant nodes to the initiator
- this is done by an API call to the initiator that updates the connections-related configuration of the node
- we will create a json with the connection information of the 2 participant nodes and use that to update the initiator's config:
def add_connections(ip_port):
connections = { "connections": []}
for ip in ip_port:
for port in ip_port[ip]:
connection = {
'http': {
'host': ip,
'port': port,
'useHttps': False
}
}
connections["connections"].append(connection)
return connections
- using that function we can build the connections:
ip_port = {
"host.docker.internal": {
"18082", # port for weave_node2
"18083" # port for weave_node3
}
}
connections = add_connections(ip_port)
- the connections variable contains the json objects representing the connection configuration to the 2 participant nodes, i.e. weave_node2 and weave_node3
- we will use this to update the initiator node's config:
path = ["peers", "connections"]
reply = nodeApi.updateConfig(session, json.dumps(path), connections).get()
4. Triggering split learning with the initiator node
- now that the two participants are connected to the initiator, we can use initiator to trigger split learning, using the parameters configured above with the following API call:
reply = nodeApi.splitLearn(session, initiator_image, participant_image, SLOptions(False, 120, 2, None, sources, params)).get()
print(reply)
{'res': 'ok', 'target': {'operationType': 'COMPUTE', 'organization': 'weavechain', 'account': 'clientAccount'}, 'data': {'<pubkey1>': {'res': 'ok', 'target': {'operationType': 'COMPUTE', 'organization': 'weavechain', 'account': 'clientAccount'}, 'data': {'output': '{"server_model": "UEsDBBQAA...}}}}}
- we can also fetch data lineage for the participants:
reply['data']['<pubkey>']
{
'res': 'ok',
'target': {
'operationType': 'COMPUTE',
'organization': 'weavedemo',
'account': 'weavejTGjcdbUSDtk4Rroiz8qVCSGHo3ejTSZV2wtqRobzNBD'
},
'data': {
'inputHash': '62ZspnQej3ZUyVBTJXEJHyszrZxCBnAY5Si7P1LT54bM',
'fees': '{"USDC":0}',
'writesSignature': 'EmChpWVhPZ2ka8wh1aiwMLfXWQSJjPTxYPbo3zPtxShb8bF6JDrsXkRz5vB4yWNAcMQ37mQs5Wm1FXREh6MKzi4',
'outputHash': 'BpKDBmiku7eSdFxmztQMSxtYRdAvSFcJw8KXDvK5agJf',
'outputSignature': '4AoAtD6n19XuMxWnaupAeNVjesgtuVQN9QcctmVHfR724jh4TxNUHsoZ5M6je7a4CVYukDwb8YWjYQTT3KNfxBcX',
'computeHash': '2h5BQPk2tXaDyeSifJ4aE8AoLFnFhNDK5vYsw6zZYGaf',
'WEAVE_API_KEY': '97af328d9ae0410daebd32565ca18fdb65b4f2c8220e580d',
'input': '[{"hash":"bryvIld5WQSYT02rOCVzEh1vmDfqxOCCH9YhkHWmVZg=","scope":"private_csv_files","table":"melanoma"}]',
'writesHash': '6LfKoQQMqb8fYgA1PwBPKMhFaJ59Fn3DWw6qTRri4zjN',
'paramsHash': 'HW8t63kVCzdR28fbsoHL6RGe3Tbew8icgGhRQ8WbPJg4',
'writes': '[]',
'outputSignatureTs': '3BJbd397vNxYDDKGjQMWH2i6gLM1DR2vA4webNrB4P2CSpNHyeYeBiuSEKgE573rCqx6LzwqKEAiXMyFWEo7w9et',
'taskId': '8de2735c3b71455f9dbe3150d3a52540',
'consoleSignature': '4ECkbzB3zFK6tjv5GvyHcQuiwr8JkMXkFtjdjwg3SKvYQJvuPx2zj3RB179231T41vwroDQUKTwV8NUeZsxjHpiX',
'ts': '1692870682362'
}
}
Architecture
Weavechain's goal is to become the decentralized network of permissioned networks that brings private data to Web3 and offers cutting edge provability, compute and monetization features on top of trusted data.
Islands of data where people or organizations have full control of what they share, who they share data with and how, are connected through a marketplace layer that sits on top of all those permissioned networks and acts as a directory, routing and settlement layer.
There are two main components in Weavechain's design:
- Weaves: The data meshes that are in charge of sharing the data
- Marketplace: A layer on which Weaves can advertise their existence
Weaves
Weaves are a distributed network of nodes that sit on top of existing databases, be it relational (such as Postgres, MySql, MSSQL, Oracle, Aurora), time series oriented (sample InfluxDB, GridDB), document stores (MongoDB, RethinkDB), embedded (SQLite, LevelDB, RocksDB) or file storage systems (local, S3 or IPFS).
Their role is to:
- Intermediate the data storage and potentially replicate the data.
- Gate data access, using role-based access control and various authentication methods
- Maintain immutability proofs, like a hash of the data that can be stored in a blockchain. These blockchains can be public like Ethereum, or private with nodes running in a restricted trust network.
- Generate proofs for data.
- Enable confidential computing features.
- Keep a full audit log for changes and access, and offer a lineage for both data and computations.
- Act as a Web3 data source, both for direct access or publishing to blockchains as Oracle middleware.
- Issue verifiable credentials.
- Monetize data directly or via a marketplace.
Weave configurations are currently controlled by the single superadmin account that creates them. We are building functionality that would enable a consortia to vote on configurations in a DAO-like fashion, supporting weighted votes and delegation.
Weaves can be comprised of any number of nodes and the participants can be both data producers and data consumers. Additionally, API consumers can interact directly without running nodes as long as they have a registered account with the Weave.
Nodes
Nodes are a collection of services that can run either as a docker image or as a standalone java process.
A node is part of a single Weave and can be configured to have active connections to other nodes.
At least one bootstrap node needs to be publicly available on the internet if the Weave intends to be able to store or publish data from consumers that are not in the local network or having a VPN connection.
Depending on their availability, the nodes could be categorized as
- Active Nodes: Other peers can connect to them directly.
- Passive Nodes: These run on machines behind a router, which can connect to an active node, but to which new connections cannot be established from outside.
- Proxied Nodes: These can’t be reached directly, they’re advertised to peers by nodes that know about their existence.
When replication or multi-party compute tasks require direct message exchanges between nodes, active nodes can forward encrypted messages to passive/proxy nodes.
Nodes can be configured to support various protocols. The default is to run the node infrastructure over Websockets and allow API connections via HTTP(S) and Websockets. Nodes can be configured to also allow incoming Kafka, RabbitMQ or ZeroMQ connections. Each transport layer has its own advantages and disadvantages.
In addition to the encryption in transit using secure channels, AES-256 encryption can be enabled, allowing the nodes or API clients to operate over plain HTTP.
Nodes can replicate both user data and Weave configurations (including RBAC tables). All activity is signed in order to prevent malicious writers.
Authentication
In order to get access to a Weave, an API connection must be established with any node of the Weave.
The login is achieved with a private/public key pair, where the public key has been pre-authorized by the Weave. Alternatively users can login or get access to data using pre-authorized Verifiable Credentials, proving blockchain accounts ownership, using NFTs, ZK Proofs or Smart Contracts.
When using Verifiable Credentials, the Weave can be configured to allow reusable credentials or require one-time presentations that specify the public key that should inherit the access rights of the credentials presented.
When using Blockchain accounts, a personal signature is added during the login process as proof of the wallet ownership, and the rights are configured by wallet address in the nodes.
When using NFTs, the wallet ownership is checked, then the NFT ownership is verified on a configured blockchain. NFTs can be used to unlock data up to table level granularity.
When using Zero-Knowledge Proofs, the user can obtain access to a node without previously being authorized, by proving they know a piece of information that the node also has for the user.
When using Email Magic Links, the user receives a token via e-mail, which then can be used to enable an existing session to gain rights associated with that email address or its domain.
User access conditions can be enhanced with checks of smart contract states on any of the supported blockchains.
After login, a session is created, identified by an API key that can be used to track all the actions triggered by operations made in that session.
These sessions also ensure the integrity of the request-reply flow and have a nonce, a secret shared with the server that must be used to sign operations and an expiration time after which the tokens need to be renewed.
A node can be configured such that any of the methods above can be used to gain access to APIs, to compute resources, or to data with access controlled up to row-level.
Audit
All operations done within a Weave are fully audited. This applies not just to the write operations, but also to reads, compute tasks and everything else. This enables detailed tracking of how data flows within the system.
The audit records can be stored in the same network or can be stored in a remote Weave to enhance security.
As long as data processing happens within the system and there is no exfiltration to a Web2 system, usage rules can be enforced as well as monetization.
For example, compute tasks that are executed within the system can offer computational lineage guarantees, meaning that nodes can vouch that a certain output is produced by a certain input and compute task. Hashes are created of the input data, the compute task, the output data, and these hashes are cryptographically signed by the node that performed the computation.
When data is shared across multiple nodes, this can be extended to a consensus, i.e. the same task is run by multiple nodes that vouch for the integrity of the input data and agree on the output, providing the consumer a set of signatures certifying the result by the trust network. This proof can be taken outside of the ecosystem by attaching checksums and signatures to output files or going as far as signing generated PDFs.
Storage
A Weave node can sit on top of one or many databases or file storage systems of different types, what we'll call Data Collections.
Each Data Collection can be:
- Replicated, a case where other nodes in the Weave make copies of the Data Collection,
- Non-Replicated, where other nodes don't make copies of the Data Collection. Data integrity guarantees can still be offered in this case by maintaining the data hashes, as well as the other features that Weavechain offers.
A node can be in charge of all of the operations with the database when every write operation happens using the Weavechain API. Alternatively, nodes can implement a listener pattern, sitting on top of a database that is updated by external actors.
Depending on the configuration, nodes can offer different guarantees for the data and for the audit trail. For example, in a listener pattern no audit trail can be offered prior to the moment when first reading the data.
The underlying storage can have encryption at rest capabilities. On top of that, stored data can be encrypted with a secret configured per data collection, known to the node. This encryption can be turned on/off at field level.
The storage setup that offers the maximum guarantees and lineage trail is using append-only databases. Mutable tables can be transformed into append only time series in order to be able to offer lineage. Additionally, records deleted can be marked using tombstones, and occasional swipes or history collapsing to a snapshot can achieve the true data forgetting needed for GDPR.
Each use case will have specific requirements. Weaves are designed to be flexible and support various scenarios, offering different and specific guarantees.
Access to data collections is controlled by RBAC. Rights can be configured at the table level, including Read, Write, Compute, Create, Drop and View (that the table exists).
In order to allow PII obfuscation, table columns can be assigned data transformations that are applied on read, such as:
- Erasure
- Redaction (with custom values depending on input)
- Hashing
- Unique Random IDs (consistent within tables)
- Linked Random IDs (consistent across tables)
- Quantization, Scaling and non-linear transformations
- Noise Addition
- Encryption (at read time)
If the privacy concerns are higher, databases can be configured to allow local access only. This means that the data cannot be read remotely by consumers, only confidential computing tasks can be enabled on top of it.
Integrity checks and storage proofs can be triggered on demand or scheduled periodically, either for checking entire tables content or by doing random sampling.
Operations
The main operations on data that are supported by a Weave are:
- Read, which can include a data verification step (either by querying the blockchain and matching actual data hashes to stored hashes or via network consensus),
- Write, which can include replication and storing hashes for later integrity guarantees,
- Compute, including 3 patterns of confidential compute and building proofs on data
In addition to those, there are additional API functions to offer the building blocks for Web3 ready apps, including verifiable credentials, lineage and messaging.
For more details about all the operation supported check the API
Monetization
Monetization is possible for all the 3 types of operations above (read, write, compute), and can be configured by each Weave independently according to their needs.
In addition to node operations monetization, any custom server can be launched as an inner feed handled by the node and API calls to it be monetized instantly without any change of the underlying service and just adding a header to the callers. This is achieved by proxying the API calls through the node and generating an JWT authorization token that can be used to link the caller to a Weavechain public key. In addition to monetization, this approach can also be used to seamlessly add a RBAC on top of any API, gate existing APIs with NFTs ownership proofs, verifiable credentials etc.
The party performing the action (reading, writing, performing compute, API calls) can be configured to pay or be paid for their activity as desired.
Fee schedules can be configured per record, per size, per unit of time (such as daily) for data, capped or not, and for CPU usage or unit of time for compute.
Payments can be done in USDC or a custom ERC-20 token. Micropayments are recorded locally in a ledger in the weave network and synchronized periodically to a blockchain. For details on payment synchronization, see Token Bridging.
Batching
In order to support higher volumes at write, batching can be configured in the API both on the client side as well as on the node side.
The batches can be determined using multiple criteria, such as:
- Record count
- Record size
- Maximum throttling wait time
When batching is done at the server side, the batches that arrive from clients are kept intact to preserve the integrity guarantees created by client signatures.
Signing
Signing happens at multiple levels, both when delivering data and when delivering computational results.
Higher integrity guarantees can be configured by a node, adding signature requirements from API clients. Each piece of data that is written by an API client is hashed and can be signed with the writer's private key.
Each node that receives and needs to replicate the data can verify the authenticity by reproducing the hash from the raw data and checking the signature of the original writer.
When a node is running a compute task, the inputs and the outputs can be hashed and signed with the node's private key, as a guarantee of the result authenticity. Or a number of such signatures can be obtained by running a consensus compute as a guarantee of reproducibility. These hashes and signatures can be configured to be automatically put on a smart contract or an NFT can be minted to the caller, proving that a certain task with a given set of inputs was verified to produce a certain result.
By default Ed25519 is used for signing, and nodes be configured to use Dilithium in order to produce quantum-resistant signatures.
Hashing
Hashes of the data establish data integrity guarantees. Storing hashes in public blockchains such as Ethereum provides a stronger integrity proof, but has the downside of being public and expensive. Storing hashes on private blockchains such as Hyperledger Sawtooth is inexpensive, but increases the risk of tampering if the trust network is small.
In order to prevent dictionary attacks, data hashes are computed using a secret salt that is known only to authorized Weave members.
The hashing function can be configured and can range from HMAC or salted SHA-256, SHA-512, Keccak-256 or Keccak-512, Blake2 or, if needed, post-quantum hash-based signature schemes like MT XMSS or SHA-512 with SPHINCS256. By default hashing is done using HmacSHA256.
Hashes can be configured to be computed and stored for each record or for batches of records. When using batching, the ability to hash large datasets is feasible, but there is a downside at verify time, as an entire batch needs to be checked in order to ascertain the validity of a record at read time. Tuning the batching configuration is needed depending on the use case.
Hashes are stored on the blockchain either during an initial hashing of the database to which a node was attached, or when write operations are triggered via the API.
The node that is orchestrating replication gathers a threshold signature from all of the other nodes that are part of the trust network. The signature is checked by a smart contract on the blockchain when calling the hash storage function to verify that there was consensus at write time. This ensures that the leader is not writing a malicious hash value. The alternative is to call the chain from every node, which can be more costly in time or gas.
Replication Integrity Guarantees
Data integrity is established by hashes stored on a blockchain (see Hahing), and by data replicas that can be stored by nodes running on trusted parties machines. When using the API to write data, there is an additional hashing and signing done client side, allowing nodes that participate in the replication process to verify that the data is matching what the originator sent (see Anatomy of a Write Operation).
In addition to data hashes, storage proofs can be generated by nodes for whole datasets or for filtered rows only. A challenge is sent by a node that has a replica of the data, the receiver computes a hash that includes the challenge and returns it to the challenger. If the node that requested the proof can validate the reply by hashing the data with the same challenge.
Taking this a step further, interactive zk storage proofs can be used to avoid leaking information to nodes that pretend to have the data: it is similar to a challenge storage proof, just that the instead of returning a hash, only a proof of knowing the hash is returned, making sure that a dictionary attack is not possible by some node that does not have the data replicated, even if it's an authorized member of the Weave and knows the secret salt used during hashing.
Non-interactive zk proofs of storage are not feasible, both due to computation time and proof size. However, we offer the feature of proving knowledge of a hash pre-image which can be used for small datasets.
Compute
Compute operations are fully audited, monetizable, and can offer lineage guarantees. Compute outputs can be traced to the source inputs and the task that generated them, as well as verified by 3rd parties that know the public key of the node that did the computation.
Compute consensus can happen on top of this, having multiple parties running the same task on their own copy of the data and vouching via signatures for a common reply.
Task lineage graphs can be built out of the audit trail, as long as all the processing is happening within the system.
Compute tasks can be triggered in the node to which the API is connected, in a list of target nodes or in all active nodes (if authorized).
The outputs of a compute to data task can have several forms:
- An output that is returned to the user, be it in text format or encoded binary. We also offer helper functions to output signed PDFs.
- The task logs, when using compute to data, which can be filtered or not depending on configurations.
- Data records, when a compute to data task is doing some processing and writing results to an output table.
In all forms, activity can be proven. For computation, the output can be signed by the executing node, proving that the result came from a certain set of input data and a certain compute task. When data is written, there is also an audit trail and lineage information that can be generated.
In order to prevent unwanted data leakage, outputs can be filtered based on few rules:
- Maximum output size,
- Reject output in case of keywords presence,
- Output must follow a fixed template,
- Limit the data on which the operations can be done (such as requiring at least a number of records or a number of parties to participate in an aggregation task)
There are 3 patterns of confidential computing that Weaves support, each having its own strengths and limitations and which can be used alone or mixed, depending on the use case:
1. Compute to data
This feature allows running pre-approved Docker or WebAssembly images remotely on the data owner's infrastructure, allowing confidential computing without the risk of exposing the private data.
A local or remote docker instance or a kubernetes cluster can be used to launch images.
Compute to data can be done in a two party scenario or in a multi party scenario.
When having a multi-party scenario, the consumer is in charge of aggregating the individual responses. Compute tasks can also be run with a consensus flag, a case in which the same output is expected from all the nodes (and signatures are gathered as proof of consensus).
The advantage of using docker images is full flexibility for the tasks that can be run.
In this case the executed code is known to the data owner and should be audited. Weaves could be configured to automatically approve images to be run, but this has some risks for the data owner regarding both security and data exfiltration. The automatic filters that can be applied by nodes to prevent unwanted data leakage can always be circumvented using encryption or steganography if there is no audit of the code.
Depending on the analysis to be run, the task can be run either:
- By all of the target nodes in parallel, where an aggregation happens at the end of the operations,
- Sequentially, where there could be a state that is passed from one node to the other.
Federated Tensorflow will also be supported as a compute to data task.
2. Multi-party computing
Weavechain supports MPC using the SPDZ protocol, integrating the Framework for Efficient and Secure Computation by Alexandra Institute.
This is different compared to compute to data in several aspects:
- The functions supported are predefined, such as descriptive stats (like mean, median, stdev, variance), statistical tests (t-test), private set intersection and linear regression and run in the node process,
- Adding new functions requires adding them to the Weavechain codebase,
- There is no security risk for the owner of the data, as the code to be executed is fixed and known beforehand,
- MPC can become very slow, depending on the volume of data and the number of parties this can be suitable or not for the specific use case wanted.
When the final data aggregation can be done by the consumer and does not require any data exchange between parties, the same predefined functions can be executed in a series of 2 parties rounds, involving just the consumer and the producer nodes one by one. In this case the speed concerns do not exist.
3. Two party homomorphic encryption
Weave nodes can support compute tasks over encrypted data using the CKKS encryption scheme.
Weavechain wraps SEAL and EVA from Microsoft offering seamless access to homomorphic encryption features.
Data owners can configure specific columns to be available either encrypted or in plaintext. Consumers can run computations on the encrypted data, producing a set of encrypted results. These results are sent back to the owner, who can decide whether to release the aggregated results back to the consumer, using filtering rules as described previously.
Plaintext fields could be used for aggregation, and mixed with locally available information that is not shared with the other party. The advantage of this pattern is that the consumer task code and local information can remain secret, so that only the aggregated result is known by the data owner.
Zero-knowledge proofs for data
In addition to confidential computing patterns, zero-knowledge proofs (ZKPs) for data can be configured to be fully or partially available.
Weave nodes can generate Bulletproofs, with multiple gadgets implemented such as validating number values or proving knowledge of a hash pre-image.
ZKPs can be used for generating useful outputs as well as debugging datasets without having access to them.
For example, a single ZKP could validate that all measurements in a table are greater than zero. Or a ZKP could be generated for each row, checking that some measurement value is in a reference interval, without revealing the actual value to the data consumer.
Caveat, ZKPs can become slow and large, so this is not a feature suitable for any scenario.
Anatomy of a Write Operation
Let's consider a scenario where a data producer writes some data using the API.
At the producer level, the API can choose to batch the writes. Batching at the client makes sense when there are a lot of small and continuous writes.
Accumulated data is hashed and the hash is signed with the producer's private key.
The API sends a new batch of data to be written to the node to which it's connected.
If the node is not currently the leader orchestrating writing for the time series, it starts a consensus round to become the leader (PBFT) and obtain a Time Lease.
We use Time Leases of 2 seconds to be able to achieve full throughput writes in that time window. The time window can be adjusted, depending on the scenario. For example if there are few writers that take turns and many consumers, it makes sense to use larger windows of time lease. If instead there are many writers writing small pieces of data, the time window can be lowered or the consensus could be switched to be done at record level.
Different writers can connect to the same node to avoid competing leaders.
Data is ordered by the arrival time in the leader node and we use a network time that is adjusted dynamically (see Network Time).
Once a node is allowed by the rest of the network to become a write leader, it checks that the data hash is matching the one from the source (EdDSA with the writer's public key)
The node starts the data replication and writes it to its local database in parallel. For the trivial case of non-replicated scopes only the write to the database happens.
Each node that receives the data checks it to make sure that its hash matches the one signed by the producer and proceeds with storing it to its local database.
The nodes can optionally add the public key of the writer, the network time or the integrity signatures from the client to the data stored in the target time series, to have it readily available (these can always be recovered from audit records with a more costly operation). This step is eventually hydrating the client data and after that a new hash is generated by the nodes using a secret salt known only to the nodes.
Once a node "promises" to store the data, it signs with its own private key the hash of the data and sends it back to the leader node.
Depending on the write options, if it must be a guaranteed write, a node can answer once the data is flushed in the database or file storage or immediately after it has the data in memory (i.e. before the DB write)
The leader node accumulates the replies which contain signatures from the other nodes that did the replication in order to pass them back to the original writer. The client can then check the validity of the signatures with the nodes public keys (i.e. it does not have to trust the node to which it was connected with the API).
The leader node does another round of exchanges with the other nodes to build a threshold signature (T out of N) for the hash, where each node contributes with its secret share of a private key. This is used to issue a single call to a blockchain to store the hash while still making sure that there is a network consensus that the hash is the right one. The alternative would have been to have each node that persists the data interact with the smart contract (and do the check the consensus there), which could be both slower and significantly more expensive when having paid operations.
The leader node executes the smart contract call containing the threshold signature, storing the hash of the data and some metadata (ex. the batch IDs range), and the smart contract checks the signature and eventually stores the hash in the contract state.
Contract state sharding is done for certain blockchains when the state gets too big.
Contract state serialization and deserialization can introduce performance hits, this being the reason why there is an option to store the hashes on a Weavechain Layer-1. Weavechain's Layer-1 was designed to be a blockchain replacement running in the same process that keeps an in-memory LRU cache of the hashes.
The hash includes a secret salt component that is known only to Weave members. This prevents dictionary attacks when the hash is stored on a public blockchain.
After the hash is written on the blockchain, the staged data becomes permanent and has immutability guarantees.
The hash is not the data; if the storage disappears, the hash is not enough to reconstruct the data. However, it can be used to check the integrity, be it on demand or periodically.
If replication is enabled, a consensus can be done on the trust network that replicated the data and restore the missing or altered data.
Anatomy of a Read Operation
When a consumer issues a read from the API, the access control rules are checked to ensure both that the user is permissioned, and that the Data Collection allows remote reading.
Records are read from the data that is attached to the node to which the API consumer is connected and returned to the user.
A read operation can have various filters on the target table fields. The order of returned results can be specified, the output of the query can be limited, and fields can be collapsed.
Before the data is returned to the user, a PII transformation layer can obfuscate certain fields that are not supposed to be public, erasing them or replacing them with a hash or a unique random (per value) ID.
By default, read operations are configured to check the hashes of the data to check integrity. This means that the node looks at the hashes of the queried data from the blockchain and checks them against the actual data returned to the user.
If the node is trusted or the integrity was previously checked by other means (such as the storage proofs API calls), this check can be skipped at read operation level to optimize for speed.
If the API client has access to the blockchain and does not want to delegate the trust for the hash check to the node to which the API is connected, the data can be checked by the consumer itself.
A read operation can also be configured to query all active nodes from the Weave network or specific nodes specified via their public key and do a consensus read of the data. In this case the node to which the API read is issued becomes a leader in charge of orchestrating the forwarding of the call and building the reply. The operation will be successful if all nodes return the same data.
Another type of read operation involving multiple nodes is a multiplexing read. When nodes have private non-replicated data, a read can be triggered to gather the records from multiple nodes and mux them together before generating the reply. In this case the data is expected to be different in each node, unlike in a consensus read. The source node information is added as a new column in the returned dataset.
Network Time
A network time is maintained by each of the nodes, and the ordering of the operations in a Weave is done by the time of arrival of the request at the node that is in charge of orchestrating the operation.
Each node pings all the other nodes to which it is connected and receives a reply with the clock on the other machines.
The difference between the clocks and half the roundtrip time is taken, and the median of this measure over a recent window of time is computed for each known neighbor. The median of these adjustments is applied to the local clock to compute a network time.
Token Bridging
When using EVM compatible blockchains as the settlement layer, a smart contract is deployed on that blockchain by each Weave.
ERC-20 tokens can be locked in that smart contract, funding weave accounts identified by their public keys.
The funds can be in two states in the smart contract: withdrawable or locked. When locked, they are bridged in the Weave accounts ledger.
Once bridged, these funds can be used to pay for data or compute.
Funds are periodically synchronized to the main blockchain smart contract. Local payments are secure, and synchronization can be done rarely to avoid gas fees.
Withdrawing funds can be done only from within the Weave, with both the user and a nodes consensus signing the transaction using a threshold signature. The action consists of moving funds that are available in the Weave from a locked state to a withdrawable state.
The operation above will withdraw tokens from the Weave and make them available in the smart contract on the main blockchain. Users can then withdraw them from that smart contract to their wallets.
Marketplace
The marketplace is currently implemented as smart contracts that can be hosted on EVM compatible blockchains.
Its role is to:
- Act as a directory where weaves can advertise their presence and/or their datasets
- Act as a settlement layer where the wallets of the participants in the private data exchanges are located
- Act as a standardization layer, where data formats can be established (and voted)
Note, this feature is still in development. Our early customers are still operating in an intra-weave capacity, and are functional without the Marketplace.
API
Interacting with the Weavechain nodes is done via API client which connect to one of the nodes that is part of a Weave.
A client API session needs to know how to connect to the node and is established by authorizing with a private/public key pair. A role-based access control model allows configuring rights in the nodes, assigning roles to accounts (identified by monikers or their public key), and rights to roles (view, create, drop, read, write, compute) up to table level.
Multiple sessions can be created with the same account (eventually asking for different rights).
Full audit of all the operations can be enabled in the nodes (and stored locally or on a remote Weave).
APIs:
Creating an API client
Instantiating an API client can using a JSON definition.
The information needed is:
- the API version
- a sidechain local identifier
- the keys used to authorize (the keys can be specified as inline text or [recommended] as files. The public key can be derived from the private key, but it's recommended to have it in text format as it's the user identifier for all actions in the Weave)
- how to connect to the node: the transport protocol (HTTPS and WSS are supported by all API clients, with the Java API additionally supporting RabbitMQ, Kafka and ZeroMQ)
"chainClientConfig": {
"apiVersion" : 1,
"seed" : "92f30f0b6be2732cb817c19839b0940c",
"privateKeyFile" : "sample.pvk",
"publicKeyFile" : "sample.pub",
"http": {
"host": "public.weavechain.com",
"port": 443,
"useHttps": true
}
}
Sample code for creating a client API:
Javascript
import WeaveAPI from 'weaveapi'
const nodeApi = WeaveAPI.create(configuration);
await nodeApi.init();
const pong = await nodeApi.ping();
console.log(pong)
Python
from weaveapi import weaveapi
nodeApi = weaveapi.create(config)
Java
import com.weavechain.api.ChainApiFactory;
ApiClientV1 nodeApi = ChainApiFactory.createApiClient(configuration);
Session management
Once a client API is created, sessions can be created, logging in to the node and requiring specific access.
During the login, the following information is needed:
- the organization (can be "*" if there are no multiple organizations defined, case in which the field is ignored)
- the account moniker or public key to be used during authentication
- a space separated list of the data collection for which access is required (can be "*" in order to obtain access to all data collections for which the user is authorized)
- optional: credentials. These can be used in order to pass additional information that would make the user inherit rights given through other mechanism.
The supported additional mechanisms are:
- verifiable credentials (the issuer needs to be defined in node configs, specifying what roles or user templates they can delegate and a presentation of the verifiable credentials needs to be issued using the public key to be authorized as a challenge)
- wallet ownership for EVM compatible blockchains or Solana (the wallets can be given rights and the Weavechain keys used during login inherit those rights). The wallet ownership is verified by signing a message (with Metamask or Phantom) that does not involve any blockchain interaction or gas being paid
- NFTs (ERC-721, ERC-1155) or SoulBound Tokens ownership. The NFTs are specified only in the nodes configuration, the client just needs to prove the wallet ownership. Access can be gated based on collection ownership, owning a specific item or, with additional support added in the node, based on NFT traits.
Each session is allocated dynamically a new API key that allows access to the requested data collections. Each message has a nonce and is signed.
A session automatically expires after a period of time that is configured in the node (by default 24 hours).
Once a session was established, all API calls return a JSON structure with the operation result code, the operation target (if any was specified) and the operation reply (and eventually an additional error message).
Login
A weavechain private/public key pair is needed in order to login. Weavechain supports a full RBAC model, an account can be member of multiple organizations and within an organization roles can be assigned based on its public key. A role can give rights (such as read, write, delete, compute) on one or multiple data collections, with granularity up to table level.
In addition to pre-configured user level rights, roles could be inherited based on Verifiable Credentials, wallet ownership or NFT ownership (and traits), with these being passed during login in the optional credentials parameter.
The collections parameter can be used to create a session that is restricted to work only with specific data (* can be used to get maximum available rights).
Javascript
const session = await nodeApi.login(organization, account, collections, credentials);
console.log(session)
Python
session = nodeApi.login(organization, account, collections, credentials).get()
print(session)
Java
CompletableFuture<Session> session = nodeApi.login(organization, account collections, credentials);
Logout
Logout will remove the current session from the server.
Javascript, Python, Java
nodeApi.logout(session)
Check Session
Check session is a helper function to renew the API key in case it's expired. The credentials optional parameter can be used to pass verifiable credentials or wallet ownership information during relogin.
Javascript, Python, Java
nodeApi.checkSession(session, credentials)
Status API calls
Version
Returns the remote node API version
Javascript, Python, Java
nodeApi.version()
Ping
Checks the availability of a remote node and returns the [unadjusted] clock on the remote machine
Javascript
const reply = nodeApi.ping().get();
console.log(reply)
Python
reply = nodeApi.ping().get()
print(reply)
Java
OperationResult reply = nodeApi.ping().get();
Generate Keys
Generates a Weavechain private/public key pair. The keys are returned in compressed base58 format (and the public keys are prefixed with "weave")
Javascript, Python, Java
nodeApi.generateKeys()
Get Client Public Key
Returns the public key of the current API client
Javascript, Python, Java
nodeApi.getClientPublicKey()
Get Public Key
Returns the public key identifying the remote node to which the API is connected
Javascript, Python, Java
nodeApi.publicKey()
Get Signature Key
Returns the public key used for signing messages by the remote node (such as task lineage). This can be a Ed25519 or a Dilithium public key, depending on the node configuration.
Javascript, Python, Java
nodeApi.sigKey()
Data and Compute API
Get Status
Returns the status of the node to which the API is connected.
Javascript, Python, Java
nodeApi.status(session)
Create Table
Creates a table in a specified database or file storage, if user rights are allowing it.
Create operations can have several flags and modifiers passed as options:
- a boolean flag specifying if the operation should fail or continue without an error if the table already exists
- a boolean flag specifying if the table is replicated or not
- a layout of the table
- an operation timeout
Javascript, Python, Java
nodeApi.createTable(session, collection, table, options)
If no table layout is specified, by default the Weave will create a time series having an id column as the primary key, a data column to store blobs, a nullable metadata column to store additional information and a ts column holding a timestamp with the network time of the write operation.
Layouts can specify if a table is available for local access only or if they can be read remotely. Also, they contain details about the columns, their data types, if they are indexed, if they are encrypted (by the node, the encryption at rest of the underlying storage is separate), as well as if they have transformation for PII obfuscation.
Sample create operation of a non-replicated table accessible remotely:
Python
layout = {
"columns": {
"id": { "type": "LONG", "isIndexed": True, "isUnique": True, "isNullable": False },
"name_nickname": { "type": "STRING" },
"name_last": { "type": "STRING" },
"name_first": { "type": "STRING" },
"birthday": { "type": "STRING", "readTransform": "ERASURE" },
"email_personal": { "type": "STRING", "readTransform": "ERASURE" },
"phone_number": { "type": "STRING", "readTransform": "ERASURE" },
"address_country": { "type": "STRING" },
"address_summary": { "type": "STRING", "readTransform": "ERASURE" },
"address_timezone": { "type": "STRING" },
"linkedin_url": { "type": "STRING" },
"discord_username": { "type": "STRING" },
"telegram_username": { "type": "STRING" },
"ethereum_wallet_address": { "type": "STRING" }
},
"idColumnIndex": 0,
"isLocal": False,
"applyReadTransformations": True
}
collection = "weavedemo"
table = "directory"
nodeApi.createTable(session, collection, table, CreateOptions(False, False, layout))
Drop Table
Drops a table in the remote node, if user rights are allowing it.
Javascript, Python, Java
nodeApi.dropTable(session, collection, table)
Write Data
Writes a set of records into a table/time series. The simple access API can act in many different ways depending on the options passed and on the nodes configuration.
A write can be replicated or not, offer delivery guarantees, be paid or not, it can be done in a database or a file storage, it can be done in a replicated table or a private non-replicated table.
Batching records can also happen, locally (depending on the client API configuration) or remotely (depending on the node configuration). Batching can be done based on the number of records, their size or a maximum waiting time.
Javascript, Python, Java
nodeApi.write(session, collection, records, options)
The records structure contains the target table and a matrix with the data to be written.
The options passed can select the behavior of the write and have the following flags:
- guaranteed: if the write can be asynchronous or finishes only after the write replication and hash storage happened
- minAcks: the minimum number of nodes that need to replicate the data before considering the write successful, by default 1
- inMemoryAcks: boolean flag specifying if replicating nodes are allowed to acknowledge a write once they received (and verified) it or only after they persisted it in the local database or file storage, by default false
- writeTimeoutSec: specifies the operation timeout, by default 300 seconds
- allowDistribute: specifies if the operation is to be carried only on the destination node or the write needs to be distributed to peers. It can be overwritten by the node if the data owner does not want to allow this feature. The default value is true.
- signOnChain: boolean flag specifying if the record is to be hashed on chain. This can be overwritten by the node if the data owner does not want to allow this feature. The default value is true.
- syncSigning: boolean flag specifying if the hashes are stored on the blockchain assuring the immutability synchronously or the signing can be done async. The default value is false
Read Data
Reads a set of records from a table/time series. The simple API can cover multiple behaviors: the read operations can include immutability checks, can be paid or not (depending on the node configuration) or can be done from a single node or from multiple nodes.
Javascript, Python, Java
nodeApi.read(session, collection, table, filter, options)
The filter supports comparing operations (eq, neq, in, notin, gt, gte, lt, lte, and, or, not), multi-column ordering, limiting the output results count and multi-column collapsing.
Sample:
Python
filter = Filter(
FilterOp.opand(
FilterOp.eq("field1", "something"),
FilterOp.eq("field2", "something")
),
{ "id": "ASC" },
None, # No limit
None # No collapsing
)
The options passed can select the behavior of the write and have the following flags:
- verifyHash: a boolean flag that triggers an integrity check done by the node after reading the data. The default value is true, but it is often needed to turn it off or do it only once per session, as the hash checking operation can add slowness as it involves the blockchain. If the node is not trusted to do the check, the hashes could be verified by the client, as they are available on-chain.
- readTimeoutSec: the operation timeout
- peersConsensus: a number of nodes that need to agree with the data. This is an alternate way of checking data integrity in a distributed network (by doing data consensus) or a way to recover the data in case of immutability checks failure. The default value of this setting is 0, meaning that the node to which the API is connected is trusted to return the data. A special value can be used to retrieve data from all nodes that are active.
- enableMux: a boolean flag that specifies if data from multiple nodes is multiplexed or not. Enabling this flag is useful when multiple clients have different non-replicated parts of a shared dataset. The default value is false.
- includeCached: a boolean flag specifying if multiplexed reads can include values cached by a proxy node. In the scenario when nodes have non-replicated information, certain nodes can go off-line, making their data inaccessible. In such cases, to prevent intermittent data presence and if the network configuration allows it, proxy nodes can act as brokers for the data and cache it (in memory) for subsequent requests. This flag is turned off by default.
Read Data Hashes
Reads the hashes for a set of records from a table. The hashes are generated for batches of records, depending on the local and remote batching settings.
Javascript, Python, Java
nodeApi.hashes(session, collection, table, filter, options)
Delete
Removes a set of records matching a filter from a table/time series. The API will remove the data in the whole network if the collection is replicated, and re-hash the affected data.
Javascript, Python, Java
nodeApi.read(session, collection, table, filter, options)
The filter supports comparing operations (eq, neq, in, notin, gt, gte, lt, lte, and, or, not), multi-column ordering, limiting the output results count and multi-column collapsing.
Download Table
Downloads a subset of a table in a specified format, the result containing a base64 encoding of a zip file.
The downloaded data can be retrieved from a single node or from multiple ones, check for integrity etc.
The filter and options are similar to a read.
Supported formats: csv, json, feather, parquet, avro, orc, protobuf, toml, yaml
Javascript, Python, Java
nodeApi.downloadTable(session, collection, table, filter, format, options)
Publish Dataset
Publishes a dataset (snapshot, rolling or live) to be downloaded after paying on chain.
The return value will contain a DID of the dataset, following the did:weave:node:hash format. The hash is an actual hash of the data if the dataset is static, otherwise it's the hash of the data at the moment of creating the dataset.
The chain on which the payments are made and the token specified must be configured in the node.
Multiple chains are supported (and prefixing the token with the name of the configured chain is used to select which one to be used).
NFT gating is also possible, case in which the price will be negative and the token specifies the NFT contract address and, eventually, additional data if the permissioning needs to be for specific NFT IDs or traits.
Javascript, Python, Java
nodeApi.publishDataset(session, collection, table, filter, format, price, token, options)
Download Dataset
Downloads a previously published dataset, verifying access based on existing blockchain payment or NFT ownership.
Javascript, Python, Java
nodeApi.publishDataset(session, did, options)
Subscribe
The subscribe function allows triggering a read operation for a snapshot of the data, as well as subsequent updates in case new records are stored.
A subscription id is returned in the function result.
The options passed are similar as for the read() operation.
Not all multiplexing scenarios are supported for subscribe.
Javascript, Python, Java
nodeApi.subscribe(session, collection, table, filter, options, updateHandler)
Unsubscribe
Stops an active subscription of data, freeing server and network resources.
Javascript, Python, Java
nodeApi.unsubscribe(session, subscriptionId)
Compute To Data
Triggers a compute task remotely. This is a helper function to use a compute to data confidential compute pattern.
The name passed is a Docker or WebAssembly image that the client wants to run on the remote node and must be pre-authorized by the data owner and auditing all images before allowing them to run is highly recommended. The compute task should ingest data using the Weavechain API and can be written in any language. It also offers full flexibility in using 3rd party libraries as any code is allowed.
The compute engine needs to be configured in the node where the API is connected and it can spawn a task in a local or remote docker instance, in kubernetes or in-process for WebAssembly tasks.
A compute operation can be paid or not, depending on node configurations (payments could happen for the data read and for CPU time). Access to compute could also be pre-paid on-chain or gated with NFTs.
There are 3 ways in which a task can generate output information: by writing data to another output table, by returning a task output result or by logging to the console. These outputs can be limited or filtered.
The return value includes a taskId, the task outputs (if any), console logs and signatures. The outputs are signed and there are two types of signing supported, one using Ed25519 signatures of the hash of the outputs or, when the output is a binary PDF, signing with traditional certificates.
Optionally, if the node is configured to sign with quantum resistant hashes, Dilithium signatures will be used instead of Ed25519.
The following options can be specified for a compute operation:
- sync: a boolean flag specifying if the operation is to be performed in a synchronous fashion or async if no direct output is expected
- timeoutSec: the operation timeout
- peersConsensus: a number of nodes (or a special value specifying all active nodes) that need to agree with the output. By default a task is executed only on the node to which the API is connected, but if multiple nodes have a replicated dataset, a consensus can be requested (and the output needs to match and be signed by all nodes participating)
- params: custom parameters that need to be passed to the remote task
Javascript, Python, Java
nodeApi.compute(session, image, options)
Preventing data exfiltration can be configured server side by limiting the output by size, by adding keywords that trigger rejecting releasing the output to the consumer or forcing the output to follow a certain pattern.
Verify Lineage Signature
The result of a compute task can contain signatures for the outputs through which the node that performed the task vouches it used inputs having a certain hash, a docker image with another hash and produced the outputs given to the client.
This functionality can be used to verify the integrity of the output and contains details about all the data that entered the calculation, the hash of the docker image (or compute algo), as well as all the outputs, including the console. One hash is generated for everything that entered the calculation, as well as separate hashes can be produced for each table that was used as input data for the task.
A full lineage detail sample:
{'WEAVE_API_KEY': '8cf20ed5e21b40a0bc4a87ccd8e8ec98ba9ee426e98c7955',
'taskId': '8fe6dbfd565242629dbf74c4a144d666',
'input': '[{"hash":"IGA+57y2yLzmeCNUpkeUvTgeNXsXN15KxM7jHLb+c7o=","scope":"private","table":"questionnaire"},{"hash":"LXosgrO1PGi+0e55/0KZLM6G9dypYTdo9oAlJPVP/00=","scope":"private_files","table":"23andme.txt"}]',
'inputHash': 'X6e2zDacmwN2hfbMbXehC7BxeiCHyhY1Bk826oRrx32',
'writes': '[{"hash":"iCHCj17+5GHImAdSkX6OQisDRAgsWmkRh7brJrs3lGg=","scope":"private","table":"23andme_results"}]',
'writesSignature': '5dh1Sh4TrKsweb5dcFamuoQsZAVyvmLREAM1NfcpWzhdzmeV1unQfGueTGh4CqMHqZAdZKJRuZJjA2KzDKAHWHK8',
'computeHash': '3nw5CzrqaGfysne96Ki5gLFSeEdo1Wj9eVR6YqKMLw49',
'paramsHash': 'GKot5hBsd81kMupNCXHaqbhv3huEbxAFMLnpcX2hniwn',
'output': '{"snps": 6}',
'outputHash': 'HuN4mAHXcDes5DaDoknsKppzwfHGKL8XE3KfgcRNP4rK',
'outputSignature': 'mWyG3RMDVJfnu5cQP59CwYPFpx8ni7oz7ggVwwP99a21PmwPoivC4kyN2b8yMqPKm2ECk8tWp9kvC7MCXZrPK5U',
'outputSignatureTs': '2RFmH85HGiZsXsAtKFNij4aYrN8CjBt75k6d6Lsn9DuSL8DV3mnsXo2AJ5T6YWWddfWZAG7bK2HZpUWiaDehXqeN',
'console': '{"res":"ok","data":"pong 1674308381796"}\nDone.\n',
'consoleSignature': '4bcAE9V6QFyP3VmaoCizfHmLPhuXf1SnfaKKrjmEL8GWE8SYg5Ua1VbiBuyv2hQGtZzREDGLQ6wtYwFiaqzK65Zo',
'ts': '1674308385096'}
These signatures can be used also in an off-line context, as long as the public signing key of the node is known.
Javascript, Python, Java
nodeApi.verifyLineageSignature(signature, inputHash, computeHash, paramsHash, data)
Verify Signature
Verifying a random string of data that was signed by the node can be done using this function
Javascript, Python, Java
nodeApi.verifySignature(signature, data)
Hash Checkpoint
In order to be able to verify the hashes that are returned in the computational lineage, the API needs to have a mechanism to reproduce computing them by a party that has the same data.
The hashCheckpoint() function allows transient auditing of all data inputs and outputs in a session. A first call will enable this feature (which is disabled by default to save resources), and any subsequent call will return a list with all the read and write operations that were performed on that session between the last two checkpoints (including a salted hash of the data handled by each operation), as well as a generic inputHash and outputHash anchoring all data in a single hash, which can be matched against the values returned from a compute task.
Javascript, Python, Java
nodeApi.hashCheckpoint(signature, enable)
Homomorphic Encryption
Another confidential compute supported is a 1:1 scenario, where the consumer is running some code locally on his machine on encrypted data coming from the data owner.
The supported encryption scheme is CKKS and the underlying libraries are SEAL and EVA from Microsoft.
There is an exchange between the consumer and the data owner, with the first one receiving a set of the columns in plain text (if any configured like that, those could be part of aggregation criteria or not critical and exposable), and another set encrypted. The encrypted values can be used to do linear transformations (add, subtract, multipy, divide).
Encrypted values cannot be mixed with unencrypted values, you cannot add an encrypted number with a plaintext one.
The aggregated results must be sent to the data owner to be decrypted. The data owner will get the outputs, decrypt them and send them to the client only if he agrees to release the results (and size checks or filtering can be applied, to avoid unwanted data exfiltration). The consumer's code is not revealed to the data owner, and could combine the decisions with some local data that is not revealed to anyone else, but the remote data owner will see the results.
HE Get Inputs
This API call returns the inputs needed by a client running homomorphic encryption.
The datasources is a list of arguments used for read() API calls locally by the data owner.
Depending on the column definitions, data is allowed to be retrieved in plaintext (to be used by the consumer for aggregations or various decisions) or will be encrypted.
The arguments passed can be empty, case in which the plaintext data is retrieved, or the encodings of an EVA program params and signature, case in which the encrypted data is retrieved.
Javascript, Python, Java
nodeApi.heGetInputs(session, datasources, args)
Sample:
Python
datasources = {
# encrypted (per server side definition)
'q': [ collection, table, filter.toJson(), READ_DEFAULT_NO_CHAIN.toJson(), "quote" ],
't': [ collection, table, filter.toJson(), READ_DEFAULT_NO_CHAIN.toJson(), "timestamp" ],
# plaintext
'i': [ collection, table, filter.toJson(), READ_DEFAULT_NO_CHAIN.toJson(), "instrument" ],
}
# Retrieve plaintext inputs
reply = nodeApi.heGetInputs(session, datasources, []).get()
compiled_prog, params, signature = compile(program)
#Retrieve encrypted inputs
reply = nodeApi.heGetInputs(session, datasources, [ eva2str(params), eva2str(signature) ]).get()
HE Encode
Helper API function to allow a consumer to ask the data owner to encrypt custom numeric values with his own key, to be used in operations with other encrypted values.
Javascript, Python, Java
nodeApi.heEncode(session, items)
HE Get Outputs
After performing operations on encrypted data, the consumer needs to request the data owner to decrypt the results. This is done via the heGetOutputs function which will pass the encrypted values, the public context and the signature of an EVA program.
Javascript, Python, Java
nodeApi.heGetOutputs(session, encoded, args)
Sample:
Python
reply = nodeApi.heGetOutputs(session, eva2str(enc_outputs), [ e_public_ctx, eva2str(signature) ]).get()
Multi-Party Computing
MPC is a one consumer, many data owners confidential compute scenario, where some pre-defined statistical functions can be executed against a distributed dataset that is split across many owners.
The functions implemented range from descriptive stats and basic things like the distribution moments to linear regression.
The protocol used is SPDZ and Weavechain is using FRESCO from Alexandra Institute for underlying processing.
This is fully secure for the data owner as no unwanted data exfiltration can happen, but data can still be recovered if any number of computation rounds can be done and the input data is limited. That's why, in certain situations, the data owner might want to limit MPC to be available only if at least a number of records are used in the aggregation function, or at least N other parties are involved (from which at least M should be trusted, to avoid collusion to extract the data by the other participants).
This pattern is suitable when there is one consumer and many data owners that have different data following the same structure that can be analyzed by the consumer without seeing it.
The speed of running the protocol increases significantly first with the number of parties, then with the size of the data.
We allow a degenerated form of MPC to run 1:1, which translates into running predefined functions on a private dataset.
The operations supported are: correlation, inner product, linear regression, mean, median, stdev, variance, sum, t-test, two sample wilcoxon test and 2 parties private set intersection.
Although the records are not shared by the data owners, their hashes can be verified during the operation.
The operation can be launched on all active nodes or on a subset of the nodes, specifying them by their public key.
Javascript, Python, Java
nodeApi.mpc(session, collection, table, algo, fields, filter, options)
Storage Proof
This function can be used to obtain an interactive storage proof from a data owner. Integrity checks using hashes can guarantee the data values once retrieved, but just by checking hashes nodes cannot be checked that they actually hold the data. This function can be used to verify that a node has actual knowledge of the data, assuming the one triggering has a local copy or a dataset hash computed with the challenge.
The functionality can be restricted by the node, to prevent data exfiltration (as the filter can be used to pinpoint to individual records).
Note: the purpose of this function is to provide actual storage proofs, which can be used for immutability checks, but are actually different from the source integrity proofs (that can be achieved by enabling integrity checks and having columns that are automatically filled by the API with hashes and signatures from the source) and the live immutability proofs (which can be achieved by storing hashes of records or a merkle root hash on a blockchain).
nodeApi.storageProof(session, collection, table, filter, challenge, options)
ZK Storage/Data Proof
In order to prevent unwanted data exfiltration, this function can be used to obtain an interactive zero-knowledge proof instead of a hash.
The result of the is a Schnorr NIZK transcript that can be validated by the consumer.
Javascript, Python, Java
nodeApi.zkStorageProof(session, collection, table, filter, challenge, options)
A local proof can also be generated for any set of records or for an arbitrary string.
Java
nodeApi.zkDataProof(Records records, byte[] challenge)
nodeApi.zkDataProof(String data, byte[] challenge)
Verify ZK Storage/Data Proof
Helper function for verifying the transcript of a zk storage or arbitrary data proof generated by another party.
Java
nodeApi.verifyDataProof(Records data, byte[] challenge, String transcript)
boolean verifyDataProof(String data, byte[] challenge, String transcript)
Data Merkle Tree
This function can be used to generate a Merkle Tree out of arbitrary data stored in table and is a building block that can be used by applications built using Weavechain. Hashes of the data records are used to build a Merkle Tree, which then can be used to validate data inclusion by parties that know the data hashes.
This API call allows building a merkle tree out of partial data by using a filter, which is different from Merkle trees that can be configured to be automatically maintained in real-time by a node for the whole table.
Java
nodeApi.merkleTree(session, collection, table, filter, salt, digest, options)
ZK Merkle Tree
This function can be used to generate a Merkle Tree out of arbitrary data stored in table and is a building block that can be used by applications built using Weavechain. Hashes of zero-konwledge proofs of the data records are used to build a Merkle Tree, which then can be used to validate data inclusion by parties that can verify the proofs. The function returns the merkle tree and, separately, the data proofs.
Java
nodeApi.zkMerkleTree(session, collection, table, filter, salt, digest, options)
Verify Merkle Hash
Helper function for verifying that a piece of data with a known hash was included in a Merkle Tree or not.
Java
nodeApi.verifyMerkleHash(tree, hash, digest)
Verify Data Signature
Helper function for verifying that a piece of data with a known signer public key is matching a signature. Supported signatures are Ed25519 and Dilithium.
Java
nodeApi.verifyDataSignature(session, signer, signature, data)
Merkle Root Hash
This function returns the root hash of a merkle tree for a certain table. It works on merkle trees configured to be maintained in real-time by the node, in contrast with the merkleTree and verifyMerkleHash functions that can be used to build custom trees that could be needed by a user application built on top of Weavechain.
When the merkle trees service is enabled, the root hash is associating a single hash to the content of a whole table and can be configured to be put on a blockchain, offering another immutability proof (the other ones being the hashes of records (or batches) maintained live and which can be anchored on a blockchain, or programatically retrieving a storage proof or zk storage proof).
Java
nodeApi.rootHash(session, collection, table)
Merkle Proof
This function can be used to generate a Merkle Proof for a piece of data stored in a table. The merkle proof contains only the hashes needed to validate the inclusion of the specified hash. This function works on merkle trees configured to be maintained in real-time by the node.
Java
nodeApi.merkleProof(session, collection, table, hash)
Verify Merkle Proof
Helper function for verifying that a piece of data with a known hash was included in a Merkle Tree or not, using a proof. This function works on merkle trees configured to be maintained in real-time by the node
Java
nodeApi.verifyMerkleProof(recordHash, proof, rootHash)
Non-Interactive ZK Proofs for Data
This function implements non-interactive zero knowledge proofs for data using Bulletproofs.
There are 3 flavours, one that allows generating ZK proofs for each value of a column of the data, one which allows generating a batch proof for all records and one which allows generating Bulletproofs for a user specified set of values.
Javascript, Python, Java
nodeApi.zkProof(session, collection, table, gadget, params, fields, filter, zkOptions)
boolean zkDataProof(session, gadget, params, values, zkOptions)
There are multiple gadgets supported: numbers_in_range, number_is_positive, numbers_are_positive, number_is_greater_or_equal, number_is_less_or_equal, number_is_not_equal, number_is_non_zero, numbers_are_non_zero, number_is_zero, number_is_equal, number_in_list, number_not_in_list, mimc_hash_preimage, mimc_string_hash_preimage, sha256_hash_preimage, poseidon_hash_preimage
Verify Non-Interactive ZK Proofs for Data
This function allows verifying the data proofs.
Java
nodeApi.verifyZkProof(proof, gadgetType, params, commitment, nGenerators)
In case a node can be trusted to verify the proof, this operation can be delegated to be performed remotely
Javascript, Python, Java
nodeApi.verifyZkProof(session, proof, gadget, params, commitment, nGenerators)
Lineage API
Consumers to get information about the data and computation lineage, tracking changes and transformations, with guarantees from the data owners.
Data lineage is achieved by storing full audit records for all data operations, including reads.
Compute lineage is achieved by creating a chain of hashes and signatures: a hash is computed for all the input data that is read using the Weavechain API (and the order of operations matters), a hash of the docker image that is executed is used to identify the compute task and a hash of all the outputs that are written using the Weavechain API is also generated. The task output is also hashed and a signature is added by the node that did the computation, vouching for the results.
A task can generate outputs by by returning a task output or by writing to tables using the API.
[Section still under development, more functions to be added]
History
Returns all the read, write, delete operations on a set of records from a table, matching a filter (or all the table operations if the filter is not specified)
Javascript, Python, Java
nodeApi.history(session, collection, table, filter, options)
Get Task Lineage
Given an id of a compute to data task, this function returns:
- the hashes of all the inputs that were read using the Weavechain API
- the hash of the docker image executed
- the hash of all the records that were writtten using the Weavechain API
- a summary of all the writes, what tables were affected and the hashes of the records written
- the task output result
- a signature of the writes
- a signature of the output
Javascript, Python, Java
nodeApi.taskLineage(session, taskId)
Verify Task Lineage
This function verifies lineage details (the result of a get task lineage) by the node to which the API is connected, returning true if the node acknowledges that the lineage was generated by it.
Javascript, Python, Java
nodeApi.verifyTaskLineage(session, lineageData)
Retrieve Task Output Data
This function can be used to retrieve an archive with all the records that were written by a task. The result contains the actual data of all the writes (base64 encoded), the hash of the data and signatures from the node.
The options allow specifying the output format (which can be any of the file formats supported for download).
Javascript, Python, Java
nodeApi.taskOutputData(session, taskId, options)
Feeds API
The functions in this section are a way to automate deploys of Web3 oracles to be used for pushing data on-chain.
By doing an oracle deploy and a feed deploy, data that is written to a table can be streamed live on chain (or with a configured cadence).
Deploy Oracle
This is a minimal function that automates oracle deployment, making it easy for Weaves to egress data to blockchains.
The oracle currently supported for automated deploy is chainlink, with few more under development.
The options allow passing custom parameters to specify the owner, costs etc.
The parameters are still subject to changes as we normalize access to multiple oracles.
Javascript, Python, Java
nodeApi.deployOracle(session, oracleType, targetBlockchain, source, options)
Deploy Feed
Deploy feed is similar to a compute task and allows starting a generic service that is to be used as a data feed by an oracle. The webserver will be launched a as a docker image on the node's machine.
The return value is a feed identifier that can be used to control the service.
Javascript, Python, Java
nodeApi.deployFeed(session, image, options)
Remove Feed
Stops and removes a feed that was previously deployed.
Javascript, Python, Java
nodeApi.removeFeed(session, feedId)
Start Feed
Starts a data feed to be used as a Web2 source of truth for an oracle
Javascript, Python, Java
nodeApi.startFeed(session, feedId)
Stop Feed
Stops a feed.
Javascript, Python, Java
nodeApi.stopFeed(session, feedId)
Verifiable Credentials API
The credentials API functions offer an easy way to generate credentials and presentations following the W3C standard, as well as verifying them.
These credentials can be used in any context, even off-line, assuming the public key of the issuer is known.
Verifiable credentials can be used in Weavechain for obtaining data access by generating presentations from an issuer that is permissioned to delegate rights.
Issue Credentials
The function generates a new verifiable credential for a custom payload. Weavechain acts as a generic verifiable credentials issuer, this function is a helper that can be used by dApps built on top to handle their own logic by controlling what that payloads contains.
The credentials are intended to be private.
The options allow to specify additional flags, such as:
- the credential expiration timestamp
- the operation timeout
Javascript, Python, Java
nodeApi.issueCredentials(session, issuer, holder, credentials, options)
Verify Credentials
This function validates the verifiable credentials. The verification is done remotely in this case, but it can also be done locally, by checking the signatures.
Javascript, Python, Java
nodeApi.verifyCredentials(session, credentials, options)
Create Presentation
Once a set of verifiable credentials is held by a person, a presentation can be generated, showcasing only a partial subset of the information for which the original signer vouched.
The presentations are intended to be public.
The subject specifies a key from the payload, pointing to the subset of information that will be public. A presentation is generated without adding a signature to it, in order to do that, see the Sign function below.
Javascript, Python, Java
nodeApi.createPresentation(session, credentials, subject, options)
Sign Presentation
This function signs a presentation, adding a signature from the current node certifying the integrity of the data.
The presentation can contain a domain (specifying what's the indended usage of the presentation) as well as an optional challenge.
Javascript, Python, Java
nodeApi.signPresentation(session, presentation, domain, challenge, options)
Presentations can be used to certify accounts ownership, login to 3rd party services or for identity proofs.
Usage sample: during login(), Weavechain allows specifying additional credentials. By using the public key of a newly created session as a challenge, we can have newly created key pairs to inherit rights using verifiable credentials. This allows writing backends on top of Weavechain where people can be in charge of the authentication mechanism, instead of using the standard private/public key.
Verify Presentation
This function validates a presentation. The verification is done remotely by the node to which the API is connected, but it can also be done locally, by checking the signatures.
Javascript, Python, Java
nodeApi.verifyPresentation(session, presentation, domain, challenge, options)
Attestations API
Nodes can run in a secure enclave to ensure data integrity and privacy. There are two simple APIs that make using SGX straightforward, assuming the node is running on an SGX enabled machine and was started as such.
SGX Quote
This request generates a report or quote to be used either for local attestation or for remote attestation. The is a single parameter, "local" which can be True or False, depending on the desired attestation type.
Javascript, Python, Java
nodeApi.sgxQuote(session, params)
SGX Attestation
The SGX attestation can be done either locally, if the report passed is from the same machine, or remotely, case in which either Intel IAS can be used or, if in Azure's cloud, an endpoint for Microsoft's attestations.
The message receives as input the "local" flag, specifying if it's a local or remote attestation, and the "sgx_enclave_quote" to be validated, as well as the "runtime_data" which is the user specific information that is hashed and included in the attestation report.
The reply will contain the mr_enclave, mr_signer, product_id as well as details about the issuer and the token (in case of remote attestations).
Javascript, Python, Java
nodeApi.attest(session, params)
Messaging API
The messaging API has the role of enabling Weavechain API users to build interactive dApps. Its purpose is to provide a simple messaging mechanism between API sessions.
The exchange of information between dApps can also be done using regular read and write operations in a table, which also offers persistence and full audit. The messaging API is intended to be used for transient communications.
In order to be able to communicate with another session, one needs to know its ID and the other API client to be connected to the same node.
Messages have a maximum time to live (24h by default) are sent to inboxes, each one having a limit (1000 by default).
This feature is subject to changes as it still evolves.
Post Message
This posts a message from the current session to another API session, whose identifier is used as the target inbox.
The message options allow specifying:
- the operation timeout
- the message maximum time to live
Javascript, Python, Java
nodeApi.postMessage(session, targetInboxKey, message, options)
Poll Messages
This function retrieves all messages received by the current session from another session, identified by its key. A null value for the inbox key will retrieve all messages received, no matter the originator
Javascript, Python, Java
nodeApi.pollMessages(session, inboxKey, options)
Admin API
Status
Retrieves the status of the node
Javascript, Python, Java
nodeApi.status(session)
Get Sidechain Details
Retrieves details about a sidechian, such as its seed, name, description, logo.
Javascript, Python, Java
nodeApi.getSidechainDetails(session)
Get Account Details
Retrieves details about a user, such as rights, name, avatar.
Javascript, Python, Java
nodeApi.getUserDetails(session, publicKey)
Get Nodes
Retrieves the list of active nodes about which the node to which the API is connected knows about.
Nodes can have 3 types:
- active nodes: to which the remote node has direct connections
- passive nodes: which are connected to the remote node but to which the node is not able to initiate a connection (such as nodes behind a firewall)
- proxied nodes: nodes that are not connected to the current node, but which are known to other nodes in the neighbourhood. Their messages can be forwarded (encrypted) by proxy nodes and the replication or MPC can work as if they are part of the network.
Javascript, Python, Java
nodeApi.getNodes(session)
Get Collections
Retrieves a list of the data collections known to the node. The list contains only the collections for which the user initiating the call has "view" rights.
Data collections can have different underlying methods of persisting, such as databases (Postgres, MySQL, SQLite, Cassandra etc.) or file storages (local, S3, IPFS).
Javascript, Python, Java
nodeApi.getScopes(session)
Get Tables
Returns the list of tables available and visible to the user in a data collection.
Javascript, Python, Java
nodeApi.getTables(session, collection)
Get Table Definition
Returns a table layout, which contains the name of the columns, their data type, if they are indexed, unique, nullable, encrypted or if there are any data transformation applied when reading the data by people that are not the data owners.
Javascript, Python, Java
nodeApi.getTableDefinition(session, collection, table)
Get Node Config
Returns a JSON with the node configuration. Only the node owner is allowed to retrieve the configuration.
Javascript, Python, Java
nodeApi.getNodeConfig(session, nodePublicKey)
Get Account Notifications
Retrieves a list of notifications for the user. This list can include integrity warnings or voting that needs to happen in order to change network configurations.
[This feature is still under development]
Javascript, Python, Java
nodeApi.getAccountNotifications(session)
Create User Account
This function allows permissioning a new account dynamically. A list of roles can be assigned to the user.
The account monikier is optional, the public key can be used instead.
Javascript, Python, Java
nodeApi.createUserAccount(session, organization, account, publicKey, roles)
Update Table Definition
This function allows changing a table layout, such as specifying encryption for fields, marking fields if they are allowed to be sent as plain text or only encrypted on homomorphic encryption calls, if fields are PII and need to be obfuscated (and how), if a table is private and accessible only locally or it can be read remotely etc.
For a sample layout, see the Create Table function.
Certain table definition changes for replicated collections require the whole network consensus.
[This section behavior is still subject to change]
Javascript, Python, Java
nodeApi.updateLayout(session, collection, table, layout)
Update Config
Generic function to allow updating any section of a config, assuming the caller is a node owner.
Certain config changes for replicated collections require the whole network consensus.
Once a node starts, it retrieves the file configuration and stores it to an internal table. Any subsequent configuration changes are stored in that time series and include a signature from the originator.
[This section behavior is still subject to change]
Javascript, Python, Java
nodeApi.updateConfig(session, path, values)
Layer-1 API
The Weavechain Layer-1 is a ledger that can be used internally by Weaves to store hashes and record micropayments. Its goals are to offer free micropayments inside a private data sharing network and to offer an alternative to blockchains that require more complicated setups when the hashes are stored in a trusted private network. It is also used for achieving faster performance for hashes storage as the ledger can live in the same process with the data nodes and avoids serialization/deserialization of smart contract states on remote blockchains.
The internal payments can be handled in any ERC-20 token, the bridging tokens from a remote blockchain happening with the help of a smart contract deployed on the remote chain.
A small set of internal smart contracts are deployed on the internal chain.
[This section is still under heavy development]
Query Balance
Retrieves the balance of an account in a certain token. The balances are global, but might be distributed per data collection in the future.
Javascript, Python, Java
nodeApi.balance(session, account, collection, token)
Transfer
Transfers an amount in a certain token to another address defined on the Layer-1.
Javascript, Python, Java
nodeApi.transfer(session, account, collection, token, amount)
Call Contract Method
A generic function to call any smart contract function.
Javascript, Python, Java
nodeApi.call(session, contract, collection, fn, data)
Query Contract State
Returns a serialization of a smart contract state. The main usage of contracts is to store hashes details. A contract can have a different state for each data collection.
Javascript, Python, Java
nodeApi.contractState(session, contract, collection)
Update Fees
Updates the fees for a data collection, if the caller is the owner.
The fees can be defined up to table level and charged per number of records, per their size (serialization dependent), per unit of time, capped or not capped.
The fee token is defined by data collection.
Javascript, Python, Java
nodeApi.updateFees(session, collection, fees)
Sample fees format where writers are given 1 token for each record and readers are charged 1 token for each record:
{ "fees":
[
{"operation":"read", "fee": {"count":"1", "fee": 1, "type":"count"} },
{"operation":"write","fee": {"count":"1","fee": -1,"type":"count"} }
]
}