{
  "_format": "hh-sol-artifact-1",
  "contractName": "MultichainSpokeConnector",
  "sourceName": "contracts/messaging/connectors/multichain/MultichainSpokeConnector.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_domain",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_mirrorDomain",
          "type": "uint32"
        },
        {
          "internalType": "address",
          "name": "_amb",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_rootManager",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_mirrorConnector",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_processGas",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_reserveGas",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_delayBlocks",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_merkle",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_watcherManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_mirrorChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_gasCap",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "Connector__processMessage_notUsed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__onlyOwner_notOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__onlyProposed_notProposedOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__ownershipDelayElapsed_delayNotElapsed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__proposeNewOwner_invalidProposal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__proposeNewOwner_noOwnershipChange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__renounceOwnership_invalidProposal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ProposedOwnable__renounceOwnership_noProposal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RateLimited__rateLimited_messageSendRateExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__index_indexMoreThan32Bytes",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "loc",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "len",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "slice",
          "type": "uint256"
        }
      ],
      "name": "TypedMemView__index_overrun",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__unsafeCopyTo_identityOOG",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__unsafeCopyTo_invalidPointer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TypedMemView__unsafeCopyTo_nullPointer",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        }
      ],
      "name": "AggregateRootReceived",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        }
      ],
      "name": "AggregateRootRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        }
      ],
      "name": "AggregateRootVerified",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "updated",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "DelayBlocksUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "leaf",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "root",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "message",
          "type": "bytes"
        }
      ],
      "name": "Dispatch",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "FundsWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_previous",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_updated",
          "type": "uint256"
        }
      ],
      "name": "GasCapUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "MessageProcessed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "leaf",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "aggregateRoot",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "aggregateIndex",
          "type": "uint256"
        }
      ],
      "name": "MessageProven",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "encodedData",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "MessageSent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previous",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "current",
          "type": "address"
        }
      ],
      "name": "MirrorConnectorUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "domain",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "mirrorDomain",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "amb",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "rootManager",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "mirrorConnector",
          "type": "address"
        }
      ],
      "name": "NewConnector",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "proposedOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipProposed",
      "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": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "leaf",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "returnData",
          "type": "bytes"
        }
      ],
      "name": "Process",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "updater",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newRateLimit",
          "type": "uint256"
        }
      ],
      "name": "SendRateLimitUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "SenderAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "SenderRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "watcherManager",
          "type": "address"
        }
      ],
      "name": "WatcherManagerChanged",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "AMB",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DOMAIN",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MERKLE",
      "outputs": [
        {
          "internalType": "contract MerkleTreeManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIRROR_DOMAIN",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PROCESS_GAS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RESERVE_GAS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROOT_MANAGER",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptProposedOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "addSender",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "allowlistedSenders",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "anyExecute",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "delay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "delayBlocks",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_destinationDomain",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_recipientAddress",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_messageBody",
          "type": "bytes"
        }
      ],
      "name": "dispatch",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "home",
      "outputs": [
        {
          "internalType": "contract IOutbox",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_potentialReplica",
          "type": "address"
        }
      ],
      "name": "isReplica",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastSentBlock",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "localDomain",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "messages",
      "outputs": [
        {
          "internalType": "enum SpokeConnector.MessageStatus",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "mirrorConnector",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "outboundRoot",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "pendingAggregateRoots",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "processMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newlyProposed",
          "type": "address"
        }
      ],
      "name": "proposeNewOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proposed",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proposedTimestamp",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "message",
              "type": "bytes"
            },
            {
              "internalType": "bytes32[32]",
              "name": "path",
              "type": "bytes32[32]"
            },
            {
              "internalType": "uint256",
              "name": "index",
              "type": "uint256"
            }
          ],
          "internalType": "struct SpokeConnector.Proof[]",
          "name": "_proofs",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes32",
          "name": "_aggregateRoot",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32[32]",
          "name": "_aggregatePath",
          "type": "bytes32[32]"
        },
        {
          "internalType": "uint256",
          "name": "_aggregateIndex",
          "type": "uint256"
        }
      ],
      "name": "proveAndProcess",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "provenAggregateRoots",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "provenMessageRoots",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rateLimitBlocks",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_fraudulentRoot",
          "type": "bytes32"
        }
      ],
      "name": "removePendingAggregateRoot",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "removeSender",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounced",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_encodedData",
          "type": "bytes"
        }
      ],
      "name": "send",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "sentMessageRoots",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_delayBlocks",
          "type": "uint256"
        }
      ],
      "name": "setDelayBlocks",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_gasCap",
          "type": "uint256"
        }
      ],
      "name": "setGasCap",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_mirrorConnector",
          "type": "address"
        }
      ],
      "name": "setMirrorConnector",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_rateLimit",
          "type": "uint256"
        }
      ],
      "name": "setRateLimitBlocks",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_watcherManager",
          "type": "address"
        }
      ],
      "name": "setWatcherManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_expected",
          "type": "address"
        }
      ],
      "name": "verifySender",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "watcherManager",
      "outputs": [
        {
          "internalType": "contract WatcherManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        }
      ],
      "name": "withdrawFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x6101a06040523480156200001257600080fd5b5060405162003e8d38038062003e8d8339810160408190526200003591620004fd565b898282808f8f858f8f8f8f8f8f8f808a8a8a8a8a6200005433620003bc565b8463ffffffff166000036200009f5760405162461bcd60e51b815260206004820152600c60248201526b32b6b83a3c903237b6b0b4b760a11b60448201526064015b60405180910390fd5b6001600160a01b038216620000eb5760405162461bcd60e51b815260206004820152601160248201527032b6b83a3c903937b7ba26b0b730b3b2b960791b604482015260640162000096565b63ffffffff8086166080526001600160a01b0380851660a05283811660c05290851660e0528116156200012357620001238162000421565b604080516001600160a01b0385811682528481166020830152831681830152905163ffffffff86811692908816917f4f9c27c2fe3f84576ea469d367d044da53c45e951617e8389f2b5ed8db9d25f09181900360600190a350506003805460ff60a01b191690555050600480546001600160a01b0319166001600160a01b039390931692909217909155506001600755620cf84f8511620001f65760405162461bcd60e51b815260206004820152600c60248201526b2170726f636573732067617360a01b604482015260640162000096565b613a978411620002385760405162461bcd60e51b815260206004820152600c60248201526b21726573657276652067617360a01b604482015260640162000096565b6101208590526101408490526001600160a01b0382166200028b5760405162461bcd60e51b815260206004820152600c60248201526b217a65726f206d65726b6c6560a01b604482015260640162000096565b506001600160a01b03166101005260085550620002b19550869450506200048a92505050565b5081600003620002f55760405162461bcd60e51b815260206004820152600e60248201526d085b5a5c9c9bdc90da185a5b925960921b604482015260640162000096565b826001600160a01b031663c34c08e56040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035a9190620005c5565b6001600160a01b0316610160819052620003a35760405162461bcd60e51b815260206004820152600960248201526810b2bc32b1baba37b960b91b604482015260640162000096565b506101805250620005ea9b505050505050505050505050565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316178155600255600180549091169055565b600354604080516001600160a01b03928316815291831660208301527fc77bec288fc88f168427f2f7da682eadb26cac89d8d591af6e443da98dff2bbc910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b60105460408051918252602082018390527f877a02cb809da0364d23adca3cd50c451b53f279d3df632e1fc11eb66335bce5910160405180910390a1601055565b805163ffffffff81168114620004e057600080fd5b919050565b80516001600160a01b0381168114620004e057600080fd5b6000806000806000806000806000806000806101808d8f0312156200052157600080fd5b6200052c8d620004cb565b9b506200053c60208e01620004cb565b9a506200054c60408e01620004e5565b99506200055c60608e01620004e5565b98506200056c60808e01620004e5565b975060a08d0151965060c08d0151955060e08d01519450620005926101008e01620004e5565b9350620005a36101208e01620004e5565b92506101408d015191506101608d015190509295989b509295989b509295989b565b600060208284031215620005d857600080fd5b620005e382620004e5565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516137c9620006c4600039600081816122e9015281816123dc0152612cf9015260008181612bf80152612c560152600081816103400152611cda01526000818161095701528181611cfb0152611d8801526000818161077e01528181610ad401528181611014015261172a015260006102d00152600061055e01526000818161090d01528181610c7c0152818161185001526121660152600081816104a50152818161068c015281816116cc0152611bda01526137c96000f3fe6080604052600436106102b25760003560e01c80638456cb5911610175578063b697f531116100dc578063d2a3cc7111610095578063d88beda21161006f578063d88beda214610945578063db1b765914610979578063e0fed01014610999578063fa31de01146109b957600080fd5b8063d2a3cc71146108db578063d69f9d61146108fb578063d7d317b31461092f57600080fd5b8063b697f53114610816578063b95a200114610836578063c5b350df14610869578063cc3942831461087e578063d1851c921461089e578063d232c220146108bc57600080fd5b80639fa92f9d1161012e5780639fa92f9d14610759578063a01892a51461076c578063a792c29b146107a0578063ad9c0c2e146107c0578063b1f8100d146107d6578063b2f87643146107f657600080fd5b80638456cb59146106685780638d3638f41461067d5780638da5cb5b146106b057806398c9f2b9146106ce5780639abaf479146106fe5780639d3117c71461072c57600080fd5b8063572386ca1161021957806365eaf11b116101d257806365eaf11b146105c857806368742da6146105dd5780636a42b8f8146105fd5780636b04a93314610613578063715018a6146106335780637850b0201461064857600080fd5b8063572386ca146104c7578063579c1618146104f75780635bd11efc1461050d5780635c975abb1461052d5780635f61e3ec1461054c5780636159ada11461059857600080fd5b80633cf52ffb1161026b5780633cf52ffb146104005780633f4ba83a146104155780634ff746f61461042a578063508a109b1461044a5780635190bc531461046a57806352a9674b1461049357600080fd5b806314168416146102be5780631eeaabea1461030c57806325e3beda1461032e5780632bb1ae7c146103705780632bbd59ca14610383578063301f07c3146103c057600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506102f27f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020015b60405180910390f35b34801561031857600080fd5b5061032c61032736600461311b565b6109e7565b005b34801561033a57600080fd5b506103627f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610303565b61032c61037e3660046131d7565b610a91565b34801561038f57600080fd5b506103b361039e36600461311b565b600f6020526000908152604090205460ff1681565b6040516103039190613222565b3480156103cc57600080fd5b506103f06103db36600461311b565b600a6020526000908152604090205460ff1681565b6040519015158152602001610303565b34801561040c57600080fd5b50600254610362565b34801561042157600080fd5b5061032c610c34565b34801561043657600080fd5b5061032c6104453660046131d7565b610c71565b34801561045657600080fd5b5061032c61046536600461324a565b610d17565b34801561047657600080fd5b506103f06104853660046132fb565b6001600160a01b0316301490565b34801561049f57600080fd5b506102f27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d357600080fd5b506103f06104e236600461311b565b600c6020526000908152604090205460ff1681565b34801561050357600080fd5b5061036260055481565b34801561051957600080fd5b5061032c6105283660046132fb565b610fd9565b34801561053957600080fd5b50600354600160a01b900460ff166103f0565b34801561055857600080fd5b506105807f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610303565b3480156105a457600080fd5b506103f06105b33660046132fb565b600d6020526000908152604090205460ff1681565b3480156105d457600080fd5b50610362611010565b3480156105e957600080fd5b5061032c6105f83660046132fb565b611099565b34801561060957600080fd5b5062093a80610362565b34801561061f57600080fd5b5061032c61062e36600461311b565b611116565b34801561063f57600080fd5b5061032c6111e1565b34801561065457600080fd5b5061032c61066336600461311b565b61120c565b34801561067457600080fd5b5061032c611240565b34801561068957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102f2565b3480156106bc57600080fd5b506000546001600160a01b0316610580565b3480156106da57600080fd5b506103f06106e936600461311b565b600b6020526000908152604090205460ff1681565b34801561070a57600080fd5b5061071e6107193660046131d7565b6112f4565b604051610303929190613368565b34801561073857600080fd5b5061036261074736600461311b565b60096020526000908152604090205481565b34801561076557600080fd5b5030610580565b34801561077857600080fd5b506105807f000000000000000000000000000000000000000000000000000000000000000081565b3480156107ac57600080fd5b50600454610580906001600160a01b031681565b3480156107cc57600080fd5b5061036260085481565b3480156107e257600080fd5b5061032c6107f13660046132fb565b611306565b34801561080257600080fd5b5061032c6108113660046132fb565b6113a4565b34801561082257600080fd5b5061032c6108313660046132fb565b611420565b34801561084257600080fd5b506102f261085136600461339c565b600e6020526000908152604090205463ffffffff1681565b34801561087557600080fd5b5061032c61149f565b34801561088a57600080fd5b50600354610580906001600160a01b031681565b3480156108aa57600080fd5b506001546001600160a01b0316610580565b3480156108c857600080fd5b506000546001600160a01b0316156103f0565b3480156108e757600080fd5b5061032c6108f63660046132fb565b61150f565b34801561090757600080fd5b506105807f000000000000000000000000000000000000000000000000000000000000000081565b34801561093b57600080fd5b5061036260065481565b34801561095157600080fd5b506103627f000000000000000000000000000000000000000000000000000000000000000081565b34801561098557600080fd5b506103f06109943660046132fb565b6115e6565b3480156109a557600080fd5b5061032c6109b436600461311b565b6115f7565b3480156109c557600080fd5b506109d96109d43660046133b7565b61162b565b60405161030392919061340e565b6000546001600160a01b03163314610a12576040516311a8a1bb60e31b815260040160405180910390fd5b6008548103610a575760405162461bcd60e51b815260206004820152600c60248201526b2164656c6179426c6f636b7360a01b60448201526064015b60405180910390fd5b60405133815281907f8bd16320f3b60336ed5fd2a770eb7453e7e71cfef4462addffd7ae9dfe201c8e9060200160405180910390a2600855565b610a996117fa565b43600554600654610aaa919061343d565b1115610ac9576040516346cf2af160e11b815260040160405180910390fd5b4360068190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b549190613450565b6000818152600c602052604090205490915060ff1615610baa5760405162461bcd60e51b81526020600482015260116024820152701c9bdbdd08185b1c9958591e481cd95b9d607a1b6044820152606401610a4e565b600081604051602001610bbf91815260200190565b6040516020818303038152906040529050610bda8184611847565b6000828152600c602052604090819020805460ff19166001179055517fdcaa37a042a0087de79018c629bbd29cee82ca80bd9be394e1696bf9e935507790610c2790839086903390613469565b60405180910390a1505050565b6000546001600160a01b03163314610c5f576040516311a8a1bb60e31b815260040160405180910390fd5b610c67611884565b610c6f6118d4565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cd25760405162461bcd60e51b8152600401610a4e9060208082526004908201526310a0a6a160e11b604082015260600190565b610cdb81611929565b7fb3abc57bfeebd2cac918901db582f71972a8e628bccf19f5ae3e3482b98a5ced8133604051610d0c9291906134a7565b60405180910390a150565b610d1f6117fa565b610d276119c9565b83610d5e5760405162461bcd60e51b81526020600482015260076024820152662170726f6f667360c81b6044820152606401610a4e565b600085856000818110610d7357610d736134d1565b9050602002810190610d8591906134e7565b610d8f9080613508565b604051610d9d929190613556565b604051809103902090506000610e048288886000818110610dc057610dc06134d1565b9050602002810190610dd291906134e7565b60200189896000818110610de857610de86134d1565b9050602002810190610dfa91906134e7565b6104200135611a22565b9050610e1281868686611ac9565b6000828152600f60205260409020805460ff1916600190811790915586905b818163ffffffff161015610f385788888263ffffffff16818110610e5757610e576134d1565b9050602002810190610e6991906134e7565b610e739080613508565b604051610e81929190613556565b604051809103902093506000610ed6858b8b8563ffffffff16818110610ea957610ea96134d1565b9050602002810190610ebb91906134e7565b6020018c8c8663ffffffff16818110610de857610de86134d1565b9050838114610f155760405162461bcd60e51b815260206004820152600b60248201526a085cda185c9959149bdbdd60aa1b6044820152606401610a4e565b506000848152600f60205260409020805460ff1916600190811790915501610e31565b5060005b818163ffffffff161015610fc457610fbb89898363ffffffff16818110610f6557610f656134d1565b9050602002810190610f7791906134e7565b610f819080613508565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bc492505050565b50600101610f3c565b50505050610fd26001600755565b5050505050565b6000546001600160a01b03163314611004576040516311a8a1bb60e31b815260040160405180910390fd5b61100d81611ea1565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190613450565b905090565b6000546001600160a01b031633146110c4576040516311a8a1bb60e31b815260040160405180910390fd5b476110cf8282611f0a565b816001600160a01b03167feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d8260405161110a91815260200190565b60405180910390a25050565b6000546001600160a01b03163314611141576040516311a8a1bb60e31b815260040160405180910390fd5b611149611884565b600081815260096020526040812054900361119e5760405162461bcd60e51b8152602060048201526015602482015274616767726567617465526f6f74202165786973747360581b6044820152606401610a4e565b60008181526009602052604080822091909155517ff51534ecf10a58db36ce4f5180f59deddf3b3eb7c5e7454e602c2f80a40cc73990610d0c9083815260200190565b6000546001600160a01b03163314610c6f576040516311a8a1bb60e31b815260040160405180910390fd5b6000546001600160a01b03163314611237576040516311a8a1bb60e31b815260040160405180910390fd5b61100d81612028565b600480546040516384785ecd60e01b815233928101929092526001600160a01b0316906384785ecd90602401602060405180830381865afa158015611289573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ad9190613566565b6112e45760405162461bcd60e51b815260206004820152600860248201526710bbb0ba31b432b960c11b6044820152606401610a4e565b6112ec6117fa565b610c6f612069565b6000606061130183611929565b915091565b6000546001600160a01b03163314611331576040516311a8a1bb60e31b815260040160405180910390fd5b6001546001600160a01b03828116911614801561134f575060025415155b1561136d576040516311bc066560e11b815260040160405180910390fd5b6000546001600160a01b0380831691160361139b57604051634a2fb73f60e11b815260040160405180910390fd5b61100d816120ac565b6000546001600160a01b031633146113cf576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916905590519182527f384859c5ef5fafac31e8bc92ce7fb48b1f2c74c4dd5e212eb84ec202fa5d9fad9101610d0c565b6000546001600160a01b0316331461144b576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916600117905590519182527fd65eca5d561d3a4568c87b9b13ced4ab52a69edadfdfdb22d76bc595f36d7d879101610d0c565b6001546001600160a01b031633146114ca576040516311a7f27160e11b815260040160405180910390fd5b62093a80600254426114dc9190613588565b116114fa576040516324e0285f60e21b815260040160405180910390fd5b600154610c6f906001600160a01b03166120fa565b6000546001600160a01b0316331461153a576040516311a8a1bb60e31b815260040160405180910390fd5b6004546001600160a01b03908116908216036115985760405162461bcd60e51b815260206004820152601760248201527f616c72656164792077617463686572206d616e616765720000000000000000006044820152606401610a4e565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc16d059e43d7f8e29ccb4e001a2f249d3c59e274925d6a6bc3912943441d9f6c90602001610d0c565b60006115f18261215f565b92915050565b6000546001600160a01b03163314611622576040516311a8a1bb60e31b815260040160405180910390fd5b61100d8161218b565b336000908152600d602052604081205460609060ff1661167c5760405162461bcd60e51b815260206004820152600c60248201526b08585b1b1bdddb1a5cdd195960a21b6044820152606401610a4e565b63ffffffff8086166000908152600e60205260408120805491929190911690826116a58361359b565b91906101000a81548163ffffffff021916908363ffffffff160217905550905060006117047f00000000000000000000000000000000000000000000000000000000000000006116fb336001600160a01b031690565b848a8a8a612209565b80516020820120604051632d287e4360e01b8152600481018290529192509060009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d287e439060240160408051808303816000875af115801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e91906135be565b90925090507f40f08ee347fc927ae45902edc87debb024aab1a311943731968607f603f2152f836117d0600184613588565b84876040516117e294939291906135e2565b60405180910390a15090989197509095505050505050565b600354600160a01b900460ff1615610c6f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a4e565b600354611880907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168484612241565b5050565b600354600160a01b900460ff16610c6f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a4e565b6118dc611884565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60035461193e906001600160a01b031661215f565b61197d5760405162461bcd60e51b815260206004820152601060248201526f10b6b4b93937b921b7b73732b1ba37b960811b6044820152606401610a4e565b80516020146119b85760405162461bcd60e51b8152602060048201526007602482015266042d8cadccee8d60cb1b6044820152606401610a4e565b61100d6119c482613611565b612441565b600260075403611a1b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4e565b6002600755565b6000806000858152600f602052604090205460ff166002811115611a4857611a4861320c565b14611a8b5760405162461bcd60e51b8152602060048201526013602482015272214d6573736167655374617475732e4e6f6e6560681b6044820152606401610a4e565b611abf84846020806020026040519081016040528092919082602080028082843760009201919091525086915061256a9050565b90505b9392505050565b6000848152600b602052604090205460ff16611bbe57611ae8836128b8565b6000611b1e85846020806020026040519081016040528092919082602080028082843760009201919091525086915061256a9050565b9050838114611b655760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081a5b989bdd5b99149bdbdd606a1b6044820152606401610a4e565b6000858152600b602052604090819020805460ff1916600117905551849086907f7ec1ea51fe3db53e55ed9d922854bc2156f467ff2f87d74e2086dae2c84a88a890611bb49086815260200190565b60405180910390a3505b50505050565b600080611bd18382612a18565b905063ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611c0962ffffff198316612a3c565b63ffffffff1614611c4b5760405162461bcd60e51b815260206004820152600c60248201526b10b232b9ba34b730ba34b7b760a11b6044820152606401610a4e565b6000611c5c62ffffff198316612a51565b905060016000828152600f602052604090205460ff166002811115611c8357611c8361320c565b14611cba5760405162461bcd60e51b815260206004820152600760248201526610b83937bb32b760c91b6044820152606401610a4e565b6000818152600f60205260409020805460ff191660021790556001611d1f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061343d565b611d299190613588565b5a11611d605760405162461bcd60e51b8152600401610a4e906020808252600490820152632167617360e01b604082015260600190565b6000611d7162ffffff198416612a9a565b6040805161010080825261012082019092529192507f000000000000000000000000000000000000000000000000000000000000000091600090826020820181803683370190505090506000611dcc62ffffff198816612aab565b611ddb62ffffff198916612abf565b611dea62ffffff198a16612ad4565b611e07611dfc62ffffff198c16612ae9565b62ffffff1916612b17565b604051602401611e1a9493929190613638565b60408051601f198184030181529190526020810180516001600160e01b031663ab2dc3f560e01b1790529050611e54858560008685612b60565b60405191995092507fd42de95a9b26f1be134c8ecce389dc4fcfa18753d01661b7b361233569e8fe4890611e8d9088908b908690613667565b60405180910390a150505050505050919050565b600354604080516001600160a01b03928316815291831660208301527fc77bec288fc88f168427f2f7da682eadb26cac89d8d591af6e443da98dff2bbc910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b80471015611f5a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a4e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611fa7576040519150601f19603f3d011682016040523d82523d6000602084013e611fac565b606091505b50509050806120235760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a4e565b505050565b60105460408051918252602082018390527f877a02cb809da0364d23adca3cd50c451b53f279d3df632e1fc11eb66335bce5910160405180910390a1601055565b6120716117fa565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861190c3390565b42600255600180546001600160a01b0319166001600160a01b0383169081179091556040517f6ab4d119f23076e8ad491bc65ce85f017fb0591dce08755ba8591059cc51737a90600090a250565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316178155600255600180549091169055565b60006115f17f000000000000000000000000000000000000000000000000000000000000000083612beb565b60055481036121ce5760405162461bcd60e51b815260206004820152600f60248201526e085b995dc81c985d19481b1a5b5a5d608a1b6044820152606401610a4e565b600581905560408051338152602081018390527f8e7fa5e406cb856aab05575e45ea011c6748376cc1b5229e3d67b92986406a159101610d0c565b606086868686868660405160200161222696959493929190613688565b60405160208183030381529060405290509695505050505050565b81516020146122815760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a4e565b8051156122bf5760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a4e565b60006122ca34612d21565b6040516366c96b3760e01b8152606060048201526000606482018190527f00000000000000000000000000000000000000000000000000000000000000006024830152602060448301529192506001600160a01b038716906366c96b3790608401602060405180830381865afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190613450565b905061237982600161343d565b81106123af5760405162461bcd60e51b8152602060048201526005602482015264216665657360d81b6044820152606401610a4e565b60405163bd45c4e760e01b81526001600160a01b0387169063bd45c4e790849061240790899089906000907f0000000000000000000000000000000000000000000000000000000000000000906002906004016136e2565b6000604051808303818588803b15801561242057600080fd5b505af1158015612434573d6000803e3d6000fd5b5050505050505050505050565b8061247f5760405162461bcd60e51b815260206004820152600e60248201526d6e657720726f6f7420656d70747960901b6044820152606401610a4e565b600081815260096020526040902054156124d25760405162461bcd60e51b8152602060048201526014602482015273726f6f7420616c72656164792070656e64696e6760601b6044820152606401610a4e565b6000818152600a602052604090205460ff16156125275760405162461bcd60e51b81526020600482015260136024820152723937b7ba1030b63932b0b23c90383937bb32b760691b6044820152606401610a4e565b60008181526009602052604090819020439055517f84ef18531155afdb0e64ff905d67044ae3aac63a6fba4661cfd9c4c14f289bc890610d0c9083815260200190565b6020600582811b8216948552835194820394909452604060008181206002851615871b808503919091528386015190528181206004851615871b808503919091528286015190528181206008851615871b80850391909152606086015190528181206010851615871b8085039190915260808087015190915282822084861615881b8086039190915260a0870151905282822083861615881b8086039190915260c0870151905282822090851615871b8085039190915260e0860151905281812061010080861615881b80860392909252860151905281812061020080861615881b80860392909252610120870151909152828220610400861615881b808603919091526101408701519052828220610800861615881b808603919091526101608701519052828220611000861615881b808603919091526101808701519052828220612000861615881b808603919091526101a08701519052828220614000861615881b808603919091526101c08701519052828220618000861615881b808603919091526101e0870151905282822062010000861615881b8086039190915290860151905281812062020000851615871b80850391909152610220860151905281812062040000851615871b80850391909152610240860151905281812062080000851615871b80850391909152610260860151905281812062100000851615871b80850391909152610280860151905281812062200000851615871b808503919091526102a0860151905281812062400000851615871b808503919091526102c0860151905281812062800000851615871b808503919091526102e086015190528181206301000000851615871b8085039190915261030086015190528181206302000000851615871b8085039190915261032086015190528181206304000000851615871b8085039190915261034086015190528181206308000000851615871b8085039190915261036086015190528181206310000000851615871b8085039190915261038086015190528181206320000000851615871b808503919091526103a086015190528181206340000000851615871b808503919091526103c0860151905281812063800000009094161590951b91829003929092526103e090920151909152902090565b806128fb5760405162461bcd60e51b8152602060048201526013602482015272616767726567617465526f6f7420656d70747960681b6044820152606401610a4e565b6000818152600a602052604090205460ff16156129155750565b6000818152600960205260408120549081900361296b5760405162461bcd60e51b81526020600482015260146024820152731859d9dc9959d85d19549bdbdd0808595e1a5cdd60621b6044820152606401610a4e565b6008546129788243613588565b10156129c65760405162461bcd60e51b815260206004820152601760248201527f616767726567617465526f6f74202176657269666965640000000000000000006044820152606401610a4e565b6000828152600a6020526040808220805460ff191660011790555183917f36b314aba9f663b4d3ef3288ae489341cc5e6a2725a05fa2b72df7a27e03f42a91a250600090815260096020526040812055565b815160009060208401612a3364ffffffffff85168284612d37565b95945050505050565b60006115f162ffffff19831660286004612d74565b600080612a678360781c6001600160601b031690565b6001600160601b031690506000612a878460181c6001600160601b031690565b6001600160601b03169091209392505050565b60006115f1612aa883612da4565b90565b60006115f162ffffff198316826004612d74565b60006115f162ffffff19831660246004612d74565b60006115f162ffffff19831660046020612db5565b60006115f1604c612b0781601886901c6001600160601b0316613588565b62ffffff19851691906000612ec0565b6060600080612b2f8460181c6001600160601b031690565b6001600160601b031690506040519150819250612b4f8483602001612f3c565b508181016020016040529052919050565b6000606060008060008661ffff1667ffffffffffffffff811115612b8657612b86613134565b6040519080825280601f01601f191660200182016040528015612bb0576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115612bd1578692505b828152826000602083013e90999098509650505050505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612c515760405162461bcd60e51b815260206004820152600960248201526810b2bc32b1baba37b960b91b6044820152606401610a4e565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd69190613720565b5091509150836001600160a01b0316826001600160a01b0316148015612a3357507f000000000000000000000000000000000000000000000000000000000000000014949350505050565b6000601054821115612d335760105491505b5090565b600080612d44838561343d565b9050604051811115612d54575060005b80600003612d695762ffffff19915050611ac2565b612a3385858561302f565b6000612d81826020613757565b612d8c906008613770565b60ff16612d9a858585612db5565b901c949350505050565b60006115f162ffffff198316602c60205b60008160ff16600003612dca57506000611ac2565b612ddd8460181c6001600160601b031690565b6001600160601b0316612df360ff84168561343d565b1115612e5b57612e0c8460781c6001600160601b031690565b612e1f8560181c6001600160601b031690565b6040516378218d2960e01b81526001600160601b039283166004820152911660248201526044810184905260ff83166064820152608401610a4e565b60208260ff161115612e805760405163045df3f960e01b815260040160405180910390fd5b600882026000612e998660781c6001600160601b031690565b6001600160601b031690506000600160ff1b60001984011d91909501511695945050505050565b600080612ed68660781c6001600160601b031690565b6001600160601b03169050612eea866130a6565b84612ef5878461343d565b612eff919061343d565b1115612f125762ffffff19915050612f34565b612f1c858261343d565b9050612f308364ffffffffff168286612d37565b9150505b949350505050565b600062ffffff1980841603612f645760405163148d513360e21b815260040160405180910390fd5b612f6d836130df565b15612f8b57604051632ee0949160e11b815260040160405180910390fd5b6000612fa08460181c6001600160601b031690565b6001600160601b031690506000612fc08560781c6001600160601b031690565b6001600160601b03169050600080604051915085821115612fe15760206060fd5b8386858560045afa90508061300957604051632af1bd9b60e21b815260040160405180910390fd5b6130246130168860d81c90565b64ffffffffff16878661302f565b979650505050505050565b60006060601883856001600160601b03821682148015613057575086816001600160601b0316145b6130905760405162461bcd60e51b815260206004820152600a602482015269085d1c9d5b98d85d195960b21b6044820152606401610a4e565b96831b90961790911b90941790931b9392505050565b60006130bb8260181c6001600160601b031690565b6130ce8360781c6001600160601b031690565b016001600160601b03169050919050565b60006130eb8260d81c90565b64ffffffffff1664ffffffffff0361310557506001919050565b6000613110836130a6565b604051109392505050565b60006020828403121561312d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261315b57600080fd5b813567ffffffffffffffff8082111561317657613176613134565b604051601f8301601f19908116603f0116810190828211818310171561319e5761319e613134565b816040528381528660208588010111156131b757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156131e957600080fd5b813567ffffffffffffffff81111561320057600080fd5b612f348482850161314a565b634e487b7160e01b600052602160045260246000fd5b602081016003831061324457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806000806000610460868803121561326357600080fd5b853567ffffffffffffffff8082111561327b57600080fd5b818801915088601f83011261328f57600080fd5b81358181111561329e57600080fd5b8960208260051b85010111156132b357600080fd5b6020928301975095505086013592506104408601878111156132d457600080fd5b94979396509194604001933592915050565b6001600160a01b038116811461100d57600080fd5b60006020828403121561330d57600080fd5b8135611ac2816132e6565b60005b8381101561333357818101518382015260200161331b565b50506000910152565b60008151808452613354816020860160208601613318565b601f01601f19169290920160200192915050565b8215158152604060208201526000611abf604083018461333c565b803563ffffffff8116811461339757600080fd5b919050565b6000602082840312156133ae57600080fd5b611ac282613383565b6000806000606084860312156133cc57600080fd5b6133d584613383565b925060208401359150604084013567ffffffffffffffff8111156133f857600080fd5b6134048682870161314a565b9150509250925092565b828152604060208201526000611abf604083018461333c565b634e487b7160e01b600052601160045260246000fd5b808201808211156115f1576115f1613427565b60006020828403121561346257600080fd5b5051919050565b60608152600061347c606083018661333c565b828103602084015261348e818661333c565b91505060018060a01b0383166040830152949350505050565b6040815260006134ba604083018561333c565b905060018060a01b03831660208301529392505050565b634e487b7160e01b600052603260045260246000fd5b6000823561043e198336030181126134fe57600080fd5b9190910192915050565b6000808335601e1984360301811261351f57600080fd5b83018035915067ffffffffffffffff82111561353a57600080fd5b60200191503681900382131561354f57600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561357857600080fd5b81518015158114611ac257600080fd5b818103818111156115f1576115f1613427565b600063ffffffff8083168181036135b4576135b4613427565b6001019392505050565b600080604083850312156135d157600080fd5b505080516020909101519092909150565b848152836020820152826040820152608060608201526000613607608083018461333c565b9695505050505050565b80516020808301519190811015613632576000198160200360031b1b821691505b50919050565b600063ffffffff808716835280861660208401525083604083015260806060830152613607608083018461333c565b8381528215156020820152606060408201526000612a33606083018461333c565b600063ffffffff60e01b808960e01b168352876004840152808760e01b166024840152808660e01b1660288401525083602c83015282516136d081604c850160208701613318565b91909101604c01979650505050505050565b600060018060a01b03808816835260a0602084015261370460a084018861333c565b9516604083015250606081019290925260809091015292915050565b60008060006060848603121561373557600080fd5b8351613740816132e6565b602085015160409095015190969495509392505050565b60ff82811682821603908111156115f1576115f1613427565b60ff818116838216029081169081811461378c5761378c613427565b509291505056fea264697066735822122043cb57dda3d0d3e129ba582556881d3d321ac4038f65ad83464a601c6bc4318e64736f6c63430008110033",
  "deployedBytecode": "0x6080604052600436106102b25760003560e01c80638456cb5911610175578063b697f531116100dc578063d2a3cc7111610095578063d88beda21161006f578063d88beda214610945578063db1b765914610979578063e0fed01014610999578063fa31de01146109b957600080fd5b8063d2a3cc71146108db578063d69f9d61146108fb578063d7d317b31461092f57600080fd5b8063b697f53114610816578063b95a200114610836578063c5b350df14610869578063cc3942831461087e578063d1851c921461089e578063d232c220146108bc57600080fd5b80639fa92f9d1161012e5780639fa92f9d14610759578063a01892a51461076c578063a792c29b146107a0578063ad9c0c2e146107c0578063b1f8100d146107d6578063b2f87643146107f657600080fd5b80638456cb59146106685780638d3638f41461067d5780638da5cb5b146106b057806398c9f2b9146106ce5780639abaf479146106fe5780639d3117c71461072c57600080fd5b8063572386ca1161021957806365eaf11b116101d257806365eaf11b146105c857806368742da6146105dd5780636a42b8f8146105fd5780636b04a93314610613578063715018a6146106335780637850b0201461064857600080fd5b8063572386ca146104c7578063579c1618146104f75780635bd11efc1461050d5780635c975abb1461052d5780635f61e3ec1461054c5780636159ada11461059857600080fd5b80633cf52ffb1161026b5780633cf52ffb146104005780633f4ba83a146104155780634ff746f61461042a578063508a109b1461044a5780635190bc531461046a57806352a9674b1461049357600080fd5b806314168416146102be5780631eeaabea1461030c57806325e3beda1461032e5780632bb1ae7c146103705780632bbd59ca14610383578063301f07c3146103c057600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b506102f27f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020015b60405180910390f35b34801561031857600080fd5b5061032c61032736600461311b565b6109e7565b005b34801561033a57600080fd5b506103627f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610303565b61032c61037e3660046131d7565b610a91565b34801561038f57600080fd5b506103b361039e36600461311b565b600f6020526000908152604090205460ff1681565b6040516103039190613222565b3480156103cc57600080fd5b506103f06103db36600461311b565b600a6020526000908152604090205460ff1681565b6040519015158152602001610303565b34801561040c57600080fd5b50600254610362565b34801561042157600080fd5b5061032c610c34565b34801561043657600080fd5b5061032c6104453660046131d7565b610c71565b34801561045657600080fd5b5061032c61046536600461324a565b610d17565b34801561047657600080fd5b506103f06104853660046132fb565b6001600160a01b0316301490565b34801561049f57600080fd5b506102f27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d357600080fd5b506103f06104e236600461311b565b600c6020526000908152604090205460ff1681565b34801561050357600080fd5b5061036260055481565b34801561051957600080fd5b5061032c6105283660046132fb565b610fd9565b34801561053957600080fd5b50600354600160a01b900460ff166103f0565b34801561055857600080fd5b506105807f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610303565b3480156105a457600080fd5b506103f06105b33660046132fb565b600d6020526000908152604090205460ff1681565b3480156105d457600080fd5b50610362611010565b3480156105e957600080fd5b5061032c6105f83660046132fb565b611099565b34801561060957600080fd5b5062093a80610362565b34801561061f57600080fd5b5061032c61062e36600461311b565b611116565b34801561063f57600080fd5b5061032c6111e1565b34801561065457600080fd5b5061032c61066336600461311b565b61120c565b34801561067457600080fd5b5061032c611240565b34801561068957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102f2565b3480156106bc57600080fd5b506000546001600160a01b0316610580565b3480156106da57600080fd5b506103f06106e936600461311b565b600b6020526000908152604090205460ff1681565b34801561070a57600080fd5b5061071e6107193660046131d7565b6112f4565b604051610303929190613368565b34801561073857600080fd5b5061036261074736600461311b565b60096020526000908152604090205481565b34801561076557600080fd5b5030610580565b34801561077857600080fd5b506105807f000000000000000000000000000000000000000000000000000000000000000081565b3480156107ac57600080fd5b50600454610580906001600160a01b031681565b3480156107cc57600080fd5b5061036260085481565b3480156107e257600080fd5b5061032c6107f13660046132fb565b611306565b34801561080257600080fd5b5061032c6108113660046132fb565b6113a4565b34801561082257600080fd5b5061032c6108313660046132fb565b611420565b34801561084257600080fd5b506102f261085136600461339c565b600e6020526000908152604090205463ffffffff1681565b34801561087557600080fd5b5061032c61149f565b34801561088a57600080fd5b50600354610580906001600160a01b031681565b3480156108aa57600080fd5b506001546001600160a01b0316610580565b3480156108c857600080fd5b506000546001600160a01b0316156103f0565b3480156108e757600080fd5b5061032c6108f63660046132fb565b61150f565b34801561090757600080fd5b506105807f000000000000000000000000000000000000000000000000000000000000000081565b34801561093b57600080fd5b5061036260065481565b34801561095157600080fd5b506103627f000000000000000000000000000000000000000000000000000000000000000081565b34801561098557600080fd5b506103f06109943660046132fb565b6115e6565b3480156109a557600080fd5b5061032c6109b436600461311b565b6115f7565b3480156109c557600080fd5b506109d96109d43660046133b7565b61162b565b60405161030392919061340e565b6000546001600160a01b03163314610a12576040516311a8a1bb60e31b815260040160405180910390fd5b6008548103610a575760405162461bcd60e51b815260206004820152600c60248201526b2164656c6179426c6f636b7360a01b60448201526064015b60405180910390fd5b60405133815281907f8bd16320f3b60336ed5fd2a770eb7453e7e71cfef4462addffd7ae9dfe201c8e9060200160405180910390a2600855565b610a996117fa565b43600554600654610aaa919061343d565b1115610ac9576040516346cf2af160e11b815260040160405180910390fd5b4360068190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b549190613450565b6000818152600c602052604090205490915060ff1615610baa5760405162461bcd60e51b81526020600482015260116024820152701c9bdbdd08185b1c9958591e481cd95b9d607a1b6044820152606401610a4e565b600081604051602001610bbf91815260200190565b6040516020818303038152906040529050610bda8184611847565b6000828152600c602052604090819020805460ff19166001179055517fdcaa37a042a0087de79018c629bbd29cee82ca80bd9be394e1696bf9e935507790610c2790839086903390613469565b60405180910390a1505050565b6000546001600160a01b03163314610c5f576040516311a8a1bb60e31b815260040160405180910390fd5b610c67611884565b610c6f6118d4565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cd25760405162461bcd60e51b8152600401610a4e9060208082526004908201526310a0a6a160e11b604082015260600190565b610cdb81611929565b7fb3abc57bfeebd2cac918901db582f71972a8e628bccf19f5ae3e3482b98a5ced8133604051610d0c9291906134a7565b60405180910390a150565b610d1f6117fa565b610d276119c9565b83610d5e5760405162461bcd60e51b81526020600482015260076024820152662170726f6f667360c81b6044820152606401610a4e565b600085856000818110610d7357610d736134d1565b9050602002810190610d8591906134e7565b610d8f9080613508565b604051610d9d929190613556565b604051809103902090506000610e048288886000818110610dc057610dc06134d1565b9050602002810190610dd291906134e7565b60200189896000818110610de857610de86134d1565b9050602002810190610dfa91906134e7565b6104200135611a22565b9050610e1281868686611ac9565b6000828152600f60205260409020805460ff1916600190811790915586905b818163ffffffff161015610f385788888263ffffffff16818110610e5757610e576134d1565b9050602002810190610e6991906134e7565b610e739080613508565b604051610e81929190613556565b604051809103902093506000610ed6858b8b8563ffffffff16818110610ea957610ea96134d1565b9050602002810190610ebb91906134e7565b6020018c8c8663ffffffff16818110610de857610de86134d1565b9050838114610f155760405162461bcd60e51b815260206004820152600b60248201526a085cda185c9959149bdbdd60aa1b6044820152606401610a4e565b506000848152600f60205260409020805460ff1916600190811790915501610e31565b5060005b818163ffffffff161015610fc457610fbb89898363ffffffff16818110610f6557610f656134d1565b9050602002810190610f7791906134e7565b610f819080613508565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bc492505050565b50600101610f3c565b50505050610fd26001600755565b5050505050565b6000546001600160a01b03163314611004576040516311a8a1bb60e31b815260040160405180910390fd5b61100d81611ea1565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebf0c7176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190613450565b905090565b6000546001600160a01b031633146110c4576040516311a8a1bb60e31b815260040160405180910390fd5b476110cf8282611f0a565b816001600160a01b03167feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d8260405161110a91815260200190565b60405180910390a25050565b6000546001600160a01b03163314611141576040516311a8a1bb60e31b815260040160405180910390fd5b611149611884565b600081815260096020526040812054900361119e5760405162461bcd60e51b8152602060048201526015602482015274616767726567617465526f6f74202165786973747360581b6044820152606401610a4e565b60008181526009602052604080822091909155517ff51534ecf10a58db36ce4f5180f59deddf3b3eb7c5e7454e602c2f80a40cc73990610d0c9083815260200190565b6000546001600160a01b03163314610c6f576040516311a8a1bb60e31b815260040160405180910390fd5b6000546001600160a01b03163314611237576040516311a8a1bb60e31b815260040160405180910390fd5b61100d81612028565b600480546040516384785ecd60e01b815233928101929092526001600160a01b0316906384785ecd90602401602060405180830381865afa158015611289573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ad9190613566565b6112e45760405162461bcd60e51b815260206004820152600860248201526710bbb0ba31b432b960c11b6044820152606401610a4e565b6112ec6117fa565b610c6f612069565b6000606061130183611929565b915091565b6000546001600160a01b03163314611331576040516311a8a1bb60e31b815260040160405180910390fd5b6001546001600160a01b03828116911614801561134f575060025415155b1561136d576040516311bc066560e11b815260040160405180910390fd5b6000546001600160a01b0380831691160361139b57604051634a2fb73f60e11b815260040160405180910390fd5b61100d816120ac565b6000546001600160a01b031633146113cf576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916905590519182527f384859c5ef5fafac31e8bc92ce7fb48b1f2c74c4dd5e212eb84ec202fa5d9fad9101610d0c565b6000546001600160a01b0316331461144b576040516311a8a1bb60e31b815260040160405180910390fd5b6001600160a01b0381166000818152600d6020908152604091829020805460ff1916600117905590519182527fd65eca5d561d3a4568c87b9b13ced4ab52a69edadfdfdb22d76bc595f36d7d879101610d0c565b6001546001600160a01b031633146114ca576040516311a7f27160e11b815260040160405180910390fd5b62093a80600254426114dc9190613588565b116114fa576040516324e0285f60e21b815260040160405180910390fd5b600154610c6f906001600160a01b03166120fa565b6000546001600160a01b0316331461153a576040516311a8a1bb60e31b815260040160405180910390fd5b6004546001600160a01b03908116908216036115985760405162461bcd60e51b815260206004820152601760248201527f616c72656164792077617463686572206d616e616765720000000000000000006044820152606401610a4e565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc16d059e43d7f8e29ccb4e001a2f249d3c59e274925d6a6bc3912943441d9f6c90602001610d0c565b60006115f18261215f565b92915050565b6000546001600160a01b03163314611622576040516311a8a1bb60e31b815260040160405180910390fd5b61100d8161218b565b336000908152600d602052604081205460609060ff1661167c5760405162461bcd60e51b815260206004820152600c60248201526b08585b1b1bdddb1a5cdd195960a21b6044820152606401610a4e565b63ffffffff8086166000908152600e60205260408120805491929190911690826116a58361359b565b91906101000a81548163ffffffff021916908363ffffffff160217905550905060006117047f00000000000000000000000000000000000000000000000000000000000000006116fb336001600160a01b031690565b848a8a8a612209565b80516020820120604051632d287e4360e01b8152600481018290529192509060009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632d287e439060240160408051808303816000875af115801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e91906135be565b90925090507f40f08ee347fc927ae45902edc87debb024aab1a311943731968607f603f2152f836117d0600184613588565b84876040516117e294939291906135e2565b60405180910390a15090989197509095505050505050565b600354600160a01b900460ff1615610c6f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a4e565b600354611880907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03168484612241565b5050565b600354600160a01b900460ff16610c6f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a4e565b6118dc611884565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60035461193e906001600160a01b031661215f565b61197d5760405162461bcd60e51b815260206004820152601060248201526f10b6b4b93937b921b7b73732b1ba37b960811b6044820152606401610a4e565b80516020146119b85760405162461bcd60e51b8152602060048201526007602482015266042d8cadccee8d60cb1b6044820152606401610a4e565b61100d6119c482613611565b612441565b600260075403611a1b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4e565b6002600755565b6000806000858152600f602052604090205460ff166002811115611a4857611a4861320c565b14611a8b5760405162461bcd60e51b8152602060048201526013602482015272214d6573736167655374617475732e4e6f6e6560681b6044820152606401610a4e565b611abf84846020806020026040519081016040528092919082602080028082843760009201919091525086915061256a9050565b90505b9392505050565b6000848152600b602052604090205460ff16611bbe57611ae8836128b8565b6000611b1e85846020806020026040519081016040528092919082602080028082843760009201919091525086915061256a9050565b9050838114611b655760405162461bcd60e51b81526020600482015260136024820152721a5b9d985b1a59081a5b989bdd5b99149bdbdd606a1b6044820152606401610a4e565b6000858152600b602052604090819020805460ff1916600117905551849086907f7ec1ea51fe3db53e55ed9d922854bc2156f467ff2f87d74e2086dae2c84a88a890611bb49086815260200190565b60405180910390a3505b50505050565b600080611bd18382612a18565b905063ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611c0962ffffff198316612a3c565b63ffffffff1614611c4b5760405162461bcd60e51b815260206004820152600c60248201526b10b232b9ba34b730ba34b7b760a11b6044820152606401610a4e565b6000611c5c62ffffff198316612a51565b905060016000828152600f602052604090205460ff166002811115611c8357611c8361320c565b14611cba5760405162461bcd60e51b815260206004820152600760248201526610b83937bb32b760c91b6044820152606401610a4e565b6000818152600f60205260409020805460ff191660021790556001611d1f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061343d565b611d299190613588565b5a11611d605760405162461bcd60e51b8152600401610a4e906020808252600490820152632167617360e01b604082015260600190565b6000611d7162ffffff198416612a9a565b6040805161010080825261012082019092529192507f000000000000000000000000000000000000000000000000000000000000000091600090826020820181803683370190505090506000611dcc62ffffff198816612aab565b611ddb62ffffff198916612abf565b611dea62ffffff198a16612ad4565b611e07611dfc62ffffff198c16612ae9565b62ffffff1916612b17565b604051602401611e1a9493929190613638565b60408051601f198184030181529190526020810180516001600160e01b031663ab2dc3f560e01b1790529050611e54858560008685612b60565b60405191995092507fd42de95a9b26f1be134c8ecce389dc4fcfa18753d01661b7b361233569e8fe4890611e8d9088908b908690613667565b60405180910390a150505050505050919050565b600354604080516001600160a01b03928316815291831660208301527fc77bec288fc88f168427f2f7da682eadb26cac89d8d591af6e443da98dff2bbc910160405180910390a1600380546001600160a01b0319166001600160a01b0392909216919091179055565b80471015611f5a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a4e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611fa7576040519150601f19603f3d011682016040523d82523d6000602084013e611fac565b606091505b50509050806120235760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a4e565b505050565b60105460408051918252602082018390527f877a02cb809da0364d23adca3cd50c451b53f279d3df632e1fc11eb66335bce5910160405180910390a1601055565b6120716117fa565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861190c3390565b42600255600180546001600160a01b0319166001600160a01b0383169081179091556040517f6ab4d119f23076e8ad491bc65ce85f017fb0591dce08755ba8591059cc51737a90600090a250565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316178155600255600180549091169055565b60006115f17f000000000000000000000000000000000000000000000000000000000000000083612beb565b60055481036121ce5760405162461bcd60e51b815260206004820152600f60248201526e085b995dc81c985d19481b1a5b5a5d608a1b6044820152606401610a4e565b600581905560408051338152602081018390527f8e7fa5e406cb856aab05575e45ea011c6748376cc1b5229e3d67b92986406a159101610d0c565b606086868686868660405160200161222696959493929190613688565b60405160208183030381529060405290509695505050505050565b81516020146122815760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a4e565b8051156122bf5760405162461bcd60e51b815260206004820152600c60248201526b042c8c2e8c240d8cadccee8d60a31b6044820152606401610a4e565b60006122ca34612d21565b6040516366c96b3760e01b8152606060048201526000606482018190527f00000000000000000000000000000000000000000000000000000000000000006024830152602060448301529192506001600160a01b038716906366c96b3790608401602060405180830381865afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190613450565b905061237982600161343d565b81106123af5760405162461bcd60e51b8152602060048201526005602482015264216665657360d81b6044820152606401610a4e565b60405163bd45c4e760e01b81526001600160a01b0387169063bd45c4e790849061240790899089906000907f0000000000000000000000000000000000000000000000000000000000000000906002906004016136e2565b6000604051808303818588803b15801561242057600080fd5b505af1158015612434573d6000803e3d6000fd5b5050505050505050505050565b8061247f5760405162461bcd60e51b815260206004820152600e60248201526d6e657720726f6f7420656d70747960901b6044820152606401610a4e565b600081815260096020526040902054156124d25760405162461bcd60e51b8152602060048201526014602482015273726f6f7420616c72656164792070656e64696e6760601b6044820152606401610a4e565b6000818152600a602052604090205460ff16156125275760405162461bcd60e51b81526020600482015260136024820152723937b7ba1030b63932b0b23c90383937bb32b760691b6044820152606401610a4e565b60008181526009602052604090819020439055517f84ef18531155afdb0e64ff905d67044ae3aac63a6fba4661cfd9c4c14f289bc890610d0c9083815260200190565b6020600582811b8216948552835194820394909452604060008181206002851615871b808503919091528386015190528181206004851615871b808503919091528286015190528181206008851615871b80850391909152606086015190528181206010851615871b8085039190915260808087015190915282822084861615881b8086039190915260a0870151905282822083861615881b8086039190915260c0870151905282822090851615871b8085039190915260e0860151905281812061010080861615881b80860392909252860151905281812061020080861615881b80860392909252610120870151909152828220610400861615881b808603919091526101408701519052828220610800861615881b808603919091526101608701519052828220611000861615881b808603919091526101808701519052828220612000861615881b808603919091526101a08701519052828220614000861615881b808603919091526101c08701519052828220618000861615881b808603919091526101e0870151905282822062010000861615881b8086039190915290860151905281812062020000851615871b80850391909152610220860151905281812062040000851615871b80850391909152610240860151905281812062080000851615871b80850391909152610260860151905281812062100000851615871b80850391909152610280860151905281812062200000851615871b808503919091526102a0860151905281812062400000851615871b808503919091526102c0860151905281812062800000851615871b808503919091526102e086015190528181206301000000851615871b8085039190915261030086015190528181206302000000851615871b8085039190915261032086015190528181206304000000851615871b8085039190915261034086015190528181206308000000851615871b8085039190915261036086015190528181206310000000851615871b8085039190915261038086015190528181206320000000851615871b808503919091526103a086015190528181206340000000851615871b808503919091526103c0860151905281812063800000009094161590951b91829003929092526103e090920151909152902090565b806128fb5760405162461bcd60e51b8152602060048201526013602482015272616767726567617465526f6f7420656d70747960681b6044820152606401610a4e565b6000818152600a602052604090205460ff16156129155750565b6000818152600960205260408120549081900361296b5760405162461bcd60e51b81526020600482015260146024820152731859d9dc9959d85d19549bdbdd0808595e1a5cdd60621b6044820152606401610a4e565b6008546129788243613588565b10156129c65760405162461bcd60e51b815260206004820152601760248201527f616767726567617465526f6f74202176657269666965640000000000000000006044820152606401610a4e565b6000828152600a6020526040808220805460ff191660011790555183917f36b314aba9f663b4d3ef3288ae489341cc5e6a2725a05fa2b72df7a27e03f42a91a250600090815260096020526040812055565b815160009060208401612a3364ffffffffff85168284612d37565b95945050505050565b60006115f162ffffff19831660286004612d74565b600080612a678360781c6001600160601b031690565b6001600160601b031690506000612a878460181c6001600160601b031690565b6001600160601b03169091209392505050565b60006115f1612aa883612da4565b90565b60006115f162ffffff198316826004612d74565b60006115f162ffffff19831660246004612d74565b60006115f162ffffff19831660046020612db5565b60006115f1604c612b0781601886901c6001600160601b0316613588565b62ffffff19851691906000612ec0565b6060600080612b2f8460181c6001600160601b031690565b6001600160601b031690506040519150819250612b4f8483602001612f3c565b508181016020016040529052919050565b6000606060008060008661ffff1667ffffffffffffffff811115612b8657612b86613134565b6040519080825280601f01601f191660200182016040528015612bb0576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115612bd1578692505b828152826000602083013e90999098509650505050505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612c515760405162461bcd60e51b815260206004820152600960248201526810b2bc32b1baba37b960b91b6044820152606401610a4e565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0496d6a6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd69190613720565b5091509150836001600160a01b0316826001600160a01b0316148015612a3357507f000000000000000000000000000000000000000000000000000000000000000014949350505050565b6000601054821115612d335760105491505b5090565b600080612d44838561343d565b9050604051811115612d54575060005b80600003612d695762ffffff19915050611ac2565b612a3385858561302f565b6000612d81826020613757565b612d8c906008613770565b60ff16612d9a858585612db5565b901c949350505050565b60006115f162ffffff198316602c60205b60008160ff16600003612dca57506000611ac2565b612ddd8460181c6001600160601b031690565b6001600160601b0316612df360ff84168561343d565b1115612e5b57612e0c8460781c6001600160601b031690565b612e1f8560181c6001600160601b031690565b6040516378218d2960e01b81526001600160601b039283166004820152911660248201526044810184905260ff83166064820152608401610a4e565b60208260ff161115612e805760405163045df3f960e01b815260040160405180910390fd5b600882026000612e998660781c6001600160601b031690565b6001600160601b031690506000600160ff1b60001984011d91909501511695945050505050565b600080612ed68660781c6001600160601b031690565b6001600160601b03169050612eea866130a6565b84612ef5878461343d565b612eff919061343d565b1115612f125762ffffff19915050612f34565b612f1c858261343d565b9050612f308364ffffffffff168286612d37565b9150505b949350505050565b600062ffffff1980841603612f645760405163148d513360e21b815260040160405180910390fd5b612f6d836130df565b15612f8b57604051632ee0949160e11b815260040160405180910390fd5b6000612fa08460181c6001600160601b031690565b6001600160601b031690506000612fc08560781c6001600160601b031690565b6001600160601b03169050600080604051915085821115612fe15760206060fd5b8386858560045afa90508061300957604051632af1bd9b60e21b815260040160405180910390fd5b6130246130168860d81c90565b64ffffffffff16878661302f565b979650505050505050565b60006060601883856001600160601b03821682148015613057575086816001600160601b0316145b6130905760405162461bcd60e51b815260206004820152600a602482015269085d1c9d5b98d85d195960b21b6044820152606401610a4e565b96831b90961790911b90941790931b9392505050565b60006130bb8260181c6001600160601b031690565b6130ce8360781c6001600160601b031690565b016001600160601b03169050919050565b60006130eb8260d81c90565b64ffffffffff1664ffffffffff0361310557506001919050565b6000613110836130a6565b604051109392505050565b60006020828403121561312d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261315b57600080fd5b813567ffffffffffffffff8082111561317657613176613134565b604051601f8301601f19908116603f0116810190828211818310171561319e5761319e613134565b816040528381528660208588010111156131b757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156131e957600080fd5b813567ffffffffffffffff81111561320057600080fd5b612f348482850161314a565b634e487b7160e01b600052602160045260246000fd5b602081016003831061324457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806000806000610460868803121561326357600080fd5b853567ffffffffffffffff8082111561327b57600080fd5b818801915088601f83011261328f57600080fd5b81358181111561329e57600080fd5b8960208260051b85010111156132b357600080fd5b6020928301975095505086013592506104408601878111156132d457600080fd5b94979396509194604001933592915050565b6001600160a01b038116811461100d57600080fd5b60006020828403121561330d57600080fd5b8135611ac2816132e6565b60005b8381101561333357818101518382015260200161331b565b50506000910152565b60008151808452613354816020860160208601613318565b601f01601f19169290920160200192915050565b8215158152604060208201526000611abf604083018461333c565b803563ffffffff8116811461339757600080fd5b919050565b6000602082840312156133ae57600080fd5b611ac282613383565b6000806000606084860312156133cc57600080fd5b6133d584613383565b925060208401359150604084013567ffffffffffffffff8111156133f857600080fd5b6134048682870161314a565b9150509250925092565b828152604060208201526000611abf604083018461333c565b634e487b7160e01b600052601160045260246000fd5b808201808211156115f1576115f1613427565b60006020828403121561346257600080fd5b5051919050565b60608152600061347c606083018661333c565b828103602084015261348e818661333c565b91505060018060a01b0383166040830152949350505050565b6040815260006134ba604083018561333c565b905060018060a01b03831660208301529392505050565b634e487b7160e01b600052603260045260246000fd5b6000823561043e198336030181126134fe57600080fd5b9190910192915050565b6000808335601e1984360301811261351f57600080fd5b83018035915067ffffffffffffffff82111561353a57600080fd5b60200191503681900382131561354f57600080fd5b9250929050565b8183823760009101908152919050565b60006020828403121561357857600080fd5b81518015158114611ac257600080fd5b818103818111156115f1576115f1613427565b600063ffffffff8083168181036135b4576135b4613427565b6001019392505050565b600080604083850312156135d157600080fd5b505080516020909101519092909150565b848152836020820152826040820152608060608201526000613607608083018461333c565b9695505050505050565b80516020808301519190811015613632576000198160200360031b1b821691505b50919050565b600063ffffffff808716835280861660208401525083604083015260806060830152613607608083018461333c565b8381528215156020820152606060408201526000612a33606083018461333c565b600063ffffffff60e01b808960e01b168352876004840152808760e01b166024840152808660e01b1660288401525083602c83015282516136d081604c850160208701613318565b91909101604c01979650505050505050565b600060018060a01b03808816835260a0602084015261370460a084018861333c565b9516604083015250606081019290925260809091015292915050565b60008060006060848603121561373557600080fd5b8351613740816132e6565b602085015160409095015190969495509392505050565b60ff82811682821603908111156115f1576115f1613427565b60ff818116838216029081169081811461378c5761378c613427565b509291505056fea264697066735822122043cb57dda3d0d3e129ba582556881d3d321ac4038f65ad83464a601c6bc4318e64736f6c63430008110033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
