ETH Price: $2,805.37 (+12.76%)
 

Overview

Max Total Supply

115,500,000 Atpad

Holders

42

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
10,202,990.1 Atpad

Value
$0.00
0x6cf5ef70580b04f7ac6b027a8c07b5b6f85e01b3
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:
Asatpad

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;



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

}



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

}



abstract contract Context {

    function _msgSender() internal view virtual returns (address) {

        return msg.sender;

    }



    function _msgData() internal view virtual returns (bytes calldata) {

        return msg.data;

    }

}





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

     *

     * 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 default value returned by this function, unless

     * it's 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 {}

}





abstract contract ERC20Burnable is Context, ERC20 {

    /**

     * @dev Destroys `amount` tokens from the caller.

     *

     * See {ERC20-_burn}.

     */

    function burn(uint256 amount) public virtual {

        _burn(_msgSender(), amount);

    }



    /**

     * @dev Destroys `amount` tokens from `account`, deducting from the caller's

     * allowance.

     *

     * See {ERC20-_burn} and {ERC20-allowance}.

     *

     * Requirements:

     *

     * - the caller must have allowance for ``accounts``'s tokens of at least

     * `amount`.

     */

    function burnFrom(address account, uint256 amount) public virtual {

        _spendAllowance(account, _msgSender(), amount);

        _burn(account, amount);

    }

}



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. Can only be called by the current owner.

     *

     * NOTE: Renouncing ownership will leave the contract without an owner,

     * thereby disabling 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);

    }

}





interface IERC20Permit {

    /**

     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,

     * given ``owner``'s signed approval.

     *

     * IMPORTANT: The same issues {IERC20-approve} has related to transaction

     * ordering also apply here.

     *

     * Emits an {Approval} event.

     *

     * Requirements:

     *

     * - `spender` cannot be the zero address.

     * - `deadline` must be a timestamp in the future.

     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`

     * over the EIP712-formatted function arguments.

     * - the signature must use ``owner``'s current nonce (see {nonces}).

     *

     * For more information on the signature format, see the

     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP

     * section].

     */

    function permit(

        address owner,

        address spender,

        uint256 value,

        uint256 deadline,

        uint8 v,

        bytes32 r,

        bytes32 s

    ) external;



    /**

     * @dev Returns the current nonce for `owner`. This value must be

     * included whenever a signature is generated for {permit}.

     *

     * Every successful call to {permit} increases ``owner``'s nonce by one. This

     * prevents a signature from being used multiple times.

     */

    function nonces(address owner) external view returns (uint256);



    /**

     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.

     */

    // solhint-disable-next-line func-name-mixedcase

    function DOMAIN_SEPARATOR() external view returns (bytes32);

}



library Math {

    enum Rounding {

        Down, // Toward negative infinity

        Up, // Toward infinity

        Zero // Toward zero

    }



    /**

     * @dev Returns the largest of two numbers.

     */

    function max(uint256 a, uint256 b) internal pure returns (uint256) {

        return a > b ? a : b;

    }



    /**

     * @dev Returns the smallest of two numbers.

     */

    function min(uint256 a, uint256 b) internal pure returns (uint256) {

        return a < b ? a : b;

    }



    /**

     * @dev Returns the average of two numbers. The result is rounded towards

     * zero.

     */

    function average(uint256 a, uint256 b) internal pure returns (uint256) {

        // (a + b) / 2 can overflow.

        return (a & b) + (a ^ b) / 2;

    }



    /**

     * @dev Returns the ceiling of the division of two numbers.

     *

     * This differs from standard division with `/` in that it rounds up instead

     * of rounding down.

     */

    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {

        // (a + b - 1) / b can overflow on addition, so we distribute.

        return a == 0 ? 0 : (a - 1) / b + 1;

    }



    /**

     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0

     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)

     * with further edits by Uniswap Labs also under MIT license.

     */

    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {

        unchecked {

            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use

            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256

            // variables such that product = prod1 * 2^256 + prod0.

            uint256 prod0; // Least significant 256 bits of the product

            uint256 prod1; // Most significant 256 bits of the product

            assembly {

                let mm := mulmod(x, y, not(0))

                prod0 := mul(x, y)

                prod1 := sub(sub(mm, prod0), lt(mm, prod0))

            }



            // Handle non-overflow cases, 256 by 256 division.

            if (prod1 == 0) {

                // Solidity will revert if denominator == 0, unlike the div opcode on its own.

                // The surrounding unchecked block does not change this fact.

                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.

                return prod0 / denominator;

            }



            // Make sure the result is less than 2^256. Also prevents denominator == 0.

            require(denominator > prod1, "Math: mulDiv overflow");



            ///////////////////////////////////////////////

            // 512 by 256 division.

            ///////////////////////////////////////////////



            // Make division exact by subtracting the remainder from [prod1 prod0].

            uint256 remainder;

            assembly {

                // Compute remainder using mulmod.

                remainder := mulmod(x, y, denominator)



                // Subtract 256 bit number from 512 bit number.

                prod1 := sub(prod1, gt(remainder, prod0))

                prod0 := sub(prod0, remainder)

            }



            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.

            // See https://cs.stackexchange.com/q/138556/92363.



            // Does not overflow because the denominator cannot be zero at this stage in the function.

            uint256 twos = denominator & (~denominator + 1);

            assembly {

                // Divide denominator by twos.

                denominator := div(denominator, twos)



                // Divide [prod1 prod0] by twos.

                prod0 := div(prod0, twos)



                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.

                twos := add(div(sub(0, twos), twos), 1)

            }



            // Shift in bits from prod1 into prod0.

            prod0 |= prod1 * twos;



            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such

            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for

            // four bits. That is, denominator * inv = 1 mod 2^4.

            uint256 inverse = (3 * denominator) ^ 2;



            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works

            // in modular arithmetic, doubling the correct bits in each step.

            inverse *= 2 - denominator * inverse; // inverse mod 2^8

            inverse *= 2 - denominator * inverse; // inverse mod 2^16

            inverse *= 2 - denominator * inverse; // inverse mod 2^32

            inverse *= 2 - denominator * inverse; // inverse mod 2^64

            inverse *= 2 - denominator * inverse; // inverse mod 2^128

            inverse *= 2 - denominator * inverse; // inverse mod 2^256



            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.

            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is

            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1

            // is no longer required.

            result = prod0 * inverse;

            return result;

        }

    }



    /**

     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.

     */

    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {

        uint256 result = mulDiv(x, y, denominator);

        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {

            result += 1;

        }

        return result;

    }



    /**

     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.

     *

     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).

     */

    function sqrt(uint256 a) internal pure returns (uint256) {

        if (a == 0) {

            return 0;

        }



        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.

        //

        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have

        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.

        //

        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`

        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`

        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`

        //

        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.

        uint256 result = 1 << (log2(a) >> 1);



        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,

        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at

        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision

        // into the expected uint128 result.

        unchecked {

            result = (result + a / result) >> 1;

            result = (result + a / result) >> 1;

            result = (result + a / result) >> 1;

            result = (result + a / result) >> 1;

            result = (result + a / result) >> 1;

            result = (result + a / result) >> 1;

            result = (result + a / result) >> 1;

            return min(result, a / result);

        }

    }



    /**

     * @notice Calculates sqrt(a), following the selected rounding direction.

     */

    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {

        unchecked {

            uint256 result = sqrt(a);

            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);

        }

    }



    /**

     * @dev Return the log in base 2, rounded down, of a positive value.

     * Returns 0 if given 0.

     */

    function log2(uint256 value) internal pure returns (uint256) {

        uint256 result = 0;

        unchecked {

            if (value >> 128 > 0) {

                value >>= 128;

                result += 128;

            }

            if (value >> 64 > 0) {

                value >>= 64;

                result += 64;

            }

            if (value >> 32 > 0) {

                value >>= 32;

                result += 32;

            }

            if (value >> 16 > 0) {

                value >>= 16;

                result += 16;

            }

            if (value >> 8 > 0) {

                value >>= 8;

                result += 8;

            }

            if (value >> 4 > 0) {

                value >>= 4;

                result += 4;

            }

            if (value >> 2 > 0) {

                value >>= 2;

                result += 2;

            }

            if (value >> 1 > 0) {

                result += 1;

            }

        }

        return result;

    }



    /**

     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.

     * Returns 0 if given 0.

     */

    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {

        unchecked {

            uint256 result = log2(value);

            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);

        }

    }



    /**

     * @dev Return the log in base 10, rounded down, of a positive value.

     * Returns 0 if given 0.

     */

    function log10(uint256 value) internal pure returns (uint256) {

        uint256 result = 0;

        unchecked {

            if (value >= 10 ** 64) {

                value /= 10 ** 64;

                result += 64;

            }

            if (value >= 10 ** 32) {

                value /= 10 ** 32;

                result += 32;

            }

            if (value >= 10 ** 16) {

                value /= 10 ** 16;

                result += 16;

            }

            if (value >= 10 ** 8) {

                value /= 10 ** 8;

                result += 8;

            }

            if (value >= 10 ** 4) {

                value /= 10 ** 4;

                result += 4;

            }

            if (value >= 10 ** 2) {

                value /= 10 ** 2;

                result += 2;

            }

            if (value >= 10 ** 1) {

                result += 1;

            }

        }

        return result;

    }



    /**

     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.

     * Returns 0 if given 0.

     */

    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {

        unchecked {

            uint256 result = log10(value);

            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);

        }

    }



    /**

     * @dev Return the log in base 256, rounded down, of a positive value.

     * Returns 0 if given 0.

     *

     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.

     */

    function log256(uint256 value) internal pure returns (uint256) {

        uint256 result = 0;

        unchecked {

            if (value >> 128 > 0) {

                value >>= 128;

                result += 16;

            }

            if (value >> 64 > 0) {

                value >>= 64;

                result += 8;

            }

            if (value >> 32 > 0) {

                value >>= 32;

                result += 4;

            }

            if (value >> 16 > 0) {

                value >>= 16;

                result += 2;

            }

            if (value >> 8 > 0) {

                result += 1;

            }

        }

        return result;

    }



    /**

     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.

     * Returns 0 if given 0.

     */

    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {

        unchecked {

            uint256 result = log256(value);

            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);

        }

    }

}



library SignedMath {

    /**

     * @dev Returns the largest of two signed numbers.

     */

    function max(int256 a, int256 b) internal pure returns (int256) {

        return a > b ? a : b;

    }



    /**

     * @dev Returns the smallest of two signed numbers.

     */

    function min(int256 a, int256 b) internal pure returns (int256) {

        return a < b ? a : b;

    }



    /**

     * @dev Returns the average of two signed numbers without overflow.

     * The result is rounded towards zero.

     */

    function average(int256 a, int256 b) internal pure returns (int256) {

        // Formula from the book "Hacker's Delight"

        int256 x = (a & b) + ((a ^ b) >> 1);

        return x + (int256(uint256(x) >> 255) & (a ^ b));

    }



    /**

     * @dev Returns the absolute unsigned value of a signed value.

     */

    function abs(int256 n) internal pure returns (uint256) {

        unchecked {

            // must be unchecked in order to support `n = type(int256).min`

            return uint256(n >= 0 ? n : -n);

        }

    }

}



library Strings {

    bytes16 private constant _SYMBOLS = "0123456789abcdef";

    uint8 private constant _ADDRESS_LENGTH = 20;



    /**

     * @dev Converts a `uint256` to its ASCII `string` decimal representation.

     */

    function toString(uint256 value) internal pure returns (string memory) {

        unchecked {

            uint256 length = Math.log10(value) + 1;

            string memory buffer = new string(length);

            uint256 ptr;

            /// @solidity memory-safe-assembly

            assembly {

                ptr := add(buffer, add(32, length))

            }

            while (true) {

                ptr--;

                /// @solidity memory-safe-assembly

                assembly {

                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))

                }

                value /= 10;

                if (value == 0) break;

            }

            return buffer;

        }

    }



    /**

     * @dev Converts a `int256` to its ASCII `string` decimal representation.

     */

    function toString(int256 value) internal pure returns (string memory) {

        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));

    }



    /**

     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.

     */

    function toHexString(uint256 value) internal pure returns (string memory) {

        unchecked {

            return toHexString(value, Math.log256(value) + 1);

        }

    }



    /**

     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.

     */

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {

        bytes memory buffer = new bytes(2 * length + 2);

        buffer[0] = "0";

        buffer[1] = "x";

        for (uint256 i = 2 * length + 1; i > 1; --i) {

            buffer[i] = _SYMBOLS[value & 0xf];

            value >>= 4;

        }

        require(value == 0, "Strings: hex length insufficient");

        return string(buffer);

    }



    /**

     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.

     */

    function toHexString(address addr) internal pure returns (string memory) {

        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);

    }



    /**

     * @dev Returns true if the two strings are equal.

     */

    function equal(string memory a, string memory b) internal pure returns (bool) {

        return keccak256(bytes(a)) == keccak256(bytes(b));

    }

}



library ECDSA {

    enum RecoverError {

        NoError,

        InvalidSignature,

        InvalidSignatureLength,

        InvalidSignatureS,

        InvalidSignatureV // Deprecated in v4.8

    }



    function _throwError(RecoverError error) private pure {

        if (error == RecoverError.NoError) {

            return; // no error: do nothing

        } else if (error == RecoverError.InvalidSignature) {

            revert("ECDSA: invalid signature");

        } else if (error == RecoverError.InvalidSignatureLength) {

            revert("ECDSA: invalid signature length");

        } else if (error == RecoverError.InvalidSignatureS) {

            revert("ECDSA: invalid signature 's' value");

        }

    }



    /**

     * @dev Returns the address that signed a hashed message (`hash`) with

     * `signature` or error string. This address can then be used for verification purposes.

     *

     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:

     * this function rejects them by requiring the `s` value to be in the lower

     * half order, and the `v` value to be either 27 or 28.

     *

     * IMPORTANT: `hash` _must_ be the result of a hash operation for the

     * verification to be secure: it is possible to craft signatures that

     * recover to arbitrary addresses for non-hashed data. A safe way to ensure

     * this is by receiving a hash of the original message (which may otherwise

     * be too long), and then calling {toEthSignedMessageHash} on it.

     *

     * Documentation for signature generation:

     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]

     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]

     *

     * _Available since v4.3._

     */

    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {

        if (signature.length == 65) {

            bytes32 r;

            bytes32 s;

            uint8 v;

            // ecrecover takes the signature parameters, and the only way to get them

            // currently is to use assembly.

            /// @solidity memory-safe-assembly

            assembly {

                r := mload(add(signature, 0x20))

                s := mload(add(signature, 0x40))

                v := byte(0, mload(add(signature, 0x60)))

            }

            return tryRecover(hash, v, r, s);

        } else {

            return (address(0), RecoverError.InvalidSignatureLength);

        }

    }



    /**

     * @dev Returns the address that signed a hashed message (`hash`) with

     * `signature`. This address can then be used for verification purposes.

     *

     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:

     * this function rejects them by requiring the `s` value to be in the lower

     * half order, and the `v` value to be either 27 or 28.

     *

     * IMPORTANT: `hash` _must_ be the result of a hash operation for the

     * verification to be secure: it is possible to craft signatures that

     * recover to arbitrary addresses for non-hashed data. A safe way to ensure

     * this is by receiving a hash of the original message (which may otherwise

     * be too long), and then calling {toEthSignedMessageHash} on it.

     */

    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {

        (address recovered, RecoverError error) = tryRecover(hash, signature);

        _throwError(error);

        return recovered;

    }



    /**

     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.

     *

     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]

     *

     * _Available since v4.3._

     */

    function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {

        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);

        uint8 v = uint8((uint256(vs) >> 255) + 27);

        return tryRecover(hash, v, r, s);

    }



    /**

     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.

     *

     * _Available since v4.2._

     */

    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {

        (address recovered, RecoverError error) = tryRecover(hash, r, vs);

        _throwError(error);

        return recovered;

    }



    /**

     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,

     * `r` and `s` signature fields separately.

     *

     * _Available since v4.3._

     */

    function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature

        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines

        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most

        // signatures from current libraries generate a unique signature with an s-value in the lower half order.

        //

        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value

        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or

        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept

        // these malleable signatures as well.

        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {

            return (address(0), RecoverError.InvalidSignatureS);

        }



        // If the signature is valid (and not malleable), return the signer address

        address signer = ecrecover(hash, v, r, s);

        if (signer == address(0)) {

            return (address(0), RecoverError.InvalidSignature);

        }



        return (signer, RecoverError.NoError);

    }



    /**

     * @dev Overload of {ECDSA-recover} that receives the `v`,

     * `r` and `s` signature fields separately.

     */

    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {

        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);

        _throwError(error);

        return recovered;

    }



    /**

     * @dev Returns an Ethereum Signed Message, created from a `hash`. This

     * produces hash corresponding to the one signed with the

     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]

     * JSON-RPC method as part of EIP-191.

     *

     * See {recover}.

     */

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {

        // 32 is the length in bytes of hash,

        // enforced by the type signature above

        /// @solidity memory-safe-assembly

        assembly {

            mstore(0x00, "\x19Ethereum Signed Message:\n32")

            mstore(0x1c, hash)

            message := keccak256(0x00, 0x3c)

        }

    }



    /**

     * @dev Returns an Ethereum Signed Message, created from `s`. This

     * produces hash corresponding to the one signed with the

     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]

     * JSON-RPC method as part of EIP-191.

     *

     * See {recover}.

     */

    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {

        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));

    }



    /**

     * @dev Returns an Ethereum Signed Typed Data, created from a

     * `domainSeparator` and a `structHash`. This produces hash corresponding

     * to the one signed with the

     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]

     * JSON-RPC method as part of EIP-712.

     *

     * See {recover}.

     */

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {

        /// @solidity memory-safe-assembly

        assembly {

            let ptr := mload(0x40)

            mstore(ptr, "\x19\x01")

            mstore(add(ptr, 0x02), domainSeparator)

            mstore(add(ptr, 0x22), structHash)

            data := keccak256(ptr, 0x42)

        }

    }



    /**

     * @dev Returns an Ethereum Signed Data with intended validator, created from a

     * `validator` and `data` according to the version 0 of EIP-191.

     *

     * See {recover}.

     */

    function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {

        return keccak256(abi.encodePacked("\x19\x00", validator, data));

    }

}



library StorageSlot {

    struct AddressSlot {

        address value;

    }



    struct BooleanSlot {

        bool value;

    }



    struct Bytes32Slot {

        bytes32 value;

    }



    struct Uint256Slot {

        uint256 value;

    }



    struct StringSlot {

        string value;

    }



    struct BytesSlot {

        bytes value;

    }



    /**

     * @dev Returns an `AddressSlot` with member `value` located at `slot`.

     */

    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := slot

        }

    }



    /**

     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.

     */

    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := slot

        }

    }



    /**

     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.

     */

    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := slot

        }

    }



    /**

     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.

     */

    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := slot

        }

    }



    /**

     * @dev Returns an `StringSlot` with member `value` located at `slot`.

     */

    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := slot

        }

    }



    /**

     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.

     */

    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := store.slot

        }

    }



    /**

     * @dev Returns an `BytesSlot` with member `value` located at `slot`.

     */

    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := slot

        }

    }



    /**

     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.

     */

    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {

        /// @solidity memory-safe-assembly

        assembly {

            r.slot := store.slot

        }

    }

}



type ShortString is bytes32;



/**

 * @dev This library provides functions to convert short memory strings

 * into a `ShortString` type that can be used as an immutable variable.

 *

 * Strings of arbitrary length can be optimized using this library if

 * they are short enough (up to 31 bytes) by packing them with their

 * length (1 byte) in a single EVM word (32 bytes). Additionally, a

 * fallback mechanism can be used for every other case.

 *

 * Usage example:

 *

 * ```solidity

 * contract Named {

 *     using ShortStrings for *;

 *

 *     ShortString private immutable _name;

 *     string private _nameFallback;

 *

 *     constructor(string memory contractName) {

 *         _name = contractName.toShortStringWithFallback(_nameFallback);

 *     }

 *

 *     function name() external view returns (string memory) {

 *         return _name.toStringWithFallback(_nameFallback);

 *     }

 * }

 * ```

 */

library ShortStrings {

    // Used as an identifier for strings longer than 31 bytes.

    bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;



    error StringTooLong(string str);

    error InvalidShortString();



    /**

     * @dev Encode a string of at most 31 chars into a `ShortString`.

     *

     * This will trigger a `StringTooLong` error is the input string is too long.

     */

    function toShortString(string memory str) internal pure returns (ShortString) {

        bytes memory bstr = bytes(str);

        if (bstr.length > 31) {

            revert StringTooLong(str);

        }

        return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));

    }



    /**

     * @dev Decode a `ShortString` back to a "normal" string.

     */

    function toString(ShortString sstr) internal pure returns (string memory) {

        uint256 len = byteLength(sstr);

        // using `new string(len)` would work locally but is not memory safe.

        string memory str = new string(32);

        /// @solidity memory-safe-assembly

        assembly {

            mstore(str, len)

            mstore(add(str, 0x20), sstr)

        }

        return str;

    }



    /**

     * @dev Return the length of a `ShortString`.

     */

    function byteLength(ShortString sstr) internal pure returns (uint256) {

        uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;

        if (result > 31) {

            revert InvalidShortString();

        }

        return result;

    }



    /**

     * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.

     */

    function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {

        if (bytes(value).length < 32) {

            return toShortString(value);

        } else {

            StorageSlot.getStringSlot(store).value = value;

            return ShortString.wrap(_FALLBACK_SENTINEL);

        }

    }



    /**

     * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.

     */

    function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {

        if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {

            return toString(value);

        } else {

            return store;

        }

    }



    /**

     * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.

     *

     * WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of

     * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.

     */

    function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {

        if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {

            return byteLength(value);

        } else {

            return bytes(store).length;

        }

    }

}



interface IERC5267 {

    /**

     * @dev MAY be emitted to signal that the domain could have changed.

     */

    event EIP712DomainChanged();



    /**

     * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712

     * signature.

     */

    function eip712Domain()

        external

        view

        returns (

            bytes1 fields,

            string memory name,

            string memory version,

            uint256 chainId,

            address verifyingContract,

            bytes32 salt,

            uint256[] memory extensions

        );

}



abstract contract EIP712 is IERC5267 {

    using ShortStrings for *;



    bytes32 private constant _TYPE_HASH =

        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");



    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to

    // invalidate the cached domain separator if the chain id changes.

    bytes32 private immutable _cachedDomainSeparator;

    uint256 private immutable _cachedChainId;

    address private immutable _cachedThis;



    bytes32 private immutable _hashedName;

    bytes32 private immutable _hashedVersion;



    ShortString private immutable _name;

    ShortString private immutable _version;

    string private _nameFallback;

    string private _versionFallback;



    /**

     * @dev Initializes the domain separator and parameter caches.

     *

     * The meaning of `name` and `version` is specified in

     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:

     *

     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.

     * - `version`: the current major version of the signing domain.

     *

     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart

     * contract upgrade].

     */

    constructor(string memory name, string memory version) {

        _name = name.toShortStringWithFallback(_nameFallback);

        _version = version.toShortStringWithFallback(_versionFallback);

        _hashedName = keccak256(bytes(name));

        _hashedVersion = keccak256(bytes(version));



        _cachedChainId = block.chainid;

        _cachedDomainSeparator = _buildDomainSeparator();

        _cachedThis = address(this);

    }



    /**

     * @dev Returns the domain separator for the current chain.

     */

    function _domainSeparatorV4() internal view returns (bytes32) {

        if (address(this) == _cachedThis && block.chainid == _cachedChainId) {

            return _cachedDomainSeparator;

        } else {

            return _buildDomainSeparator();

        }

    }



    function _buildDomainSeparator() private view returns (bytes32) {

        return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));

    }



    /**

     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this

     * function returns the hash of the fully encoded EIP712 message for this domain.

     *

     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:

     *

     * ```solidity

     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(

     *     keccak256("Mail(address to,string contents)"),

     *     mailTo,

     *     keccak256(bytes(mailContents))

     * )));

     * address signer = ECDSA.recover(digest, signature);

     * ```

     */

    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {

        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);

    }



    /**

     * @dev See {EIP-5267}.

     *

     * _Available since v4.9._

     */

    function eip712Domain()

        public

        view

        virtual

        override

        returns (

            bytes1 fields,

            string memory name,

            string memory version,

            uint256 chainId,

            address verifyingContract,

            bytes32 salt,

            uint256[] memory extensions

        )

    {

        return (

            hex"0f", // 01111

            _name.toStringWithFallback(_nameFallback),

            _version.toStringWithFallback(_versionFallback),

            block.chainid,

            address(this),

            bytes32(0),

            new uint256[](0)

        );

    }

}



library Counters {

    struct Counter {

        // This variable should never be directly accessed by users of the library: interactions must be restricted to

        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add

        // this feature: see https://github.com/ethereum/solidity/issues/4637

        uint256 _value; // default: 0

    }



    function current(Counter storage counter) internal view returns (uint256) {

        return counter._value;

    }



    function increment(Counter storage counter) internal {

        unchecked {

            counter._value += 1;

        }

    }



    function decrement(Counter storage counter) internal {

        uint256 value = counter._value;

        require(value > 0, "Counter: decrement overflow");

        unchecked {

            counter._value = value - 1;

        }

    }



    function reset(Counter storage counter) internal {

        counter._value = 0;

    }

}



abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {

    using Counters for Counters.Counter;



    mapping(address => Counters.Counter) private _nonces;



    // solhint-disable-next-line var-name-mixedcase

    bytes32 private constant _PERMIT_TYPEHASH =

        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**

     * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.

     * However, to ensure consistency with the upgradeable transpiler, we will continue

     * to reserve a slot.

     * @custom:oz-renamed-from _PERMIT_TYPEHASH

     */

    // solhint-disable-next-line var-name-mixedcase

    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;



    /**

     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.

     *

     * It's a good idea to use the same `name` that is defined as the ERC20 token name.

     */

    constructor(string memory name) EIP712(name, "1") {}



    /**

     * @dev See {IERC20Permit-permit}.

     */

    function permit(

        address owner,

        address spender,

        uint256 value,

        uint256 deadline,

        uint8 v,

        bytes32 r,

        bytes32 s

    ) public virtual override {

        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");



        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));



        bytes32 hash = _hashTypedDataV4(structHash);



        address signer = ECDSA.recover(hash, v, r, s);

        require(signer == owner, "ERC20Permit: invalid signature");



        _approve(owner, spender, value);

    }



    /**

     * @dev See {IERC20Permit-nonces}.

     */

    function nonces(address owner) public view virtual override returns (uint256) {

        return _nonces[owner].current();

    }



    /**

     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.

     */

    // solhint-disable-next-line func-name-mixedcase

    function DOMAIN_SEPARATOR() external view override returns (bytes32) {

        return _domainSeparatorV4();

    }



    /**

     * @dev "Consume a nonce": return the current value and increment.

     *

     * _Available since v4.1._

     */

    function _useNonce(address owner) internal virtual returns (uint256 current) {

        Counters.Counter storage nonce = _nonces[owner];

        current = nonce.current();

        nonce.increment();

    }

}





contract Asatpad is ERC20, ERC20Burnable, Ownable, ERC20Permit {

    uint256 public totalSupplyLimit = 210000000;

    constructor() ERC20("Asatpad", "Atpad") ERC20Permit("Asatpad") {
        _mint(msg.sender, 115500000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        require(totalUpperLimit(amount));
        _mint(to, amount * 10 ** decimals());
    }

    function totalUpperLimit(uint256 amount) internal view returns (bool) {

        return (totalSupplyLimit >= totalSupply() / (10 ** decimals()) + amount);

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"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":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyLimit","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"}]

610160604052630c845880600a5534801562000019575f80fd5b506040518060400160405280600781526020017f4173617470616400000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f41736174706164000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f41747061640000000000000000000000000000000000000000000000000000008152508160039081620001049190620007f9565b508060049081620001169190620007f9565b505050620001396200012d6200023060201b60201c565b6200023760201b60201c565b6200014f600683620002fa60201b90919060201c565b61012081815250506200016d600782620002fa60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a08181525050620001ac6200034f60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050506200022a33620001ff620003ab60201b60201c565b600a6200020d919062000a66565b6306e263e06200021e919062000ab6565b620003b360201b60201c565b62000dd6565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6020835110156200031f5762000317836200051860201b60201c565b905062000349565b8262000331836200058260201b60201c565b5f019081620003419190620007f9565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016200039095949392919062000b6e565b60405160208183030381529060405280519060200120905090565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041b9062000c27565b60405180910390fd5b620004375f83836200058b60201b60201c565b8060025f8282546200044a919062000c47565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620004f9919062000c81565b60405180910390a3620005145f83836200059060201b60201c565b5050565b5f80829050601f815111156200056757826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016200055e919062000d16565b60405180910390fd5b805181620005759062000d67565b5f1c175f1b915050919050565b5f819050919050565b505050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200061157607f821691505b602082108103620006275762000626620005cc565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200068b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200064e565b6200069786836200064e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620006e1620006db620006d584620006af565b620006b8565b620006af565b9050919050565b5f819050919050565b620006fc83620006c1565b620007146200070b82620006e8565b8484546200065a565b825550505050565b5f90565b6200072a6200071c565b62000737818484620006f1565b505050565b5b818110156200075e57620007525f8262000720565b6001810190506200073d565b5050565b601f821115620007ad5762000777816200062d565b62000782846200063f565b8101602085101562000792578190505b620007aa620007a1856200063f565b8301826200073c565b50505b505050565b5f82821c905092915050565b5f620007cf5f1984600802620007b2565b1980831691505092915050565b5f620007e98383620007be565b9150826002028217905092915050565b620008048262000595565b67ffffffffffffffff81111562000820576200081f6200059f565b5b6200082c8254620005f9565b6200083982828562000762565b5f60209050601f8311600181146200086f575f84156200085a578287015190505b620008668582620007dc565b865550620008d5565b601f1984166200087f866200062d565b5f5b82811015620008a85784890151825560018201915060208501945060208101905062000881565b86831015620008c85784890151620008c4601f891682620007be565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000967578086048111156200093f576200093e620008dd565b5b60018516156200094f5780820291505b80810290506200095f856200090a565b94506200091f565b94509492505050565b5f8262000981576001905062000a53565b8162000990575f905062000a53565b8160018114620009a95760028114620009b457620009ea565b600191505062000a53565b60ff841115620009c957620009c8620008dd565b5b8360020a915084821115620009e357620009e2620008dd565b5b5062000a53565b5060208310610133831016604e8410600b841016171562000a245782820a90508381111562000a1e5762000a1d620008dd565b5b62000a53565b62000a33848484600162000916565b9250905081840481111562000a4d5762000a4c620008dd565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000a7282620006af565b915062000a7f8362000a5a565b925062000aae7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000970565b905092915050565b5f62000ac282620006af565b915062000acf83620006af565b925082820262000adf81620006af565b9150828204841483151762000af95762000af8620008dd565b5b5092915050565b5f819050919050565b62000b148162000b00565b82525050565b62000b2581620006af565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000b568262000b2b565b9050919050565b62000b688162000b4a565b82525050565b5f60a08201905062000b835f83018862000b09565b62000b92602083018762000b09565b62000ba1604083018662000b09565b62000bb0606083018562000b1a565b62000bbf608083018462000b5d565b9695505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62000c0f601f8362000bc9565b915062000c1c8262000bd9565b602082019050919050565b5f6020820190508181035f83015262000c408162000c01565b9050919050565b5f62000c5382620006af565b915062000c6083620006af565b925082820190508082111562000c7b5762000c7a620008dd565b5b92915050565b5f60208201905062000c965f83018462000b1a565b92915050565b5f5b8381101562000cbb57808201518184015260208101905062000c9e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f62000ce28262000595565b62000cee818562000bc9565b935062000d0081856020860162000c9c565b62000d0b8162000cc6565b840191505092915050565b5f6020820190508181035f83015262000d30818462000cd6565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f62000d5e825162000b00565b80915050919050565b5f62000d738262000d38565b8262000d7f8462000d42565b905062000d8c8162000d51565b9250602082101562000dcf5762000dca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026200064e565b831692505b5050919050565b60805160a05160c05160e051610100516101205161014051612ce962000e285f395f6106e701525f6106b301525f6116e401525f6116c301525f610ffc01525f61105201525f61107b0152612ce95ff3fe608060405234801561000f575f80fd5b5060043610610140575f3560e01c806379cc6790116100b6578063a457c2d71161007a578063a457c2d71461036a578063a9059cbb1461039a578063bac21a22146103ca578063d505accf146103e8578063dd62ed3e14610404578063f2fde38b1461043457610140565b806379cc6790146102be5780637ecebe00146102da57806384b0196e1461030a5780638da5cb5b1461032e57806395d89b411461034c57610140565b80633644e515116101085780633644e515146101fe578063395093511461021c57806340c10f191461024c57806342966c681461026857806370a0823114610284578063715018a6146102b457610140565b806306fdde0314610144578063095ea7b31461016257806318160ddd1461019257806323b872dd146101b0578063313ce567146101e0575b5f80fd5b61014c610450565b6040516101599190611b0f565b60405180910390f35b61017c60048036038101906101779190611bc0565b6104e0565b6040516101899190611c18565b60405180910390f35b61019a610502565b6040516101a79190611c40565b60405180910390f35b6101ca60048036038101906101c59190611c59565b61050b565b6040516101d79190611c18565b60405180910390f35b6101e8610539565b6040516101f59190611cc4565b60405180910390f35b610206610541565b6040516102139190611cf5565b60405180910390f35b61023660048036038101906102319190611bc0565b61054f565b6040516102439190611c18565b60405180910390f35b61026660048036038101906102619190611bc0565b610585565b005b610282600480360381019061027d9190611d0e565b6105ca565b005b61029e60048036038101906102999190611d39565b6105de565b6040516102ab9190611c40565b60405180910390f35b6102bc610623565b005b6102d860048036038101906102d39190611bc0565b610636565b005b6102f460048036038101906102ef9190611d39565b610656565b6040516103019190611c40565b60405180910390f35b6103126106a3565b6040516103259796959493929190611e64565b60405180910390f35b6103366107a0565b6040516103439190611ee6565b60405180910390f35b6103546107c8565b6040516103619190611b0f565b60405180910390f35b610384600480360381019061037f9190611bc0565b610858565b6040516103919190611c18565b60405180910390f35b6103b460048036038101906103af9190611bc0565b6108cd565b6040516103c19190611c18565b60405180910390f35b6103d26108ef565b6040516103df9190611c40565b60405180910390f35b61040260048036038101906103fd9190611f53565b6108f5565b005b61041e60048036038101906104199190611ff0565b610a34565b60405161042b9190611c40565b60405180910390f35b61044e60048036038101906104499190611d39565b610ab6565b005b60606003805461045f9061205b565b80601f016020809104026020016040519081016040528092919081815260200182805461048b9061205b565b80156104d65780601f106104ad576101008083540402835291602001916104d6565b820191905f5260205f20905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b5f806104ea610b38565b90506104f7818585610b3f565b600191505092915050565b5f600254905090565b5f80610515610b38565b9050610522858285610d02565b61052d858585610d8d565b60019150509392505050565b5f6012905090565b5f61054a610ff9565b905090565b5f80610559610b38565b905061057a81858561056b8589610a34565b61057591906120b8565b610b3f565b600191505092915050565b61058d6110af565b6105968161112d565b61059e575f80fd5b6105c6826105aa610539565b600a6105b6919061221a565b836105c19190612264565b61116b565b5050565b6105db6105d5610b38565b826112b9565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61062b6110af565b6106345f61147c565b565b61064882610642610b38565b83610d02565b61065282826112b9565b5050565b5f61069c60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061153f565b9050919050565b5f6060805f805f60606106e060067f000000000000000000000000000000000000000000000000000000000000000061154b90919063ffffffff16565b61071460077f000000000000000000000000000000000000000000000000000000000000000061154b90919063ffffffff16565b46305f801b5f67ffffffffffffffff811115610733576107326122a5565b5b6040519080825280602002602001820160405280156107615781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546107d79061205b565b80601f01602080910402602001604051908101604052809291908181526020018280546108039061205b565b801561084e5780601f106108255761010080835404028352916020019161084e565b820191905f5260205f20905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b5f80610862610b38565b90505f61086f8286610a34565b9050838110156108b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ab90612342565b60405180910390fd5b6108c18286868403610b3f565b60019250505092915050565b5f806108d7610b38565b90506108e4818585610d8d565b600191505092915050565b600a5481565b83421115610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906123aa565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109668c6115f8565b8960405160200161097c969594939291906123c8565b6040516020818303038152906040528051906020012090505f61099e82611653565b90505f6109ad8287878761166c565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490612471565b60405180910390fd5b610a288a8a8a610b3f565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610abe6110af565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b23906124ff565b60405180910390fd5b610b358161147c565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba49061258d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c129061261b565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610cf59190611c40565b60405180910390a3505050565b5f610d0d8484610a34565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d875781811015610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7090612683565b60405180910390fd5b610d868484848403610b3f565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290612711565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e609061279f565b60405180910390fd5b610e74838383611695565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee9061282d565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fe09190611c40565b60405180910390a3610ff384848461169a565b50505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561107457507f000000000000000000000000000000000000000000000000000000000000000046145b156110a1577f000000000000000000000000000000000000000000000000000000000000000090506110ac565b6110a961169f565b90505b90565b6110b7610b38565b73ffffffffffffffffffffffffffffffffffffffff166110d56107a0565b73ffffffffffffffffffffffffffffffffffffffff161461112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290612895565b60405180910390fd5b565b5f81611137610539565b600a611143919061221a565b61114b610502565b61115591906128e0565b61115f91906120b8565b600a5410159050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d09061295a565b60405180910390fd5b6111e45f8383611695565b8060025f8282546111f591906120b8565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112a29190611c40565b60405180910390a36112b55f838361169a565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906129e8565b60405180910390fd5b611332825f83611695565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90612a76565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114649190611c40565b60405180910390a3611477835f8461169a565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f815f01549050919050565b606060ff5f1b83146115675761156083611734565b90506115f2565b8180546115739061205b565b80601f016020809104026020016040519081016040528092919081815260200182805461159f9061205b565b80156115ea5780601f106115c1576101008083540402835291602001916115ea565b820191905f5260205f20905b8154815290600101906020018083116115cd57829003601f168201915b505050505090505b92915050565b5f8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506116428161153f565b915061164d816117a6565b50919050565b5f61166561165f610ff9565b836117ba565b9050919050565b5f805f61167b878787876117fa565b91509150611688816118d2565b8192505050949350505050565b505050565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001611719959493929190612a94565b60405160208183030381529060405280519060200120905090565b60605f61174083611a37565b90505f602067ffffffffffffffff81111561175e5761175d6122a5565b5b6040519080825280601f01601f1916602001820160405280156117905781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b6001815f015f828254019250508190555050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c1115611832575f6003915091506118c9565b5f6001878787876040515f81526020016040526040516118559493929190612ae5565b6020604051602081039080840390855afa158015611875573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118c1575f600192509250506118c9565b805f92509250505b94509492505050565b5f60048111156118e5576118e4612b28565b5b8160048111156118f8576118f7612b28565b5b0315611a34576001600481111561191257611911612b28565b5b81600481111561192557611924612b28565b5b03611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90612b9f565b60405180910390fd5b6002600481111561197957611978612b28565b5b81600481111561198c5761198b612b28565b5b036119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390612c07565b60405180910390fd5b600360048111156119e0576119df612b28565b5b8160048111156119f3576119f2612b28565b5b03611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90612c95565b60405180910390fd5b5b50565b5f8060ff835f1c169050601f811115611a7c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611abc578082015181840152602081019050611aa1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611ae182611a85565b611aeb8185611a8f565b9350611afb818560208601611a9f565b611b0481611ac7565b840191505092915050565b5f6020820190508181035f830152611b278184611ad7565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b5c82611b33565b9050919050565b611b6c81611b52565b8114611b76575f80fd5b50565b5f81359050611b8781611b63565b92915050565b5f819050919050565b611b9f81611b8d565b8114611ba9575f80fd5b50565b5f81359050611bba81611b96565b92915050565b5f8060408385031215611bd657611bd5611b2f565b5b5f611be385828601611b79565b9250506020611bf485828601611bac565b9150509250929050565b5f8115159050919050565b611c1281611bfe565b82525050565b5f602082019050611c2b5f830184611c09565b92915050565b611c3a81611b8d565b82525050565b5f602082019050611c535f830184611c31565b92915050565b5f805f60608486031215611c7057611c6f611b2f565b5b5f611c7d86828701611b79565b9350506020611c8e86828701611b79565b9250506040611c9f86828701611bac565b9150509250925092565b5f60ff82169050919050565b611cbe81611ca9565b82525050565b5f602082019050611cd75f830184611cb5565b92915050565b5f819050919050565b611cef81611cdd565b82525050565b5f602082019050611d085f830184611ce6565b92915050565b5f60208284031215611d2357611d22611b2f565b5b5f611d3084828501611bac565b91505092915050565b5f60208284031215611d4e57611d4d611b2f565b5b5f611d5b84828501611b79565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611d9881611d64565b82525050565b611da781611b52565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611ddf81611b8d565b82525050565b5f611df08383611dd6565b60208301905092915050565b5f602082019050919050565b5f611e1282611dad565b611e1c8185611db7565b9350611e2783611dc7565b805f5b83811015611e57578151611e3e8882611de5565b9750611e4983611dfc565b925050600181019050611e2a565b5085935050505092915050565b5f60e082019050611e775f83018a611d8f565b8181036020830152611e898189611ad7565b90508181036040830152611e9d8188611ad7565b9050611eac6060830187611c31565b611eb96080830186611d9e565b611ec660a0830185611ce6565b81810360c0830152611ed88184611e08565b905098975050505050505050565b5f602082019050611ef95f830184611d9e565b92915050565b611f0881611ca9565b8114611f12575f80fd5b50565b5f81359050611f2381611eff565b92915050565b611f3281611cdd565b8114611f3c575f80fd5b50565b5f81359050611f4d81611f29565b92915050565b5f805f805f805f60e0888a031215611f6e57611f6d611b2f565b5b5f611f7b8a828b01611b79565b9750506020611f8c8a828b01611b79565b9650506040611f9d8a828b01611bac565b9550506060611fae8a828b01611bac565b9450506080611fbf8a828b01611f15565b93505060a0611fd08a828b01611f3f565b92505060c0611fe18a828b01611f3f565b91505092959891949750929550565b5f806040838503121561200657612005611b2f565b5b5f61201385828601611b79565b925050602061202485828601611b79565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061207257607f821691505b6020821081036120855761208461202e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120c282611b8d565b91506120cd83611b8d565b92508282019050808211156120e5576120e461208b565b5b92915050565b5f8160011c9050919050565b5f808291508390505b60018511156121405780860481111561211c5761211b61208b565b5b600185161561212b5780820291505b8081029050612139856120eb565b9450612100565b94509492505050565b5f826121585760019050612213565b81612165575f9050612213565b816001811461217b5760028114612185576121b4565b6001915050612213565b60ff8411156121975761219661208b565b5b8360020a9150848211156121ae576121ad61208b565b5b50612213565b5060208310610133831016604e8410600b84101617156121e95782820a9050838111156121e4576121e361208b565b5b612213565b6121f684848460016120f7565b9250905081840481111561220d5761220c61208b565b5b81810290505b9392505050565b5f61222482611b8d565b915061222f83611ca9565b925061225c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612149565b905092915050565b5f61226e82611b8d565b915061227983611b8d565b925082820261228781611b8d565b9150828204841483151761229e5761229d61208b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61232c602583611a8f565b9150612337826122d2565b604082019050919050565b5f6020820190508181035f83015261235981612320565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f612394601d83611a8f565b915061239f82612360565b602082019050919050565b5f6020820190508181035f8301526123c181612388565b9050919050565b5f60c0820190506123db5f830189611ce6565b6123e86020830188611d9e565b6123f56040830187611d9e565b6124026060830186611c31565b61240f6080830185611c31565b61241c60a0830184611c31565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f61245b601e83611a8f565b915061246682612427565b602082019050919050565b5f6020820190508181035f8301526124888161244f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6124e9602683611a8f565b91506124f48261248f565b604082019050919050565b5f6020820190508181035f830152612516816124dd565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612577602483611a8f565b91506125828261251d565b604082019050919050565b5f6020820190508181035f8301526125a48161256b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612605602283611a8f565b9150612610826125ab565b604082019050919050565b5f6020820190508181035f830152612632816125f9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61266d601d83611a8f565b915061267882612639565b602082019050919050565b5f6020820190508181035f83015261269a81612661565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6126fb602583611a8f565b9150612706826126a1565b604082019050919050565b5f6020820190508181035f830152612728816126ef565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612789602383611a8f565b91506127948261272f565b604082019050919050565b5f6020820190508181035f8301526127b68161277d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612817602683611a8f565b9150612822826127bd565b604082019050919050565b5f6020820190508181035f8301526128448161280b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61287f602083611a8f565b915061288a8261284b565b602082019050919050565b5f6020820190508181035f8301526128ac81612873565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6128ea82611b8d565b91506128f583611b8d565b925082612905576129046128b3565b5b828204905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612944601f83611a8f565b915061294f82612910565b602082019050919050565b5f6020820190508181035f83015261297181612938565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129d2602183611a8f565b91506129dd82612978565b604082019050919050565b5f6020820190508181035f8301526129ff816129c6565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a60602283611a8f565b9150612a6b82612a06565b604082019050919050565b5f6020820190508181035f830152612a8d81612a54565b9050919050565b5f60a082019050612aa75f830188611ce6565b612ab46020830187611ce6565b612ac16040830186611ce6565b612ace6060830185611c31565b612adb6080830184611d9e565b9695505050505050565b5f608082019050612af85f830187611ce6565b612b056020830186611cb5565b612b126040830185611ce6565b612b1f6060830184611ce6565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f612b89601883611a8f565b9150612b9482612b55565b602082019050919050565b5f6020820190508181035f830152612bb681612b7d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f612bf1601f83611a8f565b9150612bfc82612bbd565b602082019050919050565b5f6020820190508181035f830152612c1e81612be5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f612c7f602283611a8f565b9150612c8a82612c25565b604082019050919050565b5f6020820190508181035f830152612cac81612c73565b905091905056fea2646970667358221220f95906aa02d8c7ffbbec8692652089858edc8aca6bd985be457502e2fa1b58f964736f6c63430008160033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610140575f3560e01c806379cc6790116100b6578063a457c2d71161007a578063a457c2d71461036a578063a9059cbb1461039a578063bac21a22146103ca578063d505accf146103e8578063dd62ed3e14610404578063f2fde38b1461043457610140565b806379cc6790146102be5780637ecebe00146102da57806384b0196e1461030a5780638da5cb5b1461032e57806395d89b411461034c57610140565b80633644e515116101085780633644e515146101fe578063395093511461021c57806340c10f191461024c57806342966c681461026857806370a0823114610284578063715018a6146102b457610140565b806306fdde0314610144578063095ea7b31461016257806318160ddd1461019257806323b872dd146101b0578063313ce567146101e0575b5f80fd5b61014c610450565b6040516101599190611b0f565b60405180910390f35b61017c60048036038101906101779190611bc0565b6104e0565b6040516101899190611c18565b60405180910390f35b61019a610502565b6040516101a79190611c40565b60405180910390f35b6101ca60048036038101906101c59190611c59565b61050b565b6040516101d79190611c18565b60405180910390f35b6101e8610539565b6040516101f59190611cc4565b60405180910390f35b610206610541565b6040516102139190611cf5565b60405180910390f35b61023660048036038101906102319190611bc0565b61054f565b6040516102439190611c18565b60405180910390f35b61026660048036038101906102619190611bc0565b610585565b005b610282600480360381019061027d9190611d0e565b6105ca565b005b61029e60048036038101906102999190611d39565b6105de565b6040516102ab9190611c40565b60405180910390f35b6102bc610623565b005b6102d860048036038101906102d39190611bc0565b610636565b005b6102f460048036038101906102ef9190611d39565b610656565b6040516103019190611c40565b60405180910390f35b6103126106a3565b6040516103259796959493929190611e64565b60405180910390f35b6103366107a0565b6040516103439190611ee6565b60405180910390f35b6103546107c8565b6040516103619190611b0f565b60405180910390f35b610384600480360381019061037f9190611bc0565b610858565b6040516103919190611c18565b60405180910390f35b6103b460048036038101906103af9190611bc0565b6108cd565b6040516103c19190611c18565b60405180910390f35b6103d26108ef565b6040516103df9190611c40565b60405180910390f35b61040260048036038101906103fd9190611f53565b6108f5565b005b61041e60048036038101906104199190611ff0565b610a34565b60405161042b9190611c40565b60405180910390f35b61044e60048036038101906104499190611d39565b610ab6565b005b60606003805461045f9061205b565b80601f016020809104026020016040519081016040528092919081815260200182805461048b9061205b565b80156104d65780601f106104ad576101008083540402835291602001916104d6565b820191905f5260205f20905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b5f806104ea610b38565b90506104f7818585610b3f565b600191505092915050565b5f600254905090565b5f80610515610b38565b9050610522858285610d02565b61052d858585610d8d565b60019150509392505050565b5f6012905090565b5f61054a610ff9565b905090565b5f80610559610b38565b905061057a81858561056b8589610a34565b61057591906120b8565b610b3f565b600191505092915050565b61058d6110af565b6105968161112d565b61059e575f80fd5b6105c6826105aa610539565b600a6105b6919061221a565b836105c19190612264565b61116b565b5050565b6105db6105d5610b38565b826112b9565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61062b6110af565b6106345f61147c565b565b61064882610642610b38565b83610d02565b61065282826112b9565b5050565b5f61069c60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061153f565b9050919050565b5f6060805f805f60606106e060067f417361747061640000000000000000000000000000000000000000000000000761154b90919063ffffffff16565b61071460077f310000000000000000000000000000000000000000000000000000000000000161154b90919063ffffffff16565b46305f801b5f67ffffffffffffffff811115610733576107326122a5565b5b6040519080825280602002602001820160405280156107615781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546107d79061205b565b80601f01602080910402602001604051908101604052809291908181526020018280546108039061205b565b801561084e5780601f106108255761010080835404028352916020019161084e565b820191905f5260205f20905b81548152906001019060200180831161083157829003601f168201915b5050505050905090565b5f80610862610b38565b90505f61086f8286610a34565b9050838110156108b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ab90612342565b60405180910390fd5b6108c18286868403610b3f565b60019250505092915050565b5f806108d7610b38565b90506108e4818585610d8d565b600191505092915050565b600a5481565b83421115610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906123aa565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886109668c6115f8565b8960405160200161097c969594939291906123c8565b6040516020818303038152906040528051906020012090505f61099e82611653565b90505f6109ad8287878761166c565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490612471565b60405180910390fd5b610a288a8a8a610b3f565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610abe6110af565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b23906124ff565b60405180910390fd5b610b358161147c565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba49061258d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c129061261b565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610cf59190611c40565b60405180910390a3505050565b5f610d0d8484610a34565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d875781811015610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7090612683565b60405180910390fd5b610d868484848403610b3f565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df290612711565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e609061279f565b60405180910390fd5b610e74838383611695565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee9061282d565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fe09190611c40565b60405180910390a3610ff384848461169a565b50505050565b5f7f0000000000000000000000000c77edaa31dbfc270d1edd4bfd4ae5b09ee8926073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561107457507f000000000000000000000000000000000000000000000000000000000000000146145b156110a1577f04fd8fd12ac508df80ad51d9f583e7a7068202b2c45e884023c4cbe5ba2f52dc90506110ac565b6110a961169f565b90505b90565b6110b7610b38565b73ffffffffffffffffffffffffffffffffffffffff166110d56107a0565b73ffffffffffffffffffffffffffffffffffffffff161461112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290612895565b60405180910390fd5b565b5f81611137610539565b600a611143919061221a565b61114b610502565b61115591906128e0565b61115f91906120b8565b600a5410159050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d09061295a565b60405180910390fd5b6111e45f8383611695565b8060025f8282546111f591906120b8565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112a29190611c40565b60405180910390a36112b55f838361169a565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906129e8565b60405180910390fd5b611332825f83611695565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90612a76565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114649190611c40565b60405180910390a3611477835f8461169a565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f815f01549050919050565b606060ff5f1b83146115675761156083611734565b90506115f2565b8180546115739061205b565b80601f016020809104026020016040519081016040528092919081815260200182805461159f9061205b565b80156115ea5780601f106115c1576101008083540402835291602001916115ea565b820191905f5260205f20905b8154815290600101906020018083116115cd57829003601f168201915b505050505090505b92915050565b5f8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506116428161153f565b915061164d816117a6565b50919050565b5f61166561165f610ff9565b836117ba565b9050919050565b5f805f61167b878787876117fa565b91509150611688816118d2565b8192505050949350505050565b505050565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fc5dc2f1465b00e4042e7718643e6f09b79519b1ebb9bdeb7537f1ad99dd321957fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001611719959493929190612a94565b60405160208183030381529060405280519060200120905090565b60605f61174083611a37565b90505f602067ffffffffffffffff81111561175e5761175d6122a5565b5b6040519080825280601f01601f1916602001820160405280156117905781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b6001815f015f828254019250508190555050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c1115611832575f6003915091506118c9565b5f6001878787876040515f81526020016040526040516118559493929190612ae5565b6020604051602081039080840390855afa158015611875573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118c1575f600192509250506118c9565b805f92509250505b94509492505050565b5f60048111156118e5576118e4612b28565b5b8160048111156118f8576118f7612b28565b5b0315611a34576001600481111561191257611911612b28565b5b81600481111561192557611924612b28565b5b03611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90612b9f565b60405180910390fd5b6002600481111561197957611978612b28565b5b81600481111561198c5761198b612b28565b5b036119cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c390612c07565b60405180910390fd5b600360048111156119e0576119df612b28565b5b8160048111156119f3576119f2612b28565b5b03611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90612c95565b60405180910390fd5b5b50565b5f8060ff835f1c169050601f811115611a7c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611abc578082015181840152602081019050611aa1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611ae182611a85565b611aeb8185611a8f565b9350611afb818560208601611a9f565b611b0481611ac7565b840191505092915050565b5f6020820190508181035f830152611b278184611ad7565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b5c82611b33565b9050919050565b611b6c81611b52565b8114611b76575f80fd5b50565b5f81359050611b8781611b63565b92915050565b5f819050919050565b611b9f81611b8d565b8114611ba9575f80fd5b50565b5f81359050611bba81611b96565b92915050565b5f8060408385031215611bd657611bd5611b2f565b5b5f611be385828601611b79565b9250506020611bf485828601611bac565b9150509250929050565b5f8115159050919050565b611c1281611bfe565b82525050565b5f602082019050611c2b5f830184611c09565b92915050565b611c3a81611b8d565b82525050565b5f602082019050611c535f830184611c31565b92915050565b5f805f60608486031215611c7057611c6f611b2f565b5b5f611c7d86828701611b79565b9350506020611c8e86828701611b79565b9250506040611c9f86828701611bac565b9150509250925092565b5f60ff82169050919050565b611cbe81611ca9565b82525050565b5f602082019050611cd75f830184611cb5565b92915050565b5f819050919050565b611cef81611cdd565b82525050565b5f602082019050611d085f830184611ce6565b92915050565b5f60208284031215611d2357611d22611b2f565b5b5f611d3084828501611bac565b91505092915050565b5f60208284031215611d4e57611d4d611b2f565b5b5f611d5b84828501611b79565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611d9881611d64565b82525050565b611da781611b52565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611ddf81611b8d565b82525050565b5f611df08383611dd6565b60208301905092915050565b5f602082019050919050565b5f611e1282611dad565b611e1c8185611db7565b9350611e2783611dc7565b805f5b83811015611e57578151611e3e8882611de5565b9750611e4983611dfc565b925050600181019050611e2a565b5085935050505092915050565b5f60e082019050611e775f83018a611d8f565b8181036020830152611e898189611ad7565b90508181036040830152611e9d8188611ad7565b9050611eac6060830187611c31565b611eb96080830186611d9e565b611ec660a0830185611ce6565b81810360c0830152611ed88184611e08565b905098975050505050505050565b5f602082019050611ef95f830184611d9e565b92915050565b611f0881611ca9565b8114611f12575f80fd5b50565b5f81359050611f2381611eff565b92915050565b611f3281611cdd565b8114611f3c575f80fd5b50565b5f81359050611f4d81611f29565b92915050565b5f805f805f805f60e0888a031215611f6e57611f6d611b2f565b5b5f611f7b8a828b01611b79565b9750506020611f8c8a828b01611b79565b9650506040611f9d8a828b01611bac565b9550506060611fae8a828b01611bac565b9450506080611fbf8a828b01611f15565b93505060a0611fd08a828b01611f3f565b92505060c0611fe18a828b01611f3f565b91505092959891949750929550565b5f806040838503121561200657612005611b2f565b5b5f61201385828601611b79565b925050602061202485828601611b79565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061207257607f821691505b6020821081036120855761208461202e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120c282611b8d565b91506120cd83611b8d565b92508282019050808211156120e5576120e461208b565b5b92915050565b5f8160011c9050919050565b5f808291508390505b60018511156121405780860481111561211c5761211b61208b565b5b600185161561212b5780820291505b8081029050612139856120eb565b9450612100565b94509492505050565b5f826121585760019050612213565b81612165575f9050612213565b816001811461217b5760028114612185576121b4565b6001915050612213565b60ff8411156121975761219661208b565b5b8360020a9150848211156121ae576121ad61208b565b5b50612213565b5060208310610133831016604e8410600b84101617156121e95782820a9050838111156121e4576121e361208b565b5b612213565b6121f684848460016120f7565b9250905081840481111561220d5761220c61208b565b5b81810290505b9392505050565b5f61222482611b8d565b915061222f83611ca9565b925061225c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612149565b905092915050565b5f61226e82611b8d565b915061227983611b8d565b925082820261228781611b8d565b9150828204841483151761229e5761229d61208b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61232c602583611a8f565b9150612337826122d2565b604082019050919050565b5f6020820190508181035f83015261235981612320565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e650000005f82015250565b5f612394601d83611a8f565b915061239f82612360565b602082019050919050565b5f6020820190508181035f8301526123c181612388565b9050919050565b5f60c0820190506123db5f830189611ce6565b6123e86020830188611d9e565b6123f56040830187611d9e565b6124026060830186611c31565b61240f6080830185611c31565b61241c60a0830184611c31565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e617475726500005f82015250565b5f61245b601e83611a8f565b915061246682612427565b602082019050919050565b5f6020820190508181035f8301526124888161244f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6124e9602683611a8f565b91506124f48261248f565b604082019050919050565b5f6020820190508181035f830152612516816124dd565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612577602483611a8f565b91506125828261251d565b604082019050919050565b5f6020820190508181035f8301526125a48161256b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612605602283611a8f565b9150612610826125ab565b604082019050919050565b5f6020820190508181035f830152612632816125f9565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61266d601d83611a8f565b915061267882612639565b602082019050919050565b5f6020820190508181035f83015261269a81612661565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6126fb602583611a8f565b9150612706826126a1565b604082019050919050565b5f6020820190508181035f830152612728816126ef565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612789602383611a8f565b91506127948261272f565b604082019050919050565b5f6020820190508181035f8301526127b68161277d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612817602683611a8f565b9150612822826127bd565b604082019050919050565b5f6020820190508181035f8301526128448161280b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61287f602083611a8f565b915061288a8261284b565b602082019050919050565b5f6020820190508181035f8301526128ac81612873565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6128ea82611b8d565b91506128f583611b8d565b925082612905576129046128b3565b5b828204905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612944601f83611a8f565b915061294f82612910565b602082019050919050565b5f6020820190508181035f83015261297181612938565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6129d2602183611a8f565b91506129dd82612978565b604082019050919050565b5f6020820190508181035f8301526129ff816129c6565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a60602283611a8f565b9150612a6b82612a06565b604082019050919050565b5f6020820190508181035f830152612a8d81612a54565b9050919050565b5f60a082019050612aa75f830188611ce6565b612ab46020830187611ce6565b612ac16040830186611ce6565b612ace6060830185611c31565b612adb6080830184611d9e565b9695505050505050565b5f608082019050612af85f830187611ce6565b612b056020830186611cb5565b612b126040830185611ce6565b612b1f6060830184611ce6565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f612b89601883611a8f565b9150612b9482612b55565b602082019050919050565b5f6020820190508181035f830152612bb681612b7d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f612bf1601f83611a8f565b9150612bfc82612bbd565b602082019050919050565b5f6020820190508181035f830152612c1e81612be5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f612c7f602283611a8f565b9150612c8a82612c25565b604082019050919050565b5f6020820190508181035f830152612cac81612c73565b905091905056fea2646970667358221220f95906aa02d8c7ffbbec8692652089858edc8aca6bd985be457502e2fa1b58f964736f6c63430008160033

Deployed Bytecode Sourcemap

63410:596:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4242:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6750:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5435:112;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7575:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5263:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62907:119;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8283:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63671:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16026:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5620:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17942:107;;;:::i;:::-;;16466:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62633:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58932:705;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;17265:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4477:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9064:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5977:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63482:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61874:683;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6251:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18216:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4242:104;4296:13;4331:5;4324:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4242:104;:::o;6750:209::-;6833:4;6852:13;6868:12;:10;:12::i;:::-;6852:28;;6893:32;6902:5;6909:7;6918:6;6893:8;:32::i;:::-;6945:4;6938:11;;;6750:209;;;;:::o;5435:112::-;5496:7;5525:12;;5518:19;;5435:112;:::o;7575:271::-;7672:4;7691:15;7709:12;:10;:12::i;:::-;7691:30;;7734:38;7750:4;7756:7;7765:6;7734:15;:38::i;:::-;7785:27;7795:4;7801:2;7805:6;7785:9;:27::i;:::-;7832:4;7825:11;;;7575:271;;;;;:::o;5263:97::-;5321:5;5348:2;5341:9;;5263:97;:::o;62907:119::-;62967:7;62996:20;:18;:20::i;:::-;62989:27;;62907:119;:::o;8283:246::-;8371:4;8390:13;8406:12;:10;:12::i;:::-;8390:28;;8431:64;8440:5;8447:7;8484:10;8456:25;8466:5;8473:7;8456:9;:25::i;:::-;:38;;;;:::i;:::-;8431:8;:64::i;:::-;8515:4;8508:11;;;8283:246;;;;:::o;63671:157::-;17137:13;:11;:13::i;:::-;63749:23:::1;63765:6;63749:15;:23::i;:::-;63741:32;;;::::0;::::1;;63784:36;63790:2;63809:10;:8;:10::i;:::-;63803:2;:16;;;;:::i;:::-;63794:6;:25;;;;:::i;:::-;63784:5;:36::i;:::-;63671:157:::0;;:::o;16026:95::-;16084:27;16090:12;:10;:12::i;:::-;16104:6;16084:5;:27::i;:::-;16026:95;:::o;5620:131::-;5694:7;5723:9;:18;5733:7;5723:18;;;;;;;;;;;;;;;;5716:25;;5620:131;;;:::o;17942:107::-;17137:13;:11;:13::i;:::-;18009:30:::1;18036:1;18009:18;:30::i;:::-;17942:107::o:0;16466:170::-;16545:46;16561:7;16570:12;:10;:12::i;:::-;16584:6;16545:15;:46::i;:::-;16604:22;16610:7;16619:6;16604:5;:22::i;:::-;16466:170;;:::o;62633:132::-;62702:7;62731:24;:7;:14;62739:5;62731:14;;;;;;;;;;;;;;;:22;:24::i;:::-;62724:31;;62633:132;;;:::o;58932:705::-;59065:13;59095:18;59130:21;59168:15;59200:25;59242:12;59271:27;59389:41;59416:13;59389:5;:26;;:41;;;;:::i;:::-;59447:47;59477:16;59447:8;:29;;:47;;;;:::i;:::-;59511:13;59549:4;59579:1;59571:10;;59612:1;59598:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59332:295;;;;;;;;;;;;;;;;;;;;;58932:705;;;;;;;:::o;17265:91::-;17311:7;17340:6;;;;;;;;;;;17333:13;;17265:91;:::o;4477:108::-;4533:13;4568:7;4561:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4477:108;:::o;9064:454::-;9157:4;9176:13;9192:12;:10;:12::i;:::-;9176:28;;9217:24;9244:25;9254:5;9261:7;9244:9;:25::i;:::-;9217:52;;9310:15;9290:16;:35;;9282:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;9407:60;9416:5;9423:7;9451:15;9432:16;:34;9407:8;:60::i;:::-;9504:4;9497:11;;;;9064:454;;;;:::o;5977:201::-;6056:4;6075:13;6091:12;:10;:12::i;:::-;6075:28;;6116;6126:5;6133:2;6137:6;6116:9;:28::i;:::-;6164:4;6157:11;;;5977:201;;;;:::o;63482:43::-;;;;:::o;61874:683::-;62136:8;62117:15;:27;;62109:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62195:18;61009:95;62255:5;62262:7;62271:5;62278:16;62288:5;62278:9;:16::i;:::-;62296:8;62226:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62216:90;;;;;;62195:111;;62323:12;62338:28;62355:10;62338:16;:28::i;:::-;62323:43;;62383:14;62400:28;62414:4;62420:1;62423;62426;62400:13;:28::i;:::-;62383:45;;62459:5;62449:15;;:6;:15;;;62441:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62516:31;62525:5;62532:7;62541:5;62516:8;:31::i;:::-;62096:461;;;61874:683;;;;;;;:::o;6251:155::-;6340:7;6369:11;:18;6381:5;6369:18;;;;;;;;;;;;;;;:27;6388:7;6369:27;;;;;;;;;;;;;;;;6362:34;;6251:155;;;;:::o;18216:207::-;17137:13;:11;:13::i;:::-;18327:1:::1;18307:22;;:8;:22;;::::0;18299:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18385:28;18404:8;18385:18;:28::i;:::-;18216:207:::0;:::o;3308:102::-;3361:7;3390:10;3383:17;;3308:102;:::o;13279:358::-;13400:1;13383:19;;:5;:19;;;13375:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13483:1;13464:21;;:7;:21;;;13456:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13571:6;13541:11;:18;13553:5;13541:18;;;;;;;;;;;;;;;:27;13560:7;13541:27;;;;;;;;;;;;;;;:36;;;;13611:7;13595:32;;13604:5;13595:32;;;13620:6;13595:32;;;;;;:::i;:::-;;;;;;;;13279:358;;;:::o;13948:435::-;14051:24;14078:25;14088:5;14095:7;14078:9;:25::i;:::-;14051:52;;14140:17;14120:16;:37;14116:258;;14204:6;14184:16;:26;;14176:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14292:51;14301:5;14308:7;14336:6;14317:16;:25;14292:8;:51::i;:::-;14116:258;14038:345;13948:435;;;:::o;10020:842::-;10135:1;10119:18;;:4;:18;;;10111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10214:1;10200:16;;:2;:16;;;10192:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10273:38;10294:4;10300:2;10304:6;10273:20;:38::i;:::-;10328:19;10350:9;:15;10360:4;10350:15;;;;;;;;;;;;;;;;10328:37;;10401:6;10386:11;:21;;10378:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;10522:6;10508:11;:20;10490:9;:15;10500:4;10490:15;;;;;;;;;;;;;;;:38;;;;10731:6;10714:9;:13;10724:2;10714:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;10787:2;10772:26;;10781:4;10772:26;;;10791:6;10772:26;;;;;;:::i;:::-;;;;;;;;10815:37;10835:4;10841:2;10845:6;10815:19;:37::i;:::-;10098:764;10020:842;;;:::o;57498:280::-;57551:7;57594:11;57577:28;;57585:4;57577:28;;;:63;;;;;57626:14;57609:13;:31;57577:63;57573:196;;;57666:22;57659:29;;;;57573:196;57732:23;:21;:23::i;:::-;57725:30;;57498:280;;:::o;17444:136::-;17521:12;:10;:12::i;:::-;17510:23;;:7;:5;:7::i;:::-;:23;;;17502:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17444:136::o;63836:165::-;63900:4;63984:6;63970:10;:8;:10::i;:::-;63964:2;:16;;;;:::i;:::-;63947:13;:11;:13::i;:::-;:34;;;;:::i;:::-;:43;;;;:::i;:::-;63927:16;;:63;;63919:72;;63836:165;;;:::o;11171:574::-;11276:1;11257:21;;:7;:21;;;11249:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11331:49;11360:1;11364:7;11373:6;11331:20;:49::i;:::-;11413:6;11397:12;;:22;;;;;;;:::i;:::-;;;;;;;;11596:6;11574:9;:18;11584:7;11574:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;11654:7;11633:37;;11650:1;11633:37;;;11663:6;11633:37;;;;;;:::i;:::-;;;;;;;;11687:48;11715:1;11719:7;11728:6;11687:19;:48::i;:::-;11171:574;;:::o;12104:707::-;12209:1;12190:21;;:7;:21;;;12182:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;12266:49;12287:7;12304:1;12308:6;12266:20;:49::i;:::-;12332:22;12357:9;:18;12367:7;12357:18;;;;;;;;;;;;;;;;12332:43;;12414:6;12396:14;:24;;12388:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12537:6;12520:14;:23;12499:9;:18;12509:7;12499:18;;;;;;;;;;;;;;;:44;;;;12658:6;12642:12;;:22;;;;;;;;;;;12725:1;12699:37;;12708:7;12699:37;;;12729:6;12699:37;;;;;;:::i;:::-;;;;;;;;12753:48;12773:7;12790:1;12794:6;12753:19;:48::i;:::-;12169:642;12104:707;;:::o;18595:199::-;18671:16;18690:6;;;;;;;;;;;18671:25;;18718:8;18709:6;;:17;;;;;;;;;;;;;;;;;;18775:8;18744:40;;18765:8;18744:40;;;;;;;;;;;;18658:136;18595:199;:::o;60077:118::-;60142:7;60171;:14;;;60164:21;;60077:118;;;:::o;53806:286::-;53900:13;51633:66;53961:18;;53951:5;53932:47;53928:155;;54005:15;54014:5;54005:8;:15::i;:::-;53998:22;;;;53928:155;54064:5;54057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53806:286;;;;;:::o;63178:215::-;63238:15;63268:30;63301:7;:14;63309:5;63301:14;;;;;;;;;;;;;;;63268:47;;63338:15;:5;:13;:15::i;:::-;63328:25;;63366:17;:5;:15;:17::i;:::-;63255:138;63178:215;;;:::o;58652:171::-;58729:7;58758:55;58780:20;:18;:20::i;:::-;58802:10;58758:21;:55::i;:::-;58751:62;;58652:171;;;:::o;44751:244::-;44836:7;44859:17;44878:18;44900:25;44911:4;44917:1;44920;44923;44900:10;:25::i;:::-;44858:67;;;;44938:18;44950:5;44938:11;:18::i;:::-;44976:9;44969:16;;;;44751:244;;;;;;:::o;15015:91::-;;;;:::o;15742:90::-;;;;:::o;57790:186::-;57845:7;55606:95;57907:11;57920:14;57936:13;57959:4;57884:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57874:92;;;;;;57867:99;;57790:186;:::o;52384:435::-;52443:13;52471:11;52485:16;52496:4;52485:10;:16::i;:::-;52471:30;;52595:17;52626:2;52615:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52595:34;;52726:3;52721;52714:16;52769:4;52762;52757:3;52753:14;52746:28;52806:3;52799:10;;;;52384:435;;;:::o;60207:135::-;60318:1;60300:7;:14;;;:19;;;;;;;;;;;60207:135;:::o;46627:424::-;46720:12;46836:4;46830:11;46869:10;46864:3;46857:23;46919:15;46912:4;46907:3;46903:14;46896:39;46974:10;46967:4;46962:3;46958:14;46951:34;47024:4;47019:3;47009:20;47001:28;;46802:240;46627:424;;;;:::o;43081:1519::-;43169:7;43178:12;44123:66;44118:1;44110:10;;:79;44106:167;;;44224:1;44228:30;44208:51;;;;;;44106:167;44376:14;44393:24;44403:4;44409:1;44412;44415;44393:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44376:41;;44452:1;44434:20;;:6;:20;;;44430:107;;44489:1;44493:29;44473:50;;;;;;;44430:107;44561:6;44569:20;44553:37;;;;;43081:1519;;;;;;;;:::o;38339:541::-;38419:20;38410:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;38406:465;38458:7;38406:465;38521:29;38512:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;38508:363;;38569:34;;;;;;;;;;:::i;:::-;;;;;;;;38508:363;38636:35;38627:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;38623:248;;38690:41;;;;;;;;;;:::i;:::-;;;;;;;;38623:248;38764:30;38755:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;38751:120;;38813:44;;;;;;;;;;:::i;:::-;;;;;;;;38751:120;38339:541;;:::o;52906:263::-;52967:7;52989:14;53042:4;53033;53006:33;;:40;52989:57;;53072:2;53063:6;:11;53059:75;;;53100:20;;;;;;;;;;;;;;53059:75;53153:6;53146:13;;;52906:263;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:77::-;4890:7;4919:5;4908:16;;4853:77;;;:::o;4936:118::-;5023:24;5041:5;5023:24;:::i;:::-;5018:3;5011:37;4936:118;;:::o;5060:222::-;5153:4;5191:2;5180:9;5176:18;5168:26;;5204:71;5272:1;5261:9;5257:17;5248:6;5204:71;:::i;:::-;5060:222;;;;:::o;5288:329::-;5347:6;5396:2;5384:9;5375:7;5371:23;5367:32;5364:119;;;5402:79;;:::i;:::-;5364:119;5522:1;5547:53;5592:7;5583:6;5572:9;5568:22;5547:53;:::i;:::-;5537:63;;5493:117;5288:329;;;;:::o;5623:::-;5682:6;5731:2;5719:9;5710:7;5706:23;5702:32;5699:119;;;5737:79;;:::i;:::-;5699:119;5857:1;5882:53;5927:7;5918:6;5907:9;5903:22;5882:53;:::i;:::-;5872:63;;5828:117;5623:329;;;;:::o;5958:149::-;5994:7;6034:66;6027:5;6023:78;6012:89;;5958:149;;;:::o;6113:115::-;6198:23;6215:5;6198:23;:::i;:::-;6193:3;6186:36;6113:115;;:::o;6234:118::-;6321:24;6339:5;6321:24;:::i;:::-;6316:3;6309:37;6234:118;;:::o;6358:114::-;6425:6;6459:5;6453:12;6443:22;;6358:114;;;:::o;6478:184::-;6577:11;6611:6;6606:3;6599:19;6651:4;6646:3;6642:14;6627:29;;6478:184;;;;:::o;6668:132::-;6735:4;6758:3;6750:11;;6788:4;6783:3;6779:14;6771:22;;6668:132;;;:::o;6806:108::-;6883:24;6901:5;6883:24;:::i;:::-;6878:3;6871:37;6806:108;;:::o;6920:179::-;6989:10;7010:46;7052:3;7044:6;7010:46;:::i;:::-;7088:4;7083:3;7079:14;7065:28;;6920:179;;;;:::o;7105:113::-;7175:4;7207;7202:3;7198:14;7190:22;;7105:113;;;:::o;7254:732::-;7373:3;7402:54;7450:5;7402:54;:::i;:::-;7472:86;7551:6;7546:3;7472:86;:::i;:::-;7465:93;;7582:56;7632:5;7582:56;:::i;:::-;7661:7;7692:1;7677:284;7702:6;7699:1;7696:13;7677:284;;;7778:6;7772:13;7805:63;7864:3;7849:13;7805:63;:::i;:::-;7798:70;;7891:60;7944:6;7891:60;:::i;:::-;7881:70;;7737:224;7724:1;7721;7717:9;7712:14;;7677:284;;;7681:14;7977:3;7970:10;;7378:608;;;7254:732;;;;:::o;7992:1215::-;8341:4;8379:3;8368:9;8364:19;8356:27;;8393:69;8459:1;8448:9;8444:17;8435:6;8393:69;:::i;:::-;8509:9;8503:4;8499:20;8494:2;8483:9;8479:18;8472:48;8537:78;8610:4;8601:6;8537:78;:::i;:::-;8529:86;;8662:9;8656:4;8652:20;8647:2;8636:9;8632:18;8625:48;8690:78;8763:4;8754:6;8690:78;:::i;:::-;8682:86;;8778:72;8846:2;8835:9;8831:18;8822:6;8778:72;:::i;:::-;8860:73;8928:3;8917:9;8913:19;8904:6;8860:73;:::i;:::-;8943;9011:3;9000:9;8996:19;8987:6;8943:73;:::i;:::-;9064:9;9058:4;9054:20;9048:3;9037:9;9033:19;9026:49;9092:108;9195:4;9186:6;9092:108;:::i;:::-;9084:116;;7992:1215;;;;;;;;;;:::o;9213:222::-;9306:4;9344:2;9333:9;9329:18;9321:26;;9357:71;9425:1;9414:9;9410:17;9401:6;9357:71;:::i;:::-;9213:222;;;;:::o;9441:118::-;9512:22;9528:5;9512:22;:::i;:::-;9505:5;9502:33;9492:61;;9549:1;9546;9539:12;9492:61;9441:118;:::o;9565:135::-;9609:5;9647:6;9634:20;9625:29;;9663:31;9688:5;9663:31;:::i;:::-;9565:135;;;;:::o;9706:122::-;9779:24;9797:5;9779:24;:::i;:::-;9772:5;9769:35;9759:63;;9818:1;9815;9808:12;9759:63;9706:122;:::o;9834:139::-;9880:5;9918:6;9905:20;9896:29;;9934:33;9961:5;9934:33;:::i;:::-;9834:139;;;;:::o;9979:1199::-;10090:6;10098;10106;10114;10122;10130;10138;10187:3;10175:9;10166:7;10162:23;10158:33;10155:120;;;10194:79;;:::i;:::-;10155:120;10314:1;10339:53;10384:7;10375:6;10364:9;10360:22;10339:53;:::i;:::-;10329:63;;10285:117;10441:2;10467:53;10512:7;10503:6;10492:9;10488:22;10467:53;:::i;:::-;10457:63;;10412:118;10569:2;10595:53;10640:7;10631:6;10620:9;10616:22;10595:53;:::i;:::-;10585:63;;10540:118;10697:2;10723:53;10768:7;10759:6;10748:9;10744:22;10723:53;:::i;:::-;10713:63;;10668:118;10825:3;10852:51;10895:7;10886:6;10875:9;10871:22;10852:51;:::i;:::-;10842:61;;10796:117;10952:3;10979:53;11024:7;11015:6;11004:9;11000:22;10979:53;:::i;:::-;10969:63;;10923:119;11081:3;11108:53;11153:7;11144:6;11133:9;11129:22;11108:53;:::i;:::-;11098:63;;11052:119;9979:1199;;;;;;;;;;:::o;11184:474::-;11252:6;11260;11309:2;11297:9;11288:7;11284:23;11280:32;11277:119;;;11315:79;;:::i;:::-;11277:119;11435:1;11460:53;11505:7;11496:6;11485:9;11481:22;11460:53;:::i;:::-;11450:63;;11406:117;11562:2;11588:53;11633:7;11624:6;11613:9;11609:22;11588:53;:::i;:::-;11578:63;;11533:118;11184:474;;;;;:::o;11664:180::-;11712:77;11709:1;11702:88;11809:4;11806:1;11799:15;11833:4;11830:1;11823:15;11850:320;11894:6;11931:1;11925:4;11921:12;11911:22;;11978:1;11972:4;11968:12;11999:18;11989:81;;12055:4;12047:6;12043:17;12033:27;;11989:81;12117:2;12109:6;12106:14;12086:18;12083:38;12080:84;;12136:18;;:::i;:::-;12080:84;11901:269;11850:320;;;:::o;12176:180::-;12224:77;12221:1;12214:88;12321:4;12318:1;12311:15;12345:4;12342:1;12335:15;12362:191;12402:3;12421:20;12439:1;12421:20;:::i;:::-;12416:25;;12455:20;12473:1;12455:20;:::i;:::-;12450:25;;12498:1;12495;12491:9;12484:16;;12519:3;12516:1;12513:10;12510:36;;;12526:18;;:::i;:::-;12510:36;12362:191;;;;:::o;12559:102::-;12601:8;12648:5;12645:1;12641:13;12620:34;;12559:102;;;:::o;12667:848::-;12728:5;12735:4;12759:6;12750:15;;12783:5;12774:14;;12797:712;12818:1;12808:8;12805:15;12797:712;;;12913:4;12908:3;12904:14;12898:4;12895:24;12892:50;;;12922:18;;:::i;:::-;12892:50;12972:1;12962:8;12958:16;12955:451;;;13387:4;13380:5;13376:16;13367:25;;12955:451;13437:4;13431;13427:15;13419:23;;13467:32;13490:8;13467:32;:::i;:::-;13455:44;;12797:712;;;12667:848;;;;;;;:::o;13521:1073::-;13575:5;13766:8;13756:40;;13787:1;13778:10;;13789:5;;13756:40;13815:4;13805:36;;13832:1;13823:10;;13834:5;;13805:36;13901:4;13949:1;13944:27;;;;13985:1;13980:191;;;;13894:277;;13944:27;13962:1;13953:10;;13964:5;;;13980:191;14025:3;14015:8;14012:17;14009:43;;;14032:18;;:::i;:::-;14009:43;14081:8;14078:1;14074:16;14065:25;;14116:3;14109:5;14106:14;14103:40;;;14123:18;;:::i;:::-;14103:40;14156:5;;;13894:277;;14280:2;14270:8;14267:16;14261:3;14255:4;14252:13;14248:36;14230:2;14220:8;14217:16;14212:2;14206:4;14203:12;14199:35;14183:111;14180:246;;;14336:8;14330:4;14326:19;14317:28;;14371:3;14364:5;14361:14;14358:40;;;14378:18;;:::i;:::-;14358:40;14411:5;;14180:246;14451:42;14489:3;14479:8;14473:4;14470:1;14451:42;:::i;:::-;14436:57;;;;14525:4;14520:3;14516:14;14509:5;14506:25;14503:51;;;14534:18;;:::i;:::-;14503:51;14583:4;14576:5;14572:16;14563:25;;13521:1073;;;;;;:::o;14600:281::-;14658:5;14682:23;14700:4;14682:23;:::i;:::-;14674:31;;14726:25;14742:8;14726:25;:::i;:::-;14714:37;;14770:104;14807:66;14797:8;14791:4;14770:104;:::i;:::-;14761:113;;14600:281;;;;:::o;14887:410::-;14927:7;14950:20;14968:1;14950:20;:::i;:::-;14945:25;;14984:20;15002:1;14984:20;:::i;:::-;14979:25;;15039:1;15036;15032:9;15061:30;15079:11;15061:30;:::i;:::-;15050:41;;15240:1;15231:7;15227:15;15224:1;15221:22;15201:1;15194:9;15174:83;15151:139;;15270:18;;:::i;:::-;15151:139;14935:362;14887:410;;;;:::o;15303:180::-;15351:77;15348:1;15341:88;15448:4;15445:1;15438:15;15472:4;15469:1;15462:15;15489:224;15629:34;15625:1;15617:6;15613:14;15606:58;15698:7;15693:2;15685:6;15681:15;15674:32;15489:224;:::o;15719:366::-;15861:3;15882:67;15946:2;15941:3;15882:67;:::i;:::-;15875:74;;15958:93;16047:3;15958:93;:::i;:::-;16076:2;16071:3;16067:12;16060:19;;15719:366;;;:::o;16091:419::-;16257:4;16295:2;16284:9;16280:18;16272:26;;16344:9;16338:4;16334:20;16330:1;16319:9;16315:17;16308:47;16372:131;16498:4;16372:131;:::i;:::-;16364:139;;16091:419;;;:::o;16516:179::-;16656:31;16652:1;16644:6;16640:14;16633:55;16516:179;:::o;16701:366::-;16843:3;16864:67;16928:2;16923:3;16864:67;:::i;:::-;16857:74;;16940:93;17029:3;16940:93;:::i;:::-;17058:2;17053:3;17049:12;17042:19;;16701:366;;;:::o;17073:419::-;17239:4;17277:2;17266:9;17262:18;17254:26;;17326:9;17320:4;17316:20;17312:1;17301:9;17297:17;17290:47;17354:131;17480:4;17354:131;:::i;:::-;17346:139;;17073:419;;;:::o;17498:775::-;17731:4;17769:3;17758:9;17754:19;17746:27;;17783:71;17851:1;17840:9;17836:17;17827:6;17783:71;:::i;:::-;17864:72;17932:2;17921:9;17917:18;17908:6;17864:72;:::i;:::-;17946;18014:2;18003:9;17999:18;17990:6;17946:72;:::i;:::-;18028;18096:2;18085:9;18081:18;18072:6;18028:72;:::i;:::-;18110:73;18178:3;18167:9;18163:19;18154:6;18110:73;:::i;:::-;18193;18261:3;18250:9;18246:19;18237:6;18193:73;:::i;:::-;17498:775;;;;;;;;;:::o;18279:180::-;18419:32;18415:1;18407:6;18403:14;18396:56;18279:180;:::o;18465:366::-;18607:3;18628:67;18692:2;18687:3;18628:67;:::i;:::-;18621:74;;18704:93;18793:3;18704:93;:::i;:::-;18822:2;18817:3;18813:12;18806:19;;18465:366;;;:::o;18837:419::-;19003:4;19041:2;19030:9;19026:18;19018:26;;19090:9;19084:4;19080:20;19076:1;19065:9;19061:17;19054:47;19118:131;19244:4;19118:131;:::i;:::-;19110:139;;18837:419;;;:::o;19262:225::-;19402:34;19398:1;19390:6;19386:14;19379:58;19471:8;19466:2;19458:6;19454:15;19447:33;19262:225;:::o;19493:366::-;19635:3;19656:67;19720:2;19715:3;19656:67;:::i;:::-;19649:74;;19732:93;19821:3;19732:93;:::i;:::-;19850:2;19845:3;19841:12;19834:19;;19493:366;;;:::o;19865:419::-;20031:4;20069:2;20058:9;20054:18;20046:26;;20118:9;20112:4;20108:20;20104:1;20093:9;20089:17;20082:47;20146:131;20272:4;20146:131;:::i;:::-;20138:139;;19865:419;;;:::o;20290:223::-;20430:34;20426:1;20418:6;20414:14;20407:58;20499:6;20494:2;20486:6;20482:15;20475:31;20290:223;:::o;20519:366::-;20661:3;20682:67;20746:2;20741:3;20682:67;:::i;:::-;20675:74;;20758:93;20847:3;20758:93;:::i;:::-;20876:2;20871:3;20867:12;20860:19;;20519:366;;;:::o;20891:419::-;21057:4;21095:2;21084:9;21080:18;21072:26;;21144:9;21138:4;21134:20;21130:1;21119:9;21115:17;21108:47;21172:131;21298:4;21172:131;:::i;:::-;21164:139;;20891:419;;;:::o;21316:221::-;21456:34;21452:1;21444:6;21440:14;21433:58;21525:4;21520:2;21512:6;21508:15;21501:29;21316:221;:::o;21543:366::-;21685:3;21706:67;21770:2;21765:3;21706:67;:::i;:::-;21699:74;;21782:93;21871:3;21782:93;:::i;:::-;21900:2;21895:3;21891:12;21884:19;;21543:366;;;:::o;21915:419::-;22081:4;22119:2;22108:9;22104:18;22096:26;;22168:9;22162:4;22158:20;22154:1;22143:9;22139:17;22132:47;22196:131;22322:4;22196:131;:::i;:::-;22188:139;;21915:419;;;:::o;22340:179::-;22480:31;22476:1;22468:6;22464:14;22457:55;22340:179;:::o;22525:366::-;22667:3;22688:67;22752:2;22747:3;22688:67;:::i;:::-;22681:74;;22764:93;22853:3;22764:93;:::i;:::-;22882:2;22877:3;22873:12;22866:19;;22525:366;;;:::o;22897:419::-;23063:4;23101:2;23090:9;23086:18;23078:26;;23150:9;23144:4;23140:20;23136:1;23125:9;23121:17;23114:47;23178:131;23304:4;23178:131;:::i;:::-;23170:139;;22897:419;;;:::o;23322:224::-;23462:34;23458:1;23450:6;23446:14;23439:58;23531:7;23526:2;23518:6;23514:15;23507:32;23322:224;:::o;23552:366::-;23694:3;23715:67;23779:2;23774:3;23715:67;:::i;:::-;23708:74;;23791:93;23880:3;23791:93;:::i;:::-;23909:2;23904:3;23900:12;23893:19;;23552:366;;;:::o;23924:419::-;24090:4;24128:2;24117:9;24113:18;24105:26;;24177:9;24171:4;24167:20;24163:1;24152:9;24148:17;24141:47;24205:131;24331:4;24205:131;:::i;:::-;24197:139;;23924:419;;;:::o;24349:222::-;24489:34;24485:1;24477:6;24473:14;24466:58;24558:5;24553:2;24545:6;24541:15;24534:30;24349:222;:::o;24577:366::-;24719:3;24740:67;24804:2;24799:3;24740:67;:::i;:::-;24733:74;;24816:93;24905:3;24816:93;:::i;:::-;24934:2;24929:3;24925:12;24918:19;;24577:366;;;:::o;24949:419::-;25115:4;25153:2;25142:9;25138:18;25130:26;;25202:9;25196:4;25192:20;25188:1;25177:9;25173:17;25166:47;25230:131;25356:4;25230:131;:::i;:::-;25222:139;;24949:419;;;:::o;25374:225::-;25514:34;25510:1;25502:6;25498:14;25491:58;25583:8;25578:2;25570:6;25566:15;25559:33;25374:225;:::o;25605:366::-;25747:3;25768:67;25832:2;25827:3;25768:67;:::i;:::-;25761:74;;25844:93;25933:3;25844:93;:::i;:::-;25962:2;25957:3;25953:12;25946:19;;25605:366;;;:::o;25977:419::-;26143:4;26181:2;26170:9;26166:18;26158:26;;26230:9;26224:4;26220:20;26216:1;26205:9;26201:17;26194:47;26258:131;26384:4;26258:131;:::i;:::-;26250:139;;25977:419;;;:::o;26402:182::-;26542:34;26538:1;26530:6;26526:14;26519:58;26402:182;:::o;26590:366::-;26732:3;26753:67;26817:2;26812:3;26753:67;:::i;:::-;26746:74;;26829:93;26918:3;26829:93;:::i;:::-;26947:2;26942:3;26938:12;26931:19;;26590:366;;;:::o;26962:419::-;27128:4;27166:2;27155:9;27151:18;27143:26;;27215:9;27209:4;27205:20;27201:1;27190:9;27186:17;27179:47;27243:131;27369:4;27243:131;:::i;:::-;27235:139;;26962:419;;;:::o;27387:180::-;27435:77;27432:1;27425:88;27532:4;27529:1;27522:15;27556:4;27553:1;27546:15;27573:185;27613:1;27630:20;27648:1;27630:20;:::i;:::-;27625:25;;27664:20;27682:1;27664:20;:::i;:::-;27659:25;;27703:1;27693:35;;27708:18;;:::i;:::-;27693:35;27750:1;27747;27743:9;27738:14;;27573:185;;;;:::o;27764:181::-;27904:33;27900:1;27892:6;27888:14;27881:57;27764:181;:::o;27951:366::-;28093:3;28114:67;28178:2;28173:3;28114:67;:::i;:::-;28107:74;;28190:93;28279:3;28190:93;:::i;:::-;28308:2;28303:3;28299:12;28292:19;;27951:366;;;:::o;28323:419::-;28489:4;28527:2;28516:9;28512:18;28504:26;;28576:9;28570:4;28566:20;28562:1;28551:9;28547:17;28540:47;28604:131;28730:4;28604:131;:::i;:::-;28596:139;;28323:419;;;:::o;28748:220::-;28888:34;28884:1;28876:6;28872:14;28865:58;28957:3;28952:2;28944:6;28940:15;28933:28;28748:220;:::o;28974:366::-;29116:3;29137:67;29201:2;29196:3;29137:67;:::i;:::-;29130:74;;29213:93;29302:3;29213:93;:::i;:::-;29331:2;29326:3;29322:12;29315:19;;28974:366;;;:::o;29346:419::-;29512:4;29550:2;29539:9;29535:18;29527:26;;29599:9;29593:4;29589:20;29585:1;29574:9;29570:17;29563:47;29627:131;29753:4;29627:131;:::i;:::-;29619:139;;29346:419;;;:::o;29771:221::-;29911:34;29907:1;29899:6;29895:14;29888:58;29980:4;29975:2;29967:6;29963:15;29956:29;29771:221;:::o;29998:366::-;30140:3;30161:67;30225:2;30220:3;30161:67;:::i;:::-;30154:74;;30237:93;30326:3;30237:93;:::i;:::-;30355:2;30350:3;30346:12;30339:19;;29998:366;;;:::o;30370:419::-;30536:4;30574:2;30563:9;30559:18;30551:26;;30623:9;30617:4;30613:20;30609:1;30598:9;30594:17;30587:47;30651:131;30777:4;30651:131;:::i;:::-;30643:139;;30370:419;;;:::o;30795:664::-;31000:4;31038:3;31027:9;31023:19;31015:27;;31052:71;31120:1;31109:9;31105:17;31096:6;31052:71;:::i;:::-;31133:72;31201:2;31190:9;31186:18;31177:6;31133:72;:::i;:::-;31215;31283:2;31272:9;31268:18;31259:6;31215:72;:::i;:::-;31297;31365:2;31354:9;31350:18;31341:6;31297:72;:::i;:::-;31379:73;31447:3;31436:9;31432:19;31423:6;31379:73;:::i;:::-;30795:664;;;;;;;;:::o;31465:545::-;31638:4;31676:3;31665:9;31661:19;31653:27;;31690:71;31758:1;31747:9;31743:17;31734:6;31690:71;:::i;:::-;31771:68;31835:2;31824:9;31820:18;31811:6;31771:68;:::i;:::-;31849:72;31917:2;31906:9;31902:18;31893:6;31849:72;:::i;:::-;31931;31999:2;31988:9;31984:18;31975:6;31931:72;:::i;:::-;31465:545;;;;;;;:::o;32016:180::-;32064:77;32061:1;32054:88;32161:4;32158:1;32151:15;32185:4;32182:1;32175:15;32202:174;32342:26;32338:1;32330:6;32326:14;32319:50;32202:174;:::o;32382:366::-;32524:3;32545:67;32609:2;32604:3;32545:67;:::i;:::-;32538:74;;32621:93;32710:3;32621:93;:::i;:::-;32739:2;32734:3;32730:12;32723:19;;32382:366;;;:::o;32754:419::-;32920:4;32958:2;32947:9;32943:18;32935:26;;33007:9;33001:4;32997:20;32993:1;32982:9;32978:17;32971:47;33035:131;33161:4;33035:131;:::i;:::-;33027:139;;32754:419;;;:::o;33179:181::-;33319:33;33315:1;33307:6;33303:14;33296:57;33179:181;:::o;33366:366::-;33508:3;33529:67;33593:2;33588:3;33529:67;:::i;:::-;33522:74;;33605:93;33694:3;33605:93;:::i;:::-;33723:2;33718:3;33714:12;33707:19;;33366:366;;;:::o;33738:419::-;33904:4;33942:2;33931:9;33927:18;33919:26;;33991:9;33985:4;33981:20;33977:1;33966:9;33962:17;33955:47;34019:131;34145:4;34019:131;:::i;:::-;34011:139;;33738:419;;;:::o;34163:221::-;34303:34;34299:1;34291:6;34287:14;34280:58;34372:4;34367:2;34359:6;34355:15;34348:29;34163:221;:::o;34390:366::-;34532:3;34553:67;34617:2;34612:3;34553:67;:::i;:::-;34546:74;;34629:93;34718:3;34629:93;:::i;:::-;34747:2;34742:3;34738:12;34731:19;;34390:366;;;:::o;34762:419::-;34928:4;34966:2;34955:9;34951:18;34943:26;;35015:9;35009:4;35005:20;35001:1;34990:9;34986:17;34979:47;35043:131;35169:4;35043:131;:::i;:::-;35035:139;;34762:419;;;:::o

Swarm Source

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

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