Update process

pull/124/head
Baohua Yang 2018-08-20 15:28:43 +08:00
parent 43e32414c5
commit 6e96f4eaf7
30 changed files with 25679 additions and 25825 deletions

View File

@ -1,5 +1,9 @@
# Makefile to bootup the network, and do operations (channel, chaincode)
# Makefile to bootup the network, and do testing with channel, chaincode
# Run `make test` will pass all testing cases, and delete the network
# Run `make ready` will create a network, pass testing cases, and stand there for manual test, e.g., make test_channel_list
# support advanced bash grammar
SHELL:=/bin/bash
# mode of the network: solo, kafka, couchdb, event, dev
HLF_MODE ?= solo
HLF_VERSION ?= 1.1.0
@ -28,14 +32,15 @@ all: test
test:
@echo "Run test with $(COMPOSE_FILE)"
@echo "Please make sure u have setup Docker and pulled images by 'make setup'."
@echo "Please make sure u have setup Docker and pulled images by 'make setup download'."
make ready # Finish all testing
make ready # Run all testing till ready
make stop clean
ready: # create/join channel, install/instantiate cc
make stop
# make clean_config # Remove existing crypto-config and channel artifacts.
make gen_config # Will ignore if local config path exists
make start
@ -45,21 +50,19 @@ ready: # create/join channel, install/instantiate cc
sleep ${NETWORK_INIT_WAIT}; \
fi
make test_channel_create
make test_channel_join
make channel_test
make update_anchors
make test_cc_install
make test_cc_instantiate
make test_cc_invoke_query
make cc_test
make test_lscc # test lscc operations
make test_qscc # test qscc operations
make test_fetch_blocks # fetch block files
make test_config_update # not work with this version
make test_channel_update # not work with this version
make test_config_update
make test_channel_update
make test_fetch_blocks # fetch block files again
make test_configtxlator
@ -67,9 +70,13 @@ ready: # create/join channel, install/instantiate cc
make logs_save
@echo "Now the fabric network is ready to play"
@echo "run 'make cli' to enter into the fabric-cli container."
@echo "run 'make stop' when done."
@echo "* run 'make cli' to enter into the fabric-cli container."
@echo "* run 'make stop' when done."
# channel related operations
channel_test: test_channel_create test_channel_join test_channel_list test_channel_getinfo
# chaincode related operations
cc_test: test_cc_install test_cc_instantiate test_cc_invoke_query
restart: stop start
start: # bootup the fabric network
@ -84,6 +91,12 @@ stop: # stop the fabric network
chaincode_dev: restart chaincode_init test_cc_peer0 stop
################## Channel testing operations ################
test_channel_list: # List the channel that peer joined
@echo "List the joined channels"
@docker exec -it fabric-cli bash -c "cd /tmp; bash scripts/test_channel_list.sh"
test_channel_getinfo: # Get info of a channel
@echo "Get info of the app channel"
@docker exec -it fabric-cli bash -c "cd /tmp; bash scripts/test_channel_getinfo.sh"
test_channel_create: # Init the channel
@echo "Create channel on the fabric network"
@ -168,6 +181,8 @@ clean: # clean up containers
@-docker ps -a | awk '{ print $$1,$$2 }' | grep "hyperledger/fabric" | awk '{ print $$1 }' | xargs -r -I {} docker rm -f {}
@-docker ps -a | awk '$$2 ~ /dev-peer/ { print $$1 }' | xargs -r -I {} docker rm -f {}
@-docker images | awk '$$1 ~ /dev-peer/ { print $$3 }' | xargs -r -I {} docker rmi -f {}
echo "May manually clean the crypto-config and $(MODE)/channel-artifacts"
clean_config: clean_channel_artifacts clean_crypto_config
env_clean: # clean up environment
@echo "Clean all images and containers"
@ -206,7 +221,16 @@ gen_config: # generate config artifacts
bash scripts/gen_config.sh solo; \
fi
clean_channel_artifacts: # clean channel related artifacts
if [ "$(HLF_MODE)" = "kafka" ]; then \
rm -rf kafka/channel-artifacts; \
else \
rm -rf solo/channel-artifacts; \
fi
clean_crypto_config: # clean config artifacts
rm -rf crypto-config
rm -rf org3/crypto-config
download: # download required images
@echo "Download Docker images"
bash scripts/download_images.sh

View File

@ -65,7 +65,7 @@ services:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=v110_default # uncomment this to use specific network
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the group leader, default to false
#- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_PROFILE_ENABLED=false
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key

View File

@ -35,7 +35,7 @@ for IMG in baseimage baseos couchdb kafka zookeeper; do
done
echo "=== Pulling fabric images ${FABRIC_IMG_TAG} from fabric repo... ==="
for IMG in peer tools orderer ca ccenv; do
for IMG in peer tools orderer ca ccenv tools couchdb kafka zookeeper; do
HLF_IMG=hyperledger/fabric-${IMG}:$ARCH-$FABRIC_IMG_TAG
pull_image $HLF_IMG
done

View File

@ -22,3 +22,4 @@ install_docker_compose() {
command -v "docker" >/dev/null 2>&1 && echo "Docker already installed" || install_docker
command -v "docker-compose" >/dev/null 2>&1 && echo "Docker-Compose already installed" || install_docker_compose
command -v "jq" >/dev/null 2>&1 && echo "jq already installed" || sudo apt-get install jq

View File

@ -65,7 +65,7 @@ setEnvs () {
t="\${ORG${org}_ADMIN_MSP}" && export CORE_PEER_MSPCONFIGPATH=`eval echo $t`
t="\${ORG${org}_PEER${peer}_TLS_ROOTCERT}" && export CORE_PEER_TLS_ROOTCERT_FILE=`eval echo $t`
#env |grep CORE
env |grep CORE_PEER
}
checkOSNAvailability() {
@ -191,6 +191,35 @@ getShasum () {
[ ! $# -eq 1 ] && exit 1
shasum ${1} | awk '{print $1}'
}
channelList () {
local org=$1
local peer=$2
echo "=== List the channels that org${org}/peer${peer} joined === "
setEnvs $org $peer
peer channel list >&log.txt
rc=$?
[ $rc -ne 0 ] && cat log.txt
if [ $rc -ne 0 ]; then
echo "=== Failed to list the channels that org${org}/peer${peer} joined === "
else
echo "=== Done to list the channels that org${org}/peer${peer} joined === "
fi
}
channelGetInfo () {
local channel=$1
local org=$2
local peer=$3
echo "=== Get channel info of ${channel} with id of org${org}/peer${peer} === "
setEnvs $org $peer
peer channel getinfo -c ${channel} >&log.txt
rc=$?
[ $rc -ne 0 ] && cat log.txt
if [ $rc -ne 0 ]; then
echo "=== Fail to get channel info of ${channel} with id of org${org}/peer${peer} === "
else
echo "=== Done to get channel info of ${channel} with id of org${org}/peer${peer} === "
fi
}
# Fetch all blocks for a channel
# Usage: channelFetchAll channel org peer

View File

@ -18,7 +18,7 @@ echo_b "Querying chaincode ${CC_NAME} on peer org2/peer0..."
chaincodeQuery ${APP_CHANNEL} 2 1 ${CC_NAME} ${CC_QUERY_ARGS} 100
#Invoke on chaincode on Peer0/Org1
echo_b "Sending invoke transaction (transfer 10) on org1/peer0..."
echo_b "Sending invoke transaction (transfer 10) representing org1/peer0..."
chaincodeInvoke ${APP_CHANNEL} 1 0 ${CC_NAME} ${CC_INVOKE_ARGS}
#Query on chaincode on Peer1/Org2, check if the result is 90

View File

@ -0,0 +1,23 @@
#!/bin/bash
# Importing useful functions for cc testing
if [ -f ./func.sh ]; then
source ./func.sh
elif [ -f scripts/func.sh ]; then
source scripts/func.sh
fi
## Join all the peers to the channel
echo_b "=== Getting info of channel ${APP_CHANNEL}... ==="
for org in "${ORGS[@]}"
do
for peer in "${PEERS[@]}"
do
channelGetInfo ${APP_CHANNEL} $org $peer
done
done
echo_g "=== Get info of channel ${APP_CHANNEL} Complete ==="
echo

View File

@ -0,0 +1,23 @@
#!/bin/bash
# Importing useful functions for cc testing
if [ -f ./func.sh ]; then
source ./func.sh
elif [ -f scripts/func.sh ]; then
source scripts/func.sh
fi
## Create channel
echo_b "=== Listing joined channels... ==="
for org in "${ORGS[@]}"
do
for peer in "${PEERS[@]}"
do
channelList $org $peer
done
done
echo_g "=== Done listing joined channels ==="
echo

View File

@ -7,7 +7,7 @@ SYS_CHANNEL="testchainid"
APP_CHANNEL="businesschannel"
# Client cmd execute timeout and retry times
TIMEOUT="30"
TIMEOUT="60"
MAX_RETRY=5
# Organization and peers

View File

@ -0,0 +1,116 @@
{
"payload": {
"data": {
"config_update": {
"channel_id": "businesschannel",
"read_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"mod_policy": "",
"version": "0"
},
"Org2MSP": {
"mod_policy": "",
"version": "0"
}
},
"mod_policy": "",
"version": "0"
}
},
"mod_policy": "",
"values": {
"Consortium": {
"mod_policy": "",
"version": "0"
}
},
"version": "0"
},
"type": 0,
"write_set": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"mod_policy": "",
"version": "0"
},
"Org2MSP": {
"mod_policy": "",
"version": "0"
}
},
"mod_policy": "Admins",
"policies": {
"Admins": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Admins"
}
},
"version": "0"
},
"Readers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "ANY",
"sub_policy": "Readers"
}
},
"version": "0"
},
"Writers": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "ANY",
"sub_policy": "Writers"
}
},
"version": "0"
}
},
"values": {
"Capabilities": {
"mod_policy": "Admins",
"version": "0"
}
},
"version": "1"
}
},
"mod_policy": "",
"values": {
"Consortium": {
"mod_policy": "",
"value": {
"name": "SampleConsortium"
},
"version": "0"
}
},
"version": "0"
}
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"epoch": "0",
"timestamp": "2018-08-20T02:21:38.000Z",
"tx_id": "",
"type": 2,
"version": 0
}
}
}
}

View File

@ -698,13 +698,13 @@
},
"signatures": [
{
"signature": "MEQCIA8saAN4dQAJqs6/hjPA/2m2h7m2/TRE/pZyKNKoHC26AiBIlB5qw+3ATn3oX4ruvzxrLCLPF4CrmEltCrWri2ikVg==",
"signature": "MEQCIDOl61CxmZnjAjnHz4fmYes8TcojZuX2+XtzdEfOhf4eAiBKlJwk/AtukeV8pEgq/2JcCnnSSz3ZNXxkVm7dSjB5AQ==",
"signature_header": {
"creator": {
"id_bytes": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNHakNDQWNDZ0F3SUJBZ0lSQUlGd0tEeURCdXh6ZWg4NGljSmh0ejh3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGd3TkRBeU1ESXpNRE0zV2hjTk1qZ3dNek13TURJek1ETTMKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQk1SQ2lBVEQwNHI3WEE1MlR1d21rbVFpb1BNNDNrWjAKR29mVUVwazZMM3BLc0lXZDRyOEVyY1l2aGpKOUZ3TC9aa1FwamJmVWczTDVOTXZQVVlzRUJOcWpUVEJMTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBTUJnTlZIUk1CQWY4RUFqQUFNQ3NHQTFVZEl3UWtNQ0tBSU14bWdiWEIySDQyClpaSElxZk1yUm1ZTXJGTlFjRVFMWkRNQXpSNllTT25oTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFESXFIbkYKTVRueENhY3VqWFExSWRNYjRQM1dQNkFwRzJvNDFmODlzWHQ0RGdJZ1pHR2lIckQ2eG5nMEdIQ1R6dVpjay9keApEVTRteGhRT3piQmxOOUJSaXRVPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==",
"mspid": "Org2MSP"
},
"nonce": "w2EHWZNMnmJYhRB53At/n9UYiiJ/5FtS"
"nonce": "2yjv89nxowCrMWBDCN7CyFkQN9448JVC"
}
}
]
@ -713,7 +713,7 @@
"channel_header": {
"channel_id": "businesschannel",
"epoch": "0",
"timestamp": "2018-04-02T02:35:55.000Z",
"timestamp": "2018-08-20T06:36:06.000Z",
"tx_id": "",
"type": 2,
"version": 0
@ -723,18 +723,18 @@
"id_bytes": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNHakNDQWNDZ0F3SUJBZ0lSQUlGd0tEeURCdXh6ZWg4NGljSmh0ejh3Q2dZSUtvWkl6ajBFQXdJd2N6RUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhHVEFYQmdOVkJBb1RFRzl5WnpJdVpYaGhiWEJzWlM1amIyMHhIREFhQmdOVkJBTVRFMk5oCkxtOXlaekl1WlhoaGJYQnNaUzVqYjIwd0hoY05NVGd3TkRBeU1ESXpNRE0zV2hjTk1qZ3dNek13TURJek1ETTMKV2pCYk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTgpVMkZ1SUVaeVlXNWphWE5qYnpFZk1CMEdBMVVFQXd3V1FXUnRhVzVBYjNKbk1pNWxlR0Z0Y0d4bExtTnZiVEJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQk1SQ2lBVEQwNHI3WEE1MlR1d21rbVFpb1BNNDNrWjAKR29mVUVwazZMM3BLc0lXZDRyOEVyY1l2aGpKOUZ3TC9aa1FwamJmVWczTDVOTXZQVVlzRUJOcWpUVEJMTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBTUJnTlZIUk1CQWY4RUFqQUFNQ3NHQTFVZEl3UWtNQ0tBSU14bWdiWEIySDQyClpaSElxZk1yUm1ZTXJGTlFjRVFMWkRNQXpSNllTT25oTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFESXFIbkYKTVRueENhY3VqWFExSWRNYjRQM1dQNkFwRzJvNDFmODlzWHQ0RGdJZ1pHR2lIckQ2eG5nMEdIQ1R6dVpjay9keApEVTRteGhRT3piQmxOOUJSaXRVPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==",
"mspid": "Org2MSP"
},
"nonce": "Q3Pu3pjT4oKYb2B/WGd4LjzCtWFNvwAB"
"nonce": "CQuP6iJ1BJvmoPMOqs3w8IeJZGNUrG0Z"
}
}
},
"signature": "MEQCIAHBqHWlRFNl1qYkqGWwZgU1N1ufcAzKUBkMjfwzXTaXAiAmuPEgzABfraFtq46QGRzI47iVV4iY2hAkaf/5v/Ni4g=="
"signature": "MEQCICbIgDycvMnP08dY204A7tYc3yVjAGKPga523EA/xJQpAiAFfIVABnvurPjn/qDPJRbPsvYIvpJNqOmA5TRumeHo4Q=="
}
},
"header": {
"channel_header": {
"channel_id": "businesschannel",
"epoch": "0",
"timestamp": "2018-04-02T02:35:55.000Z",
"timestamp": "2018-08-20T06:36:06.000Z",
"tx_id": "",
"type": 1,
"version": 0
@ -744,23 +744,23 @@
"id_bytes": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNERENDQWJLZ0F3SUJBZ0lRUysyUitKSWo5WnBKTHhOSWk1MmtHREFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTRNRFF3TWpBeU16QXpOMW9YRFRJNE1ETXpNREF5TXpBek4xb3dXREVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4SERBYUJnTlZCQU1URTI5eVpHVnlaWEl1WlhoaGJYQnNaUzVqYjIwd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxCmhrak9QUU1CQndOQ0FBUWlJMzQ2VitObUJNM2xVcGxoODVpTFYzbmF1aVNLRzRjZjE4NWVQTXgxWWp4RG53RlkKaUx5aEFzMmtxSTA3Ly9COXFCOFZwOVh4TVlBeVU3UXVGZGhNbzAwd1N6QU9CZ05WSFE4QkFmOEVCQU1DQjRBdwpEQVlEVlIwVEFRSC9CQUl3QURBckJnTlZIU01FSkRBaWdDQ1BhWDVvUEsyVk5lN2NxU2g2KzRmQVVPRSszQk9FCnJjbGtRSE0xSlpORFFqQUtCZ2dxaGtqT1BRUURBZ05JQURCRkFpRUF0N283UGkzZWVweGpWd24zRTB6Y2ptd2sKQTBIVDh4MnpSYXMwTjlqZ0E0OENJQ1kzUTRjMXM3QlJHcXRsSkF2VU9vMUo0SitXbkRhTGVlS01ZWmRWUWl6TgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==",
"mspid": "OrdererMSP"
},
"nonce": "QPlC4ualNz0Zr/BsaYsnRkMtRap1do8/"
"nonce": "W6NRj5ATK906KzyY/FHCHP9ZYH9T9yw5"
}
}
},
"signature": "MEUCIQC4vcjUtdbsCEVnXtMXUUcz3DIi3HyLA2UbFqIjrEF9gwIgLwwdcn+h8ZICNS3SVM4jGRo+NgX4Lp85m4O0EG6mWV8="
"signature": "MEQCIFfRKhiHGzqXG+4ZIa3NQV0k7p7JKoe+r6yTf6yZnMwsAiBX+o8RxvZMAAiK4Jxkd8nm2KTfhz/YC18qc2HXly017A=="
}
]
},
"header": {
"data_hash": "2GGNy1iGuB1oWlh+iSbhLjnCdabAfkk5eOrGyK02r6s=",
"data_hash": "Rk8BCGQmhNJTKP7CmGijc3Ub/WEjizb6cbYhmQvVeWk=",
"number": "2",
"previous_hash": "AxTJ7IK1EB4a/cD9+Y6JVJoUE3Kr4xzEojJ16Xl2w18="
"previous_hash": "e1zZVoSuT5rHiJXe9o7fZWmoYM1ZhxdLk4Pc2qtWoSE="
},
"metadata": {
"metadata": [
"EvkGCq0GCpAGCgpPcmRlcmVyTVNQEoEGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNERENDQWJLZ0F3SUJBZ0lRUysyUitKSWo5WnBKTHhOSWk1MmtHREFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTRNRFF3TWpBeU16QXpOMW9YRFRJNE1ETXpNREF5TXpBek4xb3dXREVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4SERBYUJnTlZCQU1URTI5eVpHVnlaWEl1WlhoaGJYQnNaUzVqYjIwd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxCmhrak9QUU1CQndOQ0FBUWlJMzQ2VitObUJNM2xVcGxoODVpTFYzbmF1aVNLRzRjZjE4NWVQTXgxWWp4RG53RlkKaUx5aEFzMmtxSTA3Ly9COXFCOFZwOVh4TVlBeVU3UXVGZGhNbzAwd1N6QU9CZ05WSFE4QkFmOEVCQU1DQjRBdwpEQVlEVlIwVEFRSC9CQUl3QURBckJnTlZIU01FSkRBaWdDQ1BhWDVvUEsyVk5lN2NxU2g2KzRmQVVPRSszQk9FCnJjbGtRSE0xSlpORFFqQUtCZ2dxaGtqT1BRUURBZ05JQURCRkFpRUF0N283UGkzZWVweGpWd24zRTB6Y2ptd2sKQTBIVDh4MnpSYXMwTjlqZ0E0OENJQ1kzUTRjMXM3QlJHcXRsSkF2VU9vMUo0SitXbkRhTGVlS01ZWmRWUWl6TgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tChIYjv5uhVNNrKivH+vRjRAet/Du2o5nQFbgEkcwRQIhAKK0XRYkHw2IcNqS4owrRiLzWEk9TFse5nrei9nSNE8sAiBFWhxGgfsJsJacvGZyXRAkod/Uxp+iGtHvYUkNHUihUQ==",
"CgIIAhL4BgqtBgqQBgoKT3JkZXJlck1TUBKBBi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDRERDQ0FiS2dBd0lCQWdJUVMrMlIrSklqOVpwSkx4TklpNTJrR0RBS0JnZ3Foa2pPUFFRREFqQnBNUXN3CkNRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnkKWVc1amFYTmpiekVVTUJJR0ExVUVDaE1MWlhoaGJYQnNaUzVqYjIweEZ6QVZCZ05WQkFNVERtTmhMbVY0WVcxdwpiR1V1WTI5dE1CNFhEVEU0TURRd01qQXlNekF6TjFvWERUSTRNRE16TURBeU16QXpOMW93V0RFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHoKWTI4eEhEQWFCZ05WQkFNVEUyOXlaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNQkJ3TkNBQVFpSTM0NlYrTm1CTTNsVXBsaDg1aUxWM25hdWlTS0c0Y2YxODVlUE14MVlqeERud0ZZCmlMeWhBczJrcUkwNy8vQjlxQjhWcDlYeE1ZQXlVN1F1RmRoTW8wMHdTekFPQmdOVkhROEJBZjhFQkFNQ0I0QXcKREFZRFZSMFRBUUgvQkFJd0FEQXJCZ05WSFNNRUpEQWlnQ0NQYVg1b1BLMlZOZTdjcVNoNis0ZkFVT0UrM0JPRQpyY2xrUUhNMUpaTkRRakFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUVBdDdvN1BpM2VlcHhqVnduM0UwemNqbXdrCkEwSFQ4eDJ6UmFzME45amdBNDhDSUNZM1E0YzFzN0JSR3F0bEpBdlVPbzFKNEorV25EYUxlZUtNWVpkVlFpek4KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoSGHrO34BkzW7HlIn9SflozfIxYDsQ2dDqLxJGMEQCID5q3xhBmpBWhucPd0mJwfv0rdfNOeooc1psBzfFyTBEAiByL5zpd9dwDKHi4DBH0FWgWHee0wge18bykVyMAcGG1Q==",
"EvgGCq0GCpAGCgpPcmRlcmVyTVNQEoEGLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNERENDQWJLZ0F3SUJBZ0lRUysyUitKSWo5WnBKTHhOSWk1MmtHREFLQmdncWhrak9QUVFEQWpCcE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVVNQklHQTFVRUNoTUxaWGhoYlhCc1pTNWpiMjB4RnpBVkJnTlZCQU1URG1OaExtVjRZVzF3CmJHVXVZMjl0TUI0WERURTRNRFF3TWpBeU16QXpOMW9YRFRJNE1ETXpNREF5TXpBek4xb3dXREVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDa05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNURFZOaGJpQkdjbUZ1WTJsegpZMjh4SERBYUJnTlZCQU1URTI5eVpHVnlaWEl1WlhoaGJYQnNaUzVqYjIwd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxCmhrak9QUU1CQndOQ0FBUWlJMzQ2VitObUJNM2xVcGxoODVpTFYzbmF1aVNLRzRjZjE4NWVQTXgxWWp4RG53RlkKaUx5aEFzMmtxSTA3Ly9COXFCOFZwOVh4TVlBeVU3UXVGZGhNbzAwd1N6QU9CZ05WSFE4QkFmOEVCQU1DQjRBdwpEQVlEVlIwVEFRSC9CQUl3QURBckJnTlZIU01FSkRBaWdDQ1BhWDVvUEsyVk5lN2NxU2g2KzRmQVVPRSszQk9FCnJjbGtRSE0xSlpORFFqQUtCZ2dxaGtqT1BRUURBZ05JQURCRkFpRUF0N283UGkzZWVweGpWd24zRTB6Y2ptd2sKQTBIVDh4MnpSYXMwTjlqZ0E0OENJQ1kzUTRjMXM3QlJHcXRsSkF2VU9vMUo0SitXbkRhTGVlS01ZWmRWUWl6TgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tChIYs5vW1Pt8B5Q1YgRvFqRChLudVG5USvi2EkYwRAIgM6aenJP2Z7qd59MkWH6r60cj63UYRdQIrFZRQN5XWw4CIDi+pO1sDD+67/zPZdbyyEsnJbWPpWinc61SE2eEvI28",
"CgIIAhL5BgqtBgqQBgoKT3JkZXJlck1TUBKBBi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDRERDQ0FiS2dBd0lCQWdJUVMrMlIrSklqOVpwSkx4TklpNTJrR0RBS0JnZ3Foa2pPUFFRREFqQnBNUXN3CkNRWURWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnkKWVc1amFYTmpiekVVTUJJR0ExVUVDaE1MWlhoaGJYQnNaUzVqYjIweEZ6QVZCZ05WQkFNVERtTmhMbVY0WVcxdwpiR1V1WTI5dE1CNFhEVEU0TURRd01qQXlNekF6TjFvWERUSTRNRE16TURBeU16QXpOMW93V0RFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHoKWTI4eEhEQWFCZ05WQkFNVEUyOXlaR1Z5WlhJdVpYaGhiWEJzWlM1amIyMHdXVEFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNQkJ3TkNBQVFpSTM0NlYrTm1CTTNsVXBsaDg1aUxWM25hdWlTS0c0Y2YxODVlUE14MVlqeERud0ZZCmlMeWhBczJrcUkwNy8vQjlxQjhWcDlYeE1ZQXlVN1F1RmRoTW8wMHdTekFPQmdOVkhROEJBZjhFQkFNQ0I0QXcKREFZRFZSMFRBUUgvQkFJd0FEQXJCZ05WSFNNRUpEQWlnQ0NQYVg1b1BLMlZOZTdjcVNoNis0ZkFVT0UrM0JPRQpyY2xrUUhNMUpaTkRRakFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUVBdDdvN1BpM2VlcHhqVnduM0UwemNqbXdrCkEwSFQ4eDJ6UmFzME45amdBNDhDSUNZM1E0YzFzN0JSR3F0bEpBdlVPbzFKNEorV25EYUxlZUtNWVpkVlFpek4KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoSGDu30JMFWD39LZTNVBhZ4CNfaclF+QRYgRJHMEUCIQCdmm7RIM1/KhcHij7PuOC7s9/v7WUEUerzeBp/vurlmAIgFqFW/LSYboRI/5FSWU1NpBl6leE8qQKxDQk/7Lm6MNw=",
"",
""
]

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long