{
  "_format": "hh-sol-artifact-1",
  "contractName": "StakingMockup",
  "sourceName": "contracts/mockup/StakingMockup.sol",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "AdminAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "AdminRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "hash",
          "type": "bytes32"
        }
      ],
      "name": "ContractCodeHashAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "hash",
          "type": "bytes32"
        }
      ],
      "name": "ContractCodeHashRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "delegator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "lockedUntil",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "fromDelegate",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "toDelegate",
          "type": "address"
        }
      ],
      "name": "DelegateChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "delegate",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "lockedUntil",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "previousBalance",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newBalance",
          "type": "uint256"
        }
      ],
      "name": "DelegateStakeChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "previousDate",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newDate",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountStaked",
          "type": "uint256"
        }
      ],
      "name": "ExtendedStakingDuration",
      "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": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "until",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isGovernance",
          "type": "bool"
        }
      ],
      "name": "StakingWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "lockedUntil",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "totalStaked",
          "type": "uint256"
        }
      ],
      "name": "TokensStaked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "TokensUnlocked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "vesting",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "VestingTokensWithdrawn",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "DELEGATION_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "DOMAIN_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "MAX_DURATION",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "MAX_VOTING_WEIGHT",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint96",
          "name": "_priorTotalVotingPower",
          "type": "uint96"
        }
      ],
      "name": "MOCK_priorTotalVotingPower",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint96",
          "name": "_priorWeightedStake",
          "type": "uint96"
        }
      ],
      "name": "MOCK_priorWeightedStake",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "SOVToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "WEIGHT_FACTOR",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_admin",
          "type": "address"
        }
      ],
      "name": "addAdmin",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "admins",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "allUnlocked",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "balance",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf_MultipliedByTwo",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "blockNumber",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        }
      ],
      "name": "calculatePriorWeightedStake",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "startDate",
          "type": "uint256"
        }
      ],
      "name": "computeWeightByDate",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "weight",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "lockDate",
          "type": "uint256"
        }
      ],
      "name": "delegate",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "lockDate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "nonce",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "expiry",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "delegateBySig",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "delegateStakingCheckpoints",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "fromBlock",
          "type": "uint32"
        },
        {
          "internalType": "uint96",
          "name": "stake",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "delegates",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "previousLock",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "until",
          "type": "uint256"
        }
      ],
      "name": "extendStakingDuration",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "feeSharing",
      "outputs": [
        {
          "internalType": "contract IFeeSharingProxy",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "lockedTS",
          "type": "uint256"
        }
      ],
      "name": "getCurrentStakedUntil",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "getCurrentVotes",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "blockNumber",
          "type": "uint256"
        }
      ],
      "name": "getPriorStakeByDateForDelegatee",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "blockNumber",
          "type": "uint256"
        }
      ],
      "name": "getPriorTotalStakesForDate",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint32",
          "name": "blockNumber",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "time",
          "type": "uint256"
        }
      ],
      "name": "getPriorTotalVotingPower",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "totalVotingPower",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "blockNumber",
          "type": "uint256"
        }
      ],
      "name": "getPriorUserStakeByDate",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "blockNumber",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        }
      ],
      "name": "getPriorVotes",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "votes",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "blockNumber",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        }
      ],
      "name": "getPriorWeightedStake",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "getStakes",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "dates",
          "type": "uint256[]"
        },
        {
          "internalType": "uint96[]",
          "name": "stakes",
          "type": "uint96[]"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint96",
          "name": "amount",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "until",
          "type": "uint256"
        }
      ],
      "name": "getWithdrawAmounts",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        },
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint96",
          "name": "amount",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "until",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "governanceWithdraw",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "vesting",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "governanceWithdrawVesting",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "isOwner",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "kickoffTS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "migrateToNewStakingContract",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "newStakingContract",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "numDelegateStakingCheckpoints",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "numTotalStakingCheckpoints",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "numUserStakingCheckpoints",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "receiveApproval",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_admin",
          "type": "address"
        }
      ],
      "name": "removeAdmin",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "lockedTS",
          "type": "uint256"
        },
        {
          "internalType": "uint96",
          "name": "value",
          "type": "uint96"
        }
      ],
      "name": "setDelegateStake",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_feeSharing",
          "type": "address"
        }
      ],
      "name": "setFeeSharing",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_newStakingContract",
          "type": "address"
        }
      ],
      "name": "setNewStakingContract",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "_vestingRegistryProxy",
          "type": "address"
        }
      ],
      "name": "setVestingRegistry",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint96",
          "name": "_weightScaling",
          "type": "uint96"
        }
      ],
      "name": "setWeightScaling",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint96",
          "name": "amount",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "until",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "stakeFor",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        }
      ],
      "name": "stake",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint96",
          "name": "amount",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "until",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "stakeFor",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        }
      ],
      "name": "stakeWithApproval",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "cliff",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "duration",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "intervalLength",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "stakeFor",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "delegatee",
          "type": "address"
        }
      ],
      "name": "stakesBySchedule",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "timestampToLockDate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "lockDate",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "totalStakingCheckpoints",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "fromBlock",
          "type": "uint32"
        },
        {
          "internalType": "uint96",
          "name": "stake",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "unlockAllTokens",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "userStakingCheckpoints",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "fromBlock",
          "type": "uint32"
        },
        {
          "internalType": "uint96",
          "name": "stake",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "vestingCodeHashes",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "vestingRegistryLogic",
      "outputs": [
        {
          "internalType": "contract VestingRegistryLogic",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "vestingWhitelist",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "weightScaling",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "date",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "startDate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "blockNumber",
          "type": "uint256"
        }
      ],
      "name": "weightedStakeByDate",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "power",
          "type": "uint96"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint96",
          "name": "amount",
          "type": "uint96"
        },
        {
          "internalType": "uint256",
          "name": "until",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c0604052600a608081905269534f565374616b696e6760b01b60a09081526200002d9160029190620000ae565b506005805460ff19169055600d80546001600160a01b0316600360a01b179055600062000059620000a9565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000150565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b620000ab91905b808211156200012f57600081556001016200013a565b61529380620001606000396000f3fe608060405234801561001057600080fd5b50600436106103c45760003560e01c8063800b64ca116101ff578063b8a987321161011a578063dfb267c2116100ad578063eefb8c471161007c578063eefb8c4714610d9e578063f09cfc6414610dc1578063f2fde38b14610de4578063fbbb8ec614610e0a576103c4565b8063dfb267c214610cee578063e63a562e14610d17578063e7a324dc14610d64578063e97ffacb14610d6c576103c4565b8063d5c38464116100e9578063d5c3846414610c44578063dab6ca4414610c61578063daeaf2f214610c9c578063db27ec1814610cc2576103c4565b8063b8a9873214610bdc578063bf626ec114610c02578063cf7b684a14610c0a578063d27569e714610c3c576103c4565b806396a590c111610192578063adae900211610161578063adae900214610b80578063ae81dfe414610ba6578063b1724b4614610bae578063b4b5ea5714610bb6576103c4565b806396a590c114610af85780639929e88614610b4a5780639a377b8214610b52578063a58848c514610b78576103c4565b80638f32d59b116101ce5780638f32d59b14610a015780638f4ffcb114610a095780639436e7d414610a9657806394c2ce5814610acc576103c4565b8063800b64ca14610954578063836eebee1461098f5780638da5cb5b146109c15780638dae1b16146109c9576103c4565b80633827fca5116102ef57806362cf8a081161028257806370a082311161025157806370a082311461082c57806372ec9795146108525780637ba6f4581461086f5780637ecebe001461092e576103c4565b806362cf8a081461074b57806368cefccc1461076e5780636b6fde0e146107ce5780637048027514610806576103c4565b80634b2fea1e116102be5780634b2fea1e146106cf5780635419675f146107155780635e0be6071461071d578063626ee2d914610725576103c4565b80633827fca514610623578063429b62e514610651578063450b060114610677578063472f88f71461069d576103c4565b806317748adc1161036757806325629ec01161033657806325629ec01461055c57806327dd1b001461059f57806332e9f250146105cb57806337e6b1c1146105f1576103c4565b806317748adc146104e15780631785f53c1461050557806320606b701461052b5780632522d7ba14610533576103c4565b806303a18fa3116103a357806303a18fa31461043757806307392cc01461045b5780630c09ddfd1461048c578063104932cf146104d9576103c4565b8062073f99146103c95780630130f0bf146103e3578063026e402b1461040b575b600080fd5b6103d1610e45565b60408051918252519081900360200190f35b610409600480360360208110156103f957600080fd5b50356001600160601b0316610e4b565b005b6104096004803603604081101561042157600080fd5b506001600160a01b038135169060200135610e72565b61043f610e8c565b604080516001600160a01b039092168252519081900360200190f35b6104786004803603602081101561047157600080fd5b5035610e9b565b604080519115158252519081900360200190f35b610409600480360360a08110156104a257600080fd5b506001600160a01b0381358116916001600160601b0360208201351691604082013591606081013582169160809091013516610eb0565b61043f610f09565b6104e9610f18565b604080516001600160601b039092168252519081900360200190f35b6104096004803603602081101561051b57600080fd5b50356001600160a01b0316610f1d565b6103d1610fbd565b6104e96004803603604081101561054957600080fd5b5063ffffffff8135169060200135610fd8565b6104096004803603608081101561057257600080fd5b506001600160601b03813516906020810135906001600160a01b036040820135811691606001351661101e565b61043f600480360360408110156105b557600080fd5b506001600160a01b038135169060200135611033565b6103d1600480360360208110156105e157600080fd5b50356001600160a01b0316611059565b6104e96004803603606081101561060757600080fd5b506001600160a01b038135169060208101359060400135611077565b6104096004803603604081101561063957600080fd5b506001600160a01b03813581169160200135166110b1565b6104786004803603602081101561066757600080fd5b50356001600160a01b03166111ee565b6104096004803603602081101561068d57600080fd5b50356001600160a01b0316611203565b610409600480360360608110156106b357600080fd5b506001600160a01b0381351690602081013590604001356112c8565b610409600480360360c08110156106e557600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a00135166112d3565b610409611372565b6104096113c0565b6104096004803603602081101561073b57600080fd5b50356001600160a01b03166114be565b6104e96004803603604081101561076157600080fd5b508035906020013561156d565b6107a66004803603606081101561078457600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff166116e6565b6040805163ffffffff90931683526001600160601b0390911660208301528051918290030190f35b6107a6600480360360608110156107e457600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff16611721565b6104096004803603602081101561081c57600080fd5b50356001600160a01b031661175c565b6104e96004803603602081101561084257600080fd5b50356001600160a01b03166117ff565b6103d16004803603602081101561086857600080fd5b503561186e565b6108956004803603602081101561088557600080fd5b50356001600160a01b03166118d8565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156108d95781810151838201526020016108c1565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610918578181015183820152602001610900565b5050505090500194505050505060405180910390f35b6103d16004803603602081101561094457600080fd5b50356001600160a01b0316611a13565b6104096004803603606081101561096a57600080fd5b5080356001600160601b031690602081013590604001356001600160a01b0316611a25565b6104e9600480360360608110156109a557600080fd5b506001600160a01b038135169060208101359060400135611a97565b61043f611af9565b6104e9600480360360808110156109df57600080fd5b506001600160a01b038135169060208101359060408101359060600135611b08565b610478611b8a565b61040960048036036080811015610a1f57600080fd5b6001600160a01b038235811692602081013592604082013590921691810190608081016060820135600160201b811115610a5857600080fd5b820183602082011115610a6a57600080fd5b803590602001918460018302840111600160201b83111715610a8b57600080fd5b509092509050611bae565b610ab360048036036020811015610aac57600080fd5b5035611e80565b6040805163ffffffff9092168252519081900360200190f35b610ab360048036036040811015610ae257600080fd5b506001600160a01b038135169060200135611e98565b610b2460048036036040811015610b0e57600080fd5b506001600160601b038135169060200135611ebb565b604080516001600160601b03938416815291909216602082015281519081900390910190f35b610478611ee0565b61040960048036036020811015610b6857600080fd5b50356001600160a01b0316611ee9565b61043f611f9e565b61047860048036036020811015610b9657600080fd5b50356001600160a01b0316611fad565b61043f611fc2565b6103d1611fd6565b6104e960048036036020811015610bcc57600080fd5b50356001600160a01b0316611fde565b61040960048036036020811015610bf257600080fd5b50356001600160601b0316611fee565b6104e96120bd565b6104e960048036036060811015610c2057600080fd5b506001600160a01b0381351690602081013590604001356120d3565b6104e961210d565b6104e960048036036020811015610c5a57600080fd5b5035612112565b61040960048036036060811015610c7757600080fd5b5080356001600160601b031690602081013590604001356001600160a01b031661216e565b61040960048036036020811015610cb257600080fd5b50356001600160601b0316612188565b610ab360048036036040811015610cd857600080fd5b506001600160a01b0381351690602001356121b0565b6107a660048036036040811015610d0457600080fd5b508035906020013563ffffffff166121d3565b610409600480360360e0811015610d2d57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060ff6080820135169060a08101359060c00135612208565b6103d16124de565b6104e960048036036060811015610d8257600080fd5b506001600160a01b0381351690602081013590604001356124f9565b61040960048036036040811015610db457600080fd5b5080359060200135612761565b6104e960048036036040811015610dd757600080fd5b5080359060200135612949565b61040960048036036020811015610dfa57600080fd5b50356001600160a01b0316612b41565b61040960048036036060811015610e2057600080fd5b5080356001600160a01b031690602081013590604001356001600160601b0316612b95565b60015481565b601280546bffffffffffffffffffffffff19166001600160601b0392909216919091179055565b610e7d338383612c03565b610e88338383612cb5565b5050565b600d546001600160a01b031681565b60106020526000908152604090205460ff1681565b333014610ef3576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b610f0285858585856000612de2565b5050505050565b6011546001600160a01b031681565b600981565b610f25611b8a565b610f65576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19169055815192835290517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9281900390910190a150565b604051806043614e5b82396043019050604051809103902081565b601154600090600160a01b90046001600160601b031661100157610ffc8383612ffe565b611015565b601154600160a01b90046001600160601b03165b90505b92915050565b61102d33858585856000612de2565b50505050565b60046020908152600092835260408084209091529082529020546001600160a01b031681565b6000611064826117ff565b6002026001600160601b03169050919050565b6012546000906001600160601b031661109a57611095848484613064565b6110a7565b6012546001600160601b03165b90505b9392505050565b6110b9611b8a565b806110d35750336000908152600f602052604090205460ff165b611113576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038083166000818152600e6020526040808220805460ff191660011790558051633c7925e360e11b815293851660048501525191926378f24bc6926024808301939282900301818387803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b5050506001600160a01b038084166000818152600e6020908152604091829020805460ff1916905581519283529285169282019290925281517f2366e0b6b1af17c0ceed50685c570d519cae11e7faaf007bbe667e94a5ee3cd593509081900390910190a15050565b600f6020526000908152604090205460ff1681565b61120b611b8a565b61124b576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166112a6576040805162461bcd60e51b815260206004820181905260248201527f76657374696e67207265676973747279206164647265737320696e76616c6964604482015290519081900360640190fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b61102d838383613064565b60006112e086420161186e565b905063059fa6008511156112f65763059fa60094505b600061130386420161186e565b90506000858383038161131257fe5b0460010190506000818a8161132357fe5b0490506001821061134457611344336001840383028c038689896001612de2565b8387015b8381116113655761135e3383838a8a6001612de2565b8701611348565b5050505050505050505050565b60055461010090046001600160a01b03166113be5760405162461bcd60e51b81526004018080602001828103825260248152602001806149a06024913960400191505060405180910390fd5b565b6113c8611b8a565b611408576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6005805460ff19166001179055600354604080516370a0823160e01b815230600482015290517fd8cc4e8d808fe950b07bfffcd83eebf1190cd35ea77fe0c8a7d75a6e9b90e5c1926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d60208110156114a957600080fd5b505160408051918252519081900360200190a1565b6114c6611b8a565b611506576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03811661154b5760405162461bcd60e51b81526004018080602001828103825260218152602001806151276021913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818310156115ae5760405162461bcd60e51b815260040180806020018281038252604c815260200180614ddb604c913960600191505060405180910390fd5b81830363059fa6008111156115f45760405162461bcd60e51b815260040180806020018281038252604d815260200180614e9e604d913960600191505060405180910390fd5b6000620151808263059fa600036001600160601b03168161161157fe5b0490506116dd600a621232106001600160601b0316611691600a600902611673621232108788026040518060400160405280601f81526020017f756e646572666c6f77206f6e207765696768742063616c63756c6174696f6e008152506130d2565b6040518060600160405280602d8152602001614c65602d913961317c565b6001600160601b0316816116a157fe5b046040518060400160405280601e81526020017f6f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e0000815250613208565b95945050505050565b600a60209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b600860209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b611764611b8a565b6117a4576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19166001179055815192835290517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399281900390910190a150565b6001546000905b63059fa600420181116118685761185c826118218584613269565b6040518060400160405280601c81526020017f5374616b696e673a3a62616c616e63654f663a206f766572666c6f7700000000815250613208565b91506212750001611806565b50919050565b60006001548210156118b15760405162461bcd60e51b815260040180806020018281038252604d815260200180614beb604d913960600191505060405180910390fd5b6000621275006001548403816118c357fe5b04905060015462127500820201915050919050565b60608060006118ec63059fa600420161186e565b60015490915060009062127500015b82811161192e57600061190e8783613269565b6001600160601b03161115611924576001909101905b62127500016118fb565b5080604051908082528060200260200182016040528015611959578160200160208202803883390190505b50935080604051908082528060200260200182016040528015611986578160200160208202803883390190505b5060015490935060009062127500015b838111611a0a5760006119a98883613269565b90506001600160601b038116156119ff57818784815181106119c757fe5b602002602001018181525050808684815181106119e057fe5b6001600160601b03909216602092830291909101909101526001909201915b506212750001611996565b50505050915091565b600c6020526000908152604090205481565b336000908152600e602052604090205460ff16611a78576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b611a8583838360016132ca565b611a928383836001613616565b505050565b600080611aa38361186e565b905063059fa6008101815b818111611aef57611ae384611ac58984878b613678565b6040518060800160405280604a8152602001614d91604a9139613208565b93506212750001611aae565b5050509392505050565b6000546001600160a01b031690565b600080611b168686856136e0565b90506001600160601b03811615611b7c576000611b33868661156d565b9050600a6001600160601b0316611b6383836040518060600160405280603d8152602001614c92603d913961317c565b6001600160601b031681611b7357fe5b04925050611b81565b600091505b50949350505050565b600080546001600160a01b0316611b9f613954565b6001600160a01b031614905090565b611bb6613958565b6001600160a01b0316336001600160a01b031614611c0a576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b336001600160a01b03841614611c56576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b60006060611c62613967565b90506000611ca585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139bf92505050565b905060005b8251811015611cf357828181518110611cbf57fe5b60200260200101516001600160e01b031916826001600160e01b0319161415611ceb5760019350611cf3565b600101611caa565b5082611d3e576040805162461bcd60e51b81526020600482015260156024820152741b595d1a1bd9081a5cc81b9bdd08185b1b1bddd959605a1b604482015290519081900360640190fd5b60405160006020820181815290918291829189918991603c018383808284378083019250505093505050506040516020818303038152906040528060200190516060811015611d8c57600080fd5b50602081015160409091015190925090506001600160a01b03808316908b1614611def576040805162461bcd60e51b815260206004820152600f60248201526e0e6cadcc8cae440dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b888114611e35576040805162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b611e7487878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139c692505050565b50505050505050505050565b60076020526000908152604090205463ffffffff1681565b600960209081526000928352604080842090915290825290205463ffffffff1681565b600080611ec88484613b2f565b6000611ed48585613bda565b94859003959350505050565b60055460ff1681565b611ef1611b8a565b611f31576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038116611f765760405162461bcd60e51b81526004018080602001828103825260298152602001806150416029913960400191505060405180910390fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6003546001600160a01b031681565b600e6020526000908152604090205460ff1681565b60055461010090046001600160a01b031681565b63059fa60081565b6000611018826001430342611a97565b611ff6611b8a565b612036576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160601b03811660011180159061205a575060096001600160601b03821611155b6120955760405162461bcd60e51b815260040180806020018281038252602d815260200180614c38602d913960400191505060405180910390fd5b600d80546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b600d54600160a01b90046001600160601b031681565b6000806120e18585856136e0565b90506001600160601b0381161580156120fd57506120fd613c25565b156110a757506001949350505050565b600a81565b60008181526007602052604081205463ffffffff16806121335760006110aa565b6000838152600660209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03169392505050565b61217b83838360006132ca565b611a928383836000613616565b601180546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b600660209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b60006040518080614e5b6043913960430190506040518091039020600260405180828054600181600116156101000203166002900480156122805780601f1061225e576101008083540402835291820191612280565b820191906000526020600020905b81548152906001019060200180831161226c575b50509150506040518091039020612295613ca1565b3060405160200180858152602001848152602001838152602001826001600160a01b03166001600160a01b031681526020019450505050506040516020818303038152906040528051906020012090506000604051808061506a604b91396040805191829003604b0182206020808401919091526001600160a01b038d1683830152606083018c9052608083018b905260a08084018b90528251808503909101815260c08401835280519082012061190160f01b60e085015260e28401879052610102808501829052835180860390910181526101228501808552815191840191909120600091829052610142860180865281905260ff8c1661016287015261018286018b90526101a286018a9052935191965092945091926001926101c28083019392601f198301929081900390910190855afa1580156123db573d6000803e3d6000fd5b5050506020604051035190506123f081613ca5565b61242b5760405162461bcd60e51b8152600401808060200182810382526029815260200180614bc26029913960400191505060405180910390fd5b6001600160a01b0381166000908152600c6020526040902080546001810190915589146124895760405162461bcd60e51b815260040180806020018281038252602581526020018061523a6025913960400191505060405180910390fd5b874211156124c85760405162461bcd60e51b81526004018080602001828103825260298152602001806149776029913960400191505060405180910390fd5b6124d3818c8c612c03565b611365818c8c612cb5565b60405180604b61506a8239604b019050604051809103902081565b6000612503613cde565b82106125405760405162461bcd60e51b81526004018080602001828103825260448152602001806151f66044913960600191505060405180910390fd5b6001600160a01b038416600090815260096020908152604080832086845290915290205463ffffffff16806125795760009150506110aa565b6001600160a01b0385166000908152600860209081526040808320878452825280832063ffffffff600019860181168552925290912054168310612605576001600160a01b038516600090815260086020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506110aa565b6001600160a01b0385166000908152600860209081526040808320878452825280832083805290915290205463ffffffff168310156126485760009150506110aa565b600060001982015b8163ffffffff168163ffffffff16111561271357600282820363ffffffff1604810361267a61495f565b506001600160a01b03881660009081526008602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156126ee576020015194506110aa9350505050565b805163ffffffff168711156127055781935061270c565b6001820392505b5050612650565b506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b61276a8161186e565b9050808211156127ab5760405162461bcd60e51b81526004018080602001828103825260428152602001806149c46042913960600191505060405180910390fd5b60006127bc63059fa600420161186e565b9050808211156127ca578091505b60006127da3385600143036136e0565b90506000816001600160601b0316116128245760405162461bcd60e51b815260040180806020018281038252604b815260200180614d12604b913960600191505060405180910390fd5b61282f338583613ce2565b61283a338483613d73565b6128448482613df6565b61284e8382613e6e565b336000908152600460209081526040808320878452909152808220548583529120546001600160a01b039182169116806128b85750336000908152600460209081526040808320878452909152902080546001600160a01b0319166001600160a01b038316179055805b336000908152600460209081526040808320898452909152902080546001600160a01b03191690556128eb828785613ed9565b6128f6818685613f76565b60408051878152602081018790526001600160601b03851681830152905133917f809d79c94c86576d61afef75495b8df415224bf885310fed7ea315039f8c5b4c919081900360600190a2505050505050565b6000612953613cde565b82106129905760405162461bcd60e51b815260040180806020018281038252603f815260200180615148603f913960400191505060405180910390fd5b60008381526007602052604090205463ffffffff16806129b4576000915050611018565b600084815260066020908152604080832063ffffffff600019860181168552925290912054168310612a1c5760008481526006602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050611018565b600084815260066020908152604080832083805290915290205463ffffffff16831015612a4d576000915050611018565b600060001982015b8163ffffffff168163ffffffff161115612b0657600282820363ffffffff16048103612a7f61495f565b50600087815260066020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415612ae1576020015194506110189350505050565b805163ffffffff16871115612af857819350612aff565b6001820392505b5050612a55565b50600085815260066020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b612b49611b8a565b612b89576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b612b9281613ff9565b50565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff94851660001981019095168452909152812054600160201b90046001600160601b031690610f0290869086908590614099565b6001600160a01b03808416600090815260046020908152604080832085845290915281205490911690612c368584613269565b6001600160a01b03868116600081815260046020908152604080832089845282529182902080546001600160a01b0319168a86169081179091558251898152925195965094938716937fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca99281900390910190a4610f02828583866142bc565b612cbd613c25565b15611a92576000612cd7826212750063ffffffff61432016565b6001600160a01b0380861660009081526004602090815260408083208584529091529020549192509081169084168114612d1657612d16858584612c03565b6000336001600160a01b031663c24a0f8b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d5357600080fd5b505af1158015612d67573d6000803e3d6000fd5b505050506040513d6020811015612d7d57600080fd5b50519050612d94846224ea0063ffffffff61432016565b925080831415612dda576001600160a01b0380871660009081526004602090815260408083208784529091529020548116925085168214612dda57612dda868685612c03565b505050505050565b6000856001600160601b031611612e2a5760405162461bcd60e51b8152600401808060200182810382526043815260200180614ccf6043913960600191505060405180910390fd5b80612e3b57612e388461186e565b93505b428411612e795760405162461bcd60e51b8152600401808060200182810382526036815260200180614fe36036913960400191505060405180910390fd5b6001600160a01b038316612e8b578592505b6001600160a01b038216612e9d578291505b80612ec3576000612eb363059fa600420161186e565b905080851115612ec1578094505b505b6000612ecf8486613269565b9050612edd8787868861437a565b6001600160a01b03808516600090815260046020908152604080832089845290915290205481169084168114612f94576001600160a01b0385811660009081526004602090815260408083208a8452909152902080546001600160a01b031916918616919091179055612f51818784613ed9565b612f9182886040518060400160405280602081526020017f5374616b696e673a3a7374616b653a2062616c616e6365206f766572666c6f77815250613208565b96505b612f9f848789613f76565b836001600160a01b0316816001600160a01b0316866001600160a01b03167fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca9896040518082815260200191505060405180910390a45050505050505050565b60008061300a8361186e565b905063059fa6008101815b81811161305b5761304f8461303183868a63ffffffff166144bf565b604051806080016040528060558152602001614aca60559139613208565b93506212750001613015565b50505092915050565b6000806130708361186e565b905063059fa6008101815b818111611aef5760006130908883868a611b08565b90506001600160601b038116156130c7576130c485826040518060800160405280604c8152602001614f97604c9139613208565b94505b50621275000161307b565b6000836001600160601b0316836001600160601b0316111582906131745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613139578181015183820152602001613121565b50505050905090810190601f1680156131665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006001600160601b038416613194575060006110aa565b8383026001600160601b0380851690808716908316816131b057fe5b046001600160601b0316148390611b815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b6000838301826001600160601b038087169083161015611b815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b6001600160a01b0382166000818152600a602090815260408083208584528252808320938352600b825280832085845282528083205460001963ffffffff9182160116835292905220546001600160601b03600160201b9091041692915050565b836001600160601b031660011480156132e657506132e6613c25565b156132f05761102d565b6132f983614525565b92506133058484613b2f565b6001600160a01b038216613317573391505b6133218385613df6565b61332c338486613ce2565b33600090815260046020908152604080832086845290915290205461335b906001600160a01b03168486613ed9565b824210801561336d575060055460ff16155b8015613377575080155b156134ed5760006133888585613bda565b948590039490506001600160601b038116156134eb57600d546001600160a01b03166133e55760405162461bcd60e51b8152600401808060200182810382526030815260200180614b926030913960400191505060405180910390fd5b600354600d546040805163095ea7b360e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561344657600080fd5b505af115801561345a573d6000803e3d6000fd5b505050506040513d602081101561347057600080fd5b5050600d546003546040805163abe979e160e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163abe979e191604480830192600092919082900301818387803b1580156134d257600080fd5b505af11580156134e6573d6000803e3d6000fd5b505050505b505b6003546040805163a9059cbb60e01b81526001600160a01b0385811660048301526001600160601b03881660248301529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561354e57600080fd5b505af1158015613562573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b50519050806135b85760405162461bcd60e51b8152600401808060200182810382526028815260200180614b1f6028913960400191505060405180910390fd5b604080516001600160601b0387168152602081018690528315158183015290516001600160a01b0385169133917f667b6c8ed8622dae7927a8b0837455098e32037a0181f9a2e21b9b72fead6cc79181900360600190a35050505050565b61361e613c25565b1561102d576000613638846212750063ffffffff61432016565b905081806136465750804210155b15610f0257600061365b3383600143036136e0565b90506001600160601b03811615612dda57612dda818386866132ca565b600080613685858561156d565b905060006136948787866124f9565b9050600a6001600160601b03166136c48284604051806080016040528060478152602001614a066047913961317c565b6001600160601b0316816136d457fe5b04979650505050505050565b60006136ea613cde565b82106137275760405162461bcd60e51b815260040180806020018281038252603d8152602001806150b5603d913960400191505060405180910390fd5b61373083614525565b6001600160a01b0385166000908152600b6020908152604080832084845290915290205490935063ffffffff168061376c5760009150506110aa565b6001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198601811685529252909120541683106137f8576001600160a01b0385166000908152600a6020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506110aa565b6001600160a01b0385166000908152600a60209081526040808320878452825280832083805290915290205463ffffffff1683101561383b5760009150506110aa565b600060001982015b8163ffffffff168163ffffffff16111561390657600282820363ffffffff1604810361386d61495f565b506001600160a01b0388166000908152600a602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156138e1576020015194506110aa9350505050565b805163ffffffff168711156138f8578193506138ff565b6001820392505b5050613843565b506001600160a01b0386166000908152600a60209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b3390565b6003546001600160a01b031690565b60408051600180825281830190925260609182919060208083019080388339019050509050630c09ddfd60e01b816000815181106139a157fe5b6001600160e01b031990921660209283029190910190910152905090565b6020015190565b60006060306001600160a01b0316836040518082805190602001908083835b60208310613a045780518252601f1990920191602091820191016139e5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a66576040519150601f19603f3d011682016040523d82523d6000602084013e613a6b565b606091505b509150915081611a92576044815111613ab55760405162461bcd60e51b8152600401808060200182810382526030815260200180614a9a6030913960400191505060405180910390fd5b613ae86040518060400160405280601181526020017003932b1b2b4bb32a0b8383937bb30b61d1607d1b8152508261454a565b60405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b6000826001600160601b031611613b775760405162461bcd60e51b815260040180806020018281038252604d815260200180614a4d604d913960600191505060405180910390fd5b6000613b873383600143036136e0565b9050806001600160601b0316836001600160601b03161115611a925760405162461bcd60e51b8152600401808060200182810382526025815260200180614b6d6025913960400191505060405180910390fd5b600080613be64261186e565b90506000613bf4848361156d565b600d54600160a01b90046001600160601b03908116919091029150606490600a878402821604160495945050505050565b6011546040805163dbb049d160e01b815233600482015290516000926001600160a01b03169163dbb049d1916024808301926020929190829003018186803b158015613c7057600080fd5b505afa158015613c84573d6000803e3d6000fd5b505050506040513d6020811015613c9a57600080fd5b5051905090565b4690565b600073dcc703c0e500b653ca82273b7bfad8045d85a4706001600160a01b038316148015906110185750506001600160a01b0316151590565b4390565b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526034808352600160201b9091046001600160601b03169392613d659285928892614d5d908301396130d2565b9050612dda86868584614644565b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526033808352600160201b9091046001600160601b03169392613d659285928892614f2990830139613208565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260358084529194600160201b9091046001600160601b0316939092613e61928592889291906150f2908301396130d2565b9050610f028584836147c4565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260348084529194600160201b9091046001600160601b0316939092613e6192859288929190614e2790830139613208565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff94851660001981019095168452909152812054600160201b90046001600160601b0390811691908416821115613f6a57613f6782856040518060600160405280603881526020016151be603891396130d2565b90505b612dda86868584614099565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526037808352600160201b9091046001600160601b03169392613f67928592889261518790830139613208565b6001600160a01b03811661403e5760405162461bcd60e51b8152600401808060200182810382526026815260200180614b476026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006140bd436040518060600160405280603e8152602001614eeb603e9139614902565b6001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff9081168552925290912054919250600160201b9091046001600160601b03169084161580159061415357506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff6000198901811685529252909120548382169116145b156141b5576001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b0386160217905561425f565b60408051808201825263ffffffff80851682526001600160601b0380871660208085019182526001600160a01b038c166000818152600883528781208d825283528781208c871682528352878120965187549451909516600160201b02640100000000600160801b031995871663ffffffff19958616179590951694909417909555938252600984528482208a835290935292909220805460018801909316929091169190911790555b604080518681526001600160601b03808416602083015285168183015290516001600160a01b038816917fc7b38fb25352e6f351f57e2c922f84db5c97e09a6246bbe1d2eedfcdb01c4c62919081900360600190a2505050505050565b826001600160a01b0316846001600160a01b0316141580156142e757506000826001600160601b0316115b1561102d576001600160a01b0384161561430657614306848284613ed9565b6001600160a01b0383161561102d5761102d838284613f76565b600082820183811015611015576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600354604080516323b872dd60e01b81526001600160a01b0387811660048301523060248301526001600160601b0387166044830152915160009392909216916323b872dd9160648082019260209290919082900301818787803b1580156143e157600080fd5b505af11580156143f5573d6000803e3d6000fd5b505050506040513d602081101561440b57600080fd5b505190508061441957600080fd5b60006144258484613269565b905061444a818660405180606001604052806028815260200161501960289139613208565b90506144568386613e6e565b614461848487613d73565b604080516001600160601b0380881682526020820186905283168183015290516001600160a01b038616917f0fc5b1bac0416800b42a669229a346b6e5a15db3896339dbdc5fa376e1e4570a919081900360600190a2505050505050565b6000806144cc858561156d565b905060006144da8685612949565b9050600a6001600160601b031661450a82846040518060600160405280603b8152602001614f5c603b913961317c565b6001600160601b03168161451a57fe5b049695505050505050565b6000806145318361186e565b90508281146145435762127500810192505b5090919050565b6060808390506060839050606060448251845101036040519080825280601f01601f191660200182016040528015614589576020820181803883390190505b509050806000805b85518110156145e2578581815181106145a657fe5b602001015160f81c60f81b8383806001019450815181106145c357fe5b60200101906001600160f81b031916908160001a905350600101614591565b5060445b8451811015614637578481815181106145fb57fe5b602001015160f81c60f81b83838060010194508151811061461857fe5b60200101906001600160f81b031916908160001a9053506001016145e6565b5090979650505050505050565b6000614668436040518060600160405280603e8152602001614eeb603e9139614902565b905060008363ffffffff161180156146b957506001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198801811685529252909120548282169116145b1561471b576001600160a01b0385166000908152600a602090815260408083208784528252808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055610f02565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526001600160a01b03989098166000818152600a8a528481208982528a5284812088871682528a52848120935184549351909716600160201b02640100000000600160801b031997871663ffffffff19948516179790971696909617909255908452600b875281842095845294909552939020805460019092019093169116179055565b60006147e8436040518060600160405280603e8152602001614eeb603e9139614902565b905060008363ffffffff161180156148275750600084815260066020908152604080832063ffffffff6000198801811685529252909120548282169116145b15614877576000848152600660209081526040808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b0385160217905561102d565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526000888152600682528481208887168252825284812093518454935163ffffffff1994851691881691909117640100000000600160801b031916600160201b919098160296909617909255958452600790529091208054909316600190920116179055565b600081600160201b84106149575760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b509192915050565b60408051808201909152600080825260208201529056fe5374616b696e673a3a64656c656761746542795369673a207369676e617475726520657870697265647468657265206973206e6f206e6577207374616b696e6720636f6e7472616374207365745374616b696e673a3a657874656e645374616b696e674475726174696f6e3a2063616e6e6f742072656475636520746865207374616b696e67206475726174696f6e57656967687465645374616b696e673a3a5f746f74616c506f776572427944617465466f7244656c6567617465653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a77697468647261773a20616d6f756e74206f6620746f6b656e7320746f2062652077697468647261776e206e6565647320746f20626520626967676572207468616e203072656365697665417070726f76616c3a205472616e73616374696f6e20657865637574696f6e2072657665727465642e57656967687465645374616b696e673a3a6765745072696f72546f74616c566f74696e67506f7765723a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e5374616b696e673a3a77697468647261773a20546f6b656e207472616e73666572206661696c65644f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e673a3a77697468647261773a206e6f7420656e6f7567682062616c616e63655374616b696e673a3a77697468647261773a2046656553686172696e672061646472657373207761736e2774207365745374616b696e673a3a64656c656761746542795369673a20696e76616c6964207369676e617475726557656967687465645374616b696e673a3a74696d657374616d70546f4c6f636b446174653a2074696d657374616d70206c696573206265666f726520636f6e7472616374206372656174696f6e776569676874207363616c696e6720646f65736e27742062656c6f6e6720746f2072616e6765205b312c20395d6d756c7469706c69636174696f6e206f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e57656967687465645374616b696e673a3a77656967687465645374616b654279446174653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a7374616b653a20616d6f756e74206f6620746f6b656e7320746f207374616b65206e6565647320746f20626520626967676572207468616e20305374616b696e673a3a657874656e645374616b696e674475726174696f6e3a206e6f7468696e67207374616b656420756e74696c207468652070726576696f7573206c6f636b20646174655374616b696e673a3a5f6465637265617365557365725374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f72566f7465733a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e57656967687465645374616b696e673a3a636f6d707574655765696768744279446174653a2064617465206e6565647320746f20626520626967676572207468616e207374617274446174655374616b696e673a3a5f696e6372656173654461696c795374616b653a207374616b656420616d6f756e74206f766572666c6f77454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374295374616b696e673a3a636f6d707574655765696768744279446174653a72656d61696e696e672074696d652063616e277420626520626967676572207468616e206d6178206475726174696f6e5374616b696e673a3a5f77726974655374616b696e67436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974735374616b696e673a3a5f696e637265617365557365725374616b653a207374616b656420616d6f756e74206f766572666c6f7757656967687465645374616b696e673a3a5f746f74616c506f7765724279446174653a206d756c7469706c69636174696f6e206f766572666c6f7757656967687465645374616b696e673a3a6765745072696f7257656967687465645374616b653a206f766572666c6f77206f6e20746f74616c2077656967687420636f6d7075746174696f6e5374616b696e673a3a74696d657374616d70546f4c6f636b446174653a207374616b696e6720706572696f6420746f6f2073686f72745374616b696e673a3a696e6372656173655374616b653a2062616c616e6365206f766572666c6f7763616e277420726573657420746865206e6577207374616b696e6720636f6e747261637420746f203044656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206c6f636b446174652c75696e74323536206e6f6e63652c75696e74323536206578706972792957656967687465645374616b696e673a3a6765745072696f72557365725374616b65416e64446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f64656372656173654461696c795374616b653a207374616b656420616d6f756e7420756e646572666c6f7746656553686172696e6720616464726573732073686f756c646e2774206265203057656967687465645374616b696e673a3a6765745072696f72546f74616c5374616b6573466f72446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f696e63726561736544656c65676174655374616b653a207374616b656420616d6f756e74206f766572666c6f775374616b696e673a3a5f646563726561736544656c65676174655374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f725374616b65427944617465466f7244656c6567617465653a206e6f74207965742064657465726d696e65645374616b696e673a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365a265627a7a7231582070c8659f6a2b539ed56789906ea305ff4a9fbc30164e77e66884ba77da4f7e7464736f6c63430005110032",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103c45760003560e01c8063800b64ca116101ff578063b8a987321161011a578063dfb267c2116100ad578063eefb8c471161007c578063eefb8c4714610d9e578063f09cfc6414610dc1578063f2fde38b14610de4578063fbbb8ec614610e0a576103c4565b8063dfb267c214610cee578063e63a562e14610d17578063e7a324dc14610d64578063e97ffacb14610d6c576103c4565b8063d5c38464116100e9578063d5c3846414610c44578063dab6ca4414610c61578063daeaf2f214610c9c578063db27ec1814610cc2576103c4565b8063b8a9873214610bdc578063bf626ec114610c02578063cf7b684a14610c0a578063d27569e714610c3c576103c4565b806396a590c111610192578063adae900211610161578063adae900214610b80578063ae81dfe414610ba6578063b1724b4614610bae578063b4b5ea5714610bb6576103c4565b806396a590c114610af85780639929e88614610b4a5780639a377b8214610b52578063a58848c514610b78576103c4565b80638f32d59b116101ce5780638f32d59b14610a015780638f4ffcb114610a095780639436e7d414610a9657806394c2ce5814610acc576103c4565b8063800b64ca14610954578063836eebee1461098f5780638da5cb5b146109c15780638dae1b16146109c9576103c4565b80633827fca5116102ef57806362cf8a081161028257806370a082311161025157806370a082311461082c57806372ec9795146108525780637ba6f4581461086f5780637ecebe001461092e576103c4565b806362cf8a081461074b57806368cefccc1461076e5780636b6fde0e146107ce5780637048027514610806576103c4565b80634b2fea1e116102be5780634b2fea1e146106cf5780635419675f146107155780635e0be6071461071d578063626ee2d914610725576103c4565b80633827fca514610623578063429b62e514610651578063450b060114610677578063472f88f71461069d576103c4565b806317748adc1161036757806325629ec01161033657806325629ec01461055c57806327dd1b001461059f57806332e9f250146105cb57806337e6b1c1146105f1576103c4565b806317748adc146104e15780631785f53c1461050557806320606b701461052b5780632522d7ba14610533576103c4565b806303a18fa3116103a357806303a18fa31461043757806307392cc01461045b5780630c09ddfd1461048c578063104932cf146104d9576103c4565b8062073f99146103c95780630130f0bf146103e3578063026e402b1461040b575b600080fd5b6103d1610e45565b60408051918252519081900360200190f35b610409600480360360208110156103f957600080fd5b50356001600160601b0316610e4b565b005b6104096004803603604081101561042157600080fd5b506001600160a01b038135169060200135610e72565b61043f610e8c565b604080516001600160a01b039092168252519081900360200190f35b6104786004803603602081101561047157600080fd5b5035610e9b565b604080519115158252519081900360200190f35b610409600480360360a08110156104a257600080fd5b506001600160a01b0381358116916001600160601b0360208201351691604082013591606081013582169160809091013516610eb0565b61043f610f09565b6104e9610f18565b604080516001600160601b039092168252519081900360200190f35b6104096004803603602081101561051b57600080fd5b50356001600160a01b0316610f1d565b6103d1610fbd565b6104e96004803603604081101561054957600080fd5b5063ffffffff8135169060200135610fd8565b6104096004803603608081101561057257600080fd5b506001600160601b03813516906020810135906001600160a01b036040820135811691606001351661101e565b61043f600480360360408110156105b557600080fd5b506001600160a01b038135169060200135611033565b6103d1600480360360208110156105e157600080fd5b50356001600160a01b0316611059565b6104e96004803603606081101561060757600080fd5b506001600160a01b038135169060208101359060400135611077565b6104096004803603604081101561063957600080fd5b506001600160a01b03813581169160200135166110b1565b6104786004803603602081101561066757600080fd5b50356001600160a01b03166111ee565b6104096004803603602081101561068d57600080fd5b50356001600160a01b0316611203565b610409600480360360608110156106b357600080fd5b506001600160a01b0381351690602081013590604001356112c8565b610409600480360360c08110156106e557600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a00135166112d3565b610409611372565b6104096113c0565b6104096004803603602081101561073b57600080fd5b50356001600160a01b03166114be565b6104e96004803603604081101561076157600080fd5b508035906020013561156d565b6107a66004803603606081101561078457600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff166116e6565b6040805163ffffffff90931683526001600160601b0390911660208301528051918290030190f35b6107a6600480360360608110156107e457600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff16611721565b6104096004803603602081101561081c57600080fd5b50356001600160a01b031661175c565b6104e96004803603602081101561084257600080fd5b50356001600160a01b03166117ff565b6103d16004803603602081101561086857600080fd5b503561186e565b6108956004803603602081101561088557600080fd5b50356001600160a01b03166118d8565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156108d95781810151838201526020016108c1565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610918578181015183820152602001610900565b5050505090500194505050505060405180910390f35b6103d16004803603602081101561094457600080fd5b50356001600160a01b0316611a13565b6104096004803603606081101561096a57600080fd5b5080356001600160601b031690602081013590604001356001600160a01b0316611a25565b6104e9600480360360608110156109a557600080fd5b506001600160a01b038135169060208101359060400135611a97565b61043f611af9565b6104e9600480360360808110156109df57600080fd5b506001600160a01b038135169060208101359060408101359060600135611b08565b610478611b8a565b61040960048036036080811015610a1f57600080fd5b6001600160a01b038235811692602081013592604082013590921691810190608081016060820135600160201b811115610a5857600080fd5b820183602082011115610a6a57600080fd5b803590602001918460018302840111600160201b83111715610a8b57600080fd5b509092509050611bae565b610ab360048036036020811015610aac57600080fd5b5035611e80565b6040805163ffffffff9092168252519081900360200190f35b610ab360048036036040811015610ae257600080fd5b506001600160a01b038135169060200135611e98565b610b2460048036036040811015610b0e57600080fd5b506001600160601b038135169060200135611ebb565b604080516001600160601b03938416815291909216602082015281519081900390910190f35b610478611ee0565b61040960048036036020811015610b6857600080fd5b50356001600160a01b0316611ee9565b61043f611f9e565b61047860048036036020811015610b9657600080fd5b50356001600160a01b0316611fad565b61043f611fc2565b6103d1611fd6565b6104e960048036036020811015610bcc57600080fd5b50356001600160a01b0316611fde565b61040960048036036020811015610bf257600080fd5b50356001600160601b0316611fee565b6104e96120bd565b6104e960048036036060811015610c2057600080fd5b506001600160a01b0381351690602081013590604001356120d3565b6104e961210d565b6104e960048036036020811015610c5a57600080fd5b5035612112565b61040960048036036060811015610c7757600080fd5b5080356001600160601b031690602081013590604001356001600160a01b031661216e565b61040960048036036020811015610cb257600080fd5b50356001600160601b0316612188565b610ab360048036036040811015610cd857600080fd5b506001600160a01b0381351690602001356121b0565b6107a660048036036040811015610d0457600080fd5b508035906020013563ffffffff166121d3565b610409600480360360e0811015610d2d57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060ff6080820135169060a08101359060c00135612208565b6103d16124de565b6104e960048036036060811015610d8257600080fd5b506001600160a01b0381351690602081013590604001356124f9565b61040960048036036040811015610db457600080fd5b5080359060200135612761565b6104e960048036036040811015610dd757600080fd5b5080359060200135612949565b61040960048036036020811015610dfa57600080fd5b50356001600160a01b0316612b41565b61040960048036036060811015610e2057600080fd5b5080356001600160a01b031690602081013590604001356001600160601b0316612b95565b60015481565b601280546bffffffffffffffffffffffff19166001600160601b0392909216919091179055565b610e7d338383612c03565b610e88338383612cb5565b5050565b600d546001600160a01b031681565b60106020526000908152604090205460ff1681565b333014610ef3576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b610f0285858585856000612de2565b5050505050565b6011546001600160a01b031681565b600981565b610f25611b8a565b610f65576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19169055815192835290517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9281900390910190a150565b604051806043614e5b82396043019050604051809103902081565b601154600090600160a01b90046001600160601b031661100157610ffc8383612ffe565b611015565b601154600160a01b90046001600160601b03165b90505b92915050565b61102d33858585856000612de2565b50505050565b60046020908152600092835260408084209091529082529020546001600160a01b031681565b6000611064826117ff565b6002026001600160601b03169050919050565b6012546000906001600160601b031661109a57611095848484613064565b6110a7565b6012546001600160601b03165b90505b9392505050565b6110b9611b8a565b806110d35750336000908152600f602052604090205460ff165b611113576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038083166000818152600e6020526040808220805460ff191660011790558051633c7925e360e11b815293851660048501525191926378f24bc6926024808301939282900301818387803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b5050506001600160a01b038084166000818152600e6020908152604091829020805460ff1916905581519283529285169282019290925281517f2366e0b6b1af17c0ceed50685c570d519cae11e7faaf007bbe667e94a5ee3cd593509081900390910190a15050565b600f6020526000908152604090205460ff1681565b61120b611b8a565b61124b576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166112a6576040805162461bcd60e51b815260206004820181905260248201527f76657374696e67207265676973747279206164647265737320696e76616c6964604482015290519081900360640190fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b61102d838383613064565b60006112e086420161186e565b905063059fa6008511156112f65763059fa60094505b600061130386420161186e565b90506000858383038161131257fe5b0460010190506000818a8161132357fe5b0490506001821061134457611344336001840383028c038689896001612de2565b8387015b8381116113655761135e3383838a8a6001612de2565b8701611348565b5050505050505050505050565b60055461010090046001600160a01b03166113be5760405162461bcd60e51b81526004018080602001828103825260248152602001806149a06024913960400191505060405180910390fd5b565b6113c8611b8a565b611408576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6005805460ff19166001179055600354604080516370a0823160e01b815230600482015290517fd8cc4e8d808fe950b07bfffcd83eebf1190cd35ea77fe0c8a7d75a6e9b90e5c1926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d60208110156114a957600080fd5b505160408051918252519081900360200190a1565b6114c6611b8a565b611506576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03811661154b5760405162461bcd60e51b81526004018080602001828103825260218152602001806151276021913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818310156115ae5760405162461bcd60e51b815260040180806020018281038252604c815260200180614ddb604c913960600191505060405180910390fd5b81830363059fa6008111156115f45760405162461bcd60e51b815260040180806020018281038252604d815260200180614e9e604d913960600191505060405180910390fd5b6000620151808263059fa600036001600160601b03168161161157fe5b0490506116dd600a621232106001600160601b0316611691600a600902611673621232108788026040518060400160405280601f81526020017f756e646572666c6f77206f6e207765696768742063616c63756c6174696f6e008152506130d2565b6040518060600160405280602d8152602001614c65602d913961317c565b6001600160601b0316816116a157fe5b046040518060400160405280601e81526020017f6f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e0000815250613208565b95945050505050565b600a60209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b600860209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b611764611b8a565b6117a4576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19166001179055815192835290517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399281900390910190a150565b6001546000905b63059fa600420181116118685761185c826118218584613269565b6040518060400160405280601c81526020017f5374616b696e673a3a62616c616e63654f663a206f766572666c6f7700000000815250613208565b91506212750001611806565b50919050565b60006001548210156118b15760405162461bcd60e51b815260040180806020018281038252604d815260200180614beb604d913960600191505060405180910390fd5b6000621275006001548403816118c357fe5b04905060015462127500820201915050919050565b60608060006118ec63059fa600420161186e565b60015490915060009062127500015b82811161192e57600061190e8783613269565b6001600160601b03161115611924576001909101905b62127500016118fb565b5080604051908082528060200260200182016040528015611959578160200160208202803883390190505b50935080604051908082528060200260200182016040528015611986578160200160208202803883390190505b5060015490935060009062127500015b838111611a0a5760006119a98883613269565b90506001600160601b038116156119ff57818784815181106119c757fe5b602002602001018181525050808684815181106119e057fe5b6001600160601b03909216602092830291909101909101526001909201915b506212750001611996565b50505050915091565b600c6020526000908152604090205481565b336000908152600e602052604090205460ff16611a78576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b611a8583838360016132ca565b611a928383836001613616565b505050565b600080611aa38361186e565b905063059fa6008101815b818111611aef57611ae384611ac58984878b613678565b6040518060800160405280604a8152602001614d91604a9139613208565b93506212750001611aae565b5050509392505050565b6000546001600160a01b031690565b600080611b168686856136e0565b90506001600160601b03811615611b7c576000611b33868661156d565b9050600a6001600160601b0316611b6383836040518060600160405280603d8152602001614c92603d913961317c565b6001600160601b031681611b7357fe5b04925050611b81565b600091505b50949350505050565b600080546001600160a01b0316611b9f613954565b6001600160a01b031614905090565b611bb6613958565b6001600160a01b0316336001600160a01b031614611c0a576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b336001600160a01b03841614611c56576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b60006060611c62613967565b90506000611ca585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139bf92505050565b905060005b8251811015611cf357828181518110611cbf57fe5b60200260200101516001600160e01b031916826001600160e01b0319161415611ceb5760019350611cf3565b600101611caa565b5082611d3e576040805162461bcd60e51b81526020600482015260156024820152741b595d1a1bd9081a5cc81b9bdd08185b1b1bddd959605a1b604482015290519081900360640190fd5b60405160006020820181815290918291829189918991603c018383808284378083019250505093505050506040516020818303038152906040528060200190516060811015611d8c57600080fd5b50602081015160409091015190925090506001600160a01b03808316908b1614611def576040805162461bcd60e51b815260206004820152600f60248201526e0e6cadcc8cae440dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b888114611e35576040805162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b611e7487878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139c692505050565b50505050505050505050565b60076020526000908152604090205463ffffffff1681565b600960209081526000928352604080842090915290825290205463ffffffff1681565b600080611ec88484613b2f565b6000611ed48585613bda565b94859003959350505050565b60055460ff1681565b611ef1611b8a565b611f31576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038116611f765760405162461bcd60e51b81526004018080602001828103825260298152602001806150416029913960400191505060405180910390fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6003546001600160a01b031681565b600e6020526000908152604090205460ff1681565b60055461010090046001600160a01b031681565b63059fa60081565b6000611018826001430342611a97565b611ff6611b8a565b612036576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160601b03811660011180159061205a575060096001600160601b03821611155b6120955760405162461bcd60e51b815260040180806020018281038252602d815260200180614c38602d913960400191505060405180910390fd5b600d80546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b600d54600160a01b90046001600160601b031681565b6000806120e18585856136e0565b90506001600160601b0381161580156120fd57506120fd613c25565b156110a757506001949350505050565b600a81565b60008181526007602052604081205463ffffffff16806121335760006110aa565b6000838152600660209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03169392505050565b61217b83838360006132ca565b611a928383836000613616565b601180546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b600660209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b60006040518080614e5b6043913960430190506040518091039020600260405180828054600181600116156101000203166002900480156122805780601f1061225e576101008083540402835291820191612280565b820191906000526020600020905b81548152906001019060200180831161226c575b50509150506040518091039020612295613ca1565b3060405160200180858152602001848152602001838152602001826001600160a01b03166001600160a01b031681526020019450505050506040516020818303038152906040528051906020012090506000604051808061506a604b91396040805191829003604b0182206020808401919091526001600160a01b038d1683830152606083018c9052608083018b905260a08084018b90528251808503909101815260c08401835280519082012061190160f01b60e085015260e28401879052610102808501829052835180860390910181526101228501808552815191840191909120600091829052610142860180865281905260ff8c1661016287015261018286018b90526101a286018a9052935191965092945091926001926101c28083019392601f198301929081900390910190855afa1580156123db573d6000803e3d6000fd5b5050506020604051035190506123f081613ca5565b61242b5760405162461bcd60e51b8152600401808060200182810382526029815260200180614bc26029913960400191505060405180910390fd5b6001600160a01b0381166000908152600c6020526040902080546001810190915589146124895760405162461bcd60e51b815260040180806020018281038252602581526020018061523a6025913960400191505060405180910390fd5b874211156124c85760405162461bcd60e51b81526004018080602001828103825260298152602001806149776029913960400191505060405180910390fd5b6124d3818c8c612c03565b611365818c8c612cb5565b60405180604b61506a8239604b019050604051809103902081565b6000612503613cde565b82106125405760405162461bcd60e51b81526004018080602001828103825260448152602001806151f66044913960600191505060405180910390fd5b6001600160a01b038416600090815260096020908152604080832086845290915290205463ffffffff16806125795760009150506110aa565b6001600160a01b0385166000908152600860209081526040808320878452825280832063ffffffff600019860181168552925290912054168310612605576001600160a01b038516600090815260086020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506110aa565b6001600160a01b0385166000908152600860209081526040808320878452825280832083805290915290205463ffffffff168310156126485760009150506110aa565b600060001982015b8163ffffffff168163ffffffff16111561271357600282820363ffffffff1604810361267a61495f565b506001600160a01b03881660009081526008602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156126ee576020015194506110aa9350505050565b805163ffffffff168711156127055781935061270c565b6001820392505b5050612650565b506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b61276a8161186e565b9050808211156127ab5760405162461bcd60e51b81526004018080602001828103825260428152602001806149c46042913960600191505060405180910390fd5b60006127bc63059fa600420161186e565b9050808211156127ca578091505b60006127da3385600143036136e0565b90506000816001600160601b0316116128245760405162461bcd60e51b815260040180806020018281038252604b815260200180614d12604b913960600191505060405180910390fd5b61282f338583613ce2565b61283a338483613d73565b6128448482613df6565b61284e8382613e6e565b336000908152600460209081526040808320878452909152808220548583529120546001600160a01b039182169116806128b85750336000908152600460209081526040808320878452909152902080546001600160a01b0319166001600160a01b038316179055805b336000908152600460209081526040808320898452909152902080546001600160a01b03191690556128eb828785613ed9565b6128f6818685613f76565b60408051878152602081018790526001600160601b03851681830152905133917f809d79c94c86576d61afef75495b8df415224bf885310fed7ea315039f8c5b4c919081900360600190a2505050505050565b6000612953613cde565b82106129905760405162461bcd60e51b815260040180806020018281038252603f815260200180615148603f913960400191505060405180910390fd5b60008381526007602052604090205463ffffffff16806129b4576000915050611018565b600084815260066020908152604080832063ffffffff600019860181168552925290912054168310612a1c5760008481526006602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050611018565b600084815260066020908152604080832083805290915290205463ffffffff16831015612a4d576000915050611018565b600060001982015b8163ffffffff168163ffffffff161115612b0657600282820363ffffffff16048103612a7f61495f565b50600087815260066020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415612ae1576020015194506110189350505050565b805163ffffffff16871115612af857819350612aff565b6001820392505b5050612a55565b50600085815260066020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b612b49611b8a565b612b89576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b612b9281613ff9565b50565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff94851660001981019095168452909152812054600160201b90046001600160601b031690610f0290869086908590614099565b6001600160a01b03808416600090815260046020908152604080832085845290915281205490911690612c368584613269565b6001600160a01b03868116600081815260046020908152604080832089845282529182902080546001600160a01b0319168a86169081179091558251898152925195965094938716937fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca99281900390910190a4610f02828583866142bc565b612cbd613c25565b15611a92576000612cd7826212750063ffffffff61432016565b6001600160a01b0380861660009081526004602090815260408083208584529091529020549192509081169084168114612d1657612d16858584612c03565b6000336001600160a01b031663c24a0f8b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d5357600080fd5b505af1158015612d67573d6000803e3d6000fd5b505050506040513d6020811015612d7d57600080fd5b50519050612d94846224ea0063ffffffff61432016565b925080831415612dda576001600160a01b0380871660009081526004602090815260408083208784529091529020548116925085168214612dda57612dda868685612c03565b505050505050565b6000856001600160601b031611612e2a5760405162461bcd60e51b8152600401808060200182810382526043815260200180614ccf6043913960600191505060405180910390fd5b80612e3b57612e388461186e565b93505b428411612e795760405162461bcd60e51b8152600401808060200182810382526036815260200180614fe36036913960400191505060405180910390fd5b6001600160a01b038316612e8b578592505b6001600160a01b038216612e9d578291505b80612ec3576000612eb363059fa600420161186e565b905080851115612ec1578094505b505b6000612ecf8486613269565b9050612edd8787868861437a565b6001600160a01b03808516600090815260046020908152604080832089845290915290205481169084168114612f94576001600160a01b0385811660009081526004602090815260408083208a8452909152902080546001600160a01b031916918616919091179055612f51818784613ed9565b612f9182886040518060400160405280602081526020017f5374616b696e673a3a7374616b653a2062616c616e6365206f766572666c6f77815250613208565b96505b612f9f848789613f76565b836001600160a01b0316816001600160a01b0316866001600160a01b03167fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca9896040518082815260200191505060405180910390a45050505050505050565b60008061300a8361186e565b905063059fa6008101815b81811161305b5761304f8461303183868a63ffffffff166144bf565b604051806080016040528060558152602001614aca60559139613208565b93506212750001613015565b50505092915050565b6000806130708361186e565b905063059fa6008101815b818111611aef5760006130908883868a611b08565b90506001600160601b038116156130c7576130c485826040518060800160405280604c8152602001614f97604c9139613208565b94505b50621275000161307b565b6000836001600160601b0316836001600160601b0316111582906131745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613139578181015183820152602001613121565b50505050905090810190601f1680156131665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006001600160601b038416613194575060006110aa565b8383026001600160601b0380851690808716908316816131b057fe5b046001600160601b0316148390611b815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b6000838301826001600160601b038087169083161015611b815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b6001600160a01b0382166000818152600a602090815260408083208584528252808320938352600b825280832085845282528083205460001963ffffffff9182160116835292905220546001600160601b03600160201b9091041692915050565b836001600160601b031660011480156132e657506132e6613c25565b156132f05761102d565b6132f983614525565b92506133058484613b2f565b6001600160a01b038216613317573391505b6133218385613df6565b61332c338486613ce2565b33600090815260046020908152604080832086845290915290205461335b906001600160a01b03168486613ed9565b824210801561336d575060055460ff16155b8015613377575080155b156134ed5760006133888585613bda565b948590039490506001600160601b038116156134eb57600d546001600160a01b03166133e55760405162461bcd60e51b8152600401808060200182810382526030815260200180614b926030913960400191505060405180910390fd5b600354600d546040805163095ea7b360e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561344657600080fd5b505af115801561345a573d6000803e3d6000fd5b505050506040513d602081101561347057600080fd5b5050600d546003546040805163abe979e160e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163abe979e191604480830192600092919082900301818387803b1580156134d257600080fd5b505af11580156134e6573d6000803e3d6000fd5b505050505b505b6003546040805163a9059cbb60e01b81526001600160a01b0385811660048301526001600160601b03881660248301529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561354e57600080fd5b505af1158015613562573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b50519050806135b85760405162461bcd60e51b8152600401808060200182810382526028815260200180614b1f6028913960400191505060405180910390fd5b604080516001600160601b0387168152602081018690528315158183015290516001600160a01b0385169133917f667b6c8ed8622dae7927a8b0837455098e32037a0181f9a2e21b9b72fead6cc79181900360600190a35050505050565b61361e613c25565b1561102d576000613638846212750063ffffffff61432016565b905081806136465750804210155b15610f0257600061365b3383600143036136e0565b90506001600160601b03811615612dda57612dda818386866132ca565b600080613685858561156d565b905060006136948787866124f9565b9050600a6001600160601b03166136c48284604051806080016040528060478152602001614a066047913961317c565b6001600160601b0316816136d457fe5b04979650505050505050565b60006136ea613cde565b82106137275760405162461bcd60e51b815260040180806020018281038252603d8152602001806150b5603d913960400191505060405180910390fd5b61373083614525565b6001600160a01b0385166000908152600b6020908152604080832084845290915290205490935063ffffffff168061376c5760009150506110aa565b6001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198601811685529252909120541683106137f8576001600160a01b0385166000908152600a6020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506110aa565b6001600160a01b0385166000908152600a60209081526040808320878452825280832083805290915290205463ffffffff1683101561383b5760009150506110aa565b600060001982015b8163ffffffff168163ffffffff16111561390657600282820363ffffffff1604810361386d61495f565b506001600160a01b0388166000908152600a602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156138e1576020015194506110aa9350505050565b805163ffffffff168711156138f8578193506138ff565b6001820392505b5050613843565b506001600160a01b0386166000908152600a60209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b3390565b6003546001600160a01b031690565b60408051600180825281830190925260609182919060208083019080388339019050509050630c09ddfd60e01b816000815181106139a157fe5b6001600160e01b031990921660209283029190910190910152905090565b6020015190565b60006060306001600160a01b0316836040518082805190602001908083835b60208310613a045780518252601f1990920191602091820191016139e5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a66576040519150601f19603f3d011682016040523d82523d6000602084013e613a6b565b606091505b509150915081611a92576044815111613ab55760405162461bcd60e51b8152600401808060200182810382526030815260200180614a9a6030913960400191505060405180910390fd5b613ae86040518060400160405280601181526020017003932b1b2b4bb32a0b8383937bb30b61d1607d1b8152508261454a565b60405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b6000826001600160601b031611613b775760405162461bcd60e51b815260040180806020018281038252604d815260200180614a4d604d913960600191505060405180910390fd5b6000613b873383600143036136e0565b9050806001600160601b0316836001600160601b03161115611a925760405162461bcd60e51b8152600401808060200182810382526025815260200180614b6d6025913960400191505060405180910390fd5b600080613be64261186e565b90506000613bf4848361156d565b600d54600160a01b90046001600160601b03908116919091029150606490600a878402821604160495945050505050565b6011546040805163dbb049d160e01b815233600482015290516000926001600160a01b03169163dbb049d1916024808301926020929190829003018186803b158015613c7057600080fd5b505afa158015613c84573d6000803e3d6000fd5b505050506040513d6020811015613c9a57600080fd5b5051905090565b4690565b600073dcc703c0e500b653ca82273b7bfad8045d85a4706001600160a01b038316148015906110185750506001600160a01b0316151590565b4390565b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526034808352600160201b9091046001600160601b03169392613d659285928892614d5d908301396130d2565b9050612dda86868584614644565b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526033808352600160201b9091046001600160601b03169392613d659285928892614f2990830139613208565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260358084529194600160201b9091046001600160601b0316939092613e61928592889291906150f2908301396130d2565b9050610f028584836147c4565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260348084529194600160201b9091046001600160601b0316939092613e6192859288929190614e2790830139613208565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff94851660001981019095168452909152812054600160201b90046001600160601b0390811691908416821115613f6a57613f6782856040518060600160405280603881526020016151be603891396130d2565b90505b612dda86868584614099565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526037808352600160201b9091046001600160601b03169392613f67928592889261518790830139613208565b6001600160a01b03811661403e5760405162461bcd60e51b8152600401808060200182810382526026815260200180614b476026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006140bd436040518060600160405280603e8152602001614eeb603e9139614902565b6001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff9081168552925290912054919250600160201b9091046001600160601b03169084161580159061415357506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff6000198901811685529252909120548382169116145b156141b5576001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b0386160217905561425f565b60408051808201825263ffffffff80851682526001600160601b0380871660208085019182526001600160a01b038c166000818152600883528781208d825283528781208c871682528352878120965187549451909516600160201b02640100000000600160801b031995871663ffffffff19958616179590951694909417909555938252600984528482208a835290935292909220805460018801909316929091169190911790555b604080518681526001600160601b03808416602083015285168183015290516001600160a01b038816917fc7b38fb25352e6f351f57e2c922f84db5c97e09a6246bbe1d2eedfcdb01c4c62919081900360600190a2505050505050565b826001600160a01b0316846001600160a01b0316141580156142e757506000826001600160601b0316115b1561102d576001600160a01b0384161561430657614306848284613ed9565b6001600160a01b0383161561102d5761102d838284613f76565b600082820183811015611015576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600354604080516323b872dd60e01b81526001600160a01b0387811660048301523060248301526001600160601b0387166044830152915160009392909216916323b872dd9160648082019260209290919082900301818787803b1580156143e157600080fd5b505af11580156143f5573d6000803e3d6000fd5b505050506040513d602081101561440b57600080fd5b505190508061441957600080fd5b60006144258484613269565b905061444a818660405180606001604052806028815260200161501960289139613208565b90506144568386613e6e565b614461848487613d73565b604080516001600160601b0380881682526020820186905283168183015290516001600160a01b038616917f0fc5b1bac0416800b42a669229a346b6e5a15db3896339dbdc5fa376e1e4570a919081900360600190a2505050505050565b6000806144cc858561156d565b905060006144da8685612949565b9050600a6001600160601b031661450a82846040518060600160405280603b8152602001614f5c603b913961317c565b6001600160601b03168161451a57fe5b049695505050505050565b6000806145318361186e565b90508281146145435762127500810192505b5090919050565b6060808390506060839050606060448251845101036040519080825280601f01601f191660200182016040528015614589576020820181803883390190505b509050806000805b85518110156145e2578581815181106145a657fe5b602001015160f81c60f81b8383806001019450815181106145c357fe5b60200101906001600160f81b031916908160001a905350600101614591565b5060445b8451811015614637578481815181106145fb57fe5b602001015160f81c60f81b83838060010194508151811061461857fe5b60200101906001600160f81b031916908160001a9053506001016145e6565b5090979650505050505050565b6000614668436040518060600160405280603e8152602001614eeb603e9139614902565b905060008363ffffffff161180156146b957506001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198801811685529252909120548282169116145b1561471b576001600160a01b0385166000908152600a602090815260408083208784528252808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055610f02565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526001600160a01b03989098166000818152600a8a528481208982528a5284812088871682528a52848120935184549351909716600160201b02640100000000600160801b031997871663ffffffff19948516179790971696909617909255908452600b875281842095845294909552939020805460019092019093169116179055565b60006147e8436040518060600160405280603e8152602001614eeb603e9139614902565b905060008363ffffffff161180156148275750600084815260066020908152604080832063ffffffff6000198801811685529252909120548282169116145b15614877576000848152600660209081526040808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b0385160217905561102d565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526000888152600682528481208887168252825284812093518454935163ffffffff1994851691881691909117640100000000600160801b031916600160201b919098160296909617909255958452600790529091208054909316600190920116179055565b600081600160201b84106149575760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613139578181015183820152602001613121565b509192915050565b60408051808201909152600080825260208201529056fe5374616b696e673a3a64656c656761746542795369673a207369676e617475726520657870697265647468657265206973206e6f206e6577207374616b696e6720636f6e7472616374207365745374616b696e673a3a657874656e645374616b696e674475726174696f6e3a2063616e6e6f742072656475636520746865207374616b696e67206475726174696f6e57656967687465645374616b696e673a3a5f746f74616c506f776572427944617465466f7244656c6567617465653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a77697468647261773a20616d6f756e74206f6620746f6b656e7320746f2062652077697468647261776e206e6565647320746f20626520626967676572207468616e203072656365697665417070726f76616c3a205472616e73616374696f6e20657865637574696f6e2072657665727465642e57656967687465645374616b696e673a3a6765745072696f72546f74616c566f74696e67506f7765723a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e5374616b696e673a3a77697468647261773a20546f6b656e207472616e73666572206661696c65644f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e673a3a77697468647261773a206e6f7420656e6f7567682062616c616e63655374616b696e673a3a77697468647261773a2046656553686172696e672061646472657373207761736e2774207365745374616b696e673a3a64656c656761746542795369673a20696e76616c6964207369676e617475726557656967687465645374616b696e673a3a74696d657374616d70546f4c6f636b446174653a2074696d657374616d70206c696573206265666f726520636f6e7472616374206372656174696f6e776569676874207363616c696e6720646f65736e27742062656c6f6e6720746f2072616e6765205b312c20395d6d756c7469706c69636174696f6e206f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e57656967687465645374616b696e673a3a77656967687465645374616b654279446174653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a7374616b653a20616d6f756e74206f6620746f6b656e7320746f207374616b65206e6565647320746f20626520626967676572207468616e20305374616b696e673a3a657874656e645374616b696e674475726174696f6e3a206e6f7468696e67207374616b656420756e74696c207468652070726576696f7573206c6f636b20646174655374616b696e673a3a5f6465637265617365557365725374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f72566f7465733a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e57656967687465645374616b696e673a3a636f6d707574655765696768744279446174653a2064617465206e6565647320746f20626520626967676572207468616e207374617274446174655374616b696e673a3a5f696e6372656173654461696c795374616b653a207374616b656420616d6f756e74206f766572666c6f77454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374295374616b696e673a3a636f6d707574655765696768744279446174653a72656d61696e696e672074696d652063616e277420626520626967676572207468616e206d6178206475726174696f6e5374616b696e673a3a5f77726974655374616b696e67436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974735374616b696e673a3a5f696e637265617365557365725374616b653a207374616b656420616d6f756e74206f766572666c6f7757656967687465645374616b696e673a3a5f746f74616c506f7765724279446174653a206d756c7469706c69636174696f6e206f766572666c6f7757656967687465645374616b696e673a3a6765745072696f7257656967687465645374616b653a206f766572666c6f77206f6e20746f74616c2077656967687420636f6d7075746174696f6e5374616b696e673a3a74696d657374616d70546f4c6f636b446174653a207374616b696e6720706572696f6420746f6f2073686f72745374616b696e673a3a696e6372656173655374616b653a2062616c616e6365206f766572666c6f7763616e277420726573657420746865206e6577207374616b696e6720636f6e747261637420746f203044656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206c6f636b446174652c75696e74323536206e6f6e63652c75696e74323536206578706972792957656967687465645374616b696e673a3a6765745072696f72557365725374616b65416e64446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f64656372656173654461696c795374616b653a207374616b656420616d6f756e7420756e646572666c6f7746656553686172696e6720616464726573732073686f756c646e2774206265203057656967687465645374616b696e673a3a6765745072696f72546f74616c5374616b6573466f72446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f696e63726561736544656c65676174655374616b653a207374616b656420616d6f756e74206f766572666c6f775374616b696e673a3a5f646563726561736544656c65676174655374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f725374616b65427944617465466f7244656c6567617465653a206e6f74207965742064657465726d696e65645374616b696e673a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365a265627a7a7231582070c8659f6a2b539ed56789906ea305ff4a9fbc30164e77e66884ba77da4f7e7464736f6c63430005110032",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
