ETH Price: $3,359.47 (+0.24%)

Token

DegenWaifus (DW)
 

Overview

Max Total Supply

2,261 DW

Holders

494

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 DW
0xfea62dede50e13e50156bf2c3422e4ef14a696d6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The most degenerated Waifus on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DegenWaifus

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-16
*/

// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts v4.4.0 (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;
    }
}

// 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;
    }
}

// OpenZeppelin Contracts v4.4.0 (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);
}

// OpenZeppelin Contracts v4.4.0 (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;
}

// OpenZeppelin Contracts v4.4.0 (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);
}

// OpenZeppelin Contracts v4.4.0 (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);
}

// OpenZeppelin Contracts v4.4.0 (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);
}

// OpenZeppelin Contracts v4.4.0 (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;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.6;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

// OpenZeppelin Contracts v4.4.0 (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);
    }
}

pragma solidity ^0.8.7;

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    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 (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

    /**
     * @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 {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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 tokenId < _owners.length && _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);
        _owners.push(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);
        _owners[tokenId] = address(0);

        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);
        _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 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 {}
}

pragma solidity ^0.8.7;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < _owners.length, "ERC721Enumerable: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

// OpenZeppelin Contracts v4.4.0 (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);
    }
}
pragma solidity ^0.8.11;
pragma abicoder v2;


contract DegenWaifus is ERC721Enumerable, Ownable, ReentrancyGuard {
  using SafeMath for uint256;
  
  mapping(address => uint256) private         freeNFT;
  mapping(address => uint256) private         mintedTokens;
  bool                        public          saleIsActive = true;
  string                      public          final_provenance = "";
  address                     public          proxyRegistryAddress;
  mapping(address => bool)    public          projectProxy;
  string                      public          baseURI;
  string                      public constant baseUriSuffix = ".json";
  uint256                     public constant TOKEN_PRICE = 20000000000000000;
  uint256                     public constant MAX_NFT_PER_TX = 11;
  uint256                     public constant MAX_NFT = 4444;
  uint256                     public constant MAX_NFT_PER_BUYER = 11;
  uint256                     public constant FREE_NFT = 1111;
  address                     public constant DEV_ADDRESS = 0xE3cc957C3a1AC0eB137B50a855e30FED80CcD30c;
  address                     public constant OWNER_ADDRESS = 0xEEEE451963d5A81C9D94776C9519ABb6b6342Ad5;
    
  constructor() ERC721("DegenWaifus", "DW") {
    setBaseURI("ipfs://QmWbz5xr1Gf5EYNQjT5HeDm3j3DDUm2GasFRwyURiZvQxr/");
    proxyRegistryAddress = address(0xa5409ec958C83C3f309868babACA7c86DCB077c1);
  }
    
  function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner {
    proxyRegistryAddress = _proxyRegistryAddress;
  }
  
  function flipProxyState(address proxyAddress) public onlyOwner {
    projectProxy[proxyAddress] = !projectProxy[proxyAddress];
  }

  function tokenURI(uint256 _tokenId) external view returns (string memory) {
    require(_exists(_tokenId), "Token does not exist.");
    return string(abi.encodePacked(baseURI, Strings.toString(_tokenId), baseUriSuffix));
  }


  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    final_provenance = provenanceHash;
  }

  function setBaseURI(string memory _baseURI) public onlyOwner {
    baseURI = _baseURI;
  }

  function flipSaleState() public onlyOwner {
    saleIsActive = !saleIsActive;
  }
  
  
  function freeMint(uint numberOfTokens) public nonReentrant {
    require(saleIsActive, "Sale must be active to mint");
    require(freeNFT[msg.sender].add(numberOfTokens) < MAX_NFT_PER_BUYER, "Your mint would exceed the total of 10 Waifus allowed for free.");
    require(totalSupply().add(numberOfTokens) < FREE_NFT, "Purchase would exceed free supply");
    
    for(uint i = 0; i < numberOfTokens; i++) {
      _safeMint(msg.sender, totalSupply());
    }

    freeNFT[msg.sender] += numberOfTokens;
    mintedTokens[msg.sender] += numberOfTokens;
  }
  
  
  function mintToken(uint numberOfTokens) public payable nonReentrant {
    require(saleIsActive, "Sale must be active to mint");
    require(numberOfTokens > 0, "You must mint atleast 1 NFT.");
    require(numberOfTokens < MAX_NFT_PER_TX, "Only 10 NFTs mintable per transaction.");
    require(mintedTokens[msg.sender].add(numberOfTokens) < MAX_NFT_PER_BUYER, "Your mint would exceed the total of 10 nfts allowed for per wallet.");
    require(totalSupply().add(numberOfTokens) < MAX_NFT, "Purchase would exceed max supply");
    require(msg.value == TOKEN_PRICE.mul(numberOfTokens), "Wrong ether value");
    
    for(uint i = 0; i < numberOfTokens; i++) {
      _safeMint(msg.sender, totalSupply());
    }
  }


  function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
      // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_owner, index);
      }
      return result;
    }
  }

  function isApprovedForAll(address _owner, address operator) public view override returns (bool) {
    OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress);
    if (address(proxyRegistry.proxies(_owner)) == operator || projectProxy[operator]) return true;
    return super.isApprovedForAll(_owner, operator);
  }

    function withdraw() public onlyOwner nonReentrant {
    require(msg.sender == owner(), "Invalid sender");

    (bool dev, ) = DEV_ADDRESS.call{value: address(this).balance * 10/100}("");
    require(dev);

    (bool owner, ) = OWNER_ADDRESS.call{value: address(this).balance}("");
    require(owner);

  }
}

contract OwnableDelegateProxy {}
contract OpenSeaProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

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":[],"name":"DEV_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PER_BUYER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"final_provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600960006101000a81548160ff02191690831515021790555060405180602001604052806000815250600a90805190602001906200004692919062000345565b503480156200005457600080fd5b506040518060400160405280600b81526020017f446567656e5761696675730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f44570000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d992919062000345565b508060019080519060200190620000f292919062000345565b5050506200011562000109620001a260201b60201c565b620001aa60201b60201c565b60016006819055506200014760405180606001604052806036815260200162005186603691396200027060201b60201c565b73a5409ec958c83c3f309868babaca7c86dcb077c1600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004dd565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000280620001a260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002a66200031b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f69062000456565b60405180910390fd5b80600d90805190602001906200031792919062000345565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200035390620004a7565b90600052602060002090601f016020900481019282620003775760008555620003c3565b82601f106200039257805160ff1916838001178555620003c3565b82800160010185558215620003c3579182015b82811115620003c2578251825591602001919060010190620003a5565b5b509050620003d29190620003d6565b5090565b5b80821115620003f1576000816000905550600101620003d7565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200043e602083620003f5565b91506200044b8262000406565b602082019050919050565b6000602082019050818103600083015262000471816200042f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004c057607f821691505b60208210811415620004d757620004d662000478565b5b50919050565b614c9980620004ed6000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063b88d4fde116100b6578063d2d8cb671161007a578063d2d8cb6714610871578063e985e9c51461089c578063eb8d2444146108d9578063f2fde38b14610904578063f73c814b1461092d578063fafe1aa81461095657610246565b8063b88d4fde1461079b578063c634d032146107c4578063c87b56dd146107e0578063cd7c03261461081d578063d26ea6c01461084857610246565b806395d89b41116100fd57806395d89b41146106c6578063a22cb465146106f1578063a22f401f1461071a578063b2462be514610745578063b3aa76a01461077057610246565b806370a08231146105e1578063715018a61461061e5780637c928fe9146106355780638462151c1461065e5780638da5cb5b1461069b57610246565b80633ccfd60b116101c75780635bab26e21161018b5780635bab26e2146104e65780636352211e146105235780636c0360eb146105605780636dabe84f1461058b5780636fdaddf1146105b657610246565b80633ccfd60b1461041557806342842e0e1461042c5780634f6ccce71461045557806355f804b3146104925780635639e8cf146104bb57610246565b8063109695231161020e578063109695231461034457806318160ddd1461036d57806323b872dd146103985780632f745c59146103c157806334918dfd146103fe57610246565b806301ffc9a71461024b57806306c18a311461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906131b4565b610981565b60405161027f91906131fc565b60405180910390f35b34801561029457600080fd5b5061029d6109fb565b6040516102aa9190613258565b60405180910390f35b3480156102bf57600080fd5b506102c8610a13565b6040516102d5919061330c565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613364565b610aa5565b6040516103129190613258565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d91906133bd565b610b2a565b005b34801561035057600080fd5b5061036b60048036038101906103669190613532565b610c42565b005b34801561037957600080fd5b50610382610cd8565b60405161038f919061358a565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba91906135a5565b610ce5565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906133bd565b610d45565b6040516103f5919061358a565b60405180910390f35b34801561040a57600080fd5b50610413610e8a565b005b34801561042157600080fd5b5061042a610f32565b005b34801561043857600080fd5b50610453600480360381019061044e91906135a5565b6111a9565b005b34801561046157600080fd5b5061047c60048036038101906104779190613364565b6111c9565b604051610489919061358a565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613532565b61121a565b005b3480156104c757600080fd5b506104d06112b0565b6040516104dd9190613258565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906135f8565b6112c8565b60405161051a91906131fc565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190613364565b6112e8565b6040516105579190613258565b60405180910390f35b34801561056c57600080fd5b506105756113a5565b604051610582919061330c565b60405180910390f35b34801561059757600080fd5b506105a0611433565b6040516105ad919061358a565b60405180910390f35b3480156105c257600080fd5b506105cb611438565b6040516105d8919061358a565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906135f8565b61143e565b604051610615919061358a565b60405180910390f35b34801561062a57600080fd5b5061063361155a565b005b34801561064157600080fd5b5061065c60048036038101906106579190613364565b6115e2565b005b34801561066a57600080fd5b50610685600480360381019061068091906135f8565b611857565b60405161069291906136e3565b60405180910390f35b3480156106a757600080fd5b506106b0611961565b6040516106bd9190613258565b60405180910390f35b3480156106d257600080fd5b506106db61198b565b6040516106e8919061330c565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613731565b611a1d565b005b34801561072657600080fd5b5061072f611b9e565b60405161073c919061358a565b60405180910390f35b34801561075157600080fd5b5061075a611ba3565b604051610767919061330c565b60405180910390f35b34801561077c57600080fd5b50610785611c31565b604051610792919061358a565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613812565b611c37565b005b6107de60048036038101906107d99190613364565b611c99565b005b3480156107ec57600080fd5b5061080760048036038101906108029190613364565b611f43565b604051610814919061330c565b60405180910390f35b34801561082957600080fd5b50610832611ff6565b60405161083f9190613258565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906135f8565b61201c565b005b34801561087d57600080fd5b506108866120dc565b604051610893919061358a565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190613895565b6120e7565b6040516108d091906131fc565b60405180910390f35b3480156108e557600080fd5b506108ee61222e565b6040516108fb91906131fc565b60405180910390f35b34801561091057600080fd5b5061092b600480360381019061092691906135f8565b612241565b005b34801561093957600080fd5b50610954600480360381019061094f91906135f8565b612339565b005b34801561096257600080fd5b5061096b61245c565b604051610978919061330c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f457506109f382612495565b5b9050919050565b73eeee451963d5a81c9d94776c9519abb6b6342ad581565b606060008054610a2290613904565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90613904565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab082612577565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906139a8565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b35826112e8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613a3a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc56125ff565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee6125ff565b6120e7565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613acc565b60405180910390fd5b610c3d8383612607565b505050565b610c4a6125ff565b73ffffffffffffffffffffffffffffffffffffffff16610c68611961565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613b38565b60405180910390fd5b80600a9080519060200190610cd49291906130a5565b5050565b6000600280549050905090565b610cf6610cf06125ff565b826126c0565b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613bca565b60405180910390fd5b610d4083838361279e565b505050565b6000610d508361143e565b8210610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890613c5c565b60405180910390fd5b6000805b600280549050811015610e485760028181548110610db657610db5613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e355783821415610e26578092505050610e84565b8180610e3190613cda565b9250505b8080610e4090613cda565b915050610d95565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b90613c5c565b60405180910390fd5b92915050565b610e926125ff565b73ffffffffffffffffffffffffffffffffffffffff16610eb0611961565b73ffffffffffffffffffffffffffffffffffffffff1614610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90613b38565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b610f3a6125ff565b73ffffffffffffffffffffffffffffffffffffffff16610f58611961565b73ffffffffffffffffffffffffffffffffffffffff1614610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613b38565b60405180910390fd5b60026006541415610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90613d6f565b60405180910390fd5b6002600681905550611004611961565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613ddb565b60405180910390fd5b600073e3cc957c3a1ac0eb137b50a855e30fed80ccd30c73ffffffffffffffffffffffffffffffffffffffff166064600a476110ad9190613dfb565b6110b79190613e84565b6040516110c390613ee6565b60006040518083038185875af1925050503d8060008114611100576040519150601f19603f3d011682016040523d82523d6000602084013e611105565b606091505b505090508061111357600080fd5b600073eeee451963d5a81c9d94776c9519abb6b6342ad573ffffffffffffffffffffffffffffffffffffffff164760405161114d90613ee6565b60006040518083038185875af1925050503d806000811461118a576040519150601f19603f3d011682016040523d82523d6000602084013e61118f565b606091505b505090508061119d57600080fd5b50506001600681905550565b6111c483838360405180602001604052806000815250611c37565b505050565b60006002805490508210611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613f6d565b60405180910390fd5b819050919050565b6112226125ff565b73ffffffffffffffffffffffffffffffffffffffff16611240611961565b73ffffffffffffffffffffffffffffffffffffffff1614611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613b38565b60405180910390fd5b80600d90805190602001906112ac9291906130a5565b5050565b73e3cc957c3a1ac0eb137b50a855e30fed80ccd30c81565b600c6020528060005260406000206000915054906101000a900460ff1681565b600080600283815481106112ff576112fe613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390613fff565b60405180910390fd5b80915050919050565b600d80546113b290613904565b80601f01602080910402602001604051908101604052809291908181526020018280546113de90613904565b801561142b5780601f106114005761010080835404028352916020019161142b565b820191906000526020600020905b81548152906001019060200180831161140e57829003601f168201915b505050505081565b600b81565b61115c81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a690614091565b60405180910390fd5b6000805b60028054905081101561155057600281815481106114d4576114d3613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561153f578161153c90613cda565b91505b8061154990613cda565b90506114b3565b5080915050919050565b6115626125ff565b73ffffffffffffffffffffffffffffffffffffffff16611580611961565b73ffffffffffffffffffffffffffffffffffffffff16146115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd90613b38565b60405180910390fd5b6115e06000612957565b565b60026006541415611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90613d6f565b60405180910390fd5b6002600681905550600960009054906101000a900460ff1661167f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611676906140fd565b60405180910390fd5b600b6116d382600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a1d90919063ffffffff16565b10611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061418f565b60405180910390fd5b61045761173082611722610cd8565b612a1d90919063ffffffff16565b10611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176790614221565b60405180910390fd5b60005b8181101561179f5761178c33611787610cd8565b612a33565b808061179790613cda565b915050611773565b5080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117ef9190614241565b9250508190555080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118459190614241565b92505081905550600160068190555050565b606060006118648361143e565b905060008114156118c157600067ffffffffffffffff81111561188a57611889613407565b5b6040519080825280602002602001820160405280156118b85781602001602082028036833780820191505090505b5091505061195c565b60008167ffffffffffffffff8111156118dd576118dc613407565b5b60405190808252806020026020018201604052801561190b5781602001602082028036833780820191505090505b50905060005b82811015611955576119238582610d45565b82828151811061193657611935613c7c565b5b602002602001018181525050808061194d90613cda565b915050611911565b8193505050505b919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461199a90613904565b80601f01602080910402602001604051908101604052809291908181526020018280546119c690613904565b8015611a135780601f106119e857610100808354040283529160200191611a13565b820191906000526020600020905b8154815290600101906020018083116119f657829003601f168201915b5050505050905090565b611a256125ff565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a906142e3565b60405180910390fd5b8060046000611aa06125ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b4d6125ff565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b9291906131fc565b60405180910390a35050565b600b81565b600a8054611bb090613904565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdc90613904565b8015611c295780601f10611bfe57610100808354040283529160200191611c29565b820191906000526020600020905b815481529060010190602001808311611c0c57829003601f168201915b505050505081565b61045781565b611c48611c426125ff565b836126c0565b611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613bca565b60405180910390fd5b611c9384848484612a51565b50505050565b60026006541415611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd690613d6f565b60405180910390fd5b6002600681905550600960009054906101000a900460ff16611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d906140fd565b60405180910390fd5b60008111611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d709061434f565b60405180910390fd5b600b8110611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db3906143e1565b60405180910390fd5b600b611e1082600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a1d90919063ffffffff16565b10611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4790614499565b60405180910390fd5b61115c611e6d82611e5f610cd8565b612a1d90919063ffffffff16565b10611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614505565b60405180910390fd5b611ec78166470de4df820000612aad90919063ffffffff16565b3414611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90614571565b60405180910390fd5b60005b81811015611f3757611f2433611f1f610cd8565b612a33565b8080611f2f90613cda565b915050611f0b565b50600160068190555050565b6060611f4e82612577565b611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906145dd565b60405180910390fd5b600d611f9883612ac3565b6040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001611fe0939291906146cd565b6040516020818303038152906040529050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120246125ff565b73ffffffffffffffffffffffffffffffffffffffff16612042611961565b73ffffffffffffffffffffffffffffffffffffffff1614612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f90613b38565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b66470de4df82000081565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161215f9190613258565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a0919061473c565b73ffffffffffffffffffffffffffffffffffffffff16148061220b5750600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561221a576001915050612228565b6122248484612c24565b9150505b92915050565b600960009054906101000a900460ff1681565b6122496125ff565b73ffffffffffffffffffffffffffffffffffffffff16612267611961565b73ffffffffffffffffffffffffffffffffffffffff16146122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613b38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561232d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612324906147db565b60405180910390fd5b61233681612957565b50565b6123416125ff565b73ffffffffffffffffffffffffffffffffffffffff1661235f611961565b73ffffffffffffffffffffffffffffffffffffffff16146123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90613b38565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612570575061256f82612cb8565b5b9050919050565b6000600280549050821080156125f85750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106125b4576125b3613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661267a836112e8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126cb82612577565b61270a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127019061486d565b60405180910390fd5b6000612715836112e8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061278457508373ffffffffffffffffffffffffffffffffffffffff1661276c84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612795575061279481856120e7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127be826112e8565b73ffffffffffffffffffffffffffffffffffffffff1614612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280b906148ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b90614991565b60405180910390fd5b61288f838383612d22565b61289a600082612607565b81600282815481106128af576128ae613c7c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612a2b9190614241565b905092915050565b612a4d828260405180602001604052806000815250612d27565b5050565b612a5c84848461279e565b612a6884848484612d82565b612aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9e90614a23565b60405180910390fd5b50505050565b60008183612abb9190613dfb565b905092915050565b60606000821415612b0b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c1f565b600082905060005b60008214612b3d578080612b2690613cda565b915050600a82612b369190613e84565b9150612b13565b60008167ffffffffffffffff811115612b5957612b58613407565b5b6040519080825280601f01601f191660200182016040528015612b8b5781602001600182028036833780820191505090505b5090505b60008514612c1857600182612ba49190614a43565b9150600a85612bb39190614a77565b6030612bbf9190614241565b60f81b818381518110612bd557612bd4613c7c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c119190613e84565b9450612b8f565b8093505050505b919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b612d318383612f0a565b612d3e6000848484612d82565b612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490614a23565b60405180910390fd5b505050565b6000612da38473ffffffffffffffffffffffffffffffffffffffff16613092565b15612efd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dcc6125ff565b8786866040518563ffffffff1660e01b8152600401612dee9493929190614afd565b6020604051808303816000875af1925050508015612e2a57506040513d601f19601f82011682018060405250810190612e279190614b5e565b60015b612ead573d8060008114612e5a576040519150601f19603f3d011682016040523d82523d6000602084013e612e5f565b606091505b50600081511415612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90614a23565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f02565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190614bd7565b60405180910390fd5b612f8381612577565b15612fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fba90614c43565b60405180910390fd5b612fcf60008383612d22565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546130b190613904565b90600052602060002090601f0160209004810192826130d3576000855561311a565b82601f106130ec57805160ff191683800117855561311a565b8280016001018555821561311a579182015b828111156131195782518255916020019190600101906130fe565b5b509050613127919061312b565b5090565b5b8082111561314457600081600090555060010161312c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131918161315c565b811461319c57600080fd5b50565b6000813590506131ae81613188565b92915050565b6000602082840312156131ca576131c9613152565b5b60006131d88482850161319f565b91505092915050565b60008115159050919050565b6131f6816131e1565b82525050565b600060208201905061321160008301846131ed565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061324282613217565b9050919050565b61325281613237565b82525050565b600060208201905061326d6000830184613249565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132ad578082015181840152602081019050613292565b838111156132bc576000848401525b50505050565b6000601f19601f8301169050919050565b60006132de82613273565b6132e8818561327e565b93506132f881856020860161328f565b613301816132c2565b840191505092915050565b6000602082019050818103600083015261332681846132d3565b905092915050565b6000819050919050565b6133418161332e565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613152565b5b60006133888482850161334f565b91505092915050565b61339a81613237565b81146133a557600080fd5b50565b6000813590506133b781613391565b92915050565b600080604083850312156133d4576133d3613152565b5b60006133e2858286016133a8565b92505060206133f38582860161334f565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61343f826132c2565b810181811067ffffffffffffffff8211171561345e5761345d613407565b5b80604052505050565b6000613471613148565b905061347d8282613436565b919050565b600067ffffffffffffffff82111561349d5761349c613407565b5b6134a6826132c2565b9050602081019050919050565b82818337600083830152505050565b60006134d56134d084613482565b613467565b9050828152602081018484840111156134f1576134f0613402565b5b6134fc8482856134b3565b509392505050565b600082601f830112613519576135186133fd565b5b81356135298482602086016134c2565b91505092915050565b60006020828403121561354857613547613152565b5b600082013567ffffffffffffffff81111561356657613565613157565b5b61357284828501613504565b91505092915050565b6135848161332e565b82525050565b600060208201905061359f600083018461357b565b92915050565b6000806000606084860312156135be576135bd613152565b5b60006135cc868287016133a8565b93505060206135dd868287016133a8565b92505060406135ee8682870161334f565b9150509250925092565b60006020828403121561360e5761360d613152565b5b600061361c848285016133a8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61365a8161332e565b82525050565b600061366c8383613651565b60208301905092915050565b6000602082019050919050565b600061369082613625565b61369a8185613630565b93506136a583613641565b8060005b838110156136d65781516136bd8882613660565b97506136c883613678565b9250506001810190506136a9565b5085935050505092915050565b600060208201905081810360008301526136fd8184613685565b905092915050565b61370e816131e1565b811461371957600080fd5b50565b60008135905061372b81613705565b92915050565b6000806040838503121561374857613747613152565b5b6000613756858286016133a8565b92505060206137678582860161371c565b9150509250929050565b600067ffffffffffffffff82111561378c5761378b613407565b5b613795826132c2565b9050602081019050919050565b60006137b56137b084613771565b613467565b9050828152602081018484840111156137d1576137d0613402565b5b6137dc8482856134b3565b509392505050565b600082601f8301126137f9576137f86133fd565b5b81356138098482602086016137a2565b91505092915050565b6000806000806080858703121561382c5761382b613152565b5b600061383a878288016133a8565b945050602061384b878288016133a8565b935050604061385c8782880161334f565b925050606085013567ffffffffffffffff81111561387d5761387c613157565b5b613889878288016137e4565b91505092959194509250565b600080604083850312156138ac576138ab613152565b5b60006138ba858286016133a8565b92505060206138cb858286016133a8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061391c57607f821691505b602082108114156139305761392f6138d5565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613992602c8361327e565b915061399d82613936565b604082019050919050565b600060208201905081810360008301526139c181613985565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a2460218361327e565b9150613a2f826139c8565b604082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613ab660388361327e565b9150613ac182613a5a565b604082019050919050565b60006020820190508181036000830152613ae581613aa9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b2260208361327e565b9150613b2d82613aec565b602082019050919050565b60006020820190508181036000830152613b5181613b15565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613bb460318361327e565b9150613bbf82613b58565b604082019050919050565b60006020820190508181036000830152613be381613ba7565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c46602b8361327e565b9150613c5182613bea565b604082019050919050565b60006020820190508181036000830152613c7581613c39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ce58261332e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d1857613d17613cab565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613d59601f8361327e565b9150613d6482613d23565b602082019050919050565b60006020820190508181036000830152613d8881613d4c565b9050919050565b7f496e76616c69642073656e646572000000000000000000000000000000000000600082015250565b6000613dc5600e8361327e565b9150613dd082613d8f565b602082019050919050565b60006020820190508181036000830152613df481613db8565b9050919050565b6000613e068261332e565b9150613e118361332e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4a57613e49613cab565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e8f8261332e565b9150613e9a8361332e565b925082613eaa57613ea9613e55565b5b828204905092915050565b600081905092915050565b50565b6000613ed0600083613eb5565b9150613edb82613ec0565b600082019050919050565b6000613ef182613ec3565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f57602c8361327e565b9150613f6282613efb565b604082019050919050565b60006020820190508181036000830152613f8681613f4a565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fe960298361327e565b9150613ff482613f8d565b604082019050919050565b6000602082019050818103600083015261401881613fdc565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061407b602a8361327e565b91506140868261401f565b604082019050919050565b600060208201905081810360008301526140aa8161406e565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b60006140e7601b8361327e565b91506140f2826140b1565b602082019050919050565b60006020820190508181036000830152614116816140da565b9050919050565b7f596f7572206d696e7420776f756c64206578636565642074686520746f74616c60008201527f206f662031302057616966757320616c6c6f77656420666f7220667265652e00602082015250565b6000614179603f8361327e565b91506141848261411d565b604082019050919050565b600060208201905081810360008301526141a88161416c565b9050919050565b7f507572636861736520776f756c6420657863656564206672656520737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b60218361327e565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b600061424c8261332e565b91506142578361332e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561428c5761428b613cab565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006142cd60198361327e565b91506142d882614297565b602082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f596f75206d757374206d696e742061746c656173742031204e46542e00000000600082015250565b6000614339601c8361327e565b915061434482614303565b602082019050919050565b600060208201905081810360008301526143688161432c565b9050919050565b7f4f6e6c79203130204e465473206d696e7461626c6520706572207472616e736160008201527f6374696f6e2e0000000000000000000000000000000000000000000000000000602082015250565b60006143cb60268361327e565b91506143d68261436f565b604082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b7f596f7572206d696e7420776f756c64206578636565642074686520746f74616c60008201527f206f66203130206e66747320616c6c6f77656420666f72207065722077616c6c60208201527f65742e0000000000000000000000000000000000000000000000000000000000604082015250565b600061448360438361327e565b915061448e82614401565b606082019050919050565b600060208201905081810360008301526144b281614476565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b60006144ef60208361327e565b91506144fa826144b9565b602082019050919050565b6000602082019050818103600083015261451e816144e2565b9050919050565b7f57726f6e672065746865722076616c7565000000000000000000000000000000600082015250565b600061455b60118361327e565b915061456682614525565b602082019050919050565b6000602082019050818103600083015261458a8161454e565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006145c760158361327e565b91506145d282614591565b602082019050919050565b600060208201905081810360008301526145f6816145ba565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461462a81613904565b61463481866145fd565b9450600182166000811461464f576001811461466057614693565b60ff19831686528186019350614693565b61466985614608565b60005b8381101561468b5781548189015260018201915060208101905061466c565b838801955050505b50505092915050565b60006146a782613273565b6146b181856145fd565b93506146c181856020860161328f565b80840191505092915050565b60006146d9828661461d565b91506146e5828561469c565b91506146f1828461469c565b9150819050949350505050565b600061470982613237565b9050919050565b614719816146fe565b811461472457600080fd5b50565b60008151905061473681614710565b92915050565b60006020828403121561475257614751613152565b5b600061476084828501614727565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147c560268361327e565b91506147d082614769565b604082019050919050565b600060208201905081810360008301526147f4816147b8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614857602c8361327e565b9150614862826147fb565b604082019050919050565b600060208201905081810360008301526148868161484a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006148e960298361327e565b91506148f48261488d565b604082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061497b60248361327e565b91506149868261491f565b604082019050919050565b600060208201905081810360008301526149aa8161496e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a0d60328361327e565b9150614a18826149b1565b604082019050919050565b60006020820190508181036000830152614a3c81614a00565b9050919050565b6000614a4e8261332e565b9150614a598361332e565b925082821015614a6c57614a6b613cab565b5b828203905092915050565b6000614a828261332e565b9150614a8d8361332e565b925082614a9d57614a9c613e55565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614acf82614aa8565b614ad98185614ab3565b9350614ae981856020860161328f565b614af2816132c2565b840191505092915050565b6000608082019050614b126000830187613249565b614b1f6020830186613249565b614b2c604083018561357b565b8181036060830152614b3e8184614ac4565b905095945050505050565b600081519050614b5881613188565b92915050565b600060208284031215614b7457614b73613152565b5b6000614b8284828501614b49565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614bc160208361327e565b9150614bcc82614b8b565b602082019050919050565b60006020820190508181036000830152614bf081614bb4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614c2d601c8361327e565b9150614c3882614bf7565b602082019050919050565b60006020820190508181036000830152614c5c81614c20565b905091905056fea2646970667358221220ec6e4859972fa1f86d6690d92b49354c53fb22fe69c4ac7364cb085eaf52748264736f6c634300080b0033697066733a2f2f516d57627a3578723147663545594e516a54354865446d336a334444556d32476173465277795552695a765178722f

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063b88d4fde116100b6578063d2d8cb671161007a578063d2d8cb6714610871578063e985e9c51461089c578063eb8d2444146108d9578063f2fde38b14610904578063f73c814b1461092d578063fafe1aa81461095657610246565b8063b88d4fde1461079b578063c634d032146107c4578063c87b56dd146107e0578063cd7c03261461081d578063d26ea6c01461084857610246565b806395d89b41116100fd57806395d89b41146106c6578063a22cb465146106f1578063a22f401f1461071a578063b2462be514610745578063b3aa76a01461077057610246565b806370a08231146105e1578063715018a61461061e5780637c928fe9146106355780638462151c1461065e5780638da5cb5b1461069b57610246565b80633ccfd60b116101c75780635bab26e21161018b5780635bab26e2146104e65780636352211e146105235780636c0360eb146105605780636dabe84f1461058b5780636fdaddf1146105b657610246565b80633ccfd60b1461041557806342842e0e1461042c5780634f6ccce71461045557806355f804b3146104925780635639e8cf146104bb57610246565b8063109695231161020e578063109695231461034457806318160ddd1461036d57806323b872dd146103985780632f745c59146103c157806334918dfd146103fe57610246565b806301ffc9a71461024b57806306c18a311461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906131b4565b610981565b60405161027f91906131fc565b60405180910390f35b34801561029457600080fd5b5061029d6109fb565b6040516102aa9190613258565b60405180910390f35b3480156102bf57600080fd5b506102c8610a13565b6040516102d5919061330c565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613364565b610aa5565b6040516103129190613258565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d91906133bd565b610b2a565b005b34801561035057600080fd5b5061036b60048036038101906103669190613532565b610c42565b005b34801561037957600080fd5b50610382610cd8565b60405161038f919061358a565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba91906135a5565b610ce5565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906133bd565b610d45565b6040516103f5919061358a565b60405180910390f35b34801561040a57600080fd5b50610413610e8a565b005b34801561042157600080fd5b5061042a610f32565b005b34801561043857600080fd5b50610453600480360381019061044e91906135a5565b6111a9565b005b34801561046157600080fd5b5061047c60048036038101906104779190613364565b6111c9565b604051610489919061358a565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613532565b61121a565b005b3480156104c757600080fd5b506104d06112b0565b6040516104dd9190613258565b60405180910390f35b3480156104f257600080fd5b5061050d600480360381019061050891906135f8565b6112c8565b60405161051a91906131fc565b60405180910390f35b34801561052f57600080fd5b5061054a60048036038101906105459190613364565b6112e8565b6040516105579190613258565b60405180910390f35b34801561056c57600080fd5b506105756113a5565b604051610582919061330c565b60405180910390f35b34801561059757600080fd5b506105a0611433565b6040516105ad919061358a565b60405180910390f35b3480156105c257600080fd5b506105cb611438565b6040516105d8919061358a565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906135f8565b61143e565b604051610615919061358a565b60405180910390f35b34801561062a57600080fd5b5061063361155a565b005b34801561064157600080fd5b5061065c60048036038101906106579190613364565b6115e2565b005b34801561066a57600080fd5b50610685600480360381019061068091906135f8565b611857565b60405161069291906136e3565b60405180910390f35b3480156106a757600080fd5b506106b0611961565b6040516106bd9190613258565b60405180910390f35b3480156106d257600080fd5b506106db61198b565b6040516106e8919061330c565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613731565b611a1d565b005b34801561072657600080fd5b5061072f611b9e565b60405161073c919061358a565b60405180910390f35b34801561075157600080fd5b5061075a611ba3565b604051610767919061330c565b60405180910390f35b34801561077c57600080fd5b50610785611c31565b604051610792919061358a565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613812565b611c37565b005b6107de60048036038101906107d99190613364565b611c99565b005b3480156107ec57600080fd5b5061080760048036038101906108029190613364565b611f43565b604051610814919061330c565b60405180910390f35b34801561082957600080fd5b50610832611ff6565b60405161083f9190613258565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a91906135f8565b61201c565b005b34801561087d57600080fd5b506108866120dc565b604051610893919061358a565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190613895565b6120e7565b6040516108d091906131fc565b60405180910390f35b3480156108e557600080fd5b506108ee61222e565b6040516108fb91906131fc565b60405180910390f35b34801561091057600080fd5b5061092b600480360381019061092691906135f8565b612241565b005b34801561093957600080fd5b50610954600480360381019061094f91906135f8565b612339565b005b34801561096257600080fd5b5061096b61245c565b604051610978919061330c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f457506109f382612495565b5b9050919050565b73eeee451963d5a81c9d94776c9519abb6b6342ad581565b606060008054610a2290613904565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90613904565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab082612577565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906139a8565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b35826112e8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613a3a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc56125ff565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee6125ff565b6120e7565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613acc565b60405180910390fd5b610c3d8383612607565b505050565b610c4a6125ff565b73ffffffffffffffffffffffffffffffffffffffff16610c68611961565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613b38565b60405180910390fd5b80600a9080519060200190610cd49291906130a5565b5050565b6000600280549050905090565b610cf6610cf06125ff565b826126c0565b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613bca565b60405180910390fd5b610d4083838361279e565b505050565b6000610d508361143e565b8210610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890613c5c565b60405180910390fd5b6000805b600280549050811015610e485760028181548110610db657610db5613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e355783821415610e26578092505050610e84565b8180610e3190613cda565b9250505b8080610e4090613cda565b915050610d95565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b90613c5c565b60405180910390fd5b92915050565b610e926125ff565b73ffffffffffffffffffffffffffffffffffffffff16610eb0611961565b73ffffffffffffffffffffffffffffffffffffffff1614610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90613b38565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b610f3a6125ff565b73ffffffffffffffffffffffffffffffffffffffff16610f58611961565b73ffffffffffffffffffffffffffffffffffffffff1614610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613b38565b60405180910390fd5b60026006541415610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90613d6f565b60405180910390fd5b6002600681905550611004611961565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613ddb565b60405180910390fd5b600073e3cc957c3a1ac0eb137b50a855e30fed80ccd30c73ffffffffffffffffffffffffffffffffffffffff166064600a476110ad9190613dfb565b6110b79190613e84565b6040516110c390613ee6565b60006040518083038185875af1925050503d8060008114611100576040519150601f19603f3d011682016040523d82523d6000602084013e611105565b606091505b505090508061111357600080fd5b600073eeee451963d5a81c9d94776c9519abb6b6342ad573ffffffffffffffffffffffffffffffffffffffff164760405161114d90613ee6565b60006040518083038185875af1925050503d806000811461118a576040519150601f19603f3d011682016040523d82523d6000602084013e61118f565b606091505b505090508061119d57600080fd5b50506001600681905550565b6111c483838360405180602001604052806000815250611c37565b505050565b60006002805490508210611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990613f6d565b60405180910390fd5b819050919050565b6112226125ff565b73ffffffffffffffffffffffffffffffffffffffff16611240611961565b73ffffffffffffffffffffffffffffffffffffffff1614611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90613b38565b60405180910390fd5b80600d90805190602001906112ac9291906130a5565b5050565b73e3cc957c3a1ac0eb137b50a855e30fed80ccd30c81565b600c6020528060005260406000206000915054906101000a900460ff1681565b600080600283815481106112ff576112fe613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139390613fff565b60405180910390fd5b80915050919050565b600d80546113b290613904565b80601f01602080910402602001604051908101604052809291908181526020018280546113de90613904565b801561142b5780601f106114005761010080835404028352916020019161142b565b820191906000526020600020905b81548152906001019060200180831161140e57829003601f168201915b505050505081565b600b81565b61115c81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a690614091565b60405180910390fd5b6000805b60028054905081101561155057600281815481106114d4576114d3613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561153f578161153c90613cda565b91505b8061154990613cda565b90506114b3565b5080915050919050565b6115626125ff565b73ffffffffffffffffffffffffffffffffffffffff16611580611961565b73ffffffffffffffffffffffffffffffffffffffff16146115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd90613b38565b60405180910390fd5b6115e06000612957565b565b60026006541415611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90613d6f565b60405180910390fd5b6002600681905550600960009054906101000a900460ff1661167f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611676906140fd565b60405180910390fd5b600b6116d382600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a1d90919063ffffffff16565b10611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061418f565b60405180910390fd5b61045761173082611722610cd8565b612a1d90919063ffffffff16565b10611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176790614221565b60405180910390fd5b60005b8181101561179f5761178c33611787610cd8565b612a33565b808061179790613cda565b915050611773565b5080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117ef9190614241565b9250508190555080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118459190614241565b92505081905550600160068190555050565b606060006118648361143e565b905060008114156118c157600067ffffffffffffffff81111561188a57611889613407565b5b6040519080825280602002602001820160405280156118b85781602001602082028036833780820191505090505b5091505061195c565b60008167ffffffffffffffff8111156118dd576118dc613407565b5b60405190808252806020026020018201604052801561190b5781602001602082028036833780820191505090505b50905060005b82811015611955576119238582610d45565b82828151811061193657611935613c7c565b5b602002602001018181525050808061194d90613cda565b915050611911565b8193505050505b919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461199a90613904565b80601f01602080910402602001604051908101604052809291908181526020018280546119c690613904565b8015611a135780601f106119e857610100808354040283529160200191611a13565b820191906000526020600020905b8154815290600101906020018083116119f657829003601f168201915b5050505050905090565b611a256125ff565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a906142e3565b60405180910390fd5b8060046000611aa06125ff565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b4d6125ff565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b9291906131fc565b60405180910390a35050565b600b81565b600a8054611bb090613904565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdc90613904565b8015611c295780601f10611bfe57610100808354040283529160200191611c29565b820191906000526020600020905b815481529060010190602001808311611c0c57829003601f168201915b505050505081565b61045781565b611c48611c426125ff565b836126c0565b611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613bca565b60405180910390fd5b611c9384848484612a51565b50505050565b60026006541415611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd690613d6f565b60405180910390fd5b6002600681905550600960009054906101000a900460ff16611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d906140fd565b60405180910390fd5b60008111611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d709061434f565b60405180910390fd5b600b8110611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db3906143e1565b60405180910390fd5b600b611e1082600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a1d90919063ffffffff16565b10611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4790614499565b60405180910390fd5b61115c611e6d82611e5f610cd8565b612a1d90919063ffffffff16565b10611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490614505565b60405180910390fd5b611ec78166470de4df820000612aad90919063ffffffff16565b3414611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90614571565b60405180910390fd5b60005b81811015611f3757611f2433611f1f610cd8565b612a33565b8080611f2f90613cda565b915050611f0b565b50600160068190555050565b6060611f4e82612577565b611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906145dd565b60405180910390fd5b600d611f9883612ac3565b6040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001611fe0939291906146cd565b6040516020818303038152906040529050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120246125ff565b73ffffffffffffffffffffffffffffffffffffffff16612042611961565b73ffffffffffffffffffffffffffffffffffffffff1614612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f90613b38565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b66470de4df82000081565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161215f9190613258565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a0919061473c565b73ffffffffffffffffffffffffffffffffffffffff16148061220b5750600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561221a576001915050612228565b6122248484612c24565b9150505b92915050565b600960009054906101000a900460ff1681565b6122496125ff565b73ffffffffffffffffffffffffffffffffffffffff16612267611961565b73ffffffffffffffffffffffffffffffffffffffff16146122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613b38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561232d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612324906147db565b60405180910390fd5b61233681612957565b50565b6123416125ff565b73ffffffffffffffffffffffffffffffffffffffff1661235f611961565b73ffffffffffffffffffffffffffffffffffffffff16146123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90613b38565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612570575061256f82612cb8565b5b9050919050565b6000600280549050821080156125f85750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106125b4576125b3613c7c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661267a836112e8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126cb82612577565b61270a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127019061486d565b60405180910390fd5b6000612715836112e8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061278457508373ffffffffffffffffffffffffffffffffffffffff1661276c84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612795575061279481856120e7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127be826112e8565b73ffffffffffffffffffffffffffffffffffffffff1614612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280b906148ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b90614991565b60405180910390fd5b61288f838383612d22565b61289a600082612607565b81600282815481106128af576128ae613c7c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612a2b9190614241565b905092915050565b612a4d828260405180602001604052806000815250612d27565b5050565b612a5c84848461279e565b612a6884848484612d82565b612aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9e90614a23565b60405180910390fd5b50505050565b60008183612abb9190613dfb565b905092915050565b60606000821415612b0b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c1f565b600082905060005b60008214612b3d578080612b2690613cda565b915050600a82612b369190613e84565b9150612b13565b60008167ffffffffffffffff811115612b5957612b58613407565b5b6040519080825280601f01601f191660200182016040528015612b8b5781602001600182028036833780820191505090505b5090505b60008514612c1857600182612ba49190614a43565b9150600a85612bb39190614a77565b6030612bbf9190614241565b60f81b818381518110612bd557612bd4613c7c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c119190613e84565b9450612b8f565b8093505050505b919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b612d318383612f0a565b612d3e6000848484612d82565b612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490614a23565b60405180910390fd5b505050565b6000612da38473ffffffffffffffffffffffffffffffffffffffff16613092565b15612efd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dcc6125ff565b8786866040518563ffffffff1660e01b8152600401612dee9493929190614afd565b6020604051808303816000875af1925050508015612e2a57506040513d601f19601f82011682018060405250810190612e279190614b5e565b60015b612ead573d8060008114612e5a576040519150601f19603f3d011682016040523d82523d6000602084013e612e5f565b606091505b50600081511415612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90614a23565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f02565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190614bd7565b60405180910390fd5b612f8381612577565b15612fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fba90614c43565b60405180910390fd5b612fcf60008383612d22565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546130b190613904565b90600052602060002090601f0160209004810192826130d3576000855561311a565b82601f106130ec57805160ff191683800117855561311a565b8280016001018555821561311a579182015b828111156131195782518255916020019190600101906130fe565b5b509050613127919061312b565b5090565b5b8082111561314457600081600090555060010161312c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131918161315c565b811461319c57600080fd5b50565b6000813590506131ae81613188565b92915050565b6000602082840312156131ca576131c9613152565b5b60006131d88482850161319f565b91505092915050565b60008115159050919050565b6131f6816131e1565b82525050565b600060208201905061321160008301846131ed565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061324282613217565b9050919050565b61325281613237565b82525050565b600060208201905061326d6000830184613249565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132ad578082015181840152602081019050613292565b838111156132bc576000848401525b50505050565b6000601f19601f8301169050919050565b60006132de82613273565b6132e8818561327e565b93506132f881856020860161328f565b613301816132c2565b840191505092915050565b6000602082019050818103600083015261332681846132d3565b905092915050565b6000819050919050565b6133418161332e565b811461334c57600080fd5b50565b60008135905061335e81613338565b92915050565b60006020828403121561337a57613379613152565b5b60006133888482850161334f565b91505092915050565b61339a81613237565b81146133a557600080fd5b50565b6000813590506133b781613391565b92915050565b600080604083850312156133d4576133d3613152565b5b60006133e2858286016133a8565b92505060206133f38582860161334f565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61343f826132c2565b810181811067ffffffffffffffff8211171561345e5761345d613407565b5b80604052505050565b6000613471613148565b905061347d8282613436565b919050565b600067ffffffffffffffff82111561349d5761349c613407565b5b6134a6826132c2565b9050602081019050919050565b82818337600083830152505050565b60006134d56134d084613482565b613467565b9050828152602081018484840111156134f1576134f0613402565b5b6134fc8482856134b3565b509392505050565b600082601f830112613519576135186133fd565b5b81356135298482602086016134c2565b91505092915050565b60006020828403121561354857613547613152565b5b600082013567ffffffffffffffff81111561356657613565613157565b5b61357284828501613504565b91505092915050565b6135848161332e565b82525050565b600060208201905061359f600083018461357b565b92915050565b6000806000606084860312156135be576135bd613152565b5b60006135cc868287016133a8565b93505060206135dd868287016133a8565b92505060406135ee8682870161334f565b9150509250925092565b60006020828403121561360e5761360d613152565b5b600061361c848285016133a8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61365a8161332e565b82525050565b600061366c8383613651565b60208301905092915050565b6000602082019050919050565b600061369082613625565b61369a8185613630565b93506136a583613641565b8060005b838110156136d65781516136bd8882613660565b97506136c883613678565b9250506001810190506136a9565b5085935050505092915050565b600060208201905081810360008301526136fd8184613685565b905092915050565b61370e816131e1565b811461371957600080fd5b50565b60008135905061372b81613705565b92915050565b6000806040838503121561374857613747613152565b5b6000613756858286016133a8565b92505060206137678582860161371c565b9150509250929050565b600067ffffffffffffffff82111561378c5761378b613407565b5b613795826132c2565b9050602081019050919050565b60006137b56137b084613771565b613467565b9050828152602081018484840111156137d1576137d0613402565b5b6137dc8482856134b3565b509392505050565b600082601f8301126137f9576137f86133fd565b5b81356138098482602086016137a2565b91505092915050565b6000806000806080858703121561382c5761382b613152565b5b600061383a878288016133a8565b945050602061384b878288016133a8565b935050604061385c8782880161334f565b925050606085013567ffffffffffffffff81111561387d5761387c613157565b5b613889878288016137e4565b91505092959194509250565b600080604083850312156138ac576138ab613152565b5b60006138ba858286016133a8565b92505060206138cb858286016133a8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061391c57607f821691505b602082108114156139305761392f6138d5565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613992602c8361327e565b915061399d82613936565b604082019050919050565b600060208201905081810360008301526139c181613985565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a2460218361327e565b9150613a2f826139c8565b604082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613ab660388361327e565b9150613ac182613a5a565b604082019050919050565b60006020820190508181036000830152613ae581613aa9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b2260208361327e565b9150613b2d82613aec565b602082019050919050565b60006020820190508181036000830152613b5181613b15565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613bb460318361327e565b9150613bbf82613b58565b604082019050919050565b60006020820190508181036000830152613be381613ba7565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613c46602b8361327e565b9150613c5182613bea565b604082019050919050565b60006020820190508181036000830152613c7581613c39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ce58261332e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d1857613d17613cab565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613d59601f8361327e565b9150613d6482613d23565b602082019050919050565b60006020820190508181036000830152613d8881613d4c565b9050919050565b7f496e76616c69642073656e646572000000000000000000000000000000000000600082015250565b6000613dc5600e8361327e565b9150613dd082613d8f565b602082019050919050565b60006020820190508181036000830152613df481613db8565b9050919050565b6000613e068261332e565b9150613e118361332e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4a57613e49613cab565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e8f8261332e565b9150613e9a8361332e565b925082613eaa57613ea9613e55565b5b828204905092915050565b600081905092915050565b50565b6000613ed0600083613eb5565b9150613edb82613ec0565b600082019050919050565b6000613ef182613ec3565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f57602c8361327e565b9150613f6282613efb565b604082019050919050565b60006020820190508181036000830152613f8681613f4a565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fe960298361327e565b9150613ff482613f8d565b604082019050919050565b6000602082019050818103600083015261401881613fdc565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061407b602a8361327e565b91506140868261401f565b604082019050919050565b600060208201905081810360008301526140aa8161406e565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b60006140e7601b8361327e565b91506140f2826140b1565b602082019050919050565b60006020820190508181036000830152614116816140da565b9050919050565b7f596f7572206d696e7420776f756c64206578636565642074686520746f74616c60008201527f206f662031302057616966757320616c6c6f77656420666f7220667265652e00602082015250565b6000614179603f8361327e565b91506141848261411d565b604082019050919050565b600060208201905081810360008301526141a88161416c565b9050919050565b7f507572636861736520776f756c6420657863656564206672656520737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b60218361327e565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b600061424c8261332e565b91506142578361332e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561428c5761428b613cab565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006142cd60198361327e565b91506142d882614297565b602082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f596f75206d757374206d696e742061746c656173742031204e46542e00000000600082015250565b6000614339601c8361327e565b915061434482614303565b602082019050919050565b600060208201905081810360008301526143688161432c565b9050919050565b7f4f6e6c79203130204e465473206d696e7461626c6520706572207472616e736160008201527f6374696f6e2e0000000000000000000000000000000000000000000000000000602082015250565b60006143cb60268361327e565b91506143d68261436f565b604082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b7f596f7572206d696e7420776f756c64206578636565642074686520746f74616c60008201527f206f66203130206e66747320616c6c6f77656420666f72207065722077616c6c60208201527f65742e0000000000000000000000000000000000000000000000000000000000604082015250565b600061448360438361327e565b915061448e82614401565b606082019050919050565b600060208201905081810360008301526144b281614476565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b60006144ef60208361327e565b91506144fa826144b9565b602082019050919050565b6000602082019050818103600083015261451e816144e2565b9050919050565b7f57726f6e672065746865722076616c7565000000000000000000000000000000600082015250565b600061455b60118361327e565b915061456682614525565b602082019050919050565b6000602082019050818103600083015261458a8161454e565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006145c760158361327e565b91506145d282614591565b602082019050919050565b600060208201905081810360008301526145f6816145ba565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461462a81613904565b61463481866145fd565b9450600182166000811461464f576001811461466057614693565b60ff19831686528186019350614693565b61466985614608565b60005b8381101561468b5781548189015260018201915060208101905061466c565b838801955050505b50505092915050565b60006146a782613273565b6146b181856145fd565b93506146c181856020860161328f565b80840191505092915050565b60006146d9828661461d565b91506146e5828561469c565b91506146f1828461469c565b9150819050949350505050565b600061470982613237565b9050919050565b614719816146fe565b811461472457600080fd5b50565b60008151905061473681614710565b92915050565b60006020828403121561475257614751613152565b5b600061476084828501614727565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147c560268361327e565b91506147d082614769565b604082019050919050565b600060208201905081810360008301526147f4816147b8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614857602c8361327e565b9150614862826147fb565b604082019050919050565b600060208201905081810360008301526148868161484a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006148e960298361327e565b91506148f48261488d565b604082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061497b60248361327e565b91506149868261491f565b604082019050919050565b600060208201905081810360008301526149aa8161496e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a0d60328361327e565b9150614a18826149b1565b604082019050919050565b60006020820190508181036000830152614a3c81614a00565b9050919050565b6000614a4e8261332e565b9150614a598361332e565b925082821015614a6c57614a6b613cab565b5b828203905092915050565b6000614a828261332e565b9150614a8d8361332e565b925082614a9d57614a9c613e55565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614acf82614aa8565b614ad98185614ab3565b9350614ae981856020860161328f565b614af2816132c2565b840191505092915050565b6000608082019050614b126000830187613249565b614b1f6020830186613249565b614b2c604083018561357b565b8181036060830152614b3e8184614ac4565b905095945050505050565b600081519050614b5881613188565b92915050565b600060208284031215614b7457614b73613152565b5b6000614b8284828501614b49565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614bc160208361327e565b9150614bcc82614b8b565b602082019050919050565b60006020820190508181036000830152614bf081614bb4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614c2d601c8361327e565b9150614c3882614bf7565b602082019050919050565b60006020820190508181036000830152614c5c81614c20565b905091905056fea2646970667358221220ec6e4859972fa1f86d6690d92b49354c53fb22fe69c4ac7364cb085eaf52748264736f6c634300080b0033

Deployed Bytecode Sourcemap

39323:4689:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35530:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40394:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24147:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24959:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24482:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41243:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35830:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26018:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36306:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41467:83;;;;;;;;;;;;;:::i;:::-;;43695:314;;;;;;;;;;;;;:::i;:::-;;26465:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36017:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41369:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40289:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39754:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23754:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39815:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40154:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40091:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23300:392;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38457:103;;;;;;;;;;;;;:::i;:::-;;41562:564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42867:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37806:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24316:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25339:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40023:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39615:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40225:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26721:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42138:721;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41007:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39685:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40721:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39943:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43345:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39547:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38715:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40869:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39871:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35530:224;35632:4;35671:35;35656:50;;;:11;:50;;;;:90;;;;35710:36;35734:11;35710:23;:36::i;:::-;35656:90;35649:97;;35530:224;;;:::o;40394:102::-;40454:42;40394:102;:::o;24147:100::-;24201:13;24234:5;24227:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24147:100;:::o;24959:308::-;25080:7;25127:16;25135:7;25127;:16::i;:::-;25105:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25235:15;:24;25251:7;25235:24;;;;;;;;;;;;;;;;;;;;;25228:31;;24959:308;;;:::o;24482:411::-;24563:13;24579:23;24594:7;24579:14;:23::i;:::-;24563:39;;24627:5;24621:11;;:2;:11;;;;24613:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24721:5;24705:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24730:37;24747:5;24754:12;:10;:12::i;:::-;24730:16;:37::i;:::-;24705:62;24683:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24864:21;24873:2;24877:7;24864:8;:21::i;:::-;24552:341;24482:411;;:::o;41243:120::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41343:14:::1;41324:16;:33;;;;;;;;;;;;:::i;:::-;;41243:120:::0;:::o;35830:110::-;35891:7;35918;:14;;;;35911:21;;35830:110;:::o;26018:376::-;26227:41;26246:12;:10;:12::i;:::-;26260:7;26227:18;:41::i;:::-;26205:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26358:28;26368:4;26374:2;26378:7;26358:9;:28::i;:::-;26018:376;;;:::o;36306:490::-;36403:15;36447:16;36457:5;36447:9;:16::i;:::-;36439:5;:24;36431:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;36524:10;36549:6;36545:178;36561:7;:14;;;;36557:1;:18;36545:178;;;36608:7;36616:1;36608:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36599:19;;:5;:19;;;36596:116;;;36650:5;36641;:14;36638:58;;;36664:1;36657:8;;;;;;36638:58;36689:7;;;;;:::i;:::-;;;;36596:116;36577:3;;;;;:::i;:::-;;;;36545:178;;;;36735:53;;;;;;;;;;:::i;:::-;;;;;;;;36306:490;;;;;:::o;41467:83::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41532:12:::1;;;;;;;;;;;41531:13;41516:12;;:28;;;;;;;;;;;;;;;;;;41467:83::o:0;43695:314::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1:::1;3215:7;;:19;;3207:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1;3348:7;:18;;;;43774:7:::2;:5;:7::i;:::-;43760:21;;:10;:21;;;43752:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;43810:8;40347:42;43824:16;;43875:3;43872:2;43848:21;:26;;;;:::i;:::-;:30;;;;:::i;:::-;43824:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43809:74;;;43898:3;43890:12;;;::::0;::::2;;43912:10;40454:42;43928:18;;43954:21;43928:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43911:69;;;43995:5;43987:14;;;::::0;::::2;;43745:264;;2573:1:::1;3527:7;:22;;;;43695:314::o:0;26465:185::-;26603:39;26620:4;26626:2;26630:7;26603:39;;;;;;;;;;;;:16;:39::i;:::-;26465:185;;;:::o;36017:205::-;36092:7;36128;:14;;;;36120:5;:22;36112:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36209:5;36202:12;;36017:205;;;:::o;41369:92::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41447:8:::1;41437:7;:18;;;;;;;;;;;;:::i;:::-;;41369:92:::0;:::o;40289:100::-;40347:42;40289:100;:::o;39754:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;23754:326::-;23871:7;23896:13;23912:7;23920;23912:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23896:32;;23978:1;23961:19;;:5;:19;;;;23939:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24067:5;24060:12;;;23754:326;;;:::o;39815:51::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40154:66::-;40218:2;40154:66;:::o;40091:58::-;40145:4;40091:58;:::o;23300:392::-;23422:4;23470:1;23453:19;;:5;:19;;;;23445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23532:10;23558:6;23553:109;23570:7;:14;;;;23566:1;:18;23553:109;;;23617:7;23625:1;23617:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23608:19;;:5;:19;;;23604:46;;;23643:7;;;;:::i;:::-;;;23604:46;23586:3;;;;:::i;:::-;;;23553:109;;;;23679:5;23672:12;;;23300:392;;;:::o;38457:103::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38522:30:::1;38549:1;38522:18;:30::i;:::-;38457:103::o:0;41562:564::-;2617:1;3215:7;;:19;;3207:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1;3348:7;:18;;;;41636:12:::1;;;;;;;;;;;41628:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;40218:2;41695:39;41719:14;41695:7;:19;41703:10;41695:19;;;;;;;;;;;;;;;;:23;;:39;;;;:::i;:::-;:59;41687:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;40280:4;41837:33;41855:14;41837:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:44;41829:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41936:6;41932:94;41952:14;41948:1;:18;41932:94;;;41982:36;41992:10;42004:13;:11;:13::i;:::-;41982:9;:36::i;:::-;41968:3;;;;;:::i;:::-;;;;41932:94;;;;42057:14;42034:7;:19;42042:10;42034:19;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;42106:14;42078:12;:24;42091:10;42078:24;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;2573:1:::0;3527:7;:22;;;;41562:564;:::o;42867:472::-;42928:16;42954:18;42975:17;42985:6;42975:9;:17::i;:::-;42954:38;;43017:1;43003:10;:15;42999:335;;;43082:1;43068:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43061:23;;;;;42999:335;43107:23;43147:10;43133:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43107:51;;43167:13;43189:116;43213:10;43205:5;:18;43189:116;;;43261:34;43281:6;43289:5;43261:19;:34::i;:::-;43245:6;43252:5;43245:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;43225:7;;;;;:::i;:::-;;;;43189:116;;;43320:6;43313:13;;;;;42867:472;;;;:::o;37806:87::-;37852:7;37879:6;;;;;;;;;;;37872:13;;37806:87;:::o;24316:104::-;24372:13;24405:7;24398:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24316:104;:::o;25339:327::-;25486:12;:10;:12::i;:::-;25474:24;;:8;:24;;;;25466:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25586:8;25541:18;:32;25560:12;:10;:12::i;:::-;25541:32;;;;;;;;;;;;;;;:42;25574:8;25541:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25639:8;25610:48;;25625:12;:10;:12::i;:::-;25610:48;;;25649:8;25610:48;;;;;;:::i;:::-;;;;;;;;25339:327;;:::o;40023:63::-;40084:2;40023:63;:::o;39615:65::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40225:59::-;40280:4;40225:59;:::o;26721:365::-;26910:41;26929:12;:10;:12::i;:::-;26943:7;26910:18;:41::i;:::-;26888:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27039:39;27053:4;27059:2;27063:7;27072:5;27039:13;:39::i;:::-;26721:365;;;;:::o;42138:721::-;2617:1;3215:7;;:19;;3207:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1;3348:7;:18;;;;42221:12:::1;;;;;;;;;;;42213:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;42297:1;42280:14;:18;42272:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;40084:2;42346:14;:31;42338:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;40218:2;42435:44;42464:14;42435:12;:24;42448:10;42435:24;;;;;;;;;;;;;;;;:28;;:44;;;;:::i;:::-;:64;42427:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;40145:4;42586:33;42604:14;42586:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:43;42578:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;42694:31;42710:14;40001:17;42694:15;;:31;;;;:::i;:::-;42681:9;:44;42673:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42764:6;42760:94;42780:14;42776:1;:18;42760:94;;;42810:36;42820:10;42832:13;:11;:13::i;:::-;42810:9;:36::i;:::-;42796:3;;;;;:::i;:::-;;;;42760:94;;;;2573:1:::0;3527:7;:22;;;;42138:721;:::o;41007:228::-;41066:13;41096:17;41104:8;41096:7;:17::i;:::-;41088:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;41177:7;41186:26;41203:8;41186:16;:26::i;:::-;41214:13;;;;;;;;;;;;;;;;;41160:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41146:83;;41007:228;;;:::o;39685:64::-;;;;;;;;;;;;;:::o;40721:140::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40834:21:::1;40811:20;;:44;;;;;;;;;;;;;;;;;;40721:140:::0;:::o;39943:75::-;40001:17;39943:75;:::o;43345:342::-;43435:4;43448:34;43506:20;;;;;;;;;;;43448:79;;43580:8;43538:50;;43546:13;:21;;;43568:6;43546:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43538:50;;;:76;;;;43592:12;:22;43605:8;43592:22;;;;;;;;;;;;;;;;;;;;;;;;;43538:76;43534:93;;;43623:4;43616:11;;;;;43534:93;43641:40;43664:6;43672:8;43641:22;:40::i;:::-;43634:47;;;43345:342;;;;;:::o;39547:63::-;;;;;;;;;;;;;:::o;38715:201::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38824:1:::1;38804:22;;:8;:22;;;;38796:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38880:28;38899:8;38880:18;:28::i;:::-;38715:201:::0;:::o;40869:132::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40969:12:::1;:26;40982:12;40969:26;;;;;;;;;;;;;;;;;;;;;;;;;40968:27;40939:12;:26;40952:12;40939:26;;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;40869:132:::0;:::o;39871:67::-;;;;;;;;;;;;;;;;;;;:::o;22881:355::-;23028:4;23085:25;23070:40;;;:11;:40;;;;:105;;;;23142:33;23127:48;;;:11;:48;;;;23070:105;:158;;;;23192:36;23216:11;23192:23;:36::i;:::-;23070:158;23050:178;;22881:355;;;:::o;28633:155::-;28698:4;28732:7;:14;;;;28722:7;:24;:58;;;;;28778:1;28750:30;;:7;28758;28750:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;28722:58;28715:65;;28633:155;;;:::o;658:98::-;711:7;738:10;731:17;;658:98;:::o;32658:174::-;32760:2;32733:15;:24;32749:7;32733:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32816:7;32812:2;32778:46;;32787:23;32802:7;32787:14;:23::i;:::-;32778:46;;;;;;;;;;;;32658:174;;:::o;28955:452::-;29084:4;29128:16;29136:7;29128;:16::i;:::-;29106:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29227:13;29243:23;29258:7;29243:14;:23::i;:::-;29227:39;;29296:5;29285:16;;:7;:16;;;:64;;;;29342:7;29318:31;;:20;29330:7;29318:11;:20::i;:::-;:31;;;29285:64;:113;;;;29366:32;29383:5;29390:7;29366:16;:32::i;:::-;29285:113;29277:122;;;28955:452;;;;:::o;31987:553::-;32160:4;32133:31;;:23;32148:7;32133:14;:23::i;:::-;:31;;;32111:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;32266:1;32252:16;;:2;:16;;;;32244:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32322:39;32343:4;32349:2;32353:7;32322:20;:39::i;:::-;32426:29;32443:1;32447:7;32426:8;:29::i;:::-;32485:2;32466:7;32474;32466:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32524:7;32520:2;32505:27;;32514:4;32505:27;;;;;;;;;;;;31987:553;;;:::o;39076:191::-;39150:16;39169:6;;;;;;;;;;;39150:25;;39195:8;39186:6;;:17;;;;;;;;;;;;;;;;;;39250:8;39219:40;;39240:8;39219:40;;;;;;;;;;;;39139:128;39076:191;:::o;15642:98::-;15700:7;15731:1;15727;:5;;;;:::i;:::-;15720:12;;15642:98;;;;:::o;29749:110::-;29825:26;29835:2;29839:7;29825:26;;;;;;;;;;;;:9;:26::i;:::-;29749:110;;:::o;27968:352::-;28125:28;28135:4;28141:2;28145:7;28125:9;:28::i;:::-;28186:48;28209:4;28215:2;28219:7;28228:5;28186:22;:48::i;:::-;28164:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27968:352;;;;:::o;16380:98::-;16438:7;16469:1;16465;:5;;;;:::i;:::-;16458:12;;16380:98;;;;:::o;20366:723::-;20422:13;20652:1;20643:5;:10;20639:53;;;20670:10;;;;;;;;;;;;;;;;;;;;;20639:53;20702:12;20717:5;20702:20;;20733:14;20758:78;20773:1;20765:4;:9;20758:78;;20791:8;;;;;:::i;:::-;;;;20822:2;20814:10;;;;;:::i;:::-;;;20758:78;;;20846:19;20878:6;20868:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20846:39;;20896:154;20912:1;20903:5;:10;20896:154;;20940:1;20930:11;;;;;:::i;:::-;;;21007:2;20999:5;:10;;;;:::i;:::-;20986:2;:24;;;;:::i;:::-;20973:39;;20956:6;20963;20956:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21036:2;21027:11;;;;;:::i;:::-;;;20896:154;;;21074:6;21060:21;;;;;20366:723;;;;:::o;25737:214::-;25879:4;25908:18;:25;25927:5;25908:25;;;;;;;;;;;;;;;:35;25934:8;25908:35;;;;;;;;;;;;;;;;;;;;;;;;;25901:42;;25737:214;;;;:::o;12678:157::-;12763:4;12802:25;12787:40;;;:11;:40;;;;12780:47;;12678:157;;;:::o;34949:126::-;;;;:::o;30086:321::-;30216:18;30222:2;30226:7;30216:5;:18::i;:::-;30267:54;30298:1;30302:2;30306:7;30315:5;30267:22;:54::i;:::-;30245:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30086:321;;;:::o;33397:980::-;33552:4;33573:15;:2;:13;;;:15::i;:::-;33569:801;;;33642:2;33626:36;;;33685:12;:10;:12::i;:::-;33720:4;33747:7;33777:5;33626:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33605:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34001:1;33984:6;:13;:18;33980:320;;;34027:108;;;;;;;;;;:::i;:::-;;;;;;;;33980:320;34250:6;34244:13;34235:6;34231:2;34227:15;34220:38;33605:710;33875:41;;;33865:51;;;:6;:51;;;;33858:58;;;;;33569:801;34354:4;34347:11;;33397:980;;;;;;;:::o;30743:346::-;30837:1;30823:16;;:2;:16;;;;30815:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30896:16;30904:7;30896;:16::i;:::-;30895:17;30887:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30958:45;30987:1;30991:2;30995:7;30958:20;:45::i;:::-;31014:7;31027:2;31014:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31073:7;31069:2;31048:33;;31065:1;31048:33;;;;;;;;;;;;30743:346;;:::o;19857:193::-;19917:4;19934:9;19998:7;19986:20;19978:28;;20041:1;20034:4;:8;20027:15;;;19857:193;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:118::-;1839:24;1857:5;1839:24;:::i;:::-;1834:3;1827:37;1752:118;;:::o;1876:222::-;1969:4;2007:2;1996:9;1992:18;1984:26;;2020:71;2088:1;2077:9;2073:17;2064:6;2020:71;:::i;:::-;1876:222;;;;:::o;2104:99::-;2156:6;2190:5;2184:12;2174:22;;2104:99;;;:::o;2209:169::-;2293:11;2327:6;2322:3;2315:19;2367:4;2362:3;2358:14;2343:29;;2209:169;;;;:::o;2384:307::-;2452:1;2462:113;2476:6;2473:1;2470:13;2462:113;;;2561:1;2556:3;2552:11;2546:18;2542:1;2537:3;2533:11;2526:39;2498:2;2495:1;2491:10;2486:15;;2462:113;;;2593:6;2590:1;2587:13;2584:101;;;2673:1;2664:6;2659:3;2655:16;2648:27;2584:101;2433:258;2384:307;;;:::o;2697:102::-;2738:6;2789:2;2785:7;2780:2;2773:5;2769:14;2765:28;2755:38;;2697:102;;;:::o;2805:364::-;2893:3;2921:39;2954:5;2921:39;:::i;:::-;2976:71;3040:6;3035:3;2976:71;:::i;:::-;2969:78;;3056:52;3101:6;3096:3;3089:4;3082:5;3078:16;3056:52;:::i;:::-;3133:29;3155:6;3133:29;:::i;:::-;3128:3;3124:39;3117:46;;2897:272;2805:364;;;;:::o;3175:313::-;3288:4;3326:2;3315:9;3311:18;3303:26;;3375:9;3369:4;3365:20;3361:1;3350:9;3346:17;3339:47;3403:78;3476:4;3467:6;3403:78;:::i;:::-;3395:86;;3175:313;;;;:::o;3494:77::-;3531:7;3560:5;3549:16;;3494:77;;;:::o;3577:122::-;3650:24;3668:5;3650:24;:::i;:::-;3643:5;3640:35;3630:63;;3689:1;3686;3679:12;3630:63;3577:122;:::o;3705:139::-;3751:5;3789:6;3776:20;3767:29;;3805:33;3832:5;3805:33;:::i;:::-;3705:139;;;;:::o;3850:329::-;3909:6;3958:2;3946:9;3937:7;3933:23;3929:32;3926:119;;;3964:79;;:::i;:::-;3926:119;4084:1;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;:::i;:::-;4099:63;;4055:117;3850:329;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:114::-;8938:6;8972:5;8966:12;8956:22;;8871:114;;;:::o;8991:184::-;9090:11;9124:6;9119:3;9112:19;9164:4;9159:3;9155:14;9140:29;;8991:184;;;;:::o;9181:132::-;9248:4;9271:3;9263:11;;9301:4;9296:3;9292:14;9284:22;;9181:132;;;:::o;9319:108::-;9396:24;9414:5;9396:24;:::i;:::-;9391:3;9384:37;9319:108;;:::o;9433:179::-;9502:10;9523:46;9565:3;9557:6;9523:46;:::i;:::-;9601:4;9596:3;9592:14;9578:28;;9433:179;;;;:::o;9618:113::-;9688:4;9720;9715:3;9711:14;9703:22;;9618:113;;;:::o;9767:732::-;9886:3;9915:54;9963:5;9915:54;:::i;:::-;9985:86;10064:6;10059:3;9985:86;:::i;:::-;9978:93;;10095:56;10145:5;10095:56;:::i;:::-;10174:7;10205:1;10190:284;10215:6;10212:1;10209:13;10190:284;;;10291:6;10285:13;10318:63;10377:3;10362:13;10318:63;:::i;:::-;10311:70;;10404:60;10457:6;10404:60;:::i;:::-;10394:70;;10250:224;10237:1;10234;10230:9;10225:14;;10190:284;;;10194:14;10490:3;10483:10;;9891:608;;;9767:732;;;;:::o;10505:373::-;10648:4;10686:2;10675:9;10671:18;10663:26;;10735:9;10729:4;10725:20;10721:1;10710:9;10706:17;10699:47;10763:108;10866:4;10857:6;10763:108;:::i;:::-;10755:116;;10505:373;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:474::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13905:1;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13876:117;14032:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14003:118;13654:474;;;;;:::o;14134:180::-;14182:77;14179:1;14172:88;14279:4;14276:1;14269:15;14303:4;14300:1;14293:15;14320:320;14364:6;14401:1;14395:4;14391:12;14381:22;;14448:1;14442:4;14438:12;14469:18;14459:81;;14525:4;14517:6;14513:17;14503:27;;14459:81;14587:2;14579:6;14576:14;14556:18;14553:38;14550:84;;;14606:18;;:::i;:::-;14550:84;14371:269;14320:320;;;:::o;14646:231::-;14786:34;14782:1;14774:6;14770:14;14763:58;14855:14;14850:2;14842:6;14838:15;14831:39;14646:231;:::o;14883:366::-;15025:3;15046:67;15110:2;15105:3;15046:67;:::i;:::-;15039:74;;15122:93;15211:3;15122:93;:::i;:::-;15240:2;15235:3;15231:12;15224:19;;14883:366;;;:::o;15255:419::-;15421:4;15459:2;15448:9;15444:18;15436:26;;15508:9;15502:4;15498:20;15494:1;15483:9;15479:17;15472:47;15536:131;15662:4;15536:131;:::i;:::-;15528:139;;15255:419;;;:::o;15680:220::-;15820:34;15816:1;15808:6;15804:14;15797:58;15889:3;15884:2;15876:6;15872:15;15865:28;15680:220;:::o;15906:366::-;16048:3;16069:67;16133:2;16128:3;16069:67;:::i;:::-;16062:74;;16145:93;16234:3;16145:93;:::i;:::-;16263:2;16258:3;16254:12;16247:19;;15906:366;;;:::o;16278:419::-;16444:4;16482:2;16471:9;16467:18;16459:26;;16531:9;16525:4;16521:20;16517:1;16506:9;16502:17;16495:47;16559:131;16685:4;16559:131;:::i;:::-;16551:139;;16278:419;;;:::o;16703:243::-;16843:34;16839:1;16831:6;16827:14;16820:58;16912:26;16907:2;16899:6;16895:15;16888:51;16703:243;:::o;16952:366::-;17094:3;17115:67;17179:2;17174:3;17115:67;:::i;:::-;17108:74;;17191:93;17280:3;17191:93;:::i;:::-;17309:2;17304:3;17300:12;17293:19;;16952:366;;;:::o;17324:419::-;17490:4;17528:2;17517:9;17513:18;17505:26;;17577:9;17571:4;17567:20;17563:1;17552:9;17548:17;17541:47;17605:131;17731:4;17605:131;:::i;:::-;17597:139;;17324:419;;;:::o;17749:182::-;17889:34;17885:1;17877:6;17873:14;17866:58;17749:182;:::o;17937:366::-;18079:3;18100:67;18164:2;18159:3;18100:67;:::i;:::-;18093:74;;18176:93;18265:3;18176:93;:::i;:::-;18294:2;18289:3;18285:12;18278:19;;17937:366;;;:::o;18309:419::-;18475:4;18513:2;18502:9;18498:18;18490:26;;18562:9;18556:4;18552:20;18548:1;18537:9;18533:17;18526:47;18590:131;18716:4;18590:131;:::i;:::-;18582:139;;18309:419;;;:::o;18734:236::-;18874:34;18870:1;18862:6;18858:14;18851:58;18943:19;18938:2;18930:6;18926:15;18919:44;18734:236;:::o;18976:366::-;19118:3;19139:67;19203:2;19198:3;19139:67;:::i;:::-;19132:74;;19215:93;19304:3;19215:93;:::i;:::-;19333:2;19328:3;19324:12;19317:19;;18976:366;;;:::o;19348:419::-;19514:4;19552:2;19541:9;19537:18;19529:26;;19601:9;19595:4;19591:20;19587:1;19576:9;19572:17;19565:47;19629:131;19755:4;19629:131;:::i;:::-;19621:139;;19348:419;;;:::o;19773:230::-;19913:34;19909:1;19901:6;19897:14;19890:58;19982:13;19977:2;19969:6;19965:15;19958:38;19773:230;:::o;20009:366::-;20151:3;20172:67;20236:2;20231:3;20172:67;:::i;:::-;20165:74;;20248:93;20337:3;20248:93;:::i;:::-;20366:2;20361:3;20357:12;20350:19;;20009:366;;;:::o;20381:419::-;20547:4;20585:2;20574:9;20570:18;20562:26;;20634:9;20628:4;20624:20;20620:1;20609:9;20605:17;20598:47;20662:131;20788:4;20662:131;:::i;:::-;20654:139;;20381:419;;;:::o;20806:180::-;20854:77;20851:1;20844:88;20951:4;20948:1;20941:15;20975:4;20972:1;20965:15;20992:180;21040:77;21037:1;21030:88;21137:4;21134:1;21127:15;21161:4;21158:1;21151:15;21178:233;21217:3;21240:24;21258:5;21240:24;:::i;:::-;21231:33;;21286:66;21279:5;21276:77;21273:103;;;21356:18;;:::i;:::-;21273:103;21403:1;21396:5;21392:13;21385:20;;21178:233;;;:::o;21417:181::-;21557:33;21553:1;21545:6;21541:14;21534:57;21417:181;:::o;21604:366::-;21746:3;21767:67;21831:2;21826:3;21767:67;:::i;:::-;21760:74;;21843:93;21932:3;21843:93;:::i;:::-;21961:2;21956:3;21952:12;21945:19;;21604:366;;;:::o;21976:419::-;22142:4;22180:2;22169:9;22165:18;22157:26;;22229:9;22223:4;22219:20;22215:1;22204:9;22200:17;22193:47;22257:131;22383:4;22257:131;:::i;:::-;22249:139;;21976:419;;;:::o;22401:164::-;22541:16;22537:1;22529:6;22525:14;22518:40;22401:164;:::o;22571:366::-;22713:3;22734:67;22798:2;22793:3;22734:67;:::i;:::-;22727:74;;22810:93;22899:3;22810:93;:::i;:::-;22928:2;22923:3;22919:12;22912:19;;22571:366;;;:::o;22943:419::-;23109:4;23147:2;23136:9;23132:18;23124:26;;23196:9;23190:4;23186:20;23182:1;23171:9;23167:17;23160:47;23224:131;23350:4;23224:131;:::i;:::-;23216:139;;22943:419;;;:::o;23368:348::-;23408:7;23431:20;23449:1;23431:20;:::i;:::-;23426:25;;23465:20;23483:1;23465:20;:::i;:::-;23460:25;;23653:1;23585:66;23581:74;23578:1;23575:81;23570:1;23563:9;23556:17;23552:105;23549:131;;;23660:18;;:::i;:::-;23549:131;23708:1;23705;23701:9;23690:20;;23368:348;;;;:::o;23722:180::-;23770:77;23767:1;23760:88;23867:4;23864:1;23857:15;23891:4;23888:1;23881:15;23908:185;23948:1;23965:20;23983:1;23965:20;:::i;:::-;23960:25;;23999:20;24017:1;23999:20;:::i;:::-;23994:25;;24038:1;24028:35;;24043:18;;:::i;:::-;24028:35;24085:1;24082;24078:9;24073:14;;23908:185;;;;:::o;24099:147::-;24200:11;24237:3;24222:18;;24099:147;;;;:::o;24252:114::-;;:::o;24372:398::-;24531:3;24552:83;24633:1;24628:3;24552:83;:::i;:::-;24545:90;;24644:93;24733:3;24644:93;:::i;:::-;24762:1;24757:3;24753:11;24746:18;;24372:398;;;:::o;24776:379::-;24960:3;24982:147;25125:3;24982:147;:::i;:::-;24975:154;;25146:3;25139:10;;24776:379;;;:::o;25161:231::-;25301:34;25297:1;25289:6;25285:14;25278:58;25370:14;25365:2;25357:6;25353:15;25346:39;25161:231;:::o;25398:366::-;25540:3;25561:67;25625:2;25620:3;25561:67;:::i;:::-;25554:74;;25637:93;25726:3;25637:93;:::i;:::-;25755:2;25750:3;25746:12;25739:19;;25398:366;;;:::o;25770:419::-;25936:4;25974:2;25963:9;25959:18;25951:26;;26023:9;26017:4;26013:20;26009:1;25998:9;25994:17;25987:47;26051:131;26177:4;26051:131;:::i;:::-;26043:139;;25770:419;;;:::o;26195:228::-;26335:34;26331:1;26323:6;26319:14;26312:58;26404:11;26399:2;26391:6;26387:15;26380:36;26195:228;:::o;26429:366::-;26571:3;26592:67;26656:2;26651:3;26592:67;:::i;:::-;26585:74;;26668:93;26757:3;26668:93;:::i;:::-;26786:2;26781:3;26777:12;26770:19;;26429:366;;;:::o;26801:419::-;26967:4;27005:2;26994:9;26990:18;26982:26;;27054:9;27048:4;27044:20;27040:1;27029:9;27025:17;27018:47;27082:131;27208:4;27082:131;:::i;:::-;27074:139;;26801:419;;;:::o;27226:229::-;27366:34;27362:1;27354:6;27350:14;27343:58;27435:12;27430:2;27422:6;27418:15;27411:37;27226:229;:::o;27461:366::-;27603:3;27624:67;27688:2;27683:3;27624:67;:::i;:::-;27617:74;;27700:93;27789:3;27700:93;:::i;:::-;27818:2;27813:3;27809:12;27802:19;;27461:366;;;:::o;27833:419::-;27999:4;28037:2;28026:9;28022:18;28014:26;;28086:9;28080:4;28076:20;28072:1;28061:9;28057:17;28050:47;28114:131;28240:4;28114:131;:::i;:::-;28106:139;;27833:419;;;:::o;28258:177::-;28398:29;28394:1;28386:6;28382:14;28375:53;28258:177;:::o;28441:366::-;28583:3;28604:67;28668:2;28663:3;28604:67;:::i;:::-;28597:74;;28680:93;28769:3;28680:93;:::i;:::-;28798:2;28793:3;28789:12;28782:19;;28441:366;;;:::o;28813:419::-;28979:4;29017:2;29006:9;29002:18;28994:26;;29066:9;29060:4;29056:20;29052:1;29041:9;29037:17;29030:47;29094:131;29220:4;29094:131;:::i;:::-;29086:139;;28813:419;;;:::o;29238:250::-;29378:34;29374:1;29366:6;29362:14;29355:58;29447:33;29442:2;29434:6;29430:15;29423:58;29238:250;:::o;29494:366::-;29636:3;29657:67;29721:2;29716:3;29657:67;:::i;:::-;29650:74;;29733:93;29822:3;29733:93;:::i;:::-;29851:2;29846:3;29842:12;29835:19;;29494:366;;;:::o;29866:419::-;30032:4;30070:2;30059:9;30055:18;30047:26;;30119:9;30113:4;30109:20;30105:1;30094:9;30090:17;30083:47;30147:131;30273:4;30147:131;:::i;:::-;30139:139;;29866:419;;;:::o;30291:220::-;30431:34;30427:1;30419:6;30415:14;30408:58;30500:3;30495:2;30487:6;30483:15;30476:28;30291:220;:::o;30517:366::-;30659:3;30680:67;30744:2;30739:3;30680:67;:::i;:::-;30673:74;;30756:93;30845:3;30756:93;:::i;:::-;30874:2;30869:3;30865:12;30858:19;;30517:366;;;:::o;30889:419::-;31055:4;31093:2;31082:9;31078:18;31070:26;;31142:9;31136:4;31132:20;31128:1;31117:9;31113:17;31106:47;31170:131;31296:4;31170:131;:::i;:::-;31162:139;;30889:419;;;:::o;31314:305::-;31354:3;31373:20;31391:1;31373:20;:::i;:::-;31368:25;;31407:20;31425:1;31407:20;:::i;:::-;31402:25;;31561:1;31493:66;31489:74;31486:1;31483:81;31480:107;;;31567:18;;:::i;:::-;31480:107;31611:1;31608;31604:9;31597:16;;31314:305;;;;:::o;31625:175::-;31765:27;31761:1;31753:6;31749:14;31742:51;31625:175;:::o;31806:366::-;31948:3;31969:67;32033:2;32028:3;31969:67;:::i;:::-;31962:74;;32045:93;32134:3;32045:93;:::i;:::-;32163:2;32158:3;32154:12;32147:19;;31806:366;;;:::o;32178:419::-;32344:4;32382:2;32371:9;32367:18;32359:26;;32431:9;32425:4;32421:20;32417:1;32406:9;32402:17;32395:47;32459:131;32585:4;32459:131;:::i;:::-;32451:139;;32178:419;;;:::o;32603:178::-;32743:30;32739:1;32731:6;32727:14;32720:54;32603:178;:::o;32787:366::-;32929:3;32950:67;33014:2;33009:3;32950:67;:::i;:::-;32943:74;;33026:93;33115:3;33026:93;:::i;:::-;33144:2;33139:3;33135:12;33128:19;;32787:366;;;:::o;33159:419::-;33325:4;33363:2;33352:9;33348:18;33340:26;;33412:9;33406:4;33402:20;33398:1;33387:9;33383:17;33376:47;33440:131;33566:4;33440:131;:::i;:::-;33432:139;;33159:419;;;:::o;33584:225::-;33724:34;33720:1;33712:6;33708:14;33701:58;33793:8;33788:2;33780:6;33776:15;33769:33;33584:225;:::o;33815:366::-;33957:3;33978:67;34042:2;34037:3;33978:67;:::i;:::-;33971:74;;34054:93;34143:3;34054:93;:::i;:::-;34172:2;34167:3;34163:12;34156:19;;33815:366;;;:::o;34187:419::-;34353:4;34391:2;34380:9;34376:18;34368:26;;34440:9;34434:4;34430:20;34426:1;34415:9;34411:17;34404:47;34468:131;34594:4;34468:131;:::i;:::-;34460:139;;34187:419;;;:::o;34612:291::-;34752:34;34748:1;34740:6;34736:14;34729:58;34821:34;34816:2;34808:6;34804:15;34797:59;34890:5;34885:2;34877:6;34873:15;34866:30;34612:291;:::o;34909:366::-;35051:3;35072:67;35136:2;35131:3;35072:67;:::i;:::-;35065:74;;35148:93;35237:3;35148:93;:::i;:::-;35266:2;35261:3;35257:12;35250:19;;34909:366;;;:::o;35281:419::-;35447:4;35485:2;35474:9;35470:18;35462:26;;35534:9;35528:4;35524:20;35520:1;35509:9;35505:17;35498:47;35562:131;35688:4;35562:131;:::i;:::-;35554:139;;35281:419;;;:::o;35706:182::-;35846:34;35842:1;35834:6;35830:14;35823:58;35706:182;:::o;35894:366::-;36036:3;36057:67;36121:2;36116:3;36057:67;:::i;:::-;36050:74;;36133:93;36222:3;36133:93;:::i;:::-;36251:2;36246:3;36242:12;36235:19;;35894:366;;;:::o;36266:419::-;36432:4;36470:2;36459:9;36455:18;36447:26;;36519:9;36513:4;36509:20;36505:1;36494:9;36490:17;36483:47;36547:131;36673:4;36547:131;:::i;:::-;36539:139;;36266:419;;;:::o;36691:167::-;36831:19;36827:1;36819:6;36815:14;36808:43;36691:167;:::o;36864:366::-;37006:3;37027:67;37091:2;37086:3;37027:67;:::i;:::-;37020:74;;37103:93;37192:3;37103:93;:::i;:::-;37221:2;37216:3;37212:12;37205:19;;36864:366;;;:::o;37236:419::-;37402:4;37440:2;37429:9;37425:18;37417:26;;37489:9;37483:4;37479:20;37475:1;37464:9;37460:17;37453:47;37517:131;37643:4;37517:131;:::i;:::-;37509:139;;37236:419;;;:::o;37661:171::-;37801:23;37797:1;37789:6;37785:14;37778:47;37661:171;:::o;37838:366::-;37980:3;38001:67;38065:2;38060:3;38001:67;:::i;:::-;37994:74;;38077:93;38166:3;38077:93;:::i;:::-;38195:2;38190:3;38186:12;38179:19;;37838:366;;;:::o;38210:419::-;38376:4;38414:2;38403:9;38399:18;38391:26;;38463:9;38457:4;38453:20;38449:1;38438:9;38434:17;38427:47;38491:131;38617:4;38491:131;:::i;:::-;38483:139;;38210:419;;;:::o;38635:148::-;38737:11;38774:3;38759:18;;38635:148;;;;:::o;38789:141::-;38838:4;38861:3;38853:11;;38884:3;38881:1;38874:14;38918:4;38915:1;38905:18;38897:26;;38789:141;;;:::o;38960:845::-;39063:3;39100:5;39094:12;39129:36;39155:9;39129:36;:::i;:::-;39181:89;39263:6;39258:3;39181:89;:::i;:::-;39174:96;;39301:1;39290:9;39286:17;39317:1;39312:137;;;;39463:1;39458:341;;;;39279:520;;39312:137;39396:4;39392:9;39381;39377:25;39372:3;39365:38;39432:6;39427:3;39423:16;39416:23;;39312:137;;39458:341;39525:38;39557:5;39525:38;:::i;:::-;39585:1;39599:154;39613:6;39610:1;39607:13;39599:154;;;39687:7;39681:14;39677:1;39672:3;39668:11;39661:35;39737:1;39728:7;39724:15;39713:26;;39635:4;39632:1;39628:12;39623:17;;39599:154;;;39782:6;39777:3;39773:16;39766:23;;39465:334;;39279:520;;39067:738;;38960:845;;;;:::o;39811:377::-;39917:3;39945:39;39978:5;39945:39;:::i;:::-;40000:89;40082:6;40077:3;40000:89;:::i;:::-;39993:96;;40098:52;40143:6;40138:3;40131:4;40124:5;40120:16;40098:52;:::i;:::-;40175:6;40170:3;40166:16;40159:23;;39921:267;39811:377;;;;:::o;40194:589::-;40419:3;40441:92;40529:3;40520:6;40441:92;:::i;:::-;40434:99;;40550:95;40641:3;40632:6;40550:95;:::i;:::-;40543:102;;40662:95;40753:3;40744:6;40662:95;:::i;:::-;40655:102;;40774:3;40767:10;;40194:589;;;;;;:::o;40789:125::-;40855:7;40884:24;40902:5;40884:24;:::i;:::-;40873:35;;40789:125;;;:::o;40920:180::-;41022:53;41069:5;41022:53;:::i;:::-;41015:5;41012:64;41002:92;;41090:1;41087;41080:12;41002:92;40920:180;:::o;41106:201::-;41192:5;41223:6;41217:13;41208:22;;41239:62;41295:5;41239:62;:::i;:::-;41106:201;;;;:::o;41313:409::-;41412:6;41461:2;41449:9;41440:7;41436:23;41432:32;41429:119;;;41467:79;;:::i;:::-;41429:119;41587:1;41612:93;41697:7;41688:6;41677:9;41673:22;41612:93;:::i;:::-;41602:103;;41558:157;41313:409;;;;:::o;41728:225::-;41868:34;41864:1;41856:6;41852:14;41845:58;41937:8;41932:2;41924:6;41920:15;41913:33;41728:225;:::o;41959:366::-;42101:3;42122:67;42186:2;42181:3;42122:67;:::i;:::-;42115:74;;42198:93;42287:3;42198:93;:::i;:::-;42316:2;42311:3;42307:12;42300:19;;41959:366;;;:::o;42331:419::-;42497:4;42535:2;42524:9;42520:18;42512:26;;42584:9;42578:4;42574:20;42570:1;42559:9;42555:17;42548:47;42612:131;42738:4;42612:131;:::i;:::-;42604:139;;42331:419;;;:::o;42756:231::-;42896:34;42892:1;42884:6;42880:14;42873:58;42965:14;42960:2;42952:6;42948:15;42941:39;42756:231;:::o;42993:366::-;43135:3;43156:67;43220:2;43215:3;43156:67;:::i;:::-;43149:74;;43232:93;43321:3;43232:93;:::i;:::-;43350:2;43345:3;43341:12;43334:19;;42993:366;;;:::o;43365:419::-;43531:4;43569:2;43558:9;43554:18;43546:26;;43618:9;43612:4;43608:20;43604:1;43593:9;43589:17;43582:47;43646:131;43772:4;43646:131;:::i;:::-;43638:139;;43365:419;;;:::o;43790:228::-;43930:34;43926:1;43918:6;43914:14;43907:58;43999:11;43994:2;43986:6;43982:15;43975:36;43790:228;:::o;44024:366::-;44166:3;44187:67;44251:2;44246:3;44187:67;:::i;:::-;44180:74;;44263:93;44352:3;44263:93;:::i;:::-;44381:2;44376:3;44372:12;44365:19;;44024:366;;;:::o;44396:419::-;44562:4;44600:2;44589:9;44585:18;44577:26;;44649:9;44643:4;44639:20;44635:1;44624:9;44620:17;44613:47;44677:131;44803:4;44677:131;:::i;:::-;44669:139;;44396:419;;;:::o;44821:223::-;44961:34;44957:1;44949:6;44945:14;44938:58;45030:6;45025:2;45017:6;45013:15;45006:31;44821:223;:::o;45050:366::-;45192:3;45213:67;45277:2;45272:3;45213:67;:::i;:::-;45206:74;;45289:93;45378:3;45289:93;:::i;:::-;45407:2;45402:3;45398:12;45391:19;;45050:366;;;:::o;45422:419::-;45588:4;45626:2;45615:9;45611:18;45603:26;;45675:9;45669:4;45665:20;45661:1;45650:9;45646:17;45639:47;45703:131;45829:4;45703:131;:::i;:::-;45695:139;;45422:419;;;:::o;45847:237::-;45987:34;45983:1;45975:6;45971:14;45964:58;46056:20;46051:2;46043:6;46039:15;46032:45;45847:237;:::o;46090:366::-;46232:3;46253:67;46317:2;46312:3;46253:67;:::i;:::-;46246:74;;46329:93;46418:3;46329:93;:::i;:::-;46447:2;46442:3;46438:12;46431:19;;46090:366;;;:::o;46462:419::-;46628:4;46666:2;46655:9;46651:18;46643:26;;46715:9;46709:4;46705:20;46701:1;46690:9;46686:17;46679:47;46743:131;46869:4;46743:131;:::i;:::-;46735:139;;46462:419;;;:::o;46887:191::-;46927:4;46947:20;46965:1;46947:20;:::i;:::-;46942:25;;46981:20;46999:1;46981:20;:::i;:::-;46976:25;;47020:1;47017;47014:8;47011:34;;;47025:18;;:::i;:::-;47011:34;47070:1;47067;47063:9;47055:17;;46887:191;;;;:::o;47084:176::-;47116:1;47133:20;47151:1;47133:20;:::i;:::-;47128:25;;47167:20;47185:1;47167:20;:::i;:::-;47162:25;;47206:1;47196:35;;47211:18;;:::i;:::-;47196:35;47252:1;47249;47245:9;47240:14;;47084:176;;;;:::o;47266:98::-;47317:6;47351:5;47345:12;47335:22;;47266:98;;;:::o;47370:168::-;47453:11;47487:6;47482:3;47475:19;47527:4;47522:3;47518:14;47503:29;;47370:168;;;;:::o;47544:360::-;47630:3;47658:38;47690:5;47658:38;:::i;:::-;47712:70;47775:6;47770:3;47712:70;:::i;:::-;47705:77;;47791:52;47836:6;47831:3;47824:4;47817:5;47813:16;47791:52;:::i;:::-;47868:29;47890:6;47868:29;:::i;:::-;47863:3;47859:39;47852:46;;47634:270;47544:360;;;;:::o;47910:640::-;48105:4;48143:3;48132:9;48128:19;48120:27;;48157:71;48225:1;48214:9;48210:17;48201:6;48157:71;:::i;:::-;48238:72;48306:2;48295:9;48291:18;48282:6;48238:72;:::i;:::-;48320;48388:2;48377:9;48373:18;48364:6;48320:72;:::i;:::-;48439:9;48433:4;48429:20;48424:2;48413:9;48409:18;48402:48;48467:76;48538:4;48529:6;48467:76;:::i;:::-;48459:84;;47910:640;;;;;;;:::o;48556:141::-;48612:5;48643:6;48637:13;48628:22;;48659:32;48685:5;48659:32;:::i;:::-;48556:141;;;;:::o;48703:349::-;48772:6;48821:2;48809:9;48800:7;48796:23;48792:32;48789:119;;;48827:79;;:::i;:::-;48789:119;48947:1;48972:63;49027:7;49018:6;49007:9;49003:22;48972:63;:::i;:::-;48962:73;;48918:127;48703:349;;;;:::o;49058:182::-;49198:34;49194:1;49186:6;49182:14;49175:58;49058:182;:::o;49246:366::-;49388:3;49409:67;49473:2;49468:3;49409:67;:::i;:::-;49402:74;;49485:93;49574:3;49485:93;:::i;:::-;49603:2;49598:3;49594:12;49587:19;;49246:366;;;:::o;49618:419::-;49784:4;49822:2;49811:9;49807:18;49799:26;;49871:9;49865:4;49861:20;49857:1;49846:9;49842:17;49835:47;49899:131;50025:4;49899:131;:::i;:::-;49891:139;;49618:419;;;:::o;50043:178::-;50183:30;50179:1;50171:6;50167:14;50160:54;50043:178;:::o;50227:366::-;50369:3;50390:67;50454:2;50449:3;50390:67;:::i;:::-;50383:74;;50466:93;50555:3;50466:93;:::i;:::-;50584:2;50579:3;50575:12;50568:19;;50227:366;;;:::o;50599:419::-;50765:4;50803:2;50792:9;50788:18;50780:26;;50852:9;50846:4;50842:20;50838:1;50827:9;50823:17;50816:47;50880:131;51006:4;50880:131;:::i;:::-;50872:139;;50599:419;;;:::o

Swarm Source

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