diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..75f95977 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +coverage.html + +# log files +logs.txt + +# just for example +id_rsa \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..3f6f2dcf --- /dev/null +++ b/Makefile @@ -0,0 +1,108 @@ +############################# HELP MESSAGE ############################# +# Make sure the help command stays first, so that it's printed by default when `make` is called without arguments +.PHONY: help tests +help: + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +AGGREGATOR_ECDSA_PRIV_KEY=0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 +CHALLENGER_ECDSA_PRIV_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a + +CHAINID=31337 +# Make sure to update this if the strategy address changes +# check in contracts/script/output/${CHAINID}/credible_squaring_avs_deployment_output.json +STRATEGY_ADDRESS=0x7a2088a1bFc9d81c55368AE168C2C02570cB814F +DEPLOYMENT_FILES_DIR=contracts/script/output/${CHAINID} + +-----------------------------: ## + +___CONTRACTS___: ## + +deploy-eigenlayer-contracts-to-anvil-and-save-state: ## Deploy eigenlayer + ./tests/integration/deploy-eigenlayer-save-anvil-state.sh + +deploy-shared-avs-contracts-to-anvil-and-save-state: ## Deploy blspubkeycompendium and blsstateoperatorretriever + ./tests/integration/deploy-shared-avs-contracts-save-anvil-state.sh + +deploy-incredible-squaring-contracts-to-anvil-and-save-state: ## Deploy avs + ./tests/integration/deploy-avs-save-anvil-state.sh + +deploy-all-to-anvil-and-save-state: deploy-eigenlayer-contracts-to-anvil-and-save-state deploy-shared-avs-contracts-to-anvil-and-save-state deploy-incredible-squaring-contracts-to-anvil-and-save-state ## deploy eigenlayer, shared avs contracts, and inc-sq contracts + +start-anvil-chain-with-el-and-avs-deployed: ## starts anvil from a saved state file (with el and avs contracts deployed) + anvil --load-state tests/integration/avs-and-eigenlayer-deployed-anvil-state.json + +bindings: ## generates contract bindings + cd contracts && ./generate-go-bindings.sh + +___DOCKER___: ## +docker-build-and-publish-images: ## builds and publishes operator and aggregator docker images using Ko + KO_DOCKER_REPO=ghcr.io/layr-labs/incredible-squaring ko build aggregator/cmd/main.go --preserve-import-paths + KO_DOCKER_REPO=ghcr.io/layr-labs/incredible-squaring ko build operator/cmd/main.go --preserve-import-paths +docker-start-everything: docker-build-and-publish-images ## starts aggregator and operator docker containers + docker compose pull && docker compose up + +__CLI__: ## + +cli-setup-operator: send-fund cli-register-operator-with-eigenlayer cli-register-operator-bls-pubkeys cli-deposit-into-mocktoken-strategy cli-register-operator-with-avs ## registers operator with eigenlayer and avs + +cli-register-operator-with-eigenlayer: ## registers operator with delegationManager + go run cli/main.go --config config-files/node_config.anvil.yaml register-operator-with-eigenlayer + +cli-register-operator-bls-pubkeys: ## registers operator's bls public keys with blsPublicKeyCompendium + go run cli/main.go --config config-files/node_config.anvil.yaml register-operator-bls-pubkeys + +cli-deposit-into-mocktoken-strategy: ## + go run cli/main.go --config config-files/node_config.anvil.yaml deposit-into-strategy --strategy-addr ${STRATEGY_ADDRESS} --amount 100 + +cli-register-operator-with-avs: ## + go run cli/main.go --config config-files/node_config.anvil.yaml register-operator-with-avs + +cli-deregister-operator-with-avs: ## + go run cli/main.go --config config-files/node_config.anvil.yaml deregister-operator-with-avs + +cli-print-operator-status: ## + go run cli/main.go --config config-files/node_config.anvil.yaml print-operator-status + +send-fund: ## sends fund to the operator saved in tests/keys/test.ecdsa.key.json + cast send 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 --value 10ether --private-key 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 + +-----------------------------: ## +# We pipe all zapper logs through https://github.com/maoueh/zap-pretty so make sure to install it +# TODO: piping to zap-pretty only works when zapper environment is set to production, unsure why +____OFFCHAIN_SOFTWARE___: ## +start-aggregator: ## + go run aggregator/cmd/main.go --config config-files/aggregator.yaml \ + --credible-squaring-deployment ${DEPLOYMENT_FILES_DIR}/credible_squaring_avs_deployment_output.json \ + --shared-avs-contracts-deployment ${DEPLOYMENT_FILES_DIR}/shared_avs_contracts_deployment_output.json \ + --ecdsa-private-key ${AGGREGATOR_ECDSA_PRIV_KEY} \ + 2>&1 | zap-pretty + +start-operator: ## + go run operator/cmd/main.go --config config-files/node_config.anvil.yaml \ + 2>&1 | zap-pretty + +start-challenger: ## + go run challenger/cmd/main.go --config config-files/challenger.yaml \ + --credible-squaring-deployment ${DEPLOYMENT_FILES_DIR}/credible_squaring_avs_deployment_output.json \ + --shared-avs-contracts-deployment ${DEPLOYMENT_FILES_DIR}/shared_avs_contracts_deployment_output.json \ + --ecdsa-private-key ${CHALLENGER_ECDSA_PRIV_KEY} \ + 2>&1 | zap-pretty + +run-plugin: ## + go run plugin/cmd/main.go --config config-files/node_config.anvil.yaml +-----------------------------: ## +_____HELPER_____: ## +mocks: ## generates mocks for tests + go install go.uber.org/mock/mockgen@v0.3.0 + go generate ./... + +tests-unit: ## runs all tests + go test $$(go list ./... | grep -v /integration) -covermode=atomic --timeout 15s + +tests-unit-cover: ## run all tests with test coverge + go test $$(go list ./... | grep -v /integration) -coverprofile=coverage.out -covermode=atomic -v -count=1 --timeout 15s + go tool cover -html=coverage.out -o coverage.html + +tests-integration: ## runs all integration tests + go test ./tests/integration/... -v -count=1 --timeout 60s + diff --git a/README.md b/README.md new file mode 100644 index 00000000..bad82ea9 --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ +# Incredible Squaring AVS + + Do not use it in Production, testnet only. + +Basic repo demoing a simple AVS middleware with full eigenlayer integration. + +## Running via make + +This simple session illustrates the basic flow of the AVS. The makefile commands are hardcoded for a single operator, but it's however easy to create new operator config files, and start more operators manually (see the actual commands that the makefile calls). + +Start anvil in a separate terminal: + +```bash +make start-anvil-chain-with-el-and-avs-deployed +``` + +The above command starts a local anvil chain from a [saved state](./tests/integration/eigenlayer-and-shared-avs-contracts-deployed-anvil-state.json) with eigenlayer and incredible-squaring contracts already deployed (but no operator registered). + +Start the aggregator: + +```bash +make start-aggregator +``` + +Register the operator with eigenlayer and incredible-squaring, and then start the process: + +```bash +make cli-setup-operator +make start-operator +``` + +## Running via docker compose + +We wrote a [docker-compose.yml](./docker-compose.yml) file to run and test everything on a single machine. It will start an anvil instance, loading a [state](./tests/integration/avs-and-eigenlayer-deployed-anvil-state.json) where the eigenlayer and incredible-squaring contracts are deployed, start the aggregator, and finally one operator, along with prometheus and grafana servers. The grafana server will be available at http://localhost:3000, with user and password both set to `admin`. We have created a simple [grafana dashboard](./grafana/provisioning/dashboards/AVSs/incredible_squaring.json) which can be used as a starting example and expanded to include AVS specific metrics. The eigen metrics should not be added to this dashboard as they will be exposed on the main eigenlayer dashboard provided by the eigenlayer-cli. + +## Avs Task Description + +The architecture of the AVS contains: + +- [Eigenlayer core](https://github.com/Layr-Labs/eigenlayer-contracts/tree/master) contracts +- AVS contracts + - [ServiceManager](contracts/src/CredibleSquaringServiceManager.sol) which contains the [slashing](contracts/src/CredibleSquaringServiceManager.sol#L63) logic. + - [TaskManager](contracts/src/CredibleSquaringTaskManager.sol) which contains [task creation](contracts/src/CredibleSquaringTaskManager.sol#L75) and [task response](contracts/src/CredibleSquaringTaskManager.sol#L102) logic. + - The [challenge](contracts/src/CredibleSquaringTaskManager.sol#L185) logic could be separated into its own contract, but we have decided to include it in the TaskManager for this simple task. + - Set of [registry contracts](https://github.com/Layr-Labs/eigenlayer-middleware) to manage operators opted in to this avs +- Task Generator + - in a real world scenario, this could be a separate entity, but for this simple demo, the aggregator also acts as the task generator +- Aggregator + - aggregates BLS signatures from operators and posts the aggregated response to the task manager + - For this simple demo, the aggregator is not an operator, and thus does not need to register with eigenlayer or the AVS contract. It's IP address is simply hardcoded into the operators' config. +- Operators + - Square the number sent to the task manager by the task generator, sign it, and send it to the aggregator + +![](./diagrams/architecture.png) + +1. A task generator (in our case, same as the aggregator) publishes tasks once every regular interval (say 10 blocks, you are free to set your own interval) to the CredibleSquaringTaskManager contract's [createNewTask](contracts/src/CredibleSquaringTaskManager.sol#L78) function. Each task specifies an integer `numberToBeSquared` for which it wants the currently opted-in operators to determine its square `numberToBeSquared^2`. `createNewTask` also takes `quorumNumbers` and `quorumThresholdPercentage` which requests that each listed quorum (we only use quorumNumber 0 in incredible-squaring) needs to reach at least thresholdPercentage of operator signatures. + +2. A [registry](https://github.com/Layr-Labs/eigenlayer-middleware/blob/master/src/BLSRegistryCoordinatorWithIndices.sol) contract is deployed that allows any eigenlayer operator with at least 1 delegated [mockerc20](contracts/src/ERC20Mock.sol) token to opt-in to this AVS and also de-register from this AVS. + +3. [Operator] The operators who are currently opted-in with the AVS need to read the task number from the Task contract, compute its square, sign on that computed result (over the BN254 curve) and send their taskResponse and signature to the aggregator. + +4. [Aggregator] The aggregator collects the signatures from the operators and aggregates them using BLS aggregation. If any response passes the [quorumThresholdPercentage](contracts/src/ICredibleSquaringTaskManager.sol#L36) set by the task generator when posting the task, the aggregator posts the aggregated response to the Task contract. + +5. If a response was sent within the [response window](contracts/src/CredibleSquaringTaskManager.sol#L119), we enter the [Dispute resolution] period. + - [Off-chain] A challenge window is launched during which anyone can [raise a dispute](contracts/src/CredibleSquaringTaskManager.sol#L171) in a DisputeResolution contract (in our case, this is the same as the TaskManager contract) + - [On-chain] The DisputeResolution contract resolves that a particular operator’s response is not the correct response (that is, not the square of the integer specified in the task) or the opted-in operator didn’t respond during the response window. If the dispute is resolved, the operator will be frozen in the Registration contract and the veto committee will decide whether to veto the freezing request or not. + +Below is a more detailed uml diagram of the aggregator and operator processes: + +![](./diagrams/uml.jpeg) + +## Integration Tests + +See the integration tests [README](tests/integration/README.md) for more details. diff --git a/aggregator/aggregator.go b/aggregator/aggregator.go new file mode 100644 index 00000000..48e7e20e --- /dev/null +++ b/aggregator/aggregator.go @@ -0,0 +1,249 @@ +package aggregator + +import ( + "context" + "math/big" + "sync" + "time" + + "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signer" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients" + sdkelcontracts "github.com/Layr-Labs/eigensdk-go/chainio/elcontracts" + "github.com/Layr-Labs/eigensdk-go/services/avsregistry" + blsagg "github.com/Layr-Labs/eigensdk-go/services/bls_aggregation" + pubkeycompserv "github.com/Layr-Labs/eigensdk-go/services/pubkeycompendium" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + "github.com/Layr-Labs/incredible-squaring-avs/aggregator/types" + "github.com/Layr-Labs/incredible-squaring-avs/core" + "github.com/Layr-Labs/incredible-squaring-avs/core/chainio" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" +) + +const ( + // number of blocks after which a task is considered expired + // this hardcoded here because it's also hardcoded in the contracts, but should + // ideally be fetched from the contracts + taskChallengeWindowBlock = 100 + blockTimeSeconds = 12 * time.Second +) + +// Aggregator sends tasks (numbers to square) onchain, then listens for operator signed TaskResponses. +// It aggregates responses signatures, and if any of the TaskResponses reaches the QuorumThresholdPercentage for each quorum +// (currently we only use a single quorum of the ERC20Mock token), it sends the aggregated TaskResponse and signature onchain. +// +// The signature is checked in the BLSSignatureChecker.sol contract, which expects a +// +// struct NonSignerStakesAndSignature { +// uint32[] nonSignerQuorumBitmapIndices; +// BN254.G1Point[] nonSignerPubkeys; +// BN254.G1Point[] quorumApks; +// BN254.G2Point apkG2; +// BN254.G1Point sigma; +// uint32[] quorumApkIndices; +// uint32[] totalStakeIndices; +// uint32[][] nonSignerStakeIndices; // nonSignerStakeIndices[quorumNumberIndex][nonSignerIndex] +// } +// +// A task can only be responded onchain by having enough operators sign on it such that their stake in each quorum reaches the QuorumThresholdPercentage. +// In order to verify this onchain, the Registry contracts store the history of stakes and aggregate pubkeys (apks) for each operators and each quorum. These are +// updated everytime an operator registers or deregisters with the BLSRegistryCoordinatorWithIndices.sol contract, or calls UpdateStakes() on the StakeRegistry.sol contract, +// after having received new delegated shares or having delegated shares removed by stakers queuing withdrawals. Each of these pushes to their respective datatype array a new entry. +// +// This is true for quorumBitmaps (represent the quorums each operator is opted into), quorumApks (apks per quorum), totalStakes (total stake per quorum), and nonSignerStakes (stake per quorum per operator). +// The 4 "indices" in NonSignerStakesAndSignature basically represent the index at which to fetch their respective data, given a blockNumber at which the task was created. +// Note that different data types might have different indices, since for eg QuorumBitmaps are updated for operators registering/deregistering, but not for UpdateStakes. +// Thankfully, we have deployed a helper contract BLSOperatorStateRetriever.sol whose function getCheckSignaturesIndices() can be used to fetch the indices given a block number. +// +// The 4 other fields nonSignerPubkeys, quorumApks, apkG2, and sigma, however, must be computed individually. +// apkG2 and sigma are just the aggregated signature and pubkeys of the operators who signed the task response (aggregated over all quorums, so individual signatures might be duplicated). +// quorumApks are the G1 aggregated pubkeys of the operators who signed the task response, but one per quorum, as opposed to apkG2 which is summed over all quorums. +// nonSignerPubkeys are the G1 pubkeys of the operators who did not sign the task response, but were opted into the quorum at the blocknumber at which the task was created. +// Upon sending a task onchain (or receiving a NewTaskCreated Event if the tasks were sent by an external task generator), the aggregator can get the list of all operators opted into each quorum at that +// block number by calling the getOperatorState() function of the BLSOperatorStateRetriever.sol contract. +type Aggregator struct { + logger logging.Logger + serverIpPortAddr string + avsWriter chainio.AvsWriterer + // aggregation related fields + blsAggregationService blsagg.BlsAggregationService + tasks map[types.TaskIndex]cstaskmanager.ICredibleSquaringTaskManagerTask + tasksMu sync.RWMutex + taskResponses map[types.TaskIndex]map[sdktypes.TaskResponseDigest]cstaskmanager.ICredibleSquaringTaskManagerTaskResponse + taskResponsesMu sync.RWMutex +} + +// NewAggregator creates a new Aggregator with the provided config. +func NewAggregator(c *config.Config) (*Aggregator, error) { + + avsReader, err := chainio.NewAvsReaderFromConfig(c) + if err != nil { + c.Logger.Error("Cannot create EthReader", "err", err) + return nil, err + } + + chainId, err := c.EthHttpClient.ChainID(context.Background()) + if err != nil { + c.Logger.Error("Cannot get chainId", "err", err) + return nil, err + } + + privateKeySigner, err := signer.NewPrivateKeySigner(c.EcdsaPrivateKey, chainId) + if err != nil { + c.Logger.Error("Cannot create signer", "err", err) + return nil, err + } + c.Signer = privateKeySigner + + avsWriter, err := chainio.NewAvsWriterFromConfig(c) + if err != nil { + c.Logger.Errorf("Cannot create EthSubscriber", "err", err) + return nil, err + } + + c.Logger.Info("SlasherAddr", "SlasherAddr", c.SlasherAddr) + + // TODO (Soubhik): This is a hack to get the slasher address. We should be able to get it from the config. + slasherAddr, err := avsWriter.AvsContractBindings.ServiceManager.Slasher(&bind.CallOpts{}) + if err != nil { + c.Logger.Error("Cannot get slasher address", "err", err) + return nil, err + } + c.Logger.Info("BlsPublicKeyCompendiumAddress", "BlsPublicKeyCompendiumAddress", c.BlsPublicKeyCompendiumAddress) + + elContractsClient, err := sdkclients.NewELContractsChainClient(slasherAddr, c.BlsPublicKeyCompendiumAddress, c.EthHttpClient, c.EthWsClient, c.Logger) + if err != nil { + c.Logger.Error("Cannot create ELContractsChainClient", "err", err) + return nil, err + } + eigenlayerReader, err := sdkelcontracts.NewELChainReader(elContractsClient, c.Logger, c.EthHttpClient) + if err != nil { + c.Logger.Error("Cannot create EigenlayerReader", "err", err) + return nil, err + } + eigenlayerSubscriber, err := sdkelcontracts.NewELChainSubscriber( + elContractsClient, + c.Logger, + ) + if err != nil { + c.Logger.Error("Cannot create EigenlayerEthSubscriber", "err", err) + return nil, err + } + + pubkeyCompendiumService := pubkeycompserv.NewPubkeyCompendiumInMemory(context.Background(), eigenlayerSubscriber, eigenlayerReader, c.Logger) + avsRegistryService := avsregistry.NewAvsRegistryServiceChainCaller(avsReader, eigenlayerReader, pubkeyCompendiumService, c.Logger) + blsAggregationService := blsagg.NewBlsAggregatorService(avsRegistryService, c.Logger) + + return &Aggregator{ + logger: c.Logger, + serverIpPortAddr: c.AggregatorServerIpPortAddr, + avsWriter: avsWriter, + blsAggregationService: blsAggregationService, + tasks: make(map[types.TaskIndex]cstaskmanager.ICredibleSquaringTaskManagerTask), + taskResponses: make(map[types.TaskIndex]map[sdktypes.TaskResponseDigest]cstaskmanager.ICredibleSquaringTaskManagerTaskResponse), + }, nil +} + +func (agg *Aggregator) Start(ctx context.Context) error { + agg.logger.Infof("Starting aggregator.") + agg.logger.Infof("Starting aggregator rpc server.") + go agg.startServer(ctx) + + // TODO(soubhik): refactor task generation/sending into a separate function that we can run as goroutine + ticker := time.NewTicker(10 * time.Second) + agg.logger.Infof("Aggregator set to send new task every 10 seconds...") + defer ticker.Stop() + taskNum := int64(0) + // ticker doesn't tick immediately, so we send the first task here + // see https://github.com/golang/go/issues/17601 + _ = agg.sendNewTask(big.NewInt(taskNum)) + taskNum++ + + for { + select { + case <-ctx.Done(): + return nil + case blsAggServiceResp := <-agg.blsAggregationService.GetResponseChannel(): + agg.logger.Info("Received response from blsAggregationService", "blsAggServiceResp", blsAggServiceResp) + agg.sendAggregatedResponseToContract(blsAggServiceResp) + case <-ticker.C: + err := agg.sendNewTask(big.NewInt(taskNum)) + taskNum++ + if err != nil { + // we log the errors inside sendNewTask() so here we just continue to the next task + continue + } + } + } +} + +func (agg *Aggregator) sendAggregatedResponseToContract(blsAggServiceResp blsagg.BlsAggregationServiceResponse) { + // TODO: check if blsAggServiceResp contains an err + if blsAggServiceResp.Err != nil { + agg.logger.Error("BlsAggregationServiceResponse contains an error", "err", blsAggServiceResp.Err) + // panicing to help with debugging (fail fast), but we shouldn't panic if we run this in production + panic(blsAggServiceResp.Err) + } + nonSignerPubkeys := []cstaskmanager.BN254G1Point{} + for _, nonSignerPubkey := range blsAggServiceResp.NonSignersPubkeysG1 { + nonSignerPubkeys = append(nonSignerPubkeys, core.ConvertToBN254G1Point(nonSignerPubkey)) + } + quorumApks := []cstaskmanager.BN254G1Point{} + for _, quorumApk := range blsAggServiceResp.QuorumApksG1 { + quorumApks = append(quorumApks, core.ConvertToBN254G1Point(quorumApk)) + } + nonSignerStakesAndSignature := cstaskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature{ + NonSignerPubkeys: nonSignerPubkeys, + QuorumApks: quorumApks, + ApkG2: core.ConvertToBN254G2Point(blsAggServiceResp.SignersApkG2), + Sigma: core.ConvertToBN254G1Point(blsAggServiceResp.SignersAggSigG1.G1Point), + NonSignerQuorumBitmapIndices: blsAggServiceResp.NonSignerQuorumBitmapIndices, + QuorumApkIndices: blsAggServiceResp.QuorumApkIndices, + TotalStakeIndices: blsAggServiceResp.TotalStakeIndices, + NonSignerStakeIndices: blsAggServiceResp.NonSignerStakeIndices, + } + + agg.logger.Info("Threshold reached. Sending aggregated response onchain.", + "taskIndex", blsAggServiceResp.TaskIndex, + ) + agg.tasksMu.RLock() + task := agg.tasks[blsAggServiceResp.TaskIndex] + agg.tasksMu.RUnlock() + agg.taskResponsesMu.RLock() + taskResponse := agg.taskResponses[blsAggServiceResp.TaskIndex][blsAggServiceResp.TaskResponseDigest] + agg.taskResponsesMu.RUnlock() + _, err := agg.avsWriter.SendAggregatedResponse(context.Background(), task, taskResponse, nonSignerStakesAndSignature) + if err != nil { + agg.logger.Error("Aggregator failed to respond to task", "err", err) + } +} + +// sendNewTask sends a new task to the task manager contract, and updates the Task dict struct +// with the information of operators opted into quorum 0 at the block of task creation. +func (agg *Aggregator) sendNewTask(numToSquare *big.Int) error { + agg.logger.Info("Aggregator sending new task", "numberToSquare", numToSquare) + // Send number to square to the task manager contract + newTask, taskIndex, err := agg.avsWriter.SendNewTaskNumberToSquare(context.Background(), numToSquare, types.QUORUM_THRESHOLD_NUMERATOR, types.QUORUM_NUMBERS) + if err != nil { + agg.logger.Error("Aggregator failed to send number to square", "err", err) + return err + } + + agg.tasksMu.Lock() + agg.tasks[taskIndex] = newTask + agg.tasksMu.Unlock() + + quorumThresholdPercentages := make([]uint32, len(newTask.QuorumNumbers)) + for i, _ := range newTask.QuorumNumbers { + quorumThresholdPercentages[i] = newTask.QuorumThresholdPercentage + } + // TODO(samlaf): we use seconds for now, but we should ideally pass a blocknumber to the blsAggregationService + // and it should monitor the chain and only expire the task aggregation once the chain has reached that block number. + taskTimeToExpiry := taskChallengeWindowBlock * blockTimeSeconds + agg.blsAggregationService.InitializeNewTask(taskIndex, newTask.TaskCreatedBlock, newTask.QuorumNumbers, quorumThresholdPercentages, taskTimeToExpiry) + return nil +} diff --git a/aggregator/aggregator_test.go b/aggregator/aggregator_test.go new file mode 100644 index 00000000..3884a21b --- /dev/null +++ b/aggregator/aggregator_test.go @@ -0,0 +1,103 @@ +package aggregator + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + gethcore "github.com/ethereum/go-ethereum/core" + "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + blsaggservmock "github.com/Layr-Labs/eigensdk-go/services/mocks/blsagg" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + + "github.com/Layr-Labs/incredible-squaring-avs/aggregator/mocks" + "github.com/Layr-Labs/incredible-squaring-avs/aggregator/types" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + chainiomocks "github.com/Layr-Labs/incredible-squaring-avs/core/chainio/mocks" +) + +var MOCK_OPERATOR_ID = [32]byte{207, 73, 226, 221, 104, 100, 123, 41, 192, 3, 9, 119, 90, 83, 233, 159, 231, 151, 245, 96, 150, 48, 144, 27, 102, 253, 39, 101, 1, 26, 135, 173} +var MOCK_OPERATOR_STAKE = big.NewInt(100) +var MOCK_OPERATOR_BLS_PRIVATE_KEY_STRING = "50" + +type MockTask struct { + TaskNum uint32 + BlockNumber uint32 + NumberToSquare uint32 +} + +func TestSendNewTask(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + MOCK_OPERATOR_BLS_PRIVATE_KEY, err := bls.NewPrivateKey(MOCK_OPERATOR_BLS_PRIVATE_KEY_STRING) + assert.Nil(t, err) + MOCK_OPERATOR_KEYPAIR := bls.NewKeyPair(MOCK_OPERATOR_BLS_PRIVATE_KEY) + MOCK_OPERATOR_G1PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG1() + MOCK_OPERATOR_G2PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG2() + + operatorPubkeyDict := map[bls.OperatorId]types.OperatorInfo{ + MOCK_OPERATOR_ID: { + OperatorPubkeys: sdktypes.OperatorPubkeys{ + G1Pubkey: MOCK_OPERATOR_G1PUBKEY, + G2Pubkey: MOCK_OPERATOR_G2PUBKEY, + }, + OperatorAddr: common.Address{}, + }, + } + + aggregator, mockAvsWriterer, mockBlsAggService, err := createMockAggregator(mockCtrl, operatorPubkeyDict) + assert.Nil(t, err) + + var TASK_INDEX = uint32(0) + var BLOCK_NUMBER = uint32(100) + var NUMBER_TO_SQUARE = uint32(3) + var NUMBER_TO_SQUARE_BIG_INT = big.NewInt(int64(NUMBER_TO_SQUARE)) + + mockAvsWriterer.EXPECT().SendNewTaskNumberToSquare( + context.Background(), NUMBER_TO_SQUARE_BIG_INT, types.QUORUM_THRESHOLD_NUMERATOR, types.QUORUM_NUMBERS, + ).Return(mocks.MockSendNewTaskNumberToSquareCall(BLOCK_NUMBER, TASK_INDEX, NUMBER_TO_SQUARE)) + + // 100 blocks, each takes 12 seconds. We hardcode for now since aggregator also hardcodes this value + taskTimeToExpiry := 100 * 12 * time.Second + // make sure that initializeNewTask was called on the blsAggService + // maybe there's a better way to do this? There's a saying "don't mock 3rd party code" + // see https://hynek.me/articles/what-to-mock-in-5-mins/ + mockBlsAggService.EXPECT().InitializeNewTask(TASK_INDEX, BLOCK_NUMBER, types.QUORUM_NUMBERS, []uint32{types.QUORUM_THRESHOLD_NUMERATOR}, taskTimeToExpiry) + + err = aggregator.sendNewTask(NUMBER_TO_SQUARE_BIG_INT) + assert.Nil(t, err) +} + +func createMockAggregator( + mockCtrl *gomock.Controller, operatorPubkeyDict map[bls.OperatorId]types.OperatorInfo, +) (*Aggregator, *chainiomocks.MockAvsWriterer, *blsaggservmock.MockBlsAggregationService, error) { + logger := sdklogging.NewNoopLogger() + mockAvsWriter := chainiomocks.NewMockAvsWriterer(mockCtrl) + mockBlsAggregationService := blsaggservmock.NewMockBlsAggregationService(mockCtrl) + + aggregator := &Aggregator{ + logger: logger, + avsWriter: mockAvsWriter, + blsAggregationService: mockBlsAggregationService, + tasks: make(map[types.TaskIndex]cstaskmanager.ICredibleSquaringTaskManagerTask), + taskResponses: make(map[types.TaskIndex]map[sdktypes.TaskResponseDigest]cstaskmanager.ICredibleSquaringTaskManagerTaskResponse), + } + return aggregator, mockAvsWriter, mockBlsAggregationService, nil +} + +// just a mock ethclient to pass to bindings +// so that we can access abi methods +func createMockEthClient() *backends.SimulatedBackend { + genesisAlloc := map[common.Address]gethcore.GenesisAccount{} + blockGasLimit := uint64(1000000) + client := backends.NewSimulatedBackend(genesisAlloc, blockGasLimit) + return client +} diff --git a/aggregator/cmd/main.go b/aggregator/cmd/main.go new file mode 100644 index 00000000..908ffa31 --- /dev/null +++ b/aggregator/cmd/main.go @@ -0,0 +1,64 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "os" + + "github.com/urfave/cli" + + "github.com/Layr-Labs/incredible-squaring-avs/aggregator" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" +) + +var ( + // Version is the version of the binary. + Version string + GitCommit string + GitDate string +) + +func main() { + + app := cli.NewApp() + app.Flags = config.Flags + app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate) + app.Name = "credible-squaring-aggregator" + app.Usage = "Credible Squaring Aggregator" + app.Description = "Service that sends number to be credibly squared by operator nodes." + + app.Action = aggregatorMain + err := app.Run(os.Args) + if err != nil { + log.Fatalln("Application failed.", "Message:", err) + } +} + +func aggregatorMain(ctx *cli.Context) error { + + log.Println("Initializing Aggregator") + config, err := config.NewConfig(ctx) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(config, "", " ") + if err != nil { + config.Logger.Fatalf(err.Error()) + } + fmt.Println("Config:", string(configJson)) + + agg, err := aggregator.NewAggregator(config) + if err != nil { + return err + } + + err = agg.Start(context.Background()) + if err != nil { + return err + } + + return nil + +} diff --git a/aggregator/mocks/chain.go b/aggregator/mocks/chain.go new file mode 100644 index 00000000..d40613f5 --- /dev/null +++ b/aggregator/mocks/chain.go @@ -0,0 +1,74 @@ +package mocks + +import ( + "math/big" + + opstateretriever "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSOperatorStateRetriever" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + "github.com/Layr-Labs/incredible-squaring-avs/aggregator/types" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" +) + +// ====== TaskManager Mocks ====== + +func MockSendNewTaskNumberToSquareCall(blockNum, taskNum, numberToSquare uint32) (cstaskmanager.ICredibleSquaringTaskManagerTask, uint32, error) { + task := cstaskmanager.ICredibleSquaringTaskManagerTask{ + NumberToBeSquared: big.NewInt(int64(numberToSquare)), + TaskCreatedBlock: blockNum, + QuorumNumbers: types.QUORUM_NUMBERS, + QuorumThresholdPercentage: types.QUORUM_THRESHOLD_NUMERATOR, + } + + return task, taskNum, nil +} + +// ======= BLSOperatorStateRetriever Mocks ======= +type MockOperatorState struct { + OperatorId [32]byte + Stake *big.Int + G1Pubkey *bls.G1Point + G2Pubkey *bls.G2Point +} +type MockRegistry struct { + OperatorsState []MockOperatorState +} + +func (r *MockRegistry) GetOperatorsId() [][32]byte { + operatorIds := make([][32]byte, len(r.OperatorsState)) + for i, operatorState := range r.OperatorsState { + operatorIds[i] = operatorState.OperatorId + } + return operatorIds +} + +func (r *MockRegistry) GetOperatorsTotalStake() *big.Int { + totalStake := big.NewInt(0) + for _, operatorState := range r.OperatorsState { + totalStake.Add(totalStake, operatorState.Stake) + } + return totalStake +} + +// returns an array of operator states for each quorum number (only [0][] is used since we use a single quorum only) +// currently hardcoded for a single operator +func (r *MockRegistry) MockGetOperatorStateCall() [][]opstateretriever.BLSOperatorStateRetrieverOperator { + quorum0OperatorStakes := make([]opstateretriever.BLSOperatorStateRetrieverOperator, len(r.OperatorsState)) + for i, operatorState := range r.OperatorsState { + quorum0OperatorStakes[i] = opstateretriever.BLSOperatorStateRetrieverOperator{ + OperatorId: operatorState.OperatorId, + Stake: operatorState.Stake, + } + } + return [][]opstateretriever.BLSOperatorStateRetrieverOperator{ + quorum0OperatorStakes, + } +} + +// Aggregates the g1 pubkey of all operators in the mockregistry, assuming they are all registered for quorum0 +func (r *MockRegistry) AggregateG1Pubkey() *bls.G1Point { + aggregateG1Pubkey := bls.NewG1Point(big.NewInt(0), big.NewInt(0)) + for _, operatorState := range r.OperatorsState { + aggregateG1Pubkey.Add(operatorState.G1Pubkey) + } + return aggregateG1Pubkey +} diff --git a/aggregator/rpc_server.go b/aggregator/rpc_server.go new file mode 100644 index 00000000..007e3b73 --- /dev/null +++ b/aggregator/rpc_server.go @@ -0,0 +1,71 @@ +package aggregator + +import ( + "context" + "errors" + "net/http" + "net/rpc" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/Layr-Labs/incredible-squaring-avs/core" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" +) + +var ( + TaskNotFoundError400 = errors.New("400. Task not found") + OperatorNotPartOfTaskQuorum400 = errors.New("400. Operator not part of quorum") + TaskResponseDigestNotFoundError500 = errors.New("500. Failed to get task response digest") + UnknownErrorWhileVerifyingSignature400 = errors.New("400. Failed to verify signature") + SignatureVerificationFailed400 = errors.New("400. Signature verification failed") + CallToGetCheckSignaturesIndicesFailed500 = errors.New("500. Failed to get check signatures indices") +) + +func (agg *Aggregator) startServer(ctx context.Context) error { + + err := rpc.Register(agg) + if err != nil { + agg.logger.Fatal("Format of service TaskManager isn't correct. ", "err", err) + } + rpc.HandleHTTP() + err = http.ListenAndServe(agg.serverIpPortAddr, nil) + if err != nil { + agg.logger.Fatal("ListenAndServe", "err", err) + } + + return nil +} + +type SignedTaskResponse struct { + TaskResponse cstaskmanager.ICredibleSquaringTaskManagerTaskResponse + BlsSignature bls.Signature + OperatorId bls.OperatorId +} + +// rpc endpoint which is called by operator +// reply doesn't need to be checked. If there are no errors, the task response is accepted +// rpc framework forces a reply type to exist, so we put bool as a placeholder +func (agg *Aggregator) ProcessSignedTaskResponse(signedTaskResponse *SignedTaskResponse, reply *bool) error { + agg.logger.Infof("Received signed task response: %#v", signedTaskResponse) + taskIndex := signedTaskResponse.TaskResponse.ReferenceTaskIndex + taskResponseDigest, err := core.GetTaskResponseDigest(&signedTaskResponse.TaskResponse) + if err != nil { + agg.logger.Error("Failed to get task response digest", "err", err) + return TaskResponseDigestNotFoundError500 + } + agg.taskResponsesMu.Lock() + if _, ok := agg.taskResponses[taskIndex]; !ok { + agg.taskResponses[taskIndex] = make(map[sdktypes.TaskResponseDigest]cstaskmanager.ICredibleSquaringTaskManagerTaskResponse) + } + if _, ok := agg.taskResponses[taskIndex][taskResponseDigest]; !ok { + agg.taskResponses[taskIndex][taskResponseDigest] = signedTaskResponse.TaskResponse + } + agg.taskResponsesMu.Unlock() + + err = agg.blsAggregationService.ProcessNewSignature( + context.Background(), taskIndex, taskResponseDigest, + &signedTaskResponse.BlsSignature, signedTaskResponse.OperatorId, + ) + return err +} diff --git a/aggregator/rpc_server_test.go b/aggregator/rpc_server_test.go new file mode 100644 index 00000000..11907084 --- /dev/null +++ b/aggregator/rpc_server_test.go @@ -0,0 +1,81 @@ +package aggregator + +import ( + "context" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + "github.com/Layr-Labs/incredible-squaring-avs/aggregator/types" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/Layr-Labs/incredible-squaring-avs/core" +) + +func TestProcessSignedTaskResponse(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + var TASK_INDEX = uint32(0) + var BLOCK_NUMBER = uint32(100) + var NUMBER_TO_SQUARE = uint32(3) + + MOCK_OPERATOR_BLS_PRIVATE_KEY, err := bls.NewPrivateKey(MOCK_OPERATOR_BLS_PRIVATE_KEY_STRING) + assert.Nil(t, err) + MOCK_OPERATOR_KEYPAIR := bls.NewKeyPair(MOCK_OPERATOR_BLS_PRIVATE_KEY) + MOCK_OPERATOR_G1PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG1() + MOCK_OPERATOR_G2PUBKEY := MOCK_OPERATOR_KEYPAIR.GetPubKeyG2() + + operatorPubkeyDict := map[bls.OperatorId]types.OperatorInfo{ + MOCK_OPERATOR_ID: { + OperatorPubkeys: sdktypes.OperatorPubkeys{ + G1Pubkey: MOCK_OPERATOR_G1PUBKEY, + G2Pubkey: MOCK_OPERATOR_G2PUBKEY, + }, + OperatorAddr: common.Address{}, + }, + } + aggregator, _, mockBlsAggServ, err := createMockAggregator(mockCtrl, operatorPubkeyDict) + assert.Nil(t, err) + + signedTaskResponse, err := createMockSignedTaskResponse(MockTask{ + TaskNum: TASK_INDEX, + BlockNumber: BLOCK_NUMBER, + NumberToSquare: NUMBER_TO_SQUARE, + }, *MOCK_OPERATOR_KEYPAIR) + assert.Nil(t, err) + signedTaskResponseDigest, err := core.GetTaskResponseDigest(&signedTaskResponse.TaskResponse) + assert.Nil(t, err) + + // TODO(samlaf): is this the right way to test writing to external service? + // or is there some wisdom to "don't mock 3rd party code"? + // see https://hynek.me/articles/what-to-mock-in-5-mins/ + mockBlsAggServ.EXPECT().ProcessNewSignature(context.Background(), TASK_INDEX, signedTaskResponseDigest, + &signedTaskResponse.BlsSignature, signedTaskResponse.OperatorId) + err = aggregator.ProcessSignedTaskResponse(signedTaskResponse, nil) + assert.Nil(t, err) +} + +// mocks an operator signing on a task response +func createMockSignedTaskResponse(mockTask MockTask, keypair bls.KeyPair) (*SignedTaskResponse, error) { + numberToSquareBigInt := big.NewInt(int64(mockTask.NumberToSquare)) + taskResponse := &cstaskmanager.ICredibleSquaringTaskManagerTaskResponse{ + ReferenceTaskIndex: mockTask.TaskNum, + NumberSquared: numberToSquareBigInt.Mul(numberToSquareBigInt, numberToSquareBigInt), + } + taskResponseHash, err := core.GetTaskResponseDigest(taskResponse) + if err != nil { + return nil, err + } + blsSignature := keypair.SignMessage(taskResponseHash) + signedTaskResponse := &SignedTaskResponse{ + TaskResponse: *taskResponse, + BlsSignature: *blsSignature, + OperatorId: MOCK_OPERATOR_ID, + } + return signedTaskResponse, nil +} diff --git a/aggregator/types/types.go b/aggregator/types/types.go new file mode 100644 index 00000000..4704b43f --- /dev/null +++ b/aggregator/types/types.go @@ -0,0 +1,24 @@ +package types + +import ( + sdktypes "github.com/Layr-Labs/eigensdk-go/types" + "github.com/ethereum/go-ethereum/common" +) + +// TODO: Hardcoded for now +// all operators in quorum0 must sign the task response in order for it to be accepted +const QUORUM_THRESHOLD_NUMERATOR = uint32(100) +const QUORUM_THRESHOLD_DENOMINATOR = uint32(100) + +const QUERY_FILTER_FROM_BLOCK = uint64(1) + +// we only use a single quorum (quorum 0) for incredible squaring +var QUORUM_NUMBERS = []byte{0} + +type BlockNumber = uint32 +type TaskIndex = uint32 + +type OperatorInfo struct { + OperatorPubkeys sdktypes.OperatorPubkeys + OperatorAddr common.Address +} diff --git a/challenger/challenger.go b/challenger/challenger.go new file mode 100644 index 00000000..c7e8101b --- /dev/null +++ b/challenger/challenger.go @@ -0,0 +1,242 @@ +package challenger + +import ( + "bytes" + "context" + "math/big" + + ethclient "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/incredible-squaring-avs/common" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/ethereum/go-ethereum/accounts/abi" + + "github.com/Layr-Labs/incredible-squaring-avs/challenger/types" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/Layr-Labs/incredible-squaring-avs/core/chainio" +) + +type Challenger struct { + logger logging.Logger + ethClient ethclient.EthClient + avsReader chainio.AvsReaderer + avsWriter chainio.AvsWriterer + avsSubscriber chainio.AvsSubscriberer + tasks map[uint32]cstaskmanager.ICredibleSquaringTaskManagerTask + taskResponses map[uint32]types.TaskResponseData + taskResponseChan chan *cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded + newTaskCreatedChan chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated +} + +func NewChallenger(c *config.Config) (*Challenger, error) { + + avsWriter, err := chainio.NewAvsWriterFromConfig(c) + if err != nil { + c.Logger.Error("Cannot create EthWriter", "err", err) + return nil, err + } + avsReader, err := chainio.NewAvsReaderFromConfig(c) + if err != nil { + c.Logger.Error("Cannot create EthReader", "err", err) + return nil, err + } + avsSubscriber, err := chainio.NewAvsSubscriberFromConfig(c) + if err != nil { + c.Logger.Error("Cannot create EthSubscriber", "err", err) + return nil, err + } + + challenger := &Challenger{ + ethClient: c.EthHttpClient, + logger: c.Logger, + avsWriter: avsWriter, + avsReader: avsReader, + avsSubscriber: avsSubscriber, + tasks: make(map[uint32]cstaskmanager.ICredibleSquaringTaskManagerTask), + taskResponses: make(map[uint32]types.TaskResponseData), + taskResponseChan: make(chan *cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded), + newTaskCreatedChan: make(chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated), + } + + return challenger, nil +} + +func (c *Challenger) Start(ctx context.Context) error { + c.logger.Infof("Starting Challenger.") + + newTaskSub := c.avsSubscriber.SubscribeToNewTasks(c.newTaskCreatedChan) + c.logger.Infof("Subscribed to new tasks") + + taskResponseSub := c.avsSubscriber.SubscribeToTaskResponses(c.taskResponseChan) + c.logger.Infof("Subscribed to task responses") + + for { + select { + case err := <-newTaskSub.Err(): + // TODO(samlaf): Copied from operator. There was a comment about this on when should exactly do these errors occur? do we need to restart the websocket + c.logger.Error("Error in websocket subscription for new Task", "err", err) + newTaskSub.Unsubscribe() + newTaskSub = c.avsSubscriber.SubscribeToNewTasks(c.newTaskCreatedChan) + + case err := <-taskResponseSub.Err(): + // TODO(samlaf): Copied from operator. There was a comment about this on when should exactly do these errors occur? do we need to restart the websocket + c.logger.Error("Error in websocket subscription for task response", "err", err) + taskResponseSub.Unsubscribe() + taskResponseSub = c.avsSubscriber.SubscribeToTaskResponses(c.taskResponseChan) + + case newTaskCreatedLog := <-c.newTaskCreatedChan: + c.logger.Info("New task created log received", "newTaskCreatedLog", newTaskCreatedLog) + taskIndex := c.processNewTaskCreatedLog(newTaskCreatedLog) + + if _, found := c.taskResponses[taskIndex]; found { + err := c.callChallengeModule(taskIndex) + if err != nil { + c.logger.Error("Error calling challenge module", "err", err) + } + continue + } + + case taskResponseLog := <-c.taskResponseChan: + c.logger.Info("Task response log received", "taskResponseLog", taskResponseLog) + taskIndex := c.processTaskResponseLog(taskResponseLog) + + if _, found := c.tasks[taskIndex]; found { + err := c.callChallengeModule(taskIndex) + if err != nil { + c.logger.Info("Info:", "err", err) + } + continue + } + } + } + +} + +func (c *Challenger) processNewTaskCreatedLog(newTaskCreatedLog *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated) uint32 { + c.tasks[newTaskCreatedLog.TaskIndex] = newTaskCreatedLog.Task + return newTaskCreatedLog.TaskIndex +} + +func (c *Challenger) processTaskResponseLog(taskResponseLog *cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded) uint32 { + taskResponseRawLog, err := c.avsSubscriber.ParseTaskResponded(taskResponseLog.Raw) + if err != nil { + c.logger.Error("Error parsing task response. skipping task (this is probably bad and should be investigated)", "err", err) + } + + // get the inputs necessary for raising a challenge + nonSigningOperatorPubKeys := c.getNonSigningOperatorPubKeys(taskResponseLog) + taskResponseData := types.TaskResponseData{ + TaskResponse: taskResponseLog.TaskResponse, + TaskResponseMetadata: taskResponseLog.TaskResponseMetadata, + NonSigningOperatorPubKeys: nonSigningOperatorPubKeys, + } + + c.taskResponses[taskResponseRawLog.TaskResponse.ReferenceTaskIndex] = taskResponseData + return taskResponseRawLog.TaskResponse.ReferenceTaskIndex +} + +func (c *Challenger) callChallengeModule(taskIndex uint32) error { + numberToBeSquared := c.tasks[taskIndex].NumberToBeSquared + answerInResponse := c.taskResponses[taskIndex].TaskResponse.NumberSquared + trueAnswer := numberToBeSquared.Exp(numberToBeSquared, big.NewInt(2), nil) + + // checking if the answer in the response submitted by aggregator is correct + if trueAnswer.Cmp(answerInResponse) != 0 { + c.logger.Infof("The number squared is not correct") + + // raise challenge + c.raiseChallenge(taskIndex) + + return nil + } + return types.NoErrorInTaskResponse +} + +func (c *Challenger) getNonSigningOperatorPubKeys(vLog *cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded) []cstaskmanager.BN254G1Point { + c.logger.Info("vLog.Raw is", "vLog.Raw", vLog.Raw) + + // get the nonSignerStakesAndSignature + txHash := vLog.Raw.TxHash + c.logger.Info("txHash", "txHash", txHash) + tx, _, err := c.ethClient.TransactionByHash(context.Background(), txHash) + _ = tx + if err != nil { + c.logger.Error("Error getting transaction by hash", + "txHash", txHash, + "err", err, + ) + } + calldata := tx.Data() + c.logger.Info("calldata", "calldata", calldata) + cstmAbi, err := abi.JSON(bytes.NewReader(common.CredibleSquaringTaskManagerAbi)) + if err != nil { + c.logger.Error("Error getting Abi", "err", err) + } + methodSig := calldata[:4] + c.logger.Info("methodSig", "methodSig", methodSig) + method, err := cstmAbi.MethodById(methodSig) + if err != nil { + c.logger.Error("Error getting method", "err", err) + } + + inputs, err := method.Inputs.Unpack(calldata[4:]) + if err != nil { + c.logger.Error("Error unpacking calldata", "err", err) + } + + nonSignerStakesAndSignatureInput := inputs[2].(struct { + NonSignerQuorumBitmapIndices []uint32 "json:\"nonSignerQuorumBitmapIndices\"" + NonSignerPubkeys []struct { + X *big.Int "json:\"X\"" + Y *big.Int "json:\"Y\"" + } "json:\"nonSignerPubkeys\"" + QuorumApks []struct { + X *big.Int "json:\"X\"" + Y *big.Int "json:\"Y\"" + } "json:\"quorumApks\"" + ApkG2 struct { + X [2]*big.Int "json:\"X\"" + Y [2]*big.Int "json:\"Y\"" + } "json:\"apkG2\"" + Sigma struct { + X *big.Int "json:\"X\"" + Y *big.Int "json:\"Y\"" + } "json:\"sigma\"" + QuorumApkIndices []uint32 "json:\"quorumApkIndices\"" + TotalStakeIndices []uint32 "json:\"totalStakeIndices\"" + NonSignerStakeIndices [][]uint32 "json:\"nonSignerStakeIndices\"" + }) + + // get pubkeys of non-signing operators and submit them to the contract + nonSigningOperatorPubKeys := make([]cstaskmanager.BN254G1Point, len(nonSignerStakesAndSignatureInput.NonSignerPubkeys)) + for i, pubkey := range nonSignerStakesAndSignatureInput.NonSignerPubkeys { + nonSigningOperatorPubKeys[i] = cstaskmanager.BN254G1Point{ + X: pubkey.X, + Y: pubkey.Y, + } + } + + return nonSigningOperatorPubKeys +} + +func (c *Challenger) raiseChallenge(taskIndex uint32) error { + c.logger.Info("Challenger raising challenge.", "taskIndex", taskIndex) + c.logger.Info("Task", "Task", c.tasks[taskIndex]) + c.logger.Info("TaskResponse", "TaskResponse", c.taskResponses[taskIndex].TaskResponse) + c.logger.Info("TaskResponseMetadata", "TaskResponseMetadata", c.taskResponses[taskIndex].TaskResponseMetadata) + c.logger.Info("NonSigningOperatorPubKeys", "NonSigningOperatorPubKeys", c.taskResponses[taskIndex].NonSigningOperatorPubKeys) + + receipt, err := c.avsWriter.RaiseChallenge( + context.Background(), + c.tasks[taskIndex], + c.taskResponses[taskIndex].TaskResponse, + c.taskResponses[taskIndex].TaskResponseMetadata, + c.taskResponses[taskIndex].NonSigningOperatorPubKeys, + ) + if err != nil { + c.logger.Error("Challenger failed to raise challenge:", "err", err) + return err + } + c.logger.Infof("Tx hash of the challenge tx: %v", receipt.TxHash.Hex()) + return nil +} diff --git a/challenger/challenger_test.go b/challenger/challenger_test.go new file mode 100644 index 00000000..cee23774 --- /dev/null +++ b/challenger/challenger_test.go @@ -0,0 +1,191 @@ +package challenger + +import ( + "context" + "math/big" + "testing" + + mockethclient "github.com/Layr-Labs/eigensdk-go/chainio/mocks" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + aggtypes "github.com/Layr-Labs/incredible-squaring-avs/aggregator/types" + "github.com/Layr-Labs/incredible-squaring-avs/challenger/mocks" + chtypes "github.com/Layr-Labs/incredible-squaring-avs/challenger/types" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + chainiomocks "github.com/Layr-Labs/incredible-squaring-avs/core/chainio/mocks" + "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" +) + +var MOCK_OPERATOR_ID = [32]byte{207, 73, 226, 221, 104, 100, 123, 41, 192, 3, 9, 119, 90, 83, 233, 159, 231, 151, 245, 96, 150, 48, 144, 27, 102, 253, 39, 101, 1, 26, 135, 173} +var MOCK_OPERATOR_STAKE = big.NewInt(100) +var MOCK_OPERATOR_BLS_PRIVATE_KEY_STRING = "50" + +// @samlaf I tried pulling the MockTask struct froma ggregator_test but getting error: "undefined: aggregator.MockTask" +type MockTask struct { + TaskNum uint32 + BlockNumber uint32 + NumberToSquare uint32 +} + +func TestCallChallengeModule(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + challenger, mockAvsWriterer, _, _, _, err := createMockChallenger(mockCtrl) + assert.Nil(t, err) + + const TASK_INDEX = 1 + const BLOCK_NUMBER = uint32(100) + + challenger.tasks[TASK_INDEX] = cstaskmanager.ICredibleSquaringTaskManagerTask{ + NumberToBeSquared: big.NewInt(3), + TaskCreatedBlock: 1000, + QuorumNumbers: aggtypes.QUORUM_NUMBERS, + QuorumThresholdPercentage: aggtypes.QUORUM_THRESHOLD_NUMERATOR, + } + + challenger.taskResponses[TASK_INDEX] = chtypes.TaskResponseData{ + TaskResponse: cstaskmanager.ICredibleSquaringTaskManagerTaskResponse{ + ReferenceTaskIndex: TASK_INDEX, + NumberSquared: big.NewInt(2), + }, + TaskResponseMetadata: cstaskmanager.ICredibleSquaringTaskManagerTaskResponseMetadata{ + TaskResponsedBlock: 1001, + HashOfNonSigners: [32]byte{}, + }, + NonSigningOperatorPubKeys: []cstaskmanager.BN254G1Point{}, + } + + mockAvsWriterer.EXPECT().RaiseChallenge( + context.Background(), + challenger.tasks[TASK_INDEX], + challenger.taskResponses[TASK_INDEX].TaskResponse, + challenger.taskResponses[TASK_INDEX].TaskResponseMetadata, + challenger.taskResponses[TASK_INDEX].NonSigningOperatorPubKeys, + ).Return(mocks.MockRaiseAndResolveChallengeCall(BLOCK_NUMBER, TASK_INDEX), nil) + + msg := challenger.callChallengeModule(TASK_INDEX) + assert.Equal(t, msg, nil) + +} + +func TestRaiseChallenge(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + challenger, mockAvsWriterer, _, _, _, err := createMockChallenger(mockCtrl) + assert.Nil(t, err) + + const TASK_INDEX = 1 + const BLOCK_NUMBER = uint32(100) + + challenger.tasks[TASK_INDEX] = cstaskmanager.ICredibleSquaringTaskManagerTask{ + NumberToBeSquared: big.NewInt(3), + TaskCreatedBlock: 1000, + QuorumNumbers: aggtypes.QUORUM_NUMBERS, + QuorumThresholdPercentage: aggtypes.QUORUM_THRESHOLD_NUMERATOR, + } + + challenger.taskResponses[TASK_INDEX] = chtypes.TaskResponseData{ + TaskResponse: cstaskmanager.ICredibleSquaringTaskManagerTaskResponse{ + ReferenceTaskIndex: TASK_INDEX, + NumberSquared: big.NewInt(9), + }, + TaskResponseMetadata: cstaskmanager.ICredibleSquaringTaskManagerTaskResponseMetadata{ + TaskResponsedBlock: 1001, + HashOfNonSigners: [32]byte{}, + }, + NonSigningOperatorPubKeys: []cstaskmanager.BN254G1Point{}, + } + + mockAvsWriterer.EXPECT().RaiseChallenge( + context.Background(), + challenger.tasks[TASK_INDEX], + challenger.taskResponses[TASK_INDEX].TaskResponse, + challenger.taskResponses[TASK_INDEX].TaskResponseMetadata, + challenger.taskResponses[TASK_INDEX].NonSigningOperatorPubKeys, + ).Return(mocks.MockRaiseAndResolveChallengeCall(BLOCK_NUMBER, TASK_INDEX), nil) + + err = challenger.raiseChallenge(TASK_INDEX) + assert.Nil(t, err) +} + +func TestProcessTaskResponseLog(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + challenger, _, _, mockAvsSubscriber, mockEthClient, err := createMockChallenger(mockCtrl) + assert.Nil(t, err) + + const TASK_INDEX = 1 + + challenger.tasks[TASK_INDEX] = cstaskmanager.ICredibleSquaringTaskManagerTask{ + NumberToBeSquared: big.NewInt(3), + TaskCreatedBlock: 1000, + QuorumNumbers: aggtypes.QUORUM_NUMBERS, + QuorumThresholdPercentage: aggtypes.QUORUM_THRESHOLD_NUMERATOR, + } + + challenger.taskResponses[TASK_INDEX] = chtypes.TaskResponseData{ + TaskResponse: cstaskmanager.ICredibleSquaringTaskManagerTaskResponse{ + ReferenceTaskIndex: TASK_INDEX, + NumberSquared: big.NewInt(9), + }, + TaskResponseMetadata: cstaskmanager.ICredibleSquaringTaskManagerTaskResponseMetadata{ + TaskResponsedBlock: 1001, + HashOfNonSigners: [32]byte{}, + }, + NonSigningOperatorPubKeys: []cstaskmanager.BN254G1Point{}, + } + + taskResponseLog := cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded{ + TaskResponse: challenger.taskResponses[TASK_INDEX].TaskResponse, + TaskResponseMetadata: challenger.taskResponses[TASK_INDEX].TaskResponseMetadata, + Raw: gethtypes.Log{ + Address: common.HexToAddress("0x9e545e3c0baab3e08cdfd552c960a1050f373042"), + Topics: []common.Hash{ + // this is the actual TaskChallengedSuccessfully event from calling the func "raiseAndResolveChallenge" + common.HexToHash("0x349c1ee60e4e8972ee9dba642c1774543d5c4136879b7f4caaf04bf81a487a2a"), + }, + Data: common.Hex2Bytes("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a50fe07922f57ae3b4553201bfd7c11aca85e1541f91db8e62dca9c418dc5feae"), + BlockNumber: uint64(100), + TxHash: common.HexToHash("0x6d3b7741fef7cfb22d943cb1c3d221b71253acdf7e56925969d54a18a8566480"), + TxIndex: 1, + BlockHash: common.HexToHash("0x0"), + Index: 1, + Removed: false, + }, + } + + mockAvsSubscriber.EXPECT().ParseTaskResponded(taskResponseLog.Raw).Return(&taskResponseLog, nil) + + mockEthClient.EXPECT().TransactionByHash( + context.Background(), taskResponseLog.Raw.TxHash, + ).Return(mocks.MockTransactionByHash(), true, nil) + + taskIndex := challenger.processTaskResponseLog(&taskResponseLog) + assert.Equal(t, taskIndex, uint32(TASK_INDEX)) + +} + +func createMockChallenger(mockCtrl *gomock.Controller) (*Challenger, *chainiomocks.MockAvsWriterer, *chainiomocks.MockAvsReaderer, *chainiomocks.MockAvsSubscriberer, *mockethclient.MockEthClient, error) { + logger := sdklogging.NewNoopLogger() + mockAvsWriter := chainiomocks.NewMockAvsWriterer(mockCtrl) + mockAvsReader := chainiomocks.NewMockAvsReaderer(mockCtrl) + mockAvsSubscriber := chainiomocks.NewMockAvsSubscriberer(mockCtrl) + mockEthClient := mockethclient.NewMockEthClient(mockCtrl) + challenger := &Challenger{ + logger: logger, + avsWriter: mockAvsWriter, + avsReader: mockAvsReader, + ethClient: mockEthClient, + avsSubscriber: mockAvsSubscriber, + tasks: make(map[uint32]cstaskmanager.ICredibleSquaringTaskManagerTask), + taskResponses: make(map[uint32]chtypes.TaskResponseData), + taskResponseChan: make(chan *cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded), + newTaskCreatedChan: make(chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated), + } + return challenger, mockAvsWriter, mockAvsReader, mockAvsSubscriber, mockEthClient, nil +} diff --git a/challenger/cmd/main.go b/challenger/cmd/main.go new file mode 100644 index 00000000..9f964a17 --- /dev/null +++ b/challenger/cmd/main.go @@ -0,0 +1,64 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "os" + + "github.com/urfave/cli" + + "github.com/Layr-Labs/incredible-squaring-avs/challenger" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" +) + +var ( + // Version is the version of the binary. + Version string + GitCommit string + GitDate string +) + +func main() { + + app := cli.NewApp() + app.Flags = config.Flags + app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate) + app.Name = "credible-squaring-challenger" + app.Usage = "Credible Squaring Challenger" + app.Description = "Service that challenges wrong response to the task." + + app.Action = challengerMain + err := app.Run(os.Args) + if err != nil { + log.Fatalln("Application failed.", "Message:", err) + } +} + +func challengerMain(ctx *cli.Context) error { + + log.Println("Initializing Challenger...") + config, err := config.NewConfig(ctx) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(config, "", " ") + if err != nil { + config.Logger.Fatalf(err.Error()) + } + fmt.Println("Config:", string(configJson)) + + chal, err := challenger.NewChallenger(config) + if err != nil { + return err + } + + err = chal.Start(context.Background()) + if err != nil { + return err + } + + return nil + +} diff --git a/challenger/mocks/chain.go b/challenger/mocks/chain.go new file mode 100644 index 00000000..6060cab8 --- /dev/null +++ b/challenger/mocks/chain.go @@ -0,0 +1,81 @@ +package mocks + +import ( + "encoding/hex" + "math/big" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" +) + +func MockTransactionByHash() *gethtypes.Transaction { + // This is the calldata that is obtained from having only one operator participating in the AVS with a pubkey we choose + // in our setting and is behaving maliciously. + // This calldata was obtained by printing the "RespondToTask" transation and copying the calldata from the logs. + input, err := hex.DecodeString("5baec9a00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c00bcb2b68b6c68a5aea7fe75b5446c4ca410461fa226c2487d07eb2c504639cb52a3b3f7ef4f62985af31809fdc531483e5f1cd67aa1bcf0f8ac0d17e158aa9670940e64478db51fe630cc540dbeabea34d072a54fd7c743056e18174f9a1b64e00c874e4fcfb88d5c98a0240bc6f7f37d45f2226ca147317b3a2b7243ddb6c1b18b8fa707217c86c152f2ec3824f7de662a7c51d3bdf1c20ad574282dde7e6b30ddcb5a696413e8e02e318ae10dadd07c53822ed6832c97f8923d9f38f55b5170000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b5c664a181b916702c1acbbe4617a673cf9fffe733ff902353e315e11f9a7c11bd3ff011ee7d19e9d2ceef4475aac85313e8f31e4b8c66114d32e4ef0ee99590000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000") + if err != nil { + panic(err) + } + baseTx := &gethtypes.DynamicFeeTx{ + Data: input, + } + + return gethtypes.NewTx(baseTx) +} + +func MockRaiseAndResolveChallengeCall(blockNum, taskNum uint32) *gethtypes.Receipt { + return &gethtypes.Receipt{ + Type: 1, + PostState: []byte{}, + Status: 0, + CumulativeGasUsed: 1000000, + Bloom: gethtypes.Bloom{}, + Logs: []*gethtypes.Log{ + { + Address: common.HexToAddress("0xeb61b2307b5846f9e0a72eece51d9cba88256683"), + Topics: []common.Hash{ + // this is the actual TaskChallengedSuccessfully event from calling the func "raiseAndResolveChallenge" + common.HexToHash("0xc20d1bb0f1623680306b83d4ff4bb99a2beb9d86d97832f3ca40fd13a29df1ec"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001"), + common.HexToHash("0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc"), + }, + Data: []byte{}, + BlockNumber: uint64(blockNum), + TxHash: common.HexToHash("0x0"), + TxIndex: 1, + BlockHash: common.HexToHash("0x0"), + Index: 1, + Removed: false, + }, + }, + TxHash: common.HexToHash("0x0"), + ContractAddress: common.HexToAddress("0x0"), + GasUsed: 0, + EffectiveGasPrice: big.NewInt(int64(blockNum)), + BlockHash: common.HexToHash("0x0"), + BlockNumber: big.NewInt(int64(blockNum)), + TransactionIndex: 1, + } +} + +func MockTaskResponseLog() gethtypes.Log { + return gethtypes.Log{ + Address: common.HexToAddress("0x9e545e3c0baab3e08cdfd552c960a1050f373042"), + Topics: []common.Hash{ + // this is the actual TaskChallengedSuccessfully event from calling the func "raiseAndResolveChallenge" + common.HexToHash("0x349c1ee60e4e8972ee9dba642c1774543d5c4136879b7f4caaf04bf81a487a2a"), + }, + Data: common.Hex2Bytes("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a50fe07922f57ae3b4553201bfd7c11aca85e1541f91db8e62dca9c418dc5feae"), + BlockNumber: uint64(100), + TxHash: common.HexToHash("0x0"), + TxIndex: 1, + BlockHash: common.HexToHash("0x0"), + Index: 1, + Removed: false, + } +} + +func MockTaskResponseReferenceTaskIndex(taskResponse cstaskmanager.ICredibleSquaringTaskManagerTaskResponse) uint32 { + return taskResponse.ReferenceTaskIndex +} diff --git a/challenger/types/types.go b/challenger/types/types.go new file mode 100644 index 00000000..33a6142a --- /dev/null +++ b/challenger/types/types.go @@ -0,0 +1,17 @@ +package types + +import ( + "errors" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" +) + +type TaskResponseData struct { + TaskResponse cstaskmanager.ICredibleSquaringTaskManagerTaskResponse + TaskResponseMetadata cstaskmanager.ICredibleSquaringTaskManagerTaskResponseMetadata + NonSigningOperatorPubKeys []cstaskmanager.BN254G1Point +} + +var ( + NoErrorInTaskResponse = errors.New("100. Task response is valid") +) diff --git a/cli/actions/deposit_into_strategy.go b/cli/actions/deposit_into_strategy.go new file mode 100644 index 00000000..331ca808 --- /dev/null +++ b/cli/actions/deposit_into_strategy.go @@ -0,0 +1,51 @@ +package actions + +import ( + "encoding/json" + "fmt" + "log" + "math/big" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/Layr-Labs/incredible-squaring-avs/operator" + "github.com/Layr-Labs/incredible-squaring-avs/types" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli" +) + +func DepositIntoStrategy(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + strategyAddrStr := ctx.String("strategy-addr") + strategyAddr := common.HexToAddress(strategyAddrStr) + amountStr := ctx.String("amount") + amount, ok := new(big.Int).SetString(amountStr, 10) + if !ok { + fmt.Println("Error converting amount to big.Int") + return err + } + + err = operator.DepositIntoStrategy(strategyAddr, amount) + if err != nil { + return err + } + + return nil +} diff --git a/cli/actions/print_operator_status.go b/cli/actions/print_operator_status.go new file mode 100644 index 00000000..f17fb6f4 --- /dev/null +++ b/cli/actions/print_operator_status.go @@ -0,0 +1,39 @@ +package actions + +import ( + "encoding/json" + "log" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/Layr-Labs/incredible-squaring-avs/operator" + "github.com/Layr-Labs/incredible-squaring-avs/types" + "github.com/urfave/cli" +) + +func PrintOperatorStatus(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + err = operator.PrintOperatorStatus() + if err != nil { + return err + } + + return nil +} diff --git a/cli/actions/register_operator_pubkeys.go b/cli/actions/register_operator_pubkeys.go new file mode 100644 index 00000000..3dfe69e1 --- /dev/null +++ b/cli/actions/register_operator_pubkeys.go @@ -0,0 +1,39 @@ +package actions + +import ( + "encoding/json" + "log" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/Layr-Labs/incredible-squaring-avs/operator" + "github.com/Layr-Labs/incredible-squaring-avs/types" + "github.com/urfave/cli" +) + +func RegisterOperatorBlsPubkeys(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + err = operator.RegisterBLSPublicKey() + if err != nil { + return err + } + + return nil +} diff --git a/cli/actions/register_operator_with_avs.go b/cli/actions/register_operator_with_avs.go new file mode 100644 index 00000000..08a0bd49 --- /dev/null +++ b/cli/actions/register_operator_with_avs.go @@ -0,0 +1,39 @@ +package actions + +import ( + "encoding/json" + "log" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/Layr-Labs/incredible-squaring-avs/operator" + "github.com/Layr-Labs/incredible-squaring-avs/types" + "github.com/urfave/cli" +) + +func RegisterOperatorWithAvs(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + err = operator.RegisterOperatorWithAvs() + if err != nil { + return err + } + + return nil +} diff --git a/cli/actions/register_operator_with_eigenlayer.go b/cli/actions/register_operator_with_eigenlayer.go new file mode 100644 index 00000000..9805116f --- /dev/null +++ b/cli/actions/register_operator_with_eigenlayer.go @@ -0,0 +1,39 @@ +package actions + +import ( + "encoding/json" + "github.com/urfave/cli" + "log" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/Layr-Labs/incredible-squaring-avs/operator" + "github.com/Layr-Labs/incredible-squaring-avs/types" +) + +func RegisterOperatorWithEigenlayer(ctx *cli.Context) error { + + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + + err = operator.RegisterOperatorWithEigenlayer() + if err != nil { + return err + } + + return nil +} diff --git a/cli/main.go b/cli/main.go new file mode 100644 index 00000000..a26cdefe --- /dev/null +++ b/cli/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "log" + "os" + + "github.com/Layr-Labs/incredible-squaring-avs/cli/actions" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag{config.ConfigFileFlag} + app.Commands = []cli.Command{ + { + Name: "register-operator-with-eigenlayer", + Aliases: []string{"rel"}, + Usage: "registers operator with eigenlayer (this should be called via eigenlayer cli, not plugin, but keeping here for convenience for now)", + Action: actions.RegisterOperatorWithEigenlayer, + }, + { + Name: "register-operator-bls-pubkeys", + Aliases: []string{"rpk"}, + Usage: "registers operator bls pubkeys with eigenlayer pubkey compendium (this should be called via eigenlayer cli, not plugin, but keeping here for convenience for now)", + Action: actions.RegisterOperatorBlsPubkeys, + }, + { + Name: "deposit-into-strategy", + Aliases: []string{"d"}, + Usage: "deposit tokens into a strategy", + Action: actions.DepositIntoStrategy, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "strategy-addr", + Usage: "Address of Strategy contract to deposit into", + Required: true, + }, + cli.StringFlag{ + Name: "amount", + Usage: "amount of tokens to deposit into strategy", + Required: true, + }, + }, + }, + { + Name: "register-operator-with-avs", + Aliases: []string{"r"}, + Usage: "registers bls keys with pubkey-compendium, opts into slashing by avs service-manager, and registers operators with avs registry", + Action: actions.RegisterOperatorWithAvs, + }, + { + Name: "deregister-operator-with-avs", + Aliases: []string{"d"}, + Action: func(ctx *cli.Context) error { + log.Fatal("Command not implemented.") + return nil + }, + }, + { + Name: "print-operator-status", + Aliases: []string{"s"}, + Usage: "prints operator status as viewed from incredible squaring contracts", + Action: actions.PrintOperatorStatus, + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} diff --git a/common/abi.go b/common/abi.go new file mode 100644 index 00000000..e6f34d97 --- /dev/null +++ b/common/abi.go @@ -0,0 +1,8 @@ +package common + +import ( + _ "embed" +) + +//go:embed abis/CredibleSquaringTaskManager.json +var CredibleSquaringTaskManagerAbi []byte diff --git a/common/abis/CredibleSquaringTaskManager.json b/common/abis/CredibleSquaringTaskManager.json new file mode 100644 index 00000000..f89b4edb --- /dev/null +++ b/common/abis/CredibleSquaringTaskManager.json @@ -0,0 +1,1198 @@ +[ + { + "inputs": [ + { + "internalType": "contract IBLSRegistryCoordinatorWithIndices", + "name": "_registryCoordinator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "taskIndex", + "type": "uint32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "numberToBeSquared", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "taskCreatedBlock", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "quorumThresholdPercentage", + "type": "uint32" + } + ], + "indexed": true, + "internalType": "struct ICredibleSquaringTaskManager.Task", + "name": "task", + "type": "tuple" + } + ], + "name": "NewTaskCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newPausedStatus", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IPauserRegistry", + "name": "pauserRegistry", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract IPauserRegistry", + "name": "newPauserRegistry", + "type": "address" + } + ], + "name": "PauserRegistrySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "taskIndex", + "type": "uint32" + }, + { + "indexed": true, + "internalType": "address", + "name": "challenger", + "type": "address" + } + ], + "name": "TaskChallengedSuccessfully", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "taskIndex", + "type": "uint32" + }, + { + "indexed": true, + "internalType": "address", + "name": "challenger", + "type": "address" + } + ], + "name": "TaskChallengedUnsuccessfully", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint32", + "name": "taskIndex", + "type": "uint32" + } + ], + "name": "TaskCompleted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "referenceTaskIndex", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "numberSquared", + "type": "uint256" + } + ], + "indexed": true, + "internalType": "struct ICredibleSquaringTaskManager.TaskResponse", + "name": "taskResponse", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "taskResponsedBlock", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "hashOfNonSigners", + "type": "bytes32" + } + ], + "indexed": true, + "internalType": "struct ICredibleSquaringTaskManager.TaskResponseMetadata", + "name": "taskResponseMetadata", + "type": "tuple" + } + ], + "name": "TaskResponded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newPausedStatus", + "type": "uint256" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "TASK_CHALLENGE_WINDOW_BLOCK", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TASK_RESPONSE_WINDOW_BLOCK", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "aggregator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "blsPubkeyRegistry", + "outputs": [ + { + "internalType": "contract IBLSPubkeyRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "referenceBlockNumber", + "type": "uint32" + }, + { + "components": [ + { + "internalType": "uint32[]", + "name": "nonSignerQuorumBitmapIndices", + "type": "uint32[]" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point[]", + "name": "nonSignerPubkeys", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point[]", + "name": "quorumApks", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "X", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2]", + "name": "Y", + "type": "uint256[2]" + } + ], + "internalType": "struct BN254.G2Point", + "name": "apkG2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma", + "type": "tuple" + }, + { + "internalType": "uint32[]", + "name": "quorumApkIndices", + "type": "uint32[]" + }, + { + "internalType": "uint32[]", + "name": "totalStakeIndices", + "type": "uint32[]" + }, + { + "internalType": "uint32[][]", + "name": "nonSignerStakeIndices", + "type": "uint32[][]" + } + ], + "internalType": "struct BLSSignatureChecker.NonSignerStakesAndSignature", + "name": "nonSignerStakesAndSignature", + "type": "tuple" + } + ], + "name": "checkSignatures", + "outputs": [ + { + "components": [ + { + "internalType": "uint96[]", + "name": "signedStakeForQuorum", + "type": "uint96[]" + }, + { + "internalType": "uint96[]", + "name": "totalStakeForQuorum", + "type": "uint96[]" + } + ], + "internalType": "struct BLSSignatureChecker.QuorumStakeTotals", + "name": "", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numberToBeSquared", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "quorumThresholdPercentage", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + } + ], + "name": "createNewTask", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "generator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IBLSRegistryCoordinatorWithIndices", + "name": "registryCoordinator", + "type": "address" + }, + { + "internalType": "uint32", + "name": "referenceBlockNumber", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "nonSignerOperatorIds", + "type": "bytes32[]" + } + ], + "name": "getCheckSignaturesIndices", + "outputs": [ + { + "components": [ + { + "internalType": "uint32[]", + "name": "nonSignerQuorumBitmapIndices", + "type": "uint32[]" + }, + { + "internalType": "uint32[]", + "name": "quorumApkIndices", + "type": "uint32[]" + }, + { + "internalType": "uint32[]", + "name": "totalStakeIndices", + "type": "uint32[]" + }, + { + "internalType": "uint32[][]", + "name": "nonSignerStakeIndices", + "type": "uint32[][]" + } + ], + "internalType": "struct BLSOperatorStateRetriever.CheckSignaturesIndices", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IBLSRegistryCoordinatorWithIndices", + "name": "registryCoordinator", + "type": "address" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "blockNumber", + "type": "uint32" + } + ], + "name": "getOperatorPubkeys", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "operatorId", + "type": "bytes32" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "pubkeyG1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "X", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2]", + "name": "Y", + "type": "uint256[2]" + } + ], + "internalType": "struct BN254.G2Point", + "name": "pubkeyG2", + "type": "tuple" + } + ], + "internalType": "struct IBLSPublicKeyCompendium.BN254Pubkeys", + "name": "bn254pubkeys", + "type": "tuple" + } + ], + "internalType": "struct BLSOperatorStateRetriever.OperatorPubkeys[][]", + "name": "", + "type": "tuple[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IBLSRegistryCoordinatorWithIndices", + "name": "registryCoordinator", + "type": "address" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "blockNumber", + "type": "uint32" + } + ], + "name": "getOperatorState", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "operatorId", + "type": "bytes32" + }, + { + "internalType": "uint96", + "name": "stake", + "type": "uint96" + } + ], + "internalType": "struct BLSOperatorStateRetriever.Operator[][]", + "name": "", + "type": "tuple[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IBLSRegistryCoordinatorWithIndices", + "name": "registryCoordinator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "operatorId", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "blockNumber", + "type": "uint32" + } + ], + "name": "getOperatorState", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "operatorId", + "type": "bytes32" + }, + { + "internalType": "uint96", + "name": "stake", + "type": "uint96" + } + ], + "internalType": "struct BLSOperatorStateRetriever.Operator[][]", + "name": "", + "type": "tuple[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IPauserRegistry", + "name": "_pauserRegistry", + "type": "address" + }, + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "_aggregator", + "type": "address" + }, + { + "internalType": "address", + "name": "_generator", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "latestTaskNum", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newPausedStatus", + "type": "uint256" + } + ], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pauseAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "index", + "type": "uint8" + } + ], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauserRegistry", + "outputs": [ + { + "internalType": "contract IPauserRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "numberToBeSquared", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "taskCreatedBlock", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "quorumThresholdPercentage", + "type": "uint32" + } + ], + "internalType": "struct ICredibleSquaringTaskManager.Task", + "name": "task", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "referenceTaskIndex", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "numberSquared", + "type": "uint256" + } + ], + "internalType": "struct ICredibleSquaringTaskManager.TaskResponse", + "name": "taskResponse", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "taskResponsedBlock", + "type": "uint32" + }, + { + "internalType": "bytes32", + "name": "hashOfNonSigners", + "type": "bytes32" + } + ], + "internalType": "struct ICredibleSquaringTaskManager.TaskResponseMetadata", + "name": "taskResponseMetadata", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point[]", + "name": "pubkeysOfNonSigningOperators", + "type": "tuple[]" + } + ], + "name": "raiseAndResolveChallenge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "registryCoordinator", + "outputs": [ + { + "internalType": "contract IRegistryCoordinator", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "numberToBeSquared", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "taskCreatedBlock", + "type": "uint32" + }, + { + "internalType": "bytes", + "name": "quorumNumbers", + "type": "bytes" + }, + { + "internalType": "uint32", + "name": "quorumThresholdPercentage", + "type": "uint32" + } + ], + "internalType": "struct ICredibleSquaringTaskManager.Task", + "name": "task", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint32", + "name": "referenceTaskIndex", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "numberSquared", + "type": "uint256" + } + ], + "internalType": "struct ICredibleSquaringTaskManager.TaskResponse", + "name": "taskResponse", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint32[]", + "name": "nonSignerQuorumBitmapIndices", + "type": "uint32[]" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point[]", + "name": "nonSignerPubkeys", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point[]", + "name": "quorumApks", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "X", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2]", + "name": "Y", + "type": "uint256[2]" + } + ], + "internalType": "struct BN254.G2Point", + "name": "apkG2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma", + "type": "tuple" + }, + { + "internalType": "uint32[]", + "name": "quorumApkIndices", + "type": "uint32[]" + }, + { + "internalType": "uint32[]", + "name": "totalStakeIndices", + "type": "uint32[]" + }, + { + "internalType": "uint32[][]", + "name": "nonSignerStakeIndices", + "type": "uint32[][]" + } + ], + "internalType": "struct BLSSignatureChecker.NonSignerStakesAndSignature", + "name": "nonSignerStakesAndSignature", + "type": "tuple" + } + ], + "name": "respondToTask", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IPauserRegistry", + "name": "newPauserRegistry", + "type": "address" + } + ], + "name": "setPauserRegistry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeRegistry", + "outputs": [ + { + "internalType": "contract IStakeRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "taskNumber", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "apk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256[2]", + "name": "X", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2]", + "name": "Y", + "type": "uint256[2]" + } + ], + "internalType": "struct BN254.G2Point", + "name": "apkG2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "X", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma", + "type": "tuple" + } + ], + "name": "trySignatureAndApkVerification", + "outputs": [ + { + "internalType": "bool", + "name": "pairingSuccessful", + "type": "bool" + }, + { + "internalType": "bool", + "name": "siganatureIsValid", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newPausedStatus", + "type": "uint256" + } + ], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/config-files/aggregator-docker-compose.yaml b/config-files/aggregator-docker-compose.yaml new file mode 100644 index 00000000..5f51969c --- /dev/null +++ b/config-files/aggregator-docker-compose.yaml @@ -0,0 +1,7 @@ +# production only prints info and above. development also prints debug +environment: production +eth_rpc_url: http://anvil:8545 +eth_ws_url: ws://anvil:8545 +# address which the aggregator listens on for operator signed messages +aggregator_server_ip_port_address: 0.0.0.0:8090 +bls_public_key_compendium_address: 0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44 \ No newline at end of file diff --git a/config-files/aggregator.yaml b/config-files/aggregator.yaml new file mode 100644 index 00000000..a0943cfe --- /dev/null +++ b/config-files/aggregator.yaml @@ -0,0 +1,7 @@ +# 'production' only prints info and above. 'development' also prints debug +environment: production +eth_rpc_url: http://localhost:8545 +eth_ws_url: ws://localhost:8545 +# address which the aggregator listens on for operator signed messages +aggregator_server_ip_port_address: localhost:8090 +bls_public_key_compendium_address: 0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44 diff --git a/config-files/challenger.yaml b/config-files/challenger.yaml new file mode 100644 index 00000000..52af8f3a --- /dev/null +++ b/config-files/challenger.yaml @@ -0,0 +1,4 @@ +# 'production' only prints info and above. 'development' also prints debug +environment: production +eth_rpc_url: http://localhost:8545 +eth_ws_url: ws://localhost:8545 diff --git a/config-files/node_config-docker-compose.anvil.yaml b/config-files/node_config-docker-compose.anvil.yaml new file mode 100644 index 00000000..a052c74f --- /dev/null +++ b/config-files/node_config-docker-compose.anvil.yaml @@ -0,0 +1,43 @@ +# this sets the logger level (true = info, false = debug) +production: false + +operator_address: 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 + +# EigenLayer Slasher contract address + +# This is the address of the slasher which is deployed in the anvil saved state +# The saved eigenlayer state is located in tests/integration/eigenlayer-deployed-anvil-state.json +el_slasher_address: 0x5FC8d32690cc91D4c39d9d3abcBD16989F875707 +avs_service_manager_address: 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690 +bls_operator_state_retriever_address: 0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f +bls_public_key_compendium_address: 0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44 + +# ETH RPC URL +eth_rpc_url: http://anvil:8545 +eth_ws_url: ws://anvil:8545 + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/ecdsa_key.json as the host path will be asked while running +# +# If you are running locally using go run main.go, this should be full path to your local ecdsa key file +ecdsa_private_key_store_path: tests/keys/test.ecdsa.key.json + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/bls_key.json as the host path will be asked while running +# +# We are using bn254 curve for bls keys +# +# If you are running locally using go run main.go, this should be full path to your local bls key file +bls_private_key_store_path: tests/keys/test.bls.key.json + +# address which the aggregator listens on for operator signed messages +aggregator_server_ip_port_address: incredible-squaring-aggregator:8090 +eigen_metrics_ip_port_address: 0.0.0.0:9090 +use_instrumented_eth_client: false + +# we need to register the operator on startup when running the docker compose file +# because unfortunately we cannot register the operator previously and save it in the anvil json file +# This is because anvil only dumps the state, and not the receipt tree, so when we restart anvil with +# the registered operator, it's blspubkey registering event with the compendium is not present anymore, +# and so the aggregator can't find it.... very annoying +register_operator_on_startup: true diff --git a/config-files/node_config.anvil.yaml b/config-files/node_config.anvil.yaml new file mode 100644 index 00000000..d26e075e --- /dev/null +++ b/config-files/node_config.anvil.yaml @@ -0,0 +1,37 @@ +# this sets the logger level (true = info, false = debug) +production: true + +operator_address: 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 + +# EigenLayer Slasher contract address + +# This is the address of the slasher which is deployed in the anvil saved state +# The saved eigenlayer state is located in tests/integration/eigenlayer-deployed-anvil-state.json +el_slasher_address: 0x5FC8d32690cc91D4c39d9d3abcBD16989F875707 +avs_service_manager_address: 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690 +bls_operator_state_retriever_address: 0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f +bls_public_key_compendium_address: 0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44 + +# ETH RPC URL +eth_rpc_url: http://localhost:8545 +eth_ws_url: ws://localhost:8545 + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/ecdsa_key.json as the host path will be asked while running +# +# If you are running locally using go run main.go, this should be full path to your local ecdsa key file +ecdsa_private_key_store_path: tests/keys/test.ecdsa.key.json + +# If you running this using eigenlayer CLI and the provided AVS packaging structure, +# this should be /operator_keys/bls_key.json as the host path will be asked while running +# +# We are using bn254 curve for bls keys +# +# If you are running locally using go run main.go, this should be full path to your local bls key file +bls_private_key_store_path: tests/keys/test.bls.key.json + +aggregator_server_ip_port_address: localhost:8090 +eigen_metrics_ip_port_address: localhost:9090 +use_instrumented_eth_client: false + +register_operator_on_startup: true diff --git a/contracts/.github/workflows/test.yml b/contracts/.github/workflows/test.yml new file mode 100644 index 00000000..09880b1d --- /dev/null +++ b/contracts/.github/workflows/test.yml @@ -0,0 +1,34 @@ +name: test + +on: workflow_dispatch + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Run Forge build + run: | + forge --version + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/contracts/.gitignore b/contracts/.gitignore new file mode 100644 index 00000000..cd9278d5 --- /dev/null +++ b/contracts/.gitignore @@ -0,0 +1,15 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +/broadcast/** + +# Docs +docs/ + +# Dotenv file +.env + +# Not sure what this folder is for.. so removing for now +data/ diff --git a/core/chainio/avs_reader.go b/core/chainio/avs_reader.go new file mode 100644 index 00000000..7bfe375e --- /dev/null +++ b/core/chainio/avs_reader.go @@ -0,0 +1,102 @@ +package chainio + +import ( + "context" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + gethcommon "github.com/ethereum/go-ethereum/common" + + sdkavsregistry "github.com/Layr-Labs/eigensdk-go/chainio/avsregistry" + sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + logging "github.com/Layr-Labs/eigensdk-go/logging" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + erc20mock "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/ERC20Mock" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" +) + +type AvsReaderer interface { + sdkavsregistry.AvsRegistryReader + + CheckSignatures( + ctx context.Context, msgHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, nonSignerStakesAndSignature cstaskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature, + ) (cstaskmanager.IBLSSignatureCheckerQuorumStakeTotals, error) + GetErc20Mock(ctx context.Context, tokenAddr gethcommon.Address) (*erc20mock.ContractERC20Mock, error) +} + +type AvsReader struct { + sdkavsregistry.AvsRegistryReader + AvsServiceBindings *AvsServiceBindings + logger logging.Logger +} + +var _ AvsReaderer = (*AvsReader)(nil) + +func NewAvsReaderFromConfig(c *config.Config) (*AvsReader, error) { + + avsContractBindings, err := NewAvsServiceBindings(c.CredibleSquaringServiceManagerAddr, c.BlsOperatorStateRetrieverAddr, c.EthHttpClient, c.Logger) + if err != nil { + return nil, err + } + blsRegistryCoordinatorAddr, err := avsContractBindings.ServiceManager.RegistryCoordinator(&bind.CallOpts{}) + if err != nil { + return nil, err + } + stakeRegistryAddr, err := avsContractBindings.ServiceManager.StakeRegistry(&bind.CallOpts{}) + if err != nil { + return nil, err + } + blsPubkeyRegistryAddr, err := avsContractBindings.ServiceManager.BlsPubkeyRegistry(&bind.CallOpts{}) + if err != nil { + return nil, err + } + ethClient, err := eth.NewClient(c.EthRpcUrl) + if err != nil { + return nil, err + } + avsRegistryContractClient, err := sdkclients.NewAvsRegistryContractsChainClient(blsRegistryCoordinatorAddr, c.BlsOperatorStateRetrieverAddr, stakeRegistryAddr, blsPubkeyRegistryAddr, ethClient, c.Logger) + if err != nil { + return nil, err + } + + avsRegistryReader, err := sdkavsregistry.NewAvsRegistryReader(avsRegistryContractClient, c.Logger, ethClient) + if err != nil { + return nil, err + } + avsServiceBindings, err := NewAvsServiceBindings(c.CredibleSquaringServiceManagerAddr, c.BlsOperatorStateRetrieverAddr, c.EthHttpClient, c.Logger) + if err != nil { + return nil, err + } + + return NewAvsReader(avsRegistryReader, avsServiceBindings, c.Logger) +} + +func NewAvsReader(avsRegistryReader sdkavsregistry.AvsRegistryReader, avsServiceBindings *AvsServiceBindings, logger logging.Logger) (*AvsReader, error) { + return &AvsReader{ + AvsRegistryReader: avsRegistryReader, + AvsServiceBindings: avsServiceBindings, + logger: logger, + }, nil +} + +func (r *AvsReader) CheckSignatures( + ctx context.Context, msgHash [32]byte, quorumNumbers []byte, referenceBlockNumber uint32, nonSignerStakesAndSignature cstaskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature, +) (cstaskmanager.IBLSSignatureCheckerQuorumStakeTotals, error) { + stakeTotalsPerQuorum, _, err := r.AvsServiceBindings.TaskManager.CheckSignatures( + &bind.CallOpts{}, msgHash, quorumNumbers, referenceBlockNumber, nonSignerStakesAndSignature, + ) + if err != nil { + return cstaskmanager.IBLSSignatureCheckerQuorumStakeTotals{}, err + } + return stakeTotalsPerQuorum, nil +} + +func (r *AvsReader) GetErc20Mock(ctx context.Context, tokenAddr gethcommon.Address) (*erc20mock.ContractERC20Mock, error) { + erc20Mock, err := r.AvsServiceBindings.GetErc20Mock(tokenAddr) + if err != nil { + r.logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return nil, err + } + return erc20Mock, nil +} diff --git a/core/chainio/avs_subscriber.go b/core/chainio/avs_subscriber.go new file mode 100644 index 00000000..59dfd0b4 --- /dev/null +++ b/core/chainio/avs_subscriber.go @@ -0,0 +1,76 @@ +package chainio + +import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" + gethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" +) + +type AvsSubscriberer interface { + SubscribeToNewTasks(newTaskCreatedChan chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated) event.Subscription + SubscribeToTaskResponses(taskResponseLogs chan *cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded) event.Subscription + ParseTaskResponded(rawLog types.Log) (*cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded, error) +} + +// Subscribers use a ws connection instead of http connection like Readers +// kind of stupid that the geth client doesn't have a unified interface for both... +// it takes a single url, so the bindings, even though they have watcher functions, those can't be used +// with the http connection... seems very very stupid. Am I missing something? +type AvsSubscriber struct { + AvsContractBindings *AvsServiceBindings + logger sdklogging.Logger +} + +func NewAvsSubscriberFromConfig(config *config.Config) (*AvsSubscriber, error) { + return NewAvsSubscriber( + config.CredibleSquaringServiceManagerAddr, + config.BlsOperatorStateRetrieverAddr, + config.EthWsClient, + config.Logger, + ) +} + +func NewAvsSubscriber(serviceManagerAddr, blsOperatorStateRetrieverAddr gethcommon.Address, ethclient eth.EthClient, logger sdklogging.Logger) (*AvsSubscriber, error) { + avsContractBindings, err := NewAvsServiceBindings(serviceManagerAddr, blsOperatorStateRetrieverAddr, ethclient, logger) + if err != nil { + logger.Errorf("Failed to create contract bindings", "err", err) + return nil, err + } + return &AvsSubscriber{ + AvsContractBindings: avsContractBindings, + logger: logger, + }, nil +} + +func (s *AvsSubscriber) SubscribeToNewTasks(newTaskCreatedChan chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated) event.Subscription { + sub, err := s.AvsContractBindings.TaskManager.WatchNewTaskCreated( + &bind.WatchOpts{}, newTaskCreatedChan, nil, + ) + if err != nil { + s.logger.Error("Failed to subscribe to new TaskManager tasks", "err", err) + } + s.logger.Infof("Subscribed to new TaskManager tasks") + return sub +} + +func (s *AvsSubscriber) SubscribeToTaskResponses(taskResponseChan chan *cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded) event.Subscription { + sub, err := s.AvsContractBindings.TaskManager.WatchTaskResponded( + &bind.WatchOpts{}, taskResponseChan, + ) + if err != nil { + s.logger.Error("Failed to subscribe to TaskResponded events", "err", err) + } + s.logger.Infof("Subscribed to TaskResponded events") + return sub +} + +func (s *AvsSubscriber) ParseTaskResponded(rawLog types.Log) (*cstaskmanager.ContractCredibleSquaringTaskManagerTaskResponded, error) { + return s.AvsContractBindings.TaskManager.ContractCredibleSquaringTaskManagerFilterer.ParseTaskResponded(rawLog) +} diff --git a/core/chainio/avs_writer.go b/core/chainio/avs_writer.go new file mode 100644 index 00000000..041220ee --- /dev/null +++ b/core/chainio/avs_writer.go @@ -0,0 +1,139 @@ +package chainio + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + gethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + + "github.com/Layr-Labs/eigensdk-go/chainio/avsregistry" + sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + logging "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signer" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" +) + +type AvsWriterer interface { + avsregistry.AvsRegistryWriter + + SendNewTaskNumberToSquare( + ctx context.Context, + numToSquare *big.Int, + quorumThresholdPercentage uint32, + quorumNumbers []byte, + ) (cstaskmanager.ICredibleSquaringTaskManagerTask, uint32, error) + RaiseChallenge( + ctx context.Context, + task cstaskmanager.ICredibleSquaringTaskManagerTask, + taskResponse cstaskmanager.ICredibleSquaringTaskManagerTaskResponse, + taskResponseMetadata cstaskmanager.ICredibleSquaringTaskManagerTaskResponseMetadata, + pubkeysOfNonSigningOperators []cstaskmanager.BN254G1Point, + ) (*types.Receipt, error) + SendAggregatedResponse(ctx context.Context, + task cstaskmanager.ICredibleSquaringTaskManagerTask, + taskResponse cstaskmanager.ICredibleSquaringTaskManagerTaskResponse, + nonSignerStakesAndSignature cstaskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature, + ) (*types.Receipt, error) +} + +type AvsWriter struct { + avsregistry.AvsRegistryWriter + AvsContractBindings *AvsServiceBindings + logger logging.Logger + Signer signer.Signer + client eth.EthClient +} + +var _ AvsWriterer = (*AvsWriter)(nil) + +func NewAvsWriterFromConfig(c *config.Config) (*AvsWriter, error) { + return NewAvsWriter(c.Signer, c.CredibleSquaringServiceManagerAddr, c.BlsOperatorStateRetrieverAddr, c.EthHttpClient, c.Logger) +} + +func NewAvsWriter(signer signer.Signer, serviceManagerAddr, blsOperatorStateRetrieverAddr gethcommon.Address, ethHttpClient eth.EthClient, logger logging.Logger) (*AvsWriter, error) { + avsServiceBindings, err := NewAvsServiceBindings(serviceManagerAddr, blsOperatorStateRetrieverAddr, ethHttpClient, logger) + if err != nil { + logger.Error("Failed to create contract bindings", "err", err) + return nil, err + } + blsRegistryCoordinatorAddr, err := avsServiceBindings.ServiceManager.RegistryCoordinator(&bind.CallOpts{}) + if err != nil { + return nil, err + } + stakeRegistryAddr, err := avsServiceBindings.ServiceManager.StakeRegistry(&bind.CallOpts{}) + if err != nil { + return nil, err + } + blsPubkeyRegistryAddr, err := avsServiceBindings.ServiceManager.BlsPubkeyRegistry(&bind.CallOpts{}) + if err != nil { + return nil, err + } + avsRegistryContractClient, err := sdkclients.NewAvsRegistryContractsChainClient( + blsRegistryCoordinatorAddr, blsOperatorStateRetrieverAddr, stakeRegistryAddr, blsPubkeyRegistryAddr, ethHttpClient, logger, + ) + if err != nil { + return nil, err + } + avsRegistryWriter, err := avsregistry.NewAvsRegistryWriter(avsRegistryContractClient, logger, signer, ethHttpClient) + if err != nil { + return nil, err + } + + return &AvsWriter{ + AvsRegistryWriter: avsRegistryWriter, + AvsContractBindings: avsServiceBindings, + logger: logger, + Signer: signer, + client: ethHttpClient, + }, nil +} + +// returns the tx receipt, as well as the task index (which it gets from parsing the tx receipt logs) +func (w *AvsWriter) SendNewTaskNumberToSquare(ctx context.Context, numToSquare *big.Int, quorumThresholdPercentage uint32, quorumNumbers []byte) (cstaskmanager.ICredibleSquaringTaskManagerTask, uint32, error) { + txOpts := w.Signer.GetTxOpts() + tx, err := w.AvsContractBindings.TaskManager.CreateNewTask(txOpts, numToSquare, quorumThresholdPercentage, quorumNumbers) + if err != nil { + w.logger.Errorf("Error assembling CreateNewTask tx") + return cstaskmanager.ICredibleSquaringTaskManagerTask{}, 0, err + } + receipt := w.client.WaitForTransactionReceipt(ctx, tx.Hash()) + newTaskCreatedEvent, err := w.AvsContractBindings.TaskManager.ContractCredibleSquaringTaskManagerFilterer.ParseNewTaskCreated(*receipt.Logs[0]) + if err != nil { + w.logger.Error("Aggregator failed to parse new task created event", "err", err) + return cstaskmanager.ICredibleSquaringTaskManagerTask{}, 0, err + } + return newTaskCreatedEvent.Task, newTaskCreatedEvent.TaskIndex, nil +} + +func (w *AvsWriter) SendAggregatedResponse(ctx context.Context, task cstaskmanager.ICredibleSquaringTaskManagerTask, taskResponse cstaskmanager.ICredibleSquaringTaskManagerTaskResponse, nonSignerStakesAndSignature cstaskmanager.IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Receipt, error) { + txOpts := w.Signer.GetTxOpts() + tx, err := w.AvsContractBindings.TaskManager.RespondToTask(txOpts, task, taskResponse, nonSignerStakesAndSignature) + if err != nil { + w.logger.Error("Error submitting SubmitTaskResponse tx while calling respondToTask", "err", err) + return nil, err + } + receipt := w.client.WaitForTransactionReceipt(ctx, tx.Hash()) + return receipt, nil +} + +func (w *AvsWriter) RaiseChallenge( + ctx context.Context, + task cstaskmanager.ICredibleSquaringTaskManagerTask, + taskResponse cstaskmanager.ICredibleSquaringTaskManagerTaskResponse, + taskResponseMetadata cstaskmanager.ICredibleSquaringTaskManagerTaskResponseMetadata, + pubkeysOfNonSigningOperators []cstaskmanager.BN254G1Point, +) (*types.Receipt, error) { + txOpts := w.Signer.GetTxOpts() + tx, err := w.AvsContractBindings.TaskManager.RaiseAndResolveChallenge(txOpts, task, taskResponse, taskResponseMetadata, pubkeysOfNonSigningOperators) + if err != nil { + w.logger.Errorf("Error assembling RaiseChallenge tx") + return nil, err + } + receipt := w.client.WaitForTransactionReceipt(ctx, tx.Hash()) + return receipt, nil +} diff --git a/core/chainio/bindings.go b/core/chainio/bindings.go new file mode 100644 index 00000000..972640f2 --- /dev/null +++ b/core/chainio/bindings.go @@ -0,0 +1,56 @@ +package chainio + +import ( + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/logging" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + gethcommon "github.com/ethereum/go-ethereum/common" + + csservicemanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringServiceManager" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + erc20mock "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/ERC20Mock" +) + +type AvsServiceBindings struct { + TaskManager *cstaskmanager.ContractCredibleSquaringTaskManager + ServiceManager *csservicemanager.ContractCredibleSquaringServiceManager + ethClient eth.EthClient + logger logging.Logger +} + +func NewAvsServiceBindings(serviceManagerAddr, blsOperatorStateRetrieverAddr gethcommon.Address, ethclient eth.EthClient, logger logging.Logger) (*AvsServiceBindings, error) { + contractServiceManager, err := csservicemanager.NewContractCredibleSquaringServiceManager(serviceManagerAddr, ethclient) + if err != nil { + logger.Error("Failed to fetch IServiceManager contract", "err", err) + return nil, err + } + + taskManagerAddr, err := contractServiceManager.CredibleSquaringTaskManager(&bind.CallOpts{}) + if err != nil { + logger.Error("Failed to fetch TaskManager address", "err", err) + return nil, err + } + contractTaskManager, err := cstaskmanager.NewContractCredibleSquaringTaskManager(taskManagerAddr, ethclient) + if err != nil { + logger.Error("Failed to fetch ICredibleSquaringTaskManager contract", "err", err) + return nil, err + } + + return &AvsServiceBindings{ + ServiceManager: contractServiceManager, + TaskManager: contractTaskManager, + ethClient: ethclient, + logger: logger, + }, nil +} + +func (b *AvsServiceBindings) GetErc20Mock(tokenAddr common.Address) (*erc20mock.ContractERC20Mock, error) { + contractErc20Mock, err := erc20mock.NewContractERC20Mock(tokenAddr, b.ethClient) + if err != nil { + b.logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return nil, err + } + return contractErc20Mock, nil +} diff --git a/core/chainio/gen.go b/core/chainio/gen.go new file mode 100644 index 00000000..f3061211 --- /dev/null +++ b/core/chainio/gen.go @@ -0,0 +1,5 @@ +package chainio + +//go:generate mockgen -destination=./mocks/avs_subscriber.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/core/chainio AvsSubscriberer +//go:generate mockgen -destination=./mocks/avs_writer.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/core/chainio AvsWriterer +//go:generate mockgen -destination=./mocks/avs_reader.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/core/chainio AvsReaderer diff --git a/core/chainio/mocks/avs_reader.go b/core/chainio/mocks/avs_reader.go new file mode 100644 index 00000000..d9bb0861 --- /dev/null +++ b/core/chainio/mocks/avs_reader.go @@ -0,0 +1,165 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/Layr-Labs/incredible-squaring-avs/core/chainio (interfaces: AvsReaderer) +// +// Generated by this command: +// +// mockgen -destination=./mocks/avs_reader.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/core/chainio AvsReaderer +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + contractBLSOperatorStateRetriever "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSOperatorStateRetriever" + contractCredibleSquaringTaskManager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + contractERC20Mock "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/ERC20Mock" + common "github.com/ethereum/go-ethereum/common" + gomock "go.uber.org/mock/gomock" +) + +// MockAvsReaderer is a mock of AvsReaderer interface. +type MockAvsReaderer struct { + ctrl *gomock.Controller + recorder *MockAvsReadererMockRecorder +} + +// MockAvsReadererMockRecorder is the mock recorder for MockAvsReaderer. +type MockAvsReadererMockRecorder struct { + mock *MockAvsReaderer +} + +// NewMockAvsReaderer creates a new mock instance. +func NewMockAvsReaderer(ctrl *gomock.Controller) *MockAvsReaderer { + mock := &MockAvsReaderer{ctrl: ctrl} + mock.recorder = &MockAvsReadererMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAvsReaderer) EXPECT() *MockAvsReadererMockRecorder { + return m.recorder +} + +// CheckSignatures mocks base method. +func (m *MockAvsReaderer) CheckSignatures(arg0 context.Context, arg1 [32]byte, arg2 []byte, arg3 uint32, arg4 contractCredibleSquaringTaskManager.IBLSSignatureCheckerNonSignerStakesAndSignature) (contractCredibleSquaringTaskManager.IBLSSignatureCheckerQuorumStakeTotals, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckSignatures", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(contractCredibleSquaringTaskManager.IBLSSignatureCheckerQuorumStakeTotals) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckSignatures indicates an expected call of CheckSignatures. +func (mr *MockAvsReadererMockRecorder) CheckSignatures(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckSignatures", reflect.TypeOf((*MockAvsReaderer)(nil).CheckSignatures), arg0, arg1, arg2, arg3, arg4) +} + +// GetCheckSignaturesIndices mocks base method. +func (m *MockAvsReaderer) GetCheckSignaturesIndices(arg0 context.Context, arg1 uint32, arg2 []byte, arg3 [][32]byte) (contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverCheckSignaturesIndices, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCheckSignaturesIndices", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverCheckSignaturesIndices) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCheckSignaturesIndices indicates an expected call of GetCheckSignaturesIndices. +func (mr *MockAvsReadererMockRecorder) GetCheckSignaturesIndices(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCheckSignaturesIndices", reflect.TypeOf((*MockAvsReaderer)(nil).GetCheckSignaturesIndices), arg0, arg1, arg2, arg3) +} + +// GetErc20Mock mocks base method. +func (m *MockAvsReaderer) GetErc20Mock(arg0 context.Context, arg1 common.Address) (*contractERC20Mock.ContractERC20Mock, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetErc20Mock", arg0, arg1) + ret0, _ := ret[0].(*contractERC20Mock.ContractERC20Mock) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetErc20Mock indicates an expected call of GetErc20Mock. +func (mr *MockAvsReadererMockRecorder) GetErc20Mock(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetErc20Mock", reflect.TypeOf((*MockAvsReaderer)(nil).GetErc20Mock), arg0, arg1) +} + +// GetOperatorId mocks base method. +func (m *MockAvsReaderer) GetOperatorId(arg0 context.Context, arg1 common.Address) ([32]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorId", arg0, arg1) + ret0, _ := ret[0].([32]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOperatorId indicates an expected call of GetOperatorId. +func (mr *MockAvsReadererMockRecorder) GetOperatorId(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorId", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorId), arg0, arg1) +} + +// GetOperatorsStakeInQuorumsAtBlock mocks base method. +func (m *MockAvsReaderer) GetOperatorsStakeInQuorumsAtBlock(arg0 context.Context, arg1 []byte, arg2 uint32) ([][]contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverOperator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorsStakeInQuorumsAtBlock", arg0, arg1, arg2) + ret0, _ := ret[0].([][]contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverOperator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOperatorsStakeInQuorumsAtBlock indicates an expected call of GetOperatorsStakeInQuorumsAtBlock. +func (mr *MockAvsReadererMockRecorder) GetOperatorsStakeInQuorumsAtBlock(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorsStakeInQuorumsAtBlock", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorsStakeInQuorumsAtBlock), arg0, arg1, arg2) +} + +// GetOperatorsStakeInQuorumsOfOperatorAtBlock mocks base method. +func (m *MockAvsReaderer) GetOperatorsStakeInQuorumsOfOperatorAtBlock(arg0 context.Context, arg1 [32]byte, arg2 uint32) ([]byte, [][]contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverOperator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorsStakeInQuorumsOfOperatorAtBlock", arg0, arg1, arg2) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].([][]contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverOperator) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetOperatorsStakeInQuorumsOfOperatorAtBlock indicates an expected call of GetOperatorsStakeInQuorumsOfOperatorAtBlock. +func (mr *MockAvsReadererMockRecorder) GetOperatorsStakeInQuorumsOfOperatorAtBlock(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorsStakeInQuorumsOfOperatorAtBlock", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorsStakeInQuorumsOfOperatorAtBlock), arg0, arg1, arg2) +} + +// GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock mocks base method. +func (m *MockAvsReaderer) GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock(arg0 context.Context, arg1 [32]byte) ([]byte, [][]contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverOperator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].([][]contractBLSOperatorStateRetriever.BLSOperatorStateRetrieverOperator) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock indicates an expected call of GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock. +func (mr *MockAvsReadererMockRecorder) GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock", reflect.TypeOf((*MockAvsReaderer)(nil).GetOperatorsStakeInQuorumsOfOperatorAtCurrentBlock), arg0, arg1) +} + +// IsOperatorRegistered mocks base method. +func (m *MockAvsReaderer) IsOperatorRegistered(arg0 context.Context, arg1 common.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsOperatorRegistered", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsOperatorRegistered indicates an expected call of IsOperatorRegistered. +func (mr *MockAvsReadererMockRecorder) IsOperatorRegistered(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsOperatorRegistered", reflect.TypeOf((*MockAvsReaderer)(nil).IsOperatorRegistered), arg0, arg1) +} diff --git a/core/chainio/mocks/avs_subscriber.go b/core/chainio/mocks/avs_subscriber.go new file mode 100644 index 00000000..15075438 --- /dev/null +++ b/core/chainio/mocks/avs_subscriber.go @@ -0,0 +1,84 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/Layr-Labs/incredible-squaring-avs/core/chainio (interfaces: AvsSubscriberer) +// +// Generated by this command: +// +// mockgen -destination=./mocks/avs_subscriber.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/core/chainio AvsSubscriberer +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + + contractCredibleSquaringTaskManager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + types "github.com/ethereum/go-ethereum/core/types" + event "github.com/ethereum/go-ethereum/event" + gomock "go.uber.org/mock/gomock" +) + +// MockAvsSubscriberer is a mock of AvsSubscriberer interface. +type MockAvsSubscriberer struct { + ctrl *gomock.Controller + recorder *MockAvsSubscribererMockRecorder +} + +// MockAvsSubscribererMockRecorder is the mock recorder for MockAvsSubscriberer. +type MockAvsSubscribererMockRecorder struct { + mock *MockAvsSubscriberer +} + +// NewMockAvsSubscriberer creates a new mock instance. +func NewMockAvsSubscriberer(ctrl *gomock.Controller) *MockAvsSubscriberer { + mock := &MockAvsSubscriberer{ctrl: ctrl} + mock.recorder = &MockAvsSubscribererMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAvsSubscriberer) EXPECT() *MockAvsSubscribererMockRecorder { + return m.recorder +} + +// ParseTaskResponded mocks base method. +func (m *MockAvsSubscriberer) ParseTaskResponded(arg0 types.Log) (*contractCredibleSquaringTaskManager.ContractCredibleSquaringTaskManagerTaskResponded, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ParseTaskResponded", arg0) + ret0, _ := ret[0].(*contractCredibleSquaringTaskManager.ContractCredibleSquaringTaskManagerTaskResponded) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ParseTaskResponded indicates an expected call of ParseTaskResponded. +func (mr *MockAvsSubscribererMockRecorder) ParseTaskResponded(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ParseTaskResponded", reflect.TypeOf((*MockAvsSubscriberer)(nil).ParseTaskResponded), arg0) +} + +// SubscribeToNewTasks mocks base method. +func (m *MockAvsSubscriberer) SubscribeToNewTasks(arg0 chan *contractCredibleSquaringTaskManager.ContractCredibleSquaringTaskManagerNewTaskCreated) event.Subscription { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubscribeToNewTasks", arg0) + ret0, _ := ret[0].(event.Subscription) + return ret0 +} + +// SubscribeToNewTasks indicates an expected call of SubscribeToNewTasks. +func (mr *MockAvsSubscribererMockRecorder) SubscribeToNewTasks(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeToNewTasks", reflect.TypeOf((*MockAvsSubscriberer)(nil).SubscribeToNewTasks), arg0) +} + +// SubscribeToTaskResponses mocks base method. +func (m *MockAvsSubscriberer) SubscribeToTaskResponses(arg0 chan *contractCredibleSquaringTaskManager.ContractCredibleSquaringTaskManagerTaskResponded) event.Subscription { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubscribeToTaskResponses", arg0) + ret0, _ := ret[0].(event.Subscription) + return ret0 +} + +// SubscribeToTaskResponses indicates an expected call of SubscribeToTaskResponses. +func (mr *MockAvsSubscribererMockRecorder) SubscribeToTaskResponses(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeToTaskResponses", reflect.TypeOf((*MockAvsSubscriberer)(nil).SubscribeToTaskResponses), arg0) +} diff --git a/core/chainio/mocks/avs_writer.go b/core/chainio/mocks/avs_writer.go new file mode 100644 index 00000000..5269234a --- /dev/null +++ b/core/chainio/mocks/avs_writer.go @@ -0,0 +1,136 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/Layr-Labs/incredible-squaring-avs/core/chainio (interfaces: AvsWriterer) +// +// Generated by this command: +// +// mockgen -destination=./mocks/avs_writer.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/core/chainio AvsWriterer +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + big "math/big" + reflect "reflect" + + contractBLSPubkeyRegistry "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSPubkeyRegistry" + contractBLSRegistryCoordinatorWithIndices "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSRegistryCoordinatorWithIndices" + contractCredibleSquaringTaskManager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + common "github.com/ethereum/go-ethereum/common" + types "github.com/ethereum/go-ethereum/core/types" + gomock "go.uber.org/mock/gomock" +) + +// MockAvsWriterer is a mock of AvsWriterer interface. +type MockAvsWriterer struct { + ctrl *gomock.Controller + recorder *MockAvsWritererMockRecorder +} + +// MockAvsWritererMockRecorder is the mock recorder for MockAvsWriterer. +type MockAvsWritererMockRecorder struct { + mock *MockAvsWriterer +} + +// NewMockAvsWriterer creates a new mock instance. +func NewMockAvsWriterer(ctrl *gomock.Controller) *MockAvsWriterer { + mock := &MockAvsWriterer{ctrl: ctrl} + mock.recorder = &MockAvsWritererMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAvsWriterer) EXPECT() *MockAvsWritererMockRecorder { + return m.recorder +} + +// DeregisterOperator mocks base method. +func (m *MockAvsWriterer) DeregisterOperator(arg0 context.Context, arg1 common.Address, arg2 []byte, arg3 contractBLSPubkeyRegistry.BN254G1Point) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeregisterOperator", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeregisterOperator indicates an expected call of DeregisterOperator. +func (mr *MockAvsWritererMockRecorder) DeregisterOperator(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeregisterOperator", reflect.TypeOf((*MockAvsWriterer)(nil).DeregisterOperator), arg0, arg1, arg2, arg3) +} + +// RaiseChallenge mocks base method. +func (m *MockAvsWriterer) RaiseChallenge(arg0 context.Context, arg1 contractCredibleSquaringTaskManager.ICredibleSquaringTaskManagerTask, arg2 contractCredibleSquaringTaskManager.ICredibleSquaringTaskManagerTaskResponse, arg3 contractCredibleSquaringTaskManager.ICredibleSquaringTaskManagerTaskResponseMetadata, arg4 []contractCredibleSquaringTaskManager.BN254G1Point) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RaiseChallenge", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RaiseChallenge indicates an expected call of RaiseChallenge. +func (mr *MockAvsWritererMockRecorder) RaiseChallenge(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RaiseChallenge", reflect.TypeOf((*MockAvsWriterer)(nil).RaiseChallenge), arg0, arg1, arg2, arg3, arg4) +} + +// RegisterOperatorWithAVSRegistryCoordinator mocks base method. +func (m *MockAvsWriterer) RegisterOperatorWithAVSRegistryCoordinator(arg0 context.Context, arg1 []byte, arg2 contractBLSRegistryCoordinatorWithIndices.BN254G1Point, arg3 string) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterOperatorWithAVSRegistryCoordinator", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterOperatorWithAVSRegistryCoordinator indicates an expected call of RegisterOperatorWithAVSRegistryCoordinator. +func (mr *MockAvsWritererMockRecorder) RegisterOperatorWithAVSRegistryCoordinator(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterOperatorWithAVSRegistryCoordinator", reflect.TypeOf((*MockAvsWriterer)(nil).RegisterOperatorWithAVSRegistryCoordinator), arg0, arg1, arg2, arg3) +} + +// SendAggregatedResponse mocks base method. +func (m *MockAvsWriterer) SendAggregatedResponse(arg0 context.Context, arg1 contractCredibleSquaringTaskManager.ICredibleSquaringTaskManagerTask, arg2 contractCredibleSquaringTaskManager.ICredibleSquaringTaskManagerTaskResponse, arg3 contractCredibleSquaringTaskManager.IBLSSignatureCheckerNonSignerStakesAndSignature) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendAggregatedResponse", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SendAggregatedResponse indicates an expected call of SendAggregatedResponse. +func (mr *MockAvsWritererMockRecorder) SendAggregatedResponse(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAggregatedResponse", reflect.TypeOf((*MockAvsWriterer)(nil).SendAggregatedResponse), arg0, arg1, arg2, arg3) +} + +// SendNewTaskNumberToSquare mocks base method. +func (m *MockAvsWriterer) SendNewTaskNumberToSquare(arg0 context.Context, arg1 *big.Int, arg2 uint32, arg3 []byte) (contractCredibleSquaringTaskManager.ICredibleSquaringTaskManagerTask, uint32, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendNewTaskNumberToSquare", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(contractCredibleSquaringTaskManager.ICredibleSquaringTaskManagerTask) + ret1, _ := ret[1].(uint32) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// SendNewTaskNumberToSquare indicates an expected call of SendNewTaskNumberToSquare. +func (mr *MockAvsWritererMockRecorder) SendNewTaskNumberToSquare(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendNewTaskNumberToSquare", reflect.TypeOf((*MockAvsWriterer)(nil).SendNewTaskNumberToSquare), arg0, arg1, arg2, arg3) +} + +// UpdateStakes mocks base method. +func (m *MockAvsWriterer) UpdateStakes(arg0 context.Context, arg1 []common.Address) (*types.Receipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateStakes", arg0, arg1) + ret0, _ := ret[0].(*types.Receipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateStakes indicates an expected call of UpdateStakes. +func (mr *MockAvsWritererMockRecorder) UpdateStakes(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateStakes", reflect.TypeOf((*MockAvsWriterer)(nil).UpdateStakes), arg0, arg1) +} diff --git a/core/chainio/mocks/bindings.go b/core/chainio/mocks/bindings.go new file mode 100644 index 00000000..cc84675f --- /dev/null +++ b/core/chainio/mocks/bindings.go @@ -0,0 +1,6 @@ +package mocks + +type MockAvsContractBindings struct { + +} + diff --git a/core/config/config.go b/core/config/config.go new file mode 100644 index 00000000..4d4d1e25 --- /dev/null +++ b/core/config/config.go @@ -0,0 +1,209 @@ +package config + +import ( + "context" + "crypto/ecdsa" + "errors" + "os" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/urfave/cli" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signer" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" +) + +// Config contains all of the configuration information for a credible squaring aggregators and challengers. +// Operators use a separate config. (see config-files/node_config.anvil.yaml) +type Config struct { + EcdsaPrivateKey *ecdsa.PrivateKey + BlsPrivateKey *bls.PrivateKey + Logger sdklogging.Logger + EigenMetricsIpPortAddress string + // we need the url for the eigensdk currently... eventually standardize api so as to + // only take an ethclient or an rpcUrl (and build the ethclient at each constructor site) + EthRpcUrl string + EthHttpClient eth.EthClient + EthWsClient eth.EthClient + BlsOperatorStateRetrieverAddr common.Address + CredibleSquaringServiceManagerAddr common.Address + BlsPublicKeyCompendiumAddress common.Address + SlasherAddr common.Address + AggregatorServerIpPortAddr string + RegisterOperatorOnStartup bool + Signer signer.Signer + OperatorAddress common.Address +} + +// These are read from ConfigFileFlag +type ConfigRaw struct { + Environment sdklogging.LogLevel `yaml:"environment"` + EthRpcUrl string `yaml:"eth_rpc_url"` + EthWsUrl string `yaml:"eth_ws_url"` + AggregatorServerIpPortAddr string `yaml:"aggregator_server_ip_port_address"` + RegisterOperatorOnStartup bool `yaml:"register_operator_on_startup"` + BLSPubkeyCompendiumAddr string `yaml:"bls_public_key_compendium_address"` +} + +// These are read from CredibleSquaringDeploymentFileFlag +type CredibleSquaringDeploymentRaw struct { + Addresses CredibleSquaringContractsRaw `json:"addresses"` +} +type CredibleSquaringContractsRaw struct { + CredibleSquaringServiceManagerAddr string `json:"credibleSquaringServiceManager"` +} + +// BlsOperatorStateRetriever and BlsPublicKeyCompendium are deployed separately, since they are +// shared avs contracts (not part of eigenlayer core contracts). +// the blspubkeycompendium we can get from serviceManager->registryCoordinator->blsregistry->blspubkeycompendium +// so we don't need it here. The blsOperatorStateRetriever however is an independent contract not pointing to +// or pointed to from any other contract, so we need its address +type SharedAvsContractsRaw struct { + BlsOperatorStateRetrieverAddr string `json:"blsOperatorStateRetriever"` +} + +// NewConfig parses config file to read from from flags or environment variables +// Note: This config is shared by challenger and aggregator and so we put in the core. +// Operator has a different config and is meant to be used by the operator CLI. +func NewConfig(ctx *cli.Context) (*Config, error) { + + var configRaw ConfigRaw + configFilePath := ctx.GlobalString(ConfigFileFlag.Name) + if configFilePath != "" { + sdkutils.ReadYamlConfig(configFilePath, &configRaw) + } + + var credibleSquaringDeploymentRaw CredibleSquaringDeploymentRaw + credibleSquaringDeploymentFilePath := ctx.GlobalString(CredibleSquaringDeploymentFileFlag.Name) + if _, err := os.Stat(credibleSquaringDeploymentFilePath); errors.Is(err, os.ErrNotExist) { + panic("Path " + credibleSquaringDeploymentFilePath + " does not exist") + } + sdkutils.ReadJsonConfig(credibleSquaringDeploymentFilePath, &credibleSquaringDeploymentRaw) + + var sharedAvsContractsDeploymentRaw SharedAvsContractsRaw + sharedAvsContractsDeploymentFilePath := ctx.GlobalString(SharedAvsContractsDeploymentFileFlag.Name) + if _, err := os.Stat(sharedAvsContractsDeploymentFilePath); errors.Is(err, os.ErrNotExist) { + panic("Path " + sharedAvsContractsDeploymentFilePath + " does not exist") + } + sdkutils.ReadJsonConfig(sharedAvsContractsDeploymentFilePath, &sharedAvsContractsDeploymentRaw) + + logger, err := sdklogging.NewZapLogger(configRaw.Environment) + if err != nil { + return nil, err + } + + ethRpcClient, err := eth.NewClient(configRaw.EthRpcUrl) + if err != nil { + logger.Errorf("Cannot create http ethclient", "err", err) + return nil, err + } + + ethWsClient, err := eth.NewClient(configRaw.EthWsUrl) + if err != nil { + logger.Errorf("Cannot create ws ethclient", "err", err) + return nil, err + } + + ecdsaPrivateKeyString := ctx.GlobalString(EcdsaPrivateKeyFlag.Name) + if ecdsaPrivateKeyString[:2] == "0x" { + ecdsaPrivateKeyString = ecdsaPrivateKeyString[2:] + } + ecdsaPrivateKey, err := crypto.HexToECDSA(ecdsaPrivateKeyString) + if err != nil { + logger.Errorf("Cannot parse ecdsa private key", "err", err) + return nil, err + } + + operatorAddr, err := sdkutils.EcdsaPrivateKeyToAddress(ecdsaPrivateKey) + if err != nil { + logger.Error("Cannot get operator address", "err", err) + return nil, err + } + + chainId, err := ethRpcClient.ChainID(context.Background()) + if err != nil { + logger.Error("Cannot get chainId", "err", err) + return nil, err + } + + privateKeySigner, err := signer.NewPrivateKeySigner(ecdsaPrivateKey, chainId) + if err != nil { + logger.Error("Cannot create signer", "err", err) + return nil, err + } + + config := &Config{ + EcdsaPrivateKey: ecdsaPrivateKey, + Logger: logger, + EthRpcUrl: configRaw.EthRpcUrl, + EthHttpClient: ethRpcClient, + EthWsClient: ethWsClient, + BlsOperatorStateRetrieverAddr: common.HexToAddress(sharedAvsContractsDeploymentRaw.BlsOperatorStateRetrieverAddr), + CredibleSquaringServiceManagerAddr: common.HexToAddress(credibleSquaringDeploymentRaw.Addresses.CredibleSquaringServiceManagerAddr), + SlasherAddr: common.HexToAddress(""), + AggregatorServerIpPortAddr: configRaw.AggregatorServerIpPortAddr, + RegisterOperatorOnStartup: configRaw.RegisterOperatorOnStartup, + Signer: privateKeySigner, + OperatorAddress: operatorAddr, + BlsPublicKeyCompendiumAddress: common.HexToAddress(configRaw.BLSPubkeyCompendiumAddr), + } + config.validate() + return config, nil +} + +func (c *Config) validate() { + // TODO: make sure every pointer is non-nil + if c.BlsOperatorStateRetrieverAddr == common.HexToAddress("") { + panic("Config: BLSOperatorStateRetrieverAddr is required") + } + if c.CredibleSquaringServiceManagerAddr == common.HexToAddress("") { + panic("Config: CredibleSquaringServiceManagerAddr is required") + } +} + +var ( + /* Required Flags */ + ConfigFileFlag = cli.StringFlag{ + Name: "config", + Required: true, + Usage: "Load configuration from `FILE`", + } + CredibleSquaringDeploymentFileFlag = cli.StringFlag{ + Name: "credible-squaring-deployment", + Required: true, + Usage: "Load credible squaring contract addresses from `FILE`", + } + SharedAvsContractsDeploymentFileFlag = cli.StringFlag{ + Name: "shared-avs-contracts-deployment", + Required: true, + Usage: "Load shared avs contract addresses from `FILE`", + } + EcdsaPrivateKeyFlag = cli.StringFlag{ + Name: "ecdsa-private-key", + Usage: "Ethereum private key", + Required: true, + EnvVar: "ECDSA_PRIVATE_KEY", + } + /* Optional Flags */ +) + +var requiredFlags = []cli.Flag{ + ConfigFileFlag, + CredibleSquaringDeploymentFileFlag, + SharedAvsContractsDeploymentFileFlag, + EcdsaPrivateKeyFlag, +} + +var optionalFlags = []cli.Flag{} + +func init() { + Flags = append(requiredFlags, optionalFlags...) +} + +// Flags contains the list of configuration options available to the binary. +var Flags []cli.Flag diff --git a/core/utils.go b/core/utils.go new file mode 100644 index 00000000..75e168a3 --- /dev/null +++ b/core/utils.go @@ -0,0 +1,79 @@ +package core + +import ( + "math/big" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/ethereum/go-ethereum/accounts/abi" + "golang.org/x/crypto/sha3" +) + +// this hardcodes abi.encode() for cstaskmanager.ICredibleSquaringTaskManagerTaskResponse +// unclear why abigen doesn't provide this out of the box... +func AbiEncodeTaskResponse(h *cstaskmanager.ICredibleSquaringTaskManagerTaskResponse) ([]byte, error) { + + // The order here has to match the field ordering of cstaskmanager.ICredibleSquaringTaskManagerTaskResponse + taskResponseType, err := abi.NewType("tuple", "", []abi.ArgumentMarshaling{ + { + Name: "referenceTaskIndex", + Type: "uint32", + }, + { + Name: "numberSquared", + Type: "uint256", + }, + }) + if err != nil { + return nil, err + } + arguments := abi.Arguments{ + { + Type: taskResponseType, + }, + } + + bytes, err := arguments.Pack(h) + if err != nil { + return nil, err + } + + return bytes, nil +} + +// GetTaskResponseDigest returns the hash of the TaskResponse, which is what operators sign over +func GetTaskResponseDigest(h *cstaskmanager.ICredibleSquaringTaskManagerTaskResponse) ([32]byte, error) { + + encodeTaskResponseByte, err := AbiEncodeTaskResponse(h) + if err != nil { + return [32]byte{}, err + } + + var taskResponseDigest [32]byte + hasher := sha3.NewLegacyKeccak256() + hasher.Write(encodeTaskResponseByte) + copy(taskResponseDigest[:], hasher.Sum(nil)[:32]) + + return taskResponseDigest, nil +} + +// BINDING UTILS - conversion from contract structs to golang structs + +// BN254.sol is a library, so bindings for G1 Points and G2 Points are only generated +// in every contract that imports that library. Thus the output here will need to be +// type casted if G1Point is needed to interface with another contract (eg: BLSPublicKeyCompendium.sol) +func ConvertToBN254G1Point(input *bls.G1Point) cstaskmanager.BN254G1Point { + output := cstaskmanager.BN254G1Point{ + X: input.X.BigInt(big.NewInt(0)), + Y: input.Y.BigInt(big.NewInt(0)), + } + return output +} + +func ConvertToBN254G2Point(input *bls.G2Point) cstaskmanager.BN254G2Point { + output := cstaskmanager.BN254G2Point{ + X: [2]*big.Int{input.X.A1.BigInt(big.NewInt(0)), input.X.A0.BigInt(big.NewInt(0))}, + Y: [2]*big.Int{input.Y.A1.BigInt(big.NewInt(0)), input.Y.A0.BigInt(big.NewInt(0))}, + } + return output +} diff --git a/diagrams/architecture.png b/diagrams/architecture.png new file mode 100644 index 00000000..3bbaaf87 Binary files /dev/null and b/diagrams/architecture.png differ diff --git a/diagrams/uml.jpeg b/diagrams/uml.jpeg new file mode 100644 index 00000000..04b3766c Binary files /dev/null and b/diagrams/uml.jpeg differ diff --git a/docker-compose-build.yaml b/docker-compose-build.yaml new file mode 100644 index 00000000..de552f6f --- /dev/null +++ b/docker-compose-build.yaml @@ -0,0 +1,12 @@ +# This file is used for building and pushing images +services: + node: + build: + context: . + dockerfile: operator.Dockerfile + image: ghcr.io/layr-labs/incredible-squaring-avs/node:latest + nodeplugin: + build: + context: . + dockerfile: plugin.Dockerfile + image: ghcr.io/layr-labs/incredible-squaring-avs/nodeplugin:latest diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..29a29ac8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,112 @@ +version: "3" + +networks: + incredible-squaring-network: + name: incredible-squaring-network + driver: bridge + +services: + anvil: + image: ghcr.io/foundry-rs/foundry + container_name: anvil + ports: + # opening the port so we can easily cast to anvil from localhost + - "8545:8545" + # changed entrypoint because the default 'bash -c' entrypoint wasn't working the intended way... + entrypoint: anvil + volumes: + - ./tests/integration/avs-and-eigenlayer-deployed-anvil-state.json:/root/.anvil/state.json + command: --host 0.0.0.0 --load-state /root/.anvil/state.json + networks: + - incredible-squaring-network + + aggregator: + image: ghcr.io/layr-labs/incredible-squaring/aggregator/cmd/main.go:latest + container_name: incredible-squaring-aggregator + depends_on: + anvil: + condition: service_started + volumes: + - ./:/incredible-squaring/ + working_dir: /incredible-squaring + command: --config config-files/aggregator-docker-compose.yaml --credible-squaring-deployment contracts/script/output/31337/credible_squaring_avs_deployment_output.json --ecdsa-private-key 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 --bls-private-key 100 + networks: + - incredible-squaring-network + + operator1: + image: ghcr.io/layr-labs/incredible-squaring/operator/cmd/main.go:latest + container_name: incredible-squaring-operator1 + depends_on: + anvil: + condition: service_started + aggregator: + condition: service_started + ports: + - "9090:9090" # prometheus metrics port (defined in node_config-docker-compose.anvil.yaml file) + volumes: + - ./:/incredible-squaring/ + working_dir: /incredible-squaring + command: --config config-files/node_config-docker-compose.anvil.yaml + networks: + - incredible-squaring-network + + # operator2: + # image: ghcr.io/layr-labs/incredible-squaring/operator/cmd/main.go:latest + # container_name: incredible-squaring-operator2 + # depends_on: + # anvil: + # condition: service_started + # volumes: + # - ./:/incredible-squaring/ + # working_dir: /incredible-squaring + # command: --config config-files/node_config-docker-compose.anvil.yaml --credible-squaring-deployment contracts/script/output/31337/credible_squaring_avs_deployment_output.json --ecdsa-private-key 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d --bls-private-key 2 + # networks: + # - incredible-squaring-network + + # METRICS RELATED + grafana: + image: grafana/grafana:9.4.1 + container_name: grafana + volumes: + - grafana_data:/var/lib/grafana + - ./grafana/provisioning:/etc/grafana/provisioning + environment: + # See https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#override-configuration-with-environment-variables + # and https://grafana.com/docs/grafana/latest/setup-grafana/configure-docker/ + # They recommend using env vars instead of overwriting config.ini + - GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin} + - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin} + - GF_USERS_ALLOW_SIGN_UP=false + restart: unless-stopped + ports: + - 3000:3000 + networks: + - incredible-squaring-network + + prometheus: + image: prom/prometheus:v2.42.0 + container_name: prometheus + volumes: + - ./prometheus:/etc/prometheus + - prometheus_data:/prometheus + command: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + - "--web.console.libraries=/etc/prometheus/console_libraries" + - "--web.console.templates=/etc/prometheus/consoles" + - "--storage.tsdb.retention.time=200h" + - "--web.enable-lifecycle" + - --web.enable-remote-write-receiver + restart: unless-stopped + expose: + - 9090 + networks: + - incredible-squaring-network + # so that we can access the host from within the container + # needed to get the metrics from host.docker.internal:9184/metrics + extra_hosts: + - "host.docker.internal:host-gateway" + +volumes: + prometheus_data: {} + grafana_data: {} diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..4bb1a141 --- /dev/null +++ b/go.mod @@ -0,0 +1,118 @@ +module github.com/Layr-Labs/incredible-squaring-avs + +go 1.21 + +toolchain go1.21.0 + +require ( + github.com/Layr-Labs/eigensdk-go v0.0.7-0.20231024030907-fbc0e500c28c + github.com/consensys/gnark-crypto v0.12.1 + github.com/ethereum/go-ethereum v1.13.4 + github.com/prometheus/client_golang v1.17.0 + github.com/stretchr/testify v1.8.4 + github.com/testcontainers/testcontainers-go v0.25.0 + github.com/urfave/cli v1.22.14 + go.uber.org/mock v0.3.0 + golang.org/x/crypto v0.14.0 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.11.0 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/containerd/containerd v1.7.6 // indirect + github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v24.0.6+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/ethereum/c-kzg-4844 v0.3.1 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect + github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.3 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/klauspost/compress v1.16.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/patternmatcher v0.5.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc4 // indirect + github.com/opencontainers/runc v1.1.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/shirou/gopsutil/v3 v3.23.8 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + google.golang.org/grpc v1.57.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) + +// use this when making changes to eigensdk locally +// replace github.com/Layr-Labs/eigensdk-go => ../eigensdk-go diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..b5a007da --- /dev/null +++ b/go.sum @@ -0,0 +1,648 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Layr-Labs/eigensdk-go v0.0.7-0.20231024030907-fbc0e500c28c h1:k/yFS2gVdOQM3pWP7/4t50OuBQfAWhHCWuvQY/Connk= +github.com/Layr-Labs/eigensdk-go v0.0.7-0.20231024030907-fbc0e500c28c/go.mod h1:hoKX+RE2GvXx1BZqhJ15w9pQFFaG2uinaCbRbdxevVQ= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.11.0 h1:7EFNIY4igHEXUdj1zXgAyU3fLc7QfOKHbkldRVTBdiM= +github.com/Microsoft/hcsshim v0.11.0/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCztGKDurW1Z8b8VGMM= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.6 h1:oNAVsnhPoy4BTPQivLgTzI9Oleml9l/+eYIDYXRCYo8= +github.com/containerd/containerd v1.7.6/go.mod h1:SY6lrkkuJT40BVNO37tlYTSnKJnP5AXBc0fhx0q+TJ4= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.3.0 h1:UBlWE0CgyFqqzTI+IFyCzA7A3Zw4iip6uzRv5NIXG0A= +github.com/crate-crypto/go-kzg-4844 v0.3.0/go.mod h1:SBP7ikXEgDnUPONgm33HtuDZEDtWa3L4QtN1ocJSEQ4= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= +github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg= +github.com/ethereum/c-kzg-4844 v0.3.1/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.4 h1:25HJnaWVg3q1O7Z62LaaI6S9wVq8QCw3K88g8wEzrcM= +github.com/ethereum/go-ethereum v1.13.4/go.mod h1:I0U5VewuuTzvBtVzKo7b3hJzDhXOUtn9mJW7SsIPB0Q= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo= +github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE= +github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/testcontainers/testcontainers-go v0.25.0 h1:erH6cQjsaJrH+rJDU9qIf89KFdhK0Bft0aEZHlYC3Vs= +github.com/testcontainers/testcontainers-go v0.25.0/go.mod h1:4sC9SiJyzD1XFi59q8umTQYWxnkweEc5OjVtTUlJzqQ= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= +github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= +go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/grafana/provisioning/dashboards/AVSs/incredible_squaring.json b/grafana/provisioning/dashboards/AVSs/incredible_squaring.json new file mode 100644 index 00000000..94893d35 --- /dev/null +++ b/grafana/provisioning/dashboards/AVSs/incredible_squaring.json @@ -0,0 +1,326 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "builder", + "expr": "incsq_num_tasks_received", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "New Tasks Received", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "builder", + "expr": "incsq_num_signed_task_responses_accepted_by_aggregator", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Signed Tasks Responses", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "builder", + "expr": "eigen_performance_score{avs_name=\"incredible-squaring\"}", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Performance Score", + "type": "timeseries" + } + ], + "refresh": "10s", + "revision": 1, + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Incredible Squaring", + "uid": "vgD8u1U4z", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/grafana/provisioning/dashboards/dashboard_provider.yml b/grafana/provisioning/dashboards/dashboard_provider.yml new file mode 100644 index 00000000..1caea931 --- /dev/null +++ b/grafana/provisioning/dashboards/dashboard_provider.yml @@ -0,0 +1,17 @@ +apiVersion: 1 + +# dashboard providers +# we use a single generic one for now. +# we could split this into a provider for sui bot related, and one for general purpose, etc eventually +# see https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards +providers: + - name: 'Local Files' + folder: '' # General is the default + type: file + disableDeletion: false + editable: true + allowUiUpdates: true + updateIntervalSeconds: 10 + options: + path: /etc/grafana/provisioning/dashboards + foldersFromFilesStructure: true \ No newline at end of file diff --git a/grafana/provisioning/dashboards/system/monitor_prometheus.json b/grafana/provisioning/dashboards/system/monitor_prometheus.json new file mode 100644 index 00000000..a06c7d02 --- /dev/null +++ b/grafana/provisioning/dashboards/system/monitor_prometheus.json @@ -0,0 +1,3412 @@ +{ + "id": null, + "title": "Monitor Prometheus Services", + "tags": [ + "prometheus" + ], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": false, + "sharedCrosshair": true, + "panels": [ + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": true, + "id": 1, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "s", + "postfixFontSize": "80%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(time() - process_start_time_seconds{instance=\"localhost:9090\",job=\"prometheus\"})", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "Prometheus Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": true, + "id": 5, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{container_label_org_label_schema_group=\"monitoring\"})", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "Memory Usage", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 0 + }, + "hideTimeOverride": true, + "id": 3, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "prometheus_tsdb_head_chunks", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "In-Memory Chunks", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 0 + }, + "hideTimeOverride": true, + "id": 2, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "prometheus_tsdb_head_series", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "", + "timeFrom": "10s", + "timeShift": null, + "title": "In-Memory Series", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 6, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (name) (rate(container_cpu_user_seconds_total{container_label_org_label_schema_group=\"monitoring\"}[1m]) * 100 / scalar(count(node_cpu{mode=\"user\"})))", + "format": "time_series", + "hide": true, + "intervalFactor": 10, + "legendFormat": "{{ name }}", + "refId": "A", + "step": 10 + }, + { + "expr": "sum by (name) (rate(container_cpu_user_seconds_total{container_label_org_label_schema_group=\"monitoring\"}[1m]) * 100 / scalar(count(node_cpu_seconds_total{mode=\"user\"})))", + "format": "time_series", + "intervalFactor": 10, + "legendFormat": "{{ name }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Container CPU Usage", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 7, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (name) (container_memory_usage_bytes{container_label_org_label_schema_group=\"monitoring\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 10, + "legendFormat": "{{ name }}", + "metric": "container_memory_usage_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Container Memory Usage", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 0, + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 73, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": false, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": true, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(ALERTS{alertstate=\"firing\"}) by (alertname)", + "format": "time_series", + "interval": "30s", + "intervalFactor": 1, + "legendFormat": "{{ alertname }}", + "metric": "container_memory_usage_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Alerts", + "tooltip": { + "msResolution": true, + "shared": false, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 22, + "panels": [], + "repeat": null, + "title": "Prometheus Metrics", + "type": "row" + }, + { + "aliasColors": { + "Max": "#e24d42", + "Open": "#508642" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 25 + }, + "id": 18, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_max_fds{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Max", + "refId": "A" + }, + { + "expr": "process_open_fds{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Open", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#7EB26D", + "Allocated bytes - 1m max": "#BF1B00", + "Allocated bytes - 1m min": "#BF1B00", + "Allocated bytes - 5m max": "#BF1B00", + "Allocated bytes - 5m min": "#BF1B00", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#447EBC" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 25 + }, + "id": 58, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/-/", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_resident_memory_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RSS", + "metric": "process_resident_memory_bytes", + "refId": "B", + "step": 10 + }, + { + "expr": "prometheus_local_storage_target_heap_size_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Target heap size", + "metric": "go_memstats_alloc_bytes", + "refId": "D", + "step": 10 + }, + { + "expr": "go_memstats_next_gc_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Next GC", + "metric": "go_memstats_next_gc_bytes", + "refId": "C", + "step": 10 + }, + { + "expr": "go_memstats_alloc_bytes{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Allocated", + "metric": "go_memstats_alloc_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#F9BA8F", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 25 + }, + "id": 60, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(go_memstats_alloc_bytes_total{job=\"prometheus\"}[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Allocated", + "metric": "go_memstats_alloc_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Allocations", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Time series": "#70dbed" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 32 + }, + "id": 20, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_series", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Time series", + "metric": "prometheus_local_storage_memory_series", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Time series", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 32 + }, + "id": 24, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_active_appenders", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Head Appenders", + "metric": "prometheus_local_storage_memory_series", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Active Appenders", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "samples/s": "#e5a8e2" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 32 + }, + "id": 26, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_samples_appended_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Samples", + "metric": "prometheus_local_storage_ingested_samples_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Samples Appended", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "To persist": "#9AC48A" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 39 + }, + "id": 28, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/Max.*/", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_chunks", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Chunks", + "metric": "prometheus_local_storage_memory_chunks", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Chunks", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 39 + }, + "id": 30, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_chunks_created_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Created", + "metric": "prometheus_local_storage_chunk_ops_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Chunks Created", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Removed": "#e5ac0e" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 39 + }, + "id": 32, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_chunks_removed_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Removed", + "metric": "prometheus_local_storage_chunk_ops_total", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Chunks Removed", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max": "#447ebc", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Min": "#447ebc", + "Now": "#7eb26d" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 46 + }, + "id": 34, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Max", + "fillBelowTo": "Min", + "lines": false + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_min_time", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Min", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "time() * 1000", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Now", + "refId": "C" + }, + { + "expr": "prometheus_tsdb_head_max_time", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Max", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head Time Range", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "dateTimeAsIso", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 46 + }, + "id": 36, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_gc_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "GC Time", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Head GC Time/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 46 + }, + "id": 38, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Queue length", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_blocks_loaded", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Blocks Loaded", + "metric": "prometheus_local_storage_indexing_batch_sizes_sum", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Blocks Loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Failed Reloads": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 53 + }, + "id": 40, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_reloads_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Reloads", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TSDB Reloads", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "{instance=\"demo.robustperception.io:9090\",job=\"prometheus\"}": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 53 + }, + "id": 44, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_wal_corruptions_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "WAL Corruptions", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_reloads_failures_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Reload Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_head_series_not_found[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Head Series Not Found", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "C", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_compactions_failed_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Compaction Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "D", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_retention_cutoffs_failures_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Retention Cutoff Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TSDB Problems", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 53 + }, + "id": 42, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_wal_fsync_duration_seconds_sum[1m]) / rate(prometheus_tsdb_wal_fsync_duration_seconds_count[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Fsync Latency", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_wal_truncate_duration_seconds_sum[1m]) / rate(prometheus_tsdb_wal_truncate_duration_seconds_count[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Truncate Latency", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "WAL Latencies", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 60 + }, + "id": 46, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compactions_total[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Compactions", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Compactions", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 60 + }, + "id": 48, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_duration_seconds_sum[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compaction Time", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Compaction Time", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#F9BA8F", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 60 + }, + "id": 50, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_retention_cutoffs_total[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Retention Cutoffs", + "metric": "last", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Retention Cutoffs", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 67 + }, + "id": 56, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_chunk_samples_sum[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_count[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Chunk Samples", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "First Compaction, Avg Chunk Samples", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 67 + }, + "id": 10, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_target_interval_length_seconds_count[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{ interval }}", + "refId": "A", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Target Scrapes", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 67 + }, + "id": 11, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_target_interval_length_seconds{quantile!=\"0.01\", quantile!=\"0.05\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{quantile}} ({{interval}})", + "refId": "A", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Scrape Duration", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 74 + }, + "id": 62, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "HTTP requests", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 74 + }, + "id": 64, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_sum[1m]) / rate(prometheus_http_request_duration_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "HTTP request latency", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 74 + }, + "id": 66, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Time spent in HTTP requests", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "Time spent in each mode, per second", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 81 + }, + "id": 68, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_engine_query_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{slice}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Query engine timings", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 81 + }, + "id": 70, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_rule_group_iterations_missed_total[1m]) ", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rule group missed", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "B", + "step": 10 + }, + { + "expr": "rate(prometheus_rule_evaluation_failures_total[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rule evals failed", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "C", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Rule group evaulation problems", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 81 + }, + "id": 72, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_rule_group_duration_seconds_sum[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rule evaluation duration", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Evaluation time of rule groups", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "templating": { + "list": [] + }, + "annotations": { + "list": [] + }, + "refresh": "10s", + "schemaVersion": 12, + "version": 22, + "links": [], + "gnetId": null + } \ No newline at end of file diff --git a/grafana/provisioning/datasources/datasource.yml b/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 00000000..bf219bb0 --- /dev/null +++ b/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,12 @@ +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + uid: prometheus + access: proxy + orgId: 1 + url: http://prometheus:9090 + basicAuth: false + isDefault: true + editable: true diff --git a/metrics/metrics.go b/metrics/metrics.go new file mode 100644 index 00000000..80cd8e8e --- /dev/null +++ b/metrics/metrics.go @@ -0,0 +1,52 @@ +package metrics + +import ( + "github.com/Layr-Labs/eigensdk-go/metrics" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +type Metrics interface { + metrics.Metrics + IncNumTasksReceived() + IncNumTasksAcceptedByAggregator() + // This metric would either need to be tracked by the aggregator itself, + // or we would need to write a collector that queries onchain for this info + // AddPercentageStakeSigned(percentage float64) +} + +// AvsMetrics contains instrumented metrics that should be incremented by the avs node using the methods below +type AvsAndEigenMetrics struct { + metrics.Metrics + numTasksReceived prometheus.Counter + // if numSignedTaskResponsesAcceptedByAggregator != numTasksReceived, then there is a bug + numSignedTaskResponsesAcceptedByAggregator prometheus.Counter +} + +const incredibleSquaringNamespace = "incsq" + +func NewAvsAndEigenMetrics(avsName string, eigenMetrics *metrics.EigenMetrics, reg prometheus.Registerer) *AvsAndEigenMetrics { + return &AvsAndEigenMetrics{ + Metrics: eigenMetrics, + numTasksReceived: promauto.With(reg).NewCounter( + prometheus.CounterOpts{ + Namespace: incredibleSquaringNamespace, + Name: "num_tasks_received", + Help: "The number of tasks received by reading from the avs service manager contract", + }), + numSignedTaskResponsesAcceptedByAggregator: promauto.With(reg).NewCounter( + prometheus.CounterOpts{ + Namespace: incredibleSquaringNamespace, + Name: "num_signed_task_responses_accepted_by_aggregator", + Help: "The number of signed task responses accepted by the aggregator", + }), + } +} + +func (m *AvsAndEigenMetrics) IncNumTasksReceived() { + m.numTasksReceived.Inc() +} + +func (m *AvsAndEigenMetrics) IncNumTasksAcceptedByAggregator() { + m.numSignedTaskResponsesAcceptedByAggregator.Inc() +} diff --git a/metrics/noopmetrics.go b/metrics/noopmetrics.go new file mode 100644 index 00000000..7737a3c7 --- /dev/null +++ b/metrics/noopmetrics.go @@ -0,0 +1,19 @@ +package metrics + +import ( + eigenmetrics "github.com/Layr-Labs/eigensdk-go/metrics" +) + +type NoopMetrics struct { + eigenmetrics.NoopMetrics +} + +func NewNoopMetrics() *NoopMetrics { + return &NoopMetrics{ + NoopMetrics: *eigenmetrics.NewNoopMetrics(), + } +} + +func (m *NoopMetrics) IncNumTasksReceived() {} + +func (m *NoopMetrics) IncNumTasksAcceptedByAggregator() {} diff --git a/operator.Dockerfile b/operator.Dockerfile new file mode 100644 index 00000000..0e12b9fd --- /dev/null +++ b/operator.Dockerfile @@ -0,0 +1,17 @@ +FROM golang:1.21 as build + +WORKDIR /usr/src/app + +COPY go.mod go.sum ./ + +RUN go mod download && go mod tidy && go mod verify + +COPY . . + +WORKDIR /usr/src/app/operator/cmd +RUN go build -v -o /usr/local/bin/operator ./... + +FROM debian:latest +COPY --from=build /usr/local/bin/operator /usr/local/bin/operator +ENTRYPOINT [ "operator"] +CMD ["--config=/app/avs_config.yaml"] \ No newline at end of file diff --git a/operator/cmd/main.go b/operator/cmd/main.go new file mode 100644 index 00000000..d033bfa2 --- /dev/null +++ b/operator/cmd/main.go @@ -0,0 +1,63 @@ +package main + +import ( + "context" + "encoding/json" + "log" + "os" + + "github.com/urfave/cli" + + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/Layr-Labs/incredible-squaring-avs/operator" + "github.com/Layr-Labs/incredible-squaring-avs/types" + + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" +) + +func main() { + app := cli.NewApp() + app.Flags = []cli.Flag{config.ConfigFileFlag} + app.Name = "credible-squaring-operator" + app.Usage = "Credible Squaring Operator" + app.Description = "Service that reads numbers onchain, squares, signs, and sends them to the aggregator." + + app.Action = operatorMain + err := app.Run(os.Args) + if err != nil { + log.Fatalln("Application failed. Message:", err) + } +} + +func operatorMain(ctx *cli.Context) error { + + log.Println("Initializing Operator") + configPath := ctx.GlobalString(config.ConfigFileFlag.Name) + nodeConfig := types.NodeConfig{} + err := sdkutils.ReadYamlConfig(configPath, &nodeConfig) + if err != nil { + return err + } + configJson, err := json.MarshalIndent(nodeConfig, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + log.Println("Config:", string(configJson)) + + log.Println("initializing operator") + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + return err + } + log.Println("initialized operator") + + log.Println("starting operator") + err = operator.Start(context.Background()) + if err != nil { + return err + } + log.Println("started operator") + + return nil + +} diff --git a/operator/gen.go b/operator/gen.go new file mode 100644 index 00000000..4915e9b3 --- /dev/null +++ b/operator/gen.go @@ -0,0 +1,3 @@ +package operator + +//go:generate mockgen -destination=./mocks/rpc_client.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/operator AggregatorRpcClienter diff --git a/operator/mocks/rpc_client.go b/operator/mocks/rpc_client.go new file mode 100644 index 00000000..5cb0ef34 --- /dev/null +++ b/operator/mocks/rpc_client.go @@ -0,0 +1,51 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/Layr-Labs/incredible-squaring-avs/operator (interfaces: AggregatorRpcClienter) +// +// Generated by this command: +// +// mockgen -destination=./mocks/rpc_client.go -package=mocks github.com/Layr-Labs/incredible-squaring-avs/operator AggregatorRpcClienter +// +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + + aggregator "github.com/Layr-Labs/incredible-squaring-avs/aggregator" + gomock "go.uber.org/mock/gomock" +) + +// MockAggregatorRpcClienter is a mock of AggregatorRpcClienter interface. +type MockAggregatorRpcClienter struct { + ctrl *gomock.Controller + recorder *MockAggregatorRpcClienterMockRecorder +} + +// MockAggregatorRpcClienterMockRecorder is the mock recorder for MockAggregatorRpcClienter. +type MockAggregatorRpcClienterMockRecorder struct { + mock *MockAggregatorRpcClienter +} + +// NewMockAggregatorRpcClienter creates a new mock instance. +func NewMockAggregatorRpcClienter(ctrl *gomock.Controller) *MockAggregatorRpcClienter { + mock := &MockAggregatorRpcClienter{ctrl: ctrl} + mock.recorder = &MockAggregatorRpcClienterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAggregatorRpcClienter) EXPECT() *MockAggregatorRpcClienterMockRecorder { + return m.recorder +} + +// SendSignedTaskResponseToAggregator mocks base method. +func (m *MockAggregatorRpcClienter) SendSignedTaskResponseToAggregator(arg0 *aggregator.SignedTaskResponse) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SendSignedTaskResponseToAggregator", arg0) +} + +// SendSignedTaskResponseToAggregator indicates an expected call of SendSignedTaskResponseToAggregator. +func (mr *MockAggregatorRpcClienterMockRecorder) SendSignedTaskResponseToAggregator(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendSignedTaskResponseToAggregator", reflect.TypeOf((*MockAggregatorRpcClienter)(nil).SendSignedTaskResponseToAggregator), arg0) +} diff --git a/operator/operator.go b/operator/operator.go new file mode 100644 index 00000000..a8660d8d --- /dev/null +++ b/operator/operator.go @@ -0,0 +1,342 @@ +package operator + +import ( + "context" + "fmt" + "math/big" + "os" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/prometheus/client_golang/prometheus" + + "github.com/Layr-Labs/incredible-squaring-avs/aggregator" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/Layr-Labs/incredible-squaring-avs/core" + "github.com/Layr-Labs/incredible-squaring-avs/core/chainio" + "github.com/Layr-Labs/incredible-squaring-avs/metrics" + "github.com/Layr-Labs/incredible-squaring-avs/types" + + sdkavsregistry "github.com/Layr-Labs/eigensdk-go/chainio/avsregistry" + sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + sdkelcontracts "github.com/Layr-Labs/eigensdk-go/chainio/elcontracts" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + "github.com/Layr-Labs/eigensdk-go/logging" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + sdkmetrics "github.com/Layr-Labs/eigensdk-go/metrics" + "github.com/Layr-Labs/eigensdk-go/metrics/collectors/economic" + rpccalls "github.com/Layr-Labs/eigensdk-go/metrics/collectors/rpc_calls" + "github.com/Layr-Labs/eigensdk-go/signer" + sdktypes "github.com/Layr-Labs/eigensdk-go/types" +) + +const AVS_NAME = "incredible-squaring" + +type Operator struct { + logger logging.Logger + ethClient eth.EthClient + // TODO(samlaf): remove both avsWriter and eigenlayerWrite from operator + // they are only used for registration, so we should make a special registration package + // this way, auditing this operator code makes it obvious that operators don't need to + // write to the chain during the course of their normal operations + // writing to the chain should be done via the cli only + metricsReg *prometheus.Registry + metrics metrics.Metrics + avsWriter *chainio.AvsWriter + avsReader chainio.AvsReaderer + avsSubscriber chainio.AvsSubscriberer + eigenlayerReader sdkelcontracts.ELReader + eigenlayerWriter sdkelcontracts.ELWriter + blsKeypair *bls.KeyPair + operatorId bls.OperatorId + operatorAddr common.Address + // receive new tasks in this chan (typically from listening to onchain event) + newTaskCreatedChan chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated + // ip address of aggregator + aggregatorServerIpPortAddr string + // rpc client to send signed task responses to aggregator + aggregatorRpcClient AggregatorRpcClienter + // needed when opting in to avs (allow this service manager contract to slash operator) + credibleSquaringServiceManagerAddr common.Address +} + +func NewOperatorFromConfig(c types.NodeConfig) (*Operator, error) { + var logLevel logging.LogLevel + if c.Production { + logLevel = sdklogging.Production + } else { + logLevel = sdklogging.Development + } + logger, err := sdklogging.NewZapLogger(logLevel) + if err != nil { + return nil, err + } + reg := prometheus.NewRegistry() + eigenMetrics := sdkmetrics.NewEigenMetrics(AVS_NAME, c.EigenMetricsIpPortAddress, reg, logger) + avsAndEigenMetrics := metrics.NewAvsAndEigenMetrics(AVS_NAME, eigenMetrics, reg) + + var ethRpcClient, ethWsClient eth.EthClient + if c.UseInstrumentedEthClient { + rpcCallsCollector := rpccalls.NewCollector(AVS_NAME, reg) + ethRpcClient, err = eth.NewInstrumentedClient(c.EthRpcUrl, rpcCallsCollector) + if err != nil { + logger.Errorf("Cannot create http ethclient", "err", err) + return nil, err + } + ethWsClient, err = eth.NewInstrumentedClient(c.EthWsUrl, rpcCallsCollector) + if err != nil { + logger.Errorf("Cannot create ws ethclient", "err", err) + return nil, err + } + } else { + ethRpcClient, err = eth.NewClient(c.EthRpcUrl) + if err != nil { + logger.Errorf("Cannot create http ethclient", "err", err) + return nil, err + } + ethWsClient, err = eth.NewClient(c.EthWsUrl) + if err != nil { + logger.Errorf("Cannot create ws ethclient", "err", err) + return nil, err + } + } + + blsKeyPassword, ok := os.LookupEnv("OPERATOR_BLS_KEY_PASSWORD") + if !ok { + logger.Warnf("OPERATOR_BLS_KEY_PASSWORD env var not set. using empty string") + } + blsKeyPair, err := bls.ReadPrivateKeyFromFile(c.BlsPrivateKeyStorePath, blsKeyPassword) + if err != nil { + logger.Errorf("Cannot parse bls private key", "err", err) + return nil, err + } + // TODO(samlaf): should we add the chainId to the config instead? + // this way we can prevent creating a signer that signs on mainnet by mistake + // if the config says chainId=5, then we can only create a goerli signer + chainId, err := ethRpcClient.ChainID(context.Background()) + if err != nil { + logger.Error("Cannot get chainId", "err", err) + return nil, err + } + + ecdsaKeyPassword, ok := os.LookupEnv("OPERATOR_ECDSA_KEY_PASSWORD") + if !ok { + logger.Warnf("OPERATOR_ECDSA_KEY_PASSWORD env var not set. using empty string") + } + + sgn, err := signer.NewPrivateKeyFromKeystoreSigner(c.EcdsaPrivateKeyStorePath, ecdsaKeyPassword, chainId) + if err != nil { + logger.Errorf("Cannot create signer", "err", err) + return nil, err + } + + avsWriter, err := chainio.NewAvsWriter(sgn, common.HexToAddress(c.AVSServiceManagerAddress), + common.HexToAddress(c.BLSOperatorStateRetrieverAddress), ethRpcClient, logger, + ) + if err != nil { + logger.Error("Cannot create AvsWriter", "err", err) + return nil, err + } + + avsServiceBindings, err := chainio.NewAvsServiceBindings( + common.HexToAddress(c.AVSServiceManagerAddress), + common.HexToAddress(c.BLSOperatorStateRetrieverAddress), + ethRpcClient, + logger, + ) + if err != nil { + return nil, err + } + blsRegistryCoordinatorAddr, err := avsServiceBindings.ServiceManager.RegistryCoordinator(&bind.CallOpts{}) + if err != nil { + return nil, err + } + stakeRegistryAddr, err := avsServiceBindings.ServiceManager.StakeRegistry(&bind.CallOpts{}) + if err != nil { + return nil, err + } + blsPubkeyRegistryAddr, err := avsServiceBindings.ServiceManager.BlsPubkeyRegistry(&bind.CallOpts{}) + if err != nil { + return nil, err + } + avsRegistryContractClient, err := sdkclients.NewAvsRegistryContractsChainClient( + blsRegistryCoordinatorAddr, common.HexToAddress(c.BLSOperatorStateRetrieverAddress), stakeRegistryAddr, blsPubkeyRegistryAddr, ethRpcClient, logger, + ) + if err != nil { + return nil, err + } + avsRegistryReader, err := sdkavsregistry.NewAvsRegistryReader(avsRegistryContractClient, logger, ethRpcClient) + if err != nil { + return nil, err + } + avsReader, err := chainio.NewAvsReader(avsRegistryReader, avsServiceBindings, logger) + if err != nil { + logger.Error("Cannot create AvsReader", "err", err) + return nil, err + } + avsSubscriber, err := chainio.NewAvsSubscriber(common.HexToAddress(c.AVSServiceManagerAddress), + common.HexToAddress(c.BLSOperatorStateRetrieverAddress), ethWsClient, logger, + ) + if err != nil { + logger.Error("Cannot create AvsSubscriber", "err", err) + return nil, err + } + + slasherAddr, err := avsReader.AvsServiceBindings.ServiceManager.Slasher(&bind.CallOpts{}) + if err != nil { + logger.Error("Cannot get slasher address", "err", err) + return nil, err + } + + elContractsClient, err := sdkclients.NewELContractsChainClient(slasherAddr, common.HexToAddress(c.BlsPublicKeyCompendiumAddress), ethRpcClient, ethWsClient, logger) + if err != nil { + logger.Error("Cannot create ELContractsChainClient", "err", err) + return nil, err + } + + eigenlayerWriter := sdkelcontracts.NewELChainWriter(elContractsClient, ethRpcClient, sgn, logger, eigenMetrics) + if err != nil { + logger.Error("Cannot create EigenLayerWriter", "err", err) + return nil, err + } + eigenlayerReader, err := sdkelcontracts.NewELChainReader(elContractsClient, logger, ethRpcClient) + if err != nil { + logger.Error("Cannot create EigenLayerReader", "err", err) + return nil, err + } + + // We must register the economic metrics separately because they are exported metrics (from jsonrpc or subgraph calls) + // and not instrumented metrics: see https://prometheus.io/docs/instrumenting/writing_clientlibs/#overall-structure + quorumNames := map[sdktypes.QuorumNum]string{ + 0: "quorum0", + } + economicMetricsCollector := economic.NewCollector(eigenlayerReader, avsRegistryReader, AVS_NAME, logger, common.HexToAddress(c.OperatorAddress), quorumNames) + reg.MustRegister(economicMetricsCollector) + + aggregatorRpcClient, err := NewAggregatorRpcClient(c.AggregatorServerIpPortAddress, logger, avsAndEigenMetrics) + if err != nil { + logger.Error("Cannot create AggregatorRpcClient. Is aggregator running?", "err", err) + return nil, err + } + + operator := &Operator{ + logger: logger, + metricsReg: reg, + metrics: avsAndEigenMetrics, + ethClient: ethRpcClient, + avsWriter: avsWriter, + avsReader: avsReader, + avsSubscriber: avsSubscriber, + eigenlayerReader: eigenlayerReader, + eigenlayerWriter: eigenlayerWriter, + blsKeypair: blsKeyPair, + operatorAddr: common.HexToAddress(c.OperatorAddress), + aggregatorServerIpPortAddr: c.AggregatorServerIpPortAddress, + aggregatorRpcClient: aggregatorRpcClient, + newTaskCreatedChan: make(chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated), + credibleSquaringServiceManagerAddr: common.HexToAddress(c.AVSServiceManagerAddress), + operatorId: [32]byte{0}, // this is set below + + } + + if c.RegisterOperatorOnStartup { + operator.registerOperatorOnStartup(common.HexToAddress(c.BlsPublicKeyCompendiumAddress)) + } + + // OperatorId is set in contract during registration so we get it after registering operator. + operatorId, err := avsRegistryReader.GetOperatorId(context.Background(), operator.operatorAddr) + if err != nil { + logger.Error("Cannot get operator id", "err", err) + return nil, err + } + operator.operatorId = operatorId + logger.Info("Operator info", + "operatorId", operatorId, + "operatorAddr", c.OperatorAddress, + "operatorG1Pubkey", operator.blsKeypair.GetPubKeyG1(), + "operatorG2Pubkey", operator.blsKeypair.GetPubKeyG2(), + ) + + return operator, nil + +} + +func (o *Operator) Start(ctx context.Context) error { + operatorIsRegistered, err := o.avsReader.IsOperatorRegistered(ctx, o.operatorAddr) + if err != nil { + o.logger.Error("Error checking if operator is registered", "err", err) + return err + } + if !operatorIsRegistered { + // We bubble the error all the way up instead of using logger.Fatal because logger.Fatal prints a huge stack trace + // that hides the actual error message. This error msg is more explicit and doesn't require showing a stack trace to the user. + return fmt.Errorf("operator is not registered. Registering operator using the operator-cli before starting operator") + } + + o.logger.Infof("Starting operator.") + + metricsErrChan := o.metrics.Start(ctx, o.metricsReg) + + // TODO(samlaf): wrap this call with increase in avs-node-spec metric + sub := o.avsSubscriber.SubscribeToNewTasks(o.newTaskCreatedChan) + for { + select { + case <-ctx.Done(): + return nil + case err := <-metricsErrChan: + // TODO(samlaf); we should also register the service as unhealthy in the node api + // https://eigen.nethermind.io/docs/spec/api/ + o.logger.Fatal("Error in metrics server", "err", err) + case err := <-sub.Err(): + o.logger.Error("Error in websocket subscription", "err", err) + // TODO(samlaf): write unit tests to check if this fixed the issues we were seeing + sub.Unsubscribe() + // TODO(samlaf): wrap this call with increase in avs-node-spec metric + sub = o.avsSubscriber.SubscribeToNewTasks(o.newTaskCreatedChan) + case newTaskCreatedLog := <-o.newTaskCreatedChan: + o.metrics.IncNumTasksReceived() + taskResponse := o.ProcessNewTaskCreatedLog(newTaskCreatedLog) + signedTaskResponse, err := o.SignTaskResponse(taskResponse) + if err != nil { + continue + } + go o.aggregatorRpcClient.SendSignedTaskResponseToAggregator(signedTaskResponse) + } + } +} + +// Takes a NewTaskCreatedLog struct as input and returns a TaskResponseHeader struct. +// The TaskResponseHeader struct is the struct that is signed and sent to the contract as a task response. +func (o *Operator) ProcessNewTaskCreatedLog(newTaskCreatedLog *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated) *cstaskmanager.ICredibleSquaringTaskManagerTaskResponse { + o.logger.Debug("Received new task", "task", newTaskCreatedLog) + o.logger.Info("Received new task", + "numberToBeSquared", newTaskCreatedLog.Task.NumberToBeSquared, + "taskIndex", newTaskCreatedLog.TaskIndex, + "taskCreatedBlock", newTaskCreatedLog.Task.TaskCreatedBlock, + "quorumNumbers", newTaskCreatedLog.Task.QuorumNumbers, + "QuorumThresholdPercentage", newTaskCreatedLog.Task.QuorumThresholdPercentage, + ) + numberSquared := big.NewInt(0).Exp(newTaskCreatedLog.Task.NumberToBeSquared, big.NewInt(2), nil) + taskResponse := &cstaskmanager.ICredibleSquaringTaskManagerTaskResponse{ + ReferenceTaskIndex: newTaskCreatedLog.TaskIndex, + NumberSquared: numberSquared, + } + return taskResponse +} + +func (o *Operator) SignTaskResponse(taskResponse *cstaskmanager.ICredibleSquaringTaskManagerTaskResponse) (*aggregator.SignedTaskResponse, error) { + taskResponseHash, err := core.GetTaskResponseDigest(taskResponse) + if err != nil { + o.logger.Error("Error getting task response header hash. skipping task (this is not expected and should be investigated)", "err", err) + return nil, err + } + blsSignature := o.blsKeypair.SignMessage(taskResponseHash) + signedTaskResponse := &aggregator.SignedTaskResponse{ + TaskResponse: *taskResponse, + BlsSignature: *blsSignature, + OperatorId: o.operatorId, + } + o.logger.Debug("Signed task response", "signedTaskResponse", signedTaskResponse) + return signedTaskResponse, nil +} diff --git a/operator/operator_test.go b/operator/operator_test.go new file mode 100644 index 00000000..bbdd7220 --- /dev/null +++ b/operator/operator_test.go @@ -0,0 +1,110 @@ +package operator + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + + "github.com/Layr-Labs/incredible-squaring-avs/aggregator" + aggtypes "github.com/Layr-Labs/incredible-squaring-avs/aggregator/types" + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + chainiomocks "github.com/Layr-Labs/incredible-squaring-avs/core/chainio/mocks" + operatormocks "github.com/Layr-Labs/incredible-squaring-avs/operator/mocks" +) + +func TestOperator(t *testing.T) { + operator, err := createMockOperator() + assert.Nil(t, err) + const taskIndex = 1 + + t.Run("ProcessNewTaskCreatedLog", func(t *testing.T) { + var numberToBeSquared = big.NewInt(3) + newTaskCreatedLog := &cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated{ + TaskIndex: taskIndex, + Task: cstaskmanager.ICredibleSquaringTaskManagerTask{ + NumberToBeSquared: numberToBeSquared, + TaskCreatedBlock: 1000, + QuorumNumbers: aggtypes.QUORUM_NUMBERS, + QuorumThresholdPercentage: aggtypes.QUORUM_THRESHOLD_NUMERATOR, + }, + Raw: types.Log{}, + } + got := operator.ProcessNewTaskCreatedLog(newTaskCreatedLog) + numberSquared := big.NewInt(0).Mul(numberToBeSquared, numberToBeSquared) + want := &cstaskmanager.ICredibleSquaringTaskManagerTaskResponse{ + ReferenceTaskIndex: taskIndex, + NumberSquared: numberSquared, + } + assert.Equal(t, got, want) + }) + + t.Run("Start", func(t *testing.T) { + var numberToBeSquared = big.NewInt(3) + + // new task event + newTaskCreatedEvent := &cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated{ + TaskIndex: taskIndex, + Task: cstaskmanager.ICredibleSquaringTaskManagerTask{ + NumberToBeSquared: numberToBeSquared, + TaskCreatedBlock: 1000, + QuorumNumbers: aggtypes.QUORUM_NUMBERS, + QuorumThresholdPercentage: aggtypes.QUORUM_THRESHOLD_NUMERATOR, + }, + Raw: types.Log{}, + } + fmt.Println("newTaskCreatedEvent", newTaskCreatedEvent) + X, ok := big.NewInt(0).SetString("7926134832136282318561896451042374984489965925674521194255549259381336496956", 10) + assert.True(t, ok) + Y, ok := big.NewInt(0).SetString("15243507701692917330954619280683582177901049846125926696838777109165913318327", 10) + assert.True(t, ok) + + signedTaskResponse := &aggregator.SignedTaskResponse{ + TaskResponse: cstaskmanager.ICredibleSquaringTaskManagerTaskResponse{ + ReferenceTaskIndex: taskIndex, + NumberSquared: big.NewInt(0).Mul(numberToBeSquared, numberToBeSquared), + }, + BlsSignature: bls.Signature{ + G1Point: bls.NewG1Point(X, Y), + }, + OperatorId: operator.operatorId, + } + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mockAggregatorRpcClient := operatormocks.NewMockAggregatorRpcClienter(mockCtrl) + mockAggregatorRpcClient.EXPECT().SendSignedTaskResponseToAggregator(signedTaskResponse) + operator.aggregatorRpcClient = mockAggregatorRpcClient + + mockSubscriber := chainiomocks.NewMockAvsSubscriberer(mockCtrl) + mockSubscriber.EXPECT().SubscribeToNewTasks(operator.newTaskCreatedChan).Return(event.NewSubscription(func(quit <-chan struct{}) error { + // loop forever + <-quit + return nil + })) + operator.avsSubscriber = mockSubscriber + + mockReader := chainiomocks.NewMockAvsReaderer(mockCtrl) + mockReader.EXPECT().IsOperatorRegistered(gomock.Any(), operator.operatorAddr).Return(true, nil) + operator.avsReader = mockReader + + ctx, cancel := context.WithCancel(context.Background()) + go func() { + err := operator.Start(ctx) + assert.Nil(t, err) + }() + operator.newTaskCreatedChan <- newTaskCreatedEvent + time.Sleep(1 * time.Second) + + cancel() + }) + +} diff --git a/operator/registration.go b/operator/registration.go new file mode 100644 index 00000000..4275e701 --- /dev/null +++ b/operator/registration.go @@ -0,0 +1,222 @@ +package operator + +// OUTDATED +// This file contains cli functions for registering an operator with the AVS and printing status +// However, all of this functionality has been moved to the plugin/ package +// we are just waiting for eigenlayer-cli to be open sourced so we can completely get rid of this registration functionality in the operator + +import ( + "context" + "encoding/hex" + "encoding/json" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + eigenSdkTypes "github.com/Layr-Labs/eigensdk-go/types" + + regcoord "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSRegistryCoordinatorWithIndices" +) + +func (o *Operator) registerOperatorOnStartup(blsPubkeyCompendiumAddr common.Address) { + err := o.RegisterOperatorWithEigenlayer() + if err != nil { + // This error might only be that the operator was already registered with eigenlayer, so we don't want to fatal + o.logger.Error("Error registering operator with eigenlayer", "err", err) + } else { + o.logger.Infof("Registered operator with eigenlayer") + } + + err = o.RegisterBLSPublicKey() + if err != nil { + // This error might only be that the operator has already registered its bls pubkeys, so we don't want to fatal + o.logger.Error("Error registering BLS public key with eigenlayer", "err", err) + } else { + o.logger.Infof("Registered BLS public key with eigenlayer") + } + + // TODO(samlaf): these shouldn't be hardcoded + mockTokenStrategyAddr := common.HexToAddress("0x7a2088a1bFc9d81c55368AE168C2C02570cB814F") + amount := big.NewInt(1000) + err = o.DepositIntoStrategy(mockTokenStrategyAddr, amount) + if err != nil { + o.logger.Fatal("Error depositing into strategy", "err", err) + } + o.logger.Infof("Deposited %s into strategy %s", amount, mockTokenStrategyAddr) + + err = o.RegisterOperatorWithAvs() + if err != nil { + o.logger.Fatal("Error registering operator with avs", "err", err) + } + o.logger.Infof("Registered operator with avs") +} + +func (o *Operator) optOperatorIntoSlashing() error { + _, err := o.eigenlayerWriter.OptOperatorIntoSlashing(context.Background(), o.credibleSquaringServiceManagerAddr) + if err != nil { + o.logger.Errorf("Error opting operator into slashing") + return err + } + return nil +} + +func (o *Operator) RegisterOperatorWithEigenlayer() error { + op := eigenSdkTypes.Operator{ + Address: o.operatorAddr.String(), + EarningsReceiverAddress: o.operatorAddr.String(), + } + _, err := o.eigenlayerWriter.RegisterAsOperator(context.Background(), op) + if err != nil { + o.logger.Errorf("Error registering operator with eigenlayer") + return err + } + return nil +} + +func (o *Operator) DepositIntoStrategy(strategyAddr common.Address, amount *big.Int) error { + _, tokenAddr, err := o.eigenlayerReader.GetStrategyAndUnderlyingToken(context.Background(), strategyAddr) + if err != nil { + o.logger.Error("Failed to fetch strategy contract", "err", err) + return err + } + contractErc20Mock, err := o.avsReader.GetErc20Mock(context.Background(), tokenAddr) + if err != nil { + o.logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return err + } + txOpts := o.avsWriter.Signer.GetTxOpts() + tx, err := contractErc20Mock.Mint(txOpts, o.operatorAddr, amount) + if err != nil { + o.logger.Errorf("Error assembling Mint tx") + return err + } + o.ethClient.WaitForTransactionReceipt(context.Background(), tx.Hash()) + + _, err = o.eigenlayerWriter.DepositERC20IntoStrategy(context.Background(), strategyAddr, amount) + if err != nil { + o.logger.Errorf("Error depositing into strategy") + return err + } + return nil +} + +// TODO(samlaf): this should eventually be moved to eigensdk, since pubkey compendium should be a shared contract +// between all AVS teams. However it currently is not in that state (not included as part of canonical eigenlayer deployment) +// so for now we just deploy it as part of avs registries and make the call here. +func (o *Operator) RegisterBLSPublicKey() error { + o.logger.Debugf("registering BLS public keys G1(%s) and G2(%s) with EigenLayer", o.blsKeypair.GetPubKeyG1(), o.blsKeypair.GetPubKeyG2()) + + _, err := o.eigenlayerWriter.RegisterBLSPublicKey(context.Background(), o.blsKeypair, eigenSdkTypes.Operator{Address: o.operatorAddr.String()}) + if err != nil { + return fmt.Errorf("failed to register bls pubkey with compendium: %v", err) + } + + o.logger.Debugf("registered BLS public keys G1(%s) and G2(%s) with EigenLayer", o.blsKeypair.GetPubKeyG1(), o.blsKeypair.GetPubKeyG2()) + return nil +} + +// Registration specific functions +func (o *Operator) RegisterOperatorWithAvs() error { + + // 1. opt operator into getting slashed by credible squaring service manager + err := o.optOperatorIntoSlashing() + if err != nil { + return err + } + + // 2. register operator with avs coordinator contract + + quorumNumbers := []byte{0} + socket := "Not Needed" + + pubkey := pubKeyG1ToBN254G1Point(o.blsKeypair.GetPubKeyG1()) + g1Point := regcoord.BN254G1Point{ + X: pubkey.X, + Y: pubkey.Y, + } + + _, err = o.avsWriter.RegisterOperatorWithAVSRegistryCoordinator(context.Background(), quorumNumbers, g1Point, socket) + if err != nil { + o.logger.Errorf("Unable to register operator with avs registry coordinator") + return err + } + o.logger.Infof("Registered operator with avs registry coordinator.") + + return nil +} + +// PRINTING STATUS OF OPERATOR: 1 +// operator address: 0xa0ee7a142d267c1f36714e4a8f75612f20a79720 +// dummy token balance: 0 +// delegated shares in dummyTokenStrat: 200 +// operator pubkey hash in AVS pubkey compendium (0 if not registered): 0x4b7b8243d970ff1c90a7c775c008baad825893ec6e806dfa5d3663dc093ed17f +// operator is opted in to eigenlayer: true +// operator is opted in to playgroundAVS (aka can be slashed): true +// operator status in AVS registry: REGISTERED +// +// operatorId: 0x4b7b8243d970ff1c90a7c775c008baad825893ec6e806dfa5d3663dc093ed17f +// middlewareTimesLen (# of stake updates): 0 +// +// operator is frozen: false +type OperatorStatus struct { + EcdsaAddress string + // pubkey compendium related + PubkeysRegistered bool + G1Pubkey string + G2Pubkey string + // avs related + OptedIntoSlashingByAvs bool + RegisteredWithAvs bool + OperatorId string + Frozen bool +} + +func (o *Operator) PrintOperatorStatus() error { + fmt.Println("Printing operator status") + pubkeyhash, err := o.eigenlayerReader.GetOperatorPubkeyHash(context.Background(), eigenSdkTypes.Operator{Address: o.operatorAddr.String()}) + if err != nil { + return err + } + pubkeysRegistered := pubkeyhash != [32]byte{} + serviceManagerCanSlashOperatorUntilBlock, err := o.eigenlayerReader.ServiceManagerCanSlashOperatorUntilBlock( + context.Background(), o.operatorAddr, o.credibleSquaringServiceManagerAddr, + ) + if err != nil { + return err + } + curBlockNumber, err := o.ethClient.BlockNumber(context.Background()) + if err != nil { + return err + } + optedIntoSlashingByAvs := curBlockNumber < uint64(serviceManagerCanSlashOperatorUntilBlock) + registeredWithAvs := o.operatorId != [32]byte{} + isFrozen, err := o.eigenlayerReader.OperatorIsFrozen(context.Background(), o.operatorAddr) + if err != nil { + return err + } + operatorStatus := OperatorStatus{ + EcdsaAddress: o.operatorAddr.String(), + PubkeysRegistered: pubkeysRegistered, + G1Pubkey: o.blsKeypair.GetPubKeyG1().String(), + G2Pubkey: o.blsKeypair.GetPubKeyG2().String(), + OptedIntoSlashingByAvs: optedIntoSlashingByAvs, + RegisteredWithAvs: registeredWithAvs, + OperatorId: hex.EncodeToString(o.operatorId[:]), + Frozen: isFrozen, + } + operatorStatusJson, err := json.MarshalIndent(operatorStatus, "", " ") + if err != nil { + return err + } + fmt.Println(string(operatorStatusJson)) + return nil +} + +func pubKeyG1ToBN254G1Point(p *bls.G1Point) regcoord.BN254G1Point { + return regcoord.BN254G1Point{ + X: p.X.BigInt(new(big.Int)), + Y: p.Y.BigInt(new(big.Int)), + } +} diff --git a/operator/registration_test.go b/operator/registration_test.go new file mode 100644 index 00000000..29c77e77 --- /dev/null +++ b/operator/registration_test.go @@ -0,0 +1,54 @@ +package operator + +import ( + "testing" + + "github.com/prometheus/client_golang/prometheus" + "github.com/stretchr/testify/assert" + + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + + cstaskmanager "github.com/Layr-Labs/incredible-squaring-avs/contracts/bindings/CredibleSquaringTaskManager" + "github.com/Layr-Labs/incredible-squaring-avs/metrics" + "github.com/Layr-Labs/incredible-squaring-avs/tests" +) + +const MOCK_OPERATOR_BLS_PRIVATE_KEY = "69" + +// hash of bls_public_key (hardcoded for sk=69) +var MOCK_OPERATOR_ID = [32]byte{207, 73, 226, 221, 104, 100, 123, 41, 192, 3, 9, 119, 90, 83, 233, 159, 231, 151, 245, 96, 150, 48, 144, 27, 102, 253, 39, 101, 1, 26, 135, 173} + +// Name starts with Integration test because we don't want it to run with go test ./... +// since this starts a chain and takes longer to run +// TODO(samlaf): buggy test, fix it +func IntegrationTestOperatorRegistration(t *testing.T) { + anvilCmd := tests.StartAnvilChainAndDeployContracts() + defer anvilCmd.Process.Kill() + operator, err := createMockOperator() + assert.Nil(t, err) + err = operator.RegisterOperatorWithEigenlayer() + assert.Nil(t, err) +} + +func createMockOperator() (*Operator, error) { + logger := sdklogging.NewNoopLogger() + reg := prometheus.NewRegistry() + noopMetrics := metrics.NewNoopMetrics() + + blsPrivateKey, err := bls.NewPrivateKey(MOCK_OPERATOR_BLS_PRIVATE_KEY) + if err != nil { + return nil, err + } + operatorKeypair := bls.NewKeyPair(blsPrivateKey) + + operator := &Operator{ + logger: logger, + blsKeypair: operatorKeypair, + metricsReg: reg, + metrics: noopMetrics, + newTaskCreatedChan: make(chan *cstaskmanager.ContractCredibleSquaringTaskManagerNewTaskCreated), + operatorId: MOCK_OPERATOR_ID, + } + return operator, nil +} diff --git a/operator/rpc_client.go b/operator/rpc_client.go new file mode 100644 index 00000000..c8ea373c --- /dev/null +++ b/operator/rpc_client.go @@ -0,0 +1,77 @@ +package operator + +import ( + "fmt" + "net/rpc" + "time" + + "github.com/Layr-Labs/incredible-squaring-avs/aggregator" + "github.com/Layr-Labs/incredible-squaring-avs/metrics" + + "github.com/Layr-Labs/eigensdk-go/logging" +) + +type AggregatorRpcClienter interface { + SendSignedTaskResponseToAggregator(signedTaskResponse *aggregator.SignedTaskResponse) +} +type AggregatorRpcClient struct { + rpcClient *rpc.Client + metrics metrics.Metrics + logger logging.Logger + aggregatorIpPortAddr string +} + +func NewAggregatorRpcClient(aggregatorIpPortAddr string, logger logging.Logger, metrics metrics.Metrics) (*AggregatorRpcClient, error) { + return &AggregatorRpcClient{ + // set to nil so that we can create an rpc client even if the aggregator is not running + rpcClient: nil, + metrics: metrics, + logger: logger, + aggregatorIpPortAddr: aggregatorIpPortAddr, + }, nil +} + +func (c *AggregatorRpcClient) dialAggregatorRpcClient() error { + client, err := rpc.DialHTTP("tcp", c.aggregatorIpPortAddr) + if err != nil { + return err + } + c.rpcClient = client + return nil +} + +// SendSignedTaskResponseToAggregator sends a signed task response to the aggregator. +// it is meant to be ran inside a go thread, so doesn't return anything. +// this is because sending the signed task response to the aggregator is time sensitive, +// so there is no point in retrying if it fails for a few times. +// Currently hardcoded to retry sending the signed task response 5 times, waiting 2 seconds in between each attempt. +func (c *AggregatorRpcClient) SendSignedTaskResponseToAggregator(signedTaskResponse *aggregator.SignedTaskResponse) { + if c.rpcClient == nil { + c.logger.Info("rpc client is nil. Dialing aggregator rpc client") + err := c.dialAggregatorRpcClient() + if err != nil { + c.logger.Error("Could not dial aggregator rpc client. Not sending signed task response header to aggregator. Is aggregator running?", "err", err) + return + } + } + // we don't check this bool. It's just needed because rpc.Call requires rpc methods to have a return value + var reply bool + // We try to send the response 5 times to the aggregator, waiting 2 times in between each attempt. + // This is mostly only necessary for local testing, since the aggregator sometimes is not ready to process task responses + // before the operator gets the new task created log from anvil (because blocks are mined instantly) + // the aggregator needs to read some onchain data related to quorums before it can accept operator signed task responses. + c.logger.Info("Sending signed task response header to aggregator", "signedTaskResponse", fmt.Sprintf("%#v", signedTaskResponse)) + for i := 0; i < 5; i++ { + err := c.rpcClient.Call("Aggregator.ProcessSignedTaskResponse", signedTaskResponse, &reply) + if err != nil { + c.logger.Info("Received error from aggregator", "err", err) + } else { + c.logger.Info("Signed task response header accepted by aggregator.", "reply", reply) + c.metrics.IncNumTasksAcceptedByAggregator() + return + } + c.logger.Infof("Retrying in 2 seconds") + time.Sleep(2 * time.Second) + } + c.logger.Errorf("Could not send signed task response to aggregator. Tried 5 times.") +} diff --git a/plugin.Dockerfile b/plugin.Dockerfile new file mode 100644 index 00000000..207e09eb --- /dev/null +++ b/plugin.Dockerfile @@ -0,0 +1,15 @@ +FROM golang:1.21 as build + +WORKDIR /usr/src/app + +COPY go.mod go.sum ./ + +RUN go mod download && go mod tidy && go mod verify + +COPY . . + +RUN go build -v -o /usr/local/bin/plugin plugin/cmd/main.go + +FROM debian:latest +COPY --from=build /usr/local/bin/plugin /usr/local/bin/plugin +ENTRYPOINT [ "plugin", "--config=/app/avs_config.yaml" ] \ No newline at end of file diff --git a/plugin/cmd/main.go b/plugin/cmd/main.go new file mode 100644 index 00000000..456cc2c0 --- /dev/null +++ b/plugin/cmd/main.go @@ -0,0 +1,306 @@ +package main + +import ( + "context" + "fmt" + "log" + "math/big" + "os" + + sdkavsregistry "github.com/Layr-Labs/eigensdk-go/chainio/avsregistry" + sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients" + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + sdkelcontracts "github.com/Layr-Labs/eigensdk-go/chainio/elcontracts" + regcoord "github.com/Layr-Labs/eigensdk-go/contracts/bindings/BLSRegistryCoordinatorWithIndices" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" + "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/metrics" + "github.com/Layr-Labs/eigensdk-go/signer" + "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/Layr-Labs/incredible-squaring-avs/core/chainio" + "github.com/Layr-Labs/incredible-squaring-avs/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli" +) + +var ( + /* Required Flags */ + ConfigFileFlag = cli.StringFlag{ + Name: "config", + Required: true, + Usage: "Load configuration from `FILE`", + EnvVar: "CONFIG", + } + EcdsaKeyPasswordFlag = cli.StringFlag{ + Name: "ecdsa-key-password", + Required: false, + Usage: "Password to decrypt the ecdsa key", + EnvVar: "ECDSA_KEY_PASSWORD", + } + BlsKeyPasswordFlag = cli.StringFlag{ + Name: "bls-key-password", + Required: false, + Usage: "Password to decrypt the bls key", + EnvVar: "BLS_KEY_PASSWORD", + } + OperationFlag = cli.StringFlag{ + Name: "operation-type", + Required: true, + Usage: "Supported operations: opt-in, deposit", + EnvVar: "OPERATION_TYPE", + } + StrategyAddrFlag = cli.StringFlag{ + Name: "strategy-addr", + Required: false, + Usage: "Strategy address for deposit mock tokens, only used for deposit action", + EnvVar: "STRATEGY_ADDR", + } +) + +func main() { + app := cli.NewApp() + app.Flags = []cli.Flag{ + ConfigFileFlag, + EcdsaKeyPasswordFlag, + BlsKeyPasswordFlag, + OperationFlag, + StrategyAddrFlag, + } + app.Name = "credible-squaring-plugin" + app.Usage = "Credible Squaring Plugin" + app.Description = "This is used to run one time operations like avs opt-in/opt-out" + app.Action = plugin + err := app.Run(os.Args) + if err != nil { + log.Fatalln("Application failed.", "Message:", err) + } +} + +func plugin(ctx *cli.Context) { + goCtx := context.Background() + + operationType := ctx.GlobalString(OperationFlag.Name) + configPath := ctx.GlobalString(ConfigFileFlag.Name) + + avsConfig := types.NodeConfig{} + err := utils.ReadYamlConfig(configPath, &avsConfig) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(avsConfig) + + ecdsaKeyPassword := ctx.GlobalString(EcdsaKeyPasswordFlag.Name) + + ethHttpClient, err := eth.NewClient(avsConfig.EthRpcUrl) + if err != nil { + fmt.Println("can't connect to eth client") + fmt.Println(err) + return + } + ethWsClient, err := eth.NewClient(avsConfig.EthWsUrl) + if err != nil { + fmt.Println("can't connect to eth client") + fmt.Println(err) + return + } + + chainID, err := ethHttpClient.ChainID(goCtx) + if err != nil { + fmt.Println("can't get chain id") + fmt.Println(err) + return + } + + signer, err := signer.NewPrivateKeyFromKeystoreSigner(avsConfig.EcdsaPrivateKeyStorePath, ecdsaKeyPassword, chainID) + if err != nil { + fmt.Println("can't create signer") + fmt.Println(err) + return + } + + logger, _ := logging.NewZapLogger(logging.Development) + avsWriter, err := chainio.NewAvsWriter(signer, + common.HexToAddress(avsConfig.AVSServiceManagerAddress), + common.HexToAddress(avsConfig.BLSOperatorStateRetrieverAddress), + ethHttpClient, + logger, + ) + + if err != nil { + fmt.Println("can't create avs writer") + fmt.Println(err) + return + } + + avsServiceBindings, err := chainio.NewAvsServiceBindings( + common.HexToAddress(avsConfig.AVSServiceManagerAddress), + common.HexToAddress(avsConfig.BLSOperatorStateRetrieverAddress), + ethHttpClient, + logger, + ) + if err != nil { + fmt.Println("can't create avs service bindings") + fmt.Println(err) + return + } + + blsRegistryCoordinatorAddr, err := avsServiceBindings.ServiceManager.RegistryCoordinator(&bind.CallOpts{}) + if err != nil { + fmt.Println("can't get bls registry coordinator address") + fmt.Println(err) + return + } + + stakeRegistryAddr, err := avsServiceBindings.ServiceManager.StakeRegistry(&bind.CallOpts{}) + if err != nil { + fmt.Println("can't get stake registry address") + fmt.Println(err) + return + } + blsPubkeyRegistryAddr, err := avsServiceBindings.ServiceManager.BlsPubkeyRegistry(&bind.CallOpts{}) + if err != nil { + fmt.Println("can't get bls pubkey registry address") + fmt.Println(err) + return + } + + avsRegistryContractClient, err := sdkclients.NewAvsRegistryContractsChainClient( + blsRegistryCoordinatorAddr, common.HexToAddress(avsConfig.BLSOperatorStateRetrieverAddress), stakeRegistryAddr, blsPubkeyRegistryAddr, ethHttpClient, logger, + ) + if err != nil { + fmt.Println("can't create avs registry contract client") + fmt.Println(err) + return + } + + avsRegistryReader, err := sdkavsregistry.NewAvsRegistryReader(avsRegistryContractClient, logger, ethHttpClient) + if err != nil { + fmt.Println("can't create avs registry reader") + fmt.Println(err) + return + } + + avsReader, err := chainio.NewAvsReader( + avsRegistryReader, + avsServiceBindings, + logger, + ) + + if err != nil { + fmt.Println("can't create avs writer") + fmt.Println(err) + return + } + + elContractsClient, err := sdkclients.NewELContractsChainClient(common.HexToAddress(avsConfig.ELSlasherAddress), common.HexToAddress(avsConfig.BlsPublicKeyCompendiumAddress), ethHttpClient, ethWsClient, logger) + if err != nil { + logger.Error("Cannot create ELContractsChainClient", "err", err) + return + } + noopMetrics := metrics.NewNoopMetrics() + eigenLayerWriter := sdkelcontracts.NewELChainWriter( + elContractsClient, + ethHttpClient, + signer, + logger, + noopMetrics, + ) + + eigenlayerReader, err := sdkelcontracts.NewELChainReader( + elContractsClient, + logger, + ethHttpClient, + ) + if err != nil { + fmt.Println(err) + return + } + + if err != nil { + fmt.Println("can't create eigenlayer writer") + fmt.Println(err) + return + } + + if operationType == "opt-in" { + blsKeyPassword := ctx.GlobalString(BlsKeyPasswordFlag.Name) + + keypair, err := bls.ReadPrivateKeyFromFile(avsConfig.BlsPrivateKeyStorePath, blsKeyPassword) + if err != nil { + fmt.Println(err) + return + } + // Opt into slashing + logger.Infof("Opting into slashing with AVS Service Manager address %s", avsConfig.AVSServiceManagerAddress) + _, err = eigenLayerWriter.OptOperatorIntoSlashing(goCtx, common.HexToAddress(avsConfig.AVSServiceManagerAddress)) + if err != nil { + fmt.Println(err) + return + } + logger.Infof("Opted into slashing successfully") + + // Register with registry coordination + quorumNumbers := []byte{0} + socket := "Not Needed" + + pubkey := pubKeyG1ToBN254G1Point(keypair.GetPubKeyG1()) + g1Point := regcoord.BN254G1Point{ + X: pubkey.X, + Y: pubkey.Y, + } + + logger.Infof("Registering with registry coordination with quorum numbers %v and socket %s", quorumNumbers, socket) + r, err := avsWriter.RegisterOperatorWithAVSRegistryCoordinator(goCtx, quorumNumbers, g1Point, socket) + if err != nil { + fmt.Println(err) + logger.Errorf("Error assembling CreateNewTask tx") + return + } + logger.Infof("Registered with registry coordination successfully with tx hash %s", r.TxHash.Hex()) + } else if operationType == "opt-out" { + fmt.Println("Opting out of slashing - unimplemented") + } else if operationType == "deposit" { + starategyAddrString := ctx.GlobalString(StrategyAddrFlag.Name) + if len(starategyAddrString) == 0 { + fmt.Println("Strategy address is required for deposit operation") + return + } + strategyAddr := common.HexToAddress(ctx.GlobalString(StrategyAddrFlag.Name)) + _, tokenAddr, err := eigenlayerReader.GetStrategyAndUnderlyingToken(context.Background(), strategyAddr) + if err != nil { + logger.Error("Failed to fetch strategy contract", "err", err) + return + } + contractErc20Mock, err := avsReader.GetErc20Mock(context.Background(), tokenAddr) + if err != nil { + logger.Error("Failed to fetch ERC20Mock contract", "err", err) + return + } + txOpts := avsWriter.Signer.GetTxOpts() + amount := big.NewInt(1000) + tx, err := contractErc20Mock.Mint(txOpts, common.HexToAddress(avsConfig.OperatorAddress), amount) + if err != nil { + logger.Errorf("Error assembling Mint tx") + return + } + ethHttpClient.WaitForTransactionReceipt(context.Background(), tx.Hash()) + + _, err = eigenLayerWriter.DepositERC20IntoStrategy(context.Background(), strategyAddr, amount) + if err != nil { + logger.Errorf("Error depositing into strategy") + return + } + return + } else { + fmt.Println("Invalid operation type") + } +} + +func pubKeyG1ToBN254G1Point(p *bls.G1Point) regcoord.BN254G1Point { + return regcoord.BN254G1Point{ + X: p.X.BigInt(new(big.Int)), + Y: p.Y.BigInt(new(big.Int)), + } +} diff --git a/prometheus/prometheus.yml b/prometheus/prometheus.yml new file mode 100644 index 00000000..90625a23 --- /dev/null +++ b/prometheus/prometheus.yml @@ -0,0 +1,27 @@ +global: + scrape_interval: 15s + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: "docker-host-alpha" + +# A scrape configuration containing exactly one endpoint to scrape. +scrape_configs: + + - job_name: "prometheus" + scrape_interval: 10s + static_configs: + - targets: ["localhost:9090"] + + - job_name: "incredible-squaring-node" + scrape_interval: 5s + static_configs: + # host.docker.internal might not work on linux + # TODO: do https://stackoverflow.com/a/67158212/4971151 + # - targets: ["host.docker.internal:9090"] + - targets: ["incredible-squaring-operator1:9090"] + labels: + bot: "inc-sq-node" + relabel_configs: + # is this actually useful? We already have the job name diff --git a/register-operator.Dockerfile b/register-operator.Dockerfile new file mode 100644 index 00000000..272cd82c --- /dev/null +++ b/register-operator.Dockerfile @@ -0,0 +1,3 @@ +FROM golang:1.21.1 + +RUN curl -L https://foundry.paradigm.xyz | bash && . /root/.bashrc && foundryup diff --git a/tests/integration/README.md b/tests/integration/README.md new file mode 100644 index 00000000..d266b5e1 --- /dev/null +++ b/tests/integration/README.md @@ -0,0 +1,21 @@ +# Integration Tests + +We store an anvil state files in this directory, so that we can start an anvil chain with the correct state for integration tests. +``` +anvil --load-state STATE_FILE.json +``` + +## Eigenlayer deployment state file +`eigenlayer-deployed-anvil-state.json` contains the eigenlayer deployment. + +It was created by running this [deploy script](https://github.com/Layr-Labs/eigenlayer-contracts/blob/2cb9ed107c6c918b9dfbac94cd71b4ab7c94e8c2/script/testing/M2_Deploy_From_Scratch.s.sol). If you ever need to redeploy a new version of eigenlayer contracts, first start an anvil chain that dumps its state after exiting +``` +anvil --dump-state eigenlayer-deployed-anvil-state.json +``` +Then run the deploy script +``` +forge script script/testing/M2_Deploy_From_Scratch.s.sol --rpc-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast --sig "run(string memory configFile)" -- M2_deploy_from_scratch.anvil.config.json +``` +and finally kill the anvil chain with `Ctrl-C`. Make sure to copy the deployment [output file](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/script/output/M2_from_scratch_deployment_data.json) to [eigenlayer_deployment_output.json](../../contracts/script/output/31337/eigenlayer_deployment_output.json) so that the tests can find the deployed contracts. + +See the main [README](../../README.md#dependencies) to understand why we deploy from the `experimental-reduce-strategy-manager-bytecode-size` branch of eigenlayer-contracts. \ No newline at end of file diff --git a/tests/integration/avs-and-eigenlayer-deployed-anvil-state.json b/tests/integration/avs-and-eigenlayer-deployed-anvil-state.json new file mode 100644 index 00000000..44fedf56 --- /dev/null +++ b/tests/integration/avs-and-eigenlayer-deployed-anvil-state.json @@ -0,0 +1 @@ +{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x23247f0b1142800","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x1e","0x97":"0x0","0x9a":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xdcd1bf9a1b36ce34237eeafef220932846bcd82","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106102045760003560e01c80639b4e463411610118578063c1de3aef116100a0578063daf12cd41161006f578063daf12cd41461065f578063ea4d3c9b1461067f578063f2fde38b146106b3578063f6848d24146106d3578063fabc1cbc1461070e57600080fd5b8063c1de3aef146105cf578063c2c51c40146105ef578063c3c6b3a91461060f578063d1c64cc91461063f57600080fd5b8063a6a509be116100e7578063a6a509be1461052f578063b134427114610545578063beffbb8914610579578063c052bd6114610599578063c0ccbf10146105b957600080fd5b80639b4e4634146104995780639ba06275146104ac578063a1788484146104e2578063a38406a31461050f57600080fd5b80635ac86ab71161019b57806374cdd7981161016a57806374cdd798146103ea57806384d810621461041e578063886f1195146104335780638da5cb5b146104535780639104c3191461047157600080fd5b80635ac86ab7146103535780635c975abb1461039357806360f4062b146103a8578063715018a6146103d557600080fd5b8063292b7b2b116101d7578063292b7b2b1461029e578063387b1300146102ea57806339b70e381461030a578063595c6a671461033e57600080fd5b80630cf2686d146102095780630e81073c1461022b57806310d67a2f1461025e578063136439dd1461027e575b600080fd5b34801561021557600080fd5b50610229610224366004612371565b61072e565b005b34801561023757600080fd5b5061024b61024636600461239f565b6107ea565b6040519081526020015b60405180910390f35b34801561026a57600080fd5b506102296102793660046123cb565b6109f5565b34801561028a57600080fd5b50610229610299366004612371565b610aa5565b3480156102aa57600080fd5b506102d27f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b6040516001600160a01b039091168152602001610255565b3480156102f657600080fd5b506102296103053660046123e8565b610be4565b34801561031657600080fd5b506102d27f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b34801561034a57600080fd5b50610229610f27565b34801561035f57600080fd5b5061038361036e366004612429565b606654600160ff9092169190911b9081161490565b6040519015158152602001610255565b34801561039f57600080fd5b5060665461024b565b3480156103b457600080fd5b5061024b6103c33660046123cb565b609b6020526000908152604090205481565b3480156103e157600080fd5b50610229610fee565b3480156103f657600080fd5b506102d27f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561042a57600080fd5b50610229611002565b34801561043f57600080fd5b506065546102d2906001600160a01b031681565b34801561045f57600080fd5b506033546001600160a01b03166102d2565b34801561047d57600080fd5b506102d273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102296104a7366004612495565b61108c565b3480156104b857600080fd5b506102d26104c73660046123cb565b6098602052600090815260409020546001600160a01b031681565b3480156104ee57600080fd5b5061024b6104fd3660046123cb565b609c6020526000908152604090205481565b34801561051b57600080fd5b506102d261052a3660046123cb565b611125565b34801561053b57600080fd5b5061024b60995481565b34801561055157600080fd5b506102d27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b34801561058557600080fd5b5061022961059436600461239f565b6111f7565b3480156105a557600080fd5b506097546102d2906001600160a01b031681565b3480156105c557600080fd5b5061024b609a5481565b3480156105db57600080fd5b506102296105ea3660046123cb565b61148a565b3480156105fb57600080fd5b5061022961060a36600461239f565b61149b565b34801561061b57600080fd5b5061038361062a366004612371565b609d6020526000908152604090205460ff1681565b34801561064b57600080fd5b5061024b61065a366004612509565b61186d565b34801561066b57600080fd5b5061022961067a366004612533565b611978565b34801561068b57600080fd5b506102d27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b3480156106bf57600080fd5b506102296106ce3660046123cb565b611aab565b3480156106df57600080fd5b506103836106ee3660046123cb565b6001600160a01b0390811660009081526098602052604090205416151590565b34801561071a57600080fd5b50610229610729366004612371565b611b21565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a5919061258e565b6001600160a01b0316336001600160a01b0316146107de5760405162461bcd60e51b81526004016107d5906125ab565b60405180910390fd5b6107e781611c7d565b50565b6000336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146108345760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b0383166108b05760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f206164647265737300000000000060648201526084016107d5565b600082121561091e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b60648201526084016107d5565b61092c633b9aca0083612669565b1561099f5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e7400000060648201526084016107d5565b6001600160a01b0383166000908152609b6020526040812054906109c38483612693565b6001600160a01b0386166000908152609b6020526040902081905590506109ea8282611cbe565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c919061258e565b6001600160a01b0316336001600160a01b031614610a9c5760405162461bcd60e51b81526004016107d5906125ab565b6107e781611d00565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1191906126d4565b610b2d5760405162461bcd60e51b81526004016107d5906126f6565b60665481811614610ba65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016107d5565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610c2c5760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b038316610ca65760405162461bcd60e51b815260206004820152604760248201526000805160206131d383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a4016107d5565b6001600160a01b038216610d235760405162461bcd60e51b815260206004820152604a60248201526000805160206131d383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a4016107d5565b6000811215610d925760405162461bcd60e51b815260206004820152604160248201526000805160206131d383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a4016107d5565b610da0633b9aca0082612669565b15610e145760405162461bcd60e51b815260206004820152604a60248201526000805160206131d383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a4016107d5565b6001600160a01b0383166000908152609b602052604081205490811215610eab576000610e408261273e565b905080831115610e74576001600160a01b0385166000908152609b6020526040812055610e6d818461275b565b9250610ea9565b6001600160a01b0385166000908152609b602052604081208054859290610e9c908490612693565b90915550610f2292505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50505050505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9391906126d4565b610faf5760405162461bcd60e51b81526004016107d5906126f6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ff6611df7565b6110006000611e51565b565b336000908152609860205260409020546001600160a01b0316156110845760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b60648201526084016107d5565b6107e7611ea3565b336000908152609860205260409020546001600160a01b0316806110b5576110b2611ea3565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906110eb908a908a908a908a908a9060040161279b565b6000604051808303818588803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806109ef576111f0836001600160a01b031660001b60405180610940016040528061090e81526020016128c561090e9139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f19818403018152908290526111d59291602001612810565b604051602081830303815290604052805190602001206120d7565b9392505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461123f5760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b0382166112bb5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20706f60448201527f644f776e65722063616e6e6f74206265207a65726f206164647265737300000060648201526084016107d5565b60008112156113325760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f6172657320616d6f756e74206973206e6567617469766500000000000000000060648201526084016107d5565b611340633b9aca0082612669565b156113b5576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e7460648201526084016107d5565b6001600160a01b0382166000908152609b60205260408120546113d9908390612825565b9050600081121561146a5760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a4016107d5565b6001600160a01b039092166000908152609b602052604090209190915550565b611492611df7565b6107e781612133565b6001600160a01b0380831660009081526098602052604090205483911633146115165760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b60648201526084016107d5565b600260c65414156115695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d5565b600260c6556001600160a01b0383166116055760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a4016107d5565b611613633b9aca0083612864565b156116ac5760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a4016107d5565b6001600160a01b0383166000908152609b6020526040812054906116d08483612693565b6001600160a01b0386166000908152609b602052604081208290559091506116f88383611cbe565b905080156118605760008112156117c3576001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117578561273e565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156117a657600080fd5b505af11580156117ba573d6000803e3d6000fd5b50505050611860565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b15801561184757600080fd5b505af115801561185b573d6000803e3d6000fd5b505050505b5050600160c65550505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa1580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e89190612878565b9050806109ef5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a4016107d5565b600054610100900460ff16158080156119985750600054600160ff909116105b806119b25750303b1580156119b2575060005460ff166001145b611a155760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d5565b6000805460ff191660011790558015611a38576000805461ff0019166101001790555b611a4186611c7d565b611a4a85612133565b611a5384611e51565b611a5d838361217d565b8015611aa3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b611ab3611df7565b6001600160a01b038116611b185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d5565b6107e781611e51565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061258e565b6001600160a01b0316336001600160a01b031614611bc85760405162461bcd60e51b81526004016107d5906125ab565b606654198119606654191614611c465760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016107d5565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610bd9565b609a5460408051918252602082018390527f4e65c41a3597bda732ca64980235cf51494171d5853998763fb05db45afaacb3910160405180910390a1609a55565b6000808313611cde5760008213611cd7575060006109ef565b50806109ef565b60008213611cf657611cef8361273e565b90506109ef565b611cef8383612825565b6001600160a01b038116611d8e5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016107d5565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146110005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d5565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606654600090819060019081161415611efe5760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e646578206973207061757365640000000000000060448201526064016107d5565b609a54609954611f0f906001612891565b1115611f735760405162461bcd60e51b815260206004820152602d60248201527f456967656e506f644d616e616765722e5f6465706c6f79506f643a20706f642060448201526c1b1a5b5a5d081c995858da1959609a1b60648201526084016107d5565b609960008154611f82906128a9565b9091555060408051610940810190915261090e80825260009161202191839133916128c56020830139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f198184030181529082905261200d9291602001612810565b604051602081830303815290604052612267565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b15801561206557600080fd5b505af1158015612079573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a391505090565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906111f0565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561219e57506001600160a01b03821615155b6122205760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016107d5565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261226382611d00565b5050565b600080844710156122ba5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016107d5565b82516123085760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016107d5565b8383516020850187f590506001600160a01b0381166123695760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016107d5565b949350505050565b60006020828403121561238357600080fd5b5035919050565b6001600160a01b03811681146107e757600080fd5b600080604083850312156123b257600080fd5b82356123bd8161238a565b946020939093013593505050565b6000602082840312156123dd57600080fd5b81356111f08161238a565b6000806000606084860312156123fd57600080fd5b83356124088161238a565b925060208401356124188161238a565b929592945050506040919091013590565b60006020828403121561243b57600080fd5b813560ff811681146111f057600080fd5b60008083601f84011261245e57600080fd5b50813567ffffffffffffffff81111561247657600080fd5b60208301915083602082850101111561248e57600080fd5b9250929050565b6000806000806000606086880312156124ad57600080fd5b853567ffffffffffffffff808211156124c557600080fd5b6124d189838a0161244c565b909750955060208801359150808211156124ea57600080fd5b506124f78882890161244c565b96999598509660400135949350505050565b60006020828403121561251b57600080fd5b813567ffffffffffffffff811681146111f057600080fd5b600080600080600060a0868803121561254b57600080fd5b85359450602086013561255d8161238a565b9350604086013561256d8161238a565b9250606086013561257d8161238a565b949793965091946080013592915050565b6000602082840312156125a057600080fd5b81516111f08161238a565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261267857612678612653565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126b5576126b561267d565b600160ff1b83900384128116156126ce576126ce61267d565b50500190565b6000602082840312156126e657600080fd5b815180151581146111f057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127545761275461267d565b5060000390565b60008282101561276d5761276d61267d565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006127af606083018789612772565b82810360208401526127c2818688612772565b9150508260408301529695505050505050565b6000815160005b818110156127f657602081850181015186830152016127dc565b81811115612805576000828601525b509290920192915050565b600061236961281f83866127d5565b846127d5565b60008083128015600160ff1b8501841216156128435761284361267d565b6001600160ff1b038401831381161561285e5761285e61267d565b50500390565b60008261287357612873612653565b500790565b60006020828403121561288a57600080fd5b5051919050565b600082198211156128a4576128a461267d565b500190565b60006000198214156128bd576128bd61267d565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220fdba244614e85c7d0217ace6943bbcaeeda2f25ab03ed3807c7c4b43c901c2d664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x0e801d84fa97b50751dbf25036d067dcf18858bf":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100b35760003560e01c8063889ae3e511610071578063889ae3e5146101ad57806397faf021146101cd5780639bfff3e8146101e0578063a454b3be146101e8578063b9717755146101fb578063f34109221461020e57600080fd5b8062bff04d146100b85780630854259f146100e15780630a344038146100f65780632d1a8b78146101165780636653b53b1461014d5780636d14a9871461016e575b600080fd5b6100cb6100c63660046112f9565b610221565b6040516100d89190611345565b60405180910390f35b6100f46100ef3660046113a5565b61045c565b005b61010163ffffffff81565b60405163ffffffff90911681526020016100d8565b6101296101243660046114c1565b610661565b60408051825163ffffffff90811682526020938401511692810192909252016100d8565b61016061015b3660046114f4565b6106da565b6040519081526020016100d8565b6101957f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304281565b6040516001600160a01b0390911681526020016100d8565b6101c06101bb3660046114c1565b6106fb565b6040516100d8919061150d565b6101296101db366004611545565b6107e8565b600154610160565b6101016101f6366004611581565b610866565b6101016102093660046115ad565b610af2565b61010161021c3660046115fa565b610d9d565b6060336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304216146102745760405162461bcd60e51b815260040161026b90611615565b60405180910390fd5b60008267ffffffffffffffff81111561028f5761028f61138f565b6040519080825280602002602001820160405280156102b8578160200160208202803683370190505b5060018054808201825560009182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018790559091505b8381101561045157600085858381811061030c5761030c611688565b919091013560f81c6000818152600360205260408120549193509091508161033557600061037c565b60ff831660009081526003602052604090206103526001846116b4565b8154811061036257610362611688565b600091825260209091200154600160201b900463ffffffff165b9050610389898483610e0b565b610404836103988360016116cb565b60408051808201825263ffffffff9283166020808301918252438516835260ff9590951660009081526003865292832080546001810182559084529490922090519301805491518316600160201b0267ffffffffffffffff199092169390921692909217919091179055565b61040f8160016116cb565b85858151811061042157610421611688565b602002602001019063ffffffff16908163ffffffff16815250505050508080610449906116f3565b9150506102f0565b5090505b9392505050565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304216146104a45760405162461bcd60e51b815260040161026b90611615565b805182146105405760405162461bcd60e51b815260206004820152605d60248201527f496e64657852656769737472792e646572656769737465724f70657261746f7260448201527f3a2071756f72756d4e756d6265727320616e64206f70657261746f724964735460648201527f6f53776170206d757374206265207468652073616d65206c656e677468000000608482015260a40161026b565b60005b8281101561065a57600084848381811061055f5761055f611688565b6000898152600260209081526040808320939095013560f81c80835292905292832080549194509150610594906001906116b4565b815481106105a4576105a4611688565b9060005260206000200160000160049054906101000a900463ffffffff1690506105e98783838787815181106105dc576105dc611688565b6020026020010151610eba565b60ff821660009081526003602052604090208054610645918491600191906106129083906116b4565b8154811061062257610622611688565b6000918252602090912001546103989190600160201b900463ffffffff1661170e565b50508080610652906116f3565b915050610543565b5050505050565b604080518082019091526000808252602082015260ff83166000908152600360205260409020805463ffffffff841690811061069f5761069f611688565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b909104169181019190915290505b92915050565b600181815481106106ea57600080fd5b600091825260209091200154905081565b606060006107098484611029565b63ffffffff1667ffffffffffffffff8111156107275761072761138f565b604051908082528060200260200182016040528015610750578160200160208202803683370190505b50905060005b6001548110156107e05760006001828154811061077557610775611688565b90600052602060002001549050600061078f8288886111cc565b905063ffffffff80821614156107a65750506107ce565b81848263ffffffff16815181106107bf576107bf611688565b60200260200101818152505050505b806107d8816116f3565b915050610756565b509392505050565b604080518082018252600080825260208083018290528682526002815283822060ff87168352905291909120805463ffffffff841690811061082c5761082c611688565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b9091041691810191909152949350505050565b60ff83166000908152600360205260408120805482919063ffffffff851690811061089357610893611688565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b909204811693830193909352909250908516101561098d5760405162461bcd60e51b815260206004820152607d60248201527f496e64657852656769737472792e676574546f74616c4f70657261746f72734660448201527f6f7251756f72756d4174426c6f636b4e756d6265724279496e6465783a20707260648201527f6f766964656420696e64657820697320746f6f2066617220696e20746865207060848201527f61737420666f722070726f766964656420626c6f636b206e756d62657200000060a482015260c40161026b565b60ff85166000908152600360205260409020546109ac906001906116b4565b8363ffffffff1614610ae65760ff851660009081526003602052604081206109d58560016116cb565b63ffffffff16815481106109eb576109eb611688565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b90920481169383019390935290925090861610610ae45760405162461bcd60e51b815260206004820152607f60248201527f496e64657852656769737472792e676574546f74616c4f70657261746f72734660448201527f6f7251756f72756d4174426c6f636b4e756d6265724279496e6465783a20707260648201527f6f766964656420696e64657820697320746f6f2066617220696e20746865206660848201527f757475726520666f722070726f766964656420626c6f636b206e756d6265720060a482015260c40161026b565b505b60200151949350505050565b600084815260026020908152604080832060ff871684529091528120805482919063ffffffff8516908110610b2957610b29611688565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b9092048116938301939093529092509085161015610c235760405162461bcd60e51b815260206004820152607c60248201527f496e64657852656769737472792e6765744f70657261746f72496e646578466f60448201527f7251756f72756d4174426c6f636b4e756d6265724279496e6465783a2070726f60648201527f766964656420696e64657820697320746f6f2066617220696e2074686520706160848201527f737420666f722070726f766964656420626c6f636b206e756d6265720000000060a482015260c40161026b565b600086815260026020908152604080832060ff89168452909152902054610c4c906001906116b4565b8363ffffffff1614610d9057600086815260026020908152604080832060ff891684529091528120610c7f8560016116cb565b63ffffffff1681548110610c9557610c95611688565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b90920481169383019390935290925090861610610d8e5760405162461bcd60e51b815260206004820152607e60248201527f496e64657852656769737472792e6765744f70657261746f72496e646578466f60448201527f7251756f72756d4174426c6f636b4e756d6265724279496e6465783a2070726f60648201527f766964656420696e64657820697320746f6f2066617220696e2074686520667560848201527f7475726520666f722070726f766964656420626c6f636b206e756d626572000060a482015260c40161026b565b505b6020015195945050505050565b60ff811660009081526003602052604081205480610dbe5750600092915050565b60ff83166000908152600360205260409020610ddb6001836116b4565b81548110610deb57610deb611688565b600091825260209091200154600160201b900463ffffffff169392505050565b60408051808201825263ffffffff8381166020808401828152438416855260008981526002835286812060ff8a1680835290845287822080546001810182559083529184902087519201805493518716600160201b0267ffffffffffffffff199094169290961691909117919091179093558451928352820152909185917f6ee1e4f4075f3d067176140d34e87874244dd273294c05b2218133e49a2ba6f6910160405180910390a250505050565b600081815260026020908152604080832060ff8716845290915281208054610ee4906001906116b4565b81548110610ef457610ef4611688565b60009182526020808320919091015460ff87168352600390915260409091208054600160201b90920463ffffffff169250829160019190610f369083906116b4565b81548110610f4657610f46611688565b600091825260209091200154610f699190600160201b900463ffffffff1661170e565b63ffffffff16146110085760405162461bcd60e51b815260206004820152605e60248201527f496e64657852656769737472792e5f70726f636573734f70657261746f72526560448201527f6d6f76616c3a206f70657261746f724964546f53776170206973206e6f74207460648201527f6865206c617374206f70657261746f7220696e207468652071756f72756d0000608482015260a40161026b565b81851461101a5761101a828585610e0b565b61065a858563ffffffff610e0b565b60ff82166000908152600360205260408120548061104b5760009150506106d4565b60ff84166000908152600360205260408120805490919061106e5761106e611688565b60009182526020909120015463ffffffff90811690841610156110955760009150506106d4565b60005b6110a36001836116b4565b8111611187576000816110b76001856116b4565b6110c191906116b4565b60ff8716600090815260036020526040812080549293509091839081106110ea576110ea611688565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b909204811693830193909352909250908716106111725760ff8716600090815260036020526040902080548390811061114d5761114d611688565b600091825260209091200154600160201b900463ffffffff1694506106d49350505050565b5050808061117f906116f3565b915050611098565b5060ff8416600090815260036020526040812080549091906111ab576111ab611688565b600091825260209091200154600160201b900463ffffffff16949350505050565b600083815260026020908152604080832060ff86168452909152812054815b818110156112a1576000816112016001856116b4565b61120b91906116b4565b600088815260026020908152604080832060ff8b1684529091528120805492935090918390811061123e5761123e611688565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b9092048116938301939093529092509087161061128c5760200151935061045592505050565b50508080611299906116f3565b9150506111eb565b5063ffffffff95945050505050565b60008083601f8401126112c257600080fd5b50813567ffffffffffffffff8111156112da57600080fd5b6020830191508360208285010111156112f257600080fd5b9250929050565b60008060006040848603121561130e57600080fd5b83359250602084013567ffffffffffffffff81111561132c57600080fd5b611338868287016112b0565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b8181101561138357835163ffffffff1683529284019291840191600101611361565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600080600080606085870312156113bb57600080fd5b8435935060208086013567ffffffffffffffff808211156113db57600080fd5b6113e789838a016112b0565b9096509450604088013591508082111561140057600080fd5b818801915088601f83011261141457600080fd5b8135818111156114265761142661138f565b8060051b604051601f19603f8301168101818110858211171561144b5761144b61138f565b60405291825284820192508381018501918b83111561146957600080fd5b938501935b828510156114875784358452938501939285019261146e565b989b979a50959850505050505050565b803560ff811681146114a857600080fd5b919050565b803563ffffffff811681146114a857600080fd5b600080604083850312156114d457600080fd5b6114dd83611497565b91506114eb602084016114ad565b90509250929050565b60006020828403121561150657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561138357835183529284019291840191600101611529565b60008060006060848603121561155a57600080fd5b8335925061156a60208501611497565b9150611578604085016114ad565b90509250925092565b60008060006060848603121561159657600080fd5b61159f84611497565b925061156a602085016114ad565b600080600080608085870312156115c357600080fd5b843593506115d360208601611497565b92506115e1604086016114ad565b91506115ef606086016114ad565b905092959194509250565b60006020828403121561160c57600080fd5b61045582611497565b6020808252604d908201527f496e64657852656769737472792e6f6e6c795265676973747279436f6f72646960408201527f6e61746f723a2063616c6c6572206973206e6f7420746865207265676973747260608201526c3c9031b7b7b93234b730ba37b960991b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156116c6576116c661169e565b500390565b600063ffffffff8083168185168083038211156116ea576116ea61169e565b01949350505050565b60006000198214156117075761170761169e565b5060010190565b600063ffffffff8381169083168181101561172b5761172b61169e565b03939250505056fea26469706673582212200292dbe19e019324bb059088b10ded1902e922b3bf7ea054b0b465fc078a9e5a64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122007c3990e071012e67e928be8d71cb1c6b5ed96fee92e98c9e70cc231dee7232064736f6c634300080c0033","storage":{"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xe801d84fa97b50751dbf25036d067dcf18858bf","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0xc5a5c42992decbae36851359345fe25997f5c42d"}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061016a5760003560e01c80637439841f116100d1578063c49074421161008a578063e251ef5211610064578063e251ef521461053c578063e2c834451461055c578063f28824611461057c578063fe80b087146105b057600080fd5b8063c4907442146104dc578063c4d66de8146104fc578063dda3346c1461051c57600080fd5b80637439841f146103f557806374cdd7981461043957806387e0d2891461046d5780639b4e463414610494578063b725bceb146104a7578063baa7145a146104c757600080fd5b80633474aa16116101235780633474aa16146102f957806334bea20a146103195780633f65cf19146103545780634665bcda146103745780635d3f65b6146103a85780636fcd0e53146103c857600080fd5b80630b18ff66146101c05780630cd4649e146101fd5780631a5057be146102145780631d905d5c146102485780631f60c2bd146102945780633106ab53146102c857600080fd5b366101bb5734603760008282546101819190614750565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101cc57600080fd5b506033546101e0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020957600080fd5b506102126105d4565b005b34801561022057600080fd5b506101e07f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b34801561025457600080fd5b5061027c7f0000000000000000000000000000000000000000000000000000000737be760081565b6040516001600160401b0390911681526020016101f4565b3480156102a057600080fd5b5061027c7f000000000000000000000000000000000000000000000000000000002cb4178081565b3480156102d457600080fd5b506034546102e990600160401b900460ff1681565b60405190151581526020016101f4565b34801561030557600080fd5b5060345461027c906001600160401b031681565b34801561032557600080fd5b506102e9610334366004614784565b603560209081526000928352604080842090915290825290205460ff1681565b34801561036057600080fd5b5061021261036f366004614813565b61073d565b34801561038057600080fd5b506101e07f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b3480156103b457600080fd5b5060385461027c906001600160401b031681565b3480156103d457600080fd5b506103e86103e33660046148e1565b610c69565b6040516101f49190614932565b34801561040157600080fd5b5061042c6104103660046148e1565b600090815260366020526040902054600160c01b900460ff1690565b6040516101f4919061497a565b34801561044557600080fd5b506101e07f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561047957600080fd5b5060335461027c90600160a01b90046001600160401b031681565b6102126104a23660046149c9565b610d16565b3480156104b357600080fd5b506102126104c2366004614a3c565b610ec3565b3480156104d357600080fd5b50610212611291565b3480156104e857600080fd5b506102126104f7366004614ae4565b6112fc565b34801561050857600080fd5b50610212610517366004614b10565b611482565b34801561052857600080fd5b50610212610537366004614c2a565b61165a565b34801561054857600080fd5b50610212610557366004614cfb565b611783565b34801561056857600080fd5b50610212610577366004614ae4565b611b4e565b34801561058857600080fd5b5061027c7f000000000000000000000000000000000000000000000000000000006059f46081565b3480156105bc57600080fd5b506105c660375481565b6040519081526020016101f4565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190614df6565b156106865760405162461bcd60e51b815260040161067d90614e18565b60405180910390fd5b6033546001600160a01b031633146106b05760405162461bcd60e51b815260040161067d90614e75565b603454600160401b900460ff16156106da5760405162461bcd60e51b815260040161067d90614ebd565b6034805460ff60401b1916600160401b179055603354610702906001600160a01b0316611c88565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b031633146107675760405162461bcd60e51b815260040161067d90614e75565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f39190614df6565b156108105760405162461bcd60e51b815260040161067d90614e18565b60335489906001600160401b03600160a01b9091048116908216116108475760405162461bcd60e51b815260040161067d90614f0c565b603454600160401b900460ff166108bf5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b606482015260840161067d565b86851480156108cd57508483145b61095d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a40161067d565b42610973613f486001600160401b038d16614750565b10156109fc5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a40161067d565b60405163d1c64cc960e01b81526001600160401b038b166004820152610aa5907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190614fa7565b8a35610aa060208d018d614fc0565b611cbc565b6000805b88811015610b4957610b2b8c8c358c8c85818110610ac957610ac9615006565b9050602002016020810190610ade919061501c565b8b8b86818110610af057610af0615006565b9050602002810190610b029190614fc0565b8b8b88818110610b1457610b14615006565b9050602002810190610b269190615043565b611e44565b610b359083614750565b915080610b418161508c565b915050610aa9565b5060008113610bd55760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a206f766572666c6f7720696e20746f74616c416d6f756e74546f4260648201526b6552657374616b656457656960a01b608482015260a40161067d565b60335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f9091169063c2c51c4090604401600060405180830381600087803b158015610c4457600080fd5b505af1158015610c58573d6000803e3d6000fd5b505050505050505050505050505050565b610c916040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610cfc57610cfc6148fa565b6002811115610d0d57610d0d6148fa565b90525092915050565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614610d5e5760405162461bcd60e51b815260040161067d906150a7565b346801bc16d674ec80000014610dea5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a40161067d565b7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa6001600160a01b031663228951186801bc16d674ec8000008787610e2d612285565b8888886040518863ffffffff1660e01b8152600401610e5196959493929190615179565b6000604051808303818588803b158015610e6a57600080fd5b505af1158015610e7e573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610eb49291906151c8565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190614df6565b15610f6c5760405162461bcd60e51b815260040161067d90614e18565b8684148015610f7a57508382145b6110025760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f72496e646963657320616e642070726f6f6673206d757374206260648201526c0ca40e6c2daca40d8cadccee8d609b1b608482015260a40161067d565b42611018613f486001600160401b038c16614750565b101561109a5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e76657269667942616c616e63655570646174653a207370908201527f656369666965642074696d657374616d7020697320746f6f2066617220696e206064820152631c185cdd60e21b608482015260a40161067d565b60405163d1c64cc960e01b81526001600160401b038a16600482015261113e907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa15801561110b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f9190614fa7565b8735610aa060208a018a614fc0565b6000805b888110156111e2576111c48b8b8b8481811061116057611160615006565b9050602002016020810190611175919061501c565b8a358a8a8681811061118957611189615006565b905060200281019061119b91906151dc565b8989878181106111ad576111ad615006565b90506020028101906111bf9190615043565b6122ca565b6111ce90836151fc565b9150806111da8161508c565b915050611142565b506033546001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169163c2c51c409116611227633b9aca008561523d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b5050505050505050505050505050565b6033546001600160a01b031633146112bb5760405162461bcd60e51b815260040161067d90614e75565b603454600160401b900460ff16156112e55760405162461bcd60e51b815260040161067d90614ebd565b6033546112fa906001600160a01b0316611c88565b565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16146113445760405162461bcd60e51b815260040161067d906150a7565b611352633b9aca00826152d8565b156113dc5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a40161067d565b60006113ec633b9aca00836152ec565b60348054919250829160009061140c9084906001600160401b0316615300565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161146b91815260200190565b60405180910390a261147d838361273f565b505050565b600054610100900460ff16158080156114a25750600054600160ff909116105b806114bc5750303b1580156114bc575060005460ff166001145b61151f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161067d565b6000805460ff191660011790558015611542576000805461ff0019166101001790555b6001600160a01b0382166115b55760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b606482015260840161067d565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611656576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146116845760405162461bcd60e51b815260040161067d90614e75565b815183511461170f5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a40161067d565b60005b835181101561177d5761176b8284838151811061173157611731615006565b602002602001015186848151811061174b5761174b615006565b60200260200101516001600160a01b03166127499092919063ffffffff16565b806117758161508c565b915050611712565b50505050565b604051635ac86ab760e01b81526004808201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180e9190614df6565b1561182b5760405162461bcd60e51b815260040161067d90614e18565b838614801561183957508588145b801561184457508782145b6118b8576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e677468606482015260840161067d565b60405163d1c64cc960e01b81526001600160401b038c16600482015261195c907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190614fa7565b8b35610aa060208e018e614fc0565b604080518082019091526000808252602082015260005b83811015611a5c576000611a178d358d8d8581811061199457611994615006565b90506020028101906119a69190615328565b8c8c868181106119b8576119b8615006565b90506020028101906119ca9190614fc0565b8c8c888181106119dc576119dc615006565b90506020028101906119ee9190615043565b8c8c8a818110611a0057611a00615006565b9050602002810190611a129190615043565b61279b565b80518451919250908490611a2c908390614750565b9052506020808201519084018051611a459083906151fc565b905250819050611a548161508c565b915050611973565b50805115611a8b576033548151611a8b916001600160a01b031690611a8690633b9aca009061533f565b612be2565b602081015115611b405760335460208201516001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169263c2c51c4092911690611ae190633b9aca009061523d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611b2757600080fd5b505af1158015611b3b573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611b785760405162461bcd60e51b815260040161067d90614e75565b603754811115611c295760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c40161067d565b8060376000828254611c3b919061535e565b90915550506040518181526001600160a01b038316907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a26116568282612be2565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755611cb98147612be2565b50565b611cc86003602061533f565b8114611d585760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a40161067d565b611d9d82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925087915060039050612c70565b61177d5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c40161067d565b600080611e83848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611ef257611ef26148fa565b6002811115611f0357611f036148fa565b9052509050600081606001516002811115611f2057611f206148fa565b14611fc95760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c40161067d565b611fd1612285565b611fda90615375565b612016868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cac92505050565b1461209d5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a40161067d565b60006120db868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc192505050565b90506120eb8a87878b8b8e612cec565b6001606083015264ffffffffff891682526001600160401b038b16604083015261211481612f0d565b6001600160401b03908116602080850191825260008681526036909152604090819020855181549351928701518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606085015185939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156121b6576121b66148fa565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516122519392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b0316612276919061533f565b9b9a5050505050505050505050565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b6000806122db604086013588612fe4565b9050600061231b858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561238a5761238a6148fa565b600281111561239b5761239b6148fa565b815250509050896001600160401b031681604001516001600160401b0316106124525760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a40161067d565b60018160600151600281111561246a5761246a6148fa565b146124d25760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b606482015260840161067d565b6124db8a613019565b6001600160401b031661252087878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310392505050565b6001600160401b0316116125c3576000836001600160401b0316116125c35760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a40161067d565b6125dc8887876125d660208c018c614fc0565b8e612cec565b6125f58860408901356125ef8a80614fc0565b8d61311b565b6020810151600061260585612f0d565b6001600160401b0380821660208087019182528f8316604080890191825260008a8152603690935290912087518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606087015193945086939192839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156126b2576126b26148fa565b0217905550905050816001600160401b0316816001600160401b031614612730576040805164ffffffffff8d1681526001600160401b038e8116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a161272d8183613284565b95505b50505050509695505050505050565b611656828261329c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261147d9084906133b5565b60408051808201909152600080825260208201526127c06127bb89615408565b613487565b6033546001600160401b03600160a01b9091048116908216116127f55760405162461bcd60e51b815260040161067d90614f0c565b60006128036127bb8b615408565b90506000612843888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612870576128706148fa565b14156129275760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c40161067d565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156129e65760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a40161067d565b60008181526035602090815260408083206001600160401b03861684529091529020805460ff19166001179055612a1f8c87878e613497565b6000612a5d878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e7f92505050565b9050612a6d8d8a8a8e8e86612cec565b6000612aab888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e9792505050565b9050612ae98a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310392505050565b6001600160401b0316612b03612afe8f615408565b613eaf565b6001600160401b031610612bbb57603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352612bb093869388938a936001600160a01b03909316928892916060830190600160c01b900460ff166002811115612b9757612b976148fa565b6002811115612ba857612ba86148fa565b905250613ec1565b955050505050612bd5565b603354612bb090839086906001600160a01b0316846140d2565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8539091169063c0db354c9083906044016000604051808303818588803b158015612c5357600080fd5b505af1158015612c67573d6000803e3d6000fd5b50505050505050565b600083612c7e8685856141b0565b1495945050505050565b600081600081518110612c9d57612c9d615006565b60200260200101519050919050565b600081600181518110612c9d57612c9d615006565b6000612ce682600281518110612cd957612cd9615006565b60200260200101516142fc565b92915050565b612cf860036002615628565b8414612d715760405162461bcd60e51b815260206004820152604e602482015260008051602061579483398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161067d565b6005612d7f60286001614750565b612d899190614750565b612d9490602061533f565b8214612e025760405162461bcd60e51b8152602060048201526043602482015260008051602061579483398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a40161067d565b600064ffffffffff8216612e1860286001614750565b600b901b1790506000612e5d87878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436392505050565b9050612ea385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250859150869050612c70565b612f035760405162461bcd60e51b815260206004820152603d602482015260008051602061579483398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f66000000606482015260840161067d565b5050505050505050565b60007f000000000000000000000000000000000000000000000000000000002cb417806001600160401b0316826001600160401b031611612f5057506000919050565b6000633b9aca0080612f827f000000000000000000000000000000000000000000000000000000002cb4178086615300565b6001600160401b0316612f9591906152ec565b612f9f919061533f565b9050612fdd7f0000000000000000000000000000000000000000000000000000000737be76006001600160401b0316826001600160401b0316614610565b9392505050565b600080612ff2600484615634565b612ffd906040615658565b64ffffffffff16905061301184821b6142fc565b949350505050565b60007f000000000000000000000000000000000000000000000000000000006059f4606001600160401b0316826001600160401b031610156130c35760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e65736973000000000000000000606482015260840161067d565b6130cf600c6020615685565b6130f97f000000000000000000000000000000000000000000000000000000006059f46084615300565b612ce691906156ab565b6000612ce682600781518110612cd957612cd9615006565b600561312960266001614750565b6131339190614750565b61313e90602061533f565b82146131ae5760405162461bcd60e51b815260206004820152604460248201819052600080516020615794833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a40161067d565b60006131bb6004836156d1565b64ffffffffff169050806131d160266001614750565b600c901b17905061321c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250899150859050612c70565b61327c5760405162461bcd60e51b815260206004820152603e602482015260008051602061579483398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f660000606482015260840161067d565b505050505050565b6000612fdd6001600160401b038084169085166156e9565b804710156132ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161067d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613339576040519150601f19603f3d011682016040523d82523d6000602084013e61333e565b606091505b505090508061147d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161067d565b600061340a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166146269092919063ffffffff16565b80519091501561147d57808060200190518101906134289190614df6565b61147d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161067d565b6000612ce68261014001516142fc565b6134a2600280615628565b82146135165760405162461bcd60e51b815260206004820152604960248201526000805160206157b483398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a40161067d565b613522600d6002615628565b61353260c0830160a08401615728565b6001600160401b03161061359c5760405162461bcd60e51b815260206004820152603f60248201526000805160206157b483398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c6172676500606482015260840161067d565b6135a860046002615628565b6135b9610100830160e08401615728565b6001600160401b031610613625576040805162461bcd60e51b81526020600482015260248101919091526000805160206157b483398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c61726765606482015260840161067d565b61363160186002615628565b61364160e0830160c08401615728565b6001600160401b0316106136bb5760405162461bcd60e51b815260206004820152604760248201526000805160206157b483398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a40161067d565b6136c6600480614750565b6136d1906001614750565b6136dc90602061533f565b6136e68280614fc0565b90501461375a5760405162461bcd60e51b815260206004820152604860248201526000805160206157b483398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a40161067d565b61376660046003614750565b61377190602061533f565b61377e6040830183614fc0565b9050146137f85760405162461bcd60e51b815260206004820152604e60248201526000805160206157b483398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161067d565b6138046003602061533f565b6138116020830183614fc0565b90501461387f5760405162461bcd60e51b815260206004820152604260248201526000805160206157b483398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a40161067d565b61388b6004602061533f565b6138986060830183614fc0565b90501461390b5760405162461bcd60e51b815260206004820152604760248201526000805160206157b483398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a40161067d565b600d61391960186001614750565b613924906005614750565b61392f906001614750565b6139399190614750565b61394490602061533f565b6139516080830183614fc0565b9050146139da5760405162461bcd60e51b815260206004820152605860248201526000805160206157b483398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a40161067d565b60006139ec60c0830160a08401615728565b6001600160401b03166000613a03600d6001614750565b613a1360e0860160c08701615728565b6001600160401b0316901b600d613a2c60186001614750565b613a37906001614750565b613a419190614750565b601b901b1717179050613a9c613a5a6080840184614fc0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505061010085013584612c70565b613b0f5760405162461bcd60e51b815260206004820152604a60248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a40161067d565b613b66613b1f6020840184614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250610100880135935061012088013592509050612c70565b613bc65760405162461bcd60e51b815260206004820152603d60248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f66000000606482015260840161067d565b6049613c1e613bd86040850185614fc0565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061010085013561016086013584612c70565b613c905760405162461bcd60e51b815260206004820152604960248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a40161067d565b50613ce8613ca16060840184614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101608401356101408501356009612c70565b613d565760405162461bcd60e51b8152602060048201526044602482018190526000805160206157b4833981519152908201527f616c3a20496e76616c696420626c6f636b4e756d626572206d65726b6c6520706064820152633937b7b360e11b608482015260a40161067d565b6000613d69610100840160e08501615728565b6001600160401b0316613d7e60046001614750565b600e901b1790506000613dc386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436392505050565b9050613e13613dd28580614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101608601358385612c70565b612c675760405162461bcd60e51b815260206004820152604360248201526000805160206157b483398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a40161067d565b6000612ce682600181518110612cd957612cd9615006565b6000612ce682600381518110612cd957612cd9615006565b600060206130f98361012001516142fc565b604080518082019091526000808252602082015260007f0000000000000000000000000000000000000000000000000000000737be76006001600160401b0316846001600160401b03161115613f3857507f0000000000000000000000000000000000000000000000000000000737be7600613f3b565b50825b6040805180820190915260008082526020820152613f598286615300565b6001600160401b039081168252603480548492600091613f7b91859116615743565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550613fad828560200151613284565b602082810191909152600090850152600260608501819052506000888152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115614064576140646148fa565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a2603880548391906000906141639084906001600160401b0316615743565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156141cf5750602084516141cd91906152d8565b155b61425e5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a40161067d565b604080516020808201909252848152905b855181116142f2576142826002856152d8565b6142b5578151600052808601516020526020826040600060026107d05a03fa6142aa57600080fd5b6002840493506142e0565b8086015160005281516020526020826040600060026107d05a03fa6142d957600080fd5b6002840493505b6142eb602082614750565b905061426f565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161437491906152ec565b90506000816001600160401b0381111561439057614390614b2d565b6040519080825280602002602001820160405280156143b9578160200160208202803683370190505b50905060005b828110156144c0576002856143d4838361533f565b815181106143e4576143e4615006565b6020026020010151868360026143fa919061533f565b614405906001614750565b8151811061441557614415615006565b6020026020010151604051602001614437929190918252602082015260400190565b60408051601f19818403018152908290526144519161576e565b602060405180830381855afa15801561446e573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144919190614fa7565b8282815181106144a3576144a3615006565b6020908102919091010152806144b88161508c565b9150506143bf565b506144cc6002836152ec565b91505b81156145ec5760005b828110156145d9576002826144ed838361533f565b815181106144fd576144fd615006565b602002602001015183836002614513919061533f565b61451e906001614750565b8151811061452e5761452e615006565b6020026020010151604051602001614550929190918252602082015260400190565b60408051601f198184030181529082905261456a9161576e565b602060405180830381855afa158015614587573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906145aa9190614fa7565b8282815181106145bc576145bc615006565b6020908102919091010152806145d18161508c565b9150506144d8565b506145e56002836152ec565b91506144cf565b806000815181106145ff576145ff615006565b602002602001015192505050919050565b600081831061461f5781612fdd565b5090919050565b60606130118484600085856001600160a01b0385163b6146885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161067d565b600080866001600160a01b031685876040516146a4919061576e565b60006040518083038185875af1925050503d80600081146146e1576040519150601f19603f3d011682016040523d82523d6000602084013e6146e6565b606091505b50915091506146f6828286614701565b979650505050505050565b60608315614710575081612fdd565b8251156147205782518084602001fd5b8160405162461bcd60e51b815260040161067d9190615780565b634e487b7160e01b600052601160045260246000fd5b600082198211156147635761476361473a565b500190565b80356001600160401b038116811461477f57600080fd5b919050565b6000806040838503121561479757600080fd5b823591506147a760208401614768565b90509250929050565b6000604082840312156147c257600080fd5b50919050565b60008083601f8401126147da57600080fd5b5081356001600160401b038111156147f157600080fd5b6020830191508360208260051b850101111561480c57600080fd5b9250929050565b60008060008060008060008060a0898b03121561482f57600080fd5b61483889614768565b975060208901356001600160401b038082111561485457600080fd5b6148608c838d016147b0565b985060408b013591508082111561487657600080fd5b6148828c838d016147c8565b909850965060608b013591508082111561489b57600080fd5b6148a78c838d016147c8565b909650945060808b01359150808211156148c057600080fd5b506148cd8b828c016147c8565b999c989b5096995094979396929594505050565b6000602082840312156148f357600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061492e57634e487b7160e01b600052602160045260246000fd5b9052565b60006080820190506001600160401b038084511683528060208501511660208401528060408501511660408401525060608301516149736060840182614910565b5092915050565b60208101612ce68284614910565b60008083601f84011261499a57600080fd5b5081356001600160401b038111156149b157600080fd5b60208301915083602082850101111561480c57600080fd5b6000806000806000606086880312156149e157600080fd5b85356001600160401b03808211156149f857600080fd5b614a0489838a01614988565b90975095506020880135915080821115614a1d57600080fd5b50614a2a88828901614988565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614a5857600080fd5b614a6189614768565b975060208901356001600160401b0380821115614a7d57600080fd5b614a898c838d016147c8565b909950975060408b0135915080821115614aa257600080fd5b614aae8c838d016147b0565b965060608b013591508082111561489b57600080fd5b6001600160a01b0381168114611cb957600080fd5b803561477f81614ac4565b60008060408385031215614af757600080fd5b8235614b0281614ac4565b946020939093013593505050565b600060208284031215614b2257600080fd5b8135612fdd81614ac4565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715614b6657614b66614b2d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b9457614b94614b2d565b604052919050565b60006001600160401b03821115614bb557614bb5614b2d565b5060051b60200190565b600082601f830112614bd057600080fd5b81356020614be5614be083614b9c565b614b6c565b82815260059290921b84018101918181019086841115614c0457600080fd5b8286015b84811015614c1f5780358352918301918301614c08565b509695505050505050565b600080600060608486031215614c3f57600080fd5b83356001600160401b0380821115614c5657600080fd5b818601915086601f830112614c6a57600080fd5b81356020614c7a614be083614b9c565b82815260059290921b8401810191818101908a841115614c9957600080fd5b948201945b83861015614cc0578535614cb181614ac4565b82529482019490820190614c9e565b97505087013592505080821115614cd657600080fd5b50614ce386828701614bbf565b925050614cf260408501614ad9565b90509250925092565b60008060008060008060008060008060c08b8d031215614d1a57600080fd5b614d238b614768565b995060208b01356001600160401b0380821115614d3f57600080fd5b614d4b8e838f016147b0565b9a5060408d0135915080821115614d6157600080fd5b614d6d8e838f016147c8565b909a50985060608d0135915080821115614d8657600080fd5b614d928e838f016147c8565b909850965060808d0135915080821115614dab57600080fd5b614db78e838f016147c8565b909650945060a08d0135915080821115614dd057600080fd5b50614ddd8d828e016147c8565b915080935050809150509295989b9194979a5092959850565b600060208284031215614e0857600080fd5b81518015158114612fdd57600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6020808252606f908201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60408201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520666f60608201527f722074696d657374616d70206166746572206d6f7374526563656e745769746860808201526e064726177616c54696d657374616d7608c1b60a082015260c00190565b600060208284031215614fb957600080fd5b5051919050565b6000808335601e19843603018112614fd757600080fd5b8301803591506001600160401b03821115614ff157600080fd5b60200191503681900382131561480c57600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561502e57600080fd5b813564ffffffffff81168114612fdd57600080fd5b6000808335601e1984360301811261505a57600080fd5b8301803591506001600160401b0382111561507457600080fd5b6020019150600581901b360382131561480c57600080fd5b60006000198214156150a0576150a061473a565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561513c578181015183820152602001615124565b8381111561177d5750506000910152565b60008151808452615165816020860160208601615121565b601f01601f19169290920160200192915050565b60808152600061518d60808301888a6150f8565b828103602084015261519f818861514d565b905082810360408401526151b48186886150f8565b915050826060830152979650505050505050565b6020815260006130116020830184866150f8565b60008235605e198336030181126151f257600080fd5b9190910192915050565b600080821280156001600160ff1b038490038513161561521e5761521e61473a565b600160ff1b83900384128116156152375761523761473a565b50500190565b60006001600160ff1b03818413828413808216868404861116156152635761526361473a565b600160ff1b60008712828116878305891216156152825761528261473a565b6000871292508782058712848416161561529e5761529e61473a565b878505871281841616156152b4576152b461473a565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826152e7576152e76152c2565b500690565b6000826152fb576152fb6152c2565b500490565b60006001600160401b03838116908316818110156153205761532061473a565b039392505050565b6000823561017e198336030181126151f257600080fd5b60008160001904831182151516156153595761535961473a565b500290565b6000828210156153705761537061473a565b500390565b805160208083015191908110156147c25760001960209190910360031b1b16919050565b600082601f8301126153aa57600080fd5b81356001600160401b038111156153c3576153c3614b2d565b6153d6601f8201601f1916602001614b6c565b8181528460208386010111156153eb57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610180823603121561541b57600080fd5b615423614b43565b82356001600160401b038082111561543a57600080fd5b61544636838701615399565b8352602085013591508082111561545c57600080fd5b61546836838701615399565b6020840152604085013591508082111561548157600080fd5b61548d36838701615399565b604084015260608501359150808211156154a657600080fd5b6154b236838701615399565b606084015260808501359150808211156154cb57600080fd5b506154d836828601615399565b6080830152506154ea60a08401614768565b60a08201526154fb60c08401614768565b60c082015261550c60e08401614768565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600181815b8085111561557f5781600019048211156155655761556561473a565b8085161561557257918102915b93841c9390800290615549565b509250929050565b60008261559657506001612ce6565b816155a357506000612ce6565b81600181146155b957600281146155c3576155df565b6001915050612ce6565b60ff8411156155d4576155d461473a565b50506001821b612ce6565b5060208310610133831016604e8410600b8410161715615602575081810a612ce6565b61560c8383615544565b80600019048211156156205761562061473a565b029392505050565b6000612fdd8383615587565b600064ffffffffff8084168061564c5761564c6152c2565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561567c5761567c61473a565b02949350505050565b60006001600160401b038083168185168183048111821515161561567c5761567c61473a565b60006001600160401b03808416806156c5576156c56152c2565b92169190910492915050565b600064ffffffffff808416806156c5576156c56152c2565b60008083128015600160ff1b8501841216156157075761570761473a565b6001600160ff1b03840183138116156157225761572261473a565b50500390565b60006020828403121561573a57600080fd5b612fdd82614768565b60006001600160401b038083168185168083038211156157655761576561473a565b01949350505050565b600082516151f2818460208701615121565b602081526000612fdd602083018461514d56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746f426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220250a089a9d82d132551a5c21cef0ddeca55257e52f54a8189aee31305a8d95d264736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x322813fd9a801c5507c9de605d63cea4f2ce6c44":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063161a334d146100515780631f5ac1b214610066578063de29fac01461008f578063e8bb9ae6146100bd575b600080fd5b61006461005f366004610d03565b6100fe565b005b610079610074366004610d7c565b61045b565b6040516100869190610dac565b60405180910390f35b6100af61009d366004610d7c565b60006020819052908152604090205481565b604051908152602001610086565b6100e66100cb366004610dc3565b6001602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610086565b6000610109836104f6565b33600090815260208190526040902054909150156101ac5760405162461bcd60e51b815260206004820152604f60248201527f424c535075626c69634b6579436f6d70656e6469756d2e72656769737465724260448201527f4c535075626c69634b65793a206f70657261746f7220616c726561647920726560648201526e6769737465726564207075626b657960881b608482015260a4015b60405180910390fd5b6000818152600160205260409020546001600160a01b03161561024a5760405162461bcd60e51b815260206004820152604a60248201527f424c535075626c69634b6579436f6d70656e6469756d2e72656769737465724260448201527f4c535075626c69634b65793a207075626c6963206b657920616c7265616479206064820152691c9959da5cdd195c995960b21b608482015260a4016101a3565b60006102553361045b565b8551602080880151875188830151885189850151875186890151604051999a506000997f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001996102ad9990989796959493929101610e05565b6040516020818303038152906040528051906020012060001c6102d09190610e51565b90506103376102e96102e28784610539565b88906105d0565b6102f1610664565b61033161032a85610324604080518082018252600080825260209182015281518083019092526001825260029082015290565b90610539565b86906105d0565b87610724565b6103ec5760405162461bcd60e51b815260206004820152607460248201527f424c535075626c69634b6579436f6d70656e6469756d2e72656769737465724260448201527f4c535075626c69634b65793a2065697468657220746865204731207369676e6160648201527f747572652069732077726f6e672c206f7220473120616e6420473220707269766084820152730c2e8ca40d6caf240c8de40dcdee840dac2e8c6d60631b60a482015260c4016101a3565b3360008181526020818152604080832087905586835260019091529081902080546001600160a01b03191683179055517fe3fb6613af2e8930cf85d47fcf6db10192224a64c6cbe8023e0eee1ba38280419061044b9088908890610e73565b60405180910390a2505050505050565b60408051808201909152600080825260208201526040516bffffffffffffffffffffffff19606084811b8216602084015230901b1660348201524660488201527f456967656e4c617965725f424e3235345f5075626b65795f52656769737472616068820152633a34b7b760e11b60888201526104f090608c0160405160208183030381529060405280519060200120610991565b92915050565b60008160000151826020015160405160200161051c929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152610555610b4b565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa90508080156105885761058a565bfe5b50806105c85760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b60448201526064016101a3565b505092915050565b60408051808201909152600080825260208201526105ec610b69565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa90508080156105885750806105c85760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b60448201526064016101a3565b61066c610b87565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b604080518082018252858152602080820185905282518084019093528583528201839052600091610753610bac565b60005b600281101561091857600061076c826006610ed9565b905084826002811061078057610780610ead565b60200201515183610792836000610ef8565b600c81106107a2576107a2610ead565b60200201528482600281106107b9576107b9610ead565b602002015160200151838260016107d09190610ef8565b600c81106107e0576107e0610ead565b60200201528382600281106107f7576107f7610ead565b602002015151518361080a836002610ef8565b600c811061081a5761081a610ead565b602002015283826002811061083157610831610ead565b602002015151600160200201518361084a836003610ef8565b600c811061085a5761085a610ead565b602002015283826002811061087157610871610ead565b60200201516020015160006002811061088c5761088c610ead565b60200201518361089d836004610ef8565b600c81106108ad576108ad610ead565b60200201528382600281106108c4576108c4610ead565b6020020151602001516001600281106108df576108df610ead565b6020020151836108f0836005610ef8565b600c811061090057610900610ead565b6020020152508061091081610f10565b915050610756565b50610921610bcb565b60006020826101808560086107d05a03fa90508080156105885750806109815760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016101a3565b5051151598975050505050505050565b6040805180820190915260008082526020820152600080806109c1600080516020610f2c83398151915286610e51565b90505b6109cd81610a21565b9093509150600080516020610f2c833981519152828309831415610a07576040805180820190915290815260208101919091529392505050565b600080516020610f2c8339815191526001820890506109c4565b60008080600080516020610f2c8339815191526003600080516020610f2c83398151915286600080516020610f2c833981519152888909090890506000610a97827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52600080516020610f2c833981519152610aa3565b91959194509092505050565b600080610aae610bcb565b610ab6610be9565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828015610588575082610b405760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c75726500000000000060448201526064016101a3565b505195945050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280610b9a610c07565b8152602001610ba7610c07565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610c5e57610c5e610c25565b60405290565b600060408284031215610c7657600080fd5b6040516040810181811067ffffffffffffffff82111715610c9957610c99610c25565b604052823581526020928301359281019290925250919050565b600082601f830112610cc457600080fd5b610ccc610c3b565b806040840185811115610cde57600080fd5b845b81811015610cf8578035845260209384019301610ce0565b509095945050505050565b6000806000838503610100811215610d1a57600080fd5b610d248686610c64565b9350610d338660408701610c64565b92506080607f1982011215610d4757600080fd5b50610d50610c3b565b610d5d8660808701610cb3565b8152610d6c8660c08701610cb3565b6020820152809150509250925092565b600060208284031215610d8e57600080fd5b81356001600160a01b0381168114610da557600080fd5b9392505050565b8151815260208083015190820152604081016104f0565b600060208284031215610dd557600080fd5b5035919050565b8060005b6002811015610dff578151845260209384019390910190600101610de0565b50505050565b888152876020820152866040820152856060820152610e276080820186610ddc565b610e3460c0820185610ddc565b610100810192909252610120820152610140019695505050505050565b600082610e6e57634e487b7160e01b600052601260045260246000fd5b500690565b825181526020808401519082015260c08101610e93604083018451610ddc565b6020830151610ea56080840182610ddc565b509392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615610ef357610ef3610ec3565b500290565b60008219821115610f0b57610f0b610ec3565b500190565b6000600019821415610f2457610f24610ec3565b506001019056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220c9a971c5b6fa7787af46472b7d89da2efb5b1fa7f969a9a6c8801e4f2c365c5664736f6c634300080c0033","storage":{}},"0x36c02da8a0983159322a80ffe9f24b1acff8b570":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80636b532e9e1161010f5780638b00ce7c116100a2578063f5c9899d11610071578063f5c9899d14610507578063f63c5bab1461052d578063f8c8765e14610535578063fabc1cbc1461054857600080fd5b80638b00ce7c146104b25780638da5cb5b146104c2578063cefdc1d4146104d3578063f2fde38b146104f457600080fd5b8063715018a6116100de578063715018a61461047657806372d18e8d1461047e5780637afa1eed1461048c578063886f11951461049f57600080fd5b80636b532e9e146104085780636b92787e1461041b5780636d14a9871461042e5780636efb46361461045557600080fd5b80633563b0d1116101875780635baec9a0116101565780635baec9a0146103a35780635c975abb146103b65780635decc3f5146103be57806368304835146103e157600080fd5b80633563b0d1146103285780634f739f7414610348578063595c6a67146103685780635ac86ab71461037057600080fd5b8063245a7bfc116101c3578063245a7bfc146102885780632cb223d5146102b35780632d89f6fc146102e15780633561deb11461030157600080fd5b806310d67a2f146101f5578063136439dd1461020a578063171f1d5b1461021d5780631ad431891461024c575b600080fd5b6102086102033660046140b6565b61055b565b005b6102086102183660046140da565b610617565b61023061022b366004614258565b610756565b6040805192151583529015156020830152015b60405180910390f35b6102737f000000000000000000000000000000000000000000000000000000000000001e81565b60405163ffffffff9091168152602001610243565b609b5461029b906001600160a01b031681565b6040516001600160a01b039091168152602001610243565b6102d36102c13660046142c6565b60996020526000908152604090205481565b604051908152602001610243565b6102d36102ef3660046142c6565b60986020526000908152604090205481565b61029b7f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc981565b61033b6103363660046142e3565b6108e0565b604051610243919061442a565b61035b610356366004614485565b610c59565b6040516102439190614589565b6102086112dd565b61039361037e366004614644565b606654600160ff9092169190911b9081161490565b6040519015158152602001610243565b6102086103b136600461492a565b6113a4565b6066546102d3565b6103936103cc3660046142c6565b609a6020526000908152604090205460ff1681565b61029b7f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c81565b61020861041636600461499e565b611823565b610208610429366004614a24565b6122e1565b61029b7f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304281565b610468610463366004614a7f565b612482565b604051610243929190614b3f565b610208612eee565b60975463ffffffff16610273565b609c5461029b906001600160a01b031681565b60655461029b906001600160a01b031681565b6097546102739063ffffffff1681565b6033546001600160a01b031661029b565b6104e66104e1366004614b88565b612f02565b604051610243929190614bca565b6102086105023660046140b6565b613094565b7f000000000000000000000000000000000000000000000000000000000000001e610273565b610273606481565b610208610543366004614beb565b61310a565b6102086105563660046140da565b61325b565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d29190614c47565b6001600160a01b0316336001600160a01b03161461060b5760405162461bcd60e51b815260040161060290614c64565b60405180910390fd5b610614816133b7565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561065f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106839190614cae565b61069f5760405162461bcd60e51b815260040161060290614cd0565b606654818116146107185760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610602565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018787600001518860200151886000015160006002811061079e5761079e614d18565b60200201518951600160200201518a602001516000600281106107c3576107c3614d18565b60200201518b602001516001600281106107df576107df614d18565b602090810291909101518c518d83015160405161083c9a99989796959401988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6040516020818303038152906040528051906020012060001c61085f9190614d2e565b90506108d261087861087188846134ae565b8690613545565b6108806135d9565b6108c86108b9856108b3604080518082018252600080825260209182015281518083019092526001825260029082015290565b906134ae565b6108c28c613699565b90613545565b886201d4c0613729565b909890975095505050505050565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610922573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109469190614c47565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ac9190614c47565b9050600085516001600160401b038111156109c9576109c96140f3565b6040519080825280602002602001820160405280156109fc57816020015b60608152602001906001900390816109e75790505b50905060005b8651811015610c4e576000878281518110610a1f57610a1f614d18565b016020015160405163889ae3e560e01b815260f89190911c6004820181905263ffffffff8916602483015291506000906001600160a01b0386169063889ae3e590604401600060405180830381865afa158015610a80573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aa89190810190614d50565b905080516001600160401b03811115610ac357610ac36140f3565b604051908082528060200260200182016040528015610b0857816020015b6040805180820190915260008082526020820152815260200190600190039081610ae15790505b50848481518110610b1b57610b1b614d18565b602002602001018190525060005b8151811015610c38576000828281518110610b4657610b46614d18565b6020908102919091018101516040805180820182528281529051631b32722560e01b81526004810183905260ff8816602482015263ffffffff8e166044820152919350918201906001600160a01b038b1690631b32722590606401602060405180830381865afa158015610bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be29190614de0565b6001600160601b0316815250868681518110610c0057610c00614d18565b60200260200101518381518110610c1957610c19614d18565b6020026020010181905250508080610c3090614e1f565b915050610b29565b5050508080610c4690614e1f565b915050610a02565b509695505050505050565b610c846040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce89190614c47565b9050610d156040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516385020d4960e01b81526001600160a01b038a16906385020d4990610d45908b9089908990600401614e3a565b600060405180830381865afa158015610d62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d8a9190810190614e84565b815260405163e192e9ad60e01b81526001600160a01b0383169063e192e9ad90610dbc908b908b908b90600401614f3b565b600060405180830381865afa158015610dd9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e019190810190614e84565b6040820152856001600160401b03811115610e1e57610e1e6140f3565b604051908082528060200260200182016040528015610e5157816020015b6060815260200190600190039081610e3c5790505b50606082015260005b60ff81168711156111ee576000856001600160401b03811115610e7f57610e7f6140f3565b604051908082528060200260200182016040528015610ea8578160200160208202803683370190505b5083606001518360ff1681518110610ec257610ec2614d18565b602002602001018190525060005b868110156110ee5760008c6001600160a01b0316633064620d8a8a85818110610efb57610efb614d18565b905060200201358e88600001518681518110610f1957610f19614d18565b60200260200101516040518463ffffffff1660e01b8152600401610f569392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190614f64565b90508a8a8560ff16818110610fae57610fae614d18565b6001600160c01b03841692013560f81c9190911c6001908116141590506110db57856001600160a01b031663480858668a8a85818110610ff057610ff0614d18565b905060200201358d8d8860ff1681811061100c5761100c614d18565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110869190614f8d565b85606001518560ff168151811061109f5761109f614d18565b602002602001015184815181106110b8576110b8614d18565b63ffffffff90921660209283029190910190910152826110d781614e1f565b9350505b50806110e681614e1f565b915050610ed0565b506000816001600160401b03811115611109576111096140f3565b604051908082528060200260200182016040528015611132578160200160208202803683370190505b50905060005b828110156111b35784606001518460ff168151811061115957611159614d18565b6020026020010151818151811061117257611172614d18565b602002602001015182828151811061118c5761118c614d18565b63ffffffff90921660209283029190910190910152806111ab81614e1f565b915050611138565b508084606001518460ff16815181106111ce576111ce614d18565b6020026020010181905250505080806111e690614faa565b915050610e5a565b506000896001600160a01b0316633561deb16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112539190614c47565b60405163eda1076360e01b81529091506001600160a01b0382169063eda1076390611286908b908b908e90600401614fca565b600060405180830381865afa1580156112a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112cb9190810190614e84565b60208301525098975050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113499190614cae565b6113655760405162461bcd60e51b815260040161060290614cd0565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b609b546001600160a01b031633146113fe5760405162461bcd60e51b815260206004820152601d60248201527f41676772656761746f72206d757374206265207468652063616c6c65720000006044820152606401610602565b600061141060408501602086016142c6565b90503660006114226040870187614ff4565b9092509050600061143960808801606089016142c6565b90506098600061144c60208901896142c6565b63ffffffff1663ffffffff1681526020019081526020016000205487604051602001611478919061503a565b60405160208183030381529060405280519060200120146115015760405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608401610602565b600060998161151360208a018a6142c6565b63ffffffff1663ffffffff16815260200190815260200160002054146115905760405162461bcd60e51b815260206004820152602c60248201527f41676772656761746f722068617320616c726561647920726573706f6e64656460448201526b20746f20746865207461736b60a01b6064820152608401610602565b6115ba7f000000000000000000000000000000000000000000000000000000000000001e856150db565b63ffffffff164363ffffffff16111561162b5760405162461bcd60e51b815260206004820152602d60248201527f41676772656761746f722068617320726573706f6e64656420746f207468652060448201526c7461736b20746f6f206c61746560981b6064820152608401610602565b60008660405160200161163e9190615121565b6040516020818303038152906040528051906020012090506000806116668387878a8c612482565b9150915060005b85811015611765578460ff168360200151828151811061168f5761168f614d18565b60200260200101516116a1919061512f565b6001600160601b03166064846000015183815181106116c2576116c2614d18565b60200260200101516001600160601b03166116dd919061515e565b1015611753576040805162461bcd60e51b81526020600482015260248101919091527f5369676e61746f7269657320646f206e6f74206f776e206174206c656173742060448201527f7468726573686f6c642070657263656e74616765206f6620612071756f72756d6064820152608401610602565b8061175d81614e1f565b91505061166d565b5060408051808201825263ffffffff43168152602080820184905291519091611792918c9184910161517d565b60405160208183030381529060405280519060200120609960008c60000160208101906117bf91906142c6565b63ffffffff1663ffffffff168152602001908152602001600020819055507f349c1ee60e4e8972ee9dba642c1774543d5c4136879b7f4caaf04bf81a487a2a8a8260405161180e92919061517d565b60405180910390a15050505050505050505050565b600061183260208501856142c6565b63ffffffff81166000908152609960205260409020549091508535906118a45760405162461bcd60e51b815260206004820152602160248201527f5461736b206861736e2774206265656e20726573706f6e64656420746f2079656044820152601d60fa1b6064820152608401610602565b84846040516020016118b79291906151a9565b60408051601f19818403018152918152815160209283012063ffffffff851660009081526099909352912054146119565760405162461bcd60e51b815260206004820152603d60248201527f5461736b20726573706f6e736520646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608401610602565b63ffffffff82166000908152609a602052604090205460ff16156119ee5760405162461bcd60e51b815260206004820152604360248201527f54686520726573706f6e736520746f2074686973207461736b2068617320616c60448201527f7265616479206265656e206368616c6c656e676564207375636365737366756c606482015262363c9760e91b608482015260a401610602565b60646119fd60208601866142c6565b611a0791906150db565b63ffffffff164363ffffffff161115611a885760405162461bcd60e51b815260206004820152603760248201527f546865206368616c6c656e676520706572696f6420666f72207468697320746160448201527f736b2068617320616c726561647920657870697265642e0000000000000000006064820152608401610602565b6000611a94828061515e565b9050602086013581146001811415611ae257604051339063ffffffff8616907ffd3e26beeb5967fc5a57a0446914eabc45b4aa474c67a51b4b5160cac60ddb0590600090a3505050506122db565b6000611b5a7f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f373042611b1560408c018c614ff4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103369250505060408d0160208e016142c6565b9050600086516001600160401b03811115611b7757611b776140f3565b604051908082528060200260200182016040528015611ba0578160200160208202803683370190505b50905060005b8751811015611c0057611bd1888281518110611bc457611bc4614d18565b602002602001015161394d565b828281518110611be357611be3614d18565b602090810291909101015280611bf881614e1f565b915050611ba6565b506000611c1360408c0160208d016142c6565b82604051602001611c259291906151df565b60405160208183030381529060405280519060200120905088602001358114611ccf5760405162461bcd60e51b815260206004820152605060248201527f546865207075626b657973206f66206e6f6e2d7369676e696e67206f7065726160448201527f746f727320737570706c69656420627920746865206368616c6c656e6765722060648201526f30b932903737ba1031b7b93932b1ba1760811b608482015260a401610602565b600088516001600160401b03811115611cea57611cea6140f3565b604051908082528060200260200182016040528015611d13578160200160208202803683370190505b50905060005b8951811015611e67577f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031663187548c86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da49190614c47565b6001600160a01b031663e8bb9ae6858381518110611dc457611dc4614d18565b60200260200101516040518263ffffffff1660e01b8152600401611dea91815260200190565b602060405180830381865afa158015611e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2b9190614c47565b828281518110611e3d57611e3d614d18565b6001600160a01b039092166020928302919091019091015280611e5f81614e1f565b915050611d19565b5060005b84518110156122895760005b858281518110611e8957611e89614d18565b602002602001015151811015612276576000868381518110611ead57611ead614d18565b60200260200101518281518110611ec657611ec6614d18565b602002602001015160000151905060007f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031663187548c86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f589190614c47565b6001600160a01b031663e8bb9ae6836040518263ffffffff1660e01b8152600401611f8591815260200190565b602060405180830381865afa158015611fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc69190614c47565b90507f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b0316633998fdd36040518163ffffffff1660e01b8152600401602060405180830381865afa158015612026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204a9190614c47565b6001600160a01b031663b13442716040518163ffffffff1660e01b8152600401602060405180830381865afa158015612087573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ab9190614c47565b6040516372c1cc1b60e11b81526001600160a01b038381166004830152919091169063e583983690602401602060405180830381865afa1580156120f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121179190614cae565b61226157600160005b86518110156121735786818151811061213b5761213b614d18565b60200260200101516001600160a01b0316836001600160a01b0316141561216157612173565b8061216b81614e1f565b915050612120565b506001811515141561225f577f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b0316633998fdd36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122019190614c47565b604051630e323b9960e21b81526001600160a01b03848116600483015291909116906338c8ee6490602401600060405180830381600087803b15801561224657600080fd5b505af115801561225a573d6000803e3d6000fd5b505050505b505b5050808061226e90614e1f565b915050611e77565b508061228181614e1f565b915050611e6b565b5063ffffffff88166000818152609a6020526040808220805460ff19166001179055513392917fc20d1bb0f1623680306b83d4ff4bb99a2beb9d86d97832f3ca40fd13a29df1ec91a350505050505050505b50505050565b609c546001600160a01b031633146123455760405162461bcd60e51b815260206004820152602160248201527f5461736b2067656e657261746f72206d757374206265207468652063616c6c656044820152603960f91b6064820152608401610602565b61237c604051806080016040528060008152602001600063ffffffff16815260200160608152602001600063ffffffff1681525090565b84815263ffffffff438116602080840191909152908516606083015260408051601f8501839004830281018301909152838152908490849081908401838280828437600092019190915250505050604080830191909152516123e2908290602001615253565b60408051601f1981840301815282825280516020918201206097805463ffffffff9081166000908152609890945293909220555416907f1695b8d06ec800b4615e745cfb5bd00c1f2875615d42925c3b5afa543bb24c4890612445908490615253565b60405180910390a26097546124619063ffffffff1660016150db565b6097805463ffffffff191663ffffffff929092169190911790555050505050565b60408051808201909152606080825260208201526040805180820190915260008082526020820181905290815b8681101561269f577f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031663c1af6b248989848181106124f8576124f8614d18565b9050013560f81c60f81b60f81c888860a00151858151811061251c5761251c614d18565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015612578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259c91906152b8565b6001600160401b0319166125bf86604001518381518110611bc457611bc4614d18565b67ffffffffffffffff19161461265b5760405162461bcd60e51b8152602060048201526061602482015260008051602061541a83398151915260448201527f7265733a2071756f72756d41706b206861736820696e2073746f72616765206460648201527f6f6573206e6f74206d617463682070726f76696465642071756f72756d2061706084820152606b60f81b60a482015260c401610602565b61268b8560400151828151811061267457612674614d18565b60200260200101518361354590919063ffffffff16565b91508061269781614e1f565b9150506124af565b506040805180820190915260608082526020820152866001600160401b038111156126cc576126cc6140f3565b6040519080825280602002602001820160405280156126f5578160200160208202803683370190505b506020820152866001600160401b03811115612713576127136140f3565b60405190808252806020026020018201604052801561273c578160200160208202803683370190505b5081526020850151516000906001600160401b0381111561275f5761275f6140f3565b604051908082528060200260200182016040528015612788578160200160208202803683370190505b50905060008660200151516001600160401b038111156127aa576127aa6140f3565b6040519080825280602002602001820160405280156127d3578160200160208202803683370190505b50905060006128178b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061399092505050565b905060005b886020015151811015612a825761284289602001518281518110611bc457611bc4614d18565b84828151811061285457612854614d18565b6020908102919091010152801561290c57836128716001836152e3565b8151811061288157612881614d18565b602002602001015160001c84828151811061289e5761289e614d18565b602002602001015160001c1161290c576040805162461bcd60e51b815260206004820152602481019190915260008051602061541a83398151915260448201527f7265733a206e6f6e5369676e65725075626b657973206e6f7420736f727465646064820152608401610602565b7f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b0316633064620d85838151811061294d5761294d614d18565b60200260200101518c8c60000151858151811061296c5761296c614d18565b60200260200101516040518463ffffffff1660e01b81526004016129a99392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa1580156129c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ea9190614f64565b6001600160c01b0316838281518110612a0557612a05614d18565b602002602001018181525050612a6e612a67612a3b84868581518110612a2d57612a2d614d18565b602002602001015116613af9565b612a618c602001518581518110612a5457612a54614d18565b6020026020010151613b2a565b90613bc5565b8790613545565b955080612a7a81614e1f565b91505061281c565b505060005b60ff81168a1115612dc25760008b8b8360ff16818110612aa957612aa9614d18565b9050013560f81c60f81b60f81c90507f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c6001600160a01b031663c8294c56828c8c60c001518660ff1681518110612b0257612b02614d18565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015612b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b829190614de0565b85602001518360ff1681518110612b9b57612b9b614d18565b6001600160601b03909216602092830291909101820152850151805160ff8416908110612bca57612bca614d18565b602002602001015185600001518360ff1681518110612beb57612beb614d18565b60200260200101906001600160601b031690816001600160601b03168152505060005b8960200151518163ffffffff161015612db8576000612c54858363ffffffff1681518110612c3e57612c3e614d18565b60200260200101518460ff161c60019081161490565b15612da5577f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c6001600160a01b031663a43cde89848e898663ffffffff1681518110612ca257612ca2614d18565b60200260200101518f60e001518960ff1681518110612cc357612cc3614d18565b60200260200101518663ffffffff1681518110612ce257612ce2614d18565b60209081029190910101516040516001600160e01b031960e087901b16815260ff909416600485015263ffffffff92831660248501526044840191909152166064820152608401602060405180830381865afa158015612d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6a9190614de0565b8751805160ff8716908110612d8157612d81614d18565b60200260200101818151612d9591906152fa565b6001600160601b03169052506001015b5080612db081615322565b915050612c0e565b5050600101612a87565b5050600080612ddb8c868a606001518b60800151610756565b9150915081612e4c5760405162461bcd60e51b8152602060048201526043602482015260008051602061541a83398151915260448201527f7265733a2070616972696e6720707265636f6d70696c652063616c6c206661696064820152621b195960ea1b608482015260a401610602565b80612ead5760405162461bcd60e51b8152602060048201526039602482015260008051602061541a83398151915260448201527f7265733a207369676e617475726520697320696e76616c6964000000000000006064820152608401610602565b505060008782604051602001612ec49291906151df565b60408051808303601f190181529190528051602090910120929b929a509198505050505050505050565b612ef6613caa565b612f006000613d04565b565b6040805160018082528183019092526000916060918391602080830190803683370190505090508481600081518110612f3d57612f3d614d18565b60209081029190910101526040516385020d4960e01b81526000906001600160a01b038816906385020d4990612f799088908690600401615346565b600060405180830381865afa158015612f96573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fbe9190810190614e84565b600081518110612fd057612fd0614d18565b6020908102919091010151604051633064620d60e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b03891690633064620d90606401602060405180830381865afa15801561303c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130609190614f64565b6001600160c01b03169050600061307682613d56565b9050816130848a838a6108e0565b9550955050505050935093915050565b61309c613caa565b6001600160a01b0381166131015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610602565b61061481613d04565b600054610100900460ff161580801561312a5750600054600160ff909116105b806131445750303b158015613144575060005460ff166001145b6131a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610602565b6000805460ff1916600117905580156131ca576000805461ff0019166101001790555b6131d5856000613db3565b6131de84613d04565b609b80546001600160a01b038086166001600160a01b031992831617909255609c8054928516929091169190911790558015613254576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d29190614c47565b6001600160a01b0316336001600160a01b0316146133025760405162461bcd60e51b815260040161060290614c64565b6066541981196066541916146133805760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610602565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161074b565b6001600160a01b0381166134455760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610602565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b60408051808201909152600080825260208201526134ca613fc7565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa90508080156134fd576134ff565bfe5b508061353d5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b6044820152606401610602565b505092915050565b6040805180820190915260008082526020820152613561613fe5565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa90508080156134fd57508061353d5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b6044820152606401610602565b6135e1614003565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820190915260008082526020820152600080806136c96000805160206153fa83398151915286614d2e565b90505b6136d581613e9d565b90935091506000805160206153fa83398151915282830983141561370f576040805180820190915290815260208101919091529392505050565b6000805160206153fa8339815191526001820890506136cc565b60408051808201825286815260208082018690528251808401909352868352820184905260009182919061375b614028565b60005b600281101561392057600061377482600661515e565b905084826002811061378857613788614d18565b6020020151518361379a83600061539a565b600c81106137aa576137aa614d18565b60200201528482600281106137c1576137c1614d18565b602002015160200151838260016137d8919061539a565b600c81106137e8576137e8614d18565b60200201528382600281106137ff576137ff614d18565b602002015151518361381283600261539a565b600c811061382257613822614d18565b602002015283826002811061383957613839614d18565b602002015151600160200201518361385283600361539a565b600c811061386257613862614d18565b602002015283826002811061387957613879614d18565b60200201516020015160006002811061389457613894614d18565b6020020151836138a583600461539a565b600c81106138b5576138b5614d18565b60200201528382600281106138cc576138cc614d18565b6020020151602001516001600281106138e7576138e7614d18565b6020020151836138f883600561539a565b600c811061390857613908614d18565b6020020152508061391881614e1f565b91505061375e565b50613929614047565b60006020826101808560088cfa9151919c9115159b50909950505050505050505050565b600081600001518260200151604051602001613973929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b600061010082511115613a045760405162461bcd60e51b815260206004820152603660248201527f4269746d61705574696c732e62797465734172726179546f4269746d61703a206044820152756279746573417272617920697320746f6f206c6f6e6760501b6064820152608401610602565b8151613a1257506000919050565b60008083600081518110613a2857613a28614d18565b0160200151600160f89190911c81901b92505b8451811015613af057848181518110613a5657613a56614d18565b0160200151600160f89190911c1b915082821615613adc5760405162461bcd60e51b815260206004820152603a60248201527f4269746d61705574696c732e62797465734172726179546f4269746d61703a2060448201527f72657065617420656e74727920696e20627974657341727261790000000000006064820152608401610602565b91811791613ae981614e1f565b9050613a3b565b50909392505050565b6000805b8215613b2457613b0e6001846152e3565b9092169180613b1c816153b2565b915050613afd565b92915050565b60408051808201909152600080825260208201528151158015613b4f57506020820151155b15613b6d575050604080518082019091526000808252602082015290565b6040518060400160405280836000015181526020016000805160206153fa8339815191528460200151613ba09190614d2e565b613bb8906000805160206153fa8339815191526152e3565b905292915050565b919050565b60408051808201909152600080825260208201526102008261ffff1610613c215760405162461bcd60e51b815260206004820152601060248201526f7363616c61722d746f6f2d6c6172676560801b6044820152606401610602565b8161ffff1660011415613c35575081613b24565b6040805180820190915260008082526020820181905284906001905b8161ffff168661ffff161115613c9f57600161ffff871660ff83161c81161415613c8257613c7f8484613545565b93505b613c8c8384613545565b92506201fffe600192831b169101613c51565b509195945050505050565b6033546001600160a01b03163314612f005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610602565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000805b610100811015613dac576001811b915083821615613d9c57828160f81b604051602001613d8a9291906153ca565b60405160208183030381529060405292505b613da581614e1f565b9050613d5c565b5050919050565b6065546001600160a01b0316158015613dd457506001600160a01b03821615155b613e565760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610602565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2613e99826133b7565b5050565b600080806000805160206153fa83398151915260036000805160206153fa833981519152866000805160206153fa833981519152888909090890506000613f13827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f526000805160206153fa833981519152613f1f565b91959194509092505050565b600080613f2a614047565b613f32614065565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa92508280156134fd575082613fbc5760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c7572650000000000006044820152606401610602565b505195945050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280614016614083565b8152602001614023614083565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6001600160a01b038116811461061457600080fd5b6000602082840312156140c857600080fd5b81356140d3816140a1565b9392505050565b6000602082840312156140ec57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561412b5761412b6140f3565b60405290565b60405161010081016001600160401b038111828210171561412b5761412b6140f3565b604051601f8201601f191681016001600160401b038111828210171561417c5761417c6140f3565b604052919050565b60006040828403121561419657600080fd5b61419e614109565b9050813581526020820135602082015292915050565b600082601f8301126141c557600080fd5b604051604081018181106001600160401b03821117156141e7576141e76140f3565b80604052508060408401858111156141fe57600080fd5b845b81811015613c9f578035835260209283019201614200565b60006080828403121561422a57600080fd5b614232614109565b905061423e83836141b4565b815261424d83604084016141b4565b602082015292915050565b600080600080610120858703121561426f57600080fd5b843593506142808660208701614184565b925061428f8660608701614218565b915061429e8660e08701614184565b905092959194509250565b63ffffffff8116811461061457600080fd5b8035613bc0816142a9565b6000602082840312156142d857600080fd5b81356140d3816142a9565b6000806000606084860312156142f857600080fd5b8335614303816140a1565b92506020848101356001600160401b038082111561432057600080fd5b818701915087601f83011261433457600080fd5b813581811115614346576143466140f3565b614358601f8201601f19168501614154565b9150808252888482850101111561436e57600080fd5b8084840185840137600084828401015250809450505050614391604085016142bb565b90509250925092565b600081518084526020808501808196508360051b810191508286016000805b8681101561441c578385038a52825180518087529087019087870190845b81811015614407578351805184528a01516001600160601b03168a840152928901926040909201916001016143d7565b50509a87019a955050918501916001016143b9565b509298975050505050505050565b6020815260006140d3602083018461439a565b60008083601f84011261444f57600080fd5b5081356001600160401b0381111561446657600080fd5b60208301915083602082850101111561447e57600080fd5b9250929050565b6000806000806000806080878903121561449e57600080fd5b86356144a9816140a1565b955060208701356144b9816142a9565b945060408701356001600160401b03808211156144d557600080fd5b6144e18a838b0161443d565b909650945060608901359150808211156144fa57600080fd5b818901915089601f83011261450e57600080fd5b81358181111561451d57600080fd5b8a60208260051b850101111561453257600080fd5b6020830194508093505050509295509295509295565b600081518084526020808501945080840160005b8381101561457e57815163ffffffff168752958201959082019060010161455c565b509495945050505050565b6000602080835283516080828501526145a560a0850182614548565b905081850151601f19808684030160408701526145c28383614548565b925060408701519150808684030160608701526145df8383614548565b60608801518782038301608089015280518083529194508501925084840190600581901b8501860160005b828110156146365784878303018452614624828751614548565b9588019593880193915060010161460a565b509998505050505050505050565b60006020828403121561465657600080fd5b813560ff811681146140d357600080fd5b60006080828403121561467957600080fd5b50919050565b60006040828403121561467957600080fd5b60006001600160401b038211156146aa576146aa6140f3565b5060051b60200190565b600082601f8301126146c557600080fd5b813560206146da6146d583614691565b614154565b82815260059290921b840181019181810190868411156146f957600080fd5b8286015b84811015610c4e578035614710816142a9565b83529183019183016146fd565b600082601f83011261472e57600080fd5b8135602061473e6146d583614691565b82815260069290921b8401810191818101908684111561475d57600080fd5b8286015b84811015610c4e576147738882614184565b835291830191604001614761565b600082601f83011261479257600080fd5b813560206147a26146d583614691565b82815260059290921b840181019181810190868411156147c157600080fd5b8286015b84811015610c4e5780356001600160401b038111156147e45760008081fd5b6147f28986838b01016146b4565b8452509183019183016147c5565b6000610180828403121561481357600080fd5b61481b614131565b905081356001600160401b038082111561483457600080fd5b614840858386016146b4565b8352602084013591508082111561485657600080fd5b6148628583860161471d565b6020840152604084013591508082111561487b57600080fd5b6148878583860161471d565b60408401526148998560608601614218565b60608401526148ab8560e08601614184565b60808401526101208401359150808211156148c557600080fd5b6148d1858386016146b4565b60a08401526101408401359150808211156148eb57600080fd5b6148f7858386016146b4565b60c084015261016084013591508082111561491157600080fd5b5061491e84828501614781565b60e08301525092915050565b60008060006080848603121561493f57600080fd5b83356001600160401b038082111561495657600080fd5b61496287838801614667565b9450614971876020880161467f565b9350606086013591508082111561498757600080fd5b5061499486828701614800565b9150509250925092565b60008060008060c085870312156149b457600080fd5b84356001600160401b03808211156149cb57600080fd5b6149d788838901614667565b95506149e6886020890161467f565b94506149f5886060890161467f565b935060a0870135915080821115614a0b57600080fd5b50614a188782880161471d565b91505092959194509250565b60008060008060608587031215614a3a57600080fd5b843593506020850135614a4c816142a9565b925060408501356001600160401b03811115614a6757600080fd5b614a738782880161443d565b95989497509550505050565b600080600080600060808688031215614a9757600080fd5b8535945060208601356001600160401b0380821115614ab557600080fd5b614ac189838a0161443d565b909650945060408801359150614ad6826142a9565b90925060608701359080821115614aec57600080fd5b50614af988828901614800565b9150509295509295909350565b600081518084526020808501945080840160005b8381101561457e5781516001600160601b031687529582019590820190600101614b1a565b6040815260008351604080840152614b5a6080840182614b06565b90506020850151603f19848303016060850152614b778282614b06565b925050508260208301529392505050565b600080600060608486031215614b9d57600080fd5b8335614ba8816140a1565b9250602084013591506040840135614bbf816142a9565b809150509250925092565b828152604060208201526000614be3604083018461439a565b949350505050565b60008060008060808587031215614c0157600080fd5b8435614c0c816140a1565b93506020850135614c1c816140a1565b92506040850135614c2c816140a1565b91506060850135614c3c816140a1565b939692955090935050565b600060208284031215614c5957600080fd5b81516140d3816140a1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215614cc057600080fd5b815180151581146140d357600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600082614d4b57634e487b7160e01b600052601260045260246000fd5b500690565b60006020808385031215614d6357600080fd5b82516001600160401b03811115614d7957600080fd5b8301601f81018513614d8a57600080fd5b8051614d986146d582614691565b81815260059190911b82018301908381019087831115614db757600080fd5b928401925b82841015614dd557835182529284019290840190614dbc565b979650505050505050565b600060208284031215614df257600080fd5b81516001600160601b03811681146140d357600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614e3357614e33614e09565b5060010190565b63ffffffff84168152604060208201819052810182905260006001600160fb1b03831115614e6757600080fd5b8260051b8085606085013760009201606001918252509392505050565b60006020808385031215614e9757600080fd5b82516001600160401b03811115614ead57600080fd5b8301601f81018513614ebe57600080fd5b8051614ecc6146d582614691565b81815260059190911b82018301908381019087831115614eeb57600080fd5b928401925b82841015614dd5578351614f03816142a9565b82529284019290840190614ef0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff84168152604060208201526000614f5b604083018486614f12565b95945050505050565b600060208284031215614f7657600080fd5b81516001600160c01b03811681146140d357600080fd5b600060208284031215614f9f57600080fd5b81516140d3816142a9565b600060ff821660ff811415614fc157614fc1614e09565b60010192915050565b604081526000614fde604083018587614f12565b905063ffffffff83166020830152949350505050565b6000808335601e1984360301811261500b57600080fd5b8301803591506001600160401b0382111561502557600080fd5b60200191503681900382131561447e57600080fd5b602081528135602082015260006020830135615055816142a9565b63ffffffff81166040840152506040830135601e1984360301811261507957600080fd5b830180356001600160401b0381111561509157600080fd5b8036038513156150a057600080fd5b608060608501526150b860a085018260208501614f12565b9150506150c7606085016142bb565b63ffffffff81166080850152509392505050565b600063ffffffff8083168185168083038211156150fa576150fa614e09565b01949350505050565b803561510e816142a9565b63ffffffff168252602090810135910152565b60408101613b248284615103565b60006001600160601b038083168185168183048111821515161561515557615155614e09565b02949350505050565b600081600019048311821515161561517857615178614e09565b500290565b6080810161518b8285615103565b63ffffffff8351166040830152602083015160608301529392505050565b608081016151b78285615103565b82356151c2816142a9565b63ffffffff16604083015260209290920135606090910152919050565b63ffffffff60e01b8360e01b1681526000600482018351602080860160005b8381101561521a578151855293820193908201906001016151fe565b5092979650505050505050565b60005b8381101561524257818101518382015260200161522a565b838111156122db5750506000910152565b60208152815160208201526000602083015163ffffffff8082166040850152604085015191506080606085015281518060a08601526152998160c0870160208601615227565b60609590950151166080840152505060c0601f909201601f1916010190565b6000602082840312156152ca57600080fd5b815167ffffffffffffffff19811681146140d357600080fd5b6000828210156152f5576152f5614e09565b500390565b60006001600160601b038381169083168181101561531a5761531a614e09565b039392505050565b600063ffffffff8083168181141561533c5761533c614e09565b6001019392505050565b60006040820163ffffffff851683526020604081850152818551808452606086019150828701935060005b8181101561538d57845183529383019391830191600101615371565b5090979650505050505050565b600082198211156153ad576153ad614e09565b500190565b600061ffff8083168181141561533c5761533c614e09565b600083516153dc818460208801615227565b6001600160f81b031993909316919092019081526001019291505056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535369676e6174757265436865636b65722e636865636b5369676e617475a2646970667358221220d688039d082081d363ced965198c1c5bc526544f50eae3d2ae0aa31f6187c6cc64736f6c634300080c0033","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4826533b4897376654bb4d4ad88b7fafd0c98528":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80636d14a987116100715780636d14a987146101ec5780637225057e146102135780637f5eccbb14610261578063c1af6b24146102a2578063eda10763146102cf578063fb81a7be146102ef57600080fd5b806303ce4bad146100b9578063187548c8146100df57806324369b2a1461011e57806332de63081461013357806347b314e81461016f57806363a9451014610182575b600080fd5b6100cc6100c7366004610f4d565b610327565b6040519081526020015b60405180910390f35b6101067f000000000000000000000000322813fd9a801c5507c9de605d63cea4f2ce6c4481565b6040516001600160a01b0390911681526020016100d6565b61013161012c366004610f4d565b6104a1565b005b61015a610141366004611017565b6002602052600090815260409020805460019091015482565b604080519283526020830191909152016100d6565b61010661017d366004611039565b610580565b6101d1610190366004611017565b60408051808201909152600080825260208201525060ff16600090815260026020908152604091829020825180840190935280548352600101549082015290565b604080518251815260209283015192810192909252016100d6565b6101067f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304281565b610226610221366004611052565b610612565b60408051825167ffffffffffffffff1916815260208084015163ffffffff9081169183019190915292820151909216908201526060016100d6565b61027461026f366004611052565b6106a4565b6040805167ffffffffffffffff19909416845263ffffffff92831660208501529116908201526060016100d6565b6102b56102b036600461107c565b6106ef565b60405167ffffffffffffffff1990911681526020016100d6565b6102e26102dd3660046110c4565b610778565b6040516100d6919061113c565b6103126102fd366004611017565b60ff1660009081526001602052604090205490565b60405163ffffffff90911681526020016100d6565b6000336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f373042161461037a5760405162461bcd60e51b815260040161037190611186565b60405180910390fd5b6000610385836109d0565b90507fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb581141561041d5760405162461bcd60e51b815260206004820152603f60248201527f424c535075626b657952656769737472792e72656769737465724f706572617460448201527f6f723a2063616e6e6f74207265676973746572207a65726f207075626b6579006064820152608401610371565b846001600160a01b031661043082610580565b6001600160a01b0316146104565760405162461bcd60e51b8152600401610371906111fd565b6104608484610a13565b7f5358c5b42179178c8fc757734ac2a3198f9071c765ee0d8389211525f5005246858560405161049192919061125b565b60405180910390a1949350505050565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304216146104e95760405162461bcd60e51b815260040161037190611186565b60006104f4826109d0565b9050836001600160a01b031661050982610580565b6001600160a01b03161461052f5760405162461bcd60e51b8152600401610371906111fd565b6105418361053c84610bd2565b610a13565b7f14a5172b312e9d2c22b8468f9c70ec2caa9de934fe380734fbc6f3beff2b14ba848460405161057292919061125b565b60405180910390a150505050565b60405163745dcd7360e11b8152600481018290526000907f000000000000000000000000322813fd9a801c5507c9de605d63cea4f2ce6c446001600160a01b03169063e8bb9ae690602401602060405180830381865afa1580156105e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060c91906112c0565b92915050565b604080516060810182526000808252602080830182905282840182905260ff86168252600190529190912080548390811061064f5761064f6112dd565b600091825260209182902060408051606081018252919092015467ffffffffffffffff1981841b16825263ffffffff600160c01b8204811694830194909452600160e01b900490921690820152905092915050565b600160205281600052604060002081815481106106c057600080fd5b600091825260209091200154604081901b925063ffffffff600160c01b820481169250600160e01b9091041683565b60ff83166000908152600160205260408120805482919084908110610716576107166112dd565b600091825260209182902060408051606081018252919092015467ffffffffffffffff1981841b16825263ffffffff600160c01b8204811694830194909452600160e01b900490921690820152905061076f8185610c91565b51949350505050565b606060008367ffffffffffffffff81111561079557610795610eb7565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b50905060005b848110156109c75760008686838181106107e0576107e06112dd565b919091013560f81c600081815260016020526040902054909250905063ffffffff81161580610849575060ff82166000908152600160205260408120805490919061082d5761082d6112dd565b600091825260209091200154600160c01b900463ffffffff1686105b156108e25760405162461bcd60e51b815260206004820152605e60248201527f424c535075626b657952656769737472792e67657441706b496e64696365734660448201527f6f7251756f72756d734174426c6f636b4e756d6265723a20626c6f636b4e756d60648201527f626572206973206265666f726520746865206669727374207570646174650000608482015260a401610371565b60005b8163ffffffff168163ffffffff1610156109b15760ff83166000908152600160208190526040909120889161091a8486611309565b6109249190611309565b63ffffffff168154811061093a5761093a6112dd565b600091825260209091200154600160c01b900463ffffffff161161099f5760016109648284611309565b61096e9190611309565b858581518110610980576109806112dd565b602002602001019063ffffffff16908163ffffffff16815250506109b1565b806109a98161132e565b9150506108e5565b50505080806109bf90611352565b9150506107c4565b50949350505050565b6000816000015182602001516040516020016109f6929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b604080518082019091526000808252602082015260005b8351811015610bcc576000848281518110610a4757610a476112dd565b0160209081015160f81c600081815260019092526040909120549091508015610ac75760ff821660009081526001602081905260409091204391610a8b908461136d565b81548110610a9b57610a9b6112dd565b90600052602060002001600001601c6101000a81548163ffffffff021916908363ffffffff1602179055505b60ff82166000908152600260209081526040918290208251808401909352805483526001015490820152610afb9086610dde565b60ff8316600090815260026020908152604080832084518155828501516001909101558051606081018252838152918201839052810191909152909450610b41856109d0565b67ffffffffffffffff1916815263ffffffff438116602080840191825260ff90951660009081526001808752604080832080548084018255908452979092208551970180549351958301518516600160e01b026001600160e01b0396909516600160c01b026001600160e01b03199094169790921c9690961791909117929092161790555001610a2a565b50505050565b60408051808201909152600080825260208201528151158015610bf757506020820151155b15610c15575050604080518082019091526000808252602082015290565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478460200151610c5a9190611384565b610c84907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4761136d565b905292915050565b919050565b816020015163ffffffff168163ffffffff161015610d2a5760405162461bcd60e51b815260206004820152604a60248201527f424c535075626b657952656769737472792e5f76616c696461746541706b486160448201527f7368466f7251756f72756d4174426c6f636b4e756d6265723a20696e646578206064820152691d1bdbc81c9958d95b9d60b21b608482015260a401610371565b604082015163ffffffff161580610d505750816040015163ffffffff168163ffffffff16105b610dda5760405162461bcd60e51b815260206004820152604f60248201527f424c535075626b657952656769737472792e5f76616c696461746541706b486160448201527f7368466f7251756f72756d4174426c6f636b4e756d6265723a206e6f74206c6160648201526e746573742061706b2075706461746560881b608482015260a401610371565b5050565b6040805180820190915260008082526020820152610dfa610e81565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa9050808015610e3957610e3b565bfe5b5080610e795760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b6044820152606401610371565b505092915050565b60405180608001604052806004906020820280368337509192915050565b6001600160a01b0381168114610eb457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610ef657610ef6610eb7565b604052919050565b600060408284031215610f1057600080fd5b6040516040810181811067ffffffffffffffff82111715610f3357610f33610eb7565b604052823581526020928301359281019290925250919050565b600080600060808486031215610f6257600080fd5b8335610f6d81610e9f565b925060208481013567ffffffffffffffff80821115610f8b57600080fd5b818701915087601f830112610f9f57600080fd5b813581811115610fb157610fb1610eb7565b610fc3601f8201601f19168501610ecd565b91508082528884828501011115610fd957600080fd5b8084840185840137600084828401015250809450505050610ffd8560408601610efe565b90509250925092565b803560ff81168114610c8c57600080fd5b60006020828403121561102957600080fd5b61103282611006565b9392505050565b60006020828403121561104b57600080fd5b5035919050565b6000806040838503121561106557600080fd5b61106e83611006565b946020939093013593505050565b60008060006060848603121561109157600080fd5b61109a84611006565b9250602084013563ffffffff811681146110b357600080fd5b929592945050506040919091013590565b6000806000604084860312156110d957600080fd5b833567ffffffffffffffff808211156110f157600080fd5b818601915086601f83011261110557600080fd5b81358181111561111457600080fd5b87602082850101111561112657600080fd5b6020928301989097509590910135949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561117a57835163ffffffff1683529284019291840191600101611158565b50909695505050505050565b60208082526051908201527f424c535075626b657952656769737472792e6f6e6c795265676973747279436f60408201527f6f7264696e61746f723a2063616c6c6572206973206e6f74207468652072656760608201527034b9ba393c9031b7b7b93234b730ba37b960791b608082015260a00190565b602080825260409082018190527f424c535075626b657952656769737472792e72656769737465724f7065726174908201527f6f723a206f70657261746f7220646f6573206e6f74206f776e207075626b6579606082015260800190565b60018060a01b038316815260006020604081840152835180604085015260005b818110156112975785810183015185820160600152820161127b565b818111156112a9576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156112d257600080fd5b815161103281610e9f565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff83811690831681811015611326576113266112f3565b039392505050565b600063ffffffff80831681811415611348576113486112f3565b6001019392505050565b6000600019821415611366576113666112f3565b5060010190565b60008282101561137f5761137f6112f3565b500390565b6000826113a157634e487b7160e01b600052601260045260246000fd5b50069056fea2646970667358221220ef593466506ada3f368a560c43f53375156f71f5eded1083ad9264d6fc59d0ac64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x4a679253410272dd5232b3ff7cf5dbb88f295319":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806340c10f191161005b57806340c10f19146100d257806370a08231146100e7578063a9059cbb14610110578063dd62ed3e1461012357600080fd5b8063095ea7b31461008257806318160ddd146100ad57806323b872dd146100bf575b600080fd5b610098610090366004610410565b600192915050565b60405190151581526020015b60405180910390f35b6002545b6040519081526020016100a4565b6100986100cd36600461043a565b61015c565b6100e56100e0366004610410565b610173565b005b6100b16100f5366004610476565b6001600160a01b031660009081526020819052604090205490565b61009861011e366004610410565b610181565b6100b1610131366004610498565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600061016984848461018b565b5060019392505050565b61017d8282610335565b5050565b6000336101698185855b6001600160a01b0383166101f45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6001600160a01b0382166102565760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016101eb565b6001600160a01b0383166000908152602081905260409020548111156102cd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016101eb565b6001600160a01b038381166000818152602081815260408083208054879003905593861680835291849020805486019055925184815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b03821661038b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016101eb565b806002600082825461039d91906104cb565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80356001600160a01b038116811461040b57600080fd5b919050565b6000806040838503121561042357600080fd5b61042c836103f4565b946020939093013593505050565b60008060006060848603121561044f57600080fd5b610458846103f4565b9250610466602085016103f4565b9150604084013590509250925092565b60006020828403121561048857600080fd5b610491826103f4565b9392505050565b600080604083850312156104ab57600080fd5b6104b4836103f4565b91506104c2602084016103f4565b90509250929050565b600082198211156104ec57634e487b7160e01b600052601160045260246000fd5b50019056fea26469706673582212200c8f4a0047ca0322c22cf7e6a789abbe36ca3141cd508f864ec741dccdc347f964736f6c634300080c0033","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212200fdbd2e25973eab45d03ab46d4fda931522c5b45bccd7b63ecf3c38942f8913564736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106103425760003560e01c80635f966f14116101b8578063b134427111610104578063da8be864116100a2578063f16172b01161007c578063f16172b014610906578063f2fde38b14610919578063f698da251461092c578063fabc1cbc1461093457600080fd5b8063da8be864146108cd578063e3b05f2f146108e0578063eea9064b146108f357600080fd5b8063c5e480db116100de578063c5e480db146107ea578063c94b511114610890578063ca661c04146108a3578063cf80873e146108ac57600080fd5b8063b134427114610772578063b7f06ebe14610799578063bb45fef2146107bc57600080fd5b8063778e55f3116101715780638da5cb5b1161014b5780638da5cb5b146107135780639104c3191461072457806399be81c81461073f578063a17884841461075257600080fd5b8063778e55f3146106c25780637f548071146106ed578063886f11951461070057600080fd5b80635f966f141461062c57806360d7faed1461065857806365da12641461066b57806368304835146106945780636d70f7ae146106a7578063715018a6146106ba57600080fd5b806333404396116102925780634fc40b6111610230578063597b36da1161020a578063597b36da146105db5780635ac86ab7146105ee5780635c975abb146106115780635cfe8d2c1461061957600080fd5b80634fc40b61146105c057806350f73e7c146105ca578063595c6a67146105d357600080fd5b80633e28391d1161026c5780633e28391d1461053c578063433773821461055f5780634665bcda146105865780634d50f9a4146105ad57600080fd5b806333404396146104bb57806339b70e38146104ce5780633cdeb5e01461050d57600080fd5b8063136439dd116102ff5780631bbce091116102d95780631bbce0911461044e57806320606b701461046157806328a573ae1461048857806329c77d4f1461049b57600080fd5b8063136439dd146103ef57806316928365146104025780631794bb3c1461043b57600080fd5b806304a4f979146103475780630b9f487a146103815780630dd8dd02146103945780630f589e59146103b457806310d67a2f146103c9578063132d4967146103dc575b600080fd5b61036e7f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce81565b6040519081526020015b60405180910390f35b61036e61038f3660046143d5565b610947565b6103a76103a2366004614474565b610a09565b60405161037891906144b5565b6103c76103c2366004614552565b610d83565b005b6103c76103d73660046145a5565b610ed3565b6103c76103ea3660046145c9565b610f86565b6103c76103fd36600461460a565b611046565b61036e6104103660046145a5565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b6103c76104493660046145c9565b611185565b61036e61045c3660046145c9565b6112ae565b61036e7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103c76104963660046145c9565b6112dc565b61036e6104a93660046145a5565b609b6020526000908152604090205481565b6103c76104c9366004614623565b61138c565b6104f57f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b039091168152602001610378565b6104f561051b3660046145a5565b6001600160a01b039081166000908152609960205260409020600101541690565b61054f61054a3660046145a5565b6114c9565b6040519015158152602001610378565b61036e7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b6104f57f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6103c76105bb36600461460a565b6114e9565b61036e6213c68081565b61036e609d5481565b6103c76115c0565b61036e6105e9366004614963565b611687565b61054f6105fc36600461499f565b606654600160ff9092169190911b9081161490565b60665461036e565b6103c7610627366004614a15565b6116b7565b6104f561063a3660046145a5565b6001600160a01b039081166000908152609960205260409020541690565b6103c7610666366004614b75565b611962565b6104f56106793660046145a5565b609a602052600090815260409020546001600160a01b031681565b60a0546104f5906001600160a01b031681565b61054f6106b53660046145a5565b6119fd565b6103c7611a1d565b61036e6106d0366004614c04565b609860209081526000928352604080842090915290825290205481565b6103c76106fb366004614ce5565b611a31565b6065546104f5906001600160a01b031681565b6033546001600160a01b03166104f5565b6104f573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103c761074d366004614d75565b611b36565b61036e6107603660046145a5565b609f6020526000908152604090205481565b6104f57f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61054f6107a736600461460a565b609e6020526000908152604090205460ff1681565b61054f6107ca366004614daa565b609c60209081526000928352604080842090915290825290205460ff1681565b61085a6107f83660046145a5565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610378565b61036e61089e366004614dd6565b611c08565b61036e61c4e081565b6108bf6108ba3660046145a5565b611cc1565b604051610378929190614e92565b61036e6108db3660046145a5565b612079565b6103c76108ee3660046145a5565b6123d8565b6103c7610901366004614eb7565b612540565b6103c7610914366004614f0f565b61254c565b6103c76109273660046145a5565b6125dd565b61036e612653565b6103c761094236600461460a565b612691565b604080517f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e09092019092528051910120600090816109c5612653565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610a3e5760405162461bcd60e51b8152600401610a3590614f2b565b60405180910390fd5b6000836001600160401b03811115610a5857610a586146e6565b604051908082528060200260200182016040528015610a81578160200160208202803683370190505b50905060005b84811015610d7a57858582818110610aa157610aa1614f62565b9050602002810190610ab39190614f78565b610ac1906020810190614f98565b9050868683818110610ad557610ad5614f62565b9050602002810190610ae79190614f78565b610af19080614f98565b905014610b665760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610a35565b6000868683818110610b7a57610b7a614f62565b9050602002810190610b8c9190614f78565b610b9d9060608101906040016145a5565b6001600160a01b03161415610c2b5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a206d7573742070726f766964652076616c6964207769746864726177616c606482015267206164647265737360c01b608482015260a401610a35565b336000818152609a60205260409020546001600160a01b031690610d4a9082898986818110610c5c57610c5c614f62565b9050602002810190610c6e9190614f78565b610c7f9060608101906040016145a5565b8a8a87818110610c9157610c91614f62565b9050602002810190610ca39190614f78565b610cad9080614f98565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150899050818110610cf357610cf3614f62565b9050602002810190610d059190614f78565b610d13906020810190614f98565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506127ed92505050565b838381518110610d5c57610d5c614f62565b60209081029190910101525080610d7281614ff7565b915050610a87565b50949350505050565b336000908152609960205260409020546001600160a01b031615610e1d5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a206f70657261746f722068617320616c72656164792072656769736064820152641d195c995960da1b608482015260a401610a35565b610e273384612b9d565b604080518082019091526060815260006020820152610e493380836000612e39565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610e829190615012565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610ec5929190615064565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190615093565b6001600160a01b0316336001600160a01b031614610f7a5760405162461bcd60e51b8152600401610a35906150b0565b610f83816131f2565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9161480610fe55750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6110015760405162461bcd60e51b8152600401610a35906150fa565b61100a836114c9565b15611041576001600160a01b038084166000908152609a602052604090205416611036818585856132e9565b61103f81613364565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b29190615157565b6110ce5760405162461bcd60e51b8152600401610a3590615174565b606654818116146111475760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a35565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156111a55750600054600160ff909116105b806111bf5750303b1580156111bf575060005460ff166001145b6112225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a35565b6000805460ff191660011790558015611245576000805461ff0019166101001790555b61124f838361341e565b611257613504565b6097556112638461359b565b801561103f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6001600160a01b0383166000908152609b60205260408120546112d385828686611c08565b95945050505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916148061133b5750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6113575760405162461bcd60e51b8152600401610a35906150fa565b611360836114c9565b15611041576001600160a01b038084166000908152609a602052604090205416611036818585856135ed565b606654600290600490811614156113b55760405162461bcd60e51b8152600401610a3590614f2b565b600260c95414156114085760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a35565b600260c95560005b888110156114b8576114a88a8a8381811061142d5761142d614f62565b905060200281019061143f91906151bc565b89898481811061145157611451614f62565b90506020028101906114639190614f98565b89898681811061147557611475614f62565b9050602002013588888781811061148e5761148e614f62565b90506020020160208101906114a391906151d2565b613668565b6114b181614ff7565b9050611410565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b6114f1613ce2565b61c4e081111561157f5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e7365745769746864726177616c4460448201527f656c6179426c6f636b733a206e65775769746864726177616c44656c6179426c60648201526c0dec6d6e640e8dede40d0d2ced609b1b608482015260a401610a35565b609d5460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a1609d55565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190615157565b6116485760405162461bcd60e51b8152600401610a3590615174565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60008160405160200161169a9190615263565b604051602081830303815290604052805190602001209050919050565b60005b815181101561195e5760008282815181106116d7576116d7614f62565b602002602001015190506000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663cd293f6f846040518263ffffffff1660e01b81526004016117309190615276565b60408051808303816000875af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190615325565b915091508115611950576040808401516001600160a01b0381166000908152609f602052918220805491928291906117a983614ff7565b919050555060006040518060e00160405280846001600160a01b031681526020018760a001516001600160a01b031681526020018760600151600001516001600160a01b03168152602001838152602001876080015163ffffffff1681526020018760000151815260200187602001518152509050600061182982611687565b6000818152609e602052604090205490915060ff16156118bf5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e6d6967726174655175657565645760448201527f69746864726177616c733a207769746864726177616c20616c72656164792065606482015264786973747360d81b608482015260a401610a35565b6000818152609e602052604090819020805460ff19166001179055517f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f99061190a9083908590615353565b60405180910390a160408051868152602081018390527fdc00758b65eef71dc3780c04ebe36cab6bdb266c3a698187e29e0f0dca012630910160405180910390a1505050505b8360010193505050506116ba565b5050565b6066546002906004908116141561198b5760405162461bcd60e51b8152600401610a3590614f2b565b600260c95414156119de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a35565b600260c9556119f08686868686613668565b5050600160c95550505050565b6001600160a01b0390811660009081526099602052604090205416151590565b611a25613ce2565b611a2f600061359b565b565b4283602001511015611ab55760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610a35565b6000609b6000876001600160a01b03166001600160a01b031681526020019081526020016000205490506000611af18783888860200151611c08565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611b219088908390613d3c565b611b2d87878686612e39565b50505050505050565b611b3f336119fd565b611bc15760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610a35565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611bfc929190615064565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611c7e612653565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f909116906360f4062b90602401602060405180830381865afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d55919061536c565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9909116906394f649dd90602401600060405180830381865afa158015611dc5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ded91908101906153e0565b9150915060008313611e0457909590945092505050565b606080835160001415611ebe576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611e7957611e79614f62565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611ead57611ead614f62565b60200260200101818152505061206c565b8351611ecb9060016154a4565b6001600160401b03811115611ee257611ee26146e6565b604051908082528060200260200182016040528015611f0b578160200160208202803683370190505b50915081516001600160401b03811115611f2757611f276146e6565b604051908082528060200260200182016040528015611f50578160200160208202803683370190505b50905060005b8451811015611fea57848181518110611f7157611f71614f62565b6020026020010151838281518110611f8b57611f8b614f62565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611fbd57611fbd614f62565b6020026020010151828281518110611fd757611fd7614f62565b6020908102919091010152600101611f56565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0826001845161200f91906154bc565b8151811061201f5761201f614f62565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001845161204f91906154bc565b8151811061205f5761205f614f62565b6020026020010181815250505b9097909650945050505050565b606654600090600190600290811614156120a55760405162461bcd60e51b8152600401610a3590614f2b565b6120ae836114c9565b61212e5760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610a35565b6001600160a01b038084166000908152609a602052604090205416612152846119fd565b156121c55760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610a35565b6001600160a01b0384166122415760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610a35565b336001600160a01b03851614806122605750336001600160a01b038216145b8061228757506001600160a01b038181166000908152609960205260409020600101541633145b6122f95760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610a35565b60008061230586611cc1565b9092509050336001600160a01b0387161461235b57826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b03191690556123ce86848185856127ed565b9695505050505050565b6123e0613ce2565b60a0546001600160a01b03161561245f5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e7365745374616b6552656769737460448201527f72793a207374616b65526567697374727920616c7265616479207365740000006064820152608401610a35565b6001600160a01b0381166124ec5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e7365745374616b6552656769737460448201527f72793a207374616b6552656769737472792063616e6e6f74206265207a65726f606482015267206164647265737360c01b608482015260a401610a35565b60a080546001600160a01b0319166001600160a01b0383169081179091556040519081527fce6d874069bceda1867eca9c60636bbf262e15213041658273d803a2b609a51f9060200160405180910390a150565b61104133848484612e39565b612555336119fd565b6125d35760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610a35565b610f833382612b9d565b6125e5613ce2565b6001600160a01b03811661264a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a35565b610f838161359b565b60007f0000000000000000000000000000000000000000000000000000000000007a69461415612684575060975490565b61268c613504565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127089190615093565b6001600160a01b0316336001600160a01b0316146127385760405162461bcd60e51b8152600401610a35906150b0565b6066541981196066541916146127b65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a35565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161117a565b60006001600160a01b0386166128845760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610a35565b60005b8351811015612a93576001600160a01b038616156128dd576128dd86888684815181106128b6576128b6614f62565b60200260200101518685815181106128d0576128d0614f62565b60200260200101516132e9565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b031684828151811061290d5761290d614f62565b60200260200101516001600160a01b031614156129d6577f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031663beffbb898885848151811061296657612966614f62565b60200260200101516040518363ffffffff1660e01b815260040161299f9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156129b957600080fd5b505af11580156129cd573d6000803e3d6000fd5b50505050612a8b565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316638c80d4e588868481518110612a1857612a18614f62565b6020026020010151868581518110612a3257612a32614f62565b60200260200101516040518463ffffffff1660e01b8152600401612a58939291906154d3565b600060405180830381600087803b158015612a7257600080fd5b505af1158015612a86573d6000803e3d6000fd5b505050505b600101612887565b506001600160a01b03851615612aac57612aac85613364565b6001600160a01b0386166000908152609f60205260408120805491829190612ad383614ff7565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612b3b82611687565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612b899083908590615353565b60405180910390a198975050505050505050565b6000612bac60208301836145a5565b6001600160a01b03161415612c465760405162461bcd60e51b815260206004820152605460248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a2063616e6e6f742073657420606561726e696e677352656365696064820152737665726020746f207a65726f206164647265737360601b608482015260a401610a35565b6213c680612c5a60608301604084016154f7565b63ffffffff161115612d0f5760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610a35565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612d4b90606084019084016154f7565b63ffffffff161015612de15760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610a35565b6001600160a01b03821660009081526099602052604090208190612e058282615534565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611bfc908490615012565b60665460009060019081161415612e625760405162461bcd60e51b8152600401610a3590614f2b565b612e6b856114c9565b15612ee85760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2073746160448201527f6b657220697320616c7265616479206163746976656c792064656c65676174656064820152601960fa1b608482015260a401610a35565b612ef1846119fd565b612f715760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a206f706560448201527f7261746f72206973206e6f74207265676973746572656420696e20456967656e6064820152642630bcb2b960d91b608482015260a401610a35565b6001600160a01b03808516600090815260996020526040902060010154168015801590612fa75750336001600160a01b03821614155b8015612fbc5750336001600160a01b03861614155b1561312957428460200151101561303b5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610a35565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156130d55760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610a35565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff19166001179055850151613116908890889085908890610947565b905061312782828760000151613d3c565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061318888611cc1565b9150915060005b82518110156131de576131d6888a8584815181106131af576131af614f62565b60200260200101518585815181106131c9576131c9614f62565b60200260200101516135ed565b60010161318f565b506131e887613364565b5050505050505050565b6001600160a01b0381166132805760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a35565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906133209084906154bc565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610ec5939291906154d3565b60a0546001600160a01b031615610f83576040805160018082528183019092526000916020808301908036833701905050905081816000815181106133ab576133ab614f62565b6001600160a01b03928316602091820292909201015260a05460405163ce977ec360e01b815291169063ce977ec3906133e8908490600401615597565b600060405180830381600087803b15801561340257600080fd5b505af1158015613416573d6000803e3d6000fd5b505050505050565b6065546001600160a01b031615801561343f57506001600160a01b03821615155b6134c15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a35565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261195e826131f2565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906136249084906154a4565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610ec5939291906154d3565b60006136766105e9876155d8565b6000818152609e602052604090205490915060ff166136eb5760405162461bcd60e51b815260206004820152603e602482015260008051602061568883398151915260448201527f416374696f6e3a20616374696f6e206973206e6f7420696e20717565756500006064820152608401610a35565b609d54439061370060a0890160808a016154f7565b63ffffffff1661371091906154a4565b11156137985760405162461bcd60e51b8152602060048201526057602482015260008051602061568883398151915260448201527f416374696f6e3a207769746864726177616c44656c6179426c6f636b7320706560648201527f72696f6420686173206e6f742079657420706173736564000000000000000000608482015260a401610a35565b6137a860608701604088016145a5565b6001600160a01b0316336001600160a01b0316146138305760405162461bcd60e51b815260206004820152604b602482015260008051602061568883398151915260448201527f416374696f6e3a206f6e6c7920776974686472617765722063616e20636f6d7060648201526a3632ba329030b1ba34b7b760a91b608482015260a401610a35565b81156138a75761384360a0870187614f98565b851490506138a75760405162461bcd60e51b815260206004820152603d602482015260008051602061568883398151915260448201527f416374696f6e3a20696e707574206c656e677468206d69736d617463680000006064820152608401610a35565b6000818152609e60205260409020805460ff19169055811561397d5760005b6138d360a0880188614f98565b90508110156139775761396f6138ec60208901896145a5565b336138fa60a08b018b614f98565b8581811061390a5761390a614f62565b905060200201602081019061391f91906145a5565b61392c60c08c018c614f98565b8681811061393c5761393c614f62565b905060200201358a8a8781811061395557613955614f62565b905060200201602081019061396a91906145a5565b613ef6565b6001016138c6565b50613ca7565b336000908152609a60205260408120546001600160a01b0316905b6139a560a0890189614f98565b9050811015613c9b5773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06139d060a08a018a614f98565b838181106139e0576139e0614f62565b90506020020160208101906139f591906145a5565b6001600160a01b03161415613b4e576000613a1360208a018a6145a5565b905060006001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16630e81073c83613a5460c08e018e614f98565b87818110613a6457613a64614f62565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adc919061536c565b6001600160a01b038084166000908152609a6020526040902054919250168015613b4657613b3d8184613b1260a08f018f614f98565b88818110613b2257613b22614f62565b9050602002016020810190613b3791906145a5565b856135ed565b613b4681613364565b505050613c93565b6001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9166350ff722533613b8b60a08c018c614f98565b85818110613b9b57613b9b614f62565b9050602002016020810190613bb091906145a5565b613bbd60c08d018d614f98565b86818110613bcd57613bcd614f62565b905060200201356040518463ffffffff1660e01b8152600401613bf2939291906154d3565b600060405180830381600087803b158015613c0c57600080fd5b505af1158015613c20573d6000803e3d6000fd5b505050506001600160a01b03821615613c9357613c938233613c4560a08c018c614f98565b85818110613c5557613c55614f62565b9050602002016020810190613c6a91906145a5565b613c7760c08d018d614f98565b86818110613c8757613c87614f62565b905060200201356135ed565b600101613998565b50613ca581613364565b505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6033546001600160a01b03163314611a2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a35565b6001600160a01b0383163b15613e5657604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90613d7c90869086906004016155ea565b602060405180830381865afa158015613d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dbd9190615647565b6001600160e01b031916146110415760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610a35565b826001600160a01b0316613e6a838361403b565b6001600160a01b0316146110415760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610a35565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01415613fa15760405162387b1360e81b81526001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063387b130090613f6a908890889087906004016154d3565b600060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b50505050614034565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063c608c7f390608401600060405180830381600087803b15801561401b57600080fd5b505af115801561402f573d6000803e3d6000fd5b505050505b5050505050565b600080600061404a858561405f565b91509150614057816140cf565b509392505050565b6000808251604114156140965760208301516040840151606085015160001a61408a8782858561428a565b945094505050506140c8565b8251604014156140c057602083015160408401516140b5868383614377565b9350935050506140c8565b506000905060025b9250929050565b60008160048111156140e3576140e3615671565b14156140ec5750565b600181600481111561410057614100615671565b141561414e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a35565b600281600481111561416257614162615671565b14156141b05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a35565b60038160048111156141c4576141c4615671565b141561421d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a35565b600481600481111561423157614231615671565b1415610f835760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a35565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156142c1575060009050600361436e565b8460ff16601b141580156142d957508460ff16601c14155b156142ea575060009050600461436e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561433e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166143675760006001925092505061436e565b9150600090505b94509492505050565b6000806001600160ff1b0383168161439460ff86901c601b6154a4565b90506143a28782888561428a565b935093505050935093915050565b6001600160a01b0381168114610f8357600080fd5b80356143d0816143b0565b919050565b600080600080600060a086880312156143ed57600080fd5b85356143f8816143b0565b94506020860135614408816143b0565b93506040860135614418816143b0565b94979396509394606081013594506080013592915050565b60008083601f84011261444257600080fd5b5081356001600160401b0381111561445957600080fd5b6020830191508360208260051b85010111156140c857600080fd5b6000806020838503121561448757600080fd5b82356001600160401b0381111561449d57600080fd5b6144a985828601614430565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156144ed578351835292840192918401916001016144d1565b50909695505050505050565b60006060828403121561450b57600080fd5b50919050565b60008083601f84011261452357600080fd5b5081356001600160401b0381111561453a57600080fd5b6020830191508360208285010111156140c857600080fd5b60008060006080848603121561456757600080fd5b61457185856144f9565b925060608401356001600160401b0381111561458c57600080fd5b61459886828701614511565b9497909650939450505050565b6000602082840312156145b757600080fd5b81356145c2816143b0565b9392505050565b6000806000606084860312156145de57600080fd5b83356145e9816143b0565b925060208401356145f9816143b0565b929592945050506040919091013590565b60006020828403121561461c57600080fd5b5035919050565b6000806000806000806000806080898b03121561463f57600080fd5b88356001600160401b038082111561465657600080fd5b6146628c838d01614430565b909a50985060208b013591508082111561467b57600080fd5b6146878c838d01614430565b909850965060408b01359150808211156146a057600080fd5b6146ac8c838d01614430565b909650945060608b01359150808211156146c557600080fd5b506146d28b828c01614430565b999c989b5096995094979396929594505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b038111828210171561471e5761471e6146e6565b60405290565b604080519081016001600160401b038111828210171561471e5761471e6146e6565b60405160c081016001600160401b038111828210171561471e5761471e6146e6565b604051601f8201601f191681016001600160401b0381118282101715614790576147906146e6565b604052919050565b63ffffffff81168114610f8357600080fd5b80356143d081614798565b60006001600160401b038211156147ce576147ce6146e6565b5060051b60200190565b600082601f8301126147e957600080fd5b813560206147fe6147f9836147b5565b614768565b82815260059290921b8401810191818101908684111561481d57600080fd5b8286015b84811015614841578035614834816143b0565b8352918301918301614821565b509695505050505050565b600082601f83011261485d57600080fd5b8135602061486d6147f9836147b5565b82815260059290921b8401810191818101908684111561488c57600080fd5b8286015b848110156148415780358352918301918301614890565b600060e082840312156148b957600080fd5b6148c16146fc565b90506148cc826143c5565b81526148da602083016143c5565b60208201526148eb604083016143c5565b604082015260608201356060820152614906608083016147aa565b608082015260a08201356001600160401b038082111561492557600080fd5b614931858386016147d8565b60a084015260c084013591508082111561494a57600080fd5b506149578482850161484c565b60c08301525092915050565b60006020828403121561497557600080fd5b81356001600160401b0381111561498b57600080fd5b614997848285016148a7565b949350505050565b6000602082840312156149b157600080fd5b813560ff811681146145c257600080fd5b6000604082840312156149d457600080fd5b6149dc614724565b905081356149e9816143b0565b815260208201356bffffffffffffffffffffffff81168114614a0a57600080fd5b602082015292915050565b60006020808385031215614a2857600080fd5b82356001600160401b0380821115614a3f57600080fd5b818501915085601f830112614a5357600080fd5b8135614a616147f9826147b5565b81815260059190911b83018401908481019088831115614a8057600080fd5b8585015b83811015614b5a57803585811115614a9c5760008081fd5b860160e0818c03601f1901811315614ab45760008081fd5b614abc614746565b8983013588811115614ace5760008081fd5b614adc8e8c838701016147d8565b82525060408084013589811115614af35760008081fd5b614b018f8d8388010161484c565b8c840152506060614b138186016143c5565b8284015260809150614b278f8387016149c2565b90830152614b3760c085016147aa565b90820152614b468383016143c5565b60a082015285525050918601918601614a84565b5098975050505050505050565b8015158114610f8357600080fd5b600080600080600060808688031215614b8d57600080fd5b85356001600160401b0380821115614ba457600080fd5b9087019060e0828a031215614bb857600080fd5b90955060208701359080821115614bce57600080fd5b50614bdb88828901614430565b909550935050604086013591506060860135614bf681614b67565b809150509295509295909350565b60008060408385031215614c1757600080fd5b8235614c22816143b0565b91506020830135614c32816143b0565b809150509250929050565b600060408284031215614c4f57600080fd5b614c57614724565b905081356001600160401b0380821115614c7057600080fd5b818401915084601f830112614c8457600080fd5b8135602082821115614c9857614c986146e6565b614caa601f8301601f19168201614768565b92508183528681838601011115614cc057600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a08688031215614cfd57600080fd5b8535614d08816143b0565b94506020860135614d18816143b0565b935060408601356001600160401b0380821115614d3457600080fd5b614d4089838a01614c3d565b94506060880135915080821115614d5657600080fd5b50614d6388828901614c3d565b95989497509295608001359392505050565b60008060208385031215614d8857600080fd5b82356001600160401b03811115614d9e57600080fd5b6144a985828601614511565b60008060408385031215614dbd57600080fd5b8235614dc8816143b0565b946020939093013593505050565b60008060008060808587031215614dec57600080fd5b8435614df7816143b0565b9350602085013592506040850135614e0e816143b0565b9396929550929360600135925050565b600081518084526020808501945080840160005b83811015614e575781516001600160a01b031687529582019590820190600101614e32565b509495945050505050565b600081518084526020808501945080840160005b83811015614e5757815187529582019590820190600101614e76565b604081526000614ea56040830185614e1e565b82810360208401526112d38185614e62565b600080600060608486031215614ecc57600080fd5b8335614ed7816143b0565b925060208401356001600160401b03811115614ef257600080fd5b614efe86828701614c3d565b925050604084013590509250925092565b600060608284031215614f2157600080fd5b6145c283836144f9565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235605e19833603018112614f8e57600080fd5b9190910192915050565b6000808335601e19843603018112614faf57600080fd5b8301803591506001600160401b03821115614fc957600080fd5b6020019150600581901b36038213156140c857600080fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561500b5761500b614fe1565b5060010190565b606081018235615021816143b0565b6001600160a01b03908116835260208401359061503d826143b0565b166020830152604083013561505181614798565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156150a557600080fd5b81516145c2816143b0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561516957600080fd5b81516145c281614b67565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de19833603018112614f8e57600080fd5b6000602082840312156151e457600080fd5b81356145c281614b67565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261524a60e0850182614e1e565b905060c083015184820360c08601526112d38282614e62565b6020815260006145c260208301846151ef565b602081526000825160e06020840152615293610100840182614e1e565b90506020840151601f198483030160408501526152b08282614e62565b915050604084015160018060a01b03808216606086015260608601519150808251166080860152506bffffffffffffffffffffffff60208201511660a085015250608084015161530860c085018263ffffffff169052565b5060a08401516001600160a01b03811660e0850152509392505050565b6000806040838503121561533857600080fd5b825161534381614b67565b6020939093015192949293505050565b82815260406020820152600061499760408301846151ef565b60006020828403121561537e57600080fd5b5051919050565b600082601f83011261539657600080fd5b815160206153a66147f9836147b5565b82815260059290921b840181019181810190868411156153c557600080fd5b8286015b8481101561484157805183529183019183016153c9565b600080604083850312156153f357600080fd5b82516001600160401b038082111561540a57600080fd5b818501915085601f83011261541e57600080fd5b8151602061542e6147f9836147b5565b82815260059290921b8401810191818101908984111561544d57600080fd5b948201945b83861015615474578551615465816143b0565b82529482019490820190615452565b9188015191965090935050508082111561548d57600080fd5b5061549a85828601615385565b9150509250929050565b600082198211156154b7576154b7614fe1565b500190565b6000828210156154ce576154ce614fe1565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561550957600080fd5b81356145c281614798565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561553f816143b0565b6155498183615514565b5060018101602083013561555c816143b0565b6155668183615514565b50604083013561557581614798565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b6020808252825182820181905260009190848201906040850190845b818110156144ed5783516001600160a01b0316835292840192918401916001016155b3565b60006155e436836148a7565b92915050565b82815260006020604081840152835180604085015260005b8181101561561e57858101830151858201606001528201615602565b81811115615630576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561565957600080fd5b81516001600160e01b0319811681146145c257600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e636f6d706c657465517565756564a2646970667358221220cdfcc1af5fed5190052ce3d637e549cf07d10070c3b14546ab58e142da57c70d64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x67d269191c92caf3cd7723f116c85e6e9bf55933":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea26469706673582212204a96a80baf00bab2a09f4228456ebbd097405a873d7029b8462396eaa657617564736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122007c3990e071012e67e928be8d71cb1c6b5ed96fee92e98c9e70cc231dee7232064736f6c634300080c0033","storage":{"0x0":"0xe7f1725e7734ce288f8367e1bb143e90bb3f05120001","0x1":"0x0","0x32":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","0x64":"0xde0b6b3a7640000","0x65":"0x56bc75e2d63100000","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x84ea74d481ee0a5332c457a4d796187f6ba67feb":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122007c3990e071012e67e928be8d71cb1c6b5ed96fee92e98c9e70cc231dee7232064736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0x67d269191c92caf3cd7723f116c85e6e9bf55933","0x66":"0x0","0x9b":"0xa0ee7a142d267c1f36714e4a8f75612f20a79720","0x9c":"0xa0ee7a142d267c1f36714e4a8f75612f20a79720","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x36c02da8a0983159322a80ffe9f24b1acff8b570","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0xc5a5c42992decbae36851359345fe25997f5c42d"}},"0x851356ae760d987e095750cceb3bc6014560891c":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122007c3990e071012e67e928be8d71cb1c6b5ed96fee92e98c9e70cc231dee7232064736f6c634300080c0033","storage":{"0x0":"0x10001","0x33":"0x0","0xeb5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444b":"0xde0b6b3a76400007a2088a1bfc9d81c55368ae168c2c02570cb814f","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xf5059a5d33d5853360d16c683c16e67980206f36","0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49":"0x1","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0xc5a5c42992decbae36851359345fe25997f5c42d"}},"0x860b6912c2d0337ef05bbc89b0c2cb6cbaeab4a5":{"nonce":0,"balance":"0x8ac7230489e80000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea2646970667358221220a22223d3e2a2d861ad54e68b7bc44b4d82a5a12a0bcca5c3404502bb1b430c5c64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x998abeb3e57409262ae5b751f60747921b33613e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102485760003560e01c8063595c6a671161013b578063ab269b2d116100b8578063d72d8dd61161007c578063d72d8dd614610632578063e65797ad1461063a578063f807d627146106dd578063fabc1cbc146106f0578063fd39105a1461070357600080fd5b8063ab269b2d146105ab578063b1344271146105be578063c66ab9ca146105e5578063c81b1ff4146105f8578063ca0de8821461060b57600080fd5b806368304835116100ff578063683048351461051157806385020d4914610538578063886f1195146105585780639e9923c214610571578063a79323f61461059857600080fd5b8063595c6a67146104bc5780635ac86ab7146104c45780635b0b829f146104e35780635c975abb146104f65780636347c900146104fe57600080fd5b8063296bb064116101c95780633561deb11161018d5780633561deb1146104285780633998fdd31461044f5780634b76b9d514610476578063526ea94e146104895780635865c60c1461049c57600080fd5b8063296bb064146103b157806329d1e0c3146103c45780632cdd1e86146103d75780633064620d146103ea5780633431af251461041557600080fd5b806313542a4e1161021057806313542a4e1461031c578063136439dd146103455780631478851f14610358578063250075761461038b57806328f61b311461039e57600080fd5b80630159f1ce1461024d578063054310e61461029b578063055a62b6146102c65780630cf4b767146102f457806310d67a2f14610309575b600080fd5b61026061025b366004613db3565b61073f565b60408051825163ffffffff908116825260208085015190911690820152918101516001600160c01b0316908201526060015b60405180910390f35b6037546102ae906001600160a01b031681565b6040516001600160a01b039091168152602001610292565b6102e66102d4366004613dd5565b60009081526033602052604090205490565b604051908152602001610292565b610307610302366004613eda565b6107d0565b005b610307610317366004613f33565b6108d1565b6102e661032a366004613f33565b6001600160a01b031660009081526034602052604090205490565b610307610353366004613dd5565b610984565b61037b610366366004613dd5565b60356020526000908152604090205460ff1681565b6040519015158152602001610292565b61030761039936600461404e565b610ac1565b6038546102ae906001600160a01b031681565b6102ae6103bf366004613dd5565b6111f1565b6103076103d2366004613f33565b61127d565b6103076103e5366004613f33565b611338565b6103fd6103f8366004614162565b6113f3565b6040516001600160c01b039091168152602001610292565b6103fd610423366004613dd5565b6115f4565b6102ae7f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc981565b6102ae7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369081565b610307610484366004614222565b6116aa565b6103076104973660046142ff565b6119d6565b6104af6104aa366004613f33565b611a27565b60405161029291906143a2565b610307611a9b565b61037b6104d23660046143d5565b6001805460ff9092161b9081161490565b6103076104f13660046143f0565b611b67565b6001546102e6565b6102ae61050c366004613dd5565b611c27565b6102ae7f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c81565b61054b61054636600461448a565b611c51565b60405161029291906144d9565b6000546102ae906201000090046001600160a01b031681565b6102ae7f0000000000000000000000001613beb3b2c4f22ee086b2b38c1476a3ce7f78e881565b6103076105a6366004614523565b611f8c565b6102e66105b93660046145fa565b61201f565b6102ae7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b6103076105f33660046146ae565b612083565b6103076106063660046142ff565b6120ee565b6102e67fae63aa1318751f64ef850e045417f86811eaecee1cebc226904d237b80704d9281565b6036546102e6565b6106a96106483660046143d5565b60408051606080820183526000808352602080840182905292840181905260ff9490941684526032825292829020825193840183525463ffffffff8116845261ffff600160201b8204811692850192909252600160301b9004169082015290565b60408051825163ffffffff16815260208084015161ffff908116918301919091529282015190921690820152606001610292565b6103076106eb366004614732565b612135565b6103076106fe366004613dd5565b612169565b610732610711366004613f33565b6001600160a01b031660009081526034602052604090206001015460ff1690565b60405161029291906147af565b6040805160608101825260008082526020820181905291810191909152600083815260336020526040902080548390811061077c5761077c6147bd565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160c01b03600160401b909304929092169082015290505b92915050565b60013360009081526034602052604090206001015460ff1660028111156107f9576107f961436a565b146108855760405162461bcd60e51b815260206004820152604b60248201527f424c535265676973747279436f6f7264696e61746f7257697468496e6469636960448201527f65732e757064617465536f636b65743a206f70657261746f72206973206e6f7460648201526a081c9959da5cdd195c995960aa1b608482015260a4015b60405180910390fd5b33600090815260346020526040908190205490517fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa906108c690849061482f565b60405180910390a250565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190614842565b6001600160a01b0316336001600160a01b0316146109785760405162461bcd60e51b815260040161087c9061485f565b610981816122c5565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156109d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f591906148a9565b610a115760405162461bcd60e51b815260040161087c906148cb565b60015481811614610a8a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161087c565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020016108c6565b600180546000919081161415610ae95760405162461bcd60e51b815260040161087c90614913565b6000610b2e338b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123ca92505050565b6040805160018082528183019092529192506000919060208083019080368337019050509050610b5d896129eb565b81600081518110610b7057610b706147bd565b602002602001018181525050610bf381600081518110610b9257610b926147bd565b60200260200101518787808060200260200160405190810160405280939291908181526020016000905b82821015610be857610bd96080830286013681900381019061494a565b81526020019060010190610bbc565b505050505086612a2e565b6000805b8b8110156111e25760008d8d83818110610c1357610c136147bd565b919091013560f81c6000818152603260209081526040918290208251606081018452905463ffffffff811680835261ffff600160201b8304811694840194909452600160301b90910490921692810192909252885192945090925090879085908110610c8157610c816147bd565b602002602001015163ffffffff1611610c9b5750506111d0565b8160ff168a8a86818110610cb157610cb16147bd565b610cc792602060809092020190810191506143d5565b60ff1614610d605760405162461bcd60e51b81526020600482015260666024820152600080516020614f3883398151915260448201527f732e72656769737465724f70657261746f7257697468436f6f7264696e61746f60648201527f723a2071756f72756d4e756d626572206e6f74207468652073616d65206173206084820152651cda59db995960d21b60a482015260c40161087c565b604051630c8f739d60e41b815260ff831660048201526000907f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c6001600160a01b03169063c8f739d090602401602060405180830381865afa158015610dca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dee9190614966565b90506000603460008d8d88818110610e0857610e086147bd565b9050608002016020016020810190610e209190613f33565b6001600160a01b039081168252602082019290925260409081016000908120549151631aad4e3560e21b81526004810183905260ff88166024820152919350917f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c1690636ab538d490604401602060405180830381865afa158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecd9190614966565b905060007f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c6001600160a01b0316636ab538d48a600081518110610f1357610f136147bd565b6020026020010151886040518363ffffffff1660e01b8152600401610f4592919091825260ff16602082015260400190565b602060405180830381865afa158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f869190614966565b602086015190915061271090610fa09061ffff16846149a5565b610faa91906149d4565b6001600160601b0316816001600160601b03161161106a5760405162461bcd60e51b815260206004820152607d6024820152600080516020614f3883398151915260448201527f732e72656769737465724f70657261746f7257697468436f6f7264696e61746f60648201527f723a207265676973746572696e67206f70657261746f7220686173206c65737360848201527f207468616e206b69636b424950734f664f70657261746f725374616b6500000060a482015260c40161087c565b6040850151612710906110819061ffff16866149a5565b61108b91906149d4565b6001600160601b0316826001600160601b0316106111445760405162461bcd60e51b81526020600482015260766024820152600080516020614f3883398151915260448201527f732e72656769737465724f70657261746f7257697468436f6f7264696e61746f60648201527f723a206f70657261746f7220746f206b69636b20686173206d6f7265207468616084820152756e206b69636b424950534f66546f74616c5374616b6560501b60a482015260c40161087c565b8761114e81614a08565b9850505050505050506111d088888381811061116c5761116c6147bd565b90506080020160200160208101906111849190613f33565b8e838f611192826001614a23565b9261119f93929190614a3b565b8b8b868181106111b1576111b16147bd565b9050608002016040018036038101906111ca9190614a65565b87612bfb565b806111da81614a08565b915050610bf7565b50505050505050505050505050565b6040516308f6629d60e31b8152600481018290526000907f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b0316906347b314e890602401602060405180830381865afa158015611259573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ca9190614842565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ff9190614842565b6001600160a01b0316336001600160a01b03161461132f5760405162461bcd60e51b815260040161087c90614a81565b610981816131ab565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ba9190614842565b6001600160a01b0316336001600160a01b0316146113ea5760405162461bcd60e51b815260040161087c90614a81565b61098181613214565b6000838152603360205260408120805482919084908110611416576114166147bd565b600091825260209182902060408051606081018252929091015463ffffffff808216808552600160201b8304821695850195909552600160401b9091046001600160c01b031691830191909152909250851610156115165760405162461bcd60e51b815260206004820152607f6024820152600080516020614f3883398151915260448201527f732e67657451756f72756d4269746d617042794f70657261746f72496441744260648201527f6c6f636b4e756d6265724279496e6465783a2071756f72756d4269746d61705560848201527f70646174652069732066726f6d20616674657220626c6f636b4e756d6265720060a482015260c40161087c565b8363ffffffff16816020015163ffffffff16118061153c5750602081015163ffffffff16155b6115e85760405162461bcd60e51b81526020600482015260806024820152600080516020614f3883398151915260448201527f732e67657451756f72756d4269746d617042794f70657261746f72496441744260648201527f6c6f636b4e756d6265724279496e6465783a2071756f72756d4269746d61705560848201527f70646174652069732066726f6d206265666f726520626c6f636b4e756d62657260a482015260c40161087c565b60400151949350505050565b60008181526033602052604081205480158061165057506000838152603360205260409020611624600183614afd565b81548110611634576116346147bd565b600091825260209091200154600160201b900463ffffffff1615155b1561165e5750600092915050565b6000838152603360205260409020611677600183614afd565b81548110611687576116876147bd565b600091825260209091200154600160401b90046001600160c01b03169392505050565b600054610100900460ff16158080156116ca5750600054600160ff909116105b806116e45750303b1580156116e4575060005460ff166001145b6117475760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161087c565b6000805460ff19166001179055801561176a576000805461ff0019166101001790555b611774838361327d565b61177d866131ab565b61178685613214565b603680546001808201835560008390527f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b891820180546001600160a01b03199081167f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c6001600160a01b03908116918217909355855480850187558501805483167f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc9851617905585549384019095559190920180549091167f0000000000000000000000001613beb3b2c4f22ee086b2b38c1476a3ce7f78e8909216919091179055845160408051639aa1653d60e01b81529051919291639aa1653d916004808201926020929091908290030181865afa1580156118a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cc9190614b14565b61ffff16146119405760405162461bcd60e51b81526020600482015260466024820152600080516020614f3883398151915260448201527f733a206f70657261746f722073657420706172616d73206c656e677468206d696064820152650e6dac2e8c6d60d31b608482015260a40161087c565b60005b84518160ff1610156119875761197581868360ff1681518110611968576119686147bd565b6020026020010151613369565b8061197f81614b31565b915050611943565b5080156119ce576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6001805460009190811614156119fe5760405162461bcd60e51b815260040161087c90614913565b600080611a0d84860186614b51565b91509150611a1e3388888585613416565b50505050505050565b60408051808201909152600080825260208201526001600160a01b0382166000908152603460209081526040918290208251808401909352805483526001810154909183019060ff166002811115611a8157611a8161436a565b6002811115611a9257611a9261436a565b90525092915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0c91906148a9565b611b285760405162461bcd60e51b815260040161087c906148cb565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be99190614842565b6001600160a01b0316336001600160a01b031614611c195760405162461bcd60e51b815260040161087c90614a81565b611c238282613369565b5050565b60368181548110611c3757600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600082516001600160401b03811115611c6e57611c6e613dee565b604051908082528060200260200182016040528015611c97578160200160208202803683370190505b50905060005b8351811015611f8457600060336000868481518110611cbe57611cbe6147bd565b6020026020010151815260200190815260200160002080549050905060005b8163ffffffff168163ffffffff161015611f6f578663ffffffff1660336000888681518110611d0e57611d0e6147bd565b6020026020010151815260200190815260200160002060018385611d329190614b95565b611d3c9190614b95565b63ffffffff1681548110611d5257611d526147bd565b60009182526020909120015463ffffffff1611611f5d5760336000878581518110611d7f57611d7f6147bd565b6020026020010151815260200190815260200160002060018284611da39190614b95565b611dad9190614b95565b63ffffffff1681548110611dc357611dc36147bd565b600091825260209091200154600160201b900463ffffffff161580611e5f57508663ffffffff1660336000888681518110611e0057611e006147bd565b6020026020010151815260200190815260200160002060018385611e249190614b95565b611e2e9190614b95565b63ffffffff1681548110611e4457611e446147bd565b600091825260209091200154600160201b900463ffffffff16115b611f165760405162461bcd60e51b81526020600482015260826024820152600080516020614f3883398151915260448201527f732e67657451756f72756d4269746d6170496e646963657342794f706572617460648201527f6f724964734174426c6f636b4e756d6265723a206f70657261746f724964206860848201527f6173206e6f2071756f72756d4269746d61707320617420626c6f636b4e756d6260a48201526132b960f11b60c482015260e40161087c565b6001611f228284614b95565b611f2c9190614b95565b848481518110611f3e57611f3e6147bd565b602002602001019063ffffffff16908163ffffffff1681525050611f6f565b80611f6781614bba565b915050611cdd565b50508080611f7c90614a08565b915050611c9d565b509392505050565b6038546001600160a01b0316331461200b5760405162461bcd60e51b81526020600482015260486024820152600080516020614f3883398151915260448201527f732e6f6e6c79456a6563746f723a2063616c6c6572206973206e6f74207468656064820152671032b532b1ba37b960c11b608482015260a40161087c565b6120188585858585612bfb565b5050505050565b60006120787fae63aa1318751f64ef850e045417f86811eaecee1cebc226904d237b80704d928686868660405160200161205d959493929190614bde565b6040516020818303038152906040528051906020012061352d565b90505b949350505050565b6001805460009190811614156120ab5760405162461bcd60e51b815260040161087c90614913565b6119ce3387878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061341692505050565b60018054600290811614156121155760405162461bcd60e51b815260040161087c90614913565b60008061212484860186614c72565b91509150611a1e3388888585612bfb565b600180546002908116141561215c5760405162461bcd60e51b815260040161087c90614913565b6120183386868686612bfb565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e09190614842565b6001600160a01b0316336001600160a01b0316146122105760405162461bcd60e51b815260040161087c9061485f565b60015419811960015419161461228e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161087c565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016108c6565b6001600160a01b0381166123535760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161087c565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6060600061240d86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061357b92505050565b90506001600160c01b038111156124a25760405162461bcd60e51b815260206004820152606b6024820152600080516020614f388339815191526044820152600080516020614f1883398151915260648201527f6f723a2071756f72756d4269746d61702065786365656473206f66206d61782060848201526a6269746d61702073697a6560a81b60a482015260c40161087c565b806125175760405162461bcd60e51b815260206004820152605c6024820152600080516020614f388339815191526044820152600080516020614f1883398151915260648201527f6f723a2071756f72756d4269746d61702063616e6e6f74206265203000000000608482015260a40161087c565b6040516303ce4bad60e01b81526000906001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc916906303ce4bad9061256c908b908b908b908b90600401614cd3565b6020604051808303816000875af115801561258b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125af9190614d10565b60008181526033602052604090205490915080156126c35760008281526033602052604081206125e0600184614afd565b815481106125f0576125f06147bd565b6000918252602090912001546001600160c01b03600160401b9091048181169250851616156126bd5760405162461bcd60e51b81526020600482015260856024820152600080516020614f388339815191526044820152600080516020614f1883398151915260648201527f6f723a206f70657261746f7220616c726561647920726567697374657265642060848201527f666f7220736f6d652071756f72756d73206265696e672072656769737465726560a48201526432103337b960d91b60c482015260e40161087c565b92909217915b604051632550477760e01b81526001600160a01b037f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c1690632550477790612715908c9086908d908d90600401614d29565b600060405180830381600087803b15801561272f57600080fd5b505af1158015612743573d6000803e3d6000fd5b505060405162bff04d60e01b8152600092506001600160a01b037f0000000000000000000000001613beb3b2c4f22ee086b2b38c1476a3ce7f78e816915062bff04d906127989086908d908d90600401614d5b565b6000604051808303816000875af11580156127b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127df9190810190614d75565b600084815260336020526040902054909150801561284e5760008481526033602052604090204390612812600184614afd565b81548110612822576128226147bd565b9060005260206000200160000160046101000a81548163ffffffff021916908363ffffffff1602179055505b6000848152603360209081526040808320815160608101835263ffffffff43811682528185018681526001600160c01b038c8116848701908152855460018082018855968a52888a2095519501805493519151909216600160401b026001600160401b03918516600160201b0267ffffffffffffffff19909416959094169490941791909117929092161790556001600160a01b038f168452603490925290912081015460ff1660028111156129065761290661436a565b146129a3576040805180820190915284815260208101600190526001600160a01b038c166000908152603460209081526040909120825181559082015160018083018054909160ff19909116908360028111156129655761296561436a565b0217905550506040518591506001600160a01b038d16907fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe90600090a35b837fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa886040516129d3919061482f565b60405180910390a25093505050505b95945050505050565b600081600001518260200151604051602001612a11929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b60208082015160009081526035909152604090205460ff1615612af35760405162461bcd60e51b81526020600482015260776024820152600080516020614f3883398151915260448201527f732e5f766572696679436875726e417070726f7665725369676e61747572654f60648201527f6e4f70657261746f72436875726e417070726f76616c3a20636875726e41707060848201527f726f7665722073616c7420616c7265616479207573656400000000000000000060a482015260c40161087c565b4281604001511015612ba75760405162461bcd60e51b81526020600482015260776024820152600080516020614f3883398151915260448201527f732e5f766572696679436875726e417070726f7665725369676e61747572654f60648201527f6e4f70657261746f72436875726e417070726f76616c3a20636875726e41707060848201527f726f766572207369676e6174757265206578706972656400000000000000000060a482015260c40161087c565b6020808201805160009081526035909252604091829020805460ff19166001179055603754905191830151612bf6926001600160a01b0390921691612bef918791879161201f565b8351613708565b505050565b60016001600160a01b03861660009081526034602052604090206001015460ff166002811115612c2d57612c2d61436a565b14612cb45760405162461bcd60e51b81526020600482015260606024820152600080516020614f3883398151915260448201527f732e5f646572656769737465724f70657261746f7257697468436f6f7264696e60648201527f61746f723a206f70657261746f72206973206e6f742072656769737465726564608482015260a40161087c565b6001600160a01b038516600090815260346020526040902054612cd6836129eb565b8114612d725760405162461bcd60e51b815260206004820152606b6024820152600080516020614f3883398151915260448201527f732e5f646572656769737465724f70657261746f7257697468436f6f7264696e60648201527f61746f723a206f70657261746f72496420646f6573206e6f74206d617463682060848201526a0e0eac4d6caf240d0c2e6d60ab1b60a482015260c40161087c565b6000612db386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061357b92505050565b60008381526033602052604081205491925090612dd290600190614afd565b60008481526033602052604081208054929350909183908110612df757612df76147bd565b6000918252602082200154600160401b90049384166001600160c01b0390811694169150612e24846138c2565b9050805160001415612ed85760405162461bcd60e51b81526020600482015260806024820152600080516020614f3883398151915260448201527f732e5f646572656769737465724f70657261746f7257697468436f6f7264696e60648201527f61746f723a206f70657261746f72206973206e6f74207265676973746572656460848201527f20666f7220616e79206f66207468652070726f76696465642071756f72756d7360a482015260c40161087c565b60405163121b4d9560e11b81526001600160c01b0383168514906001600160a01b037f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc916906324369b2a90612f35908e9086908d90600401614e0e565b600060405180830381600087803b158015612f4f57600080fd5b505af1158015612f63573d6000803e3d6000fd5b505060405163bd29b8cd60e01b81526001600160a01b037f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c16925063bd29b8cd9150612fb59089908690600401614e4a565b600060405180830381600087803b158015612fcf57600080fd5b505af1158015612fe3573d6000803e3d6000fd5b5050604051630854259f60e01b81526001600160a01b037f0000000000000000000000001613beb3b2c4f22ee086b2b38c1476a3ce7f78e8169250630854259f915061303790899086908c90600401614e63565b600060405180830381600087803b15801561305157600080fd5b505af1158015613065573d6000803e3d6000fd5b505050600087815260336020526040902080544392508690811061308b5761308b6147bd565b9060005260206000200160000160046101000a81548163ffffffff021916908363ffffffff1602179055508061314f576000868152603360209081526040808320815160608101835263ffffffff43811682528185018681526001600160c01b038c198b168116958401958652845460018101865594885295909620915191909201805495519351909416600160401b026001600160401b03938316600160201b0267ffffffffffffffff199096169190921617939093171691909117905561319e565b6001600160a01b038b16600081815260346020526040808220600101805460ff19166002179055518892917f396fdcb180cb0fea26928113fb0fd1c3549863f9cd563e6a184f1d578116c8e491a35b5050505050505050505050565b603754604080516001600160a01b03928316815291831660208301527f315457d8a8fe60f04af17c16e2f5a5e1db612b31648e58030360759ef8f3528c910160405180910390a1603780546001600160a01b0319166001600160a01b0392909216919091179055565b603854604080516001600160a01b03928316815291831660208301527f8f30ab09f43a6c157d7fce7e0a13c003042c1c95e8a72e7a146a21c0caa24dc9910160405180910390a1603880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546201000090046001600160a01b03161580156132a457506001600160a01b03821615155b6133265760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161087c565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611c23826122c5565b60ff8216600081815260326020908152604091829020845181548684018051888701805163ffffffff90951665ffffffffffff199094168417600160201b61ffff938416021767ffff0000000000001916600160301b95831695909502949094179094558551918252518316938101939093525116918101919091527f3ee6fe8d54610244c3e9d3c066ae4aee997884aa28f10616ae821925401318ac9060600160405180910390a25050565b600061342586868686866123ca565b905060005b8151811015611a1e5760326000878784818110613449576134496147bd565b919091013560f81c825250602081019190915260400160002054825163ffffffff90911690839083908110613480576134806147bd565b602002602001015163ffffffff16111561351b5760405162461bcd60e51b815260206004820152606e6024820152600080516020614f388339815191526044820152600080516020614f1883398151915260648201527f6f72416e644e6f4f76657266696c6c656451756f72756d733a2071756f72756d60848201526d081a5cc81bdd995c999a5b1b195960921b60a482015260c40161087c565b8061352581614a08565b91505061342a565b60006107ca61353a61391f565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000610100825111156136045760405162461bcd60e51b8152602060048201526044602482018190527f4269746d61705574696c732e6f72646572656442797465734172726179546f42908201527f69746d61703a206f7264657265644279746573417272617920697320746f6f206064820152636c6f6e6760e01b608482015260a40161087c565b815161361257506000919050565b60008083600081518110613628576136286147bd565b0160200151600160f89190911c81901b92505b84518110156136ff57848181518110613656576136566147bd565b0160200151600160f89190911c1b91508282116136eb5760405162461bcd60e51b815260206004820152604760248201527f4269746d61705574696c732e6f72646572656442797465734172726179546f4260448201527f69746d61703a206f72646572656442797465734172726179206973206e6f74206064820152661bdc99195c995960ca1b608482015260a40161087c565b918117916136f881614a08565b905061363b565b50909392505050565b6001600160a01b0383163b1561382257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906137489086908690600401614e4a565b602060405180830381865afa158015613765573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137899190614ebe565b6001600160e01b03191614612bf65760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161087c565b826001600160a01b03166138368383613a46565b6001600160a01b031614612bf65760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161087c565b60606000805b610100811015613918576001811b91508382161561390857828160f81b6040516020016138f6929190614ee8565b60405160208183030381529060405292505b61391181614a08565b90506138c8565b5050919050565b6000306001600160a01b037f000000000000000000000000998abeb3e57409262ae5b751f60747921b33613e1614801561397857507f0000000000000000000000000000000000000000000000000000000000007a6946145b156139a257507f4722b021648aeef9ce065bae7f04ff27be0ea604ef6f437aca779598df5e127f90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f6ec8a99f0e7f9ebde7354a446dcb9423f3af9c58f386a53c59c5b384f9e82d11828401527f6bda7e3f385e48841048390444cced5cc795af87758af67622e5f4f0882c4a9960608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000806000613a558585613a62565b91509150611f8481613ad2565b600080825160411415613a995760208301516040840151606085015160001a613a8d87828585613c8d565b94509450505050613acb565b825160401415613ac35760208301516040840151613ab8868383613d7a565b935093505050613acb565b506000905060025b9250929050565b6000816004811115613ae657613ae661436a565b1415613aef5750565b6001816004811115613b0357613b0361436a565b1415613b515760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161087c565b6002816004811115613b6557613b6561436a565b1415613bb35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161087c565b6003816004811115613bc757613bc761436a565b1415613c205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161087c565b6004816004811115613c3457613c3461436a565b14156109815760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161087c565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613cc45750600090506003613d71565b8460ff16601b14158015613cdc57508460ff16601c14155b15613ced5750600090506004613d71565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613d41573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613d6a57600060019250925050613d71565b9150600090505b94509492505050565b6000806001600160ff1b03831681613d9760ff86901c601b614a23565b9050613da587828885613c8d565b935093505050935093915050565b60008060408385031215613dc657600080fd5b50508035926020909101359150565b600060208284031215613de757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715613e2657613e26613dee565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e5457613e54613dee565b604052919050565b60006001600160401b03831115613e7557613e75613dee565b613e88601f8401601f1916602001613e2c565b9050828152838383011115613e9c57600080fd5b828260208301376000602084830101529392505050565b600082601f830112613ec457600080fd5b613ed383833560208501613e5c565b9392505050565b600060208284031215613eec57600080fd5b81356001600160401b03811115613f0257600080fd5b61207b84828501613eb3565b6001600160a01b038116811461098157600080fd5b8035613f2e81613f0e565b919050565b600060208284031215613f4557600080fd5b8135613ed381613f0e565b60008083601f840112613f6257600080fd5b5081356001600160401b03811115613f7957600080fd5b602083019150836020828501011115613acb57600080fd5b600060408284031215613fa357600080fd5b604051604081018181106001600160401b0382111715613fc557613fc5613dee565b604052823581526020928301359281019290925250919050565b600060608284031215613ff157600080fd5b613ff9613e04565b905081356001600160401b0381111561401157600080fd5b8201601f8101841361402257600080fd5b61403184823560208401613e5c565b825250602082013560208201526040820135604082015292915050565b60008060008060008060008060c0898b03121561406a57600080fd5b88356001600160401b038082111561408157600080fd5b61408d8c838d01613f50565b909a5098508891506140a28c60208d01613f91565b975060608b01359150808211156140b857600080fd5b6140c48c838d01613f50565b909750955060808b01359150808211156140dd57600080fd5b818b0191508b601f8301126140f157600080fd5b81358181111561410057600080fd5b8c60208260071b850101111561411557600080fd5b6020830195508094505060a08b013591508082111561413357600080fd5b506141408b828c01613fdf565b9150509295985092959890939650565b63ffffffff8116811461098157600080fd5b60008060006060848603121561417757600080fd5b83359250602084013561418981614150565b929592945050506040919091013590565b60006001600160401b038211156141b3576141b3613dee565b5060051b60200190565b61ffff8116811461098157600080fd5b6000606082840312156141df57600080fd5b6141e7613e04565b905081356141f481614150565b81526020820135614204816141bd565b60208201526040820135614217816141bd565b604082015292915050565b600080600080600060a0868803121561423a57600080fd5b853561424581613f0e565b945060208681013561425681613f0e565b945060408701356001600160401b0381111561427157600080fd5b8701601f8101891361428257600080fd5b80356142956142908261419a565b613e2c565b8181526060918202830184019184820191908c8411156142b457600080fd5b938501935b838510156142da576142cb8d866141cd565b835293840193918501916142b9565b8198506142e8818d01613f23565b9a9d999c50979a6080013598975050505050505050565b6000806000806040858703121561431557600080fd5b84356001600160401b038082111561432c57600080fd5b61433888838901613f50565b9096509450602087013591508082111561435157600080fd5b5061435e87828801613f50565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b6003811061439e57634e487b7160e01b600052602160045260246000fd5b9052565b8151815260208083015160408301916143bd90840182614380565b5092915050565b803560ff81168114613f2e57600080fd5b6000602082840312156143e757600080fd5b613ed3826143c4565b6000806080838503121561440357600080fd5b61440c836143c4565b915061441b84602085016141cd565b90509250929050565b600082601f83011261443557600080fd5b813560206144456142908361419a565b82815260059290921b8401810191818101908684111561446457600080fd5b8286015b8481101561447f5780358352918301918301614468565b509695505050505050565b6000806040838503121561449d57600080fd5b82356144a881614150565b915060208301356001600160401b038111156144c357600080fd5b6144cf85828601614424565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561451757835163ffffffff16835292840192918401916001016144f5565b50909695505050505050565b600080600080600060a0868803121561453b57600080fd5b853561454681613f0e565b945060208601356001600160401b038082111561456257600080fd5b61456e89838a01613f50565b90965094508491506145838960408a01613f91565b9350608088013591508082111561459957600080fd5b506145a688828901614424565b9150509295509295909350565b6000608082840312156145c557600080fd5b6145cd613e04565b90506145d8826143c4565b815260208201356145e881613f0e565b60208201526142178360408401613f91565b600080600080608080868803121561461157600080fd5b853594506020808701356001600160401b0381111561462f57600080fd5b8701601f8101891361464057600080fd5b803561464e6142908261419a565b81815260079190911b8201830190838101908b83111561466d57600080fd5b928401925b82841015614693576146848c856145b3565b82529285019290840190614672565b989b989a505050506040870135966060013595945050505050565b6000806000806000608086880312156146c657600080fd5b85356001600160401b03808211156146dd57600080fd5b6146e989838a01613f50565b90975095508591506146fe8960208a01613f91565b9450606088013591508082111561471457600080fd5b5061472188828901613f50565b969995985093965092949392505050565b6000806000806080858703121561474857600080fd5b84356001600160401b038082111561475f57600080fd5b61476b88838901613f50565b90965094508491506147808860208901613f91565b9350606087013591508082111561479657600080fd5b506147a387828801614424565b91505092959194509250565b602081016107ca8284614380565b634e487b7160e01b600052603260045260246000fd5b60005b838110156147ee5781810151838201526020016147d6565b838111156147fd576000848401525b50505050565b6000815180845261481b8160208601602086016147d3565b601f01601f19169290920160200192915050565b602081526000613ed36020830184614803565b60006020828403121561485457600080fd5b8151613ed381613f0e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156148bb57600080fd5b81518015158114613ed357600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60006080828403121561495c57600080fd5b613ed383836145b3565b60006020828403121561497857600080fd5b81516001600160601b0381168114613ed357600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160601b03808316818516818304811182151516156149cb576149cb61498f565b02949350505050565b60006001600160601b03808416806149fc57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b6000600019821415614a1c57614a1c61498f565b5060010190565b60008219821115614a3657614a3661498f565b500190565b60008085851115614a4b57600080fd5b83861115614a5857600080fd5b5050820193919092039150565b600060408284031215614a7757600080fd5b613ed38383613f91565b6020808252606290820152600080516020614f3883398151915260408201527f732e6f6e6c79536572766963654d616e616765724f776e65723a2063616c6c6560608201527f72206973206e6f74207468652073657276696365206d616e61676572206f776e60808201526132b960f11b60a082015260c00190565b600082821015614b0f57614b0f61498f565b500390565b600060208284031215614b2657600080fd5b8151613ed3816141bd565b600060ff821660ff811415614b4857614b4861498f565b60010192915050565b60008060608385031215614b6457600080fd5b614b6e8484613f91565b915060408301356001600160401b03811115614b8957600080fd5b6144cf85828601613eb3565b600063ffffffff83811690831681811015614bb257614bb261498f565b039392505050565b600063ffffffff80831681811415614bd457614bd461498f565b6001019392505050565b600060a0820187835260208781850152604060a08186015282885180855260c087019150838a01945060005b81811015614c59578551805160ff168452858101516001600160a01b031686850152840151614c458585018280518252602090810151910152565b509484019460809290920191600101614c0a565b5050606086019790975250505050608001529392505050565b60008060608385031215614c8557600080fd5b614c8f8484613f91565b915060408301356001600160401b038111156144c357600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385168152608060208201819052600090614cf89083018587614caa565b835160408401526020840151606084015290506129e2565b600060208284031215614d2257600080fd5b5051919050565b60018060a01b0385168152836020820152606060408201526000614d51606083018486614caa565b9695505050505050565b838152604060208201526000612078604083018486614caa565b60006020808385031215614d8857600080fd5b82516001600160401b03811115614d9e57600080fd5b8301601f81018513614daf57600080fd5b8051614dbd6142908261419a565b81815260059190911b82018301908381019087831115614ddc57600080fd5b928401925b82841015614e03578351614df481614150565b82529284019290840190614de1565b979650505050505050565b6001600160a01b0384168152608060208201819052600090614e3290830185614803565b8351604084015260208401516060840152905061207b565b82815260406020820152600061207b6040830184614803565b83815260006020606081840152614e7d6060840186614803565b838103604085015284518082528286019183019060005b81811015614eb057835183529284019291840191600101614e94565b509098975050505050505050565b600060208284031215614ed057600080fd5b81516001600160e01b031981168114613ed357600080fd5b60008351614efa8184602088016147d3565b6001600160f81b031993909316919092019081526001019291505056fe732e5f72656769737465724f70657261746f7257697468436f6f7264696e6174424c535265676973747279436f6f7264696e61746f7257697468496e64696365a264697066735822122094c9ce03f3a1b461b848d8700e3c2756fc5bece89ea4b2176574e10e82333abc64736f6c634300080c0033","storage":{}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cb578063e5db06c014610404578063eb990c5914610424578063ecb7cb1b14610444578063f2fde38b14610471578063fabc1cbc1461049157600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ab57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196b565b6104b1565b005b34801561017e57600080fd5b5061017061018d36600461198f565b61056d565b34801561019e57600080fd5b506101b26101ad36600461196b565b6106ac565b6040516101bf91906119c6565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196b565b6108a7565b3480156101f457600080fd5b5061021c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f36600461198f565b6109ed565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109fe565b34801561029957600080fd5b506102bd6102a8366004611a13565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac5565b34801561030357600080fd5b506102bd610312366004611a36565b610ad9565b34801561032357600080fd5b50610337610332366004611a36565b610b5c565b6040516101bf9190611a62565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a70565b610bdc565b3480156103a157600080fd5b5061026a61c4e081565b3480156103b757600080fd5b506101706103c636600461198f565b610e9c565b3480156103d757600080fd5b5061026a6103e636600461196b565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041057600080fd5b5061017061041f366004611a36565b610f30565b34801561043057600080fd5b5061017061043f366004611aa9565b610fc5565b34801561045057600080fd5b5061046461045f36600461196b565b6110ed565b6040516101bf9190611aef565b34801561047d57600080fd5b5061017061048c36600461196b565b6111a7565b34801561049d57600080fd5b506101706104ac36600461198f565b61121d565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b45565b6001600160a01b0316336001600160a01b0316146105615760405162461bcd60e51b815260040161055890611b62565b60405180910390fd5b61056a81611379565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190611bac565b6105f55760405162461bcd60e51b815260040161055890611bce565b6098548181161461066e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106d98383611c2c565b90508060005b82811015610785576001600160a01b038716600090815260ca6020526040812060010161070c8388611c43565b8154811061071c5761071c611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076291611c43565b4310156107725781925050610785565b508061077d81611c71565b9150506106df565b508060008167ffffffffffffffff8111156107a2576107a2611c8c565b6040519080825280602002602001820160405280156107e757816020015b60408051808201909152600080825260208201528152602001906001900390816107c05790505b509050811561089c5760005b8281101561089a576001600160a01b038916600090815260ca602052604090206001016108208289611c43565b8154811061083057610830611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087c5761087c611c5b565b6020026020010181905250808061089290611c71565b9150506107f3565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d48383611c2c565b905060008167ffffffffffffffff8111156108f1576108f1611c8c565b60405190808252806020026020018201604052801561093657816020015b604080518082019091526000808252602082015281526020019060019003908161090f5790505b50905060005b828110156109e3576001600160a01b038716600090815260ca602052604090206001016109698287611c43565b8154811061097957610979611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c5576109c5611c5b565b602002602001018190525080806109db90611c71565b91505061093c565b5095945050505050565b6109f5611470565b61056a816114ca565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a9190611bac565b610a865760405162461bcd60e51b815260040161055890611bce565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610acd611470565b610ad76000611591565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b53575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2c57610b2c611c5b565b600091825260209091200154610b4f9190600160e01b900463ffffffff16611c43565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9d57610b9d611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063a38406a390602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611b45565b6001600160a01b031614610ce65760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610558565b60985460009060019081161415610d0f5760405162461bcd60e51b815260040161055890611ca2565b6001600160a01b038316610da55760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610558565b346001600160e01b03811615610e95576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5691611c2c565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610eef5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610f1d5760405162461bcd60e51b815260040161055890611ca2565b610f2733836115e3565b50506001606555565b60026065541415610f835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610fb15760405162461bcd60e51b815260040161055890611ca2565b610fbb83836115e3565b5050600160655550565b600054610100900460ff1615808015610fe55750600054600160ff909116105b80610fff5750303b158015610fff575060005460ff166001145b6110625760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610558565b6000805460ff191660011790558015611085576000805461ff0019166101001790555b61108e85611591565b611098848461174e565b6110a1826114ca565b8015610e95576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119957600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114d565b505050915250909392505050565b6111af611470565b6001600160a01b0381166112145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610558565b61056a81611591565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112949190611b45565b6001600160a01b0316336001600160a01b0316146112c45760405162461bcd60e51b815260040161055890611b62565b6098541981196098541916146113425760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a1565b6001600160a01b0381166114075760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610558565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610558565b61c4e08111156115505760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610558565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161c57508161161a8285611c43565b105b156116c9576001600160a01b038616600090815260ca602052604081206001016116468386611c43565b8154811061165657611656611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169c91611c43565b4310156116a957506116c9565b80516116be906001600160e01b031686611c43565b945050600101611605565b6116d38184611c43565b6001600160a01b038716600090815260ca602052604090205583156116fc576116fc8685611838565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb094386856117298487611c43565b604080516001600160a01b039094168452602084019290925290820152606001610e8b565b6097546001600160a01b031615801561176f57506001600160a01b03821615155b6117f15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261183482611379565b5050565b804710156118885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610558565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d5576040519150601f19603f3d011682016040523d82523d6000602084013e6118da565b606091505b50509050806119515760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610558565b505050565b6001600160a01b038116811461056a57600080fd5b60006020828403121561197d57600080fd5b813561198881611956565b9392505050565b6000602082840312156119a157600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a06576119f68483516119a8565b92840192908501906001016119e3565b5091979650505050505050565b600060208284031215611a2557600080fd5b813560ff8116811461198857600080fd5b60008060408385031215611a4957600080fd5b8235611a5481611956565b946020939093013593505050565b60408101610b5682846119a8565b60008060408385031215611a8357600080fd5b8235611a8e81611956565b91506020830135611a9e81611956565b809150509250929050565b60008060008060808587031215611abf57600080fd5b8435611aca81611956565b93506020850135611ada81611956565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089a57611b318286516119a8565b938501936001939093019290820190611b1e565b600060208284031215611b5757600080fd5b815161198881611956565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bbe57600080fd5b8151801515811461198857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c3e57611c3e611c16565b500390565b60008219821115611c5657611c56611c16565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8557611c85611c16565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea26469706673582212207b53abbb96e06b03175441e64ced2499614fc0a3f64f5b8b831996e0e25b8d8264736f6c634300080c0033","storage":{}},"0x9d4454b023096f34b160d6b654540c56a1f81688":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806368304835116100de578063886f119511610097578063c747075b11610071578063c747075b146103d6578063ce43e858146103e9578063f2fde38b14610410578063fabc1cbc1461042357600080fd5b8063886f1195146103945780638da5cb5b146103a7578063b1344271146103af57600080fd5b8063683048351461030d5780636d14a987146103345780636efb46361461035b578063715018a61461037c57806372d18e8d14610384578063758f8dba1461038c57600080fd5b806338c8ee641161014b57806351beaa451161012557806351beaa451461029a578063595c6a67146102c15780635ac86ab7146102c95780635c975abb146102fc57600080fd5b806338c8ee641461024f578063485cc955146102625780634950cfe51461027557600080fd5b80630ffabbce1461019357806310d67a2f146101a8578063136439dd146101bb578063171f1d5b146101ce578063175d3205146101fd5780633561deb114610210575b600080fd5b6101a66101a13660046128ba565b610436565b005b6101a66101b63660046128f3565b610513565b6101a66101c9366004612917565b6105c6565b6101e16101dc366004612a95565b610705565b6040805192151583529015156020830152015b60405180910390f35b6101a661020b3660046128ba565b61088f565b6102377f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc981565b6040516001600160a01b0390911681526020016101f4565b6101a661025d3660046128f3565b610931565b6101a6610270366004612ae6565b610a5e565b6097546102859063ffffffff1681565b60405163ffffffff90911681526020016101f4565b6102857f000000000000000000000000000000000000000000000000000000000000006481565b6101a6610b7d565b6102ec6102d7366004612b14565b606654600160ff9092169190911b9081161490565b60405190151581526020016101f4565b6066546040519081526020016101f4565b6102377f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c81565b6102377f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304281565b61036e610369366004612ddb565b610c44565b6040516101f4929190612ece565b6101a66116bd565b6102856116d1565b61028561175a565b606554610237906001600160a01b031681565b610237611813565b6102377f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b6101a66103e4366004612f17565b611827565b6102377f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb81565b6101a661041e3660046128f3565b611a24565b6101a6610431366004612917565b611a9a565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304216146104875760405162461bcd60e51b815260040161047e90612f68565b60405180910390fd5b6040516307fd5de760e11b81526001600160a01b03838116600483015263ffffffff831660248301527f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f8757071690630ffabbce906044015b600060405180830381600087803b1580156104f757600080fd5b505af115801561050b573d6000803e3d6000fd5b505050505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058a9190612fbe565b6001600160a01b0316336001600160a01b0316146105ba5760405162461bcd60e51b815260040161047e90612fdb565b6105c381611bf6565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190613025565b61064e5760405162461bcd60e51b815260040161047e90613047565b606654818116146106c75760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161047e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60008060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018787600001518860200151886000015160006002811061074d5761074d61308f565b60200201518951600160200201518a602001516000600281106107725761077261308f565b60200201518b6020015160016002811061078e5761078e61308f565b602090810291909101518c518d8301516040516107eb9a99989796959401988952602089019790975260408801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200190565b6040516020818303038152906040528051906020012060001c61080e91906130a5565b90506108816108276108208884611ced565b8690611d84565b61082f611e18565b61087761086885610862604080518082018252600080825260209182015281518083019092526001825260029082015290565b90611ced565b6108718c611ed8565b90611d84565b886201d4c0611f68565b909890975095505050505050565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304216146108d75760405162461bcd60e51b815260040161047e90612f68565b60405163175d320560e01b81526001600160a01b03838116600483015263ffffffff831660248301527f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f875707169063175d3205906044016104dd565b336001600160a01b037f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb16146109e05760405162461bcd60e51b815260206004820152604860248201527f6f6e6c794372656469626c655371756172696e675461736b4d616e616765723a60448201527f206e6f742066726f6d206372656469626c65207371756172696e67207461736b6064820152671036b0b730b3b2b960c11b608482015260a40161047e565b604051630e323b9960e21b81526001600160a01b0382811660048301527f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570716906338c8ee6490602401600060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b5050505050565b600054610100900460ff1615808015610a7e5750600054600160ff909116105b80610a985750303b158015610a98575060005460ff166001145b610afb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161047e565b6000805460ff191660011790558015610b1e576000805461ff0019166101001790555b610b2983600061218c565b610b3282612276565b8015610b78576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613025565b610c055760405162461bcd60e51b815260040161047e90613047565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60408051808201909152606080825260208201526040805180820190915260008082526020820181905290815b86811015610e6e577f000000000000000000000000a82ff9afd8f496c3d6ac40e2a0f282e47488cfc96001600160a01b031663c1af6b24898984818110610cba57610cba61308f565b9050013560f81c60f81b60f81c888860a001518581518110610cde57610cde61308f565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa158015610d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5e91906130c7565b6001600160401b031916610d8e86604001518381518110610d8157610d8161308f565b60200260200101516122c8565b67ffffffffffffffff191614610e2a5760405162461bcd60e51b815260206004820152606160248201526000805160206132d583398151915260448201527f7265733a2071756f72756d41706b206861736820696e2073746f72616765206460648201527f6f6573206e6f74206d617463682070726f76696465642071756f72756d2061706084820152606b60f81b60a482015260c40161047e565b610e5a85604001518281518110610e4357610e4361308f565b602002602001015183611d8490919063ffffffff16565b915080610e6681613108565b915050610c71565b506040805180820190915260608082526020820152866001600160401b03811115610e9b57610e9b612930565b604051908082528060200260200182016040528015610ec4578160200160208202803683370190505b506020820152866001600160401b03811115610ee257610ee2612930565b604051908082528060200260200182016040528015610f0b578160200160208202803683370190505b5081526020850151516000906001600160401b03811115610f2e57610f2e612930565b604051908082528060200260200182016040528015610f57578160200160208202803683370190505b50905060008660200151516001600160401b03811115610f7957610f79612930565b604051908082528060200260200182016040528015610fa2578160200160208202803683370190505b5090506000610fe68b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061230b92505050565b905060005b8860200151518110156112515761101189602001518281518110610d8157610d8161308f565b8482815181106110235761102361308f565b602090810291909101015280156110db5783611040600183613123565b815181106110505761105061308f565b602002602001015160001c84828151811061106d5761106d61308f565b602002602001015160001c116110db576040805162461bcd60e51b81526020600482015260248101919091526000805160206132d583398151915260448201527f7265733a206e6f6e5369676e65725075626b657973206e6f7420736f72746564606482015260840161047e565b7f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b0316633064620d85838151811061111c5761111c61308f565b60200260200101518c8c60000151858151811061113b5761113b61308f565b60200260200101516040518463ffffffff1660e01b81526004016111789392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015611195573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b9919061313a565b6001600160c01b03168382815181106111d4576111d461308f565b60200260200101818152505061123d61123661120a848685815181106111fc576111fc61308f565b602002602001015116612474565b6112308c6020015185815181106112235761122361308f565b60200260200101516124a5565b90612540565b8790611d84565b95508061124981613108565b915050610feb565b505060005b60ff81168a11156115915760008b8b8360ff168181106112785761127861308f565b9050013560f81c60f81b60f81c90507f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c6001600160a01b031663c8294c56828c8c60c001518660ff16815181106112d1576112d161308f565b60209081029190910101516040516001600160e01b031960e086901b16815260ff909316600484015263ffffffff9182166024840152166044820152606401602060405180830381865afa15801561132d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113519190613163565b85602001518360ff168151811061136a5761136a61308f565b6001600160601b03909216602092830291909101820152850151805160ff84169081106113995761139961308f565b602002602001015185600001518360ff16815181106113ba576113ba61308f565b60200260200101906001600160601b031690816001600160601b03168152505060005b8960200151518163ffffffff161015611587576000611423858363ffffffff168151811061140d5761140d61308f565b60200260200101518460ff161c60019081161490565b15611574577f000000000000000000000000851356ae760d987e095750cceb3bc6014560891c6001600160a01b031663a43cde89848e898663ffffffff16815181106114715761147161308f565b60200260200101518f60e001518960ff16815181106114925761149261308f565b60200260200101518663ffffffff16815181106114b1576114b161308f565b60209081029190910101516040516001600160e01b031960e087901b16815260ff909416600485015263ffffffff92831660248501526044840191909152166064820152608401602060405180830381865afa158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190613163565b8751805160ff87169081106115505761155061308f565b60200260200101818151611564919061318c565b6001600160601b03169052506001015b508061157f816131b4565b9150506113dd565b5050600101611256565b50506000806115aa8c868a606001518b60800151610705565b915091508161161b5760405162461bcd60e51b815260206004820152604360248201526000805160206132d583398151915260448201527f7265733a2070616972696e6720707265636f6d70696c652063616c6c206661696064820152621b195960ea1b608482015260a40161047e565b8061167c5760405162461bcd60e51b815260206004820152603960248201526000805160206132d583398151915260448201527f7265733a207369676e617475726520697320696e76616c696400000000000000606482015260840161047e565b5050600087826040516020016116939291906131d8565b60408051808303601f190181529190528051602090910120929b929a509198505050505050505050565b6116c5612625565b6116cf6000612276565b565b60007f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb6001600160a01b03166372d18e8d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611731573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117559190613220565b905090565b60007f00000000000000000000000000000000000000000000000000000000000000647f00000000000000000000000084ea74d481ee0a5332c457a4d796187f6ba67feb6001600160a01b031663f5c9899d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ff9190613220565b611809904361323d565b611755919061323d565b60006117556033546001600160a01b031690565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730421614806118f057507f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118db9190612fbe565b6001600160a01b0316336001600160a01b0316145b6119885760405162461bcd60e51b815260206004820152605760248201527f6f6e6c795265676973747279436f6f7264696e61746f724f725374616b65526560448201527f6769737472793a206e6f742066726f6d20726567697374727920636f6f72646960648201527f6e61746f72206f72207374616b65207265676973747279000000000000000000608482015260a40161047e565b60405163c747075b60e01b81526001600160a01b03858116600483015263ffffffff808616602484015284166044830152606482018390527f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f875707169063c747075b90608401600060405180830381600087803b158015611a0657600080fd5b505af1158015611a1a573d6000803e3d6000fd5b5050505050505050565b611a2c612625565b6001600160a01b038116611a915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161047e565b6105c381612276565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b119190612fbe565b6001600160a01b0316336001600160a01b031614611b415760405162461bcd60e51b815260040161047e90612fdb565b606654198119606654191614611bbf5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161047e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106fa565b6001600160a01b038116611c845760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161047e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6040805180820190915260008082526020820152611d096127ae565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa9050808015611d3c57611d3e565bfe5b5080611d7c5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b604482015260640161047e565b505092915050565b6040805180820190915260008082526020820152611da06127cc565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa9050808015611d3c575080611d7c5760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b604482015260640161047e565b611e206127ea565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b604080518082019091526000808252602082015260008080611f086000805160206132b5833981519152866130a5565b90505b611f1481612684565b90935091506000805160206132b5833981519152828309831415611f4e576040805180820190915290815260208101919091529392505050565b6000805160206132b5833981519152600182089050611f0b565b604080518082018252868152602080820186905282518084019093528683528201849052600091829190611f9a61280f565b60005b600281101561215f576000611fb3826006613265565b9050848260028110611fc757611fc761308f565b60200201515183611fd9836000613284565b600c8110611fe957611fe961308f565b60200201528482600281106120005761200061308f565b602002015160200151838260016120179190613284565b600c81106120275761202761308f565b602002015283826002811061203e5761203e61308f565b6020020151515183612051836002613284565b600c81106120615761206161308f565b60200201528382600281106120785761207861308f565b6020020151516001602002015183612091836003613284565b600c81106120a1576120a161308f565b60200201528382600281106120b8576120b861308f565b6020020151602001516000600281106120d3576120d361308f565b6020020151836120e4836004613284565b600c81106120f4576120f461308f565b602002015283826002811061210b5761210b61308f565b6020020151602001516001600281106121265761212661308f565b602002015183612137836005613284565b600c81106121475761214761308f565b6020020152508061215781613108565b915050611f9d565b5061216861282e565b60006020826101808560088cfa9151919c9115159b50909950505050505050505050565b6065546001600160a01b03161580156121ad57506001600160a01b03821615155b61222f5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161047e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261227282611bf6565b5050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000816000015182602001516040516020016122ee929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b60006101008251111561237f5760405162461bcd60e51b815260206004820152603660248201527f4269746d61705574696c732e62797465734172726179546f4269746d61703a206044820152756279746573417272617920697320746f6f206c6f6e6760501b606482015260840161047e565b815161238d57506000919050565b600080836000815181106123a3576123a361308f565b0160200151600160f89190911c81901b92505b845181101561246b578481815181106123d1576123d161308f565b0160200151600160f89190911c1b9150828216156124575760405162461bcd60e51b815260206004820152603a60248201527f4269746d61705574696c732e62797465734172726179546f4269746d61703a2060448201527f72657065617420656e74727920696e2062797465734172726179000000000000606482015260840161047e565b9181179161246481613108565b90506123b6565b50909392505050565b6000805b821561249f57612489600184613123565b90921691806124978161329c565b915050612478565b92915050565b604080518082019091526000808252602082015281511580156124ca57506020820151155b156124e8575050604080518082019091526000808252602082015290565b6040518060400160405280836000015181526020016000805160206132b5833981519152846020015161251b91906130a5565b612533906000805160206132b5833981519152613123565b905292915050565b919050565b60408051808201909152600080825260208201526102008261ffff161061259c5760405162461bcd60e51b815260206004820152601060248201526f7363616c61722d746f6f2d6c6172676560801b604482015260640161047e565b8161ffff16600114156125b057508161249f565b6040805180820190915260008082526020820181905284906001905b8161ffff168661ffff16111561261a57600161ffff871660ff83161c811614156125fd576125fa8484611d84565b93505b6126078384611d84565b92506201fffe600192831b1691016125cc565b509195945050505050565b3361262e611813565b6001600160a01b0316146116cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161047e565b600080806000805160206132b583398151915260036000805160206132b5833981519152866000805160206132b58339815191528889090908905060006126fa827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f526000805160206132b5833981519152612706565b91959194509092505050565b60008061271161282e565b61271961284c565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828015611d3c5750826127a35760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c757265000000000000604482015260640161047e565b505195945050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806127fd61286a565b815260200161280a61286a565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6001600160a01b03811681146105c357600080fd5b63ffffffff811681146105c357600080fd5b803561253b8161289d565b600080604083850312156128cd57600080fd5b82356128d881612888565b915060208301356128e88161289d565b809150509250929050565b60006020828403121561290557600080fd5b813561291081612888565b9392505050565b60006020828403121561292957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561296857612968612930565b60405290565b60405161010081016001600160401b038111828210171561296857612968612930565b604051601f8201601f191681016001600160401b03811182821017156129b9576129b9612930565b604052919050565b6000604082840312156129d357600080fd5b6129db612946565b9050813581526020820135602082015292915050565b600082601f830112612a0257600080fd5b604051604081018181106001600160401b0382111715612a2457612a24612930565b8060405250806040840185811115612a3b57600080fd5b845b8181101561261a578035835260209283019201612a3d565b600060808284031215612a6757600080fd5b612a6f612946565b9050612a7b83836129f1565b8152612a8a83604084016129f1565b602082015292915050565b6000806000806101208587031215612aac57600080fd5b84359350612abd86602087016129c1565b9250612acc8660608701612a55565b9150612adb8660e087016129c1565b905092959194509250565b60008060408385031215612af957600080fd5b8235612b0481612888565b915060208301356128e881612888565b600060208284031215612b2657600080fd5b813560ff8116811461291057600080fd5b60006001600160401b03821115612b5057612b50612930565b5060051b60200190565b600082601f830112612b6b57600080fd5b81356020612b80612b7b83612b37565b612991565b82815260059290921b84018101918181019086841115612b9f57600080fd5b8286015b84811015612bc3578035612bb68161289d565b8352918301918301612ba3565b509695505050505050565b600082601f830112612bdf57600080fd5b81356020612bef612b7b83612b37565b82815260069290921b84018101918181019086841115612c0e57600080fd5b8286015b84811015612bc357612c2488826129c1565b835291830191604001612c12565b600082601f830112612c4357600080fd5b81356020612c53612b7b83612b37565b82815260059290921b84018101918181019086841115612c7257600080fd5b8286015b84811015612bc35780356001600160401b03811115612c955760008081fd5b612ca38986838b0101612b5a565b845250918301918301612c76565b60006101808284031215612cc457600080fd5b612ccc61296e565b905081356001600160401b0380821115612ce557600080fd5b612cf185838601612b5a565b83526020840135915080821115612d0757600080fd5b612d1385838601612bce565b60208401526040840135915080821115612d2c57600080fd5b612d3885838601612bce565b6040840152612d4a8560608601612a55565b6060840152612d5c8560e086016129c1565b6080840152610120840135915080821115612d7657600080fd5b612d8285838601612b5a565b60a0840152610140840135915080821115612d9c57600080fd5b612da885838601612b5a565b60c0840152610160840135915080821115612dc257600080fd5b50612dcf84828501612c32565b60e08301525092915050565b600080600080600060808688031215612df357600080fd5b8535945060208601356001600160401b0380821115612e1157600080fd5b818801915088601f830112612e2557600080fd5b813581811115612e3457600080fd5b896020828501011115612e4657600080fd5b6020830196509450612e5a604089016128af565b93506060880135915080821115612e7057600080fd5b50612e7d88828901612cb1565b9150509295509295909350565b600081518084526020808501945080840160005b83811015612ec35781516001600160601b031687529582019590820190600101612e9e565b509495945050505050565b6040815260008351604080840152612ee96080840182612e8a565b90506020850151603f19848303016060850152612f068282612e8a565b925050508260208301529392505050565b60008060008060808587031215612f2d57600080fd5b8435612f3881612888565b93506020850135612f488161289d565b92506040850135612f588161289d565b9396929550929360600135925050565b60208082526036908201527f6f6e6c795265676973747279436f6f7264696e61746f723a206e6f742066726f60408201527536903932b3b4b9ba393c9031b7b7b93234b730ba37b960511b606082015260800190565b600060208284031215612fd057600080fd5b815161291081612888565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561303757600080fd5b8151801515811461291057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000826130c257634e487b7160e01b600052601260045260246000fd5b500690565b6000602082840312156130d957600080fd5b815167ffffffffffffffff198116811461291057600080fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561311c5761311c6130f2565b5060010190565b600082821015613135576131356130f2565b500390565b60006020828403121561314c57600080fd5b81516001600160c01b038116811461291057600080fd5b60006020828403121561317557600080fd5b81516001600160601b038116811461291057600080fd5b60006001600160601b03838116908316818110156131ac576131ac6130f2565b039392505050565b600063ffffffff808316818114156131ce576131ce6130f2565b6001019392505050565b63ffffffff60e01b8360e01b1681526000600482018351602080860160005b83811015613213578151855293820193908201906001016131f7565b5092979650505050505050565b60006020828403121561323257600080fd5b81516129108161289d565b600063ffffffff80831681851680830382111561325c5761325c6130f2565b01949350505050565b600081600019048311821515161561327f5761327f6130f2565b500290565b60008219821115613297576132976130f2565b500190565b600061ffff808316818114156131ce576131ce6130f256fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535369676e6174757265436865636b65722e636865636b5369676e617475a264697066735822122056db2b3756fa39f261d9ded155060556cd5fc0148225336dd23f06957c1a093464736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x9e545e3c0baab3e08cdfd552c960a1050f373042":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122007c3990e071012e67e928be8d71cb1c6b5ed96fee92e98c9e70cc231dee7232064736f6c634300080c0033","storage":{"0x0":"0x67d269191c92caf3cd7723f116c85e6e9bf559330001","0x1":"0x0","0x36":"0x3","0x37":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x38":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0xbcd6ff29ae71d399fb597d99792fa72d0863bd723b9ab11f79d0b8d8ac5bc8":"0x643a9800002710","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x998abeb3e57409262ae5b751f60747921b33613e","0x4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b8":"0x851356ae760d987e095750cceb3bc6014560891c","0x4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b9":"0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9","0x4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81ba":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0xc5a5c42992decbae36851359345fe25997f5c42d"}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea26469706673582212209882247b872d905a05380b42c11d1716ad43e9b19643a0cf588a80c0958bf20d64736f6c634300080c0033","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":1,"balance":"0x21d8f196405010cce20","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9a676e781a523b5d0c0e43731313a708cb607508","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637259a45c1161011a578063d7b7fa13116100ad578063e58398361161007c578063e5839836146105ea578063e921d4fa146105fd578063f2fde38b14610626578063f73b751914610639578063fabc1cbc1461064c57600080fd5b8063d7b7fa13146104b8578063d98128c01461056a578063da16e29b1461057d578063df5cf723146105c357600080fd5b8063886f1195116100e9578063886f1195146104585780638da5cb5b1461046b578063a49db7321461047c578063c747075b146104a557600080fd5b80637259a45c146103ef5780637cf72bba146104025780638105e04314610415578063855fcc4a1461042857600080fd5b806338c8ee64116101925780635c975abb116101615780635c975abb1461037c5780636f0c2f741461038e578063715018a6146103d4578063723e59c7146103dc57600080fd5b806338c8ee64146102ef57806339b70e3814610302578063595c6a67146103415780635ac86ab71461034957600080fd5b80631794bb3c116101ce5780631794bb3c1461024e5780631874e5ae14610261578063282670fc1461028e57806335571676146102c557600080fd5b80630ffabbce1461020057806310d67a2f14610215578063136439dd14610228578063175d32051461023b575b600080fd5b61021361020e3660046126e6565b61065f565b005b61021361022336600461271b565b61078f565b610213610236366004612738565b610842565b6102136102493660046126e6565b610981565b61021361025c366004612751565b610aab565b61027461026f3660046126e6565b610bc9565b60405163ffffffff90911681526020015b60405180910390f35b6102a161029c366004612792565b610c14565b60408051825163ffffffff9081168252602093840151169281019290925201610285565b6102d86102d3366004612792565b610c8b565b604080519215158352602083019190915201610285565b6102136102fd36600461271b565b610cba565b6103297f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b039091168152602001610285565b610213610d88565b61036c6103573660046127be565b606654600160ff9092169190911b9081161490565b6040519015158152602001610285565b6066545b604051908152602001610285565b61027461039c3660046127e1565b6001600160a01b039182166000908152609760209081526040808320939094168252919091522054600160201b900463ffffffff1690565b610213610e4f565b6103806103ea3660046126e6565b610e63565b6102746103fd3660046126e6565b610f73565b61021361041036600461281a565b610fc3565b61036c61042336600461288f565b61100d565b61043b6104363660046127e1565b61116f565b604080519315158452602084019290925290820152606001610285565b606554610329906001600160a01b031681565b6033546001600160a01b0316610329565b61038061048a36600461271b565b6001600160a01b03166000908152609a602052604090205490565b6102136104b33660046128cd565b6111b2565b61053b6104c63660046127e1565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0395861681526097835283812094909516855292815292819020815192830182525463ffffffff8082168452600160201b8204811694840194909452600160401b90049092169181019190915290565b60408051825163ffffffff90811682526020808501518216908301529282015190921690820152606001610285565b61036c6105783660046127e1565b611405565b61027461058b3660046127e1565b6001600160a01b039182166000908152609760209081526040808320939094168252919091522054600160401b900463ffffffff1690565b6103297f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61036c6105f836600461271b565b611451565b61038061060b36600461271b565b6001600160a01b031660009081526099602052604090205490565b61021361063436600461271b565b6115c7565b61021361064736600461271b565b61163d565b61021361065a366004612738565b61176c565b6001600160a01b03821660009081526097602090815260408083203384529091529020548290600160201b900463ffffffff908116146106ba5760405162461bcd60e51b81526004016106b19061291a565b60405180910390fd5b6106c58343846118c8565b6106e7336001600160a01b038516600090815260996020526040902090611c5e565b61077f5760405162461bcd60e51b815260206004820152605760248201527f536c61736865722e7265636f72644c6173745374616b65557064617465416e6460448201527f5265766f6b65536c617368696e674162696c6974793a2052656d6f76696e672060648201527f6d6964646c657761726520756e7375636365737366756c000000000000000000608482015260a4016106b1565b61078a833384611cf8565b505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108069190612990565b6001600160a01b0316336001600160a01b0316146108365760405162461bcd60e51b81526004016106b1906129ad565b61083f81611e03565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae91906129f7565b6108ca5760405162461bcd60e51b81526004016106b190612a19565b606654818116146109435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b1565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b606654600190600290811614156109aa5760405162461bcd60e51b81526004016106b190612a61565b6001600160a01b03831660009081526097602090815260408083203384529091529020548390600160201b900463ffffffff908116146109fc5760405162461bcd60e51b81526004016106b19061291a565b610a078443856118c8565b610a29336001600160a01b038616600090815260996020526040902090611efa565b610aa55760405162461bcd60e51b815260206004820152604160248201527f536c61736865722e7265636f726446697273745374616b655570646174653a2060448201527f417070656e64696e67206d6964646c657761726520756e7375636365737366756064820152601b60fa1b608482015260a4016106b1565b50505050565b600054610100900460ff1615808015610acb5750600054600160ff909116105b80610ae55750303b158015610ae5575060005460ff166001145b610b485760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b1565b6000805460ff191660011790558015610b6b576000805461ff0019166101001790555b610b758383611f08565b610b7e84611fee565b8015610aa5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6001600160a01b0382166000908152609a60205260408120805463ffffffff8416908110610bf957610bf9612a98565b60009182526020909120015463ffffffff1690505b92915050565b60408051808201909152600080825260208201526001600160a01b0383166000908152609a60205260409020805483908110610c5257610c52612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b90910416918101919091529392505050565b6001600160a01b03821660009081526099602052604081208190610caf9084612040565b915091509250929050565b60665460029060049081161415610ce35760405162461bcd60e51b81526004016106b190612a61565b610ced8233611405565b610d7a5760405162461bcd60e51b815260206004820152605260248201527f536c61736865722e667265657a654f70657261746f723a206d73672e73656e6460448201527f657220646f6573206e6f742068617665207065726d697373696f6e20746f20736064820152713630b9b4103a3434b99037b832b930ba37b960711b608482015260a4016106b1565b610d84823361204f565b5050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df491906129f7565b610e105760405162461bcd60e51b81526004016106b190612a19565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610e576120c1565b610e616000611fee565b565b6001600160a01b038281166000818152609960209081526040808320838052600190810183528184209084528252808320549383526097825280832094841683529390529182205463ffffffff848116600160401b909204161115610ecc576000915050610c0e565b6001600160a01b0384166000908152609960205260408120610eee908361211b565b9150505b8015801590610f3657506001600160a01b0385811660009081526097602090815260408083209386168352929052205463ffffffff858116600160401b9092041611155b15610f6b576001600160a01b03851660009081526099602052604090209091508190610f62908261211b565b9150610ef29050565b509392505050565b6001600160a01b0382166000908152609a60205260408120805463ffffffff8416908110610fa357610fa3612a98565b600091825260209091200154600160201b900463ffffffff169392505050565b610fcb6120c1565b60005b8181101561078a57611005838383818110610feb57610feb612a98565b9050602002016020810190611000919061271b565b61212a565b600101610fce565b6001600160a01b0383166000908152609a602052604081205461103257506001611168565b6001600160a01b0384166000908152609a6020526040812080548490811061105c5761105c612a98565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b909204811693830193909352909250908516108015906110ba57506001600160a01b038516600090815260996020526040902054155b15611136576001600160a01b0385166000908152609a6020526040902080546110e590600190612ac4565b815481106110f5576110f5612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b909104811691909201819052439091161191506111689050565b806000015163ffffffff168463ffffffff161080156111645750806020015163ffffffff164363ffffffff16115b9150505b9392505050565b6001600160a01b0382166000908152609960205260408120819081906111a49061119f866001600160a01b031690565b612194565b9250925092505b9250925092565b6001600160a01b03841660009081526097602090815260408083203384529091529020548490600160201b900463ffffffff908116146112045760405162461bcd60e51b81526004016106b19061291a565b438463ffffffff16111561128a5760405162461bcd60e51b815260206004820152604160248201527f536c61736865722e7265636f72645374616b655570646174653a2063616e6e6f60448201527f742070726f766964652075706461746520666f722066757475726520626c6f636064820152606b60f81b608482015260a4016106b1565b6112958585856118c8565b6001600160a01b038516600090815260996020526040902054600114611359576112d7336001600160a01b038716600090815260996020526040902090611c5e565b6113495760405162461bcd60e51b815260206004820152603b60248201527f536c61736865722e7265636f72645374616b655570646174653a2052656d6f7660448201527f696e67206d6964646c657761726520756e7375636365737366756c000000000060648201526084016106b1565b6113548585846121e4565b6113fe565b336001600160a01b038616600090815260996020908152604080832083805260019081018352818420908452909152902054146113fe5760405162461bcd60e51b815260206004820152603960248201527f536c61736865722e7265636f72645374616b655570646174653a2043616c6c6560448201527f72206973206e6f7420746865206c69737420656e7472616e740000000000000060648201526084016106b1565b5050505050565b6001600160a01b038281166000908152609760209081526040808320938516835292905290812054600160201b900463ffffffff1643101561144957506001610c0e565b506000610c0e565b6001600160a01b03811660009081526098602052604081205460ff161561147a57506001919050565b604051633e28391d60e01b81526001600160a01b0383811660048301527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91690633e28391d90602401602060405180830381865afa1580156114e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150491906129f7565b156115ba57604051631976849960e21b81526001600160a01b0383811660048301526000917f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9909116906365da126490602401602060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612990565b6001600160a01b031660009081526098602052604090205460ff169392505050565b506000919050565b919050565b6115cf6120c1565b6001600160a01b0381166116345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b61083f81611fee565b606654600090600190811614156116665760405162461bcd60e51b81526004016106b190612a61565b6040516336b87bd760e11b81523360048201527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b031690636d70f7ae90602401602060405180830381865afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee91906129f7565b611762576040805162461bcd60e51b81526020600482015260248101919091527f536c61736865722e6f7074496e746f536c617368696e673a206d73672e73656e60448201527f646572206973206e6f7420612072656769737465726564206f70657261746f7260648201526084016106b1565b610d84338361249b565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190612990565b6001600160a01b0316336001600160a01b0316146118135760405162461bcd60e51b81526004016106b1906129ad565b6066541981196066541916146118915760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b1565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610976565b6001600160a01b038316600090815260976020908152604080832033845290915290205463ffffffff808416600160401b9092041611156119845760405162461bcd60e51b815260206004820152604a60248201527f536c61736865722e5f7265636f7264557064617465416e64416464546f4d696460448201527f646c657761726554696d65733a2063616e2774207075736820612070726576696064820152696f75732075706461746560b01b608482015260a4016106b1565b6001600160a01b0383166000818152609760209081526040808320338452825280832080546bffffffff00000000000000001916600160401b63ffffffff89160217905580518082018252838152808301849052938352609a9091529020548015611a51576001600160a01b0385166000908152609a60205260409020611a0c600183612ac4565b81548110611a1c57611a1c612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b909104169181019190915291505b60008290506000836020015163ffffffff168563ffffffff161115611a80575063ffffffff8416602082015260015b6001600160a01b038716600090815260996020526040902054611aae575063ffffffff851681526001611b83565b336001600160a01b0388166000908152609960209081526040808320838052600190810183528184209084529091529020541415611b8357600080611b0b336001600160a01b038b1660009081526099602052604090209061211b565b915091508115611b72576001600160a01b03898116600090815260976020908152604080832093851683529290522054600160401b900463ffffffff908116908916811015611b625763ffffffff81168552611b6c565b63ffffffff891685525b50611b7c565b63ffffffff881684525b6001925050505b8015611c55576001600160a01b0387166000818152609a6020908152604082208054600181810183558285528385208851920180549489015163ffffffff908116600160201b0267ffffffffffffffff199096169316929092179390931790559290915290547f1b62ba64c72d01e41a2b8c46e6aeeff728ef3a4438cf1cac3d92ee12189d5649918991611c179190612ac4565b8451602080870151604080516001600160a01b0390961686529185019390935263ffffffff9182169084015216606082015260800160405180910390a15b50505050505050565b6000811580611c745750611c728383612506565b155b15611c8157506000610c0e565b600082815260018481016020908152604080842084805290915280832054828452922054611cb3928692909190612582565b60008281526001848101602090815260408084208480529091528083208390558183528220829055845490918591611cec908490612ac4565b90915550919392505050565b63ffffffff8181161415611d825760405162461bcd60e51b8152602060048201526044602482018190527f536c61736865722e5f7265766f6b65536c617368696e674162696c6974793a20908201527f7365727665556e74696c426c6f636b2074696d65206d757374206265206c696d6064820152631a5d195960e21b608482015260a4016106b1565b6001600160a01b03838116600081815260976020908152604080832094871680845294825291829020805467ffffffff000000001916600160201b63ffffffff88169081029190911790915591519182527f9aa1b1391f35c672ed1f3b7ece632f4513e618366bef7a2f67b7c6bc1f2d2b14910160405180910390a3505050565b6001600160a01b038116611e915760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b1565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611168838360006125b7565b6065546001600160a01b0316158015611f2957506001600160a01b03821615155b611fab5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b1565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610d8482611e03565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080610caf848460006125ce565b6001600160a01b03821660009081526098602052604090205460ff16610d84576001600160a01b03808316600081815260986020526040808220805460ff1916600117905551928416927f444a84f512816ae7be8ed8a66aa88e362eb54d0988e83acc9d81746622b3ba519190a35050565b6033546001600160a01b03163314610e615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b1565b600080610caf848460016125ce565b6001600160a01b03811660009081526098602052604090205460ff161561083f576001600160a01b038116600081815260986020526040808220805460ff19169055517fd4cef0af27800d466fcacd85779857378b85cb61569005ff1464fa6e5ced69d89190a250565b60008060006121a38585612506565b6121b5575060009150819050806111ab565b5050506000818152600183810160209081526040808420848052909152808320548284529220549091906111ab565b6000811561238e576001600160a01b038416600090815260996020526040902061220e9083612506565b612216575060015b8015801561225857506001600160a01b0384811660009081526097602090815260408083209386168352929052205463ffffffff848116600160401b90920416115b15612261575060015b806122d8576001600160a01b0384166000908152609960205260408120819061228a908561211b565b9150915081156122d5576001600160a01b0386811660009081526097602090815260408083209385168352929052205463ffffffff868116600160401b90920416116122d557600192505b50505b80612377576001600160a01b0384166000908152609960205260409020612300908333612617565b6123725760405162461bcd60e51b815260206004820152603c60248201527f536c61736865722e7265636f72645374616b655570646174653a20496e73657260448201527f74696e67206d6964646c657761726520756e7375636365737366756c0000000060648201526084016106b1565b610aa5565b6123818484610e63565b91506123728484846121e4565b6001600160a01b03848116600090815260976020908152604080832060998352818420848052600190810184528285209085528352818420549094168352929052205463ffffffff848116600160401b90920416116123eb575060015b8061248457612412336001600160a01b038616600090815260996020526040902090612626565b6123725760405162461bcd60e51b815260206004820152603e60248201527f536c61736865722e7265636f72645374616b655570646174653a20507265707060448201527f656e64696e67206d6964646c657761726520756e7375636365737366756c000060648201526084016106b1565b61248e8484610e63565b9150610aa58484846121e4565b6001600160a01b03808316600081815260976020908152604080832094861680845294909152808220805467ffffffff00000000191667ffffffff00000000179055517fefa9fb38e813d53c15edf501e03852843a3fed691960523391d71a092b3627d89190a35050565b6000818152600183016020908152604080832083805290915281205415801561254957506000828152600180850160209081526040808420928452919052902054155b1561257a57600080805260018085016020908152604080842092845291905290205482141561144957506001610c0e565b506001610c0e565b600082815260019094016020818152604080872093158088529382528087208690559486529081528385209115855252912055565b60006125c68460008585612634565b949350505050565b6000806125db8585612506565b6125ea5750600090508061260f565b5050600082815260018401602090815260408083208415158452909152902054801515905b935093915050565b60006125c68484846001612634565b6000611168838360016125b7565b60006126408584612506565b15801561265257506126528585612506565b156126b25760008481526001860160209081526040808320851515845290915290205461268186868686612582565b61268d86858386612582565b60018660000160008282546126a29190612adb565b90915550600192506125c6915050565b506000949350505050565b6001600160a01b038116811461083f57600080fd5b803563ffffffff811681146115c257600080fd5b600080604083850312156126f957600080fd5b8235612704816126bd565b9150612712602084016126d2565b90509250929050565b60006020828403121561272d57600080fd5b8135611168816126bd565b60006020828403121561274a57600080fd5b5035919050565b60008060006060848603121561276657600080fd5b8335612771816126bd565b92506020840135612781816126bd565b929592945050506040919091013590565b600080604083850312156127a557600080fd5b82356127b0816126bd565b946020939093013593505050565b6000602082840312156127d057600080fd5b813560ff8116811461116857600080fd5b600080604083850312156127f457600080fd5b82356127ff816126bd565b9150602083013561280f816126bd565b809150509250929050565b6000806020838503121561282d57600080fd5b823567ffffffffffffffff8082111561284557600080fd5b818501915085601f83011261285957600080fd5b81358181111561286857600080fd5b8660208260051b850101111561287d57600080fd5b60209290920196919550909350505050565b6000806000606084860312156128a457600080fd5b83356128af816126bd565b92506128bd602085016126d2565b9150604084013590509250925092565b600080600080608085870312156128e357600080fd5b84356128ee816126bd565b93506128fc602086016126d2565b925061290a604086016126d2565b9396929550929360600135925050565b60208082526050908201527f536c61736865722e6f6e6c7952656769737465726564466f725365727669636560408201527f3a204f70657261746f7220686173206e6f74206f7074656420696e746f20736c60608201526f30b9b434b73390313c9031b0b63632b960811b608082015260a00190565b6000602082840312156129a257600080fd5b8151611168816126bd565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612a0957600080fd5b8151801515811461116857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612ad657612ad6612aae565b500390565b60008219821115612aee57612aee612aae565b50019056fea2646970667358221220c5efe534d543130a022495783fbd61cd409c461e0ed63e2b662dd8ec88c5716764736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122007c3990e071012e67e928be8d71cb1c6b5ed96fee92e98c9e70cc231dee7232064736f6c634300080c0033","storage":{"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0xc5a5c42992decbae36851359345fe25997f5c42d"}},"0xa85233c63b9ee964add6f2cffe00fd84eb32338f":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633563b0d1146100465780634f739f741461006f578063cefdc1d41461008f575b600080fd5b610059610054366004610d22565b6100b0565b6040516100669190610e6a565b60405180910390f35b61008261007d366004610ed0565b61042b565b6040516100669190610fd4565b6100a261009d36600461108f565b610ab2565b6040516100669291906110d1565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011691906110f2565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017c91906110f2565b90506000855167ffffffffffffffff81111561019a5761019a610cb9565b6040519080825280602002602001820160405280156101cd57816020015b60608152602001906001900390816101b85790505b50905060005b86518110156104205760008782815181106101f0576101f061110f565b016020015160405163889ae3e560e01b815260f89190911c6004820181905263ffffffff8916602483015291506000906001600160a01b0386169063889ae3e590604401600060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102799190810190611149565b9050805167ffffffffffffffff81111561029557610295610cb9565b6040519080825280602002602001820160405280156102da57816020015b60408051808201909152600080825260208201528152602001906001900390816102b35790505b508484815181106102ed576102ed61110f565b602002602001018190525060005b815181101561040a5760008282815181106103185761031861110f565b6020908102919091018101516040805180820182528281529051631b32722560e01b81526004810183905260ff8816602482015263ffffffff8e166044820152919350918201906001600160a01b038b1690631b32722590606401602060405180830381865afa158015610390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b491906111df565b6001600160601b03168152508686815181106103d2576103d261110f565b602002602001015183815181106103eb576103eb61110f565b60200260200101819052505080806104029061121e565b9150506102fb565b50505080806104189061121e565b9150506101d3565b509695505050505050565b6104566040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ba91906110f2565b90506104e76040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516385020d4960e01b81526001600160a01b038a16906385020d4990610517908b9089908990600401611239565b600060405180830381865afa158015610534573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261055c9190810190611283565b815260405163e192e9ad60e01b81526001600160a01b0383169063e192e9ad9061058e908b908b908b9060040161133b565b600060405180830381865afa1580156105ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d39190810190611283565b60408201528567ffffffffffffffff8111156105f1576105f1610cb9565b60405190808252806020026020018201604052801561062457816020015b606081526020019060019003908161060f5790505b50606082015260005b60ff81168711156109c35760008567ffffffffffffffff81111561065357610653610cb9565b60405190808252806020026020018201604052801561067c578160200160208202803683370190505b5083606001518360ff16815181106106965761069661110f565b602002602001018190525060005b868110156108c25760008c6001600160a01b0316633064620d8a8a858181106106cf576106cf61110f565b905060200201358e886000015186815181106106ed576106ed61110f565b60200260200101516040518463ffffffff1660e01b815260040161072a9392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b9190611364565b90508a8a8560ff168181106107825761078261110f565b6001600160c01b03841692013560f81c9190911c6001908116141590506108af57856001600160a01b031663480858668a8a858181106107c4576107c461110f565b905060200201358d8d8860ff168181106107e0576107e061110f565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa158015610836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085a919061138d565b85606001518560ff16815181106108735761087361110f565b6020026020010151848151811061088c5761088c61110f565b63ffffffff90921660209283029190910190910152826108ab8161121e565b9350505b50806108ba8161121e565b9150506106a4565b5060008167ffffffffffffffff8111156108de576108de610cb9565b604051908082528060200260200182016040528015610907578160200160208202803683370190505b50905060005b828110156109885784606001518460ff168151811061092e5761092e61110f565b602002602001015181815181106109475761094761110f565b60200260200101518282815181106109615761096161110f565b63ffffffff90921660209283029190910190910152806109808161121e565b91505061090d565b508084606001518460ff16815181106109a3576109a361110f565b6020026020010181905250505080806109bb906113aa565b91505061062d565b506000896001600160a01b0316633561deb16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2891906110f2565b60405163eda1076360e01b81529091506001600160a01b0382169063eda1076390610a5b908b908b908e906004016113ca565b600060405180830381865afa158015610a78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aa09190810190611283565b60208301525098975050505050505050565b6040805160018082528183019092526000916060918391602080830190803683370190505090508481600081518110610aed57610aed61110f565b60209081029190910101526040516385020d4960e01b81526000906001600160a01b038816906385020d4990610b2990889086906004016113f4565b600060405180830381865afa158015610b46573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b6e9190810190611283565b600081518110610b8057610b8061110f565b6020908102919091010151604051633064620d60e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b03891690633064620d90606401602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190611364565b6001600160c01b031690506000610c2682610c44565b905081610c348a838a6100b0565b9550955050505050935093915050565b60606000805b610100811015610c9a576001811b915083821615610c8a57828160f81b604051602001610c78929190611448565b60405160208183030381529060405292505b610c938161121e565b9050610c4a565b5050919050565b6001600160a01b0381168114610cb657600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610cf857610cf8610cb9565b604052919050565b63ffffffff81168114610cb657600080fd5b8035610d1d81610d00565b919050565b600080600060608486031215610d3757600080fd5b8335610d4281610ca1565b925060208481013567ffffffffffffffff80821115610d6057600080fd5b818701915087601f830112610d7457600080fd5b813581811115610d8657610d86610cb9565b610d98601f8201601f19168501610ccf565b91508082528884828501011115610dae57600080fd5b8084840185840137600084828401015250809450505050610dd160408501610d12565b90509250925092565b600081518084526020808501808196508360051b810191508286016000805b86811015610e5c578385038a52825180518087529087019087870190845b81811015610e47578351805184528a01516001600160601b03168a84015292890192604090920191600101610e17565b50509a87019a95505091850191600101610df9565b509298975050505050505050565b602081526000610e7d6020830184610dda565b9392505050565b60008083601f840112610e9657600080fd5b50813567ffffffffffffffff811115610eae57600080fd5b6020830191508360208260051b8501011115610ec957600080fd5b9250929050565b60008060008060008060808789031215610ee957600080fd5b8635610ef481610ca1565b95506020870135610f0481610d00565b9450604087013567ffffffffffffffff80821115610f2157600080fd5b818901915089601f830112610f3557600080fd5b813581811115610f4457600080fd5b8a6020828501011115610f5657600080fd5b602083019650809550506060890135915080821115610f7457600080fd5b50610f8189828a01610e84565b979a9699509497509295939492505050565b600081518084526020808501945080840160005b83811015610fc957815163ffffffff1687529582019590820190600101610fa7565b509495945050505050565b600060208083528351608082850152610ff060a0850182610f93565b905081850151601f198086840301604087015261100d8383610f93565b9250604087015191508086840301606087015261102a8383610f93565b60608801518782038301608089015280518083529194508501925084840190600581901b8501860160005b82811015611081578487830301845261106f828751610f93565b95880195938801939150600101611055565b509998505050505050505050565b6000806000606084860312156110a457600080fd5b83356110af81610ca1565b92506020840135915060408401356110c681610d00565b809150509250925092565b8281526040602082015260006110ea6040830184610dda565b949350505050565b60006020828403121561110457600080fd5b8151610e7d81610ca1565b634e487b7160e01b600052603260045260246000fd5b600067ffffffffffffffff82111561113f5761113f610cb9565b5060051b60200190565b6000602080838503121561115c57600080fd5b825167ffffffffffffffff81111561117357600080fd5b8301601f8101851361118457600080fd5b805161119761119282611125565b610ccf565b81815260059190911b820183019083810190878311156111b657600080fd5b928401925b828410156111d4578351825292840192908401906111bb565b979650505050505050565b6000602082840312156111f157600080fd5b81516001600160601b0381168114610e7d57600080fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561123257611232611208565b5060010190565b63ffffffff84168152604060208201819052810182905260006001600160fb1b0383111561126657600080fd5b8260051b8085606085013760009201606001918252509392505050565b6000602080838503121561129657600080fd5b825167ffffffffffffffff8111156112ad57600080fd5b8301601f810185136112be57600080fd5b80516112cc61119282611125565b81815260059190911b820183019083810190878311156112eb57600080fd5b928401925b828410156111d457835161130381610d00565b825292840192908401906112f0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff8416815260406020820152600061135b604083018486611312565b95945050505050565b60006020828403121561137657600080fd5b81516001600160c01b0381168114610e7d57600080fd5b60006020828403121561139f57600080fd5b8151610e7d81610d00565b600060ff821660ff8114156113c1576113c1611208565b60010192915050565b6040815260006113de604083018587611312565b905063ffffffff83166020830152949350505050565b60006040820163ffffffff851683526020604081850152818551808452606086019150828701935060005b8181101561143b5784518352938301939183019160010161141f565b5090979650505050505050565b6000835160005b81811015611469576020818701810151858301520161144f565b81811115611478576000828501525b506001600160f81b031993909316919092019081526001019291505056fea2646970667358221220636a487b6438b6d6985e8e0413c964aa3173d76782d27ebcf2139a62cb6bba5e64736f6c634300080c0033","storage":{}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638c80d4e511610125578063c6656702116100ad578063df5cf7231161007c578063df5cf7231461054a578063e7a050aa14610571578063f2fde38b14610584578063f698da2514610597578063fabc1cbc1461059f57600080fd5b8063c6656702146104e7578063cbc2bd62146104fa578063cd293f6f1461050d578063cf756fdf1461053757600080fd5b8063b1344271116100f4578063b134427114610464578063b43b514b1461048b578063b5d8b5b81461049e578063c3c6b3a9146104b1578063c608c7f3146104d457600080fd5b80638c80d4e51461040c5780638da5cb5b1461041f57806394f649dd14610430578063967fc0d21461045157600080fd5b80635ac86ab7116101a8578063715018a611610177578063715018a61461037d5780637a7e0d92146103855780637ecebe00146103b0578063886f1195146103d05780638b8aac3c146103e357600080fd5b80635ac86ab71461030c5780635c975abb1461033f5780635de08ff214610347578063663c1de41461035a57600080fd5b80634665bcda116101e45780634665bcda1461028b57806348825e94146102ca57806350ff7225146102f1578063595c6a671461030457600080fd5b806310d67a2f14610216578063136439dd1461022b57806320606b701461023e57806332e89ace14610278575b600080fd5b61022961022436600461289a565b6105b2565b005b6102296102393660046128b7565b61066e565b6102657f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b610265610286366004612950565b6107ad565b6102b27f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b03909116815260200161026f565b6102657f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f181565b6102296102ff366004612a2f565b6109f1565b610229610a49565b61032f61031a366004612a70565b609854600160ff9092169190911b9081161490565b604051901515815260200161026f565b609854610265565b610229610355366004612a93565b610b10565b61032f61036836600461289a565b60d16020526000908152604090205460ff1681565b610229610c59565b610265610393366004612b08565b60cd60209081526000928352604080842090915290825290205481565b6102656103be36600461289a565b60ca6020526000908152604090205481565b6097546102b2906001600160a01b031681565b6102656103f136600461289a565b6001600160a01b0316600090815260ce602052604090205490565b61022961041a366004612a2f565b610c6d565b6033546001600160a01b03166102b2565b61044361043e36600461289a565b610cc0565b60405161026f929190612bb5565b60cb546102b2906001600160a01b031681565b6102b27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b610265610499366004612d5e565b610e40565b6102296104ac366004612a93565b610e8d565b61032f6104bf3660046128b7565b60cf6020526000908152604090205460ff1681565b6102296104e2366004612e34565b610fd1565b6102296104f536600461289a565b611089565b6102b2610508366004612e87565b61109a565b61052061051b366004612d5e565b6110d2565b60408051921515835260208301919091520161026f565b610229610545366004612eb3565b611166565b6102b27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61026561057f366004612a2f565b61129a565b61022961059236600461289a565b611363565b6102656113d9565b6102296105ad3660046128b7565b611417565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106299190612f04565b6001600160a01b0316336001600160a01b0316146106625760405162461bcd60e51b815260040161065990612f21565b60405180910390fd5b61066b81611573565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106da9190612f6b565b6106f65760405162461bcd60e51b815260040161065990612f8d565b6098548181161461076f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156108045760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156108575760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b6002606555428410156108de5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610659565b6001600160a01b03858116600090815260ca602090815260408083205481517f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f1938101939093528c851691830191909152928a1660608201526080810189905260a0810183905260c0810187905260e00160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca909352908220600185019055915061098e6113d9565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506109d188828861166a565b6109dd888c8c8c611824565b60016065559b9a5050505050505050505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610a395760405162461bcd60e51b815260040161065990612fd5565b610a44838383611a45565b505050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab59190612f6b565b610ad15760405162461bcd60e51b815260040161065990612f8d565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cb546001600160a01b03163314610b3a5760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610b5c57610b5c61309d565b9050602002016020810190610b71919061289a565b6001600160a01b0316815260208101919091526040016000205460ff16610c4b57600160d16000868685818110610baa57610baa61309d565b9050602002016020810190610bbf919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610c1a57610c1a61309d565b9050602002016020810190610c2f919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610b3e565b50505050565b610c61611c7f565b610c6b6000611cd9565b565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610cb55760405162461bcd60e51b815260040161065990612fd5565b610c53838383611d2b565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610cf857610cf86128e0565b604051908082528060200260200182016040528015610d21578160200160208202803683370190505b50905060005b82811015610db2576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610d6657610d6661309d565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d9f57610d9f61309d565b6020908102919091010152600101610d27565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610e2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e10575b50505050509150935093505050915091565b80516020808301516040808501516060860151608087015160a08801519351600097610e709790969591016130b3565b604051602081830303815290604052805190602001209050919050565b60cb546001600160a01b03163314610eb75760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610ed957610ed961309d565b9050602002016020810190610eee919061289a565b6001600160a01b0316815260208101919091526040016000205460ff1615610fc957600060d16000868685818110610f2857610f2861309d565b9050602002016020810190610f3d919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9857610f9861309d565b9050602002016020810190610fad919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebb565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146110195760405162461bcd60e51b815260040161065990612fd5565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b5050505050505050565b611091611c7f565b61066b81611e87565b60ce60205281600052604060002081815481106110b657600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461111d5760405162461bcd60e51b815260040161065990612fd5565b600061112884610e40565b600081815260cf60205260408120549192509060ff161561115d5750600081815260cf60205260409020805460ff1916905560015b92509050915091565b600054610100900460ff16158080156111865750600054600160ff909116105b806111a05750303b1580156111a0575060005460ff166001145b6112035760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610659565b6000805460ff191660011790558015611226576000805461ff0019166101001790555b61122e611ef0565b60c95561123b8383611f87565b61124485611cd9565b61124d84611e87565b8015611293576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6098546000908190600190811614156112f15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156113445760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b600260655561135533868686611824565b600160655595945050505050565b61136b611c7f565b6001600160a01b0381166113d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61066b81611cd9565b60007f0000000000000000000000000000000000000000000000000000000000007a6946141561140a575060c95490565b611412611ef0565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190612f04565b6001600160a01b0316336001600160a01b0316146114be5760405162461bcd60e51b815260040161065990612f21565b60985419811960985419161461153c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107a2565b6001600160a01b0381166116015760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610659565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561178457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906116aa9086908690600401613184565b602060405180830381865afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb919061319d565b6001600160e01b03191614610a445760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610659565b826001600160a01b03166117988383612071565b6001600160a01b031614610a445760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610659565b6001600160a01b038316600090815260d16020526040812054849060ff166118ca5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610659565b6118df6001600160a01b038516338786612095565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195291906131c7565b915061195f868684611a45565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b1580156119d157600080fd5b505af11580156119e5573d6000803e3d6000fd5b5050604080516001600160a01b038a8116825288811660208301528916818301526060810186905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969350908190036080019150a150949350505050565b6001600160a01b038316611ac15760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610659565b80611b2d5760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610659565b6001600160a01b03808416600090815260cd6020908152604080832093861683529290522054611c3e576001600160a01b038316600090815260ce602090815260409091205410611bff5760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610659565b6001600160a01b03838116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808416600090815260cd6020908152604080832093861683529290529081208054839290611c759084906131f6565b9091555050505050565b6033546001600160a01b03163314610c6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610659565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611da05760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610659565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611e325760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610659565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611e7a57611e7085856120ef565b6001915050611e80565b60009150505b9392505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b0316158015611fa857506001600160a01b03821615155b61202a5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261206d82611573565b5050565b600080600061208085856122e1565b9150915061208d81612351565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c5390859061250c565b6001600160a01b038216600090815260ce6020526040812054905b8181101561220a576001600160a01b03848116600090815260ce60205260409020805491851691839081106121415761214161309d565b6000918252602090912001546001600160a01b03161415612202576001600160a01b038416600090815260ce6020526040902080546121829060019061320e565b815481106121925761219261309d565b60009182526020808320909101546001600160a01b03878116845260ce90925260409092208054919092169190839081106121cf576121cf61309d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061220a565b60010161210a565b818114156122925760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610659565b6001600160a01b038416600090815260ce602052604090208054806122b9576122b9613225565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156123185760208301516040840151606085015160001a61230c878285856125de565b9450945050505061234a565b82516040141561234257602083015160408401516123378683836126cb565b93509350505061234a565b506000905060025b9250929050565b60008160048111156123655761236561323b565b141561236e5750565b60018160048111156123825761238261323b565b14156123d05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610659565b60028160048111156123e4576123e461323b565b14156124325760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610659565b60038160048111156124465761244661323b565b141561249f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610659565b60048160048111156124b3576124b361323b565b141561066b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610659565b6000612561826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127049092919063ffffffff16565b805190915015610a44578080602001905181019061257f9190612f6b565b610a445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610659565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561261557506000905060036126c2565b8460ff16601b1415801561262d57508460ff16601c14155b1561263e57506000905060046126c2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612692573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126bb576000600192509250506126c2565b9150600090505b94509492505050565b6000806001600160ff1b038316816126e860ff86901c601b6131f6565b90506126f6878288856125de565b935093505050935093915050565b6060612713848460008561271b565b949350505050565b60608247101561277c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610659565b6001600160a01b0385163b6127d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610659565b600080866001600160a01b031685876040516127ef9190613251565b60006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b509150915061284182828661284c565b979650505050505050565b6060831561285b575081611e80565b82511561286b5782518084602001fd5b8160405162461bcd60e51b8152600401610659919061326d565b6001600160a01b038116811461066b57600080fd5b6000602082840312156128ac57600080fd5b8135611e8081612885565b6000602082840312156128c957600080fd5b5035919050565b80356128db81612885565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612919576129196128e0565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612948576129486128e0565b604052919050565b60008060008060008060c0878903121561296957600080fd5b863561297481612885565b955060208781013561298581612885565b955060408801359450606088013561299c81612885565b93506080880135925060a088013567ffffffffffffffff808211156129c057600080fd5b818a0191508a601f8301126129d457600080fd5b8135818111156129e6576129e66128e0565b6129f8601f8201601f1916850161291f565b91508082528b84828501011115612a0e57600080fd5b80848401858401376000848284010152508093505050509295509295509295565b600080600060608486031215612a4457600080fd5b8335612a4f81612885565b92506020840135612a5f81612885565b929592945050506040919091013590565b600060208284031215612a8257600080fd5b813560ff81168114611e8057600080fd5b60008060208385031215612aa657600080fd5b823567ffffffffffffffff80821115612abe57600080fd5b818501915085601f830112612ad257600080fd5b813581811115612ae157600080fd5b8660208260051b8501011115612af657600080fd5b60209290920196919550909350505050565b60008060408385031215612b1b57600080fd5b8235612b2681612885565b91506020830135612b3681612885565b809150509250929050565b600081518084526020808501945080840160005b83811015612b7a5781516001600160a01b031687529582019590820190600101612b55565b509495945050505050565b600081518084526020808501945080840160005b83811015612b7a57815187529582019590820190600101612b99565b604081526000612bc86040830185612b41565b8281036020840152612bda8185612b85565b95945050505050565b600067ffffffffffffffff821115612bfd57612bfd6128e0565b5060051b60200190565b600082601f830112612c1857600080fd5b81356020612c2d612c2883612be3565b61291f565b82815260059290921b84018101918181019086841115612c4c57600080fd5b8286015b84811015612c70578035612c6381612885565b8352918301918301612c50565b509695505050505050565b600082601f830112612c8c57600080fd5b81356020612c9c612c2883612be3565b82815260059290921b84018101918181019086841115612cbb57600080fd5b8286015b84811015612c705780358352918301918301612cbf565b600060408284031215612ce857600080fd5b6040516040810181811067ffffffffffffffff82111715612d0b57612d0b6128e0565b6040529050808235612d1c81612885565b815260208301356bffffffffffffffffffffffff81168114612d3d57600080fd5b6020919091015292915050565b803563ffffffff811681146128db57600080fd5b600060208284031215612d7057600080fd5b813567ffffffffffffffff80821115612d8857600080fd5b9083019060e08286031215612d9c57600080fd5b612da46128f6565b823582811115612db357600080fd5b612dbf87828601612c07565b825250602083013582811115612dd457600080fd5b612de087828601612c7b565b602083015250612df2604084016128d0565b6040820152612e048660608501612cd6565b6060820152612e1560a08401612d4a565b6080820152612e2660c084016128d0565b60a082015295945050505050565b60008060008060808587031215612e4a57600080fd5b8435612e5581612885565b93506020850135612e6581612885565b9250604085013591506060850135612e7c81612885565b939692955090935050565b60008060408385031215612e9a57600080fd5b8235612ea581612885565b946020939093013593505050565b60008060008060808587031215612ec957600080fd5b8435612ed481612885565b93506020850135612ee481612885565b92506040850135612ef481612885565b9396929550929360600135925050565b600060208284031215612f1657600080fd5b8151611e8081612885565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612f7d57600080fd5b81518015158114611e8057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60e0815260006130c660e0830189612b41565b82810360208401526130d88189612b85565b6001600160a01b0397881660408501528651881660608501526020909601516bffffffffffffffffffffffff166080840152505063ffffffff9290921660a083015290921660c09092019190915292915050565b60005b8381101561314757818101518382015260200161312f565b83811115610c535750506000910152565b6000815180845261317081602086016020860161312c565b601f01601f19169290920160200192915050565b8281526040602082015260006127136040830184613158565b6000602082840312156131af57600080fd5b81516001600160e01b031981168114611e8057600080fd5b6000602082840312156131d957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613209576132096131e0565b500190565b600082821015613220576132206131e0565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161326381846020870161312c565b9190910192915050565b602081526000611e80602083018461315856fea26469706673582212205c39c91e4aaff04af69f6d04917b99d0b39f502fa282507e0d84e68f897c45d664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xc3e53f4d16ae77db1c982e75a937b9f60fe63690":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122007c3990e071012e67e928be8d71cb1c6b5ed96fee92e98c9e70cc231dee7232064736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0x67d269191c92caf3cd7723f116c85e6e9bf55933","0x66":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9d4454b023096f34b160d6b654540c56a1f81688","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0xc5a5c42992decbae36851359345fe25997f5c42d"}},"0xc5a5c42992decbae36851359345fe25997f5c42d":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea2646970667358221220256db6e93a752df3d0dccc3089617e209be80b9bc8901c1caeb7e0311892a77464736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0xc6e7df5e7b4f2a278906862b61205850344d4e7d":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b2565b6103ba565b005b6101a66101b63660046117fc565b61049d565b6101a66101c9366004611819565b610550565b6101a66101dc36600461183b565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611854565b610749565b6101a6610279366004611880565b610969565b61024161028c3660046117fc565b610a37565b6101a6610a4b565b6102b86102a73660046118b9565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e736600461183b565b610b17565b6000546101f4906201000090046001600160a01b031681565b61024161031336600461183b565b610b62565b6102416103263660046117fc565b610b6d565b610333610b7b565b604051610208919061190c565b61024161034e3660046117fc565b610b9b565b6101a661036136600461193f565b610c30565b60645460655460408051928352602083019190915201610208565b61024161038f36600461183b565b610e7d565b6102416103a236600461183b565b610eb6565b6101a66103b536600461183b565b610ec1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611980565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b610446858561101d565b610450838361112a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119ce565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119eb565b61054d816111bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119ce565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119eb565b610601828261101d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a35565b6106925760405162461bcd60e51b815260040161041090611a57565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846112c0565b6032546001600160a01b0385811691161461089c5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b60335460006108ad6103e883611ab5565b905060006103e86108bc611398565b6108c69190611ab5565b905060006108d48783611acd565b9050806108e18489611ae4565b6108eb9190611b03565b9550856109515760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b61095b8685611ab5565b603355505050505092915050565b600054610100900460ff16158080156109895750600054600160ff909116105b806109a35750303b1580156109a3575060005460ff166001145b6109bf5760405162461bcd60e51b815260040161041090611980565b6000805460ff1916600117905580156109e2576000805461ff0019166101001790555b6109ec838361112a565b8015610a32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a456102e783610b9b565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc9190611a35565b610ad85760405162461bcd60e51b815260040161041090611a57565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b2a9190611ab5565b905060006103e8610b39611398565b610b439190611ab5565b905081610b508583611ae4565b610b5a9190611b03565b949350505050565b6000610a4582610e7d565b6000610a456103a283610b9b565b60606040518060800160405280604d8152602001611b5b604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c990911690637a7e0d9290604401602060405180830381865afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a459190611b25565b6001805460029081161415610c835760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614610cfb5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b6032546001600160a01b03848116911614610d7e5760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b60335480831115610e0d5760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610e1b6103e883611ab5565b905060006103e8610e2a611398565b610e349190611ab5565b9050600082610e438784611ae4565b610e4d9190611b03565b9050610e598685611acd565b603355603254610e73906001600160a01b0316898361140a565b5050505050505050565b6000806103e8603354610e909190611ab5565b905060006103e8610e9f611398565b610ea99190611ab5565b905080610b508386611ae4565b6000610a4582610b17565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3891906119ce565b6001600160a01b0316336001600160a01b031614610f685760405162461bcd60e51b8152600401610410906119eb565b600154198119600154191614610fe65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561111f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b03841617905561060181600061145c565b6001600160a01b0381166112495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561132a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b606554611335611398565b11156106015760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114059190611b25565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a32908490611548565b6000546201000090046001600160a01b031615801561148357506001600160a01b03821615155b6115055760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826111bb565b600061159d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661161a9092919063ffffffff16565b805190915015610a3257808060200190518101906115bb9190611a35565b610a325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606116298484600085611633565b90505b9392505050565b6060824710156116945760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116eb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516117079190611b3e565b60006040518083038185875af1925050503d8060008114611744576040519150601f19603f3d011682016040523d82523d6000602084013e611749565b606091505b5091509150611759828286611764565b979650505050505050565b6060831561177357508161162c565b8251156117835782518084602001fd5b8160405162461bcd60e51b8152600401610410919061190c565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117c857600080fd5b843593506020850135925060408501356117e18161179d565b915060608501356117f18161179d565b939692955090935050565b60006020828403121561180e57600080fd5b813561162c8161179d565b6000806040838503121561182c57600080fd5b50508035926020909101359150565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b82356118728161179d565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e8161179d565b915060208301356118ae8161179d565b809150509250929050565b6000602082840312156118cb57600080fd5b813560ff8116811461162c57600080fd5b60005b838110156118f75781810151838201526020016118df565b83811115611906576000848401525b50505050565b602081526000825180602084015261192b8160408501602087016118dc565b601f01601f19169190910160400192915050565b60008060006060848603121561195457600080fd5b833561195f8161179d565b9250602084013561196f8161179d565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e057600080fd5b815161162c8161179d565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4757600080fd5b8151801515811461162c57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ac857611ac8611a9f565b500190565b600082821015611adf57611adf611a9f565b500390565b6000816000190483118215151615611afe57611afe611a9f565b500290565b600082611b2057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3757600080fd5b5051919050565b60008251611b508184602087016118dc565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220f3e91484e81b6295a205880b71a56739bd92a560061b728af31944b5f6d96ef064736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x831f01b2aeb61d5d8c019704e62c25763057a8806c5c790bc8b4c99ee54ac8a7","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x610178da211fef7d417bc0e6fed39f05609ad788","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0xd65ac9700cec4e530497617d02afdf0d5de3ed18466aca1578edcbce0d40ee16","0xcb":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3","0xd74ac9771d8f8f4c2b2f31ff87016e9c930b33235f6963bcab1ecdfc4094bbcb":"0x1"}},"0xe6e340d132b5f46d1e472debcd681b2abc16e57e":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea264697066735822122013ab6c51ac59af5e3ed485384e9201a6bf5ba4cdd3dd5290359ae249212e8fc464736f6c634300080c0033","storage":{}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea2646970667358221220f71399fafd06d0e383b21957bcac3bf3986a6a0701bc4c5dc7ee118215f3652364736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":49,"balance":"0x21e1733ff7a27c40205","code":"0x","storage":{}},"0xf5059a5d33d5853360d16c683c16e67980206f36":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061021c5760003560e01c806399eed4ee11610125578063c8294c56116100ad578063df5cf7231161007c578063df5cf72314610599578063e192e9ad146105c0578063e25427dd146105e0578063e89c0a00146105f3578063eb92199c1461060657600080fd5b8063c8294c561461054d578063c8f739d014610560578063cd050d9c14610573578063ce977ec31461058657600080fd5b8063a6734667116100f4578063a6734667146104e5578063b1344271146104ed578063bba549fa14610514578063bc9a40c314610527578063bd29b8cd1461053a57600080fd5b806399eed4ee146104755780639aa1653d146104885780639e8ca620146104af578063a43cde89146104d257600080fd5b80635e5a6775116101a85780636e8f03ca116101775780636e8f03ca146103b75780637c172347146103e85780637cc0d75f146104025780637ed9430f14610442578063944472a91461045557600080fd5b80635e5a67751461034d5780635f2948ec1461036a5780636ab538d41461037d5780636d14a9871461039057600080fd5b80632b3d8816116101ef5780632b3d8816146102995780632c2a5d2b146102ac5780633998fdd3146102bf57806339b70e38146102fe578063480858661461032557600080fd5b80631b327225146102215780631f9b74e014610251578063248d6573146102645780632550477714610284575b600080fd5b61023461022f366004613148565b610627565b6040516001600160601b0390911681526020015b60405180910390f35b61023461025f366004613199565b61068b565b6102776102723660046131d0565b61083a565b6040516102489190613203565b610297610292366004613280565b6108d3565b005b6102976102a736600461331f565b610b98565b6102976102ba366004613371565b610f2a565b6102e67f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe6369081565b6040516001600160a01b039091168152602001610248565b6102e67f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b610338610333366004613148565b611260565b60405163ffffffff9091168152602001610248565b61035c670de0b6b3a764000081565b604051908152602001610248565b6102976103783660046135b7565b611275565b61023461038b366004613676565b61138a565b6102e67f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304281565b61035c6103c5366004613676565b60009182526101b36020908152604080842060ff93909316845291905290205490565b6103f0602081565b60405160ff9091168152602001610248565b6104156104103660046136a2565b6113a5565b6040805182516001600160a01b031681526020928301516001600160601b03169281019290925201610248565b6102346104503660046136cc565b61141f565b610468610463366004613676565b611453565b60405161024891906136e5565b61029761048336600461375d565b6114f2565b60005461049c9062010000900461ffff1681565b60405161ffff9091168152602001610248565b61035c6104bd366004613791565b60ff1660009081526001602052604090205490565b6102346104e03660046137ac565b6115b0565b6103f060c081565b6102e67f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b6102976105223660046137ee565b611646565b610297610535366004613831565b611732565b61029761054836600461385b565b6117f2565b61023461055b366004613899565b611989565b61023461056e366004613791565b611a18565b610277610581366004613676565b611a89565b6102976105943660046138d5565b611b70565b6102e67f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b6105d36105ce366004613916565b611e65565b604051610248919061394f565b6102776105ee3660046136a2565b6120d2565b61035c610601366004613791565b61216a565b6106196106143660046136a2565b61218b565b60405161024892919061398d565b60008381526101b36020908152604080832060ff86168452909152812061064f8585856121d4565b63ffffffff1681548110610665576106656139af565b600091825260209091200154600160401b90046001600160601b031690505b9392505050565b60008054839062010000900461ffff1660ff8216106106c55760405162461bcd60e51b81526004016106bc906139c5565b60405180910390fd5b60ff84166000908152600160209081526040808320548151808301909252838252918101839052825b8281101561082e5760ff8816600090815260016020526040902080548290811061071a5761071a6139af565b6000918252602080832060408051808201825293909101546001600160a01b03808216808652600160a01b9092046001600160601b031693850193909352905163778e55f360e01b81528b8316600482015260248101919091529194507f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063778e55f390604401602060405180830381865afa1580156107c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e49190613a22565b9050801561082557670de0b6b3a764000083602001516001600160601b03168261080e9190613a51565b6108189190613a70565b6108229086613a92565b94505b506001016106ee565b50919695505050505050565b60408051606081018252600080825260208083018290528284018290528582526101b3815283822060ff88168352905291909120805483908110610880576108806139af565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b031691810191909152949350505050565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f373042161461091b5760405162461bcd60e51b81526004016106bc90613abd565b60005462010000900461ffff168282610935600182613b2f565b818110610944576109446139af565b9050013560f81c60f81b60f81c60ff16106109e45760405162461bcd60e51b815260206004820152605460248201527f5374616b6552656769737472792e5f72656769737465724f70657261746f723a60448201527f2067726561746573742071756f72756d4e756d626572206d757374206265206c606482015273195cdcc81d1a185b881c5d5bdc9d5b50dbdd5b9d60621b608482015260a4016106bc565b604080516060810182526000602082018190529181018290524363ffffffff168152905b60ff8116831115610b9057600084848360ff16818110610a2a57610a2a6139af565b919091013560f81c915060009050610a438888846124fb565b9150506001600160601b038116610ae85760405162461bcd60e51b815260206004820152605c60248201527f5374616b6552656769737472792e5f72656769737465724f70657261746f723a60448201527f204f70657261746f7220646f6573206e6f74206d656574206d696e696d756d2060648201527f7374616b6520726571756972656d656e7420666f722071756f72756d00000000608482015260a4016106bc565b600060b38360ff166101008110610b0157610b016139af565b01549050818115610b685760b38460ff166101008110610b2357610b236139af565b01610b2f600184613b2f565b81548110610b3f57610b3f6139af565b600091825260209091200154610b6590600160401b90046001600160601b031682613a92565b90505b6001600160601b0381166040870152610b818487612600565b84600101945050505050610a08565b505050505050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190613b46565b6001600160a01b0316336001600160a01b031614610c4a5760405162461bcd60e51b81526004016106bc90613b63565b600054839062010000900461ffff1660ff821610610c7a5760405162461bcd60e51b81526004016106bc906139c5565b8180610d145760405162461bcd60e51b815260206004820152605760248201527f566f746557656967686572426173652e72656d6f76655374726174656769657360448201527f436f6e73696465726564416e644d756c7469706c696572733a206e6f20696e6460648201527f6963657320746f2072656d6f76652070726f7669646564000000000000000000608482015260a4016106bc565b60005b81811015610b905760ff861660008181526001602052604090207f31fa2e2cd280c9375e13ffcf3d81e2378100186e4058f8d3ddb690b82dcd31f790878785818110610d6557610d656139af565b9050602002013581548110610d7c57610d7c6139af565b600091825260209182902001546040516001600160a01b0390911681520160405180910390a260ff861660008181526001602052604090207f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a7590878785818110610de857610de86139af565b9050602002013581548110610dff57610dff6139af565b600091825260208083209190910154604080516001600160a01b039092168252918101929092520160405180910390a260ff8616600090815260016020819052604090912080549091610e5191613b2f565b81548110610e6157610e616139af565b6000918252602080832060ff8a16845260019091526040909220910190868684818110610e9057610e906139af565b9050602002013581548110610ea757610ea76139af565b600091825260208083208454920180546001600160a01b0319166001600160a01b03909316928317815593546001600160601b03600160a01b91829004160290911790925560ff88168152600190915260409020805480610f0a57610f0a613bdf565b600082815260208120820160001990810191909155019055600101610d17565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac9190613b46565b6001600160a01b0316336001600160a01b031614610fdc5760405162461bcd60e51b81526004016106bc90613b63565b600054859062010000900461ffff1660ff82161061100c5760405162461bcd60e51b81526004016106bc906139c5565b838061108c5760405162461bcd60e51b815260206004820152604360248201527f566f746557656967686572426173652e6d6f646966795374726174656779576560448201527f69676874733a206e6f20737472617465677920696e64696365732070726f766960648201526219195960ea1b608482015260a4016106bc565b8281146111015760405162461bcd60e51b815260206004820152603c60248201527f566f746557656967686572426173652e6d6f646966795374726174656779576560448201527f69676874733a20696e707574206c656e677468206d69736d617463680000000060648201526084016106bc565b60005b818110156112565784848281811061111e5761111e6139af565b90506020020160208101906111339190613bf5565b60ff89166000908152600160205260409020888884818110611157576111576139af565b905060200201358154811061116e5761116e6139af565b6000918252602080832090910180546001600160601b0394909416600160a01b026001600160a01b039094169390931790925560ff8a168082526001909252604090207f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a75908989858181106111e5576111e56139af565b90506020020135815481106111fc576111fc6139af565b6000918252602090912001546001600160a01b0316878785818110611223576112236139af565b90506020020160208101906112389190613bf5565b60405161124692919061398d565b60405180910390a2600101611104565b5050505050505050565b600061126d8484846121d4565b949350505050565b600054610100900460ff16158080156112955750600054600160ff909116105b806112af5750303b1580156112af575060005460ff166001145b6113125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106bc565b6000805460ff191660011790558015611335576000805461ff0019166101001790555b61133f838361271a565b8015611385576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000806113978484611a89565b604001519150505b92915050565b604080518082019091526000808252602082015260ff831660009081526001602052604090208054839081106113dd576113dd6139af565b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b90046001600160601b0316918101919091529392505050565b603381610100811061143057600080fd5b60029182820401919006600c02915054906101000a90046001600160601b031681565b60008281526101b36020908152604080832060ff851684528252808320805482518185028101850190935280835260609492939192909184015b828210156114e6576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b82041683850152600160401b90046001600160601b03169082015282526001909201910161148d565b50505050905092915050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115749190613b46565b6001600160a01b0316336001600160a01b0316146115a45760405162461bcd60e51b81526004016106bc90613b63565b6115ad8161285e565b50565b60008281526101b36020908152604080832060ff8816845290915281208054829190849081106115e2576115e26139af565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529050611639818661295e565b6040015195945050505050565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c89190613b46565b6001600160a01b0316336001600160a01b0316146116f85760405162461bcd60e51b81526004016106bc90613b63565b600054829062010000900461ffff1660ff8216106117285760405162461bcd60e51b81526004016106bc906139c5565b6113858383612adf565b7f000000000000000000000000c3e53f4d16ae77db1c982e75a937b9f60fe636906001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190613b46565b6001600160a01b0316336001600160a01b0316146117e45760405162461bcd60e51b81526004016106bc90613b63565b6117ee8282612f11565b5050565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f373042161461183a5760405162461bcd60e51b81526004016106bc90613abd565b60408051606080820183526000602080840182905283850182905263ffffffff43168085528551938401865290830182905293820181905292815290915b60ff8116841115610b9057600085858360ff1681811061189a5761189a6139af565b919091013560f81c9150600090506118b3888387612fa6565b90508060b38360ff1661010081106118cd576118cd6139af565b01600160b38560ff1661010081106118e7576118e76139af565b01546118f39190613b2f565b81548110611903576119036139af565b6000918252602090912001546119299190600160401b90046001600160601b0316613c10565b6001600160601b031660408501526119418285612600565b6040805160ff841681526000602082015289917fe7c60c52692f0e0ff8d1c289ffe63cb02e79373f35e3000cafe7cca898885934910160405180910390a25050600101611878565b60008060b38560ff1661010081106119a3576119a36139af565b0183815481106119b5576119b56139af565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529050611a0c818561295e565b60400151949350505050565b600060b38260ff166101008110611a3157611a316139af565b01600160b38460ff166101008110611a4b57611a4b6139af565b0154611a579190613b2f565b81548110611a6757611a676139af565b600091825260209091200154600160401b90046001600160601b031692915050565b6040805160608082018352600080835260208084018290528385018290528682526101b3815284822060ff87168352815284822054855193840186528284529083018290529382015290919081611ae357915061139f9050565b60008581526101b36020908152604080832060ff881684529091529020611b0b600184613b2f565b81548110611b1b57611b1b6139af565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b9093049290921690820152925061139f915050565b60005b60005462010000900461ffff1660ff821610156113855760408051606081018252600080825260208201819052918101829052905b83811015611e445760007f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b03166313542a4e878785818110611bf357611bf36139af565b9050602002016020810190611c089190613c38565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c709190613a22565b604051633431af2560e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730421690633431af2590602401602060405180830381865afa158015611cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cff9190613c55565b90506001600160c01b038116611d16575050611ba8565b60016001600160c01b03821660ff87161c81161415611e3a57835163ffffffff16611dd65760b38560ff166101008110611d5257611d526139af565b01600160b38760ff166101008110611d6c57611d6c6139af565b0154611d789190613b2f565b81548110611d8857611d886139af565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b909304929092169082015293505b600080611e0a898987818110611dee57611dee6139af565b9050602002016020810190611e039190613c38565b85896124fb565b9150915080828760400151611e1f9190613c10565b611e299190613a92565b6001600160601b0316604087015250505b5050600101611ba8565b50805163ffffffff1615611e5c57611e5c8282612600565b50600101611b73565b60606000826001600160401b03811115611e8157611e816133f1565b604051908082528060200260200182016040528015611eaa578160200160208202803683370190505b50905060005b838110156120c9576000858583818110611ecc57611ecc6139af565b919091013560f81c91505063ffffffff871660b3826101008110611ef257611ef26139af565b01600081548110611f0557611f056139af565b60009182526020909120015463ffffffff161115611fc45760405162461bcd60e51b815260206004820152606a60248201527f5374616b6552656769737472792e676574546f74616c5374616b65496e64696360448201527f6573427951756f72756d4e756d626572734174426c6f636b4e756d6265723a2060648201527f71756f72756d20686173206e6f207374616b6520686973746f727920617420626084820152693637b1b5a73ab6b132b960b11b60a482015260c4016106bc565b600060b38260ff166101008110611fdd57611fdd6139af565b0154905060005b8163ffffffff168163ffffffff1610156120b3578863ffffffff1660b38460ff166101008110612016576120166139af565b0160016120238486613c7e565b61202d9190613c7e565b63ffffffff1681548110612043576120436139af565b60009182526020909120015463ffffffff16116120a15760016120668284613c7e565b6120709190613c7e565b858581518110612082576120826139af565b602002602001019063ffffffff16908163ffffffff16815250506120b3565b806120ab81613c9b565b915050611fe4565b50505080806120c190613cbf565b915050611eb0565b50949350505050565b604080516060810182526000808252602082018190529181019190915260b38360ff166101008110612106576121066139af565b018281548110612118576121186139af565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b0316918101919091529392505050565b600060b38260ff166101008110612183576121836139af565b015492915050565b600160205281600052604060002081815481106121a757600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b60008381526101b36020908152604080832060ff86168452909152812054815b8163ffffffff168163ffffffff16101561242b5760008681526101b36020908152604080832060ff89168452909152902063ffffffff85169060016122398486613c7e565b6122439190613c7e565b63ffffffff1681548110612259576122596139af565b60009182526020909120015463ffffffff16116124195760008681526101b36020908152604080832060ff89168452909152902060016122998385613c7e565b6122a39190613c7e565b63ffffffff16815481106122b9576122b96139af565b600091825260209091200154600160201b900463ffffffff161580612345575060008681526101b36020908152604080832060ff89168452909152902063ffffffff851690600161230a8486613c7e565b6123149190613c7e565b63ffffffff168154811061232a5761232a6139af565b600091825260209091200154600160201b900463ffffffff16115b6123fa5760405162461bcd60e51b815260206004820152607460248201527f5374616b6552656769737472792e5f6765745374616b65557064617465496e6460448201527f6578466f724f70657261746f724964466f7251756f72756d4174426c6f636b4e60648201527f756d6265723a206f70657261746f72496420686173206e6f207374616b652075608482015273383230ba329030ba10313637b1b5a73ab6b132b960611b60a482015260c4016106bc565b60016124068284613c7e565b6124109190613c7e565b92505050610684565b8061242381613c9b565b9150506121f4565b5060405162461bcd60e51b815260206004820152608c60248201527f5374616b6552656769737472792e5f6765745374616b65557064617465496e6460448201527f6578466f724f70657261746f724964466f7251756f72756d4174426c6f636b4e60648201527f756d6265723a206e6f207374616b652075706461746520666f756e6420666f7260848201527f206f70657261746f72496420616e642071756f72756d4e756d6265722061742060a48201526b313637b1b590373ab6b132b960a11b60c482015260e4016106bc565b604080516060810182526000602082018190529181018290524363ffffffff1681528190612529848761068b565b6001600160601b03166040820152603360ff8516610100811061254e5761254e6139af565b60029182820401919006600c029054906101000a90046001600160601b03166001600160601b031681604001516001600160601b0316101561259257600060408201525b600061259f868684612fa6565b604080840151815160ff891681526001600160601b03909116602082015291925087917fe7c60c52692f0e0ff8d1c289ffe63cb02e79373f35e3000cafe7cca898885934910160405180910390a26040909101519092509050935093915050565b600060b38360ff166101008110612619576126196139af565b015490508015612683574360b38460ff16610100811061263b5761263b6139af565b01612647600184613b2f565b81548110612657576126576139af565b9060005260206000200160000160046101000a81548163ffffffff021916908363ffffffff1602179055505b63ffffffff4316825260b360ff841661010081106126a3576126a36139af565b0180546001810182556000918252602091829020845191018054928501516040909501516001600160601b0316600160401b026bffffffffffffffffffffffff60401b1963ffffffff968716600160201b0267ffffffffffffffff1990951696909316959095179290921716929092179091555050565b600054610100900460ff166127855760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016106bc565b80518251146127fc5760405162461bcd60e51b815260206004820152603b60248201527f52656769737472792e5f696e697469616c697a653a206d696e696d756d53746160448201527f6b65466f7251756f72756d206c656e677468206d69736d61746368000000000060648201526084016106bc565b60005b81518160ff1610156113855761283181848360ff1681518110612824576128246139af565b6020026020010151612f11565b612856828260ff1681518110612849576128496139af565b602002602001015161285e565b6001016127ff565b60005462010000900461ffff1660c081106128f95760405162461bcd60e51b815260206004820152604f60248201527f566f746557656967686572426173652e5f63726561746551756f72756d3a206e60448201527f756d626572206f662071756f72756d732063616e6e6f7420657863656564204d60648201526e105617d45553d4955357d0d3d55395608a1b608482015260a4016106bc565b80612905816001613cda565b600060026101000a81548161ffff021916908361ffff16021790555061292b8184612adf565b60405160ff8216907f831a9c86c45bb303caf3f064be2bc2b9fd4ecf19e47c4ac02a61e75dabfe55b490600090a2505050565b815163ffffffff80831691161115612a045760405162461bcd60e51b815260206004820152606060248201527f5374616b6552656769737472792e5f76616c69646174654f70657261746f725360448201527f74616b654174426c6f636b4e756d6265723a206f70657261746f725374616b6560648201527f5570646174652069732066726f6d20616674657220626c6f636b4e756d626572608482015260a4016106bc565b602082015163ffffffff161580612a2a57508063ffffffff16826020015163ffffffff16115b6117ee5760405162461bcd60e51b815260206004820152607460248201527f5374616b6552656769737472792e5f76616c69646174654f70657261746f725360448201527f74616b654174426c6f636b4e756d6265723a2074686572652069732061206e6560648201527f776572206f70657261746f725374616b6555706461746520617661696c61626c60848201527332903132b337b93290313637b1b5a73ab6b132b960611b60a482015260c4016106bc565b6000815111612b5b5760405162461bcd60e51b815260206004820152604e6024820152600080516020613d1083398151915260448201527f6e73696465726564416e644d756c7469706c696572733a206e6f20737472617460648201526d1959da595cc81c1c9bdd9a59195960921b608482015260a4016106bc565b805160ff831660009081526001602090815260409091205490612b7e8383613cf7565b1115612c065760405162461bcd60e51b815260206004820152605b6024820152600080516020613d1083398151915260448201527f6e73696465726564416e644d756c7469706c696572733a20657863656564204d60648201527f41585f5745494748494e475f46554e4354494f4e5f4c454e4754480000000000608482015260a4016106bc565b60005b82811015612f0a5760005b612c1e8284613cf7565b811015612d1157848281518110612c3757612c376139af565b6020026020010151600001516001600160a01b0316600160008860ff1660ff1681526020019081526020016000208281548110612c7657612c766139af565b6000918252602090912001546001600160a01b03161415612d095760405162461bcd60e51b81526020600482015260536024820152600080516020613d1083398151915260448201527f6e73696465726564416e644d756c7469706c696572733a2063616e6e6f7420616064820152720c8c840e6c2daca40e6e8e4c2e8cacef24064f606b1b608482015260a4016106bc565b600101612c14565b506000848281518110612d2657612d266139af565b6020026020010151602001516001600160601b031611612dc25760405162461bcd60e51b815260206004820152605c6024820152600080516020613d1083398151915260448201527f6e73696465726564416e644d756c7469706c696572733a2063616e6e6f74206160648201527f64642073747261746567792077697468207a65726f2077656967687400000000608482015260a4016106bc565b60ff851660009081526001602052604090208451859083908110612de857612de86139af565b6020908102919091018101518254600181018455600093845292829020815191909201516001600160601b0316600160a01b026001600160a01b0390911617910155835160ff8616907f10565e56cacbf32eca267945f054fec02e59750032d113d3302182ad967f540490869084908110612e6557612e656139af565b602090810291909101810151516040516001600160a01b0390911681520160405180910390a28460ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a75858381518110612ec257612ec26139af565b602002602001015160000151868481518110612ee057612ee06139af565b602002602001015160200151604051612efa92919061398d565b60405180910390a2600101612c09565b5050505050565b8060338360ff166101008110612f2957612f296139af565b60029182820401919006600c026101000a8154816001600160601b0302191690836001600160601b031602179055508160ff167f26eecff2b70b0a71104ff4d940ba7162d23a95c248771fc487a7be17a596b3cf82604051612f9a91906001600160601b0391909116815260200190565b60405180910390a25050565b60008381526101b36020908152604080832060ff86168452909152812054819080156130895760008681526101b36020908152604080832060ff8916845290915290204390612ff6600184613b2f565b81548110613006576130066139af565b60009182526020808320909101805463ffffffff94909416600160201b0267ffffffff0000000019909416939093179092558781526101b38252604080822060ff891683529092522061305a600183613b2f565b8154811061306a5761306a6139af565b600091825260209091200154600160401b90046001600160601b031691505b5060008581526101b36020908152604080832060ff88168452825280832080546001810182559084529282902086519301805492870151918701516001600160601b0316600160401b026bffffffffffffffffffffffff60401b1963ffffffff938416600160201b0267ffffffffffffffff199095169390951692909217929092179290921691909117905590509392505050565b803560ff8116811461312f57600080fd5b919050565b803563ffffffff8116811461312f57600080fd5b60008060006060848603121561315d57600080fd5b8335925061316d6020850161311e565b915061317b60408501613134565b90509250925092565b6001600160a01b03811681146115ad57600080fd5b600080604083850312156131ac57600080fd5b6131b58361311e565b915060208301356131c581613184565b809150509250929050565b6000806000606084860312156131e557600080fd5b6131ee8461311e565b95602085013595506040909401359392505050565b815163ffffffff9081168252602080840151909116908201526040808301516001600160601b0316908201526060810161139f565b60008083601f84011261324a57600080fd5b5081356001600160401b0381111561326157600080fd5b60208301915083602082850101111561327957600080fd5b9250929050565b6000806000806060858703121561329657600080fd5b84356132a181613184565b93506020850135925060408501356001600160401b038111156132c357600080fd5b6132cf87828801613238565b95989497509550505050565b60008083601f8401126132ed57600080fd5b5081356001600160401b0381111561330457600080fd5b6020830191508360208260051b850101111561327957600080fd5b60008060006040848603121561333457600080fd5b61333d8461311e565b925060208401356001600160401b0381111561335857600080fd5b613364868287016132db565b9497909650939450505050565b60008060008060006060868803121561338957600080fd5b6133928661311e565b945060208601356001600160401b03808211156133ae57600080fd5b6133ba89838a016132db565b909650945060408801359150808211156133d357600080fd5b506133e0888289016132db565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613429576134296133f1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613457576134576133f1565b604052919050565b60006001600160401b03821115613478576134786133f1565b5060051b60200190565b80356001600160601b038116811461312f57600080fd5b600082601f8301126134aa57600080fd5b813560206134bf6134ba8361345f565b61342f565b82815260069290921b840181019181810190868411156134de57600080fd5b8286015b8481101561352d57604081890312156134fb5760008081fd5b613503613407565b813561350e81613184565b815261351b828601613482565b818601528352918301916040016134e2565b509695505050505050565b600082601f83011261354957600080fd5b813560206135596134ba8361345f565b82815260059290921b8401810191818101908684111561357857600080fd5b8286015b8481101561352d5780356001600160401b0381111561359b5760008081fd5b6135a98986838b0101613499565b84525091830191830161357c565b600080604083850312156135ca57600080fd5b82356001600160401b03808211156135e157600080fd5b818501915085601f8301126135f557600080fd5b813560206136056134ba8361345f565b82815260059290921b8401810191818101908984111561362457600080fd5b948201945b838610156136495761363a86613482565b82529482019490820190613629565b9650508601359250508082111561365f57600080fd5b5061366c85828601613538565b9150509250929050565b6000806040838503121561368957600080fd5b823591506136996020840161311e565b90509250929050565b600080604083850312156136b557600080fd5b6136be8361311e565b946020939093013593505050565b6000602082840312156136de57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156137515761373e83855163ffffffff808251168352806020830151166020840152506001600160601b0360408201511660408301525050565b9284019260609290920191600101613701565b50909695505050505050565b60006020828403121561376f57600080fd5b81356001600160401b0381111561378557600080fd5b61126d84828501613499565b6000602082840312156137a357600080fd5b6106848261311e565b600080600080608085870312156137c257600080fd5b6137cb8561311e565b93506137d960208601613134565b93969395505050506040820135916060013590565b6000806040838503121561380157600080fd5b61380a8361311e565b915060208301356001600160401b0381111561382557600080fd5b61366c85828601613499565b6000806040838503121561384457600080fd5b61384d8361311e565b915061369960208401613482565b60008060006040848603121561387057600080fd5b8335925060208401356001600160401b0381111561388d57600080fd5b61336486828701613238565b6000806000606084860312156138ae57600080fd5b6138b78461311e565b92506138c560208501613134565b9150604084013590509250925092565b600080602083850312156138e857600080fd5b82356001600160401b038111156138fe57600080fd5b61390a858286016132db565b90969095509350505050565b60008060006040848603121561392b57600080fd5b61393484613134565b925060208401356001600160401b0381111561388d57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561375157835163ffffffff168352928401929184019160010161396b565b6001600160a01b039290921682526001600160601b0316602082015260400190565b634e487b7160e01b600052603260045260246000fd5b6020808252603c908201527f566f746557656967686572426173652e76616c696451756f72756d4e756d626560408201527f723a2071756f72756d4e756d626572206973206e6f742076616c696400000000606082015260800190565b600060208284031215613a3457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613a6b57613a6b613a3b565b500290565b600082613a8d57634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160601b03808316818516808303821115613ab457613ab4613a3b565b01949350505050565b6020808252604c908201527f5374616b6552656769737472792e6f6e6c795265676973747279436f6f72646960408201527f6e61746f723a2063616c6c6572206973206e6f7420746865205265676973747260608201526b3ca1b7b7b93234b730ba37b960a11b608082015260a00190565b600082821015613b4157613b41613a3b565b500390565b600060208284031215613b5857600080fd5b815161068481613184565b60208082526056908201527f566f746557656967686572426173652e6f6e6c79536572766963654d616e616760408201527f65724f776e65723a2063616c6c6572206973206e6f7420746865206f776e65726060820152751037b3103a34329039b2b93b34b1b2a6b0b730b3b2b960511b608082015260a00190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215613c0757600080fd5b61068482613482565b60006001600160601b0383811690831681811015613c3057613c30613a3b565b039392505050565b600060208284031215613c4a57600080fd5b813561068481613184565b600060208284031215613c6757600080fd5b81516001600160c01b038116811461068457600080fd5b600063ffffffff83811690831681811015613c3057613c30613a3b565b600063ffffffff80831681811415613cb557613cb5613a3b565b6001019392505050565b6000600019821415613cd357613cd3613a3b565b5060010190565b600061ffff808316818516808303821115613ab457613ab4613a3b565b60008219821115613d0a57613d0a613a3b565b50019056fe566f746557656967686572426173652e5f61646453747261746567696573436fa2646970667358221220eb2e995c464c463894deb8399fe43542935e86d2e9dd5d7f8d6e73a4997a92d164736f6c634300080c0033","storage":{"0x0":"0xff"}}}} \ No newline at end of file diff --git a/tests/integration/deploy-avs-save-anvil-state.sh b/tests/integration/deploy-avs-save-anvil-state.sh new file mode 100755 index 00000000..614ab6e9 --- /dev/null +++ b/tests/integration/deploy-avs-save-anvil-state.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +RPC_URL=http://localhost:8545 +PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +cd "$parent_path" + +# start an anvil instance in the background that has eigenlayer contracts deployed +anvil --load-state eigenlayer-and-shared-avs-contracts-deployed-anvil-state.json --dump-state avs-and-eigenlayer-deployed-anvil-state.json & +cd ../../contracts +forge script script/CredibleSquaringDeployer.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -v + # we also do this here to make sure the operator has funds to register with the eigenlayer contracts +cast send 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 --value 10ether --private-key 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 +# kill anvil to save its state +pkill anvil diff --git a/tests/integration/deploy-eigenlayer-save-anvil-state.sh b/tests/integration/deploy-eigenlayer-save-anvil-state.sh new file mode 100755 index 00000000..50dbab35 --- /dev/null +++ b/tests/integration/deploy-eigenlayer-save-anvil-state.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +# At this point we are in tests/integration +cd "$parent_path" + +# start an empty anvil chain in the background and dump its state to a json file upon exit +anvil --dump-state eigenlayer-deployed-anvil-state.json & + +cd ../../contracts/lib/eigenlayer-middleware/lib/eigenlayer-contracts +# deployment overwrites this file, so we save it as backup, because we want that output in our local files, and not in the eigenlayer-contracts submodule files +mv script/output/M2_from_scratch_deployment_data.json script/output/M2_from_scratch_deployment_data.json.bak +# M2_Deploy_From_Scratch.s.sol prepends "script/testing/" to the configFile passed as input (M2_deploy_from_scratch.anvil.config.json) +forge script script/testing/M2_Deploy_From_Scratch.s.sol --rpc-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast --sig "run(string memory configFile)" -- M2_deploy_from_scratch.anvil.config.json +mv script/output/M2_from_scratch_deployment_data.json ../../../../script/output/31337/eigenlayer_deployment_output.json +mv script/output/M2_from_scratch_deployment_data.json.bak script/output/M2_from_scratch_deployment_data.json + +# # kill anvil to save its state +pkill anvil diff --git a/tests/integration/deploy-shared-avs-contracts-save-anvil-state.sh b/tests/integration/deploy-shared-avs-contracts-save-anvil-state.sh new file mode 100755 index 00000000..5a47233f --- /dev/null +++ b/tests/integration/deploy-shared-avs-contracts-save-anvil-state.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +RPC_URL=http://localhost:8545 +PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + +# cd to the directory of this script so that this can be run from anywhere +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +# At this point we are in tests/integration +cd "$parent_path" + +# start an empty anvil chain in the background and dump its state to a json file upon exit +anvil --load-state eigenlayer-deployed-anvil-state.json --dump-state eigenlayer-and-shared-avs-contracts-deployed-anvil-state.json & + +cd ../../contracts/lib/eigenlayer-middleware +forge script script/DeploySharedContracts.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast +mv script/output/31337/shared_contracts_deployment_data.json ../../script/output/31337/shared_avs_contracts_deployment_output.json + +# # kill anvil to save its state +pkill anvil diff --git a/tests/integration/eigenlayer-and-shared-avs-contracts-deployed-anvil-state.json b/tests/integration/eigenlayer-and-shared-avs-contracts-deployed-anvil-state.json new file mode 100644 index 00000000..0190080e --- /dev/null +++ b/tests/integration/eigenlayer-and-shared-avs-contracts-deployed-anvil-state.json @@ -0,0 +1 @@ +{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x12de5f03ee4c800","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x1e","0x97":"0x0","0x9a":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xdcd1bf9a1b36ce34237eeafef220932846bcd82","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106102045760003560e01c80639b4e463411610118578063c1de3aef116100a0578063daf12cd41161006f578063daf12cd41461065f578063ea4d3c9b1461067f578063f2fde38b146106b3578063f6848d24146106d3578063fabc1cbc1461070e57600080fd5b8063c1de3aef146105cf578063c2c51c40146105ef578063c3c6b3a91461060f578063d1c64cc91461063f57600080fd5b8063a6a509be116100e7578063a6a509be1461052f578063b134427114610545578063beffbb8914610579578063c052bd6114610599578063c0ccbf10146105b957600080fd5b80639b4e4634146104995780639ba06275146104ac578063a1788484146104e2578063a38406a31461050f57600080fd5b80635ac86ab71161019b57806374cdd7981161016a57806374cdd798146103ea57806384d810621461041e578063886f1195146104335780638da5cb5b146104535780639104c3191461047157600080fd5b80635ac86ab7146103535780635c975abb1461039357806360f4062b146103a8578063715018a6146103d557600080fd5b8063292b7b2b116101d7578063292b7b2b1461029e578063387b1300146102ea57806339b70e381461030a578063595c6a671461033e57600080fd5b80630cf2686d146102095780630e81073c1461022b57806310d67a2f1461025e578063136439dd1461027e575b600080fd5b34801561021557600080fd5b50610229610224366004612371565b61072e565b005b34801561023757600080fd5b5061024b61024636600461239f565b6107ea565b6040519081526020015b60405180910390f35b34801561026a57600080fd5b506102296102793660046123cb565b6109f5565b34801561028a57600080fd5b50610229610299366004612371565b610aa5565b3480156102aa57600080fd5b506102d27f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b6040516001600160a01b039091168152602001610255565b3480156102f657600080fd5b506102296103053660046123e8565b610be4565b34801561031657600080fd5b506102d27f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b34801561034a57600080fd5b50610229610f27565b34801561035f57600080fd5b5061038361036e366004612429565b606654600160ff9092169190911b9081161490565b6040519015158152602001610255565b34801561039f57600080fd5b5060665461024b565b3480156103b457600080fd5b5061024b6103c33660046123cb565b609b6020526000908152604090205481565b3480156103e157600080fd5b50610229610fee565b3480156103f657600080fd5b506102d27f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561042a57600080fd5b50610229611002565b34801561043f57600080fd5b506065546102d2906001600160a01b031681565b34801561045f57600080fd5b506033546001600160a01b03166102d2565b34801561047d57600080fd5b506102d273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102296104a7366004612495565b61108c565b3480156104b857600080fd5b506102d26104c73660046123cb565b6098602052600090815260409020546001600160a01b031681565b3480156104ee57600080fd5b5061024b6104fd3660046123cb565b609c6020526000908152604090205481565b34801561051b57600080fd5b506102d261052a3660046123cb565b611125565b34801561053b57600080fd5b5061024b60995481565b34801561055157600080fd5b506102d27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b34801561058557600080fd5b5061022961059436600461239f565b6111f7565b3480156105a557600080fd5b506097546102d2906001600160a01b031681565b3480156105c557600080fd5b5061024b609a5481565b3480156105db57600080fd5b506102296105ea3660046123cb565b61148a565b3480156105fb57600080fd5b5061022961060a36600461239f565b61149b565b34801561061b57600080fd5b5061038361062a366004612371565b609d6020526000908152604090205460ff1681565b34801561064b57600080fd5b5061024b61065a366004612509565b61186d565b34801561066b57600080fd5b5061022961067a366004612533565b611978565b34801561068b57600080fd5b506102d27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b3480156106bf57600080fd5b506102296106ce3660046123cb565b611aab565b3480156106df57600080fd5b506103836106ee3660046123cb565b6001600160a01b0390811660009081526098602052604090205416151590565b34801561071a57600080fd5b50610229610729366004612371565b611b21565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a5919061258e565b6001600160a01b0316336001600160a01b0316146107de5760405162461bcd60e51b81526004016107d5906125ab565b60405180910390fd5b6107e781611c7d565b50565b6000336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146108345760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b0383166108b05760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f206164647265737300000000000060648201526084016107d5565b600082121561091e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b60648201526084016107d5565b61092c633b9aca0083612669565b1561099f5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e7400000060648201526084016107d5565b6001600160a01b0383166000908152609b6020526040812054906109c38483612693565b6001600160a01b0386166000908152609b6020526040902081905590506109ea8282611cbe565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c919061258e565b6001600160a01b0316336001600160a01b031614610a9c5760405162461bcd60e51b81526004016107d5906125ab565b6107e781611d00565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1191906126d4565b610b2d5760405162461bcd60e51b81526004016107d5906126f6565b60665481811614610ba65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016107d5565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610c2c5760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b038316610ca65760405162461bcd60e51b815260206004820152604760248201526000805160206131d383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a4016107d5565b6001600160a01b038216610d235760405162461bcd60e51b815260206004820152604a60248201526000805160206131d383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a4016107d5565b6000811215610d925760405162461bcd60e51b815260206004820152604160248201526000805160206131d383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a4016107d5565b610da0633b9aca0082612669565b15610e145760405162461bcd60e51b815260206004820152604a60248201526000805160206131d383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a4016107d5565b6001600160a01b0383166000908152609b602052604081205490811215610eab576000610e408261273e565b905080831115610e74576001600160a01b0385166000908152609b6020526040812055610e6d818461275b565b9250610ea9565b6001600160a01b0385166000908152609b602052604081208054859290610e9c908490612693565b90915550610f2292505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50505050505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9391906126d4565b610faf5760405162461bcd60e51b81526004016107d5906126f6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ff6611df7565b6110006000611e51565b565b336000908152609860205260409020546001600160a01b0316156110845760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b60648201526084016107d5565b6107e7611ea3565b336000908152609860205260409020546001600160a01b0316806110b5576110b2611ea3565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906110eb908a908a908a908a908a9060040161279b565b6000604051808303818588803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806109ef576111f0836001600160a01b031660001b60405180610940016040528061090e81526020016128c561090e9139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f19818403018152908290526111d59291602001612810565b604051602081830303815290604052805190602001206120d7565b9392505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461123f5760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b0382166112bb5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20706f60448201527f644f776e65722063616e6e6f74206265207a65726f206164647265737300000060648201526084016107d5565b60008112156113325760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f6172657320616d6f756e74206973206e6567617469766500000000000000000060648201526084016107d5565b611340633b9aca0082612669565b156113b5576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e7460648201526084016107d5565b6001600160a01b0382166000908152609b60205260408120546113d9908390612825565b9050600081121561146a5760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a4016107d5565b6001600160a01b039092166000908152609b602052604090209190915550565b611492611df7565b6107e781612133565b6001600160a01b0380831660009081526098602052604090205483911633146115165760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b60648201526084016107d5565b600260c65414156115695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d5565b600260c6556001600160a01b0383166116055760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a4016107d5565b611613633b9aca0083612864565b156116ac5760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a4016107d5565b6001600160a01b0383166000908152609b6020526040812054906116d08483612693565b6001600160a01b0386166000908152609b602052604081208290559091506116f88383611cbe565b905080156118605760008112156117c3576001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117578561273e565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156117a657600080fd5b505af11580156117ba573d6000803e3d6000fd5b50505050611860565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b15801561184757600080fd5b505af115801561185b573d6000803e3d6000fd5b505050505b5050600160c65550505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa1580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e89190612878565b9050806109ef5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a4016107d5565b600054610100900460ff16158080156119985750600054600160ff909116105b806119b25750303b1580156119b2575060005460ff166001145b611a155760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d5565b6000805460ff191660011790558015611a38576000805461ff0019166101001790555b611a4186611c7d565b611a4a85612133565b611a5384611e51565b611a5d838361217d565b8015611aa3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b611ab3611df7565b6001600160a01b038116611b185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d5565b6107e781611e51565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061258e565b6001600160a01b0316336001600160a01b031614611bc85760405162461bcd60e51b81526004016107d5906125ab565b606654198119606654191614611c465760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016107d5565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610bd9565b609a5460408051918252602082018390527f4e65c41a3597bda732ca64980235cf51494171d5853998763fb05db45afaacb3910160405180910390a1609a55565b6000808313611cde5760008213611cd7575060006109ef565b50806109ef565b60008213611cf657611cef8361273e565b90506109ef565b611cef8383612825565b6001600160a01b038116611d8e5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016107d5565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146110005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d5565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606654600090819060019081161415611efe5760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e646578206973207061757365640000000000000060448201526064016107d5565b609a54609954611f0f906001612891565b1115611f735760405162461bcd60e51b815260206004820152602d60248201527f456967656e506f644d616e616765722e5f6465706c6f79506f643a20706f642060448201526c1b1a5b5a5d081c995858da1959609a1b60648201526084016107d5565b609960008154611f82906128a9565b9091555060408051610940810190915261090e80825260009161202191839133916128c56020830139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f198184030181529082905261200d9291602001612810565b604051602081830303815290604052612267565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b15801561206557600080fd5b505af1158015612079573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a391505090565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906111f0565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561219e57506001600160a01b03821615155b6122205760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016107d5565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261226382611d00565b5050565b600080844710156122ba5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016107d5565b82516123085760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016107d5565b8383516020850187f590506001600160a01b0381166123695760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016107d5565b949350505050565b60006020828403121561238357600080fd5b5035919050565b6001600160a01b03811681146107e757600080fd5b600080604083850312156123b257600080fd5b82356123bd8161238a565b946020939093013593505050565b6000602082840312156123dd57600080fd5b81356111f08161238a565b6000806000606084860312156123fd57600080fd5b83356124088161238a565b925060208401356124188161238a565b929592945050506040919091013590565b60006020828403121561243b57600080fd5b813560ff811681146111f057600080fd5b60008083601f84011261245e57600080fd5b50813567ffffffffffffffff81111561247657600080fd5b60208301915083602082850101111561248e57600080fd5b9250929050565b6000806000806000606086880312156124ad57600080fd5b853567ffffffffffffffff808211156124c557600080fd5b6124d189838a0161244c565b909750955060208801359150808211156124ea57600080fd5b506124f78882890161244c565b96999598509660400135949350505050565b60006020828403121561251b57600080fd5b813567ffffffffffffffff811681146111f057600080fd5b600080600080600060a0868803121561254b57600080fd5b85359450602086013561255d8161238a565b9350604086013561256d8161238a565b9250606086013561257d8161238a565b949793965091946080013592915050565b6000602082840312156125a057600080fd5b81516111f08161238a565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261267857612678612653565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126b5576126b561267d565b600160ff1b83900384128116156126ce576126ce61267d565b50500190565b6000602082840312156126e657600080fd5b815180151581146111f057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127545761275461267d565b5060000390565b60008282101561276d5761276d61267d565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006127af606083018789612772565b82810360208401526127c2818688612772565b9150508260408301529695505050505050565b6000815160005b818110156127f657602081850181015186830152016127dc565b81811115612805576000828601525b509290920192915050565b600061236961281f83866127d5565b846127d5565b60008083128015600160ff1b8501841216156128435761284361267d565b6001600160ff1b038401831381161561285e5761285e61267d565b50500390565b60008261287357612873612653565b500790565b60006020828403121561288a57600080fd5b5051919050565b600082198211156128a4576128a461267d565b500190565b60006000198214156128bd576128bd61267d565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220fdba244614e85c7d0217ace6943bbcaeeda2f25ab03ed3807c7c4b43c901c2d664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061016a5760003560e01c80637439841f116100d1578063c49074421161008a578063e251ef5211610064578063e251ef521461053c578063e2c834451461055c578063f28824611461057c578063fe80b087146105b057600080fd5b8063c4907442146104dc578063c4d66de8146104fc578063dda3346c1461051c57600080fd5b80637439841f146103f557806374cdd7981461043957806387e0d2891461046d5780639b4e463414610494578063b725bceb146104a7578063baa7145a146104c757600080fd5b80633474aa16116101235780633474aa16146102f957806334bea20a146103195780633f65cf19146103545780634665bcda146103745780635d3f65b6146103a85780636fcd0e53146103c857600080fd5b80630b18ff66146101c05780630cd4649e146101fd5780631a5057be146102145780631d905d5c146102485780631f60c2bd146102945780633106ab53146102c857600080fd5b366101bb5734603760008282546101819190614750565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101cc57600080fd5b506033546101e0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020957600080fd5b506102126105d4565b005b34801561022057600080fd5b506101e07f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b34801561025457600080fd5b5061027c7f0000000000000000000000000000000000000000000000000000000737be760081565b6040516001600160401b0390911681526020016101f4565b3480156102a057600080fd5b5061027c7f000000000000000000000000000000000000000000000000000000002cb4178081565b3480156102d457600080fd5b506034546102e990600160401b900460ff1681565b60405190151581526020016101f4565b34801561030557600080fd5b5060345461027c906001600160401b031681565b34801561032557600080fd5b506102e9610334366004614784565b603560209081526000928352604080842090915290825290205460ff1681565b34801561036057600080fd5b5061021261036f366004614813565b61073d565b34801561038057600080fd5b506101e07f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b3480156103b457600080fd5b5060385461027c906001600160401b031681565b3480156103d457600080fd5b506103e86103e33660046148e1565b610c69565b6040516101f49190614932565b34801561040157600080fd5b5061042c6104103660046148e1565b600090815260366020526040902054600160c01b900460ff1690565b6040516101f4919061497a565b34801561044557600080fd5b506101e07f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561047957600080fd5b5060335461027c90600160a01b90046001600160401b031681565b6102126104a23660046149c9565b610d16565b3480156104b357600080fd5b506102126104c2366004614a3c565b610ec3565b3480156104d357600080fd5b50610212611291565b3480156104e857600080fd5b506102126104f7366004614ae4565b6112fc565b34801561050857600080fd5b50610212610517366004614b10565b611482565b34801561052857600080fd5b50610212610537366004614c2a565b61165a565b34801561054857600080fd5b50610212610557366004614cfb565b611783565b34801561056857600080fd5b50610212610577366004614ae4565b611b4e565b34801561058857600080fd5b5061027c7f000000000000000000000000000000000000000000000000000000006059f46081565b3480156105bc57600080fd5b506105c660375481565b6040519081526020016101f4565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190614df6565b156106865760405162461bcd60e51b815260040161067d90614e18565b60405180910390fd5b6033546001600160a01b031633146106b05760405162461bcd60e51b815260040161067d90614e75565b603454600160401b900460ff16156106da5760405162461bcd60e51b815260040161067d90614ebd565b6034805460ff60401b1916600160401b179055603354610702906001600160a01b0316611c88565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b031633146107675760405162461bcd60e51b815260040161067d90614e75565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f39190614df6565b156108105760405162461bcd60e51b815260040161067d90614e18565b60335489906001600160401b03600160a01b9091048116908216116108475760405162461bcd60e51b815260040161067d90614f0c565b603454600160401b900460ff166108bf5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b606482015260840161067d565b86851480156108cd57508483145b61095d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a40161067d565b42610973613f486001600160401b038d16614750565b10156109fc5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a40161067d565b60405163d1c64cc960e01b81526001600160401b038b166004820152610aa5907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190614fa7565b8a35610aa060208d018d614fc0565b611cbc565b6000805b88811015610b4957610b2b8c8c358c8c85818110610ac957610ac9615006565b9050602002016020810190610ade919061501c565b8b8b86818110610af057610af0615006565b9050602002810190610b029190614fc0565b8b8b88818110610b1457610b14615006565b9050602002810190610b269190615043565b611e44565b610b359083614750565b915080610b418161508c565b915050610aa9565b5060008113610bd55760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a206f766572666c6f7720696e20746f74616c416d6f756e74546f4260648201526b6552657374616b656457656960a01b608482015260a40161067d565b60335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f9091169063c2c51c4090604401600060405180830381600087803b158015610c4457600080fd5b505af1158015610c58573d6000803e3d6000fd5b505050505050505050505050505050565b610c916040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610cfc57610cfc6148fa565b6002811115610d0d57610d0d6148fa565b90525092915050565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614610d5e5760405162461bcd60e51b815260040161067d906150a7565b346801bc16d674ec80000014610dea5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a40161067d565b7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa6001600160a01b031663228951186801bc16d674ec8000008787610e2d612285565b8888886040518863ffffffff1660e01b8152600401610e5196959493929190615179565b6000604051808303818588803b158015610e6a57600080fd5b505af1158015610e7e573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610eb49291906151c8565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190614df6565b15610f6c5760405162461bcd60e51b815260040161067d90614e18565b8684148015610f7a57508382145b6110025760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f72496e646963657320616e642070726f6f6673206d757374206260648201526c0ca40e6c2daca40d8cadccee8d609b1b608482015260a40161067d565b42611018613f486001600160401b038c16614750565b101561109a5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e76657269667942616c616e63655570646174653a207370908201527f656369666965642074696d657374616d7020697320746f6f2066617220696e206064820152631c185cdd60e21b608482015260a40161067d565b60405163d1c64cc960e01b81526001600160401b038a16600482015261113e907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa15801561110b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f9190614fa7565b8735610aa060208a018a614fc0565b6000805b888110156111e2576111c48b8b8b8481811061116057611160615006565b9050602002016020810190611175919061501c565b8a358a8a8681811061118957611189615006565b905060200281019061119b91906151dc565b8989878181106111ad576111ad615006565b90506020028101906111bf9190615043565b6122ca565b6111ce90836151fc565b9150806111da8161508c565b915050611142565b506033546001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169163c2c51c409116611227633b9aca008561523d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b5050505050505050505050505050565b6033546001600160a01b031633146112bb5760405162461bcd60e51b815260040161067d90614e75565b603454600160401b900460ff16156112e55760405162461bcd60e51b815260040161067d90614ebd565b6033546112fa906001600160a01b0316611c88565b565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16146113445760405162461bcd60e51b815260040161067d906150a7565b611352633b9aca00826152d8565b156113dc5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a40161067d565b60006113ec633b9aca00836152ec565b60348054919250829160009061140c9084906001600160401b0316615300565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161146b91815260200190565b60405180910390a261147d838361273f565b505050565b600054610100900460ff16158080156114a25750600054600160ff909116105b806114bc5750303b1580156114bc575060005460ff166001145b61151f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161067d565b6000805460ff191660011790558015611542576000805461ff0019166101001790555b6001600160a01b0382166115b55760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b606482015260840161067d565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611656576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146116845760405162461bcd60e51b815260040161067d90614e75565b815183511461170f5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a40161067d565b60005b835181101561177d5761176b8284838151811061173157611731615006565b602002602001015186848151811061174b5761174b615006565b60200260200101516001600160a01b03166127499092919063ffffffff16565b806117758161508c565b915050611712565b50505050565b604051635ac86ab760e01b81526004808201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180e9190614df6565b1561182b5760405162461bcd60e51b815260040161067d90614e18565b838614801561183957508588145b801561184457508782145b6118b8576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e677468606482015260840161067d565b60405163d1c64cc960e01b81526001600160401b038c16600482015261195c907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190614fa7565b8b35610aa060208e018e614fc0565b604080518082019091526000808252602082015260005b83811015611a5c576000611a178d358d8d8581811061199457611994615006565b90506020028101906119a69190615328565b8c8c868181106119b8576119b8615006565b90506020028101906119ca9190614fc0565b8c8c888181106119dc576119dc615006565b90506020028101906119ee9190615043565b8c8c8a818110611a0057611a00615006565b9050602002810190611a129190615043565b61279b565b80518451919250908490611a2c908390614750565b9052506020808201519084018051611a459083906151fc565b905250819050611a548161508c565b915050611973565b50805115611a8b576033548151611a8b916001600160a01b031690611a8690633b9aca009061533f565b612be2565b602081015115611b405760335460208201516001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169263c2c51c4092911690611ae190633b9aca009061523d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611b2757600080fd5b505af1158015611b3b573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611b785760405162461bcd60e51b815260040161067d90614e75565b603754811115611c295760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c40161067d565b8060376000828254611c3b919061535e565b90915550506040518181526001600160a01b038316907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a26116568282612be2565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755611cb98147612be2565b50565b611cc86003602061533f565b8114611d585760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a40161067d565b611d9d82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925087915060039050612c70565b61177d5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c40161067d565b600080611e83848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611ef257611ef26148fa565b6002811115611f0357611f036148fa565b9052509050600081606001516002811115611f2057611f206148fa565b14611fc95760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c40161067d565b611fd1612285565b611fda90615375565b612016868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cac92505050565b1461209d5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a40161067d565b60006120db868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc192505050565b90506120eb8a87878b8b8e612cec565b6001606083015264ffffffffff891682526001600160401b038b16604083015261211481612f0d565b6001600160401b03908116602080850191825260008681526036909152604090819020855181549351928701518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606085015185939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156121b6576121b66148fa565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516122519392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b0316612276919061533f565b9b9a5050505050505050505050565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b6000806122db604086013588612fe4565b9050600061231b858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561238a5761238a6148fa565b600281111561239b5761239b6148fa565b815250509050896001600160401b031681604001516001600160401b0316106124525760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a40161067d565b60018160600151600281111561246a5761246a6148fa565b146124d25760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b606482015260840161067d565b6124db8a613019565b6001600160401b031661252087878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310392505050565b6001600160401b0316116125c3576000836001600160401b0316116125c35760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a40161067d565b6125dc8887876125d660208c018c614fc0565b8e612cec565b6125f58860408901356125ef8a80614fc0565b8d61311b565b6020810151600061260585612f0d565b6001600160401b0380821660208087019182528f8316604080890191825260008a8152603690935290912087518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606087015193945086939192839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156126b2576126b26148fa565b0217905550905050816001600160401b0316816001600160401b031614612730576040805164ffffffffff8d1681526001600160401b038e8116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a161272d8183613284565b95505b50505050509695505050505050565b611656828261329c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261147d9084906133b5565b60408051808201909152600080825260208201526127c06127bb89615408565b613487565b6033546001600160401b03600160a01b9091048116908216116127f55760405162461bcd60e51b815260040161067d90614f0c565b60006128036127bb8b615408565b90506000612843888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612870576128706148fa565b14156129275760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c40161067d565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156129e65760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a40161067d565b60008181526035602090815260408083206001600160401b03861684529091529020805460ff19166001179055612a1f8c87878e613497565b6000612a5d878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e7f92505050565b9050612a6d8d8a8a8e8e86612cec565b6000612aab888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e9792505050565b9050612ae98a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310392505050565b6001600160401b0316612b03612afe8f615408565b613eaf565b6001600160401b031610612bbb57603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352612bb093869388938a936001600160a01b03909316928892916060830190600160c01b900460ff166002811115612b9757612b976148fa565b6002811115612ba857612ba86148fa565b905250613ec1565b955050505050612bd5565b603354612bb090839086906001600160a01b0316846140d2565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8539091169063c0db354c9083906044016000604051808303818588803b158015612c5357600080fd5b505af1158015612c67573d6000803e3d6000fd5b50505050505050565b600083612c7e8685856141b0565b1495945050505050565b600081600081518110612c9d57612c9d615006565b60200260200101519050919050565b600081600181518110612c9d57612c9d615006565b6000612ce682600281518110612cd957612cd9615006565b60200260200101516142fc565b92915050565b612cf860036002615628565b8414612d715760405162461bcd60e51b815260206004820152604e602482015260008051602061579483398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161067d565b6005612d7f60286001614750565b612d899190614750565b612d9490602061533f565b8214612e025760405162461bcd60e51b8152602060048201526043602482015260008051602061579483398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a40161067d565b600064ffffffffff8216612e1860286001614750565b600b901b1790506000612e5d87878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436392505050565b9050612ea385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250859150869050612c70565b612f035760405162461bcd60e51b815260206004820152603d602482015260008051602061579483398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f66000000606482015260840161067d565b5050505050505050565b60007f000000000000000000000000000000000000000000000000000000002cb417806001600160401b0316826001600160401b031611612f5057506000919050565b6000633b9aca0080612f827f000000000000000000000000000000000000000000000000000000002cb4178086615300565b6001600160401b0316612f9591906152ec565b612f9f919061533f565b9050612fdd7f0000000000000000000000000000000000000000000000000000000737be76006001600160401b0316826001600160401b0316614610565b9392505050565b600080612ff2600484615634565b612ffd906040615658565b64ffffffffff16905061301184821b6142fc565b949350505050565b60007f000000000000000000000000000000000000000000000000000000006059f4606001600160401b0316826001600160401b031610156130c35760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e65736973000000000000000000606482015260840161067d565b6130cf600c6020615685565b6130f97f000000000000000000000000000000000000000000000000000000006059f46084615300565b612ce691906156ab565b6000612ce682600781518110612cd957612cd9615006565b600561312960266001614750565b6131339190614750565b61313e90602061533f565b82146131ae5760405162461bcd60e51b815260206004820152604460248201819052600080516020615794833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a40161067d565b60006131bb6004836156d1565b64ffffffffff169050806131d160266001614750565b600c901b17905061321c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250899150859050612c70565b61327c5760405162461bcd60e51b815260206004820152603e602482015260008051602061579483398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f660000606482015260840161067d565b505050505050565b6000612fdd6001600160401b038084169085166156e9565b804710156132ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161067d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613339576040519150601f19603f3d011682016040523d82523d6000602084013e61333e565b606091505b505090508061147d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161067d565b600061340a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166146269092919063ffffffff16565b80519091501561147d57808060200190518101906134289190614df6565b61147d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161067d565b6000612ce68261014001516142fc565b6134a2600280615628565b82146135165760405162461bcd60e51b815260206004820152604960248201526000805160206157b483398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a40161067d565b613522600d6002615628565b61353260c0830160a08401615728565b6001600160401b03161061359c5760405162461bcd60e51b815260206004820152603f60248201526000805160206157b483398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c6172676500606482015260840161067d565b6135a860046002615628565b6135b9610100830160e08401615728565b6001600160401b031610613625576040805162461bcd60e51b81526020600482015260248101919091526000805160206157b483398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c61726765606482015260840161067d565b61363160186002615628565b61364160e0830160c08401615728565b6001600160401b0316106136bb5760405162461bcd60e51b815260206004820152604760248201526000805160206157b483398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a40161067d565b6136c6600480614750565b6136d1906001614750565b6136dc90602061533f565b6136e68280614fc0565b90501461375a5760405162461bcd60e51b815260206004820152604860248201526000805160206157b483398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a40161067d565b61376660046003614750565b61377190602061533f565b61377e6040830183614fc0565b9050146137f85760405162461bcd60e51b815260206004820152604e60248201526000805160206157b483398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161067d565b6138046003602061533f565b6138116020830183614fc0565b90501461387f5760405162461bcd60e51b815260206004820152604260248201526000805160206157b483398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a40161067d565b61388b6004602061533f565b6138986060830183614fc0565b90501461390b5760405162461bcd60e51b815260206004820152604760248201526000805160206157b483398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a40161067d565b600d61391960186001614750565b613924906005614750565b61392f906001614750565b6139399190614750565b61394490602061533f565b6139516080830183614fc0565b9050146139da5760405162461bcd60e51b815260206004820152605860248201526000805160206157b483398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a40161067d565b60006139ec60c0830160a08401615728565b6001600160401b03166000613a03600d6001614750565b613a1360e0860160c08701615728565b6001600160401b0316901b600d613a2c60186001614750565b613a37906001614750565b613a419190614750565b601b901b1717179050613a9c613a5a6080840184614fc0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505061010085013584612c70565b613b0f5760405162461bcd60e51b815260206004820152604a60248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a40161067d565b613b66613b1f6020840184614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250610100880135935061012088013592509050612c70565b613bc65760405162461bcd60e51b815260206004820152603d60248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f66000000606482015260840161067d565b6049613c1e613bd86040850185614fc0565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061010085013561016086013584612c70565b613c905760405162461bcd60e51b815260206004820152604960248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a40161067d565b50613ce8613ca16060840184614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101608401356101408501356009612c70565b613d565760405162461bcd60e51b8152602060048201526044602482018190526000805160206157b4833981519152908201527f616c3a20496e76616c696420626c6f636b4e756d626572206d65726b6c6520706064820152633937b7b360e11b608482015260a40161067d565b6000613d69610100840160e08501615728565b6001600160401b0316613d7e60046001614750565b600e901b1790506000613dc386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436392505050565b9050613e13613dd28580614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101608601358385612c70565b612c675760405162461bcd60e51b815260206004820152604360248201526000805160206157b483398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a40161067d565b6000612ce682600181518110612cd957612cd9615006565b6000612ce682600381518110612cd957612cd9615006565b600060206130f98361012001516142fc565b604080518082019091526000808252602082015260007f0000000000000000000000000000000000000000000000000000000737be76006001600160401b0316846001600160401b03161115613f3857507f0000000000000000000000000000000000000000000000000000000737be7600613f3b565b50825b6040805180820190915260008082526020820152613f598286615300565b6001600160401b039081168252603480548492600091613f7b91859116615743565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550613fad828560200151613284565b602082810191909152600090850152600260608501819052506000888152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115614064576140646148fa565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a2603880548391906000906141639084906001600160401b0316615743565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156141cf5750602084516141cd91906152d8565b155b61425e5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a40161067d565b604080516020808201909252848152905b855181116142f2576142826002856152d8565b6142b5578151600052808601516020526020826040600060026107d05a03fa6142aa57600080fd5b6002840493506142e0565b8086015160005281516020526020826040600060026107d05a03fa6142d957600080fd5b6002840493505b6142eb602082614750565b905061426f565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161437491906152ec565b90506000816001600160401b0381111561439057614390614b2d565b6040519080825280602002602001820160405280156143b9578160200160208202803683370190505b50905060005b828110156144c0576002856143d4838361533f565b815181106143e4576143e4615006565b6020026020010151868360026143fa919061533f565b614405906001614750565b8151811061441557614415615006565b6020026020010151604051602001614437929190918252602082015260400190565b60408051601f19818403018152908290526144519161576e565b602060405180830381855afa15801561446e573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144919190614fa7565b8282815181106144a3576144a3615006565b6020908102919091010152806144b88161508c565b9150506143bf565b506144cc6002836152ec565b91505b81156145ec5760005b828110156145d9576002826144ed838361533f565b815181106144fd576144fd615006565b602002602001015183836002614513919061533f565b61451e906001614750565b8151811061452e5761452e615006565b6020026020010151604051602001614550929190918252602082015260400190565b60408051601f198184030181529082905261456a9161576e565b602060405180830381855afa158015614587573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906145aa9190614fa7565b8282815181106145bc576145bc615006565b6020908102919091010152806145d18161508c565b9150506144d8565b506145e56002836152ec565b91506144cf565b806000815181106145ff576145ff615006565b602002602001015192505050919050565b600081831061461f5781612fdd565b5090919050565b60606130118484600085856001600160a01b0385163b6146885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161067d565b600080866001600160a01b031685876040516146a4919061576e565b60006040518083038185875af1925050503d80600081146146e1576040519150601f19603f3d011682016040523d82523d6000602084013e6146e6565b606091505b50915091506146f6828286614701565b979650505050505050565b60608315614710575081612fdd565b8251156147205782518084602001fd5b8160405162461bcd60e51b815260040161067d9190615780565b634e487b7160e01b600052601160045260246000fd5b600082198211156147635761476361473a565b500190565b80356001600160401b038116811461477f57600080fd5b919050565b6000806040838503121561479757600080fd5b823591506147a760208401614768565b90509250929050565b6000604082840312156147c257600080fd5b50919050565b60008083601f8401126147da57600080fd5b5081356001600160401b038111156147f157600080fd5b6020830191508360208260051b850101111561480c57600080fd5b9250929050565b60008060008060008060008060a0898b03121561482f57600080fd5b61483889614768565b975060208901356001600160401b038082111561485457600080fd5b6148608c838d016147b0565b985060408b013591508082111561487657600080fd5b6148828c838d016147c8565b909850965060608b013591508082111561489b57600080fd5b6148a78c838d016147c8565b909650945060808b01359150808211156148c057600080fd5b506148cd8b828c016147c8565b999c989b5096995094979396929594505050565b6000602082840312156148f357600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061492e57634e487b7160e01b600052602160045260246000fd5b9052565b60006080820190506001600160401b038084511683528060208501511660208401528060408501511660408401525060608301516149736060840182614910565b5092915050565b60208101612ce68284614910565b60008083601f84011261499a57600080fd5b5081356001600160401b038111156149b157600080fd5b60208301915083602082850101111561480c57600080fd5b6000806000806000606086880312156149e157600080fd5b85356001600160401b03808211156149f857600080fd5b614a0489838a01614988565b90975095506020880135915080821115614a1d57600080fd5b50614a2a88828901614988565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614a5857600080fd5b614a6189614768565b975060208901356001600160401b0380821115614a7d57600080fd5b614a898c838d016147c8565b909950975060408b0135915080821115614aa257600080fd5b614aae8c838d016147b0565b965060608b013591508082111561489b57600080fd5b6001600160a01b0381168114611cb957600080fd5b803561477f81614ac4565b60008060408385031215614af757600080fd5b8235614b0281614ac4565b946020939093013593505050565b600060208284031215614b2257600080fd5b8135612fdd81614ac4565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715614b6657614b66614b2d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b9457614b94614b2d565b604052919050565b60006001600160401b03821115614bb557614bb5614b2d565b5060051b60200190565b600082601f830112614bd057600080fd5b81356020614be5614be083614b9c565b614b6c565b82815260059290921b84018101918181019086841115614c0457600080fd5b8286015b84811015614c1f5780358352918301918301614c08565b509695505050505050565b600080600060608486031215614c3f57600080fd5b83356001600160401b0380821115614c5657600080fd5b818601915086601f830112614c6a57600080fd5b81356020614c7a614be083614b9c565b82815260059290921b8401810191818101908a841115614c9957600080fd5b948201945b83861015614cc0578535614cb181614ac4565b82529482019490820190614c9e565b97505087013592505080821115614cd657600080fd5b50614ce386828701614bbf565b925050614cf260408501614ad9565b90509250925092565b60008060008060008060008060008060c08b8d031215614d1a57600080fd5b614d238b614768565b995060208b01356001600160401b0380821115614d3f57600080fd5b614d4b8e838f016147b0565b9a5060408d0135915080821115614d6157600080fd5b614d6d8e838f016147c8565b909a50985060608d0135915080821115614d8657600080fd5b614d928e838f016147c8565b909850965060808d0135915080821115614dab57600080fd5b614db78e838f016147c8565b909650945060a08d0135915080821115614dd057600080fd5b50614ddd8d828e016147c8565b915080935050809150509295989b9194979a5092959850565b600060208284031215614e0857600080fd5b81518015158114612fdd57600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6020808252606f908201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60408201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520666f60608201527f722074696d657374616d70206166746572206d6f7374526563656e745769746860808201526e064726177616c54696d657374616d7608c1b60a082015260c00190565b600060208284031215614fb957600080fd5b5051919050565b6000808335601e19843603018112614fd757600080fd5b8301803591506001600160401b03821115614ff157600080fd5b60200191503681900382131561480c57600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561502e57600080fd5b813564ffffffffff81168114612fdd57600080fd5b6000808335601e1984360301811261505a57600080fd5b8301803591506001600160401b0382111561507457600080fd5b6020019150600581901b360382131561480c57600080fd5b60006000198214156150a0576150a061473a565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561513c578181015183820152602001615124565b8381111561177d5750506000910152565b60008151808452615165816020860160208601615121565b601f01601f19169290920160200192915050565b60808152600061518d60808301888a6150f8565b828103602084015261519f818861514d565b905082810360408401526151b48186886150f8565b915050826060830152979650505050505050565b6020815260006130116020830184866150f8565b60008235605e198336030181126151f257600080fd5b9190910192915050565b600080821280156001600160ff1b038490038513161561521e5761521e61473a565b600160ff1b83900384128116156152375761523761473a565b50500190565b60006001600160ff1b03818413828413808216868404861116156152635761526361473a565b600160ff1b60008712828116878305891216156152825761528261473a565b6000871292508782058712848416161561529e5761529e61473a565b878505871281841616156152b4576152b461473a565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826152e7576152e76152c2565b500690565b6000826152fb576152fb6152c2565b500490565b60006001600160401b03838116908316818110156153205761532061473a565b039392505050565b6000823561017e198336030181126151f257600080fd5b60008160001904831182151516156153595761535961473a565b500290565b6000828210156153705761537061473a565b500390565b805160208083015191908110156147c25760001960209190910360031b1b16919050565b600082601f8301126153aa57600080fd5b81356001600160401b038111156153c3576153c3614b2d565b6153d6601f8201601f1916602001614b6c565b8181528460208386010111156153eb57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610180823603121561541b57600080fd5b615423614b43565b82356001600160401b038082111561543a57600080fd5b61544636838701615399565b8352602085013591508082111561545c57600080fd5b61546836838701615399565b6020840152604085013591508082111561548157600080fd5b61548d36838701615399565b604084015260608501359150808211156154a657600080fd5b6154b236838701615399565b606084015260808501359150808211156154cb57600080fd5b506154d836828601615399565b6080830152506154ea60a08401614768565b60a08201526154fb60c08401614768565b60c082015261550c60e08401614768565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600181815b8085111561557f5781600019048211156155655761556561473a565b8085161561557257918102915b93841c9390800290615549565b509250929050565b60008261559657506001612ce6565b816155a357506000612ce6565b81600181146155b957600281146155c3576155df565b6001915050612ce6565b60ff8411156155d4576155d461473a565b50506001821b612ce6565b5060208310610133831016604e8410600b8410161715615602575081810a612ce6565b61560c8383615544565b80600019048211156156205761562061473a565b029392505050565b6000612fdd8383615587565b600064ffffffffff8084168061564c5761564c6152c2565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561567c5761567c61473a565b02949350505050565b60006001600160401b038083168185168183048111821515161561567c5761567c61473a565b60006001600160401b03808416806156c5576156c56152c2565b92169190910492915050565b600064ffffffffff808416806156c5576156c56152c2565b60008083128015600160ff1b8501841216156157075761570761473a565b6001600160ff1b03840183138116156157225761572261473a565b50500390565b60006020828403121561573a57600080fd5b612fdd82614768565b60006001600160401b038083168185168083038211156157655761576561473a565b01949350505050565b600082516151f2818460208701615121565b602081526000612fdd602083018461514d56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746f426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220250a089a9d82d132551a5c21cef0ddeca55257e52f54a8189aee31305a8d95d264736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x322813fd9a801c5507c9de605d63cea4f2ce6c44":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063161a334d146100515780631f5ac1b214610066578063de29fac01461008f578063e8bb9ae6146100bd575b600080fd5b61006461005f366004610d03565b6100fe565b005b610079610074366004610d7c565b61045b565b6040516100869190610dac565b60405180910390f35b6100af61009d366004610d7c565b60006020819052908152604090205481565b604051908152602001610086565b6100e66100cb366004610dc3565b6001602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610086565b6000610109836104f6565b33600090815260208190526040902054909150156101ac5760405162461bcd60e51b815260206004820152604f60248201527f424c535075626c69634b6579436f6d70656e6469756d2e72656769737465724260448201527f4c535075626c69634b65793a206f70657261746f7220616c726561647920726560648201526e6769737465726564207075626b657960881b608482015260a4015b60405180910390fd5b6000818152600160205260409020546001600160a01b03161561024a5760405162461bcd60e51b815260206004820152604a60248201527f424c535075626c69634b6579436f6d70656e6469756d2e72656769737465724260448201527f4c535075626c69634b65793a207075626c6963206b657920616c7265616479206064820152691c9959da5cdd195c995960b21b608482015260a4016101a3565b60006102553361045b565b8551602080880151875188830151885189850151875186890151604051999a506000997f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001996102ad9990989796959493929101610e05565b6040516020818303038152906040528051906020012060001c6102d09190610e51565b90506103376102e96102e28784610539565b88906105d0565b6102f1610664565b61033161032a85610324604080518082018252600080825260209182015281518083019092526001825260029082015290565b90610539565b86906105d0565b87610724565b6103ec5760405162461bcd60e51b815260206004820152607460248201527f424c535075626c69634b6579436f6d70656e6469756d2e72656769737465724260448201527f4c535075626c69634b65793a2065697468657220746865204731207369676e6160648201527f747572652069732077726f6e672c206f7220473120616e6420473220707269766084820152730c2e8ca40d6caf240c8de40dcdee840dac2e8c6d60631b60a482015260c4016101a3565b3360008181526020818152604080832087905586835260019091529081902080546001600160a01b03191683179055517fe3fb6613af2e8930cf85d47fcf6db10192224a64c6cbe8023e0eee1ba38280419061044b9088908890610e73565b60405180910390a2505050505050565b60408051808201909152600080825260208201526040516bffffffffffffffffffffffff19606084811b8216602084015230901b1660348201524660488201527f456967656e4c617965725f424e3235345f5075626b65795f52656769737472616068820152633a34b7b760e11b60888201526104f090608c0160405160208183030381529060405280519060200120610991565b92915050565b60008160000151826020015160405160200161051c929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152610555610b4b565b835181526020808501519082015260408082018490526000908360608460076107d05a03fa90508080156105885761058a565bfe5b50806105c85760405162461bcd60e51b815260206004820152600d60248201526c1958cb5b5d5b0b59985a5b1959609a1b60448201526064016101a3565b505092915050565b60408051808201909152600080825260208201526105ec610b69565b835181526020808501518183015283516040808401919091529084015160608301526000908360808460066107d05a03fa90508080156105885750806105c85760405162461bcd60e51b815260206004820152600d60248201526c1958cb5859190b59985a5b1959609a1b60448201526064016101a3565b61066c610b87565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b604080518082018252858152602080820185905282518084019093528583528201839052600091610753610bac565b60005b600281101561091857600061076c826006610ed9565b905084826002811061078057610780610ead565b60200201515183610792836000610ef8565b600c81106107a2576107a2610ead565b60200201528482600281106107b9576107b9610ead565b602002015160200151838260016107d09190610ef8565b600c81106107e0576107e0610ead565b60200201528382600281106107f7576107f7610ead565b602002015151518361080a836002610ef8565b600c811061081a5761081a610ead565b602002015283826002811061083157610831610ead565b602002015151600160200201518361084a836003610ef8565b600c811061085a5761085a610ead565b602002015283826002811061087157610871610ead565b60200201516020015160006002811061088c5761088c610ead565b60200201518361089d836004610ef8565b600c81106108ad576108ad610ead565b60200201528382600281106108c4576108c4610ead565b6020020151602001516001600281106108df576108df610ead565b6020020151836108f0836005610ef8565b600c811061090057610900610ead565b6020020152508061091081610f10565b915050610756565b50610921610bcb565b60006020826101808560086107d05a03fa90508080156105885750806109815760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b60448201526064016101a3565b5051151598975050505050505050565b6040805180820190915260008082526020820152600080806109c1600080516020610f2c83398151915286610e51565b90505b6109cd81610a21565b9093509150600080516020610f2c833981519152828309831415610a07576040805180820190915290815260208101919091529392505050565b600080516020610f2c8339815191526001820890506109c4565b60008080600080516020610f2c8339815191526003600080516020610f2c83398151915286600080516020610f2c833981519152888909090890506000610a97827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52600080516020610f2c833981519152610aa3565b91959194509092505050565b600080610aae610bcb565b610ab6610be9565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828015610588575082610b405760405162461bcd60e51b815260206004820152601a60248201527f424e3235342e6578704d6f643a2063616c6c206661696c75726500000000000060448201526064016101a3565b505195945050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280610b9a610c07565b8152602001610ba7610c07565b905290565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610c5e57610c5e610c25565b60405290565b600060408284031215610c7657600080fd5b6040516040810181811067ffffffffffffffff82111715610c9957610c99610c25565b604052823581526020928301359281019290925250919050565b600082601f830112610cc457600080fd5b610ccc610c3b565b806040840185811115610cde57600080fd5b845b81811015610cf8578035845260209384019301610ce0565b509095945050505050565b6000806000838503610100811215610d1a57600080fd5b610d248686610c64565b9350610d338660408701610c64565b92506080607f1982011215610d4757600080fd5b50610d50610c3b565b610d5d8660808701610cb3565b8152610d6c8660c08701610cb3565b6020820152809150509250925092565b600060208284031215610d8e57600080fd5b81356001600160a01b0381168114610da557600080fd5b9392505050565b8151815260208083015190820152604081016104f0565b600060208284031215610dd557600080fd5b5035919050565b8060005b6002811015610dff578151845260209384019390910190600101610de0565b50505050565b888152876020820152866040820152856060820152610e276080820186610ddc565b610e3460c0820185610ddc565b610100810192909252610120820152610140019695505050505050565b600082610e6e57634e487b7160e01b600052601260045260246000fd5b500690565b825181526020808401519082015260c08101610e93604083018451610ddc565b6020830151610ea56080840182610ddc565b509392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615610ef357610ef3610ec3565b500290565b60008219821115610f0b57610f0b610ec3565b500190565b6000600019821415610f2457610f24610ec3565b506001019056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220c9a971c5b6fa7787af46472b7d89da2efb5b1fa7f969a9a6c8801e4f2c365c5664736f6c634300080c0033","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212200fdbd2e25973eab45d03ab46d4fda931522c5b45bccd7b63ecf3c38942f8913564736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106103425760003560e01c80635f966f14116101b8578063b134427111610104578063da8be864116100a2578063f16172b01161007c578063f16172b014610906578063f2fde38b14610919578063f698da251461092c578063fabc1cbc1461093457600080fd5b8063da8be864146108cd578063e3b05f2f146108e0578063eea9064b146108f357600080fd5b8063c5e480db116100de578063c5e480db146107ea578063c94b511114610890578063ca661c04146108a3578063cf80873e146108ac57600080fd5b8063b134427114610772578063b7f06ebe14610799578063bb45fef2146107bc57600080fd5b8063778e55f3116101715780638da5cb5b1161014b5780638da5cb5b146107135780639104c3191461072457806399be81c81461073f578063a17884841461075257600080fd5b8063778e55f3146106c25780637f548071146106ed578063886f11951461070057600080fd5b80635f966f141461062c57806360d7faed1461065857806365da12641461066b57806368304835146106945780636d70f7ae146106a7578063715018a6146106ba57600080fd5b806333404396116102925780634fc40b6111610230578063597b36da1161020a578063597b36da146105db5780635ac86ab7146105ee5780635c975abb146106115780635cfe8d2c1461061957600080fd5b80634fc40b61146105c057806350f73e7c146105ca578063595c6a67146105d357600080fd5b80633e28391d1161026c5780633e28391d1461053c578063433773821461055f5780634665bcda146105865780634d50f9a4146105ad57600080fd5b806333404396146104bb57806339b70e38146104ce5780633cdeb5e01461050d57600080fd5b8063136439dd116102ff5780631bbce091116102d95780631bbce0911461044e57806320606b701461046157806328a573ae1461048857806329c77d4f1461049b57600080fd5b8063136439dd146103ef57806316928365146104025780631794bb3c1461043b57600080fd5b806304a4f979146103475780630b9f487a146103815780630dd8dd02146103945780630f589e59146103b457806310d67a2f146103c9578063132d4967146103dc575b600080fd5b61036e7f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce81565b6040519081526020015b60405180910390f35b61036e61038f3660046143d5565b610947565b6103a76103a2366004614474565b610a09565b60405161037891906144b5565b6103c76103c2366004614552565b610d83565b005b6103c76103d73660046145a5565b610ed3565b6103c76103ea3660046145c9565b610f86565b6103c76103fd36600461460a565b611046565b61036e6104103660046145a5565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b6103c76104493660046145c9565b611185565b61036e61045c3660046145c9565b6112ae565b61036e7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103c76104963660046145c9565b6112dc565b61036e6104a93660046145a5565b609b6020526000908152604090205481565b6103c76104c9366004614623565b61138c565b6104f57f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b039091168152602001610378565b6104f561051b3660046145a5565b6001600160a01b039081166000908152609960205260409020600101541690565b61054f61054a3660046145a5565b6114c9565b6040519015158152602001610378565b61036e7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b6104f57f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6103c76105bb36600461460a565b6114e9565b61036e6213c68081565b61036e609d5481565b6103c76115c0565b61036e6105e9366004614963565b611687565b61054f6105fc36600461499f565b606654600160ff9092169190911b9081161490565b60665461036e565b6103c7610627366004614a15565b6116b7565b6104f561063a3660046145a5565b6001600160a01b039081166000908152609960205260409020541690565b6103c7610666366004614b75565b611962565b6104f56106793660046145a5565b609a602052600090815260409020546001600160a01b031681565b60a0546104f5906001600160a01b031681565b61054f6106b53660046145a5565b6119fd565b6103c7611a1d565b61036e6106d0366004614c04565b609860209081526000928352604080842090915290825290205481565b6103c76106fb366004614ce5565b611a31565b6065546104f5906001600160a01b031681565b6033546001600160a01b03166104f5565b6104f573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103c761074d366004614d75565b611b36565b61036e6107603660046145a5565b609f6020526000908152604090205481565b6104f57f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61054f6107a736600461460a565b609e6020526000908152604090205460ff1681565b61054f6107ca366004614daa565b609c60209081526000928352604080842090915290825290205460ff1681565b61085a6107f83660046145a5565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610378565b61036e61089e366004614dd6565b611c08565b61036e61c4e081565b6108bf6108ba3660046145a5565b611cc1565b604051610378929190614e92565b61036e6108db3660046145a5565b612079565b6103c76108ee3660046145a5565b6123d8565b6103c7610901366004614eb7565b612540565b6103c7610914366004614f0f565b61254c565b6103c76109273660046145a5565b6125dd565b61036e612653565b6103c761094236600461460a565b612691565b604080517f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e09092019092528051910120600090816109c5612653565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610a3e5760405162461bcd60e51b8152600401610a3590614f2b565b60405180910390fd5b6000836001600160401b03811115610a5857610a586146e6565b604051908082528060200260200182016040528015610a81578160200160208202803683370190505b50905060005b84811015610d7a57858582818110610aa157610aa1614f62565b9050602002810190610ab39190614f78565b610ac1906020810190614f98565b9050868683818110610ad557610ad5614f62565b9050602002810190610ae79190614f78565b610af19080614f98565b905014610b665760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610a35565b6000868683818110610b7a57610b7a614f62565b9050602002810190610b8c9190614f78565b610b9d9060608101906040016145a5565b6001600160a01b03161415610c2b5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a206d7573742070726f766964652076616c6964207769746864726177616c606482015267206164647265737360c01b608482015260a401610a35565b336000818152609a60205260409020546001600160a01b031690610d4a9082898986818110610c5c57610c5c614f62565b9050602002810190610c6e9190614f78565b610c7f9060608101906040016145a5565b8a8a87818110610c9157610c91614f62565b9050602002810190610ca39190614f78565b610cad9080614f98565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150899050818110610cf357610cf3614f62565b9050602002810190610d059190614f78565b610d13906020810190614f98565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506127ed92505050565b838381518110610d5c57610d5c614f62565b60209081029190910101525080610d7281614ff7565b915050610a87565b50949350505050565b336000908152609960205260409020546001600160a01b031615610e1d5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a206f70657261746f722068617320616c72656164792072656769736064820152641d195c995960da1b608482015260a401610a35565b610e273384612b9d565b604080518082019091526060815260006020820152610e493380836000612e39565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610e829190615012565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610ec5929190615064565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190615093565b6001600160a01b0316336001600160a01b031614610f7a5760405162461bcd60e51b8152600401610a35906150b0565b610f83816131f2565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9161480610fe55750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6110015760405162461bcd60e51b8152600401610a35906150fa565b61100a836114c9565b15611041576001600160a01b038084166000908152609a602052604090205416611036818585856132e9565b61103f81613364565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b29190615157565b6110ce5760405162461bcd60e51b8152600401610a3590615174565b606654818116146111475760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a35565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156111a55750600054600160ff909116105b806111bf5750303b1580156111bf575060005460ff166001145b6112225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a35565b6000805460ff191660011790558015611245576000805461ff0019166101001790555b61124f838361341e565b611257613504565b6097556112638461359b565b801561103f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6001600160a01b0383166000908152609b60205260408120546112d385828686611c08565b95945050505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916148061133b5750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6113575760405162461bcd60e51b8152600401610a35906150fa565b611360836114c9565b15611041576001600160a01b038084166000908152609a602052604090205416611036818585856135ed565b606654600290600490811614156113b55760405162461bcd60e51b8152600401610a3590614f2b565b600260c95414156114085760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a35565b600260c95560005b888110156114b8576114a88a8a8381811061142d5761142d614f62565b905060200281019061143f91906151bc565b89898481811061145157611451614f62565b90506020028101906114639190614f98565b89898681811061147557611475614f62565b9050602002013588888781811061148e5761148e614f62565b90506020020160208101906114a391906151d2565b613668565b6114b181614ff7565b9050611410565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b6114f1613ce2565b61c4e081111561157f5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e7365745769746864726177616c4460448201527f656c6179426c6f636b733a206e65775769746864726177616c44656c6179426c60648201526c0dec6d6e640e8dede40d0d2ced609b1b608482015260a401610a35565b609d5460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a1609d55565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190615157565b6116485760405162461bcd60e51b8152600401610a3590615174565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60008160405160200161169a9190615263565b604051602081830303815290604052805190602001209050919050565b60005b815181101561195e5760008282815181106116d7576116d7614f62565b602002602001015190506000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663cd293f6f846040518263ffffffff1660e01b81526004016117309190615276565b60408051808303816000875af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190615325565b915091508115611950576040808401516001600160a01b0381166000908152609f602052918220805491928291906117a983614ff7565b919050555060006040518060e00160405280846001600160a01b031681526020018760a001516001600160a01b031681526020018760600151600001516001600160a01b03168152602001838152602001876080015163ffffffff1681526020018760000151815260200187602001518152509050600061182982611687565b6000818152609e602052604090205490915060ff16156118bf5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e6d6967726174655175657565645760448201527f69746864726177616c733a207769746864726177616c20616c72656164792065606482015264786973747360d81b608482015260a401610a35565b6000818152609e602052604090819020805460ff19166001179055517f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f99061190a9083908590615353565b60405180910390a160408051868152602081018390527fdc00758b65eef71dc3780c04ebe36cab6bdb266c3a698187e29e0f0dca012630910160405180910390a1505050505b8360010193505050506116ba565b5050565b6066546002906004908116141561198b5760405162461bcd60e51b8152600401610a3590614f2b565b600260c95414156119de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a35565b600260c9556119f08686868686613668565b5050600160c95550505050565b6001600160a01b0390811660009081526099602052604090205416151590565b611a25613ce2565b611a2f600061359b565b565b4283602001511015611ab55760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610a35565b6000609b6000876001600160a01b03166001600160a01b031681526020019081526020016000205490506000611af18783888860200151611c08565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611b219088908390613d3c565b611b2d87878686612e39565b50505050505050565b611b3f336119fd565b611bc15760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610a35565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611bfc929190615064565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611c7e612653565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f909116906360f4062b90602401602060405180830381865afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d55919061536c565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9909116906394f649dd90602401600060405180830381865afa158015611dc5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ded91908101906153e0565b9150915060008313611e0457909590945092505050565b606080835160001415611ebe576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611e7957611e79614f62565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611ead57611ead614f62565b60200260200101818152505061206c565b8351611ecb9060016154a4565b6001600160401b03811115611ee257611ee26146e6565b604051908082528060200260200182016040528015611f0b578160200160208202803683370190505b50915081516001600160401b03811115611f2757611f276146e6565b604051908082528060200260200182016040528015611f50578160200160208202803683370190505b50905060005b8451811015611fea57848181518110611f7157611f71614f62565b6020026020010151838281518110611f8b57611f8b614f62565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611fbd57611fbd614f62565b6020026020010151828281518110611fd757611fd7614f62565b6020908102919091010152600101611f56565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0826001845161200f91906154bc565b8151811061201f5761201f614f62565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001845161204f91906154bc565b8151811061205f5761205f614f62565b6020026020010181815250505b9097909650945050505050565b606654600090600190600290811614156120a55760405162461bcd60e51b8152600401610a3590614f2b565b6120ae836114c9565b61212e5760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610a35565b6001600160a01b038084166000908152609a602052604090205416612152846119fd565b156121c55760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610a35565b6001600160a01b0384166122415760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610a35565b336001600160a01b03851614806122605750336001600160a01b038216145b8061228757506001600160a01b038181166000908152609960205260409020600101541633145b6122f95760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610a35565b60008061230586611cc1565b9092509050336001600160a01b0387161461235b57826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b03191690556123ce86848185856127ed565b9695505050505050565b6123e0613ce2565b60a0546001600160a01b03161561245f5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e7365745374616b6552656769737460448201527f72793a207374616b65526567697374727920616c7265616479207365740000006064820152608401610a35565b6001600160a01b0381166124ec5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e7365745374616b6552656769737460448201527f72793a207374616b6552656769737472792063616e6e6f74206265207a65726f606482015267206164647265737360c01b608482015260a401610a35565b60a080546001600160a01b0319166001600160a01b0383169081179091556040519081527fce6d874069bceda1867eca9c60636bbf262e15213041658273d803a2b609a51f9060200160405180910390a150565b61104133848484612e39565b612555336119fd565b6125d35760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610a35565b610f833382612b9d565b6125e5613ce2565b6001600160a01b03811661264a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a35565b610f838161359b565b60007f0000000000000000000000000000000000000000000000000000000000007a69461415612684575060975490565b61268c613504565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127089190615093565b6001600160a01b0316336001600160a01b0316146127385760405162461bcd60e51b8152600401610a35906150b0565b6066541981196066541916146127b65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a35565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161117a565b60006001600160a01b0386166128845760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610a35565b60005b8351811015612a93576001600160a01b038616156128dd576128dd86888684815181106128b6576128b6614f62565b60200260200101518685815181106128d0576128d0614f62565b60200260200101516132e9565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b031684828151811061290d5761290d614f62565b60200260200101516001600160a01b031614156129d6577f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031663beffbb898885848151811061296657612966614f62565b60200260200101516040518363ffffffff1660e01b815260040161299f9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156129b957600080fd5b505af11580156129cd573d6000803e3d6000fd5b50505050612a8b565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316638c80d4e588868481518110612a1857612a18614f62565b6020026020010151868581518110612a3257612a32614f62565b60200260200101516040518463ffffffff1660e01b8152600401612a58939291906154d3565b600060405180830381600087803b158015612a7257600080fd5b505af1158015612a86573d6000803e3d6000fd5b505050505b600101612887565b506001600160a01b03851615612aac57612aac85613364565b6001600160a01b0386166000908152609f60205260408120805491829190612ad383614ff7565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612b3b82611687565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612b899083908590615353565b60405180910390a198975050505050505050565b6000612bac60208301836145a5565b6001600160a01b03161415612c465760405162461bcd60e51b815260206004820152605460248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a2063616e6e6f742073657420606561726e696e677352656365696064820152737665726020746f207a65726f206164647265737360601b608482015260a401610a35565b6213c680612c5a60608301604084016154f7565b63ffffffff161115612d0f5760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610a35565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612d4b90606084019084016154f7565b63ffffffff161015612de15760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610a35565b6001600160a01b03821660009081526099602052604090208190612e058282615534565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611bfc908490615012565b60665460009060019081161415612e625760405162461bcd60e51b8152600401610a3590614f2b565b612e6b856114c9565b15612ee85760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2073746160448201527f6b657220697320616c7265616479206163746976656c792064656c65676174656064820152601960fa1b608482015260a401610a35565b612ef1846119fd565b612f715760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a206f706560448201527f7261746f72206973206e6f74207265676973746572656420696e20456967656e6064820152642630bcb2b960d91b608482015260a401610a35565b6001600160a01b03808516600090815260996020526040902060010154168015801590612fa75750336001600160a01b03821614155b8015612fbc5750336001600160a01b03861614155b1561312957428460200151101561303b5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610a35565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156130d55760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610a35565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff19166001179055850151613116908890889085908890610947565b905061312782828760000151613d3c565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061318888611cc1565b9150915060005b82518110156131de576131d6888a8584815181106131af576131af614f62565b60200260200101518585815181106131c9576131c9614f62565b60200260200101516135ed565b60010161318f565b506131e887613364565b5050505050505050565b6001600160a01b0381166132805760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a35565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906133209084906154bc565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610ec5939291906154d3565b60a0546001600160a01b031615610f83576040805160018082528183019092526000916020808301908036833701905050905081816000815181106133ab576133ab614f62565b6001600160a01b03928316602091820292909201015260a05460405163ce977ec360e01b815291169063ce977ec3906133e8908490600401615597565b600060405180830381600087803b15801561340257600080fd5b505af1158015613416573d6000803e3d6000fd5b505050505050565b6065546001600160a01b031615801561343f57506001600160a01b03821615155b6134c15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a35565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261195e826131f2565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906136249084906154a4565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610ec5939291906154d3565b60006136766105e9876155d8565b6000818152609e602052604090205490915060ff166136eb5760405162461bcd60e51b815260206004820152603e602482015260008051602061568883398151915260448201527f416374696f6e3a20616374696f6e206973206e6f7420696e20717565756500006064820152608401610a35565b609d54439061370060a0890160808a016154f7565b63ffffffff1661371091906154a4565b11156137985760405162461bcd60e51b8152602060048201526057602482015260008051602061568883398151915260448201527f416374696f6e3a207769746864726177616c44656c6179426c6f636b7320706560648201527f72696f6420686173206e6f742079657420706173736564000000000000000000608482015260a401610a35565b6137a860608701604088016145a5565b6001600160a01b0316336001600160a01b0316146138305760405162461bcd60e51b815260206004820152604b602482015260008051602061568883398151915260448201527f416374696f6e3a206f6e6c7920776974686472617765722063616e20636f6d7060648201526a3632ba329030b1ba34b7b760a91b608482015260a401610a35565b81156138a75761384360a0870187614f98565b851490506138a75760405162461bcd60e51b815260206004820152603d602482015260008051602061568883398151915260448201527f416374696f6e3a20696e707574206c656e677468206d69736d617463680000006064820152608401610a35565b6000818152609e60205260409020805460ff19169055811561397d5760005b6138d360a0880188614f98565b90508110156139775761396f6138ec60208901896145a5565b336138fa60a08b018b614f98565b8581811061390a5761390a614f62565b905060200201602081019061391f91906145a5565b61392c60c08c018c614f98565b8681811061393c5761393c614f62565b905060200201358a8a8781811061395557613955614f62565b905060200201602081019061396a91906145a5565b613ef6565b6001016138c6565b50613ca7565b336000908152609a60205260408120546001600160a01b0316905b6139a560a0890189614f98565b9050811015613c9b5773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06139d060a08a018a614f98565b838181106139e0576139e0614f62565b90506020020160208101906139f591906145a5565b6001600160a01b03161415613b4e576000613a1360208a018a6145a5565b905060006001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16630e81073c83613a5460c08e018e614f98565b87818110613a6457613a64614f62565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adc919061536c565b6001600160a01b038084166000908152609a6020526040902054919250168015613b4657613b3d8184613b1260a08f018f614f98565b88818110613b2257613b22614f62565b9050602002016020810190613b3791906145a5565b856135ed565b613b4681613364565b505050613c93565b6001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9166350ff722533613b8b60a08c018c614f98565b85818110613b9b57613b9b614f62565b9050602002016020810190613bb091906145a5565b613bbd60c08d018d614f98565b86818110613bcd57613bcd614f62565b905060200201356040518463ffffffff1660e01b8152600401613bf2939291906154d3565b600060405180830381600087803b158015613c0c57600080fd5b505af1158015613c20573d6000803e3d6000fd5b505050506001600160a01b03821615613c9357613c938233613c4560a08c018c614f98565b85818110613c5557613c55614f62565b9050602002016020810190613c6a91906145a5565b613c7760c08d018d614f98565b86818110613c8757613c87614f62565b905060200201356135ed565b600101613998565b50613ca581613364565b505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6033546001600160a01b03163314611a2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a35565b6001600160a01b0383163b15613e5657604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90613d7c90869086906004016155ea565b602060405180830381865afa158015613d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dbd9190615647565b6001600160e01b031916146110415760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610a35565b826001600160a01b0316613e6a838361403b565b6001600160a01b0316146110415760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610a35565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01415613fa15760405162387b1360e81b81526001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063387b130090613f6a908890889087906004016154d3565b600060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b50505050614034565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063c608c7f390608401600060405180830381600087803b15801561401b57600080fd5b505af115801561402f573d6000803e3d6000fd5b505050505b5050505050565b600080600061404a858561405f565b91509150614057816140cf565b509392505050565b6000808251604114156140965760208301516040840151606085015160001a61408a8782858561428a565b945094505050506140c8565b8251604014156140c057602083015160408401516140b5868383614377565b9350935050506140c8565b506000905060025b9250929050565b60008160048111156140e3576140e3615671565b14156140ec5750565b600181600481111561410057614100615671565b141561414e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a35565b600281600481111561416257614162615671565b14156141b05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a35565b60038160048111156141c4576141c4615671565b141561421d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a35565b600481600481111561423157614231615671565b1415610f835760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a35565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156142c1575060009050600361436e565b8460ff16601b141580156142d957508460ff16601c14155b156142ea575060009050600461436e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561433e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166143675760006001925092505061436e565b9150600090505b94509492505050565b6000806001600160ff1b0383168161439460ff86901c601b6154a4565b90506143a28782888561428a565b935093505050935093915050565b6001600160a01b0381168114610f8357600080fd5b80356143d0816143b0565b919050565b600080600080600060a086880312156143ed57600080fd5b85356143f8816143b0565b94506020860135614408816143b0565b93506040860135614418816143b0565b94979396509394606081013594506080013592915050565b60008083601f84011261444257600080fd5b5081356001600160401b0381111561445957600080fd5b6020830191508360208260051b85010111156140c857600080fd5b6000806020838503121561448757600080fd5b82356001600160401b0381111561449d57600080fd5b6144a985828601614430565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156144ed578351835292840192918401916001016144d1565b50909695505050505050565b60006060828403121561450b57600080fd5b50919050565b60008083601f84011261452357600080fd5b5081356001600160401b0381111561453a57600080fd5b6020830191508360208285010111156140c857600080fd5b60008060006080848603121561456757600080fd5b61457185856144f9565b925060608401356001600160401b0381111561458c57600080fd5b61459886828701614511565b9497909650939450505050565b6000602082840312156145b757600080fd5b81356145c2816143b0565b9392505050565b6000806000606084860312156145de57600080fd5b83356145e9816143b0565b925060208401356145f9816143b0565b929592945050506040919091013590565b60006020828403121561461c57600080fd5b5035919050565b6000806000806000806000806080898b03121561463f57600080fd5b88356001600160401b038082111561465657600080fd5b6146628c838d01614430565b909a50985060208b013591508082111561467b57600080fd5b6146878c838d01614430565b909850965060408b01359150808211156146a057600080fd5b6146ac8c838d01614430565b909650945060608b01359150808211156146c557600080fd5b506146d28b828c01614430565b999c989b5096995094979396929594505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b038111828210171561471e5761471e6146e6565b60405290565b604080519081016001600160401b038111828210171561471e5761471e6146e6565b60405160c081016001600160401b038111828210171561471e5761471e6146e6565b604051601f8201601f191681016001600160401b0381118282101715614790576147906146e6565b604052919050565b63ffffffff81168114610f8357600080fd5b80356143d081614798565b60006001600160401b038211156147ce576147ce6146e6565b5060051b60200190565b600082601f8301126147e957600080fd5b813560206147fe6147f9836147b5565b614768565b82815260059290921b8401810191818101908684111561481d57600080fd5b8286015b84811015614841578035614834816143b0565b8352918301918301614821565b509695505050505050565b600082601f83011261485d57600080fd5b8135602061486d6147f9836147b5565b82815260059290921b8401810191818101908684111561488c57600080fd5b8286015b848110156148415780358352918301918301614890565b600060e082840312156148b957600080fd5b6148c16146fc565b90506148cc826143c5565b81526148da602083016143c5565b60208201526148eb604083016143c5565b604082015260608201356060820152614906608083016147aa565b608082015260a08201356001600160401b038082111561492557600080fd5b614931858386016147d8565b60a084015260c084013591508082111561494a57600080fd5b506149578482850161484c565b60c08301525092915050565b60006020828403121561497557600080fd5b81356001600160401b0381111561498b57600080fd5b614997848285016148a7565b949350505050565b6000602082840312156149b157600080fd5b813560ff811681146145c257600080fd5b6000604082840312156149d457600080fd5b6149dc614724565b905081356149e9816143b0565b815260208201356bffffffffffffffffffffffff81168114614a0a57600080fd5b602082015292915050565b60006020808385031215614a2857600080fd5b82356001600160401b0380821115614a3f57600080fd5b818501915085601f830112614a5357600080fd5b8135614a616147f9826147b5565b81815260059190911b83018401908481019088831115614a8057600080fd5b8585015b83811015614b5a57803585811115614a9c5760008081fd5b860160e0818c03601f1901811315614ab45760008081fd5b614abc614746565b8983013588811115614ace5760008081fd5b614adc8e8c838701016147d8565b82525060408084013589811115614af35760008081fd5b614b018f8d8388010161484c565b8c840152506060614b138186016143c5565b8284015260809150614b278f8387016149c2565b90830152614b3760c085016147aa565b90820152614b468383016143c5565b60a082015285525050918601918601614a84565b5098975050505050505050565b8015158114610f8357600080fd5b600080600080600060808688031215614b8d57600080fd5b85356001600160401b0380821115614ba457600080fd5b9087019060e0828a031215614bb857600080fd5b90955060208701359080821115614bce57600080fd5b50614bdb88828901614430565b909550935050604086013591506060860135614bf681614b67565b809150509295509295909350565b60008060408385031215614c1757600080fd5b8235614c22816143b0565b91506020830135614c32816143b0565b809150509250929050565b600060408284031215614c4f57600080fd5b614c57614724565b905081356001600160401b0380821115614c7057600080fd5b818401915084601f830112614c8457600080fd5b8135602082821115614c9857614c986146e6565b614caa601f8301601f19168201614768565b92508183528681838601011115614cc057600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a08688031215614cfd57600080fd5b8535614d08816143b0565b94506020860135614d18816143b0565b935060408601356001600160401b0380821115614d3457600080fd5b614d4089838a01614c3d565b94506060880135915080821115614d5657600080fd5b50614d6388828901614c3d565b95989497509295608001359392505050565b60008060208385031215614d8857600080fd5b82356001600160401b03811115614d9e57600080fd5b6144a985828601614511565b60008060408385031215614dbd57600080fd5b8235614dc8816143b0565b946020939093013593505050565b60008060008060808587031215614dec57600080fd5b8435614df7816143b0565b9350602085013592506040850135614e0e816143b0565b9396929550929360600135925050565b600081518084526020808501945080840160005b83811015614e575781516001600160a01b031687529582019590820190600101614e32565b509495945050505050565b600081518084526020808501945080840160005b83811015614e5757815187529582019590820190600101614e76565b604081526000614ea56040830185614e1e565b82810360208401526112d38185614e62565b600080600060608486031215614ecc57600080fd5b8335614ed7816143b0565b925060208401356001600160401b03811115614ef257600080fd5b614efe86828701614c3d565b925050604084013590509250925092565b600060608284031215614f2157600080fd5b6145c283836144f9565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235605e19833603018112614f8e57600080fd5b9190910192915050565b6000808335601e19843603018112614faf57600080fd5b8301803591506001600160401b03821115614fc957600080fd5b6020019150600581901b36038213156140c857600080fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561500b5761500b614fe1565b5060010190565b606081018235615021816143b0565b6001600160a01b03908116835260208401359061503d826143b0565b166020830152604083013561505181614798565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156150a557600080fd5b81516145c2816143b0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561516957600080fd5b81516145c281614b67565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de19833603018112614f8e57600080fd5b6000602082840312156151e457600080fd5b81356145c281614b67565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261524a60e0850182614e1e565b905060c083015184820360c08601526112d38282614e62565b6020815260006145c260208301846151ef565b602081526000825160e06020840152615293610100840182614e1e565b90506020840151601f198483030160408501526152b08282614e62565b915050604084015160018060a01b03808216606086015260608601519150808251166080860152506bffffffffffffffffffffffff60208201511660a085015250608084015161530860c085018263ffffffff169052565b5060a08401516001600160a01b03811660e0850152509392505050565b6000806040838503121561533857600080fd5b825161534381614b67565b6020939093015192949293505050565b82815260406020820152600061499760408301846151ef565b60006020828403121561537e57600080fd5b5051919050565b600082601f83011261539657600080fd5b815160206153a66147f9836147b5565b82815260059290921b840181019181810190868411156153c557600080fd5b8286015b8481101561484157805183529183019183016153c9565b600080604083850312156153f357600080fd5b82516001600160401b038082111561540a57600080fd5b818501915085601f83011261541e57600080fd5b8151602061542e6147f9836147b5565b82815260059290921b8401810191818101908984111561544d57600080fd5b948201945b83861015615474578551615465816143b0565b82529482019490820190615452565b9188015191965090935050508082111561548d57600080fd5b5061549a85828601615385565b9150509250929050565b600082198211156154b7576154b7614fe1565b500190565b6000828210156154ce576154ce614fe1565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561550957600080fd5b81356145c281614798565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561553f816143b0565b6155498183615514565b5060018101602083013561555c816143b0565b6155668183615514565b50604083013561557581614798565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b6020808252825182820181905260009190848201906040850190845b818110156144ed5783516001600160a01b0316835292840192918401916001016155b3565b60006155e436836148a7565b92915050565b82815260006020604081840152835180604085015260005b8181101561561e57858101830151858201606001528201615602565b81811115615630576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561565957600080fd5b81516001600160e01b0319811681146145c257600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e636f6d706c657465517565756564a2646970667358221220cdfcc1af5fed5190052ce3d637e549cf07d10070c3b14546ab58e142da57c70d64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea2646970667358221220a22223d3e2a2d861ad54e68b7bc44b4d82a5a12a0bcca5c3404502bb1b430c5c64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cb578063e5db06c014610404578063eb990c5914610424578063ecb7cb1b14610444578063f2fde38b14610471578063fabc1cbc1461049157600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ab57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196b565b6104b1565b005b34801561017e57600080fd5b5061017061018d36600461198f565b61056d565b34801561019e57600080fd5b506101b26101ad36600461196b565b6106ac565b6040516101bf91906119c6565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196b565b6108a7565b3480156101f457600080fd5b5061021c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f36600461198f565b6109ed565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109fe565b34801561029957600080fd5b506102bd6102a8366004611a13565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac5565b34801561030357600080fd5b506102bd610312366004611a36565b610ad9565b34801561032357600080fd5b50610337610332366004611a36565b610b5c565b6040516101bf9190611a62565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a70565b610bdc565b3480156103a157600080fd5b5061026a61c4e081565b3480156103b757600080fd5b506101706103c636600461198f565b610e9c565b3480156103d757600080fd5b5061026a6103e636600461196b565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041057600080fd5b5061017061041f366004611a36565b610f30565b34801561043057600080fd5b5061017061043f366004611aa9565b610fc5565b34801561045057600080fd5b5061046461045f36600461196b565b6110ed565b6040516101bf9190611aef565b34801561047d57600080fd5b5061017061048c36600461196b565b6111a7565b34801561049d57600080fd5b506101706104ac36600461198f565b61121d565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b45565b6001600160a01b0316336001600160a01b0316146105615760405162461bcd60e51b815260040161055890611b62565b60405180910390fd5b61056a81611379565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190611bac565b6105f55760405162461bcd60e51b815260040161055890611bce565b6098548181161461066e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106d98383611c2c565b90508060005b82811015610785576001600160a01b038716600090815260ca6020526040812060010161070c8388611c43565b8154811061071c5761071c611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076291611c43565b4310156107725781925050610785565b508061077d81611c71565b9150506106df565b508060008167ffffffffffffffff8111156107a2576107a2611c8c565b6040519080825280602002602001820160405280156107e757816020015b60408051808201909152600080825260208201528152602001906001900390816107c05790505b509050811561089c5760005b8281101561089a576001600160a01b038916600090815260ca602052604090206001016108208289611c43565b8154811061083057610830611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087c5761087c611c5b565b6020026020010181905250808061089290611c71565b9150506107f3565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d48383611c2c565b905060008167ffffffffffffffff8111156108f1576108f1611c8c565b60405190808252806020026020018201604052801561093657816020015b604080518082019091526000808252602082015281526020019060019003908161090f5790505b50905060005b828110156109e3576001600160a01b038716600090815260ca602052604090206001016109698287611c43565b8154811061097957610979611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c5576109c5611c5b565b602002602001018190525080806109db90611c71565b91505061093c565b5095945050505050565b6109f5611470565b61056a816114ca565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a9190611bac565b610a865760405162461bcd60e51b815260040161055890611bce565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610acd611470565b610ad76000611591565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b53575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2c57610b2c611c5b565b600091825260209091200154610b4f9190600160e01b900463ffffffff16611c43565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9d57610b9d611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063a38406a390602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611b45565b6001600160a01b031614610ce65760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610558565b60985460009060019081161415610d0f5760405162461bcd60e51b815260040161055890611ca2565b6001600160a01b038316610da55760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610558565b346001600160e01b03811615610e95576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5691611c2c565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610eef5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610f1d5760405162461bcd60e51b815260040161055890611ca2565b610f2733836115e3565b50506001606555565b60026065541415610f835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610fb15760405162461bcd60e51b815260040161055890611ca2565b610fbb83836115e3565b5050600160655550565b600054610100900460ff1615808015610fe55750600054600160ff909116105b80610fff5750303b158015610fff575060005460ff166001145b6110625760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610558565b6000805460ff191660011790558015611085576000805461ff0019166101001790555b61108e85611591565b611098848461174e565b6110a1826114ca565b8015610e95576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119957600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114d565b505050915250909392505050565b6111af611470565b6001600160a01b0381166112145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610558565b61056a81611591565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112949190611b45565b6001600160a01b0316336001600160a01b0316146112c45760405162461bcd60e51b815260040161055890611b62565b6098541981196098541916146113425760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a1565b6001600160a01b0381166114075760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610558565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610558565b61c4e08111156115505760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610558565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161c57508161161a8285611c43565b105b156116c9576001600160a01b038616600090815260ca602052604081206001016116468386611c43565b8154811061165657611656611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169c91611c43565b4310156116a957506116c9565b80516116be906001600160e01b031686611c43565b945050600101611605565b6116d38184611c43565b6001600160a01b038716600090815260ca602052604090205583156116fc576116fc8685611838565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb094386856117298487611c43565b604080516001600160a01b039094168452602084019290925290820152606001610e8b565b6097546001600160a01b031615801561176f57506001600160a01b03821615155b6117f15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261183482611379565b5050565b804710156118885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610558565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d5576040519150601f19603f3d011682016040523d82523d6000602084013e6118da565b606091505b50509050806119515760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610558565b505050565b6001600160a01b038116811461056a57600080fd5b60006020828403121561197d57600080fd5b813561198881611956565b9392505050565b6000602082840312156119a157600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a06576119f68483516119a8565b92840192908501906001016119e3565b5091979650505050505050565b600060208284031215611a2557600080fd5b813560ff8116811461198857600080fd5b60008060408385031215611a4957600080fd5b8235611a5481611956565b946020939093013593505050565b60408101610b5682846119a8565b60008060408385031215611a8357600080fd5b8235611a8e81611956565b91506020830135611a9e81611956565b809150509250929050565b60008060008060808587031215611abf57600080fd5b8435611aca81611956565b93506020850135611ada81611956565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089a57611b318286516119a8565b938501936001939093019290820190611b1e565b600060208284031215611b5757600080fd5b815161198881611956565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bbe57600080fd5b8151801515811461198857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c3e57611c3e611c16565b500390565b60008219821115611c5657611c56611c16565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8557611c85611c16565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea26469706673582212207b53abbb96e06b03175441e64ced2499614fc0a3f64f5b8b831996e0e25b8d8264736f6c634300080c0033","storage":{}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea26469706673582212209882247b872d905a05380b42c11d1716ad43e9b19643a0cf588a80c0958bf20d64736f6c634300080c0033","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9a676e781a523b5d0c0e43731313a708cb607508","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637259a45c1161011a578063d7b7fa13116100ad578063e58398361161007c578063e5839836146105ea578063e921d4fa146105fd578063f2fde38b14610626578063f73b751914610639578063fabc1cbc1461064c57600080fd5b8063d7b7fa13146104b8578063d98128c01461056a578063da16e29b1461057d578063df5cf723146105c357600080fd5b8063886f1195116100e9578063886f1195146104585780638da5cb5b1461046b578063a49db7321461047c578063c747075b146104a557600080fd5b80637259a45c146103ef5780637cf72bba146104025780638105e04314610415578063855fcc4a1461042857600080fd5b806338c8ee64116101925780635c975abb116101615780635c975abb1461037c5780636f0c2f741461038e578063715018a6146103d4578063723e59c7146103dc57600080fd5b806338c8ee64146102ef57806339b70e3814610302578063595c6a67146103415780635ac86ab71461034957600080fd5b80631794bb3c116101ce5780631794bb3c1461024e5780631874e5ae14610261578063282670fc1461028e57806335571676146102c557600080fd5b80630ffabbce1461020057806310d67a2f14610215578063136439dd14610228578063175d32051461023b575b600080fd5b61021361020e3660046126e6565b61065f565b005b61021361022336600461271b565b61078f565b610213610236366004612738565b610842565b6102136102493660046126e6565b610981565b61021361025c366004612751565b610aab565b61027461026f3660046126e6565b610bc9565b60405163ffffffff90911681526020015b60405180910390f35b6102a161029c366004612792565b610c14565b60408051825163ffffffff9081168252602093840151169281019290925201610285565b6102d86102d3366004612792565b610c8b565b604080519215158352602083019190915201610285565b6102136102fd36600461271b565b610cba565b6103297f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b039091168152602001610285565b610213610d88565b61036c6103573660046127be565b606654600160ff9092169190911b9081161490565b6040519015158152602001610285565b6066545b604051908152602001610285565b61027461039c3660046127e1565b6001600160a01b039182166000908152609760209081526040808320939094168252919091522054600160201b900463ffffffff1690565b610213610e4f565b6103806103ea3660046126e6565b610e63565b6102746103fd3660046126e6565b610f73565b61021361041036600461281a565b610fc3565b61036c61042336600461288f565b61100d565b61043b6104363660046127e1565b61116f565b604080519315158452602084019290925290820152606001610285565b606554610329906001600160a01b031681565b6033546001600160a01b0316610329565b61038061048a36600461271b565b6001600160a01b03166000908152609a602052604090205490565b6102136104b33660046128cd565b6111b2565b61053b6104c63660046127e1565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0395861681526097835283812094909516855292815292819020815192830182525463ffffffff8082168452600160201b8204811694840194909452600160401b90049092169181019190915290565b60408051825163ffffffff90811682526020808501518216908301529282015190921690820152606001610285565b61036c6105783660046127e1565b611405565b61027461058b3660046127e1565b6001600160a01b039182166000908152609760209081526040808320939094168252919091522054600160401b900463ffffffff1690565b6103297f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61036c6105f836600461271b565b611451565b61038061060b36600461271b565b6001600160a01b031660009081526099602052604090205490565b61021361063436600461271b565b6115c7565b61021361064736600461271b565b61163d565b61021361065a366004612738565b61176c565b6001600160a01b03821660009081526097602090815260408083203384529091529020548290600160201b900463ffffffff908116146106ba5760405162461bcd60e51b81526004016106b19061291a565b60405180910390fd5b6106c58343846118c8565b6106e7336001600160a01b038516600090815260996020526040902090611c5e565b61077f5760405162461bcd60e51b815260206004820152605760248201527f536c61736865722e7265636f72644c6173745374616b65557064617465416e6460448201527f5265766f6b65536c617368696e674162696c6974793a2052656d6f76696e672060648201527f6d6964646c657761726520756e7375636365737366756c000000000000000000608482015260a4016106b1565b61078a833384611cf8565b505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108069190612990565b6001600160a01b0316336001600160a01b0316146108365760405162461bcd60e51b81526004016106b1906129ad565b61083f81611e03565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae91906129f7565b6108ca5760405162461bcd60e51b81526004016106b190612a19565b606654818116146109435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b1565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b606654600190600290811614156109aa5760405162461bcd60e51b81526004016106b190612a61565b6001600160a01b03831660009081526097602090815260408083203384529091529020548390600160201b900463ffffffff908116146109fc5760405162461bcd60e51b81526004016106b19061291a565b610a078443856118c8565b610a29336001600160a01b038616600090815260996020526040902090611efa565b610aa55760405162461bcd60e51b815260206004820152604160248201527f536c61736865722e7265636f726446697273745374616b655570646174653a2060448201527f417070656e64696e67206d6964646c657761726520756e7375636365737366756064820152601b60fa1b608482015260a4016106b1565b50505050565b600054610100900460ff1615808015610acb5750600054600160ff909116105b80610ae55750303b158015610ae5575060005460ff166001145b610b485760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b1565b6000805460ff191660011790558015610b6b576000805461ff0019166101001790555b610b758383611f08565b610b7e84611fee565b8015610aa5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6001600160a01b0382166000908152609a60205260408120805463ffffffff8416908110610bf957610bf9612a98565b60009182526020909120015463ffffffff1690505b92915050565b60408051808201909152600080825260208201526001600160a01b0383166000908152609a60205260409020805483908110610c5257610c52612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b90910416918101919091529392505050565b6001600160a01b03821660009081526099602052604081208190610caf9084612040565b915091509250929050565b60665460029060049081161415610ce35760405162461bcd60e51b81526004016106b190612a61565b610ced8233611405565b610d7a5760405162461bcd60e51b815260206004820152605260248201527f536c61736865722e667265657a654f70657261746f723a206d73672e73656e6460448201527f657220646f6573206e6f742068617665207065726d697373696f6e20746f20736064820152713630b9b4103a3434b99037b832b930ba37b960711b608482015260a4016106b1565b610d84823361204f565b5050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df491906129f7565b610e105760405162461bcd60e51b81526004016106b190612a19565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610e576120c1565b610e616000611fee565b565b6001600160a01b038281166000818152609960209081526040808320838052600190810183528184209084528252808320549383526097825280832094841683529390529182205463ffffffff848116600160401b909204161115610ecc576000915050610c0e565b6001600160a01b0384166000908152609960205260408120610eee908361211b565b9150505b8015801590610f3657506001600160a01b0385811660009081526097602090815260408083209386168352929052205463ffffffff858116600160401b9092041611155b15610f6b576001600160a01b03851660009081526099602052604090209091508190610f62908261211b565b9150610ef29050565b509392505050565b6001600160a01b0382166000908152609a60205260408120805463ffffffff8416908110610fa357610fa3612a98565b600091825260209091200154600160201b900463ffffffff169392505050565b610fcb6120c1565b60005b8181101561078a57611005838383818110610feb57610feb612a98565b9050602002016020810190611000919061271b565b61212a565b600101610fce565b6001600160a01b0383166000908152609a602052604081205461103257506001611168565b6001600160a01b0384166000908152609a6020526040812080548490811061105c5761105c612a98565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b909204811693830193909352909250908516108015906110ba57506001600160a01b038516600090815260996020526040902054155b15611136576001600160a01b0385166000908152609a6020526040902080546110e590600190612ac4565b815481106110f5576110f5612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b909104811691909201819052439091161191506111689050565b806000015163ffffffff168463ffffffff161080156111645750806020015163ffffffff164363ffffffff16115b9150505b9392505050565b6001600160a01b0382166000908152609960205260408120819081906111a49061119f866001600160a01b031690565b612194565b9250925092505b9250925092565b6001600160a01b03841660009081526097602090815260408083203384529091529020548490600160201b900463ffffffff908116146112045760405162461bcd60e51b81526004016106b19061291a565b438463ffffffff16111561128a5760405162461bcd60e51b815260206004820152604160248201527f536c61736865722e7265636f72645374616b655570646174653a2063616e6e6f60448201527f742070726f766964652075706461746520666f722066757475726520626c6f636064820152606b60f81b608482015260a4016106b1565b6112958585856118c8565b6001600160a01b038516600090815260996020526040902054600114611359576112d7336001600160a01b038716600090815260996020526040902090611c5e565b6113495760405162461bcd60e51b815260206004820152603b60248201527f536c61736865722e7265636f72645374616b655570646174653a2052656d6f7660448201527f696e67206d6964646c657761726520756e7375636365737366756c000000000060648201526084016106b1565b6113548585846121e4565b6113fe565b336001600160a01b038616600090815260996020908152604080832083805260019081018352818420908452909152902054146113fe5760405162461bcd60e51b815260206004820152603960248201527f536c61736865722e7265636f72645374616b655570646174653a2043616c6c6560448201527f72206973206e6f7420746865206c69737420656e7472616e740000000000000060648201526084016106b1565b5050505050565b6001600160a01b038281166000908152609760209081526040808320938516835292905290812054600160201b900463ffffffff1643101561144957506001610c0e565b506000610c0e565b6001600160a01b03811660009081526098602052604081205460ff161561147a57506001919050565b604051633e28391d60e01b81526001600160a01b0383811660048301527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91690633e28391d90602401602060405180830381865afa1580156114e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150491906129f7565b156115ba57604051631976849960e21b81526001600160a01b0383811660048301526000917f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9909116906365da126490602401602060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612990565b6001600160a01b031660009081526098602052604090205460ff169392505050565b506000919050565b919050565b6115cf6120c1565b6001600160a01b0381166116345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b61083f81611fee565b606654600090600190811614156116665760405162461bcd60e51b81526004016106b190612a61565b6040516336b87bd760e11b81523360048201527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b031690636d70f7ae90602401602060405180830381865afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee91906129f7565b611762576040805162461bcd60e51b81526020600482015260248101919091527f536c61736865722e6f7074496e746f536c617368696e673a206d73672e73656e60448201527f646572206973206e6f7420612072656769737465726564206f70657261746f7260648201526084016106b1565b610d84338361249b565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190612990565b6001600160a01b0316336001600160a01b0316146118135760405162461bcd60e51b81526004016106b1906129ad565b6066541981196066541916146118915760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b1565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610976565b6001600160a01b038316600090815260976020908152604080832033845290915290205463ffffffff808416600160401b9092041611156119845760405162461bcd60e51b815260206004820152604a60248201527f536c61736865722e5f7265636f7264557064617465416e64416464546f4d696460448201527f646c657761726554696d65733a2063616e2774207075736820612070726576696064820152696f75732075706461746560b01b608482015260a4016106b1565b6001600160a01b0383166000818152609760209081526040808320338452825280832080546bffffffff00000000000000001916600160401b63ffffffff89160217905580518082018252838152808301849052938352609a9091529020548015611a51576001600160a01b0385166000908152609a60205260409020611a0c600183612ac4565b81548110611a1c57611a1c612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b909104169181019190915291505b60008290506000836020015163ffffffff168563ffffffff161115611a80575063ffffffff8416602082015260015b6001600160a01b038716600090815260996020526040902054611aae575063ffffffff851681526001611b83565b336001600160a01b0388166000908152609960209081526040808320838052600190810183528184209084529091529020541415611b8357600080611b0b336001600160a01b038b1660009081526099602052604090209061211b565b915091508115611b72576001600160a01b03898116600090815260976020908152604080832093851683529290522054600160401b900463ffffffff908116908916811015611b625763ffffffff81168552611b6c565b63ffffffff891685525b50611b7c565b63ffffffff881684525b6001925050505b8015611c55576001600160a01b0387166000818152609a6020908152604082208054600181810183558285528385208851920180549489015163ffffffff908116600160201b0267ffffffffffffffff199096169316929092179390931790559290915290547f1b62ba64c72d01e41a2b8c46e6aeeff728ef3a4438cf1cac3d92ee12189d5649918991611c179190612ac4565b8451602080870151604080516001600160a01b0390961686529185019390935263ffffffff9182169084015216606082015260800160405180910390a15b50505050505050565b6000811580611c745750611c728383612506565b155b15611c8157506000610c0e565b600082815260018481016020908152604080842084805290915280832054828452922054611cb3928692909190612582565b60008281526001848101602090815260408084208480529091528083208390558183528220829055845490918591611cec908490612ac4565b90915550919392505050565b63ffffffff8181161415611d825760405162461bcd60e51b8152602060048201526044602482018190527f536c61736865722e5f7265766f6b65536c617368696e674162696c6974793a20908201527f7365727665556e74696c426c6f636b2074696d65206d757374206265206c696d6064820152631a5d195960e21b608482015260a4016106b1565b6001600160a01b03838116600081815260976020908152604080832094871680845294825291829020805467ffffffff000000001916600160201b63ffffffff88169081029190911790915591519182527f9aa1b1391f35c672ed1f3b7ece632f4513e618366bef7a2f67b7c6bc1f2d2b14910160405180910390a3505050565b6001600160a01b038116611e915760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b1565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611168838360006125b7565b6065546001600160a01b0316158015611f2957506001600160a01b03821615155b611fab5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b1565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610d8482611e03565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080610caf848460006125ce565b6001600160a01b03821660009081526098602052604090205460ff16610d84576001600160a01b03808316600081815260986020526040808220805460ff1916600117905551928416927f444a84f512816ae7be8ed8a66aa88e362eb54d0988e83acc9d81746622b3ba519190a35050565b6033546001600160a01b03163314610e615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b1565b600080610caf848460016125ce565b6001600160a01b03811660009081526098602052604090205460ff161561083f576001600160a01b038116600081815260986020526040808220805460ff19169055517fd4cef0af27800d466fcacd85779857378b85cb61569005ff1464fa6e5ced69d89190a250565b60008060006121a38585612506565b6121b5575060009150819050806111ab565b5050506000818152600183810160209081526040808420848052909152808320548284529220549091906111ab565b6000811561238e576001600160a01b038416600090815260996020526040902061220e9083612506565b612216575060015b8015801561225857506001600160a01b0384811660009081526097602090815260408083209386168352929052205463ffffffff848116600160401b90920416115b15612261575060015b806122d8576001600160a01b0384166000908152609960205260408120819061228a908561211b565b9150915081156122d5576001600160a01b0386811660009081526097602090815260408083209385168352929052205463ffffffff868116600160401b90920416116122d557600192505b50505b80612377576001600160a01b0384166000908152609960205260409020612300908333612617565b6123725760405162461bcd60e51b815260206004820152603c60248201527f536c61736865722e7265636f72645374616b655570646174653a20496e73657260448201527f74696e67206d6964646c657761726520756e7375636365737366756c0000000060648201526084016106b1565b610aa5565b6123818484610e63565b91506123728484846121e4565b6001600160a01b03848116600090815260976020908152604080832060998352818420848052600190810184528285209085528352818420549094168352929052205463ffffffff848116600160401b90920416116123eb575060015b8061248457612412336001600160a01b038616600090815260996020526040902090612626565b6123725760405162461bcd60e51b815260206004820152603e60248201527f536c61736865722e7265636f72645374616b655570646174653a20507265707060448201527f656e64696e67206d6964646c657761726520756e7375636365737366756c000060648201526084016106b1565b61248e8484610e63565b9150610aa58484846121e4565b6001600160a01b03808316600081815260976020908152604080832094861680845294909152808220805467ffffffff00000000191667ffffffff00000000179055517fefa9fb38e813d53c15edf501e03852843a3fed691960523391d71a092b3627d89190a35050565b6000818152600183016020908152604080832083805290915281205415801561254957506000828152600180850160209081526040808420928452919052902054155b1561257a57600080805260018085016020908152604080842092845291905290205482141561144957506001610c0e565b506001610c0e565b600082815260019094016020818152604080872093158088529382528087208690559486529081528385209115855252912055565b60006125c68460008585612634565b949350505050565b6000806125db8585612506565b6125ea5750600090508061260f565b5050600082815260018401602090815260408083208415158452909152902054801515905b935093915050565b60006125c68484846001612634565b6000611168838360016125b7565b60006126408584612506565b15801561265257506126528585612506565b156126b25760008481526001860160209081526040808320851515845290915290205461268186868686612582565b61268d86858386612582565b60018660000160008282546126a29190612adb565b90915550600192506125c6915050565b506000949350505050565b6001600160a01b038116811461083f57600080fd5b803563ffffffff811681146115c257600080fd5b600080604083850312156126f957600080fd5b8235612704816126bd565b9150612712602084016126d2565b90509250929050565b60006020828403121561272d57600080fd5b8135611168816126bd565b60006020828403121561274a57600080fd5b5035919050565b60008060006060848603121561276657600080fd5b8335612771816126bd565b92506020840135612781816126bd565b929592945050506040919091013590565b600080604083850312156127a557600080fd5b82356127b0816126bd565b946020939093013593505050565b6000602082840312156127d057600080fd5b813560ff8116811461116857600080fd5b600080604083850312156127f457600080fd5b82356127ff816126bd565b9150602083013561280f816126bd565b809150509250929050565b6000806020838503121561282d57600080fd5b823567ffffffffffffffff8082111561284557600080fd5b818501915085601f83011261285957600080fd5b81358181111561286857600080fd5b8660208260051b850101111561287d57600080fd5b60209290920196919550909350505050565b6000806000606084860312156128a457600080fd5b83356128af816126bd565b92506128bd602085016126d2565b9150604084013590509250925092565b600080600080608085870312156128e357600080fd5b84356128ee816126bd565b93506128fc602086016126d2565b925061290a604086016126d2565b9396929550929360600135925050565b60208082526050908201527f536c61736865722e6f6e6c7952656769737465726564466f725365727669636560408201527f3a204f70657261746f7220686173206e6f74206f7074656420696e746f20736c60608201526f30b9b434b73390313c9031b0b63632b960811b608082015260a00190565b6000602082840312156129a257600080fd5b8151611168816126bd565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612a0957600080fd5b8151801515811461116857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612ad657612ad6612aae565b500390565b60008219821115612aee57612aee612aae565b50019056fea2646970667358221220c5efe534d543130a022495783fbd61cd409c461e0ed63e2b662dd8ec88c5716764736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xa85233c63b9ee964add6f2cffe00fd84eb32338f":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633563b0d1146100465780634f739f741461006f578063cefdc1d41461008f575b600080fd5b610059610054366004610d22565b6100b0565b6040516100669190610e6a565b60405180910390f35b61008261007d366004610ed0565b61042b565b6040516100669190610fd4565b6100a261009d36600461108f565b610ab2565b6040516100669291906110d1565b60606000846001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011691906110f2565b90506000856001600160a01b0316639e9923c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017c91906110f2565b90506000855167ffffffffffffffff81111561019a5761019a610cb9565b6040519080825280602002602001820160405280156101cd57816020015b60608152602001906001900390816101b85790505b50905060005b86518110156104205760008782815181106101f0576101f061110f565b016020015160405163889ae3e560e01b815260f89190911c6004820181905263ffffffff8916602483015291506000906001600160a01b0386169063889ae3e590604401600060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102799190810190611149565b9050805167ffffffffffffffff81111561029557610295610cb9565b6040519080825280602002602001820160405280156102da57816020015b60408051808201909152600080825260208201528152602001906001900390816102b35790505b508484815181106102ed576102ed61110f565b602002602001018190525060005b815181101561040a5760008282815181106103185761031861110f565b6020908102919091018101516040805180820182528281529051631b32722560e01b81526004810183905260ff8816602482015263ffffffff8e166044820152919350918201906001600160a01b038b1690631b32722590606401602060405180830381865afa158015610390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b491906111df565b6001600160601b03168152508686815181106103d2576103d261110f565b602002602001015183815181106103eb576103eb61110f565b60200260200101819052505080806104029061121e565b9150506102fb565b50505080806104189061121e565b9150506101d3565b509695505050505050565b6104566040518060800160405280606081526020016060815260200160608152602001606081525090565b6000876001600160a01b031663683048356040518163ffffffff1660e01b8152600401602060405180830381865afa158015610496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ba91906110f2565b90506104e76040518060800160405280606081526020016060815260200160608152602001606081525090565b6040516385020d4960e01b81526001600160a01b038a16906385020d4990610517908b9089908990600401611239565b600060405180830381865afa158015610534573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261055c9190810190611283565b815260405163e192e9ad60e01b81526001600160a01b0383169063e192e9ad9061058e908b908b908b9060040161133b565b600060405180830381865afa1580156105ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d39190810190611283565b60408201528567ffffffffffffffff8111156105f1576105f1610cb9565b60405190808252806020026020018201604052801561062457816020015b606081526020019060019003908161060f5790505b50606082015260005b60ff81168711156109c35760008567ffffffffffffffff81111561065357610653610cb9565b60405190808252806020026020018201604052801561067c578160200160208202803683370190505b5083606001518360ff16815181106106965761069661110f565b602002602001018190525060005b868110156108c25760008c6001600160a01b0316633064620d8a8a858181106106cf576106cf61110f565b905060200201358e886000015186815181106106ed576106ed61110f565b60200260200101516040518463ffffffff1660e01b815260040161072a9392919092835263ffffffff918216602084015216604082015260600190565b602060405180830381865afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b9190611364565b90508a8a8560ff168181106107825761078261110f565b6001600160c01b03841692013560f81c9190911c6001908116141590506108af57856001600160a01b031663480858668a8a858181106107c4576107c461110f565b905060200201358d8d8860ff168181106107e0576107e061110f565b6040516001600160e01b031960e087901b1681526004810194909452919091013560f81c60248301525063ffffffff8f166044820152606401602060405180830381865afa158015610836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085a919061138d565b85606001518560ff16815181106108735761087361110f565b6020026020010151848151811061088c5761088c61110f565b63ffffffff90921660209283029190910190910152826108ab8161121e565b9350505b50806108ba8161121e565b9150506106a4565b5060008167ffffffffffffffff8111156108de576108de610cb9565b604051908082528060200260200182016040528015610907578160200160208202803683370190505b50905060005b828110156109885784606001518460ff168151811061092e5761092e61110f565b602002602001015181815181106109475761094761110f565b60200260200101518282815181106109615761096161110f565b63ffffffff90921660209283029190910190910152806109808161121e565b91505061090d565b508084606001518460ff16815181106109a3576109a361110f565b6020026020010181905250505080806109bb906113aa565b91505061062d565b506000896001600160a01b0316633561deb16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2891906110f2565b60405163eda1076360e01b81529091506001600160a01b0382169063eda1076390610a5b908b908b908e906004016113ca565b600060405180830381865afa158015610a78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aa09190810190611283565b60208301525098975050505050505050565b6040805160018082528183019092526000916060918391602080830190803683370190505090508481600081518110610aed57610aed61110f565b60209081029190910101526040516385020d4960e01b81526000906001600160a01b038816906385020d4990610b2990889086906004016113f4565b600060405180830381865afa158015610b46573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b6e9190810190611283565b600081518110610b8057610b8061110f565b6020908102919091010151604051633064620d60e01b81526004810188905263ffffffff87811660248301529091166044820181905291506000906001600160a01b03891690633064620d90606401602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190611364565b6001600160c01b031690506000610c2682610c44565b905081610c348a838a6100b0565b9550955050505050935093915050565b60606000805b610100811015610c9a576001811b915083821615610c8a57828160f81b604051602001610c78929190611448565b60405160208183030381529060405292505b610c938161121e565b9050610c4a565b5050919050565b6001600160a01b0381168114610cb657600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610cf857610cf8610cb9565b604052919050565b63ffffffff81168114610cb657600080fd5b8035610d1d81610d00565b919050565b600080600060608486031215610d3757600080fd5b8335610d4281610ca1565b925060208481013567ffffffffffffffff80821115610d6057600080fd5b818701915087601f830112610d7457600080fd5b813581811115610d8657610d86610cb9565b610d98601f8201601f19168501610ccf565b91508082528884828501011115610dae57600080fd5b8084840185840137600084828401015250809450505050610dd160408501610d12565b90509250925092565b600081518084526020808501808196508360051b810191508286016000805b86811015610e5c578385038a52825180518087529087019087870190845b81811015610e47578351805184528a01516001600160601b03168a84015292890192604090920191600101610e17565b50509a87019a95505091850191600101610df9565b509298975050505050505050565b602081526000610e7d6020830184610dda565b9392505050565b60008083601f840112610e9657600080fd5b50813567ffffffffffffffff811115610eae57600080fd5b6020830191508360208260051b8501011115610ec957600080fd5b9250929050565b60008060008060008060808789031215610ee957600080fd5b8635610ef481610ca1565b95506020870135610f0481610d00565b9450604087013567ffffffffffffffff80821115610f2157600080fd5b818901915089601f830112610f3557600080fd5b813581811115610f4457600080fd5b8a6020828501011115610f5657600080fd5b602083019650809550506060890135915080821115610f7457600080fd5b50610f8189828a01610e84565b979a9699509497509295939492505050565b600081518084526020808501945080840160005b83811015610fc957815163ffffffff1687529582019590820190600101610fa7565b509495945050505050565b600060208083528351608082850152610ff060a0850182610f93565b905081850151601f198086840301604087015261100d8383610f93565b9250604087015191508086840301606087015261102a8383610f93565b60608801518782038301608089015280518083529194508501925084840190600581901b8501860160005b82811015611081578487830301845261106f828751610f93565b95880195938801939150600101611055565b509998505050505050505050565b6000806000606084860312156110a457600080fd5b83356110af81610ca1565b92506020840135915060408401356110c681610d00565b809150509250925092565b8281526040602082015260006110ea6040830184610dda565b949350505050565b60006020828403121561110457600080fd5b8151610e7d81610ca1565b634e487b7160e01b600052603260045260246000fd5b600067ffffffffffffffff82111561113f5761113f610cb9565b5060051b60200190565b6000602080838503121561115c57600080fd5b825167ffffffffffffffff81111561117357600080fd5b8301601f8101851361118457600080fd5b805161119761119282611125565b610ccf565b81815260059190911b820183019083810190878311156111b657600080fd5b928401925b828410156111d4578351825292840192908401906111bb565b979650505050505050565b6000602082840312156111f157600080fd5b81516001600160601b0381168114610e7d57600080fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561123257611232611208565b5060010190565b63ffffffff84168152604060208201819052810182905260006001600160fb1b0383111561126657600080fd5b8260051b8085606085013760009201606001918252509392505050565b6000602080838503121561129657600080fd5b825167ffffffffffffffff8111156112ad57600080fd5b8301601f810185136112be57600080fd5b80516112cc61119282611125565b81815260059190911b820183019083810190878311156112eb57600080fd5b928401925b828410156111d457835161130381610d00565b825292840192908401906112f0565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff8416815260406020820152600061135b604083018486611312565b95945050505050565b60006020828403121561137657600080fd5b81516001600160c01b0381168114610e7d57600080fd5b60006020828403121561139f57600080fd5b8151610e7d81610d00565b600060ff821660ff8114156113c1576113c1611208565b60010192915050565b6040815260006113de604083018587611312565b905063ffffffff83166020830152949350505050565b60006040820163ffffffff851683526020604081850152818551808452606086019150828701935060005b8181101561143b5784518352938301939183019160010161141f565b5090979650505050505050565b6000835160005b81811015611469576020818701810151858301520161144f565b81811115611478576000828501525b506001600160f81b031993909316919092019081526001019291505056fea2646970667358221220636a487b6438b6d6985e8e0413c964aa3173d76782d27ebcf2139a62cb6bba5e64736f6c634300080c0033","storage":{}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638c80d4e511610125578063c6656702116100ad578063df5cf7231161007c578063df5cf7231461054a578063e7a050aa14610571578063f2fde38b14610584578063f698da2514610597578063fabc1cbc1461059f57600080fd5b8063c6656702146104e7578063cbc2bd62146104fa578063cd293f6f1461050d578063cf756fdf1461053757600080fd5b8063b1344271116100f4578063b134427114610464578063b43b514b1461048b578063b5d8b5b81461049e578063c3c6b3a9146104b1578063c608c7f3146104d457600080fd5b80638c80d4e51461040c5780638da5cb5b1461041f57806394f649dd14610430578063967fc0d21461045157600080fd5b80635ac86ab7116101a8578063715018a611610177578063715018a61461037d5780637a7e0d92146103855780637ecebe00146103b0578063886f1195146103d05780638b8aac3c146103e357600080fd5b80635ac86ab71461030c5780635c975abb1461033f5780635de08ff214610347578063663c1de41461035a57600080fd5b80634665bcda116101e45780634665bcda1461028b57806348825e94146102ca57806350ff7225146102f1578063595c6a671461030457600080fd5b806310d67a2f14610216578063136439dd1461022b57806320606b701461023e57806332e89ace14610278575b600080fd5b61022961022436600461289a565b6105b2565b005b6102296102393660046128b7565b61066e565b6102657f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b610265610286366004612950565b6107ad565b6102b27f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b03909116815260200161026f565b6102657f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f181565b6102296102ff366004612a2f565b6109f1565b610229610a49565b61032f61031a366004612a70565b609854600160ff9092169190911b9081161490565b604051901515815260200161026f565b609854610265565b610229610355366004612a93565b610b10565b61032f61036836600461289a565b60d16020526000908152604090205460ff1681565b610229610c59565b610265610393366004612b08565b60cd60209081526000928352604080842090915290825290205481565b6102656103be36600461289a565b60ca6020526000908152604090205481565b6097546102b2906001600160a01b031681565b6102656103f136600461289a565b6001600160a01b0316600090815260ce602052604090205490565b61022961041a366004612a2f565b610c6d565b6033546001600160a01b03166102b2565b61044361043e36600461289a565b610cc0565b60405161026f929190612bb5565b60cb546102b2906001600160a01b031681565b6102b27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b610265610499366004612d5e565b610e40565b6102296104ac366004612a93565b610e8d565b61032f6104bf3660046128b7565b60cf6020526000908152604090205460ff1681565b6102296104e2366004612e34565b610fd1565b6102296104f536600461289a565b611089565b6102b2610508366004612e87565b61109a565b61052061051b366004612d5e565b6110d2565b60408051921515835260208301919091520161026f565b610229610545366004612eb3565b611166565b6102b27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61026561057f366004612a2f565b61129a565b61022961059236600461289a565b611363565b6102656113d9565b6102296105ad3660046128b7565b611417565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106299190612f04565b6001600160a01b0316336001600160a01b0316146106625760405162461bcd60e51b815260040161065990612f21565b60405180910390fd5b61066b81611573565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106da9190612f6b565b6106f65760405162461bcd60e51b815260040161065990612f8d565b6098548181161461076f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156108045760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156108575760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b6002606555428410156108de5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610659565b6001600160a01b03858116600090815260ca602090815260408083205481517f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f1938101939093528c851691830191909152928a1660608201526080810189905260a0810183905260c0810187905260e00160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca909352908220600185019055915061098e6113d9565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506109d188828861166a565b6109dd888c8c8c611824565b60016065559b9a5050505050505050505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610a395760405162461bcd60e51b815260040161065990612fd5565b610a44838383611a45565b505050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab59190612f6b565b610ad15760405162461bcd60e51b815260040161065990612f8d565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cb546001600160a01b03163314610b3a5760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610b5c57610b5c61309d565b9050602002016020810190610b71919061289a565b6001600160a01b0316815260208101919091526040016000205460ff16610c4b57600160d16000868685818110610baa57610baa61309d565b9050602002016020810190610bbf919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610c1a57610c1a61309d565b9050602002016020810190610c2f919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610b3e565b50505050565b610c61611c7f565b610c6b6000611cd9565b565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610cb55760405162461bcd60e51b815260040161065990612fd5565b610c53838383611d2b565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610cf857610cf86128e0565b604051908082528060200260200182016040528015610d21578160200160208202803683370190505b50905060005b82811015610db2576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610d6657610d6661309d565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d9f57610d9f61309d565b6020908102919091010152600101610d27565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610e2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e10575b50505050509150935093505050915091565b80516020808301516040808501516060860151608087015160a08801519351600097610e709790969591016130b3565b604051602081830303815290604052805190602001209050919050565b60cb546001600160a01b03163314610eb75760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610ed957610ed961309d565b9050602002016020810190610eee919061289a565b6001600160a01b0316815260208101919091526040016000205460ff1615610fc957600060d16000868685818110610f2857610f2861309d565b9050602002016020810190610f3d919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9857610f9861309d565b9050602002016020810190610fad919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebb565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146110195760405162461bcd60e51b815260040161065990612fd5565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b5050505050505050565b611091611c7f565b61066b81611e87565b60ce60205281600052604060002081815481106110b657600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461111d5760405162461bcd60e51b815260040161065990612fd5565b600061112884610e40565b600081815260cf60205260408120549192509060ff161561115d5750600081815260cf60205260409020805460ff1916905560015b92509050915091565b600054610100900460ff16158080156111865750600054600160ff909116105b806111a05750303b1580156111a0575060005460ff166001145b6112035760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610659565b6000805460ff191660011790558015611226576000805461ff0019166101001790555b61122e611ef0565b60c95561123b8383611f87565b61124485611cd9565b61124d84611e87565b8015611293576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6098546000908190600190811614156112f15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156113445760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b600260655561135533868686611824565b600160655595945050505050565b61136b611c7f565b6001600160a01b0381166113d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61066b81611cd9565b60007f0000000000000000000000000000000000000000000000000000000000007a6946141561140a575060c95490565b611412611ef0565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190612f04565b6001600160a01b0316336001600160a01b0316146114be5760405162461bcd60e51b815260040161065990612f21565b60985419811960985419161461153c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107a2565b6001600160a01b0381166116015760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610659565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561178457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906116aa9086908690600401613184565b602060405180830381865afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb919061319d565b6001600160e01b03191614610a445760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610659565b826001600160a01b03166117988383612071565b6001600160a01b031614610a445760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610659565b6001600160a01b038316600090815260d16020526040812054849060ff166118ca5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610659565b6118df6001600160a01b038516338786612095565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195291906131c7565b915061195f868684611a45565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b1580156119d157600080fd5b505af11580156119e5573d6000803e3d6000fd5b5050604080516001600160a01b038a8116825288811660208301528916818301526060810186905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969350908190036080019150a150949350505050565b6001600160a01b038316611ac15760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610659565b80611b2d5760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610659565b6001600160a01b03808416600090815260cd6020908152604080832093861683529290522054611c3e576001600160a01b038316600090815260ce602090815260409091205410611bff5760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610659565b6001600160a01b03838116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808416600090815260cd6020908152604080832093861683529290529081208054839290611c759084906131f6565b9091555050505050565b6033546001600160a01b03163314610c6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610659565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611da05760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610659565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611e325760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610659565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611e7a57611e7085856120ef565b6001915050611e80565b60009150505b9392505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b0316158015611fa857506001600160a01b03821615155b61202a5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261206d82611573565b5050565b600080600061208085856122e1565b9150915061208d81612351565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c5390859061250c565b6001600160a01b038216600090815260ce6020526040812054905b8181101561220a576001600160a01b03848116600090815260ce60205260409020805491851691839081106121415761214161309d565b6000918252602090912001546001600160a01b03161415612202576001600160a01b038416600090815260ce6020526040902080546121829060019061320e565b815481106121925761219261309d565b60009182526020808320909101546001600160a01b03878116845260ce90925260409092208054919092169190839081106121cf576121cf61309d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061220a565b60010161210a565b818114156122925760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610659565b6001600160a01b038416600090815260ce602052604090208054806122b9576122b9613225565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156123185760208301516040840151606085015160001a61230c878285856125de565b9450945050505061234a565b82516040141561234257602083015160408401516123378683836126cb565b93509350505061234a565b506000905060025b9250929050565b60008160048111156123655761236561323b565b141561236e5750565b60018160048111156123825761238261323b565b14156123d05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610659565b60028160048111156123e4576123e461323b565b14156124325760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610659565b60038160048111156124465761244661323b565b141561249f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610659565b60048160048111156124b3576124b361323b565b141561066b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610659565b6000612561826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127049092919063ffffffff16565b805190915015610a44578080602001905181019061257f9190612f6b565b610a445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610659565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561261557506000905060036126c2565b8460ff16601b1415801561262d57508460ff16601c14155b1561263e57506000905060046126c2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612692573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126bb576000600192509250506126c2565b9150600090505b94509492505050565b6000806001600160ff1b038316816126e860ff86901c601b6131f6565b90506126f6878288856125de565b935093505050935093915050565b6060612713848460008561271b565b949350505050565b60608247101561277c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610659565b6001600160a01b0385163b6127d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610659565b600080866001600160a01b031685876040516127ef9190613251565b60006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b509150915061284182828661284c565b979650505050505050565b6060831561285b575081611e80565b82511561286b5782518084602001fd5b8160405162461bcd60e51b8152600401610659919061326d565b6001600160a01b038116811461066b57600080fd5b6000602082840312156128ac57600080fd5b8135611e8081612885565b6000602082840312156128c957600080fd5b5035919050565b80356128db81612885565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612919576129196128e0565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612948576129486128e0565b604052919050565b60008060008060008060c0878903121561296957600080fd5b863561297481612885565b955060208781013561298581612885565b955060408801359450606088013561299c81612885565b93506080880135925060a088013567ffffffffffffffff808211156129c057600080fd5b818a0191508a601f8301126129d457600080fd5b8135818111156129e6576129e66128e0565b6129f8601f8201601f1916850161291f565b91508082528b84828501011115612a0e57600080fd5b80848401858401376000848284010152508093505050509295509295509295565b600080600060608486031215612a4457600080fd5b8335612a4f81612885565b92506020840135612a5f81612885565b929592945050506040919091013590565b600060208284031215612a8257600080fd5b813560ff81168114611e8057600080fd5b60008060208385031215612aa657600080fd5b823567ffffffffffffffff80821115612abe57600080fd5b818501915085601f830112612ad257600080fd5b813581811115612ae157600080fd5b8660208260051b8501011115612af657600080fd5b60209290920196919550909350505050565b60008060408385031215612b1b57600080fd5b8235612b2681612885565b91506020830135612b3681612885565b809150509250929050565b600081518084526020808501945080840160005b83811015612b7a5781516001600160a01b031687529582019590820190600101612b55565b509495945050505050565b600081518084526020808501945080840160005b83811015612b7a57815187529582019590820190600101612b99565b604081526000612bc86040830185612b41565b8281036020840152612bda8185612b85565b95945050505050565b600067ffffffffffffffff821115612bfd57612bfd6128e0565b5060051b60200190565b600082601f830112612c1857600080fd5b81356020612c2d612c2883612be3565b61291f565b82815260059290921b84018101918181019086841115612c4c57600080fd5b8286015b84811015612c70578035612c6381612885565b8352918301918301612c50565b509695505050505050565b600082601f830112612c8c57600080fd5b81356020612c9c612c2883612be3565b82815260059290921b84018101918181019086841115612cbb57600080fd5b8286015b84811015612c705780358352918301918301612cbf565b600060408284031215612ce857600080fd5b6040516040810181811067ffffffffffffffff82111715612d0b57612d0b6128e0565b6040529050808235612d1c81612885565b815260208301356bffffffffffffffffffffffff81168114612d3d57600080fd5b6020919091015292915050565b803563ffffffff811681146128db57600080fd5b600060208284031215612d7057600080fd5b813567ffffffffffffffff80821115612d8857600080fd5b9083019060e08286031215612d9c57600080fd5b612da46128f6565b823582811115612db357600080fd5b612dbf87828601612c07565b825250602083013582811115612dd457600080fd5b612de087828601612c7b565b602083015250612df2604084016128d0565b6040820152612e048660608501612cd6565b6060820152612e1560a08401612d4a565b6080820152612e2660c084016128d0565b60a082015295945050505050565b60008060008060808587031215612e4a57600080fd5b8435612e5581612885565b93506020850135612e6581612885565b9250604085013591506060850135612e7c81612885565b939692955090935050565b60008060408385031215612e9a57600080fd5b8235612ea581612885565b946020939093013593505050565b60008060008060808587031215612ec957600080fd5b8435612ed481612885565b93506020850135612ee481612885565b92506040850135612ef481612885565b9396929550929360600135925050565b600060208284031215612f1657600080fd5b8151611e8081612885565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612f7d57600080fd5b81518015158114611e8057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60e0815260006130c660e0830189612b41565b82810360208401526130d88189612b85565b6001600160a01b0397881660408501528651881660608501526020909601516bffffffffffffffffffffffff166080840152505063ffffffff9290921660a083015290921660c09092019190915292915050565b60005b8381101561314757818101518382015260200161312f565b83811115610c535750506000910152565b6000815180845261317081602086016020860161312c565b601f01601f19169290920160200192915050565b8281526040602082015260006127136040830184613158565b6000602082840312156131af57600080fd5b81516001600160e01b031981168114611e8057600080fd5b6000602082840312156131d957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613209576132096131e0565b500190565b600082821015613220576132206131e0565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161326381846020870161312c565b9190910192915050565b602081526000611e80602083018461315856fea26469706673582212205c39c91e4aaff04af69f6d04917b99d0b39f502fa282507e0d84e68f897c45d664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xc6e7df5e7b4f2a278906862b61205850344d4e7d":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b2565b6103ba565b005b6101a66101b63660046117fc565b61049d565b6101a66101c9366004611819565b610550565b6101a66101dc36600461183b565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611854565b610749565b6101a6610279366004611880565b610969565b61024161028c3660046117fc565b610a37565b6101a6610a4b565b6102b86102a73660046118b9565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e736600461183b565b610b17565b6000546101f4906201000090046001600160a01b031681565b61024161031336600461183b565b610b62565b6102416103263660046117fc565b610b6d565b610333610b7b565b604051610208919061190c565b61024161034e3660046117fc565b610b9b565b6101a661036136600461193f565b610c30565b60645460655460408051928352602083019190915201610208565b61024161038f36600461183b565b610e7d565b6102416103a236600461183b565b610eb6565b6101a66103b536600461183b565b610ec1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611980565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b610446858561101d565b610450838361112a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119ce565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119eb565b61054d816111bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119ce565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119eb565b610601828261101d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a35565b6106925760405162461bcd60e51b815260040161041090611a57565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846112c0565b6032546001600160a01b0385811691161461089c5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b60335460006108ad6103e883611ab5565b905060006103e86108bc611398565b6108c69190611ab5565b905060006108d48783611acd565b9050806108e18489611ae4565b6108eb9190611b03565b9550856109515760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b61095b8685611ab5565b603355505050505092915050565b600054610100900460ff16158080156109895750600054600160ff909116105b806109a35750303b1580156109a3575060005460ff166001145b6109bf5760405162461bcd60e51b815260040161041090611980565b6000805460ff1916600117905580156109e2576000805461ff0019166101001790555b6109ec838361112a565b8015610a32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a456102e783610b9b565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc9190611a35565b610ad85760405162461bcd60e51b815260040161041090611a57565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b2a9190611ab5565b905060006103e8610b39611398565b610b439190611ab5565b905081610b508583611ae4565b610b5a9190611b03565b949350505050565b6000610a4582610e7d565b6000610a456103a283610b9b565b60606040518060800160405280604d8152602001611b5b604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c990911690637a7e0d9290604401602060405180830381865afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a459190611b25565b6001805460029081161415610c835760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614610cfb5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b6032546001600160a01b03848116911614610d7e5760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b60335480831115610e0d5760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610e1b6103e883611ab5565b905060006103e8610e2a611398565b610e349190611ab5565b9050600082610e438784611ae4565b610e4d9190611b03565b9050610e598685611acd565b603355603254610e73906001600160a01b0316898361140a565b5050505050505050565b6000806103e8603354610e909190611ab5565b905060006103e8610e9f611398565b610ea99190611ab5565b905080610b508386611ae4565b6000610a4582610b17565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3891906119ce565b6001600160a01b0316336001600160a01b031614610f685760405162461bcd60e51b8152600401610410906119eb565b600154198119600154191614610fe65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561111f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b03841617905561060181600061145c565b6001600160a01b0381166112495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561132a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b606554611335611398565b11156106015760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114059190611b25565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a32908490611548565b6000546201000090046001600160a01b031615801561148357506001600160a01b03821615155b6115055760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826111bb565b600061159d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661161a9092919063ffffffff16565b805190915015610a3257808060200190518101906115bb9190611a35565b610a325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606116298484600085611633565b90505b9392505050565b6060824710156116945760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116eb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516117079190611b3e565b60006040518083038185875af1925050503d8060008114611744576040519150601f19603f3d011682016040523d82523d6000602084013e611749565b606091505b5091509150611759828286611764565b979650505050505050565b6060831561177357508161162c565b8251156117835782518084602001fd5b8160405162461bcd60e51b8152600401610410919061190c565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117c857600080fd5b843593506020850135925060408501356117e18161179d565b915060608501356117f18161179d565b939692955090935050565b60006020828403121561180e57600080fd5b813561162c8161179d565b6000806040838503121561182c57600080fd5b50508035926020909101359150565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b82356118728161179d565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e8161179d565b915060208301356118ae8161179d565b809150509250929050565b6000602082840312156118cb57600080fd5b813560ff8116811461162c57600080fd5b60005b838110156118f75781810151838201526020016118df565b83811115611906576000848401525b50505050565b602081526000825180602084015261192b8160408501602087016118dc565b601f01601f19169190910160400192915050565b60008060006060848603121561195457600080fd5b833561195f8161179d565b9250602084013561196f8161179d565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e057600080fd5b815161162c8161179d565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4757600080fd5b8151801515811461162c57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ac857611ac8611a9f565b500190565b600082821015611adf57611adf611a9f565b500390565b6000816000190483118215151615611afe57611afe611a9f565b500290565b600082611b2057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3757600080fd5b5051919050565b60008251611b508184602087016118dc565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220f3e91484e81b6295a205880b71a56739bd92a560061b728af31944b5f6d96ef064736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x831f01b2aeb61d5d8c019704e62c25763057a8806c5c790bc8b4c99ee54ac8a7","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x610178da211fef7d417bc0e6fed39f05609ad788","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0xd65ac9700cec4e530497617d02afdf0d5de3ed18466aca1578edcbce0d40ee16","0xcb":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea2646970667358221220f71399fafd06d0e383b21957bcac3bf3986a6a0701bc4c5dc7ee118215f3652364736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":25,"balance":"0x21e1873c0582cc1d060","code":"0x","storage":{}}}} \ No newline at end of file diff --git a/tests/integration/eigenlayer-deployed-anvil-state.json b/tests/integration/eigenlayer-deployed-anvil-state.json new file mode 100644 index 00000000..df079437 --- /dev/null +++ b/tests/integration/eigenlayer-deployed-anvil-state.json @@ -0,0 +1 @@ +{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x1175f2f01c40c00","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x1e","0x97":"0x0","0x9a":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xdcd1bf9a1b36ce34237eeafef220932846bcd82","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106102045760003560e01c80639b4e463411610118578063c1de3aef116100a0578063daf12cd41161006f578063daf12cd41461065f578063ea4d3c9b1461067f578063f2fde38b146106b3578063f6848d24146106d3578063fabc1cbc1461070e57600080fd5b8063c1de3aef146105cf578063c2c51c40146105ef578063c3c6b3a91461060f578063d1c64cc91461063f57600080fd5b8063a6a509be116100e7578063a6a509be1461052f578063b134427114610545578063beffbb8914610579578063c052bd6114610599578063c0ccbf10146105b957600080fd5b80639b4e4634146104995780639ba06275146104ac578063a1788484146104e2578063a38406a31461050f57600080fd5b80635ac86ab71161019b57806374cdd7981161016a57806374cdd798146103ea57806384d810621461041e578063886f1195146104335780638da5cb5b146104535780639104c3191461047157600080fd5b80635ac86ab7146103535780635c975abb1461039357806360f4062b146103a8578063715018a6146103d557600080fd5b8063292b7b2b116101d7578063292b7b2b1461029e578063387b1300146102ea57806339b70e381461030a578063595c6a671461033e57600080fd5b80630cf2686d146102095780630e81073c1461022b57806310d67a2f1461025e578063136439dd1461027e575b600080fd5b34801561021557600080fd5b50610229610224366004612371565b61072e565b005b34801561023757600080fd5b5061024b61024636600461239f565b6107ea565b6040519081526020015b60405180910390f35b34801561026a57600080fd5b506102296102793660046123cb565b6109f5565b34801561028a57600080fd5b50610229610299366004612371565b610aa5565b3480156102aa57600080fd5b506102d27f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b6040516001600160a01b039091168152602001610255565b3480156102f657600080fd5b506102296103053660046123e8565b610be4565b34801561031657600080fd5b506102d27f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b34801561034a57600080fd5b50610229610f27565b34801561035f57600080fd5b5061038361036e366004612429565b606654600160ff9092169190911b9081161490565b6040519015158152602001610255565b34801561039f57600080fd5b5060665461024b565b3480156103b457600080fd5b5061024b6103c33660046123cb565b609b6020526000908152604090205481565b3480156103e157600080fd5b50610229610fee565b3480156103f657600080fd5b506102d27f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561042a57600080fd5b50610229611002565b34801561043f57600080fd5b506065546102d2906001600160a01b031681565b34801561045f57600080fd5b506033546001600160a01b03166102d2565b34801561047d57600080fd5b506102d273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102296104a7366004612495565b61108c565b3480156104b857600080fd5b506102d26104c73660046123cb565b6098602052600090815260409020546001600160a01b031681565b3480156104ee57600080fd5b5061024b6104fd3660046123cb565b609c6020526000908152604090205481565b34801561051b57600080fd5b506102d261052a3660046123cb565b611125565b34801561053b57600080fd5b5061024b60995481565b34801561055157600080fd5b506102d27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b34801561058557600080fd5b5061022961059436600461239f565b6111f7565b3480156105a557600080fd5b506097546102d2906001600160a01b031681565b3480156105c557600080fd5b5061024b609a5481565b3480156105db57600080fd5b506102296105ea3660046123cb565b61148a565b3480156105fb57600080fd5b5061022961060a36600461239f565b61149b565b34801561061b57600080fd5b5061038361062a366004612371565b609d6020526000908152604090205460ff1681565b34801561064b57600080fd5b5061024b61065a366004612509565b61186d565b34801561066b57600080fd5b5061022961067a366004612533565b611978565b34801561068b57600080fd5b506102d27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b3480156106bf57600080fd5b506102296106ce3660046123cb565b611aab565b3480156106df57600080fd5b506103836106ee3660046123cb565b6001600160a01b0390811660009081526098602052604090205416151590565b34801561071a57600080fd5b50610229610729366004612371565b611b21565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a5919061258e565b6001600160a01b0316336001600160a01b0316146107de5760405162461bcd60e51b81526004016107d5906125ab565b60405180910390fd5b6107e781611c7d565b50565b6000336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146108345760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b0383166108b05760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f206164647265737300000000000060648201526084016107d5565b600082121561091e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b60648201526084016107d5565b61092c633b9aca0083612669565b1561099f5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e7400000060648201526084016107d5565b6001600160a01b0383166000908152609b6020526040812054906109c38483612693565b6001600160a01b0386166000908152609b6020526040902081905590506109ea8282611cbe565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c919061258e565b6001600160a01b0316336001600160a01b031614610a9c5760405162461bcd60e51b81526004016107d5906125ab565b6107e781611d00565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1191906126d4565b610b2d5760405162461bcd60e51b81526004016107d5906126f6565b60665481811614610ba65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016107d5565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610c2c5760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b038316610ca65760405162461bcd60e51b815260206004820152604760248201526000805160206131d383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a4016107d5565b6001600160a01b038216610d235760405162461bcd60e51b815260206004820152604a60248201526000805160206131d383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a4016107d5565b6000811215610d925760405162461bcd60e51b815260206004820152604160248201526000805160206131d383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a4016107d5565b610da0633b9aca0082612669565b15610e145760405162461bcd60e51b815260206004820152604a60248201526000805160206131d383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a4016107d5565b6001600160a01b0383166000908152609b602052604081205490811215610eab576000610e408261273e565b905080831115610e74576001600160a01b0385166000908152609b6020526040812055610e6d818461275b565b9250610ea9565b6001600160a01b0385166000908152609b602052604081208054859290610e9c908490612693565b90915550610f2292505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50505050505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9391906126d4565b610faf5760405162461bcd60e51b81526004016107d5906126f6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ff6611df7565b6110006000611e51565b565b336000908152609860205260409020546001600160a01b0316156110845760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b60648201526084016107d5565b6107e7611ea3565b336000908152609860205260409020546001600160a01b0316806110b5576110b2611ea3565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906110eb908a908a908a908a908a9060040161279b565b6000604051808303818588803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806109ef576111f0836001600160a01b031660001b60405180610940016040528061090e81526020016128c561090e9139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f19818403018152908290526111d59291602001612810565b604051602081830303815290604052805190602001206120d7565b9392505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461123f5760405162461bcd60e51b81526004016107d5906125f5565b6001600160a01b0382166112bb5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20706f60448201527f644f776e65722063616e6e6f74206265207a65726f206164647265737300000060648201526084016107d5565b60008112156113325760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f6172657320616d6f756e74206973206e6567617469766500000000000000000060648201526084016107d5565b611340633b9aca0082612669565b156113b5576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e7460648201526084016107d5565b6001600160a01b0382166000908152609b60205260408120546113d9908390612825565b9050600081121561146a5760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a4016107d5565b6001600160a01b039092166000908152609b602052604090209190915550565b611492611df7565b6107e781612133565b6001600160a01b0380831660009081526098602052604090205483911633146115165760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b60648201526084016107d5565b600260c65414156115695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d5565b600260c6556001600160a01b0383166116055760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a4016107d5565b611613633b9aca0083612864565b156116ac5760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a4016107d5565b6001600160a01b0383166000908152609b6020526040812054906116d08483612693565b6001600160a01b0386166000908152609b602052604081208290559091506116f88383611cbe565b905080156118605760008112156117c3576001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117578561273e565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156117a657600080fd5b505af11580156117ba573d6000803e3d6000fd5b50505050611860565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b15801561184757600080fd5b505af115801561185b573d6000803e3d6000fd5b505050505b5050600160c65550505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa1580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e89190612878565b9050806109ef5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a4016107d5565b600054610100900460ff16158080156119985750600054600160ff909116105b806119b25750303b1580156119b2575060005460ff166001145b611a155760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d5565b6000805460ff191660011790558015611a38576000805461ff0019166101001790555b611a4186611c7d565b611a4a85612133565b611a5384611e51565b611a5d838361217d565b8015611aa3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b611ab3611df7565b6001600160a01b038116611b185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d5565b6107e781611e51565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b98919061258e565b6001600160a01b0316336001600160a01b031614611bc85760405162461bcd60e51b81526004016107d5906125ab565b606654198119606654191614611c465760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016107d5565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610bd9565b609a5460408051918252602082018390527f4e65c41a3597bda732ca64980235cf51494171d5853998763fb05db45afaacb3910160405180910390a1609a55565b6000808313611cde5760008213611cd7575060006109ef565b50806109ef565b60008213611cf657611cef8361273e565b90506109ef565b611cef8383612825565b6001600160a01b038116611d8e5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016107d5565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146110005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d5565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606654600090819060019081161415611efe5760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e646578206973207061757365640000000000000060448201526064016107d5565b609a54609954611f0f906001612891565b1115611f735760405162461bcd60e51b815260206004820152602d60248201527f456967656e506f644d616e616765722e5f6465706c6f79506f643a20706f642060448201526c1b1a5b5a5d081c995858da1959609a1b60648201526084016107d5565b609960008154611f82906128a9565b9091555060408051610940810190915261090e80825260009161202191839133916128c56020830139604080516001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc318166020820152808201919091526000606082015260800160408051601f198184030181529082905261200d9291602001612810565b604051602081830303815290604052612267565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b15801561206557600080fd5b505af1158015612079573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a391505090565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906111f0565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561219e57506001600160a01b03821615155b6122205760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016107d5565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261226382611d00565b5050565b600080844710156122ba5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016107d5565b82516123085760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016107d5565b8383516020850187f590506001600160a01b0381166123695760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016107d5565b949350505050565b60006020828403121561238357600080fd5b5035919050565b6001600160a01b03811681146107e757600080fd5b600080604083850312156123b257600080fd5b82356123bd8161238a565b946020939093013593505050565b6000602082840312156123dd57600080fd5b81356111f08161238a565b6000806000606084860312156123fd57600080fd5b83356124088161238a565b925060208401356124188161238a565b929592945050506040919091013590565b60006020828403121561243b57600080fd5b813560ff811681146111f057600080fd5b60008083601f84011261245e57600080fd5b50813567ffffffffffffffff81111561247657600080fd5b60208301915083602082850101111561248e57600080fd5b9250929050565b6000806000806000606086880312156124ad57600080fd5b853567ffffffffffffffff808211156124c557600080fd5b6124d189838a0161244c565b909750955060208801359150808211156124ea57600080fd5b506124f78882890161244c565b96999598509660400135949350505050565b60006020828403121561251b57600080fd5b813567ffffffffffffffff811681146111f057600080fd5b600080600080600060a0868803121561254b57600080fd5b85359450602086013561255d8161238a565b9350604086013561256d8161238a565b9250606086013561257d8161238a565b949793965091946080013592915050565b6000602082840312156125a057600080fd5b81516111f08161238a565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261267857612678612653565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126b5576126b561267d565b600160ff1b83900384128116156126ce576126ce61267d565b50500190565b6000602082840312156126e657600080fd5b815180151581146111f057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127545761275461267d565b5060000390565b60008282101561276d5761276d61267d565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006127af606083018789612772565b82810360208401526127c2818688612772565b9150508260408301529695505050505050565b6000815160005b818110156127f657602081850181015186830152016127dc565b81811115612805576000828601525b509290920192915050565b600061236961281f83866127d5565b846127d5565b60008083128015600160ff1b8501841216156128435761284361267d565b6001600160ff1b038401831381161561285e5761285e61267d565b50500390565b60008261287357612873612653565b500790565b60006020828403121561288a57600080fd5b5051919050565b600082198211156128a4576128a461267d565b500190565b60006000198214156128bd576128bd61267d565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220fdba244614e85c7d0217ace6943bbcaeeda2f25ab03ed3807c7c4b43c901c2d664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061016a5760003560e01c80637439841f116100d1578063c49074421161008a578063e251ef5211610064578063e251ef521461053c578063e2c834451461055c578063f28824611461057c578063fe80b087146105b057600080fd5b8063c4907442146104dc578063c4d66de8146104fc578063dda3346c1461051c57600080fd5b80637439841f146103f557806374cdd7981461043957806387e0d2891461046d5780639b4e463414610494578063b725bceb146104a7578063baa7145a146104c757600080fd5b80633474aa16116101235780633474aa16146102f957806334bea20a146103195780633f65cf19146103545780634665bcda146103745780635d3f65b6146103a85780636fcd0e53146103c857600080fd5b80630b18ff66146101c05780630cd4649e146101fd5780631a5057be146102145780631d905d5c146102485780631f60c2bd146102945780633106ab53146102c857600080fd5b366101bb5734603760008282546101819190614750565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101cc57600080fd5b506033546101e0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020957600080fd5b506102126105d4565b005b34801561022057600080fd5b506101e07f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b34801561025457600080fd5b5061027c7f0000000000000000000000000000000000000000000000000000000737be760081565b6040516001600160401b0390911681526020016101f4565b3480156102a057600080fd5b5061027c7f000000000000000000000000000000000000000000000000000000002cb4178081565b3480156102d457600080fd5b506034546102e990600160401b900460ff1681565b60405190151581526020016101f4565b34801561030557600080fd5b5060345461027c906001600160401b031681565b34801561032557600080fd5b506102e9610334366004614784565b603560209081526000928352604080842090915290825290205460ff1681565b34801561036057600080fd5b5061021261036f366004614813565b61073d565b34801561038057600080fd5b506101e07f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b3480156103b457600080fd5b5060385461027c906001600160401b031681565b3480156103d457600080fd5b506103e86103e33660046148e1565b610c69565b6040516101f49190614932565b34801561040157600080fd5b5061042c6104103660046148e1565b600090815260366020526040902054600160c01b900460ff1690565b6040516101f4919061497a565b34801561044557600080fd5b506101e07f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561047957600080fd5b5060335461027c90600160a01b90046001600160401b031681565b6102126104a23660046149c9565b610d16565b3480156104b357600080fd5b506102126104c2366004614a3c565b610ec3565b3480156104d357600080fd5b50610212611291565b3480156104e857600080fd5b506102126104f7366004614ae4565b6112fc565b34801561050857600080fd5b50610212610517366004614b10565b611482565b34801561052857600080fd5b50610212610537366004614c2a565b61165a565b34801561054857600080fd5b50610212610557366004614cfb565b611783565b34801561056857600080fd5b50610212610577366004614ae4565b611b4e565b34801561058857600080fd5b5061027c7f000000000000000000000000000000000000000000000000000000006059f46081565b3480156105bc57600080fd5b506105c660375481565b6040519081526020016101f4565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa15801561063c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106609190614df6565b156106865760405162461bcd60e51b815260040161067d90614e18565b60405180910390fd5b6033546001600160a01b031633146106b05760405162461bcd60e51b815260040161067d90614e75565b603454600160401b900460ff16156106da5760405162461bcd60e51b815260040161067d90614ebd565b6034805460ff60401b1916600160401b179055603354610702906001600160a01b0316611c88565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b031633146107675760405162461bcd60e51b815260040161067d90614e75565b604051635ac86ab760e01b8152600260048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f39190614df6565b156108105760405162461bcd60e51b815260040161067d90614e18565b60335489906001600160401b03600160a01b9091048116908216116108475760405162461bcd60e51b815260040161067d90614f0c565b603454600160401b900460ff166108bf5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b606482015260840161067d565b86851480156108cd57508483145b61095d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a40161067d565b42610973613f486001600160401b038d16614750565b10156109fc5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a40161067d565b60405163d1c64cc960e01b81526001600160401b038b166004820152610aa5907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190614fa7565b8a35610aa060208d018d614fc0565b611cbc565b6000805b88811015610b4957610b2b8c8c358c8c85818110610ac957610ac9615006565b9050602002016020810190610ade919061501c565b8b8b86818110610af057610af0615006565b9050602002810190610b029190614fc0565b8b8b88818110610b1457610b14615006565b9050602002810190610b269190615043565b611e44565b610b359083614750565b915080610b418161508c565b915050610aa9565b5060008113610bd55760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a206f766572666c6f7720696e20746f74616c416d6f756e74546f4260648201526b6552657374616b656457656960a01b608482015260a40161067d565b60335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f9091169063c2c51c4090604401600060405180830381600087803b158015610c4457600080fd5b505af1158015610c58573d6000803e3d6000fd5b505050505050505050505050505050565b610c916040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610cfc57610cfc6148fa565b6002811115610d0d57610d0d6148fa565b90525092915050565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614610d5e5760405162461bcd60e51b815260040161067d906150a7565b346801bc16d674ec80000014610dea5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a40161067d565b7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa6001600160a01b031663228951186801bc16d674ec8000008787610e2d612285565b8888886040518863ffffffff1660e01b8152600401610e5196959493929190615179565b6000604051808303818588803b158015610e6a57600080fd5b505af1158015610e7e573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610eb49291906151c8565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190614df6565b15610f6c5760405162461bcd60e51b815260040161067d90614e18565b8684148015610f7a57508382145b6110025760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f72496e646963657320616e642070726f6f6673206d757374206260648201526c0ca40e6c2daca40d8cadccee8d609b1b608482015260a40161067d565b42611018613f486001600160401b038c16614750565b101561109a5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e76657269667942616c616e63655570646174653a207370908201527f656369666965642074696d657374616d7020697320746f6f2066617220696e206064820152631c185cdd60e21b608482015260a40161067d565b60405163d1c64cc960e01b81526001600160401b038a16600482015261113e907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa15801561110b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f9190614fa7565b8735610aa060208a018a614fc0565b6000805b888110156111e2576111c48b8b8b8481811061116057611160615006565b9050602002016020810190611175919061501c565b8a358a8a8681811061118957611189615006565b905060200281019061119b91906151dc565b8989878181106111ad576111ad615006565b90506020028101906111bf9190615043565b6122ca565b6111ce90836151fc565b9150806111da8161508c565b915050611142565b506033546001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169163c2c51c409116611227633b9aca008561523d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b5050505050505050505050505050565b6033546001600160a01b031633146112bb5760405162461bcd60e51b815260040161067d90614e75565b603454600160401b900460ff16156112e55760405162461bcd60e51b815260040161067d90614ebd565b6033546112fa906001600160a01b0316611c88565b565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16146113445760405162461bcd60e51b815260040161067d906150a7565b611352633b9aca00826152d8565b156113dc5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a40161067d565b60006113ec633b9aca00836152ec565b60348054919250829160009061140c9084906001600160401b0316615300565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161146b91815260200190565b60405180910390a261147d838361273f565b505050565b600054610100900460ff16158080156114a25750600054600160ff909116105b806114bc5750303b1580156114bc575060005460ff166001145b61151f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161067d565b6000805460ff191660011790558015611542576000805461ff0019166101001790555b6001600160a01b0382166115b55760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b606482015260840161067d565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611656576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146116845760405162461bcd60e51b815260040161067d90614e75565b815183511461170f5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a40161067d565b60005b835181101561177d5761176b8284838151811061173157611731615006565b602002602001015186848151811061174b5761174b615006565b60200260200101516001600160a01b03166127499092919063ffffffff16565b806117758161508c565b915050611712565b50505050565b604051635ac86ab760e01b81526004808201819052907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180e9190614df6565b1561182b5760405162461bcd60e51b815260040161067d90614e18565b838614801561183957508588145b801561184457508782145b6118b8576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e677468606482015260840161067d565b60405163d1c64cc960e01b81526001600160401b038c16600482015261195c907f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190614fa7565b8b35610aa060208e018e614fc0565b604080518082019091526000808252602082015260005b83811015611a5c576000611a178d358d8d8581811061199457611994615006565b90506020028101906119a69190615328565b8c8c868181106119b8576119b8615006565b90506020028101906119ca9190614fc0565b8c8c888181106119dc576119dc615006565b90506020028101906119ee9190615043565b8c8c8a818110611a0057611a00615006565b9050602002810190611a129190615043565b61279b565b80518451919250908490611a2c908390614750565b9052506020808201519084018051611a459083906151fc565b905250819050611a548161508c565b915050611973565b50805115611a8b576033548151611a8b916001600160a01b031690611a8690633b9aca009061533f565b612be2565b602081015115611b405760335460208201516001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81169263c2c51c4092911690611ae190633b9aca009061523d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611b2757600080fd5b505af1158015611b3b573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611b785760405162461bcd60e51b815260040161067d90614e75565b603754811115611c295760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c40161067d565b8060376000828254611c3b919061535e565b90915550506040518181526001600160a01b038316907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a26116568282612be2565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755611cb98147612be2565b50565b611cc86003602061533f565b8114611d585760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a40161067d565b611d9d82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925087915060039050612c70565b61177d5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c40161067d565b600080611e83848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611ef257611ef26148fa565b6002811115611f0357611f036148fa565b9052509050600081606001516002811115611f2057611f206148fa565b14611fc95760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c40161067d565b611fd1612285565b611fda90615375565b612016868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cac92505050565b1461209d5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a40161067d565b60006120db868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cc192505050565b90506120eb8a87878b8b8e612cec565b6001606083015264ffffffffff891682526001600160401b038b16604083015261211481612f0d565b6001600160401b03908116602080850191825260008681526036909152604090819020855181549351928701518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606085015185939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156121b6576121b66148fa565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516122519392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b0316612276919061533f565b9b9a5050505050505050505050565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b6000806122db604086013588612fe4565b9050600061231b858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561238a5761238a6148fa565b600281111561239b5761239b6148fa565b815250509050896001600160401b031681604001516001600160401b0316106124525760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a40161067d565b60018160600151600281111561246a5761246a6148fa565b146124d25760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b606482015260840161067d565b6124db8a613019565b6001600160401b031661252087878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310392505050565b6001600160401b0316116125c3576000836001600160401b0316116125c35760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a40161067d565b6125dc8887876125d660208c018c614fc0565b8e612cec565b6125f58860408901356125ef8a80614fc0565b8d61311b565b6020810151600061260585612f0d565b6001600160401b0380821660208087019182528f8316604080890191825260008a8152603690935290912087518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606087015193945086939192839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156126b2576126b26148fa565b0217905550905050816001600160401b0316816001600160401b031614612730576040805164ffffffffff8d1681526001600160401b038e8116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a161272d8183613284565b95505b50505050509695505050505050565b611656828261329c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261147d9084906133b5565b60408051808201909152600080825260208201526127c06127bb89615408565b613487565b6033546001600160401b03600160a01b9091048116908216116127f55760405162461bcd60e51b815260040161067d90614f0c565b60006128036127bb8b615408565b90506000612843888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612c8892505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612870576128706148fa565b14156129275760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c40161067d565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156129e65760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a40161067d565b60008181526035602090815260408083206001600160401b03861684529091529020805460ff19166001179055612a1f8c87878e613497565b6000612a5d878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e7f92505050565b9050612a6d8d8a8a8e8e86612cec565b6000612aab888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e9792505050565b9050612ae98a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061310392505050565b6001600160401b0316612b03612afe8f615408565b613eaf565b6001600160401b031610612bbb57603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352612bb093869388938a936001600160a01b03909316928892916060830190600160c01b900460ff166002811115612b9757612b976148fa565b6002811115612ba857612ba86148fa565b905250613ec1565b955050505050612bd5565b603354612bb090839086906001600160a01b0316846140d2565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8539091169063c0db354c9083906044016000604051808303818588803b158015612c5357600080fd5b505af1158015612c67573d6000803e3d6000fd5b50505050505050565b600083612c7e8685856141b0565b1495945050505050565b600081600081518110612c9d57612c9d615006565b60200260200101519050919050565b600081600181518110612c9d57612c9d615006565b6000612ce682600281518110612cd957612cd9615006565b60200260200101516142fc565b92915050565b612cf860036002615628565b8414612d715760405162461bcd60e51b815260206004820152604e602482015260008051602061579483398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161067d565b6005612d7f60286001614750565b612d899190614750565b612d9490602061533f565b8214612e025760405162461bcd60e51b8152602060048201526043602482015260008051602061579483398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a40161067d565b600064ffffffffff8216612e1860286001614750565b600b901b1790506000612e5d87878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436392505050565b9050612ea385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250859150869050612c70565b612f035760405162461bcd60e51b815260206004820152603d602482015260008051602061579483398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f66000000606482015260840161067d565b5050505050505050565b60007f000000000000000000000000000000000000000000000000000000002cb417806001600160401b0316826001600160401b031611612f5057506000919050565b6000633b9aca0080612f827f000000000000000000000000000000000000000000000000000000002cb4178086615300565b6001600160401b0316612f9591906152ec565b612f9f919061533f565b9050612fdd7f0000000000000000000000000000000000000000000000000000000737be76006001600160401b0316826001600160401b0316614610565b9392505050565b600080612ff2600484615634565b612ffd906040615658565b64ffffffffff16905061301184821b6142fc565b949350505050565b60007f000000000000000000000000000000000000000000000000000000006059f4606001600160401b0316826001600160401b031610156130c35760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e65736973000000000000000000606482015260840161067d565b6130cf600c6020615685565b6130f97f000000000000000000000000000000000000000000000000000000006059f46084615300565b612ce691906156ab565b6000612ce682600781518110612cd957612cd9615006565b600561312960266001614750565b6131339190614750565b61313e90602061533f565b82146131ae5760405162461bcd60e51b815260206004820152604460248201819052600080516020615794833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a40161067d565b60006131bb6004836156d1565b64ffffffffff169050806131d160266001614750565b600c901b17905061321c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250899150859050612c70565b61327c5760405162461bcd60e51b815260206004820152603e602482015260008051602061579483398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f660000606482015260840161067d565b505050505050565b6000612fdd6001600160401b038084169085166156e9565b804710156132ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161067d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613339576040519150601f19603f3d011682016040523d82523d6000602084013e61333e565b606091505b505090508061147d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161067d565b600061340a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166146269092919063ffffffff16565b80519091501561147d57808060200190518101906134289190614df6565b61147d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161067d565b6000612ce68261014001516142fc565b6134a2600280615628565b82146135165760405162461bcd60e51b815260206004820152604960248201526000805160206157b483398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a40161067d565b613522600d6002615628565b61353260c0830160a08401615728565b6001600160401b03161061359c5760405162461bcd60e51b815260206004820152603f60248201526000805160206157b483398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c6172676500606482015260840161067d565b6135a860046002615628565b6135b9610100830160e08401615728565b6001600160401b031610613625576040805162461bcd60e51b81526020600482015260248101919091526000805160206157b483398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c61726765606482015260840161067d565b61363160186002615628565b61364160e0830160c08401615728565b6001600160401b0316106136bb5760405162461bcd60e51b815260206004820152604760248201526000805160206157b483398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a40161067d565b6136c6600480614750565b6136d1906001614750565b6136dc90602061533f565b6136e68280614fc0565b90501461375a5760405162461bcd60e51b815260206004820152604860248201526000805160206157b483398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a40161067d565b61376660046003614750565b61377190602061533f565b61377e6040830183614fc0565b9050146137f85760405162461bcd60e51b815260206004820152604e60248201526000805160206157b483398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161067d565b6138046003602061533f565b6138116020830183614fc0565b90501461387f5760405162461bcd60e51b815260206004820152604260248201526000805160206157b483398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a40161067d565b61388b6004602061533f565b6138986060830183614fc0565b90501461390b5760405162461bcd60e51b815260206004820152604760248201526000805160206157b483398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a40161067d565b600d61391960186001614750565b613924906005614750565b61392f906001614750565b6139399190614750565b61394490602061533f565b6139516080830183614fc0565b9050146139da5760405162461bcd60e51b815260206004820152605860248201526000805160206157b483398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a40161067d565b60006139ec60c0830160a08401615728565b6001600160401b03166000613a03600d6001614750565b613a1360e0860160c08701615728565b6001600160401b0316901b600d613a2c60186001614750565b613a37906001614750565b613a419190614750565b601b901b1717179050613a9c613a5a6080840184614fc0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505061010085013584612c70565b613b0f5760405162461bcd60e51b815260206004820152604a60248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a40161067d565b613b66613b1f6020840184614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250610100880135935061012088013592509050612c70565b613bc65760405162461bcd60e51b815260206004820152603d60248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f66000000606482015260840161067d565b6049613c1e613bd86040850185614fc0565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061010085013561016086013584612c70565b613c905760405162461bcd60e51b815260206004820152604960248201526000805160206157b483398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a40161067d565b50613ce8613ca16060840184614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101608401356101408501356009612c70565b613d565760405162461bcd60e51b8152602060048201526044602482018190526000805160206157b4833981519152908201527f616c3a20496e76616c696420626c6f636b4e756d626572206d65726b6c6520706064820152633937b7b360e11b608482015260a40161067d565b6000613d69610100840160e08501615728565b6001600160401b0316613d7e60046001614750565b600e901b1790506000613dc386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436392505050565b9050613e13613dd28580614fc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101608601358385612c70565b612c675760405162461bcd60e51b815260206004820152604360248201526000805160206157b483398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a40161067d565b6000612ce682600181518110612cd957612cd9615006565b6000612ce682600381518110612cd957612cd9615006565b600060206130f98361012001516142fc565b604080518082019091526000808252602082015260007f0000000000000000000000000000000000000000000000000000000737be76006001600160401b0316846001600160401b03161115613f3857507f0000000000000000000000000000000000000000000000000000000737be7600613f3b565b50825b6040805180820190915260008082526020820152613f598286615300565b6001600160401b039081168252603480548492600091613f7b91859116615743565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550613fad828560200151613284565b602082810191909152600090850152600260608501819052506000888152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115614064576140646148fa565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a2603880548391906000906141639084906001600160401b0316615743565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156141cf5750602084516141cd91906152d8565b155b61425e5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a40161067d565b604080516020808201909252848152905b855181116142f2576142826002856152d8565b6142b5578151600052808601516020526020826040600060026107d05a03fa6142aa57600080fd5b6002840493506142e0565b8086015160005281516020526020826040600060026107d05a03fa6142d957600080fd5b6002840493505b6142eb602082614750565b905061426f565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161437491906152ec565b90506000816001600160401b0381111561439057614390614b2d565b6040519080825280602002602001820160405280156143b9578160200160208202803683370190505b50905060005b828110156144c0576002856143d4838361533f565b815181106143e4576143e4615006565b6020026020010151868360026143fa919061533f565b614405906001614750565b8151811061441557614415615006565b6020026020010151604051602001614437929190918252602082015260400190565b60408051601f19818403018152908290526144519161576e565b602060405180830381855afa15801561446e573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144919190614fa7565b8282815181106144a3576144a3615006565b6020908102919091010152806144b88161508c565b9150506143bf565b506144cc6002836152ec565b91505b81156145ec5760005b828110156145d9576002826144ed838361533f565b815181106144fd576144fd615006565b602002602001015183836002614513919061533f565b61451e906001614750565b8151811061452e5761452e615006565b6020026020010151604051602001614550929190918252602082015260400190565b60408051601f198184030181529082905261456a9161576e565b602060405180830381855afa158015614587573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906145aa9190614fa7565b8282815181106145bc576145bc615006565b6020908102919091010152806145d18161508c565b9150506144d8565b506145e56002836152ec565b91506144cf565b806000815181106145ff576145ff615006565b602002602001015192505050919050565b600081831061461f5781612fdd565b5090919050565b60606130118484600085856001600160a01b0385163b6146885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161067d565b600080866001600160a01b031685876040516146a4919061576e565b60006040518083038185875af1925050503d80600081146146e1576040519150601f19603f3d011682016040523d82523d6000602084013e6146e6565b606091505b50915091506146f6828286614701565b979650505050505050565b60608315614710575081612fdd565b8251156147205782518084602001fd5b8160405162461bcd60e51b815260040161067d9190615780565b634e487b7160e01b600052601160045260246000fd5b600082198211156147635761476361473a565b500190565b80356001600160401b038116811461477f57600080fd5b919050565b6000806040838503121561479757600080fd5b823591506147a760208401614768565b90509250929050565b6000604082840312156147c257600080fd5b50919050565b60008083601f8401126147da57600080fd5b5081356001600160401b038111156147f157600080fd5b6020830191508360208260051b850101111561480c57600080fd5b9250929050565b60008060008060008060008060a0898b03121561482f57600080fd5b61483889614768565b975060208901356001600160401b038082111561485457600080fd5b6148608c838d016147b0565b985060408b013591508082111561487657600080fd5b6148828c838d016147c8565b909850965060608b013591508082111561489b57600080fd5b6148a78c838d016147c8565b909650945060808b01359150808211156148c057600080fd5b506148cd8b828c016147c8565b999c989b5096995094979396929594505050565b6000602082840312156148f357600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061492e57634e487b7160e01b600052602160045260246000fd5b9052565b60006080820190506001600160401b038084511683528060208501511660208401528060408501511660408401525060608301516149736060840182614910565b5092915050565b60208101612ce68284614910565b60008083601f84011261499a57600080fd5b5081356001600160401b038111156149b157600080fd5b60208301915083602082850101111561480c57600080fd5b6000806000806000606086880312156149e157600080fd5b85356001600160401b03808211156149f857600080fd5b614a0489838a01614988565b90975095506020880135915080821115614a1d57600080fd5b50614a2a88828901614988565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614a5857600080fd5b614a6189614768565b975060208901356001600160401b0380821115614a7d57600080fd5b614a898c838d016147c8565b909950975060408b0135915080821115614aa257600080fd5b614aae8c838d016147b0565b965060608b013591508082111561489b57600080fd5b6001600160a01b0381168114611cb957600080fd5b803561477f81614ac4565b60008060408385031215614af757600080fd5b8235614b0281614ac4565b946020939093013593505050565b600060208284031215614b2257600080fd5b8135612fdd81614ac4565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715614b6657614b66614b2d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b9457614b94614b2d565b604052919050565b60006001600160401b03821115614bb557614bb5614b2d565b5060051b60200190565b600082601f830112614bd057600080fd5b81356020614be5614be083614b9c565b614b6c565b82815260059290921b84018101918181019086841115614c0457600080fd5b8286015b84811015614c1f5780358352918301918301614c08565b509695505050505050565b600080600060608486031215614c3f57600080fd5b83356001600160401b0380821115614c5657600080fd5b818601915086601f830112614c6a57600080fd5b81356020614c7a614be083614b9c565b82815260059290921b8401810191818101908a841115614c9957600080fd5b948201945b83861015614cc0578535614cb181614ac4565b82529482019490820190614c9e565b97505087013592505080821115614cd657600080fd5b50614ce386828701614bbf565b925050614cf260408501614ad9565b90509250925092565b60008060008060008060008060008060c08b8d031215614d1a57600080fd5b614d238b614768565b995060208b01356001600160401b0380821115614d3f57600080fd5b614d4b8e838f016147b0565b9a5060408d0135915080821115614d6157600080fd5b614d6d8e838f016147c8565b909a50985060608d0135915080821115614d8657600080fd5b614d928e838f016147c8565b909850965060808d0135915080821115614dab57600080fd5b614db78e838f016147c8565b909650945060a08d0135915080821115614dd057600080fd5b50614ddd8d828e016147c8565b915080935050809150509295989b9194979a5092959850565b600060208284031215614e0857600080fd5b81518015158114612fdd57600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6020808252606f908201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60408201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520666f60608201527f722074696d657374616d70206166746572206d6f7374526563656e745769746860808201526e064726177616c54696d657374616d7608c1b60a082015260c00190565b600060208284031215614fb957600080fd5b5051919050565b6000808335601e19843603018112614fd757600080fd5b8301803591506001600160401b03821115614ff157600080fd5b60200191503681900382131561480c57600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561502e57600080fd5b813564ffffffffff81168114612fdd57600080fd5b6000808335601e1984360301811261505a57600080fd5b8301803591506001600160401b0382111561507457600080fd5b6020019150600581901b360382131561480c57600080fd5b60006000198214156150a0576150a061473a565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561513c578181015183820152602001615124565b8381111561177d5750506000910152565b60008151808452615165816020860160208601615121565b601f01601f19169290920160200192915050565b60808152600061518d60808301888a6150f8565b828103602084015261519f818861514d565b905082810360408401526151b48186886150f8565b915050826060830152979650505050505050565b6020815260006130116020830184866150f8565b60008235605e198336030181126151f257600080fd5b9190910192915050565b600080821280156001600160ff1b038490038513161561521e5761521e61473a565b600160ff1b83900384128116156152375761523761473a565b50500190565b60006001600160ff1b03818413828413808216868404861116156152635761526361473a565b600160ff1b60008712828116878305891216156152825761528261473a565b6000871292508782058712848416161561529e5761529e61473a565b878505871281841616156152b4576152b461473a565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826152e7576152e76152c2565b500690565b6000826152fb576152fb6152c2565b500490565b60006001600160401b03838116908316818110156153205761532061473a565b039392505050565b6000823561017e198336030181126151f257600080fd5b60008160001904831182151516156153595761535961473a565b500290565b6000828210156153705761537061473a565b500390565b805160208083015191908110156147c25760001960209190910360031b1b16919050565b600082601f8301126153aa57600080fd5b81356001600160401b038111156153c3576153c3614b2d565b6153d6601f8201601f1916602001614b6c565b8181528460208386010111156153eb57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610180823603121561541b57600080fd5b615423614b43565b82356001600160401b038082111561543a57600080fd5b61544636838701615399565b8352602085013591508082111561545c57600080fd5b61546836838701615399565b6020840152604085013591508082111561548157600080fd5b61548d36838701615399565b604084015260608501359150808211156154a657600080fd5b6154b236838701615399565b606084015260808501359150808211156154cb57600080fd5b506154d836828601615399565b6080830152506154ea60a08401614768565b60a08201526154fb60c08401614768565b60c082015261550c60e08401614768565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600181815b8085111561557f5781600019048211156155655761556561473a565b8085161561557257918102915b93841c9390800290615549565b509250929050565b60008261559657506001612ce6565b816155a357506000612ce6565b81600181146155b957600281146155c3576155df565b6001915050612ce6565b60ff8411156155d4576155d461473a565b50506001821b612ce6565b5060208310610133831016604e8410600b8410161715615602575081810a612ce6565b61560c8383615544565b80600019048211156156205761562061473a565b029392505050565b6000612fdd8383615587565b600064ffffffffff8084168061564c5761564c6152c2565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561567c5761567c61473a565b02949350505050565b60006001600160401b038083168185168183048111821515161561567c5761567c61473a565b60006001600160401b03808416806156c5576156c56152c2565b92169190910492915050565b600064ffffffffff808416806156c5576156c56152c2565b60008083128015600160ff1b8501841216156157075761570761473a565b6001600160ff1b03840183138116156157225761572261473a565b50500390565b60006020828403121561573a57600080fd5b612fdd82614768565b60006001600160401b038083168185168083038211156157655761576561473a565b01949350505050565b600082516151f2818460208701615121565b602081526000612fdd602083018461514d56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746f426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220250a089a9d82d132551a5c21cef0ddeca55257e52f54a8189aee31305a8d95d264736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212200fdbd2e25973eab45d03ab46d4fda931522c5b45bccd7b63ecf3c38942f8913564736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106103425760003560e01c80635f966f14116101b8578063b134427111610104578063da8be864116100a2578063f16172b01161007c578063f16172b014610906578063f2fde38b14610919578063f698da251461092c578063fabc1cbc1461093457600080fd5b8063da8be864146108cd578063e3b05f2f146108e0578063eea9064b146108f357600080fd5b8063c5e480db116100de578063c5e480db146107ea578063c94b511114610890578063ca661c04146108a3578063cf80873e146108ac57600080fd5b8063b134427114610772578063b7f06ebe14610799578063bb45fef2146107bc57600080fd5b8063778e55f3116101715780638da5cb5b1161014b5780638da5cb5b146107135780639104c3191461072457806399be81c81461073f578063a17884841461075257600080fd5b8063778e55f3146106c25780637f548071146106ed578063886f11951461070057600080fd5b80635f966f141461062c57806360d7faed1461065857806365da12641461066b57806368304835146106945780636d70f7ae146106a7578063715018a6146106ba57600080fd5b806333404396116102925780634fc40b6111610230578063597b36da1161020a578063597b36da146105db5780635ac86ab7146105ee5780635c975abb146106115780635cfe8d2c1461061957600080fd5b80634fc40b61146105c057806350f73e7c146105ca578063595c6a67146105d357600080fd5b80633e28391d1161026c5780633e28391d1461053c578063433773821461055f5780634665bcda146105865780634d50f9a4146105ad57600080fd5b806333404396146104bb57806339b70e38146104ce5780633cdeb5e01461050d57600080fd5b8063136439dd116102ff5780631bbce091116102d95780631bbce0911461044e57806320606b701461046157806328a573ae1461048857806329c77d4f1461049b57600080fd5b8063136439dd146103ef57806316928365146104025780631794bb3c1461043b57600080fd5b806304a4f979146103475780630b9f487a146103815780630dd8dd02146103945780630f589e59146103b457806310d67a2f146103c9578063132d4967146103dc575b600080fd5b61036e7f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce81565b6040519081526020015b60405180910390f35b61036e61038f3660046143d5565b610947565b6103a76103a2366004614474565b610a09565b60405161037891906144b5565b6103c76103c2366004614552565b610d83565b005b6103c76103d73660046145a5565b610ed3565b6103c76103ea3660046145c9565b610f86565b6103c76103fd36600461460a565b611046565b61036e6104103660046145a5565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b6103c76104493660046145c9565b611185565b61036e61045c3660046145c9565b6112ae565b61036e7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103c76104963660046145c9565b6112dc565b61036e6104a93660046145a5565b609b6020526000908152604090205481565b6103c76104c9366004614623565b61138c565b6104f57f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b039091168152602001610378565b6104f561051b3660046145a5565b6001600160a01b039081166000908152609960205260409020600101541690565b61054f61054a3660046145a5565b6114c9565b6040519015158152602001610378565b61036e7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b6104f57f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6103c76105bb36600461460a565b6114e9565b61036e6213c68081565b61036e609d5481565b6103c76115c0565b61036e6105e9366004614963565b611687565b61054f6105fc36600461499f565b606654600160ff9092169190911b9081161490565b60665461036e565b6103c7610627366004614a15565b6116b7565b6104f561063a3660046145a5565b6001600160a01b039081166000908152609960205260409020541690565b6103c7610666366004614b75565b611962565b6104f56106793660046145a5565b609a602052600090815260409020546001600160a01b031681565b60a0546104f5906001600160a01b031681565b61054f6106b53660046145a5565b6119fd565b6103c7611a1d565b61036e6106d0366004614c04565b609860209081526000928352604080842090915290825290205481565b6103c76106fb366004614ce5565b611a31565b6065546104f5906001600160a01b031681565b6033546001600160a01b03166104f5565b6104f573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103c761074d366004614d75565b611b36565b61036e6107603660046145a5565b609f6020526000908152604090205481565b6104f57f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61054f6107a736600461460a565b609e6020526000908152604090205460ff1681565b61054f6107ca366004614daa565b609c60209081526000928352604080842090915290825290205460ff1681565b61085a6107f83660046145a5565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610378565b61036e61089e366004614dd6565b611c08565b61036e61c4e081565b6108bf6108ba3660046145a5565b611cc1565b604051610378929190614e92565b61036e6108db3660046145a5565b612079565b6103c76108ee3660046145a5565b6123d8565b6103c7610901366004614eb7565b612540565b6103c7610914366004614f0f565b61254c565b6103c76109273660046145a5565b6125dd565b61036e612653565b6103c761094236600461460a565b612691565b604080517f3b89fca151cbe5122d58acee86cf184413d751d585779bdd19d3bbfa3a306dce6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e09092019092528051910120600090816109c5612653565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610a3e5760405162461bcd60e51b8152600401610a3590614f2b565b60405180910390fd5b6000836001600160401b03811115610a5857610a586146e6565b604051908082528060200260200182016040528015610a81578160200160208202803683370190505b50905060005b84811015610d7a57858582818110610aa157610aa1614f62565b9050602002810190610ab39190614f78565b610ac1906020810190614f98565b9050868683818110610ad557610ad5614f62565b9050602002810190610ae79190614f78565b610af19080614f98565b905014610b665760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610a35565b6000868683818110610b7a57610b7a614f62565b9050602002810190610b8c9190614f78565b610b9d9060608101906040016145a5565b6001600160a01b03161415610c2b5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a206d7573742070726f766964652076616c6964207769746864726177616c606482015267206164647265737360c01b608482015260a401610a35565b336000818152609a60205260409020546001600160a01b031690610d4a9082898986818110610c5c57610c5c614f62565b9050602002810190610c6e9190614f78565b610c7f9060608101906040016145a5565b8a8a87818110610c9157610c91614f62565b9050602002810190610ca39190614f78565b610cad9080614f98565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150899050818110610cf357610cf3614f62565b9050602002810190610d059190614f78565b610d13906020810190614f98565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506127ed92505050565b838381518110610d5c57610d5c614f62565b60209081029190910101525080610d7281614ff7565b915050610a87565b50949350505050565b336000908152609960205260409020546001600160a01b031615610e1d5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a206f70657261746f722068617320616c72656164792072656769736064820152641d195c995960da1b608482015260a401610a35565b610e273384612b9d565b604080518082019091526060815260006020820152610e493380836000612e39565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610e829190615012565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610ec5929190615064565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190615093565b6001600160a01b0316336001600160a01b031614610f7a5760405162461bcd60e51b8152600401610a35906150b0565b610f83816131f2565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9161480610fe55750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6110015760405162461bcd60e51b8152600401610a35906150fa565b61100a836114c9565b15611041576001600160a01b038084166000908152609a602052604090205416611036818585856132e9565b61103f81613364565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b29190615157565b6110ce5760405162461bcd60e51b8152600401610a3590615174565b606654818116146111475760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a35565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156111a55750600054600160ff909116105b806111bf5750303b1580156111bf575060005460ff166001145b6112225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a35565b6000805460ff191660011790558015611245576000805461ff0019166101001790555b61124f838361341e565b611257613504565b6097556112638461359b565b801561103f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6001600160a01b0383166000908152609b60205260408120546112d385828686611c08565b95945050505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916148061133b5750336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16145b6113575760405162461bcd60e51b8152600401610a35906150fa565b611360836114c9565b15611041576001600160a01b038084166000908152609a602052604090205416611036818585856135ed565b606654600290600490811614156113b55760405162461bcd60e51b8152600401610a3590614f2b565b600260c95414156114085760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a35565b600260c95560005b888110156114b8576114a88a8a8381811061142d5761142d614f62565b905060200281019061143f91906151bc565b89898481811061145157611451614f62565b90506020028101906114639190614f98565b89898681811061147557611475614f62565b9050602002013588888781811061148e5761148e614f62565b90506020020160208101906114a391906151d2565b613668565b6114b181614ff7565b9050611410565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b6114f1613ce2565b61c4e081111561157f5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e7365745769746864726177616c4460448201527f656c6179426c6f636b733a206e65775769746864726177616c44656c6179426c60648201526c0dec6d6e640e8dede40d0d2ced609b1b608482015260a401610a35565b609d5460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a1609d55565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190615157565b6116485760405162461bcd60e51b8152600401610a3590615174565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60008160405160200161169a9190615263565b604051602081830303815290604052805190602001209050919050565b60005b815181101561195e5760008282815181106116d7576116d7614f62565b602002602001015190506000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663cd293f6f846040518263ffffffff1660e01b81526004016117309190615276565b60408051808303816000875af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190615325565b915091508115611950576040808401516001600160a01b0381166000908152609f602052918220805491928291906117a983614ff7565b919050555060006040518060e00160405280846001600160a01b031681526020018760a001516001600160a01b031681526020018760600151600001516001600160a01b03168152602001838152602001876080015163ffffffff1681526020018760000151815260200187602001518152509050600061182982611687565b6000818152609e602052604090205490915060ff16156118bf5760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e6d6967726174655175657565645760448201527f69746864726177616c733a207769746864726177616c20616c72656164792065606482015264786973747360d81b608482015260a401610a35565b6000818152609e602052604090819020805460ff19166001179055517f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f99061190a9083908590615353565b60405180910390a160408051868152602081018390527fdc00758b65eef71dc3780c04ebe36cab6bdb266c3a698187e29e0f0dca012630910160405180910390a1505050505b8360010193505050506116ba565b5050565b6066546002906004908116141561198b5760405162461bcd60e51b8152600401610a3590614f2b565b600260c95414156119de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a35565b600260c9556119f08686868686613668565b5050600160c95550505050565b6001600160a01b0390811660009081526099602052604090205416151590565b611a25613ce2565b611a2f600061359b565b565b4283602001511015611ab55760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610a35565b6000609b6000876001600160a01b03166001600160a01b031681526020019081526020016000205490506000611af18783888860200151611c08565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611b219088908390613d3c565b611b2d87878686612e39565b50505050505050565b611b3f336119fd565b611bc15760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610a35565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611bfc929190615064565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611c7e612653565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f909116906360f4062b90602401602060405180830381865afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d55919061536c565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9909116906394f649dd90602401600060405180830381865afa158015611dc5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ded91908101906153e0565b9150915060008313611e0457909590945092505050565b606080835160001415611ebe576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611e7957611e79614f62565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611ead57611ead614f62565b60200260200101818152505061206c565b8351611ecb9060016154a4565b6001600160401b03811115611ee257611ee26146e6565b604051908082528060200260200182016040528015611f0b578160200160208202803683370190505b50915081516001600160401b03811115611f2757611f276146e6565b604051908082528060200260200182016040528015611f50578160200160208202803683370190505b50905060005b8451811015611fea57848181518110611f7157611f71614f62565b6020026020010151838281518110611f8b57611f8b614f62565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611fbd57611fbd614f62565b6020026020010151828281518110611fd757611fd7614f62565b6020908102919091010152600101611f56565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0826001845161200f91906154bc565b8151811061201f5761201f614f62565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001845161204f91906154bc565b8151811061205f5761205f614f62565b6020026020010181815250505b9097909650945050505050565b606654600090600190600290811614156120a55760405162461bcd60e51b8152600401610a3590614f2b565b6120ae836114c9565b61212e5760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610a35565b6001600160a01b038084166000908152609a602052604090205416612152846119fd565b156121c55760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610a35565b6001600160a01b0384166122415760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610a35565b336001600160a01b03851614806122605750336001600160a01b038216145b8061228757506001600160a01b038181166000908152609960205260409020600101541633145b6122f95760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610a35565b60008061230586611cc1565b9092509050336001600160a01b0387161461235b57826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b03191690556123ce86848185856127ed565b9695505050505050565b6123e0613ce2565b60a0546001600160a01b03161561245f5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e7365745374616b6552656769737460448201527f72793a207374616b65526567697374727920616c7265616479207365740000006064820152608401610a35565b6001600160a01b0381166124ec5760405162461bcd60e51b815260206004820152604860248201527f44656c65676174696f6e4d616e616765722e7365745374616b6552656769737460448201527f72793a207374616b6552656769737472792063616e6e6f74206265207a65726f606482015267206164647265737360c01b608482015260a401610a35565b60a080546001600160a01b0319166001600160a01b0383169081179091556040519081527fce6d874069bceda1867eca9c60636bbf262e15213041658273d803a2b609a51f9060200160405180910390a150565b61104133848484612e39565b612555336119fd565b6125d35760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610a35565b610f833382612b9d565b6125e5613ce2565b6001600160a01b03811661264a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a35565b610f838161359b565b60007f0000000000000000000000000000000000000000000000000000000000007a69461415612684575060975490565b61268c613504565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127089190615093565b6001600160a01b0316336001600160a01b0316146127385760405162461bcd60e51b8152600401610a35906150b0565b6066541981196066541916146127b65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a35565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161117a565b60006001600160a01b0386166128845760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610a35565b60005b8351811015612a93576001600160a01b038616156128dd576128dd86888684815181106128b6576128b6614f62565b60200260200101518685815181106128d0576128d0614f62565b60200260200101516132e9565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b031684828151811061290d5761290d614f62565b60200260200101516001600160a01b031614156129d6577f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f6001600160a01b031663beffbb898885848151811061296657612966614f62565b60200260200101516040518363ffffffff1660e01b815260040161299f9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156129b957600080fd5b505af11580156129cd573d6000803e3d6000fd5b50505050612a8b565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316638c80d4e588868481518110612a1857612a18614f62565b6020026020010151868581518110612a3257612a32614f62565b60200260200101516040518463ffffffff1660e01b8152600401612a58939291906154d3565b600060405180830381600087803b158015612a7257600080fd5b505af1158015612a86573d6000803e3d6000fd5b505050505b600101612887565b506001600160a01b03851615612aac57612aac85613364565b6001600160a01b0386166000908152609f60205260408120805491829190612ad383614ff7565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612b3b82611687565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612b899083908590615353565b60405180910390a198975050505050505050565b6000612bac60208301836145a5565b6001600160a01b03161415612c465760405162461bcd60e51b815260206004820152605460248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a2063616e6e6f742073657420606561726e696e677352656365696064820152737665726020746f207a65726f206164647265737360601b608482015260a401610a35565b6213c680612c5a60608301604084016154f7565b63ffffffff161115612d0f5760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610a35565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612d4b90606084019084016154f7565b63ffffffff161015612de15760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610a35565b6001600160a01b03821660009081526099602052604090208190612e058282615534565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611bfc908490615012565b60665460009060019081161415612e625760405162461bcd60e51b8152600401610a3590614f2b565b612e6b856114c9565b15612ee85760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2073746160448201527f6b657220697320616c7265616479206163746976656c792064656c65676174656064820152601960fa1b608482015260a401610a35565b612ef1846119fd565b612f715760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a206f706560448201527f7261746f72206973206e6f74207265676973746572656420696e20456967656e6064820152642630bcb2b960d91b608482015260a401610a35565b6001600160a01b03808516600090815260996020526040902060010154168015801590612fa75750336001600160a01b03821614155b8015612fbc5750336001600160a01b03861614155b1561312957428460200151101561303b5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610a35565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156130d55760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610a35565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff19166001179055850151613116908890889085908890610947565b905061312782828760000151613d3c565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061318888611cc1565b9150915060005b82518110156131de576131d6888a8584815181106131af576131af614f62565b60200260200101518585815181106131c9576131c9614f62565b60200260200101516135ed565b60010161318f565b506131e887613364565b5050505050505050565b6001600160a01b0381166132805760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a35565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906133209084906154bc565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610ec5939291906154d3565b60a0546001600160a01b031615610f83576040805160018082528183019092526000916020808301908036833701905050905081816000815181106133ab576133ab614f62565b6001600160a01b03928316602091820292909201015260a05460405163ce977ec360e01b815291169063ce977ec3906133e8908490600401615597565b600060405180830381600087803b15801561340257600080fd5b505af1158015613416573d6000803e3d6000fd5b505050505050565b6065546001600160a01b031615801561343f57506001600160a01b03821615155b6134c15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a35565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261195e826131f2565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906136249084906154a4565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610ec5939291906154d3565b60006136766105e9876155d8565b6000818152609e602052604090205490915060ff166136eb5760405162461bcd60e51b815260206004820152603e602482015260008051602061568883398151915260448201527f416374696f6e3a20616374696f6e206973206e6f7420696e20717565756500006064820152608401610a35565b609d54439061370060a0890160808a016154f7565b63ffffffff1661371091906154a4565b11156137985760405162461bcd60e51b8152602060048201526057602482015260008051602061568883398151915260448201527f416374696f6e3a207769746864726177616c44656c6179426c6f636b7320706560648201527f72696f6420686173206e6f742079657420706173736564000000000000000000608482015260a401610a35565b6137a860608701604088016145a5565b6001600160a01b0316336001600160a01b0316146138305760405162461bcd60e51b815260206004820152604b602482015260008051602061568883398151915260448201527f416374696f6e3a206f6e6c7920776974686472617765722063616e20636f6d7060648201526a3632ba329030b1ba34b7b760a91b608482015260a401610a35565b81156138a75761384360a0870187614f98565b851490506138a75760405162461bcd60e51b815260206004820152603d602482015260008051602061568883398151915260448201527f416374696f6e3a20696e707574206c656e677468206d69736d617463680000006064820152608401610a35565b6000818152609e60205260409020805460ff19169055811561397d5760005b6138d360a0880188614f98565b90508110156139775761396f6138ec60208901896145a5565b336138fa60a08b018b614f98565b8581811061390a5761390a614f62565b905060200201602081019061391f91906145a5565b61392c60c08c018c614f98565b8681811061393c5761393c614f62565b905060200201358a8a8781811061395557613955614f62565b905060200201602081019061396a91906145a5565b613ef6565b6001016138c6565b50613ca7565b336000908152609a60205260408120546001600160a01b0316905b6139a560a0890189614f98565b9050811015613c9b5773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06139d060a08a018a614f98565b838181106139e0576139e0614f62565b90506020020160208101906139f591906145a5565b6001600160a01b03161415613b4e576000613a1360208a018a6145a5565b905060006001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16630e81073c83613a5460c08e018e614f98565b87818110613a6457613a64614f62565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adc919061536c565b6001600160a01b038084166000908152609a6020526040902054919250168015613b4657613b3d8184613b1260a08f018f614f98565b88818110613b2257613b22614f62565b9050602002016020810190613b3791906145a5565b856135ed565b613b4681613364565b505050613c93565b6001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9166350ff722533613b8b60a08c018c614f98565b85818110613b9b57613b9b614f62565b9050602002016020810190613bb091906145a5565b613bbd60c08d018d614f98565b86818110613bcd57613bcd614f62565b905060200201356040518463ffffffff1660e01b8152600401613bf2939291906154d3565b600060405180830381600087803b158015613c0c57600080fd5b505af1158015613c20573d6000803e3d6000fd5b505050506001600160a01b03821615613c9357613c938233613c4560a08c018c614f98565b85818110613c5557613c55614f62565b9050602002016020810190613c6a91906145a5565b613c7760c08d018d614f98565b86818110613c8757613c87614f62565b905060200201356135ed565b600101613998565b50613ca581613364565b505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6033546001600160a01b03163314611a2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a35565b6001600160a01b0383163b15613e5657604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90613d7c90869086906004016155ea565b602060405180830381865afa158015613d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dbd9190615647565b6001600160e01b031916146110415760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610a35565b826001600160a01b0316613e6a838361403b565b6001600160a01b0316146110415760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610a35565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01415613fa15760405162387b1360e81b81526001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063387b130090613f6a908890889087906004016154d3565b600060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b50505050614034565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063c608c7f390608401600060405180830381600087803b15801561401b57600080fd5b505af115801561402f573d6000803e3d6000fd5b505050505b5050505050565b600080600061404a858561405f565b91509150614057816140cf565b509392505050565b6000808251604114156140965760208301516040840151606085015160001a61408a8782858561428a565b945094505050506140c8565b8251604014156140c057602083015160408401516140b5868383614377565b9350935050506140c8565b506000905060025b9250929050565b60008160048111156140e3576140e3615671565b14156140ec5750565b600181600481111561410057614100615671565b141561414e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a35565b600281600481111561416257614162615671565b14156141b05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a35565b60038160048111156141c4576141c4615671565b141561421d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a35565b600481600481111561423157614231615671565b1415610f835760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a35565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156142c1575060009050600361436e565b8460ff16601b141580156142d957508460ff16601c14155b156142ea575060009050600461436e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561433e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166143675760006001925092505061436e565b9150600090505b94509492505050565b6000806001600160ff1b0383168161439460ff86901c601b6154a4565b90506143a28782888561428a565b935093505050935093915050565b6001600160a01b0381168114610f8357600080fd5b80356143d0816143b0565b919050565b600080600080600060a086880312156143ed57600080fd5b85356143f8816143b0565b94506020860135614408816143b0565b93506040860135614418816143b0565b94979396509394606081013594506080013592915050565b60008083601f84011261444257600080fd5b5081356001600160401b0381111561445957600080fd5b6020830191508360208260051b85010111156140c857600080fd5b6000806020838503121561448757600080fd5b82356001600160401b0381111561449d57600080fd5b6144a985828601614430565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156144ed578351835292840192918401916001016144d1565b50909695505050505050565b60006060828403121561450b57600080fd5b50919050565b60008083601f84011261452357600080fd5b5081356001600160401b0381111561453a57600080fd5b6020830191508360208285010111156140c857600080fd5b60008060006080848603121561456757600080fd5b61457185856144f9565b925060608401356001600160401b0381111561458c57600080fd5b61459886828701614511565b9497909650939450505050565b6000602082840312156145b757600080fd5b81356145c2816143b0565b9392505050565b6000806000606084860312156145de57600080fd5b83356145e9816143b0565b925060208401356145f9816143b0565b929592945050506040919091013590565b60006020828403121561461c57600080fd5b5035919050565b6000806000806000806000806080898b03121561463f57600080fd5b88356001600160401b038082111561465657600080fd5b6146628c838d01614430565b909a50985060208b013591508082111561467b57600080fd5b6146878c838d01614430565b909850965060408b01359150808211156146a057600080fd5b6146ac8c838d01614430565b909650945060608b01359150808211156146c557600080fd5b506146d28b828c01614430565b999c989b5096995094979396929594505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b038111828210171561471e5761471e6146e6565b60405290565b604080519081016001600160401b038111828210171561471e5761471e6146e6565b60405160c081016001600160401b038111828210171561471e5761471e6146e6565b604051601f8201601f191681016001600160401b0381118282101715614790576147906146e6565b604052919050565b63ffffffff81168114610f8357600080fd5b80356143d081614798565b60006001600160401b038211156147ce576147ce6146e6565b5060051b60200190565b600082601f8301126147e957600080fd5b813560206147fe6147f9836147b5565b614768565b82815260059290921b8401810191818101908684111561481d57600080fd5b8286015b84811015614841578035614834816143b0565b8352918301918301614821565b509695505050505050565b600082601f83011261485d57600080fd5b8135602061486d6147f9836147b5565b82815260059290921b8401810191818101908684111561488c57600080fd5b8286015b848110156148415780358352918301918301614890565b600060e082840312156148b957600080fd5b6148c16146fc565b90506148cc826143c5565b81526148da602083016143c5565b60208201526148eb604083016143c5565b604082015260608201356060820152614906608083016147aa565b608082015260a08201356001600160401b038082111561492557600080fd5b614931858386016147d8565b60a084015260c084013591508082111561494a57600080fd5b506149578482850161484c565b60c08301525092915050565b60006020828403121561497557600080fd5b81356001600160401b0381111561498b57600080fd5b614997848285016148a7565b949350505050565b6000602082840312156149b157600080fd5b813560ff811681146145c257600080fd5b6000604082840312156149d457600080fd5b6149dc614724565b905081356149e9816143b0565b815260208201356bffffffffffffffffffffffff81168114614a0a57600080fd5b602082015292915050565b60006020808385031215614a2857600080fd5b82356001600160401b0380821115614a3f57600080fd5b818501915085601f830112614a5357600080fd5b8135614a616147f9826147b5565b81815260059190911b83018401908481019088831115614a8057600080fd5b8585015b83811015614b5a57803585811115614a9c5760008081fd5b860160e0818c03601f1901811315614ab45760008081fd5b614abc614746565b8983013588811115614ace5760008081fd5b614adc8e8c838701016147d8565b82525060408084013589811115614af35760008081fd5b614b018f8d8388010161484c565b8c840152506060614b138186016143c5565b8284015260809150614b278f8387016149c2565b90830152614b3760c085016147aa565b90820152614b468383016143c5565b60a082015285525050918601918601614a84565b5098975050505050505050565b8015158114610f8357600080fd5b600080600080600060808688031215614b8d57600080fd5b85356001600160401b0380821115614ba457600080fd5b9087019060e0828a031215614bb857600080fd5b90955060208701359080821115614bce57600080fd5b50614bdb88828901614430565b909550935050604086013591506060860135614bf681614b67565b809150509295509295909350565b60008060408385031215614c1757600080fd5b8235614c22816143b0565b91506020830135614c32816143b0565b809150509250929050565b600060408284031215614c4f57600080fd5b614c57614724565b905081356001600160401b0380821115614c7057600080fd5b818401915084601f830112614c8457600080fd5b8135602082821115614c9857614c986146e6565b614caa601f8301601f19168201614768565b92508183528681838601011115614cc057600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a08688031215614cfd57600080fd5b8535614d08816143b0565b94506020860135614d18816143b0565b935060408601356001600160401b0380821115614d3457600080fd5b614d4089838a01614c3d565b94506060880135915080821115614d5657600080fd5b50614d6388828901614c3d565b95989497509295608001359392505050565b60008060208385031215614d8857600080fd5b82356001600160401b03811115614d9e57600080fd5b6144a985828601614511565b60008060408385031215614dbd57600080fd5b8235614dc8816143b0565b946020939093013593505050565b60008060008060808587031215614dec57600080fd5b8435614df7816143b0565b9350602085013592506040850135614e0e816143b0565b9396929550929360600135925050565b600081518084526020808501945080840160005b83811015614e575781516001600160a01b031687529582019590820190600101614e32565b509495945050505050565b600081518084526020808501945080840160005b83811015614e5757815187529582019590820190600101614e76565b604081526000614ea56040830185614e1e565b82810360208401526112d38185614e62565b600080600060608486031215614ecc57600080fd5b8335614ed7816143b0565b925060208401356001600160401b03811115614ef257600080fd5b614efe86828701614c3d565b925050604084013590509250925092565b600060608284031215614f2157600080fd5b6145c283836144f9565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235605e19833603018112614f8e57600080fd5b9190910192915050565b6000808335601e19843603018112614faf57600080fd5b8301803591506001600160401b03821115614fc957600080fd5b6020019150600581901b36038213156140c857600080fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561500b5761500b614fe1565b5060010190565b606081018235615021816143b0565b6001600160a01b03908116835260208401359061503d826143b0565b166020830152604083013561505181614798565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156150a557600080fd5b81516145c2816143b0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561516957600080fd5b81516145c281614b67565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de19833603018112614f8e57600080fd5b6000602082840312156151e457600080fd5b81356145c281614b67565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261524a60e0850182614e1e565b905060c083015184820360c08601526112d38282614e62565b6020815260006145c260208301846151ef565b602081526000825160e06020840152615293610100840182614e1e565b90506020840151601f198483030160408501526152b08282614e62565b915050604084015160018060a01b03808216606086015260608601519150808251166080860152506bffffffffffffffffffffffff60208201511660a085015250608084015161530860c085018263ffffffff169052565b5060a08401516001600160a01b03811660e0850152509392505050565b6000806040838503121561533857600080fd5b825161534381614b67565b6020939093015192949293505050565b82815260406020820152600061499760408301846151ef565b60006020828403121561537e57600080fd5b5051919050565b600082601f83011261539657600080fd5b815160206153a66147f9836147b5565b82815260059290921b840181019181810190868411156153c557600080fd5b8286015b8481101561484157805183529183019183016153c9565b600080604083850312156153f357600080fd5b82516001600160401b038082111561540a57600080fd5b818501915085601f83011261541e57600080fd5b8151602061542e6147f9836147b5565b82815260059290921b8401810191818101908984111561544d57600080fd5b948201945b83861015615474578551615465816143b0565b82529482019490820190615452565b9188015191965090935050508082111561548d57600080fd5b5061549a85828601615385565b9150509250929050565b600082198211156154b7576154b7614fe1565b500190565b6000828210156154ce576154ce614fe1565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561550957600080fd5b81356145c281614798565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561553f816143b0565b6155498183615514565b5060018101602083013561555c816143b0565b6155668183615514565b50604083013561557581614798565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b6020808252825182820181905260009190848201906040850190845b818110156144ed5783516001600160a01b0316835292840192918401916001016155b3565b60006155e436836148a7565b92915050565b82815260006020604081840152835180604085015260005b8181101561561e57858101830151858201606001528201615602565b81811115615630576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561565957600080fd5b81516001600160e01b0319811681146145c257600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e636f6d706c657465517565756564a2646970667358221220cdfcc1af5fed5190052ce3d637e549cf07d10070c3b14546ab58e142da57c70d64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea2646970667358221220a22223d3e2a2d861ad54e68b7bc44b4d82a5a12a0bcca5c3404502bb1b430c5c64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cb578063e5db06c014610404578063eb990c5914610424578063ecb7cb1b14610444578063f2fde38b14610471578063fabc1cbc1461049157600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ab57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196b565b6104b1565b005b34801561017e57600080fd5b5061017061018d36600461198f565b61056d565b34801561019e57600080fd5b506101b26101ad36600461196b565b6106ac565b6040516101bf91906119c6565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196b565b6108a7565b3480156101f457600080fd5b5061021c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f36600461198f565b6109ed565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109fe565b34801561029957600080fd5b506102bd6102a8366004611a13565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac5565b34801561030357600080fd5b506102bd610312366004611a36565b610ad9565b34801561032357600080fd5b50610337610332366004611a36565b610b5c565b6040516101bf9190611a62565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a70565b610bdc565b3480156103a157600080fd5b5061026a61c4e081565b3480156103b757600080fd5b506101706103c636600461198f565b610e9c565b3480156103d757600080fd5b5061026a6103e636600461196b565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041057600080fd5b5061017061041f366004611a36565b610f30565b34801561043057600080fd5b5061017061043f366004611aa9565b610fc5565b34801561045057600080fd5b5061046461045f36600461196b565b6110ed565b6040516101bf9190611aef565b34801561047d57600080fd5b5061017061048c36600461196b565b6111a7565b34801561049d57600080fd5b506101706104ac36600461198f565b61121d565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b45565b6001600160a01b0316336001600160a01b0316146105615760405162461bcd60e51b815260040161055890611b62565b60405180910390fd5b61056a81611379565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190611bac565b6105f55760405162461bcd60e51b815260040161055890611bce565b6098548181161461066e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106d98383611c2c565b90508060005b82811015610785576001600160a01b038716600090815260ca6020526040812060010161070c8388611c43565b8154811061071c5761071c611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076291611c43565b4310156107725781925050610785565b508061077d81611c71565b9150506106df565b508060008167ffffffffffffffff8111156107a2576107a2611c8c565b6040519080825280602002602001820160405280156107e757816020015b60408051808201909152600080825260208201528152602001906001900390816107c05790505b509050811561089c5760005b8281101561089a576001600160a01b038916600090815260ca602052604090206001016108208289611c43565b8154811061083057610830611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087c5761087c611c5b565b6020026020010181905250808061089290611c71565b9150506107f3565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d48383611c2c565b905060008167ffffffffffffffff8111156108f1576108f1611c8c565b60405190808252806020026020018201604052801561093657816020015b604080518082019091526000808252602082015281526020019060019003908161090f5790505b50905060005b828110156109e3576001600160a01b038716600090815260ca602052604090206001016109698287611c43565b8154811061097957610979611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c5576109c5611c5b565b602002602001018190525080806109db90611c71565b91505061093c565b5095945050505050565b6109f5611470565b61056a816114ca565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a9190611bac565b610a865760405162461bcd60e51b815260040161055890611bce565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610acd611470565b610ad76000611591565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b53575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2c57610b2c611c5b565b600091825260209091200154610b4f9190600160e01b900463ffffffff16611c43565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9d57610b9d611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f169063a38406a390602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611b45565b6001600160a01b031614610ce65760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610558565b60985460009060019081161415610d0f5760405162461bcd60e51b815260040161055890611ca2565b6001600160a01b038316610da55760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610558565b346001600160e01b03811615610e95576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5691611c2c565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610eef5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610f1d5760405162461bcd60e51b815260040161055890611ca2565b610f2733836115e3565b50506001606555565b60026065541415610f835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610558565b600260655560985460009060019081161415610fb15760405162461bcd60e51b815260040161055890611ca2565b610fbb83836115e3565b5050600160655550565b600054610100900460ff1615808015610fe55750600054600160ff909116105b80610fff5750303b158015610fff575060005460ff166001145b6110625760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610558565b6000805460ff191660011790558015611085576000805461ff0019166101001790555b61108e85611591565b611098848461174e565b6110a1826114ca565b8015610e95576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119957600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114d565b505050915250909392505050565b6111af611470565b6001600160a01b0381166112145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610558565b61056a81611591565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112949190611b45565b6001600160a01b0316336001600160a01b0316146112c45760405162461bcd60e51b815260040161055890611b62565b6098541981196098541916146113425760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610558565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a1565b6001600160a01b0381166114075760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610558565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610558565b61c4e08111156115505760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610558565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161c57508161161a8285611c43565b105b156116c9576001600160a01b038616600090815260ca602052604081206001016116468386611c43565b8154811061165657611656611c5b565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169c91611c43565b4310156116a957506116c9565b80516116be906001600160e01b031686611c43565b945050600101611605565b6116d38184611c43565b6001600160a01b038716600090815260ca602052604090205583156116fc576116fc8685611838565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb094386856117298487611c43565b604080516001600160a01b039094168452602084019290925290820152606001610e8b565b6097546001600160a01b031615801561176f57506001600160a01b03821615155b6117f15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610558565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261183482611379565b5050565b804710156118885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610558565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d5576040519150601f19603f3d011682016040523d82523d6000602084013e6118da565b606091505b50509050806119515760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610558565b505050565b6001600160a01b038116811461056a57600080fd5b60006020828403121561197d57600080fd5b813561198881611956565b9392505050565b6000602082840312156119a157600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a06576119f68483516119a8565b92840192908501906001016119e3565b5091979650505050505050565b600060208284031215611a2557600080fd5b813560ff8116811461198857600080fd5b60008060408385031215611a4957600080fd5b8235611a5481611956565b946020939093013593505050565b60408101610b5682846119a8565b60008060408385031215611a8357600080fd5b8235611a8e81611956565b91506020830135611a9e81611956565b809150509250929050565b60008060008060808587031215611abf57600080fd5b8435611aca81611956565b93506020850135611ada81611956565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089a57611b318286516119a8565b938501936001939093019290820190611b1e565b600060208284031215611b5757600080fd5b815161198881611956565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bbe57600080fd5b8151801515811461198857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c3e57611c3e611c16565b500390565b60008219821115611c5657611c56611c16565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8557611c85611c16565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea26469706673582212207b53abbb96e06b03175441e64ced2499614fc0a3f64f5b8b831996e0e25b8d8264736f6c634300080c0033","storage":{}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea26469706673582212209882247b872d905a05380b42c11d1716ad43e9b19643a0cf588a80c0958bf20d64736f6c634300080c0033","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9a676e781a523b5d0c0e43731313a708cb607508","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80637259a45c1161011a578063d7b7fa13116100ad578063e58398361161007c578063e5839836146105ea578063e921d4fa146105fd578063f2fde38b14610626578063f73b751914610639578063fabc1cbc1461064c57600080fd5b8063d7b7fa13146104b8578063d98128c01461056a578063da16e29b1461057d578063df5cf723146105c357600080fd5b8063886f1195116100e9578063886f1195146104585780638da5cb5b1461046b578063a49db7321461047c578063c747075b146104a557600080fd5b80637259a45c146103ef5780637cf72bba146104025780638105e04314610415578063855fcc4a1461042857600080fd5b806338c8ee64116101925780635c975abb116101615780635c975abb1461037c5780636f0c2f741461038e578063715018a6146103d4578063723e59c7146103dc57600080fd5b806338c8ee64146102ef57806339b70e3814610302578063595c6a67146103415780635ac86ab71461034957600080fd5b80631794bb3c116101ce5780631794bb3c1461024e5780631874e5ae14610261578063282670fc1461028e57806335571676146102c557600080fd5b80630ffabbce1461020057806310d67a2f14610215578063136439dd14610228578063175d32051461023b575b600080fd5b61021361020e3660046126e6565b61065f565b005b61021361022336600461271b565b61078f565b610213610236366004612738565b610842565b6102136102493660046126e6565b610981565b61021361025c366004612751565b610aab565b61027461026f3660046126e6565b610bc9565b60405163ffffffff90911681526020015b60405180910390f35b6102a161029c366004612792565b610c14565b60408051825163ffffffff9081168252602093840151169281019290925201610285565b6102d86102d3366004612792565b610c8b565b604080519215158352602083019190915201610285565b6102136102fd36600461271b565b610cba565b6103297f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b039091168152602001610285565b610213610d88565b61036c6103573660046127be565b606654600160ff9092169190911b9081161490565b6040519015158152602001610285565b6066545b604051908152602001610285565b61027461039c3660046127e1565b6001600160a01b039182166000908152609760209081526040808320939094168252919091522054600160201b900463ffffffff1690565b610213610e4f565b6103806103ea3660046126e6565b610e63565b6102746103fd3660046126e6565b610f73565b61021361041036600461281a565b610fc3565b61036c61042336600461288f565b61100d565b61043b6104363660046127e1565b61116f565b604080519315158452602084019290925290820152606001610285565b606554610329906001600160a01b031681565b6033546001600160a01b0316610329565b61038061048a36600461271b565b6001600160a01b03166000908152609a602052604090205490565b6102136104b33660046128cd565b6111b2565b61053b6104c63660046127e1565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0395861681526097835283812094909516855292815292819020815192830182525463ffffffff8082168452600160201b8204811694840194909452600160401b90049092169181019190915290565b60408051825163ffffffff90811682526020808501518216908301529282015190921690820152606001610285565b61036c6105783660046127e1565b611405565b61027461058b3660046127e1565b6001600160a01b039182166000908152609760209081526040808320939094168252919091522054600160401b900463ffffffff1690565b6103297f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61036c6105f836600461271b565b611451565b61038061060b36600461271b565b6001600160a01b031660009081526099602052604090205490565b61021361063436600461271b565b6115c7565b61021361064736600461271b565b61163d565b61021361065a366004612738565b61176c565b6001600160a01b03821660009081526097602090815260408083203384529091529020548290600160201b900463ffffffff908116146106ba5760405162461bcd60e51b81526004016106b19061291a565b60405180910390fd5b6106c58343846118c8565b6106e7336001600160a01b038516600090815260996020526040902090611c5e565b61077f5760405162461bcd60e51b815260206004820152605760248201527f536c61736865722e7265636f72644c6173745374616b65557064617465416e6460448201527f5265766f6b65536c617368696e674162696c6974793a2052656d6f76696e672060648201527f6d6964646c657761726520756e7375636365737366756c000000000000000000608482015260a4016106b1565b61078a833384611cf8565b505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108069190612990565b6001600160a01b0316336001600160a01b0316146108365760405162461bcd60e51b81526004016106b1906129ad565b61083f81611e03565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae91906129f7565b6108ca5760405162461bcd60e51b81526004016106b190612a19565b606654818116146109435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b1565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b606654600190600290811614156109aa5760405162461bcd60e51b81526004016106b190612a61565b6001600160a01b03831660009081526097602090815260408083203384529091529020548390600160201b900463ffffffff908116146109fc5760405162461bcd60e51b81526004016106b19061291a565b610a078443856118c8565b610a29336001600160a01b038616600090815260996020526040902090611efa565b610aa55760405162461bcd60e51b815260206004820152604160248201527f536c61736865722e7265636f726446697273745374616b655570646174653a2060448201527f417070656e64696e67206d6964646c657761726520756e7375636365737366756064820152601b60fa1b608482015260a4016106b1565b50505050565b600054610100900460ff1615808015610acb5750600054600160ff909116105b80610ae55750303b158015610ae5575060005460ff166001145b610b485760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b1565b6000805460ff191660011790558015610b6b576000805461ff0019166101001790555b610b758383611f08565b610b7e84611fee565b8015610aa5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6001600160a01b0382166000908152609a60205260408120805463ffffffff8416908110610bf957610bf9612a98565b60009182526020909120015463ffffffff1690505b92915050565b60408051808201909152600080825260208201526001600160a01b0383166000908152609a60205260409020805483908110610c5257610c52612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b90910416918101919091529392505050565b6001600160a01b03821660009081526099602052604081208190610caf9084612040565b915091509250929050565b60665460029060049081161415610ce35760405162461bcd60e51b81526004016106b190612a61565b610ced8233611405565b610d7a5760405162461bcd60e51b815260206004820152605260248201527f536c61736865722e667265657a654f70657261746f723a206d73672e73656e6460448201527f657220646f6573206e6f742068617665207065726d697373696f6e20746f20736064820152713630b9b4103a3434b99037b832b930ba37b960711b608482015260a4016106b1565b610d84823361204f565b5050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df491906129f7565b610e105760405162461bcd60e51b81526004016106b190612a19565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610e576120c1565b610e616000611fee565b565b6001600160a01b038281166000818152609960209081526040808320838052600190810183528184209084528252808320549383526097825280832094841683529390529182205463ffffffff848116600160401b909204161115610ecc576000915050610c0e565b6001600160a01b0384166000908152609960205260408120610eee908361211b565b9150505b8015801590610f3657506001600160a01b0385811660009081526097602090815260408083209386168352929052205463ffffffff858116600160401b9092041611155b15610f6b576001600160a01b03851660009081526099602052604090209091508190610f62908261211b565b9150610ef29050565b509392505050565b6001600160a01b0382166000908152609a60205260408120805463ffffffff8416908110610fa357610fa3612a98565b600091825260209091200154600160201b900463ffffffff169392505050565b610fcb6120c1565b60005b8181101561078a57611005838383818110610feb57610feb612a98565b9050602002016020810190611000919061271b565b61212a565b600101610fce565b6001600160a01b0383166000908152609a602052604081205461103257506001611168565b6001600160a01b0384166000908152609a6020526040812080548490811061105c5761105c612a98565b60009182526020918290206040805180820190915291015463ffffffff808216808452600160201b909204811693830193909352909250908516108015906110ba57506001600160a01b038516600090815260996020526040902054155b15611136576001600160a01b0385166000908152609a6020526040902080546110e590600190612ac4565b815481106110f5576110f5612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b909104811691909201819052439091161191506111689050565b806000015163ffffffff168463ffffffff161080156111645750806020015163ffffffff164363ffffffff16115b9150505b9392505050565b6001600160a01b0382166000908152609960205260408120819081906111a49061119f866001600160a01b031690565b612194565b9250925092505b9250925092565b6001600160a01b03841660009081526097602090815260408083203384529091529020548490600160201b900463ffffffff908116146112045760405162461bcd60e51b81526004016106b19061291a565b438463ffffffff16111561128a5760405162461bcd60e51b815260206004820152604160248201527f536c61736865722e7265636f72645374616b655570646174653a2063616e6e6f60448201527f742070726f766964652075706461746520666f722066757475726520626c6f636064820152606b60f81b608482015260a4016106b1565b6112958585856118c8565b6001600160a01b038516600090815260996020526040902054600114611359576112d7336001600160a01b038716600090815260996020526040902090611c5e565b6113495760405162461bcd60e51b815260206004820152603b60248201527f536c61736865722e7265636f72645374616b655570646174653a2052656d6f7660448201527f696e67206d6964646c657761726520756e7375636365737366756c000000000060648201526084016106b1565b6113548585846121e4565b6113fe565b336001600160a01b038616600090815260996020908152604080832083805260019081018352818420908452909152902054146113fe5760405162461bcd60e51b815260206004820152603960248201527f536c61736865722e7265636f72645374616b655570646174653a2043616c6c6560448201527f72206973206e6f7420746865206c69737420656e7472616e740000000000000060648201526084016106b1565b5050505050565b6001600160a01b038281166000908152609760209081526040808320938516835292905290812054600160201b900463ffffffff1643101561144957506001610c0e565b506000610c0e565b6001600160a01b03811660009081526098602052604081205460ff161561147a57506001919050565b604051633e28391d60e01b81526001600160a01b0383811660048301527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91690633e28391d90602401602060405180830381865afa1580156114e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150491906129f7565b156115ba57604051631976849960e21b81526001600160a01b0383811660048301526000917f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9909116906365da126490602401602060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612990565b6001600160a01b031660009081526098602052604090205460ff169392505050565b506000919050565b919050565b6115cf6120c1565b6001600160a01b0381166116345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b1565b61083f81611fee565b606654600090600190811614156116665760405162461bcd60e51b81526004016106b190612a61565b6040516336b87bd760e11b81523360048201527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc96001600160a01b031690636d70f7ae90602401602060405180830381865afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee91906129f7565b611762576040805162461bcd60e51b81526020600482015260248101919091527f536c61736865722e6f7074496e746f536c617368696e673a206d73672e73656e60448201527f646572206973206e6f7420612072656769737465726564206f70657261746f7260648201526084016106b1565b610d84338361249b565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e39190612990565b6001600160a01b0316336001600160a01b0316146118135760405162461bcd60e51b81526004016106b1906129ad565b6066541981196066541916146118915760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b1565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610976565b6001600160a01b038316600090815260976020908152604080832033845290915290205463ffffffff808416600160401b9092041611156119845760405162461bcd60e51b815260206004820152604a60248201527f536c61736865722e5f7265636f7264557064617465416e64416464546f4d696460448201527f646c657761726554696d65733a2063616e2774207075736820612070726576696064820152696f75732075706461746560b01b608482015260a4016106b1565b6001600160a01b0383166000818152609760209081526040808320338452825280832080546bffffffff00000000000000001916600160401b63ffffffff89160217905580518082018252838152808301849052938352609a9091529020548015611a51576001600160a01b0385166000908152609a60205260409020611a0c600183612ac4565b81548110611a1c57611a1c612a98565b60009182526020918290206040805180820190915291015463ffffffff8082168352600160201b909104169181019190915291505b60008290506000836020015163ffffffff168563ffffffff161115611a80575063ffffffff8416602082015260015b6001600160a01b038716600090815260996020526040902054611aae575063ffffffff851681526001611b83565b336001600160a01b0388166000908152609960209081526040808320838052600190810183528184209084529091529020541415611b8357600080611b0b336001600160a01b038b1660009081526099602052604090209061211b565b915091508115611b72576001600160a01b03898116600090815260976020908152604080832093851683529290522054600160401b900463ffffffff908116908916811015611b625763ffffffff81168552611b6c565b63ffffffff891685525b50611b7c565b63ffffffff881684525b6001925050505b8015611c55576001600160a01b0387166000818152609a6020908152604082208054600181810183558285528385208851920180549489015163ffffffff908116600160201b0267ffffffffffffffff199096169316929092179390931790559290915290547f1b62ba64c72d01e41a2b8c46e6aeeff728ef3a4438cf1cac3d92ee12189d5649918991611c179190612ac4565b8451602080870151604080516001600160a01b0390961686529185019390935263ffffffff9182169084015216606082015260800160405180910390a15b50505050505050565b6000811580611c745750611c728383612506565b155b15611c8157506000610c0e565b600082815260018481016020908152604080842084805290915280832054828452922054611cb3928692909190612582565b60008281526001848101602090815260408084208480529091528083208390558183528220829055845490918591611cec908490612ac4565b90915550919392505050565b63ffffffff8181161415611d825760405162461bcd60e51b8152602060048201526044602482018190527f536c61736865722e5f7265766f6b65536c617368696e674162696c6974793a20908201527f7365727665556e74696c426c6f636b2074696d65206d757374206265206c696d6064820152631a5d195960e21b608482015260a4016106b1565b6001600160a01b03838116600081815260976020908152604080832094871680845294825291829020805467ffffffff000000001916600160201b63ffffffff88169081029190911790915591519182527f9aa1b1391f35c672ed1f3b7ece632f4513e618366bef7a2f67b7c6bc1f2d2b14910160405180910390a3505050565b6001600160a01b038116611e915760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b1565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611168838360006125b7565b6065546001600160a01b0316158015611f2957506001600160a01b03821615155b611fab5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b1565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610d8482611e03565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080610caf848460006125ce565b6001600160a01b03821660009081526098602052604090205460ff16610d84576001600160a01b03808316600081815260986020526040808220805460ff1916600117905551928416927f444a84f512816ae7be8ed8a66aa88e362eb54d0988e83acc9d81746622b3ba519190a35050565b6033546001600160a01b03163314610e615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b1565b600080610caf848460016125ce565b6001600160a01b03811660009081526098602052604090205460ff161561083f576001600160a01b038116600081815260986020526040808220805460ff19169055517fd4cef0af27800d466fcacd85779857378b85cb61569005ff1464fa6e5ced69d89190a250565b60008060006121a38585612506565b6121b5575060009150819050806111ab565b5050506000818152600183810160209081526040808420848052909152808320548284529220549091906111ab565b6000811561238e576001600160a01b038416600090815260996020526040902061220e9083612506565b612216575060015b8015801561225857506001600160a01b0384811660009081526097602090815260408083209386168352929052205463ffffffff848116600160401b90920416115b15612261575060015b806122d8576001600160a01b0384166000908152609960205260408120819061228a908561211b565b9150915081156122d5576001600160a01b0386811660009081526097602090815260408083209385168352929052205463ffffffff868116600160401b90920416116122d557600192505b50505b80612377576001600160a01b0384166000908152609960205260409020612300908333612617565b6123725760405162461bcd60e51b815260206004820152603c60248201527f536c61736865722e7265636f72645374616b655570646174653a20496e73657260448201527f74696e67206d6964646c657761726520756e7375636365737366756c0000000060648201526084016106b1565b610aa5565b6123818484610e63565b91506123728484846121e4565b6001600160a01b03848116600090815260976020908152604080832060998352818420848052600190810184528285209085528352818420549094168352929052205463ffffffff848116600160401b90920416116123eb575060015b8061248457612412336001600160a01b038616600090815260996020526040902090612626565b6123725760405162461bcd60e51b815260206004820152603e60248201527f536c61736865722e7265636f72645374616b655570646174653a20507265707060448201527f656e64696e67206d6964646c657761726520756e7375636365737366756c000060648201526084016106b1565b61248e8484610e63565b9150610aa58484846121e4565b6001600160a01b03808316600081815260976020908152604080832094861680845294909152808220805467ffffffff00000000191667ffffffff00000000179055517fefa9fb38e813d53c15edf501e03852843a3fed691960523391d71a092b3627d89190a35050565b6000818152600183016020908152604080832083805290915281205415801561254957506000828152600180850160209081526040808420928452919052902054155b1561257a57600080805260018085016020908152604080842092845291905290205482141561144957506001610c0e565b506001610c0e565b600082815260019094016020818152604080872093158088529382528087208690559486529081528385209115855252912055565b60006125c68460008585612634565b949350505050565b6000806125db8585612506565b6125ea5750600090508061260f565b5050600082815260018401602090815260408083208415158452909152902054801515905b935093915050565b60006125c68484846001612634565b6000611168838360016125b7565b60006126408584612506565b15801561265257506126528585612506565b156126b25760008481526001860160209081526040808320851515845290915290205461268186868686612582565b61268d86858386612582565b60018660000160008282546126a29190612adb565b90915550600192506125c6915050565b506000949350505050565b6001600160a01b038116811461083f57600080fd5b803563ffffffff811681146115c257600080fd5b600080604083850312156126f957600080fd5b8235612704816126bd565b9150612712602084016126d2565b90509250929050565b60006020828403121561272d57600080fd5b8135611168816126bd565b60006020828403121561274a57600080fd5b5035919050565b60008060006060848603121561276657600080fd5b8335612771816126bd565b92506020840135612781816126bd565b929592945050506040919091013590565b600080604083850312156127a557600080fd5b82356127b0816126bd565b946020939093013593505050565b6000602082840312156127d057600080fd5b813560ff8116811461116857600080fd5b600080604083850312156127f457600080fd5b82356127ff816126bd565b9150602083013561280f816126bd565b809150509250929050565b6000806020838503121561282d57600080fd5b823567ffffffffffffffff8082111561284557600080fd5b818501915085601f83011261285957600080fd5b81358181111561286857600080fd5b8660208260051b850101111561287d57600080fd5b60209290920196919550909350505050565b6000806000606084860312156128a457600080fd5b83356128af816126bd565b92506128bd602085016126d2565b9150604084013590509250925092565b600080600080608085870312156128e357600080fd5b84356128ee816126bd565b93506128fc602086016126d2565b925061290a604086016126d2565b9396929550929360600135925050565b60208082526050908201527f536c61736865722e6f6e6c7952656769737465726564466f725365727669636560408201527f3a204f70657261746f7220686173206e6f74206f7074656420696e746f20736c60608201526f30b9b434b73390313c9031b0b63632b960811b608082015260a00190565b6000602082840312156129a257600080fd5b8151611168816126bd565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612a0957600080fd5b8151801515811461116857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612ad657612ad6612aae565b500390565b60008219821115612aee57612aee612aae565b50019056fea2646970667358221220c5efe534d543130a022495783fbd61cd409c461e0ed63e2b662dd8ec88c5716764736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638c80d4e511610125578063c6656702116100ad578063df5cf7231161007c578063df5cf7231461054a578063e7a050aa14610571578063f2fde38b14610584578063f698da2514610597578063fabc1cbc1461059f57600080fd5b8063c6656702146104e7578063cbc2bd62146104fa578063cd293f6f1461050d578063cf756fdf1461053757600080fd5b8063b1344271116100f4578063b134427114610464578063b43b514b1461048b578063b5d8b5b81461049e578063c3c6b3a9146104b1578063c608c7f3146104d457600080fd5b80638c80d4e51461040c5780638da5cb5b1461041f57806394f649dd14610430578063967fc0d21461045157600080fd5b80635ac86ab7116101a8578063715018a611610177578063715018a61461037d5780637a7e0d92146103855780637ecebe00146103b0578063886f1195146103d05780638b8aac3c146103e357600080fd5b80635ac86ab71461030c5780635c975abb1461033f5780635de08ff214610347578063663c1de41461035a57600080fd5b80634665bcda116101e45780634665bcda1461028b57806348825e94146102ca57806350ff7225146102f1578063595c6a671461030457600080fd5b806310d67a2f14610216578063136439dd1461022b57806320606b701461023e57806332e89ace14610278575b600080fd5b61022961022436600461289a565b6105b2565b005b6102296102393660046128b7565b61066e565b6102657f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b610265610286366004612950565b6107ad565b6102b27f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6040516001600160a01b03909116815260200161026f565b6102657f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f181565b6102296102ff366004612a2f565b6109f1565b610229610a49565b61032f61031a366004612a70565b609854600160ff9092169190911b9081161490565b604051901515815260200161026f565b609854610265565b610229610355366004612a93565b610b10565b61032f61036836600461289a565b60d16020526000908152604090205460ff1681565b610229610c59565b610265610393366004612b08565b60cd60209081526000928352604080842090915290825290205481565b6102656103be36600461289a565b60ca6020526000908152604090205481565b6097546102b2906001600160a01b031681565b6102656103f136600461289a565b6001600160a01b0316600090815260ce602052604090205490565b61022961041a366004612a2f565b610c6d565b6033546001600160a01b03166102b2565b61044361043e36600461289a565b610cc0565b60405161026f929190612bb5565b60cb546102b2906001600160a01b031681565b6102b27f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b610265610499366004612d5e565b610e40565b6102296104ac366004612a93565b610e8d565b61032f6104bf3660046128b7565b60cf6020526000908152604090205460ff1681565b6102296104e2366004612e34565b610fd1565b6102296104f536600461289a565b611089565b6102b2610508366004612e87565b61109a565b61052061051b366004612d5e565b6110d2565b60408051921515835260208301919091520161026f565b610229610545366004612eb3565b611166565b6102b27f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61026561057f366004612a2f565b61129a565b61022961059236600461289a565b611363565b6102656113d9565b6102296105ad3660046128b7565b611417565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106299190612f04565b6001600160a01b0316336001600160a01b0316146106625760405162461bcd60e51b815260040161065990612f21565b60405180910390fd5b61066b81611573565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106da9190612f6b565b6106f65760405162461bcd60e51b815260040161065990612f8d565b6098548181161461076f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156108045760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156108575760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b6002606555428410156108de5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610659565b6001600160a01b03858116600090815260ca602090815260408083205481517f0a564d4cfe5cb0d4ee082aab2ca54b8c48e129485a8f7c77766ab5ef0c3566f1938101939093528c851691830191909152928a1660608201526080810189905260a0810183905260c0810187905260e00160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca909352908220600185019055915061098e6113d9565b60405161190160f01b60208201526022810191909152604281018390526062016040516020818303038152906040528051906020012090506109d188828861166a565b6109dd888c8c8c611824565b60016065559b9a5050505050505050505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610a395760405162461bcd60e51b815260040161065990612fd5565b610a44838383611a45565b505050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab59190612f6b565b610ad15760405162461bcd60e51b815260040161065990612f8d565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cb546001600160a01b03163314610b3a5760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610b5c57610b5c61309d565b9050602002016020810190610b71919061289a565b6001600160a01b0316815260208101919091526040016000205460ff16610c4b57600160d16000868685818110610baa57610baa61309d565b9050602002016020810190610bbf919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe848483818110610c1a57610c1a61309d565b9050602002016020810190610c2f919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610b3e565b50505050565b610c61611c7f565b610c6b6000611cd9565b565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610cb55760405162461bcd60e51b815260040161065990612fd5565b610c53838383611d2b565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610cf857610cf86128e0565b604051908082528060200260200182016040528015610d21578160200160208202803683370190505b50905060005b82811015610db2576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610d6657610d6661309d565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d9f57610d9f61309d565b6020908102919091010152600101610d27565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610e2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e10575b50505050509150935093505050915091565b80516020808301516040808501516060860151608087015160a08801519351600097610e709790969591016130b3565b604051602081830303815290604052805190602001209050919050565b60cb546001600160a01b03163314610eb75760405162461bcd60e51b815260040161065990613033565b8060005b81811015610c535760d16000858584818110610ed957610ed961309d565b9050602002016020810190610eee919061289a565b6001600160a01b0316815260208101919091526040016000205460ff1615610fc957600060d16000868685818110610f2857610f2861309d565b9050602002016020810190610f3d919061289a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f9857610f9861309d565b9050602002016020810190610fad919061289a565b6040516001600160a01b03909116815260200160405180910390a15b600101610ebb565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146110195760405162461bcd60e51b815260040161065990612fd5565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b5050505050505050565b611091611c7f565b61066b81611e87565b60ce60205281600052604060002081815481106110b657600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9161461111d5760405162461bcd60e51b815260040161065990612fd5565b600061112884610e40565b600081815260cf60205260408120549192509060ff161561115d5750600081815260cf60205260409020805460ff1916905560015b92509050915091565b600054610100900460ff16158080156111865750600054600160ff909116105b806111a05750303b1580156111a0575060005460ff166001145b6112035760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610659565b6000805460ff191660011790558015611226576000805461ff0019166101001790555b61122e611ef0565b60c95561123b8383611f87565b61124485611cd9565b61124d84611e87565b8015611293576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6098546000908190600190811614156112f15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610659565b600260655414156113445760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610659565b600260655561135533868686611824565b600160655595945050505050565b61136b611c7f565b6001600160a01b0381166113d05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61066b81611cd9565b60007f0000000000000000000000000000000000000000000000000000000000007a6946141561140a575060c95490565b611412611ef0565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190612f04565b6001600160a01b0316336001600160a01b0316146114be5760405162461bcd60e51b815260040161065990612f21565b60985419811960985419161461153c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610659565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107a2565b6001600160a01b0381166116015760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610659565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561178457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906116aa9086908690600401613184565b602060405180830381865afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb919061319d565b6001600160e01b03191614610a445760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610659565b826001600160a01b03166117988383612071565b6001600160a01b031614610a445760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610659565b6001600160a01b038316600090815260d16020526040812054849060ff166118ca5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610659565b6118df6001600160a01b038516338786612095565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af115801561192e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195291906131c7565b915061195f868684611a45565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b1580156119d157600080fd5b505af11580156119e5573d6000803e3d6000fd5b5050604080516001600160a01b038a8116825288811660208301528916818301526060810186905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969350908190036080019150a150949350505050565b6001600160a01b038316611ac15760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610659565b80611b2d5760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610659565b6001600160a01b03808416600090815260cd6020908152604080832093861683529290522054611c3e576001600160a01b038316600090815260ce602090815260409091205410611bff5760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610659565b6001600160a01b03838116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808416600090815260cd6020908152604080832093861683529290529081208054839290611c759084906131f6565b9091555050505050565b6033546001600160a01b03163314610c6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610659565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611da05760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610659565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611e325760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610659565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611e7a57611e7085856120ef565b6001915050611e80565b60009150505b9392505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b0316158015611fa857506001600160a01b03821615155b61202a5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610659565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261206d82611573565b5050565b600080600061208085856122e1565b9150915061208d81612351565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c5390859061250c565b6001600160a01b038216600090815260ce6020526040812054905b8181101561220a576001600160a01b03848116600090815260ce60205260409020805491851691839081106121415761214161309d565b6000918252602090912001546001600160a01b03161415612202576001600160a01b038416600090815260ce6020526040902080546121829060019061320e565b815481106121925761219261309d565b60009182526020808320909101546001600160a01b03878116845260ce90925260409092208054919092169190839081106121cf576121cf61309d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061220a565b60010161210a565b818114156122925760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610659565b6001600160a01b038416600090815260ce602052604090208054806122b9576122b9613225565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156123185760208301516040840151606085015160001a61230c878285856125de565b9450945050505061234a565b82516040141561234257602083015160408401516123378683836126cb565b93509350505061234a565b506000905060025b9250929050565b60008160048111156123655761236561323b565b141561236e5750565b60018160048111156123825761238261323b565b14156123d05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610659565b60028160048111156123e4576123e461323b565b14156124325760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610659565b60038160048111156124465761244661323b565b141561249f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610659565b60048160048111156124b3576124b361323b565b141561066b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610659565b6000612561826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127049092919063ffffffff16565b805190915015610a44578080602001905181019061257f9190612f6b565b610a445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610659565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561261557506000905060036126c2565b8460ff16601b1415801561262d57508460ff16601c14155b1561263e57506000905060046126c2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612692573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126bb576000600192509250506126c2565b9150600090505b94509492505050565b6000806001600160ff1b038316816126e860ff86901c601b6131f6565b90506126f6878288856125de565b935093505050935093915050565b6060612713848460008561271b565b949350505050565b60608247101561277c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610659565b6001600160a01b0385163b6127d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610659565b600080866001600160a01b031685876040516127ef9190613251565b60006040518083038185875af1925050503d806000811461282c576040519150601f19603f3d011682016040523d82523d6000602084013e612831565b606091505b509150915061284182828661284c565b979650505050505050565b6060831561285b575081611e80565b82511561286b5782518084602001fd5b8160405162461bcd60e51b8152600401610659919061326d565b6001600160a01b038116811461066b57600080fd5b6000602082840312156128ac57600080fd5b8135611e8081612885565b6000602082840312156128c957600080fd5b5035919050565b80356128db81612885565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612919576129196128e0565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612948576129486128e0565b604052919050565b60008060008060008060c0878903121561296957600080fd5b863561297481612885565b955060208781013561298581612885565b955060408801359450606088013561299c81612885565b93506080880135925060a088013567ffffffffffffffff808211156129c057600080fd5b818a0191508a601f8301126129d457600080fd5b8135818111156129e6576129e66128e0565b6129f8601f8201601f1916850161291f565b91508082528b84828501011115612a0e57600080fd5b80848401858401376000848284010152508093505050509295509295509295565b600080600060608486031215612a4457600080fd5b8335612a4f81612885565b92506020840135612a5f81612885565b929592945050506040919091013590565b600060208284031215612a8257600080fd5b813560ff81168114611e8057600080fd5b60008060208385031215612aa657600080fd5b823567ffffffffffffffff80821115612abe57600080fd5b818501915085601f830112612ad257600080fd5b813581811115612ae157600080fd5b8660208260051b8501011115612af657600080fd5b60209290920196919550909350505050565b60008060408385031215612b1b57600080fd5b8235612b2681612885565b91506020830135612b3681612885565b809150509250929050565b600081518084526020808501945080840160005b83811015612b7a5781516001600160a01b031687529582019590820190600101612b55565b509495945050505050565b600081518084526020808501945080840160005b83811015612b7a57815187529582019590820190600101612b99565b604081526000612bc86040830185612b41565b8281036020840152612bda8185612b85565b95945050505050565b600067ffffffffffffffff821115612bfd57612bfd6128e0565b5060051b60200190565b600082601f830112612c1857600080fd5b81356020612c2d612c2883612be3565b61291f565b82815260059290921b84018101918181019086841115612c4c57600080fd5b8286015b84811015612c70578035612c6381612885565b8352918301918301612c50565b509695505050505050565b600082601f830112612c8c57600080fd5b81356020612c9c612c2883612be3565b82815260059290921b84018101918181019086841115612cbb57600080fd5b8286015b84811015612c705780358352918301918301612cbf565b600060408284031215612ce857600080fd5b6040516040810181811067ffffffffffffffff82111715612d0b57612d0b6128e0565b6040529050808235612d1c81612885565b815260208301356bffffffffffffffffffffffff81168114612d3d57600080fd5b6020919091015292915050565b803563ffffffff811681146128db57600080fd5b600060208284031215612d7057600080fd5b813567ffffffffffffffff80821115612d8857600080fd5b9083019060e08286031215612d9c57600080fd5b612da46128f6565b823582811115612db357600080fd5b612dbf87828601612c07565b825250602083013582811115612dd457600080fd5b612de087828601612c7b565b602083015250612df2604084016128d0565b6040820152612e048660608501612cd6565b6060820152612e1560a08401612d4a565b6080820152612e2660c084016128d0565b60a082015295945050505050565b60008060008060808587031215612e4a57600080fd5b8435612e5581612885565b93506020850135612e6581612885565b9250604085013591506060850135612e7c81612885565b939692955090935050565b60008060408385031215612e9a57600080fd5b8235612ea581612885565b946020939093013593505050565b60008060008060808587031215612ec957600080fd5b8435612ed481612885565b93506020850135612ee481612885565b92506040850135612ef481612885565b9396929550929360600135925050565b600060208284031215612f1657600080fd5b8151611e8081612885565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612f7d57600080fd5b81518015158114611e8057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60e0815260006130c660e0830189612b41565b82810360208401526130d88189612b85565b6001600160a01b0397881660408501528651881660608501526020909601516bffffffffffffffffffffffff166080840152505063ffffffff9290921660a083015290921660c09092019190915292915050565b60005b8381101561314757818101518382015260200161312f565b83811115610c535750506000910152565b6000815180845261317081602086016020860161312c565b601f01601f19169290920160200192915050565b8281526040602082015260006127136040830184613158565b6000602082840312156131af57600080fd5b81516001600160e01b031981168114611e8057600080fd5b6000602082840312156131d957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115613209576132096131e0565b500190565b600082821015613220576132206131e0565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161326381846020870161312c565b9190910192915050565b602081526000611e80602083018461315856fea26469706673582212205c39c91e4aaff04af69f6d04917b99d0b39f502fa282507e0d84e68f897c45d664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xc6e7df5e7b4f2a278906862b61205850344d4e7d":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b2565b6103ba565b005b6101a66101b63660046117fc565b61049d565b6101a66101c9366004611819565b610550565b6101a66101dc36600461183b565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611854565b610749565b6101a6610279366004611880565b610969565b61024161028c3660046117fc565b610a37565b6101a6610a4b565b6102b86102a73660046118b9565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e736600461183b565b610b17565b6000546101f4906201000090046001600160a01b031681565b61024161031336600461183b565b610b62565b6102416103263660046117fc565b610b6d565b610333610b7b565b604051610208919061190c565b61024161034e3660046117fc565b610b9b565b6101a661036136600461193f565b610c30565b60645460655460408051928352602083019190915201610208565b61024161038f36600461183b565b610e7d565b6102416103a236600461183b565b610eb6565b6101a66103b536600461183b565b610ec1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611980565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b610446858561101d565b610450838361112a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119ce565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119eb565b61054d816111bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119ce565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119eb565b610601828261101d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a35565b6106925760405162461bcd60e51b815260040161041090611a57565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846112c0565b6032546001600160a01b0385811691161461089c5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b60335460006108ad6103e883611ab5565b905060006103e86108bc611398565b6108c69190611ab5565b905060006108d48783611acd565b9050806108e18489611ae4565b6108eb9190611b03565b9550856109515760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b61095b8685611ab5565b603355505050505092915050565b600054610100900460ff16158080156109895750600054600160ff909116105b806109a35750303b1580156109a3575060005460ff166001145b6109bf5760405162461bcd60e51b815260040161041090611980565b6000805460ff1916600117905580156109e2576000805461ff0019166101001790555b6109ec838361112a565b8015610a32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a456102e783610b9b565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc9190611a35565b610ad85760405162461bcd60e51b815260040161041090611a57565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b2a9190611ab5565b905060006103e8610b39611398565b610b439190611ab5565b905081610b508583611ae4565b610b5a9190611b03565b949350505050565b6000610a4582610e7d565b6000610a456103a283610b9b565b60606040518060800160405280604d8152602001611b5b604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c990911690637a7e0d9290604401602060405180830381865afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a459190611b25565b6001805460029081161415610c835760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614610cfb5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b6032546001600160a01b03848116911614610d7e5760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b60335480831115610e0d5760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610e1b6103e883611ab5565b905060006103e8610e2a611398565b610e349190611ab5565b9050600082610e438784611ae4565b610e4d9190611b03565b9050610e598685611acd565b603355603254610e73906001600160a01b0316898361140a565b5050505050505050565b6000806103e8603354610e909190611ab5565b905060006103e8610e9f611398565b610ea99190611ab5565b905080610b508386611ae4565b6000610a4582610b17565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3891906119ce565b6001600160a01b0316336001600160a01b031614610f685760405162461bcd60e51b8152600401610410906119eb565b600154198119600154191614610fe65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561111f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b03841617905561060181600061145c565b6001600160a01b0381166112495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561132a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b606554611335611398565b11156106015760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114059190611b25565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a32908490611548565b6000546201000090046001600160a01b031615801561148357506001600160a01b03821615155b6115055760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826111bb565b600061159d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661161a9092919063ffffffff16565b805190915015610a3257808060200190518101906115bb9190611a35565b610a325760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606116298484600085611633565b90505b9392505050565b6060824710156116945760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116eb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516117079190611b3e565b60006040518083038185875af1925050503d8060008114611744576040519150601f19603f3d011682016040523d82523d6000602084013e611749565b606091505b5091509150611759828286611764565b979650505050505050565b6060831561177357508161162c565b8251156117835782518084602001fd5b8160405162461bcd60e51b8152600401610410919061190c565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117c857600080fd5b843593506020850135925060408501356117e18161179d565b915060608501356117f18161179d565b939692955090935050565b60006020828403121561180e57600080fd5b813561162c8161179d565b6000806040838503121561182c57600080fd5b50508035926020909101359150565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b82356118728161179d565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e8161179d565b915060208301356118ae8161179d565b809150509250929050565b6000602082840312156118cb57600080fd5b813560ff8116811461162c57600080fd5b60005b838110156118f75781810151838201526020016118df565b83811115611906576000848401525b50505050565b602081526000825180602084015261192b8160408501602087016118dc565b601f01601f19169190910160400192915050565b60008060006060848603121561195457600080fd5b833561195f8161179d565b9250602084013561196f8161179d565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e057600080fd5b815161162c8161179d565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4757600080fd5b8151801515811461162c57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ac857611ac8611a9f565b500190565b600082821015611adf57611adf611a9f565b500390565b6000816000190483118215151615611afe57611afe611a9f565b500290565b600082611b2057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3757600080fd5b5051919050565b60008251611b508184602087016118dc565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220f3e91484e81b6295a205880b71a56739bd92a560061b728af31944b5f6d96ef064736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x831f01b2aeb61d5d8c019704e62c25763057a8806c5c790bc8b4c99ee54ac8a7","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x610178da211fef7d417bc0e6fed39f05609ad788","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0xd65ac9700cec4e530497617d02afdf0d5de3ed18466aca1578edcbce0d40ee16","0xcb":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea2646970667358221220f71399fafd06d0e383b21957bcac3bf3986a6a0701bc4c5dc7ee118215f3652364736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":23,"balance":"0x21e189148e583cf20d9","code":"0x","storage":{}}}} \ No newline at end of file diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go new file mode 100644 index 00000000..bdae3520 --- /dev/null +++ b/tests/integration/integration_test.go @@ -0,0 +1,217 @@ +package integration_test + +import ( + "context" + "log" + "os" + "path/filepath" + "testing" + "time" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" + clientconstructor "github.com/Layr-Labs/eigensdk-go/chainio/constructor" + sdklogging "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signer" + sdkutils "github.com/Layr-Labs/eigensdk-go/utils" + "github.com/Layr-Labs/incredible-squaring-avs/aggregator" + "github.com/Layr-Labs/incredible-squaring-avs/core/chainio" + "github.com/Layr-Labs/incredible-squaring-avs/core/config" + "github.com/Layr-Labs/incredible-squaring-avs/operator" + "github.com/Layr-Labs/incredible-squaring-avs/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/wait" +) + +type IntegrationClients struct { + Sdkclients clientconstructor.Clients +} + +func TestIntegration(t *testing.T) { + log.Println("This test takes ~50 seconds to run...") + + /* Start the anvil chain */ + anvilC := startAnvilTestContainer() + // Not sure why but deferring anvilC.Terminate() causes a panic when the test finishes... + // so letting it terminate silently for now + anvilEndpoint, err := anvilC.Endpoint(context.Background(), "") + if err != nil { + t.Error(err) + } + + /* Prepare the config file for aggregator */ + var aggConfigRaw config.ConfigRaw + aggConfigFilePath := "../../config-files/aggregator.yaml" + sdkutils.ReadYamlConfig(aggConfigFilePath, &aggConfigRaw) + aggConfigRaw.EthRpcUrl = "http://" + anvilEndpoint + aggConfigRaw.EthWsUrl = "ws://" + anvilEndpoint + + var credibleSquaringDeploymentRaw config.CredibleSquaringDeploymentRaw + credibleSquaringDeploymentFilePath := "../../contracts/script/output/31337/credible_squaring_avs_deployment_output.json" + sdkutils.ReadJsonConfig(credibleSquaringDeploymentFilePath, &credibleSquaringDeploymentRaw) + + var sharedAvsContractsDeploymentRaw config.SharedAvsContractsRaw + sharedAvsContractsDeploymentFilePath := "../../contracts/script/output/31337/shared_avs_contracts_deployment_output.json" + sdkutils.ReadJsonConfig(sharedAvsContractsDeploymentFilePath, &sharedAvsContractsDeploymentRaw) + + logger, err := sdklogging.NewZapLogger(aggConfigRaw.Environment) + if err != nil { + t.Fatalf("Failed to create logger: %s", err.Error()) + } + ethRpcClient, err := eth.NewClient(aggConfigRaw.EthRpcUrl) + if err != nil { + t.Fatalf("Failed to create eth client: %s", err.Error()) + } + ethWsClient, err := eth.NewClient(aggConfigRaw.EthWsUrl) + if err != nil { + t.Fatalf("Failed to create eth client: %s", err.Error()) + } + + ecdsaPrivateKeyString := "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6" + if ecdsaPrivateKeyString[:2] == "0x" { + ecdsaPrivateKeyString = ecdsaPrivateKeyString[2:] + } + ecdsaPrivateKey, err := crypto.HexToECDSA(ecdsaPrivateKeyString) + if err != nil { + t.Fatalf("Cannot parse ecdsa private key: %s", err.Error()) + } + + operatorAddr, err := sdkutils.EcdsaPrivateKeyToAddress(ecdsaPrivateKey) + if err != nil { + t.Fatalf("Cannot get operator address: %s", err.Error()) + } + + chainId, err := ethRpcClient.ChainID(context.Background()) + if err != nil { + t.Fatalf("Cannot get chainId: %s", err.Error()) + } + + privateKeySigner, err := signer.NewPrivateKeySigner(ecdsaPrivateKey, chainId) + if err != nil { + t.Fatalf("Cannot create signer: %s", err.Error()) + } + + config := &config.Config{ + EcdsaPrivateKey: ecdsaPrivateKey, + Logger: logger, + EthRpcUrl: aggConfigRaw.EthRpcUrl, + EthHttpClient: ethRpcClient, + EthWsClient: ethWsClient, + BlsOperatorStateRetrieverAddr: common.HexToAddress(sharedAvsContractsDeploymentRaw.BlsOperatorStateRetrieverAddr), + CredibleSquaringServiceManagerAddr: common.HexToAddress(credibleSquaringDeploymentRaw.Addresses.CredibleSquaringServiceManagerAddr), + SlasherAddr: common.HexToAddress(""), + AggregatorServerIpPortAddr: aggConfigRaw.AggregatorServerIpPortAddr, + RegisterOperatorOnStartup: aggConfigRaw.RegisterOperatorOnStartup, + Signer: privateKeySigner, + OperatorAddress: operatorAddr, + BlsPublicKeyCompendiumAddress: common.HexToAddress(aggConfigRaw.BLSPubkeyCompendiumAddr), + } + + /* Prepare the config file for operator */ + nodeConfig := types.NodeConfig{} + nodeConfigFilePath := "../../config-files/node_config.anvil.yaml" + err = sdkutils.ReadYamlConfig(nodeConfigFilePath, &nodeConfig) + if err != nil { + t.Fatalf("Failed to read yaml config: %s", err.Error()) + } + /* Register operator*/ + // log.Println("registering operator for integration tests") + // we need to do this dynamically and can't just hardcode a registered operator into the anvil + // state because the anvil state dump doesn't also dump the receipts tree so we lose events, + // and the aggregator thus can't get the operator's pubkey + // operatorRegistrationCmd := exec.Command("bash", "./operator-registration.sh") + // err = operatorRegistrationCmd.Run() + // if err != nil { + // t.Fatalf("Failed to register operator: %s", err.Error()) + // } + + ctx, cancel := context.WithTimeout(context.Background(), 65*time.Second) + defer cancel() + /* start operator */ + // the passwords are set to empty strings + log.Println("starting operator for integration tests") + os.Setenv("OPERATOR_BLS_KEY_PASSWORD", "") + os.Setenv("OPERATOR_ECDSA_KEY_PASSWORD", "") + nodeConfig.BlsPrivateKeyStorePath = "../keys/test.bls.key.json" + nodeConfig.EcdsaPrivateKeyStorePath = "../keys/test.ecdsa.key.json" + nodeConfig.RegisterOperatorOnStartup = true + nodeConfig.EthRpcUrl = "http://" + anvilEndpoint + nodeConfig.EthWsUrl = "ws://" + anvilEndpoint + operator, err := operator.NewOperatorFromConfig(nodeConfig) + if err != nil { + t.Fatalf("Failed to create operator: %s", err.Error()) + } + go operator.Start(ctx) + log.Println("Started operator. Sleeping 15 seconds to give it time to register...") + time.Sleep(15 * time.Second) + + /* start aggregator */ + log.Println("starting aggregator for integration tests") + agg, err := aggregator.NewAggregator(config) + if err != nil { + t.Fatalf("Failed to create aggregator: %s", err.Error()) + } + go agg.Start(ctx) + log.Println("Started aggregator. Sleeping 15 seconds to give operator time to answer task 1...") + time.Sleep(15 * time.Second) + + // get avsRegistry client to interact with the chain + avsReader, err := chainio.NewAvsReaderFromConfig(config) + if err != nil { + t.Fatalf("Cannot create AVS Reader: %s", err.Error()) + } + + // check if the task is recorded in the contract for task index 1 + taskHash, err := avsReader.AvsServiceBindings.TaskManager.AllTaskHashes(&bind.CallOpts{}, 1) + if err != nil { + t.Fatalf("Cannot get task hash: %s", err.Error()) + } + if taskHash == [32]byte{} { + t.Fatalf("Task hash is empty") + } + + // check if the task response is recorded in the contract for task index 1 + taskResponseHash, err := avsReader.AvsServiceBindings.TaskManager.AllTaskResponses(&bind.CallOpts{}, 1) + log.Printf("taskResponseHash: %v", taskResponseHash) + if err != nil { + t.Fatalf("Cannot get task response hash: %s", err.Error()) + } + if taskResponseHash == [32]byte{} { + t.Fatalf("Task response hash is empty") + } + +} + +func startAnvilTestContainer() testcontainers.Container { + integrationDir, err := os.Getwd() + if err != nil { + panic(err) + } + + ctx := context.Background() + req := testcontainers.ContainerRequest{ + Image: "ghcr.io/foundry-rs/foundry:latest", + Mounts: testcontainers.ContainerMounts{ + testcontainers.ContainerMount{ + Source: testcontainers.GenericBindMountSource{ + HostPath: filepath.Join(integrationDir, "avs-and-eigenlayer-deployed-anvil-state.json"), + }, + Target: "/root/.anvil/state.json", + }, + }, + Entrypoint: []string{"anvil"}, + Cmd: []string{"--host", "0.0.0.0", "--load-state", "/root/.anvil/state.json"}, + ExposedPorts: []string{"8545/tcp"}, + WaitingFor: wait.ForLog("Listening on"), + } + anvilC, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: true, + }) + if err != nil { + panic(err) + } + return anvilC +} diff --git a/tests/integration/operator-registration.sh b/tests/integration/operator-registration.sh new file mode 100755 index 00000000..9b313fd1 --- /dev/null +++ b/tests/integration/operator-registration.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cd ../../ && make cli-setup-operator \ No newline at end of file diff --git a/tests/keys/test.bls.key.json b/tests/keys/test.bls.key.json new file mode 100644 index 00000000..72d5c64f --- /dev/null +++ b/tests/keys/test.bls.key.json @@ -0,0 +1 @@ +{"pubKey":"E([643552363890320897587044283125191574906281609959531590546948318138132520777,7028377728703212953187883551402495866059211864756496641401904395458852281995])","crypto":{"cipher":"aes-128-ctr","ciphertext":"8221f69293d98ca9d46c52a2747b61755c6bb71f41e951154af3bcbc0daef2b8","cipherparams":{"iv":"d8a38c68f3400aeb93084672b6e3ae61"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c41150482e6acfc2f0fcfd68b67f28ef22de8aa3f982048bdaf793c2e3ac3730"},"mac":"879c2831169d9ac70c662ebca90b9f3cd63761d0924bdbbde0a82a306baf44cd"}} \ No newline at end of file diff --git a/tests/keys/test.ecdsa.key.json b/tests/keys/test.ecdsa.key.json new file mode 100644 index 00000000..7f3380de --- /dev/null +++ b/tests/keys/test.ecdsa.key.json @@ -0,0 +1 @@ +{"address":"860b6912c2d0337ef05bbc89b0c2cb6cbaeab4a5","crypto":{"cipher":"aes-128-ctr","ciphertext":"37ab29382354906d7b33b0ad1b00c539dfb69ea85997e470baba7601b0faa373","cipherparams":{"iv":"b7642683ba782688cc4da76dd5c61fce"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"fdc108d3e6388174f4cf6d5abe6de2364c96dcc03c4f1bddb1b47b01dce742e2"},"mac":"d4fff8d963a7815a7203f8c73b3047a2e5efcefb8163e6df316cc55f79df0cc2"},"id":"0c401f60-9d1f-4918-a823-1866984f8fcd","version":3} \ No newline at end of file diff --git a/tests/utils.go b/tests/utils.go new file mode 100644 index 00000000..2097c275 --- /dev/null +++ b/tests/utils.go @@ -0,0 +1,42 @@ +package tests + +import ( + "bytes" + "fmt" + "log" + "os/exec" + "time" +) + +// Make sure to stop the anvil subprocess by calling anvilCmd.Process.Kill() +func StartAnvilChainAndDeployContracts() *exec.Cmd { + fmt.Println("Starting anvil...") + anvilCmd := exec.Command("anvil", "--fork-url", "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161") + err := anvilCmd.Start() + if err != nil { + log.Fatal(err.Error()) + } + + fmt.Println("Sleeping for 2 seconds to give time for anvil to start before we deploy contracts...") + time.Sleep(2 * time.Second) + + fmt.Println("Deploying contracts...") + cmd := exec.Command("forge", "script", "script/CredibleSquaringDeployer.s.sol", + "--rpc-url", "http://localhost:8545", + "--private-key", "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + "--broadcast", + ) + cmd.Dir = "./contracts" + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err = cmd.Run() + + if err != nil { + fmt.Println(stderr.String()) + log.Fatal(err.Error()) + } + fmt.Println(stdout.String()) + + return anvilCmd +} diff --git a/types/avs_config.go b/types/avs_config.go new file mode 100644 index 00000000..16a83131 --- /dev/null +++ b/types/avs_config.go @@ -0,0 +1,19 @@ +package types + +type NodeConfig struct { + // used to set the logger level (true = info, false = debug) + Production bool `yaml:"production"` + OperatorAddress string `yaml:"operator_address"` + ELSlasherAddress string `yaml:"el_slasher_address"` + BLSOperatorStateRetrieverAddress string `yaml:"bls_operator_state_retriever_address"` + BlsPublicKeyCompendiumAddress string `yaml:"bls_public_key_compendium_address"` + AVSServiceManagerAddress string `yaml:"avs_service_manager_address"` + EthRpcUrl string `yaml:"eth_rpc_url"` + EthWsUrl string `yaml:"eth_ws_url"` + BlsPrivateKeyStorePath string `yaml:"bls_private_key_store_path"` + EcdsaPrivateKeyStorePath string `yaml:"ecdsa_private_key_store_path"` + AggregatorServerIpPortAddress string `yaml:"aggregator_server_ip_port_address"` + EigenMetricsIpPortAddress string `yaml:"eigen_metrics_ip_port_address"` + RegisterOperatorOnStartup bool `yaml:"register_operator_on_startup"` + UseInstrumentedEthClient bool `yaml:"use_instrumented_eth_client"` +}