Contract 0x81859801b01764D4f0Fa5E64729f5a6C3b91435b 4

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x641e64619e75b5a7044aa32d4c41965347f26557590aaa20da578219bc58b18bApprove131120752021-12-01 20:24:4045 mins ago0x679b4172e1698579d562d1d8b4774968305b80b2 IN  Bearn.fi: BFI Token0 BNB0.0000755768
0x6d0f71f8cc5000e69d5bc0b538adf8a02434b976752a6bc19df7462eb24883b1Approve131115352021-12-01 19:57:391 hr 12 mins ago0xa91ee4b94eefdd0f4c9cd48af43c543d6c3a2819 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x72887a288b2cf460a0cd2a2404a3f1b9b71efb642751445f3accfacc1bf68d7dApprove131102562021-12-01 18:52:122 hrs 17 mins ago0x34477aaab4789f4d6407b872638469db7ecd3fa3 IN  Bearn.fi: BFI Token0 BNB0.00022226
0xc7e1ca2f9ba2d0f5611e34dc3c9f82500aea0ef913bb3179e08667bae0a37f98Approve131073072021-12-01 16:14:544 hrs 54 mins ago0xefa1031dcc1e4a7f9e401324e2d3bb6f35523423 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x4ff3e40d54d541565989e2ae3c077c34e87c9880f9daf5735fe0674acacc15e8Approve131023452021-12-01 11:36:349 hrs 33 mins ago0xc1a5e5dd17db38bf0925a0176bd7f0b8db4c4656 IN  Bearn.fi: BFI Token0 BNB0.000533424
0xa5fadaec0443fef73739a5649c41b905c281afd734021718d364fca1a7161b82Transfer131022842021-12-01 11:32:169 hrs 37 mins agoHotbit 2 IN  Bearn.fi: BFI Token0 BNB0.00106654
0x29c3063dfec1268ad03cb861f5c4c326e38e9cadf175fb2676085624e41f2581Approve130994152021-12-01 8:38:4212 hrs 30 mins ago0xc0cb29b8778afe64901e5e1e7afce767766665cc IN  Bearn.fi: BFI Token0 BNB0.00022226
0x2a5e99fdc58556be29698a06432c7b9e68c1d685b91c86f76fe263386e72a15eApprove130926052021-12-01 2:33:0618 hrs 36 mins ago0xd246519c6f11cd3aa4633068206e8c718adbaa87 IN  Bearn.fi: BFI Token0 BNB0.00022226
0xbee59c580c01a074621bfb879cb5f81421119950a3beedc351768c55825798cdApprove130862522021-11-30 21:03:551 day 5 mins ago0x5f0ff52df8df2c5351c47b6711c33f36c5402909 IN  Bearn.fi: BFI Token0 BNB0.00022226
0xe38ce4f0aad61c5cb117ca233d8d1ee09be0c07bb9c2ac6b3aea47111084019bApprove130807292021-11-30 16:20:361 day 4 hrs ago0xd15171354cdd035d9fefda2f402dbc1731676b89 IN  Bearn.fi: BFI Token0 BNB0.00022226
0xee730bb978222684c5e21111fe08e3fde64d62cbc0bff44c4818942cc72809f2Approve130744272021-11-30 10:41:081 day 10 hrs ago0x9cccbd378bb5fb7cd6514b21f99d8082715c73f6 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x3cf3b14813161c7f9130e1bb463bcbd9d8b6990a38b3690cba0d8ac4f30b4f9eTransfer130742122021-11-30 10:29:141 day 10 hrs agoHotbit 2 IN  Bearn.fi: BFI Token0 BNB0.000480159
0xb6335a5fe44933a979d9519ccbe7c22ea10fcdd13d6c8f9572e70a9bcc290a79Approve130635482021-11-30 0:53:201 day 20 hrs ago0xdde8848016f93983b7334f06c1cca4a4afcc598b IN  Bearn.fi: BFI Token0 BNB0.00022226
0xcf83237d1d4fa680242a7978cce80d4f42cdebe39514d558bbfd2c4358736624Approve130634352021-11-30 0:47:001 day 20 hrs ago0xdde8848016f93983b7334f06c1cca4a4afcc598b IN  Bearn.fi: BFI Token0 BNB0.00022226
0x42dc66fde92c749fb02ba7fbb844f3a78961b5330713b4c677af6e17e90a15daApprove130606542021-11-29 22:15:051 day 22 hrs ago0xe66292368ae9690bb4434eb83d3674e77a0e7358 IN  Bearn.fi: BFI Token0 BNB0.0000755768
0x6133a39b95afd205c8599bc01a05cf88e34cd0645dfa792d7cbda316f2645716Approve130597982021-11-29 21:30:331 day 23 hrs ago0x62c9c4db8fdb7a783be1310c8cdfbcb203f19b0f IN  Bearn.fi: BFI Token0 BNB0.00007267
0xd52f14f82d6f7dbe54035b3ace1ed6e30138a1564a1c115404d7ef8c1a8fd152Approve130578272021-11-29 19:47:042 days 1 hr ago0xe8e0ec39549e1866405567cbbd3abc71add64166 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x2992373d8a8577bc9884c33a81b270572c906c480b866396c6fc5e46c2b33ab5Approve130572612021-11-29 19:17:002 days 1 hr ago0xf25dfa49abcc51109caafe9dabda8d109804bd35 IN  Bearn.fi: BFI Token0 BNB0.00022226
0xc154049cd36be8672ade14674ab9f28d1e705470d30d5ddc5a79eeb47fc38a34Approve130503202021-11-29 12:56:042 days 8 hrs ago0x9d0de8cb6dbd08bb3541bb55886d84bf5e9076e3 IN  Bearn.fi: BFI Token0 BNB0.00022226
0xf0745b3823889418c6e019d6ebe46453902fd8c632fb7015fd079fcf2cefeaf9Approve130482822021-11-29 10:57:512 days 10 hrs ago0x8180bc73e5b972a481b383d517e351a187ec5151 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x9f4a97cc8f500667a3f9c458e5d79e2eab66cf3a9b7f21af095f0beb14acc80dApprove130446462021-11-29 7:29:392 days 13 hrs ago0xbb0ce1d03b305dc11b0a4cf32c0d8b4b22624426 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x2b01e40bcea593200a92f3c2c8a7116522f6fa04a15149f891a1f0507654cb48Approve130409002021-11-29 4:02:352 days 17 hrs ago0x42e312d0923f6af76df6ed43cf58efc708a9c3c5 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x653969ca988d32844731fa9fb831ae1d55d4a6595ef1b4ebd9346ed2fdcdaba7Approve130383152021-11-29 1:41:122 days 19 hrs ago0x0f2f86a6e66a1f60d401c5d1fdc5e750214387d4 IN  Bearn.fi: BFI Token0 BNB0.00022226
0x9e8cfd04fec70eb2740214854515eb1431b1c01085c43d3b8a6fd53635f8dd96Approve130357282021-11-28 23:22:082 days 21 hrs ago0x9d7769188057f27a75458034b374605de95f26b0 IN  Bearn.fi: BFI Token0 BNB0.00022226
0xfde18ffe0577a0a12bc4b78f8779549c6929c2679cfd7a1d302a7aacb5f65be7Approve130355652021-11-28 23:13:102 days 21 hrs ago0x8211452b8f357904aacac56d720612673ccb6b35 IN  Bearn.fi: BFI Token0 BNB0.00022226
[ Download CSV Export 

OVERVIEW

Bearn Fi is a cross-chain product in DeFi that at its core provides yield generation, casino/gaming aggregation, bridge, treasury and governance on multi-chain: Binance Smart Chain blockchain (BSC) and Ethereum blockchain.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0dd646a7781ff7a2d4a77bcb30daaa29eaca14c7e4022740740c68cc6a95cc7754713222021-03-07 11:59:03269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0x0dd646a7781ff7a2d4a77bcb30daaa29eaca14c7e4022740740c68cc6a95cc7754713222021-03-07 11:59:03269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0xe94796db2f38365ba1d366d19838b98529774f0072941d94419235d153bfd83854713202021-03-07 11:58:57269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0xe94796db2f38365ba1d366d19838b98529774f0072941d94419235d153bfd83854713202021-03-07 11:58:57269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0x86db9b80694c75a6605b938642caf2ec9920c065124d3cb225e2526fbb1354e754713172021-03-07 11:58:48269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0x86db9b80694c75a6605b938642caf2ec9920c065124d3cb225e2526fbb1354e754713172021-03-07 11:58:48269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0x32018cb3844a48c0c7dac78b76df8ebb26b03e5341f0a3e733fab243b993c6d954713172021-03-07 11:58:48269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0x32018cb3844a48c0c7dac78b76df8ebb26b03e5341f0a3e733fab243b993c6d954713172021-03-07 11:58:48269 days 9 hrs ago Bearn.fi: bVaults Bank Bearn.fi: BFI Token0 BNB
0x45fd1788bce2e77861a07a1701785fa48ad6cef35740ece301499aea99fcc1fc54713072021-03-07 11:58:18269 days 9 hrs ago 0xd75c1a91272f20aafe9627a288a6210db57d93ea Bearn.fi: BFI Token0 BNB
0x45fd1788bce2e77861a07a1701785fa48ad6cef35740ece301499aea99fcc1fc54713072021-03-07 11:58:18269 days 9 hrs ago PancakeSwap: Router Bearn.fi: BFI Token0 BNB
0x45fd1788bce2e77861a07a1701785fa48ad6cef35740ece301499aea99fcc1fc54713072021-03-07 11:58:18269 days 9 hrs ago PancakeSwap: BFI Bearn.fi: BFI Token0 BNB
0x45fd1788bce2e77861a07a1701785fa48ad6cef35740ece301499aea99fcc1fc54713072021-03-07 11:58:18269 days 9 hrs ago PancakeSwap: BFI Bearn.fi: BFI Token0 BNB
0x45fd1788bce2e77861a07a1701785fa48ad6cef35740ece301499aea99fcc1fc54713072021-03-07 11:58:18269 days 9 hrs ago PancakeSwap: Router Bearn.fi: BFI Token0 BNB
0x45fd1788bce2e77861a07a1701785fa48ad6cef35740ece301499aea99fcc1fc54713072021-03-07 11:58:18269 days 9 hrs ago 0xd75c1a91272f20aafe9627a288a6210db57d93ea Bearn.fi: BFI Token0 BNB
0x7e1344d050235689643276c5149631a6e6db7b0b34fc0c5547cd2771c3915e2354712962021-03-07 11:57:45269 days 9 hrs ago 0xd6589d508e8b81855d772038d144754546826f0d Bearn.fi: BFI Token0 BNB
0x7e1344d050235689643276c5149631a6e6db7b0b34fc0c5547cd2771c3915e2354712962021-03-07 11:57:45269 days 9 hrs ago PancakeSwap: BFI Bearn.fi: BFI Token0 BNB
0x7e1344d050235689643276c5149631a6e6db7b0b34fc0c5547cd2771c3915e2354712962021-03-07 11:57:45269 days 9 hrs ago PancakeSwap: BFI Bearn.fi: BFI Token0 BNB
0x7e1344d050235689643276c5149631a6e6db7b0b34fc0c5547cd2771c3915e2354712962021-03-07 11:57:45269 days 9 hrs ago 0xd6589d508e8b81855d772038d144754546826f0d Bearn.fi: BFI Token0 BNB
0x7bd642031730236d66a088d3664c2d11698fb677ff91ffcb21ade59bcc37b20954712942021-03-07 11:57:39269 days 9 hrs ago 0xcfcddf9c4ab9fbb90e34570b7fdd46ffa71c4992 Bearn.fi: BFI Token0 BNB
0x7bd642031730236d66a088d3664c2d11698fb677ff91ffcb21ade59bcc37b20954712942021-03-07 11:57:39269 days 9 hrs ago PancakeSwap: Router Bearn.fi: BFI Token0 BNB
0x7bd642031730236d66a088d3664c2d11698fb677ff91ffcb21ade59bcc37b20954712942021-03-07 11:57:39269 days 9 hrs ago PancakeSwap: BFI Bearn.fi: BFI Token0 BNB
0x7bd642031730236d66a088d3664c2d11698fb677ff91ffcb21ade59bcc37b20954712942021-03-07 11:57:39269 days 9 hrs ago PancakeSwap: BFI Bearn.fi: BFI Token0 BNB
0x7bd642031730236d66a088d3664c2d11698fb677ff91ffcb21ade59bcc37b20954712942021-03-07 11:57:39269 days 9 hrs ago PancakeSwap: Router Bearn.fi: BFI Token0 BNB
0x7bd642031730236d66a088d3664c2d11698fb677ff91ffcb21ade59bcc37b20954712942021-03-07 11:57:39269 days 9 hrs ago 0xcfcddf9c4ab9fbb90e34570b7fdd46ffa71c4992 Bearn.fi: BFI Token0 BNB
0xe851785a0139c906ac407fc2fc2ee886495f7e774afcc4ae124924fffc9769e854712822021-03-07 11:57:03269 days 9 hrs ago 0x01c559f75d8354d740215ebb85822be01dc6299a Bearn.fi: BFI Token0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BFI

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2020-11-23
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/*
 * @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.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// bearn.fi (BFI) with Governance Alpha
contract BFI is ERC20 {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    address public governance;
    mapping(address => bool) public minters;

    uint public cap = 210000 ether;

    // Initial emission plan:
    //
    // [1] Public fund: (57.5%)
    //   - Binance Smartchain Farming        7.5%
    //   - Binance Smartchain Vaults		20.0%
    //   - Binance Smartchain Staking Pool	25.0%
    //   - Ethereum Farming		             5.0%
    //
    // [2] Game fund: (5%)
    //   - Game Reserve                      5.0%
    //
    // [3] Community-governance fund: (20%)
    //   - Reserve                          10.0%
    //   - Treasury                         10.0%
    //
    // [4] Team fund: (17.5%)
    //   - Marketing                        10.0%
    //   - Dev                               7.5%
    address public publicFund;
    address public communityFund;
    address public teamFund;

    uint public publicFundPercent = 5750; // over 95
    uint public communityFundPercent = 2000; // over 95
    uint public teamFundPercent = 1750; // over 95

    uint public gameFundAmount = 10500 ether; // 210k * 5%

    uint public lastMinted;
    uint public constant mintingCooldownTime = 72 hours; // cant mint again less than 72 hours to avoid high aggressive emission

    event MintToFund(address indexed fund, uint amount);

    constructor () public ERC20("bearn.fi", "BFI") {
        governance = msg.sender;
        teamFund = msg.sender;

        // Pubic & community fund addresses set to deployer at start.
        // After setting up all the contracts deployer will forward funds to corresponding addresses.
        publicFund = msg.sender;
        communityFund = msg.sender;
    }

    modifier onlyGovernance() {
        require(msg.sender == governance, "!governance");
        _;
    }

    modifier checkMintedTime() {
        require(now >= lastMinted.add(mintingCooldownTime), "less than 72h");
        _;
    }

    function mint(address _to, uint _amount) public {
        require(msg.sender == governance || minters[msg.sender], "!governance && !minter");
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }

    function burn(uint _amount) public {
        _burn(msg.sender, _amount);
        _moveDelegates(_delegates[msg.sender], address(0), _amount);
    }

    function burnFrom(address _account, uint _amount) public {
        uint decreasedAllowance = allowance(_account, msg.sender).sub(_amount, "ERC20: burn amount exceeds allowance");
        _approve(_account, msg.sender, decreasedAllowance);
        _burn(_account, _amount);
        _moveDelegates(_delegates[_account], address(0), _amount);
    }

    function transfer(address recipient, uint amount) public override returns (bool) {
        _moveDelegates(_delegates[_msgSender()], _delegates[recipient], amount);
        return super.transfer(recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint amount) public override returns (bool) {
        _moveDelegates(_delegates[sender], _delegates[recipient], amount);
        return super.transferFrom(sender, recipient, amount);
    }

    function setGovernance(address _governance) external onlyGovernance {
        governance = _governance;
    }

    function addMinter(address _minter) external onlyGovernance {
        minters[_minter] = true;
    }

    function removeMinter(address _minter) external onlyGovernance {
        minters[_minter] = false;
    }

    function setCap(uint _cap) external onlyGovernance {
        require(_cap >= totalSupply(), "_cap is below current total supply");
        cap = _cap;
    }

    function setPublicFund(address _publicFund) external onlyGovernance {
        publicFund = _publicFund;
    }

    function setCommunityFund(address _communityFund) external onlyGovernance {
        communityFund = _communityFund;
    }

    function setTeamFund(address _teamFund) external onlyGovernance {
        teamFund = _teamFund;
    }

    function setSplitPercents(uint _publicFundPercent, uint _communityFundPercent, uint _teamFundPercent) external onlyGovernance {
        require(_publicFundPercent.add(_communityFundPercent).add(_teamFundPercent) == 9500, "!9500");
        publicFundPercent = _publicFundPercent;
        communityFundPercent = _communityFundPercent;
        teamFundPercent = _teamFundPercent;
    }

    function mintFunds(uint _amount) external onlyGovernance checkMintedTime {
        if (publicFundPercent > 0 && publicFund != address(0)) {
            uint _publicFundAmt = _amount.mul(publicFundPercent).div(9500);
            mint(publicFund, _publicFundAmt);
            emit MintToFund(publicFund, _publicFundAmt);
        }
        if (communityFundPercent > 0 && communityFund != address(0)) {
            uint _communityFundAmt = _amount.mul(communityFundPercent).div(9500);
            mint(communityFund, _communityFundAmt);
            emit MintToFund(communityFund, _communityFundAmt);
        }
        if (teamFundPercent > 0 && teamFund != address(0)) {
            uint _teamFundAmt = _amount.mul(teamFundPercent).div(9500);
            mint(teamFund, _teamFundAmt);
            emit MintToFund(teamFund, _teamFundAmt);
        }
        lastMinted = now;
    }

    // this could be called once!
    function mintToGameReserve(address _gameFund) external onlyGovernance {
        require(gameFundAmount > 0, "minted");
        require(_gameFund != address(0), "!_gameFund");
        mint(_gameFund, gameFundAmount);
        emit MintToFund(_gameFund, gameFundAmount);
        gameFundAmount = 0;
    }

    // This function allows governance to take unsupported tokens out of the contract.
    // This is in an effort to make someone whole, should they seriously mess up.
    // There is no guarantee governance will vote to return these.
    // It also allows for removal of airdropped tokens.
    function governanceRecoverUnsupported(IERC20 _token, address _to, uint _amount) external onlyGovernance {
        _token.safeTransfer(_to, _amount);
    }

    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - minted tokens must not cause the total supply to go over the cap.
     */
    function _beforeTokenTransfer(address from, address to, uint amount) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {// When minting tokens
            require(totalSupply().add(amount) <= cap, "ERC20Capped: cap exceeded");
        }
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

    /// @dev A record of each accounts delegate
    mapping(address => address) internal _delegates;

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

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

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

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint 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,uint nonce,uint expiry)");

    /// @dev 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 Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator)
        external
        view
        returns (address)
    {
        return _delegates[delegator];
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) external {
        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
    )
        external
    {
        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), "YAX::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "YAX::delegateBySig: invalid nonce");
        require(now <= expiry, "YAX::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 (uint)
    {
        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)
        external
        view
        returns (uint)
    {
        require(blockNumber < block.number, "YAX::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;
    }

    function _delegate(address delegator, address delegatee)
        internal
    {
        address currentDelegate = _delegates[delegator];
        uint delegatorBalance = balanceOf(delegator); // balance of underlying YAXs (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint oldVotes,
        uint newVotes
    )
        internal
    {
        uint32 blockNumber = safe32(block.number, "YAX::_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 safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2 ** 32, errorMessage);
        return uint32(n);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"value","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":"address","name":"fund","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintToFund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityFundPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameFundAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gameFund","type":"address"}],"name":"mintToGameReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingCooldownTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicFundPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_communityFund","type":"address"}],"name":"setCommunityFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_publicFund","type":"address"}],"name":"setPublicFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicFundPercent","type":"uint256"},{"internalType":"uint256","name":"_communityFundPercent","type":"uint256"},{"internalType":"uint256","name":"_teamFundPercent","type":"uint256"}],"name":"setSplitPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamFund","type":"address"}],"name":"setTeamFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFundPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6080604052692c781f708c509f400000600755611676600b556107d0600c556106d6600d5569023934c5a09da1900000600e553480156200003f57600080fd5b5060405180604001604052806008815260200167626561726e2e666960c01b8152506040518060400160405280600381526020016242464960e81b81525081600390805190602001906200009592919062000105565b508051620000ab90600490602084019062000105565b505060058054601260ff1990911617610100600160a81b0319166101003390810291909117909155600a80546001600160a01b031990811683179091556008805482168317905560098054909116909117905550620001a1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014857805160ff191683800117855562000178565b8280016001018555821562000178579182015b82811115620001785782518255916020019190600101906200015b565b50620001869291506200018a565b5090565b5b808211156200018657600081556001016200018b565b612bbb80620001b16000396000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c80636fcfff4511610167578063ab033ea9116100ce578063e7a324dc11610087578063e7a324dc1461081d578063f1127ed814610825578063f46eccc414610877578063f6383b2c1461089d578063fa724ee4146108d3578063fc9835c4146108db57610294565b8063ab033ea91461074c578063b4b5ea5714610772578063bbc19ab014610798578063c3cda520146107a0578063d33bc3c0146107e7578063dd62ed3e146107ef57610294565b806395d89b411161012057806395d89b4114610698578063983b2d56146106a05780639d5870e3146106c6578063a457c2d7146106ec578063a9059cbb14610718578063a96ff4bd1461074457610294565b80636fcfff45146105ad5780636fd10a19146105ec57806370a08231146105f4578063782d6fe11461061a57806379cc6790146106465780637ecebe001461067257610294565b806337339a161161020b578063587cde1e116101c4578063587cde1e146105055780635aa6e6751461052b5780635c19a95c14610533578063635e11d01461055957806368a18cc21461057f5780636dd9bc731461058757610294565b806337339a1614610445578063395093511461046b57806340c10f191461049757806342966c68146104c357806347786d37146104e05780635495699f146104fd57610294565b806323b872dd1161025d57806323b872dd1461039c57806326811618146103d25780633092afd5146103f1578063313ce5671461041757806331a6206514610435578063355274ea1461043d57610294565b8062f380f41461029957806306fdde03146102bd578063095ea7b31461033a57806318160ddd1461037a57806320606b7014610394575b600080fd5b6102a1610904565b604080516001600160a01b039092168252519081900360200190f35b6102c5610913565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103666004803603604081101561035057600080fd5b506001600160a01b0381351690602001356109a9565b604080519115158252519081900360200190f35b6103826109c7565b60408051918252519081900360200190f35b6103826109cd565b610366600480360360608110156103b257600080fd5b506001600160a01b038135811691602081013590911690604001356109f1565b6103ef600480360360208110156103e857600080fd5b5035610a39565b005b6103ef6004803603602081101561040757600080fd5b50356001600160a01b0316610c87565b61041f610cfa565b6040805160ff9092168252519081900360200190f35b610382610d03565b610382610d09565b6103ef6004803603602081101561045b57600080fd5b50356001600160a01b0316610d0f565b6103666004803603604081101561048157600080fd5b506001600160a01b038135169060200135610d83565b6103ef600480360360408110156104ad57600080fd5b506001600160a01b038135169060200135610dd6565b6103ef600480360360208110156104d957600080fd5b5035610e80565b6103ef600480360360208110156104f657600080fd5b5035610eb3565b6102a1610f50565b6102a16004803603602081101561051b57600080fd5b50356001600160a01b0316610f5f565b6102a1610f7d565b6103ef6004803603602081101561054957600080fd5b50356001600160a01b0316610f91565b6103ef6004803603602081101561056f57600080fd5b50356001600160a01b0316610f9b565b6102a16110b8565b6103ef6004803603602081101561059d57600080fd5b50356001600160a01b03166110c7565b6105d3600480360360208110156105c357600080fd5b50356001600160a01b031661113b565b6040805163ffffffff9092168252519081900360200190f35b610382611153565b6103826004803603602081101561060a57600080fd5b50356001600160a01b0316611159565b6103826004803603604081101561063057600080fd5b506001600160a01b038135169060200135611174565b6103ef6004803603604081101561065c57600080fd5b506001600160a01b03813516906020013561137c565b6103826004803603602081101561068857600080fd5b50356001600160a01b03166113ee565b6102c5611400565b6103ef600480360360208110156106b657600080fd5b50356001600160a01b0316611461565b6103ef600480360360208110156106dc57600080fd5b50356001600160a01b03166114d7565b6103666004803603604081101561070257600080fd5b506001600160a01b03813516906020013561154b565b6103666004803603604081101561072e57600080fd5b506001600160a01b0381351690602001356115b3565b610382611610565b6103ef6004803603602081101561076257600080fd5b50356001600160a01b0316611616565b6103826004803603602081101561078857600080fd5b50356001600160a01b0316611690565b6103826116f3565b6103ef600480360360c08110156107b657600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a001356116f9565b61038261196c565b6103826004803603604081101561080557600080fd5b506001600160a01b0381358116916020013516611973565b61038261199e565b6108576004803603604081101561083b57600080fd5b5080356001600160a01b0316906020013563ffffffff166119c2565b6040805163ffffffff909316835260208301919091528051918290030190f35b6103666004803603602081101561088d57600080fd5b50356001600160a01b03166119ef565b6103ef600480360360608110156108b357600080fd5b506001600160a01b03813581169160208101359091169060400135611a04565b610382611a6a565b6103ef600480360360608110156108f157600080fd5b5080359060208101359060400135611a70565b6009546001600160a01b031681565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561099f5780601f106109745761010080835404028352916020019161099f565b820191906000526020600020905b81548152906001019060200180831161098257829003601f168201915b5050505050905090565b60006109bd6109b6611b21565b8484611b25565b5060015b92915050565b60025490565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b03808416600090815260106020526040808220548584168352908220549192610a2692918116911684611c11565b610a31848484611d4e565b949350505050565b60055461010090046001600160a01b03163314610a8b576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600f54610a9b906203f480611dd0565b421015610adf576040805162461bcd60e51b815260206004820152600d60248201526c0d8cae6e640e8d0c2dc406e64d609b1b604482015290519081900360640190fd5b6000600b54118015610afb57506008546001600160a01b031615155b15610b6e576000610b2361251c610b1d600b5485611e2a90919063ffffffff16565b90611e83565b600854909150610b3c906001600160a01b031682610dd6565b6008546040805183815290516001600160a01b03909216916000805160206129118339815191529181900360200190a2505b6000600c54118015610b8a57506009546001600160a01b031615155b15610bf7576000610bac61251c610b1d600c5485611e2a90919063ffffffff16565b600954909150610bc5906001600160a01b031682610dd6565b6009546040805183815290516001600160a01b03909216916000805160206129118339815191529181900360200190a2505b6000600d54118015610c135750600a546001600160a01b031615155b15610c80576000610c3561251c610b1d600d5485611e2a90919063ffffffff16565b600a54909150610c4e906001600160a01b031682610dd6565b600a546040805183815290516001600160a01b03909216916000805160206129118339815191529181900360200190a2505b5042600f55565b60055461010090046001600160a01b03163314610cd9576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152600660205260409020805460ff19169055565b60055460ff1690565b600e5481565b60075481565b60055461010090046001600160a01b03163314610d61576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60006109bd610d90611b21565b84610dd18560016000610da1611b21565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611dd0565b611b25565b60055461010090046001600160a01b0316331480610e0357503360009081526006602052604090205460ff165b610e4d576040805162461bcd60e51b815260206004820152601660248201527510b3b7bb32b93730b731b29013131010b6b4b73a32b960511b604482015290519081900360640190fd5b610e578282611ec5565b6001600160a01b03808316600090815260106020526040812054610e7c921683611c11565b5050565b610e8a3382611fb5565b33600090815260106020526040812054610eb0916001600160a01b039091169083611c11565b50565b60055461010090046001600160a01b03163314610f05576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b610f0d6109c7565b811015610f4b5760405162461bcd60e51b8152600401808060200182810382526022815260200180612acc6022913960400191505060405180910390fd5b600755565b600a546001600160a01b031681565b6001600160a01b039081166000908152601060205260409020541690565b60055461010090046001600160a01b031681565b610eb033826120b1565b60055461010090046001600160a01b03163314610fed576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6000600e541161102d576040805162461bcd60e51b81526020600482015260066024820152651b5a5b9d195960d21b604482015290519081900360640190fd5b6001600160a01b038116611075576040805162461bcd60e51b815260206004820152600a6024820152690857d9d85b59519d5b9960b21b604482015290519081900360640190fd5b61108181600e54610dd6565b600e5460408051918252516001600160a01b03831691600080516020612911833981519152919081900360200190a2506000600e55565b6008546001600160a01b031681565b60055461010090046001600160a01b03163314611119576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60126020526000908152604090205463ffffffff1681565b600c5481565b6001600160a01b031660009081526020819052604090205490565b60004382106111b45760405162461bcd60e51b81526004018080602001828103825260268152602001806129756026913960400191505060405180910390fd5b6001600160a01b03831660009081526012602052604090205463ffffffff16806111e25760009150506109c1565b6001600160a01b038416600090815260116020908152604080832063ffffffff600019860181168552925290912054168310611251576001600160a01b03841660009081526011602090815260408083206000199490940163ffffffff168352929052206001015490506109c1565b6001600160a01b038416600090815260116020908152604080832083805290915290205463ffffffff1683101561128c5760009150506109c1565b600060001982015b8163ffffffff168163ffffffff16111561134557600282820363ffffffff160481036112be6128b5565b506001600160a01b038716600090815260116020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415611320576020015194506109c19350505050565b805163ffffffff168711156113375781935061133e565b6001820392505b5050611294565b506001600160a01b038516600090815260116020908152604080832063ffffffff9094168352929052206001015491505092915050565b60006113ac82604051806060016040528060248152602001612a62602491396113a58633611973565b9190612146565b90506113b9833383611b25565b6113c38383611fb5565b6001600160a01b038084166000908152601060205260408120546113e992169084611c11565b505050565b60136020526000908152604090205481565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561099f5780601f106109745761010080835404028352916020019161099f565b60055461010090046001600160a01b031633146114b3576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60055461010090046001600160a01b03163314611529576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006109bd611558611b21565b84610dd185604051806060016040528060258152602001612b616025913960016000611582611b21565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612146565b60006115ff601060006115c4611b21565b6001600160a01b0390811682526020808301939093526040918201600090812054888316825260109094529190912054918116911684611c11565b61160983836121dd565b9392505050565b600b5481565b60055461010090046001600160a01b03163314611668576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b03811660009081526012602052604081205463ffffffff16806116bb576000611609565b6001600160a01b038316600090815260116020908152604080832063ffffffff60001986011684529091529020600101549392505050565b600f5481565b60007f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f35611724610913565b805190602001206117336121f1565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401835280519085012061190160f01b6101608501526101628401829052610182808501829052835180860390910181526101a285018085528151918701919091206000918290526101c2860180865281905260ff8b166101e287015261020286018a90526102228601899052935192965090949293909260019261024280840193601f198301929081900390910190855afa158015611866573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118b85760405162461bcd60e51b81526004018080602001828103825260258152602001806129f46025913960400191505060405180910390fd5b6001600160a01b038116600090815260136020526040902080546001810190915589146119165760405162461bcd60e51b81526004018080602001828103825260218152602001806128cd6021913960400191505060405180910390fd5b874211156119555760405162461bcd60e51b8152600401808060200182810382526025815260200180612a866025913960400191505060405180910390fd5b61195f818b6120b1565b505050505b505050505050565b6203f48081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b7f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc81565b60116020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b60066020526000908152604090205460ff1681565b60055461010090046001600160a01b03163314611a56576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6113e96001600160a01b03841683836121f5565b600d5481565b60055461010090046001600160a01b03163314611ac2576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b611ad681611ad08585611dd0565b90611dd0565b61251c14611b13576040805162461bcd60e51b8152602060048201526005602482015264021393530360dc1b604482015290519081900360640190fd5b600b92909255600c55600d55565b3390565b6001600160a01b038316611b6a5760405162461bcd60e51b8152600401808060200182810382526024815260200180612b136024913960400191505060405180910390fd5b6001600160a01b038216611baf5760405162461bcd60e51b81526004018080602001828103825260228152602001806129536022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b816001600160a01b0316836001600160a01b031614158015611c335750600081115b156113e9576001600160a01b03831615611cc5576001600160a01b03831660009081526012602052604081205463ffffffff169081611c73576000611ca5565b6001600160a01b038516600090815260116020908152604080832063ffffffff60001987011684529091529020600101545b90506000611cb38285612247565b9050611cc186848484612289565b5050505b6001600160a01b038216156113e9576001600160a01b03821660009081526012602052604081205463ffffffff169081611d00576000611d32565b6001600160a01b038416600090815260116020908152604080832063ffffffff60001987011684529091529020600101545b90506000611d408285611dd0565b905061196485848484612289565b6000611d5b8484846123ee565b611dc684611d67611b21565b610dd185604051806060016040528060288152602001612a3a602891396001600160a01b038a16600090815260016020526040812090611da5611b21565b6001600160a01b031681526020810191909152604001600020549190612146565b5060019392505050565b600082820183811015611609576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611e39575060006109c1565b82820282848281611e4657fe5b04146116095760405162461bcd60e51b8152600401808060200182810382526021815260200180612a196021913960400191505060405180910390fd5b600061160983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612549565b6001600160a01b038216611f20576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611f2c600083836125ae565b600254611f399082611dd0565b6002556001600160a01b038216600090815260208190526040902054611f5f9082611dd0565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611ffa5760405162461bcd60e51b8152600401808060200182810382526021815260200180612aab6021913960400191505060405180910390fd5b612006826000836125ae565b61204381604051806060016040528060228152602001612931602291396001600160a01b0385166000908152602081905260409020549190612146565b6001600160a01b0383166000908152602081905260409020556002546120699082612247565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03808316600090815260106020526040812054909116906120d884611159565b6001600160a01b0385811660008181526010602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612140828483611c11565b50505050565b600081848411156121d55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561219a578181015183820152602001612182565b50505050905090810190601f1680156121c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006109bd6121ea611b21565b84846123ee565b4690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526113e9908490612629565b600061160983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612146565b60006122ad436040518060600160405280603381526020016129c1603391396126da565b905060008463ffffffff161180156122f657506001600160a01b038516600090815260116020908152604080832063ffffffff6000198901811685529252909120548282169116145b15612333576001600160a01b038516600090815260116020908152604080832063ffffffff600019890116845290915290206001018290556123a4565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152601184528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260129092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b6001600160a01b0383166124335760405162461bcd60e51b8152600401808060200182810382526025815260200180612aee6025913960400191505060405180910390fd5b6001600160a01b0382166124785760405162461bcd60e51b81526004018080602001828103825260238152602001806128ee6023913960400191505060405180910390fd5b6124838383836125ae565b6124c08160405180606001604052806026815260200161299b602691396001600160a01b0386166000908152602081905260409020549190612146565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546124ef9082611dd0565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081836125985760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561219a578181015183820152602001612182565b5060008385816125a457fe5b0495945050505050565b6125b98383836113e9565b6001600160a01b0383166113e9576007546125d682611ad06109c7565b11156113e9576040805162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a2063617020657863656564656400000000000000604482015290519081900360640190fd5b606061267e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127389092919063ffffffff16565b8051909150156113e95780806020019051602081101561269d57600080fd5b50516113e95760405162461bcd60e51b815260040180806020018281038252602a815260200180612b37602a913960400191505060405180910390fd5b60008164010000000084106127305760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561219a578181015183820152602001612182565b509192915050565b6060610a318484600085606061274d856128af565b61279e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127dd5780518252601f1990920191602091820191016127be565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461283f576040519150601f19603f3d011682016040523d82523d6000602084013e612844565b606091505b50915091508115612858579150610a319050565b8051156128685780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561219a578181015183820152602001612182565b3b151590565b60408051808201909152600080825260208201529056fe5941583a3a64656c656761746542795369673a20696e76616c6964206e6f6e636545524332303a207472616e7366657220746f20746865207a65726f2061646472657373f2b76740118627e112dbde17fa9e8e6103b1bf996d2a3e3b7e46e3b32bff86f445524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f20616464726573735941583a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655941583a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974735941583a3a64656c656761746542795369673a20696e76616c6964207369676e6174757265536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63655941583a3a64656c656761746542795369673a207369676e6174757265206578706972656445524332303a206275726e2066726f6d20746865207a65726f20616464726573735f6361702069732062656c6f772063757272656e7420746f74616c20737570706c7945524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122040ab9c5c4a07d7c7d1e7604acddf2c678e7cc9811ca3b09c7908f1db00a09cbc64736f6c634300060c0033

Deployed ByteCode Sourcemap

29515:15287:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30409:28;;;:::i;:::-;;;;-1:-1:-1;;;;;30409:28:0;;;;;;;;;;;;;;17027:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19133:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19133:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18102:100;;;:::i;:::-;;;;;;;;;;;;;;;;37276:119;;;:::i;32543:248::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32543:248:0;;;;;;;;;;;;;;;;;:::i;34065:893::-;;;;;;;;;;;;;;;;-1:-1:-1;34065:893:0;;:::i;:::-;;33028:106;;;;;;;;;;;;;;;;-1:-1:-1;33028:106:0;-1:-1:-1;;;;;33028:106:0;;:::i;17954:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30641:40;;;:::i;29689:30::-;;;:::i;33428:123::-;;;;;;;;;;;;;;;;-1:-1:-1;33428:123:0;-1:-1:-1;;;;;33428:123:0;;:::i;20506:218::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20506:218:0;;;;;;;;:::i;31547:242::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31547:242:0;;;;;;;;:::i;31797:150::-;;;;;;;;;;;;;;;;-1:-1:-1;31797:150:0;;:::i;33142:159::-;;;;;;;;;;;;;;;;-1:-1:-1;33142:159:0;;:::i;30444:23::-;;;:::i;38244:149::-;;;;;;;;;;;;;;;;-1:-1:-1;38244:149:0;-1:-1:-1;;;;;38244:149:0;;:::i;29609:25::-;;;:::i;38541:104::-;;;;;;;;;;;;;;;;-1:-1:-1;38541:104:0;-1:-1:-1;;;;;38541:104:0;;:::i;35001:307::-;;;;;;;;;;;;;;;;-1:-1:-1;35001:307:0;-1:-1:-1;;;;;35001:307:0;;:::i;30377:25::-;;;:::i;33559:103::-;;;;;;;;;;;;;;;;-1:-1:-1;33559:103:0;-1:-1:-1;;;;;33559:103:0;;:::i;37155:48::-;;;;;;;;;;;;;;;;-1:-1:-1;37155:48:0;-1:-1:-1;;;;;37155:48:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;30530:39;;;:::i;18265:119::-;;;;;;;;;;;;;;;;-1:-1:-1;18265:119:0;-1:-1:-1;;;;;18265:119:0;;:::i;41136:1249::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41136:1249:0;;;;;;;;:::i;31955:350::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31955:350:0;;;;;;;;:::i;37678:38::-;;;;;;;;;;;;;;;;-1:-1:-1;37678:38:0;-1:-1:-1;;;;;37678:38:0;;:::i;17229:87::-;;;:::i;32918:102::-;;;;;;;;;;;;;;;;-1:-1:-1;32918:102:0;-1:-1:-1;;;;;32918:102:0;;:::i;33309:111::-;;;;;;;;;;;;;;;;-1:-1:-1;33309:111:0;-1:-1:-1;;;;;33309:111:0;;:::i;21227:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21227:269:0;;;;;;;;:::i;32313:222::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32313:222:0;;;;;;;;:::i;30476:36::-;;;:::i;32799:111::-;;;;;;;;;;;;;;;;-1:-1:-1;32799:111:0;-1:-1:-1;;;;;32799:111:0;;:::i;40453:252::-;;;;;;;;;;;;;;;;-1:-1:-1;40453:252:0;-1:-1:-1;;;;;40453:252:0;;:::i;30703:22::-;;;:::i;39079:1173::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39079:1173:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30732:51::-;;;:::i;18835:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18835:151:0;;;;;;;;;;:::i;37489:111::-;;;:::i;37018:68::-;;;;;;;;;;;;;;;;-1:-1:-1;37018:68:0;;-1:-1:-1;;;;;37018:68:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;29641:39;;;;;;;;;;;;;;;;-1:-1:-1;29641:39:0;-1:-1:-1;;;;;29641:39:0;;:::i;35612:156::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35612:156:0;;;;;;;;;;;;;;;;;:::i;30587:34::-;;;:::i;33670:387::-;;;;;;;;;;;;;;;;-1:-1:-1;33670:387:0;;;;;;;;;;;;:::i;30409:28::-;;;-1:-1:-1;;;;;30409:28:0;;:::o;17027:83::-;17097:5;17090:12;;;;;;;;-1:-1:-1;;17090:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17064:13;;17090:12;;17097:5;;17090:12;;17097:5;17090:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17027:83;:::o;19133:169::-;19216:4;19233:39;19242:12;:10;:12::i;:::-;19256:7;19265:6;19233:8;:39::i;:::-;-1:-1:-1;19290:4:0;19133:169;;;;;:::o;18102:100::-;18182:12;;18102:100;:::o;37276:119::-;37318:77;37276:119;:::o;32543:248::-;-1:-1:-1;;;;;32670:18:0;;;32638:4;32670:18;;;:10;:18;;;;;;;32690:21;;;;;;;;;32638:4;;32655:65;;32670:18;;;;32690:21;32713:6;32655:14;:65::i;:::-;32738:45;32757:6;32765:9;32776:6;32738:18;:45::i;:::-;32731:52;32543:248;-1:-1:-1;;;;32543:248:0:o;34065:893::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;31466:10:::1;::::0;:35:::1;::::0;30775:8:::1;31466:14;:35::i;:::-;31459:3;:42;;31451:68;;;::::0;;-1:-1:-1;;;31451:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31451:68:0;;;;;;;;;;;;;::::1;;34173:1:::2;34153:17;;:21;:49;;;;-1:-1:-1::0;34178:10:0::2;::::0;-1:-1:-1;;;;;34178:10:0::2;:24:::0;::::2;34153:49;34149:249;;;34219:19;34241:40;34276:4;34241:30;34253:17;;34241:7;:11;;:30;;;;:::i;:::-;:34:::0;::::2;:40::i;:::-;34301:10;::::0;34219:62;;-1:-1:-1;34296:32:0::2;::::0;-1:-1:-1;;;;;34301:10:0::2;34219:62:::0;34296:4:::2;:32::i;:::-;34359:10;::::0;34348:38:::2;::::0;;;;;;;-1:-1:-1;;;;;34359:10:0;;::::2;::::0;-1:-1:-1;;;;;;;;;;;34348:38:0;;;;::::2;::::0;;::::2;34149:249;;34435:1;34412:20;;:24;:55;;;;-1:-1:-1::0;34440:13:0::2;::::0;-1:-1:-1;;;;;34440:13:0::2;:27:::0;::::2;34412:55;34408:273;;;34484:22;34509:43;34547:4;34509:33;34521:20;;34509:7;:11;;:33;;;;:::i;:43::-;34572:13;::::0;34484:68;;-1:-1:-1;34567:38:0::2;::::0;-1:-1:-1;;;;;34572:13:0::2;34484:68:::0;34567:4:::2;:38::i;:::-;34636:13;::::0;34625:44:::2;::::0;;;;;;;-1:-1:-1;;;;;34636:13:0;;::::2;::::0;-1:-1:-1;;;;;;;;;;;34625:44:0;;;;::::2;::::0;;::::2;34408:273;;34713:1;34695:15;;:19;:45;;;;-1:-1:-1::0;34718:8:0::2;::::0;-1:-1:-1;;;;;34718:8:0::2;:22:::0;::::2;34695:45;34691:233;;;34757:17;34777:38;34810:4;34777:28;34789:15;;34777:7;:11;;:28;;;;:::i;:38::-;34835:8;::::0;34757:58;;-1:-1:-1;34830:28:0::2;::::0;-1:-1:-1;;;;;34835:8:0::2;34757:58:::0;34830:4:::2;:28::i;:::-;34889:8;::::0;34878:34:::2;::::0;;;;;;;-1:-1:-1;;;;;34889:8:0;;::::2;::::0;-1:-1:-1;;;;;;;;;;;34878:34:0;;;;::::2;::::0;;::::2;34691:233;;-1:-1:-1::0;34947:3:0::2;34934:10;:16:::0;34065:893::o;33028:106::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33102:16:0::1;33121:5;33102:16:::0;;;:7:::1;:16;::::0;;;;:24;;-1:-1:-1;;33102:24:0::1;::::0;;33028:106::o;17954:83::-;18020:9;;;;17954:83;:::o;30641:40::-;;;;:::o;29689:30::-;;;;:::o;33428:123::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;33513:13:::1;:30:::0;;-1:-1:-1;;;;;;33513:30:0::1;-1:-1:-1::0;;;;;33513:30:0;;;::::1;::::0;;;::::1;::::0;;33428:123::o;20506:218::-;20594:4;20611:83;20620:12;:10;:12::i;:::-;20634:7;20643:50;20682:10;20643:11;:25;20655:12;:10;:12::i;:::-;-1:-1:-1;;;;;20643:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20643:25:0;;;:34;;;;;;;;;;;:38;:50::i;:::-;20611:8;:83::i;31547:242::-;31628:10;;;;;-1:-1:-1;;;;;31628:10:0;31614;:24;;:47;;-1:-1:-1;31650:10:0;31642:19;;;;:7;:19;;;;;;;;31614:47;31606:82;;;;;-1:-1:-1;;;31606:82:0;;;;;;;;;;;;-1:-1:-1;;;31606:82:0;;;;;;;;;;;;;;;31699:19;31705:3;31710:7;31699:5;:19::i;:::-;-1:-1:-1;;;;;31756:15:0;;;31752:1;31756:15;;;:10;:15;;;;;;31729:52;;31756:15;31773:7;31729:14;:52::i;:::-;31547:242;;:::o;31797:150::-;31843:26;31849:10;31861:7;31843:5;:26::i;:::-;31906:10;31895:22;;;;:10;:22;;;;;;31880:59;;-1:-1:-1;;;;;31895:22:0;;;;31931:7;31880:14;:59::i;:::-;31797:150;:::o;33142:159::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;33220:13:::1;:11;:13::i;:::-;33212:4;:21;;33204:68;;;;-1:-1:-1::0;;;33204:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33283:3;:10:::0;33142:159::o;30444:23::-;;;-1:-1:-1;;;;;30444:23:0;;:::o;38244:149::-;-1:-1:-1;;;;;38364:21:0;;;38332:7;38364:21;;;:10;:21;;;;;;;;38244:149::o;29609:25::-;;;;;;-1:-1:-1;;;;;29609:25:0;;:::o;38541:104::-;38605:32;38615:10;38627:9;38605;:32::i;35001:307::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;35107:1:::1;35090:14;;:18;35082:37;;;::::0;;-1:-1:-1;;;35082:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35082:37:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35138:23:0;::::1;35130:46;;;::::0;;-1:-1:-1;;;35130:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35130:46:0;;;;;;;;;;;;;::::1;;35187:31;35192:9;35203:14;;35187:4;:31::i;:::-;35256:14;::::0;35234:37:::1;::::0;;;;;;-1:-1:-1;;;;;35234:37:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;35234:37:0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;35299:1:0::1;35282:14;:18:::0;35001:307::o;30377:25::-;;;-1:-1:-1;;;;;30377:25:0;;:::o;33559:103::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;33634:8:::1;:20:::0;;-1:-1:-1;;;;;;33634:20:0::1;-1:-1:-1::0;;;;;33634:20:0;;;::::1;::::0;;;::::1;::::0;;33559:103::o;37155:48::-;;;;;;;;;;;;;;;:::o;30530:39::-;;;;:::o;18265:119::-;-1:-1:-1;;;;;18358:18:0;18331:7;18358:18;;;;;;;;;;;;18265:119::o;41136:1249::-;41244:4;41288:12;41274:11;:26;41266:77;;;;-1:-1:-1;;;41266:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41378:23:0;;41356:19;41378:23;;;:14;:23;;;;;;;;41416:17;41412:58;;41457:1;41450:8;;;;;41412:58;-1:-1:-1;;;;;41530:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;41551:16:0;;41530:38;;;;;;;;;:48;;:63;-1:-1:-1;41526:147:0;;-1:-1:-1;;;;;41617:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;41638:16:0;;;;41617:38;;;;;;;;41653:1;41617:44;;;-1:-1:-1;41610:51:0;;41526:147;-1:-1:-1;;;;;41734:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;41730:88:0;;;41805:1;41798:8;;;;;41730:88;41830:12;-1:-1:-1;;41872:16:0;;41899:428;41914:5;41906:13;;:5;:13;;;41899:428;;;41978:1;41961:13;;;41960:19;;;41952:27;;42021:20;;:::i;:::-;-1:-1:-1;;;;;;42044:20:0;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;42021:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42091:27;;42087:229;;;42146:8;;;;-1:-1:-1;42139:15:0;;-1:-1:-1;;;;42139:15:0;42087:229;42180:12;;:26;;;-1:-1:-1;42176:140:0;;;42235:6;42227:14;;42176:140;;;42299:1;42290:6;:10;42282:18;;42176:140;41899:428;;;;;-1:-1:-1;;;;;;42344:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;41136:1249:0;;;;:::o;31955:350::-;32023:23;32049:84;32085:7;32049:84;;;;;;;;;;;;;;;;;:31;32059:8;32069:10;32049:9;:31::i;:::-;:35;:84;:35;:84::i;:::-;32023:110;;32144:50;32153:8;32163:10;32175:18;32144:8;:50::i;:::-;32205:24;32211:8;32221:7;32205:5;:24::i;:::-;-1:-1:-1;;;;;32255:20:0;;;;;;;:10;:20;;;;;;32240:57;;32255:20;;32289:7;32240:14;:57::i;:::-;31955:350;;;:::o;37678:38::-;;;;;;;;;;;;;:::o;17229:87::-;17301:7;17294:14;;;;;;;;-1:-1:-1;;17294:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17268:13;;17294:14;;17301:7;;17294:14;;17301:7;17294:14;;;;;;;;;;;;;;;;;;;;;;;;32918:102;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32989:16:0::1;;::::0;;;:7:::1;:16;::::0;;;;:23;;-1:-1:-1;;32989:23:0::1;33008:4;32989:23;::::0;;32918:102::o;33309:111::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;33388:10:::1;:24:::0;;-1:-1:-1;;;;;;33388:24:0::1;-1:-1:-1::0;;;;;33388:24:0;;;::::1;::::0;;;::::1;::::0;;33309:111::o;21227:269::-;21320:4;21337:129;21346:12;:10;:12::i;:::-;21360:7;21369:96;21408:15;21369:96;;;;;;;;;;;;;;;;;:11;:25;21381:12;:10;:12::i;:::-;-1:-1:-1;;;;;21369:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21369:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;32313:222::-;32388:4;32405:71;32420:10;:24;32431:12;:10;:12::i;:::-;-1:-1:-1;;;;;32420:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;32420:24:0;;;;32446:21;;;;;:10;:21;;;;;;;;32420:24;;;;32446:21;32469:6;32405:14;:71::i;:::-;32494:33;32509:9;32520:6;32494:14;:33::i;:::-;32487:40;32313:222;-1:-1:-1;;;32313:222:0:o;30476:36::-;;;;:::o;32799:111::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;32878:10:::1;:24:::0;;-1:-1:-1;;;;;32878:24:0;;::::1;;;-1:-1:-1::0;;;;;;32878:24:0;;::::1;::::0;;;::::1;::::0;;32799:111::o;40453:252::-;-1:-1:-1;;;;;40589:23:0;;40545:4;40589:23;;;:14;:23;;;;;;;;40630:16;:67;;40696:1;40630:67;;;-1:-1:-1;;;;;40649:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;40670:16:0;;40649:38;;;;;;;;40685:1;40649:44;;40623:74;40453:252;-1:-1:-1;;;40453:252:0:o;30703:22::-;;;;:::o;39079:1173::-;39272:23;37318:77;39401:6;:4;:6::i;:::-;39385:24;;;;;;39428:12;:10;:12::i;:::-;39322:165;;;;;;;;;;;;;;;;;;;;;;;;;39467:4;39322:165;;;;;;;;;;;;;;;;;;;;;;;39298:200;;;;;;37535:65;39556:140;;;;-1:-1:-1;;;;;39556:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39532:175;;;;;;-1:-1:-1;;;39761:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39737:158;;;;;;;;;-1:-1:-1;39926:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39298:200;;-1:-1:-1;39532:175:0;;39737:158;;-1:-1:-1;;39926:26:0;;;;;;;-1:-1:-1;;39926:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39926:26:0;;-1:-1:-1;;39926:26:0;;;-1:-1:-1;;;;;;;39971:23:0;;39963:73;;;;-1:-1:-1;;;39963:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40064:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;40055:28;;40047:74;;;;-1:-1:-1;;;40047:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40147:6;40140:3;:13;;40132:63;;;;-1:-1:-1;;;40132:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40213:31;40223:9;40234;40213;:31::i;:::-;40206:38;;;;39079:1173;;;;;;;:::o;30732:51::-;30775:8;30732:51;:::o;18835:151::-;-1:-1:-1;;;;;18951:18:0;;;18924:7;18951:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18835:151::o;37489:111::-;37535:65;37489:111;:::o;37018:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29641:39::-;;;;;;;;;;;;;;;:::o;35612:156::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;35727:33:::1;-1:-1:-1::0;;;;;35727:19:0;::::1;35747:3:::0;35752:7;35727:19:::1;:33::i;30587:34::-:0;;;;:::o;33670:387::-;31359:10;;;;;-1:-1:-1;;;;;31359:10:0;31345;:24;31337:48;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;-1:-1:-1;;;31337:48:0;;;;;;;;;;;;;;;33815:67:::1;33865:16:::0;33815:45:::1;:18:::0;33838:21;33815:22:::1;:45::i;:::-;:49:::0;::::1;:67::i;:::-;33886:4;33815:75;33807:93;;;::::0;;-1:-1:-1;;;33807:93:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33807:93:0;;;;;;;;;;;;;::::1;;33911:17;:38:::0;;;;33960:20:::1;:44:::0;34015:15:::1;:34:::0;33670:387::o;605:106::-;693:10;605:106;:::o;24372:346::-;-1:-1:-1;;;;;24474:19:0;;24466:68;;;;-1:-1:-1;;;24466:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24553:21:0;;24545:68;;;;-1:-1:-1;;;24545:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24626:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24678:32;;;;;;;;;;;;;;;;;24372:346;;;:::o;42835:932::-;42938:6;-1:-1:-1;;;;;42928:16:0;:6;-1:-1:-1;;;;;42928:16:0;;;:30;;;;;42957:1;42948:6;:10;42928:30;42924:836;;;-1:-1:-1;;;;;42979:20:0;;;42975:379;;-1:-1:-1;;;;;43087:22:0;;43068:16;43087:22;;;:14;:22;;;;;;;;;43145:13;:60;;43204:1;43145:60;;;-1:-1:-1;;;;;43161:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;43181:13:0;;43161:34;;;;;;;;43193:1;43161:40;;43145:60;43128:77;-1:-1:-1;43224:14:0;43241:21;43128:77;43255:6;43241:13;:21::i;:::-;43224:38;;43281:57;43298:6;43306:9;43317;43328;43281:16;:57::i;:::-;42975:379;;;;-1:-1:-1;;;;;43374:20:0;;;43370:379;;-1:-1:-1;;;;;43482:22:0;;43463:16;43482:22;;;:14;:22;;;;;;;;;43540:13;:60;;43599:1;43540:60;;;-1:-1:-1;;;;;43556:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;43576:13:0;;43556:34;;;;;;;;43588:1;43556:40;;43540:60;43523:77;-1:-1:-1;43619:14:0;43636:21;43523:77;43650:6;43636:13;:21::i;:::-;43619:38;;43676:57;43693:6;43701:9;43712;43723;43676:16;:57::i;19776:321::-;19882:4;19899:36;19909:6;19917:9;19928:6;19899:9;:36::i;:::-;19946:121;19955:6;19963:12;:10;:12::i;:::-;19977:89;20015:6;19977:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19977:19:0;;;;;;:11;:19;;;;;;19997:12;:10;:12::i;:::-;-1:-1:-1;;;;;19977:33:0;;;;;;;;;;;;-1:-1:-1;19977:33:0;;;:89;:37;:89::i;19946:121::-;-1:-1:-1;20085:4:0;19776:321;;;;;:::o;4512:181::-;4570:7;4602:5;;;4626:6;;;;4618:46;;;;;-1:-1:-1;;;4618:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5866:471;5924:7;6169:6;6165:47;;-1:-1:-1;6199:1:0;6192:8;;6165:47;6236:5;;;6240:1;6236;:5;:1;6260:5;;;;;:10;6252:56;;;;-1:-1:-1;;;6252:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6813:132;6871:7;6898:39;6902:1;6905;6898:39;;;;;;;;;;;;;;;;;:3;:39::i;22806:378::-;-1:-1:-1;;;;;22890:21:0;;22882:65;;;;;-1:-1:-1;;;22882:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22960:49;22989:1;22993:7;23002:6;22960:20;:49::i;:::-;23037:12;;:24;;23054:6;23037:16;:24::i;:::-;23022:12;:39;-1:-1:-1;;;;;23093:18:0;;:9;:18;;;;;;;;;;;:30;;23116:6;23093:22;:30::i;:::-;-1:-1:-1;;;;;23072:18:0;;:9;:18;;;;;;;;;;;:51;;;;23139:37;;;;;;;23072:18;;:9;;23139:37;;;;;;;;;;22806:378;;:::o;23516:418::-;-1:-1:-1;;;;;23600:21:0;;23592:67;;;;-1:-1:-1;;;23592:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23672:49;23693:7;23710:1;23714:6;23672:20;:49::i;:::-;23755:68;23778:6;23755:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23755:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;23734:18:0;;:9;:18;;;;;;;;;;:89;23849:12;;:24;;23866:6;23849:16;:24::i;:::-;23834:12;:39;23889:37;;;;;;;;23915:1;;-1:-1:-1;;;;;23889:37:0;;;;;;;;;;;;23516:418;;:::o;42393:434::-;-1:-1:-1;;;;;42510:21:0;;;42484:23;42510:21;;;:10;:21;;;;;;;;;;42566:20;42521:9;42566;:20::i;:::-;-1:-1:-1;;;;;42641:21:0;;;;;;;:10;:21;;;;;;:33;;-1:-1:-1;;;;;;42641:33:0;;;;;;;;;;42692:54;;42542:44;;-1:-1:-1;42641:33:0;42692:54;;;;;;42641:21;42692:54;42759:60;42774:15;42791:9;42802:16;42759:14;:60::i;:::-;42393:434;;;;:::o;5415:192::-;5501:7;5537:12;5529:6;;;;5521:29;;;;-1:-1:-1;;;5521:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5573:5:0;;;5415:192::o;18597:175::-;18683:4;18700:42;18710:12;:10;:12::i;:::-;18724:9;18735:6;18700:9;:42::i;44651:148::-;44757:9;44651:148;:::o;26401:177::-;26511:58;;;-1:-1:-1;;;;;26511:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26511:58:0;-1:-1:-1;;;26511:58:0;;;26484:86;;26504:5;;26484:19;:86::i;4976:136::-;5034:7;5061:43;5065:1;5068;5061:43;;;;;;;;;;;;;;;;;:3;:43::i;43775:697::-;43948:18;43969:75;43976:12;43969:75;;;;;;;;;;;;;;;;;:6;:75::i;:::-;43948:96;;44076:1;44061:12;:16;;;:85;;;;-1:-1:-1;;;;;;44081:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;44104:16:0;;44081:40;;;;;;;;;:50;:65;;;:50;;:65;44061:85;44057:339;;;-1:-1:-1;;;;;44163:22:0;;;;;;:11;:22;;;;;;;;:40;-1:-1:-1;;44186:16:0;;44163:40;;;;;;;;44201:1;44163:46;:57;;;44057:339;;;44292:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44253:22:0;;-1:-1:-1;44253:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;-1:-1:-1;;44253:72:0;;;;;;;;;;;;;44340:25;;;:14;:25;;;;;;:44;;44368:16;;;44340:44;;;;;;;;;;44057:339;44413:51;;;;;;;;;;;;;;-1:-1:-1;;;;;44413:51:0;;;;;;;;;;;43775:697;;;;;:::o;21986:539::-;-1:-1:-1;;;;;22092:20:0;;22084:70;;;;-1:-1:-1;;;22084:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22173:23:0;;22165:71;;;;-1:-1:-1;;;22165:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22249:47;22270:6;22278:9;22289:6;22249:20;:47::i;:::-;22329:71;22351:6;22329:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22329:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22309:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22434:20;;;;;;;:32;;22459:6;22434:24;:32::i;:::-;-1:-1:-1;;;;;22411:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22482:35;;;;;;;22411:20;;22482:35;;;;;;;;;;;;;21986:539;;;:::o;7441:278::-;7527:7;7562:12;7555:5;7547:28;;;;-1:-1:-1;;;7547:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7586:9;7602:1;7598;:5;;;;;;;7441:278;-1:-1:-1;;;;;7441:278:0:o;35955:313::-;36061:44;36088:4;36094:2;36098:6;36061:26;:44::i;:::-;-1:-1:-1;;;;;36122:18:0;;36118:143;;36216:3;;36187:25;36205:6;36187:13;:11;:13::i;:25::-;:32;;36179:70;;;;;-1:-1:-1;;;36179:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28706:761;29130:23;29156:69;29184:4;29156:69;;;;;;;;;;;;;;;;;29164:5;-1:-1:-1;;;;;29156:27:0;;;:69;;;;;:::i;:::-;29240:17;;29130:95;;-1:-1:-1;29240:21:0;29236:224;;29382:10;29371:30;;;;;;;;;;;;;;;-1:-1:-1;29371:30:0;29363:85;;;;-1:-1:-1;;;29363:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44480:163;44555:6;44595:12;44586:7;44582:11;;44574:34;;;;-1:-1:-1;;;44574:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44633:1:0;;44480:163;-1:-1:-1;;44480:163:0:o;12571:196::-;12674:12;12706:53;12729:6;12737:4;12743:1;12746:12;14078;14111:18;14122:6;14111:10;:18::i;:::-;14103:60;;;;;-1:-1:-1;;;14103:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14237:12;14251:23;14278:6;-1:-1:-1;;;;;14278:11:0;14298:8;14309:4;14278:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14278:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14236:78;;;;14329:7;14325:595;;;14360:10;-1:-1:-1;14353:17:0;;-1:-1:-1;14353:17:0;14325:595;14474:17;;:21;14470:439;;14737:10;14731:17;14798:15;14785:10;14781:2;14777:19;14770:44;14685:148;14873:20;;-1:-1:-1;;;14873:20:0;;;;;;;;;;;;;;;;;14880:12;;14873:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9653:422;10020:20;10059:8;;;9653:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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