ETH Price: $2,411.18 (-3.90%)

Token

TheLandSafe Avatars (LSA)
 

Overview

Max Total Supply

209 LSA

Holders

100

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
15 LSA
0x828717695CeFe11cf059e6D0F78874FbC01ddF6d
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:
TheLandSafeAvatars

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-17
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
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;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

// File: contracts/TheLandSafeAvatars.sol


pragma solidity >=0.7.0 <0.9.0;


contract TheLandSafeAvatars is ERC721, Ownable, ReentrancyGuard {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "ipfs://QmS2vbLzWSzV3tycv6yUBnKsb96bc7FMFKRYD1fFnNUvYw/";
  string public uriSuffix = ".json";
  string public preRevealMetadataUri;
  
  
  uint256 public maxSupply = 8888;
  uint256 public maxMintAmountPerTx = 2;
  uint256 public whitelistAddressLimit = 1;
  uint256 public whitelistAddressLimit2 = 2;
  uint256 public publicAddressLimit = 2;
  uint256 public maxAmount = 2;
  
  bytes32 public merkleRoot = 0x866f82d68af2fe178a8ed75f5ba9a9e5d17c2589671f15d7dc46eaec85f037d8;
  bytes32 public merkleRoot2 = 0x2b988f0490e67022c789b6801645e50ba78d8d6c102961c787cd99082c154968;


  bool public paused = false;
  bool public revealed = true;
  bool public publicMint = false;

  mapping(address => uint256) public whitelistMintedBalance;
  mapping(address => uint8) public whitelistMintedBalance2;
  mapping(address => uint256) public publicMintedBalance;

 
  constructor() ERC721("TheLandSafe Avatars", "LSA") {
    setpreRevealMetadataUri("ipfs://CID/hidden.json");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    _;
  }


  function WhitelistMint1(bytes32[] calldata _merkleProof, uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(publicMint == false, "The public mint is live.");
    uint256 whitelistMintedAmount = whitelistMintedBalance[msg.sender];
    require(whitelistMintedAmount + _mintAmount <= whitelistAddressLimit, "max NFT per address exceeded");
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof.");
   
    _whitelistMintLoop(msg.sender, _mintAmount);
  }


  function WhitelistMint2(bytes32[] calldata _merkleProof2, uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(publicMint == false, "The public mint is live.");
    uint256 whitelistMintedAmount2 = whitelistMintedBalance2[msg.sender];
    require(whitelistMintedAmount2 + _mintAmount <= whitelistAddressLimit2, "max NFT per address exceeded");
    require (balanceOf(msg.sender) < whitelistAddressLimit2, "You have already minted");
    bytes32 leaf2 = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof2, merkleRoot2, leaf2), "Invalid proof.");
   
    _whitelistMintLoop2(msg.sender, _mintAmount);
  }

  function PublicMint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(publicMint == true, "The whitelist mint is live.");
    require(!paused, "The contract is paused!");
    uint256 publicMintedAmount = publicMintedBalance[msg.sender];
    require(publicMintedAmount + _mintAmount <= publicAddressLimit, "max NFT per address exceeded");

    _publicMintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _publicMintLoop(_receiver, _mintAmount);
  }

    function _publicMintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      publicMintedBalance[msg.sender]++;
      supply.increment();
      
      _safeMint(_receiver, supply.current());
    }
  }

  function _whitelistMintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
       whitelistMintedBalance[msg.sender]++;
      supply.increment();

      _safeMint(_receiver, supply.current());
    }
  }

  function _whitelistMintLoop2(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
       whitelistMintedBalance[msg.sender]++;
      supply.increment();

      _safeMint(_receiver, supply.current());
    }
  }
  


  function setmerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function setmerkleRoot2(bytes32 _merkleRoot2) public onlyOwner {
    merkleRoot2 = _merkleRoot2;
  }
  
  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }
 
  function setPublicMintBool(bool _state) public onlyOwner {
    publicMint = _state;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setPublicAddressLimit(uint256 _limit) public onlyOwner {
    publicAddressLimit = _limit;
  }

   function setWhitelistAddressLimit(uint256 _limit) public onlyOwner {
    whitelistAddressLimit = _limit;
  }

   function setWhitelistAddressLimit2(uint256 _limit) public onlyOwner {
    whitelistAddressLimit2 = _limit;
  }
  
  function setMaxSupply(uint256 _newSupply) public onlyOwner {
    maxSupply = _newSupply;
  }

  function setpreRevealMetadataUri(string memory _preRevealMetadataUri) public onlyOwner {
    preRevealMetadataUri = _preRevealMetadataUri;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }
 

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return preRevealMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : "";
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }

  function withdraw() public onlyOwner nonReentrant {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

  
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"WhitelistMint1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof2","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"WhitelistMint2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPublicAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicMintBool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWhitelistAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWhitelistAddressLimit2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setmerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot2","type":"bytes32"}],"name":"setmerkleRoot2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_preRevealMetadataUri","type":"string"}],"name":"setpreRevealMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistAddressLimit2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintedBalance2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806060016040528060368152602001620059ee60369139600990805190602001906200003592919062000407565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200008392919062000407565b506122b8600c556002600d556001600e556002600f55600260105560026011557f866f82d68af2fe178a8ed75f5ba9a9e5d17c2589671f15d7dc46eaec85f037d860001b6012557f2b988f0490e67022c789b6801645e50ba78d8d6c102961c787cd99082c15496860001b6013556000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff0219169083151502179055506000601460026101000a81548160ff0219169083151502179055503480156200014f57600080fd5b506040518060400160405280601381526020017f5468654c616e64536166652041766174617273000000000000000000000000008152506040518060400160405280600381526020017f4c534100000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001d492919062000407565b508060019080519060200190620001ed92919062000407565b50505062000210620002046200026460201b60201c565b6200026c60201b60201c565b60016007819055506200025e6040518060400160405280601681526020017f697066733a2f2f4349442f68696464656e2e6a736f6e000000000000000000008152506200033260201b60201c565b6200059f565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003426200026460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000368620003dd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b890620004de565b60405180910390fd5b80600b9080519060200190620003d992919062000407565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004159062000511565b90600052602060002090601f01602090048101928262000439576000855562000485565b82601f106200045457805160ff191683800117855562000485565b8280016001018555821562000485579182015b828111156200048457825182559160200191906001019062000467565b5b50905062000494919062000498565b5090565b5b80821115620004b357600081600090555060010162000499565b5090565b6000620004c660208362000500565b9150620004d38262000576565b602082019050919050565b60006020820190508181036000830152620004f981620004b7565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200052a57607f821691505b6020821081141562000541576200054062000547565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61543f80620005af6000396000f3fe60806040526004361061031a5760003560e01c80636f8b44b0116101ab578063b592d044116100f7578063e0a8085311610095578063eed4b39e1161006f578063eed4b39e14610b97578063efbd73f414610bc0578063f14a5b8f14610be9578063f2fde38b14610c145761031a565b8063e0a8085314610b08578063e858ad0314610b31578063e985e9c514610b5a5761031a565b8063ca34adf0116100d1578063ca34adf014610a4c578063d0a75b6c14610a77578063d5abeb0114610ab4578063d89c26e314610adf5761031a565b8063b592d044146109a9578063b88d4fde146109e6578063c87b56dd14610a0f5761031a565b8063868d61831161016457806395d89b411161013e57806395d89b41146109105780639fb17e341461093b578063a22cb46514610957578063b071401b146109805761031a565b8063868d61831461087d5780638da5cb5b146108ba57806394354fd0146108e55761031a565b80636f8b44b0146107855780636fa7ba10146107ae57806370a08231146107d7578063715018a61461081457806374bd8afb1461082b5780637ec4a659146108545761031a565b80632eb4a7ab1161026a5780635503a0e81161022357806362156af3116101fd57806362156af3146106c957806362b99ad4146106f45780636352211e1461071f57806365b406f91461075c5761031a565b80635503a0e8146106485780635c975abb146106735780635f48f3931461069e5761031a565b80632eb4a7ab146105595780633ccfd60b1461058457806342842e0e1461059b578063438b6300146105c45780634fcbae0414610601578063518302271461061d5761031a565b806316c38b3c116102d757806323b872dd116102b157806323b872dd146104af578063249b35d9146104d857806326092b83146105035780632b7544401461052e5761031a565b806316c38b3c1461043257806318160ddd1461045b5780631f543be3146104865761031a565b806301ffc9a71461031f578063021ba03c1461035c57806306fdde0314610378578063081812fc146103a3578063095ea7b3146103e057806316ba10e014610409575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190613e24565b610c3d565b6040516103539190614592565b60405180910390f35b61037660048036038101906103719190613d6a565b610d1f565b005b34801561038457600080fd5b5061038d610f7d565b60405161039a91906145c8565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613ec7565b61100f565b6040516103d79190614509565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190613d2a565b611094565b005b34801561041557600080fd5b50610430600480360381019061042b9190613e7e565b6111ac565b005b34801561043e57600080fd5b5061045960048036038101906104549190613dca565b611242565b005b34801561046757600080fd5b506104706112db565b60405161047d91906148ea565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613e7e565b6112ec565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190613c14565b611382565b005b3480156104e457600080fd5b506104ed6113e2565b6040516104fa91906148ea565b60405180910390f35b34801561050f57600080fd5b506105186113e8565b6040516105259190614592565b60405180910390f35b34801561053a57600080fd5b506105436113fb565b60405161055091906145c8565b60405180910390f35b34801561056557600080fd5b5061056e611489565b60405161057b91906145ad565b60405180910390f35b34801561059057600080fd5b5061059961148f565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190613c14565b6115e1565b005b3480156105d057600080fd5b506105eb60048036038101906105e69190613ba7565b611601565b6040516105f89190614570565b60405180910390f35b61061b60048036038101906106169190613d6a565b61170c565b005b34801561062957600080fd5b506106326119c6565b60405161063f9190614592565b60405180910390f35b34801561065457600080fd5b5061065d6119d9565b60405161066a91906145c8565b60405180910390f35b34801561067f57600080fd5b50610688611a67565b6040516106959190614592565b60405180910390f35b3480156106aa57600080fd5b506106b3611a7a565b6040516106c091906148ea565b60405180910390f35b3480156106d557600080fd5b506106de611a80565b6040516106eb91906148ea565b60405180910390f35b34801561070057600080fd5b50610709611a86565b60405161071691906145c8565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613ec7565b611b14565b6040516107539190614509565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190613ec7565b611bc6565b005b34801561079157600080fd5b506107ac60048036038101906107a79190613ec7565b611c4c565b005b3480156107ba57600080fd5b506107d560048036038101906107d09190613dca565b611cd2565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613ba7565b611d6b565b60405161080b91906148ea565b60405180910390f35b34801561082057600080fd5b50610829611e23565b005b34801561083757600080fd5b50610852600480360381019061084d9190613ec7565b611eab565b005b34801561086057600080fd5b5061087b60048036038101906108769190613e7e565b611f31565b005b34801561088957600080fd5b506108a4600480360381019061089f9190613ba7565b611fc7565b6040516108b191906148ea565b60405180910390f35b3480156108c657600080fd5b506108cf611fdf565b6040516108dc9190614509565b60405180910390f35b3480156108f157600080fd5b506108fa612009565b60405161090791906148ea565b60405180910390f35b34801561091c57600080fd5b5061092561200f565b60405161093291906145c8565b60405180910390f35b61095560048036038101906109509190613ec7565b6120a1565b005b34801561096357600080fd5b5061097e60048036038101906109799190613cea565b612244565b005b34801561098c57600080fd5b506109a760048036038101906109a29190613ec7565b61225a565b005b3480156109b557600080fd5b506109d060048036038101906109cb9190613ba7565b6122e0565b6040516109dd91906148ea565b60405180910390f35b3480156109f257600080fd5b50610a0d6004803603810190610a089190613c67565b6122f8565b005b348015610a1b57600080fd5b50610a366004803603810190610a319190613ec7565b61235a565b604051610a4391906145c8565b60405180910390f35b348015610a5857600080fd5b50610a616124b3565b604051610a6e91906145ad565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613ba7565b6124b9565b604051610aab9190614905565b60405180910390f35b348015610ac057600080fd5b50610ac96124d9565b604051610ad691906148ea565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b019190613df7565b6124df565b005b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190613dca565b612565565b005b348015610b3d57600080fd5b50610b586004803603810190610b539190613df7565b6125fe565b005b348015610b6657600080fd5b50610b816004803603810190610b7c9190613bd4565b612684565b604051610b8e9190614592565b60405180910390f35b348015610ba357600080fd5b50610bbe6004803603810190610bb99190613ec7565b612718565b005b348015610bcc57600080fd5b50610be76004803603810190610be29190613ef4565b61279e565b005b348015610bf557600080fd5b50610bfe612883565b604051610c0b91906148ea565b60405180910390f35b348015610c2057600080fd5b50610c3b6004803603810190610c369190613ba7565b612889565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d0857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d185750610d1782612981565b5b9050919050565b80600c5481610d2e60086129eb565b610d389190614a43565b1115610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d709061486a565b60405180910390fd5b601460009054906101000a900460ff1615610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906147ea565b60405180910390fd5b60001515601460029054906101000a900460ff16151514610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e169061478a565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e548382610e729190614a43565b1115610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa9061468a565b60405180910390fd5b600033604051602001610ec691906144a8565b604051602081830303815290604052805190602001209050610f2c868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836129f9565b610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f62906148aa565b60405180910390fd5b610f753385612a10565b505050505050565b606060008054610f8c90614bcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb890614bcb565b80156110055780601f10610fda57610100808354040283529160200191611005565b820191906000526020600020905b815481529060010190602001808311610fe857829003601f168201915b5050505050905090565b600061101a82612aa5565b611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906147aa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061109f82611b14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111079061484a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661112f612b11565b73ffffffffffffffffffffffffffffffffffffffff16148061115e575061115d81611158612b11565b612684565b5b61119d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111949061470a565b60405180910390fd5b6111a78383612b19565b505050565b6111b4612b11565b73ffffffffffffffffffffffffffffffffffffffff166111d2611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f906147ca565b60405180910390fd5b80600a908051906020019061123e929190613950565b5050565b61124a612b11565b73ffffffffffffffffffffffffffffffffffffffff16611268611fdf565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b5906147ca565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b60006112e760086129eb565b905090565b6112f4612b11565b73ffffffffffffffffffffffffffffffffffffffff16611312611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f906147ca565b60405180910390fd5b80600b908051906020019061137e929190613950565b5050565b61139361138d612b11565b82612bd2565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c99061488a565b60405180910390fd5b6113dd838383612cb0565b505050565b600e5481565b601460029054906101000a900460ff1681565b600b805461140890614bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461143490614bcb565b80156114815780601f1061145657610100808354040283529160200191611481565b820191906000526020600020905b81548152906001019060200180831161146457829003601f168201915b505050505081565b60125481565b611497612b11565b73ffffffffffffffffffffffffffffffffffffffff166114b5611fdf565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611502906147ca565b60405180910390fd5b60026007541415611551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611548906148ca565b60405180910390fd5b60026007819055506000611563611fdf565b73ffffffffffffffffffffffffffffffffffffffff1647604051611586906144f4565b60006040518083038185875af1925050503d80600081146115c3576040519150601f19603f3d011682016040523d82523d6000602084013e6115c8565b606091505b50509050806115d657600080fd5b506001600781905550565b6115fc838383604051806020016040528060008152506122f8565b505050565b6060600061160e83611d6b565b905060008167ffffffffffffffff81111561162c5761162b614d88565b5b60405190808252806020026020018201604052801561165a5781602001602082028036833780820191505090505b50905060006001905060005b83811080156116775750600c548211155b1561170057600061168783611b14565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ec57828483815181106116d1576116d0614d59565b5b60200260200101818152505081806116e890614c2e565b9250505b82806116f790614c2e565b93505050611666565b82945050505050919050565b80600c548161171b60086129eb565b6117259190614a43565b1115611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d9061486a565b60405180910390fd5b601460009054906101000a900460ff16156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad906147ea565b60405180910390fd5b60001515601460029054906101000a900460ff1615151461180c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118039061478a565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff169050600f54838261186f9190614a43565b11156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a79061468a565b60405180910390fd5b600f546118bc33611d6b565b106118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f39061466a565b60405180910390fd5b60003360405160200161190f91906144a8565b604051602081830303815290604052805190602001209050611975868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601354836129f9565b6119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab906148aa565b60405180910390fd5b6119be3385612f0c565b505050505050565b601460019054906101000a900460ff1681565b600a80546119e690614bcb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1290614bcb565b8015611a5f5780601f10611a3457610100808354040283529160200191611a5f565b820191906000526020600020905b815481529060010190602001808311611a4257829003601f168201915b505050505081565b601460009054906101000a900460ff1681565b60115481565b600f5481565b60098054611a9390614bcb565b80601f0160208091040260200160405190810160405280929190818152602001828054611abf90614bcb565b8015611b0c5780601f10611ae157610100808354040283529160200191611b0c565b820191906000526020600020905b815481529060010190602001808311611aef57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb49061474a565b60405180910390fd5b80915050919050565b611bce612b11565b73ffffffffffffffffffffffffffffffffffffffff16611bec611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c39906147ca565b60405180910390fd5b80600f8190555050565b611c54612b11565b73ffffffffffffffffffffffffffffffffffffffff16611c72611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf906147ca565b60405180910390fd5b80600c8190555050565b611cda612b11565b73ffffffffffffffffffffffffffffffffffffffff16611cf8611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d45906147ca565b60405180910390fd5b80601460026101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd39061472a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e2b612b11565b73ffffffffffffffffffffffffffffffffffffffff16611e49611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e96906147ca565b60405180910390fd5b611ea96000612fa1565b565b611eb3612b11565b73ffffffffffffffffffffffffffffffffffffffff16611ed1611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906147ca565b60405180910390fd5b8060108190555050565b611f39612b11565b73ffffffffffffffffffffffffffffffffffffffff16611f57611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa4906147ca565b60405180910390fd5b8060099080519060200190611fc3929190613950565b5050565b60156020528060005260406000206000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b60606001805461201e90614bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461204a90614bcb565b80156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b5050505050905090565b80600c54816120b060086129eb565b6120ba9190614a43565b11156120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f29061486a565b60405180910390fd5b60011515601460029054906101000a900460ff16151514612151576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612148906145ea565b60405180910390fd5b601460009054906101000a900460ff16156121a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612198906147ea565b60405180910390fd5b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060105483826121f49190614a43565b1115612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c9061468a565b60405180910390fd5b61223f3384613067565b505050565b61225661224f612b11565b83836130fc565b5050565b612262612b11565b73ffffffffffffffffffffffffffffffffffffffff16612280611fdf565b73ffffffffffffffffffffffffffffffffffffffff16146122d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cd906147ca565b60405180910390fd5b80600d8190555050565b60176020528060005260406000206000915090505481565b612309612303612b11565b83612bd2565b612348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233f9061488a565b60405180910390fd5b61235484848484613269565b50505050565b606061236582612aa5565b6123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b9061482a565b60405180910390fd5b60001515601460019054906101000a900460ff161515141561245257600b80546123cd90614bcb565b80601f01602080910402602001604051908101604052809291908181526020018280546123f990614bcb565b80156124465780601f1061241b57610100808354040283529160200191612446565b820191906000526020600020905b81548152906001019060200180831161242957829003601f168201915b505050505090506124ae565b600061245c6132c5565b9050600081511161247c57604051806020016040528060008152506124aa565b8061248684613357565b600a60405160200161249a939291906144c3565b6040516020818303038152906040525b9150505b919050565b60135481565b60166020528060005260406000206000915054906101000a900460ff1681565b600c5481565b6124e7612b11565b73ffffffffffffffffffffffffffffffffffffffff16612505611fdf565b73ffffffffffffffffffffffffffffffffffffffff161461255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906147ca565b60405180910390fd5b8060138190555050565b61256d612b11565b73ffffffffffffffffffffffffffffffffffffffff1661258b611fdf565b73ffffffffffffffffffffffffffffffffffffffff16146125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d8906147ca565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b612606612b11565b73ffffffffffffffffffffffffffffffffffffffff16612624611fdf565b73ffffffffffffffffffffffffffffffffffffffff161461267a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612671906147ca565b60405180910390fd5b8060128190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612720612b11565b73ffffffffffffffffffffffffffffffffffffffff1661273e611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b906147ca565b60405180910390fd5b80600e8190555050565b81600c54816127ad60086129eb565b6127b79190614a43565b11156127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef9061486a565b60405180910390fd5b612800612b11565b73ffffffffffffffffffffffffffffffffffffffff1661281e611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b906147ca565b60405180910390fd5b61287e8284613067565b505050565b60105481565b612891612b11565b73ffffffffffffffffffffffffffffffffffffffff166128af611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614612905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fc906147ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296c9061462a565b60405180910390fd5b61297e81612fa1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b600082612a0685846134b8565b1490509392505050565b60005b81811015612aa057601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612a6b90614c2e565b9190505550612a7a600861352d565b612a8d83612a8860086129eb565b613543565b8080612a9890614c2e565b915050612a13565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b8c83611b14565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bdd82612aa5565b612c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c13906146ea565b60405180910390fd5b6000612c2783611b14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c9657508373ffffffffffffffffffffffffffffffffffffffff16612c7e8461100f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ca75750612ca68185612684565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cd082611b14565b73ffffffffffffffffffffffffffffffffffffffff1614612d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d9061480a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8d906146aa565b60405180910390fd5b612da1838383613561565b612dac600082612b19565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dfc9190614aca565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e539190614a43565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60005b81811015612f9c57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612f6790614c2e565b9190505550612f76600861352d565b612f8983612f8460086129eb565b613543565b8080612f9490614c2e565b915050612f0f565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156130f757601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906130c290614c2e565b91905055506130d1600861352d565b6130e4836130df60086129eb565b613543565b80806130ef90614c2e565b91505061306a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613162906146ca565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161325c9190614592565b60405180910390a3505050565b613274848484612cb0565b61328084848484613566565b6132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b69061460a565b60405180910390fd5b50505050565b6060600980546132d490614bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461330090614bcb565b801561334d5780601f106133225761010080835404028352916020019161334d565b820191906000526020600020905b81548152906001019060200180831161333057829003601f168201915b5050505050905090565b6060600082141561339f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134b3565b600082905060005b600082146133d15780806133ba90614c2e565b915050600a826133ca9190614a99565b91506133a7565b60008167ffffffffffffffff8111156133ed576133ec614d88565b5b6040519080825280601f01601f19166020018201604052801561341f5781602001600182028036833780820191505090505b5090505b600085146134ac576001826134389190614aca565b9150600a856134479190614c9b565b60306134539190614a43565b60f81b81838151811061346957613468614d59565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134a59190614a99565b9450613423565b8093505050505b919050565b60008082905060005b84518110156135225760008582815181106134df576134de614d59565b5b60200260200101519050808311613501576134fa83826136fd565b925061350e565b61350b81846136fd565b92505b50808061351a90614c2e565b9150506134c1565b508091505092915050565b6001816000016000828254019250508190555050565b61355d828260405180602001604052806000815250613714565b5050565b505050565b60006135878473ffffffffffffffffffffffffffffffffffffffff1661376f565b156136f0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135b0612b11565b8786866040518563ffffffff1660e01b81526004016135d29493929190614524565b602060405180830381600087803b1580156135ec57600080fd5b505af192505050801561361d57506040513d601f19601f8201168201806040525081019061361a9190613e51565b60015b6136a0573d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b50600081511415613698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368f9061460a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136f5565b600190505b949350505050565b600082600052816020526040600020905092915050565b61371e8383613782565b61372b6000848484613566565b61376a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137619061460a565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e99061476a565b60405180910390fd5b6137fb81612aa5565b1561383b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138329061464a565b60405180910390fd5b61384760008383613561565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138979190614a43565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461395c90614bcb565b90600052602060002090601f01602090048101928261397e57600085556139c5565b82601f1061399757805160ff19168380011785556139c5565b828001600101855582156139c5579182015b828111156139c45782518255916020019190600101906139a9565b5b5090506139d291906139d6565b5090565b5b808211156139ef5760008160009055506001016139d7565b5090565b6000613a06613a0184614945565b614920565b905082815260208101848484011115613a2257613a21614dc6565b5b613a2d848285614b89565b509392505050565b6000613a48613a4384614976565b614920565b905082815260208101848484011115613a6457613a63614dc6565b5b613a6f848285614b89565b509392505050565b600081359050613a8681615396565b92915050565b60008083601f840112613aa257613aa1614dbc565b5b8235905067ffffffffffffffff811115613abf57613abe614db7565b5b602083019150836020820283011115613adb57613ada614dc1565b5b9250929050565b600081359050613af1816153ad565b92915050565b600081359050613b06816153c4565b92915050565b600081359050613b1b816153db565b92915050565b600081519050613b30816153db565b92915050565b600082601f830112613b4b57613b4a614dbc565b5b8135613b5b8482602086016139f3565b91505092915050565b600082601f830112613b7957613b78614dbc565b5b8135613b89848260208601613a35565b91505092915050565b600081359050613ba1816153f2565b92915050565b600060208284031215613bbd57613bbc614dd0565b5b6000613bcb84828501613a77565b91505092915050565b60008060408385031215613beb57613bea614dd0565b5b6000613bf985828601613a77565b9250506020613c0a85828601613a77565b9150509250929050565b600080600060608486031215613c2d57613c2c614dd0565b5b6000613c3b86828701613a77565b9350506020613c4c86828701613a77565b9250506040613c5d86828701613b92565b9150509250925092565b60008060008060808587031215613c8157613c80614dd0565b5b6000613c8f87828801613a77565b9450506020613ca087828801613a77565b9350506040613cb187828801613b92565b925050606085013567ffffffffffffffff811115613cd257613cd1614dcb565b5b613cde87828801613b36565b91505092959194509250565b60008060408385031215613d0157613d00614dd0565b5b6000613d0f85828601613a77565b9250506020613d2085828601613ae2565b9150509250929050565b60008060408385031215613d4157613d40614dd0565b5b6000613d4f85828601613a77565b9250506020613d6085828601613b92565b9150509250929050565b600080600060408486031215613d8357613d82614dd0565b5b600084013567ffffffffffffffff811115613da157613da0614dcb565b5b613dad86828701613a8c565b93509350506020613dc086828701613b92565b9150509250925092565b600060208284031215613de057613ddf614dd0565b5b6000613dee84828501613ae2565b91505092915050565b600060208284031215613e0d57613e0c614dd0565b5b6000613e1b84828501613af7565b91505092915050565b600060208284031215613e3a57613e39614dd0565b5b6000613e4884828501613b0c565b91505092915050565b600060208284031215613e6757613e66614dd0565b5b6000613e7584828501613b21565b91505092915050565b600060208284031215613e9457613e93614dd0565b5b600082013567ffffffffffffffff811115613eb257613eb1614dcb565b5b613ebe84828501613b64565b91505092915050565b600060208284031215613edd57613edc614dd0565b5b6000613eeb84828501613b92565b91505092915050565b60008060408385031215613f0b57613f0a614dd0565b5b6000613f1985828601613b92565b9250506020613f2a85828601613a77565b9150509250929050565b6000613f40838361447b565b60208301905092915050565b613f5581614afe565b82525050565b613f6c613f6782614afe565b614c77565b82525050565b6000613f7d826149cc565b613f8781856149fa565b9350613f92836149a7565b8060005b83811015613fc3578151613faa8882613f34565b9750613fb5836149ed565b925050600181019050613f96565b5085935050505092915050565b613fd981614b10565b82525050565b613fe881614b1c565b82525050565b6000613ff9826149d7565b6140038185614a0b565b9350614013818560208601614b98565b61401c81614dd5565b840191505092915050565b6000614032826149e2565b61403c8185614a27565b935061404c818560208601614b98565b61405581614dd5565b840191505092915050565b600061406b826149e2565b6140758185614a38565b9350614085818560208601614b98565b80840191505092915050565b6000815461409e81614bcb565b6140a88186614a38565b945060018216600081146140c357600181146140d457614107565b60ff19831686528186019350614107565b6140dd856149b7565b60005b838110156140ff578154818901526001820191506020810190506140e0565b838801955050505b50505092915050565b600061411d601b83614a27565b915061412882614df3565b602082019050919050565b6000614140603283614a27565b915061414b82614e1c565b604082019050919050565b6000614163602683614a27565b915061416e82614e6b565b604082019050919050565b6000614186601c83614a27565b915061419182614eba565b602082019050919050565b60006141a9601783614a27565b91506141b482614ee3565b602082019050919050565b60006141cc601c83614a27565b91506141d782614f0c565b602082019050919050565b60006141ef602483614a27565b91506141fa82614f35565b604082019050919050565b6000614212601983614a27565b915061421d82614f84565b602082019050919050565b6000614235602c83614a27565b915061424082614fad565b604082019050919050565b6000614258603883614a27565b915061426382614ffc565b604082019050919050565b600061427b602a83614a27565b91506142868261504b565b604082019050919050565b600061429e602983614a27565b91506142a98261509a565b604082019050919050565b60006142c1602083614a27565b91506142cc826150e9565b602082019050919050565b60006142e4601883614a27565b91506142ef82615112565b602082019050919050565b6000614307602c83614a27565b91506143128261513b565b604082019050919050565b600061432a602083614a27565b91506143358261518a565b602082019050919050565b600061434d601783614a27565b9150614358826151b3565b602082019050919050565b6000614370602983614a27565b915061437b826151dc565b604082019050919050565b6000614393602f83614a27565b915061439e8261522b565b604082019050919050565b60006143b6602183614a27565b91506143c18261527a565b604082019050919050565b60006143d9600083614a1c565b91506143e4826152c9565b600082019050919050565b60006143fc601483614a27565b9150614407826152cc565b602082019050919050565b600061441f603183614a27565b915061442a826152f5565b604082019050919050565b6000614442600e83614a27565b915061444d82615344565b602082019050919050565b6000614465601f83614a27565b91506144708261536d565b602082019050919050565b61448481614b72565b82525050565b61449381614b72565b82525050565b6144a281614b7c565b82525050565b60006144b48284613f5b565b60148201915081905092915050565b60006144cf8286614060565b91506144db8285614060565b91506144e78284614091565b9150819050949350505050565b60006144ff826143cc565b9150819050919050565b600060208201905061451e6000830184613f4c565b92915050565b60006080820190506145396000830187613f4c565b6145466020830186613f4c565b614553604083018561448a565b81810360608301526145658184613fee565b905095945050505050565b6000602082019050818103600083015261458a8184613f72565b905092915050565b60006020820190506145a76000830184613fd0565b92915050565b60006020820190506145c26000830184613fdf565b92915050565b600060208201905081810360008301526145e28184614027565b905092915050565b6000602082019050818103600083015261460381614110565b9050919050565b6000602082019050818103600083015261462381614133565b9050919050565b6000602082019050818103600083015261464381614156565b9050919050565b6000602082019050818103600083015261466381614179565b9050919050565b600060208201905081810360008301526146838161419c565b9050919050565b600060208201905081810360008301526146a3816141bf565b9050919050565b600060208201905081810360008301526146c3816141e2565b9050919050565b600060208201905081810360008301526146e381614205565b9050919050565b6000602082019050818103600083015261470381614228565b9050919050565b600060208201905081810360008301526147238161424b565b9050919050565b600060208201905081810360008301526147438161426e565b9050919050565b6000602082019050818103600083015261476381614291565b9050919050565b60006020820190508181036000830152614783816142b4565b9050919050565b600060208201905081810360008301526147a3816142d7565b9050919050565b600060208201905081810360008301526147c3816142fa565b9050919050565b600060208201905081810360008301526147e38161431d565b9050919050565b6000602082019050818103600083015261480381614340565b9050919050565b6000602082019050818103600083015261482381614363565b9050919050565b6000602082019050818103600083015261484381614386565b9050919050565b60006020820190508181036000830152614863816143a9565b9050919050565b60006020820190508181036000830152614883816143ef565b9050919050565b600060208201905081810360008301526148a381614412565b9050919050565b600060208201905081810360008301526148c381614435565b9050919050565b600060208201905081810360008301526148e381614458565b9050919050565b60006020820190506148ff600083018461448a565b92915050565b600060208201905061491a6000830184614499565b92915050565b600061492a61493b565b90506149368282614bfd565b919050565b6000604051905090565b600067ffffffffffffffff8211156149605761495f614d88565b5b61496982614dd5565b9050602081019050919050565b600067ffffffffffffffff82111561499157614990614d88565b5b61499a82614dd5565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a4e82614b72565b9150614a5983614b72565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a8e57614a8d614ccc565b5b828201905092915050565b6000614aa482614b72565b9150614aaf83614b72565b925082614abf57614abe614cfb565b5b828204905092915050565b6000614ad582614b72565b9150614ae083614b72565b925082821015614af357614af2614ccc565b5b828203905092915050565b6000614b0982614b52565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614bb6578082015181840152602081019050614b9b565b83811115614bc5576000848401525b50505050565b60006002820490506001821680614be357607f821691505b60208210811415614bf757614bf6614d2a565b5b50919050565b614c0682614dd5565b810181811067ffffffffffffffff82111715614c2557614c24614d88565b5b80604052505050565b6000614c3982614b72565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c6c57614c6b614ccc565b5b600182019050919050565b6000614c8282614c89565b9050919050565b6000614c9482614de6565b9050919050565b6000614ca682614b72565b9150614cb183614b72565b925082614cc157614cc0614cfb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5468652077686974656c697374206d696e74206973206c6976652e0000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f75206861766520616c7265616479206d696e746564000000000000000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865207075626c6963206d696e74206973206c6976652e0000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f662e000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61539f81614afe565b81146153aa57600080fd5b50565b6153b681614b10565b81146153c157600080fd5b50565b6153cd81614b1c565b81146153d857600080fd5b50565b6153e481614b26565b81146153ef57600080fd5b50565b6153fb81614b72565b811461540657600080fd5b5056fea264697066735822122053ef96a9f9e686ee4b259b9c58219996a3950f153981e22e0d1c4812d355b94664736f6c63430008070033697066733a2f2f516d533276624c7a57537a563374796376367955426e4b73623936626337464d464b5259443166466e4e557659772f

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80636f8b44b0116101ab578063b592d044116100f7578063e0a8085311610095578063eed4b39e1161006f578063eed4b39e14610b97578063efbd73f414610bc0578063f14a5b8f14610be9578063f2fde38b14610c145761031a565b8063e0a8085314610b08578063e858ad0314610b31578063e985e9c514610b5a5761031a565b8063ca34adf0116100d1578063ca34adf014610a4c578063d0a75b6c14610a77578063d5abeb0114610ab4578063d89c26e314610adf5761031a565b8063b592d044146109a9578063b88d4fde146109e6578063c87b56dd14610a0f5761031a565b8063868d61831161016457806395d89b411161013e57806395d89b41146109105780639fb17e341461093b578063a22cb46514610957578063b071401b146109805761031a565b8063868d61831461087d5780638da5cb5b146108ba57806394354fd0146108e55761031a565b80636f8b44b0146107855780636fa7ba10146107ae57806370a08231146107d7578063715018a61461081457806374bd8afb1461082b5780637ec4a659146108545761031a565b80632eb4a7ab1161026a5780635503a0e81161022357806362156af3116101fd57806362156af3146106c957806362b99ad4146106f45780636352211e1461071f57806365b406f91461075c5761031a565b80635503a0e8146106485780635c975abb146106735780635f48f3931461069e5761031a565b80632eb4a7ab146105595780633ccfd60b1461058457806342842e0e1461059b578063438b6300146105c45780634fcbae0414610601578063518302271461061d5761031a565b806316c38b3c116102d757806323b872dd116102b157806323b872dd146104af578063249b35d9146104d857806326092b83146105035780632b7544401461052e5761031a565b806316c38b3c1461043257806318160ddd1461045b5780631f543be3146104865761031a565b806301ffc9a71461031f578063021ba03c1461035c57806306fdde0314610378578063081812fc146103a3578063095ea7b3146103e057806316ba10e014610409575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190613e24565b610c3d565b6040516103539190614592565b60405180910390f35b61037660048036038101906103719190613d6a565b610d1f565b005b34801561038457600080fd5b5061038d610f7d565b60405161039a91906145c8565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613ec7565b61100f565b6040516103d79190614509565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190613d2a565b611094565b005b34801561041557600080fd5b50610430600480360381019061042b9190613e7e565b6111ac565b005b34801561043e57600080fd5b5061045960048036038101906104549190613dca565b611242565b005b34801561046757600080fd5b506104706112db565b60405161047d91906148ea565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613e7e565b6112ec565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190613c14565b611382565b005b3480156104e457600080fd5b506104ed6113e2565b6040516104fa91906148ea565b60405180910390f35b34801561050f57600080fd5b506105186113e8565b6040516105259190614592565b60405180910390f35b34801561053a57600080fd5b506105436113fb565b60405161055091906145c8565b60405180910390f35b34801561056557600080fd5b5061056e611489565b60405161057b91906145ad565b60405180910390f35b34801561059057600080fd5b5061059961148f565b005b3480156105a757600080fd5b506105c260048036038101906105bd9190613c14565b6115e1565b005b3480156105d057600080fd5b506105eb60048036038101906105e69190613ba7565b611601565b6040516105f89190614570565b60405180910390f35b61061b60048036038101906106169190613d6a565b61170c565b005b34801561062957600080fd5b506106326119c6565b60405161063f9190614592565b60405180910390f35b34801561065457600080fd5b5061065d6119d9565b60405161066a91906145c8565b60405180910390f35b34801561067f57600080fd5b50610688611a67565b6040516106959190614592565b60405180910390f35b3480156106aa57600080fd5b506106b3611a7a565b6040516106c091906148ea565b60405180910390f35b3480156106d557600080fd5b506106de611a80565b6040516106eb91906148ea565b60405180910390f35b34801561070057600080fd5b50610709611a86565b60405161071691906145c8565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613ec7565b611b14565b6040516107539190614509565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190613ec7565b611bc6565b005b34801561079157600080fd5b506107ac60048036038101906107a79190613ec7565b611c4c565b005b3480156107ba57600080fd5b506107d560048036038101906107d09190613dca565b611cd2565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613ba7565b611d6b565b60405161080b91906148ea565b60405180910390f35b34801561082057600080fd5b50610829611e23565b005b34801561083757600080fd5b50610852600480360381019061084d9190613ec7565b611eab565b005b34801561086057600080fd5b5061087b60048036038101906108769190613e7e565b611f31565b005b34801561088957600080fd5b506108a4600480360381019061089f9190613ba7565b611fc7565b6040516108b191906148ea565b60405180910390f35b3480156108c657600080fd5b506108cf611fdf565b6040516108dc9190614509565b60405180910390f35b3480156108f157600080fd5b506108fa612009565b60405161090791906148ea565b60405180910390f35b34801561091c57600080fd5b5061092561200f565b60405161093291906145c8565b60405180910390f35b61095560048036038101906109509190613ec7565b6120a1565b005b34801561096357600080fd5b5061097e60048036038101906109799190613cea565b612244565b005b34801561098c57600080fd5b506109a760048036038101906109a29190613ec7565b61225a565b005b3480156109b557600080fd5b506109d060048036038101906109cb9190613ba7565b6122e0565b6040516109dd91906148ea565b60405180910390f35b3480156109f257600080fd5b50610a0d6004803603810190610a089190613c67565b6122f8565b005b348015610a1b57600080fd5b50610a366004803603810190610a319190613ec7565b61235a565b604051610a4391906145c8565b60405180910390f35b348015610a5857600080fd5b50610a616124b3565b604051610a6e91906145ad565b60405180910390f35b348015610a8357600080fd5b50610a9e6004803603810190610a999190613ba7565b6124b9565b604051610aab9190614905565b60405180910390f35b348015610ac057600080fd5b50610ac96124d9565b604051610ad691906148ea565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b019190613df7565b6124df565b005b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190613dca565b612565565b005b348015610b3d57600080fd5b50610b586004803603810190610b539190613df7565b6125fe565b005b348015610b6657600080fd5b50610b816004803603810190610b7c9190613bd4565b612684565b604051610b8e9190614592565b60405180910390f35b348015610ba357600080fd5b50610bbe6004803603810190610bb99190613ec7565b612718565b005b348015610bcc57600080fd5b50610be76004803603810190610be29190613ef4565b61279e565b005b348015610bf557600080fd5b50610bfe612883565b604051610c0b91906148ea565b60405180910390f35b348015610c2057600080fd5b50610c3b6004803603810190610c369190613ba7565b612889565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d0857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d185750610d1782612981565b5b9050919050565b80600c5481610d2e60086129eb565b610d389190614a43565b1115610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d709061486a565b60405180910390fd5b601460009054906101000a900460ff1615610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906147ea565b60405180910390fd5b60001515601460029054906101000a900460ff16151514610e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e169061478a565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e548382610e729190614a43565b1115610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa9061468a565b60405180910390fd5b600033604051602001610ec691906144a8565b604051602081830303815290604052805190602001209050610f2c868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836129f9565b610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f62906148aa565b60405180910390fd5b610f753385612a10565b505050505050565b606060008054610f8c90614bcb565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb890614bcb565b80156110055780601f10610fda57610100808354040283529160200191611005565b820191906000526020600020905b815481529060010190602001808311610fe857829003601f168201915b5050505050905090565b600061101a82612aa5565b611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906147aa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061109f82611b14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111079061484a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661112f612b11565b73ffffffffffffffffffffffffffffffffffffffff16148061115e575061115d81611158612b11565b612684565b5b61119d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111949061470a565b60405180910390fd5b6111a78383612b19565b505050565b6111b4612b11565b73ffffffffffffffffffffffffffffffffffffffff166111d2611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f906147ca565b60405180910390fd5b80600a908051906020019061123e929190613950565b5050565b61124a612b11565b73ffffffffffffffffffffffffffffffffffffffff16611268611fdf565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b5906147ca565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b60006112e760086129eb565b905090565b6112f4612b11565b73ffffffffffffffffffffffffffffffffffffffff16611312611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f906147ca565b60405180910390fd5b80600b908051906020019061137e929190613950565b5050565b61139361138d612b11565b82612bd2565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c99061488a565b60405180910390fd5b6113dd838383612cb0565b505050565b600e5481565b601460029054906101000a900460ff1681565b600b805461140890614bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461143490614bcb565b80156114815780601f1061145657610100808354040283529160200191611481565b820191906000526020600020905b81548152906001019060200180831161146457829003601f168201915b505050505081565b60125481565b611497612b11565b73ffffffffffffffffffffffffffffffffffffffff166114b5611fdf565b73ffffffffffffffffffffffffffffffffffffffff161461150b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611502906147ca565b60405180910390fd5b60026007541415611551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611548906148ca565b60405180910390fd5b60026007819055506000611563611fdf565b73ffffffffffffffffffffffffffffffffffffffff1647604051611586906144f4565b60006040518083038185875af1925050503d80600081146115c3576040519150601f19603f3d011682016040523d82523d6000602084013e6115c8565b606091505b50509050806115d657600080fd5b506001600781905550565b6115fc838383604051806020016040528060008152506122f8565b505050565b6060600061160e83611d6b565b905060008167ffffffffffffffff81111561162c5761162b614d88565b5b60405190808252806020026020018201604052801561165a5781602001602082028036833780820191505090505b50905060006001905060005b83811080156116775750600c548211155b1561170057600061168783611b14565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ec57828483815181106116d1576116d0614d59565b5b60200260200101818152505081806116e890614c2e565b9250505b82806116f790614c2e565b93505050611666565b82945050505050919050565b80600c548161171b60086129eb565b6117259190614a43565b1115611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d9061486a565b60405180910390fd5b601460009054906101000a900460ff16156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad906147ea565b60405180910390fd5b60001515601460029054906101000a900460ff1615151461180c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118039061478a565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff169050600f54838261186f9190614a43565b11156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a79061468a565b60405180910390fd5b600f546118bc33611d6b565b106118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f39061466a565b60405180910390fd5b60003360405160200161190f91906144a8565b604051602081830303815290604052805190602001209050611975868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601354836129f9565b6119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab906148aa565b60405180910390fd5b6119be3385612f0c565b505050505050565b601460019054906101000a900460ff1681565b600a80546119e690614bcb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1290614bcb565b8015611a5f5780601f10611a3457610100808354040283529160200191611a5f565b820191906000526020600020905b815481529060010190602001808311611a4257829003601f168201915b505050505081565b601460009054906101000a900460ff1681565b60115481565b600f5481565b60098054611a9390614bcb565b80601f0160208091040260200160405190810160405280929190818152602001828054611abf90614bcb565b8015611b0c5780601f10611ae157610100808354040283529160200191611b0c565b820191906000526020600020905b815481529060010190602001808311611aef57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb49061474a565b60405180910390fd5b80915050919050565b611bce612b11565b73ffffffffffffffffffffffffffffffffffffffff16611bec611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c39906147ca565b60405180910390fd5b80600f8190555050565b611c54612b11565b73ffffffffffffffffffffffffffffffffffffffff16611c72611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf906147ca565b60405180910390fd5b80600c8190555050565b611cda612b11565b73ffffffffffffffffffffffffffffffffffffffff16611cf8611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d45906147ca565b60405180910390fd5b80601460026101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd39061472a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e2b612b11565b73ffffffffffffffffffffffffffffffffffffffff16611e49611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e96906147ca565b60405180910390fd5b611ea96000612fa1565b565b611eb3612b11565b73ffffffffffffffffffffffffffffffffffffffff16611ed1611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e906147ca565b60405180910390fd5b8060108190555050565b611f39612b11565b73ffffffffffffffffffffffffffffffffffffffff16611f57611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa4906147ca565b60405180910390fd5b8060099080519060200190611fc3929190613950565b5050565b60156020528060005260406000206000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b60606001805461201e90614bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461204a90614bcb565b80156120975780601f1061206c57610100808354040283529160200191612097565b820191906000526020600020905b81548152906001019060200180831161207a57829003601f168201915b5050505050905090565b80600c54816120b060086129eb565b6120ba9190614a43565b11156120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f29061486a565b60405180910390fd5b60011515601460029054906101000a900460ff16151514612151576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612148906145ea565b60405180910390fd5b601460009054906101000a900460ff16156121a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612198906147ea565b60405180910390fd5b6000601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060105483826121f49190614a43565b1115612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c9061468a565b60405180910390fd5b61223f3384613067565b505050565b61225661224f612b11565b83836130fc565b5050565b612262612b11565b73ffffffffffffffffffffffffffffffffffffffff16612280611fdf565b73ffffffffffffffffffffffffffffffffffffffff16146122d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cd906147ca565b60405180910390fd5b80600d8190555050565b60176020528060005260406000206000915090505481565b612309612303612b11565b83612bd2565b612348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233f9061488a565b60405180910390fd5b61235484848484613269565b50505050565b606061236582612aa5565b6123a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239b9061482a565b60405180910390fd5b60001515601460019054906101000a900460ff161515141561245257600b80546123cd90614bcb565b80601f01602080910402602001604051908101604052809291908181526020018280546123f990614bcb565b80156124465780601f1061241b57610100808354040283529160200191612446565b820191906000526020600020905b81548152906001019060200180831161242957829003601f168201915b505050505090506124ae565b600061245c6132c5565b9050600081511161247c57604051806020016040528060008152506124aa565b8061248684613357565b600a60405160200161249a939291906144c3565b6040516020818303038152906040525b9150505b919050565b60135481565b60166020528060005260406000206000915054906101000a900460ff1681565b600c5481565b6124e7612b11565b73ffffffffffffffffffffffffffffffffffffffff16612505611fdf565b73ffffffffffffffffffffffffffffffffffffffff161461255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906147ca565b60405180910390fd5b8060138190555050565b61256d612b11565b73ffffffffffffffffffffffffffffffffffffffff1661258b611fdf565b73ffffffffffffffffffffffffffffffffffffffff16146125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d8906147ca565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b612606612b11565b73ffffffffffffffffffffffffffffffffffffffff16612624611fdf565b73ffffffffffffffffffffffffffffffffffffffff161461267a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612671906147ca565b60405180910390fd5b8060128190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612720612b11565b73ffffffffffffffffffffffffffffffffffffffff1661273e611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b906147ca565b60405180910390fd5b80600e8190555050565b81600c54816127ad60086129eb565b6127b79190614a43565b11156127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef9061486a565b60405180910390fd5b612800612b11565b73ffffffffffffffffffffffffffffffffffffffff1661281e611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b906147ca565b60405180910390fd5b61287e8284613067565b505050565b60105481565b612891612b11565b73ffffffffffffffffffffffffffffffffffffffff166128af611fdf565b73ffffffffffffffffffffffffffffffffffffffff1614612905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fc906147ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296c9061462a565b60405180910390fd5b61297e81612fa1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b600082612a0685846134b8565b1490509392505050565b60005b81811015612aa057601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612a6b90614c2e565b9190505550612a7a600861352d565b612a8d83612a8860086129eb565b613543565b8080612a9890614c2e565b915050612a13565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b8c83611b14565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612bdd82612aa5565b612c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c13906146ea565b60405180910390fd5b6000612c2783611b14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c9657508373ffffffffffffffffffffffffffffffffffffffff16612c7e8461100f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ca75750612ca68185612684565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612cd082611b14565b73ffffffffffffffffffffffffffffffffffffffff1614612d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d9061480a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8d906146aa565b60405180910390fd5b612da1838383613561565b612dac600082612b19565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dfc9190614aca565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e539190614a43565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60005b81811015612f9c57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612f6790614c2e565b9190505550612f76600861352d565b612f8983612f8460086129eb565b613543565b8080612f9490614c2e565b915050612f0f565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156130f757601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906130c290614c2e565b91905055506130d1600861352d565b6130e4836130df60086129eb565b613543565b80806130ef90614c2e565b91505061306a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613162906146ca565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161325c9190614592565b60405180910390a3505050565b613274848484612cb0565b61328084848484613566565b6132bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b69061460a565b60405180910390fd5b50505050565b6060600980546132d490614bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461330090614bcb565b801561334d5780601f106133225761010080835404028352916020019161334d565b820191906000526020600020905b81548152906001019060200180831161333057829003601f168201915b5050505050905090565b6060600082141561339f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134b3565b600082905060005b600082146133d15780806133ba90614c2e565b915050600a826133ca9190614a99565b91506133a7565b60008167ffffffffffffffff8111156133ed576133ec614d88565b5b6040519080825280601f01601f19166020018201604052801561341f5781602001600182028036833780820191505090505b5090505b600085146134ac576001826134389190614aca565b9150600a856134479190614c9b565b60306134539190614a43565b60f81b81838151811061346957613468614d59565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134a59190614a99565b9450613423565b8093505050505b919050565b60008082905060005b84518110156135225760008582815181106134df576134de614d59565b5b60200260200101519050808311613501576134fa83826136fd565b925061350e565b61350b81846136fd565b92505b50808061351a90614c2e565b9150506134c1565b508091505092915050565b6001816000016000828254019250508190555050565b61355d828260405180602001604052806000815250613714565b5050565b505050565b60006135878473ffffffffffffffffffffffffffffffffffffffff1661376f565b156136f0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135b0612b11565b8786866040518563ffffffff1660e01b81526004016135d29493929190614524565b602060405180830381600087803b1580156135ec57600080fd5b505af192505050801561361d57506040513d601f19601f8201168201806040525081019061361a9190613e51565b60015b6136a0573d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b50600081511415613698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368f9061460a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136f5565b600190505b949350505050565b600082600052816020526040600020905092915050565b61371e8383613782565b61372b6000848484613566565b61376a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137619061460a565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e99061476a565b60405180910390fd5b6137fb81612aa5565b1561383b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138329061464a565b60405180910390fd5b61384760008383613561565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138979190614a43565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461395c90614bcb565b90600052602060002090601f01602090048101928261397e57600085556139c5565b82601f1061399757805160ff19168380011785556139c5565b828001600101855582156139c5579182015b828111156139c45782518255916020019190600101906139a9565b5b5090506139d291906139d6565b5090565b5b808211156139ef5760008160009055506001016139d7565b5090565b6000613a06613a0184614945565b614920565b905082815260208101848484011115613a2257613a21614dc6565b5b613a2d848285614b89565b509392505050565b6000613a48613a4384614976565b614920565b905082815260208101848484011115613a6457613a63614dc6565b5b613a6f848285614b89565b509392505050565b600081359050613a8681615396565b92915050565b60008083601f840112613aa257613aa1614dbc565b5b8235905067ffffffffffffffff811115613abf57613abe614db7565b5b602083019150836020820283011115613adb57613ada614dc1565b5b9250929050565b600081359050613af1816153ad565b92915050565b600081359050613b06816153c4565b92915050565b600081359050613b1b816153db565b92915050565b600081519050613b30816153db565b92915050565b600082601f830112613b4b57613b4a614dbc565b5b8135613b5b8482602086016139f3565b91505092915050565b600082601f830112613b7957613b78614dbc565b5b8135613b89848260208601613a35565b91505092915050565b600081359050613ba1816153f2565b92915050565b600060208284031215613bbd57613bbc614dd0565b5b6000613bcb84828501613a77565b91505092915050565b60008060408385031215613beb57613bea614dd0565b5b6000613bf985828601613a77565b9250506020613c0a85828601613a77565b9150509250929050565b600080600060608486031215613c2d57613c2c614dd0565b5b6000613c3b86828701613a77565b9350506020613c4c86828701613a77565b9250506040613c5d86828701613b92565b9150509250925092565b60008060008060808587031215613c8157613c80614dd0565b5b6000613c8f87828801613a77565b9450506020613ca087828801613a77565b9350506040613cb187828801613b92565b925050606085013567ffffffffffffffff811115613cd257613cd1614dcb565b5b613cde87828801613b36565b91505092959194509250565b60008060408385031215613d0157613d00614dd0565b5b6000613d0f85828601613a77565b9250506020613d2085828601613ae2565b9150509250929050565b60008060408385031215613d4157613d40614dd0565b5b6000613d4f85828601613a77565b9250506020613d6085828601613b92565b9150509250929050565b600080600060408486031215613d8357613d82614dd0565b5b600084013567ffffffffffffffff811115613da157613da0614dcb565b5b613dad86828701613a8c565b93509350506020613dc086828701613b92565b9150509250925092565b600060208284031215613de057613ddf614dd0565b5b6000613dee84828501613ae2565b91505092915050565b600060208284031215613e0d57613e0c614dd0565b5b6000613e1b84828501613af7565b91505092915050565b600060208284031215613e3a57613e39614dd0565b5b6000613e4884828501613b0c565b91505092915050565b600060208284031215613e6757613e66614dd0565b5b6000613e7584828501613b21565b91505092915050565b600060208284031215613e9457613e93614dd0565b5b600082013567ffffffffffffffff811115613eb257613eb1614dcb565b5b613ebe84828501613b64565b91505092915050565b600060208284031215613edd57613edc614dd0565b5b6000613eeb84828501613b92565b91505092915050565b60008060408385031215613f0b57613f0a614dd0565b5b6000613f1985828601613b92565b9250506020613f2a85828601613a77565b9150509250929050565b6000613f40838361447b565b60208301905092915050565b613f5581614afe565b82525050565b613f6c613f6782614afe565b614c77565b82525050565b6000613f7d826149cc565b613f8781856149fa565b9350613f92836149a7565b8060005b83811015613fc3578151613faa8882613f34565b9750613fb5836149ed565b925050600181019050613f96565b5085935050505092915050565b613fd981614b10565b82525050565b613fe881614b1c565b82525050565b6000613ff9826149d7565b6140038185614a0b565b9350614013818560208601614b98565b61401c81614dd5565b840191505092915050565b6000614032826149e2565b61403c8185614a27565b935061404c818560208601614b98565b61405581614dd5565b840191505092915050565b600061406b826149e2565b6140758185614a38565b9350614085818560208601614b98565b80840191505092915050565b6000815461409e81614bcb565b6140a88186614a38565b945060018216600081146140c357600181146140d457614107565b60ff19831686528186019350614107565b6140dd856149b7565b60005b838110156140ff578154818901526001820191506020810190506140e0565b838801955050505b50505092915050565b600061411d601b83614a27565b915061412882614df3565b602082019050919050565b6000614140603283614a27565b915061414b82614e1c565b604082019050919050565b6000614163602683614a27565b915061416e82614e6b565b604082019050919050565b6000614186601c83614a27565b915061419182614eba565b602082019050919050565b60006141a9601783614a27565b91506141b482614ee3565b602082019050919050565b60006141cc601c83614a27565b91506141d782614f0c565b602082019050919050565b60006141ef602483614a27565b91506141fa82614f35565b604082019050919050565b6000614212601983614a27565b915061421d82614f84565b602082019050919050565b6000614235602c83614a27565b915061424082614fad565b604082019050919050565b6000614258603883614a27565b915061426382614ffc565b604082019050919050565b600061427b602a83614a27565b91506142868261504b565b604082019050919050565b600061429e602983614a27565b91506142a98261509a565b604082019050919050565b60006142c1602083614a27565b91506142cc826150e9565b602082019050919050565b60006142e4601883614a27565b91506142ef82615112565b602082019050919050565b6000614307602c83614a27565b91506143128261513b565b604082019050919050565b600061432a602083614a27565b91506143358261518a565b602082019050919050565b600061434d601783614a27565b9150614358826151b3565b602082019050919050565b6000614370602983614a27565b915061437b826151dc565b604082019050919050565b6000614393602f83614a27565b915061439e8261522b565b604082019050919050565b60006143b6602183614a27565b91506143c18261527a565b604082019050919050565b60006143d9600083614a1c565b91506143e4826152c9565b600082019050919050565b60006143fc601483614a27565b9150614407826152cc565b602082019050919050565b600061441f603183614a27565b915061442a826152f5565b604082019050919050565b6000614442600e83614a27565b915061444d82615344565b602082019050919050565b6000614465601f83614a27565b91506144708261536d565b602082019050919050565b61448481614b72565b82525050565b61449381614b72565b82525050565b6144a281614b7c565b82525050565b60006144b48284613f5b565b60148201915081905092915050565b60006144cf8286614060565b91506144db8285614060565b91506144e78284614091565b9150819050949350505050565b60006144ff826143cc565b9150819050919050565b600060208201905061451e6000830184613f4c565b92915050565b60006080820190506145396000830187613f4c565b6145466020830186613f4c565b614553604083018561448a565b81810360608301526145658184613fee565b905095945050505050565b6000602082019050818103600083015261458a8184613f72565b905092915050565b60006020820190506145a76000830184613fd0565b92915050565b60006020820190506145c26000830184613fdf565b92915050565b600060208201905081810360008301526145e28184614027565b905092915050565b6000602082019050818103600083015261460381614110565b9050919050565b6000602082019050818103600083015261462381614133565b9050919050565b6000602082019050818103600083015261464381614156565b9050919050565b6000602082019050818103600083015261466381614179565b9050919050565b600060208201905081810360008301526146838161419c565b9050919050565b600060208201905081810360008301526146a3816141bf565b9050919050565b600060208201905081810360008301526146c3816141e2565b9050919050565b600060208201905081810360008301526146e381614205565b9050919050565b6000602082019050818103600083015261470381614228565b9050919050565b600060208201905081810360008301526147238161424b565b9050919050565b600060208201905081810360008301526147438161426e565b9050919050565b6000602082019050818103600083015261476381614291565b9050919050565b60006020820190508181036000830152614783816142b4565b9050919050565b600060208201905081810360008301526147a3816142d7565b9050919050565b600060208201905081810360008301526147c3816142fa565b9050919050565b600060208201905081810360008301526147e38161431d565b9050919050565b6000602082019050818103600083015261480381614340565b9050919050565b6000602082019050818103600083015261482381614363565b9050919050565b6000602082019050818103600083015261484381614386565b9050919050565b60006020820190508181036000830152614863816143a9565b9050919050565b60006020820190508181036000830152614883816143ef565b9050919050565b600060208201905081810360008301526148a381614412565b9050919050565b600060208201905081810360008301526148c381614435565b9050919050565b600060208201905081810360008301526148e381614458565b9050919050565b60006020820190506148ff600083018461448a565b92915050565b600060208201905061491a6000830184614499565b92915050565b600061492a61493b565b90506149368282614bfd565b919050565b6000604051905090565b600067ffffffffffffffff8211156149605761495f614d88565b5b61496982614dd5565b9050602081019050919050565b600067ffffffffffffffff82111561499157614990614d88565b5b61499a82614dd5565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a4e82614b72565b9150614a5983614b72565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a8e57614a8d614ccc565b5b828201905092915050565b6000614aa482614b72565b9150614aaf83614b72565b925082614abf57614abe614cfb565b5b828204905092915050565b6000614ad582614b72565b9150614ae083614b72565b925082821015614af357614af2614ccc565b5b828203905092915050565b6000614b0982614b52565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614bb6578082015181840152602081019050614b9b565b83811115614bc5576000848401525b50505050565b60006002820490506001821680614be357607f821691505b60208210811415614bf757614bf6614d2a565b5b50919050565b614c0682614dd5565b810181811067ffffffffffffffff82111715614c2557614c24614d88565b5b80604052505050565b6000614c3982614b72565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c6c57614c6b614ccc565b5b600182019050919050565b6000614c8282614c89565b9050919050565b6000614c9482614de6565b9050919050565b6000614ca682614b72565b9150614cb183614b72565b925082614cc157614cc0614cfb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5468652077686974656c697374206d696e74206973206c6976652e0000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f75206861766520616c7265616479206d696e746564000000000000000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865207075626c6963206d696e74206973206c6976652e0000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f662e000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61539f81614afe565b81146153aa57600080fd5b50565b6153b681614b10565b81146153c157600080fd5b50565b6153cd81614b1c565b81146153d857600080fd5b50565b6153e481614b26565b81146153ef57600080fd5b50565b6153fb81614b72565b811461540657600080fd5b5056fea264697066735822122053ef96a9f9e686ee4b259b9c58219996a3950f153981e22e0d1c4812d355b94664736f6c63430008070033

Deployed Bytecode Sourcemap

62066:7056:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49542:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63424:621;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50487:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52046:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51569:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66507:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66700:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67613:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67463:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52796:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62495:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62931:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62370:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62665:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68963:150;;;;;;;;;;;;;:::i;:::-;;53206:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67711:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64053:721;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62899:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62332:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62868:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62628:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62540:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62245:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50181:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67243:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67363:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66784:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49911:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29455:103;;;;;;;;;;;;;:::i;:::-;;67015:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66401:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62968:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28804:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62453:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50656:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64780:423;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52339:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66879:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63091:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53462:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68350:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62764:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63030:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62417:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66291:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66613:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66187:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52565:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67126:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65211:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62586:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29713:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49542:305;49644:4;49696:25;49681:40;;;:11;:40;;;;:105;;;;49753:33;49738:48;;;:11;:48;;;;49681:105;:158;;;;49803:36;49827:11;49803:23;:36::i;:::-;49681:158;49661:178;;49542:305;;;:::o;63424:621::-;63532:11;63368:9;;63353:11;63334:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;63326:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;63561:6:::1;;;;;;;;;;;63560:7;63552:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;63624:5;63610:19;;:10;;;;;;;;;;;:19;;;63602:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;63665:29;63697:22;:34;63720:10;63697:34;;;;;;;;;;;;;;;;63665:66;;63785:21;;63770:11;63746:21;:35;;;;:::i;:::-;:60;;63738:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;63846:12;63888:10;63871:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;63861:39;;;;;;63846:54;;63915:50;63934:12;;63915:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63948:10;;63960:4;63915:18;:50::i;:::-;63907:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63996:43;64015:10;64027:11;63996:18;:43::i;:::-;63545:500;;63424:621:::0;;;;:::o;50487:100::-;50541:13;50574:5;50567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50487:100;:::o;52046:221::-;52122:7;52150:16;52158:7;52150;:16::i;:::-;52142:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52235:15;:24;52251:7;52235:24;;;;;;;;;;;;;;;;;;;;;52228:31;;52046:221;;;:::o;51569:411::-;51650:13;51666:23;51681:7;51666:14;:23::i;:::-;51650:39;;51714:5;51708:11;;:2;:11;;;;51700:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51808:5;51792:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;51817:37;51834:5;51841:12;:10;:12::i;:::-;51817:16;:37::i;:::-;51792:62;51770:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;51951:21;51960:2;51964:7;51951:8;:21::i;:::-;51639:341;51569:411;;:::o;66507:100::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66591:10:::1;66579:9;:22;;;;;;;;;;;;:::i;:::-;;66507:100:::0;:::o;66700:77::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66765:6:::1;66756;;:15;;;;;;;;;;;;;;;;;;66700:77:::0;:::o;67613:89::-;67657:7;67680:16;:6;:14;:16::i;:::-;67673:23;;67613:89;:::o;67463:144::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67580:21:::1;67557:20;:44;;;;;;;;;;;;:::i;:::-;;67463:144:::0;:::o;52796:339::-;52991:41;53010:12;:10;:12::i;:::-;53024:7;52991:18;:41::i;:::-;52983:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53099:28;53109:4;53115:2;53119:7;53099:9;:28::i;:::-;52796:339;;;:::o;62495:40::-;;;;:::o;62931:30::-;;;;;;;;;;;;;:::o;62370:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62665:94::-;;;;:::o;68963:150::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1:::1;2443:7;;:19;;2435:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1845:1;2576:7;:18;;;;69021:7:::2;69042;:5;:7::i;:::-;69034:21;;69063;69034:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69020:69;;;69104:2;69096:11;;;::::0;::::2;;69013:100;1801:1:::1;2755:7;:22;;;;68963:150::o:0;53206:185::-;53344:39;53361:4;53367:2;53371:7;53344:39;;;;;;;;;;;;:16;:39::i;:::-;53206:185;;;:::o;67711:635::-;67786:16;67814:23;67840:17;67850:6;67840:9;:17::i;:::-;67814:43;;67864:30;67911:15;67897:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67864:63;;67934:22;67959:1;67934:26;;67967:23;68003:309;68028:15;68010;:33;:64;;;;;68065:9;;68047:14;:27;;68010:64;68003:309;;;68085:25;68113:23;68121:14;68113:7;:23::i;:::-;68085:51;;68172:6;68151:27;;:17;:27;;;68147:131;;;68224:14;68191:13;68205:15;68191:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;68251:17;;;;;:::i;:::-;;;;68147:131;68288:16;;;;;:::i;:::-;;;;68076:236;68003:309;;;68327:13;68320:20;;;;;;67711:635;;;:::o;64053:721::-;64162:11;63368:9;;63353:11;63334:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;63326:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64191:6:::1;;;;;;;;;;;64190:7;64182:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;64254:5;64240:19;;:10;;;;;;;;;;;:19;;;64232:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;64295:30;64328:23;:35;64352:10;64328:35;;;;;;;;;;;;;;;;;;;;;;;;;64295:68;;;;64418:22;;64403:11;64378:22;:36;;;;:::i;:::-;:62;;64370:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;64513:22;;64489:21;64499:10;64489:9;:21::i;:::-;:46;64480:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;64570:13;64613:10;64596:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;64586:39;;;;;;64570:55;;64640:53;64659:13;;64640:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64674:11;;64687:5;64640:18;:53::i;:::-;64632:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;64724:44;64744:10;64756:11;64724:19;:44::i;:::-;64175:599;;64053:721:::0;;;;:::o;62899:27::-;;;;;;;;;;;;;:::o;62332:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62868:26::-;;;;;;;;;;;;;:::o;62628:28::-;;;;:::o;62540:41::-;;;;:::o;62245:82::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50181:239::-;50253:7;50273:13;50289:7;:16;50297:7;50289:16;;;;;;;;;;;;;;;;;;;;;50273:32;;50341:1;50324:19;;:5;:19;;;;50316:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50407:5;50400:12;;;50181:239;;;:::o;67243:112::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67343:6:::1;67318:22;:31;;;;67243:112:::0;:::o;67363:94::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67441:10:::1;67429:9;:22;;;;67363:94:::0;:::o;66784:89::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66861:6:::1;66848:10;;:19;;;;;;;;;;;;;;;;;;66784:89:::0;:::o;49911:208::-;49983:7;50028:1;50011:19;;:5;:19;;;;50003:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50095:9;:16;50105:5;50095:16;;;;;;;;;;;;;;;;50088:23;;49911:208;;;:::o;29455:103::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29520:30:::1;29547:1;29520:18;:30::i;:::-;29455:103::o:0;67015:104::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67107:6:::1;67086:18;:27;;;;67015:104:::0;:::o;66401:100::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66485:10:::1;66473:9;:22;;;;;;;;;;;;:::i;:::-;;66401:100:::0;:::o;62968:57::-;;;;;;;;;;;;;;;;;:::o;28804:87::-;28850:7;28877:6;;;;;;;;;;;28870:13;;28804:87;:::o;62453:37::-;;;;:::o;50656:104::-;50712:13;50745:7;50738:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50656:104;:::o;64780:423::-;64851:11;63368:9;;63353:11;63334:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;63326:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64893:4:::1;64879:18;;:10;;;;;;;;;;;:18;;;64871:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64945:6;;;;;;;;;;;64944:7;64936:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;64986:26;65015:19;:31;65035:10;65015:31;;;;;;;;;;;;;;;;64986:60;;65097:18;;65082:11;65061:18;:32;;;;:::i;:::-;:54;;65053:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;65157:40;65173:10;65185:11;65157:15;:40::i;:::-;64864:339;64780:423:::0;;:::o;52339:155::-;52434:52;52453:12;:10;:12::i;:::-;52467:8;52477;52434:18;:52::i;:::-;52339:155;;:::o;66879:130::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66984:19:::1;66963:18;:40;;;;66879:130:::0;:::o;63091:54::-;;;;;;;;;;;;;;;;;:::o;53462:328::-;53637:41;53656:12;:10;:12::i;:::-;53670:7;53637:18;:41::i;:::-;53629:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53743:39;53757:4;53763:2;53767:7;53776:5;53743:13;:39::i;:::-;53462:328;;;;:::o;68350:497::-;68449:13;68490:17;68498:8;68490:7;:17::i;:::-;68474:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;68597:5;68585:17;;:8;;;;;;;;;;;:17;;;68581:67;;;68620:20;68613:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68581:67;68656:28;68687:10;:8;:10::i;:::-;68656:41;;68742:1;68717:14;68711:28;:32;:130;;;;;;;;;;;;;;;;;68779:14;68795:19;:8;:17;:19::i;:::-;68816:9;68762:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68711:130;68704:137;;;68350:497;;;;:::o;62764:95::-;;;;:::o;63030:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;62417:31::-;;;;:::o;66291:102::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66375:12:::1;66361:11;:26;;;;66291:102:::0;:::o;66613:81::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66682:6:::1;66671:8;;:17;;;;;;;;;;;;;;;;;;66613:81:::0;:::o;66187:98::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66268:11:::1;66255:10;:24;;;;66187:98:::0;:::o;52565:164::-;52662:4;52686:18;:25;52705:5;52686:25;;;;;;;;;;;;;;;:35;52712:8;52686:35;;;;;;;;;;;;;;;;;;;;;;;;;52679:42;;52565:164;;;;:::o;67126:110::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67224:6:::1;67200:21;:30;;;;67126:110:::0;:::o;65211:161::-;65297:11;63368:9;;63353:11;63334:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;63326:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29035:12:::1;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65327:39:::2;65343:9;65354:11;65327:15;:39::i;:::-;65211:161:::0;;;:::o;62586:37::-;;;;:::o;29713:201::-;29035:12;:10;:12::i;:::-;29024:23;;:7;:5;:7::i;:::-;:23;;;29016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29822:1:::1;29802:22;;:8;:22;;;;29794:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29878:28;29897:8;29878:18;:28::i;:::-;29713:201:::0;:::o;41236:157::-;41321:4;41360:25;41345:40;;;:11;:40;;;;41338:47;;41236:157;;;:::o;9722:114::-;9787:7;9814;:14;;;9807:21;;9722:114;;;:::o;3753:190::-;3878:4;3931;3902:25;3915:5;3922:4;3902:12;:25::i;:::-;:33;3895:40;;3753:190;;;;;:::o;65646:261::-;65735:9;65730:172;65754:11;65750:1;:15;65730:172;;;65782:22;:34;65805:10;65782:34;;;;;;;;;;;;;;;;:36;;;;;;;;;:::i;:::-;;;;;;65827:18;:6;:16;:18::i;:::-;65856:38;65866:9;65877:16;:6;:14;:16::i;:::-;65856:9;:38::i;:::-;65767:3;;;;;:::i;:::-;;;;65730:172;;;;65646:261;;:::o;55300:127::-;55365:4;55417:1;55389:30;;:7;:16;55397:7;55389:16;;;;;;;;;;;;;;;;;;;;;:30;;;;55382:37;;55300:127;;;:::o;13118:98::-;13171:7;13198:10;13191:17;;13118:98;:::o;59282:174::-;59384:2;59357:15;:24;59373:7;59357:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59440:7;59436:2;59402:46;;59411:23;59426:7;59411:14;:23::i;:::-;59402:46;;;;;;;;;;;;59282:174;;:::o;55594:348::-;55687:4;55712:16;55720:7;55712;:16::i;:::-;55704:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55788:13;55804:23;55819:7;55804:14;:23::i;:::-;55788:39;;55857:5;55846:16;;:7;:16;;;:51;;;;55890:7;55866:31;;:20;55878:7;55866:11;:20::i;:::-;:31;;;55846:51;:87;;;;55901:32;55918:5;55925:7;55901:16;:32::i;:::-;55846:87;55838:96;;;55594:348;;;;:::o;58586:578::-;58745:4;58718:31;;:23;58733:7;58718:14;:23::i;:::-;:31;;;58710:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58828:1;58814:16;;:2;:16;;;;58806:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58884:39;58905:4;58911:2;58915:7;58884:20;:39::i;:::-;58988:29;59005:1;59009:7;58988:8;:29::i;:::-;59049:1;59030:9;:15;59040:4;59030:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;59078:1;59061:9;:13;59071:2;59061:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;59109:2;59090:7;:16;59098:7;59090:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59148:7;59144:2;59129:27;;59138:4;59129:27;;;;;;;;;;;;58586:578;;;:::o;65913:262::-;66003:9;65998:172;66022:11;66018:1;:15;65998:172;;;66050:22;:34;66073:10;66050:34;;;;;;;;;;;;;;;;:36;;;;;;;;;:::i;:::-;;;;;;66095:18;:6;:16;:18::i;:::-;66124:38;66134:9;66145:16;:6;:14;:16::i;:::-;66124:9;:38::i;:::-;66035:3;;;;;:::i;:::-;;;;65998:172;;;;65913:262;;:::o;30074:191::-;30148:16;30167:6;;;;;;;;;;;30148:25;;30193:8;30184:6;;:17;;;;;;;;;;;;;;;;;;30248:8;30217:40;;30238:8;30217:40;;;;;;;;;;;;30137:128;30074:191;:::o;65380:260::-;65466:9;65461:174;65485:11;65481:1;:15;65461:174;;;65512:19;:31;65532:10;65512:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;65554:18;:6;:16;:18::i;:::-;65589:38;65599:9;65610:16;:6;:14;:16::i;:::-;65589:9;:38::i;:::-;65498:3;;;;;:::i;:::-;;;;65461:174;;;;65380:260;;:::o;59598:315::-;59753:8;59744:17;;:5;:17;;;;59736:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59840:8;59802:18;:25;59821:5;59802:25;;;;;;;;;;;;;;;:35;59828:8;59802:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;59886:8;59864:41;;59879:5;59864:41;;;59896:8;59864:41;;;;;;:::i;:::-;;;;;;;;59598:315;;;:::o;54672:::-;54829:28;54839:4;54845:2;54849:7;54829:9;:28::i;:::-;54876:48;54899:4;54905:2;54909:7;54918:5;54876:22;:48::i;:::-;54868:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;54672:315;;;;:::o;68853:104::-;68913:13;68942:9;68935:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68853:104;:::o;10680:723::-;10736:13;10966:1;10957:5;:10;10953:53;;;10984:10;;;;;;;;;;;;;;;;;;;;;10953:53;11016:12;11031:5;11016:20;;11047:14;11072:78;11087:1;11079:4;:9;11072:78;;11105:8;;;;;:::i;:::-;;;;11136:2;11128:10;;;;;:::i;:::-;;;11072:78;;;11160:19;11192:6;11182:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11160:39;;11210:154;11226:1;11217:5;:10;11210:154;;11254:1;11244:11;;;;;:::i;:::-;;;11321:2;11313:5;:10;;;;:::i;:::-;11300:2;:24;;;;:::i;:::-;11287:39;;11270:6;11277;11270:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11350:2;11341:11;;;;;:::i;:::-;;;11210:154;;;11388:6;11374:21;;;;;10680:723;;;;:::o;4305:675::-;4388:7;4408:20;4431:4;4408:27;;4451:9;4446:497;4470:5;:12;4466:1;:16;4446:497;;;4504:20;4527:5;4533:1;4527:8;;;;;;;;:::i;:::-;;;;;;;;4504:31;;4570:12;4554;:28;4550:382;;4697:42;4712:12;4726;4697:14;:42::i;:::-;4682:57;;4550:382;;;4874:42;4889:12;4903;4874:14;:42::i;:::-;4859:57;;4550:382;4489:454;4484:3;;;;;:::i;:::-;;;;4446:497;;;;4960:12;4953:19;;;4305:675;;;;:::o;9844:127::-;9951:1;9933:7;:14;;;:19;;;;;;;;;;;9844:127;:::o;56284:110::-;56360:26;56370:2;56374:7;56360:26;;;;;;;;;;;;:9;:26::i;:::-;56284:110;;:::o;61849:126::-;;;;:::o;60478:799::-;60633:4;60654:15;:2;:13;;;:15::i;:::-;60650:620;;;60706:2;60690:36;;;60727:12;:10;:12::i;:::-;60741:4;60747:7;60756:5;60690:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60686:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60949:1;60932:6;:13;:18;60928:272;;;60975:60;;;;;;;;;;:::i;:::-;;;;;;;;60928:272;61150:6;61144:13;61135:6;61131:2;61127:15;61120:38;60686:529;60823:41;;;60813:51;;;:6;:51;;;;60806:58;;;;;60650:620;61254:4;61247:11;;60478:799;;;;;;;:::o;4988:224::-;5056:13;5119:1;5113:4;5106:15;5148:1;5142:4;5135:15;5189:4;5183;5173:21;5164:30;;4988:224;;;;:::o;56621:321::-;56751:18;56757:2;56761:7;56751:5;:18::i;:::-;56802:54;56833:1;56837:2;56841:7;56850:5;56802:22;:54::i;:::-;56780:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;56621:321;;;:::o;31092:387::-;31152:4;31360:12;31427:7;31415:20;31407:28;;31470:1;31463:4;:8;31456:15;;;31092:387;;;:::o;57278:382::-;57372:1;57358:16;;:2;:16;;;;57350:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57431:16;57439:7;57431;:16::i;:::-;57430:17;57422:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57493:45;57522:1;57526:2;57530:7;57493:20;:45::i;:::-;57568:1;57551:9;:13;57561:2;57551:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;57599:2;57580:7;:16;57588:7;57580:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57644:7;57640:2;57619:33;;57636:1;57619:33;;;;;;;;;;;;57278:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:704::-;6451:6;6459;6467;6516:2;6504:9;6495:7;6491:23;6487:32;6484:119;;;6522:79;;:::i;:::-;6484:119;6670:1;6659:9;6655:17;6642:31;6700:18;6692:6;6689:30;6686:117;;;6722:79;;:::i;:::-;6686:117;6835:80;6907:7;6898:6;6887:9;6883:22;6835:80;:::i;:::-;6817:98;;;;6613:312;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6356:704;;;;;:::o;7066:323::-;7122:6;7171:2;7159:9;7150:7;7146:23;7142:32;7139:119;;;7177:79;;:::i;:::-;7139:119;7297:1;7322:50;7364:7;7355:6;7344:9;7340:22;7322:50;:::i;:::-;7312:60;;7268:114;7066:323;;;;:::o;7395:329::-;7454:6;7503:2;7491:9;7482:7;7478:23;7474:32;7471:119;;;7509:79;;:::i;:::-;7471:119;7629:1;7654:53;7699:7;7690:6;7679:9;7675:22;7654:53;:::i;:::-;7644:63;;7600:117;7395:329;;;;:::o;7730:327::-;7788:6;7837:2;7825:9;7816:7;7812:23;7808:32;7805:119;;;7843:79;;:::i;:::-;7805:119;7963:1;7988:52;8032:7;8023:6;8012:9;8008:22;7988:52;:::i;:::-;7978:62;;7934:116;7730:327;;;;:::o;8063:349::-;8132:6;8181:2;8169:9;8160:7;8156:23;8152:32;8149:119;;;8187:79;;:::i;:::-;8149:119;8307:1;8332:63;8387:7;8378:6;8367:9;8363:22;8332:63;:::i;:::-;8322:73;;8278:127;8063:349;;;;:::o;8418:509::-;8487:6;8536:2;8524:9;8515:7;8511:23;8507:32;8504:119;;;8542:79;;:::i;:::-;8504:119;8690:1;8679:9;8675:17;8662:31;8720:18;8712:6;8709:30;8706:117;;;8742:79;;:::i;:::-;8706:117;8847:63;8902:7;8893:6;8882:9;8878:22;8847:63;:::i;:::-;8837:73;;8633:287;8418:509;;;;:::o;8933:329::-;8992:6;9041:2;9029:9;9020:7;9016:23;9012:32;9009:119;;;9047:79;;:::i;:::-;9009:119;9167:1;9192:53;9237:7;9228:6;9217:9;9213:22;9192:53;:::i;:::-;9182:63;;9138:117;8933:329;;;;:::o;9268:474::-;9336:6;9344;9393:2;9381:9;9372:7;9368:23;9364:32;9361:119;;;9399:79;;:::i;:::-;9361:119;9519:1;9544:53;9589:7;9580:6;9569:9;9565:22;9544:53;:::i;:::-;9534:63;;9490:117;9646:2;9672:53;9717:7;9708:6;9697:9;9693:22;9672:53;:::i;:::-;9662:63;;9617:118;9268:474;;;;;:::o;9748:179::-;9817:10;9838:46;9880:3;9872:6;9838:46;:::i;:::-;9916:4;9911:3;9907:14;9893:28;;9748:179;;;;:::o;9933:118::-;10020:24;10038:5;10020:24;:::i;:::-;10015:3;10008:37;9933:118;;:::o;10057:157::-;10162:45;10182:24;10200:5;10182:24;:::i;:::-;10162:45;:::i;:::-;10157:3;10150:58;10057:157;;:::o;10250:732::-;10369:3;10398:54;10446:5;10398:54;:::i;:::-;10468:86;10547:6;10542:3;10468:86;:::i;:::-;10461:93;;10578:56;10628:5;10578:56;:::i;:::-;10657:7;10688:1;10673:284;10698:6;10695:1;10692:13;10673:284;;;10774:6;10768:13;10801:63;10860:3;10845:13;10801:63;:::i;:::-;10794:70;;10887:60;10940:6;10887:60;:::i;:::-;10877:70;;10733:224;10720:1;10717;10713:9;10708:14;;10673:284;;;10677:14;10973:3;10966:10;;10374:608;;;10250:732;;;;:::o;10988:109::-;11069:21;11084:5;11069:21;:::i;:::-;11064:3;11057:34;10988:109;;:::o;11103:118::-;11190:24;11208:5;11190:24;:::i;:::-;11185:3;11178:37;11103:118;;:::o;11227:360::-;11313:3;11341:38;11373:5;11341:38;:::i;:::-;11395:70;11458:6;11453:3;11395:70;:::i;:::-;11388:77;;11474:52;11519:6;11514:3;11507:4;11500:5;11496:16;11474:52;:::i;:::-;11551:29;11573:6;11551:29;:::i;:::-;11546:3;11542:39;11535:46;;11317:270;11227:360;;;;:::o;11593:364::-;11681:3;11709:39;11742:5;11709:39;:::i;:::-;11764:71;11828:6;11823:3;11764:71;:::i;:::-;11757:78;;11844:52;11889:6;11884:3;11877:4;11870:5;11866:16;11844:52;:::i;:::-;11921:29;11943:6;11921:29;:::i;:::-;11916:3;11912:39;11905:46;;11685:272;11593:364;;;;:::o;11963:377::-;12069:3;12097:39;12130:5;12097:39;:::i;:::-;12152:89;12234:6;12229:3;12152:89;:::i;:::-;12145:96;;12250:52;12295:6;12290:3;12283:4;12276:5;12272:16;12250:52;:::i;:::-;12327:6;12322:3;12318:16;12311:23;;12073:267;11963:377;;;;:::o;12370:845::-;12473:3;12510:5;12504:12;12539:36;12565:9;12539:36;:::i;:::-;12591:89;12673:6;12668:3;12591:89;:::i;:::-;12584:96;;12711:1;12700:9;12696:17;12727:1;12722:137;;;;12873:1;12868:341;;;;12689:520;;12722:137;12806:4;12802:9;12791;12787:25;12782:3;12775:38;12842:6;12837:3;12833:16;12826:23;;12722:137;;12868:341;12935:38;12967:5;12935:38;:::i;:::-;12995:1;13009:154;13023:6;13020:1;13017:13;13009:154;;;13097:7;13091:14;13087:1;13082:3;13078:11;13071:35;13147:1;13138:7;13134:15;13123:26;;13045:4;13042:1;13038:12;13033:17;;13009:154;;;13192:6;13187:3;13183:16;13176:23;;12875:334;;12689:520;;12477:738;;12370:845;;;;:::o;13221:366::-;13363:3;13384:67;13448:2;13443:3;13384:67;:::i;:::-;13377:74;;13460:93;13549:3;13460:93;:::i;:::-;13578:2;13573:3;13569:12;13562:19;;13221:366;;;:::o;13593:::-;13735:3;13756:67;13820:2;13815:3;13756:67;:::i;:::-;13749:74;;13832:93;13921:3;13832:93;:::i;:::-;13950:2;13945:3;13941:12;13934:19;;13593:366;;;:::o;13965:::-;14107:3;14128:67;14192:2;14187:3;14128:67;:::i;:::-;14121:74;;14204:93;14293:3;14204:93;:::i;:::-;14322:2;14317:3;14313:12;14306:19;;13965:366;;;:::o;14337:::-;14479:3;14500:67;14564:2;14559:3;14500:67;:::i;:::-;14493:74;;14576:93;14665:3;14576:93;:::i;:::-;14694:2;14689:3;14685:12;14678:19;;14337:366;;;:::o;14709:::-;14851:3;14872:67;14936:2;14931:3;14872:67;:::i;:::-;14865:74;;14948:93;15037:3;14948:93;:::i;:::-;15066:2;15061:3;15057:12;15050:19;;14709:366;;;:::o;15081:::-;15223:3;15244:67;15308:2;15303:3;15244:67;:::i;:::-;15237:74;;15320:93;15409:3;15320:93;:::i;:::-;15438:2;15433:3;15429:12;15422:19;;15081:366;;;:::o;15453:::-;15595:3;15616:67;15680:2;15675:3;15616:67;:::i;:::-;15609:74;;15692:93;15781:3;15692:93;:::i;:::-;15810:2;15805:3;15801:12;15794:19;;15453:366;;;:::o;15825:::-;15967:3;15988:67;16052:2;16047:3;15988:67;:::i;:::-;15981:74;;16064:93;16153:3;16064:93;:::i;:::-;16182:2;16177:3;16173:12;16166:19;;15825:366;;;:::o;16197:::-;16339:3;16360:67;16424:2;16419:3;16360:67;:::i;:::-;16353:74;;16436:93;16525:3;16436:93;:::i;:::-;16554:2;16549:3;16545:12;16538:19;;16197:366;;;:::o;16569:::-;16711:3;16732:67;16796:2;16791:3;16732:67;:::i;:::-;16725:74;;16808:93;16897:3;16808:93;:::i;:::-;16926:2;16921:3;16917:12;16910:19;;16569:366;;;:::o;16941:::-;17083:3;17104:67;17168:2;17163:3;17104:67;:::i;:::-;17097:74;;17180:93;17269:3;17180:93;:::i;:::-;17298:2;17293:3;17289:12;17282:19;;16941:366;;;:::o;17313:::-;17455:3;17476:67;17540:2;17535:3;17476:67;:::i;:::-;17469:74;;17552:93;17641:3;17552:93;:::i;:::-;17670:2;17665:3;17661:12;17654:19;;17313:366;;;:::o;17685:::-;17827:3;17848:67;17912:2;17907:3;17848:67;:::i;:::-;17841:74;;17924:93;18013:3;17924:93;:::i;:::-;18042:2;18037:3;18033:12;18026:19;;17685:366;;;:::o;18057:::-;18199:3;18220:67;18284:2;18279:3;18220:67;:::i;:::-;18213:74;;18296:93;18385:3;18296:93;:::i;:::-;18414:2;18409:3;18405:12;18398:19;;18057:366;;;:::o;18429:::-;18571:3;18592:67;18656:2;18651:3;18592:67;:::i;:::-;18585:74;;18668:93;18757:3;18668:93;:::i;:::-;18786:2;18781:3;18777:12;18770:19;;18429:366;;;:::o;18801:::-;18943:3;18964:67;19028:2;19023:3;18964:67;:::i;:::-;18957:74;;19040:93;19129:3;19040:93;:::i;:::-;19158:2;19153:3;19149:12;19142:19;;18801:366;;;:::o;19173:::-;19315:3;19336:67;19400:2;19395:3;19336:67;:::i;:::-;19329:74;;19412:93;19501:3;19412:93;:::i;:::-;19530:2;19525:3;19521:12;19514:19;;19173:366;;;:::o;19545:::-;19687:3;19708:67;19772:2;19767:3;19708:67;:::i;:::-;19701:74;;19784:93;19873:3;19784:93;:::i;:::-;19902:2;19897:3;19893:12;19886:19;;19545:366;;;:::o;19917:::-;20059:3;20080:67;20144:2;20139:3;20080:67;:::i;:::-;20073:74;;20156:93;20245:3;20156:93;:::i;:::-;20274:2;20269:3;20265:12;20258:19;;19917:366;;;:::o;20289:::-;20431:3;20452:67;20516:2;20511:3;20452:67;:::i;:::-;20445:74;;20528:93;20617:3;20528:93;:::i;:::-;20646:2;20641:3;20637:12;20630:19;;20289:366;;;:::o;20661:398::-;20820:3;20841:83;20922:1;20917:3;20841:83;:::i;:::-;20834:90;;20933:93;21022:3;20933:93;:::i;:::-;21051:1;21046:3;21042:11;21035:18;;20661:398;;;:::o;21065:366::-;21207:3;21228:67;21292:2;21287:3;21228:67;:::i;:::-;21221:74;;21304:93;21393:3;21304:93;:::i;:::-;21422:2;21417:3;21413:12;21406:19;;21065:366;;;:::o;21437:::-;21579:3;21600:67;21664:2;21659:3;21600:67;:::i;:::-;21593:74;;21676:93;21765:3;21676:93;:::i;:::-;21794:2;21789:3;21785:12;21778:19;;21437:366;;;:::o;21809:::-;21951:3;21972:67;22036:2;22031:3;21972:67;:::i;:::-;21965:74;;22048:93;22137:3;22048:93;:::i;:::-;22166:2;22161:3;22157:12;22150:19;;21809:366;;;:::o;22181:::-;22323:3;22344:67;22408:2;22403:3;22344:67;:::i;:::-;22337:74;;22420:93;22509:3;22420:93;:::i;:::-;22538:2;22533:3;22529:12;22522:19;;22181:366;;;:::o;22553:108::-;22630:24;22648:5;22630:24;:::i;:::-;22625:3;22618:37;22553:108;;:::o;22667:118::-;22754:24;22772:5;22754:24;:::i;:::-;22749:3;22742:37;22667:118;;:::o;22791:112::-;22874:22;22890:5;22874:22;:::i;:::-;22869:3;22862:35;22791:112;;:::o;22909:256::-;23021:3;23036:75;23107:3;23098:6;23036:75;:::i;:::-;23136:2;23131:3;23127:12;23120:19;;23156:3;23149:10;;22909:256;;;;:::o;23171:589::-;23396:3;23418:95;23509:3;23500:6;23418:95;:::i;:::-;23411:102;;23530:95;23621:3;23612:6;23530:95;:::i;:::-;23523:102;;23642:92;23730:3;23721:6;23642:92;:::i;:::-;23635:99;;23751:3;23744:10;;23171:589;;;;;;:::o;23766:379::-;23950:3;23972:147;24115:3;23972:147;:::i;:::-;23965:154;;24136:3;24129:10;;23766:379;;;:::o;24151:222::-;24244:4;24282:2;24271:9;24267:18;24259:26;;24295:71;24363:1;24352:9;24348:17;24339:6;24295:71;:::i;:::-;24151:222;;;;:::o;24379:640::-;24574:4;24612:3;24601:9;24597:19;24589:27;;24626:71;24694:1;24683:9;24679:17;24670:6;24626:71;:::i;:::-;24707:72;24775:2;24764:9;24760:18;24751:6;24707:72;:::i;:::-;24789;24857:2;24846:9;24842:18;24833:6;24789:72;:::i;:::-;24908:9;24902:4;24898:20;24893:2;24882:9;24878:18;24871:48;24936:76;25007:4;24998:6;24936:76;:::i;:::-;24928:84;;24379:640;;;;;;;:::o;25025:373::-;25168:4;25206:2;25195:9;25191:18;25183:26;;25255:9;25249:4;25245:20;25241:1;25230:9;25226:17;25219:47;25283:108;25386:4;25377:6;25283:108;:::i;:::-;25275:116;;25025:373;;;;:::o;25404:210::-;25491:4;25529:2;25518:9;25514:18;25506:26;;25542:65;25604:1;25593:9;25589:17;25580:6;25542:65;:::i;:::-;25404:210;;;;:::o;25620:222::-;25713:4;25751:2;25740:9;25736:18;25728:26;;25764:71;25832:1;25821:9;25817:17;25808:6;25764:71;:::i;:::-;25620:222;;;;:::o;25848:313::-;25961:4;25999:2;25988:9;25984:18;25976:26;;26048:9;26042:4;26038:20;26034:1;26023:9;26019:17;26012:47;26076:78;26149:4;26140:6;26076:78;:::i;:::-;26068:86;;25848:313;;;;:::o;26167:419::-;26333:4;26371:2;26360:9;26356:18;26348:26;;26420:9;26414:4;26410:20;26406:1;26395:9;26391:17;26384:47;26448:131;26574:4;26448:131;:::i;:::-;26440:139;;26167:419;;;:::o;26592:::-;26758:4;26796:2;26785:9;26781:18;26773:26;;26845:9;26839:4;26835:20;26831:1;26820:9;26816:17;26809:47;26873:131;26999:4;26873:131;:::i;:::-;26865:139;;26592:419;;;:::o;27017:::-;27183:4;27221:2;27210:9;27206:18;27198:26;;27270:9;27264:4;27260:20;27256:1;27245:9;27241:17;27234:47;27298:131;27424:4;27298:131;:::i;:::-;27290:139;;27017:419;;;:::o;27442:::-;27608:4;27646:2;27635:9;27631:18;27623:26;;27695:9;27689:4;27685:20;27681:1;27670:9;27666:17;27659:47;27723:131;27849:4;27723:131;:::i;:::-;27715:139;;27442:419;;;:::o;27867:::-;28033:4;28071:2;28060:9;28056:18;28048:26;;28120:9;28114:4;28110:20;28106:1;28095:9;28091:17;28084:47;28148:131;28274:4;28148:131;:::i;:::-;28140:139;;27867:419;;;:::o;28292:::-;28458:4;28496:2;28485:9;28481:18;28473:26;;28545:9;28539:4;28535:20;28531:1;28520:9;28516:17;28509:47;28573:131;28699:4;28573:131;:::i;:::-;28565:139;;28292:419;;;:::o;28717:::-;28883:4;28921:2;28910:9;28906:18;28898:26;;28970:9;28964:4;28960:20;28956:1;28945:9;28941:17;28934:47;28998:131;29124:4;28998:131;:::i;:::-;28990:139;;28717:419;;;:::o;29142:::-;29308:4;29346:2;29335:9;29331:18;29323:26;;29395:9;29389:4;29385:20;29381:1;29370:9;29366:17;29359:47;29423:131;29549:4;29423:131;:::i;:::-;29415:139;;29142:419;;;:::o;29567:::-;29733:4;29771:2;29760:9;29756:18;29748:26;;29820:9;29814:4;29810:20;29806:1;29795:9;29791:17;29784:47;29848:131;29974:4;29848:131;:::i;:::-;29840:139;;29567:419;;;:::o;29992:::-;30158:4;30196:2;30185:9;30181:18;30173:26;;30245:9;30239:4;30235:20;30231:1;30220:9;30216:17;30209:47;30273:131;30399:4;30273:131;:::i;:::-;30265:139;;29992:419;;;:::o;30417:::-;30583:4;30621:2;30610:9;30606:18;30598:26;;30670:9;30664:4;30660:20;30656:1;30645:9;30641:17;30634:47;30698:131;30824:4;30698:131;:::i;:::-;30690:139;;30417:419;;;:::o;30842:::-;31008:4;31046:2;31035:9;31031:18;31023:26;;31095:9;31089:4;31085:20;31081:1;31070:9;31066:17;31059:47;31123:131;31249:4;31123:131;:::i;:::-;31115:139;;30842:419;;;:::o;31267:::-;31433:4;31471:2;31460:9;31456:18;31448:26;;31520:9;31514:4;31510:20;31506:1;31495:9;31491:17;31484:47;31548:131;31674:4;31548:131;:::i;:::-;31540:139;;31267:419;;;:::o;31692:::-;31858:4;31896:2;31885:9;31881:18;31873:26;;31945:9;31939:4;31935:20;31931:1;31920:9;31916:17;31909:47;31973:131;32099:4;31973:131;:::i;:::-;31965:139;;31692:419;;;:::o;32117:::-;32283:4;32321:2;32310:9;32306:18;32298:26;;32370:9;32364:4;32360:20;32356:1;32345:9;32341:17;32334:47;32398:131;32524:4;32398:131;:::i;:::-;32390:139;;32117:419;;;:::o;32542:::-;32708:4;32746:2;32735:9;32731:18;32723:26;;32795:9;32789:4;32785:20;32781:1;32770:9;32766:17;32759:47;32823:131;32949:4;32823:131;:::i;:::-;32815:139;;32542:419;;;:::o;32967:::-;33133:4;33171:2;33160:9;33156:18;33148:26;;33220:9;33214:4;33210:20;33206:1;33195:9;33191:17;33184:47;33248:131;33374:4;33248:131;:::i;:::-;33240:139;;32967:419;;;:::o;33392:::-;33558:4;33596:2;33585:9;33581:18;33573:26;;33645:9;33639:4;33635:20;33631:1;33620:9;33616:17;33609:47;33673:131;33799:4;33673:131;:::i;:::-;33665:139;;33392:419;;;:::o;33817:::-;33983:4;34021:2;34010:9;34006:18;33998:26;;34070:9;34064:4;34060:20;34056:1;34045:9;34041:17;34034:47;34098:131;34224:4;34098:131;:::i;:::-;34090:139;;33817:419;;;:::o;34242:::-;34408:4;34446:2;34435:9;34431:18;34423:26;;34495:9;34489:4;34485:20;34481:1;34470:9;34466:17;34459:47;34523:131;34649:4;34523:131;:::i;:::-;34515:139;;34242:419;;;:::o;34667:::-;34833:4;34871:2;34860:9;34856:18;34848:26;;34920:9;34914:4;34910:20;34906:1;34895:9;34891:17;34884:47;34948:131;35074:4;34948:131;:::i;:::-;34940:139;;34667:419;;;:::o;35092:::-;35258:4;35296:2;35285:9;35281:18;35273:26;;35345:9;35339:4;35335:20;35331:1;35320:9;35316:17;35309:47;35373:131;35499:4;35373:131;:::i;:::-;35365:139;;35092:419;;;:::o;35517:::-;35683:4;35721:2;35710:9;35706:18;35698:26;;35770:9;35764:4;35760:20;35756:1;35745:9;35741:17;35734:47;35798:131;35924:4;35798:131;:::i;:::-;35790:139;;35517:419;;;:::o;35942:::-;36108:4;36146:2;36135:9;36131:18;36123:26;;36195:9;36189:4;36185:20;36181:1;36170:9;36166:17;36159:47;36223:131;36349:4;36223:131;:::i;:::-;36215:139;;35942:419;;;:::o;36367:222::-;36460:4;36498:2;36487:9;36483:18;36475:26;;36511:71;36579:1;36568:9;36564:17;36555:6;36511:71;:::i;:::-;36367:222;;;;:::o;36595:214::-;36684:4;36722:2;36711:9;36707:18;36699:26;;36735:67;36799:1;36788:9;36784:17;36775:6;36735:67;:::i;:::-;36595:214;;;;:::o;36815:129::-;36849:6;36876:20;;:::i;:::-;36866:30;;36905:33;36933:4;36925:6;36905:33;:::i;:::-;36815:129;;;:::o;36950:75::-;36983:6;37016:2;37010:9;37000:19;;36950:75;:::o;37031:307::-;37092:4;37182:18;37174:6;37171:30;37168:56;;;37204:18;;:::i;:::-;37168:56;37242:29;37264:6;37242:29;:::i;:::-;37234:37;;37326:4;37320;37316:15;37308:23;;37031:307;;;:::o;37344:308::-;37406:4;37496:18;37488:6;37485:30;37482:56;;;37518:18;;:::i;:::-;37482:56;37556:29;37578:6;37556:29;:::i;:::-;37548:37;;37640:4;37634;37630:15;37622:23;;37344:308;;;:::o;37658:132::-;37725:4;37748:3;37740:11;;37778:4;37773:3;37769:14;37761:22;;37658:132;;;:::o;37796:141::-;37845:4;37868:3;37860:11;;37891:3;37888:1;37881:14;37925:4;37922:1;37912:18;37904:26;;37796:141;;;:::o;37943:114::-;38010:6;38044:5;38038:12;38028:22;;37943:114;;;:::o;38063:98::-;38114:6;38148:5;38142:12;38132:22;;38063:98;;;:::o;38167:99::-;38219:6;38253:5;38247:12;38237:22;;38167:99;;;:::o;38272:113::-;38342:4;38374;38369:3;38365:14;38357:22;;38272:113;;;:::o;38391:184::-;38490:11;38524:6;38519:3;38512:19;38564:4;38559:3;38555:14;38540:29;;38391:184;;;;:::o;38581:168::-;38664:11;38698:6;38693:3;38686:19;38738:4;38733:3;38729:14;38714:29;;38581:168;;;;:::o;38755:147::-;38856:11;38893:3;38878:18;;38755:147;;;;:::o;38908:169::-;38992:11;39026:6;39021:3;39014:19;39066:4;39061:3;39057:14;39042:29;;38908:169;;;;:::o;39083:148::-;39185:11;39222:3;39207:18;;39083:148;;;;:::o;39237:305::-;39277:3;39296:20;39314:1;39296:20;:::i;:::-;39291:25;;39330:20;39348:1;39330:20;:::i;:::-;39325:25;;39484:1;39416:66;39412:74;39409:1;39406:81;39403:107;;;39490:18;;:::i;:::-;39403:107;39534:1;39531;39527:9;39520:16;;39237:305;;;;:::o;39548:185::-;39588:1;39605:20;39623:1;39605:20;:::i;:::-;39600:25;;39639:20;39657:1;39639:20;:::i;:::-;39634:25;;39678:1;39668:35;;39683:18;;:::i;:::-;39668:35;39725:1;39722;39718:9;39713:14;;39548:185;;;;:::o;39739:191::-;39779:4;39799:20;39817:1;39799:20;:::i;:::-;39794:25;;39833:20;39851:1;39833:20;:::i;:::-;39828:25;;39872:1;39869;39866:8;39863:34;;;39877:18;;:::i;:::-;39863:34;39922:1;39919;39915:9;39907:17;;39739:191;;;;:::o;39936:96::-;39973:7;40002:24;40020:5;40002:24;:::i;:::-;39991:35;;39936:96;;;:::o;40038:90::-;40072:7;40115:5;40108:13;40101:21;40090:32;;40038:90;;;:::o;40134:77::-;40171:7;40200:5;40189:16;;40134:77;;;:::o;40217:149::-;40253:7;40293:66;40286:5;40282:78;40271:89;;40217:149;;;:::o;40372:126::-;40409:7;40449:42;40442:5;40438:54;40427:65;;40372:126;;;:::o;40504:77::-;40541:7;40570:5;40559:16;;40504:77;;;:::o;40587:86::-;40622:7;40662:4;40655:5;40651:16;40640:27;;40587:86;;;:::o;40679:154::-;40763:6;40758:3;40753;40740:30;40825:1;40816:6;40811:3;40807:16;40800:27;40679:154;;;:::o;40839:307::-;40907:1;40917:113;40931:6;40928:1;40925:13;40917:113;;;41016:1;41011:3;41007:11;41001:18;40997:1;40992:3;40988:11;40981:39;40953:2;40950:1;40946:10;40941:15;;40917:113;;;41048:6;41045:1;41042:13;41039:101;;;41128:1;41119:6;41114:3;41110:16;41103:27;41039:101;40888:258;40839:307;;;:::o;41152:320::-;41196:6;41233:1;41227:4;41223:12;41213:22;;41280:1;41274:4;41270:12;41301:18;41291:81;;41357:4;41349:6;41345:17;41335:27;;41291:81;41419:2;41411:6;41408:14;41388:18;41385:38;41382:84;;;41438:18;;:::i;:::-;41382:84;41203:269;41152:320;;;:::o;41478:281::-;41561:27;41583:4;41561:27;:::i;:::-;41553:6;41549:40;41691:6;41679:10;41676:22;41655:18;41643:10;41640:34;41637:62;41634:88;;;41702:18;;:::i;:::-;41634:88;41742:10;41738:2;41731:22;41521:238;41478:281;;:::o;41765:233::-;41804:3;41827:24;41845:5;41827:24;:::i;:::-;41818:33;;41873:66;41866:5;41863:77;41860:103;;;41943:18;;:::i;:::-;41860:103;41990:1;41983:5;41979:13;41972:20;;41765:233;;;:::o;42004:100::-;42043:7;42072:26;42092:5;42072:26;:::i;:::-;42061:37;;42004:100;;;:::o;42110:94::-;42149:7;42178:20;42192:5;42178:20;:::i;:::-;42167:31;;42110:94;;;:::o;42210:176::-;42242:1;42259:20;42277:1;42259:20;:::i;:::-;42254:25;;42293:20;42311:1;42293:20;:::i;:::-;42288:25;;42332:1;42322:35;;42337:18;;:::i;:::-;42322:35;42378:1;42375;42371:9;42366:14;;42210:176;;;;:::o;42392:180::-;42440:77;42437:1;42430:88;42537:4;42534:1;42527:15;42561:4;42558:1;42551:15;42578:180;42626:77;42623:1;42616:88;42723:4;42720:1;42713:15;42747:4;42744:1;42737:15;42764:180;42812:77;42809:1;42802:88;42909:4;42906:1;42899:15;42933:4;42930:1;42923:15;42950:180;42998:77;42995:1;42988:88;43095:4;43092:1;43085:15;43119:4;43116:1;43109:15;43136:180;43184:77;43181:1;43174:88;43281:4;43278:1;43271:15;43305:4;43302:1;43295:15;43322:117;43431:1;43428;43421:12;43445:117;43554:1;43551;43544:12;43568:117;43677:1;43674;43667:12;43691:117;43800:1;43797;43790:12;43814:117;43923:1;43920;43913:12;43937:117;44046:1;44043;44036:12;44060:102;44101:6;44152:2;44148:7;44143:2;44136:5;44132:14;44128:28;44118:38;;44060:102;;;:::o;44168:94::-;44201:8;44249:5;44245:2;44241:14;44220:35;;44168:94;;;:::o;44268:177::-;44408:29;44404:1;44396:6;44392:14;44385:53;44268:177;:::o;44451:237::-;44591:34;44587:1;44579:6;44575:14;44568:58;44660:20;44655:2;44647:6;44643:15;44636:45;44451:237;:::o;44694:225::-;44834:34;44830:1;44822:6;44818:14;44811:58;44903:8;44898:2;44890:6;44886:15;44879:33;44694:225;:::o;44925:178::-;45065:30;45061:1;45053:6;45049:14;45042:54;44925:178;:::o;45109:173::-;45249:25;45245:1;45237:6;45233:14;45226:49;45109:173;:::o;45288:178::-;45428:30;45424:1;45416:6;45412:14;45405:54;45288:178;:::o;45472:223::-;45612:34;45608:1;45600:6;45596:14;45589:58;45681:6;45676:2;45668:6;45664:15;45657:31;45472:223;:::o;45701:175::-;45841:27;45837:1;45829:6;45825:14;45818:51;45701:175;:::o;45882:231::-;46022:34;46018:1;46010:6;46006:14;45999:58;46091:14;46086:2;46078:6;46074:15;46067:39;45882:231;:::o;46119:243::-;46259:34;46255:1;46247:6;46243:14;46236:58;46328:26;46323:2;46315:6;46311:15;46304:51;46119:243;:::o;46368:229::-;46508:34;46504:1;46496:6;46492:14;46485:58;46577:12;46572:2;46564:6;46560:15;46553:37;46368:229;:::o;46603:228::-;46743:34;46739:1;46731:6;46727:14;46720:58;46812:11;46807:2;46799:6;46795:15;46788:36;46603:228;:::o;46837:182::-;46977:34;46973:1;46965:6;46961:14;46954:58;46837:182;:::o;47025:174::-;47165:26;47161:1;47153:6;47149:14;47142:50;47025:174;:::o;47205:231::-;47345:34;47341:1;47333:6;47329:14;47322:58;47414:14;47409:2;47401:6;47397:15;47390:39;47205:231;:::o;47442:182::-;47582:34;47578:1;47570:6;47566:14;47559:58;47442:182;:::o;47630:173::-;47770:25;47766:1;47758:6;47754:14;47747:49;47630:173;:::o;47809:228::-;47949:34;47945:1;47937:6;47933:14;47926:58;48018:11;48013:2;48005:6;48001:15;47994:36;47809:228;:::o;48043:234::-;48183:34;48179:1;48171:6;48167:14;48160:58;48252:17;48247:2;48239:6;48235:15;48228:42;48043:234;:::o;48283:220::-;48423:34;48419:1;48411:6;48407:14;48400:58;48492:3;48487:2;48479:6;48475:15;48468:28;48283:220;:::o;48509:114::-;;:::o;48629:170::-;48769:22;48765:1;48757:6;48753:14;48746:46;48629:170;:::o;48805:236::-;48945:34;48941:1;48933:6;48929:14;48922:58;49014:19;49009:2;49001:6;48997:15;48990:44;48805:236;:::o;49047:164::-;49187:16;49183:1;49175:6;49171:14;49164:40;49047:164;:::o;49217:181::-;49357:33;49353:1;49345:6;49341:14;49334:57;49217:181;:::o;49404:122::-;49477:24;49495:5;49477:24;:::i;:::-;49470:5;49467:35;49457:63;;49516:1;49513;49506:12;49457:63;49404:122;:::o;49532:116::-;49602:21;49617:5;49602:21;:::i;:::-;49595:5;49592:32;49582:60;;49638:1;49635;49628:12;49582:60;49532:116;:::o;49654:122::-;49727:24;49745:5;49727:24;:::i;:::-;49720:5;49717:35;49707:63;;49766:1;49763;49756:12;49707:63;49654:122;:::o;49782:120::-;49854:23;49871:5;49854:23;:::i;:::-;49847:5;49844:34;49834:62;;49892:1;49889;49882:12;49834:62;49782:120;:::o;49908:122::-;49981:24;49999:5;49981:24;:::i;:::-;49974:5;49971:35;49961:63;;50020:1;50017;50010:12;49961:63;49908:122;:::o

Swarm Source

ipfs://53ef96a9f9e686ee4b259b9c58219996a3950f153981e22e0d1c4812d355b946
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.