Token ArtWallet

 

Overview ERC-20

Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
170,010,526.040744 1ART

Holders:
911 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

OneArt is building a scalable ecosystem of NFT related products connecting blockchains together in one place.

Market

Volume (24H):$65,150.00
Market Capitalization:$2,224,797.00
Circulating Supply:131,683,154.00 1ART
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ArtWallet

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-24
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @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);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.8.0;




/**
 * @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 Contracts guidelines: functions revert
 * instead 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, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        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] + 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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` 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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(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 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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol



pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

// File: contracts/1ART/1ART.sol


pragma solidity ^0.8.0;




/**
 * @dev {ERC20} token, including:
 *
 *  - Preminted initial supply
 *  - Ability for holders to burn (destroy) their tokens
 *
 * This contract uses {ERC20Burnable} to include burn capabilities - head to
 * its documentation for details.
 *
 */
contract ArtWallet is ERC20Burnable, Ownable {
    using SafeMath for uint256;

    event MinterAdded(address minter);
    event MinterRemoved(address minter);

    mapping(address => bool) private minters;
    address[] private mintersList;

    uint256 public maxSupply = 1_000_000_000e18;

    constructor() ERC20("ArtWallet", "1ART") {
        minters[msg.sender] = true;
    }

    /**
     * @dev allows access only for minters
     */
    modifier onlyMinter() {
        require(minters[msg.sender], "Access denied");
        _;
    }

    /**
     * @dev get all minters.
     */
    function getMinters() external view returns (address[] memory) {
        return mintersList;
    }

    /**
     * @dev Burns forever tokens by owner, these tokens couldn't be re-minted
     */
    function burnForever(uint256 _amount) public onlyOwner {
        maxSupply = maxSupply.sub(_amount);
        _burn(msg.sender, _amount);
    }

    /**
     * @dev Decrease maxSupply by owner
     */
    function decreaseMaxSupply(uint256 _amount) public onlyOwner {
        require(maxSupply.add(_amount) <= totalSupply());
        maxSupply = maxSupply.sub(_amount);
    }

    /**
     * @dev Mints tokens to specified address by Maintainer, total supply is limited by maxSupply
     */
    function mint(address account, uint256 _amount) public onlyMinter {
        require(totalSupply().add(_amount) <= maxSupply);
        _mint(account, _amount);
    }

    /**
     * @dev add new minter. Only owner can call.
     */
    function addMinter(address minter) external onlyOwner {
        require(!minters[minter], "Already minter");
        minters[minter] = true;
        mintersList.push(minter);
        emit MinterAdded(minter);
    }

    /**
     * @dev remove minter. Only owner can call.
     */
    function removeMinter(address minter) external onlyOwner {
        require(minters[minter], "Not minter");
        minters[minter] = false;
        for (uint256 i = 0; i < mintersList.length; i++) {
            if (mintersList[i] == minter) {
                mintersList[i] = mintersList[mintersList.length - 1];
                mintersList.pop();
            }
        }
        emit MinterRemoved(minter);
    }
}

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":false,"internalType":"address","name":"minter","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"uint256","name":"_amount","type":"uint256"}],"name":"burnForever","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526b033b2e3c9fd0803ce80000006008553480156200002157600080fd5b506040518060400160405280600981526020017f41727457616c6c657400000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f31415254000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000a69291906200020e565b508060049080519060200190620000bf9291906200020e565b505050620000e2620000d66200014060201b60201c565b6200014860201b60201c565b6001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000323565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021c90620002be565b90600052602060002090601f0160209004810192826200024057600085556200028c565b82601f106200025b57805160ff19168380011785556200028c565b828001600101855582156200028c579182015b828111156200028b5782518255916020019190600101906200026e565b5b5090506200029b91906200029f565b5090565b5b80821115620002ba576000816000905550600101620002a0565b5090565b60006002820490506001821680620002d757607f821691505b60208210811415620002ee57620002ed620002f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612a4880620003336000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063a457c2d71161007c578063a457c2d714610378578063a9059cbb146103a8578063d31b3b96146103d8578063d5abeb01146103f4578063dd62ed3e14610412578063f2fde38b146104425761014d565b8063715018a6146102de57806379cc6790146102e85780638da5cb5b1461030457806391ff4a731461032257806395d89b411461033e578063983b2d561461035c5761014d565b8063313ce56711610115578063313ce5671461020a578063395093511461022857806340c10f191461025857806342966c68146102745780636b32810b1461029057806370a08231146102ae5761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be5780633092afd5146101ee575b600080fd5b61015a61045e565b60405161016791906120a6565b60405180910390f35b61018a60048036038101906101859190611cb7565b6104f0565b604051610197919061208b565b60405180910390f35b6101a861050e565b6040516101b591906122c8565b60405180910390f35b6101d860048036038101906101d39190611c64565b610518565b6040516101e5919061208b565b60405180910390f35b61020860048036038101906102039190611bf7565b610610565b005b610212610934565b60405161021f91906122e3565b60405180910390f35b610242600480360381019061023d9190611cb7565b61093d565b60405161024f919061208b565b60405180910390f35b610272600480360381019061026d9190611cb7565b6109e9565b005b61028e60048036038101906102899190611cf7565b610aab565b005b610298610abf565b6040516102a59190612069565b60405180910390f35b6102c860048036038101906102c39190611bf7565b610b4d565b6040516102d591906122c8565b60405180910390f35b6102e6610b95565b005b61030260048036038101906102fd9190611cb7565b610c1d565b005b61030c610c98565b604051610319919061204e565b60405180910390f35b61033c60048036038101906103379190611cf7565b610cc2565b005b610346610d84565b60405161035391906120a6565b60405180910390f35b61037660048036038101906103719190611bf7565b610e16565b005b610392600480360381019061038d9190611cb7565b611014565b60405161039f919061208b565b60405180910390f35b6103c260048036038101906103bd9190611cb7565b6110ff565b6040516103cf919061208b565b60405180910390f35b6103f260048036038101906103ed9190611cf7565b61111d565b005b6103fc6111c1565b60405161040991906122c8565b60405180910390f35b61042c60048036038101906104279190611c24565b6111c7565b60405161043991906122c8565b60405180910390f35b61045c60048036038101906104579190611bf7565b61124e565b005b60606003805461046d90612465565b80601f016020809104026020016040519081016040528092919081815260200182805461049990612465565b80156104e65780601f106104bb576101008083540402835291602001916104e6565b820191906000526020600020905b8154815290600101906020018083116104c957829003601f168201915b5050505050905090565b60006105046104fd611346565b848461134e565b6001905092915050565b6000600254905090565b6000610525848484611519565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610570611346565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156105f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e7906121a8565b60405180910390fd5b610604856105fc611346565b85840361134e565b60019150509392505050565b610618611346565b73ffffffffffffffffffffffffffffffffffffffff16610636610c98565b73ffffffffffffffffffffffffffffffffffffffff161461068c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610683906121c8565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070f90612188565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b6007805490508110156108f9578173ffffffffffffffffffffffffffffffffffffffff16600782815481106107ab576107aa61256d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108e6576007600160078054905061080691906123a9565b815481106108175761081661256d565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600782815481106108565761085561256d565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060078054806108b0576108af61253e565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b80806108f190612497565b915050610773565b507fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669281604051610929919061204e565b60405180910390a150565b60006012905090565b60006109df61094a611346565b848460016000610958611346565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109da9190612353565b61134e565b6001905092915050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90612268565b60405180910390fd5b600854610a9282610a8461050e565b61179a90919063ffffffff16565b1115610a9d57600080fd5b610aa782826117b0565b5050565b610abc610ab6611346565b82611910565b50565b60606007805480602002602001604051908101604052809291908181526020018280548015610b4357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610af9575b5050505050905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b9d611346565b73ffffffffffffffffffffffffffffffffffffffff16610bbb610c98565b73ffffffffffffffffffffffffffffffffffffffff1614610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c08906121c8565b60405180910390fd5b610c1b6000611ae7565b565b6000610c3083610c2b611346565b6111c7565b905081811015610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c906121e8565b60405180910390fd5b610c8983610c81611346565b84840361134e565b610c938383611910565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cca611346565b73ffffffffffffffffffffffffffffffffffffffff16610ce8610c98565b73ffffffffffffffffffffffffffffffffffffffff1614610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906121c8565b60405180910390fd5b610d4661050e565b610d5b8260085461179a90919063ffffffff16565b1115610d6657600080fd5b610d7b81600854611bad90919063ffffffff16565b60088190555050565b606060048054610d9390612465565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbf90612465565b8015610e0c5780601f10610de157610100808354040283529160200191610e0c565b820191906000526020600020905b815481529060010190602001808311610def57829003601f168201915b5050505050905090565b610e1e611346565b73ffffffffffffffffffffffffffffffffffffffff16610e3c610c98565b73ffffffffffffffffffffffffffffffffffffffff1614610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e89906121c8565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690612168565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506007819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f681604051611009919061204e565b60405180910390a150565b60008060016000611023611346565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790612288565b60405180910390fd5b6110f46110eb611346565b8585840361134e565b600191505092915050565b600061111361110c611346565b8484611519565b6001905092915050565b611125611346565b73ffffffffffffffffffffffffffffffffffffffff16611143610c98565b73ffffffffffffffffffffffffffffffffffffffff1614611199576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611190906121c8565b60405180910390fd5b6111ae81600854611bad90919063ffffffff16565b6008819055506111be3382611910565b50565b60085481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611256611346565b73ffffffffffffffffffffffffffffffffffffffff16611274610c98565b73ffffffffffffffffffffffffffffffffffffffff16146112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c1906121c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190612108565b60405180910390fd5b61134381611ae7565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590612248565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561142e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142590612128565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161150c91906122c8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090612228565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f0906120c8565b60405180910390fd5b611604838383611bc3565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190612148565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461171d9190612353565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161178191906122c8565b60405180910390a3611794848484611bc8565b50505050565b600081836117a89190612353565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611817906122a8565b60405180910390fd5b61182c60008383611bc3565b806002600082825461183e9190612353565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118939190612353565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118f891906122c8565b60405180910390a361190c60008383611bc8565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197790612208565b60405180910390fd5b61198c82600083611bc3565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a09906120e8565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611a6991906123a9565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ace91906122c8565b60405180910390a3611ae283600084611bc8565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611bbb91906123a9565b905092915050565b505050565b505050565b600081359050611bdc816129e4565b92915050565b600081359050611bf1816129fb565b92915050565b600060208284031215611c0d57611c0c61259c565b5b6000611c1b84828501611bcd565b91505092915050565b60008060408385031215611c3b57611c3a61259c565b5b6000611c4985828601611bcd565b9250506020611c5a85828601611bcd565b9150509250929050565b600080600060608486031215611c7d57611c7c61259c565b5b6000611c8b86828701611bcd565b9350506020611c9c86828701611bcd565b9250506040611cad86828701611be2565b9150509250925092565b60008060408385031215611cce57611ccd61259c565b5b6000611cdc85828601611bcd565b9250506020611ced85828601611be2565b9150509250929050565b600060208284031215611d0d57611d0c61259c565b5b6000611d1b84828501611be2565b91505092915050565b6000611d308383611d3c565b60208301905092915050565b611d45816123dd565b82525050565b611d54816123dd565b82525050565b6000611d658261230e565b611d6f8185612331565b9350611d7a836122fe565b8060005b83811015611dab578151611d928882611d24565b9750611d9d83612324565b925050600181019050611d7e565b5085935050505092915050565b611dc1816123ef565b82525050565b6000611dd282612319565b611ddc8185612342565b9350611dec818560208601612432565b611df5816125a1565b840191505092915050565b6000611e0d602383612342565b9150611e18826125b2565b604082019050919050565b6000611e30602283612342565b9150611e3b82612601565b604082019050919050565b6000611e53602683612342565b9150611e5e82612650565b604082019050919050565b6000611e76602283612342565b9150611e818261269f565b604082019050919050565b6000611e99602683612342565b9150611ea4826126ee565b604082019050919050565b6000611ebc600e83612342565b9150611ec78261273d565b602082019050919050565b6000611edf600a83612342565b9150611eea82612766565b602082019050919050565b6000611f02602883612342565b9150611f0d8261278f565b604082019050919050565b6000611f25602083612342565b9150611f30826127de565b602082019050919050565b6000611f48602483612342565b9150611f5382612807565b604082019050919050565b6000611f6b602183612342565b9150611f7682612856565b604082019050919050565b6000611f8e602583612342565b9150611f99826128a5565b604082019050919050565b6000611fb1602483612342565b9150611fbc826128f4565b604082019050919050565b6000611fd4600d83612342565b9150611fdf82612943565b602082019050919050565b6000611ff7602583612342565b91506120028261296c565b604082019050919050565b600061201a601f83612342565b9150612025826129bb565b602082019050919050565b6120398161241b565b82525050565b61204881612425565b82525050565b60006020820190506120636000830184611d4b565b92915050565b600060208201905081810360008301526120838184611d5a565b905092915050565b60006020820190506120a06000830184611db8565b92915050565b600060208201905081810360008301526120c08184611dc7565b905092915050565b600060208201905081810360008301526120e181611e00565b9050919050565b6000602082019050818103600083015261210181611e23565b9050919050565b6000602082019050818103600083015261212181611e46565b9050919050565b6000602082019050818103600083015261214181611e69565b9050919050565b6000602082019050818103600083015261216181611e8c565b9050919050565b6000602082019050818103600083015261218181611eaf565b9050919050565b600060208201905081810360008301526121a181611ed2565b9050919050565b600060208201905081810360008301526121c181611ef5565b9050919050565b600060208201905081810360008301526121e181611f18565b9050919050565b6000602082019050818103600083015261220181611f3b565b9050919050565b6000602082019050818103600083015261222181611f5e565b9050919050565b6000602082019050818103600083015261224181611f81565b9050919050565b6000602082019050818103600083015261226181611fa4565b9050919050565b6000602082019050818103600083015261228181611fc7565b9050919050565b600060208201905081810360008301526122a181611fea565b9050919050565b600060208201905081810360008301526122c18161200d565b9050919050565b60006020820190506122dd6000830184612030565b92915050565b60006020820190506122f8600083018461203f565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061235e8261241b565b91506123698361241b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561239e5761239d6124e0565b5b828201905092915050565b60006123b48261241b565b91506123bf8361241b565b9250828210156123d2576123d16124e0565b5b828203905092915050565b60006123e8826123fb565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612450578082015181840152602081019050612435565b8381111561245f576000848401525b50505050565b6000600282049050600182168061247d57607f821691505b602082108114156124915761249061250f565b5b50919050565b60006124a28261241b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156124d5576124d46124e0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f416c7265616479206d696e746572000000000000000000000000000000000000600082015250565b7f4e6f74206d696e74657200000000000000000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4163636573732064656e69656400000000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6129ed816123dd565b81146129f857600080fd5b50565b612a048161241b565b8114612a0f57600080fd5b5056fea2646970667358221220dff5c225b48496d214148a56786a17600187ebefe7304c51a809bd53ea072cc764736f6c63430008070033

Deployed ByteCode Sourcemap

27209:2296:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15641:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17808:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16761:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18459:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29079:423;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16603:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19360:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28542:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26093:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27827:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16932:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9445:94;;;:::i;:::-;;26503:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8794:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28244:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15860:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28785:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20078:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17272:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28032:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27465:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17510:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9694:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15641:100;15695:13;15728:5;15721:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15641:100;:::o;17808:169::-;17891:4;17908:39;17917:12;:10;:12::i;:::-;17931:7;17940:6;17908:8;:39::i;:::-;17965:4;17958:11;;17808:169;;;;:::o;16761:108::-;16822:7;16849:12;;16842:19;;16761:108;:::o;18459:492::-;18599:4;18616:36;18626:6;18634:9;18645:6;18616:9;:36::i;:::-;18665:24;18692:11;:19;18704:6;18692:19;;;;;;;;;;;;;;;:33;18712:12;:10;:12::i;:::-;18692:33;;;;;;;;;;;;;;;;18665:60;;18764:6;18744:16;:26;;18736:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;18851:57;18860:6;18868:12;:10;:12::i;:::-;18901:6;18882:16;:25;18851:8;:57::i;:::-;18939:4;18932:11;;;18459:492;;;;;:::o;29079:423::-;9025:12;:10;:12::i;:::-;9014:23;;:7;:5;:7::i;:::-;:23;;;9006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29155:7:::1;:15;29163:6;29155:15;;;;;;;;;;;;;;;;;;;;;;;;;29147:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;29214:5;29196:7;:15;29204:6;29196:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;29235:9;29230:228;29254:11;:18;;;;29250:1;:22;29230:228;;;29316:6;29298:24;;:11;29310:1;29298:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:24;;;29294:153;;;29360:11;29393:1;29372:11;:18;;;;:22;;;;:::i;:::-;29360:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29343:11;29355:1;29343:14;;;;;;;;:::i;:::-;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;29414:11;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;29294:153;29274:3;;;;;:::i;:::-;;;;29230:228;;;;29473:21;29487:6;29473:21;;;;;;:::i;:::-;;;;;;;;29079:423:::0;:::o;16603:93::-;16661:5;16686:2;16679:9;;16603:93;:::o;19360:215::-;19448:4;19465:80;19474:12;:10;:12::i;:::-;19488:7;19534:10;19497:11;:25;19509:12;:10;:12::i;:::-;19497:25;;;;;;;;;;;;;;;:34;19523:7;19497:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;19465:8;:80::i;:::-;19563:4;19556:11;;19360:215;;;;:::o;28542:167::-;27714:7;:19;27722:10;27714:19;;;;;;;;;;;;;;;;;;;;;;;;;27706:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;28657:9:::1;;28627:26;28645:7;28627:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:39;;28619:48;;;::::0;::::1;;28678:23;28684:7;28693;28678:5;:23::i;:::-;28542:167:::0;;:::o;26093:91::-;26149:27;26155:12;:10;:12::i;:::-;26169:6;26149:5;:27::i;:::-;26093:91;:::o;27827:100::-;27872:16;27908:11;27901:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27827:100;:::o;16932:127::-;17006:7;17033:9;:18;17043:7;17033:18;;;;;;;;;;;;;;;;17026:25;;16932:127;;;:::o;9445:94::-;9025:12;:10;:12::i;:::-;9014:23;;:7;:5;:7::i;:::-;:23;;;9006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:21:::1;9528:1;9510:9;:21::i;:::-;9445:94::o:0;26503:368::-;26580:24;26607:32;26617:7;26626:12;:10;:12::i;:::-;26607:9;:32::i;:::-;26580:59;;26678:6;26658:16;:26;;26650:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;26761:58;26770:7;26779:12;:10;:12::i;:::-;26812:6;26793:16;:25;26761:8;:58::i;:::-;26841:22;26847:7;26856:6;26841:5;:22::i;:::-;26569:302;26503:368;;:::o;8794:87::-;8840:7;8867:6;;;;;;;;;;;8860:13;;8794:87;:::o;28244:173::-;9025:12;:10;:12::i;:::-;9014:23;;:7;:5;:7::i;:::-;:23;;;9006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28350:13:::1;:11;:13::i;:::-;28324:22;28338:7;28324:9;;:13;;:22;;;;:::i;:::-;:39;;28316:48;;;::::0;::::1;;28387:22;28401:7;28387:9;;:13;;:22;;;;:::i;:::-;28375:9;:34;;;;28244:173:::0;:::o;15860:104::-;15916:13;15949:7;15942:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15860:104;:::o;28785:219::-;9025:12;:10;:12::i;:::-;9014:23;;:7;:5;:7::i;:::-;:23;;;9006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28859:7:::1;:15;28867:6;28859:15;;;;;;;;;;;;;;;;;;;;;;;;;28858:16;28850:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;28922:4;28904:7;:15;28912:6;28904:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;28937:11;28954:6;28937:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28977:19;28989:6;28977:19;;;;;;:::i;:::-;;;;;;;;28785:219:::0;:::o;20078:413::-;20171:4;20188:24;20215:11;:25;20227:12;:10;:12::i;:::-;20215:25;;;;;;;;;;;;;;;:34;20241:7;20215:34;;;;;;;;;;;;;;;;20188:61;;20288:15;20268:16;:35;;20260:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;20381:67;20390:12;:10;:12::i;:::-;20404:7;20432:15;20413:16;:34;20381:8;:67::i;:::-;20479:4;20472:11;;;20078:413;;;;:::o;17272:175::-;17358:4;17375:42;17385:12;:10;:12::i;:::-;17399:9;17410:6;17375:9;:42::i;:::-;17435:4;17428:11;;17272:175;;;;:::o;28032:145::-;9025:12;:10;:12::i;:::-;9014:23;;:7;:5;:7::i;:::-;:23;;;9006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28110:22:::1;28124:7;28110:9;;:13;;:22;;;;:::i;:::-;28098:9;:34;;;;28143:26;28149:10;28161:7;28143:5;:26::i;:::-;28032:145:::0;:::o;27465:43::-;;;;:::o;17510:151::-;17599:7;17626:11;:18;17638:5;17626:18;;;;;;;;;;;;;;;:27;17645:7;17626:27;;;;;;;;;;;;;;;;17619:34;;17510:151;;;;:::o;9694:192::-;9025:12;:10;:12::i;:::-;9014:23;;:7;:5;:7::i;:::-;:23;;;9006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9803:1:::1;9783:22;;:8;:22;;;;9775:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9859:19;9869:8;9859:9;:19::i;:::-;9694:192:::0;:::o;7582:98::-;7635:7;7662:10;7655:17;;7582:98;:::o;23762:380::-;23915:1;23898:19;;:5;:19;;;;23890:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23996:1;23977:21;;:7;:21;;;;23969:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24080:6;24050:11;:18;24062:5;24050:18;;;;;;;;;;;;;;;:27;24069:7;24050:27;;;;;;;;;;;;;;;:36;;;;24118:7;24102:32;;24111:5;24102:32;;;24127:6;24102:32;;;;;;:::i;:::-;;;;;;;;23762:380;;;:::o;20981:733::-;21139:1;21121:20;;:6;:20;;;;21113:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;21223:1;21202:23;;:9;:23;;;;21194:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21278:47;21299:6;21307:9;21318:6;21278:20;:47::i;:::-;21338:21;21362:9;:17;21372:6;21362:17;;;;;;;;;;;;;;;;21338:41;;21415:6;21398:13;:23;;21390:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21536:6;21520:13;:22;21500:9;:17;21510:6;21500:17;;;;;;;;;;;;;;;:42;;;;21588:6;21564:9;:20;21574:9;21564:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;21629:9;21612:35;;21621:6;21612:35;;;21640:6;21612:35;;;;;;:::i;:::-;;;;;;;;21660:46;21680:6;21688:9;21699:6;21660:19;:46::i;:::-;21102:612;20981:733;;;:::o;2792:98::-;2850:7;2881:1;2877;:5;;;;:::i;:::-;2870:12;;2792:98;;;;:::o;22001:399::-;22104:1;22085:21;;:7;:21;;;;22077:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;22155:49;22184:1;22188:7;22197:6;22155:20;:49::i;:::-;22233:6;22217:12;;:22;;;;;;;:::i;:::-;;;;;;;;22272:6;22250:9;:18;22260:7;22250:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;22315:7;22294:37;;22311:1;22294:37;;;22324:6;22294:37;;;;;;:::i;:::-;;;;;;;;22344:48;22372:1;22376:7;22385:6;22344:19;:48::i;:::-;22001:399;;:::o;22733:591::-;22836:1;22817:21;;:7;:21;;;;22809:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22889:49;22910:7;22927:1;22931:6;22889:20;:49::i;:::-;22951:22;22976:9;:18;22986:7;22976:18;;;;;;;;;;;;;;;;22951:43;;23031:6;23013:14;:24;;23005:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23150:6;23133:14;:23;23112:9;:18;23122:7;23112:18;;;;;;;;;;;;;;;:44;;;;23194:6;23178:12;;:22;;;;;;;:::i;:::-;;;;;;;;23244:1;23218:37;;23227:7;23218:37;;;23248:6;23218:37;;;;;;:::i;:::-;;;;;;;;23268:48;23288:7;23305:1;23309:6;23268:19;:48::i;:::-;22798:526;22733:591;;:::o;9894:173::-;9950:16;9969:6;;;;;;;;;;;9950:25;;9995:8;9986:6;;:17;;;;;;;;;;;;;;;;;;10050:8;10019:40;;10040:8;10019:40;;;;;;;;;;;;9939:128;9894:173;:::o;3173:98::-;3231:7;3262:1;3258;:5;;;;:::i;:::-;3251:12;;3173:98;;;;:::o;24742:125::-;;;;:::o;25471:124::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:329::-;356:6;405:2;393:9;384:7;380:23;376:32;373:119;;;411:79;;:::i;:::-;373:119;531:1;556:53;601:7;592:6;581:9;577:22;556:53;:::i;:::-;546:63;;502:117;297:329;;;;:::o;632:474::-;700:6;708;757:2;745:9;736:7;732:23;728:32;725:119;;;763:79;;:::i;:::-;725:119;883:1;908:53;953:7;944:6;933:9;929:22;908:53;:::i;:::-;898:63;;854:117;1010:2;1036:53;1081:7;1072:6;1061:9;1057:22;1036:53;:::i;:::-;1026:63;;981:118;632:474;;;;;:::o;1112:619::-;1189:6;1197;1205;1254:2;1242:9;1233:7;1229:23;1225:32;1222:119;;;1260:79;;:::i;:::-;1222:119;1380:1;1405:53;1450:7;1441:6;1430:9;1426:22;1405:53;:::i;:::-;1395:63;;1351:117;1507:2;1533:53;1578:7;1569:6;1558:9;1554:22;1533:53;:::i;:::-;1523:63;;1478:118;1635:2;1661:53;1706:7;1697:6;1686:9;1682:22;1661:53;:::i;:::-;1651:63;;1606:118;1112:619;;;;;:::o;1737:474::-;1805:6;1813;1862:2;1850:9;1841:7;1837:23;1833:32;1830:119;;;1868:79;;:::i;:::-;1830:119;1988:1;2013:53;2058:7;2049:6;2038:9;2034:22;2013:53;:::i;:::-;2003:63;;1959:117;2115:2;2141:53;2186:7;2177:6;2166:9;2162:22;2141:53;:::i;:::-;2131:63;;2086:118;1737:474;;;;;:::o;2217:329::-;2276:6;2325:2;2313:9;2304:7;2300:23;2296:32;2293:119;;;2331:79;;:::i;:::-;2293:119;2451:1;2476:53;2521:7;2512:6;2501:9;2497:22;2476:53;:::i;:::-;2466:63;;2422:117;2217:329;;;;:::o;2552:179::-;2621:10;2642:46;2684:3;2676:6;2642:46;:::i;:::-;2720:4;2715:3;2711:14;2697:28;;2552:179;;;;:::o;2737:108::-;2814:24;2832:5;2814:24;:::i;:::-;2809:3;2802:37;2737:108;;:::o;2851:118::-;2938:24;2956:5;2938:24;:::i;:::-;2933:3;2926:37;2851:118;;:::o;3005:732::-;3124:3;3153:54;3201:5;3153:54;:::i;:::-;3223:86;3302:6;3297:3;3223:86;:::i;:::-;3216:93;;3333:56;3383:5;3333:56;:::i;:::-;3412:7;3443:1;3428:284;3453:6;3450:1;3447:13;3428:284;;;3529:6;3523:13;3556:63;3615:3;3600:13;3556:63;:::i;:::-;3549:70;;3642:60;3695:6;3642:60;:::i;:::-;3632:70;;3488:224;3475:1;3472;3468:9;3463:14;;3428:284;;;3432:14;3728:3;3721:10;;3129:608;;;3005:732;;;;:::o;3743:109::-;3824:21;3839:5;3824:21;:::i;:::-;3819:3;3812:34;3743:109;;:::o;3858:364::-;3946:3;3974:39;4007:5;3974:39;:::i;:::-;4029:71;4093:6;4088:3;4029:71;:::i;:::-;4022:78;;4109:52;4154:6;4149:3;4142:4;4135:5;4131:16;4109:52;:::i;:::-;4186:29;4208:6;4186:29;:::i;:::-;4181:3;4177:39;4170:46;;3950:272;3858:364;;;;:::o;4228:366::-;4370:3;4391:67;4455:2;4450:3;4391:67;:::i;:::-;4384:74;;4467:93;4556:3;4467:93;:::i;:::-;4585:2;4580:3;4576:12;4569:19;;4228:366;;;:::o;4600:::-;4742:3;4763:67;4827:2;4822:3;4763:67;:::i;:::-;4756:74;;4839:93;4928:3;4839:93;:::i;:::-;4957:2;4952:3;4948:12;4941:19;;4600:366;;;:::o;4972:::-;5114:3;5135:67;5199:2;5194:3;5135:67;:::i;:::-;5128:74;;5211:93;5300:3;5211:93;:::i;:::-;5329:2;5324:3;5320:12;5313:19;;4972:366;;;:::o;5344:::-;5486:3;5507:67;5571:2;5566:3;5507:67;:::i;:::-;5500:74;;5583:93;5672:3;5583:93;:::i;:::-;5701:2;5696:3;5692:12;5685:19;;5344:366;;;:::o;5716:::-;5858:3;5879:67;5943:2;5938:3;5879:67;:::i;:::-;5872:74;;5955:93;6044:3;5955:93;:::i;:::-;6073:2;6068:3;6064:12;6057:19;;5716:366;;;:::o;6088:::-;6230:3;6251:67;6315:2;6310:3;6251:67;:::i;:::-;6244:74;;6327:93;6416:3;6327:93;:::i;:::-;6445:2;6440:3;6436:12;6429:19;;6088:366;;;:::o;6460:::-;6602:3;6623:67;6687:2;6682:3;6623:67;:::i;:::-;6616:74;;6699:93;6788:3;6699:93;:::i;:::-;6817:2;6812:3;6808:12;6801:19;;6460:366;;;:::o;6832:::-;6974:3;6995:67;7059:2;7054:3;6995:67;:::i;:::-;6988:74;;7071:93;7160:3;7071:93;:::i;:::-;7189:2;7184:3;7180:12;7173:19;;6832:366;;;:::o;7204:::-;7346:3;7367:67;7431:2;7426:3;7367:67;:::i;:::-;7360:74;;7443:93;7532:3;7443:93;:::i;:::-;7561:2;7556:3;7552:12;7545:19;;7204:366;;;:::o;7576:::-;7718:3;7739:67;7803:2;7798:3;7739:67;:::i;:::-;7732:74;;7815:93;7904:3;7815:93;:::i;:::-;7933:2;7928:3;7924:12;7917:19;;7576:366;;;:::o;7948:::-;8090:3;8111:67;8175:2;8170:3;8111:67;:::i;:::-;8104:74;;8187:93;8276:3;8187:93;:::i;:::-;8305:2;8300:3;8296:12;8289:19;;7948:366;;;:::o;8320:::-;8462:3;8483:67;8547:2;8542:3;8483:67;:::i;:::-;8476:74;;8559:93;8648:3;8559:93;:::i;:::-;8677:2;8672:3;8668:12;8661:19;;8320:366;;;:::o;8692:::-;8834:3;8855:67;8919:2;8914:3;8855:67;:::i;:::-;8848:74;;8931:93;9020:3;8931:93;:::i;:::-;9049:2;9044:3;9040:12;9033:19;;8692:366;;;:::o;9064:::-;9206:3;9227:67;9291:2;9286:3;9227:67;:::i;:::-;9220:74;;9303:93;9392:3;9303:93;:::i;:::-;9421:2;9416:3;9412:12;9405:19;;9064:366;;;:::o;9436:::-;9578:3;9599:67;9663:2;9658:3;9599:67;:::i;:::-;9592:74;;9675:93;9764:3;9675:93;:::i;:::-;9793:2;9788:3;9784:12;9777:19;;9436:366;;;:::o;9808:::-;9950:3;9971:67;10035:2;10030:3;9971:67;:::i;:::-;9964:74;;10047:93;10136:3;10047:93;:::i;:::-;10165:2;10160:3;10156:12;10149:19;;9808:366;;;:::o;10180:118::-;10267:24;10285:5;10267:24;:::i;:::-;10262:3;10255:37;10180:118;;:::o;10304:112::-;10387:22;10403:5;10387:22;:::i;:::-;10382:3;10375:35;10304:112;;:::o;10422:222::-;10515:4;10553:2;10542:9;10538:18;10530:26;;10566:71;10634:1;10623:9;10619:17;10610:6;10566:71;:::i;:::-;10422:222;;;;:::o;10650:373::-;10793:4;10831:2;10820:9;10816:18;10808:26;;10880:9;10874:4;10870:20;10866:1;10855:9;10851:17;10844:47;10908:108;11011:4;11002:6;10908:108;:::i;:::-;10900:116;;10650:373;;;;:::o;11029:210::-;11116:4;11154:2;11143:9;11139:18;11131:26;;11167:65;11229:1;11218:9;11214:17;11205:6;11167:65;:::i;:::-;11029:210;;;;:::o;11245:313::-;11358:4;11396:2;11385:9;11381:18;11373:26;;11445:9;11439:4;11435:20;11431:1;11420:9;11416:17;11409:47;11473:78;11546:4;11537:6;11473:78;:::i;:::-;11465:86;;11245:313;;;;:::o;11564:419::-;11730:4;11768:2;11757:9;11753:18;11745:26;;11817:9;11811:4;11807:20;11803:1;11792:9;11788:17;11781:47;11845:131;11971:4;11845:131;:::i;:::-;11837:139;;11564:419;;;:::o;11989:::-;12155:4;12193:2;12182:9;12178:18;12170:26;;12242:9;12236:4;12232:20;12228:1;12217:9;12213:17;12206:47;12270:131;12396:4;12270:131;:::i;:::-;12262:139;;11989:419;;;:::o;12414:::-;12580:4;12618:2;12607:9;12603:18;12595:26;;12667:9;12661:4;12657:20;12653:1;12642:9;12638:17;12631:47;12695:131;12821:4;12695:131;:::i;:::-;12687:139;;12414:419;;;:::o;12839:::-;13005:4;13043:2;13032:9;13028:18;13020:26;;13092:9;13086:4;13082:20;13078:1;13067:9;13063:17;13056:47;13120:131;13246:4;13120:131;:::i;:::-;13112:139;;12839:419;;;:::o;13264:::-;13430:4;13468:2;13457:9;13453:18;13445:26;;13517:9;13511:4;13507:20;13503:1;13492:9;13488:17;13481:47;13545:131;13671:4;13545:131;:::i;:::-;13537:139;;13264:419;;;:::o;13689:::-;13855:4;13893:2;13882:9;13878:18;13870:26;;13942:9;13936:4;13932:20;13928:1;13917:9;13913:17;13906:47;13970:131;14096:4;13970:131;:::i;:::-;13962:139;;13689:419;;;:::o;14114:::-;14280:4;14318:2;14307:9;14303:18;14295:26;;14367:9;14361:4;14357:20;14353:1;14342:9;14338:17;14331:47;14395:131;14521:4;14395:131;:::i;:::-;14387:139;;14114:419;;;:::o;14539:::-;14705:4;14743:2;14732:9;14728:18;14720:26;;14792:9;14786:4;14782:20;14778:1;14767:9;14763:17;14756:47;14820:131;14946:4;14820:131;:::i;:::-;14812:139;;14539:419;;;:::o;14964:::-;15130:4;15168:2;15157:9;15153:18;15145:26;;15217:9;15211:4;15207:20;15203:1;15192:9;15188:17;15181:47;15245:131;15371:4;15245:131;:::i;:::-;15237:139;;14964:419;;;:::o;15389:::-;15555:4;15593:2;15582:9;15578:18;15570:26;;15642:9;15636:4;15632:20;15628:1;15617:9;15613:17;15606:47;15670:131;15796:4;15670:131;:::i;:::-;15662:139;;15389:419;;;:::o;15814:::-;15980:4;16018:2;16007:9;16003:18;15995:26;;16067:9;16061:4;16057:20;16053:1;16042:9;16038:17;16031:47;16095:131;16221:4;16095:131;:::i;:::-;16087:139;;15814:419;;;:::o;16239:::-;16405:4;16443:2;16432:9;16428:18;16420:26;;16492:9;16486:4;16482:20;16478:1;16467:9;16463:17;16456:47;16520:131;16646:4;16520:131;:::i;:::-;16512:139;;16239:419;;;:::o;16664:::-;16830:4;16868:2;16857:9;16853:18;16845:26;;16917:9;16911:4;16907:20;16903:1;16892:9;16888:17;16881:47;16945:131;17071:4;16945:131;:::i;:::-;16937:139;;16664:419;;;:::o;17089:::-;17255:4;17293:2;17282:9;17278:18;17270:26;;17342:9;17336:4;17332:20;17328:1;17317:9;17313:17;17306:47;17370:131;17496:4;17370:131;:::i;:::-;17362:139;;17089:419;;;:::o;17514:::-;17680:4;17718:2;17707:9;17703:18;17695:26;;17767:9;17761:4;17757:20;17753:1;17742:9;17738:17;17731:47;17795:131;17921:4;17795:131;:::i;:::-;17787:139;;17514:419;;;:::o;17939:::-;18105:4;18143:2;18132:9;18128:18;18120:26;;18192:9;18186:4;18182:20;18178:1;18167:9;18163:17;18156:47;18220:131;18346:4;18220:131;:::i;:::-;18212:139;;17939:419;;;:::o;18364:222::-;18457:4;18495:2;18484:9;18480:18;18472:26;;18508:71;18576:1;18565:9;18561:17;18552:6;18508:71;:::i;:::-;18364:222;;;;:::o;18592:214::-;18681:4;18719:2;18708:9;18704:18;18696:26;;18732:67;18796:1;18785:9;18781:17;18772:6;18732:67;:::i;:::-;18592:214;;;;:::o;18893:132::-;18960:4;18983:3;18975:11;;19013:4;19008:3;19004:14;18996:22;;18893:132;;;:::o;19031:114::-;19098:6;19132:5;19126:12;19116:22;;19031:114;;;:::o;19151:99::-;19203:6;19237:5;19231:12;19221:22;;19151:99;;;:::o;19256:113::-;19326:4;19358;19353:3;19349:14;19341:22;;19256:113;;;:::o;19375:184::-;19474:11;19508:6;19503:3;19496:19;19548:4;19543:3;19539:14;19524:29;;19375:184;;;;:::o;19565:169::-;19649:11;19683:6;19678:3;19671:19;19723:4;19718:3;19714:14;19699:29;;19565:169;;;;:::o;19740:305::-;19780:3;19799:20;19817:1;19799:20;:::i;:::-;19794:25;;19833:20;19851:1;19833:20;:::i;:::-;19828:25;;19987:1;19919:66;19915:74;19912:1;19909:81;19906:107;;;19993:18;;:::i;:::-;19906:107;20037:1;20034;20030:9;20023:16;;19740:305;;;;:::o;20051:191::-;20091:4;20111:20;20129:1;20111:20;:::i;:::-;20106:25;;20145:20;20163:1;20145:20;:::i;:::-;20140:25;;20184:1;20181;20178:8;20175:34;;;20189:18;;:::i;:::-;20175:34;20234:1;20231;20227:9;20219:17;;20051:191;;;;:::o;20248:96::-;20285:7;20314:24;20332:5;20314:24;:::i;:::-;20303:35;;20248:96;;;:::o;20350:90::-;20384:7;20427:5;20420:13;20413:21;20402:32;;20350:90;;;:::o;20446:126::-;20483:7;20523:42;20516:5;20512:54;20501:65;;20446:126;;;:::o;20578:77::-;20615:7;20644:5;20633:16;;20578:77;;;:::o;20661:86::-;20696:7;20736:4;20729:5;20725:16;20714:27;;20661:86;;;:::o;20753:307::-;20821:1;20831:113;20845:6;20842:1;20839:13;20831:113;;;20930:1;20925:3;20921:11;20915:18;20911:1;20906:3;20902:11;20895:39;20867:2;20864:1;20860:10;20855:15;;20831:113;;;20962:6;20959:1;20956:13;20953:101;;;21042:1;21033:6;21028:3;21024:16;21017:27;20953:101;20802:258;20753:307;;;:::o;21066:320::-;21110:6;21147:1;21141:4;21137:12;21127:22;;21194:1;21188:4;21184:12;21215:18;21205:81;;21271:4;21263:6;21259:17;21249:27;;21205:81;21333:2;21325:6;21322:14;21302:18;21299:38;21296:84;;;21352:18;;:::i;:::-;21296:84;21117:269;21066:320;;;:::o;21392:233::-;21431:3;21454:24;21472:5;21454:24;:::i;:::-;21445:33;;21500:66;21493:5;21490:77;21487:103;;;21570:18;;:::i;:::-;21487:103;21617:1;21610:5;21606:13;21599:20;;21392:233;;;:::o;21631:180::-;21679:77;21676:1;21669:88;21776:4;21773:1;21766:15;21800:4;21797:1;21790:15;21817:180;21865:77;21862:1;21855:88;21962:4;21959:1;21952:15;21986:4;21983:1;21976:15;22003:180;22051:77;22048:1;22041:88;22148:4;22145:1;22138:15;22172:4;22169:1;22162:15;22189:180;22237:77;22234:1;22227:88;22334:4;22331:1;22324:15;22358:4;22355:1;22348:15;22498:117;22607:1;22604;22597:12;22621:102;22662:6;22713:2;22709:7;22704:2;22697:5;22693:14;22689:28;22679:38;;22621:102;;;:::o;22729:222::-;22869:34;22865:1;22857:6;22853:14;22846:58;22938:5;22933:2;22925:6;22921:15;22914:30;22729:222;:::o;22957:221::-;23097:34;23093:1;23085:6;23081:14;23074:58;23166:4;23161:2;23153:6;23149:15;23142:29;22957:221;:::o;23184:225::-;23324:34;23320:1;23312:6;23308:14;23301:58;23393:8;23388:2;23380:6;23376:15;23369:33;23184:225;:::o;23415:221::-;23555:34;23551:1;23543:6;23539:14;23532:58;23624:4;23619:2;23611:6;23607:15;23600:29;23415:221;:::o;23642:225::-;23782:34;23778:1;23770:6;23766:14;23759:58;23851:8;23846:2;23838:6;23834:15;23827:33;23642:225;:::o;23873:164::-;24013:16;24009:1;24001:6;23997:14;23990:40;23873:164;:::o;24043:160::-;24183:12;24179:1;24171:6;24167:14;24160:36;24043:160;:::o;24209:227::-;24349:34;24345:1;24337:6;24333:14;24326:58;24418:10;24413:2;24405:6;24401:15;24394:35;24209:227;:::o;24442:182::-;24582:34;24578:1;24570:6;24566:14;24559:58;24442:182;:::o;24630:223::-;24770:34;24766:1;24758:6;24754:14;24747:58;24839:6;24834:2;24826:6;24822:15;24815:31;24630:223;:::o;24859:220::-;24999:34;24995:1;24987:6;24983:14;24976:58;25068:3;25063:2;25055:6;25051:15;25044:28;24859:220;:::o;25085:224::-;25225:34;25221:1;25213:6;25209:14;25202:58;25294:7;25289:2;25281:6;25277:15;25270:32;25085:224;:::o;25315:223::-;25455:34;25451:1;25443:6;25439:14;25432:58;25524:6;25519:2;25511:6;25507:15;25500:31;25315:223;:::o;25544:163::-;25684:15;25680:1;25672:6;25668:14;25661:39;25544:163;:::o;25713:224::-;25853:34;25849:1;25841:6;25837:14;25830:58;25922:7;25917:2;25909:6;25905:15;25898:32;25713:224;:::o;25943:181::-;26083:33;26079:1;26071:6;26067:14;26060:57;25943:181;:::o;26130:122::-;26203:24;26221:5;26203:24;:::i;:::-;26196:5;26193:35;26183:63;;26242:1;26239;26232:12;26183:63;26130:122;:::o;26258:::-;26331:24;26349:5;26331:24;:::i;:::-;26324:5;26321:35;26311:63;;26370:1;26367;26360:12;26311:63;26258:122;:::o

Swarm Source

ipfs://dff5c225b48496d214148a56786a17600187ebefe7304c51a809bd53ea072cc7
Loading