Contract 0x98936bde1cf1bff1e7a8012cee5e2583851f2067 3

  Note: Our CRO balance display is temporarily unavailable. Please check back later.

Contract Overview

Annex Finance: ANN Token
Balance:

CRO Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7c93b105c32710451ce2c94d0eb704403cd9ad98f547804b91a8ba52a8427570Claim Reward57713062022-11-28 14:39:443 hrs 12 mins ago0x8b5e64214c18cfe4ef1b0fd951f0b6dd3d27fffc IN  Annex Finance: ANN Token0 CRO0.74306556410
0x16664e59bc1c7ff5967a86120810afc08d3302f9b45959e46761821793424144Claim Reward57669582022-11-28 7:44:4310 hrs 7 mins ago0x1e61a7bfef0d6142b60abc160da4d9739ca62521 IN  Annex Finance: ANN Token0 CRO0.68611163237 4,866.764783196
0x471fa4993ddd25ce9fb4d4342ea1d660d65a2c580a5d33555c30fef66f13b7aeClaim Reward57609412022-11-27 22:09:5419 hrs 42 mins ago0xaac987769480b82c57cecb12d4edab511c83c789 IN  Annex Finance: ANN Token0 CRO0.3099868721650
0x3d246c0c8936dd3f66dd3495bfe46ec0c5fc01ae03017556637deb8bee88a130Claim Reward57603032022-11-27 21:08:5220 hrs 43 mins ago0x6be2bba79a21805d5d38b4a9f71f89a8d695e698 IN  Annex Finance: ANN Token0 CRO2.272016643031 4,868.572316694
0xa2fca7fae27c1cdca039286e0687b4419dc469fc44b8d120e77fdf720c76dc61Claim Reward57596912022-11-27 20:10:2021 hrs 41 mins ago0x07235657ecbeb02e76e9ba6ebc1c02716073163b IN  Annex Finance: ANN Token0 CRO0.753081703897 4,867.101215014
0x8ccbf9d505e3fc70dc19567d4037503fa963701936ee92dd438dbb627114d474Approve57584312022-11-27 18:09:5123 hrs 42 mins ago0x51c06357a8ecb71e35a0b57fe48345979e752ef3 IN  Annex Finance: ANN Token0 CRO0.2365350
0x2e99b4b7540e3f50e2a9cc6b8b7c976922a94b9ffc3c8e5f491793866ae99c31Claim Reward57568432022-11-27 15:38:031 day 2 hrs ago0xedce0151656e82150a0835e9b9cbd1ec53a17eae IN  Annex Finance: ANN Token0 CRO0.9499033832410
0xe78599f05ca98affc7e0bfc7702ebc80338d5411bf9c3051f8d0e3dcb8875094Claim Reward57560792022-11-27 14:25:041 day 3 hrs ago0x32fbc5ac04b96f69d7cd175f0272211165c9843a IN  Annex Finance: ANN Token0 CRO0.3100010578110
0x81372d6ae67a1b89d1ae9aac3c4e2edadde39ec1a494d528144015aa98d8805bClaim Reward57539072022-11-27 10:57:581 day 6 hrs ago0x34ba7dcc4691b80be3cca15cc532b03d51de51d6 IN  Annex Finance: ANN Token0 CRO0.7731910014080
0x442f9032ac916dc7cb3e047a75b3a77a235c959f8fbc0315ffb99dfd555e24e1Claim Reward57533892022-11-27 10:08:391 day 7 hrs ago0x78795d1f3b2cd0efa0f721c31d67eebbe5bd4364 IN  Annex Finance: ANN Token0 CRO1.793229759998 4,867.391461303
0x3f913521cca4d672500a98427d006b6a5211c73ca53e13c660544db2f1c4b460Claim Reward57508472022-11-27 6:06:321 day 11 hrs ago0xc287efaaf809705d88df4a50b6269d0080459f39 IN  Annex Finance: ANN Token0 CRO1.21400578525 4,867.510465703
0xdfb3e074af307ebaea754513e5bcfba0e35a504898d373265487664f6e99254bClaim Reward57508212022-11-27 6:04:021 day 11 hrs ago0xf64ae200bed251d553e2f4bf60fd30cd9617521b IN  Annex Finance: ANN Token0 CRO1.153609980432 4,867.511584004
0x55719a7026f9d21bbf6959b5c5f15028911f23d64f5a2861c3b50f432c12fd92Claim Reward57508042022-11-27 6:02:251 day 11 hrs ago0x828ba9b75eec0cfff2688d5742ee0c0ca5082027 IN  Annex Finance: ANN Token0 CRO1.100262233246 4,867.512379321
0x729dbfa4e0f505ff1e609bd75623125522566465aefeafa3d6942aeb192730abClaim Reward57507872022-11-27 6:00:491 day 11 hrs ago0x120b71e5174484f335ad8261007ef3dbcbb8267e IN  Annex Finance: ANN Token0 CRO1.100262419115 4,867.513201596
0xbc3388b291417c657c9f73419de542c020671f6f29a5dc4f043206338719855eClaim Reward57507702022-11-27 5:59:111 day 11 hrs ago0x3c468ac352f3e0531fbef7160e3ab1180059c93e IN  Annex Finance: ANN Token0 CRO1.10026258765 4,867.513947189
0xaa77d5548a06d21645e77987e465946fa734740d91142f347df1d46667053cc6Approve57496222022-11-27 4:09:521 day 13 hrs ago0x4ac800cfb2fd82507b905aa17ef8b9704b5f4c16 IN  Annex Finance: ANN Token0 CRO0.2302700263620
0x68e0162147bf6485b9f65e86c507bdb0348980430135dca3cf0ff2a3096a8dccClaim Reward57441332022-11-26 19:27:451 day 22 hrs ago0x77d3f2e648f89a44589ba5d64c17e5e05dc7c3e1 IN  Annex Finance: ANN Token0 CRO0.6139492809830
0x2056abad097553533bb4616b461ba65bb47fc50eb068c5d17fc9eeb342195fdaClaim Reward57419262022-11-26 15:58:502 days 1 hr ago0xacbeb7fa7d9d89ab09378435883e1263925c831f IN  Annex Finance: ANN Token0 CRO0.3100429968450
0x1a22d499a9cb42e1a1af980eac49007c3232de3092c7dcadf4f951b1f97ea86eTransfer57405522022-11-26 13:48:422 days 4 hrs ago0x987e88840f12470df495e6a14b6e5ecc0da15340 IN  Annex Finance: ANN Token0 CRO0.50419652021 4,869.487939299
0x7f7e8347bf1fe964f4a5706aceeef8c14f2f817230cf4dd7956cbe74bd7a6e13Claim Reward57364912022-11-26 7:24:192 days 10 hrs ago0x78795d1f3b2cd0efa0f721c31d67eebbe5bd4364 IN  Annex Finance: ANN Token0 CRO1.79351955388 4,868.178053349
0x525d423cc6e2acc10f2143d162795166f76d6872689b3b93128d56711d03e09cClaim Reward57361072022-11-26 6:48:022 days 11 hrs ago0x5c1b78f5e13b84a570313ff6d52d5d0ee9fe6e4e IN  Annex Finance: ANN Token0 CRO0.7841739098320
0x0edf6ea657cd13c370373747831bdeb4ae4a5aad0dd2170577734eaafe74b391Claim Reward57303832022-11-25 21:45:592 days 20 hrs ago0xf0c72571ade6c21b62dc2c477fbdf37d22514fe4 IN  Annex Finance: ANN Token0 CRO0.7532922809220
0x4dcac55cbb14d8c9c320642808a2f71fe07872972d212c7921ea6ed1af596233Claim Reward57233922022-11-25 10:42:473 days 7 hrs ago0xa50139e48e0061311d952f9a0353d9639567b258 IN  Annex Finance: ANN Token0 CRO0.763678529411 4,868.78413671
0x3062685f5179fed524f2c9764d5b17f690d274d543e880ea4e80cbeadc32ba62Claim Reward57167632022-11-25 0:14:383 days 17 hrs ago0x6c0d18acd46ddf15f2e7f16cfa56b9f55abf828d IN  Annex Finance: ANN Token0 CRO1.215598303589 4,869.093086443
0xa80c98a1a9611690e7c22e354935e52e0d0ec29d9e316777526b6966abcaa036Claim Reward57118002022-11-24 16:23:444 days 1 hr ago0xdfd4a7ac8236deae66bb14575a058319f1d7de23 IN  Annex Finance: ANN Token0 CRO0.9308532615530
[ Download CSV Export 

OVERVIEW

A Decentralized Marketplace for Lenders and Borrowers, Swap, Auction and NFT marketplace.

Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ANN

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-01-07
*/

pragma solidity ^0.5.16;


/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
  // Empty internal constructor, to prevent people from mistakenly deploying
  // an instance of this contract, which should be used via inheritance.
  constructor () internal { }

  function _msgSender() internal view returns (address payable) {
    return msg.sender;
  }

  function _msgData() internal view returns (bytes memory) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

// File: @openzeppelin/contracts/access/Ownable.sol
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;
    address private _authorizedNewOwner;
    event OwnershipTransferAuthorization(address indexed authorizedAddress);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    /**
     * @dev Returns the address of the current authorized new owner.
     */
    function authorizedNewOwner() public view returns (address) {
        return _authorizedNewOwner;
    }
    /**
     * @notice Authorizes the transfer of ownership from _owner to the provided address.
     * NOTE: No transfer will occur unless authorizedAddress calls assumeOwnership( ).
     * This authorization may be removed by another call to this function authorizing
     * the null address.
     *
     * @param authorizedAddress The address authorized to become the new owner.
     */
    function authorizeOwnershipTransfer(address authorizedAddress) external onlyOwner {
        _authorizedNewOwner = authorizedAddress;
        emit OwnershipTransferAuthorization(_authorizedNewOwner);
    }
    /**
     * @notice Transfers ownership of this contract to the _authorizedNewOwner.
     */
    function assumeOwnership() external {
        require(_msgSender() == _authorizedNewOwner, "Ownable: only the authorized new owner can accept ownership");
        emit OwnershipTransferred(_owner, _authorizedNewOwner);
        _owner = _authorizedNewOwner;
        _authorizedNewOwner = address(0);
    }
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     *
     * @param confirmAddress The address wants to give up ownership.
     */
    function renounceOwnership(address confirmAddress) public onlyOwner {
        require(confirmAddress == _owner, "Ownable: confirm address is wrong");
        emit OwnershipTransferred(_owner, address(0));
        _authorizedNewOwner = address(0);
        _owner = address(0);
    }
}

contract ANN is Ownable {
    /// @notice BEP-20 token name for this token
    string public constant name = "Annex";

    /// @notice BEP-20 token symbol for this token
    string public constant symbol = "ANN";

    /// @notice BEP-20 token decimals for this token
    uint8 public constant decimals = 18;

    /// @notice Total number of tokens in circulation
    uint public constant totalSupply = 1000000000e18; // 1 billion ANN

    /// @notice Reward eligible epochs
    uint32 public constant eligibleEpochs = 30; // 30 epochs

    /// @notice Allowance amounts on behalf of others
    mapping (address => mapping (address => uint96)) internal allowances;

    /// @notice Official record of token balances for each account
    mapping (address => uint96) internal balances;

    /// @notice A record of each accounts delegate
    mapping (address => address) public delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A transferPoint for marking balance from given epoch
    struct TransferPoint {
        uint32 epoch;
        uint96 balance;
    }

    /// @notice A epoch config for blocks or ROI per epoch
    struct EpochConfig {
        uint32 epoch;
        uint32 blocks;
        uint32 roi;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice A record of transfer checkpoints for each account
    mapping (address => mapping (uint32 => TransferPoint)) public transferPoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The number of transferPoints for each account
    mapping (address => uint32) public numTransferPoints;

    /// @notice The claimed amount for each account
    mapping (address => uint96) public claimedAmounts;

    /// @notice Configs for epoch
    EpochConfig[] public epochConfigs;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /// @notice An event thats emitted when a transfer point balance changes
    // event TransferPointChanged(address indexed src, uint srcBalance, address indexed dst, uint dstBalance);

    /// @notice An event thats emitted when epoch block count changes
    event EpochConfigChanged(uint32 indexed previousEpoch, uint32 previousBlocks, uint32 previousROI, uint32 indexed newEpoch, uint32 newBlocks, uint32 newROI);

    /// @notice The standard BEP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @notice The standard BEP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /**
     * @notice Construct a new ANN token
     * @param account The initial account to grant all the tokens
     */
    constructor(address account) public {
        EpochConfig memory newEpochConfig = EpochConfig(
            0,
            24 * 60 * 60 / 6, // 1 day blocks in BSC
            20 // 0.2% ROI increase per epoch
        );
        epochConfigs.push(newEpochConfig);
        emit EpochConfigChanged(0, 0, 0, newEpochConfig.epoch, newEpochConfig.blocks, newEpochConfig.roi);
        balances[account] = uint96(totalSupply);
        _writeTransferPoint(address(0), account, 0, 0, uint96(totalSupply));
        emit Transfer(address(0), account, totalSupply);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint rawAmount) external returns (bool) {
        uint96 amount;
        if (rawAmount == uint(-1)) {
            amount = uint96(-1);
        } else {
            amount = safe96(rawAmount, "ANN::approve: amount exceeds 96 bits");
        }

        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint rawAmount) external  returns (bool) {
        uint96 amount = safe96(rawAmount, "ANN::transfer: amount exceeds 96 bits");
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint rawAmount) external  returns (bool) {
        address spender = msg.sender;
        uint96 spenderAllowance = allowances[src][spender];
        uint96 amount = safe96(rawAmount, "ANN::approve: amount exceeds 96 bits");

        if (spender != src && spenderAllowance != uint96(-1)) {
            uint96 newAllowance = sub96(spenderAllowance, amount, "ANN::transferFrom: transfer amount exceeds spender allowance");
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public  {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public  {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "ANN::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "ANN::delegateBySig: invalid nonce");
        require(now <= expiry, "ANN::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) public view returns (uint96) {
        require(blockNumber < block.number, "ANN::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    /**
     * @notice Sets block counter per epoch
     * @param blocks The count of blocks per epoch
     * @param roi The interet of rate increased per epoch
     */
    function setEpochConfig(uint32 blocks, uint32 roi) public onlyOwner {
        require(blocks > 0, "ANN::setEpochConfig: zero blocks");
        require(roi < 10000, "ANN::setEpochConfig: roi exceeds max fraction");
        EpochConfig memory prevEC = epochConfigs[epochConfigs.length - 1];
        EpochConfig memory newEC = EpochConfig(getEpochs(block.number), blocks, roi);
        require(prevEC.blocks != newEC.blocks || prevEC.roi != newEC.roi, "ANN::setEpochConfig: blocks and roi same as before");
        //if (prevEC.epoch == newEC.epoch && epochConfigs.length > 1) {
        if (prevEC.epoch == newEC.epoch) {
            epochConfigs[epochConfigs.length - 1] = newEC;
        } else {
            epochConfigs.push(newEC);
        }
        emit EpochConfigChanged(prevEC.epoch, prevEC.blocks, prevEC.roi, newEC.epoch, newEC.blocks, newEC.roi);
    }

    /**
     * @notice Gets block counter per epoch
     * @return The count of blocks for current epoch
     */
    function getCurrentEpochBlocks() public view returns (uint32 blocks) {
        blocks = epochConfigs[epochConfigs.length - 1].blocks;
    }

    /**
     * @notice Gets rate of interest for current epoch
     * @return The rate of interest for current epoch
     */
    function getCurrentEpochROI() public view returns (uint32 roi) {
        roi = epochConfigs[epochConfigs.length - 1].roi;
    }

    /**
     * @notice Gets current epoch config
     * @return The EpochConfig for current epoch
     */
    function getCurrentEpochConfig() public view returns (uint32 epoch, uint32 blocks, uint32 roi) {
        EpochConfig memory ec = epochConfigs[epochConfigs.length - 1];
        epoch = ec.epoch;
        blocks = ec.blocks;
        roi = ec.roi;
    }

    /**
     * @notice Gets epoch config at given epoch index
     * @param forEpoch epoch
     * @return (index of config,
                config at epoch)
     */
    function getEpochConfig(uint32 forEpoch) public view returns (uint32 index, uint32 epoch, uint32 blocks, uint32 roi) {
        index = uint32(epochConfigs.length - 1);
        // solhint-disable-next-line no-inline-assembly
        for (; index > 0; index--) {
            if (forEpoch >= epochConfigs[index].epoch) {
                break;
            }
        }
        EpochConfig memory ec = epochConfigs[index];
        epoch = ec.epoch;
        blocks = ec.blocks;
        roi = ec.roi;
    }

    /**
     * @notice Gets epoch index at given block number
     * @param blockNumber The number of blocks
     * @return epoch index
     */
    function getEpochs(uint blockNumber) public view returns (uint32) {
        uint96 blocks = 0;
        uint96 epoch = 0;
        uint blockNum = blockNumber;
        for (uint32 i = 0; i < epochConfigs.length; i++) {
            uint96 deltaBlocks = (uint96(epochConfigs[i].epoch) - epoch) * blocks;
            if (blockNum < deltaBlocks) {
                break;
            }
            blockNum = blockNum - deltaBlocks;
            epoch = epochConfigs[i].epoch;
            blocks = epochConfigs[i].blocks;
        }

        if (blocks == 0) {
            blocks = getCurrentEpochBlocks();
        }
        epoch = epoch + uint96(blockNum / blocks);
        if (epoch >= 2**32) {
            epoch = 2**32 - 1;
        }
        return uint32(epoch);
    }

    /**
     * @notice Gets the current holding rewart amount for `account`
     * @param account The address to get holding reward amount
     * @return The number of current holding reward for `account`
     */
    function getHoldingReward(address account) public view returns (uint96) {
        // Check if account is holding more than eligible delay
        uint32 nTransferPoint = numTransferPoints[account];

        if (nTransferPoint == 0) {
            return 0;
        }

        uint32 lastEpoch = getEpochs(block.number);
        if (lastEpoch == 0) {
            return 0;
        }

        lastEpoch = lastEpoch - 1;
        if (lastEpoch < eligibleEpochs) {
            return 0;
        } else {
            uint32 lastEligibleEpoch = lastEpoch - eligibleEpochs;

            // Next check implicit zero balance
            if (transferPoints[account][0].epoch > lastEligibleEpoch) {
                return 0;
            }

            // First check most recent balance
            if (transferPoints[account][nTransferPoint - 1].epoch <= lastEligibleEpoch) {
                nTransferPoint = nTransferPoint - 1;
            } else {
                uint32 upper = nTransferPoint - 1;
                nTransferPoint = 0;
                while (upper > nTransferPoint) {
                    uint32 center = upper - (upper - nTransferPoint) / 2; // ceil, avoiding overflow
                    TransferPoint memory tp = transferPoints[account][center];
                    if (tp.epoch == lastEligibleEpoch) {
                        nTransferPoint = center;
                        break;
                    } if (tp.epoch < lastEligibleEpoch) {
                        nTransferPoint = center;
                    } else {
                        upper = center - 1;
                    }
                }
            }
        }

        // Calculate total rewards amount
        uint256 reward = 0;
        for (uint32 iTP = 0; iTP <= nTransferPoint; iTP++) {
            TransferPoint memory tp = transferPoints[account][iTP];
            (uint32 iEC,,,uint32 roi) = getEpochConfig(tp.epoch);
            uint32 startEpoch = tp.epoch;
            for (; iEC < epochConfigs.length; iEC++) {
                uint32 epoch = lastEpoch;
                bool tookNextTP = false;
                if (iEC < (epochConfigs.length - 1) && epoch > epochConfigs[iEC + 1].epoch) {
                    epoch = epochConfigs[iEC + 1].epoch;
                }
                if (iTP < nTransferPoint && epoch > transferPoints[account][iTP + 1].epoch) {
                    epoch = transferPoints[account][iTP + 1].epoch;
                    tookNextTP = true;
                }
                reward = reward + (uint256(tp.balance) * roi * sub32(epoch, startEpoch, "ANN::getHoldingReward: invalid epochs"));
                if (tookNextTP) {
                    break;
                }
                startEpoch = epoch;
                if (iEC < (epochConfigs.length - 1)) {
                    roi = epochConfigs[iEC + 1].roi;
                }
            }
        }
        uint96 amount = safe96(reward / 10000, "ANN::getHoldingReward: reward exceeds 96 bits");

        // Exclude already claimed amount
        if (claimedAmounts[account] > 0) {
            amount = sub96(amount, claimedAmounts[account], "ANN::getHoldingReward: invalid claimed amount");
        }

        return amount;
    }

    /**
     * @notice Receive the current holding rewart amount to msg.sender
     */
    function claimReward() public  {
        uint96 holdingReward = getHoldingReward(msg.sender);
        if (balances[address(this)] < holdingReward) {
            holdingReward = balances[address(this)];
        }
        claimedAmounts[msg.sender] = add96(claimedAmounts[msg.sender], holdingReward, "ANN::claimReward: invalid claimed amount");
        _transferTokens(address(this), msg.sender, holdingReward);
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint96 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _transferTokens(address src, address dst, uint96 amount) internal {
        require(src != address(0), "ANN::_transferTokens: cannot transfer from the zero address");
        require(dst != address(0), "ANN::_transferTokens: cannot transfer to the zero address");

        balances[src] = sub96(balances[src], amount, "ANN::_transferTokens: transfer amount exceeds balance");
        balances[dst] = add96(balances[dst], amount, "ANN::_transferTokens: transfer amount overflows");
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
        if (amount > 0) {
            _writeTransferPoint(src, dst, numTransferPoints[dst], balances[src], balances[dst]);
        }
    }

    function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint96 srcRepNew = sub96(srcRepOld, amount, "ANN::_moveVotes: vote amount underflows");
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint96 dstRepNew = add96(dstRepOld, amount, "ANN::_moveVotes: vote amount overflows");
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {
      uint32 blockNumber = safe32(block.number, "ANN::_writeCheckpoint: block number exceeds 32 bits");

      if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
          checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
      } else {
          checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
          numCheckpoints[delegatee] = nCheckpoints + 1;
      }

      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function _writeTransferPoint(address src, address dst, uint32 nDstPoint, uint96 srcBalance, uint96 dstBalance) internal {
        uint32 epoch = getEpochs(block.number);

        if (src != address(this)) {
            // Revoke sender in reward eligible list
            for (uint32 i = 0; i < numTransferPoints[src]; i++) {
                delete transferPoints[src][i];
            }

            // Remove claim amount
            claimedAmounts[src] = 0;

            // delete transferPoints[src];
            if (srcBalance > 0) {
                transferPoints[src][0] = TransferPoint(epoch, srcBalance);
                numTransferPoints[src] = 1;
            } else {
                numTransferPoints[src] = 0;
            }
        }

        if (dst != address(this)) {
            // Add recipient in reward eligible list
            if (nDstPoint > 0 && transferPoints[dst][nDstPoint - 1].epoch >= epoch) {
                transferPoints[dst][nDstPoint - 1].balance = dstBalance;
            } else {
                transferPoints[dst][nDstPoint] = TransferPoint(epoch, dstBalance);
                numTransferPoints[dst] = nDstPoint + 1;
            }
        }

        // emit TransferPointChanged(src, balances[src], dst, balances[dst]);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function add32(uint32 a, uint32 b, string memory errorMessage) internal pure returns (uint32) {
        uint32 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub32(uint32 a, uint32 b, string memory errorMessage) internal pure returns (uint32) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function safe96(uint n, string memory errorMessage) internal pure returns (uint96) {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal pure returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"account","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"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":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"previousEpoch","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"previousBlocks","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"previousROI","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"newEpoch","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newBlocks","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newROI","type":"uint32"}],"name":"EpochConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizedAddress","type":"address"}],"name":"OwnershipTransferAuthorization","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"assumeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"authorizedAddress","type":"address"}],"name":"authorizeOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"authorizedNewOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAmounts","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"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"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"eligibleEpochs","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochConfigs","outputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint32","name":"blocks","type":"uint32"},{"internalType":"uint32","name":"roi","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentEpochBlocks","outputs":[{"internalType":"uint32","name":"blocks","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentEpochConfig","outputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint32","name":"blocks","type":"uint32"},{"internalType":"uint32","name":"roi","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentEpochROI","outputs":[{"internalType":"uint32","name":"roi","type":"uint32"}],"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":"uint32","name":"forEpoch","type":"uint32"}],"name":"getEpochConfig","outputs":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint32","name":"blocks","type":"uint32"},{"internalType":"uint32","name":"roi","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getEpochs","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getHoldingReward","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"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numTransferPoints","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":"confirmAddress","type":"address"}],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"blocks","type":"uint32"},{"internalType":"uint32","name":"roi","type":"uint32"}],"name":"setEpochConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"transferPoints","outputs":[{"internalType":"uint32","name":"epoch","type":"uint32"},{"internalType":"uint96","name":"balance","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620036b1380380620036b1833981810160405260208110156200003757600080fd5b505160006200004e6001600160e01b036200023d16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000a26200068e565b506040805160608082018352600080835261384060208085019182526014858701908152600a805460018101825590855286517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890910180549451925163ffffffff90811668010000000000000000810263ffffffff60401b19958316640100000000810263ffffffff60201b199690941663ffffffff19909916891795909516929092179490941617905587518581529283018590528288015293810193909352935192939290917fc01a508838d7b848b9827d7aefede67746ea1738597aa80f453c99f537ab6c49919081900360800190a36001600160a01b038216600090815260036020526040812080546001600160601b0319166b033b2e3c9fd0803ce8000000908117909155620001e891908490829081906001600160e01b036200024116565b604080516b033b2e3c9fd0803ce8000000815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050620006ae565b3390565b600062000257436001600160e01b036200051f16565b90506001600160a01b0386163014620003c75760005b6001600160a01b03871660009081526008602052604090205463ffffffff9081169082161015620002d8576001600160a01b038716600090815260066020908152604080832063ffffffff85168452909152902080546001600160801b03191690556001016200026d565b506001600160a01b038616600090815260096020526040902080546001600160601b03191690556001600160601b03831615620003a35760408051808201825263ffffffff80841682526001600160601b0380871660208085019182526001600160a01b038c16600081815260068352878120818052835287812096518754945190951664010000000002600160201b600160801b03199590961663ffffffff19948516179490941694909417909455918152600890925291902080549091166001179055620003c7565b6001600160a01b0386166000908152600860205260409020805463ffffffff191690555b6001600160a01b0385163014620005175760008463ffffffff161180156200042157506001600160a01b038516600090815260066020908152604080832063ffffffff600019890181168552925290912054828216911610155b156200047d576001600160a01b0385166000908152600660209081526040808320600019880163ffffffff16845290915290208054600160201b600160801b0319166401000000006001600160601b0385160217905562000517565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152600683528781208c87168252835287812096518754945190951664010000000002600160201b600160801b031995871663ffffffff19958616179590951694909417909555938252600890935292909220805460018801909316929091169190911790555b505050505050565b6000808083815b600a5463ffffffff82161015620005ee5760008484600a8463ffffffff16815481106200054f57fe5b60009182526020909120015463ffffffff16030290506001600160601b0381168310156200057e5750620005ee565b806001600160601b031683039250600a8263ffffffff1681548110620005a057fe5b600091825260209091200154600a805463ffffffff928316965090918416908110620005c857fe5b600091825260209091200154640100000000900463ffffffff1694505060010162000526565b506001600160601b0383166200061a57620006116001600160e01b036200065816565b63ffffffff1692505b826001600160601b031681816200062d57fe5b0482019150640100000000826001600160601b031610620006505763ffffffff91505b509392505050565b600a80546000919060001981019081106200066f57fe5b600091825260209091200154640100000000900463ffffffff16919050565b604080516060810182526000808252602082018190529181019190915290565b612ff380620006be6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806387f4427e11610130578063b88a802f116100b8578063dd62ed3e1161007c578063dd62ed3e14610751578063e7a324dc1461077f578063f1127ed814610787578063f2a60b61146107b9578063f665a206146107c157610227565b8063b88a802f1461067b578063c3cda52014610683578063c717d7be146106ca578063cc2740b71461071e578063cddfea471461072657610227565b806391f4cfba116100ff57806391f4cfba1461061157806395d89b4114610619578063a2c1cae214610621578063a9059cbb14610629578063b4b5ea571461065557610227565b806387f4427e146105785780638b028b7e1461059e5780638c4b553c146105c45780638da5cb5b1461060957610227565b806338bf3cfa116101b35780636fcfff45116101825780636fcfff451461049857806370a08231146104be57806371417b32146104e4578063782d6fe1146105265780637ecebe001461055257610227565b806338bf3cfa146104005780635481eed314610428578063587cde1e1461044c5780635c19a95c1461047257610227565b806320606b70116101fa57806320606b701461034257806323b872dd1461034a57806326e6760b14610380578063313ce5671461038857806332e2a55d146103a657610227565b806306fdde031461022c578063095ea7b3146102a95780630b7cbac7146102e957806318160ddd14610328575b600080fd5b6102346107de565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360408110156102bf57600080fd5b506001600160a01b0381351690602001356107ff565b604080519115158252519081900360200190f35b61030f600480360360208110156102ff57600080fd5b50356001600160a01b03166108bd565b6040805163ffffffff9092168252519081900360200190f35b6103306108d5565b60408051918252519081900360200190f35b6103306108e5565b6102d56004803603606081101561036057600080fd5b506001600160a01b03813581169160208101359091169060400135610900565b61030f610a45565b610390610a79565b6040805160ff9092168252519081900360200190f35b6103d8600480360360408110156103bc57600080fd5b5080356001600160a01b0316906020013563ffffffff16610a7e565b6040805163ffffffff90931683526001600160601b0390911660208301528051918290030190f35b6104266004803603602081101561041657600080fd5b50356001600160a01b0316610ab3565b005b610430610bca565b604080516001600160a01b039092168252519081900360200190f35b6104306004803603602081101561046257600080fd5b50356001600160a01b0316610bd9565b6104266004803603602081101561048857600080fd5b50356001600160a01b0316610bf4565b61030f600480360360208110156104ae57600080fd5b50356001600160a01b0316610c01565b610330600480360360208110156104d457600080fd5b50356001600160a01b0316610c19565b61050a600480360360208110156104fa57600080fd5b50356001600160a01b0316610c41565b604080516001600160601b039092168252519081900360200190f35b61050a6004803603604081101561053c57600080fd5b506001600160a01b038135169060200135610c5c565b6103306004803603602081101561056857600080fd5b50356001600160a01b0316610e89565b6104266004803603602081101561058e57600080fd5b50356001600160a01b0316610e9b565b61050a600480360360208110156105b457600080fd5b50356001600160a01b0316610f5f565b6105e1600480360360208110156105da57600080fd5b5035611425565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b61043061145d565b61030f61146c565b610234611471565b610426611490565b6102d56004803603604081101561063f57600080fd5b506001600160a01b03813516906020013561154d565b61050a6004803603602081101561066b57600080fd5b50356001600160a01b0316611589565b6104266115fa565b610426600480360360c081101561069957600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a001356116c2565b6106ed600480360360208110156106e057600080fd5b503563ffffffff16611968565b6040805163ffffffff9586168152938516602085015291841683830152909216606082015290519081900360800190f35b6105e1611a2e565b6104266004803603604081101561073c57600080fd5b5063ffffffff81358116916020013516611a9c565b6103306004803603604081101561076757600080fd5b506001600160a01b0381358116916020013516611e4b565b610330611e7f565b6103d86004803603604081101561079d57600080fd5b5080356001600160a01b0316906020013563ffffffff16611e9a565b61030f611ecf565b61030f600480360360208110156107d757600080fd5b5035611f03565b60405180604001604052806005815260200164082dcdccaf60db1b81525081565b600080600019831415610815575060001961083a565b61083783604051806060016040528060248152602001612c7460249139612025565b90505b3360008181526002602090815260408083206001600160a01b0389168085529083529281902080546001600160601b0319166001600160601b038716908117909155815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a360019150505b92915050565b60086020526000908152604090205463ffffffff1681565b6b033b2e3c9fd0803ce800000081565b604051806043612c9882396043019050604051809103902081565b6001600160a01b03831660009081526002602090815260408083203380855290835281842054825160608101909352602480845291936001600160601b039091169285926109589288929190612c7490830139612025565b9050866001600160a01b0316836001600160a01b03161415801561098557506001600160601b0382811614155b15610a2d5760006109af83836040518060600160405280603c8152602001612d01603c91396120bf565b6001600160a01b038981166000818152600260209081526040808320948a168084529482529182902080546001600160601b0319166001600160601b03871690811790915582519081529151949550929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592918290030190a3505b610a3887878361212c565b5060019695505050505050565b600a8054600091906000198101908110610a5b57fe5b600091825260209091200154600160201b900463ffffffff16919050565b601281565b600660209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b610abb612374565b6001600160a01b0316610acc61145d565b6001600160a01b031614610b27576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000546001600160a01b03828116911614610b735760405162461bcd60e51b8152600401808060200182810382526021815260200180612bd26021913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350600180546001600160a01b0319908116909155600080549091169055565b6001546001600160a01b031690565b6004602052600090815260409020546001600160a01b031681565b610bfe3382612378565b50565b60076020526000908152604090205463ffffffff1681565b6001600160a01b0381166000908152600360205260409020546001600160601b03165b919050565b6009602052600090815260409020546001600160601b031681565b6000438210610c9c5760405162461bcd60e51b8152600401808060200182810382526026815260200180612f6c6026913960400191505060405180910390fd5b6001600160a01b03831660009081526007602052604090205463ffffffff1680610cca5760009150506108b7565b6001600160a01b038416600090815260056020908152604080832063ffffffff600019860181168552925290912054168310610d46576001600160a01b03841660009081526005602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506108b7565b6001600160a01b038416600090815260056020908152604080832083805290915290205463ffffffff16831015610d815760009150506108b7565b600060001982015b8163ffffffff168163ffffffff161115610e4457600282820363ffffffff16048103610db3612b3a565b506001600160a01b038716600090815260056020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415610e1f576020015194506108b79350505050565b805163ffffffff16871115610e3657819350610e3d565b6001820392505b5050610d89565b506001600160a01b038516600090815260056020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b600b6020526000908152604090205481565b610ea3612374565b6001600160a01b0316610eb461145d565b6001600160a01b031614610f0f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fb58bcc286020502f4931905baafed22acc969c092ed724234c73361efc68839090600090a250565b6001600160a01b03811660009081526008602052604081205463ffffffff1680610f8d576000915050610c3c565b6000610f9843611f03565b905063ffffffff8116610fb057600092505050610c3c565b60001901601e63ffffffff82161015610fce57600092505050610c3c565b6001600160a01b0384166000908152600660209081526040808320838052909152902054601d1982019063ffffffff808316911611156110145760009350505050610c3c565b6001600160a01b038516600090815260066020908152604080832063ffffffff60001988018116855292529091205482821691161161105857600183039250611119565b600092600019015b8363ffffffff168163ffffffff16111561111757600284820363ffffffff1604810361108a612b3a565b506001600160a01b038716600090815260066020908152604080832063ffffffff858116855290835292819020815180830190925254808416808352600160201b9091046001600160601b03169282019290925291851614156110ef57509350611117565b805163ffffffff8086169116101561110957819550611110565b6001820392505b5050611060565b505b506000805b8363ffffffff168163ffffffff161161136b57611139612b3a565b506001600160a01b038616600090815260066020908152604080832063ffffffff8581168552908352818420825180840190935254908116808352600160201b9091046001600160601b0316928201929092529190819061119990611968565b8651939550935050505b600a5463ffffffff8416101561135b57600a5487906000906000190163ffffffff86161080156111fd5750600a8560010163ffffffff16815481106111e457fe5b60009182526020909120015463ffffffff908116908316115b1561122d57600a8560010163ffffffff168154811061121857fe5b60009182526020909120015463ffffffff1691505b8963ffffffff168763ffffffff1610801561127857506001600160a01b038c16600090815260066020908152604080832063ffffffff60018c01811685529252909120548116908316115b156112b25750506001600160a01b038a16600090815260066020908152604080832063ffffffff6001808b01821686529190935292205416905b6112d58284604051806060016040528060258152602001612b7260259139612402565b63ffffffff168463ffffffff1687602001516001600160601b0316020288019750801561130357505061135b565b600a5491925082916000190163ffffffff8616101561134e57600a8560010163ffffffff168154811061133257fe5b600091825260209091200154600160401b900463ffffffff1693505b50506001909201916111a3565b50506001909201915061111e9050565b50600061139461271083046040518060600160405280602d8152602001612bf3602d9139612025565b6001600160a01b0387166000908152600960205260409020549091506001600160601b03161561141c576114198160096000896001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160601b03166040518060600160405280602d8152602001612f92602d91396120bf565b90505b95945050505050565b600a818154811061143257fe5b60009182526020909120015463ffffffff8082169250600160201b8204811691600160401b90041683565b6000546001600160a01b031690565b601e81565b6040518060400160405280600381526020016220a72760e91b81525081565b6001546001600160a01b03166114a4612374565b6001600160a01b0316146114e95760405162461bcd60e51b815260040180806020018281038252603b815260200180612ebe603b913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60008061157283604051806060016040528060258152602001612c2060259139612025565b905061157f33858361212c565b5060019392505050565b6001600160a01b03811660009081526007602052604081205463ffffffff16806115b45760006115f3565b6001600160a01b0383166000908152600560209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03165b9392505050565b600061160533610f5f565b306000908152600360205260409020549091506001600160601b03808316911610156116465750306000908152600360205260409020546001600160601b03165b33600090815260096020908152604091829020548251606081019093526028808452611688936001600160601b039092169285929190612e9690830139612461565b33600081815260096020526040902080546001600160601b0319166001600160601b039390931692909217909155610bfe9030908361212c565b60006040518080612c9860439139604080519182900360430182208282019091526005825264082dcdccaf60db1b60209092019190915290507f391e0257b4d543b15773e628a3286600de26a9f641b419eeda8078cfc33bb10b6117246124cb565b3060405160200180858152602001848152602001838152602001826001600160a01b03166001600160a01b0316815260200194505050505060405160208183030381529060405280519060200120905060006040518080612ef9603a91396040805191829003603a0182206020808401919091526001600160a01b038c1683830152606083018b905260808084018b90528251808503909101815260a08401835280519082012061190160f01b60c085015260c2840187905260e2808501829052835180860390910181526101028501808552815191840191909120600091829052610122860180865281905260ff8c1661014287015261016286018b905261018286018a9052935191965092945091926001926101a28083019392601f198301929081900390910190855afa158015611862573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118b45760405162461bcd60e51b8152600401808060200182810382526025815260200180612e446025913960400191505060405180910390fd5b6001600160a01b0381166000908152600b6020526040902080546001810190915589146119125760405162461bcd60e51b8152600401808060200182810382526021815260200180612df06021913960400191505060405180910390fd5b874211156119515760405162461bcd60e51b8152600401808060200182810382526025815260200180612d726025913960400191505060405180910390fd5b61195b818b612378565b505050505b505050505050565b600a5460001901600080805b63ffffffff8416156119c057600a8463ffffffff168154811061199357fe5b60009182526020909120015463ffffffff908116908616106119b4576119c0565b60001990930192611974565b6119c8612b51565b600a8563ffffffff16815481106119db57fe5b600091825260209182902060408051606081018252919092015463ffffffff808216808452600160201b83048216958401869052600160401b909204169190920181905296989097509095945092505050565b6000806000611a3b612b51565b600a80546000198101908110611a4d57fe5b600091825260209182902060408051606081018252929091015463ffffffff808216808552600160201b83048216958501869052600160401b9092041692909101829052969195509350915050565b611aa4612374565b6001600160a01b0316611ab561145d565b6001600160a01b031614611b10576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60008263ffffffff1611611b6b576040805162461bcd60e51b815260206004820181905260248201527f414e4e3a3a73657445706f6368436f6e6669673a207a65726f20626c6f636b73604482015290519081900360640190fd5b6127108163ffffffff1610611bb15760405162461bcd60e51b815260040180806020018281038252602d815260200180612e69602d913960400191505060405180910390fd5b611bb9612b51565b600a80546000198101908110611bcb57fe5b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b9004909216908201529050611c17612b51565b6040518060600160405280611c2b43611f03565b63ffffffff1681526020018563ffffffff1681526020018463ffffffff168152509050806020015163ffffffff16826020015163ffffffff16141580611c855750806040015163ffffffff16826040015163ffffffff1614155b611cc05760405162461bcd60e51b8152600401808060200182810382526032815260200180612d976032913960400191505060405180910390fd5b8051825163ffffffff90811691161415611d4d57600a80548291906000198101908110611ce957fe5b60009182526020918290208351910180549284015160409094015163ffffffff1990931663ffffffff9283161767ffffffff000000001916600160201b948316949094029390931763ffffffff60401b1916600160401b9190921602179055611dd7565b600a805460018101825560009190915281517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a890910180546020840151604085015163ffffffff1990921663ffffffff9485161767ffffffff000000001916600160201b918516919091021763ffffffff60401b1916600160401b93909116929092029190911790555b805182516020808501516040808701518387015182880151835163ffffffff958616815292851695830195909552831681830152928216606084015251938116939216917fc01a508838d7b848b9827d7aefede67746ea1738597aa80f453c99f537ab6c499181900360800190a350505050565b6001600160a01b0391821660009081526002602090815260408083209390941682529190915220546001600160601b031690565b60405180603a612ef98239603a019050604051809103902081565b600560209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b600a8054600091906000198101908110611ee557fe5b600091825260209091200154600160401b900463ffffffff16919050565b6000808083815b600a5463ffffffff82161015611fca5760008484600a8463ffffffff1681548110611f3157fe5b60009182526020909120015463ffffffff16030290506001600160601b038116831015611f5e5750611fca565b806001600160601b031683039250600a8263ffffffff1681548110611f7f57fe5b600091825260209091200154600a805463ffffffff928316965090918416908110611fa657fe5b600091825260209091200154600160201b900463ffffffff16945050600101611f0a565b506001600160601b038316611fea57611fe1610a45565b63ffffffff1692505b826001600160601b03168181611ffc57fe5b0482019150600160201b826001600160601b03161061201d5763ffffffff91505b509392505050565b600081600160601b84106120b75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561207c578181015183820152602001612064565b50505050905090810190601f1680156120a95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509192915050565b6000836001600160601b0316836001600160601b0316111582906121245760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561207c578181015183820152602001612064565b505050900390565b6001600160a01b0383166121715760405162461bcd60e51b815260040180806020018281038252603b815260200180612b97603b913960400191505060405180910390fd5b6001600160a01b0382166121b65760405162461bcd60e51b8152600401808060200182810382526039815260200180612f336039913960400191505060405180910390fd5b6001600160a01b038316600090815260036020908152604091829020548251606081019093526035808452612201936001600160601b039092169285929190612d3d908301396120bf565b6001600160a01b03848116600090815260036020908152604080832080546001600160601b0319166001600160601b0396871617905592861682529082902054825160608101909352602f8084526122699491909116928592909190612c4590830139612461565b6001600160a01b0383811660008181526003602090815260409182902080546001600160601b0319166001600160601b039687161790558151948616855290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a36001600160a01b0380841660009081526004602052604080822054858416835291205461230c929182169116836124cf565b6001600160601b0381161561236f576001600160a01b03808316600081815260086020908152604080832054948816835260039091528082205492825290205461236f928692869263ffffffff909216916001600160601b039182169116612661565b505050565b3390565b6001600160a01b03808316600081815260046020818152604080842080546003845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46123fc8284836124cf565b50505050565b60008363ffffffff168363ffffffff16111582906121245760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561207c578181015183820152602001612064565b6000838301826001600160601b0380871690831610156124c25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561207c578181015183820152602001612064565b50949350505050565b4690565b816001600160a01b0316836001600160a01b0316141580156124fa57506000816001600160601b0316115b1561236f576001600160a01b038316156125b2576001600160a01b03831660009081526007602052604081205463ffffffff16908161253a576000612579565b6001600160a01b0385166000908152600560209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006125a08285604051806060016040528060278152602001612dc9602791396120bf565b90506125ae86848484612930565b5050505b6001600160a01b0382161561236f576001600160a01b03821660009081526007602052604081205463ffffffff1690816125ed57600061262c565b6001600160a01b0384166000908152600560209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006126538285604051806060016040528060268152602001612cdb60269139612461565b905061196085848484612930565b600061266c43611f03565b90506001600160a01b03861630146127e05760005b6001600160a01b03871660009081526008602052604090205463ffffffff90811690821610156126f3576001600160a01b038716600090815260066020908152604080832063ffffffff85168452909152902080546fffffffffffffffffffffffffffffffff19169055600101612681565b506001600160a01b038616600090815260096020526040902080546001600160601b03191690556001600160601b038316156127bc5760408051808201825263ffffffff80841682526001600160601b0380871660208085019182526001600160a01b038c166000818152600683528781208180528352878120965187549451909516600160201b02640100000000600160801b03199590961663ffffffff199485161794909416949094179094559181526008909252919020805490911660011790556127e0565b6001600160a01b0386166000908152600860205260409020805463ffffffff191690555b6001600160a01b03851630146119605760008463ffffffff1611801561283857506001600160a01b038516600090815260066020908152604080832063ffffffff600019890181168552925290912054828216911610155b15612892576001600160a01b0385166000908152600660209081526040808320600019880163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055611960565b60408051808201825263ffffffff92831681526001600160601b0393841660208083019182526001600160a01b0398909816600081815260068a5284812089871682528a5284812093518454935163ffffffff1994851691881691909117640100000000600160801b031916600160201b91909816029690961790925590845260089096529091208054909416600190930116919091179091555050565b600061295443604051806060016040528060338152602001612e1160339139612ae5565b905060008463ffffffff1611801561299d57506001600160a01b038516600090815260056020908152604080832063ffffffff6000198901811685529252909120548282169116145b156129f7576001600160a01b0385166000908152600560209081526040808320600019880163ffffffff16845290915290208054640100000000600160801b031916600160201b6001600160601b03851602179055612a91565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152600583528781208c871682528352878120965187549451909516600160201b02640100000000600160801b031995871663ffffffff19958616179590951694909417909555938252600790935292909220805460018801909316929091169190911790555b604080516001600160601b0380861682528416602082015281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b600081600160201b84106120b75760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561207c578181015183820152602001612064565b604080518082019091526000808252602082015290565b60408051606081018252600080825260208201819052918101919091529056fe414e4e3a3a676574486f6c64696e675265776172643a20696e76616c69642065706f636873414e4e3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207472616e736665722066726f6d20746865207a65726f20616464726573734f776e61626c653a20636f6e6669726d20616464726573732069732077726f6e67414e4e3a3a676574486f6c64696e675265776172643a2072657761726420657863656564732039362062697473414e4e3a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473414e4e3a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f7773414e4e3a3a617070726f76653a20616d6f756e7420657863656564732039362062697473454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429414e4e3a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773414e4e3a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365414e4e3a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e6365414e4e3a3a64656c656761746542795369673a207369676e61747572652065787069726564414e4e3a3a73657445706f6368436f6e6669673a20626c6f636b7320616e6420726f692073616d65206173206265666f7265414e4e3a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773414e4e3a3a64656c656761746542795369673a20696e76616c6964206e6f6e6365414e4e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473414e4e3a3a64656c656761746542795369673a20696e76616c6964207369676e6174757265414e4e3a3a73657445706f6368436f6e6669673a20726f692065786365656473206d6178206672616374696f6e414e4e3a3a636c61696d5265776172643a20696e76616c696420636c61696d656420616d6f756e744f776e61626c653a206f6e6c792074686520617574686f72697a6564206e6577206f776e65722063616e20616363657074206f776e65727368697044656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e743235362065787069727929414e4e3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207472616e7366657220746f20746865207a65726f2061646472657373414e4e3a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564414e4e3a3a676574486f6c64696e675265776172643a20696e76616c696420636c61696d656420616d6f756e74a265627a7a72315820e5d6413f6b6c25cfc8fa62f5ca311a31c2a7d724c6020ad2ecbcdb590ba7493c64736f6c6343000511003200000000000000000000000050086caf6a8b4aef941d6512ad0d2a25c48469a9

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000050086caf6a8b4aef941d6512ad0d2a25c48469a9

-----Decoded View---------------
Arg [0] : account (address): 0x50086caf6a8b4aef941d6512ad0d2a25c48469a9

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000050086caf6a8b4aef941d6512ad0d2a25c48469a9


Deployed ByteCode Sourcemap

4476:23885:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4476:23885:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4557:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4557:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9730:418;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9730:418:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6357:52;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6357:52:0;-1:-1:-1;;;;;6357:52:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;4854:48;;;:::i;:::-;;;;;;;;;;;;;;;;6670:122;;;:::i;11271:671::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11271:671:0;;;;;;;;;;;;;;;;;:::i;16665:141::-;;;:::i;4755:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6091:76;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6091:76:0;;-1:-1:-1;;;;;6091:76:0;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;6091:76:0;;;;;;;;;;;;;;;;4183:286;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4183:286:0;-1:-1:-1;;;;;4183:286:0;;:::i;:::-;;2626:105;;;:::i;:::-;;;;-1:-1:-1;;;;;2626:105:0;;;;;;;;;;;;;;5338:45;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5338:45:0;-1:-1:-1;;;;;5338:45:0;;:::i;12090:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12090:103:0;-1:-1:-1;;;;;12090:103:0;;:::i;6236:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6236:49:0;-1:-1:-1;;;;;6236:49:0;;:::i;10351:108::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10351:108:0;-1:-1:-1;;;;;10351:108:0;;:::i;6471:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6471:49:0;-1:-1:-1;;;;;6471:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;6471:49:0;;;;;;;;;;;;;;14268:1217;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14268:1217:0;;;;;;;;:::i;7084:39::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7084:39:0;-1:-1:-1;;;;;7084:39:0;;:::i;3135:207::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3135:207:0;-1:-1:-1;;;;;3135:207:0;;:::i;19304:3276::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19304:3276:0;-1:-1:-1;;;;;19304:3276:0;;:::i;6564:33::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6564:33:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2242:79;;;:::i;4968:42::-;;;:::i;4655:37::-;;;:::i;3447:309::-;;;:::i;10723:238::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10723:238:0;;;;;;;;:::i;13615:222::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13615:222:0;-1:-1:-1;;;;;13615:222:0;;:::i;22678:422::-;;;:::i;12627:787::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12627:787:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17623:511::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17623:511:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17190:254;;;:::i;15667:873::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15667:873:0;;;;;;;;;;;:::i;9210:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9210:136:0;;;;;;;;;;:::i;6886:117::-;;;:::i;5945:70::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5945:70:0;;-1:-1:-1;;;;;5945:70:0;;;;;;;;:::i;16943:129::-;;;:::i;18291:787::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18291:787:0;;:::i;4557:37::-;;;;;;;;;;;;;;-1:-1:-1;;;4557:37:0;;;;:::o;9730:418::-;9798:4;9815:13;-1:-1:-1;;9843:9:0;:21;9839:172;;;-1:-1:-1;;;9839:172:0;;;9942:57;9949:9;9942:57;;;;;;;;;;;;;;;;;:6;:57::i;:::-;9933:66;;9839:172;10034:10;10023:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;10023:31:0;;;;;;;;;;;;:40;;-1:-1:-1;;;;;;10023:40:0;-1:-1:-1;;;;;10023:40:0;;;;;;;;10081:37;;;;;;;10023:31;;10034:10;10081:37;;;;;;;;;;;10136:4;10129:11;;;9730:418;;;;;:::o;6357:52::-;;;;;;;;;;;;;;;:::o;4854:48::-;4889:13;4854:48;:::o;6670:122::-;6712:80;;;;;;;;;;;;;;;;;;6670:122;:::o;11271:671::-;-1:-1:-1;;;;;11436:15:0;;11354:4;11436:15;;;:10;:15;;;;;;;;11389:10;11436:24;;;;;;;;;;11487:57;;;;;;;;;;;;11389:10;;-1:-1:-1;;;;;11436:24:0;;;;11354:4;;11487:57;;11494:9;;11487:57;;;;;;;:6;:57::i;:::-;11471:73;;11572:3;-1:-1:-1;;;;;11561:14:0;:7;-1:-1:-1;;;;;11561:14:0;;;:48;;;;-1:-1:-1;;;;;;11579:30:0;;;;;11561:48;11557:310;;;11626:19;11648:95;11654:16;11672:6;11648:95;;;;;;;;;;;;;;;;;:5;:95::i;:::-;-1:-1:-1;;;;;11758:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;:39;;-1:-1:-1;;;;;;11758:39:0;-1:-1:-1;;;;;11758:39:0;;;;;;;;11819:36;;;;;;;11758:39;;-1:-1:-1;11758:24:0;;:15;;11819:36;;;;;;;;;11557:310;;11879:33;11895:3;11900;11905:6;11879:15;:33::i;:::-;-1:-1:-1;11930:4:0;;11271:671;-1:-1:-1;;;;;;11271:671:0:o;16665:141::-;16754:12;16767:19;;16719:13;;16754:12;-1:-1:-1;;16767:23:0;;;16754:37;;;;;;;;;;;;;;;:44;-1:-1:-1;;;16754:44:0;;;;;;-1:-1:-1;16665:141:0:o;4755:35::-;4788:2;4755:35;:::o;6091:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6091:76:0;;-1:-1:-1;;;;;6091:76:0;;:::o;4183:286::-;2463:12;:10;:12::i;:::-;-1:-1:-1;;;;;2452:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2452:23:0;;2444:68;;;;;-1:-1:-1;;;2444:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4288:6;;-1:-1:-1;;;;;4270:24:0;;;4288:6;;4270:24;4262:70;;;;-1:-1:-1;;;4262:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4385:1;4369:6;;4348:40;;-1:-1:-1;;;;;4369:6:0;;;;4348:40;;4385:1;;4348:40;-1:-1:-1;4399:19:0;:32;;-1:-1:-1;;;;;;4399:32:0;;;;;;4429:1;4442:19;;;;;;;4183:286::o;2626:105::-;2704:19;;-1:-1:-1;;;;;2704:19:0;2626:105;:::o;5338:45::-;;;;;;;;;;;;-1:-1:-1;;;;;5338:45:0;;:::o;12090:103::-;12153:32;12163:10;12175:9;12153;:32::i;:::-;12090:103;:::o;6236:49::-;;;;;;;;;;;;;;;:::o;10351:108::-;-1:-1:-1;;;;;10434:17:0;;10410:4;10434:17;;;:8;:17;;;;;;-1:-1:-1;;;;;10434:17:0;10351:108;;;;:::o;6471:49::-;;;;;;;;;;;;-1:-1:-1;;;;;6471:49:0;;:::o;14268:1217::-;14347:6;14388:12;14374:11;:26;14366:77;;;;-1:-1:-1;;;14366:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14478:23:0;;14456:19;14478:23;;;:14;:23;;;;;;;;14516:17;14512:58;;14557:1;14550:8;;;;;14512:58;-1:-1:-1;;;;;14630:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;14651:16:0;;14630:38;;;;;;;;;:48;;:63;-1:-1:-1;14626:147:0;;-1:-1:-1;;;;;14717:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;14738:16:0;;;;14717:38;;;;;;;;:44;-1:-1:-1;;;14717:44:0;;-1:-1:-1;;;;;14717:44:0;;-1:-1:-1;14710:51:0;;14626:147;-1:-1:-1;;;;;14834:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;14830:88:0;;;14905:1;14898:8;;;;;14830:88;14930:12;-1:-1:-1;;14972:16:0;;14999:428;15014:5;15006:13;;:5;:13;;;14999:428;;;15078:1;15061:13;;;15060:19;;;15052:27;;15121:20;;:::i;:::-;-1:-1:-1;;;;;;15144:20:0;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;15121:51;;;;;;;;;;;;;;;-1:-1:-1;;;15121:51:0;;;-1:-1:-1;;;;;15121:51:0;;;;;;;;;15191:27;;15187:229;;;15246:8;;;;-1:-1:-1;15239:15:0;;-1:-1:-1;;;;15239:15:0;15187:229;15280:12;;:26;;;-1:-1:-1;15276:140:0;;;15335:6;15327:14;;15276:140;;;15399:1;15390:6;:10;15382:18;;15276:140;14999:428;;;;;-1:-1:-1;;;;;;15444:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;-1:-1:-1;;;;;;;;15444:33:0;;;;;-1:-1:-1;;14268:1217:0;;;;:::o;7084:39::-;;;;;;;;;;;;;:::o;3135:207::-;2463:12;:10;:12::i;:::-;-1:-1:-1;;;;;2452:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2452:23:0;;2444:68;;;;;-1:-1:-1;;;2444:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3228:19;:39;;-1:-1:-1;;;;;;3228:39:0;-1:-1:-1;;;;;3228:39:0;;;;;;;;;;;3283:51;;3314:19;;;3283:51;;-1:-1:-1;;3283:51:0;3135:207;:::o;19304:3276::-;-1:-1:-1;;;;;19476:26:0;;19368:6;19476:26;;;:17;:26;;;;;;;;19519:19;19515:60;;19562:1;19555:8;;;;;19515:60;19587:16;19606:23;19616:12;19606:9;:23::i;:::-;19587:42;-1:-1:-1;19644:14:0;;;19640:55;;19682:1;19675:8;;;;;;19640:55;-1:-1:-1;;19719:13:0;5008:2;19747:26;;;;19743:1238;;;19797:1;19790:8;;;;;;19743:1238;-1:-1:-1;;;;;19954:23:0;;19831:24;19954:23;;;:14;:23;;;;;;;;:26;;;;;;;;:32;-1:-1:-1;;19858:26:0;;;19954:52;;;;:32;;:52;19950:101;;;20034:1;20027:8;;;;;;;19950:101;-1:-1:-1;;;;;20119:23:0;;;;;;:14;:23;;;;;;;;:70;-1:-1:-1;;20143:18:0;;20119:43;;;;;;;;;:49;:70;;;:49;;:70;20115:855;;20244:1;20227:14;:18;20210:35;;20115:855;;;20286:12;;-1:-1:-1;;20301:18:0;20375:580;20390:14;20382:22;;:5;:22;;;20375:580;;;20480:1;20454:22;;;20453:28;;;20445:36;;20531:23;;:::i;:::-;-1:-1:-1;;;;;;20557:23:0;;;;;;:14;:23;;;;;;;;:31;;;;;;;;;;;;;20531:57;;;;;;;;;;;;;;;-1:-1:-1;;;20531:57:0;;;-1:-1:-1;;;;;20531:57:0;;;;;;;;;20615:29;;;20611:141;;;-1:-1:-1;20690:6:0;-1:-1:-1;20723:5:0;;20611:141;20757:8;;:28;;;;;;;20753:183;;;20831:6;20814:23;;20753:183;;;20911:1;20902:6;:10;20894:18;;20753:183;20375:580;;;;;20115:855;;19743:1238;21036:14;;21065:1173;21093:14;21086:21;;:3;:21;;;21065:1173;;21131:23;;:::i;:::-;-1:-1:-1;;;;;;21157:23:0;;;;;;:14;:23;;;;;;;;:28;;;;;;;;;;;;21131:54;;;;;;;;;;;;;;;-1:-1:-1;;;21131:54:0;;;-1:-1:-1;;;;;21131:54:0;;;;;;;;;21157:23;;;21228:24;;:14;:24::i;:::-;21287:8;;21200:52;;-1:-1:-1;21200:52:0;-1:-1:-1;;;21310:917:0;21323:12;:19;21317:25;;;;21310:917;;;21466:12;:19;21385:9;;21370:12;;-1:-1:-1;;21466:23:0;21459:31;;;;:70;;;;;21502:12;21515:3;21521:1;21515:7;21502:21;;;;;;;;;;;;;;;;;;;:27;;;;;21494:35;;;;21459:70;21455:154;;;21562:12;21575:3;21581:1;21575:7;21562:21;;;;;;;;;;;;;;;;;;;:27;;;;-1:-1:-1;21455:154:0;21637:14;21631:20;;:3;:20;;;:70;;;;-1:-1:-1;;;;;;21663:23:0;;;;;;:14;:23;;;;;;;;:32;21693:1;21687:7;;21663:32;;;;;;;;;:38;;;21655:46;;;;21631:70;21627:205;;;-1:-1:-1;;;;;;;21734:23:0;;;;;;:14;:23;;;;;;;;:32;21764:1;21758:7;;;21734:32;;;;;;;;;;:38;;;21627:205;21897:65;21903:5;21910:10;21897:65;;;;;;;;;;;;;;;;;:5;:65::i;:::-;21869:93;;21891:3;21869:25;;21877:2;:10;;;-1:-1:-1;;;;;21869:19:0;:25;:93;21859:6;:104;21850:113;;21986:10;21982:64;;;22021:5;;;;21982:64;22112:12;:19;22077:5;;-1:-1:-1;22077:5:0;;-1:-1:-1;;22112:23:0;22105:31;;;;22101:111;;;22167:12;22180:3;22186:1;22180:7;22167:21;;;;;;;;;;;;;;;;;;;:25;-1:-1:-1;;;22167:25:0;;;;;-1:-1:-1;22101:111:0;-1:-1:-1;;21344:5:0;;;;;21310:917;;;-1:-1:-1;;21109:5:0;;;;;-1:-1:-1;21065:1173:0;;-1:-1:-1;21065:1173:0;;-1:-1:-1;22248:13:0;22264:71;22280:5;22271:6;:14;22264:71;;;;;;;;;;;;;;;;;:6;:71::i;:::-;-1:-1:-1;;;;;22395:23:0;;22421:1;22395:23;;;:14;:23;;;;;;22248:87;;-1:-1:-1;;;;;;22395:23:0;:27;22391:156;;22448:87;22454:6;22462:14;:23;22477:7;-1:-1:-1;;;;;22462:23:0;-1:-1:-1;;;;;22462:23:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22462:23:0;22448:87;;;;;;;;;;;;;;;;;:5;:87::i;:::-;22439:96;;22391:156;22566:6;19304:3276;-1:-1:-1;;;;;19304:3276:0:o;6564:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;6564:33:0;;;;;-1:-1:-1;;;6564:33:0;;;;:::o;2242:79::-;2280:7;2307:6;-1:-1:-1;;;;;2307:6:0;2242:79;:::o;4968:42::-;5008:2;4968:42;:::o;4655:37::-;;;;;;;;;;;;;;-1:-1:-1;;;4655:37:0;;;;:::o;3447:309::-;3518:19;;-1:-1:-1;;;;;3518:19:0;3502:12;:10;:12::i;:::-;-1:-1:-1;;;;;3502:35:0;;3494:107;;;;-1:-1:-1;;;3494:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:19;;;3638:6;;3617:49;;-1:-1:-1;;;;;3646:19:0;;;;3638:6;;;;3617:49;;;3686:19;;;;3677:28;;-1:-1:-1;;;;;;3677:28:0;;;-1:-1:-1;;;;;3686:19:0;;3677:28;;;;3716:32;;;3447:309::o;10723:238::-;10789:4;10806:13;10822:58;10829:9;10822:58;;;;;;;;;;;;;;;;;:6;:58::i;:::-;10806:74;;10891:40;10907:10;10919:3;10924:6;10891:15;:40::i;:::-;-1:-1:-1;10949:4:0;;10723:238;-1:-1:-1;;;10723:238:0:o;13615:222::-;-1:-1:-1;;;;;13721:23:0;;13680:6;13721:23;;;:14;:23;;;;;;;;13762:16;:67;;13828:1;13762:67;;;-1:-1:-1;;;;;13781:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;13802:16:0;;13781:38;;;;;;;;;:44;-1:-1:-1;;;13781:44:0;;-1:-1:-1;;;;;13781:44:0;13762:67;13755:74;13615:222;-1:-1:-1;;;13615:222:0:o;22678:422::-;22720:20;22743:28;22760:10;22743:16;:28::i;:::-;22803:4;22786:23;;;;:8;:23;;;;;;22720:51;;-1:-1:-1;;;;;;22786:39:0;;;:23;;:39;22782:111;;;-1:-1:-1;22875:4:0;22858:23;;;;:8;:23;;;;;;-1:-1:-1;;;;;22858:23:0;22782:111;22953:10;22938:26;;;;:14;:26;;;;;;;;;;22932:92;;;;;;;;;;;;;;-1:-1:-1;;;;;22938:26:0;;;;22966:13;;22932:92;;;;;;;:5;:92::i;:::-;22918:10;22903:26;;;;:14;:26;;;;;:121;;-1:-1:-1;;;;;;22903:121:0;-1:-1:-1;;;;;22903:121:0;;;;;;;;;;;23035:57;;23059:4;;23078:13;23035:15;:57::i;12627:787::-;12744:23;6712:80;;;;;;;;;;;;;;;;;;;12824:4;;;;;;;;;-1:-1:-1;;;12824:4:0;;;;;;;;6712:80;-1:-1:-1;12808:22:0;12832:12;:10;:12::i;:::-;12854:4;12780:80;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12780:80:0;-1:-1:-1;;;;;12780:80:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12780:80:0;;;12770:91;;;;;;12744:117;;12872:18;6932:71;;;;;;;;;;;;;;;;;;;12903:57;;;;;;;;-1:-1:-1;;;;;12903:57:0;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12903:57:0;;;;;12893:68;;;;;;-1:-1:-1;;;12999:57:0;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12999:57:0;;;;;;12989:68;;;;;;;;;-1:-1:-1;13088:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12893:68;;-1:-1:-1;12989:68:0;;-1:-1:-1;;;13088:26:0;;;;;;;12903:57;-1:-1:-1;;13088:26:0;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;13088:26:0;;-1:-1:-1;;13088:26:0;;;-1:-1:-1;;;;;;;13133:23:0;;13125:73;;;;-1:-1:-1;;;13125:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13226:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;13217:28;;13209:74;;;;-1:-1:-1;;;13209:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13309:6;13302:3;:13;;13294:63;;;;-1:-1:-1;;;13294:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13375:31;13385:9;13396;13375;:31::i;:::-;13368:38;;;;12627:787;;;;;;;:::o;17623:511::-;17766:12;:19;-1:-1:-1;;17766:23:0;17685:12;;;17858:136;17865:9;;;;17858:136;;17916:12;17929:5;17916:19;;;;;;;;;;;;;;;;;;;:25;;;;;17904:37;;;;17900:83;;17962:5;;17900:83;-1:-1:-1;;17876:7:0;;;;17858:136;;;18004:21;;:::i;:::-;18028:12;18041:5;18028:19;;;;;;;;;;;;;;;;;;;18004:43;;;;;;;;18028:19;;;;18004:43;;;;;;;;-1:-1:-1;;;18004:43:0;;;;;;;;;;-1:-1:-1;;;18004:43:0;;;;;;;;;;;17623:511;;18004:43;;-1:-1:-1;18004:43:0;;;-1:-1:-1;17623:511:0;-1:-1:-1;;;17623:511:0:o;17190:254::-;17244:12;17258:13;17273:10;17296:21;;:::i;:::-;17320:12;17333:19;;-1:-1:-1;;17333:23:0;;;17320:37;;;;;;;;;;;;;;;17296:61;;;;;;;;17320:37;;;;17296:61;;;;;;;;-1:-1:-1;;;17296:61:0;;;;;;;;;;-1:-1:-1;;;17296:61:0;;;;;;;;;;;;;;-1:-1:-1;17296:61:0;-1:-1:-1;17296:61:0;-1:-1:-1;;17190:254:0:o;15667:873::-;2463:12;:10;:12::i;:::-;-1:-1:-1;;;;;2452:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2452:23:0;;2444:68;;;;;-1:-1:-1;;;2444:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15763:1;15754:6;:10;;;15746:55;;;;;-1:-1:-1;;;15746:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15826:5;15820:3;:11;;;15812:69;;;;-1:-1:-1;;;15812:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15892:25;;:::i;:::-;15920:12;15933:19;;-1:-1:-1;;15933:23:0;;;15920:37;;;;;;;;;;;;;;;15892:65;;;;;;;;15920:37;;;;15892:65;;;;;;;-1:-1:-1;;;15892:65:0;;;;;;;;;;;-1:-1:-1;;;15892:65:0;;;;;;;;;;-1:-1:-1;15968:24:0;;:::i;:::-;15995:49;;;;;;;;16007:23;16017:12;16007:9;:23::i;:::-;15995:49;;;;;;16032:6;15995:49;;;;;;16040:3;15995:49;;;;;15968:76;;16080:5;:12;;;16063:29;;:6;:13;;;:29;;;;:56;;;;16110:5;:9;;;16096:23;;:6;:10;;;:23;;;;16063:56;16055:119;;;;-1:-1:-1;;;16055:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16278:11;;16262:12;;:27;;;;;;;16258:162;;;16306:12;16319:19;;16346:5;;16306:12;-1:-1:-1;;16319:23:0;;;16306:37;;;;;;;;;;;;;;;:45;;:37;;:45;;;;;;;;;;;-1:-1:-1;;16306:45:0;;;;;;;;-1:-1:-1;;16306:45:0;-1:-1:-1;;;16306:45:0;;;;;;;;;;;-1:-1:-1;;;;16306:45:0;-1:-1:-1;;;16306:45:0;;;;;;;;16258:162;;;16384:12;27:10:-1;;39:1;23:18;;45:23;;-1:-1;16384:24:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16384:24:0;;;;;;;;-1:-1:-1;;16384:24:0;-1:-1:-1;;;16384:24:0;;;;;;;;-1:-1:-1;;;;16384:24:0;-1:-1:-1;;;16384:24:0;;;;;;;;;;;;;;16258:162;16495:11;;16454:12;;16468:13;;;;;16483:10;;;;;16508:12;;;;16522:9;;;;16435:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2523:1;;15667:873;;:::o;9210:136::-;-1:-1:-1;;;;;9310:19:0;;;9286:4;9310:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;-1:-1:-1;;;;;9310:28:0;;9210:136::o;6886:117::-;6932:71;;;;;;;;;;;;;;;;;;6886:117;:::o;5945:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5945:70:0;;-1:-1:-1;;;;;5945:70:0;;:::o;16943:129::-;17023:12;17036:19;;16994:10;;17023:12;-1:-1:-1;;17036:23:0;;;17023:37;;;;;;;;;;;;;;;:41;-1:-1:-1;;;17023:41:0;;;;;;-1:-1:-1;16943:129:0:o;18291:787::-;18349:6;;;18439:11;18349:6;18461:365;18484:12;:19;18480:23;;;;18461:365;;;18525:18;18588:6;18579:5;18554:12;18567:1;18554:15;;;;;;;;;;;;;;;;;;;:21;;;18547:37;18546:48;;-1:-1:-1;;;;;;18613:22:0;;;;18609:68;;;18656:5;;;18609:68;18713:11;-1:-1:-1;;;;;18702:22:0;:8;:22;18691:33;;18747:12;18760:1;18747:15;;;;;;;;;;;;;;;;;;;:21;18792:12;:15;;18747:21;;;;;-1:-1:-1;18792:12:0;;:15;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;18792:22:0;;;;;-1:-1:-1;;18505:3:0;;18461:365;;;-1:-1:-1;;;;;;18842:11:0;;18838:76;;18879:23;:21;:23::i;:::-;18870:32;;;;18838:76;18958:6;-1:-1:-1;;;;;18947:17:0;:8;:17;;;;;;18932:5;:33;18924:41;;-1:-1:-1;;;18980:5:0;-1:-1:-1;;;;;18980:14:0;;18976:64;;19019:9;19011:17;;18976:64;-1:-1:-1;19064:5:0;18291:787;-1:-1:-1;;;18291:787:0:o;27667:161::-;27742:6;27780:12;-1:-1:-1;;;27769:9:0;;27761:32;;;;-1:-1:-1;;;27761:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27761:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27818:1:0;;27667:161;-1:-1:-1;;27667:161:0:o;28032:165::-;28118:6;28150:1;-1:-1:-1;;;;;28145:6:0;:1;-1:-1:-1;;;;;28145:6:0;;;28153:12;28137:29;;;;;-1:-1:-1;;;28137:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;28137:29:0;-1:-1:-1;;;28184:5:0;;;28032:165::o;23491:746::-;-1:-1:-1;;;;;23585:17:0;;23577:89;;;;-1:-1:-1;;;23577:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23685:17:0;;23677:87;;;;-1:-1:-1;;;23677:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23799:13:0;;;;;;:8;:13;;;;;;;;;;23793:85;;;;;;;;;;;;;;-1:-1:-1;;;;;23799:13:0;;;;23814:6;;23793:85;;;;;;;:5;:85::i;:::-;-1:-1:-1;;;;;23777:13:0;;;;;;;:8;:13;;;;;;;;:101;;-1:-1:-1;;;;;;23777:101:0;-1:-1:-1;;;;;23777:101:0;;;;;;23911:13;;;;;;;;;;23905:79;;;;;;;;;;;;;;23911:13;;;;;23926:6;;23905:79;;;;;;;;:5;:79::i;:::-;-1:-1:-1;;;;;23889:13:0;;;;;;;:8;:13;;;;;;;;;:95;;-1:-1:-1;;;;;;23889:95:0;-1:-1:-1;;;;;23889:95:0;;;;;;24000:26;;;;;;;;;23889:13;;24000:26;;;;;;;;;;;;;;;-1:-1:-1;;;;;24054:14:0;;;;;;;:9;:14;;;;;;;24070;;;;;;;;24039:54;;24054:14;;;;24070;24086:6;24039:14;:54::i;:::-;-1:-1:-1;;;;;24108:10:0;;;24104:126;;-1:-1:-1;;;;;24165:22:0;;;;;;;:17;:22;;;;;;;;;24189:13;;;;;:8;:13;;;;;;;24204;;;;;;24135:83;;24155:3;;24160;;24165:22;;;;;-1:-1:-1;;;;;24189:13:0;;;;24204;24135:19;:83::i;:::-;23491:746;;;:::o;747:92::-;823:10;747:92;:::o;23108:375::-;-1:-1:-1;;;;;23211:20:0;;;23185:23;23211:20;;;:9;:20;;;;;;;;;;23268:8;:19;;;;;;23298:20;;;;:32;;;-1:-1:-1;;;;;;23298:32:0;;;;;;;23348:54;;23211:20;;;;;-1:-1:-1;;;;;23268:19:0;;;;23298:32;;23211:20;;;23348:54;;23185:23;23348:54;23415:60;23430:15;23447:9;23458:16;23415:14;:60::i;:::-;23108:375;;;;:::o;27494:165::-;27580:6;27612:1;27607:6;;:1;:6;;;;27615:12;27599:29;;;;;-1:-1:-1;;;27599:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;27836:188:0;27922:6;27952:5;;;27984:12;-1:-1:-1;;;;;27976:6:0;;;;;;;;27968:29;;;;-1:-1:-1;;;27968:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;27968:29:0;-1:-1:-1;28015:1:0;27836:188;-1:-1:-1;;;;27836:188:0:o;28205:153::-;28315:9;28205:153;:::o;24245:937::-;24350:6;-1:-1:-1;;;;;24340:16:0;:6;-1:-1:-1;;;;;24340:16:0;;;:30;;;;;24369:1;24360:6;-1:-1:-1;;;;;24360:10:0;;24340:30;24336:839;;;-1:-1:-1;;;;;24391:20:0;;;24387:381;;-1:-1:-1;;;;;24451:22:0;;24432:16;24451:22;;;:14;:22;;;;;;;;;24511:13;:60;;24570:1;24511:60;;;-1:-1:-1;;;;;24527:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;24547:13:0;;24527:34;;;;;;;;;:40;-1:-1:-1;;;24527:40:0;;-1:-1:-1;;;;;24527:40:0;24511:60;24492:79;;24590:16;24609:67;24615:9;24626:6;24609:67;;;;;;;;;;;;;;;;;:5;:67::i;:::-;24590:86;;24695:57;24712:6;24720:9;24731;24742;24695:16;:57::i;:::-;24387:381;;;;-1:-1:-1;;;;;24788:20:0;;;24784:380;;-1:-1:-1;;;;;24848:22:0;;24829:16;24848:22;;;:14;:22;;;;;;;;;24908:13;:60;;24967:1;24908:60;;;-1:-1:-1;;;;;24924:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;24944:13:0;;24924:34;;;;;;;;;:40;-1:-1:-1;;;24924:40:0;;-1:-1:-1;;;;;24924:40:0;24908:60;24889:79;;24987:16;25006:66;25012:9;25023:6;25006:66;;;;;;;;;;;;;;;;;:5;:66::i;:::-;24987:85;;25091:57;25108:6;25116:9;25127;25138;25091:16;:57::i;25826:1295::-;25957:12;25972:23;25982:12;25972:9;:23::i;:::-;25957:38;-1:-1:-1;;;;;;26012:20:0;;26027:4;26012:20;26008:582;;26108:8;26103:116;-1:-1:-1;;;;;26126:22:0;;;;;;:17;:22;;;;;;;;;;26122:26;;;;26103:116;;;-1:-1:-1;;;;;26181:19:0;;;;;;:14;:19;;;;;;;;:22;;;;;;;;;;26174:29;;-1:-1:-1;;26174:29:0;;;;26150:3;26103:116;;;-1:-1:-1;;;;;;26271:19:0;;26293:1;26271:19;;;:14;:19;;;;;:23;;-1:-1:-1;;;;;;26271:23:0;;;-1:-1:-1;;;;;26359:14:0;;;26355:224;;26419:32;;;;;;;;;;;;;;-1:-1:-1;;;;;26419:32:0;;;;;;;;;;-1:-1:-1;;;;;26394:19:0;;-1:-1:-1;26394:19:0;;;:14;:19;;;;;:22;;;;;;;;:57;;;;;;;;;-1:-1:-1;;;26394:57:0;-1:-1:-1;;;;;;26394:57:0;;;;-1:-1:-1;;26394:57:0;;;;;;;;;;;;;;;26470:22;;;:17;:22;;;;;;:26;;;;;26394:57;26470:26;;;26355:224;;;-1:-1:-1;;;;;26537:22:0;;26562:1;26537:22;;;:17;:22;;;;;:26;;-1:-1:-1;;26537:26:0;;;26355:224;-1:-1:-1;;;;;26606:20:0;;26621:4;26606:20;26602:431;;26713:1;26701:9;:13;;;:66;;;;-1:-1:-1;;;;;;26718:19:0;;;;;;:14;:19;;;;;;;;:49;-1:-1:-1;;26738:13:0;;26718:34;;;;;;;;;:40;:49;;;:40;;:49;;26701:66;26697:325;;;-1:-1:-1;;;;;26788:19:0;;;;;;:14;:19;;;;;;;;-1:-1:-1;;26808:13:0;;26788:34;;;;;;;;;:55;;-1:-1:-1;;;;;;26788:55:0;-1:-1:-1;;;;;;;;26788:55:0;;;;;;26697:325;;;26917:32;;;;;;;;;;;;;;-1:-1:-1;;;;;26917:32:0;;;;;;;;;;-1:-1:-1;;;;;26884:19:0;;;;-1:-1:-1;26884:19:0;;;:14;:19;;;;;:30;;;;;;;;;;:65;;;;;;-1:-1:-1;;26884:65:0;;;;;;;;;;-1:-1:-1;;;;;;26884:65:0;-1:-1:-1;;;26884:65:0;;;;;;;;;;;;26968:22;;;:17;:22;;;;;;:38;;;;;-1:-1:-1;26993:13:0;;;26968:38;;;;;;;;-1:-1:-1;;25826:1295:0:o;25190:628::-;25308:18;25329:75;25336:12;25329:75;;;;;;;;;;;;;;;;;:6;:75::i;:::-;25308:96;;25434:1;25419:12;:16;;;:85;;;;-1:-1:-1;;;;;;25439:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;25462:16:0;;25439:40;;;;;;;;;:50;:65;;;:50;;:65;25419:85;25415:329;;;-1:-1:-1;;;;;25519:22:0;;;;;;:11;:22;;;;;;;;-1:-1:-1;;25542:16:0;;25519:40;;;;;;;;;:57;;-1:-1:-1;;;;;;25519:57:0;-1:-1:-1;;;;;;;;25519:57:0;;;;;;25415:329;;;25644:33;;;;;;;;;;;;;;-1:-1:-1;;;;;25644:33:0;;;;;;;;;;-1:-1:-1;;;;;25605:22:0;;-1:-1:-1;25605:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;;;-1:-1:-1;;;25605:72:0;-1:-1:-1;;;;;;25605:72:0;;;-1:-1:-1;;25605:72:0;;;;;;;;;;;;;;;25690:25;;;:14;:25;;;;;;;:44;;25605:72;25718:16;;25690:44;;;;;;;;;;;;;25415:329;25759:51;;;-1:-1:-1;;;;;25759:51:0;;;;;;;;;;;;;-1:-1:-1;;;;;25759:51:0;;;;;;;;;;;25190:628;;;;;:::o;27129:161::-;27204:6;27242:12;-1:-1:-1;;;27231:9:0;;27223:32;;;;-1:-1:-1;;;27223:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4476:23885:0;;;;;;;;;;-1:-1:-1;4476:23885:0;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;4476:23885:0;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://e5d6413f6b6c25cfc8fa62f5ca311a31c2a7d724c6020ad2ecbcdb590ba7493c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.