Goerli Testnet

Token

SybilDAO (SYB)
ERC-20

Overview

Max Total Supply

80,000,000 SYB

Holders

7,882

Market

Fully Diluted Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
50 SYB
0x4d217dc1cda85f4c044a0314cf1beb0b0cbc3189
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:
SybilDAO

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 2 of 7 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.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}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

File 3 of 7 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

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

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

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

File 4 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

    /**
     * @dev Moves `amount` tokens from `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 5 of 7 : 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 6 of 7 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 7 of 7 : SybilDAO.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

contract SybilTreasury {
    address payable sybilDAO;
    address public multisig;

    constructor(address _multisig) {
        sybilDAO = payable(msg.sender);
        multisig = _multisig;
    }

    function stake(uint _amount) external {
        require(msg.sender == sybilDAO, "SybilDAO only");
        SybilDAO(sybilDAO).stake(_amount);
    }

    function claim() external {
        require(msg.sender == multisig, "Multisig only");
        SybilDAO(sybilDAO).claimAndRestake();
        payable(multisig).transfer(address(this).balance);
    }

    receive() external payable  {
    }
}

contract SybilDAO is ERC20, Ownable {

    mapping(address => bool) public check;
    mapping(bytes32 => bool) public authCodesUsed;
    bytes32 public merkleRoot = 0x610e4805fea81e5b7d991c4a298ec475dae1ff4cbb45396b3de0212b087dc94b;
    uint public fee = 3e15; // 0.003 ETH ~ $5
    uint public publicSalePrice = 8e13; // ~ $0.1
    uint vestedClaimed;
    uint publicSale;
    uint totalStaked;
    uint stakingPeriod = 7884000; // 3 months
    mapping(address => uint) public staked;
    mapping(address => uint) public lastStakeTime;
    SybilTreasury public treasury;
    uint constant treasuryAllocation = 50_000_000 ether;
    uint constant teamAllocation = 10_000_000 ether;
    uint constant liquidityAllocation = 10_000_000 ether;
    uint constant partnerAllocation = 10_000_000 ether;
    uint constant privateFundingAllocation = 20_000_000 ether;
    uint constant publicFundingAllocation = 20_000_000 ether;
    uint constant vestedAllocation = 30_000_000 ether;
    uint startTimestamp;
    uint constant vestingPeriod = 208 weeks;
    uint constant cliffPeriod = 52 weeks;

    event Verify(address user);
    event Stake(address user, uint amount);
    event Unstake(address user, uint amount, uint ethShare);

    constructor() ERC20("SybilDAO", "SYB") {
        treasury = new SybilTreasury(msg.sender);
        _mint(address(treasury), treasuryAllocation);
        _mint(address(msg.sender), teamAllocation);
        _mint(address(msg.sender), liquidityAllocation);
        _mint(address(msg.sender), partnerAllocation);
        startTimestamp = block.timestamp;
    }

    function verify(address _user, bytes32 authCode, bytes32[] calldata _merkleProof) external payable {
        require(msg.value >= fee, "No fee sent");
        require(authCodesUsed[authCode] == false, "Auth code already used");
        authCodesUsed[authCode] = true;
        bool result = MerkleProof.verify(_merkleProof, merkleRoot, authCode);
        require(result == true, "Verification failed");
        check[_user] = true;
        emit Verify(_user);
    }

    /* Staking */
    function stake(uint _amount) public {
        require(balanceOf(msg.sender) >= _amount, "Not enough SYB balance");
        _transfer(msg.sender,address(this),_amount);
        staked[msg.sender] += _amount;
        totalStaked += _amount;
        lastStakeTime[msg.sender] = block.timestamp;
        emit Stake(msg.sender, _amount);
    }

    function unstake(uint _amount) public {
        require(_amount > 0, "Amount to unstake too low");
        require(block.timestamp > lastStakeTime[msg.sender] + stakingPeriod, "Tokens are locked for staking period");
        require(staked[msg.sender] >= _amount, "Not enough staked balance");
        uint ethShare = stakingRewardsPending(msg.sender);
        staked[msg.sender] -= _amount;
        totalStaked -= _amount;
        _transfer(address(this), msg.sender, _amount);
        payable(msg.sender).transfer(ethShare);
        emit Unstake(msg.sender, _amount, ethShare);
    }

    function claimAndRestake() public {
        uint stakingBalance = staked[msg.sender];
        require(stakingBalance > 0, "Not enough staked balance");
        unstake(stakingBalance);
        stake(stakingBalance);
    }

    function stakingRewardsPending(address _user) public view returns (uint) {
        uint ethPerStakedToken = address(this).balance * 1e18 / totalStaked;
        uint ethShare = staked[_user] * ethPerStakedToken / 1e18;
        return ethShare;
    }

    /* Token Distribution */
    function distributeVestedTokens(address _receiver, uint _amount) external onlyOwner {
        require(vestedClaimed + _amount <= privateFundingAllocation + vestedAllocation, "vested allocation exceeded");
        uint timePassed = block.timestamp - startTimestamp;
        require(timePassed > cliffPeriod, "No distribution before cliff");
        uint claimable = (privateFundingAllocation + vestedAllocation) * timePassed / vestingPeriod;
        require(_amount <= claimable, "Amount too high for vesting");
        _mint(_receiver, _amount);
        vestedClaimed += _amount;
    }

    function vestedClaimable() external view returns (uint) {
        uint timePassed = block.timestamp - startTimestamp;
        uint claimable = (privateFundingAllocation + vestedAllocation) * timePassed / vestingPeriod;
        if (timePassed <= cliffPeriod) claimable = 0;
        return claimable;
    }

    function buyTokens() external payable {
        require(block.timestamp > 0, "Public round is not open");
        require(publicSale + msg.value <= publicFundingAllocation, "Public round exceeded");
        uint sybOut = msg.value * 1e18 / publicSalePrice;
        _mint(address(msg.sender), sybOut);
        publicSale += sybOut;
    }

    /* Admin Functions */
    function treasurystake() external onlyOwner {
        treasury.stake(treasuryAllocation); // runs once
    }

    function bulkVerify(address[] calldata _users) external onlyOwner {
        for (uint i=0; i<_users.length; i++) {
            check[_users[i]] = true;
        }
    }

    function updateMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function updateVariables(uint _fee, uint _publicSalePrice) external onlyOwner {
        if (_fee > 0) fee = _fee;
        if (_publicSalePrice > 0) publicSalePrice = _publicSalePrice;
    }

    receive() external payable  {
    }

}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethShare","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Verify","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"authCodesUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"bulkVerify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAndRestake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"distributeVestedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"stakingRewardsPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract SybilTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasurystake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_publicSalePrice","type":"uint256"}],"name":"updateVariables","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32","name":"authCode","type":"bytes32"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verify","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vestedClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040527f610e4805fea81e5b7d991c4a298ec475dae1ff4cbb45396b3de0212b087dc94b60001b600855660aa87bee5380006009556548c273950000600a5562784ce0600e553480156200005457600080fd5b506040518060400160405280600881526020017f537962696c44414f0000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f53594200000000000000000000000000000000000000000000000000000000008152508160039081620000d29190620006f0565b508060049081620000e49190620006f0565b50505062000107620000fb6200022360201b60201c565b6200022b60201b60201c565b33604051620001169062000468565b6200012291906200081c565b604051809103906000f0801580156200013f573d6000803e3d6000fd5b50601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001bf601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166a295be96e64066972000000620002f160201b60201c565b620001dc336a084595161401484a000000620002f160201b60201c565b620001f9336a084595161401484a000000620002f160201b60201c565b62000216336a084595161401484a000000620002f160201b60201c565b4260128190555062000954565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035a906200089a565b60405180910390fd5b62000377600083836200045e60201b60201c565b80600260008282546200038b9190620008eb565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200043e919062000937565b60405180910390a36200045a600083836200046360201b60201c565b5050565b505050565b505050565b6106d18062003c9283390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f857607f821691505b6020821081036200050e576200050d620004b0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000539565b62000584868362000539565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005d1620005cb620005c5846200059c565b620005a6565b6200059c565b9050919050565b6000819050919050565b620005ed83620005b0565b62000605620005fc82620005d8565b84845462000546565b825550505050565b600090565b6200061c6200060d565b62000629818484620005e2565b505050565b5b8181101562000651576200064560008262000612565b6001810190506200062f565b5050565b601f821115620006a0576200066a8162000514565b620006758462000529565b8101602085101562000685578190505b6200069d620006948562000529565b8301826200062e565b50505b505050565b600082821c905092915050565b6000620006c560001984600802620006a5565b1980831691505092915050565b6000620006e08383620006b2565b9150826002028217905092915050565b620006fb8262000476565b67ffffffffffffffff81111562000717576200071662000481565b5b620007238254620004df565b6200073082828562000655565b600060209050601f83116001811462000768576000841562000753578287015190505b6200075f8582620006d2565b865550620007cf565b601f198416620007788662000514565b60005b82811015620007a2578489015182556001820191506020850194506020810190506200077b565b86831015620007c25784890151620007be601f891682620006b2565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200080482620007d7565b9050919050565b6200081681620007f7565b82525050565b60006020820190506200083360008301846200080b565b92915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000882601f8362000839565b91506200088f826200084a565b602082019050919050565b60006020820190508181036000830152620008b58162000873565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620008f8826200059c565b915062000905836200059c565b925082820190508082111562000920576200091f620008bc565b5b92915050565b62000931816200059c565b82525050565b60006020820190506200094e600083018462000926565b92915050565b61332e80620009646000396000f3fe6080604052600436106101fd5760003560e01c80638da5cb5b1161010d578063c23697a8116100a0578063dd62ed3e1161006f578063dd62ed3e14610738578063ddca3f4314610775578063e8deb344146107a0578063f2fde38b146107dd578063f755d8c31461080657610204565b8063c23697a8146106ac578063c6764f5d146106e9578063d0febe4c14610712578063d60d97b71461071c57610204565b8063a457c2d7116100dc578063a457c2d7146105e0578063a694fc3a1461061d578063a9059cbb14610646578063b4ba11e31461068357610204565b80638da5cb5b1461052257806395d89b411461054d57806398807d84146105785780639b6860c8146105b557610204565b80632eb4a7ab1161019057806361d027b31161015f57806361d027b31461043b57806370a0823114610466578063715018a6146104a357806374d11ff1146104ba5780637bb1ca19146104e557610204565b80632eb4a7ab1461037f578063313ce567146103aa57806339509351146103d55780634783f0ef1461041257610204565b806318160ddd116101cc57806318160ddd146102c557806322f8bc1c146102f057806323b872dd146103195780632e17de781461035657610204565b8063012b60d31461020957806306fdde0314610220578063095ea7b31461024b578063098a96471461028857610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e61081d565b005b34801561022c57600080fd5b506102356108bf565b604051610242919061209f565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d919061215f565b610951565b60405161027f91906121ba565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa919061220b565b610974565b6040516102bc91906121ba565b60405180910390f35b3480156102d157600080fd5b506102da610994565b6040516102e79190612247565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612262565b61099e565b005b34801561032557600080fd5b50610340600480360381019061033b91906122a2565b6109cc565b60405161034d91906121ba565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906122f5565b6109fb565b005b34801561038b57600080fd5b50610394610c5b565b6040516103a19190612331565b60405180910390f35b3480156103b657600080fd5b506103bf610c61565b6040516103cc9190612368565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f7919061215f565b610c6a565b60405161040991906121ba565b60405180910390f35b34801561041e57600080fd5b506104396004803603810190610434919061220b565b610ca1565b005b34801561044757600080fd5b50610450610cb3565b60405161045d91906123e2565b60405180910390f35b34801561047257600080fd5b5061048d600480360381019061048891906123fd565b610cd9565b60405161049a9190612247565b60405180910390f35b3480156104af57600080fd5b506104b8610d21565b005b3480156104c657600080fd5b506104cf610d35565b6040516104dc9190612247565b60405180910390f35b3480156104f157600080fd5b5061050c600480360381019061050791906123fd565b610da0565b6040516105199190612247565b60405180910390f35b34801561052e57600080fd5b50610537610db8565b6040516105449190612439565b60405180910390f35b34801561055957600080fd5b50610562610de2565b60405161056f919061209f565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906123fd565b610e74565b6040516105ac9190612247565b60405180910390f35b3480156105c157600080fd5b506105ca610e8c565b6040516105d79190612247565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061215f565b610e92565b60405161061491906121ba565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906122f5565b610f09565b005b34801561065257600080fd5b5061066d6004803603810190610668919061215f565b61104e565b60405161067a91906121ba565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a591906124b9565b611071565b005b3480156106b857600080fd5b506106d360048036038101906106ce91906123fd565b61111e565b6040516106e091906121ba565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b919061215f565b61113e565b005b61071a6112bb565b005b6107366004803603810190610731919061255c565b6113a4565b005b34801561074457600080fd5b5061075f600480360381019061075a91906125d0565b6115ab565b60405161076c9190612247565b60405180910390f35b34801561078157600080fd5b5061078a611632565b6040516107979190612247565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906123fd565b611638565b6040516107d49190612247565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff91906123fd565b6116ca565b005b34801561081257600080fd5b5061081b61174d565b005b6108256117e9565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a6a295be96e640669720000006040518263ffffffff1660e01b815260040161088b9190612247565b600060405180830381600087803b1580156108a557600080fd5b505af11580156108b9573d6000803e3d6000fd5b50505050565b6060600380546108ce9061263f565b80601f01602080910402602001604051908101604052809291908181526020018280546108fa9061263f565b80156109475780601f1061091c57610100808354040283529160200191610947565b820191906000526020600020905b81548152906001019060200180831161092a57829003601f168201915b5050505050905090565b60008061095c611867565b905061096981858561186f565b600191505092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6109a66117e9565b60008211156109b757816009819055505b60008111156109c85780600a819055505b5050565b6000806109d7611867565b90506109e4858285611a38565b6109ef858585611ac4565b60019150509392505050565b60008111610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a35906126bc565b60405180910390fd5b600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8b919061270b565b4211610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac3906127b1565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b459061281d565b60405180910390fd5b6000610b5933611638565b905081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610baa919061283d565b9250508190555081600d6000828254610bc3919061283d565b92505081905550610bd5303384611ac4565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c1b573d6000803e3d6000fd5b507ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb280338383604051610c4f93929190612871565b60405180910390a15050565b60085481565b60006012905090565b600080610c75611867565b9050610c96818585610c8785896115ab565b610c91919061270b565b61186f565b600191505092915050565b610ca96117e9565b8060088190555050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d296117e9565b610d336000611d3a565b565b60008060125442610d46919061283d565b9050600063077f8800826a18d0bf423c03d8de0000006a108b2a2c28029094000000610d72919061270b565b610d7c91906128a8565b610d869190612919565b90506301dfe2008211610d9857600090505b809250505090565b60106020528060005260406000206000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610df19061263f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d9061263f565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b5050505050905090565b600f6020528060005260406000206000915090505481565b600a5481565b600080610e9d611867565b90506000610eab82866115ab565b905083811015610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906129bc565b60405180910390fd5b610efd828686840361186f565b60019250505092915050565b80610f1333610cd9565b1015610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90612a28565b60405180910390fd5b610f5f333083611ac4565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fae919061270b565b9250508190555080600d6000828254610fc7919061270b565b9250508190555042601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a3382604051611043929190612a48565b60405180910390a150565b600080611059611867565b9050611066818585611ac4565b600191505092915050565b6110796117e9565b60005b82829050811015611119576001600660008585858181106110a05761109f612a71565b5b90506020020160208101906110b591906123fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061111190612aa0565b91505061107c565b505050565b60066020528060005260406000206000915054906101000a900460ff1681565b6111466117e9565b6a18d0bf423c03d8de0000006a108b2a2c28029094000000611168919061270b565b81600b54611176919061270b565b11156111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90612b34565b60405180910390fd5b6000601254426111c7919061283d565b90506301dfe200811161120f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120690612ba0565b60405180910390fd5b600063077f8800826a18d0bf423c03d8de0000006a108b2a2c28029094000000611239919061270b565b61124391906128a8565b61124d9190612919565b905080831115611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990612c0c565b60405180910390fd5b61129c8484611e00565b82600b60008282546112ae919061270b565b9250508190555050505050565b600042116112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590612c78565b60405180910390fd5b6a108b2a2c2802909400000034600c54611318919061270b565b1115611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090612ce4565b60405180910390fd5b6000600a54670de0b6b3a76400003461137291906128a8565b61137c9190612919565b90506113883382611e00565b80600c600082825461139a919061270b565b9250508190555050565b6009543410156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090612d50565b60405180910390fd5b600015156007600085815260200190815260200160002060009054906101000a900460ff16151514611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790612dbc565b60405180910390fd5b60016007600085815260200190815260200160002060006101000a81548160ff02191690831515021790555060006114cc838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060085486611f56565b90506001151581151514611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90612e28565b60405180910390fd5b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa731fb0a71cdfd8dd64ee5ab41cdf3f29652c439ac55116c4dca09fd8a71e0908560405161159c9190612439565b60405180910390a15050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600080600d54670de0b6b3a76400004761165291906128a8565b61165c9190612919565b90506000670de0b6b3a764000082600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116b491906128a8565b6116be9190612919565b90508092505050919050565b6116d26117e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890612eba565b60405180910390fd5b61174a81611d3a565b50565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb9061281d565b60405180910390fd5b6117dd816109fb565b6117e681610f09565b50565b6117f1611867565b73ffffffffffffffffffffffffffffffffffffffff1661180f610db8565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90612f26565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590612fb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119449061304a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a2b9190612247565b60405180910390a3505050565b6000611a4484846115ab565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611abe5781811015611ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa7906130b6565b60405180910390fd5b611abd848484840361186f565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90613148565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b99906131da565b60405180910390fd5b611bad838383611f6d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a9061326c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d219190612247565b60405180910390a3611d34848484611f72565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e66906132d8565b60405180910390fd5b611e7b60008383611f6d565b8060026000828254611e8d919061270b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f3e9190612247565b60405180910390a3611f5260008383611f72565b5050565b600082611f638584611f77565b1490509392505050565b505050565b505050565b60008082905060005b8451811015611fc257611fad82868381518110611fa057611f9f612a71565b5b6020026020010151611fcd565b91508080611fba90612aa0565b915050611f80565b508091505092915050565b6000818310611fe557611fe08284611ff8565b611ff0565b611fef8383611ff8565b5b905092915050565b600082600052816020526040600020905092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561204957808201518184015260208101905061202e565b60008484015250505050565b6000601f19601f8301169050919050565b60006120718261200f565b61207b818561201a565b935061208b81856020860161202b565b61209481612055565b840191505092915050565b600060208201905081810360008301526120b98184612066565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120f6826120cb565b9050919050565b612106816120eb565b811461211157600080fd5b50565b600081359050612123816120fd565b92915050565b6000819050919050565b61213c81612129565b811461214757600080fd5b50565b60008135905061215981612133565b92915050565b60008060408385031215612176576121756120c1565b5b600061218485828601612114565b92505060206121958582860161214a565b9150509250929050565b60008115159050919050565b6121b48161219f565b82525050565b60006020820190506121cf60008301846121ab565b92915050565b6000819050919050565b6121e8816121d5565b81146121f357600080fd5b50565b600081359050612205816121df565b92915050565b600060208284031215612221576122206120c1565b5b600061222f848285016121f6565b91505092915050565b61224181612129565b82525050565b600060208201905061225c6000830184612238565b92915050565b60008060408385031215612279576122786120c1565b5b60006122878582860161214a565b92505060206122988582860161214a565b9150509250929050565b6000806000606084860312156122bb576122ba6120c1565b5b60006122c986828701612114565b93505060206122da86828701612114565b92505060406122eb8682870161214a565b9150509250925092565b60006020828403121561230b5761230a6120c1565b5b60006123198482850161214a565b91505092915050565b61232b816121d5565b82525050565b60006020820190506123466000830184612322565b92915050565b600060ff82169050919050565b6123628161234c565b82525050565b600060208201905061237d6000830184612359565b92915050565b6000819050919050565b60006123a86123a361239e846120cb565b612383565b6120cb565b9050919050565b60006123ba8261238d565b9050919050565b60006123cc826123af565b9050919050565b6123dc816123c1565b82525050565b60006020820190506123f760008301846123d3565b92915050565b600060208284031215612413576124126120c1565b5b600061242184828501612114565b91505092915050565b612433816120eb565b82525050565b600060208201905061244e600083018461242a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261247957612478612454565b5b8235905067ffffffffffffffff81111561249657612495612459565b5b6020830191508360208202830111156124b2576124b161245e565b5b9250929050565b600080602083850312156124d0576124cf6120c1565b5b600083013567ffffffffffffffff8111156124ee576124ed6120c6565b5b6124fa85828601612463565b92509250509250929050565b60008083601f84011261251c5761251b612454565b5b8235905067ffffffffffffffff81111561253957612538612459565b5b6020830191508360208202830111156125555761255461245e565b5b9250929050565b60008060008060608587031215612576576125756120c1565b5b600061258487828801612114565b9450506020612595878288016121f6565b935050604085013567ffffffffffffffff8111156125b6576125b56120c6565b5b6125c287828801612506565b925092505092959194509250565b600080604083850312156125e7576125e66120c1565b5b60006125f585828601612114565b925050602061260685828601612114565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061265757607f821691505b60208210810361266a57612669612610565b5b50919050565b7f416d6f756e7420746f20756e7374616b6520746f6f206c6f7700000000000000600082015250565b60006126a660198361201a565b91506126b182612670565b602082019050919050565b600060208201905081810360008301526126d581612699565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061271682612129565b915061272183612129565b9250828201905080821115612739576127386126dc565b5b92915050565b7f546f6b656e7320617265206c6f636b656420666f72207374616b696e6720706560008201527f72696f6400000000000000000000000000000000000000000000000000000000602082015250565b600061279b60248361201a565b91506127a68261273f565b604082019050919050565b600060208201905081810360008301526127ca8161278e565b9050919050565b7f4e6f7420656e6f756768207374616b65642062616c616e636500000000000000600082015250565b600061280760198361201a565b9150612812826127d1565b602082019050919050565b60006020820190508181036000830152612836816127fa565b9050919050565b600061284882612129565b915061285383612129565b925082820390508181111561286b5761286a6126dc565b5b92915050565b6000606082019050612886600083018661242a565b6128936020830185612238565b6128a06040830184612238565b949350505050565b60006128b382612129565b91506128be83612129565b92508282026128cc81612129565b915082820484148315176128e3576128e26126dc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061292482612129565b915061292f83612129565b92508261293f5761293e6128ea565b5b828204905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006129a660258361201a565b91506129b18261294a565b604082019050919050565b600060208201905081810360008301526129d581612999565b9050919050565b7f4e6f7420656e6f756768205359422062616c616e636500000000000000000000600082015250565b6000612a1260168361201a565b9150612a1d826129dc565b602082019050919050565b60006020820190508181036000830152612a4181612a05565b9050919050565b6000604082019050612a5d600083018561242a565b612a6a6020830184612238565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612aab82612129565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612add57612adc6126dc565b5b600182019050919050565b7f76657374656420616c6c6f636174696f6e206578636565646564000000000000600082015250565b6000612b1e601a8361201a565b9150612b2982612ae8565b602082019050919050565b60006020820190508181036000830152612b4d81612b11565b9050919050565b7f4e6f20646973747269627574696f6e206265666f726520636c69666600000000600082015250565b6000612b8a601c8361201a565b9150612b9582612b54565b602082019050919050565b60006020820190508181036000830152612bb981612b7d565b9050919050565b7f416d6f756e7420746f6f206869676820666f722076657374696e670000000000600082015250565b6000612bf6601b8361201a565b9150612c0182612bc0565b602082019050919050565b60006020820190508181036000830152612c2581612be9565b9050919050565b7f5075626c696320726f756e64206973206e6f74206f70656e0000000000000000600082015250565b6000612c6260188361201a565b9150612c6d82612c2c565b602082019050919050565b60006020820190508181036000830152612c9181612c55565b9050919050565b7f5075626c696320726f756e642065786365656465640000000000000000000000600082015250565b6000612cce60158361201a565b9150612cd982612c98565b602082019050919050565b60006020820190508181036000830152612cfd81612cc1565b9050919050565b7f4e6f206665652073656e74000000000000000000000000000000000000000000600082015250565b6000612d3a600b8361201a565b9150612d4582612d04565b602082019050919050565b60006020820190508181036000830152612d6981612d2d565b9050919050565b7f4175746820636f646520616c7265616479207573656400000000000000000000600082015250565b6000612da660168361201a565b9150612db182612d70565b602082019050919050565b60006020820190508181036000830152612dd581612d99565b9050919050565b7f566572696669636174696f6e206661696c656400000000000000000000000000600082015250565b6000612e1260138361201a565b9150612e1d82612ddc565b602082019050919050565b60006020820190508181036000830152612e4181612e05565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ea460268361201a565b9150612eaf82612e48565b604082019050919050565b60006020820190508181036000830152612ed381612e97565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612f1060208361201a565b9150612f1b82612eda565b602082019050919050565b60006020820190508181036000830152612f3f81612f03565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612fa260248361201a565b9150612fad82612f46565b604082019050919050565b60006020820190508181036000830152612fd181612f95565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061303460228361201a565b915061303f82612fd8565b604082019050919050565b6000602082019050818103600083015261306381613027565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006130a0601d8361201a565b91506130ab8261306a565b602082019050919050565b600060208201905081810360008301526130cf81613093565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061313260258361201a565b915061313d826130d6565b604082019050919050565b6000602082019050818103600083015261316181613125565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006131c460238361201a565b91506131cf82613168565b604082019050919050565b600060208201905081810360008301526131f3816131b7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061325660268361201a565b9150613261826131fa565b604082019050919050565b6000602082019050818103600083015261328581613249565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006132c2601f8361201a565b91506132cd8261328c565b602082019050919050565b600060208201905081810360008301526132f1816132b5565b905091905056fea2646970667358221220d887a52be1f41545c12715c2cea34fed83d08233f48dae917e53ff61e263fcc364736f6c63430008110033608060405234801561001057600080fd5b506040516106d13803806106d18339818101604052810190610032919061011c565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610149565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e9826100be565b9050919050565b6100f9816100de565b811461010457600080fd5b50565b600081519050610116816100f0565b92915050565b600060208284031215610132576101316100b9565b5b600061014084828501610107565b91505092915050565b610579806101586000396000f3fe6080604052600436106100385760003560e01c80634783c35b146100445780634e71d92d1461006f578063a694fc3a146100865761003f565b3661003f57005b600080fd5b34801561005057600080fd5b506100596100af565b60405161006691906103ad565b60405180910390f35b34801561007b57600080fd5b506100846100d5565b005b34801561009257600080fd5b506100ad60048036038101906100a89190610403565b610250565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015c9061048d565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f755d8c36040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b50505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561024d573d6000803e3d6000fd5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d5906104f9565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a826040518263ffffffff1660e01b81526004016103379190610528565b600060405180830381600087803b15801561035157600080fd5b505af1158015610365573d6000803e3d6000fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103978261036c565b9050919050565b6103a78161038c565b82525050565b60006020820190506103c2600083018461039e565b92915050565b600080fd5b6000819050919050565b6103e0816103cd565b81146103eb57600080fd5b50565b6000813590506103fd816103d7565b92915050565b600060208284031215610419576104186103c8565b5b6000610427848285016103ee565b91505092915050565b600082825260208201905092915050565b7f4d756c7469736967206f6e6c7900000000000000000000000000000000000000600082015250565b6000610477600d83610430565b915061048282610441565b602082019050919050565b600060208201905081810360008301526104a68161046a565b9050919050565b7f537962696c44414f206f6e6c7900000000000000000000000000000000000000600082015250565b60006104e3600d83610430565b91506104ee826104ad565b602082019050919050565b60006020820190508181036000830152610512816104d6565b9050919050565b610522816103cd565b82525050565b600060208201905061053d6000830184610519565b9291505056fea26469706673582212206e770f9cb1ed1544321b46cb9ec42865a63ddc0413bec25da9b249be8a136b5f64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c80638da5cb5b1161010d578063c23697a8116100a0578063dd62ed3e1161006f578063dd62ed3e14610738578063ddca3f4314610775578063e8deb344146107a0578063f2fde38b146107dd578063f755d8c31461080657610204565b8063c23697a8146106ac578063c6764f5d146106e9578063d0febe4c14610712578063d60d97b71461071c57610204565b8063a457c2d7116100dc578063a457c2d7146105e0578063a694fc3a1461061d578063a9059cbb14610646578063b4ba11e31461068357610204565b80638da5cb5b1461052257806395d89b411461054d57806398807d84146105785780639b6860c8146105b557610204565b80632eb4a7ab1161019057806361d027b31161015f57806361d027b31461043b57806370a0823114610466578063715018a6146104a357806374d11ff1146104ba5780637bb1ca19146104e557610204565b80632eb4a7ab1461037f578063313ce567146103aa57806339509351146103d55780634783f0ef1461041257610204565b806318160ddd116101cc57806318160ddd146102c557806322f8bc1c146102f057806323b872dd146103195780632e17de781461035657610204565b8063012b60d31461020957806306fdde0314610220578063095ea7b31461024b578063098a96471461028857610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e61081d565b005b34801561022c57600080fd5b506102356108bf565b604051610242919061209f565b60405180910390f35b34801561025757600080fd5b50610272600480360381019061026d919061215f565b610951565b60405161027f91906121ba565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa919061220b565b610974565b6040516102bc91906121ba565b60405180910390f35b3480156102d157600080fd5b506102da610994565b6040516102e79190612247565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612262565b61099e565b005b34801561032557600080fd5b50610340600480360381019061033b91906122a2565b6109cc565b60405161034d91906121ba565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906122f5565b6109fb565b005b34801561038b57600080fd5b50610394610c5b565b6040516103a19190612331565b60405180910390f35b3480156103b657600080fd5b506103bf610c61565b6040516103cc9190612368565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f7919061215f565b610c6a565b60405161040991906121ba565b60405180910390f35b34801561041e57600080fd5b506104396004803603810190610434919061220b565b610ca1565b005b34801561044757600080fd5b50610450610cb3565b60405161045d91906123e2565b60405180910390f35b34801561047257600080fd5b5061048d600480360381019061048891906123fd565b610cd9565b60405161049a9190612247565b60405180910390f35b3480156104af57600080fd5b506104b8610d21565b005b3480156104c657600080fd5b506104cf610d35565b6040516104dc9190612247565b60405180910390f35b3480156104f157600080fd5b5061050c600480360381019061050791906123fd565b610da0565b6040516105199190612247565b60405180910390f35b34801561052e57600080fd5b50610537610db8565b6040516105449190612439565b60405180910390f35b34801561055957600080fd5b50610562610de2565b60405161056f919061209f565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906123fd565b610e74565b6040516105ac9190612247565b60405180910390f35b3480156105c157600080fd5b506105ca610e8c565b6040516105d79190612247565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061215f565b610e92565b60405161061491906121ba565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906122f5565b610f09565b005b34801561065257600080fd5b5061066d6004803603810190610668919061215f565b61104e565b60405161067a91906121ba565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a591906124b9565b611071565b005b3480156106b857600080fd5b506106d360048036038101906106ce91906123fd565b61111e565b6040516106e091906121ba565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b919061215f565b61113e565b005b61071a6112bb565b005b6107366004803603810190610731919061255c565b6113a4565b005b34801561074457600080fd5b5061075f600480360381019061075a91906125d0565b6115ab565b60405161076c9190612247565b60405180910390f35b34801561078157600080fd5b5061078a611632565b6040516107979190612247565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906123fd565b611638565b6040516107d49190612247565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff91906123fd565b6116ca565b005b34801561081257600080fd5b5061081b61174d565b005b6108256117e9565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a6a295be96e640669720000006040518263ffffffff1660e01b815260040161088b9190612247565b600060405180830381600087803b1580156108a557600080fd5b505af11580156108b9573d6000803e3d6000fd5b50505050565b6060600380546108ce9061263f565b80601f01602080910402602001604051908101604052809291908181526020018280546108fa9061263f565b80156109475780601f1061091c57610100808354040283529160200191610947565b820191906000526020600020905b81548152906001019060200180831161092a57829003601f168201915b5050505050905090565b60008061095c611867565b905061096981858561186f565b600191505092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b6109a66117e9565b60008211156109b757816009819055505b60008111156109c85780600a819055505b5050565b6000806109d7611867565b90506109e4858285611a38565b6109ef858585611ac4565b60019150509392505050565b60008111610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a35906126bc565b60405180910390fd5b600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8b919061270b565b4211610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac3906127b1565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b459061281d565b60405180910390fd5b6000610b5933611638565b905081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610baa919061283d565b9250508190555081600d6000828254610bc3919061283d565b92505081905550610bd5303384611ac4565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c1b573d6000803e3d6000fd5b507ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb280338383604051610c4f93929190612871565b60405180910390a15050565b60085481565b60006012905090565b600080610c75611867565b9050610c96818585610c8785896115ab565b610c91919061270b565b61186f565b600191505092915050565b610ca96117e9565b8060088190555050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d296117e9565b610d336000611d3a565b565b60008060125442610d46919061283d565b9050600063077f8800826a18d0bf423c03d8de0000006a108b2a2c28029094000000610d72919061270b565b610d7c91906128a8565b610d869190612919565b90506301dfe2008211610d9857600090505b809250505090565b60106020528060005260406000206000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610df19061263f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d9061263f565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b5050505050905090565b600f6020528060005260406000206000915090505481565b600a5481565b600080610e9d611867565b90506000610eab82866115ab565b905083811015610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906129bc565b60405180910390fd5b610efd828686840361186f565b60019250505092915050565b80610f1333610cd9565b1015610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90612a28565b60405180910390fd5b610f5f333083611ac4565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fae919061270b565b9250508190555080600d6000828254610fc7919061270b565b9250508190555042601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a3382604051611043929190612a48565b60405180910390a150565b600080611059611867565b9050611066818585611ac4565b600191505092915050565b6110796117e9565b60005b82829050811015611119576001600660008585858181106110a05761109f612a71565b5b90506020020160208101906110b591906123fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061111190612aa0565b91505061107c565b505050565b60066020528060005260406000206000915054906101000a900460ff1681565b6111466117e9565b6a18d0bf423c03d8de0000006a108b2a2c28029094000000611168919061270b565b81600b54611176919061270b565b11156111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90612b34565b60405180910390fd5b6000601254426111c7919061283d565b90506301dfe200811161120f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120690612ba0565b60405180910390fd5b600063077f8800826a18d0bf423c03d8de0000006a108b2a2c28029094000000611239919061270b565b61124391906128a8565b61124d9190612919565b905080831115611292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128990612c0c565b60405180910390fd5b61129c8484611e00565b82600b60008282546112ae919061270b565b9250508190555050505050565b600042116112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590612c78565b60405180910390fd5b6a108b2a2c2802909400000034600c54611318919061270b565b1115611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090612ce4565b60405180910390fd5b6000600a54670de0b6b3a76400003461137291906128a8565b61137c9190612919565b90506113883382611e00565b80600c600082825461139a919061270b565b9250508190555050565b6009543410156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090612d50565b60405180910390fd5b600015156007600085815260200190815260200160002060009054906101000a900460ff16151514611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790612dbc565b60405180910390fd5b60016007600085815260200190815260200160002060006101000a81548160ff02191690831515021790555060006114cc838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060085486611f56565b90506001151581151514611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90612e28565b60405180910390fd5b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa731fb0a71cdfd8dd64ee5ab41cdf3f29652c439ac55116c4dca09fd8a71e0908560405161159c9190612439565b60405180910390a15050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600080600d54670de0b6b3a76400004761165291906128a8565b61165c9190612919565b90506000670de0b6b3a764000082600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116b491906128a8565b6116be9190612919565b90508092505050919050565b6116d26117e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890612eba565b60405180910390fd5b61174a81611d3a565b50565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb9061281d565b60405180910390fd5b6117dd816109fb565b6117e681610f09565b50565b6117f1611867565b73ffffffffffffffffffffffffffffffffffffffff1661180f610db8565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90612f26565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590612fb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119449061304a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a2b9190612247565b60405180910390a3505050565b6000611a4484846115ab565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611abe5781811015611ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa7906130b6565b60405180910390fd5b611abd848484840361186f565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90613148565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b99906131da565b60405180910390fd5b611bad838383611f6d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a9061326c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d219190612247565b60405180910390a3611d34848484611f72565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e66906132d8565b60405180910390fd5b611e7b60008383611f6d565b8060026000828254611e8d919061270b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f3e9190612247565b60405180910390a3611f5260008383611f72565b5050565b600082611f638584611f77565b1490509392505050565b505050565b505050565b60008082905060005b8451811015611fc257611fad82868381518110611fa057611f9f612a71565b5b6020026020010151611fcd565b91508080611fba90612aa0565b915050611f80565b508091505092915050565b6000818310611fe557611fe08284611ff8565b611ff0565b611fef8383611ff8565b5b905092915050565b600082600052816020526040600020905092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561204957808201518184015260208101905061202e565b60008484015250505050565b6000601f19601f8301169050919050565b60006120718261200f565b61207b818561201a565b935061208b81856020860161202b565b61209481612055565b840191505092915050565b600060208201905081810360008301526120b98184612066565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120f6826120cb565b9050919050565b612106816120eb565b811461211157600080fd5b50565b600081359050612123816120fd565b92915050565b6000819050919050565b61213c81612129565b811461214757600080fd5b50565b60008135905061215981612133565b92915050565b60008060408385031215612176576121756120c1565b5b600061218485828601612114565b92505060206121958582860161214a565b9150509250929050565b60008115159050919050565b6121b48161219f565b82525050565b60006020820190506121cf60008301846121ab565b92915050565b6000819050919050565b6121e8816121d5565b81146121f357600080fd5b50565b600081359050612205816121df565b92915050565b600060208284031215612221576122206120c1565b5b600061222f848285016121f6565b91505092915050565b61224181612129565b82525050565b600060208201905061225c6000830184612238565b92915050565b60008060408385031215612279576122786120c1565b5b60006122878582860161214a565b92505060206122988582860161214a565b9150509250929050565b6000806000606084860312156122bb576122ba6120c1565b5b60006122c986828701612114565b93505060206122da86828701612114565b92505060406122eb8682870161214a565b9150509250925092565b60006020828403121561230b5761230a6120c1565b5b60006123198482850161214a565b91505092915050565b61232b816121d5565b82525050565b60006020820190506123466000830184612322565b92915050565b600060ff82169050919050565b6123628161234c565b82525050565b600060208201905061237d6000830184612359565b92915050565b6000819050919050565b60006123a86123a361239e846120cb565b612383565b6120cb565b9050919050565b60006123ba8261238d565b9050919050565b60006123cc826123af565b9050919050565b6123dc816123c1565b82525050565b60006020820190506123f760008301846123d3565b92915050565b600060208284031215612413576124126120c1565b5b600061242184828501612114565b91505092915050565b612433816120eb565b82525050565b600060208201905061244e600083018461242a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261247957612478612454565b5b8235905067ffffffffffffffff81111561249657612495612459565b5b6020830191508360208202830111156124b2576124b161245e565b5b9250929050565b600080602083850312156124d0576124cf6120c1565b5b600083013567ffffffffffffffff8111156124ee576124ed6120c6565b5b6124fa85828601612463565b92509250509250929050565b60008083601f84011261251c5761251b612454565b5b8235905067ffffffffffffffff81111561253957612538612459565b5b6020830191508360208202830111156125555761255461245e565b5b9250929050565b60008060008060608587031215612576576125756120c1565b5b600061258487828801612114565b9450506020612595878288016121f6565b935050604085013567ffffffffffffffff8111156125b6576125b56120c6565b5b6125c287828801612506565b925092505092959194509250565b600080604083850312156125e7576125e66120c1565b5b60006125f585828601612114565b925050602061260685828601612114565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061265757607f821691505b60208210810361266a57612669612610565b5b50919050565b7f416d6f756e7420746f20756e7374616b6520746f6f206c6f7700000000000000600082015250565b60006126a660198361201a565b91506126b182612670565b602082019050919050565b600060208201905081810360008301526126d581612699565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061271682612129565b915061272183612129565b9250828201905080821115612739576127386126dc565b5b92915050565b7f546f6b656e7320617265206c6f636b656420666f72207374616b696e6720706560008201527f72696f6400000000000000000000000000000000000000000000000000000000602082015250565b600061279b60248361201a565b91506127a68261273f565b604082019050919050565b600060208201905081810360008301526127ca8161278e565b9050919050565b7f4e6f7420656e6f756768207374616b65642062616c616e636500000000000000600082015250565b600061280760198361201a565b9150612812826127d1565b602082019050919050565b60006020820190508181036000830152612836816127fa565b9050919050565b600061284882612129565b915061285383612129565b925082820390508181111561286b5761286a6126dc565b5b92915050565b6000606082019050612886600083018661242a565b6128936020830185612238565b6128a06040830184612238565b949350505050565b60006128b382612129565b91506128be83612129565b92508282026128cc81612129565b915082820484148315176128e3576128e26126dc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061292482612129565b915061292f83612129565b92508261293f5761293e6128ea565b5b828204905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006129a660258361201a565b91506129b18261294a565b604082019050919050565b600060208201905081810360008301526129d581612999565b9050919050565b7f4e6f7420656e6f756768205359422062616c616e636500000000000000000000600082015250565b6000612a1260168361201a565b9150612a1d826129dc565b602082019050919050565b60006020820190508181036000830152612a4181612a05565b9050919050565b6000604082019050612a5d600083018561242a565b612a6a6020830184612238565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612aab82612129565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612add57612adc6126dc565b5b600182019050919050565b7f76657374656420616c6c6f636174696f6e206578636565646564000000000000600082015250565b6000612b1e601a8361201a565b9150612b2982612ae8565b602082019050919050565b60006020820190508181036000830152612b4d81612b11565b9050919050565b7f4e6f20646973747269627574696f6e206265666f726520636c69666600000000600082015250565b6000612b8a601c8361201a565b9150612b9582612b54565b602082019050919050565b60006020820190508181036000830152612bb981612b7d565b9050919050565b7f416d6f756e7420746f6f206869676820666f722076657374696e670000000000600082015250565b6000612bf6601b8361201a565b9150612c0182612bc0565b602082019050919050565b60006020820190508181036000830152612c2581612be9565b9050919050565b7f5075626c696320726f756e64206973206e6f74206f70656e0000000000000000600082015250565b6000612c6260188361201a565b9150612c6d82612c2c565b602082019050919050565b60006020820190508181036000830152612c9181612c55565b9050919050565b7f5075626c696320726f756e642065786365656465640000000000000000000000600082015250565b6000612cce60158361201a565b9150612cd982612c98565b602082019050919050565b60006020820190508181036000830152612cfd81612cc1565b9050919050565b7f4e6f206665652073656e74000000000000000000000000000000000000000000600082015250565b6000612d3a600b8361201a565b9150612d4582612d04565b602082019050919050565b60006020820190508181036000830152612d6981612d2d565b9050919050565b7f4175746820636f646520616c7265616479207573656400000000000000000000600082015250565b6000612da660168361201a565b9150612db182612d70565b602082019050919050565b60006020820190508181036000830152612dd581612d99565b9050919050565b7f566572696669636174696f6e206661696c656400000000000000000000000000600082015250565b6000612e1260138361201a565b9150612e1d82612ddc565b602082019050919050565b60006020820190508181036000830152612e4181612e05565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ea460268361201a565b9150612eaf82612e48565b604082019050919050565b60006020820190508181036000830152612ed381612e97565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612f1060208361201a565b9150612f1b82612eda565b602082019050919050565b60006020820190508181036000830152612f3f81612f03565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612fa260248361201a565b9150612fad82612f46565b604082019050919050565b60006020820190508181036000830152612fd181612f95565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061303460228361201a565b915061303f82612fd8565b604082019050919050565b6000602082019050818103600083015261306381613027565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006130a0601d8361201a565b91506130ab8261306a565b602082019050919050565b600060208201905081810360008301526130cf81613093565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061313260258361201a565b915061313d826130d6565b604082019050919050565b6000602082019050818103600083015261316181613125565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006131c460238361201a565b91506131cf82613168565b604082019050919050565b600060208201905081810360008301526131f3816131b7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061325660268361201a565b9150613261826131fa565b604082019050919050565b6000602082019050818103600083015261328581613249565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006132c2601f8361201a565b91506132cd8261328c565b602082019050919050565b600060208201905081810360008301526132f1816132b5565b905091905056fea2646970667358221220d887a52be1f41545c12715c2cea34fed83d08233f48dae917e53ff61e263fcc364736f6c63430008110033

[ 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.