{
  "_format": "hh-sol-artifact-1",
  "contractName": "StakingMock",
  "sourceName": "contracts/mockup/StakingMock.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": 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": [],
      "name": "blockMockUp",
      "outputs": [
        {
          "internalType": "contract BlockMockUp",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "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": "votes",
          "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": "_blockMockUp",
          "type": "address"
        }
      ],
      "name": "setBlockMockUpAddr",
      "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": "0x60c0604052600a608081905269534f565374616b696e6760b01b60a09081526200002d9160029190620000ae565b506005805460ff19169055600d80546001600160a01b0316600360a01b179055600062000059620000a9565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000150565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b620000ab91905b808211156200012f57600081556001016200013a565b61517980620001606000396000f3fe608060405234801561001057600080fd5b50600436106103a35760003560e01c8063836eebee116101e9578063b4b5ea571161010f578063db27ec18116100ad578063e97ffacb1161007c578063e97ffacb14610cd5578063eefb8c4714610d07578063f09cfc6414610d2a578063f2fde38b14610d4d576103a3565b8063db27ec1814610c2b578063dfb267c214610c57578063e63a562e14610c80578063e7a324dc14610ccd576103a3565b8063cf7b684a116100e9578063cf7b684a14610b99578063d27569e714610bcb578063d5c3846414610bd3578063dab6ca4414610bf0576103a3565b8063b4b5ea5714610b45578063b8a9873214610b6b578063bf626ec114610b91576103a3565b806396a590c111610187578063a58848c511610156578063a58848c514610b07578063adae900214610b0f578063ae81dfe414610b35578063b1724b4614610b3d576103a3565b806396a590c114610a615780639929e88614610ab35780639a377b8214610abb578063a377f24414610ae1576103a3565b80638f32d59b116101c35780638f32d59b1461096a5780638f4ffcb1146109725780639436e7d4146109ff57806394c2ce5814610a35576103a3565b8063836eebee146108f85780638da5cb5b1461092a5780638dae1b1614610932576103a3565b8063450b0601116102ce57806368cefccc1161026c57806372ec97951161023b57806372ec9795146107bb5780637ba6f458146107d85780637ecebe0014610897578063800b64ca146108bd576103a3565b806368cefccc146106d75780636b6fde0e14610737578063704802751461076f57806370a0823114610795576103a3565b80635419675f116102a85780635419675f1461067e5780635e0be60714610686578063626ee2d91461068e57806362cf8a08146106b4576103a3565b8063450b06011461060a5780634b2fea1e146106305780635004b6e414610676576103a3565b80631785f53c1161034657806327dd1b001161031557806327dd1b001461055857806337e6b1c1146105845780633827fca5146105b6578063429b62e5146105e4576103a3565b80631785f53c146104be57806320606b70146104e45780632522d7ba146104ec57806325629ec014610515576103a3565b806307392cc01161038257806307392cc0146104145780630c09ddfd14610445578063104932cf1461049257806317748adc1461049a576103a3565b8062073f99146103a8578063026e402b146103c257806303a18fa3146103f0575b600080fd5b6103b0610d73565b60408051918252519081900360200190f35b6103ee600480360360408110156103d857600080fd5b506001600160a01b038135169060200135610d79565b005b6103f8610d93565b604080516001600160a01b039092168252519081900360200190f35b6104316004803603602081101561042a57600080fd5b5035610da2565b604080519115158252519081900360200190f35b6103ee600480360360a081101561045b57600080fd5b506001600160a01b0381358116916001600160601b0360208201351691604082013591606081013582169160809091013516610db7565b6103f8610e10565b6104a2610e1f565b604080516001600160601b039092168252519081900360200190f35b6103ee600480360360208110156104d457600080fd5b50356001600160a01b0316610e24565b6103b0610ec4565b6104a26004803603604081101561050257600080fd5b5063ffffffff8135169060200135610edf565b6103ee6004803603608081101561052b57600080fd5b506001600160601b03813516906020810135906001600160a01b0360408201358116916060013516610f45565b6103f86004803603604081101561056e57600080fd5b506001600160a01b038135169060200135610f5a565b6104a26004803603606081101561059a57600080fd5b506001600160a01b038135169060208101359060400135610f80565b6103ee600480360360408110156105cc57600080fd5b506001600160a01b0381358116916020013516610ff8565b610431600480360360208110156105fa57600080fd5b50356001600160a01b0316611135565b6103ee6004803603602081101561062057600080fd5b50356001600160a01b031661114a565b6103ee600480360360c081101561064657600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a001351661120f565b6103f86112ae565b6103ee6112bd565b6103ee61130b565b6103ee600480360360208110156106a457600080fd5b50356001600160a01b0316611409565b6104a2600480360360408110156106ca57600080fd5b50803590602001356114b8565b61070f600480360360608110156106ed57600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff16611631565b6040805163ffffffff90931683526001600160601b0390911660208301528051918290030190f35b61070f6004803603606081101561074d57600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff1661166c565b6103ee6004803603602081101561078557600080fd5b50356001600160a01b03166116a7565b6104a2600480360360208110156107ab57600080fd5b50356001600160a01b031661174a565b6103b0600480360360208110156107d157600080fd5b50356117b9565b6107fe600480360360208110156107ee57600080fd5b50356001600160a01b0316611823565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561084257818101518382015260200161082a565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610881578181015183820152602001610869565b5050505090500194505050505060405180910390f35b6103b0600480360360208110156108ad57600080fd5b50356001600160a01b031661195e565b6103ee600480360360608110156108d357600080fd5b5080356001600160601b031690602081013590604001356001600160a01b0316611970565b6104a26004803603606081101561090e57600080fd5b506001600160a01b0381351690602081013590604001356119e2565b6103f8611a3a565b6104a26004803603608081101561094857600080fd5b506001600160a01b038135169060208101359060408101359060600135611a49565b610431611acb565b6103ee6004803603608081101561098857600080fd5b6001600160a01b038235811692602081013592604082013590921691810190608081016060820135600160201b8111156109c157600080fd5b8201836020820111156109d357600080fd5b803590602001918460018302840111600160201b831117156109f457600080fd5b509092509050611aef565b610a1c60048036036020811015610a1557600080fd5b5035611dc1565b6040805163ffffffff9092168252519081900360200190f35b610a1c60048036036040811015610a4b57600080fd5b506001600160a01b038135169060200135611dd9565b610a8d60048036036040811015610a7757600080fd5b506001600160601b038135169060200135611dfc565b604080516001600160601b03938416815291909216602082015281519081900390910190f35b610431611e21565b6103ee60048036036020811015610ad157600080fd5b50356001600160a01b0316611e2a565b6103ee60048036036020811015610af757600080fd5b50356001600160a01b0316611edf565b6103f8611fa4565b61043160048036036020811015610b2557600080fd5b50356001600160a01b0316611fb3565b6103f8611fc8565b6103b0611fdc565b6104a260048036036020811015610b5b57600080fd5b50356001600160a01b0316611fe4565b6103ee60048036036020811015610b8157600080fd5b50356001600160601b0316611ffa565b6104a26120c9565b6104a260048036036060811015610baf57600080fd5b506001600160a01b0381351690602081013590604001356120df565b6104a261211c565b6104a260048036036020811015610be957600080fd5b5035612121565b6103ee60048036036060811015610c0657600080fd5b5080356001600160601b031690602081013590604001356001600160a01b031661217d565b610a1c60048036036040811015610c4157600080fd5b506001600160a01b038135169060200135612197565b61070f60048036036040811015610c6d57600080fd5b508035906020013563ffffffff166121ba565b6103ee600480360360e0811015610c9657600080fd5b506001600160a01b038135169060208101359060408101359060608101359060ff6080820135169060a08101359060c001356121ef565b6103b06124c5565b6104a260048036036060811015610ceb57600080fd5b506001600160a01b0381351690602081013590604001356124e0565b6103ee60048036036040811015610d1d57600080fd5b5080359060200135612748565b6104a260048036036040811015610d4057600080fd5b5080359060200135612930565b6103ee60048036036020811015610d6357600080fd5b50356001600160a01b0316612b28565b60015481565b610d84338383612b7c565b610d8f338383612c2e565b5050565b600d546001600160a01b031681565b60106020526000908152604090205460ff1681565b333014610dfa576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b610e0985858585856000612d5b565b5050505050565b6011546001600160a01b031681565b600981565b610e2c611acb565b610e6c576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19169055815192835290517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9281900390910190a150565b604051806043614d4182396043019050604051809103902081565b600080610eeb836117b9565b905063059fa6008101815b818111610f3c57610f3084610f1283868a63ffffffff16612f77565b6040518060800160405280605581526020016149b060559139612fdd565b93506212750001610ef6565b50505092915050565b610f5433858585856000612d5b565b50505050565b60046020908152600092835260408084209091529082529020546001600160a01b031681565b600080610f8c836117b9565b905063059fa6008101815b818111610fee576000610fac8883868a611a49565b90506001600160601b03811615610fe357610fe085826040518060800160405280604c8152602001614e7d604c9139612fdd565b94505b506212750001610f97565b5050509392505050565b611000611acb565b8061101a5750336000908152600f602052604090205460ff165b61105a576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038083166000818152600e6020526040808220805460ff191660011790558051633c7925e360e11b815293851660048501525191926378f24bc6926024808301939282900301818387803b1580156110b857600080fd5b505af11580156110cc573d6000803e3d6000fd5b5050506001600160a01b038084166000818152600e6020908152604091829020805460ff1916905581519283529285169282019290925281517f2366e0b6b1af17c0ceed50685c570d519cae11e7faaf007bbe667e94a5ee3cd593509081900390910190a15050565b600f6020526000908152604090205460ff1681565b611152611acb565b611192576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166111ed576040805162461bcd60e51b815260206004820181905260248201527f76657374696e67207265676973747279206164647265737320696e76616c6964604482015290519081900360640190fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b600061121c8642016117b9565b905063059fa6008511156112325763059fa60094505b600061123f8642016117b9565b90506000858383038161124e57fe5b0460010190506000818a8161125f57fe5b0490506001821061128057611280336001840383028c038689896001612d5b565b8387015b8381116112a15761129a3383838a8a6001612d5b565b8701611284565b5050505050505050505050565b6012546001600160a01b031681565b60055461010090046001600160a01b03166113095760405162461bcd60e51b81526004018080602001828103825260248152602001806148866024913960400191505060405180910390fd5b565b611313611acb565b611353576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6005805460ff19166001179055600354604080516370a0823160e01b815230600482015290517fd8cc4e8d808fe950b07bfffcd83eebf1190cd35ea77fe0c8a7d75a6e9b90e5c1926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156113ca57600080fd5b505afa1580156113de573d6000803e3d6000fd5b505050506040513d60208110156113f457600080fd5b505160408051918252519081900360200190a1565b611411611acb565b611451576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166114965760405162461bcd60e51b815260040180806020018281038252602181526020018061500d6021913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818310156114f95760405162461bcd60e51b815260040180806020018281038252604c815260200180614cc1604c913960600191505060405180910390fd5b81830363059fa60081111561153f5760405162461bcd60e51b815260040180806020018281038252604d815260200180614d84604d913960600191505060405180910390fd5b6000620151808263059fa600036001600160601b03168161155c57fe5b049050611628600a621232106001600160601b03166115dc600a6009026115be621232108788026040518060400160405280601f81526020017f756e646572666c6f77206f6e207765696768742063616c63756c6174696f6e0081525061307b565b6040518060600160405280602d8152602001614b4b602d91396130e8565b6001600160601b0316816115ec57fe5b046040518060400160405280601e81526020017f6f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e0000815250612fdd565b95945050505050565b600a60209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b600860209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b6116af611acb565b6116ef576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19166001179055815192835290517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399281900390910190a150565b6001546000905b63059fa600420181116117b3576117a78261176c8584613174565b6040518060400160405280601c81526020017f5374616b696e673a3a62616c616e63654f663a206f766572666c6f7700000000815250612fdd565b91506212750001611751565b50919050565b60006001548210156117fc5760405162461bcd60e51b815260040180806020018281038252604d815260200180614ad1604d913960600191505060405180910390fd5b60006212750060015484038161180e57fe5b04905060015462127500820201915050919050565b606080600061183763059fa60042016117b9565b60015490915060009062127500015b8281116118795760006118598783613174565b6001600160601b0316111561186f576001909101905b6212750001611846565b50806040519080825280602002602001820160405280156118a4578160200160208202803883390190505b509350806040519080825280602002602001820160405280156118d1578160200160208202803883390190505b5060015490935060009062127500015b8381116119555760006118f48883613174565b90506001600160601b0381161561194a578187848151811061191257fe5b6020026020010181815250508086848151811061192b57fe5b6001600160601b03909216602092830291909101909101526001909201915b5062127500016118e1565b50505050915091565b600c6020526000908152604090205481565b336000908152600e602052604090205460ff166119c3576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6119d083838360016131d5565b6119dd8383836001613521565b505050565b6000806119ee836117b9565b905063059fa6008101815b818111610fee57611a2e84611a108984878b613583565b6040518060800160405280604a8152602001614c77604a9139612fdd565b935062127500016119f9565b6000546001600160a01b031690565b600080611a578686856135eb565b90506001600160601b03811615611abd576000611a7486866114b8565b9050600a6001600160601b0316611aa483836040518060600160405280603d8152602001614b78603d91396130e8565b6001600160601b031681611ab457fe5b04925050611ac2565b600091505b50949350505050565b600080546001600160a01b0316611ae061385f565b6001600160a01b031614905090565b611af7613863565b6001600160a01b0316336001600160a01b031614611b4b576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b336001600160a01b03841614611b97576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b60006060611ba3613872565b90506000611be685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138ca92505050565b905060005b8251811015611c3457828181518110611c0057fe5b60200260200101516001600160e01b031916826001600160e01b0319161415611c2c5760019350611c34565b600101611beb565b5082611c7f576040805162461bcd60e51b81526020600482015260156024820152741b595d1a1bd9081a5cc81b9bdd08185b1b1bddd959605a1b604482015290519081900360640190fd5b60405160006020820181815290918291829189918991603c018383808284378083019250505093505050506040516020818303038152906040528060200190516060811015611ccd57600080fd5b50602081015160409091015190925090506001600160a01b03808316908b1614611d30576040805162461bcd60e51b815260206004820152600f60248201526e0e6cadcc8cae440dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b888114611d76576040805162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b611db587878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138d192505050565b50505050505050505050565b60076020526000908152604090205463ffffffff1681565b600960209081526000928352604080842090915290825290205463ffffffff1681565b600080611e098484613a3a565b6000611e158585613ae5565b94859003959350505050565b60055460ff1681565b611e32611acb565b611e72576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038116611eb75760405162461bcd60e51b8152600401808060200182810382526029815260200180614f276029913960400191505060405180910390fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b611ee7611acb565b611f27576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038116611f82576040805162461bcd60e51b815260206004820152601c60248201527f626c6f636b206d6f636b7570206164647265737320696e76616c696400000000604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b600e6020526000908152604090205460ff1681565b60055461010090046001600160a01b031681565b63059fa60081565b6000611ff48260014303426119e2565b92915050565b612002611acb565b612042576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160601b038116600111801590612066575060096001600160601b03821611155b6120a15760405162461bcd60e51b815260040180806020018281038252602d815260200180614b1e602d913960400191505060405180910390fd5b600d80546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b600d54600160a01b90046001600160601b031681565b6000806120ed8585856135eb565b90506001600160601b0381161580156121095750612109613b30565b15612112575060015b90505b9392505050565b600a81565b60008181526007602052604081205463ffffffff1680612142576000612115565b6000838152600660209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03169392505050565b61218a83838360006131d5565b6119dd8383836000613521565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b600660209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b60006040518080614d416043913960430190506040518091039020600260405180828054600181600116156101000203166002900480156122675780601f10612245576101008083540402835291820191612267565b820191906000526020600020905b815481529060010190602001808311612253575b5050915050604051809103902061227c613bac565b3060405160200180858152602001848152602001838152602001826001600160a01b03166001600160a01b0316815260200194505050505060405160208183030381529060405280519060200120905060006040518080614f50604b91396040805191829003604b0182206020808401919091526001600160a01b038d1683830152606083018c9052608083018b905260a08084018b90528251808503909101815260c08401835280519082012061190160f01b60e085015260e28401879052610102808501829052835180860390910181526101228501808552815191840191909120600091829052610142860180865281905260ff8c1661016287015261018286018b90526101a286018a9052935191965092945091926001926101c28083019392601f198301929081900390910190855afa1580156123c2573d6000803e3d6000fd5b5050506020604051035190506123d781613bb0565b6124125760405162461bcd60e51b8152600401808060200182810382526029815260200180614aa86029913960400191505060405180910390fd5b6001600160a01b0381166000908152600c6020526040902080546001810190915589146124705760405162461bcd60e51b81526004018080602001828103825260258152602001806151206025913960400191505060405180910390fd5b874211156124af5760405162461bcd60e51b815260040180806020018281038252602981526020018061485d6029913960400191505060405180910390fd5b6124ba818c8c612b7c565b6112a1818c8c612c2e565b60405180604b614f508239604b019050604051809103902081565b60006124ea613be9565b82106125275760405162461bcd60e51b81526004018080602001828103825260448152602001806150dc6044913960600191505060405180910390fd5b6001600160a01b038416600090815260096020908152604080832086845290915290205463ffffffff1680612560576000915050612115565b6001600160a01b0385166000908152600860209081526040808320878452825280832063ffffffff6000198601811685529252909120541683106125ec576001600160a01b038516600090815260086020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050612115565b6001600160a01b0385166000908152600860209081526040808320878452825280832083805290915290205463ffffffff1683101561262f576000915050612115565b600060001982015b8163ffffffff168163ffffffff1611156126fa57600282820363ffffffff16048103612661614845565b506001600160a01b03881660009081526008602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156126d5576020015194506121159350505050565b805163ffffffff168711156126ec578193506126f3565b6001820392505b5050612637565b506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b612751816117b9565b9050808211156127925760405162461bcd60e51b81526004018080602001828103825260428152602001806148aa6042913960600191505060405180910390fd5b60006127a363059fa60042016117b9565b9050808211156127b1578091505b60006127c13385600143036135eb565b90506000816001600160601b03161161280b5760405162461bcd60e51b815260040180806020018281038252604b815260200180614bf8604b913960600191505060405180910390fd5b612816338583613c2e565b612821338483613cbf565b61282b8482613d42565b6128358382613dba565b336000908152600460209081526040808320878452909152808220548583529120546001600160a01b0391821691168061289f5750336000908152600460209081526040808320878452909152902080546001600160a01b0319166001600160a01b038316179055805b336000908152600460209081526040808320898452909152902080546001600160a01b03191690556128d2828785613e25565b6128dd818685613ec2565b60408051878152602081018790526001600160601b03851681830152905133917f809d79c94c86576d61afef75495b8df415224bf885310fed7ea315039f8c5b4c919081900360600190a2505050505050565b600061293a613be9565b82106129775760405162461bcd60e51b815260040180806020018281038252603f81526020018061502e603f913960400191505060405180910390fd5b60008381526007602052604090205463ffffffff168061299b576000915050611ff4565b600084815260066020908152604080832063ffffffff600019860181168552925290912054168310612a035760008481526006602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050611ff4565b600084815260066020908152604080832083805290915290205463ffffffff16831015612a34576000915050611ff4565b600060001982015b8163ffffffff168163ffffffff161115612aed57600282820363ffffffff16048103612a66614845565b50600087815260066020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415612ac857602001519450611ff49350505050565b805163ffffffff16871115612adf57819350612ae6565b6001820392505b5050612a3c565b50600085815260066020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b612b30611acb565b612b70576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b612b7981613f45565b50565b6001600160a01b03808416600090815260046020908152604080832085845290915281205490911690612baf8584613174565b6001600160a01b03868116600081815260046020908152604080832089845282529182902080546001600160a01b0319168a86169081179091558251898152925195965094938716937fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca99281900390910190a4610e0982858386613fe5565b612c36613b30565b156119dd576000612c50826212750063ffffffff61404916565b6001600160a01b0380861660009081526004602090815260408083208584529091529020549192509081169084168114612c8f57612c8f858584612b7c565b6000336001600160a01b031663c24a0f8b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050506040513d6020811015612cf657600080fd5b50519050612d0d846224ea0063ffffffff61404916565b925080831415612d53576001600160a01b0380871660009081526004602090815260408083208784529091529020548116925085168214612d5357612d53868685612b7c565b505050505050565b6000856001600160601b031611612da35760405162461bcd60e51b8152600401808060200182810382526043815260200180614bb56043913960600191505060405180910390fd5b80612db457612db1846117b9565b93505b428411612df25760405162461bcd60e51b8152600401808060200182810382526036815260200180614ec96036913960400191505060405180910390fd5b6001600160a01b038316612e04578592505b6001600160a01b038216612e16578291505b80612e3c576000612e2c63059fa60042016117b9565b905080851115612e3a578094505b505b6000612e488486613174565b9050612e56878786886140a3565b6001600160a01b03808516600090815260046020908152604080832089845290915290205481169084168114612f0d576001600160a01b0385811660009081526004602090815260408083208a8452909152902080546001600160a01b031916918616919091179055612eca818784613e25565b612f0a82886040518060400160405280602081526020017f5374616b696e673a3a7374616b653a2062616c616e6365206f766572666c6f77815250612fdd565b96505b612f18848789613ec2565b836001600160a01b0316816001600160a01b0316866001600160a01b03167fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca9896040518082815260200191505060405180910390a45050505050505050565b600080612f8485856114b8565b90506000612f928685612930565b9050600a6001600160601b0316612fc282846040518060600160405280603b8152602001614e42603b91396130e8565b6001600160601b031681612fd257fe5b049695505050505050565b6000838301826001600160601b038087169083161015611ac25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613040578181015183820152602001613028565b50505050905090810190601f16801561306d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000836001600160601b0316836001600160601b0316111582906130e05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b505050900390565b60006001600160601b03841661310057506000612115565b8383026001600160601b03808516908087169083168161311c57fe5b046001600160601b0316148390611ac25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b6001600160a01b0382166000818152600a602090815260408083208584528252808320938352600b825280832085845282528083205460001963ffffffff9182160116835292905220546001600160601b03600160201b9091041692915050565b836001600160601b031660011480156131f157506131f1613b30565b156131fb57610f54565b613204836141e8565b92506132108484613a3a565b6001600160a01b038216613222573391505b61322c8385613d42565b613237338486613c2e565b336000908152600460209081526040808320868452909152902054613266906001600160a01b03168486613e25565b8242108015613278575060055460ff16155b8015613282575080155b156133f85760006132938585613ae5565b948590039490506001600160601b038116156133f657600d546001600160a01b03166132f05760405162461bcd60e51b8152600401808060200182810382526030815260200180614a786030913960400191505060405180910390fd5b600354600d546040805163095ea7b360e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561335157600080fd5b505af1158015613365573d6000803e3d6000fd5b505050506040513d602081101561337b57600080fd5b5050600d546003546040805163abe979e160e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163abe979e191604480830192600092919082900301818387803b1580156133dd57600080fd5b505af11580156133f1573d6000803e3d6000fd5b505050505b505b6003546040805163a9059cbb60e01b81526001600160a01b0385811660048301526001600160601b03881660248301529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561345957600080fd5b505af115801561346d573d6000803e3d6000fd5b505050506040513d602081101561348357600080fd5b50519050806134c35760405162461bcd60e51b8152600401808060200182810382526028815260200180614a056028913960400191505060405180910390fd5b604080516001600160601b0387168152602081018690528315158183015290516001600160a01b0385169133917f667b6c8ed8622dae7927a8b0837455098e32037a0181f9a2e21b9b72fead6cc79181900360600190a35050505050565b613529613b30565b15610f54576000613543846212750063ffffffff61404916565b905081806135515750804210155b15610e095760006135663383600143036135eb565b90506001600160601b03811615612d5357612d53818386866131d5565b60008061359085856114b8565b9050600061359f8787866124e0565b9050600a6001600160601b03166135cf82846040518060800160405280604781526020016148ec604791396130e8565b6001600160601b0316816135df57fe5b04979650505050505050565b60006135f5613be9565b82106136325760405162461bcd60e51b815260040180806020018281038252603d815260200180614f9b603d913960400191505060405180910390fd5b61363b836141e8565b6001600160a01b0385166000908152600b6020908152604080832084845290915290205490935063ffffffff1680613677576000915050612115565b6001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff600019860181168552925290912054168310613703576001600160a01b0385166000908152600a6020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050612115565b6001600160a01b0385166000908152600a60209081526040808320878452825280832083805290915290205463ffffffff16831015613746576000915050612115565b600060001982015b8163ffffffff168163ffffffff16111561381157600282820363ffffffff16048103613778614845565b506001600160a01b0388166000908152600a602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156137ec576020015194506121159350505050565b805163ffffffff168711156138035781935061380a565b6001820392505b505061374e565b506001600160a01b0386166000908152600a60209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b3390565b6003546001600160a01b031690565b60408051600180825281830190925260609182919060208083019080388339019050509050630c09ddfd60e01b816000815181106138ac57fe5b6001600160e01b031990921660209283029190910190910152905090565b6020015190565b60006060306001600160a01b0316836040518082805190602001908083835b6020831061390f5780518252601f1990920191602091820191016138f0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613971576040519150601f19603f3d011682016040523d82523d6000602084013e613976565b606091505b5091509150816119dd5760448151116139c05760405162461bcd60e51b81526004018080602001828103825260308152602001806149806030913960400191505060405180910390fd5b6139f36040518060400160405280601181526020017003932b1b2b4bb32a0b8383937bb30b61d1607d1b8152508261420d565b60405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b6000826001600160601b031611613a825760405162461bcd60e51b815260040180806020018281038252604d815260200180614933604d913960600191505060405180910390fd5b6000613a923383600143036135eb565b9050806001600160601b0316836001600160601b031611156119dd5760405162461bcd60e51b8152600401808060200182810382526025815260200180614a536025913960400191505060405180910390fd5b600080613af1426117b9565b90506000613aff84836114b8565b600d54600160a01b90046001600160601b03908116919091029150606490600a878402821604160495945050505050565b6011546040805163dbb049d160e01b815233600482015290516000926001600160a01b03169163dbb049d1916024808301926020929190829003018186803b158015613b7b57600080fd5b505afa158015613b8f573d6000803e3d6000fd5b505050506040513d6020811015613ba557600080fd5b5051905090565b4690565b600073dcc703c0e500b653ca82273b7bfad8045d85a4706001600160a01b03831614801590611ff45750506001600160a01b0316151590565b601254604080516307f6c6f160e41b815290516000926001600160a01b031691637f6c6f10916004808301926020929190829003018186803b158015613b7b57600080fd5b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526034808352600160201b9091046001600160601b03169392613cb19285928892614c439083013961307b565b9050612d5386868584614307565b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526033808352600160201b9091046001600160601b03169392613cb19285928892614e0f90830139612fdd565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260358084529194600160201b9091046001600160601b0316939092613dad92859288929190614fd89083013961307b565b9050610e09858483614487565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260348084529194600160201b9091046001600160601b0316939092613dad92859288929190614d0d90830139612fdd565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff94851660001981019095168452909152812054600160201b90046001600160601b0390811691908416821115613eb657613eb382856040518060600160405280603881526020016150a46038913961307b565b90505b612d53868685846145c5565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526037808352600160201b9091046001600160601b03169392613eb3928592889261506d90830139612fdd565b6001600160a01b038116613f8a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614a2d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0316846001600160a01b03161415801561401057506000826001600160601b0316115b15610f54576001600160a01b0384161561402f5761402f848284613e25565b6001600160a01b03831615610f5457610f54838284613ec2565b600082820183811015612115576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600354604080516323b872dd60e01b81526001600160a01b0387811660048301523060248301526001600160601b0387166044830152915160009392909216916323b872dd9160648082019260209290919082900301818787803b15801561410a57600080fd5b505af115801561411e573d6000803e3d6000fd5b505050506040513d602081101561413457600080fd5b505190508061414257600080fd5b600061414e8484613174565b90506141738186604051806060016040528060288152602001614eff60289139612fdd565b905061417f8386613dba565b61418a848487613cbf565b604080516001600160601b0380881682526020820186905283168183015290516001600160a01b038616917f0fc5b1bac0416800b42a669229a346b6e5a15db3896339dbdc5fa376e1e4570a919081900360600190a2505050505050565b6000806141f4836117b9565b90508281146142065762127500810192505b5090919050565b6060808390506060839050606060448251845101036040519080825280601f01601f19166020018201604052801561424c576020820181803883390190505b509050806000805b85518110156142a55785818151811061426957fe5b602001015160f81c60f81b83838060010194508151811061428657fe5b60200101906001600160f81b031916908160001a905350600101614254565b5060445b84518110156142fa578481815181106142be57fe5b602001015160f81c60f81b8383806001019450815181106142db57fe5b60200101906001600160f81b031916908160001a9053506001016142a9565b5090979650505050505050565b600061432b436040518060600160405280603e8152602001614dd1603e91396147e8565b905060008363ffffffff1611801561437c57506001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198801811685529252909120548282169116145b156143de576001600160a01b0385166000908152600a602090815260408083208784528252808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055610e09565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526001600160a01b03989098166000818152600a8a528481208982528a5284812088871682528a52848120935184549351909716600160201b02640100000000600160801b031997871663ffffffff19948516179790971696909617909255908452600b875281842095845294909552939020805460019092019093169116179055565b60006144ab436040518060600160405280603e8152602001614dd1603e91396147e8565b905060008363ffffffff161180156144ea5750600084815260066020908152604080832063ffffffff6000198801811685529252909120548282169116145b1561453a576000848152600660209081526040808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055610f54565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526000888152600682528481208887168252825284812093518454935163ffffffff1994851691881691909117640100000000600160801b031916600160201b919098160296909617909255958452600790529091208054909316600190920116179055565b60006145e9436040518060600160405280603e8152602001614dd1603e91396147e8565b6001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff9081168552925290912054919250600160201b9091046001600160601b03169084161580159061467f57506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff6000198901811685529252909120548382169116145b156146e1576001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b0386160217905561478b565b60408051808201825263ffffffff80851682526001600160601b0380871660208085019182526001600160a01b038c166000818152600883528781208d825283528781208c871682528352878120965187549451909516600160201b02640100000000600160801b031995871663ffffffff19958616179590951694909417909555938252600984528482208a835290935292909220805460018801909316929091169190911790555b604080518681526001600160601b03808416602083015285168183015290516001600160a01b038816917fc7b38fb25352e6f351f57e2c922f84db5c97e09a6246bbe1d2eedfcdb01c4c62919081900360600190a2505050505050565b600081600160201b841061483d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b509192915050565b60408051808201909152600080825260208201529056fe5374616b696e673a3a64656c656761746542795369673a207369676e617475726520657870697265647468657265206973206e6f206e6577207374616b696e6720636f6e7472616374207365745374616b696e673a3a657874656e645374616b696e674475726174696f6e3a2063616e6e6f742072656475636520746865207374616b696e67206475726174696f6e57656967687465645374616b696e673a3a5f746f74616c506f776572427944617465466f7244656c6567617465653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a77697468647261773a20616d6f756e74206f6620746f6b656e7320746f2062652077697468647261776e206e6565647320746f20626520626967676572207468616e203072656365697665417070726f76616c3a205472616e73616374696f6e20657865637574696f6e2072657665727465642e57656967687465645374616b696e673a3a6765745072696f72546f74616c566f74696e67506f7765723a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e5374616b696e673a3a77697468647261773a20546f6b656e207472616e73666572206661696c65644f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e673a3a77697468647261773a206e6f7420656e6f7567682062616c616e63655374616b696e673a3a77697468647261773a2046656553686172696e672061646472657373207761736e2774207365745374616b696e673a3a64656c656761746542795369673a20696e76616c6964207369676e617475726557656967687465645374616b696e673a3a74696d657374616d70546f4c6f636b446174653a2074696d657374616d70206c696573206265666f726520636f6e7472616374206372656174696f6e776569676874207363616c696e6720646f65736e27742062656c6f6e6720746f2072616e6765205b312c20395d6d756c7469706c69636174696f6e206f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e57656967687465645374616b696e673a3a77656967687465645374616b654279446174653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a7374616b653a20616d6f756e74206f6620746f6b656e7320746f207374616b65206e6565647320746f20626520626967676572207468616e20305374616b696e673a3a657874656e645374616b696e674475726174696f6e3a206e6f7468696e67207374616b656420756e74696c207468652070726576696f7573206c6f636b20646174655374616b696e673a3a5f6465637265617365557365725374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f72566f7465733a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e57656967687465645374616b696e673a3a636f6d707574655765696768744279446174653a2064617465206e6565647320746f20626520626967676572207468616e207374617274446174655374616b696e673a3a5f696e6372656173654461696c795374616b653a207374616b656420616d6f756e74206f766572666c6f77454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374295374616b696e673a3a636f6d707574655765696768744279446174653a72656d61696e696e672074696d652063616e277420626520626967676572207468616e206d6178206475726174696f6e5374616b696e673a3a5f77726974655374616b696e67436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974735374616b696e673a3a5f696e637265617365557365725374616b653a207374616b656420616d6f756e74206f766572666c6f7757656967687465645374616b696e673a3a5f746f74616c506f7765724279446174653a206d756c7469706c69636174696f6e206f766572666c6f7757656967687465645374616b696e673a3a6765745072696f7257656967687465645374616b653a206f766572666c6f77206f6e20746f74616c2077656967687420636f6d7075746174696f6e5374616b696e673a3a74696d657374616d70546f4c6f636b446174653a207374616b696e6720706572696f6420746f6f2073686f72745374616b696e673a3a696e6372656173655374616b653a2062616c616e6365206f766572666c6f7763616e277420726573657420746865206e6577207374616b696e6720636f6e747261637420746f203044656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206c6f636b446174652c75696e74323536206e6f6e63652c75696e74323536206578706972792957656967687465645374616b696e673a3a6765745072696f72557365725374616b65416e64446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f64656372656173654461696c795374616b653a207374616b656420616d6f756e7420756e646572666c6f7746656553686172696e6720616464726573732073686f756c646e2774206265203057656967687465645374616b696e673a3a6765745072696f72546f74616c5374616b6573466f72446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f696e63726561736544656c65676174655374616b653a207374616b656420616d6f756e74206f766572666c6f775374616b696e673a3a5f646563726561736544656c65676174655374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f725374616b65427944617465466f7244656c6567617465653a206e6f74207965742064657465726d696e65645374616b696e673a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365a265627a7a72315820dbc89f0cb5d2d9ede59edac39673220839052dd43873119e856b1c102ff56e6864736f6c63430005110032",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103a35760003560e01c8063836eebee116101e9578063b4b5ea571161010f578063db27ec18116100ad578063e97ffacb1161007c578063e97ffacb14610cd5578063eefb8c4714610d07578063f09cfc6414610d2a578063f2fde38b14610d4d576103a3565b8063db27ec1814610c2b578063dfb267c214610c57578063e63a562e14610c80578063e7a324dc14610ccd576103a3565b8063cf7b684a116100e9578063cf7b684a14610b99578063d27569e714610bcb578063d5c3846414610bd3578063dab6ca4414610bf0576103a3565b8063b4b5ea5714610b45578063b8a9873214610b6b578063bf626ec114610b91576103a3565b806396a590c111610187578063a58848c511610156578063a58848c514610b07578063adae900214610b0f578063ae81dfe414610b35578063b1724b4614610b3d576103a3565b806396a590c114610a615780639929e88614610ab35780639a377b8214610abb578063a377f24414610ae1576103a3565b80638f32d59b116101c35780638f32d59b1461096a5780638f4ffcb1146109725780639436e7d4146109ff57806394c2ce5814610a35576103a3565b8063836eebee146108f85780638da5cb5b1461092a5780638dae1b1614610932576103a3565b8063450b0601116102ce57806368cefccc1161026c57806372ec97951161023b57806372ec9795146107bb5780637ba6f458146107d85780637ecebe0014610897578063800b64ca146108bd576103a3565b806368cefccc146106d75780636b6fde0e14610737578063704802751461076f57806370a0823114610795576103a3565b80635419675f116102a85780635419675f1461067e5780635e0be60714610686578063626ee2d91461068e57806362cf8a08146106b4576103a3565b8063450b06011461060a5780634b2fea1e146106305780635004b6e414610676576103a3565b80631785f53c1161034657806327dd1b001161031557806327dd1b001461055857806337e6b1c1146105845780633827fca5146105b6578063429b62e5146105e4576103a3565b80631785f53c146104be57806320606b70146104e45780632522d7ba146104ec57806325629ec014610515576103a3565b806307392cc01161038257806307392cc0146104145780630c09ddfd14610445578063104932cf1461049257806317748adc1461049a576103a3565b8062073f99146103a8578063026e402b146103c257806303a18fa3146103f0575b600080fd5b6103b0610d73565b60408051918252519081900360200190f35b6103ee600480360360408110156103d857600080fd5b506001600160a01b038135169060200135610d79565b005b6103f8610d93565b604080516001600160a01b039092168252519081900360200190f35b6104316004803603602081101561042a57600080fd5b5035610da2565b604080519115158252519081900360200190f35b6103ee600480360360a081101561045b57600080fd5b506001600160a01b0381358116916001600160601b0360208201351691604082013591606081013582169160809091013516610db7565b6103f8610e10565b6104a2610e1f565b604080516001600160601b039092168252519081900360200190f35b6103ee600480360360208110156104d457600080fd5b50356001600160a01b0316610e24565b6103b0610ec4565b6104a26004803603604081101561050257600080fd5b5063ffffffff8135169060200135610edf565b6103ee6004803603608081101561052b57600080fd5b506001600160601b03813516906020810135906001600160a01b0360408201358116916060013516610f45565b6103f86004803603604081101561056e57600080fd5b506001600160a01b038135169060200135610f5a565b6104a26004803603606081101561059a57600080fd5b506001600160a01b038135169060208101359060400135610f80565b6103ee600480360360408110156105cc57600080fd5b506001600160a01b0381358116916020013516610ff8565b610431600480360360208110156105fa57600080fd5b50356001600160a01b0316611135565b6103ee6004803603602081101561062057600080fd5b50356001600160a01b031661114a565b6103ee600480360360c081101561064657600080fd5b508035906020810135906040810135906060810135906001600160a01b03608082013581169160a001351661120f565b6103f86112ae565b6103ee6112bd565b6103ee61130b565b6103ee600480360360208110156106a457600080fd5b50356001600160a01b0316611409565b6104a2600480360360408110156106ca57600080fd5b50803590602001356114b8565b61070f600480360360608110156106ed57600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff16611631565b6040805163ffffffff90931683526001600160601b0390911660208301528051918290030190f35b61070f6004803603606081101561074d57600080fd5b5080356001600160a01b0316906020810135906040013563ffffffff1661166c565b6103ee6004803603602081101561078557600080fd5b50356001600160a01b03166116a7565b6104a2600480360360208110156107ab57600080fd5b50356001600160a01b031661174a565b6103b0600480360360208110156107d157600080fd5b50356117b9565b6107fe600480360360208110156107ee57600080fd5b50356001600160a01b0316611823565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561084257818101518382015260200161082a565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610881578181015183820152602001610869565b5050505090500194505050505060405180910390f35b6103b0600480360360208110156108ad57600080fd5b50356001600160a01b031661195e565b6103ee600480360360608110156108d357600080fd5b5080356001600160601b031690602081013590604001356001600160a01b0316611970565b6104a26004803603606081101561090e57600080fd5b506001600160a01b0381351690602081013590604001356119e2565b6103f8611a3a565b6104a26004803603608081101561094857600080fd5b506001600160a01b038135169060208101359060408101359060600135611a49565b610431611acb565b6103ee6004803603608081101561098857600080fd5b6001600160a01b038235811692602081013592604082013590921691810190608081016060820135600160201b8111156109c157600080fd5b8201836020820111156109d357600080fd5b803590602001918460018302840111600160201b831117156109f457600080fd5b509092509050611aef565b610a1c60048036036020811015610a1557600080fd5b5035611dc1565b6040805163ffffffff9092168252519081900360200190f35b610a1c60048036036040811015610a4b57600080fd5b506001600160a01b038135169060200135611dd9565b610a8d60048036036040811015610a7757600080fd5b506001600160601b038135169060200135611dfc565b604080516001600160601b03938416815291909216602082015281519081900390910190f35b610431611e21565b6103ee60048036036020811015610ad157600080fd5b50356001600160a01b0316611e2a565b6103ee60048036036020811015610af757600080fd5b50356001600160a01b0316611edf565b6103f8611fa4565b61043160048036036020811015610b2557600080fd5b50356001600160a01b0316611fb3565b6103f8611fc8565b6103b0611fdc565b6104a260048036036020811015610b5b57600080fd5b50356001600160a01b0316611fe4565b6103ee60048036036020811015610b8157600080fd5b50356001600160601b0316611ffa565b6104a26120c9565b6104a260048036036060811015610baf57600080fd5b506001600160a01b0381351690602081013590604001356120df565b6104a261211c565b6104a260048036036020811015610be957600080fd5b5035612121565b6103ee60048036036060811015610c0657600080fd5b5080356001600160601b031690602081013590604001356001600160a01b031661217d565b610a1c60048036036040811015610c4157600080fd5b506001600160a01b038135169060200135612197565b61070f60048036036040811015610c6d57600080fd5b508035906020013563ffffffff166121ba565b6103ee600480360360e0811015610c9657600080fd5b506001600160a01b038135169060208101359060408101359060608101359060ff6080820135169060a08101359060c001356121ef565b6103b06124c5565b6104a260048036036060811015610ceb57600080fd5b506001600160a01b0381351690602081013590604001356124e0565b6103ee60048036036040811015610d1d57600080fd5b5080359060200135612748565b6104a260048036036040811015610d4057600080fd5b5080359060200135612930565b6103ee60048036036020811015610d6357600080fd5b50356001600160a01b0316612b28565b60015481565b610d84338383612b7c565b610d8f338383612c2e565b5050565b600d546001600160a01b031681565b60106020526000908152604090205460ff1681565b333014610dfa576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b610e0985858585856000612d5b565b5050505050565b6011546001600160a01b031681565b600981565b610e2c611acb565b610e6c576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19169055815192835290517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9281900390910190a150565b604051806043614d4182396043019050604051809103902081565b600080610eeb836117b9565b905063059fa6008101815b818111610f3c57610f3084610f1283868a63ffffffff16612f77565b6040518060800160405280605581526020016149b060559139612fdd565b93506212750001610ef6565b50505092915050565b610f5433858585856000612d5b565b50505050565b60046020908152600092835260408084209091529082529020546001600160a01b031681565b600080610f8c836117b9565b905063059fa6008101815b818111610fee576000610fac8883868a611a49565b90506001600160601b03811615610fe357610fe085826040518060800160405280604c8152602001614e7d604c9139612fdd565b94505b506212750001610f97565b5050509392505050565b611000611acb565b8061101a5750336000908152600f602052604090205460ff165b61105a576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038083166000818152600e6020526040808220805460ff191660011790558051633c7925e360e11b815293851660048501525191926378f24bc6926024808301939282900301818387803b1580156110b857600080fd5b505af11580156110cc573d6000803e3d6000fd5b5050506001600160a01b038084166000818152600e6020908152604091829020805460ff1916905581519283529285169282019290925281517f2366e0b6b1af17c0ceed50685c570d519cae11e7faaf007bbe667e94a5ee3cd593509081900390910190a15050565b600f6020526000908152604090205460ff1681565b611152611acb565b611192576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166111ed576040805162461bcd60e51b815260206004820181905260248201527f76657374696e67207265676973747279206164647265737320696e76616c6964604482015290519081900360640190fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b600061121c8642016117b9565b905063059fa6008511156112325763059fa60094505b600061123f8642016117b9565b90506000858383038161124e57fe5b0460010190506000818a8161125f57fe5b0490506001821061128057611280336001840383028c038689896001612d5b565b8387015b8381116112a15761129a3383838a8a6001612d5b565b8701611284565b5050505050505050505050565b6012546001600160a01b031681565b60055461010090046001600160a01b03166113095760405162461bcd60e51b81526004018080602001828103825260248152602001806148866024913960400191505060405180910390fd5b565b611313611acb565b611353576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6005805460ff19166001179055600354604080516370a0823160e01b815230600482015290517fd8cc4e8d808fe950b07bfffcd83eebf1190cd35ea77fe0c8a7d75a6e9b90e5c1926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156113ca57600080fd5b505afa1580156113de573d6000803e3d6000fd5b505050506040513d60208110156113f457600080fd5b505160408051918252519081900360200190a1565b611411611acb565b611451576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166114965760405162461bcd60e51b815260040180806020018281038252602181526020018061500d6021913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818310156114f95760405162461bcd60e51b815260040180806020018281038252604c815260200180614cc1604c913960600191505060405180910390fd5b81830363059fa60081111561153f5760405162461bcd60e51b815260040180806020018281038252604d815260200180614d84604d913960600191505060405180910390fd5b6000620151808263059fa600036001600160601b03168161155c57fe5b049050611628600a621232106001600160601b03166115dc600a6009026115be621232108788026040518060400160405280601f81526020017f756e646572666c6f77206f6e207765696768742063616c63756c6174696f6e0081525061307b565b6040518060600160405280602d8152602001614b4b602d91396130e8565b6001600160601b0316816115ec57fe5b046040518060400160405280601e81526020017f6f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e0000815250612fdd565b95945050505050565b600a60209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b600860209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b6116af611acb565b6116ef576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b0381166000818152600f6020908152604091829020805460ff19166001179055815192835290517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399281900390910190a150565b6001546000905b63059fa600420181116117b3576117a78261176c8584613174565b6040518060400160405280601c81526020017f5374616b696e673a3a62616c616e63654f663a206f766572666c6f7700000000815250612fdd565b91506212750001611751565b50919050565b60006001548210156117fc5760405162461bcd60e51b815260040180806020018281038252604d815260200180614ad1604d913960600191505060405180910390fd5b60006212750060015484038161180e57fe5b04905060015462127500820201915050919050565b606080600061183763059fa60042016117b9565b60015490915060009062127500015b8281116118795760006118598783613174565b6001600160601b0316111561186f576001909101905b6212750001611846565b50806040519080825280602002602001820160405280156118a4578160200160208202803883390190505b509350806040519080825280602002602001820160405280156118d1578160200160208202803883390190505b5060015490935060009062127500015b8381116119555760006118f48883613174565b90506001600160601b0381161561194a578187848151811061191257fe5b6020026020010181815250508086848151811061192b57fe5b6001600160601b03909216602092830291909101909101526001909201915b5062127500016118e1565b50505050915091565b600c6020526000908152604090205481565b336000908152600e602052604090205460ff166119c3576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6119d083838360016131d5565b6119dd8383836001613521565b505050565b6000806119ee836117b9565b905063059fa6008101815b818111610fee57611a2e84611a108984878b613583565b6040518060800160405280604a8152602001614c77604a9139612fdd565b935062127500016119f9565b6000546001600160a01b031690565b600080611a578686856135eb565b90506001600160601b03811615611abd576000611a7486866114b8565b9050600a6001600160601b0316611aa483836040518060600160405280603d8152602001614b78603d91396130e8565b6001600160601b031681611ab457fe5b04925050611ac2565b600091505b50949350505050565b600080546001600160a01b0316611ae061385f565b6001600160a01b031614905090565b611af7613863565b6001600160a01b0316336001600160a01b031614611b4b576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b336001600160a01b03841614611b97576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b60006060611ba3613872565b90506000611be685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138ca92505050565b905060005b8251811015611c3457828181518110611c0057fe5b60200260200101516001600160e01b031916826001600160e01b0319161415611c2c5760019350611c34565b600101611beb565b5082611c7f576040805162461bcd60e51b81526020600482015260156024820152741b595d1a1bd9081a5cc81b9bdd08185b1b1bddd959605a1b604482015290519081900360640190fd5b60405160006020820181815290918291829189918991603c018383808284378083019250505093505050506040516020818303038152906040528060200190516060811015611ccd57600080fd5b50602081015160409091015190925090506001600160a01b03808316908b1614611d30576040805162461bcd60e51b815260206004820152600f60248201526e0e6cadcc8cae440dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b888114611d76576040805162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840dad2e6dac2e8c6d608b1b604482015290519081900360640190fd5b611db587878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138d192505050565b50505050505050505050565b60076020526000908152604090205463ffffffff1681565b600960209081526000928352604080842090915290825290205463ffffffff1681565b600080611e098484613a3a565b6000611e158585613ae5565b94859003959350505050565b60055460ff1681565b611e32611acb565b611e72576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038116611eb75760405162461bcd60e51b8152600401808060200182810382526029815260200180614f276029913960400191505060405180910390fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b611ee7611acb565b611f27576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b038116611f82576040805162461bcd60e51b815260206004820152601c60248201527f626c6f636b206d6f636b7570206164647265737320696e76616c696400000000604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b600e6020526000908152604090205460ff1681565b60055461010090046001600160a01b031681565b63059fa60081565b6000611ff48260014303426119e2565b92915050565b612002611acb565b612042576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160601b038116600111801590612066575060096001600160601b03821611155b6120a15760405162461bcd60e51b815260040180806020018281038252602d815260200180614b1e602d913960400191505060405180910390fd5b600d80546001600160601b03909216600160a01b026001600160a01b03909216919091179055565b600d54600160a01b90046001600160601b031681565b6000806120ed8585856135eb565b90506001600160601b0381161580156121095750612109613b30565b15612112575060015b90505b9392505050565b600a81565b60008181526007602052604081205463ffffffff1680612142576000612115565b6000838152600660209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03169392505050565b61218a83838360006131d5565b6119dd8383836000613521565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b600660209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b60006040518080614d416043913960430190506040518091039020600260405180828054600181600116156101000203166002900480156122675780601f10612245576101008083540402835291820191612267565b820191906000526020600020905b815481529060010190602001808311612253575b5050915050604051809103902061227c613bac565b3060405160200180858152602001848152602001838152602001826001600160a01b03166001600160a01b0316815260200194505050505060405160208183030381529060405280519060200120905060006040518080614f50604b91396040805191829003604b0182206020808401919091526001600160a01b038d1683830152606083018c9052608083018b905260a08084018b90528251808503909101815260c08401835280519082012061190160f01b60e085015260e28401879052610102808501829052835180860390910181526101228501808552815191840191909120600091829052610142860180865281905260ff8c1661016287015261018286018b90526101a286018a9052935191965092945091926001926101c28083019392601f198301929081900390910190855afa1580156123c2573d6000803e3d6000fd5b5050506020604051035190506123d781613bb0565b6124125760405162461bcd60e51b8152600401808060200182810382526029815260200180614aa86029913960400191505060405180910390fd5b6001600160a01b0381166000908152600c6020526040902080546001810190915589146124705760405162461bcd60e51b81526004018080602001828103825260258152602001806151206025913960400191505060405180910390fd5b874211156124af5760405162461bcd60e51b815260040180806020018281038252602981526020018061485d6029913960400191505060405180910390fd5b6124ba818c8c612b7c565b6112a1818c8c612c2e565b60405180604b614f508239604b019050604051809103902081565b60006124ea613be9565b82106125275760405162461bcd60e51b81526004018080602001828103825260448152602001806150dc6044913960600191505060405180910390fd5b6001600160a01b038416600090815260096020908152604080832086845290915290205463ffffffff1680612560576000915050612115565b6001600160a01b0385166000908152600860209081526040808320878452825280832063ffffffff6000198601811685529252909120541683106125ec576001600160a01b038516600090815260086020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050612115565b6001600160a01b0385166000908152600860209081526040808320878452825280832083805290915290205463ffffffff1683101561262f576000915050612115565b600060001982015b8163ffffffff168163ffffffff1611156126fa57600282820363ffffffff16048103612661614845565b506001600160a01b03881660009081526008602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156126d5576020015194506121159350505050565b805163ffffffff168711156126ec578193506126f3565b6001820392505b5050612637565b506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b612751816117b9565b9050808211156127925760405162461bcd60e51b81526004018080602001828103825260428152602001806148aa6042913960600191505060405180910390fd5b60006127a363059fa60042016117b9565b9050808211156127b1578091505b60006127c13385600143036135eb565b90506000816001600160601b03161161280b5760405162461bcd60e51b815260040180806020018281038252604b815260200180614bf8604b913960600191505060405180910390fd5b612816338583613c2e565b612821338483613cbf565b61282b8482613d42565b6128358382613dba565b336000908152600460209081526040808320878452909152808220548583529120546001600160a01b0391821691168061289f5750336000908152600460209081526040808320878452909152902080546001600160a01b0319166001600160a01b038316179055805b336000908152600460209081526040808320898452909152902080546001600160a01b03191690556128d2828785613e25565b6128dd818685613ec2565b60408051878152602081018790526001600160601b03851681830152905133917f809d79c94c86576d61afef75495b8df415224bf885310fed7ea315039f8c5b4c919081900360600190a2505050505050565b600061293a613be9565b82106129775760405162461bcd60e51b815260040180806020018281038252603f81526020018061502e603f913960400191505060405180910390fd5b60008381526007602052604090205463ffffffff168061299b576000915050611ff4565b600084815260066020908152604080832063ffffffff600019860181168552925290912054168310612a035760008481526006602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050611ff4565b600084815260066020908152604080832083805290915290205463ffffffff16831015612a34576000915050611ff4565b600060001982015b8163ffffffff168163ffffffff161115612aed57600282820363ffffffff16048103612a66614845565b50600087815260066020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415612ac857602001519450611ff49350505050565b805163ffffffff16871115612adf57819350612ae6565b6001820392505b5050612a3c565b50600085815260066020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b612b30611acb565b612b70576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b612b7981613f45565b50565b6001600160a01b03808416600090815260046020908152604080832085845290915281205490911690612baf8584613174565b6001600160a01b03868116600081815260046020908152604080832089845282529182902080546001600160a01b0319168a86169081179091558251898152925195965094938716937fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca99281900390910190a4610e0982858386613fe5565b612c36613b30565b156119dd576000612c50826212750063ffffffff61404916565b6001600160a01b0380861660009081526004602090815260408083208584529091529020549192509081169084168114612c8f57612c8f858584612b7c565b6000336001600160a01b031663c24a0f8b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050506040513d6020811015612cf657600080fd5b50519050612d0d846224ea0063ffffffff61404916565b925080831415612d53576001600160a01b0380871660009081526004602090815260408083208784529091529020548116925085168214612d5357612d53868685612b7c565b505050505050565b6000856001600160601b031611612da35760405162461bcd60e51b8152600401808060200182810382526043815260200180614bb56043913960600191505060405180910390fd5b80612db457612db1846117b9565b93505b428411612df25760405162461bcd60e51b8152600401808060200182810382526036815260200180614ec96036913960400191505060405180910390fd5b6001600160a01b038316612e04578592505b6001600160a01b038216612e16578291505b80612e3c576000612e2c63059fa60042016117b9565b905080851115612e3a578094505b505b6000612e488486613174565b9050612e56878786886140a3565b6001600160a01b03808516600090815260046020908152604080832089845290915290205481169084168114612f0d576001600160a01b0385811660009081526004602090815260408083208a8452909152902080546001600160a01b031916918616919091179055612eca818784613e25565b612f0a82886040518060400160405280602081526020017f5374616b696e673a3a7374616b653a2062616c616e6365206f766572666c6f77815250612fdd565b96505b612f18848789613ec2565b836001600160a01b0316816001600160a01b0316866001600160a01b03167fb846dc53d3621f480d692e73f4473156d20f23ff6b2c8237b7130b883226cca9896040518082815260200191505060405180910390a45050505050505050565b600080612f8485856114b8565b90506000612f928685612930565b9050600a6001600160601b0316612fc282846040518060600160405280603b8152602001614e42603b91396130e8565b6001600160601b031681612fd257fe5b049695505050505050565b6000838301826001600160601b038087169083161015611ac25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613040578181015183820152602001613028565b50505050905090810190601f16801561306d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000836001600160601b0316836001600160601b0316111582906130e05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b505050900390565b60006001600160601b03841661310057506000612115565b8383026001600160601b03808516908087169083168161311c57fe5b046001600160601b0316148390611ac25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b6001600160a01b0382166000818152600a602090815260408083208584528252808320938352600b825280832085845282528083205460001963ffffffff9182160116835292905220546001600160601b03600160201b9091041692915050565b836001600160601b031660011480156131f157506131f1613b30565b156131fb57610f54565b613204836141e8565b92506132108484613a3a565b6001600160a01b038216613222573391505b61322c8385613d42565b613237338486613c2e565b336000908152600460209081526040808320868452909152902054613266906001600160a01b03168486613e25565b8242108015613278575060055460ff16155b8015613282575080155b156133f85760006132938585613ae5565b948590039490506001600160601b038116156133f657600d546001600160a01b03166132f05760405162461bcd60e51b8152600401808060200182810382526030815260200180614a786030913960400191505060405180910390fd5b600354600d546040805163095ea7b360e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561335157600080fd5b505af1158015613365573d6000803e3d6000fd5b505050506040513d602081101561337b57600080fd5b5050600d546003546040805163abe979e160e01b81526001600160a01b0392831660048201526001600160601b03851660248201529051919092169163abe979e191604480830192600092919082900301818387803b1580156133dd57600080fd5b505af11580156133f1573d6000803e3d6000fd5b505050505b505b6003546040805163a9059cbb60e01b81526001600160a01b0385811660048301526001600160601b03881660248301529151600093929092169163a9059cbb9160448082019260209290919082900301818787803b15801561345957600080fd5b505af115801561346d573d6000803e3d6000fd5b505050506040513d602081101561348357600080fd5b50519050806134c35760405162461bcd60e51b8152600401808060200182810382526028815260200180614a056028913960400191505060405180910390fd5b604080516001600160601b0387168152602081018690528315158183015290516001600160a01b0385169133917f667b6c8ed8622dae7927a8b0837455098e32037a0181f9a2e21b9b72fead6cc79181900360600190a35050505050565b613529613b30565b15610f54576000613543846212750063ffffffff61404916565b905081806135515750804210155b15610e095760006135663383600143036135eb565b90506001600160601b03811615612d5357612d53818386866131d5565b60008061359085856114b8565b9050600061359f8787866124e0565b9050600a6001600160601b03166135cf82846040518060800160405280604781526020016148ec604791396130e8565b6001600160601b0316816135df57fe5b04979650505050505050565b60006135f5613be9565b82106136325760405162461bcd60e51b815260040180806020018281038252603d815260200180614f9b603d913960400191505060405180910390fd5b61363b836141e8565b6001600160a01b0385166000908152600b6020908152604080832084845290915290205490935063ffffffff1680613677576000915050612115565b6001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff600019860181168552925290912054168310613703576001600160a01b0385166000908152600a6020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050612115565b6001600160a01b0385166000908152600a60209081526040808320878452825280832083805290915290205463ffffffff16831015613746576000915050612115565b600060001982015b8163ffffffff168163ffffffff16111561381157600282820363ffffffff16048103613778614845565b506001600160a01b0388166000908152600a602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156137ec576020015194506121159350505050565b805163ffffffff168711156138035781935061380a565b6001820392505b505061374e565b506001600160a01b0386166000908152600a60209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b3390565b6003546001600160a01b031690565b60408051600180825281830190925260609182919060208083019080388339019050509050630c09ddfd60e01b816000815181106138ac57fe5b6001600160e01b031990921660209283029190910190910152905090565b6020015190565b60006060306001600160a01b0316836040518082805190602001908083835b6020831061390f5780518252601f1990920191602091820191016138f0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613971576040519150601f19603f3d011682016040523d82523d6000602084013e613976565b606091505b5091509150816119dd5760448151116139c05760405162461bcd60e51b81526004018080602001828103825260308152602001806149806030913960400191505060405180910390fd5b6139f36040518060400160405280601181526020017003932b1b2b4bb32a0b8383937bb30b61d1607d1b8152508261420d565b60405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b6000826001600160601b031611613a825760405162461bcd60e51b815260040180806020018281038252604d815260200180614933604d913960600191505060405180910390fd5b6000613a923383600143036135eb565b9050806001600160601b0316836001600160601b031611156119dd5760405162461bcd60e51b8152600401808060200182810382526025815260200180614a536025913960400191505060405180910390fd5b600080613af1426117b9565b90506000613aff84836114b8565b600d54600160a01b90046001600160601b03908116919091029150606490600a878402821604160495945050505050565b6011546040805163dbb049d160e01b815233600482015290516000926001600160a01b03169163dbb049d1916024808301926020929190829003018186803b158015613b7b57600080fd5b505afa158015613b8f573d6000803e3d6000fd5b505050506040513d6020811015613ba557600080fd5b5051905090565b4690565b600073dcc703c0e500b653ca82273b7bfad8045d85a4706001600160a01b03831614801590611ff45750506001600160a01b0316151590565b601254604080516307f6c6f160e41b815290516000926001600160a01b031691637f6c6f10916004808301926020929190829003018186803b158015613b7b57600080fd5b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526034808352600160201b9091046001600160601b03169392613cb19285928892614c439083013961307b565b9050612d5386868584614307565b6001600160a01b0383166000818152600b60209081526040808320868452825280832054938352600a8252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526033808352600160201b9091046001600160601b03169392613cb19285928892614e0f90830139612fdd565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260358084529194600160201b9091046001600160601b0316939092613dad92859288929190614fd89083013961307b565b9050610e09858483614487565b6000828152600760209081526040808320546006835281842063ffffffff9182166000198101909216855283528184205482516060810190935260348084529194600160201b9091046001600160601b0316939092613dad92859288929190614d0d90830139612fdd565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff94851660001981019095168452909152812054600160201b90046001600160601b0390811691908416821115613eb657613eb382856040518060600160405280603881526020016150a46038913961307b565b90505b612d53868685846145c5565b6001600160a01b038316600081815260096020908152604080832086845282528083205493835260088252808320868452825280832063ffffffff948516600019810190951684528252808320548151606081019092526037808352600160201b9091046001600160601b03169392613eb3928592889261506d90830139612fdd565b6001600160a01b038116613f8a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614a2d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0316846001600160a01b03161415801561401057506000826001600160601b0316115b15610f54576001600160a01b0384161561402f5761402f848284613e25565b6001600160a01b03831615610f5457610f54838284613ec2565b600082820183811015612115576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600354604080516323b872dd60e01b81526001600160a01b0387811660048301523060248301526001600160601b0387166044830152915160009392909216916323b872dd9160648082019260209290919082900301818787803b15801561410a57600080fd5b505af115801561411e573d6000803e3d6000fd5b505050506040513d602081101561413457600080fd5b505190508061414257600080fd5b600061414e8484613174565b90506141738186604051806060016040528060288152602001614eff60289139612fdd565b905061417f8386613dba565b61418a848487613cbf565b604080516001600160601b0380881682526020820186905283168183015290516001600160a01b038616917f0fc5b1bac0416800b42a669229a346b6e5a15db3896339dbdc5fa376e1e4570a919081900360600190a2505050505050565b6000806141f4836117b9565b90508281146142065762127500810192505b5090919050565b6060808390506060839050606060448251845101036040519080825280601f01601f19166020018201604052801561424c576020820181803883390190505b509050806000805b85518110156142a55785818151811061426957fe5b602001015160f81c60f81b83838060010194508151811061428657fe5b60200101906001600160f81b031916908160001a905350600101614254565b5060445b84518110156142fa578481815181106142be57fe5b602001015160f81c60f81b8383806001019450815181106142db57fe5b60200101906001600160f81b031916908160001a9053506001016142a9565b5090979650505050505050565b600061432b436040518060600160405280603e8152602001614dd1603e91396147e8565b905060008363ffffffff1611801561437c57506001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198801811685529252909120548282169116145b156143de576001600160a01b0385166000908152600a602090815260408083208784528252808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055610e09565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526001600160a01b03989098166000818152600a8a528481208982528a5284812088871682528a52848120935184549351909716600160201b02640100000000600160801b031997871663ffffffff19948516179790971696909617909255908452600b875281842095845294909552939020805460019092019093169116179055565b60006144ab436040518060600160405280603e8152602001614dd1603e91396147e8565b905060008363ffffffff161180156144ea5750600084815260066020908152604080832063ffffffff6000198801811685529252909120548282169116145b1561453a576000848152600660209081526040808320600019870163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055610f54565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526000888152600682528481208887168252825284812093518454935163ffffffff1994851691881691909117640100000000600160801b031916600160201b919098160296909617909255958452600790529091208054909316600190920116179055565b60006145e9436040518060600160405280603e8152602001614dd1603e91396147e8565b6001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff9081168552925290912054919250600160201b9091046001600160601b03169084161580159061467f57506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff6000198901811685529252909120548382169116145b156146e1576001600160a01b03861660009081526008602090815260408083208884528252808320600019880163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b0386160217905561478b565b60408051808201825263ffffffff80851682526001600160601b0380871660208085019182526001600160a01b038c166000818152600883528781208d825283528781208c871682528352878120965187549451909516600160201b02640100000000600160801b031995871663ffffffff19958616179590951694909417909555938252600984528482208a835290935292909220805460018801909316929091169190911790555b604080518681526001600160601b03808416602083015285168183015290516001600160a01b038816917fc7b38fb25352e6f351f57e2c922f84db5c97e09a6246bbe1d2eedfcdb01c4c62919081900360600190a2505050505050565b600081600160201b841061483d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613040578181015183820152602001613028565b509192915050565b60408051808201909152600080825260208201529056fe5374616b696e673a3a64656c656761746542795369673a207369676e617475726520657870697265647468657265206973206e6f206e6577207374616b696e6720636f6e7472616374207365745374616b696e673a3a657874656e645374616b696e674475726174696f6e3a2063616e6e6f742072656475636520746865207374616b696e67206475726174696f6e57656967687465645374616b696e673a3a5f746f74616c506f776572427944617465466f7244656c6567617465653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a77697468647261773a20616d6f756e74206f6620746f6b656e7320746f2062652077697468647261776e206e6565647320746f20626520626967676572207468616e203072656365697665417070726f76616c3a205472616e73616374696f6e20657865637574696f6e2072657665727465642e57656967687465645374616b696e673a3a6765745072696f72546f74616c566f74696e67506f7765723a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e5374616b696e673a3a77697468647261773a20546f6b656e207472616e73666572206661696c65644f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e673a3a77697468647261773a206e6f7420656e6f7567682062616c616e63655374616b696e673a3a77697468647261773a2046656553686172696e672061646472657373207761736e2774207365745374616b696e673a3a64656c656761746542795369673a20696e76616c6964207369676e617475726557656967687465645374616b696e673a3a74696d657374616d70546f4c6f636b446174653a2074696d657374616d70206c696573206265666f726520636f6e7472616374206372656174696f6e776569676874207363616c696e6720646f65736e27742062656c6f6e6720746f2072616e6765205b312c20395d6d756c7469706c69636174696f6e206f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e57656967687465645374616b696e673a3a77656967687465645374616b654279446174653a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e673a3a7374616b653a20616d6f756e74206f6620746f6b656e7320746f207374616b65206e6565647320746f20626520626967676572207468616e20305374616b696e673a3a657874656e645374616b696e674475726174696f6e3a206e6f7468696e67207374616b656420756e74696c207468652070726576696f7573206c6f636b20646174655374616b696e673a3a5f6465637265617365557365725374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f72566f7465733a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e57656967687465645374616b696e673a3a636f6d707574655765696768744279446174653a2064617465206e6565647320746f20626520626967676572207468616e207374617274446174655374616b696e673a3a5f696e6372656173654461696c795374616b653a207374616b656420616d6f756e74206f766572666c6f77454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374295374616b696e673a3a636f6d707574655765696768744279446174653a72656d61696e696e672074696d652063616e277420626520626967676572207468616e206d6178206475726174696f6e5374616b696e673a3a5f77726974655374616b696e67436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974735374616b696e673a3a5f696e637265617365557365725374616b653a207374616b656420616d6f756e74206f766572666c6f7757656967687465645374616b696e673a3a5f746f74616c506f7765724279446174653a206d756c7469706c69636174696f6e206f766572666c6f7757656967687465645374616b696e673a3a6765745072696f7257656967687465645374616b653a206f766572666c6f77206f6e20746f74616c2077656967687420636f6d7075746174696f6e5374616b696e673a3a74696d657374616d70546f4c6f636b446174653a207374616b696e6720706572696f6420746f6f2073686f72745374616b696e673a3a696e6372656173655374616b653a2062616c616e6365206f766572666c6f7763616e277420726573657420746865206e6577207374616b696e6720636f6e747261637420746f203044656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206c6f636b446174652c75696e74323536206e6f6e63652c75696e74323536206578706972792957656967687465645374616b696e673a3a6765745072696f72557365725374616b65416e64446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f64656372656173654461696c795374616b653a207374616b656420616d6f756e7420756e646572666c6f7746656553686172696e6720616464726573732073686f756c646e2774206265203057656967687465645374616b696e673a3a6765745072696f72546f74616c5374616b6573466f72446174653a206e6f74207965742064657465726d696e65645374616b696e673a3a5f696e63726561736544656c65676174655374616b653a207374616b656420616d6f756e74206f766572666c6f775374616b696e673a3a5f646563726561736544656c65676174655374616b653a207374616b656420616d6f756e7420756e646572666c6f7757656967687465645374616b696e673a3a6765745072696f725374616b65427944617465466f7244656c6567617465653a206e6f74207965742064657465726d696e65645374616b696e673a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365a265627a7a72315820dbc89f0cb5d2d9ede59edac39673220839052dd43873119e856b1c102ff56e6864736f6c63430005110032",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
