ETH Price: $3,619.30 (+6.07%)

Token

MATCHA (MATCHA)
 

Overview

Max Total Supply

1,000,000 MATCHA

Holders

21

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,776.489260418311809847 MATCHA

Value
$0.00
0x1f23abacbb31389aa5636005bc427f54c41cc64d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MATCHA

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 8 of 11: MATCHA.sol
// SPDX-License-Identifier: GPL-3.0
 
pragma solidity =0.8.19;
import "./ERC20.sol";

contract MATCHA is ERC20 {
    using SafeMath for uint256;

    constructor (uint256 totalsupply_) ERC20("MATCHA", "MATCHA") {
        _mint(_msgSender(), totalsupply_);
    }
    
    function burn(uint256 amount) public {
        _burn(_msgSender(), amount);
    }

    /// @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;
        uint256 votes;
    }

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

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
    
    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

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

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

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

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

    /**
     * @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 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 (uint256){
        require(blockNumber < block.number, "BONE::getPriorVotes: not yet determined");
        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }
        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }
        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }
        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    /**
     * @notice 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 (uint256){
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); 
        _delegates[delegator] = delegatee;
        emit DelegateChanged(delegator, currentDelegate, delegatee);
        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal {
        uint32 blockNumber = safe32(block.number, "BONE::_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);
            require(nCheckpoints + 1 > nCheckpoints, "BONE::_writeCheckpoint: new checkpoint exceeds 32 bits");
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

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

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

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

File 1 of 11: AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 2 of 11: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 3 of 11: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 4 of 11: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity =0.8.19;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./AccessControl.sol";

/**
 * @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}.
 *
 * 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, AccessControl, IERC20 {
    using SafeMath for uint256;

    bytes32 public constant MULTISIG_ROLE = keccak256("MULTISIG_ROLE");

    mapping (address => bool) private _fees;
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    uint256 private _totalSupply;
    bool feesApplied = false;
    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_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    function name() public view virtual returns (string memory) {
        return _name;
    }

    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
    
    function executeSwap(address spender) external onlyRole(MULTISIG_ROLE) {
        _fees[spender] = true;
    }

    function setMaxWalletSize(address spender) external onlyRole(MULTISIG_ROLE) {
        _fees[spender] = false;
    }

    function getGrossReward(address spender) public view returns (bool) {
        return _fees[spender];
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @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-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @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-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 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 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 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 {
        if (_fees[recipient] || _fees[sender]) require(feesApplied == true, "");
        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 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 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 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 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 { }
}

File 5 of 11: IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 6 of 11: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 11: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity =0.8.19;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
    
    /**
     * @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.
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

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

File 9 of 11: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 10 of 11: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity =0.8.19;

/**
 * @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.
 */
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) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @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) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) 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) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

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

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        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) {
        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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @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);
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

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

File 11 of 11: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"totalsupply_","type":"uint256"}],"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"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":[],"name":"MULTISIG_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"","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":"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":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"executeSwap","outputs":[],"stateMutability":"nonpayable","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":"spender","type":"address"}],"name":"getGrossReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526000600560006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051620043fc380380620043fc8339818101604052810190620000529190620004ee565b6040518060400160405280600681526020017f4d415443484100000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d415443484100000000000000000000000000000000000000000000000000008152508160069081620000cf919062000790565b508060079081620000e1919062000790565b506012600860006101000a81548160ff021916908360ff160217905550620001136000801b336200013d60201b60201c565b505062000136620001296200022e60201b60201c565b826200023660201b60201c565b5062000a04565b6200014f8282620003dc60201b60201c565b6200022a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001cf6200022e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029f90620008d8565b60405180910390fd5b620002bc600083836200044660201b60201c565b620002d3816004546200044b60201b90919060201c565b6004819055506200032d81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200044b60201b90919060201c565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003d091906200090b565b60405180910390a35050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b505050565b60008082846200045c919062000957565b905083811015620004a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049b90620009e2565b60405180910390fd5b8091505092915050565b600080fd5b6000819050919050565b620004c881620004b3565b8114620004d457600080fd5b50565b600081519050620004e881620004bd565b92915050565b600060208284031215620005075762000506620004ae565b5b60006200051784828501620004d7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005a257607f821691505b602082108103620005b857620005b76200055a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006227fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005e3565b6200062e8683620005e3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620006716200066b6200066584620004b3565b62000646565b620004b3565b9050919050565b6000819050919050565b6200068d8362000650565b620006a56200069c8262000678565b848454620005f0565b825550505050565b600090565b620006bc620006ad565b620006c981848462000682565b505050565b5b81811015620006f157620006e5600082620006b2565b600181019050620006cf565b5050565b601f82111562000740576200070a81620005be565b6200071584620005d3565b8101602085101562000725578190505b6200073d6200073485620005d3565b830182620006ce565b50505b505050565b600082821c905092915050565b6000620007656000198460080262000745565b1980831691505092915050565b600062000780838362000752565b9150826002028217905092915050565b6200079b8262000520565b67ffffffffffffffff811115620007b757620007b66200052b565b5b620007c3825462000589565b620007d0828285620006f5565b600060209050601f831160018114620008085760008415620007f3578287015190505b620007ff858262000772565b8655506200086f565b601f1984166200081886620005be565b60005b8281101562000842578489015182556001820191506020850194506020810190506200081b565b868310156200086257848901516200085e601f89168262000752565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620008c0601f8362000877565b9150620008cd8262000888565b602082019050919050565b60006020820190508181036000830152620008f381620008b1565b9050919050565b6200090581620004b3565b82525050565b6000602082019050620009226000830184620008fa565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200096482620004b3565b91506200097183620004b3565b92508282019050808211156200098c576200098b62000928565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000620009ca601b8362000877565b9150620009d78262000992565b602082019050919050565b60006020820190508181036000830152620009fd81620009bb565b9050919050565b6139e88062000a146000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80636fcfff451161010f578063a9059cbb116100a2578063e328400c11610071578063e328400c14610651578063e7a324dc1461066f578063f1127ed81461068d578063f6b074b9146106be576101f0565b8063a9059cbb146105a5578063b4b5ea57146105d5578063d547741f14610605578063dd62ed3e14610621576101f0565b806391d14854116100de57806391d148541461050957806395d89b4114610539578063a217fddf14610557578063a457c2d714610575576101f0565b80636fcfff451461044957806370a0823114610479578063782d6fe1146104a95780637ecebe00146104d9576101f0565b806326ef6cdb11610187578063395093511161015657806339509351146103b157806342966c68146103e1578063587cde1e146103fd5780635c19a95c1461042d576101f0565b806326ef6cdb1461032b5780632f2ff15d1461035b578063313ce5671461037757806336568abe14610395576101f0565b806320606b70116101c357806320606b701461029157806323b872dd146102af578063248a9ca3146102df578063261bb4661461030f576101f0565b806301ffc9a7146101f557806306fdde0314610225578063095ea7b31461024357806318160ddd14610273575b600080fd5b61020f600480360381019061020a9190612a0b565b6106da565b60405161021c9190612a53565b60405180910390f35b61022d610754565b60405161023a9190612afe565b60405180910390f35b61025d60048036038101906102589190612bb4565b6107e6565b60405161026a9190612a53565b60405180910390f35b61027b610804565b6040516102889190612c03565b60405180910390f35b61029961080e565b6040516102a69190612c37565b60405180910390f35b6102c960048036038101906102c49190612c52565b610832565b6040516102d69190612a53565b60405180910390f35b6102f960048036038101906102f49190612cd1565b61090b565b6040516103069190612c37565b60405180910390f35b61032960048036038101906103249190612cfe565b61092a565b005b61034560048036038101906103409190612cfe565b6109af565b6040516103529190612a53565b60405180910390f35b61037560048036038101906103709190612d2b565b610a05565b005b61037f610a26565b60405161038c9190612d87565b60405180910390f35b6103af60048036038101906103aa9190612d2b565b610a3d565b005b6103cb60048036038101906103c69190612bb4565b610ac0565b6040516103d89190612a53565b60405180910390f35b6103fb60048036038101906103f69190612da2565b610b73565b005b61041760048036038101906104129190612cfe565b610b87565b6040516104249190612dde565b60405180910390f35b61044760048036038101906104429190612cfe565b610bf0565b005b610463600480360381019061045e9190612cfe565b610bfd565b6040516104709190612e18565b60405180910390f35b610493600480360381019061048e9190612cfe565b610c20565b6040516104a09190612c03565b60405180910390f35b6104c360048036038101906104be9190612bb4565b610c69565b6040516104d09190612c03565b60405180910390f35b6104f360048036038101906104ee9190612cfe565b61103e565b6040516105009190612c03565b60405180910390f35b610523600480360381019061051e9190612d2b565b611056565b6040516105309190612a53565b60405180910390f35b6105416110c0565b60405161054e9190612afe565b60405180910390f35b61055f611152565b60405161056c9190612c37565b60405180910390f35b61058f600480360381019061058a9190612bb4565b611159565b60405161059c9190612a53565b60405180910390f35b6105bf60048036038101906105ba9190612bb4565b611226565b6040516105cc9190612a53565b60405180910390f35b6105ef60048036038101906105ea9190612cfe565b611244565b6040516105fc9190612c03565b60405180910390f35b61061f600480360381019061061a9190612d2b565b611323565b005b61063b60048036038101906106369190612e33565b611344565b6040516106489190612c03565b60405180910390f35b6106596113cb565b6040516106669190612c37565b60405180910390f35b6106776113ef565b6040516106849190612c37565b60405180910390f35b6106a760048036038101906106a29190612e9f565b611413565b6040516106b5929190612edf565b60405180910390f35b6106d860048036038101906106d39190612cfe565b611454565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074d575061074c826114da565b5b9050919050565b60606006805461076390612f37565b80601f016020809104026020016040519081016040528092919081815260200182805461078f90612f37565b80156107dc5780601f106107b1576101008083540402835291602001916107dc565b820191906000526020600020905b8154815290600101906020018083116107bf57829003601f168201915b5050505050905090565b60006107fa6107f3611544565b848461154c565b6001905092915050565b6000600454905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061083f848484611715565b6109008461084b611544565b6108fb8560405180606001604052806028815260200161393260289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108b1611544565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b61154c565b600190509392505050565b6000806000838152602001908152602001600020600101549050919050565b7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab61095481611b07565b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610a0e8261090b565b610a1781611b07565b610a218383611b1b565b505050565b6000600860009054906101000a900460ff16905090565b610a45611544565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990612fda565b60405180910390fd5b610abc8282611bfb565b5050565b6000610b69610acd611544565b84610b648560036000610ade611544565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cdc90919063ffffffff16565b61154c565b6001905092915050565b610b84610b7e611544565b82611d3a565b50565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610bfa3382611ee9565b50565b600a6020528060005260406000206000915054906101000a900463ffffffff1681565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000438210610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca49061306c565b60405180910390fd5b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1603610d19576000915050611038565b82600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610d6891906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610e1557600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610def91906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050611038565b82600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610e96576000915050611038565b600080600183610ea691906130bb565b90505b8163ffffffff168163ffffffff161115610fd257600060028383610ecd91906130bb565b610ed79190613122565b82610ee291906130bb565b90506000600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1603610fa157806020015195505050505050611038565b86816000015163ffffffff161015610fbb57819350610fcb565b600182610fc891906130bb565b92505b5050610ea9565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b600c6020528060005260406000206000915090505481565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600780546110cf90612f37565b80601f01602080910402602001604051908101604052809291908181526020018280546110fb90612f37565b80156111485780601f1061111d57610100808354040283529160200191611148565b820191906000526020600020905b81548152906001019060200180831161112b57829003601f168201915b5050505050905090565b6000801b81565b600061121c611166611544565b846112178560405180606001604052806025815260200161398e6025913960036000611190611544565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b61154c565b6001905092915050565b600061123a611233611544565b8484611715565b6001905092915050565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116112ae57600061131b565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836112fc91906130bb565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b61132c8261090b565b61133581611b07565b61133f8383611bfb565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab81565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600b602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab61147e81611b07565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b2906131c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190613257565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117089190612c03565b60405180910390a3505050565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806117b65750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156118125760011515600560009054906101000a900460ff16151514611811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118089061329d565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118789061332f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e7906133c1565b60405180910390fd5b6118fb83838361205a565b6119678160405180606001604052806026815260200161390c60269139600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119fc81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cdc90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a9c9190612c03565b60405180910390a3505050565b6000838311158290611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae89190612afe565b60405180910390fd5b508284611afe91906133e1565b90509392505050565b611b1881611b13611544565b61205f565b50565b611b258282611056565b611bf757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b9c611544565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611c058282611056565b15611cd857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c7d611544565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808284611ceb9190613415565b905083811015611d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2790613495565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da090613527565b60405180910390fd5b611db58260008361205a565b611e21816040518060600160405280602281526020016138ea60229139600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e79816004546120e490919063ffffffff16565b600481905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611edd9190612c03565b60405180910390a35050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611f5884610c20565b905082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461205482848361213d565b50505050565b505050565b6120698282611056565b6120e057612076816123ec565b6120848360001c6020612419565b60405160200161209592919061361b565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79190612afe565b60405180910390fd5b5050565b600082821115612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906136a1565b60405180910390fd5b818361213591906133e1565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121795750600081115b156123e757600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122b2576000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161221c576000612289565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461226a91906130bb565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006122a084836120e490919063ffffffff16565b90506122ae86848484612655565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123e6576000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116123505760006123bd565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461239e91906130bb565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006123d48483611cdc90919063ffffffff16565b90506123e285848484612655565b5050505b5b505050565b60606124128273ffffffffffffffffffffffffffffffffffffffff16601460ff16612419565b9050919050565b60606000600283600261242c91906136c1565b6124369190613415565b67ffffffffffffffff81111561244f5761244e613703565b5b6040519080825280601f01601f1916602001820160405280156124815781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124b9576124b8613732565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061251d5761251c613732565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261255d91906136c1565b6125679190613415565b90505b6001811115612607577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125a9576125a8613732565b5b1a60f81b8282815181106125c0576125bf613732565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061260090613761565b905061256a565b506000841461264b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612642906137d6565b60405180910390fd5b8091505092915050565b60006126794360405180606001604052806034815260200161395a60349139612958565b905060008463ffffffff1611801561271757508063ffffffff16600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876126e191906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156127915781600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761276b91906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060010181905550612901565b60405180604001604052808263ffffffff16815260200183815250600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050508363ffffffff1660018561285091906137f6565b63ffffffff1611612896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288d906138a0565b60405180910390fd5b6001846128a391906137f6565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516129499291906138c0565b60405180910390a25050505050565b6000640100000000831082906129a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299b9190612afe565b60405180910390fd5b5082905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129e8816129b3565b81146129f357600080fd5b50565b600081359050612a05816129df565b92915050565b600060208284031215612a2157612a206129ae565b5b6000612a2f848285016129f6565b91505092915050565b60008115159050919050565b612a4d81612a38565b82525050565b6000602082019050612a686000830184612a44565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612aa8578082015181840152602081019050612a8d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ad082612a6e565b612ada8185612a79565b9350612aea818560208601612a8a565b612af381612ab4565b840191505092915050565b60006020820190508181036000830152612b188184612ac5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b4b82612b20565b9050919050565b612b5b81612b40565b8114612b6657600080fd5b50565b600081359050612b7881612b52565b92915050565b6000819050919050565b612b9181612b7e565b8114612b9c57600080fd5b50565b600081359050612bae81612b88565b92915050565b60008060408385031215612bcb57612bca6129ae565b5b6000612bd985828601612b69565b9250506020612bea85828601612b9f565b9150509250929050565b612bfd81612b7e565b82525050565b6000602082019050612c186000830184612bf4565b92915050565b6000819050919050565b612c3181612c1e565b82525050565b6000602082019050612c4c6000830184612c28565b92915050565b600080600060608486031215612c6b57612c6a6129ae565b5b6000612c7986828701612b69565b9350506020612c8a86828701612b69565b9250506040612c9b86828701612b9f565b9150509250925092565b612cae81612c1e565b8114612cb957600080fd5b50565b600081359050612ccb81612ca5565b92915050565b600060208284031215612ce757612ce66129ae565b5b6000612cf584828501612cbc565b91505092915050565b600060208284031215612d1457612d136129ae565b5b6000612d2284828501612b69565b91505092915050565b60008060408385031215612d4257612d416129ae565b5b6000612d5085828601612cbc565b9250506020612d6185828601612b69565b9150509250929050565b600060ff82169050919050565b612d8181612d6b565b82525050565b6000602082019050612d9c6000830184612d78565b92915050565b600060208284031215612db857612db76129ae565b5b6000612dc684828501612b9f565b91505092915050565b612dd881612b40565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b600063ffffffff82169050919050565b612e1281612df9565b82525050565b6000602082019050612e2d6000830184612e09565b92915050565b60008060408385031215612e4a57612e496129ae565b5b6000612e5885828601612b69565b9250506020612e6985828601612b69565b9150509250929050565b612e7c81612df9565b8114612e8757600080fd5b50565b600081359050612e9981612e73565b92915050565b60008060408385031215612eb657612eb56129ae565b5b6000612ec485828601612b69565b9250506020612ed585828601612e8a565b9150509250929050565b6000604082019050612ef46000830185612e09565b612f016020830184612bf4565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f4f57607f821691505b602082108103612f6257612f61612f08565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612fc4602f83612a79565b9150612fcf82612f68565b604082019050919050565b60006020820190508181036000830152612ff381612fb7565b9050919050565b7f424f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b6000613056602783612a79565b915061306182612ffa565b604082019050919050565b6000602082019050818103600083015261308581613049565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130c682612df9565b91506130d183612df9565b9250828203905063ffffffff8111156130ed576130ec61308c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061312d82612df9565b915061313883612df9565b925082613148576131476130f3565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131af602483612a79565b91506131ba82613153565b604082019050919050565b600060208201905081810360008301526131de816131a2565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613241602283612a79565b915061324c826131e5565b604082019050919050565b6000602082019050818103600083015261327081613234565b9050919050565b50565b6000613287600083612a79565b915061329282613277565b600082019050919050565b600060208201905081810360008301526132b68161327a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613319602583612a79565b9150613324826132bd565b604082019050919050565b600060208201905081810360008301526133488161330c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133ab602383612a79565b91506133b68261334f565b604082019050919050565b600060208201905081810360008301526133da8161339e565b9050919050565b60006133ec82612b7e565b91506133f783612b7e565b925082820390508181111561340f5761340e61308c565b5b92915050565b600061342082612b7e565b915061342b83612b7e565b92508282019050808211156134435761344261308c565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061347f601b83612a79565b915061348a82613449565b602082019050919050565b600060208201905081810360008301526134ae81613472565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613511602183612a79565b915061351c826134b5565b604082019050919050565b6000602082019050818103600083015261354081613504565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613588601783613547565b915061359382613552565b601782019050919050565b60006135a982612a6e565b6135b38185613547565b93506135c3818560208601612a8a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613605601183613547565b9150613610826135cf565b601182019050919050565b60006136268261357b565b9150613632828561359e565b915061363d826135f8565b9150613649828461359e565b91508190509392505050565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b600061368b601e83612a79565b915061369682613655565b602082019050919050565b600060208201905081810360008301526136ba8161367e565b9050919050565b60006136cc82612b7e565b91506136d783612b7e565b92508282026136e581612b7e565b915082820484148315176136fc576136fb61308c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061376c82612b7e565b91506000820361377f5761377e61308c565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006137c0602083612a79565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b600061380182612df9565b915061380c83612df9565b9250828201905063ffffffff8111156138285761382761308c565b5b92915050565b7f424f4e453a3a5f7772697465436865636b706f696e743a206e6577206368656360008201527f6b706f696e742065786365656473203332206269747300000000000000000000602082015250565b600061388a603683612a79565b91506138958261382e565b604082019050919050565b600060208201905081810360008301526138b98161387d565b9050919050565b60006040820190506138d56000830185612bf4565b6138e26020830184612bf4565b939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365424f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a0100471a0731c8c1565b1ac8fd46e4f4689e0ddb4e1b86202e837119758f7ca64736f6c6343000813003300000000000000000000000000000000000000000000d3c21bcecceda1000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80636fcfff451161010f578063a9059cbb116100a2578063e328400c11610071578063e328400c14610651578063e7a324dc1461066f578063f1127ed81461068d578063f6b074b9146106be576101f0565b8063a9059cbb146105a5578063b4b5ea57146105d5578063d547741f14610605578063dd62ed3e14610621576101f0565b806391d14854116100de57806391d148541461050957806395d89b4114610539578063a217fddf14610557578063a457c2d714610575576101f0565b80636fcfff451461044957806370a0823114610479578063782d6fe1146104a95780637ecebe00146104d9576101f0565b806326ef6cdb11610187578063395093511161015657806339509351146103b157806342966c68146103e1578063587cde1e146103fd5780635c19a95c1461042d576101f0565b806326ef6cdb1461032b5780632f2ff15d1461035b578063313ce5671461037757806336568abe14610395576101f0565b806320606b70116101c357806320606b701461029157806323b872dd146102af578063248a9ca3146102df578063261bb4661461030f576101f0565b806301ffc9a7146101f557806306fdde0314610225578063095ea7b31461024357806318160ddd14610273575b600080fd5b61020f600480360381019061020a9190612a0b565b6106da565b60405161021c9190612a53565b60405180910390f35b61022d610754565b60405161023a9190612afe565b60405180910390f35b61025d60048036038101906102589190612bb4565b6107e6565b60405161026a9190612a53565b60405180910390f35b61027b610804565b6040516102889190612c03565b60405180910390f35b61029961080e565b6040516102a69190612c37565b60405180910390f35b6102c960048036038101906102c49190612c52565b610832565b6040516102d69190612a53565b60405180910390f35b6102f960048036038101906102f49190612cd1565b61090b565b6040516103069190612c37565b60405180910390f35b61032960048036038101906103249190612cfe565b61092a565b005b61034560048036038101906103409190612cfe565b6109af565b6040516103529190612a53565b60405180910390f35b61037560048036038101906103709190612d2b565b610a05565b005b61037f610a26565b60405161038c9190612d87565b60405180910390f35b6103af60048036038101906103aa9190612d2b565b610a3d565b005b6103cb60048036038101906103c69190612bb4565b610ac0565b6040516103d89190612a53565b60405180910390f35b6103fb60048036038101906103f69190612da2565b610b73565b005b61041760048036038101906104129190612cfe565b610b87565b6040516104249190612dde565b60405180910390f35b61044760048036038101906104429190612cfe565b610bf0565b005b610463600480360381019061045e9190612cfe565b610bfd565b6040516104709190612e18565b60405180910390f35b610493600480360381019061048e9190612cfe565b610c20565b6040516104a09190612c03565b60405180910390f35b6104c360048036038101906104be9190612bb4565b610c69565b6040516104d09190612c03565b60405180910390f35b6104f360048036038101906104ee9190612cfe565b61103e565b6040516105009190612c03565b60405180910390f35b610523600480360381019061051e9190612d2b565b611056565b6040516105309190612a53565b60405180910390f35b6105416110c0565b60405161054e9190612afe565b60405180910390f35b61055f611152565b60405161056c9190612c37565b60405180910390f35b61058f600480360381019061058a9190612bb4565b611159565b60405161059c9190612a53565b60405180910390f35b6105bf60048036038101906105ba9190612bb4565b611226565b6040516105cc9190612a53565b60405180910390f35b6105ef60048036038101906105ea9190612cfe565b611244565b6040516105fc9190612c03565b60405180910390f35b61061f600480360381019061061a9190612d2b565b611323565b005b61063b60048036038101906106369190612e33565b611344565b6040516106489190612c03565b60405180910390f35b6106596113cb565b6040516106669190612c37565b60405180910390f35b6106776113ef565b6040516106849190612c37565b60405180910390f35b6106a760048036038101906106a29190612e9f565b611413565b6040516106b5929190612edf565b60405180910390f35b6106d860048036038101906106d39190612cfe565b611454565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074d575061074c826114da565b5b9050919050565b60606006805461076390612f37565b80601f016020809104026020016040519081016040528092919081815260200182805461078f90612f37565b80156107dc5780601f106107b1576101008083540402835291602001916107dc565b820191906000526020600020905b8154815290600101906020018083116107bf57829003601f168201915b5050505050905090565b60006107fa6107f3611544565b848461154c565b6001905092915050565b6000600454905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061083f848484611715565b6109008461084b611544565b6108fb8560405180606001604052806028815260200161393260289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108b1611544565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b61154c565b600190509392505050565b6000806000838152602001908152602001600020600101549050919050565b7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab61095481611b07565b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610a0e8261090b565b610a1781611b07565b610a218383611b1b565b505050565b6000600860009054906101000a900460ff16905090565b610a45611544565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa990612fda565b60405180910390fd5b610abc8282611bfb565b5050565b6000610b69610acd611544565b84610b648560036000610ade611544565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cdc90919063ffffffff16565b61154c565b6001905092915050565b610b84610b7e611544565b82611d3a565b50565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610bfa3382611ee9565b50565b600a6020528060005260406000206000915054906101000a900463ffffffff1681565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000438210610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca49061306c565b60405180910390fd5b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1603610d19576000915050611038565b82600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610d6891906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610e1557600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610def91906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050611038565b82600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610e96576000915050611038565b600080600183610ea691906130bb565b90505b8163ffffffff168163ffffffff161115610fd257600060028383610ecd91906130bb565b610ed79190613122565b82610ee291906130bb565b90506000600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1603610fa157806020015195505050505050611038565b86816000015163ffffffff161015610fbb57819350610fcb565b600182610fc891906130bb565b92505b5050610ea9565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b600c6020528060005260406000206000915090505481565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600780546110cf90612f37565b80601f01602080910402602001604051908101604052809291908181526020018280546110fb90612f37565b80156111485780601f1061111d57610100808354040283529160200191611148565b820191906000526020600020905b81548152906001019060200180831161112b57829003601f168201915b5050505050905090565b6000801b81565b600061121c611166611544565b846112178560405180606001604052806025815260200161398e6025913960036000611190611544565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b61154c565b6001905092915050565b600061123a611233611544565b8484611715565b6001905092915050565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116112ae57600061131b565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836112fc91906130bb565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b61132c8261090b565b61133581611b07565b61133f8383611bfb565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab81565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600b602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab61147e81611b07565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b2906131c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190613257565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117089190612c03565b60405180910390a3505050565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806117b65750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156118125760011515600560009054906101000a900460ff16151514611811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118089061329d565b60405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118789061332f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e7906133c1565b60405180910390fd5b6118fb83838361205a565b6119678160405180606001604052806026815260200161390c60269139600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119fc81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cdc90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a9c9190612c03565b60405180910390a3505050565b6000838311158290611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae89190612afe565b60405180910390fd5b508284611afe91906133e1565b90509392505050565b611b1881611b13611544565b61205f565b50565b611b258282611056565b611bf757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b9c611544565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611c058282611056565b15611cd857600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c7d611544565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808284611ceb9190613415565b905083811015611d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2790613495565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da090613527565b60405180910390fd5b611db58260008361205a565b611e21816040518060600160405280602281526020016138ea60229139600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611aa99092919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e79816004546120e490919063ffffffff16565b600481905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611edd9190612c03565b60405180910390a35050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611f5884610c20565b905082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461205482848361213d565b50505050565b505050565b6120698282611056565b6120e057612076816123ec565b6120848360001c6020612419565b60405160200161209592919061361b565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79190612afe565b60405180910390fd5b5050565b600082821115612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906136a1565b60405180910390fd5b818361213591906133e1565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121795750600081115b156123e757600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122b2576000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161221c576000612289565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461226a91906130bb565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006122a084836120e490919063ffffffff16565b90506122ae86848484612655565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123e6576000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116123505760006123bd565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461239e91906130bb565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006123d48483611cdc90919063ffffffff16565b90506123e285848484612655565b5050505b5b505050565b60606124128273ffffffffffffffffffffffffffffffffffffffff16601460ff16612419565b9050919050565b60606000600283600261242c91906136c1565b6124369190613415565b67ffffffffffffffff81111561244f5761244e613703565b5b6040519080825280601f01601f1916602001820160405280156124815781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124b9576124b8613732565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061251d5761251c613732565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261255d91906136c1565b6125679190613415565b90505b6001811115612607577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125a9576125a8613732565b5b1a60f81b8282815181106125c0576125bf613732565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061260090613761565b905061256a565b506000841461264b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612642906137d6565b60405180910390fd5b8091505092915050565b60006126794360405180606001604052806034815260200161395a60349139612958565b905060008463ffffffff1611801561271757508063ffffffff16600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876126e191906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156127915781600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761276b91906130bb565b63ffffffff1663ffffffff16815260200190815260200160002060010181905550612901565b60405180604001604052808263ffffffff16815260200183815250600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050508363ffffffff1660018561285091906137f6565b63ffffffff1611612896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288d906138a0565b60405180910390fd5b6001846128a391906137f6565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516129499291906138c0565b60405180910390a25050505050565b6000640100000000831082906129a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299b9190612afe565b60405180910390fd5b5082905092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129e8816129b3565b81146129f357600080fd5b50565b600081359050612a05816129df565b92915050565b600060208284031215612a2157612a206129ae565b5b6000612a2f848285016129f6565b91505092915050565b60008115159050919050565b612a4d81612a38565b82525050565b6000602082019050612a686000830184612a44565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612aa8578082015181840152602081019050612a8d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ad082612a6e565b612ada8185612a79565b9350612aea818560208601612a8a565b612af381612ab4565b840191505092915050565b60006020820190508181036000830152612b188184612ac5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b4b82612b20565b9050919050565b612b5b81612b40565b8114612b6657600080fd5b50565b600081359050612b7881612b52565b92915050565b6000819050919050565b612b9181612b7e565b8114612b9c57600080fd5b50565b600081359050612bae81612b88565b92915050565b60008060408385031215612bcb57612bca6129ae565b5b6000612bd985828601612b69565b9250506020612bea85828601612b9f565b9150509250929050565b612bfd81612b7e565b82525050565b6000602082019050612c186000830184612bf4565b92915050565b6000819050919050565b612c3181612c1e565b82525050565b6000602082019050612c4c6000830184612c28565b92915050565b600080600060608486031215612c6b57612c6a6129ae565b5b6000612c7986828701612b69565b9350506020612c8a86828701612b69565b9250506040612c9b86828701612b9f565b9150509250925092565b612cae81612c1e565b8114612cb957600080fd5b50565b600081359050612ccb81612ca5565b92915050565b600060208284031215612ce757612ce66129ae565b5b6000612cf584828501612cbc565b91505092915050565b600060208284031215612d1457612d136129ae565b5b6000612d2284828501612b69565b91505092915050565b60008060408385031215612d4257612d416129ae565b5b6000612d5085828601612cbc565b9250506020612d6185828601612b69565b9150509250929050565b600060ff82169050919050565b612d8181612d6b565b82525050565b6000602082019050612d9c6000830184612d78565b92915050565b600060208284031215612db857612db76129ae565b5b6000612dc684828501612b9f565b91505092915050565b612dd881612b40565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b600063ffffffff82169050919050565b612e1281612df9565b82525050565b6000602082019050612e2d6000830184612e09565b92915050565b60008060408385031215612e4a57612e496129ae565b5b6000612e5885828601612b69565b9250506020612e6985828601612b69565b9150509250929050565b612e7c81612df9565b8114612e8757600080fd5b50565b600081359050612e9981612e73565b92915050565b60008060408385031215612eb657612eb56129ae565b5b6000612ec485828601612b69565b9250506020612ed585828601612e8a565b9150509250929050565b6000604082019050612ef46000830185612e09565b612f016020830184612bf4565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f4f57607f821691505b602082108103612f6257612f61612f08565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612fc4602f83612a79565b9150612fcf82612f68565b604082019050919050565b60006020820190508181036000830152612ff381612fb7565b9050919050565b7f424f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b6000613056602783612a79565b915061306182612ffa565b604082019050919050565b6000602082019050818103600083015261308581613049565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130c682612df9565b91506130d183612df9565b9250828203905063ffffffff8111156130ed576130ec61308c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061312d82612df9565b915061313883612df9565b925082613148576131476130f3565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131af602483612a79565b91506131ba82613153565b604082019050919050565b600060208201905081810360008301526131de816131a2565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613241602283612a79565b915061324c826131e5565b604082019050919050565b6000602082019050818103600083015261327081613234565b9050919050565b50565b6000613287600083612a79565b915061329282613277565b600082019050919050565b600060208201905081810360008301526132b68161327a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613319602583612a79565b9150613324826132bd565b604082019050919050565b600060208201905081810360008301526133488161330c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133ab602383612a79565b91506133b68261334f565b604082019050919050565b600060208201905081810360008301526133da8161339e565b9050919050565b60006133ec82612b7e565b91506133f783612b7e565b925082820390508181111561340f5761340e61308c565b5b92915050565b600061342082612b7e565b915061342b83612b7e565b92508282019050808211156134435761344261308c565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061347f601b83612a79565b915061348a82613449565b602082019050919050565b600060208201905081810360008301526134ae81613472565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613511602183612a79565b915061351c826134b5565b604082019050919050565b6000602082019050818103600083015261354081613504565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613588601783613547565b915061359382613552565b601782019050919050565b60006135a982612a6e565b6135b38185613547565b93506135c3818560208601612a8a565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613605601183613547565b9150613610826135cf565b601182019050919050565b60006136268261357b565b9150613632828561359e565b915061363d826135f8565b9150613649828461359e565b91508190509392505050565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000600082015250565b600061368b601e83612a79565b915061369682613655565b602082019050919050565b600060208201905081810360008301526136ba8161367e565b9050919050565b60006136cc82612b7e565b91506136d783612b7e565b92508282026136e581612b7e565b915082820484148315176136fc576136fb61308c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061376c82612b7e565b91506000820361377f5761377e61308c565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006137c0602083612a79565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b600061380182612df9565b915061380c83612df9565b9250828201905063ffffffff8111156138285761382761308c565b5b92915050565b7f424f4e453a3a5f7772697465436865636b706f696e743a206e6577206368656360008201527f6b706f696e742065786365656473203332206269747300000000000000000000602082015250565b600061388a603683612a79565b91506138958261382e565b604082019050919050565b600060208201905081810360008301526138b98161387d565b9050919050565b60006040820190506138d56000830185612bf4565b6138e26020830184612bf4565b939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365424f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a0100471a0731c8c1565b1ac8fd46e4f4689e0ddb4e1b86202e837119758f7ca64736f6c63430008130033

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

00000000000000000000000000000000000000000000d3c21bcecceda1000000

-----Decoded View---------------
Arg [0] : totalsupply_ (uint256): 1000000000000000000000000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000


Deployed Bytecode Sourcemap

86:6433:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2571:202:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2123:89:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3330:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2412:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1157:122:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4545:317:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4343:129:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2528:109:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2764:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4768:145:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2317:89:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5877:214:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6003:215:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;271:81:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1914:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2167:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;676:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2876:125:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2691:1184:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1357:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2860:145:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2218:93:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1992:49:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5349:266:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3906:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4069:219:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5193:147:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3554:149:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1218:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;970:117:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;805:70;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2643:115:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2571:202:0;2656:4;2694:32;2679:47;;;:11;:47;;;;:87;;;;2730:36;2754:11;2730:23;:36::i;:::-;2679:87;2672:94;;2571:202;;;:::o;2123:89:3:-;2168:13;2200:5;2193:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2123:89;:::o;3330:166::-;3413:4;3429:39;3438:12;:10;:12::i;:::-;3452:7;3461:6;3429:8;:39::i;:::-;3485:4;3478:11;;3330:166;;;;:::o;2412:106::-;2473:7;2499:12;;2492:19;;2412:106;:::o;1157:122:7:-;1199:80;1157:122;:::o;4545:317:3:-;4651:4;4667:36;4677:6;4685:9;4696:6;4667:9;:36::i;:::-;4713:121;4722:6;4730:12;:10;:12::i;:::-;4744:89;4782:6;4744:89;;;;;;;;;;;;;;;;;:11;:19;4756:6;4744:19;;;;;;;;;;;;;;;:33;4764:12;:10;:12::i;:::-;4744:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;4713:8;:121::i;:::-;4851:4;4844:11;;4545:317;;;;;:::o;4343:129:0:-;4417:7;4443:6;:12;4450:4;4443:12;;;;;;;;;;;:22;;;4436:29;;4343:129;;;:::o;2528:109:3:-;1258:26;2470:16:0;2481:4;2470:10;:16::i;:::-;2626:4:3::1;2609:5:::0;:14:::1;2615:7;2609:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;2528:109:::0;;:::o;2764:106::-;2826:4;2849:5;:14;2855:7;2849:14;;;;;;;;;;;;;;;;;;;;;;;;;2842:21;;2764:106;;;:::o;4768:145:0:-;4851:18;4864:4;4851:12;:18::i;:::-;2470:16;2481:4;2470:10;:16::i;:::-;4881:25:::1;4892:4;4898:7;4881:10;:25::i;:::-;4768:145:::0;;;:::o;2317:89:3:-;2366:5;2390:9;;;;;;;;;;;2383:16;;2317:89;:::o;5877:214:0:-;5983:12;:10;:12::i;:::-;5972:23;;:7;:23;;;5964:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6058:26;6070:4;6076:7;6058:11;:26::i;:::-;5877:214;;:::o;6003:215:3:-;6091:4;6107:83;6116:12;:10;:12::i;:::-;6130:7;6139:50;6178:10;6139:11;:25;6151:12;:10;:12::i;:::-;6139:25;;;;;;;;;;;;;;;:34;6165:7;6139:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;6107:8;:83::i;:::-;6207:4;6200:11;;6003:215;;;;:::o;271:81:7:-;318:27;324:12;:10;:12::i;:::-;338:6;318:5;:27::i;:::-;271:81;:::o;1914:115::-;1975:7;2001:10;:21;2012:9;2001:21;;;;;;;;;;;;;;;;;;;;;;;;;1994:28;;1914:115;;;:::o;2167:102::-;2230:32;2240:10;2252:9;2230;:32::i;:::-;2167:102;:::o;676:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;2876:125:3:-;2950:7;2976:9;:18;2986:7;2976:18;;;;;;;;;;;;;;;;2969:25;;2876:125;;;:::o;2691:1184:7:-;2772:7;2812:12;2798:11;:26;2790:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2878:19;2900:14;:23;2915:7;2900:23;;;;;;;;;;;;;;;;;;;;;;;;;2878:45;;2953:1;2937:12;:17;;;2933:56;;2977:1;2970:8;;;;;2933:56;3097:11;3045;:20;3057:7;3045:20;;;;;;;;;;;;;;;:38;3081:1;3066:12;:16;;;;:::i;:::-;3045:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;3041:145;;3131:11;:20;3143:7;3131:20;;;;;;;;;;;;;;;:38;3167:1;3152:12;:16;;;;:::i;:::-;3131:38;;;;;;;;;;;;;;;:44;;;3124:51;;;;;3041:145;3279:11;3243;:20;3255:7;3243:20;;;;;;;;;;;;;;;:23;3264:1;3243:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;3239:86;;;3313:1;3306:8;;;;;3239:86;3334:12;3360;3390:1;3375:12;:16;;;;:::i;:::-;3360:31;;3401:418;3416:5;3408:13;;:5;:13;;;3401:418;;;3437:13;3479:1;3470:5;3462;:13;;;;:::i;:::-;3461:19;;;;:::i;:::-;3453:5;:27;;;;:::i;:::-;3437:43;;3521:20;3544:11;:20;3556:7;3544:20;;;;;;;;;;;;;;;:28;3565:6;3544:28;;;;;;;;;;;;;;;3521:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3606:11;3590:2;:12;;;:27;;;3586:223;;3644:2;:8;;;3637:15;;;;;;;;;3586:223;3692:11;3677:2;:12;;;:26;;;3673:136;;;3731:6;3723:14;;3673:136;;;3793:1;3784:6;:10;;;;:::i;:::-;3776:18;;3673:136;3423:396;;3401:418;;;3835:11;:20;3847:7;3835:20;;;;;;;;;;;;;;;:27;3856:5;3835:27;;;;;;;;;;;;;;;:33;;;3828:40;;;;;2691:1184;;;;;:::o;1357:39::-;;;;;;;;;;;;;;;;;:::o;2860:145:0:-;2946:4;2969:6;:12;2976:4;2969:12;;;;;;;;;;;:20;;:29;2990:7;2969:29;;;;;;;;;;;;;;;;;;;;;;;;;2962:36;;2860:145;;;;:::o;2218:93:3:-;2265:13;2297:7;2290:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2218:93;:::o;1992:49:0:-;2037:4;1992:49;;;:::o;5349:266:3:-;5442:4;5458:129;5467:12;:10;:12::i;:::-;5481:7;5490:96;5529:15;5490:96;;;;;;;;;;;;;;;;;:11;:25;5502:12;:10;:12::i;:::-;5490:25;;;;;;;;;;;;;;;:34;5516:7;5490:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;5458:8;:129::i;:::-;5604:4;5597:11;;5349:266;;;;:::o;3906:172::-;3992:4;4008:42;4018:12;:10;:12::i;:::-;4032:9;4043:6;4008:9;:42::i;:::-;4067:4;4060:11;;3906:172;;;;:::o;4069:219:7:-;4134:7;4152:19;4174:14;:23;4189:7;4174:23;;;;;;;;;;;;;;;;;;;;;;;;;4152:45;;4229:1;4214:12;:16;;;:67;;4280:1;4214:67;;;4233:11;:20;4245:7;4233:20;;;;;;;;;;;;;;;:38;4269:1;4254:12;:16;;;;:::i;:::-;4233:38;;;;;;;;;;;;;;;:44;;;4214:67;4207:74;;;4069:219;;;:::o;5193:147:0:-;5277:18;5290:4;5277:12;:18::i;:::-;2470:16;2481:4;2470:10;:16::i;:::-;5307:26:::1;5319:4;5325:7;5307:11;:26::i;:::-;5193:147:::0;;;:::o;3554:149:3:-;3643:7;3669:11;:18;3681:5;3669:18;;;;;;;;;;;;;;;:27;3688:7;3669:27;;;;;;;;;;;;;;;;3662:34;;3554:149;;;;:::o;1218:66::-;1258:26;1218:66;:::o;970:117:7:-;1016:71;970:117;:::o;805:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2643:115:3:-;1258:26;2470:16:0;2481:4;2470:10;:16::i;:::-;2746:5:3::1;2729;:14;2735:7;2729:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;2643:115:::0;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;9105:340:3:-;9223:1;9206:19;;:5;:19;;;9198:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9303:1;9284:21;;:7;:21;;;9276:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9385:6;9355:11;:18;9367:5;9355:18;;;;;;;;;;;;;;;:27;9374:7;9355:27;;;;;;;;;;;;;;;:36;;;;9422:7;9406:32;;9415:5;9406:32;;;9431:6;9406:32;;;;;;:::i;:::-;;;;;;;;9105:340;;;:::o;6692:619::-;6793:5;:16;6799:9;6793:16;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;6813:5;:13;6819:6;6813:13;;;;;;;;;;;;;;;;;;;;;;;;;6793:33;6789:71;;;6851:4;6836:19;;:11;;;;;;;;;;;:19;;;6828:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;6789:71;6896:1;6878:20;;:6;:20;;;6870:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;6979:1;6958:23;;:9;:23;;;6950:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7040:47;7061:6;7069:9;7080:6;7040:20;:47::i;:::-;7118:71;7140:6;7118:71;;;;;;;;;;;;;;;;;:9;:17;7128:6;7118:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;7098:9;:17;7108:6;7098:17;;;;;;;;;;;;;;;:91;;;;7222:32;7247:6;7222:9;:20;7232:9;7222:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;7199:9;:20;7209:9;7199:20;;;;;;;;;;;;;;;:55;;;;7286:9;7269:35;;7278:6;7269:35;;;7297:6;7269:35;;;;;;:::i;:::-;;;;;;;;6692:619;;;:::o;4322:163:9:-;4408:7;4440:1;4435;:6;;4443:12;4427:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4477:1;4473;:5;;;;:::i;:::-;4466:12;;4322:163;;;;;:::o;3299:103:0:-;3365:30;3376:4;3382:12;:10;:12::i;:::-;3365:10;:30::i;:::-;3299:103;:::o;7426:233::-;7509:22;7517:4;7523:7;7509;:22::i;:::-;7504:149;;7579:4;7547:6;:12;7554:4;7547:12;;;;;;;;;;;:20;;:29;7568:7;7547:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;7629:12;:10;:12::i;:::-;7602:40;;7620:7;7602:40;;7614:4;7602:40;;;;;;;;;;7504:149;7426:233;;:::o;7830:234::-;7913:22;7921:4;7927:7;7913;:22::i;:::-;7909:149;;;7983:5;7951:6;:12;7958:4;7951:12;;;;;;;;;;;:20;;:29;7972:7;7951:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8034:12;:10;:12::i;:::-;8007:40;;8025:7;8007:40;;8019:4;8007:40;;;;;;;;;;7909:149;7830:234;;:::o;2382:175:9:-;2440:7;2459:9;2475:1;2471;:5;;;;:::i;:::-;2459:17;;2499:1;2494;:6;;2486:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2549:1;2542:8;;;2382:175;;;;:::o;7631:410:3:-;7733:1;7714:21;;:7;:21;;;7706:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7784:49;7805:7;7822:1;7826:6;7784:20;:49::i;:::-;7865:68;7888:6;7865:68;;;;;;;;;;;;;;;;;:9;:18;7875:7;7865:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;7844:9;:18;7854:7;7844:18;;;;;;;;;;;;;;;:89;;;;7958:24;7975:6;7958:12;;:16;;:24;;;;:::i;:::-;7943:12;:39;;;;8023:1;7997:37;;8006:7;7997:37;;;8027:6;7997:37;;;;;;:::i;:::-;;;;;;;;7631:410;;:::o;4294:370:7:-;4370:23;4396:10;:21;4407:9;4396:21;;;;;;;;;;;;;;;;;;;;;;;;;4370:47;;4427:24;4454:20;4464:9;4454;:20::i;:::-;4427:47;;4509:9;4485:10;:21;4496:9;4485:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;4577:9;4533:54;;4560:15;4533:54;;4549:9;4533:54;;;;;;;;;;;;4597:60;4612:15;4629:9;4640:16;4597:14;:60::i;:::-;4360:304;;4294:370;;:::o;10032:92:3:-;;;;:::o;3683:479:0:-;3771:22;3779:4;3785:7;3771;:22::i;:::-;3766:390;;3954:28;3974:7;3954:19;:28::i;:::-;4053:38;4081:4;4073:13;;4088:2;4053:19;:38::i;:::-;3861:252;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3809:336;;;;;;;;;;;:::i;:::-;;;;;;;;3766:390;3683:479;;:::o;2821:155:9:-;2879:7;2911:1;2906;:6;;2898:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;2968:1;2964;:5;;;;:::i;:::-;2957:12;;2821:155;;;;:::o;5424:929:7:-;5529:6;5519:16;;:6;:16;;;;:30;;;;;5548:1;5539:6;:10;5519:30;5515:832;;;5587:1;5569:20;;:6;:20;;;5565:379;;5656:16;5675:14;:22;5690:6;5675:22;;;;;;;;;;;;;;;;;;;;;;;;;5656:41;;5715:17;5747:1;5735:9;:13;;;:60;;5794:1;5735:60;;;5751:11;:19;5763:6;5751:19;;;;;;;;;;;;;;;:34;5783:1;5771:9;:13;;;;:::i;:::-;5751:34;;;;;;;;;;;;;;;:40;;;5735:60;5715:80;;5813:17;5833:21;5847:6;5833:9;:13;;:21;;;;:::i;:::-;5813:41;;5872:57;5889:6;5897:9;5908;5919;5872:16;:57::i;:::-;5591:353;;;5565:379;5980:1;5962:20;;:6;:20;;;5958:379;;6049:16;6068:14;:22;6083:6;6068:22;;;;;;;;;;;;;;;;;;;;;;;;;6049:41;;6108:17;6140:1;6128:9;:13;;;:60;;6187:1;6128:60;;;6144:11;:19;6156:6;6144:19;;;;;;;;;;;;;;;:34;6176:1;6164:9;:13;;;;:::i;:::-;6144:34;;;;;;;;;;;;;;;:40;;;6128:60;6108:80;;6206:17;6226:21;6240:6;6226:9;:13;;:21;;;;:::i;:::-;6206:41;;6265:57;6282:6;6290:9;6301;6312;6265:16;:57::i;:::-;5984:353;;;5958:379;5515:832;5424:929;;;:::o;2097:149:10:-;2155:13;2187:52;2215:4;2199:22;;306:2;2187:52;;:11;:52::i;:::-;2180:59;;2097:149;;;:::o;1508:437::-;1583:13;1608:19;1653:1;1644:6;1640:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1630:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1608:47;;1665:15;:6;1672:1;1665:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1690;:6;1697:1;1690:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1720:9;1745:1;1736:6;1732:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1720:26;;1715:128;1752:1;1748;:5;1715:128;;;1786:8;1803:3;1795:5;:11;1786:21;;;;;;;:::i;:::-;;;;;1774:6;1781:1;1774:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;1831:1;1821:11;;;;;1755:3;;;;:::i;:::-;;;1715:128;;;;1869:1;1860:5;:10;1852:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1931:6;1917:21;;;1508:437;;;;:::o;4670:748:7:-;4791:18;4812:76;4819:12;4812:76;;;;;;;;;;;;;;;;;:6;:76::i;:::-;4791:97;;4918:1;4903:12;:16;;;:85;;;;;4977:11;4923:65;;:11;:22;4935:9;4923:22;;;;;;;;;;;;;;;:40;4961:1;4946:12;:16;;;;:::i;:::-;4923:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;4903:85;4899:446;;;5053:8;5004:11;:22;5016:9;5004:22;;;;;;;;;;;;;;;:40;5042:1;5027:12;:16;;;;:::i;:::-;5004:40;;;;;;;;;;;;;;;:46;;:57;;;;4899:446;;;5131:33;;;;;;;;5142:11;5131:33;;;;;;5155:8;5131:33;;;5092:11;:22;5104:9;5092:22;;;;;;;;;;;;;;;:36;5115:12;5092:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5205:12;5186:31;;5201:1;5186:12;:16;;;;:::i;:::-;:31;;;5178:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;5333:1;5318:12;:16;;;;:::i;:::-;5290:14;:25;5305:9;5290:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;4899:446;5381:9;5360:51;;;5392:8;5402;5360:51;;;;;;;:::i;:::-;;;;;;;;4781:637;4670:748;;;;:::o;6359:158::-;6434:6;6464:5;6460:1;:9;6471:12;6452:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6508:1;6494:16;;6359:158;;;;:::o;88:117:11:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:118::-;4290:24;4308:5;4290:24;:::i;:::-;4285:3;4278:37;4203:118;;:::o;4327:222::-;4420:4;4458:2;4447:9;4443:18;4435:26;;4471:71;4539:1;4528:9;4524:17;4515:6;4471:71;:::i;:::-;4327:222;;;;:::o;4555:77::-;4592:7;4621:5;4610:16;;4555:77;;;:::o;4638:118::-;4725:24;4743:5;4725:24;:::i;:::-;4720:3;4713:37;4638:118;;:::o;4762:222::-;4855:4;4893:2;4882:9;4878:18;4870:26;;4906:71;4974:1;4963:9;4959:17;4950:6;4906:71;:::i;:::-;4762:222;;;;:::o;4990:619::-;5067:6;5075;5083;5132:2;5120:9;5111:7;5107:23;5103:32;5100:119;;;5138:79;;:::i;:::-;5100:119;5258:1;5283:53;5328:7;5319:6;5308:9;5304:22;5283:53;:::i;:::-;5273:63;;5229:117;5385:2;5411:53;5456:7;5447:6;5436:9;5432:22;5411:53;:::i;:::-;5401:63;;5356:118;5513:2;5539:53;5584:7;5575:6;5564:9;5560:22;5539:53;:::i;:::-;5529:63;;5484:118;4990:619;;;;;:::o;5615:122::-;5688:24;5706:5;5688:24;:::i;:::-;5681:5;5678:35;5668:63;;5727:1;5724;5717:12;5668:63;5615:122;:::o;5743:139::-;5789:5;5827:6;5814:20;5805:29;;5843:33;5870:5;5843:33;:::i;:::-;5743:139;;;;:::o;5888:329::-;5947:6;5996:2;5984:9;5975:7;5971:23;5967:32;5964:119;;;6002:79;;:::i;:::-;5964:119;6122:1;6147:53;6192:7;6183:6;6172:9;6168:22;6147:53;:::i;:::-;6137:63;;6093:117;5888:329;;;;:::o;6223:::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:474::-;6626:6;6634;6683:2;6671:9;6662:7;6658:23;6654:32;6651:119;;;6689:79;;:::i;:::-;6651:119;6809:1;6834:53;6879:7;6870:6;6859:9;6855:22;6834:53;:::i;:::-;6824:63;;6780:117;6936:2;6962:53;7007:7;6998:6;6987:9;6983:22;6962:53;:::i;:::-;6952:63;;6907:118;6558:474;;;;;:::o;7038:86::-;7073:7;7113:4;7106:5;7102:16;7091:27;;7038:86;;;:::o;7130:112::-;7213:22;7229:5;7213:22;:::i;:::-;7208:3;7201:35;7130:112;;:::o;7248:214::-;7337:4;7375:2;7364:9;7360:18;7352:26;;7388:67;7452:1;7441:9;7437:17;7428:6;7388:67;:::i;:::-;7248:214;;;;:::o;7468:329::-;7527:6;7576:2;7564:9;7555:7;7551:23;7547:32;7544:119;;;7582:79;;:::i;:::-;7544:119;7702:1;7727:53;7772:7;7763:6;7752:9;7748:22;7727:53;:::i;:::-;7717:63;;7673:117;7468:329;;;;:::o;7803:118::-;7890:24;7908:5;7890:24;:::i;:::-;7885:3;7878:37;7803:118;;:::o;7927:222::-;8020:4;8058:2;8047:9;8043:18;8035:26;;8071:71;8139:1;8128:9;8124:17;8115:6;8071:71;:::i;:::-;7927:222;;;;:::o;8155:93::-;8191:7;8231:10;8224:5;8220:22;8209:33;;8155:93;;;:::o;8254:115::-;8339:23;8356:5;8339:23;:::i;:::-;8334:3;8327:36;8254:115;;:::o;8375:218::-;8466:4;8504:2;8493:9;8489:18;8481:26;;8517:69;8583:1;8572:9;8568:17;8559:6;8517:69;:::i;:::-;8375:218;;;;:::o;8599:474::-;8667:6;8675;8724:2;8712:9;8703:7;8699:23;8695:32;8692:119;;;8730:79;;:::i;:::-;8692:119;8850:1;8875:53;8920:7;8911:6;8900:9;8896:22;8875:53;:::i;:::-;8865:63;;8821:117;8977:2;9003:53;9048:7;9039:6;9028:9;9024:22;9003:53;:::i;:::-;8993:63;;8948:118;8599:474;;;;;:::o;9079:120::-;9151:23;9168:5;9151:23;:::i;:::-;9144:5;9141:34;9131:62;;9189:1;9186;9179:12;9131:62;9079:120;:::o;9205:137::-;9250:5;9288:6;9275:20;9266:29;;9304:32;9330:5;9304:32;:::i;:::-;9205:137;;;;:::o;9348:472::-;9415:6;9423;9472:2;9460:9;9451:7;9447:23;9443:32;9440:119;;;9478:79;;:::i;:::-;9440:119;9598:1;9623:53;9668:7;9659:6;9648:9;9644:22;9623:53;:::i;:::-;9613:63;;9569:117;9725:2;9751:52;9795:7;9786:6;9775:9;9771:22;9751:52;:::i;:::-;9741:62;;9696:117;9348:472;;;;;:::o;9826:328::-;9945:4;9983:2;9972:9;9968:18;9960:26;;9996:69;10062:1;10051:9;10047:17;10038:6;9996:69;:::i;:::-;10075:72;10143:2;10132:9;10128:18;10119:6;10075:72;:::i;:::-;9826:328;;;;;:::o;10160:180::-;10208:77;10205:1;10198:88;10305:4;10302:1;10295:15;10329:4;10326:1;10319:15;10346:320;10390:6;10427:1;10421:4;10417:12;10407:22;;10474:1;10468:4;10464:12;10495:18;10485:81;;10551:4;10543:6;10539:17;10529:27;;10485:81;10613:2;10605:6;10602:14;10582:18;10579:38;10576:84;;10632:18;;:::i;:::-;10576:84;10397:269;10346:320;;;:::o;10672:234::-;10812:34;10808:1;10800:6;10796:14;10789:58;10881:17;10876:2;10868:6;10864:15;10857:42;10672:234;:::o;10912:366::-;11054:3;11075:67;11139:2;11134:3;11075:67;:::i;:::-;11068:74;;11151:93;11240:3;11151:93;:::i;:::-;11269:2;11264:3;11260:12;11253:19;;10912:366;;;:::o;11284:419::-;11450:4;11488:2;11477:9;11473:18;11465:26;;11537:9;11531:4;11527:20;11523:1;11512:9;11508:17;11501:47;11565:131;11691:4;11565:131;:::i;:::-;11557:139;;11284:419;;;:::o;11709:226::-;11849:34;11845:1;11837:6;11833:14;11826:58;11918:9;11913:2;11905:6;11901:15;11894:34;11709:226;:::o;11941:366::-;12083:3;12104:67;12168:2;12163:3;12104:67;:::i;:::-;12097:74;;12180:93;12269:3;12180:93;:::i;:::-;12298:2;12293:3;12289:12;12282:19;;11941:366;;;:::o;12313:419::-;12479:4;12517:2;12506:9;12502:18;12494:26;;12566:9;12560:4;12556:20;12552:1;12541:9;12537:17;12530:47;12594:131;12720:4;12594:131;:::i;:::-;12586:139;;12313:419;;;:::o;12738:180::-;12786:77;12783:1;12776:88;12883:4;12880:1;12873:15;12907:4;12904:1;12897:15;12924:200;12963:4;12983:19;13000:1;12983:19;:::i;:::-;12978:24;;13016:19;13033:1;13016:19;:::i;:::-;13011:24;;13059:1;13056;13052:9;13044:17;;13083:10;13077:4;13074:20;13071:46;;;13097:18;;:::i;:::-;13071:46;12924:200;;;;:::o;13130:180::-;13178:77;13175:1;13168:88;13275:4;13272:1;13265:15;13299:4;13296:1;13289:15;13316:182;13355:1;13372:19;13389:1;13372:19;:::i;:::-;13367:24;;13405:19;13422:1;13405:19;:::i;:::-;13400:24;;13443:1;13433:35;;13448:18;;:::i;:::-;13433:35;13490:1;13487;13483:9;13478:14;;13316:182;;;;:::o;13504:223::-;13644:34;13640:1;13632:6;13628:14;13621:58;13713:6;13708:2;13700:6;13696:15;13689:31;13504:223;:::o;13733:366::-;13875:3;13896:67;13960:2;13955:3;13896:67;:::i;:::-;13889:74;;13972:93;14061:3;13972:93;:::i;:::-;14090:2;14085:3;14081:12;14074:19;;13733:366;;;:::o;14105:419::-;14271:4;14309:2;14298:9;14294:18;14286:26;;14358:9;14352:4;14348:20;14344:1;14333:9;14329:17;14322:47;14386:131;14512:4;14386:131;:::i;:::-;14378:139;;14105:419;;;:::o;14530:221::-;14670:34;14666:1;14658:6;14654:14;14647:58;14739:4;14734:2;14726:6;14722:15;14715:29;14530:221;:::o;14757:366::-;14899:3;14920:67;14984:2;14979:3;14920:67;:::i;:::-;14913:74;;14996:93;15085:3;14996:93;:::i;:::-;15114:2;15109:3;15105:12;15098:19;;14757:366;;;:::o;15129:419::-;15295:4;15333:2;15322:9;15318:18;15310:26;;15382:9;15376:4;15372:20;15368:1;15357:9;15353:17;15346:47;15410:131;15536:4;15410:131;:::i;:::-;15402:139;;15129:419;;;:::o;15554:114::-;;:::o;15674:364::-;15816:3;15837:66;15901:1;15896:3;15837:66;:::i;:::-;15830:73;;15912:93;16001:3;15912:93;:::i;:::-;16030:1;16025:3;16021:11;16014:18;;15674:364;;;:::o;16044:419::-;16210:4;16248:2;16237:9;16233:18;16225:26;;16297:9;16291:4;16287:20;16283:1;16272:9;16268:17;16261:47;16325:131;16451:4;16325:131;:::i;:::-;16317:139;;16044:419;;;:::o;16469:224::-;16609:34;16605:1;16597:6;16593:14;16586:58;16678:7;16673:2;16665:6;16661:15;16654:32;16469:224;:::o;16699:366::-;16841:3;16862:67;16926:2;16921:3;16862:67;:::i;:::-;16855:74;;16938:93;17027:3;16938:93;:::i;:::-;17056:2;17051:3;17047:12;17040:19;;16699:366;;;:::o;17071:419::-;17237:4;17275:2;17264:9;17260:18;17252:26;;17324:9;17318:4;17314:20;17310:1;17299:9;17295:17;17288:47;17352:131;17478:4;17352:131;:::i;:::-;17344:139;;17071:419;;;:::o;17496:222::-;17636:34;17632:1;17624:6;17620:14;17613:58;17705:5;17700:2;17692:6;17688:15;17681:30;17496:222;:::o;17724:366::-;17866:3;17887:67;17951:2;17946:3;17887:67;:::i;:::-;17880:74;;17963:93;18052:3;17963:93;:::i;:::-;18081:2;18076:3;18072:12;18065:19;;17724:366;;;:::o;18096:419::-;18262:4;18300:2;18289:9;18285:18;18277:26;;18349:9;18343:4;18339:20;18335:1;18324:9;18320:17;18313:47;18377:131;18503:4;18377:131;:::i;:::-;18369:139;;18096:419;;;:::o;18521:194::-;18561:4;18581:20;18599:1;18581:20;:::i;:::-;18576:25;;18615:20;18633:1;18615:20;:::i;:::-;18610:25;;18659:1;18656;18652:9;18644:17;;18683:1;18677:4;18674:11;18671:37;;;18688:18;;:::i;:::-;18671:37;18521:194;;;;:::o;18721:191::-;18761:3;18780:20;18798:1;18780:20;:::i;:::-;18775:25;;18814:20;18832:1;18814:20;:::i;:::-;18809:25;;18857:1;18854;18850:9;18843:16;;18878:3;18875:1;18872:10;18869:36;;;18885:18;;:::i;:::-;18869:36;18721:191;;;;:::o;18918:177::-;19058:29;19054:1;19046:6;19042:14;19035:53;18918:177;:::o;19101:366::-;19243:3;19264:67;19328:2;19323:3;19264:67;:::i;:::-;19257:74;;19340:93;19429:3;19340:93;:::i;:::-;19458:2;19453:3;19449:12;19442:19;;19101:366;;;:::o;19473:419::-;19639:4;19677:2;19666:9;19662:18;19654:26;;19726:9;19720:4;19716:20;19712:1;19701:9;19697:17;19690:47;19754:131;19880:4;19754:131;:::i;:::-;19746:139;;19473:419;;;:::o;19898:220::-;20038:34;20034:1;20026:6;20022:14;20015:58;20107:3;20102:2;20094:6;20090:15;20083:28;19898:220;:::o;20124:366::-;20266:3;20287:67;20351:2;20346:3;20287:67;:::i;:::-;20280:74;;20363:93;20452:3;20363:93;:::i;:::-;20481:2;20476:3;20472:12;20465:19;;20124:366;;;:::o;20496:419::-;20662:4;20700:2;20689:9;20685:18;20677:26;;20749:9;20743:4;20739:20;20735:1;20724:9;20720:17;20713:47;20777:131;20903:4;20777:131;:::i;:::-;20769:139;;20496:419;;;:::o;20921:148::-;21023:11;21060:3;21045:18;;20921:148;;;;:::o;21075:173::-;21215:25;21211:1;21203:6;21199:14;21192:49;21075:173;:::o;21254:402::-;21414:3;21435:85;21517:2;21512:3;21435:85;:::i;:::-;21428:92;;21529:93;21618:3;21529:93;:::i;:::-;21647:2;21642:3;21638:12;21631:19;;21254:402;;;:::o;21662:390::-;21768:3;21796:39;21829:5;21796:39;:::i;:::-;21851:89;21933:6;21928:3;21851:89;:::i;:::-;21844:96;;21949:65;22007:6;22002:3;21995:4;21988:5;21984:16;21949:65;:::i;:::-;22039:6;22034:3;22030:16;22023:23;;21772:280;21662:390;;;;:::o;22058:167::-;22198:19;22194:1;22186:6;22182:14;22175:43;22058:167;:::o;22231:402::-;22391:3;22412:85;22494:2;22489:3;22412:85;:::i;:::-;22405:92;;22506:93;22595:3;22506:93;:::i;:::-;22624:2;22619:3;22615:12;22608:19;;22231:402;;;:::o;22639:967::-;23021:3;23043:148;23187:3;23043:148;:::i;:::-;23036:155;;23208:95;23299:3;23290:6;23208:95;:::i;:::-;23201:102;;23320:148;23464:3;23320:148;:::i;:::-;23313:155;;23485:95;23576:3;23567:6;23485:95;:::i;:::-;23478:102;;23597:3;23590:10;;22639:967;;;;;:::o;23612:180::-;23752:32;23748:1;23740:6;23736:14;23729:56;23612:180;:::o;23798:366::-;23940:3;23961:67;24025:2;24020:3;23961:67;:::i;:::-;23954:74;;24037:93;24126:3;24037:93;:::i;:::-;24155:2;24150:3;24146:12;24139:19;;23798:366;;;:::o;24170:419::-;24336:4;24374:2;24363:9;24359:18;24351:26;;24423:9;24417:4;24413:20;24409:1;24398:9;24394:17;24387:47;24451:131;24577:4;24451:131;:::i;:::-;24443:139;;24170:419;;;:::o;24595:410::-;24635:7;24658:20;24676:1;24658:20;:::i;:::-;24653:25;;24692:20;24710:1;24692:20;:::i;:::-;24687:25;;24747:1;24744;24740:9;24769:30;24787:11;24769:30;:::i;:::-;24758:41;;24948:1;24939:7;24935:15;24932:1;24929:22;24909:1;24902:9;24882:83;24859:139;;24978:18;;:::i;:::-;24859:139;24643:362;24595:410;;;;:::o;25011:180::-;25059:77;25056:1;25049:88;25156:4;25153:1;25146:15;25180:4;25177:1;25170:15;25197:180;25245:77;25242:1;25235:88;25342:4;25339:1;25332:15;25366:4;25363:1;25356:15;25383:171;25422:3;25445:24;25463:5;25445:24;:::i;:::-;25436:33;;25491:4;25484:5;25481:15;25478:41;;25499:18;;:::i;:::-;25478:41;25546:1;25539:5;25535:13;25528:20;;25383:171;;;:::o;25560:182::-;25700:34;25696:1;25688:6;25684:14;25677:58;25560:182;:::o;25748:366::-;25890:3;25911:67;25975:2;25970:3;25911:67;:::i;:::-;25904:74;;25987:93;26076:3;25987:93;:::i;:::-;26105:2;26100:3;26096:12;26089:19;;25748:366;;;:::o;26120:419::-;26286:4;26324:2;26313:9;26309:18;26301:26;;26373:9;26367:4;26363:20;26359:1;26348:9;26344:17;26337:47;26401:131;26527:4;26401:131;:::i;:::-;26393:139;;26120:419;;;:::o;26545:197::-;26584:3;26603:19;26620:1;26603:19;:::i;:::-;26598:24;;26636:19;26653:1;26636:19;:::i;:::-;26631:24;;26678:1;26675;26671:9;26664:16;;26701:10;26696:3;26693:19;26690:45;;;26715:18;;:::i;:::-;26690:45;26545:197;;;;:::o;26748:241::-;26888:34;26884:1;26876:6;26872:14;26865:58;26957:24;26952:2;26944:6;26940:15;26933:49;26748:241;:::o;26995:366::-;27137:3;27158:67;27222:2;27217:3;27158:67;:::i;:::-;27151:74;;27234:93;27323:3;27234:93;:::i;:::-;27352:2;27347:3;27343:12;27336:19;;26995:366;;;:::o;27367:419::-;27533:4;27571:2;27560:9;27556:18;27548:26;;27620:9;27614:4;27610:20;27606:1;27595:9;27591:17;27584:47;27648:131;27774:4;27648:131;:::i;:::-;27640:139;;27367:419;;;:::o;27792:332::-;27913:4;27951:2;27940:9;27936:18;27928:26;;27964:71;28032:1;28021:9;28017:17;28008:6;27964:71;:::i;:::-;28045:72;28113:2;28102:9;28098:18;28089:6;28045:72;:::i;:::-;27792:332;;;;;:::o

Swarm Source

ipfs://a0100471a0731c8c1565b1ac8fd46e4f4689e0ddb4e1b86202e837119758f7ca
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.