{
  "contractName": "CheckpointedToken",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "checkpointId",
          "type": "uint256"
        }
      ],
      "name": "CheckpointCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "holderCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "checkpointId",
          "type": "uint256"
        }
      ],
      "name": "getHoldersAt",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "checkpointId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "start",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "end",
          "type": "uint256"
        }
      ],
      "name": "getHolderSubsetAt",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNumberOfHolders",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "holder",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "balanceOfAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "totalSupplyAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.11+commit.5ef660b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"checkpointId\",\"type\":\"uint256\"}],\"name\":\"CheckpointCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"balanceOfAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"checkpointId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"start\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"end\",\"type\":\"uint256\"}],\"name\":\"getHolderSubsetAt\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"checkpointId\",\"type\":\"uint256\"}],\"name\":\"getHoldersAt\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumberOfHolders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"holderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"totalSupplyAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"balanceOfAt(address,uint256)\":{\"params\":{\"holder\":\"Holder to query balance for\",\"timestamp\":\"Timestamp of the balance checkpoint\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"getHoldersAt(uint256)\":{\"params\":{\"checkpointId\":\"Checkpoint id at which holder list is to be populated\"},\"returns\":{\"_0\":\"list of holders\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(string,string)\":{\"details\":\"\\\"constructor\\\" to be called on deployment\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"totalSupplyAt(uint256)\":{\"params\":{\"timestamp\":\"Timestamp of the totalSupply checkpoint\"},\"returns\":{\"_0\":\"uint256\"}},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}; Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"balanceOfAt(address,uint256)\":{\"notice\":\"Queries the balances of a holder at a specific timestamp\"},\"getHoldersAt(uint256)\":{\"notice\":\"returns an array of holders with non zero balance at a given checkpoint\"},\"initialize(string,string)\":{\"notice\":\"Initialize a new instance storage\"},\"totalSupplyAt(uint256)\":{\"notice\":\"Queries totalSupply at a specific timestamp\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/ICT/CheckpointedToken/CheckpointedToken.sol\":\"CheckpointedToken\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/ICT/Checkpoint/Checkpoint.sol\":{\"keccak256\":\"0xece3763697d7adc64207d921125eefa45f1ecf0e66d372a985efa5279b16e7bb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d5a3fdc8bd568e92f6f0c8f46bc2e3727911e580f9d3f3625b01af5ef8913710\",\"dweb:/ipfs/QmXXSt5oq8oxYXVHeXGnawCUDgQ1cA7zhsbz4VDYd6FnFN\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/ICT/Checkpoint/CheckpointStorage.sol\":{\"keccak256\":\"0x7e5c553e1ff9d469c2f732f34ea25fa709e2711ff2e2259ff1472bb89208e558\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4c2f3706e10d710c658700fc26a7be1ee31b2a982f1f7856e559f3b5ca088ea6\",\"dweb:/ipfs/QmTcuAa1M8BqVBKaKubrf7RunMC99uzmmKK1YRWqNFwnpY\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/ICT/CheckpointedToken/CheckpointedToken.sol\":{\"keccak256\":\"0x163e8304a5552d583f78fa902525fe768d8edd24c54f3d0e65d7cf2c05fe57b8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://fe7a580fe4a241a5057e945d09ca4bbe0298ab0e11477b89fd5d353031b83364\",\"dweb:/ipfs/QmSh4P7ysYwmVvmnMT1GwnJy9sghfRJGaBY4nXbLEuvVDW\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/ICT/CheckpointedToken/CheckpointedTokenStorage.sol\":{\"keccak256\":\"0x5dc109b8a927dd9e7c2dd14c7546d8b791490a3b7b129b68987ee47fc2894513\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6e8fccad6b9cf0375093cdc024014ee1829d05e8c1c8858e17771d6d1728998a\",\"dweb:/ipfs/QmUnCaQBp927wwLm5XmLpUbpQoLDKgDDDmq3WZ8avQzWBc\"]},\"@openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol\":{\"keccak256\":\"0xe81686511d62f18b2d9c693c2c94c0a789c690de63aa90e15451ebf65c5bfd3e\",\"urls\":[\"bzz-raw://1332ee1d2b096456bf2e5795b5871d0fed47be6a31c9a2f2cef9206a299565ea\",\"dweb:/ipfs/Qmdu1847Y4UL3gTjbLUManMGfxYEoyGPSodM3Br89SKzwx\"]},\"@openzeppelin/contracts-ethereum-package/contracts/Initializable.sol\":{\"keccak256\":\"0x9bfec92e36234ecc99b5d37230acb6cd1f99560233753162204104a4897e8721\",\"urls\":[\"bzz-raw://5cf7c208583d4d046d75bd99f5507412ab01cce9dd9f802ce9768a416d93ea2f\",\"dweb:/ipfs/QmcQS1BBMPpVEkXP3qzwSjxHNrqDek8YeR7xbVWDC9ApC7\"]},\"@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x04d34b3cd5677bea25f8dfceb6dec0eaa071d4d4b789a43f13fe0c415ba4c296\",\"urls\":[\"bzz-raw://e7e8b526a6839e5ba14f0d23a830387fec47f7043ce01d42c9f285b709a9d080\",\"dweb:/ipfs/QmXmhhFmX5gcAvVzNiDPAGA35iHMPNaYtQkACswRHBVTNw\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x9c2d859bc9de93ced0875d226598e56067fe4d6b2dde0e1fd53ca60fa9603db0\",\"urls\":[\"bzz-raw://5df1baba4ea42a94d0e0aed4a87271369ef2cd54d86e89cab7ef1428ff387210\",\"dweb:/ipfs/QmV5ErriAFQWqEPAfWhJ6DxmujH6vBPB3F5Breaq9vUWGu\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x6cc1cb934a3ac2137a7dcaed018af9e235392236ceecfd3687259702b9c767ad\",\"urls\":[\"bzz-raw://0055fa88138cd1c3c6440370f8580f85857f8fe9dec41c99af9eafbeb8d9c3ce\",\"dweb:/ipfs/QmX1xDh8vwGLLCH8ti45eXjQ7Wcxv1FEGTR3jkFnd5Nv6F\"]},\"@openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol\":{\"keccak256\":\"0x5f7da58ee3d9faa9b8999a93d49c8ff978f1afc88ae9bcfc6f9cbb44da011c2b\",\"urls\":[\"bzz-raw://4f089d954b3ecaa26949412fe63e9a184b056562c6c13dd4a0529a5d9a2e685a\",\"dweb:/ipfs/QmVK5iCNAMcEJQxT59bsC5E53JQASDQPU6khHox3d5ZXCn\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50611775806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80634cd88b76116100a257806395d89b411161007157806395d89b4114610227578063981b24d01461022f578063a457c2d714610242578063a9059cbb14610255578063dd62ed3e1461026857610116565b80634cd88b76146101d95780634ee2cd7e146101ee578063520fdd221461020157806370a082311461021457610116565b806323b872dd116100e957806323b872dd14610176578063308feec314610189578063313ce5671461019157806331801925146101a657806339509351146101c657610116565b806306fdde031461011b578063095ea7b31461013957806318160ddd146101595780631aab9a9f1461016e575b600080fd5b61012361027b565b60405161013091906114ba565b60405180910390f35b61014c610147366004611394565b610312565b60405161013091906114af565b610161610330565b60405161013091906116a0565b610161610336565b61014c610184366004611354565b61033c565b6101616103c9565b6101996103cf565b60405161013091906116a9565b6101b96101b4366004611437565b6103d8565b6040516101309190611462565b61014c6101d4366004611394565b6105ef565b6101ec6101e73660046113be565b610643565b005b6101616101fc366004611394565b6106db565b6101b961020f36600461141f565b610704565b610161610222366004611305565b6108b8565b6101236108d3565b61016161023d36600461141f565b610934565b61014c610250366004611394565b610941565b61014c610263366004611394565b6109af565b610161610276366004611320565b6109c3565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103075780601f106102dc57610100808354040283529160200191610307565b820191906000526020600020905b8154815290600101906020018083116102ea57829003601f168201915b505050505090505b90565b600061032661031f6109ee565b84846109f2565b5060015b92915050565b60675490565b609b5481565b6000610349848484610aa6565b6103bf846103556109ee565b6103ba856040518060600160405280602881526020016116f3602891396001600160a01b038a166000908152606660205260408120906103936109ee565b6001600160a01b03168152602081019190915260400160002054919063ffffffff610abc16565b6109f2565b5060019392505050565b60995490565b606a5460ff1690565b6099546060908083106103ed578390036103f5565b506001838303015b60608167ffffffffffffffff8111801561040e57600080fd5b50604051908082528060200260200182016040528015610438578160200160208202803683370190505b50905060005b8281101561049f5760998682018154811061045557fe5b9060005260206000200160009054906101000a90046001600160a01b031682828151811061047f57fe5b6001600160a01b039092166020928302919091019091015260010161043e565b506000805b82518110156105145760006104cc8483815181106104be57fe5b60200260200101518a6106db565b11156104dd5760019091019061050c565b60008382815181106104eb57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016104a4565b60608267ffffffffffffffff8111801561052d57600080fd5b50604051908082528060200260200182016040528015610557578160200160208202803683370190505b50905060009250600091505b83518210156105e35760006001600160a01b031684838151811061058357fe5b60200260200101516001600160a01b0316146105d8578382815181106105a557fe5b60200260200101518184815181106105b957fe5b6001600160a01b03909216602092830291909101909101526001909201915b600190910190610563565b98975050505050505050565b60006103266105fc6109ee565b846103ba856066600061060d6109ee565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff610ae816565b600054610100900460ff168061065c575061065c610b0d565b8061066a575060005460ff16155b61068f5760405162461bcd60e51b8152600401610686906115c9565b60405180910390fd5b600054610100900460ff161580156106ba576000805460ff1961ff0019909116610100171660011790555b6106c48383610b13565b80156106d6576000805461ff00191690555b505050565b6001600160a01b03821660009081526098602052604081206106fd9083610b93565b9392505050565b60606000806060609980548060200260200160405190810160405280929190818152602001828054801561076157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610743575b50505050509050600091505b80518210156107e057600061079582848151811061078757fe5b6020026020010151876106db565b11156107a6576001909201916107d5565b60008183815181106107b457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60019091019061076d565b60608367ffffffffffffffff811180156107f957600080fd5b50604051908082528060200260200182016040528015610823578160200160208202803683370190505b50905060009350600092505b81518310156108af5760006001600160a01b031682848151811061084f57fe5b60200260200101516001600160a01b0316146108a45781838151811061087157fe5b602002602001015181858151811061088557fe5b6001600160a01b03909216602092830291909101909101526001909301925b60019092019161082f565b95945050505050565b6001600160a01b031660009081526065602052604090205490565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103075780601f106102dc57610100808354040283529160200191610307565b600061032a609783610b93565b600061032661094e6109ee565b846103ba8560405180606001604052806025815260200161171b60259139606660006109786109ee565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff610abc16565b60006103266109bc6109ee565b8484610aa6565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b3390565b6001600160a01b038316610a185760405162461bcd60e51b81526004016106869061165c565b6001600160a01b038216610a3e5760405162461bcd60e51b815260040161068690611550565b6001600160a01b0380841660008181526066602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a999085906116a0565b60405180910390a3505050565b610ab1838383610cbf565b6106d6838383610de0565b60008184841115610ae05760405162461bcd60e51b815260040161068691906114ba565b505050900390565b6000828201838110156106fd5760405162461bcd60e51b815260040161068690611592565b303b1590565b600054610100900460ff1680610b2c5750610b2c610b0d565b80610b3a575060005460ff16155b610b565760405162461bcd60e51b8152600401610686906115c9565b600054610100900460ff16158015610b81576000805460ff1961ff0019909116610100171660011790555b610b89610e05565b6106c48383610e88565b8154600090610ba45750600061032a565b825483906000198101908110610bb657fe5b60009182526020909120600290910201546001600160801b03168210610c0157825483906000198101908110610be857fe5b906000526020600020906002020160010154905061032a565b82600081548110610c0e57fe5b60009182526020909120600290910201546001600160801b0316821015610c375750600061032a565b8254600090600019015b81811115610c97576000600260018385010104905084868281548110610c6357fe5b60009182526020909120600290910201546001600160801b031611610c8a57809250610c91565b6001810391505b50610c41565b848281548110610ca357fe5b9060005260206000209060020201600101549250505092915050565b6001600160a01b038316610ce55760405162461bcd60e51b815260040161068690611617565b6001600160a01b038216610d0b5760405162461bcd60e51b81526004016106869061150d565b610d168383836106d6565b610d59816040518060600160405280602681526020016116cd602691396001600160a01b038616600090815260656020526040902054919063ffffffff610abc16565b6001600160a01b038085166000908152606560205260408082209390935590841681522054610d8e908263ffffffff610ae816565b6001600160a01b0380841660008181526065602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610a999085906116a0565b610deb838383610f41565b610df3611040565b610dfc83611054565b6106d682611054565b600054610100900460ff1680610e1e5750610e1e610b0d565b80610e2c575060005460ff16155b610e485760405162461bcd60e51b8152600401610686906115c9565b600054610100900460ff16158015610e73576000805460ff1961ff0019909116610100171660011790555b8015610e85576000805461ff00191690555b50565b600054610100900460ff1680610ea15750610ea1610b0d565b80610eaf575060005460ff16155b610ecb5760405162461bcd60e51b8152600401610686906115c9565b600054610100900460ff16158015610ef6576000805460ff1961ff0019909116610100171660011790555b8251610f099060689060208601906111d8565b508151610f1d9060699060208501906111d8565b50606a805460ff1916601217905580156106d6576000805461ff0019169055505050565b801580610f5f5750816001600160a01b0316836001600160a01b0316145b15610f69576106d6565b610f72826108b8565b158015610f8757506001600160a01b03821615155b1561101457609b54610fa090600163ffffffff610ae816565b609b55610fac82611079565b611014576099805460018082019092557f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000180546001600160a01b0319166001600160a01b0385169081179091556000908152609a60205260409020805460ff191690911790555b61101d836108b8565b8114156106d657609b5461103890600163ffffffff61109716565b609b55505050565b611052609761104d610330565b6110d9565b565b6001600160a01b0381166000908152609860205260409020610e859061104d836108b8565b6001600160a01b03166000908152609a602052604090205460ff1690565b60006106fd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610abc565b8154158061111157508154829060001981019081106110f457fe5b60009182526020909120600290910201546001600160801b031642115b156111a757604080518082018252426001600160801b039081168252602080830185815286546001808201895560008981529384209551600290920290950180546fffffffffffffffffffffffffffffffff1916919094161783555191909201558354915160001992909201917f76735e462dae5480c552f970568dc60e35cc3c4c06eb818f77bbb357593bf7fa9190a26111d4565b8154600090839060001981019081106111bc57fe5b60009182526020909120600160029092020101829055505b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061121957805160ff1916838001178555611246565b82800160010185558215611246579182015b8281111561124657825182559160200191906001019061122b565b50611252929150611256565b5090565b61030f91905b80821115611252576000815560010161125c565b80356001600160a01b038116811461032a57600080fd5b600082601f830112611297578081fd5b813567ffffffffffffffff808211156112ae578283fd5b604051601f8301601f1916810160200182811182821017156112ce578485fd5b6040528281529250828483016020018610156112e957600080fd5b8260208601602083013760006020848301015250505092915050565b600060208284031215611316578081fd5b6106fd8383611270565b60008060408385031215611332578081fd5b61133c8484611270565b915061134b8460208501611270565b90509250929050565b600080600060608486031215611368578081fd5b8335611373816116b7565b92506020840135611383816116b7565b929592945050506040919091013590565b600080604083850312156113a6578182fd5b6113b08484611270565b946020939093013593505050565b600080604083850312156113d0578182fd5b823567ffffffffffffffff808211156113e7578384fd5b6113f386838701611287565b93506020850135915080821115611408578283fd5b5061141585828601611287565b9150509250929050565b600060208284031215611430578081fd5b5035919050565b60008060006060848603121561144b578283fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b818110156114a35783516001600160a01b03168352928401929184019160010161147e565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b818110156114e6578581018301518582016040015282016114ca565b818111156114f75783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b90815260200190565b60ff91909116815260200190565b6001600160a01b0381168114610e8557600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122062c6a825f183694744a883ec3ded696f72629dec251ace58ed4c78a2963552ed64736f6c634300060b0033",
  "immutableReferences": {},
  "compiler": {
    "name": "solc",
    "version": "0.6.11+commit.5ef660b1.Emscripten.clang"
  },
  "updatedAt": "2020-08-12T09:47:18.185Z"
}
