ETH Price: $3,306.58 (+1.75%)
Gas: 3 Gwei

Token

DollFaceNFT (FACE)
 

Overview

Max Total Supply

400 FACE

Holders

204

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FACE
0x38572eE4A73399241221FC3dDcB15230A088b3d1
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DollFaceNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/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 no longer needed starting with Solidity 0.8. 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;
        }
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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 _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @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.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @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-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: DollFace.sol


pragma solidity ^0.8.0;





contract DollFaceNFT is
    ERC721Enumerable,
    Ownable
{
    
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    using SafeMath for uint256;

    uint256 private constant MAX_ELEMENTS = 10000;
    uint256 private MAX_SERIES = 4500;
    uint256 private MAX_FREE = 1000;
    uint256 private PRICE = 8 * 10**14;
    uint256 private WHITELISTPRICE = 5 * 10**14;
    uint256 private constant MAX_BY_MINT = 5;
    address private PAYABLEWALLET = 0x37cda608aae1fA8706F64CD3F1DeA863A4d6116A;
    address private PUBLICWHITELISTVALIDATOR = 0x71300d93a8CdF93385Af9635388cF2D00b95a480;
    string public baseTokenURI;
    mapping (address=>uint256) private _whiteListNumberMinted;
    mapping (address=>uint256) private _whiteListSpecial;
    mapping (address=>bool) private _team;
    bool private _mainSalePaused = true;
    bool private _whiteListPaused = true;
    bool private _freePaused = true;
    
    event CreateDoll(address minter, uint256 minted);

    constructor(string memory baseURI) 
    ERC721("DollFaceNFT", "FACE") 
    {
        setBaseURI(baseURI);
        _team[0x5B5A73a5d0529F8147B71dD571A1aE1C2822aaD9] = true;
        _team[0x425A2Ca37C24b96A3935E78f54C31D8AAC78208f] = true;
        _team[0xaE76e19c875fb425987D1a376Aee8820657cE63D] = true;
        _team[0x72eb30D3ca53f5e839325E2eACf535E70a9e6987] = true;
        _team[0x254A338013CdC3D691BfbE00c5674581A746fa45] = true;
    }
    
    function isMainSaleActive() public view returns (bool) {
        if(totalSupply() < MAX_ELEMENTS && _mainSalePaused == false && totalSupply() < MAX_SERIES)
        {
            return true;
        } else {
            return false;
        }
    }
    
    function isWhitelistSaleActive() public view returns (bool) {
        if(totalSupply() < MAX_ELEMENTS && _whiteListPaused == false && totalSupply() < MAX_SERIES)
        {
            return true;
        } else {
            return false;
        }
    }
    function isFreeSaleActive() public view returns (bool) {
        if(totalSupply() < MAX_FREE && _freePaused == false)
        {
            return true;
        } else {
            return false;
        }
    }

    function isOnTeam(address a) public view returns (bool) {
        return _team[a];
    }

    function getMaxSeries() public view returns (uint256) {
        return MAX_SERIES;
    }

    function mint(uint256 _count) public payable {
        require(_mainSalePaused == false, "Sale not active.");
        require(_count > 0, "Mint needs to be greater than 0");
        require(_count <= MAX_BY_MINT, "Minting too many");
        require(totalSupply() < MAX_ELEMENTS, "Sale has ended");
        require(totalSupply() + _count <= MAX_ELEMENTS, "Minting too many");
        require(msg.value >= (PRICE * _count), "Not enough ETH");
        require(totalSupply() < MAX_SERIES, "Series Minting Over");

        for (uint j = 0; j<_count; j++) {  
             _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
            emit CreateDoll(msg.sender, newItemId);
        }
    
    }

    function whitelistMint(uint256 _count, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccessPublic(_v, _r, _s) public payable {
        require(_whiteListPaused == false, "Whitelist Sale not active.");
        require(_count > 0, "Mint needs to be greater than 0");
        require(_count <= 3, "Minting too many. Select 3 or less.");
        require(totalSupply() < MAX_SERIES, "Whitelist sale has ended");
        require(totalSupply() + _count <= MAX_SERIES, "Minting too many");
        require(msg.value >= (WHITELISTPRICE * _count), "Not enough ETH");

        bool canMint = false;
        if (_whiteListNumberMinted[msg.sender] + _count <= 3)
        {
            canMint = true;
        } 
        require(canMint == true, "Address has already minted or trying to mint too many.");

        for (uint j = 0; j<_count; j++) {
             _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
            emit CreateDoll(msg.sender, newItemId);
        }
         _whiteListNumberMinted[msg.sender] = _whiteListNumberMinted[msg.sender] + _count;
    
    }
    
    function freeMint(uint256 _count, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable {
        require(_freePaused == false, "Free sale not active.");
        require(totalSupply() < MAX_FREE, "Free sale has ended");
        require(totalSupply() + _count <= MAX_FREE, "Minting too many");

        bool canMint = false;
        if(_whiteListSpecial[msg.sender] > 0 && (_whiteListNumberMinted[msg.sender] + _count) <= _whiteListSpecial[msg.sender])
        {
            canMint = true;
        } else if (_whiteListNumberMinted[msg.sender] + _count <= 2)
        {
            canMint = true;
        } 

        require(canMint == true, "Address has already minted or trying to mint too many.");
        
        for (uint j = 0; j<_count; j++) {  
            _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
            emit CreateDoll(msg.sender, newItemId);
        }

        _whiteListNumberMinted[msg.sender] = _whiteListNumberMinted[msg.sender] + _count;
    }

    function teamMint(uint256 _count) public payable {
        require(_count <= MAX_BY_MINT, "Minting too many");
        require(totalSupply() < MAX_ELEMENTS, "Sale has ended");
        require(totalSupply() + _count <= MAX_ELEMENTS, "Minting too many");
        require(_team[msg.sender] == true, "Not allowed");

        for (uint j = 0; j<_count; j++) {  
             _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
            emit CreateDoll(msg.sender, newItemId);
        }

    }

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

    function setWhiteListSpecial(address _address, uint256 _numberOfMints) public onlyOwner {
        _whiteListSpecial[_address] = _numberOfMints;
    }
    
    function setPauseMainSale(bool _newPause) public onlyOwner {
        _mainSalePaused = _newPause;
    }
    
    function setPauseWhiteList(bool _newPause) public onlyOwner {
        _whiteListPaused = _newPause;
    }

    function setPauseFree(bool _newPause) public onlyOwner {
        _freePaused = _newPause;
    }

    function setMainSalePrice(uint256 _newPrice) public onlyOwner {
        PRICE = _newPrice;
    }

    function setWhiteListPrice(uint256 _newPrice) public onlyOwner {
        WHITELISTPRICE = _newPrice;
    }

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

    function setMaxSeries(uint256 _supply) public onlyOwner {
        MAX_SERIES = _supply;
    }
    
    function setPayableWallet(address _newWallet) public onlyOwner {
        PAYABLEWALLET = _newWallet;
    }

    function setPublicWhitelistValidator(address _newWallet) public onlyOwner {
        PUBLICWHITELISTVALIDATOR = _newWallet;
    }

    function walletOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }

        return tokensId;
    }

    function withdrawAll() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        _withdraw(PAYABLEWALLET, address(this).balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s)
    {
        require(isValidAccessMessage(msg.sender,_v,_r,_s), "Not Whitelisted");
        _;
    }

    modifier onlyValidAccessPublic(uint8 _v, bytes32 _r, bytes32 _s)
    {
        require(isValidAccessMessagePublicSale(msg.sender,_v,_r,_s), "Not Whitelisted");
        _;
    }
    
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) public view returns (bool)
    {
          bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
          bytes memory prefix = "\x19Ethereum Signed Message:\n32";
          return owner() == ecrecover(keccak256(abi.encodePacked(prefix, hash)),_v,_r,_s);
    }

    function isValidAccessMessagePublicSale(address _add, uint8 _v, bytes32 _r, bytes32 _s) public view returns (bool)
    {
          bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
          bytes memory prefix = "\x19Ethereum Signed Message:\n32";
          return PUBLICWHITELISTVALIDATOR == ecrecover(keccak256(abi.encodePacked(prefix, hash)),_v,_r,_s);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"minted","type":"uint256"}],"name":"CreateDoll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSeries","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFreeSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMainSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"isOnTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessagePublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","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":[],"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":[{"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":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMainSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSeries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newPause","type":"bool"}],"name":"setPauseFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newPause","type":"bool"}],"name":"setPauseMainSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newPause","type":"bool"}],"name":"setPauseWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"setPayableWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"setPublicWhitelistValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setWhiteListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_numberOfMints","type":"uint256"}],"name":"setWhiteListSpecial","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":"_count","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","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":"","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":[],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052611194600c556103e8600d556602d79883d20000600e556601c6bf52634000600f557337cda608aae1fa8706f64cd3f1dea863a4d6116a601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507371300d93a8cdf93385af9635388cf2d00b95a480601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601660006101000a81548160ff0219169083151502179055506001601660016101000a81548160ff0219169083151502179055506001601660026101000a81548160ff0219169083151502179055503480156200012e57600080fd5b506040516200678a3803806200678a833981810160405281019062000154919062000719565b6040518060400160405280600b81526020017f446f6c6c466163654e46540000000000000000000000000000000000000000008152506040518060400160405280600481526020017f46414345000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001d8929190620005eb565b508060019080519060200190620001f1929190620005eb565b50505062000214620002086200044860201b60201c565b6200045060201b60201c565b62000225816200051660201b60201c565b600160156000735b5a73a5d0529f8147b71dd571a1ae1c2822aad973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016015600073425a2ca37c24b96a3935e78f54c31d8aac78208f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016015600073ae76e19c875fb425987d1a376aee8820657ce63d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560007372eb30d3ca53f5e839325e2eacf535e70a9e698773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016015600073254a338013cdc3d691bfbe00c5674581a746fa4573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062000971565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005266200044860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200054c620005c160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200059c9062000791565b60405180910390fd5b8060129080519060200190620005bd929190620005eb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620005f99062000859565b90600052602060002090601f0160209004810192826200061d576000855562000669565b82601f106200063857805160ff191683800117855562000669565b8280016001018555821562000669579182015b82811115620006685782518255916020019190600101906200064b565b5b5090506200067891906200067c565b5090565b5b80821115620006975760008160009055506001016200067d565b5090565b6000620006b2620006ac84620007dc565b620007b3565b905082815260208101848484011115620006d157620006d062000928565b5b620006de84828562000823565b509392505050565b600082601f830112620006fe57620006fd62000923565b5b8151620007108482602086016200069b565b91505092915050565b60006020828403121562000732576200073162000932565b5b600082015167ffffffffffffffff8111156200075357620007526200092d565b5b6200076184828501620006e6565b91505092915050565b60006200077960208362000812565b9150620007868262000948565b602082019050919050565b60006020820190508181036000830152620007ac816200076a565b9050919050565b6000620007bf620007d2565b9050620007cd82826200088f565b919050565b6000604051905090565b600067ffffffffffffffff821115620007fa57620007f9620008f4565b5b620008058262000937565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200084357808201518184015260208101905062000826565b8381111562000853576000848401525b50505050565b600060028204905060018216806200087257607f821691505b60208210811415620008895762000888620008c5565b5b50919050565b6200089a8262000937565b810181811067ffffffffffffffff82111715620008bc57620008bb620008f4565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b615e0980620009816000396000f3fe60806040526004361061025b5760003560e01c806370a0823111610144578063b3b2cb7a116100b6578063d547cfb71161007a578063d547cfb7146108d2578063e985e9c5146108fd578063f07bba651461093a578063f2fde38b14610963578063f46c5b671461098c578063fc8f689a146109b75761025b565b8063b3b2cb7a146107ed578063b88d4fde14610818578063b98451cf14610841578063beafc89b1461086c578063c87b56dd146108955761025b565b80638da5cb5b116101085780638da5cb5b1461070057806395d89b411461072b5780639907563514610756578063a0712d681461077f578063a22cb4651461079b578063af16a51d146107c45761025b565b806370a082311461063c578063715018a61461067957806372418d6d14610690578063746c35e6146106b9578063853828b6146106f65761025b565b806332624114116101dd5780634794b08a116101a15780634794b08a1461051c5780634f6ccce71461054557806355f804b3146105825780635c847e4f146105ab57806362f09640146105d45780636352211e146105ff5761025b565b80633262411414610420578063415b56871461045d57806342842e0e1461047957806343542a66146104a2578063438b6300146104df5761025b565b806318160ddd1161022457806318160ddd1461034a57806323b872dd1461037557806326500f361461039e5780632f745c59146103c75780632fbba115146104045761025b565b8062a1990e1461026057806301ffc9a71461027c57806306fdde03146102b9578063081812fc146102e4578063095ea7b314610321575b600080fd5b61027a6004803603810190610275919061437b565b6109e0565b005b34801561028857600080fd5b506102a3600480360381019061029e91906142ab565b610db0565b6040516102b09190614b99565b60405180910390f35b3480156102c557600080fd5b506102ce610e2a565b6040516102db9190614bf9565b60405180910390f35b3480156102f057600080fd5b5061030b6004803603810190610306919061434e565b610ebc565b6040516103189190614ae7565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906141d7565b610f41565b005b34801561035657600080fd5b5061035f611059565b60405161036c919061503b565b60405180910390f35b34801561038157600080fd5b5061039c600480360381019061039791906140c1565b611066565b005b3480156103aa57600080fd5b506103c560048036038101906103c0919061434e565b6110c6565b005b3480156103d357600080fd5b506103ee60048036038101906103e991906141d7565b61114c565b6040516103fb919061503b565b60405180910390f35b61041e6004803603810190610419919061434e565b6111f1565b005b34801561042c57600080fd5b5061044760048036038101906104429190614217565b6113e8565b6040516104549190614b99565b60405180910390f35b6104776004803603810190610472919061437b565b611508565b005b34801561048557600080fd5b506104a0600480360381019061049b91906140c1565b6118e7565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190614217565b611907565b6040516104d69190614b99565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190614054565b611a42565b6040516105139190614b77565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e91906141d7565b611af0565b005b34801561055157600080fd5b5061056c6004803603810190610567919061434e565b611bb4565b604051610579919061503b565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614305565b611c25565b005b3480156105b757600080fd5b506105d260048036038101906105cd9190614054565b611cbb565b005b3480156105e057600080fd5b506105e9611d7b565b6040516105f69190614b99565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061434e565b611dbe565b6040516106339190614ae7565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190614054565b611e70565b604051610670919061503b565b60405180910390f35b34801561068557600080fd5b5061068e611f28565b005b34801561069c57600080fd5b506106b760048036038101906106b2919061427e565b611fb0565b005b3480156106c557600080fd5b506106e060048036038101906106db9190614054565b612049565b6040516106ed9190614b99565b60405180910390f35b6106fe61209f565b005b34801561070c57600080fd5b5061071561215c565b6040516107229190614ae7565b60405180910390f35b34801561073757600080fd5b50610740612186565b60405161074d9190614bf9565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190614054565b612218565b005b6107996004803603810190610794919061434e565b6122d8565b005b3480156107a757600080fd5b506107c260048036038101906107bd9190614197565b612570565b005b3480156107d057600080fd5b506107eb60048036038101906107e6919061427e565b6126f1565b005b3480156107f957600080fd5b5061080261278a565b60405161080f9190614b99565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190614114565b6127e1565b005b34801561084d57600080fd5b50610856612843565b6040516108639190614b99565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e919061434e565b61289a565b005b3480156108a157600080fd5b506108bc60048036038101906108b7919061434e565b612920565b6040516108c99190614bf9565b60405180910390f35b3480156108de57600080fd5b506108e76129c7565b6040516108f49190614bf9565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190614081565b612a55565b6040516109319190614b99565b60405180910390f35b34801561094657600080fd5b50610961600480360381019061095c919061434e565b612ae9565b005b34801561096f57600080fd5b5061098a60048036038101906109859190614054565b612b6f565b005b34801561099857600080fd5b506109a1612c67565b6040516109ae919061503b565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d9919061427e565b612c71565b005b8282826109ef33848484611907565b610a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2590614fdb565b60405180910390fd5b60001515601660019054906101000a900460ff16151514610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90614f7b565b60405180910390fd5b60008711610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90614c1b565b60405180910390fd5b6003871115610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614dfb565b60405180910390fd5b600c54610b16611059565b10610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d9061501b565b60405180910390fd5b600c5487610b62611059565b610b6c9190615164565b1115610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614c9b565b60405180910390fd5b86600f54610bbb91906151eb565b341015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490614e1b565b60405180910390fd5b6000600388601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c4c9190615164565b11610c5657600190505b6001151581151514610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490614fbb565b60405180910390fd5b60005b88811015610d1757610cb2600b612d0a565b6000610cbe600b612d20565b9050610cca3382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea1033382604051610cfb929190614b4e565b60405180910390a1508080610d0f906153a9565b915050610ca0565b5087601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d639190615164565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e235750610e2282612efc565b5b9050919050565b606060008054610e3990615346565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6590615346565b8015610eb25780601f10610e8757610100808354040283529160200191610eb2565b820191906000526020600020905b815481529060010190602001808311610e9557829003601f168201915b5050505050905090565b6000610ec782612fde565b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90614e3b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f4c82611dbe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490614efb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fdc61304a565b73ffffffffffffffffffffffffffffffffffffffff16148061100b575061100a8161100561304a565b612a55565b5b61104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190614d7b565b60405180910390fd5b6110548383613052565b505050565b6000600880549050905090565b61107761107161304a565b8261310b565b6110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90614f5b565b60405180910390fd5b6110c18383836131e9565b505050565b6110ce61304a565b73ffffffffffffffffffffffffffffffffffffffff166110ec61215c565b73ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990614e7b565b60405180910390fd5b80600c8190555050565b600061115783611e70565b8210611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614c3b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6005811115611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614c9b565b60405180910390fd5b612710611240611059565b10611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790614cfb565b60405180910390fd5b6127108161128c611059565b6112969190615164565b11156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614c9b565b60405180910390fd5b60011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136190614e5b565b60405180910390fd5b60005b818110156113e45761137f600b612d0a565b600061138b600b612d20565b90506113973382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea10333826040516113c8929190614b4e565b60405180910390a15080806113dc906153a9565b91505061136d565b5050565b60008030866040516020016113fe929190614a5a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060018183604051602001611465929190614a86565b604051602081830303815290604052805190602001208787876040516000815260200160405260405161149b9493929190614bb4565b6020604051602081039080840390855afa1580156114bd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166114e561215c565b73ffffffffffffffffffffffffffffffffffffffff161492505050949350505050565b828282611517338484846113e8565b611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90614fdb565b60405180910390fd5b60001515601660029054906101000a900460ff161515146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390614f1b565b60405180910390fd5b600d546115b7611059565b106115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90614ffb565b60405180910390fd5b600d5487611603611059565b61160d9190615164565b111561164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590614c9b565b60405180910390fd5b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156117275750601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205488601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117249190615164565b11155b15611735576001905061178d565b600288601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117829190615164565b1161178c57600190505b5b60011515811515146117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb90614fbb565b60405180910390fd5b60005b8881101561184e576117e9600b612d0a565b60006117f5600b612d20565b90506118013382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea1033382604051611832929190614b4e565b60405180910390a1508080611846906153a9565b9150506117d7565b5087601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461189a9190615164565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050505050565b611902838383604051806020016040528060008152506127e1565b505050565b600080308660405160200161191d929190614a5a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060018183604051602001611984929190614a86565b60405160208183030381529060405280519060200120878787604051600081526020016040526040516119ba9493929190614bb4565b6020604051602081039080840390855afa1580156119dc573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161492505050949350505050565b60606000611a4f83611e70565b905060008167ffffffffffffffff811115611a6d57611a6c61553c565b5b604051908082528060200260200182016040528015611a9b5781602001602082028036833780820191505090505b50905060005b82811015611ae557611ab3858261114c565b828281518110611ac657611ac561550d565b5b6020026020010181815250508080611add906153a9565b915050611aa1565b508092505050919050565b611af861304a565b73ffffffffffffffffffffffffffffffffffffffff16611b1661215c565b73ffffffffffffffffffffffffffffffffffffffff1614611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6390614e7b565b60405180910390fd5b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000611bbe611059565b8210611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690614f9b565b60405180910390fd5b60088281548110611c1357611c1261550d565b5b90600052602060002001549050919050565b611c2d61304a565b73ffffffffffffffffffffffffffffffffffffffff16611c4b61215c565b73ffffffffffffffffffffffffffffffffffffffff1614611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890614e7b565b60405180910390fd5b8060129080519060200190611cb7929190613e3e565b5050565b611cc361304a565b73ffffffffffffffffffffffffffffffffffffffff16611ce161215c565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90614e7b565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600d54611d88611059565b108015611da8575060001515601660029054906101000a900460ff161515145b15611db65760019050611dbb565b600090505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614dbb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614d9b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f3061304a565b73ffffffffffffffffffffffffffffffffffffffff16611f4e61215c565b73ffffffffffffffffffffffffffffffffffffffff1614611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90614e7b565b60405180910390fd5b611fae6000613445565b565b611fb861304a565b73ffffffffffffffffffffffffffffffffffffffff16611fd661215c565b73ffffffffffffffffffffffffffffffffffffffff161461202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390614e7b565b60405180910390fd5b80601660016101000a81548160ff02191690831515021790555050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6120a761304a565b73ffffffffffffffffffffffffffffffffffffffff166120c561215c565b73ffffffffffffffffffffffffffffffffffffffff161461211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290614e7b565b60405180910390fd5b60004790506000811161212d57600080fd5b612159601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff164761350b565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461219590615346565b80601f01602080910402602001604051908101604052809291908181526020018280546121c190615346565b801561220e5780601f106121e35761010080835404028352916020019161220e565b820191906000526020600020905b8154815290600101906020018083116121f157829003601f168201915b5050505050905090565b61222061304a565b73ffffffffffffffffffffffffffffffffffffffff1661223e61215c565b73ffffffffffffffffffffffffffffffffffffffff1614612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b90614e7b565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60001515601660009054906101000a900460ff1615151461232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590614cdb565b60405180910390fd5b60008111612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890614c1b565b60405180910390fd5b60058111156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90614c9b565b60405180910390fd5b6127106123c0611059565b10612400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f790614cfb565b60405180910390fd5b6127108161240c611059565b6124169190615164565b1115612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90614c9b565b60405180910390fd5b80600e5461246591906151eb565b3410156124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e90614e1b565b60405180910390fd5b600c546124b2611059565b106124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e990614edb565b60405180910390fd5b60005b8181101561256c57612507600b612d0a565b6000612513600b612d20565b905061251f3382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea1033382604051612550929190614b4e565b60405180910390a1508080612564906153a9565b9150506124f5565b5050565b61257861304a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614d3b565b60405180910390fd5b80600560006125f361304a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166126a061304a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126e59190614b99565b60405180910390a35050565b6126f961304a565b73ffffffffffffffffffffffffffffffffffffffff1661271761215c565b73ffffffffffffffffffffffffffffffffffffffff161461276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490614e7b565b60405180910390fd5b80601660026101000a81548160ff02191690831515021790555050565b6000612710612797611059565b1080156127b7575060001515601660009054906101000a900460ff161515145b80156127cb5750600c546127c9611059565b105b156127d957600190506127de565b600090505b90565b6127f26127ec61304a565b8361310b565b612831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282890614f5b565b60405180910390fd5b61283d848484846135bc565b50505050565b6000612710612850611059565b108015612870575060001515601660019054906101000a900460ff161515145b80156128845750600c54612882611059565b105b156128925760019050612897565b600090505b90565b6128a261304a565b73ffffffffffffffffffffffffffffffffffffffff166128c061215c565b73ffffffffffffffffffffffffffffffffffffffff1614612916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290d90614e7b565b60405180910390fd5b80600f8190555050565b606061292b82612fde565b61296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296190614ebb565b60405180910390fd5b6000612974613618565b9050600081511161299457604051806020016040528060008152506129bf565b8061299e846136aa565b6040516020016129af929190614aae565b6040516020818303038152906040525b915050919050565b601280546129d490615346565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0090615346565b8015612a4d5780601f10612a2257610100808354040283529160200191612a4d565b820191906000526020600020905b815481529060010190602001808311612a3057829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612af161304a565b73ffffffffffffffffffffffffffffffffffffffff16612b0f61215c565b73ffffffffffffffffffffffffffffffffffffffff1614612b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5c90614e7b565b60405180910390fd5b80600e8190555050565b612b7761304a565b73ffffffffffffffffffffffffffffffffffffffff16612b9561215c565b73ffffffffffffffffffffffffffffffffffffffff1614612beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be290614e7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5290614c7b565b60405180910390fd5b612c6481613445565b50565b6000600c54905090565b612c7961304a565b73ffffffffffffffffffffffffffffffffffffffff16612c9761215c565b73ffffffffffffffffffffffffffffffffffffffff1614612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce490614e7b565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9590614ddb565b60405180910390fd5b612da781612fde565b15612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614cbb565b60405180910390fd5b612df36000838361380b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e439190615164565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fc757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fd75750612fd68261391f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166130c583611dbe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061311682612fde565b613155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314c90614d5b565b60405180910390fd5b600061316083611dbe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806131cf57508373ffffffffffffffffffffffffffffffffffffffff166131b784610ebc565b73ffffffffffffffffffffffffffffffffffffffff16145b806131e057506131df8185612a55565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661320982611dbe565b73ffffffffffffffffffffffffffffffffffffffff161461325f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325690614e9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c690614d1b565b60405180910390fd5b6132da83838361380b565b6132e5600082613052565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133359190615245565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461338c9190615164565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161353190614ad2565b60006040518083038185875af1925050503d806000811461356e576040519150601f19603f3d011682016040523d82523d6000602084013e613573565b606091505b50509050806135b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ae90614f3b565b60405180910390fd5b505050565b6135c78484846131e9565b6135d384848484613989565b613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990614c5b565b60405180910390fd5b50505050565b60606012805461362790615346565b80601f016020809104026020016040519081016040528092919081815260200182805461365390615346565b80156136a05780601f10613675576101008083540402835291602001916136a0565b820191906000526020600020905b81548152906001019060200180831161368357829003601f168201915b5050505050905090565b606060008214156136f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613806565b600082905060005b6000821461372457808061370d906153a9565b915050600a8261371d91906151ba565b91506136fa565b60008167ffffffffffffffff8111156137405761373f61553c565b5b6040519080825280601f01601f1916602001820160405280156137725781602001600182028036833780820191505090505b5090505b600085146137ff5760018261378b9190615245565b9150600a8561379a9190615420565b60306137a69190615164565b60f81b8183815181106137bc576137bb61550d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137f891906151ba565b9450613776565b8093505050505b919050565b613816838383613b20565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138595761385481613b25565b613898565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613897576138968382613b6e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138db576138d681613cdb565b61391a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613919576139188282613dac565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006139aa8473ffffffffffffffffffffffffffffffffffffffff16613e2b565b15613b13578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139d361304a565b8786866040518563ffffffff1660e01b81526004016139f59493929190614b02565b602060405180830381600087803b158015613a0f57600080fd5b505af1925050508015613a4057506040513d601f19601f82011682018060405250810190613a3d91906142d8565b60015b613ac3573d8060008114613a70576040519150601f19603f3d011682016040523d82523d6000602084013e613a75565b606091505b50600081511415613abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab290614c5b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b18565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b7b84611e70565b613b859190615245565b9050600060076000848152602001908152602001600020549050818114613c6a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613cef9190615245565b9050600060096000848152602001908152602001600020549050600060088381548110613d1f57613d1e61550d565b5b906000526020600020015490508060088381548110613d4157613d4061550d565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d9057613d8f6154de565b5b6001900381819060005260206000200160009055905550505050565b6000613db783611e70565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613e4a90615346565b90600052602060002090601f016020900481019282613e6c5760008555613eb3565b82601f10613e8557805160ff1916838001178555613eb3565b82800160010185558215613eb3579182015b82811115613eb2578251825591602001919060010190613e97565b5b509050613ec09190613ec4565b5090565b5b80821115613edd576000816000905550600101613ec5565b5090565b6000613ef4613eef8461507b565b615056565b905082815260208101848484011115613f1057613f0f615570565b5b613f1b848285615304565b509392505050565b6000613f36613f31846150ac565b615056565b905082815260208101848484011115613f5257613f51615570565b5b613f5d848285615304565b509392505050565b600081359050613f7481615d49565b92915050565b600081359050613f8981615d60565b92915050565b600081359050613f9e81615d77565b92915050565b600081359050613fb381615d8e565b92915050565b600081519050613fc881615d8e565b92915050565b600082601f830112613fe357613fe261556b565b5b8135613ff3848260208601613ee1565b91505092915050565b600082601f8301126140115761401061556b565b5b8135614021848260208601613f23565b91505092915050565b60008135905061403981615da5565b92915050565b60008135905061404e81615dbc565b92915050565b60006020828403121561406a5761406961557a565b5b600061407884828501613f65565b91505092915050565b600080604083850312156140985761409761557a565b5b60006140a685828601613f65565b92505060206140b785828601613f65565b9150509250929050565b6000806000606084860312156140da576140d961557a565b5b60006140e886828701613f65565b93505060206140f986828701613f65565b925050604061410a8682870161402a565b9150509250925092565b6000806000806080858703121561412e5761412d61557a565b5b600061413c87828801613f65565b945050602061414d87828801613f65565b935050604061415e8782880161402a565b925050606085013567ffffffffffffffff81111561417f5761417e615575565b5b61418b87828801613fce565b91505092959194509250565b600080604083850312156141ae576141ad61557a565b5b60006141bc85828601613f65565b92505060206141cd85828601613f7a565b9150509250929050565b600080604083850312156141ee576141ed61557a565b5b60006141fc85828601613f65565b925050602061420d8582860161402a565b9150509250929050565b600080600080608085870312156142315761423061557a565b5b600061423f87828801613f65565b94505060206142508782880161403f565b935050604061426187828801613f8f565b925050606061427287828801613f8f565b91505092959194509250565b6000602082840312156142945761429361557a565b5b60006142a284828501613f7a565b91505092915050565b6000602082840312156142c1576142c061557a565b5b60006142cf84828501613fa4565b91505092915050565b6000602082840312156142ee576142ed61557a565b5b60006142fc84828501613fb9565b91505092915050565b60006020828403121561431b5761431a61557a565b5b600082013567ffffffffffffffff81111561433957614338615575565b5b61434584828501613ffc565b91505092915050565b6000602082840312156143645761436361557a565b5b60006143728482850161402a565b91505092915050565b600080600080608085870312156143955761439461557a565b5b60006143a38782880161402a565b94505060206143b48782880161403f565b93505060406143c587828801613f8f565b92505060606143d687828801613f8f565b91505092959194509250565b60006143ee8383614a2d565b60208301905092915050565b61440381615279565b82525050565b61441a61441582615279565b6153f2565b82525050565b600061442b826150ed565b614435818561511b565b9350614440836150dd565b8060005b8381101561447157815161445888826143e2565b97506144638361510e565b925050600181019050614444565b5085935050505092915050565b6144878161528b565b82525050565b61449681615297565b82525050565b6144ad6144a882615297565b615404565b82525050565b60006144be826150f8565b6144c8818561512c565b93506144d8818560208601615313565b6144e18161557f565b840191505092915050565b60006144f7826150f8565b614501818561513d565b9350614511818560208601615313565b80840191505092915050565b600061452882615103565b6145328185615148565b9350614542818560208601615313565b61454b8161557f565b840191505092915050565b600061456182615103565b61456b8185615159565b935061457b818560208601615313565b80840191505092915050565b6000614594601f83615148565b915061459f8261559d565b602082019050919050565b60006145b7602b83615148565b91506145c2826155c6565b604082019050919050565b60006145da603283615148565b91506145e582615615565b604082019050919050565b60006145fd602683615148565b915061460882615664565b604082019050919050565b6000614620601083615148565b915061462b826156b3565b602082019050919050565b6000614643601c83615148565b915061464e826156dc565b602082019050919050565b6000614666601083615148565b915061467182615705565b602082019050919050565b6000614689600e83615148565b91506146948261572e565b602082019050919050565b60006146ac602483615148565b91506146b782615757565b604082019050919050565b60006146cf601983615148565b91506146da826157a6565b602082019050919050565b60006146f2602c83615148565b91506146fd826157cf565b604082019050919050565b6000614715603883615148565b91506147208261581e565b604082019050919050565b6000614738602a83615148565b91506147438261586d565b604082019050919050565b600061475b602983615148565b9150614766826158bc565b604082019050919050565b600061477e602083615148565b91506147898261590b565b602082019050919050565b60006147a1602383615148565b91506147ac82615934565b604082019050919050565b60006147c4600e83615148565b91506147cf82615983565b602082019050919050565b60006147e7602c83615148565b91506147f2826159ac565b604082019050919050565b600061480a600b83615148565b9150614815826159fb565b602082019050919050565b600061482d602083615148565b915061483882615a24565b602082019050919050565b6000614850602983615148565b915061485b82615a4d565b604082019050919050565b6000614873602f83615148565b915061487e82615a9c565b604082019050919050565b6000614896601383615148565b91506148a182615aeb565b602082019050919050565b60006148b9602183615148565b91506148c482615b14565b604082019050919050565b60006148dc601583615148565b91506148e782615b63565b602082019050919050565b60006148ff60008361513d565b915061490a82615b8c565b600082019050919050565b6000614922601083615148565b915061492d82615b8f565b602082019050919050565b6000614945603183615148565b915061495082615bb8565b604082019050919050565b6000614968601a83615148565b915061497382615c07565b602082019050919050565b600061498b602c83615148565b915061499682615c30565b604082019050919050565b60006149ae603683615148565b91506149b982615c7f565b604082019050919050565b60006149d1600f83615148565b91506149dc82615cce565b602082019050919050565b60006149f4601383615148565b91506149ff82615cf7565b602082019050919050565b6000614a17601883615148565b9150614a2282615d20565b602082019050919050565b614a36816152ed565b82525050565b614a45816152ed565b82525050565b614a54816152f7565b82525050565b6000614a668285614409565b601482019150614a768284614409565b6014820191508190509392505050565b6000614a9282856144ec565b9150614a9e828461449c565b6020820191508190509392505050565b6000614aba8285614556565b9150614ac68284614556565b91508190509392505050565b6000614add826148f2565b9150819050919050565b6000602082019050614afc60008301846143fa565b92915050565b6000608082019050614b1760008301876143fa565b614b2460208301866143fa565b614b316040830185614a3c565b8181036060830152614b4381846144b3565b905095945050505050565b6000604082019050614b6360008301856143fa565b614b706020830184614a3c565b9392505050565b60006020820190508181036000830152614b918184614420565b905092915050565b6000602082019050614bae600083018461447e565b92915050565b6000608082019050614bc9600083018761448d565b614bd66020830186614a4b565b614be3604083018561448d565b614bf0606083018461448d565b95945050505050565b60006020820190508181036000830152614c13818461451d565b905092915050565b60006020820190508181036000830152614c3481614587565b9050919050565b60006020820190508181036000830152614c54816145aa565b9050919050565b60006020820190508181036000830152614c74816145cd565b9050919050565b60006020820190508181036000830152614c94816145f0565b9050919050565b60006020820190508181036000830152614cb481614613565b9050919050565b60006020820190508181036000830152614cd481614636565b9050919050565b60006020820190508181036000830152614cf481614659565b9050919050565b60006020820190508181036000830152614d148161467c565b9050919050565b60006020820190508181036000830152614d348161469f565b9050919050565b60006020820190508181036000830152614d54816146c2565b9050919050565b60006020820190508181036000830152614d74816146e5565b9050919050565b60006020820190508181036000830152614d9481614708565b9050919050565b60006020820190508181036000830152614db48161472b565b9050919050565b60006020820190508181036000830152614dd48161474e565b9050919050565b60006020820190508181036000830152614df481614771565b9050919050565b60006020820190508181036000830152614e1481614794565b9050919050565b60006020820190508181036000830152614e34816147b7565b9050919050565b60006020820190508181036000830152614e54816147da565b9050919050565b60006020820190508181036000830152614e74816147fd565b9050919050565b60006020820190508181036000830152614e9481614820565b9050919050565b60006020820190508181036000830152614eb481614843565b9050919050565b60006020820190508181036000830152614ed481614866565b9050919050565b60006020820190508181036000830152614ef481614889565b9050919050565b60006020820190508181036000830152614f14816148ac565b9050919050565b60006020820190508181036000830152614f34816148cf565b9050919050565b60006020820190508181036000830152614f5481614915565b9050919050565b60006020820190508181036000830152614f7481614938565b9050919050565b60006020820190508181036000830152614f948161495b565b9050919050565b60006020820190508181036000830152614fb48161497e565b9050919050565b60006020820190508181036000830152614fd4816149a1565b9050919050565b60006020820190508181036000830152614ff4816149c4565b9050919050565b60006020820190508181036000830152615014816149e7565b9050919050565b6000602082019050818103600083015261503481614a0a565b9050919050565b60006020820190506150506000830184614a3c565b92915050565b6000615060615071565b905061506c8282615378565b919050565b6000604051905090565b600067ffffffffffffffff8211156150965761509561553c565b5b61509f8261557f565b9050602081019050919050565b600067ffffffffffffffff8211156150c7576150c661553c565b5b6150d08261557f565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061516f826152ed565b915061517a836152ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151af576151ae615451565b5b828201905092915050565b60006151c5826152ed565b91506151d0836152ed565b9250826151e0576151df615480565b5b828204905092915050565b60006151f6826152ed565b9150615201836152ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561523a57615239615451565b5b828202905092915050565b6000615250826152ed565b915061525b836152ed565b92508282101561526e5761526d615451565b5b828203905092915050565b6000615284826152cd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615331578082015181840152602081019050615316565b83811115615340576000848401525b50505050565b6000600282049050600182168061535e57607f821691505b60208210811415615372576153716154af565b5b50919050565b6153818261557f565b810181811067ffffffffffffffff821117156153a05761539f61553c565b5b80604052505050565b60006153b4826152ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153e7576153e6615451565b5b600182019050919050565b60006153fd8261540e565b9050919050565b6000819050919050565b600061541982615590565b9050919050565b600061542b826152ed565b9150615436836152ed565b92508261544657615445615480565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e74206e6565647320746f2062652067726561746572207468616e203000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720746f6f206d616e7900000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206e6f74206163746976652e00000000000000000000000000000000600082015250565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e74696e6720746f6f206d616e792e2053656c6563742033206f72206c6560008201527f73732e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f536572696573204d696e74696e67204f76657200000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f467265652073616c65206e6f74206163746976652e0000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f57686974656c6973742053616c65206e6f74206163746976652e000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416464726573732068617320616c7265616479206d696e746564206f7220747260008201527f79696e6720746f206d696e7420746f6f206d616e792e00000000000000000000602082015250565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b7f467265652073616c652068617320656e64656400000000000000000000000000600082015250565b7f57686974656c6973742073616c652068617320656e6465640000000000000000600082015250565b615d5281615279565b8114615d5d57600080fd5b50565b615d698161528b565b8114615d7457600080fd5b50565b615d8081615297565b8114615d8b57600080fd5b50565b615d97816152a1565b8114615da257600080fd5b50565b615dae816152ed565b8114615db957600080fd5b50565b615dc5816152f7565b8114615dd057600080fd5b5056fea26469706673582212204e6f24b5876546d0d8f8df0f74eebe1cd4213d61b6e8a7ee5635d18aa217110b64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f6170692e646f6c6c666163652e6172742f6170692f746f6b656e2f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025b5760003560e01c806370a0823111610144578063b3b2cb7a116100b6578063d547cfb71161007a578063d547cfb7146108d2578063e985e9c5146108fd578063f07bba651461093a578063f2fde38b14610963578063f46c5b671461098c578063fc8f689a146109b75761025b565b8063b3b2cb7a146107ed578063b88d4fde14610818578063b98451cf14610841578063beafc89b1461086c578063c87b56dd146108955761025b565b80638da5cb5b116101085780638da5cb5b1461070057806395d89b411461072b5780639907563514610756578063a0712d681461077f578063a22cb4651461079b578063af16a51d146107c45761025b565b806370a082311461063c578063715018a61461067957806372418d6d14610690578063746c35e6146106b9578063853828b6146106f65761025b565b806332624114116101dd5780634794b08a116101a15780634794b08a1461051c5780634f6ccce71461054557806355f804b3146105825780635c847e4f146105ab57806362f09640146105d45780636352211e146105ff5761025b565b80633262411414610420578063415b56871461045d57806342842e0e1461047957806343542a66146104a2578063438b6300146104df5761025b565b806318160ddd1161022457806318160ddd1461034a57806323b872dd1461037557806326500f361461039e5780632f745c59146103c75780632fbba115146104045761025b565b8062a1990e1461026057806301ffc9a71461027c57806306fdde03146102b9578063081812fc146102e4578063095ea7b314610321575b600080fd5b61027a6004803603810190610275919061437b565b6109e0565b005b34801561028857600080fd5b506102a3600480360381019061029e91906142ab565b610db0565b6040516102b09190614b99565b60405180910390f35b3480156102c557600080fd5b506102ce610e2a565b6040516102db9190614bf9565b60405180910390f35b3480156102f057600080fd5b5061030b6004803603810190610306919061434e565b610ebc565b6040516103189190614ae7565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906141d7565b610f41565b005b34801561035657600080fd5b5061035f611059565b60405161036c919061503b565b60405180910390f35b34801561038157600080fd5b5061039c600480360381019061039791906140c1565b611066565b005b3480156103aa57600080fd5b506103c560048036038101906103c0919061434e565b6110c6565b005b3480156103d357600080fd5b506103ee60048036038101906103e991906141d7565b61114c565b6040516103fb919061503b565b60405180910390f35b61041e6004803603810190610419919061434e565b6111f1565b005b34801561042c57600080fd5b5061044760048036038101906104429190614217565b6113e8565b6040516104549190614b99565b60405180910390f35b6104776004803603810190610472919061437b565b611508565b005b34801561048557600080fd5b506104a0600480360381019061049b91906140c1565b6118e7565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190614217565b611907565b6040516104d69190614b99565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190614054565b611a42565b6040516105139190614b77565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e91906141d7565b611af0565b005b34801561055157600080fd5b5061056c6004803603810190610567919061434e565b611bb4565b604051610579919061503b565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614305565b611c25565b005b3480156105b757600080fd5b506105d260048036038101906105cd9190614054565b611cbb565b005b3480156105e057600080fd5b506105e9611d7b565b6040516105f69190614b99565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061434e565b611dbe565b6040516106339190614ae7565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e9190614054565b611e70565b604051610670919061503b565b60405180910390f35b34801561068557600080fd5b5061068e611f28565b005b34801561069c57600080fd5b506106b760048036038101906106b2919061427e565b611fb0565b005b3480156106c557600080fd5b506106e060048036038101906106db9190614054565b612049565b6040516106ed9190614b99565b60405180910390f35b6106fe61209f565b005b34801561070c57600080fd5b5061071561215c565b6040516107229190614ae7565b60405180910390f35b34801561073757600080fd5b50610740612186565b60405161074d9190614bf9565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190614054565b612218565b005b6107996004803603810190610794919061434e565b6122d8565b005b3480156107a757600080fd5b506107c260048036038101906107bd9190614197565b612570565b005b3480156107d057600080fd5b506107eb60048036038101906107e6919061427e565b6126f1565b005b3480156107f957600080fd5b5061080261278a565b60405161080f9190614b99565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190614114565b6127e1565b005b34801561084d57600080fd5b50610856612843565b6040516108639190614b99565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e919061434e565b61289a565b005b3480156108a157600080fd5b506108bc60048036038101906108b7919061434e565b612920565b6040516108c99190614bf9565b60405180910390f35b3480156108de57600080fd5b506108e76129c7565b6040516108f49190614bf9565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190614081565b612a55565b6040516109319190614b99565b60405180910390f35b34801561094657600080fd5b50610961600480360381019061095c919061434e565b612ae9565b005b34801561096f57600080fd5b5061098a60048036038101906109859190614054565b612b6f565b005b34801561099857600080fd5b506109a1612c67565b6040516109ae919061503b565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d9919061427e565b612c71565b005b8282826109ef33848484611907565b610a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2590614fdb565b60405180910390fd5b60001515601660019054906101000a900460ff16151514610a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7b90614f7b565b60405180910390fd5b60008711610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90614c1b565b60405180910390fd5b6003871115610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614dfb565b60405180910390fd5b600c54610b16611059565b10610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d9061501b565b60405180910390fd5b600c5487610b62611059565b610b6c9190615164565b1115610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490614c9b565b60405180910390fd5b86600f54610bbb91906151eb565b341015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490614e1b565b60405180910390fd5b6000600388601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c4c9190615164565b11610c5657600190505b6001151581151514610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490614fbb565b60405180910390fd5b60005b88811015610d1757610cb2600b612d0a565b6000610cbe600b612d20565b9050610cca3382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea1033382604051610cfb929190614b4e565b60405180910390a1508080610d0f906153a9565b915050610ca0565b5087601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d639190615164565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e235750610e2282612efc565b5b9050919050565b606060008054610e3990615346565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6590615346565b8015610eb25780601f10610e8757610100808354040283529160200191610eb2565b820191906000526020600020905b815481529060010190602001808311610e9557829003601f168201915b5050505050905090565b6000610ec782612fde565b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90614e3b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f4c82611dbe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb490614efb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fdc61304a565b73ffffffffffffffffffffffffffffffffffffffff16148061100b575061100a8161100561304a565b612a55565b5b61104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190614d7b565b60405180910390fd5b6110548383613052565b505050565b6000600880549050905090565b61107761107161304a565b8261310b565b6110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90614f5b565b60405180910390fd5b6110c18383836131e9565b505050565b6110ce61304a565b73ffffffffffffffffffffffffffffffffffffffff166110ec61215c565b73ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990614e7b565b60405180910390fd5b80600c8190555050565b600061115783611e70565b8210611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90614c3b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6005811115611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90614c9b565b60405180910390fd5b612710611240611059565b10611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790614cfb565b60405180910390fd5b6127108161128c611059565b6112969190615164565b11156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614c9b565b60405180910390fd5b60011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136190614e5b565b60405180910390fd5b60005b818110156113e45761137f600b612d0a565b600061138b600b612d20565b90506113973382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea10333826040516113c8929190614b4e565b60405180910390a15080806113dc906153a9565b91505061136d565b5050565b60008030866040516020016113fe929190614a5a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060018183604051602001611465929190614a86565b604051602081830303815290604052805190602001208787876040516000815260200160405260405161149b9493929190614bb4565b6020604051602081039080840390855afa1580156114bd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166114e561215c565b73ffffffffffffffffffffffffffffffffffffffff161492505050949350505050565b828282611517338484846113e8565b611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90614fdb565b60405180910390fd5b60001515601660029054906101000a900460ff161515146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390614f1b565b60405180910390fd5b600d546115b7611059565b106115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90614ffb565b60405180910390fd5b600d5487611603611059565b61160d9190615164565b111561164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590614c9b565b60405180910390fd5b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156117275750601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205488601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117249190615164565b11155b15611735576001905061178d565b600288601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117829190615164565b1161178c57600190505b5b60011515811515146117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb90614fbb565b60405180910390fd5b60005b8881101561184e576117e9600b612d0a565b60006117f5600b612d20565b90506118013382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea1033382604051611832929190614b4e565b60405180910390a1508080611846906153a9565b9150506117d7565b5087601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461189a9190615164565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050505050565b611902838383604051806020016040528060008152506127e1565b505050565b600080308660405160200161191d929190614a5a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060018183604051602001611984929190614a86565b60405160208183030381529060405280519060200120878787604051600081526020016040526040516119ba9493929190614bb4565b6020604051602081039080840390855afa1580156119dc573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161492505050949350505050565b60606000611a4f83611e70565b905060008167ffffffffffffffff811115611a6d57611a6c61553c565b5b604051908082528060200260200182016040528015611a9b5781602001602082028036833780820191505090505b50905060005b82811015611ae557611ab3858261114c565b828281518110611ac657611ac561550d565b5b6020026020010181815250508080611add906153a9565b915050611aa1565b508092505050919050565b611af861304a565b73ffffffffffffffffffffffffffffffffffffffff16611b1661215c565b73ffffffffffffffffffffffffffffffffffffffff1614611b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6390614e7b565b60405180910390fd5b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000611bbe611059565b8210611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690614f9b565b60405180910390fd5b60088281548110611c1357611c1261550d565b5b90600052602060002001549050919050565b611c2d61304a565b73ffffffffffffffffffffffffffffffffffffffff16611c4b61215c565b73ffffffffffffffffffffffffffffffffffffffff1614611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890614e7b565b60405180910390fd5b8060129080519060200190611cb7929190613e3e565b5050565b611cc361304a565b73ffffffffffffffffffffffffffffffffffffffff16611ce161215c565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90614e7b565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600d54611d88611059565b108015611da8575060001515601660029054906101000a900460ff161515145b15611db65760019050611dbb565b600090505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614dbb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614d9b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f3061304a565b73ffffffffffffffffffffffffffffffffffffffff16611f4e61215c565b73ffffffffffffffffffffffffffffffffffffffff1614611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90614e7b565b60405180910390fd5b611fae6000613445565b565b611fb861304a565b73ffffffffffffffffffffffffffffffffffffffff16611fd661215c565b73ffffffffffffffffffffffffffffffffffffffff161461202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390614e7b565b60405180910390fd5b80601660016101000a81548160ff02191690831515021790555050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6120a761304a565b73ffffffffffffffffffffffffffffffffffffffff166120c561215c565b73ffffffffffffffffffffffffffffffffffffffff161461211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290614e7b565b60405180910390fd5b60004790506000811161212d57600080fd5b612159601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff164761350b565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461219590615346565b80601f01602080910402602001604051908101604052809291908181526020018280546121c190615346565b801561220e5780601f106121e35761010080835404028352916020019161220e565b820191906000526020600020905b8154815290600101906020018083116121f157829003601f168201915b5050505050905090565b61222061304a565b73ffffffffffffffffffffffffffffffffffffffff1661223e61215c565b73ffffffffffffffffffffffffffffffffffffffff1614612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b90614e7b565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60001515601660009054906101000a900460ff1615151461232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590614cdb565b60405180910390fd5b60008111612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890614c1b565b60405180910390fd5b60058111156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90614c9b565b60405180910390fd5b6127106123c0611059565b10612400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f790614cfb565b60405180910390fd5b6127108161240c611059565b6124169190615164565b1115612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90614c9b565b60405180910390fd5b80600e5461246591906151eb565b3410156124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e90614e1b565b60405180910390fd5b600c546124b2611059565b106124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e990614edb565b60405180910390fd5b60005b8181101561256c57612507600b612d0a565b6000612513600b612d20565b905061251f3382612d2e565b7f0a20e6d2714afbe306418856449c629b561aedcd83a03a9386293e71c54ea1033382604051612550929190614b4e565b60405180910390a1508080612564906153a9565b9150506124f5565b5050565b61257861304a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614d3b565b60405180910390fd5b80600560006125f361304a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166126a061304a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126e59190614b99565b60405180910390a35050565b6126f961304a565b73ffffffffffffffffffffffffffffffffffffffff1661271761215c565b73ffffffffffffffffffffffffffffffffffffffff161461276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490614e7b565b60405180910390fd5b80601660026101000a81548160ff02191690831515021790555050565b6000612710612797611059565b1080156127b7575060001515601660009054906101000a900460ff161515145b80156127cb5750600c546127c9611059565b105b156127d957600190506127de565b600090505b90565b6127f26127ec61304a565b8361310b565b612831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282890614f5b565b60405180910390fd5b61283d848484846135bc565b50505050565b6000612710612850611059565b108015612870575060001515601660019054906101000a900460ff161515145b80156128845750600c54612882611059565b105b156128925760019050612897565b600090505b90565b6128a261304a565b73ffffffffffffffffffffffffffffffffffffffff166128c061215c565b73ffffffffffffffffffffffffffffffffffffffff1614612916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290d90614e7b565b60405180910390fd5b80600f8190555050565b606061292b82612fde565b61296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296190614ebb565b60405180910390fd5b6000612974613618565b9050600081511161299457604051806020016040528060008152506129bf565b8061299e846136aa565b6040516020016129af929190614aae565b6040516020818303038152906040525b915050919050565b601280546129d490615346565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0090615346565b8015612a4d5780601f10612a2257610100808354040283529160200191612a4d565b820191906000526020600020905b815481529060010190602001808311612a3057829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612af161304a565b73ffffffffffffffffffffffffffffffffffffffff16612b0f61215c565b73ffffffffffffffffffffffffffffffffffffffff1614612b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5c90614e7b565b60405180910390fd5b80600e8190555050565b612b7761304a565b73ffffffffffffffffffffffffffffffffffffffff16612b9561215c565b73ffffffffffffffffffffffffffffffffffffffff1614612beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be290614e7b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5290614c7b565b60405180910390fd5b612c6481613445565b50565b6000600c54905090565b612c7961304a565b73ffffffffffffffffffffffffffffffffffffffff16612c9761215c565b73ffffffffffffffffffffffffffffffffffffffff1614612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce490614e7b565b60405180910390fd5b80601660006101000a81548160ff02191690831515021790555050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9590614ddb565b60405180910390fd5b612da781612fde565b15612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90614cbb565b60405180910390fd5b612df36000838361380b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e439190615164565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fc757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fd75750612fd68261391f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166130c583611dbe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061311682612fde565b613155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314c90614d5b565b60405180910390fd5b600061316083611dbe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806131cf57508373ffffffffffffffffffffffffffffffffffffffff166131b784610ebc565b73ffffffffffffffffffffffffffffffffffffffff16145b806131e057506131df8185612a55565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661320982611dbe565b73ffffffffffffffffffffffffffffffffffffffff161461325f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325690614e9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c690614d1b565b60405180910390fd5b6132da83838361380b565b6132e5600082613052565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133359190615245565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461338c9190615164565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161353190614ad2565b60006040518083038185875af1925050503d806000811461356e576040519150601f19603f3d011682016040523d82523d6000602084013e613573565b606091505b50509050806135b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ae90614f3b565b60405180910390fd5b505050565b6135c78484846131e9565b6135d384848484613989565b613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990614c5b565b60405180910390fd5b50505050565b60606012805461362790615346565b80601f016020809104026020016040519081016040528092919081815260200182805461365390615346565b80156136a05780601f10613675576101008083540402835291602001916136a0565b820191906000526020600020905b81548152906001019060200180831161368357829003601f168201915b5050505050905090565b606060008214156136f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613806565b600082905060005b6000821461372457808061370d906153a9565b915050600a8261371d91906151ba565b91506136fa565b60008167ffffffffffffffff8111156137405761373f61553c565b5b6040519080825280601f01601f1916602001820160405280156137725781602001600182028036833780820191505090505b5090505b600085146137ff5760018261378b9190615245565b9150600a8561379a9190615420565b60306137a69190615164565b60f81b8183815181106137bc576137bb61550d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137f891906151ba565b9450613776565b8093505050505b919050565b613816838383613b20565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138595761385481613b25565b613898565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613897576138968382613b6e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138db576138d681613cdb565b61391a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613919576139188282613dac565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006139aa8473ffffffffffffffffffffffffffffffffffffffff16613e2b565b15613b13578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139d361304a565b8786866040518563ffffffff1660e01b81526004016139f59493929190614b02565b602060405180830381600087803b158015613a0f57600080fd5b505af1925050508015613a4057506040513d601f19601f82011682018060405250810190613a3d91906142d8565b60015b613ac3573d8060008114613a70576040519150601f19603f3d011682016040523d82523d6000602084013e613a75565b606091505b50600081511415613abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ab290614c5b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b18565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b7b84611e70565b613b859190615245565b9050600060076000848152602001908152602001600020549050818114613c6a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613cef9190615245565b9050600060096000848152602001908152602001600020549050600060088381548110613d1f57613d1e61550d565b5b906000526020600020015490508060088381548110613d4157613d4061550d565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d9057613d8f6154de565b5b6001900381819060005260206000200160009055905550505050565b6000613db783611e70565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613e4a90615346565b90600052602060002090601f016020900481019282613e6c5760008555613eb3565b82601f10613e8557805160ff1916838001178555613eb3565b82800160010185558215613eb3579182015b82811115613eb2578251825591602001919060010190613e97565b5b509050613ec09190613ec4565b5090565b5b80821115613edd576000816000905550600101613ec5565b5090565b6000613ef4613eef8461507b565b615056565b905082815260208101848484011115613f1057613f0f615570565b5b613f1b848285615304565b509392505050565b6000613f36613f31846150ac565b615056565b905082815260208101848484011115613f5257613f51615570565b5b613f5d848285615304565b509392505050565b600081359050613f7481615d49565b92915050565b600081359050613f8981615d60565b92915050565b600081359050613f9e81615d77565b92915050565b600081359050613fb381615d8e565b92915050565b600081519050613fc881615d8e565b92915050565b600082601f830112613fe357613fe261556b565b5b8135613ff3848260208601613ee1565b91505092915050565b600082601f8301126140115761401061556b565b5b8135614021848260208601613f23565b91505092915050565b60008135905061403981615da5565b92915050565b60008135905061404e81615dbc565b92915050565b60006020828403121561406a5761406961557a565b5b600061407884828501613f65565b91505092915050565b600080604083850312156140985761409761557a565b5b60006140a685828601613f65565b92505060206140b785828601613f65565b9150509250929050565b6000806000606084860312156140da576140d961557a565b5b60006140e886828701613f65565b93505060206140f986828701613f65565b925050604061410a8682870161402a565b9150509250925092565b6000806000806080858703121561412e5761412d61557a565b5b600061413c87828801613f65565b945050602061414d87828801613f65565b935050604061415e8782880161402a565b925050606085013567ffffffffffffffff81111561417f5761417e615575565b5b61418b87828801613fce565b91505092959194509250565b600080604083850312156141ae576141ad61557a565b5b60006141bc85828601613f65565b92505060206141cd85828601613f7a565b9150509250929050565b600080604083850312156141ee576141ed61557a565b5b60006141fc85828601613f65565b925050602061420d8582860161402a565b9150509250929050565b600080600080608085870312156142315761423061557a565b5b600061423f87828801613f65565b94505060206142508782880161403f565b935050604061426187828801613f8f565b925050606061427287828801613f8f565b91505092959194509250565b6000602082840312156142945761429361557a565b5b60006142a284828501613f7a565b91505092915050565b6000602082840312156142c1576142c061557a565b5b60006142cf84828501613fa4565b91505092915050565b6000602082840312156142ee576142ed61557a565b5b60006142fc84828501613fb9565b91505092915050565b60006020828403121561431b5761431a61557a565b5b600082013567ffffffffffffffff81111561433957614338615575565b5b61434584828501613ffc565b91505092915050565b6000602082840312156143645761436361557a565b5b60006143728482850161402a565b91505092915050565b600080600080608085870312156143955761439461557a565b5b60006143a38782880161402a565b94505060206143b48782880161403f565b93505060406143c587828801613f8f565b92505060606143d687828801613f8f565b91505092959194509250565b60006143ee8383614a2d565b60208301905092915050565b61440381615279565b82525050565b61441a61441582615279565b6153f2565b82525050565b600061442b826150ed565b614435818561511b565b9350614440836150dd565b8060005b8381101561447157815161445888826143e2565b97506144638361510e565b925050600181019050614444565b5085935050505092915050565b6144878161528b565b82525050565b61449681615297565b82525050565b6144ad6144a882615297565b615404565b82525050565b60006144be826150f8565b6144c8818561512c565b93506144d8818560208601615313565b6144e18161557f565b840191505092915050565b60006144f7826150f8565b614501818561513d565b9350614511818560208601615313565b80840191505092915050565b600061452882615103565b6145328185615148565b9350614542818560208601615313565b61454b8161557f565b840191505092915050565b600061456182615103565b61456b8185615159565b935061457b818560208601615313565b80840191505092915050565b6000614594601f83615148565b915061459f8261559d565b602082019050919050565b60006145b7602b83615148565b91506145c2826155c6565b604082019050919050565b60006145da603283615148565b91506145e582615615565b604082019050919050565b60006145fd602683615148565b915061460882615664565b604082019050919050565b6000614620601083615148565b915061462b826156b3565b602082019050919050565b6000614643601c83615148565b915061464e826156dc565b602082019050919050565b6000614666601083615148565b915061467182615705565b602082019050919050565b6000614689600e83615148565b91506146948261572e565b602082019050919050565b60006146ac602483615148565b91506146b782615757565b604082019050919050565b60006146cf601983615148565b91506146da826157a6565b602082019050919050565b60006146f2602c83615148565b91506146fd826157cf565b604082019050919050565b6000614715603883615148565b91506147208261581e565b604082019050919050565b6000614738602a83615148565b91506147438261586d565b604082019050919050565b600061475b602983615148565b9150614766826158bc565b604082019050919050565b600061477e602083615148565b91506147898261590b565b602082019050919050565b60006147a1602383615148565b91506147ac82615934565b604082019050919050565b60006147c4600e83615148565b91506147cf82615983565b602082019050919050565b60006147e7602c83615148565b91506147f2826159ac565b604082019050919050565b600061480a600b83615148565b9150614815826159fb565b602082019050919050565b600061482d602083615148565b915061483882615a24565b602082019050919050565b6000614850602983615148565b915061485b82615a4d565b604082019050919050565b6000614873602f83615148565b915061487e82615a9c565b604082019050919050565b6000614896601383615148565b91506148a182615aeb565b602082019050919050565b60006148b9602183615148565b91506148c482615b14565b604082019050919050565b60006148dc601583615148565b91506148e782615b63565b602082019050919050565b60006148ff60008361513d565b915061490a82615b8c565b600082019050919050565b6000614922601083615148565b915061492d82615b8f565b602082019050919050565b6000614945603183615148565b915061495082615bb8565b604082019050919050565b6000614968601a83615148565b915061497382615c07565b602082019050919050565b600061498b602c83615148565b915061499682615c30565b604082019050919050565b60006149ae603683615148565b91506149b982615c7f565b604082019050919050565b60006149d1600f83615148565b91506149dc82615cce565b602082019050919050565b60006149f4601383615148565b91506149ff82615cf7565b602082019050919050565b6000614a17601883615148565b9150614a2282615d20565b602082019050919050565b614a36816152ed565b82525050565b614a45816152ed565b82525050565b614a54816152f7565b82525050565b6000614a668285614409565b601482019150614a768284614409565b6014820191508190509392505050565b6000614a9282856144ec565b9150614a9e828461449c565b6020820191508190509392505050565b6000614aba8285614556565b9150614ac68284614556565b91508190509392505050565b6000614add826148f2565b9150819050919050565b6000602082019050614afc60008301846143fa565b92915050565b6000608082019050614b1760008301876143fa565b614b2460208301866143fa565b614b316040830185614a3c565b8181036060830152614b4381846144b3565b905095945050505050565b6000604082019050614b6360008301856143fa565b614b706020830184614a3c565b9392505050565b60006020820190508181036000830152614b918184614420565b905092915050565b6000602082019050614bae600083018461447e565b92915050565b6000608082019050614bc9600083018761448d565b614bd66020830186614a4b565b614be3604083018561448d565b614bf0606083018461448d565b95945050505050565b60006020820190508181036000830152614c13818461451d565b905092915050565b60006020820190508181036000830152614c3481614587565b9050919050565b60006020820190508181036000830152614c54816145aa565b9050919050565b60006020820190508181036000830152614c74816145cd565b9050919050565b60006020820190508181036000830152614c94816145f0565b9050919050565b60006020820190508181036000830152614cb481614613565b9050919050565b60006020820190508181036000830152614cd481614636565b9050919050565b60006020820190508181036000830152614cf481614659565b9050919050565b60006020820190508181036000830152614d148161467c565b9050919050565b60006020820190508181036000830152614d348161469f565b9050919050565b60006020820190508181036000830152614d54816146c2565b9050919050565b60006020820190508181036000830152614d74816146e5565b9050919050565b60006020820190508181036000830152614d9481614708565b9050919050565b60006020820190508181036000830152614db48161472b565b9050919050565b60006020820190508181036000830152614dd48161474e565b9050919050565b60006020820190508181036000830152614df481614771565b9050919050565b60006020820190508181036000830152614e1481614794565b9050919050565b60006020820190508181036000830152614e34816147b7565b9050919050565b60006020820190508181036000830152614e54816147da565b9050919050565b60006020820190508181036000830152614e74816147fd565b9050919050565b60006020820190508181036000830152614e9481614820565b9050919050565b60006020820190508181036000830152614eb481614843565b9050919050565b60006020820190508181036000830152614ed481614866565b9050919050565b60006020820190508181036000830152614ef481614889565b9050919050565b60006020820190508181036000830152614f14816148ac565b9050919050565b60006020820190508181036000830152614f34816148cf565b9050919050565b60006020820190508181036000830152614f5481614915565b9050919050565b60006020820190508181036000830152614f7481614938565b9050919050565b60006020820190508181036000830152614f948161495b565b9050919050565b60006020820190508181036000830152614fb48161497e565b9050919050565b60006020820190508181036000830152614fd4816149a1565b9050919050565b60006020820190508181036000830152614ff4816149c4565b9050919050565b60006020820190508181036000830152615014816149e7565b9050919050565b6000602082019050818103600083015261503481614a0a565b9050919050565b60006020820190506150506000830184614a3c565b92915050565b6000615060615071565b905061506c8282615378565b919050565b6000604051905090565b600067ffffffffffffffff8211156150965761509561553c565b5b61509f8261557f565b9050602081019050919050565b600067ffffffffffffffff8211156150c7576150c661553c565b5b6150d08261557f565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061516f826152ed565b915061517a836152ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151af576151ae615451565b5b828201905092915050565b60006151c5826152ed565b91506151d0836152ed565b9250826151e0576151df615480565b5b828204905092915050565b60006151f6826152ed565b9150615201836152ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561523a57615239615451565b5b828202905092915050565b6000615250826152ed565b915061525b836152ed565b92508282101561526e5761526d615451565b5b828203905092915050565b6000615284826152cd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615331578082015181840152602081019050615316565b83811115615340576000848401525b50505050565b6000600282049050600182168061535e57607f821691505b60208210811415615372576153716154af565b5b50919050565b6153818261557f565b810181811067ffffffffffffffff821117156153a05761539f61553c565b5b80604052505050565b60006153b4826152ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153e7576153e6615451565b5b600182019050919050565b60006153fd8261540e565b9050919050565b6000819050919050565b600061541982615590565b9050919050565b600061542b826152ed565b9150615436836152ed565b92508261544657615445615480565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e74206e6565647320746f2062652067726561746572207468616e203000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720746f6f206d616e7900000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c65206e6f74206163746976652e00000000000000000000000000000000600082015250565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d696e74696e6720746f6f206d616e792e2053656c6563742033206f72206c6560008201527f73732e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f536572696573204d696e74696e67204f76657200000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f467265652073616c65206e6f74206163746976652e0000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f57686974656c6973742053616c65206e6f74206163746976652e000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416464726573732068617320616c7265616479206d696e746564206f7220747260008201527f79696e6720746f206d696e7420746f6f206d616e792e00000000000000000000602082015250565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b7f467265652073616c652068617320656e64656400000000000000000000000000600082015250565b7f57686974656c6973742073616c652068617320656e6465640000000000000000600082015250565b615d5281615279565b8114615d5d57600080fd5b50565b615d698161528b565b8114615d7457600080fd5b50565b615d8081615297565b8114615d8b57600080fd5b50565b615d97816152a1565b8114615da257600080fd5b50565b615dae816152ed565b8114615db957600080fd5b50565b615dc5816152f7565b8114615dd057600080fd5b5056fea26469706673582212204e6f24b5876546d0d8f8df0f74eebe1cd4213d61b6e8a7ee5635d18aa217110b64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f6170692e646f6c6c666163652e6172742f6170692f746f6b656e2f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://api.dollface.art/api/token/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [2] : 68747470733a2f2f6170692e646f6c6c666163652e6172742f6170692f746f6b
Arg [3] : 656e2f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51544:9280:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54765:1148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45334:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33226:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34785:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34308:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45974:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35675:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58557:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45642:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57022:569;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60070:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55925:1089;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36085:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60433:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58918:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57726:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46164:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58448:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58664:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53561:218;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32920:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32650:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12925:94;;;;;;;;;;;;;:::i;:::-;;58006:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53787:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59311:195;;;:::i;:::-;;12274:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33395:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58780:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53983:774;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35078:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58121:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53025:256;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36341:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53293:262;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58332:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33570:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52177:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35444:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58226:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13174:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53885:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57889:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54765:1148;54860:2;54864;54868;59967:51;59998:10;60009:2;60012;60015;59967:30;:51::i;:::-;59959:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;54926:5:::1;54906:25;;:16;;;;;;;;;;;:25;;;54898:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54990:1;54981:6;:10;54973:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;55056:1;55046:6;:11;;55038:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55132:10;;55116:13;:11;:13::i;:::-;:26;55108:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55216:10;;55206:6;55190:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;55182:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55297:6;55280:14;;:23;;;;:::i;:::-;55266:9;:38;;55258:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55336:12;55418:1;55408:6;55371:22;:34;55394:10;55371:34;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:48;55367:104;;55455:4;55445:14;;55367:104;55501:4;55490:15;;:7;:15;;;55482:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;55582:6;55577:231;55596:6;55594:1;:8;55577:231;;;55625:21;:9;:19;:21::i;:::-;55661:17;55681:19;:9;:17;:19::i;:::-;55661:39;;55715:28;55721:10;55733:9;55715:5;:28::i;:::-;55763:33;55774:10;55786:9;55763:33;;;;;;;:::i;:::-;;;;;;;;55609:199;55604:3;;;;;:::i;:::-;;;;55577:231;;;;55893:6;55856:22;:34;55879:10;55856:34;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;55819:22;:34;55842:10;55819:34;;;;;;;;;;;;;;;:80;;;;54887:1026;54765:1148:::0;;;;;;;:::o;45334:224::-;45436:4;45475:35;45460:50;;;:11;:50;;;;:90;;;;45514:36;45538:11;45514:23;:36::i;:::-;45460:90;45453:97;;45334:224;;;:::o;33226:100::-;33280:13;33313:5;33306:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33226:100;:::o;34785:221::-;34861:7;34889:16;34897:7;34889;:16::i;:::-;34881:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34974:15;:24;34990:7;34974:24;;;;;;;;;;;;;;;;;;;;;34967:31;;34785:221;;;:::o;34308:411::-;34389:13;34405:23;34420:7;34405:14;:23::i;:::-;34389:39;;34453:5;34447:11;;:2;:11;;;;34439:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34547:5;34531:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34556:37;34573:5;34580:12;:10;:12::i;:::-;34556:16;:37::i;:::-;34531:62;34509:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34690:21;34699:2;34703:7;34690:8;:21::i;:::-;34378:341;34308:411;;:::o;45974:113::-;46035:7;46062:10;:17;;;;46055:24;;45974:113;:::o;35675:339::-;35870:41;35889:12;:10;:12::i;:::-;35903:7;35870:18;:41::i;:::-;35862:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35978:28;35988:4;35994:2;35998:7;35978:9;:28::i;:::-;35675:339;;;:::o;58557:95::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58637:7:::1;58624:10;:20;;;;58557:95:::0;:::o;45642:256::-;45739:7;45775:23;45792:5;45775:16;:23::i;:::-;45767:5;:31;45759:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45864:12;:19;45877:5;45864:19;;;;;;;;;;;;;;;:26;45884:5;45864:26;;;;;;;;;;;;45857:33;;45642:256;;;;:::o;57022:569::-;51996:1;57090:6;:21;;57082:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51776:5;57151:13;:11;:13::i;:::-;:28;57143:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51776:5;57233:6;57217:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:38;;57209:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57316:4;57295:25;;:5;:17;57301:10;57295:17;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;57287:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57354:6;57349:233;57368:6;57366:1;:8;57349:233;;;57399:21;:9;:19;:21::i;:::-;57435:17;57455:19;:9;:17;:19::i;:::-;57435:39;;57489:28;57495:10;57507:9;57489:5;:28::i;:::-;57537:33;57548:10;57560:9;57537:33;;;;;;;:::i;:::-;;;;;;;;57381:201;57376:3;;;;;:::i;:::-;;;;57349:233;;;;57022:569;:::o;60070:355::-;60169:4;60193:12;60243:4;60250;60218:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60208:48;;;;;;60193:63;;60269:19;:56;;;;;;;;;;;;;;;;;;;60356:61;60393:6;60401:4;60376:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60366:41;;;;;;60408:2;60411;60414;60356:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60345:72;;:7;:5;:7::i;:::-;:72;;;60338:79;;;;60070:355;;;;;;:::o;55925:1089::-;56009:2;56013;56017;59789:41;59810:10;59821:2;59824;59827;59789:20;:41::i;:::-;59781:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;56070:5:::1;56055:20;;:11;;;;;;;;;;;:20;;;56047:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56136:8;;56120:13;:11;:13::i;:::-;:24;56112:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56213:8;;56203:6;56187:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;;56179:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56255:12;56321:1:::0;56289:17:::1;:29;56307:10;56289:29;;;;;;;;;;;;;;;;:33;:115;;;;;56375:17;:29;56393:10;56375:29;;;;;;;;;;;;;;;;56364:6;56327:22;:34;56350:10;56327:34;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;56326:78;;56289:115;56286:280;;;56440:4;56430:14;;56286:280;;;56513:1;56503:6;56466:22;:34;56489:10;56466:34;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:48;56462:104;;56550:4;56540:14;;56462:104;56286:280;56598:4;56587:15;;:7;:15;;;56579:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;56687:6;56682:232;56701:6;56699:1;:8;56682:232;;;56731:21;:9;:19;:21::i;:::-;56767:17;56787:19;:9;:17;:19::i;:::-;56767:39;;56821:28;56827:10;56839:9;56821:5;:28::i;:::-;56869:33;56880:10;56892:9;56869:33;;;;;;;:::i;:::-;;;;;;;;56714:200;56709:3;;;;;:::i;:::-;;;;56682:232;;;;57000:6;56963:22;:34;56986:10;56963:34;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;56926:22;:34;56949:10;56926:34;;;;;;;;;;;;;;;:80;;;;56036:978;55925:1089:::0;;;;;;;:::o;36085:185::-;36223:39;36240:4;36246:2;36250:7;36223:39;;;;;;;;;;;;:16;:39::i;:::-;36085:185;;;:::o;60433:382::-;60542:4;60566:12;60616:4;60623;60591:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60581:48;;;;;;60566:63;;60642:19;:56;;;;;;;;;;;;;;;;;;;60746:61;60783:6;60791:4;60766:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60756:41;;;;;;60798:2;60801;60804;60746:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60718:89;;:24;;;;;;;;;;;:89;;;60711:96;;;;60433:382;;;;;;:::o;58918:385::-;59007:16;59041:18;59062:17;59072:6;59062:9;:17::i;:::-;59041:38;;59092:25;59134:10;59120:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59092:53;;59161:9;59156:112;59180:10;59176:1;:14;59156:112;;;59226:30;59246:6;59254:1;59226:19;:30::i;:::-;59212:8;59221:1;59212:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;59192:3;;;;;:::i;:::-;;;;59156:112;;;;59287:8;59280:15;;;;58918:385;;;:::o;57726:151::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57855:14:::1;57825:17;:27;57843:8;57825:27;;;;;;;;;;;;;;;:44;;;;57726:151:::0;;:::o;46164:233::-;46239:7;46275:30;:28;:30::i;:::-;46267:5;:38;46259:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46372:10;46383:5;46372:17;;;;;;;;:::i;:::-;;;;;;;;;;46365:24;;46164:233;;;:::o;58448:101::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58534:7:::1;58519:12;:22;;;;;;;;;;;;:::i;:::-;;58448:101:::0;:::o;58664:108::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58754:10:::1;58738:13;;:26;;;;;;;;;;;;;;;;;;58664:108:::0;:::o;53561:218::-;53610:4;53646:8;;53630:13;:11;:13::i;:::-;:24;:48;;;;;53673:5;53658:20;;:11;;;;;;;;;;;:20;;;53630:48;53627:145;;;53711:4;53704:11;;;;53627:145;53755:5;53748:12;;53561:218;;:::o;32920:239::-;32992:7;33012:13;33028:7;:16;33036:7;33028:16;;;;;;;;;;;;;;;;;;;;;33012:32;;33080:1;33063:19;;:5;:19;;;;33055:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33146:5;33139:12;;;32920:239;;;:::o;32650:208::-;32722:7;32767:1;32750:19;;:5;:19;;;;32742:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32834:9;:16;32844:5;32834:16;;;;;;;;;;;;;;;;32827:23;;32650:208;;;:::o;12925:94::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12990:21:::1;13008:1;12990:9;:21::i;:::-;12925:94::o:0;58006:107::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58096:9:::1;58077:16;;:28;;;;;;;;;;;;;;;;;;58006:107:::0;:::o;53787:90::-;53837:4;53861:5;:8;53867:1;53861:8;;;;;;;;;;;;;;;;;;;;;;;;;53854:15;;53787:90;;;:::o;59311:195::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59370:15:::1;59388:21;59370:39;;59438:1;59428:7;:11;59420:20;;;::::0;::::1;;59451:47;59461:13;;;;;;;;;;;59476:21;59451:9;:47::i;:::-;59359:147;59311:195::o:0;12274:87::-;12320:7;12347:6;;;;;;;;;;;12340:13;;12274:87;:::o;33395:104::-;33451:13;33484:7;33477:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33395:104;:::o;58780:130::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58892:10:::1;58865:24;;:37;;;;;;;;;;;;;;;;;;58780:130:::0;:::o;53983:774::-;54066:5;54047:24;;:15;;;;;;;;;;;:24;;;54039:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;54120:1;54111:6;:10;54103:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;51996:1;54176:6;:21;;54168:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51776:5;54237:13;:11;:13::i;:::-;:28;54229:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51776:5;54319:6;54303:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:38;;54295:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54403:6;54395:5;;:14;;;;:::i;:::-;54381:9;:29;;54373:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;54464:10;;54448:13;:11;:13::i;:::-;:26;54440:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54516:6;54511:233;54530:6;54528:1;:8;54511:233;;;54561:21;:9;:19;:21::i;:::-;54597:17;54617:19;:9;:17;:19::i;:::-;54597:39;;54651:28;54657:10;54669:9;54651:5;:28::i;:::-;54699:33;54710:10;54722:9;54699:33;;;;;;;:::i;:::-;;;;;;;;54543:201;54538:3;;;;;:::i;:::-;;;;54511:233;;;;53983:774;:::o;35078:295::-;35193:12;:10;:12::i;:::-;35181:24;;:8;:24;;;;35173:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35293:8;35248:18;:32;35267:12;:10;:12::i;:::-;35248:32;;;;;;;;;;;;;;;:42;35281:8;35248:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35346:8;35317:48;;35332:12;:10;:12::i;:::-;35317:48;;;35356:8;35317:48;;;;;;:::i;:::-;;;;;;;;35078:295;;:::o;58121:97::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58201:9:::1;58187:11;;:23;;;;;;;;;;;;;;;;;;58121:97:::0;:::o;53025:256::-;53074:4;51776:5;53094:13;:11;:13::i;:::-;:28;:56;;;;;53145:5;53126:24;;:15;;;;;;;;;;;:24;;;53094:56;:86;;;;;53170:10;;53154:13;:11;:13::i;:::-;:26;53094:86;53091:183;;;53213:4;53206:11;;;;53091:183;53257:5;53250:12;;53025:256;;:::o;36341:328::-;36516:41;36535:12;:10;:12::i;:::-;36549:7;36516:18;:41::i;:::-;36508:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36622:39;36636:4;36642:2;36646:7;36655:5;36622:13;:39::i;:::-;36341:328;;;;:::o;53293:262::-;53347:4;51776:5;53367:13;:11;:13::i;:::-;:28;:57;;;;;53419:5;53399:25;;:16;;;;;;;;;;;:25;;;53367:57;:87;;;;;53444:10;;53428:13;:11;:13::i;:::-;:26;53367:87;53364:184;;;53487:4;53480:11;;;;53364:184;53531:5;53524:12;;53293:262;;:::o;58332:108::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58423:9:::1;58406:14;:26;;;;58332:108:::0;:::o;33570:334::-;33643:13;33677:16;33685:7;33677;:16::i;:::-;33669:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33758:21;33782:10;:8;:10::i;:::-;33758:34;;33834:1;33816:7;33810:21;:25;:86;;;;;;;;;;;;;;;;;33862:7;33871:18;:7;:16;:18::i;:::-;33845:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33810:86;33803:93;;;33570:334;;;:::o;52177:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35444:164::-;35541:4;35565:18;:25;35584:5;35565:25;;;;;;;;;;;;;;;:35;35591:8;35565:35;;;;;;;;;;;;;;;;;;;;;;;;;35558:42;;35444:164;;;;:::o;58226:98::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58307:9:::1;58299:5;:17;;;;58226:98:::0;:::o;13174:192::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13283:1:::1;13263:22;;:8;:22;;;;13255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13339:19;13349:8;13339:9;:19::i;:::-;13174:192:::0;:::o;53885:90::-;53930:7;53957:10;;53950:17;;53885:90;:::o;57889:105::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57977:9:::1;57959:15;;:27;;;;;;;;;;;;;;;;;;57889:105:::0;:::o;939:127::-;1046:1;1028:7;:14;;;:19;;;;;;;;;;;939:127;:::o;817:114::-;882:7;909;:14;;;902:21;;817:114;;;:::o;40157:382::-;40251:1;40237:16;;:2;:16;;;;40229:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40310:16;40318:7;40310;:16::i;:::-;40309:17;40301:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40372:45;40401:1;40405:2;40409:7;40372:20;:45::i;:::-;40447:1;40430:9;:13;40440:2;40430:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40478:2;40459:7;:16;40467:7;40459:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40523:7;40519:2;40498:33;;40515:1;40498:33;;;;;;;;;;;;40157:382;;:::o;32281:305::-;32383:4;32435:25;32420:40;;;:11;:40;;;;:105;;;;32492:33;32477:48;;;:11;:48;;;;32420:105;:158;;;;32542:36;32566:11;32542:23;:36::i;:::-;32420:158;32400:178;;32281:305;;;:::o;38179:127::-;38244:4;38296:1;38268:30;;:7;:16;38276:7;38268:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38261:37;;38179:127;;;:::o;11062:98::-;11115:7;11142:10;11135:17;;11062:98;:::o;42161:174::-;42263:2;42236:15;:24;42252:7;42236:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42319:7;42315:2;42281:46;;42290:23;42305:7;42290:14;:23::i;:::-;42281:46;;;;;;;;;;;;42161:174;;:::o;38473:348::-;38566:4;38591:16;38599:7;38591;:16::i;:::-;38583:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38667:13;38683:23;38698:7;38683:14;:23::i;:::-;38667:39;;38736:5;38725:16;;:7;:16;;;:51;;;;38769:7;38745:31;;:20;38757:7;38745:11;:20::i;:::-;:31;;;38725:51;:87;;;;38780:32;38797:5;38804:7;38780:16;:32::i;:::-;38725:87;38717:96;;;38473:348;;;;:::o;41465:578::-;41624:4;41597:31;;:23;41612:7;41597:14;:23::i;:::-;:31;;;41589:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41707:1;41693:16;;:2;:16;;;;41685:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41763:39;41784:4;41790:2;41794:7;41763:20;:39::i;:::-;41867:29;41884:1;41888:7;41867:8;:29::i;:::-;41928:1;41909:9;:15;41919:4;41909:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41957:1;41940:9;:13;41950:2;41940:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41988:2;41969:7;:16;41977:7;41969:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42027:7;42023:2;42008:27;;42017:4;42008:27;;;;;;;;;;;;41465:578;;;:::o;13374:173::-;13430:16;13449:6;;;;;;;;;;;13430:25;;13475:8;13466:6;;:17;;;;;;;;;;;;;;;;;;13530:8;13499:40;;13520:8;13499:40;;;;;;;;;;;;13419:128;13374:173;:::o;59514:180::-;59588:12;59606:8;:13;;59627:7;59606:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59587:52;;;59658:7;59650:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;59576:118;59514:180;;:::o;37551:315::-;37708:28;37718:4;37724:2;37728:7;37708:9;:28::i;:::-;37755:48;37778:4;37784:2;37788:7;37797:5;37755:22;:48::i;:::-;37747:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37551:315;;;;:::o;57605:113::-;57665:13;57698:12;57691:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57605:113;:::o;8678:723::-;8734:13;8964:1;8955:5;:10;8951:53;;;8982:10;;;;;;;;;;;;;;;;;;;;;8951:53;9014:12;9029:5;9014:20;;9045:14;9070:78;9085:1;9077:4;:9;9070:78;;9103:8;;;;;:::i;:::-;;;;9134:2;9126:10;;;;;:::i;:::-;;;9070:78;;;9158:19;9190:6;9180:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9158:39;;9208:154;9224:1;9215:5;:10;9208:154;;9252:1;9242:11;;;;;:::i;:::-;;;9319:2;9311:5;:10;;;;:::i;:::-;9298:2;:24;;;;:::i;:::-;9285:39;;9268:6;9275;9268:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9348:2;9339:11;;;;;:::i;:::-;;;9208:154;;;9386:6;9372:21;;;;;8678:723;;;;:::o;47010:589::-;47154:45;47181:4;47187:2;47191:7;47154:26;:45::i;:::-;47232:1;47216:18;;:4;:18;;;47212:187;;;47251:40;47283:7;47251:31;:40::i;:::-;47212:187;;;47321:2;47313:10;;:4;:10;;;47309:90;;47340:47;47373:4;47379:7;47340:32;:47::i;:::-;47309:90;47212:187;47427:1;47413:16;;:2;:16;;;47409:183;;;47446:45;47483:7;47446:36;:45::i;:::-;47409:183;;;47519:4;47513:10;;:2;:10;;;47509:83;;47540:40;47568:2;47572:7;47540:27;:40::i;:::-;47509:83;47409:183;47010:589;;;:::o;24260:157::-;24345:4;24384:25;24369:40;;;:11;:40;;;;24362:47;;24260:157;;;:::o;42900:799::-;43055:4;43076:15;:2;:13;;;:15::i;:::-;43072:620;;;43128:2;43112:36;;;43149:12;:10;:12::i;:::-;43163:4;43169:7;43178:5;43112:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43108:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43371:1;43354:6;:13;:18;43350:272;;;43397:60;;;;;;;;;;:::i;:::-;;;;;;;;43350:272;43572:6;43566:13;43557:6;43553:2;43549:15;43542:38;43108:529;43245:41;;;43235:51;;;:6;:51;;;;43228:58;;;;;43072:620;43676:4;43669:11;;42900:799;;;;;;;:::o;44271:126::-;;;;:::o;48322:164::-;48426:10;:17;;;;48399:15;:24;48415:7;48399:24;;;;;;;;;;;:44;;;;48454:10;48470:7;48454:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48322:164;:::o;49113:988::-;49379:22;49429:1;49404:22;49421:4;49404:16;:22::i;:::-;:26;;;;:::i;:::-;49379:51;;49441:18;49462:17;:26;49480:7;49462:26;;;;;;;;;;;;49441:47;;49609:14;49595:10;:28;49591:328;;49640:19;49662:12;:18;49675:4;49662:18;;;;;;;;;;;;;;;:34;49681:14;49662:34;;;;;;;;;;;;49640:56;;49746:11;49713:12;:18;49726:4;49713:18;;;;;;;;;;;;;;;:30;49732:10;49713:30;;;;;;;;;;;:44;;;;49863:10;49830:17;:30;49848:11;49830:30;;;;;;;;;;;:43;;;;49625:294;49591:328;50015:17;:26;50033:7;50015:26;;;;;;;;;;;50008:33;;;50059:12;:18;50072:4;50059:18;;;;;;;;;;;;;;;:34;50078:14;50059:34;;;;;;;;;;;50052:41;;;49194:907;;49113:988;;:::o;50396:1079::-;50649:22;50694:1;50674:10;:17;;;;:21;;;;:::i;:::-;50649:46;;50706:18;50727:15;:24;50743:7;50727:24;;;;;;;;;;;;50706:45;;51078:19;51100:10;51111:14;51100:26;;;;;;;;:::i;:::-;;;;;;;;;;51078:48;;51164:11;51139:10;51150;51139:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51275:10;51244:15;:28;51260:11;51244:28;;;;;;;;;;;:41;;;;51416:15;:24;51432:7;51416:24;;;;;;;;;;;51409:31;;;51451:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50467:1008;;;50396:1079;:::o;47900:221::-;47985:14;48002:20;48019:2;48002:16;:20::i;:::-;47985:37;;48060:7;48033:12;:16;48046:2;48033:16;;;;;;;;;;;;;;;:24;48050:6;48033:24;;;;;;;;;;;:34;;;;48107:6;48078:17;:26;48096:7;48078:26;;;;;;;;;;;:35;;;;47974:147;47900:221;;:::o;14320:387::-;14380:4;14588:12;14655:7;14643:20;14635:28;;14698:1;14691:4;:8;14684:15;;;14320:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:761::-;5990:6;5998;6006;6014;6063:3;6051:9;6042:7;6038:23;6034:33;6031:120;;;6070:79;;:::i;:::-;6031:120;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:51;6386:7;6377:6;6366:9;6362:22;6343:51;:::i;:::-;6333:61;;6288:116;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;5906:761;;;;;;;:::o;6673:323::-;6729:6;6778:2;6766:9;6757:7;6753:23;6749:32;6746:119;;;6784:79;;:::i;:::-;6746:119;6904:1;6929:50;6971:7;6962:6;6951:9;6947:22;6929:50;:::i;:::-;6919:60;;6875:114;6673:323;;;;:::o;7002:327::-;7060:6;7109:2;7097:9;7088:7;7084:23;7080:32;7077:119;;;7115:79;;:::i;:::-;7077:119;7235:1;7260:52;7304:7;7295:6;7284:9;7280:22;7260:52;:::i;:::-;7250:62;;7206:116;7002:327;;;;:::o;7335:349::-;7404:6;7453:2;7441:9;7432:7;7428:23;7424:32;7421:119;;;7459:79;;:::i;:::-;7421:119;7579:1;7604:63;7659:7;7650:6;7639:9;7635:22;7604:63;:::i;:::-;7594:73;;7550:127;7335:349;;;;:::o;7690:509::-;7759:6;7808:2;7796:9;7787:7;7783:23;7779:32;7776:119;;;7814:79;;:::i;:::-;7776:119;7962:1;7951:9;7947:17;7934:31;7992:18;7984:6;7981:30;7978:117;;;8014:79;;:::i;:::-;7978:117;8119:63;8174:7;8165:6;8154:9;8150:22;8119:63;:::i;:::-;8109:73;;7905:287;7690:509;;;;:::o;8205:329::-;8264:6;8313:2;8301:9;8292:7;8288:23;8284:32;8281:119;;;8319:79;;:::i;:::-;8281:119;8439:1;8464:53;8509:7;8500:6;8489:9;8485:22;8464:53;:::i;:::-;8454:63;;8410:117;8205:329;;;;:::o;8540:761::-;8624:6;8632;8640;8648;8697:3;8685:9;8676:7;8672:23;8668:33;8665:120;;;8704:79;;:::i;:::-;8665:120;8824:1;8849:53;8894:7;8885:6;8874:9;8870:22;8849:53;:::i;:::-;8839:63;;8795:117;8951:2;8977:51;9020:7;9011:6;9000:9;8996:22;8977:51;:::i;:::-;8967:61;;8922:116;9077:2;9103:53;9148:7;9139:6;9128:9;9124:22;9103:53;:::i;:::-;9093:63;;9048:118;9205:2;9231:53;9276:7;9267:6;9256:9;9252:22;9231:53;:::i;:::-;9221:63;;9176:118;8540:761;;;;;;;:::o;9307:179::-;9376:10;9397:46;9439:3;9431:6;9397:46;:::i;:::-;9475:4;9470:3;9466:14;9452:28;;9307:179;;;;:::o;9492:118::-;9579:24;9597:5;9579:24;:::i;:::-;9574:3;9567:37;9492:118;;:::o;9616:157::-;9721:45;9741:24;9759:5;9741:24;:::i;:::-;9721:45;:::i;:::-;9716:3;9709:58;9616:157;;:::o;9809:732::-;9928:3;9957:54;10005:5;9957:54;:::i;:::-;10027:86;10106:6;10101:3;10027:86;:::i;:::-;10020:93;;10137:56;10187:5;10137:56;:::i;:::-;10216:7;10247:1;10232:284;10257:6;10254:1;10251:13;10232:284;;;10333:6;10327:13;10360:63;10419:3;10404:13;10360:63;:::i;:::-;10353:70;;10446:60;10499:6;10446:60;:::i;:::-;10436:70;;10292:224;10279:1;10276;10272:9;10267:14;;10232:284;;;10236:14;10532:3;10525:10;;9933:608;;;9809:732;;;;:::o;10547:109::-;10628:21;10643:5;10628:21;:::i;:::-;10623:3;10616:34;10547:109;;:::o;10662:118::-;10749:24;10767:5;10749:24;:::i;:::-;10744:3;10737:37;10662:118;;:::o;10786:157::-;10891:45;10911:24;10929:5;10911:24;:::i;:::-;10891:45;:::i;:::-;10886:3;10879:58;10786:157;;:::o;10949:360::-;11035:3;11063:38;11095:5;11063:38;:::i;:::-;11117:70;11180:6;11175:3;11117:70;:::i;:::-;11110:77;;11196:52;11241:6;11236:3;11229:4;11222:5;11218:16;11196:52;:::i;:::-;11273:29;11295:6;11273:29;:::i;:::-;11268:3;11264:39;11257:46;;11039:270;10949:360;;;;:::o;11315:373::-;11419:3;11447:38;11479:5;11447:38;:::i;:::-;11501:88;11582:6;11577:3;11501:88;:::i;:::-;11494:95;;11598:52;11643:6;11638:3;11631:4;11624:5;11620:16;11598:52;:::i;:::-;11675:6;11670:3;11666:16;11659:23;;11423:265;11315:373;;;;:::o;11694:364::-;11782:3;11810:39;11843:5;11810:39;:::i;:::-;11865:71;11929:6;11924:3;11865:71;:::i;:::-;11858:78;;11945:52;11990:6;11985:3;11978:4;11971:5;11967:16;11945:52;:::i;:::-;12022:29;12044:6;12022:29;:::i;:::-;12017:3;12013:39;12006:46;;11786:272;11694:364;;;;:::o;12064:377::-;12170:3;12198:39;12231:5;12198:39;:::i;:::-;12253:89;12335:6;12330:3;12253:89;:::i;:::-;12246:96;;12351:52;12396:6;12391:3;12384:4;12377:5;12373:16;12351:52;:::i;:::-;12428:6;12423:3;12419:16;12412:23;;12174:267;12064:377;;;;:::o;12447:366::-;12589:3;12610:67;12674:2;12669:3;12610:67;:::i;:::-;12603:74;;12686:93;12775:3;12686:93;:::i;:::-;12804:2;12799:3;12795:12;12788:19;;12447:366;;;:::o;12819:::-;12961:3;12982:67;13046:2;13041:3;12982:67;:::i;:::-;12975:74;;13058:93;13147:3;13058:93;:::i;:::-;13176:2;13171:3;13167:12;13160:19;;12819:366;;;:::o;13191:::-;13333:3;13354:67;13418:2;13413:3;13354:67;:::i;:::-;13347:74;;13430:93;13519:3;13430:93;:::i;:::-;13548:2;13543:3;13539:12;13532:19;;13191:366;;;:::o;13563:::-;13705:3;13726:67;13790:2;13785:3;13726:67;:::i;:::-;13719:74;;13802:93;13891:3;13802:93;:::i;:::-;13920:2;13915:3;13911:12;13904:19;;13563:366;;;:::o;13935:::-;14077:3;14098:67;14162:2;14157:3;14098:67;:::i;:::-;14091:74;;14174:93;14263:3;14174:93;:::i;:::-;14292:2;14287:3;14283:12;14276:19;;13935:366;;;:::o;14307:::-;14449:3;14470:67;14534:2;14529:3;14470:67;:::i;:::-;14463:74;;14546:93;14635:3;14546:93;:::i;:::-;14664:2;14659:3;14655:12;14648:19;;14307:366;;;:::o;14679:::-;14821:3;14842:67;14906:2;14901:3;14842:67;:::i;:::-;14835:74;;14918:93;15007:3;14918:93;:::i;:::-;15036:2;15031:3;15027:12;15020:19;;14679:366;;;:::o;15051:::-;15193:3;15214:67;15278:2;15273:3;15214:67;:::i;:::-;15207:74;;15290:93;15379:3;15290:93;:::i;:::-;15408:2;15403:3;15399:12;15392:19;;15051:366;;;:::o;15423:::-;15565:3;15586:67;15650:2;15645:3;15586:67;:::i;:::-;15579:74;;15662:93;15751:3;15662:93;:::i;:::-;15780:2;15775:3;15771:12;15764:19;;15423:366;;;:::o;15795:::-;15937:3;15958:67;16022:2;16017:3;15958:67;:::i;:::-;15951:74;;16034:93;16123:3;16034:93;:::i;:::-;16152:2;16147:3;16143:12;16136:19;;15795:366;;;:::o;16167:::-;16309:3;16330:67;16394:2;16389:3;16330:67;:::i;:::-;16323:74;;16406:93;16495:3;16406:93;:::i;:::-;16524:2;16519:3;16515:12;16508:19;;16167:366;;;:::o;16539:::-;16681:3;16702:67;16766:2;16761:3;16702:67;:::i;:::-;16695:74;;16778:93;16867:3;16778:93;:::i;:::-;16896:2;16891:3;16887:12;16880:19;;16539:366;;;:::o;16911:::-;17053:3;17074:67;17138:2;17133:3;17074:67;:::i;:::-;17067:74;;17150:93;17239:3;17150:93;:::i;:::-;17268:2;17263:3;17259:12;17252:19;;16911:366;;;:::o;17283:::-;17425:3;17446:67;17510:2;17505:3;17446:67;:::i;:::-;17439:74;;17522:93;17611:3;17522:93;:::i;:::-;17640:2;17635:3;17631:12;17624:19;;17283:366;;;:::o;17655:::-;17797:3;17818:67;17882:2;17877:3;17818:67;:::i;:::-;17811:74;;17894:93;17983:3;17894:93;:::i;:::-;18012:2;18007:3;18003:12;17996:19;;17655:366;;;:::o;18027:::-;18169:3;18190:67;18254:2;18249:3;18190:67;:::i;:::-;18183:74;;18266:93;18355:3;18266:93;:::i;:::-;18384:2;18379:3;18375:12;18368:19;;18027:366;;;:::o;18399:::-;18541:3;18562:67;18626:2;18621:3;18562:67;:::i;:::-;18555:74;;18638:93;18727:3;18638:93;:::i;:::-;18756:2;18751:3;18747:12;18740:19;;18399:366;;;:::o;18771:::-;18913:3;18934:67;18998:2;18993:3;18934:67;:::i;:::-;18927:74;;19010:93;19099:3;19010:93;:::i;:::-;19128:2;19123:3;19119:12;19112:19;;18771:366;;;:::o;19143:::-;19285:3;19306:67;19370:2;19365:3;19306:67;:::i;:::-;19299:74;;19382:93;19471:3;19382:93;:::i;:::-;19500:2;19495:3;19491:12;19484:19;;19143:366;;;:::o;19515:::-;19657:3;19678:67;19742:2;19737:3;19678:67;:::i;:::-;19671:74;;19754:93;19843:3;19754:93;:::i;:::-;19872:2;19867:3;19863:12;19856:19;;19515:366;;;:::o;19887:::-;20029:3;20050:67;20114:2;20109:3;20050:67;:::i;:::-;20043:74;;20126:93;20215:3;20126:93;:::i;:::-;20244:2;20239:3;20235:12;20228:19;;19887:366;;;:::o;20259:::-;20401:3;20422:67;20486:2;20481:3;20422:67;:::i;:::-;20415:74;;20498:93;20587:3;20498:93;:::i;:::-;20616:2;20611:3;20607:12;20600:19;;20259:366;;;:::o;20631:::-;20773:3;20794:67;20858:2;20853:3;20794:67;:::i;:::-;20787:74;;20870:93;20959:3;20870:93;:::i;:::-;20988:2;20983:3;20979:12;20972:19;;20631:366;;;:::o;21003:::-;21145:3;21166:67;21230:2;21225:3;21166:67;:::i;:::-;21159:74;;21242:93;21331:3;21242:93;:::i;:::-;21360:2;21355:3;21351:12;21344:19;;21003:366;;;:::o;21375:::-;21517:3;21538:67;21602:2;21597:3;21538:67;:::i;:::-;21531:74;;21614:93;21703:3;21614:93;:::i;:::-;21732:2;21727:3;21723:12;21716:19;;21375:366;;;:::o;21747:398::-;21906:3;21927:83;22008:1;22003:3;21927:83;:::i;:::-;21920:90;;22019:93;22108:3;22019:93;:::i;:::-;22137:1;22132:3;22128:11;22121:18;;21747:398;;;:::o;22151:366::-;22293:3;22314:67;22378:2;22373:3;22314:67;:::i;:::-;22307:74;;22390:93;22479:3;22390:93;:::i;:::-;22508:2;22503:3;22499:12;22492:19;;22151:366;;;:::o;22523:::-;22665:3;22686:67;22750:2;22745:3;22686:67;:::i;:::-;22679:74;;22762:93;22851:3;22762:93;:::i;:::-;22880:2;22875:3;22871:12;22864:19;;22523:366;;;:::o;22895:::-;23037:3;23058:67;23122:2;23117:3;23058:67;:::i;:::-;23051:74;;23134:93;23223:3;23134:93;:::i;:::-;23252:2;23247:3;23243:12;23236:19;;22895:366;;;:::o;23267:::-;23409:3;23430:67;23494:2;23489:3;23430:67;:::i;:::-;23423:74;;23506:93;23595:3;23506:93;:::i;:::-;23624:2;23619:3;23615:12;23608:19;;23267:366;;;:::o;23639:::-;23781:3;23802:67;23866:2;23861:3;23802:67;:::i;:::-;23795:74;;23878:93;23967:3;23878:93;:::i;:::-;23996:2;23991:3;23987:12;23980:19;;23639:366;;;:::o;24011:::-;24153:3;24174:67;24238:2;24233:3;24174:67;:::i;:::-;24167:74;;24250:93;24339:3;24250:93;:::i;:::-;24368:2;24363:3;24359:12;24352:19;;24011:366;;;:::o;24383:::-;24525:3;24546:67;24610:2;24605:3;24546:67;:::i;:::-;24539:74;;24622:93;24711:3;24622:93;:::i;:::-;24740:2;24735:3;24731:12;24724:19;;24383:366;;;:::o;24755:::-;24897:3;24918:67;24982:2;24977:3;24918:67;:::i;:::-;24911:74;;24994:93;25083:3;24994:93;:::i;:::-;25112:2;25107:3;25103:12;25096:19;;24755:366;;;:::o;25127:108::-;25204:24;25222:5;25204:24;:::i;:::-;25199:3;25192:37;25127:108;;:::o;25241:118::-;25328:24;25346:5;25328:24;:::i;:::-;25323:3;25316:37;25241:118;;:::o;25365:112::-;25448:22;25464:5;25448:22;:::i;:::-;25443:3;25436:35;25365:112;;:::o;25483:397::-;25623:3;25638:75;25709:3;25700:6;25638:75;:::i;:::-;25738:2;25733:3;25729:12;25722:19;;25751:75;25822:3;25813:6;25751:75;:::i;:::-;25851:2;25846:3;25842:12;25835:19;;25871:3;25864:10;;25483:397;;;;;:::o;25886:412::-;26044:3;26066:93;26155:3;26146:6;26066:93;:::i;:::-;26059:100;;26169:75;26240:3;26231:6;26169:75;:::i;:::-;26269:2;26264:3;26260:12;26253:19;;26289:3;26282:10;;25886:412;;;;;:::o;26304:435::-;26484:3;26506:95;26597:3;26588:6;26506:95;:::i;:::-;26499:102;;26618:95;26709:3;26700:6;26618:95;:::i;:::-;26611:102;;26730:3;26723:10;;26304:435;;;;;:::o;26745:379::-;26929:3;26951:147;27094:3;26951:147;:::i;:::-;26944:154;;27115:3;27108:10;;26745:379;;;:::o;27130:222::-;27223:4;27261:2;27250:9;27246:18;27238:26;;27274:71;27342:1;27331:9;27327:17;27318:6;27274:71;:::i;:::-;27130:222;;;;:::o;27358:640::-;27553:4;27591:3;27580:9;27576:19;27568:27;;27605:71;27673:1;27662:9;27658:17;27649:6;27605:71;:::i;:::-;27686:72;27754:2;27743:9;27739:18;27730:6;27686:72;:::i;:::-;27768;27836:2;27825:9;27821:18;27812:6;27768:72;:::i;:::-;27887:9;27881:4;27877:20;27872:2;27861:9;27857:18;27850:48;27915:76;27986:4;27977:6;27915:76;:::i;:::-;27907:84;;27358:640;;;;;;;:::o;28004:332::-;28125:4;28163:2;28152:9;28148:18;28140:26;;28176:71;28244:1;28233:9;28229:17;28220:6;28176:71;:::i;:::-;28257:72;28325:2;28314:9;28310:18;28301:6;28257:72;:::i;:::-;28004:332;;;;;:::o;28342:373::-;28485:4;28523:2;28512:9;28508:18;28500:26;;28572:9;28566:4;28562:20;28558:1;28547:9;28543:17;28536:47;28600:108;28703:4;28694:6;28600:108;:::i;:::-;28592:116;;28342:373;;;;:::o;28721:210::-;28808:4;28846:2;28835:9;28831:18;28823:26;;28859:65;28921:1;28910:9;28906:17;28897:6;28859:65;:::i;:::-;28721:210;;;;:::o;28937:545::-;29110:4;29148:3;29137:9;29133:19;29125:27;;29162:71;29230:1;29219:9;29215:17;29206:6;29162:71;:::i;:::-;29243:68;29307:2;29296:9;29292:18;29283:6;29243:68;:::i;:::-;29321:72;29389:2;29378:9;29374:18;29365:6;29321:72;:::i;:::-;29403;29471:2;29460:9;29456:18;29447:6;29403:72;:::i;:::-;28937:545;;;;;;;:::o;29488:313::-;29601:4;29639:2;29628:9;29624:18;29616:26;;29688:9;29682:4;29678:20;29674:1;29663:9;29659:17;29652:47;29716:78;29789:4;29780:6;29716:78;:::i;:::-;29708:86;;29488:313;;;;:::o;29807:419::-;29973:4;30011:2;30000:9;29996:18;29988:26;;30060:9;30054:4;30050:20;30046:1;30035:9;30031:17;30024:47;30088:131;30214:4;30088:131;:::i;:::-;30080:139;;29807:419;;;:::o;30232:::-;30398:4;30436:2;30425:9;30421:18;30413:26;;30485:9;30479:4;30475:20;30471:1;30460:9;30456:17;30449:47;30513:131;30639:4;30513:131;:::i;:::-;30505:139;;30232:419;;;:::o;30657:::-;30823:4;30861:2;30850:9;30846:18;30838:26;;30910:9;30904:4;30900:20;30896:1;30885:9;30881:17;30874:47;30938:131;31064:4;30938:131;:::i;:::-;30930:139;;30657:419;;;:::o;31082:::-;31248:4;31286:2;31275:9;31271:18;31263:26;;31335:9;31329:4;31325:20;31321:1;31310:9;31306:17;31299:47;31363:131;31489:4;31363:131;:::i;:::-;31355:139;;31082:419;;;:::o;31507:::-;31673:4;31711:2;31700:9;31696:18;31688:26;;31760:9;31754:4;31750:20;31746:1;31735:9;31731:17;31724:47;31788:131;31914:4;31788:131;:::i;:::-;31780:139;;31507:419;;;:::o;31932:::-;32098:4;32136:2;32125:9;32121:18;32113:26;;32185:9;32179:4;32175:20;32171:1;32160:9;32156:17;32149:47;32213:131;32339:4;32213:131;:::i;:::-;32205:139;;31932:419;;;:::o;32357:::-;32523:4;32561:2;32550:9;32546:18;32538:26;;32610:9;32604:4;32600:20;32596:1;32585:9;32581:17;32574:47;32638:131;32764:4;32638:131;:::i;:::-;32630:139;;32357:419;;;:::o;32782:::-;32948:4;32986:2;32975:9;32971:18;32963:26;;33035:9;33029:4;33025:20;33021:1;33010:9;33006:17;32999:47;33063:131;33189:4;33063:131;:::i;:::-;33055:139;;32782:419;;;:::o;33207:::-;33373:4;33411:2;33400:9;33396:18;33388:26;;33460:9;33454:4;33450:20;33446:1;33435:9;33431:17;33424:47;33488:131;33614:4;33488:131;:::i;:::-;33480:139;;33207:419;;;:::o;33632:::-;33798:4;33836:2;33825:9;33821:18;33813:26;;33885:9;33879:4;33875:20;33871:1;33860:9;33856:17;33849:47;33913:131;34039:4;33913:131;:::i;:::-;33905:139;;33632:419;;;:::o;34057:::-;34223:4;34261:2;34250:9;34246:18;34238:26;;34310:9;34304:4;34300:20;34296:1;34285:9;34281:17;34274:47;34338:131;34464:4;34338:131;:::i;:::-;34330:139;;34057:419;;;:::o;34482:::-;34648:4;34686:2;34675:9;34671:18;34663:26;;34735:9;34729:4;34725:20;34721:1;34710:9;34706:17;34699:47;34763:131;34889:4;34763:131;:::i;:::-;34755:139;;34482:419;;;:::o;34907:::-;35073:4;35111:2;35100:9;35096:18;35088:26;;35160:9;35154:4;35150:20;35146:1;35135:9;35131:17;35124:47;35188:131;35314:4;35188:131;:::i;:::-;35180:139;;34907:419;;;:::o;35332:::-;35498:4;35536:2;35525:9;35521:18;35513:26;;35585:9;35579:4;35575:20;35571:1;35560:9;35556:17;35549:47;35613:131;35739:4;35613:131;:::i;:::-;35605:139;;35332:419;;;:::o;35757:::-;35923:4;35961:2;35950:9;35946:18;35938:26;;36010:9;36004:4;36000:20;35996:1;35985:9;35981:17;35974:47;36038:131;36164:4;36038:131;:::i;:::-;36030:139;;35757:419;;;:::o;36182:::-;36348:4;36386:2;36375:9;36371:18;36363:26;;36435:9;36429:4;36425:20;36421:1;36410:9;36406:17;36399:47;36463:131;36589:4;36463:131;:::i;:::-;36455:139;;36182:419;;;:::o;36607:::-;36773:4;36811:2;36800:9;36796:18;36788:26;;36860:9;36854:4;36850:20;36846:1;36835:9;36831:17;36824:47;36888:131;37014:4;36888:131;:::i;:::-;36880:139;;36607:419;;;:::o;37032:::-;37198:4;37236:2;37225:9;37221:18;37213:26;;37285:9;37279:4;37275:20;37271:1;37260:9;37256:17;37249:47;37313:131;37439:4;37313:131;:::i;:::-;37305:139;;37032:419;;;:::o;37457:::-;37623:4;37661:2;37650:9;37646:18;37638:26;;37710:9;37704:4;37700:20;37696:1;37685:9;37681:17;37674:47;37738:131;37864:4;37738:131;:::i;:::-;37730:139;;37457:419;;;:::o;37882:::-;38048:4;38086:2;38075:9;38071:18;38063:26;;38135:9;38129:4;38125:20;38121:1;38110:9;38106:17;38099:47;38163:131;38289:4;38163:131;:::i;:::-;38155:139;;37882:419;;;:::o;38307:::-;38473:4;38511:2;38500:9;38496:18;38488:26;;38560:9;38554:4;38550:20;38546:1;38535:9;38531:17;38524:47;38588:131;38714:4;38588:131;:::i;:::-;38580:139;;38307:419;;;:::o;38732:::-;38898:4;38936:2;38925:9;38921:18;38913:26;;38985:9;38979:4;38975:20;38971:1;38960:9;38956:17;38949:47;39013:131;39139:4;39013:131;:::i;:::-;39005:139;;38732:419;;;:::o;39157:::-;39323:4;39361:2;39350:9;39346:18;39338:26;;39410:9;39404:4;39400:20;39396:1;39385:9;39381:17;39374:47;39438:131;39564:4;39438:131;:::i;:::-;39430:139;;39157:419;;;:::o;39582:::-;39748:4;39786:2;39775:9;39771:18;39763:26;;39835:9;39829:4;39825:20;39821:1;39810:9;39806:17;39799:47;39863:131;39989:4;39863:131;:::i;:::-;39855:139;;39582:419;;;:::o;40007:::-;40173:4;40211:2;40200:9;40196:18;40188:26;;40260:9;40254:4;40250:20;40246:1;40235:9;40231:17;40224:47;40288:131;40414:4;40288:131;:::i;:::-;40280:139;;40007:419;;;:::o;40432:::-;40598:4;40636:2;40625:9;40621:18;40613:26;;40685:9;40679:4;40675:20;40671:1;40660:9;40656:17;40649:47;40713:131;40839:4;40713:131;:::i;:::-;40705:139;;40432:419;;;:::o;40857:::-;41023:4;41061:2;41050:9;41046:18;41038:26;;41110:9;41104:4;41100:20;41096:1;41085:9;41081:17;41074:47;41138:131;41264:4;41138:131;:::i;:::-;41130:139;;40857:419;;;:::o;41282:::-;41448:4;41486:2;41475:9;41471:18;41463:26;;41535:9;41529:4;41525:20;41521:1;41510:9;41506:17;41499:47;41563:131;41689:4;41563:131;:::i;:::-;41555:139;;41282:419;;;:::o;41707:::-;41873:4;41911:2;41900:9;41896:18;41888:26;;41960:9;41954:4;41950:20;41946:1;41935:9;41931:17;41924:47;41988:131;42114:4;41988:131;:::i;:::-;41980:139;;41707:419;;;:::o;42132:::-;42298:4;42336:2;42325:9;42321:18;42313:26;;42385:9;42379:4;42375:20;42371:1;42360:9;42356:17;42349:47;42413:131;42539:4;42413:131;:::i;:::-;42405:139;;42132:419;;;:::o;42557:::-;42723:4;42761:2;42750:9;42746:18;42738:26;;42810:9;42804:4;42800:20;42796:1;42785:9;42781:17;42774:47;42838:131;42964:4;42838:131;:::i;:::-;42830:139;;42557:419;;;:::o;42982:::-;43148:4;43186:2;43175:9;43171:18;43163:26;;43235:9;43229:4;43225:20;43221:1;43210:9;43206:17;43199:47;43263:131;43389:4;43263:131;:::i;:::-;43255:139;;42982:419;;;:::o;43407:::-;43573:4;43611:2;43600:9;43596:18;43588:26;;43660:9;43654:4;43650:20;43646:1;43635:9;43631:17;43624:47;43688:131;43814:4;43688:131;:::i;:::-;43680:139;;43407:419;;;:::o;43832:222::-;43925:4;43963:2;43952:9;43948:18;43940:26;;43976:71;44044:1;44033:9;44029:17;44020:6;43976:71;:::i;:::-;43832:222;;;;:::o;44060:129::-;44094:6;44121:20;;:::i;:::-;44111:30;;44150:33;44178:4;44170:6;44150:33;:::i;:::-;44060:129;;;:::o;44195:75::-;44228:6;44261:2;44255:9;44245:19;;44195:75;:::o;44276:307::-;44337:4;44427:18;44419:6;44416:30;44413:56;;;44449:18;;:::i;:::-;44413:56;44487:29;44509:6;44487:29;:::i;:::-;44479:37;;44571:4;44565;44561:15;44553:23;;44276:307;;;:::o;44589:308::-;44651:4;44741:18;44733:6;44730:30;44727:56;;;44763:18;;:::i;:::-;44727:56;44801:29;44823:6;44801:29;:::i;:::-;44793:37;;44885:4;44879;44875:15;44867:23;;44589:308;;;:::o;44903:132::-;44970:4;44993:3;44985:11;;45023:4;45018:3;45014:14;45006:22;;44903:132;;;:::o;45041:114::-;45108:6;45142:5;45136:12;45126:22;;45041:114;;;:::o;45161:98::-;45212:6;45246:5;45240:12;45230:22;;45161:98;;;:::o;45265:99::-;45317:6;45351:5;45345:12;45335:22;;45265:99;;;:::o;45370:113::-;45440:4;45472;45467:3;45463:14;45455:22;;45370:113;;;:::o;45489:184::-;45588:11;45622:6;45617:3;45610:19;45662:4;45657:3;45653:14;45638:29;;45489:184;;;;:::o;45679:168::-;45762:11;45796:6;45791:3;45784:19;45836:4;45831:3;45827:14;45812:29;;45679:168;;;;:::o;45853:147::-;45954:11;45991:3;45976:18;;45853:147;;;;:::o;46006:169::-;46090:11;46124:6;46119:3;46112:19;46164:4;46159:3;46155:14;46140:29;;46006:169;;;;:::o;46181:148::-;46283:11;46320:3;46305:18;;46181:148;;;;:::o;46335:305::-;46375:3;46394:20;46412:1;46394:20;:::i;:::-;46389:25;;46428:20;46446:1;46428:20;:::i;:::-;46423:25;;46582:1;46514:66;46510:74;46507:1;46504:81;46501:107;;;46588:18;;:::i;:::-;46501:107;46632:1;46629;46625:9;46618:16;;46335:305;;;;:::o;46646:185::-;46686:1;46703:20;46721:1;46703:20;:::i;:::-;46698:25;;46737:20;46755:1;46737:20;:::i;:::-;46732:25;;46776:1;46766:35;;46781:18;;:::i;:::-;46766:35;46823:1;46820;46816:9;46811:14;;46646:185;;;;:::o;46837:348::-;46877:7;46900:20;46918:1;46900:20;:::i;:::-;46895:25;;46934:20;46952:1;46934:20;:::i;:::-;46929:25;;47122:1;47054:66;47050:74;47047:1;47044:81;47039:1;47032:9;47025:17;47021:105;47018:131;;;47129:18;;:::i;:::-;47018:131;47177:1;47174;47170:9;47159:20;;46837:348;;;;:::o;47191:191::-;47231:4;47251:20;47269:1;47251:20;:::i;:::-;47246:25;;47285:20;47303:1;47285:20;:::i;:::-;47280:25;;47324:1;47321;47318:8;47315:34;;;47329:18;;:::i;:::-;47315:34;47374:1;47371;47367:9;47359:17;;47191:191;;;;:::o;47388:96::-;47425:7;47454:24;47472:5;47454:24;:::i;:::-;47443:35;;47388:96;;;:::o;47490:90::-;47524:7;47567:5;47560:13;47553:21;47542:32;;47490:90;;;:::o;47586:77::-;47623:7;47652:5;47641:16;;47586:77;;;:::o;47669:149::-;47705:7;47745:66;47738:5;47734:78;47723:89;;47669:149;;;:::o;47824:126::-;47861:7;47901:42;47894:5;47890:54;47879:65;;47824:126;;;:::o;47956:77::-;47993:7;48022:5;48011:16;;47956:77;;;:::o;48039:86::-;48074:7;48114:4;48107:5;48103:16;48092:27;;48039:86;;;:::o;48131:154::-;48215:6;48210:3;48205;48192:30;48277:1;48268:6;48263:3;48259:16;48252:27;48131:154;;;:::o;48291:307::-;48359:1;48369:113;48383:6;48380:1;48377:13;48369:113;;;48468:1;48463:3;48459:11;48453:18;48449:1;48444:3;48440:11;48433:39;48405:2;48402:1;48398:10;48393:15;;48369:113;;;48500:6;48497:1;48494:13;48491:101;;;48580:1;48571:6;48566:3;48562:16;48555:27;48491:101;48340:258;48291:307;;;:::o;48604:320::-;48648:6;48685:1;48679:4;48675:12;48665:22;;48732:1;48726:4;48722:12;48753:18;48743:81;;48809:4;48801:6;48797:17;48787:27;;48743:81;48871:2;48863:6;48860:14;48840:18;48837:38;48834:84;;;48890:18;;:::i;:::-;48834:84;48655:269;48604:320;;;:::o;48930:281::-;49013:27;49035:4;49013:27;:::i;:::-;49005:6;49001:40;49143:6;49131:10;49128:22;49107:18;49095:10;49092:34;49089:62;49086:88;;;49154:18;;:::i;:::-;49086:88;49194:10;49190:2;49183:22;48973:238;48930:281;;:::o;49217:233::-;49256:3;49279:24;49297:5;49279:24;:::i;:::-;49270:33;;49325:66;49318:5;49315:77;49312:103;;;49395:18;;:::i;:::-;49312:103;49442:1;49435:5;49431:13;49424:20;;49217:233;;;:::o;49456:100::-;49495:7;49524:26;49544:5;49524:26;:::i;:::-;49513:37;;49456:100;;;:::o;49562:79::-;49601:7;49630:5;49619:16;;49562:79;;;:::o;49647:94::-;49686:7;49715:20;49729:5;49715:20;:::i;:::-;49704:31;;49647:94;;;:::o;49747:176::-;49779:1;49796:20;49814:1;49796:20;:::i;:::-;49791:25;;49830:20;49848:1;49830:20;:::i;:::-;49825:25;;49869:1;49859:35;;49874:18;;:::i;:::-;49859:35;49915:1;49912;49908:9;49903:14;;49747:176;;;;:::o;49929:180::-;49977:77;49974:1;49967:88;50074:4;50071:1;50064:15;50098:4;50095:1;50088:15;50115:180;50163:77;50160:1;50153:88;50260:4;50257:1;50250:15;50284:4;50281:1;50274:15;50301:180;50349:77;50346:1;50339:88;50446:4;50443:1;50436:15;50470:4;50467:1;50460:15;50487:180;50535:77;50532:1;50525:88;50632:4;50629:1;50622:15;50656:4;50653:1;50646:15;50673:180;50721:77;50718:1;50711:88;50818:4;50815:1;50808:15;50842:4;50839:1;50832:15;50859:180;50907:77;50904:1;50897:88;51004:4;51001:1;50994:15;51028:4;51025:1;51018:15;51045:117;51154:1;51151;51144:12;51168:117;51277:1;51274;51267:12;51291:117;51400:1;51397;51390:12;51414:117;51523:1;51520;51513:12;51537:102;51578:6;51629:2;51625:7;51620:2;51613:5;51609:14;51605:28;51595:38;;51537:102;;;:::o;51645:94::-;51678:8;51726:5;51722:2;51718:14;51697:35;;51645:94;;;:::o;51745:181::-;51885:33;51881:1;51873:6;51869:14;51862:57;51745:181;:::o;51932:230::-;52072:34;52068:1;52060:6;52056:14;52049:58;52141:13;52136:2;52128:6;52124:15;52117:38;51932:230;:::o;52168:237::-;52308:34;52304:1;52296:6;52292:14;52285:58;52377:20;52372:2;52364:6;52360:15;52353:45;52168:237;:::o;52411:225::-;52551:34;52547:1;52539:6;52535:14;52528:58;52620:8;52615:2;52607:6;52603:15;52596:33;52411:225;:::o;52642:166::-;52782:18;52778:1;52770:6;52766:14;52759:42;52642:166;:::o;52814:178::-;52954:30;52950:1;52942:6;52938:14;52931:54;52814:178;:::o;52998:166::-;53138:18;53134:1;53126:6;53122:14;53115:42;52998:166;:::o;53170:164::-;53310:16;53306:1;53298:6;53294:14;53287:40;53170:164;:::o;53340:223::-;53480:34;53476:1;53468:6;53464:14;53457:58;53549:6;53544:2;53536:6;53532:15;53525:31;53340:223;:::o;53569:175::-;53709:27;53705:1;53697:6;53693:14;53686:51;53569:175;:::o;53750:231::-;53890:34;53886:1;53878:6;53874:14;53867:58;53959:14;53954:2;53946:6;53942:15;53935:39;53750:231;:::o;53987:243::-;54127:34;54123:1;54115:6;54111:14;54104:58;54196:26;54191:2;54183:6;54179:15;54172:51;53987:243;:::o;54236:229::-;54376:34;54372:1;54364:6;54360:14;54353:58;54445:12;54440:2;54432:6;54428:15;54421:37;54236:229;:::o;54471:228::-;54611:34;54607:1;54599:6;54595:14;54588:58;54680:11;54675:2;54667:6;54663:15;54656:36;54471:228;:::o;54705:182::-;54845:34;54841:1;54833:6;54829:14;54822:58;54705:182;:::o;54893:222::-;55033:34;55029:1;55021:6;55017:14;55010:58;55102:5;55097:2;55089:6;55085:15;55078:30;54893:222;:::o;55121:164::-;55261:16;55257:1;55249:6;55245:14;55238:40;55121:164;:::o;55291:231::-;55431:34;55427:1;55419:6;55415:14;55408:58;55500:14;55495:2;55487:6;55483:15;55476:39;55291:231;:::o;55528:161::-;55668:13;55664:1;55656:6;55652:14;55645:37;55528:161;:::o;55695:182::-;55835:34;55831:1;55823:6;55819:14;55812:58;55695:182;:::o;55883:228::-;56023:34;56019:1;56011:6;56007:14;56000:58;56092:11;56087:2;56079:6;56075:15;56068:36;55883:228;:::o;56117:234::-;56257:34;56253:1;56245:6;56241:14;56234:58;56326:17;56321:2;56313:6;56309:15;56302:42;56117:234;:::o;56357:169::-;56497:21;56493:1;56485:6;56481:14;56474:45;56357:169;:::o;56532:220::-;56672:34;56668:1;56660:6;56656:14;56649:58;56741:3;56736:2;56728:6;56724:15;56717:28;56532:220;:::o;56758:171::-;56898:23;56894:1;56886:6;56882:14;56875:47;56758:171;:::o;56935:114::-;;:::o;57055:166::-;57195:18;57191:1;57183:6;57179:14;57172:42;57055:166;:::o;57227:236::-;57367:34;57363:1;57355:6;57351:14;57344:58;57436:19;57431:2;57423:6;57419:15;57412:44;57227:236;:::o;57469:176::-;57609:28;57605:1;57597:6;57593:14;57586:52;57469:176;:::o;57651:231::-;57791:34;57787:1;57779:6;57775:14;57768:58;57860:14;57855:2;57847:6;57843:15;57836:39;57651:231;:::o;57888:241::-;58028:34;58024:1;58016:6;58012:14;58005:58;58097:24;58092:2;58084:6;58080:15;58073:49;57888:241;:::o;58135:165::-;58275:17;58271:1;58263:6;58259:14;58252:41;58135:165;:::o;58306:169::-;58446:21;58442:1;58434:6;58430:14;58423:45;58306:169;:::o;58481:174::-;58621:26;58617:1;58609:6;58605:14;58598:50;58481:174;:::o;58661:122::-;58734:24;58752:5;58734:24;:::i;:::-;58727:5;58724:35;58714:63;;58773:1;58770;58763:12;58714:63;58661:122;:::o;58789:116::-;58859:21;58874:5;58859:21;:::i;:::-;58852:5;58849:32;58839:60;;58895:1;58892;58885:12;58839:60;58789:116;:::o;58911:122::-;58984:24;59002:5;58984:24;:::i;:::-;58977:5;58974:35;58964:63;;59023:1;59020;59013:12;58964:63;58911:122;:::o;59039:120::-;59111:23;59128:5;59111:23;:::i;:::-;59104:5;59101:34;59091:62;;59149:1;59146;59139:12;59091:62;59039:120;:::o;59165:122::-;59238:24;59256:5;59238:24;:::i;:::-;59231:5;59228:35;59218:63;;59277:1;59274;59267:12;59218:63;59165:122;:::o;59293:118::-;59364:22;59380:5;59364:22;:::i;:::-;59357:5;59354:33;59344:61;;59401:1;59398;59391:12;59344:61;59293:118;:::o

Swarm Source

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