ETH Price: $2,272.49 (-4.68%)

Token

Baby Dragos (BDRAGOS)
 

Overview

Max Total Supply

630 BDRAGOS

Holders

299

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
codename.eth
Balance
1 BDRAGOS
0x42cbd461badfa828d64bb2684f49289a62248d4a
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:
BabyDragos

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//Need help creating your nft collection? 
//Contact [email protected]

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


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



/**
 * @dev String operations.
 */
library Strings {

    /**
     * @dev Custom toString function
     */
    function toString(uint256 _i) internal pure returns (string memory) {

        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

}


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


/**
 * @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);
    }
}


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



/**
 * @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);
}


/**
 * @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);
}


/**
 * @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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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/math/SafeMath.sol

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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


/**
 * @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(to).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 {}
}



/**
 * @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);
}


/**
 * @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();
    }
}


contract BabyDragos is ERC721Enumerable, ReentrancyGuard, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    bool public claimActive;
    address payable mintData;

    address payoutWallet1;
    address payoutWallet2;

    BabyDragos dragosContract;

    uint256 creationTime;
    uint256 public MAX_TOKEN_SUPPLY = 6000;
    uint256 maxClaimsPerTxn = 5;
    uint256 bytPayoutPercentage;

    uint256[] babyChunks;

    mapping(uint256 => string) private _babyDragosNameByTokenId;
    mapping(uint256 => uint256) private _dragosBirthdayByTokenId;
    mapping(uint256 => uint256) public _tokenClaimedByDragosId;

    function setClaim() external onlyOwner
    {
        claimActive = !claimActive;
    }

    function setDragosContract(address payable _address) external onlyOwner {
        dragosContract = BabyDragos(_address);
    }

    function hasMinted(uint256 tokenId) external view returns (bool)
    {
        return _exists(tokenId);
    }

    function getCreationTime() external view returns (uint256)
    {
        return creationTime;
    }

    function getName(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        if (bytes(_babyDragosNameByTokenId[tokenId]).length > 0) {
            return _babyDragosNameByTokenId[tokenId];
        } else {
            return string(abi.encodePacked("Baby Dragos #", toString(tokenId)));
        }

    }

    function getBackground(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getBackground(tokenId);

        return output;
    }
    
    function getFaction(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getFaction(tokenId);

        return output;
    }
    
    function getWings(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getWings(tokenId);

        return output;
    }

    function getWingTips(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getWingTips(tokenId);

        return output;
    }
    
    function getClothes(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getClothes(tokenId);

        return output;
    }

    function getNecklace(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getNecklace(tokenId);

        return output;
    }
    
    function getMouth(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getMouth(tokenId);

        return output;
    }
    
    function getEyes(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getEyes(tokenId);

        return output;
    }
    
    function getHat(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;

        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getHat(tokenId);

        return output;
    }

    function getBirthday(uint256 tokenId) public view returns (uint256) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        uint256 output;

        BabyDragos dataContract = BabyDragos(mintData);
        output = dataContract.getBirthday(tokenId);

        return output;
    }

    function getStats(uint256 statIndex, uint256 tokenId) public view returns (string memory statName, uint256 statValue) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        BabyDragos dataContract = BabyDragos(mintData);
        (statName, statValue) = dataContract.getStats(statIndex, tokenId);

        return (statName, statValue);
    }

    function setBabyChunk(uint256 currentChunkFinalTokenId) external onlyOwner 
    {
        if(babyChunks.length > 0)
        {
            require(currentChunkFinalTokenId > babyChunks[babyChunks.length -1], "Final Id too small");
        }
        require(currentChunkFinalTokenId <= dragosContract.totalSupply(), "Larger than dragos supply");
        babyChunks.push(currentChunkFinalTokenId);
    }

    function getBabyChunkLength() external view returns(uint256)
    {
        require(msg.sender == mintData, "Permission Denied");
        return babyChunks.length;
    }

    function getBabyChunk(uint256 index) external view returns(uint256){
        require(msg.sender == mintData, "Permission Denied");
        return babyChunks[index];
    }

    function changeBabyChunk(uint256 index, uint256 _value) external onlyOwner {
        require(index < babyChunks.length, "Index too large");
        if(index < (babyChunks.length - 1))
        {
            require(_value < babyChunks[index + 1], "Value larger than next chunk");
        }
        if(index > 0)
        {
            require(_value > babyChunks[index - 1], "Value smaller than previous chunk");
        }

        babyChunks[index] = _value;
    }

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

            BabyDragos dataContract = BabyDragos(mintData);
            output = dataContract.tokenURI(tokenId);

            return output;
    }

    function changeName(uint256 tokenId, string memory _name) external {
        require(ownerOf(tokenId) == _msgSender(), "You dont own that baby");
        require(validateName(_name), "Name is invalid");
        _babyDragosNameByTokenId[tokenId] = _name;
    }

    function validateName(string memory str) internal pure returns (bool){
		bytes memory b = bytes(str);
		if(b.length < 1) return false;
		if(b.length > 25) return false; // Cannot be longer than 25 characters
		if(b[0] == 0x20) return false; // Leading space
		if (b[b.length - 1] == 0x20) return false; // Trailing space

		bytes1 lastChar = b[0];

		for(uint i; i<b.length; i++){
			bytes1 char = b[i];

			if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces

			if(
				!(char >= 0x30 && char <= 0x39) && //9-0
				!(char >= 0x41 && char <= 0x5A) && //A-Z
				!(char >= 0x61 && char <= 0x7A) && //a-z
				!(char == 0x20) //space
			)
				return false;

			lastChar = char;
		}

		return true;
	}


    function mint(uint256[] memory dragosIds, string[] memory names) public nonReentrant {
        require(dragosIds.length <= maxClaimsPerTxn, "You can only claim 5 at a time");
        require(claimActive, "Claiming babies is not active yet");
        
        uint256 tokenId = totalSupply() + 1; //First token will have ID 1 instead of 0 for mint mapping checks
        uint256 time = block.timestamp;

        for(uint256 i = 0; i < dragosIds.length; i++)
        {
            require(dragosContract.getBirthday(dragosIds[i]) < time, "Baby has not been born yet");
            require(_tokenClaimedByDragosId[dragosIds[i]] == 0, "Dragos has already claimed");

            if (bytes(names[i]).length > 0) {
                require(validateName(names[i]), "Name is invalid");
                _babyDragosNameByTokenId[tokenId + i] = names[i];
            }

            _tokenClaimedByDragosId[dragosIds[i]] = tokenId + i;
            _safeMint(_msgSender(), tokenId + i);
        }
    }

    function setWalletOne(address _walletAddress) external onlyOwner {
        payoutWallet1 = _walletAddress;
    }

    function setWalletTwo(address _walletAddress) external onlyOwner {
        payoutWallet2 = _walletAddress;
    }

    function setMintContract(address payable contractAddress) public onlyOwner {
        mintData = contractAddress;
    }

    function withdraw() external onlyOwner {
        require(payoutWallet1 != address(0), "wallet 1 not set");
        require(payoutWallet2 != address(0), "wallet 2 not set");
        uint256 balance = address(this).balance;
        uint256 walletBalance = balance.mul(100 - bytPayoutPercentage).div(100);
        payable(payoutWallet1).transfer(walletBalance);
        payable(payoutWallet2).transfer(balance.sub(walletBalance));
    }
    
    constructor() ERC721("Baby Dragos", "BDRAGOS") Ownable() {
        creationTime = block.timestamp;
        payoutWallet1 = 0x8d3Aad1100c67ecCef8426151DC8C4b659012a6F; // dragos payout wallet
        payoutWallet2 = 0xFd182CAc22329a58375bf5f93B2C33E83c881540; // byt payout wallet
        bytPayoutPercentage = 9;
        mintData = payable(0x787CC682fcC85375edF7e88E289030d375e15B9A); 
        dragosContract = BabyDragos(payable(0xB0858AC51bca73c11BA3203712E319b7C45b0896));
    }

    fallback() external payable {}

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_TOKEN_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenClaimedByDragosId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"changeBabyChunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getBabyChunk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBabyChunkLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBackground","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBirthday","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClothes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEyes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFaction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHat","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMouth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNecklace","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"statIndex","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStats","outputs":[{"internalType":"string","name":"statName","type":"string"},{"internalType":"uint256","name":"statValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWingTips","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWings","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"dragosIds","type":"uint256[]"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"currentChunkFinalTokenId","type":"uint256"}],"name":"setBabyChunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"}],"name":"setDragosContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"contractAddress","type":"address"}],"name":"setMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"setWalletOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"setWalletTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261177060115560056012553480156200001c57600080fd5b50604080518082018252600b81526a4261627920447261676f7360a81b60208083019182528351808501909452600784526642445241474f5360c81b9084015281519192916200006f916000916200017d565b508051620000859060019060208401906200017d565b50506001600a555062000098336200012b565b42601055600d80546001600160a01b0319908116738d3aad1100c67eccef8426151dc8c4b659012a6f17909155600e8054821673fd182cac22329a58375bf5f93b2c33e83c8815401790556009601355600c8054821673787cc682fcc85375edf7e88e289030d375e15b9a179055600f805490911673b0858ac51bca73c11ba3203712e319b7c45b089617905562000260565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200018b9062000223565b90600052602060002090601f016020900481019282620001af5760008555620001fa565b82601f10620001ca57805160ff1916838001178555620001fa565b82800160010185558215620001fa579182015b82811115620001fa578251825591602001919060010190620001dd565b50620002089291506200020c565b5090565b5b808211156200020857600081556001016200020d565b600181811c908216806200023857607f821691505b602082108114156200025a57634e487b7160e01b600052602260045260246000fd5b50919050565b6137e880620002706000396000f3fe60806040526004361061027e5760003560e01c806377830dca1161014e578063c8d2524c116100bb578063e6519a3511610077578063e6519a35146107d6578063e8d887d3146107eb578063e985e9c51461080b578063f2fde38b14610854578063f526454e14610874578063feb6b3d11461088957005b8063c8d2524c1461071f578063d18ceec21461073f578063d2571f881461075f578063d4a6a2fd1461077f578063e489d510146107a0578063e5b95595146107b657005b8063a8a150b81161010a578063a8a150b814610651578063b88d4fde14610671578063bb47c9b314610691578063c39cbef1146106bf578063c4d30bfa146106df578063c87b56dd146106ff57005b806377830dca1461059e57806388bd5002146105be5780638da5cb5b146105de57806395d89b41146105fc578063992faa6e14610611578063a22cb4651461063157005b80632f745c59116101ec5780634f6ccce7116101a85780634f6ccce7146104e95780635fb64a6a146105095780636352211e146105295780636b8ff5741461054957806370a0823114610569578063715018a61461058957005b80632f745c591461043f5780633a6713ec1461045f5780633ccfd60b1461047f578063407f42b71461049457806342842e0e146104b45780634851218e146104d457005b806318160ddd1161023b57806318160ddd1461038a5780631dbe61fe1461039f57806323b872dd146103bf578063281303d4146103df5780632c098d34146103ff5780632d02f8c11461041f57005b806301ffc9a71461028057806306fdde03146102b5578063081812fc146102d7578063095ea7b31461030f5780630cf2cc381461032f57806315d775c91461034f575b005b34801561028c57600080fd5b506102a061029b366004613263565b6108a9565b60405190151581526020015b60405180910390f35b3480156102c157600080fd5b506102ca6108d4565b6040516102ac9190613448565b3480156102e357600080fd5b506102f76102f2366004613319565b610966565b6040516001600160a01b0390911681526020016102ac565b34801561031b57600080fd5b5061027e61032a366004613177565b6109f3565b34801561033b57600080fd5b5061027e61034a36600461302d565b610b09565b34801561035b57600080fd5b5061037c61036a366004613319565b60176020526000908152604090205481565b6040519081526020016102ac565b34801561039657600080fd5b5060085461037c565b3480156103ab57600080fd5b5061027e6103ba366004613388565b610b55565b3480156103cb57600080fd5b5061027e6103da366004613083565b610cf8565b3480156103eb57600080fd5b5061027e6103fa36600461302d565b610d29565b34801561040b57600080fd5b5061037c61041a366004613319565b610d75565b34801561042b57600080fd5b506102ca61043a366004613319565b610deb565b34801561044b57600080fd5b5061037c61045a366004613177565b610e9e565b34801561046b57600080fd5b506102ca61047a366004613319565b610f34565b34801561048b57600080fd5b5061027e610f8f565b3480156104a057600080fd5b506102ca6104af366004613319565b6110f7565b3480156104c057600080fd5b5061027e6104cf366004613083565b611152565b3480156104e057600080fd5b5061037c61116d565b3480156104f557600080fd5b5061037c610504366004613319565b6111c5565b34801561051557600080fd5b5061027e61052436600461302d565b611246565b34801561053557600080fd5b506102f7610544366004613319565b611292565b34801561055557600080fd5b506102ca610564366004613319565b611309565b34801561057557600080fd5b5061037c61058436600461302d565b61141e565b34801561059557600080fd5b5061027e6114a5565b3480156105aa57600080fd5b5061027e6105b93660046131a3565b6114db565b3480156105ca57600080fd5b506102ca6105d9366004613319565b6118b7565b3480156105ea57600080fd5b50600b546001600160a01b03166102f7565b34801561060857600080fd5b506102ca611912565b34801561061d57600080fd5b5061027e61062c366004613319565b611921565b34801561063d57600080fd5b5061027e61064c366004613144565b611acb565b34801561065d57600080fd5b506102ca61066c366004613319565b611b90565b34801561067d57600080fd5b5061027e61068c3660046130c4565b611beb565b34801561069d57600080fd5b506106b16106ac366004613388565b611c23565b6040516102ac92919061345b565b3480156106cb57600080fd5b5061027e6106da36600461334b565b611ce1565b3480156106eb57600080fd5b506102ca6106fa366004613319565b611da0565b34801561070b57600080fd5b506102ca61071a366004613319565b611dfb565b34801561072b57600080fd5b5061037c61073a366004613319565b611e56565b34801561074b57600080fd5b5061027e61075a36600461302d565b611efc565b34801561076b57600080fd5b506102ca61077a366004613319565b611f48565b34801561078b57600080fd5b50600b546102a090600160a01b900460ff1681565b3480156107ac57600080fd5b5061037c60115481565b3480156107c257600080fd5b506102a06107d1366004613319565b611fa3565b3480156107e257600080fd5b5060105461037c565b3480156107f757600080fd5b506102ca610806366004613319565b611fae565b34801561081757600080fd5b506102a061082636600461304a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561086057600080fd5b5061027e61086f36600461302d565b612009565b34801561088057600080fd5b5061027e6120a4565b34801561089557600080fd5b506102ca6108a4366004613319565b6120ef565b60006001600160e01b0319821663780e9d6360e01b14806108ce57506108ce8261214a565b92915050565b6060600080546108e3906136af565b80601f016020809104026020016040519081016040528092919081815260200182805461090f906136af565b801561095c5780601f106109315761010080835404028352916020019161095c565b820191906000526020600020905b81548152906001019060200180831161093f57829003601f168201915b5050505050905090565b60006109718261219a565b6109d75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109fe82611292565b9050806001600160a01b0316836001600160a01b03161415610a6c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109ce565b336001600160a01b0382161480610a885750610a888133610826565b610afa5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ce565b610b0483836121b7565b505050565b600b546001600160a01b03163314610b335760405162461bcd60e51b81526004016109ce906134cf565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610b7f5760405162461bcd60e51b81526004016109ce906134cf565b6014548210610bc25760405162461bcd60e51b815260206004820152600f60248201526e496e64657820746f6f206c6172676560881b60448201526064016109ce565b601454610bd19060019061366c565b821015610c4e576014610be5836001613621565b81548110610bf557610bf561375b565b90600052602060002001548110610c4e5760405162461bcd60e51b815260206004820152601c60248201527f56616c7565206c6172676572207468616e206e657874206368756e6b0000000060448201526064016109ce565b8115610cd4576014610c6160018461366c565b81548110610c7157610c7161375b565b90600052602060002001548111610cd45760405162461bcd60e51b815260206004820152602160248201527f56616c756520736d616c6c6572207468616e2070726576696f7573206368756e6044820152606b60f81b60648201526084016109ce565b8060148381548110610ce857610ce861375b565b6000918252602090912001555050565b610d023382612225565b610d1e5760405162461bcd60e51b81526004016109ce90613553565b610b0483838361230b565b600b546001600160a01b03163314610d535760405162461bcd60e51b81526004016109ce906134cf565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546000906001600160a01b03163314610dc65760405162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8811195b9a5959607a1b60448201526064016109ce565b60148281548110610dd957610dd961375b565b90600052602060002001549050919050565b6060610df68261219a565b610e125760405162461bcd60e51b81526004016109ce90613504565b600c54604051632d02f8c160e01b8152600481018490526060916001600160a01b0316908190632d02f8c1906024015b60006040518083038186803b158015610e5a57600080fd5b505afa158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e96919081019061329d565b949350505050565b6000610ea98361141e565b8210610f0b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109ce565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6060610f3f8261219a565b610f5b5760405162461bcd60e51b81526004016109ce90613504565b600c54604051630e99c4fb60e21b8152600481018490526060916001600160a01b0316908190633a6713ec90602401610e42565b600b546001600160a01b03163314610fb95760405162461bcd60e51b81526004016109ce906134cf565b600d546001600160a01b03166110045760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c481b9bdd081cd95d60821b60448201526064016109ce565b600e546001600160a01b031661104f5760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c881b9bdd081cd95d60821b60448201526064016109ce565b6000479050600061107a6064611074601354606461106d919061366c565b85906124b6565b9061253c565b600d546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156110b5573d6000803e3d6000fd5b50600e546001600160a01b03166108fc6110cf8484612597565b6040518115909202916000818181858888f19350505050158015610b04573d6000803e3d6000fd5b60606111028261219a565b61111e5760405162461bcd60e51b81526004016109ce90613504565b600c5460405163407f42b760e01b8152600481018490526060916001600160a01b031690819063407f42b790602401610e42565b610b0483838360405180602001604052806000815250611beb565b600c546000906001600160a01b031633146111be5760405162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8811195b9a5959607a1b60448201526064016109ce565b5060145490565b60006111d060085490565b82106112335760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109ce565b60088281548110610dd957610dd961375b565b600b546001600160a01b031633146112705760405162461bcd60e51b81526004016109ce906134cf565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108ce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109ce565b60606113148261219a565b6113305760405162461bcd60e51b81526004016109ce90613504565b60008281526015602052604081208054611349906136af565b905011156113ef576000828152601560205260409020805461136a906136af565b80601f0160208091040260200160405190810160405280929190818152602001828054611396906136af565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b50505050509050919050565b6113f8826125f3565b60405160200161140891906133d6565b6040516020818303038152906040529050919050565b60006001600160a01b0382166114895760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109ce565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114cf5760405162461bcd60e51b81526004016109ce906134cf565b6114d960006126f1565b565b6002600a54141561152e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ce565b6002600a55601254825111156115865760405162461bcd60e51b815260206004820152601e60248201527f596f752063616e206f6e6c7920636c61696d203520617420612074696d65000060448201526064016109ce565b600b54600160a01b900460ff166115e95760405162461bcd60e51b815260206004820152602160248201527f436c61696d696e6720626162696573206973206e6f74206163746976652079656044820152601d60fa1b60648201526084016109ce565b60006115f460085490565b6115ff906001613621565b90504260005b84518110156118ab57600f54855183916001600160a01b03169063c8d2524c908890859081106116375761163761375b565b60200260200101516040518263ffffffff1660e01b815260040161165d91815260200190565b60206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190613332565b106116fa5760405162461bcd60e51b815260206004820152601a60248201527f4261627920686173206e6f74206265656e20626f726e2079657400000000000060448201526064016109ce565b601760008683815181106117105761171061375b565b60200260200101518152602001908152602001600020546000146117765760405162461bcd60e51b815260206004820152601a60248201527f447261676f732068617320616c726561647920636c61696d656400000000000060448201526064016109ce565b600084828151811061178a5761178a61375b565b6020026020010151511115611846576117bb8482815181106117ae576117ae61375b565b6020026020010151612743565b6117f95760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b60448201526064016109ce565b83818151811061180b5761180b61375b565b60200260200101516015600083866118239190613621565b81526020019081526020016000209080519060200190611844929190612e5f565b505b6118508184613621565b601760008784815181106118665761186661375b565b602002602001015181526020019081526020016000208190555061189961188a3390565b6118948386613621565b612952565b806118a3816136ea565b915050611605565b50506001600a55505050565b60606118c28261219a565b6118de5760405162461bcd60e51b81526004016109ce90613504565b600c5460405163445ea80160e11b8152600481018490526060916001600160a01b03169081906388bd500290602401610e42565b6060600180546108e3906136af565b600b546001600160a01b0316331461194b5760405162461bcd60e51b81526004016109ce906134cf565b601454156119c157601480546119639060019061366c565b815481106119735761197361375b565b906000526020600020015481116119c15760405162461bcd60e51b8152602060048201526012602482015271119a5b985b081259081d1bdbc81cdb585b1b60721b60448201526064016109ce565b600f60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0f57600080fd5b505afa158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a479190613332565b811115611a965760405162461bcd60e51b815260206004820152601960248201527f4c6172676572207468616e20647261676f7320737570706c790000000000000060448201526064016109ce565b601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0155565b6001600160a01b038216331415611b245760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ce565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060611b9b8261219a565b611bb75760405162461bcd60e51b81526004016109ce90613504565b600c546040516315142a1760e31b8152600481018490526060916001600160a01b031690819063a8a150b890602401610e42565b611bf53383612225565b611c115760405162461bcd60e51b81526004016109ce90613553565b611c1d84848484612970565b50505050565b60606000611c308361219a565b611c4c5760405162461bcd60e51b81526004016109ce90613504565b600c5460405163bb47c9b360e01b815260048101869052602481018590526001600160a01b0390911690819063bb47c9b39060440160006040518083038186803b158015611c9957600080fd5b505afa158015611cad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cd591908101906132d2565b90969095509350505050565b33611ceb83611292565b6001600160a01b031614611d3a5760405162461bcd60e51b8152602060048201526016602482015275596f7520646f6e74206f776e2074686174206261627960501b60448201526064016109ce565b611d4381612743565b611d815760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b60448201526064016109ce565b60008281526015602090815260409091208251610b0492840190612e5f565b6060611dab8261219a565b611dc75760405162461bcd60e51b81526004016109ce90613504565b600c5460405163626985fd60e11b8152600481018490526060916001600160a01b031690819063c4d30bfa90602401610e42565b6060611e068261219a565b611e225760405162461bcd60e51b81526004016109ce90613504565b600c5460405163c87b56dd60e01b8152600481018490526060916001600160a01b031690819063c87b56dd90602401610e42565b6000611e618261219a565b611e7d5760405162461bcd60e51b81526004016109ce90613504565b600c54604051633234949360e21b8152600481018490526000916001600160a01b031690819063c8d2524c9060240160206040518083038186803b158015611ec457600080fd5b505afa158015611ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e969190613332565b600b546001600160a01b03163314611f265760405162461bcd60e51b81526004016109ce906134cf565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6060611f538261219a565b611f6f5760405162461bcd60e51b81526004016109ce90613504565b600c54604051631a4ae3f160e31b8152600481018490526060916001600160a01b031690819063d2571f8890602401610e42565b60006108ce8261219a565b6060611fb98261219a565b611fd55760405162461bcd60e51b81526004016109ce90613504565b600c5460405163e8d887d360e01b8152600481018490526060916001600160a01b031690819063e8d887d390602401610e42565b600b546001600160a01b031633146120335760405162461bcd60e51b81526004016109ce906134cf565b6001600160a01b0381166120985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ce565b6120a1816126f1565b50565b600b546001600160a01b031633146120ce5760405162461bcd60e51b81526004016109ce906134cf565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60606120fa8261219a565b6121165760405162461bcd60e51b81526004016109ce90613504565b600c5460405163feb6b3d160e01b8152600481018490526060916001600160a01b031690819063feb6b3d190602401610e42565b60006001600160e01b031982166380ac58cd60e01b148061217b57506001600160e01b03198216635b5e139f60e01b145b806108ce57506301ffc9a760e01b6001600160e01b03198316146108ce565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121ec82611292565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122308261219a565b6122915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109ce565b600061229c83611292565b9050806001600160a01b0316846001600160a01b031614806122d75750836001600160a01b03166122cc84610966565b6001600160a01b0316145b80610e9657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610e96565b826001600160a01b031661231e82611292565b6001600160a01b0316146123865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109ce565b6001600160a01b0382166123e85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ce565b6123f38383836129a3565b6123fe6000826121b7565b6001600160a01b038316600090815260036020526040812080546001929061242790849061366c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612455908490613621565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826124c5575060006108ce565b60006124d1838561364d565b9050826124de8583613639565b146125355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109ce565b9392505050565b600080821161258d5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016109ce565b6125358284613639565b6000828211156125e95760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016109ce565b612535828461366c565b6060816126175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612641578061262b816136ea565b915061263a9050600a83613639565b915061261b565b60008167ffffffffffffffff81111561265c5761265c613771565b6040519080825280601f01601f191660200182016040528015612686576020820181803683370190505b5090505b8415610e965761269b60018361366c565b91506126a8600a86613705565b6126b3906030613621565b60f81b8183815181106126c8576126c861375b565b60200101906001600160f81b031916908160001a9053506126ea600a86613639565b945061268a565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008082905060018151101561275c5750600092915050565b60198151111561276f5750600092915050565b806000815181106127825761278261375b565b6020910101516001600160f81b031916600160fd1b14156127a65750600092915050565b80600182516127b5919061366c565b815181106127c5576127c561375b565b6020910101516001600160f81b031916600160fd1b14156127e95750600092915050565b6000816000815181106127fe576127fe61375b565b01602001516001600160f81b031916905060005b825181101561294757600083828151811061282f5761282f61375b565b01602001516001600160f81b0319169050600160fd1b811480156128605750600160fd1b6001600160f81b03198416145b156128715750600095945050505050565b600360fc1b6001600160f81b031982161080159061289d5750603960f81b6001600160f81b0319821611155b1580156128d35750604160f81b6001600160f81b03198216108015906128d15750602d60f91b6001600160f81b0319821611155b155b80156129085750606160f81b6001600160f81b03198216108015906129065750603d60f91b6001600160f81b0319821611155b155b80156129225750600160fd1b6001600160f81b0319821614155b156129335750600095945050505050565b91508061293f816136ea565b915050612812565b506001949350505050565b61296c828260405180602001604052806000815250612a5b565b5050565b61297b84848461230b565b61298784848484612a8e565b611c1d5760405162461bcd60e51b81526004016109ce9061347d565b6001600160a01b0383166129fe576129f981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a21565b816001600160a01b0316836001600160a01b031614612a2157612a218382612b90565b6001600160a01b038216612a3857610b0481612c2d565b826001600160a01b0316826001600160a01b031614610b0457610b048282612cdc565b612a658383612d20565b612a726000848484612a8e565b610b045760405162461bcd60e51b81526004016109ce9061347d565b60006001600160a01b0384163b1561294757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ad290339089908890889060040161340b565b602060405180830381600087803b158015612aec57600080fd5b505af1925050508015612b1c575060408051601f3d908101601f19168201909252612b1991810190613280565b60015b612b76573d808015612b4a576040519150601f19603f3d011682016040523d82523d6000602084013e612b4f565b606091505b508051612b6e5760405162461bcd60e51b81526004016109ce9061347d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e96565b60006001612b9d8461141e565b612ba7919061366c565b600083815260076020526040902054909150808214612bfa576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c3f9060019061366c565b60008381526009602052604081205460088054939450909284908110612c6757612c6761375b565b906000526020600020015490508060088381548110612c8857612c8861375b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cc057612cc0613745565b6001900381819060005260206000200160009055905550505050565b6000612ce78361141e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612d765760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ce565b612d7f8161219a565b15612dcc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ce565b612dd8600083836129a3565b6001600160a01b0382166000908152600360205260408120805460019290612e01908490613621565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612e6b906136af565b90600052602060002090601f016020900481019282612e8d5760008555612ed3565b82601f10612ea657805160ff1916838001178555612ed3565b82800160010185558215612ed3579182015b82811115612ed3578251825591602001919060010190612eb8565b50612edf929150612ee3565b5090565b5b80821115612edf5760008155600101612ee4565b6000612f0b612f06846135f9565b6135a4565b9050828152838383011115612f1f57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f4757600080fd5b81356020612f57612f06836135d5565b80838252828201915082860187848660051b8901011115612f7757600080fd5b6000805b86811015612fba57823567ffffffffffffffff811115612f99578283fd5b612fa78b88838d0101612fc8565b8652509385019391850191600101612f7b565b509198975050505050505050565b600082601f830112612fd957600080fd5b61253583833560208501612ef8565b600082601f830112612ff957600080fd5b8151613007612f06826135f9565b81815284602083860101111561301c57600080fd5b610e96826020830160208701613683565b60006020828403121561303f57600080fd5b813561253581613787565b6000806040838503121561305d57600080fd5b823561306881613787565b9150602083013561307881613787565b809150509250929050565b60008060006060848603121561309857600080fd5b83356130a381613787565b925060208401356130b381613787565b929592945050506040919091013590565b600080600080608085870312156130da57600080fd5b84356130e581613787565b935060208501356130f581613787565b925060408501359150606085013567ffffffffffffffff81111561311857600080fd5b8501601f8101871361312957600080fd5b61313887823560208401612ef8565b91505092959194509250565b6000806040838503121561315757600080fd5b823561316281613787565b91506020830135801515811461307857600080fd5b6000806040838503121561318a57600080fd5b823561319581613787565b946020939093013593505050565b600080604083850312156131b657600080fd5b823567ffffffffffffffff808211156131ce57600080fd5b818501915085601f8301126131e257600080fd5b813560206131f2612f06836135d5565b8083825282820191508286018a848660051b890101111561321257600080fd5b600096505b84871015613235578035835260019690960195918301918301613217565b509650508601359250508082111561324c57600080fd5b5061325985828601612f36565b9150509250929050565b60006020828403121561327557600080fd5b81356125358161379c565b60006020828403121561329257600080fd5b81516125358161379c565b6000602082840312156132af57600080fd5b815167ffffffffffffffff8111156132c657600080fd5b610e9684828501612fe8565b600080604083850312156132e557600080fd5b825167ffffffffffffffff8111156132fc57600080fd5b61330885828601612fe8565b925050602083015190509250929050565b60006020828403121561332b57600080fd5b5035919050565b60006020828403121561334457600080fd5b5051919050565b6000806040838503121561335e57600080fd5b82359150602083013567ffffffffffffffff81111561337c57600080fd5b61325985828601612fc8565b6000806040838503121561339b57600080fd5b50508035926020909101359150565b600081518084526133c2816020860160208601613683565b601f01601f19169290920160200192915050565b6c4261627920447261676f73202360981b8152600082516133fe81600d850160208701613683565b91909101600d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061343e908301846133aa565b9695505050505050565b60208152600061253560208301846133aa565b60408152600061346e60408301856133aa565b90508260208301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156135cd576135cd613771565b604052919050565b600067ffffffffffffffff8211156135ef576135ef613771565b5060051b60200190565b600067ffffffffffffffff82111561361357613613613771565b50601f01601f191660200190565b6000821982111561363457613634613719565b500190565b6000826136485761364861372f565b500490565b600081600019048311821515161561366757613667613719565b500290565b60008282101561367e5761367e613719565b500390565b60005b8381101561369e578181015183820152602001613686565b83811115611c1d5750506000910152565b600181811c908216806136c357607f821691505b602082108114156136e457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136fe576136fe613719565b5060010190565b6000826137145761371461372f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146120a157600080fd5b6001600160e01b0319811681146120a157600080fdfea264697066735822122055e27e697467837625dab52a77eb39c2eefc705c7c628492e44d9e5f8ac3051f64736f6c63430008060033

Deployed Bytecode

0x60806040526004361061027e5760003560e01c806377830dca1161014e578063c8d2524c116100bb578063e6519a3511610077578063e6519a35146107d6578063e8d887d3146107eb578063e985e9c51461080b578063f2fde38b14610854578063f526454e14610874578063feb6b3d11461088957005b8063c8d2524c1461071f578063d18ceec21461073f578063d2571f881461075f578063d4a6a2fd1461077f578063e489d510146107a0578063e5b95595146107b657005b8063a8a150b81161010a578063a8a150b814610651578063b88d4fde14610671578063bb47c9b314610691578063c39cbef1146106bf578063c4d30bfa146106df578063c87b56dd146106ff57005b806377830dca1461059e57806388bd5002146105be5780638da5cb5b146105de57806395d89b41146105fc578063992faa6e14610611578063a22cb4651461063157005b80632f745c59116101ec5780634f6ccce7116101a85780634f6ccce7146104e95780635fb64a6a146105095780636352211e146105295780636b8ff5741461054957806370a0823114610569578063715018a61461058957005b80632f745c591461043f5780633a6713ec1461045f5780633ccfd60b1461047f578063407f42b71461049457806342842e0e146104b45780634851218e146104d457005b806318160ddd1161023b57806318160ddd1461038a5780631dbe61fe1461039f57806323b872dd146103bf578063281303d4146103df5780632c098d34146103ff5780632d02f8c11461041f57005b806301ffc9a71461028057806306fdde03146102b5578063081812fc146102d7578063095ea7b31461030f5780630cf2cc381461032f57806315d775c91461034f575b005b34801561028c57600080fd5b506102a061029b366004613263565b6108a9565b60405190151581526020015b60405180910390f35b3480156102c157600080fd5b506102ca6108d4565b6040516102ac9190613448565b3480156102e357600080fd5b506102f76102f2366004613319565b610966565b6040516001600160a01b0390911681526020016102ac565b34801561031b57600080fd5b5061027e61032a366004613177565b6109f3565b34801561033b57600080fd5b5061027e61034a36600461302d565b610b09565b34801561035b57600080fd5b5061037c61036a366004613319565b60176020526000908152604090205481565b6040519081526020016102ac565b34801561039657600080fd5b5060085461037c565b3480156103ab57600080fd5b5061027e6103ba366004613388565b610b55565b3480156103cb57600080fd5b5061027e6103da366004613083565b610cf8565b3480156103eb57600080fd5b5061027e6103fa36600461302d565b610d29565b34801561040b57600080fd5b5061037c61041a366004613319565b610d75565b34801561042b57600080fd5b506102ca61043a366004613319565b610deb565b34801561044b57600080fd5b5061037c61045a366004613177565b610e9e565b34801561046b57600080fd5b506102ca61047a366004613319565b610f34565b34801561048b57600080fd5b5061027e610f8f565b3480156104a057600080fd5b506102ca6104af366004613319565b6110f7565b3480156104c057600080fd5b5061027e6104cf366004613083565b611152565b3480156104e057600080fd5b5061037c61116d565b3480156104f557600080fd5b5061037c610504366004613319565b6111c5565b34801561051557600080fd5b5061027e61052436600461302d565b611246565b34801561053557600080fd5b506102f7610544366004613319565b611292565b34801561055557600080fd5b506102ca610564366004613319565b611309565b34801561057557600080fd5b5061037c61058436600461302d565b61141e565b34801561059557600080fd5b5061027e6114a5565b3480156105aa57600080fd5b5061027e6105b93660046131a3565b6114db565b3480156105ca57600080fd5b506102ca6105d9366004613319565b6118b7565b3480156105ea57600080fd5b50600b546001600160a01b03166102f7565b34801561060857600080fd5b506102ca611912565b34801561061d57600080fd5b5061027e61062c366004613319565b611921565b34801561063d57600080fd5b5061027e61064c366004613144565b611acb565b34801561065d57600080fd5b506102ca61066c366004613319565b611b90565b34801561067d57600080fd5b5061027e61068c3660046130c4565b611beb565b34801561069d57600080fd5b506106b16106ac366004613388565b611c23565b6040516102ac92919061345b565b3480156106cb57600080fd5b5061027e6106da36600461334b565b611ce1565b3480156106eb57600080fd5b506102ca6106fa366004613319565b611da0565b34801561070b57600080fd5b506102ca61071a366004613319565b611dfb565b34801561072b57600080fd5b5061037c61073a366004613319565b611e56565b34801561074b57600080fd5b5061027e61075a36600461302d565b611efc565b34801561076b57600080fd5b506102ca61077a366004613319565b611f48565b34801561078b57600080fd5b50600b546102a090600160a01b900460ff1681565b3480156107ac57600080fd5b5061037c60115481565b3480156107c257600080fd5b506102a06107d1366004613319565b611fa3565b3480156107e257600080fd5b5060105461037c565b3480156107f757600080fd5b506102ca610806366004613319565b611fae565b34801561081757600080fd5b506102a061082636600461304a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561086057600080fd5b5061027e61086f36600461302d565b612009565b34801561088057600080fd5b5061027e6120a4565b34801561089557600080fd5b506102ca6108a4366004613319565b6120ef565b60006001600160e01b0319821663780e9d6360e01b14806108ce57506108ce8261214a565b92915050565b6060600080546108e3906136af565b80601f016020809104026020016040519081016040528092919081815260200182805461090f906136af565b801561095c5780601f106109315761010080835404028352916020019161095c565b820191906000526020600020905b81548152906001019060200180831161093f57829003601f168201915b5050505050905090565b60006109718261219a565b6109d75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109fe82611292565b9050806001600160a01b0316836001600160a01b03161415610a6c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109ce565b336001600160a01b0382161480610a885750610a888133610826565b610afa5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109ce565b610b0483836121b7565b505050565b600b546001600160a01b03163314610b335760405162461bcd60e51b81526004016109ce906134cf565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610b7f5760405162461bcd60e51b81526004016109ce906134cf565b6014548210610bc25760405162461bcd60e51b815260206004820152600f60248201526e496e64657820746f6f206c6172676560881b60448201526064016109ce565b601454610bd19060019061366c565b821015610c4e576014610be5836001613621565b81548110610bf557610bf561375b565b90600052602060002001548110610c4e5760405162461bcd60e51b815260206004820152601c60248201527f56616c7565206c6172676572207468616e206e657874206368756e6b0000000060448201526064016109ce565b8115610cd4576014610c6160018461366c565b81548110610c7157610c7161375b565b90600052602060002001548111610cd45760405162461bcd60e51b815260206004820152602160248201527f56616c756520736d616c6c6572207468616e2070726576696f7573206368756e6044820152606b60f81b60648201526084016109ce565b8060148381548110610ce857610ce861375b565b6000918252602090912001555050565b610d023382612225565b610d1e5760405162461bcd60e51b81526004016109ce90613553565b610b0483838361230b565b600b546001600160a01b03163314610d535760405162461bcd60e51b81526004016109ce906134cf565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546000906001600160a01b03163314610dc65760405162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8811195b9a5959607a1b60448201526064016109ce565b60148281548110610dd957610dd961375b565b90600052602060002001549050919050565b6060610df68261219a565b610e125760405162461bcd60e51b81526004016109ce90613504565b600c54604051632d02f8c160e01b8152600481018490526060916001600160a01b0316908190632d02f8c1906024015b60006040518083038186803b158015610e5a57600080fd5b505afa158015610e6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e96919081019061329d565b949350505050565b6000610ea98361141e565b8210610f0b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109ce565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6060610f3f8261219a565b610f5b5760405162461bcd60e51b81526004016109ce90613504565b600c54604051630e99c4fb60e21b8152600481018490526060916001600160a01b0316908190633a6713ec90602401610e42565b600b546001600160a01b03163314610fb95760405162461bcd60e51b81526004016109ce906134cf565b600d546001600160a01b03166110045760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c481b9bdd081cd95d60821b60448201526064016109ce565b600e546001600160a01b031661104f5760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c881b9bdd081cd95d60821b60448201526064016109ce565b6000479050600061107a6064611074601354606461106d919061366c565b85906124b6565b9061253c565b600d546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156110b5573d6000803e3d6000fd5b50600e546001600160a01b03166108fc6110cf8484612597565b6040518115909202916000818181858888f19350505050158015610b04573d6000803e3d6000fd5b60606111028261219a565b61111e5760405162461bcd60e51b81526004016109ce90613504565b600c5460405163407f42b760e01b8152600481018490526060916001600160a01b031690819063407f42b790602401610e42565b610b0483838360405180602001604052806000815250611beb565b600c546000906001600160a01b031633146111be5760405162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8811195b9a5959607a1b60448201526064016109ce565b5060145490565b60006111d060085490565b82106112335760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109ce565b60088281548110610dd957610dd961375b565b600b546001600160a01b031633146112705760405162461bcd60e51b81526004016109ce906134cf565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108ce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109ce565b60606113148261219a565b6113305760405162461bcd60e51b81526004016109ce90613504565b60008281526015602052604081208054611349906136af565b905011156113ef576000828152601560205260409020805461136a906136af565b80601f0160208091040260200160405190810160405280929190818152602001828054611396906136af565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b50505050509050919050565b6113f8826125f3565b60405160200161140891906133d6565b6040516020818303038152906040529050919050565b60006001600160a01b0382166114895760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109ce565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114cf5760405162461bcd60e51b81526004016109ce906134cf565b6114d960006126f1565b565b6002600a54141561152e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ce565b6002600a55601254825111156115865760405162461bcd60e51b815260206004820152601e60248201527f596f752063616e206f6e6c7920636c61696d203520617420612074696d65000060448201526064016109ce565b600b54600160a01b900460ff166115e95760405162461bcd60e51b815260206004820152602160248201527f436c61696d696e6720626162696573206973206e6f74206163746976652079656044820152601d60fa1b60648201526084016109ce565b60006115f460085490565b6115ff906001613621565b90504260005b84518110156118ab57600f54855183916001600160a01b03169063c8d2524c908890859081106116375761163761375b565b60200260200101516040518263ffffffff1660e01b815260040161165d91815260200190565b60206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190613332565b106116fa5760405162461bcd60e51b815260206004820152601a60248201527f4261627920686173206e6f74206265656e20626f726e2079657400000000000060448201526064016109ce565b601760008683815181106117105761171061375b565b60200260200101518152602001908152602001600020546000146117765760405162461bcd60e51b815260206004820152601a60248201527f447261676f732068617320616c726561647920636c61696d656400000000000060448201526064016109ce565b600084828151811061178a5761178a61375b565b6020026020010151511115611846576117bb8482815181106117ae576117ae61375b565b6020026020010151612743565b6117f95760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b60448201526064016109ce565b83818151811061180b5761180b61375b565b60200260200101516015600083866118239190613621565b81526020019081526020016000209080519060200190611844929190612e5f565b505b6118508184613621565b601760008784815181106118665761186661375b565b602002602001015181526020019081526020016000208190555061189961188a3390565b6118948386613621565b612952565b806118a3816136ea565b915050611605565b50506001600a55505050565b60606118c28261219a565b6118de5760405162461bcd60e51b81526004016109ce90613504565b600c5460405163445ea80160e11b8152600481018490526060916001600160a01b03169081906388bd500290602401610e42565b6060600180546108e3906136af565b600b546001600160a01b0316331461194b5760405162461bcd60e51b81526004016109ce906134cf565b601454156119c157601480546119639060019061366c565b815481106119735761197361375b565b906000526020600020015481116119c15760405162461bcd60e51b8152602060048201526012602482015271119a5b985b081259081d1bdbc81cdb585b1b60721b60448201526064016109ce565b600f60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0f57600080fd5b505afa158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a479190613332565b811115611a965760405162461bcd60e51b815260206004820152601960248201527f4c6172676572207468616e20647261676f7320737570706c790000000000000060448201526064016109ce565b601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0155565b6001600160a01b038216331415611b245760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ce565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060611b9b8261219a565b611bb75760405162461bcd60e51b81526004016109ce90613504565b600c546040516315142a1760e31b8152600481018490526060916001600160a01b031690819063a8a150b890602401610e42565b611bf53383612225565b611c115760405162461bcd60e51b81526004016109ce90613553565b611c1d84848484612970565b50505050565b60606000611c308361219a565b611c4c5760405162461bcd60e51b81526004016109ce90613504565b600c5460405163bb47c9b360e01b815260048101869052602481018590526001600160a01b0390911690819063bb47c9b39060440160006040518083038186803b158015611c9957600080fd5b505afa158015611cad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611cd591908101906132d2565b90969095509350505050565b33611ceb83611292565b6001600160a01b031614611d3a5760405162461bcd60e51b8152602060048201526016602482015275596f7520646f6e74206f776e2074686174206261627960501b60448201526064016109ce565b611d4381612743565b611d815760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b60448201526064016109ce565b60008281526015602090815260409091208251610b0492840190612e5f565b6060611dab8261219a565b611dc75760405162461bcd60e51b81526004016109ce90613504565b600c5460405163626985fd60e11b8152600481018490526060916001600160a01b031690819063c4d30bfa90602401610e42565b6060611e068261219a565b611e225760405162461bcd60e51b81526004016109ce90613504565b600c5460405163c87b56dd60e01b8152600481018490526060916001600160a01b031690819063c87b56dd90602401610e42565b6000611e618261219a565b611e7d5760405162461bcd60e51b81526004016109ce90613504565b600c54604051633234949360e21b8152600481018490526000916001600160a01b031690819063c8d2524c9060240160206040518083038186803b158015611ec457600080fd5b505afa158015611ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e969190613332565b600b546001600160a01b03163314611f265760405162461bcd60e51b81526004016109ce906134cf565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6060611f538261219a565b611f6f5760405162461bcd60e51b81526004016109ce90613504565b600c54604051631a4ae3f160e31b8152600481018490526060916001600160a01b031690819063d2571f8890602401610e42565b60006108ce8261219a565b6060611fb98261219a565b611fd55760405162461bcd60e51b81526004016109ce90613504565b600c5460405163e8d887d360e01b8152600481018490526060916001600160a01b031690819063e8d887d390602401610e42565b600b546001600160a01b031633146120335760405162461bcd60e51b81526004016109ce906134cf565b6001600160a01b0381166120985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ce565b6120a1816126f1565b50565b600b546001600160a01b031633146120ce5760405162461bcd60e51b81526004016109ce906134cf565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60606120fa8261219a565b6121165760405162461bcd60e51b81526004016109ce90613504565b600c5460405163feb6b3d160e01b8152600481018490526060916001600160a01b031690819063feb6b3d190602401610e42565b60006001600160e01b031982166380ac58cd60e01b148061217b57506001600160e01b03198216635b5e139f60e01b145b806108ce57506301ffc9a760e01b6001600160e01b03198316146108ce565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906121ec82611292565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122308261219a565b6122915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109ce565b600061229c83611292565b9050806001600160a01b0316846001600160a01b031614806122d75750836001600160a01b03166122cc84610966565b6001600160a01b0316145b80610e9657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610e96565b826001600160a01b031661231e82611292565b6001600160a01b0316146123865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109ce565b6001600160a01b0382166123e85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ce565b6123f38383836129a3565b6123fe6000826121b7565b6001600160a01b038316600090815260036020526040812080546001929061242790849061366c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612455908490613621565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826124c5575060006108ce565b60006124d1838561364d565b9050826124de8583613639565b146125355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109ce565b9392505050565b600080821161258d5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016109ce565b6125358284613639565b6000828211156125e95760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016109ce565b612535828461366c565b6060816126175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612641578061262b816136ea565b915061263a9050600a83613639565b915061261b565b60008167ffffffffffffffff81111561265c5761265c613771565b6040519080825280601f01601f191660200182016040528015612686576020820181803683370190505b5090505b8415610e965761269b60018361366c565b91506126a8600a86613705565b6126b3906030613621565b60f81b8183815181106126c8576126c861375b565b60200101906001600160f81b031916908160001a9053506126ea600a86613639565b945061268a565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008082905060018151101561275c5750600092915050565b60198151111561276f5750600092915050565b806000815181106127825761278261375b565b6020910101516001600160f81b031916600160fd1b14156127a65750600092915050565b80600182516127b5919061366c565b815181106127c5576127c561375b565b6020910101516001600160f81b031916600160fd1b14156127e95750600092915050565b6000816000815181106127fe576127fe61375b565b01602001516001600160f81b031916905060005b825181101561294757600083828151811061282f5761282f61375b565b01602001516001600160f81b0319169050600160fd1b811480156128605750600160fd1b6001600160f81b03198416145b156128715750600095945050505050565b600360fc1b6001600160f81b031982161080159061289d5750603960f81b6001600160f81b0319821611155b1580156128d35750604160f81b6001600160f81b03198216108015906128d15750602d60f91b6001600160f81b0319821611155b155b80156129085750606160f81b6001600160f81b03198216108015906129065750603d60f91b6001600160f81b0319821611155b155b80156129225750600160fd1b6001600160f81b0319821614155b156129335750600095945050505050565b91508061293f816136ea565b915050612812565b506001949350505050565b61296c828260405180602001604052806000815250612a5b565b5050565b61297b84848461230b565b61298784848484612a8e565b611c1d5760405162461bcd60e51b81526004016109ce9061347d565b6001600160a01b0383166129fe576129f981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a21565b816001600160a01b0316836001600160a01b031614612a2157612a218382612b90565b6001600160a01b038216612a3857610b0481612c2d565b826001600160a01b0316826001600160a01b031614610b0457610b048282612cdc565b612a658383612d20565b612a726000848484612a8e565b610b045760405162461bcd60e51b81526004016109ce9061347d565b60006001600160a01b0384163b1561294757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ad290339089908890889060040161340b565b602060405180830381600087803b158015612aec57600080fd5b505af1925050508015612b1c575060408051601f3d908101601f19168201909252612b1991810190613280565b60015b612b76573d808015612b4a576040519150601f19603f3d011682016040523d82523d6000602084013e612b4f565b606091505b508051612b6e5760405162461bcd60e51b81526004016109ce9061347d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e96565b60006001612b9d8461141e565b612ba7919061366c565b600083815260076020526040902054909150808214612bfa576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c3f9060019061366c565b60008381526009602052604081205460088054939450909284908110612c6757612c6761375b565b906000526020600020015490508060088381548110612c8857612c8861375b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cc057612cc0613745565b6001900381819060005260206000200160009055905550505050565b6000612ce78361141e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612d765760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ce565b612d7f8161219a565b15612dcc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ce565b612dd8600083836129a3565b6001600160a01b0382166000908152600360205260408120805460019290612e01908490613621565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612e6b906136af565b90600052602060002090601f016020900481019282612e8d5760008555612ed3565b82601f10612ea657805160ff1916838001178555612ed3565b82800160010185558215612ed3579182015b82811115612ed3578251825591602001919060010190612eb8565b50612edf929150612ee3565b5090565b5b80821115612edf5760008155600101612ee4565b6000612f0b612f06846135f9565b6135a4565b9050828152838383011115612f1f57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f4757600080fd5b81356020612f57612f06836135d5565b80838252828201915082860187848660051b8901011115612f7757600080fd5b6000805b86811015612fba57823567ffffffffffffffff811115612f99578283fd5b612fa78b88838d0101612fc8565b8652509385019391850191600101612f7b565b509198975050505050505050565b600082601f830112612fd957600080fd5b61253583833560208501612ef8565b600082601f830112612ff957600080fd5b8151613007612f06826135f9565b81815284602083860101111561301c57600080fd5b610e96826020830160208701613683565b60006020828403121561303f57600080fd5b813561253581613787565b6000806040838503121561305d57600080fd5b823561306881613787565b9150602083013561307881613787565b809150509250929050565b60008060006060848603121561309857600080fd5b83356130a381613787565b925060208401356130b381613787565b929592945050506040919091013590565b600080600080608085870312156130da57600080fd5b84356130e581613787565b935060208501356130f581613787565b925060408501359150606085013567ffffffffffffffff81111561311857600080fd5b8501601f8101871361312957600080fd5b61313887823560208401612ef8565b91505092959194509250565b6000806040838503121561315757600080fd5b823561316281613787565b91506020830135801515811461307857600080fd5b6000806040838503121561318a57600080fd5b823561319581613787565b946020939093013593505050565b600080604083850312156131b657600080fd5b823567ffffffffffffffff808211156131ce57600080fd5b818501915085601f8301126131e257600080fd5b813560206131f2612f06836135d5565b8083825282820191508286018a848660051b890101111561321257600080fd5b600096505b84871015613235578035835260019690960195918301918301613217565b509650508601359250508082111561324c57600080fd5b5061325985828601612f36565b9150509250929050565b60006020828403121561327557600080fd5b81356125358161379c565b60006020828403121561329257600080fd5b81516125358161379c565b6000602082840312156132af57600080fd5b815167ffffffffffffffff8111156132c657600080fd5b610e9684828501612fe8565b600080604083850312156132e557600080fd5b825167ffffffffffffffff8111156132fc57600080fd5b61330885828601612fe8565b925050602083015190509250929050565b60006020828403121561332b57600080fd5b5035919050565b60006020828403121561334457600080fd5b5051919050565b6000806040838503121561335e57600080fd5b82359150602083013567ffffffffffffffff81111561337c57600080fd5b61325985828601612fc8565b6000806040838503121561339b57600080fd5b50508035926020909101359150565b600081518084526133c2816020860160208601613683565b601f01601f19169290920160200192915050565b6c4261627920447261676f73202360981b8152600082516133fe81600d850160208701613683565b91909101600d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061343e908301846133aa565b9695505050505050565b60208152600061253560208301846133aa565b60408152600061346e60408301856133aa565b90508260208301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156135cd576135cd613771565b604052919050565b600067ffffffffffffffff8211156135ef576135ef613771565b5060051b60200190565b600067ffffffffffffffff82111561361357613613613771565b50601f01601f191660200190565b6000821982111561363457613634613719565b500190565b6000826136485761364861372f565b500490565b600081600019048311821515161561366757613667613719565b500290565b60008282101561367e5761367e613719565b500390565b60005b8381101561369e578181015183820152602001613686565b83811115611c1d5750506000910152565b600181811c908216806136c357607f821691505b602082108114156136e457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136fe576136fe613719565b5060010190565b6000826137145761371461372f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146120a157600080fd5b6001600160e01b0319811681146120a157600080fdfea264697066735822122055e27e697467837625dab52a77eb39c2eefc705c7c628492e44d9e5f8ac3051f64736f6c63430008060033

Deployed Bytecode Sourcemap

50582:11201:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44432:224;;;;;;;;;;-1:-1:-1;44432:224:0;;;;;:::i;:::-;;:::i;:::-;;;9781:14:1;;9774:22;9756:41;;9744:2;9729:18;44432:224:0;;;;;;;;31554:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33113:221::-;;;;;;;;;;-1:-1:-1;33113:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9079:32:1;;;9061:51;;9049:2;9034:18;33113:221:0;9016:102:1;32636:411:0;;;;;;;;;;-1:-1:-1;32636:411:0;;;;;:::i;:::-;;:::i;51345:128::-;;;;;;;;;;-1:-1:-1;51345:128:0;;;;;:::i;:::-;;:::i;51181:58::-;;;;;;;;;;-1:-1:-1;51181:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;24162:25:1;;;24150:2;24135:18;51181:58:0;24117:76:1;45072:113:0;;;;;;;;;;-1:-1:-1;45160:10:0;:17;45072:113;;56804:475;;;;;;;;;;-1:-1:-1;56804:475:0;;;;;:::i;:::-;;:::i;34003:339::-;;;;;;;;;;-1:-1:-1;34003:339:0;;;;;:::i;:::-;;:::i;59829:114::-;;;;;;;;;;-1:-1:-1;59829:114:0;;;;;:::i;:::-;;:::i;56623:173::-;;;;;;;;;;-1:-1:-1;56623:173:0;;;;;:::i;:::-;;:::i;53546:344::-;;;;;;;;;;-1:-1:-1;53546:344:0;;;;;:::i;:::-;;:::i;44740:256::-;;;;;;;;;;-1:-1:-1;44740:256:0;;;;;:::i;:::-;;:::i;52840:340::-;;;;;;;;;;-1:-1:-1;52840:340:0;;;;;:::i;:::-;;:::i;60079:440::-;;;;;;;;;;;;;:::i;53898:346::-;;;;;;;;;;-1:-1:-1;53898:346:0;;;;;:::i;:::-;;:::i;34413:185::-;;;;;;;;;;-1:-1:-1;34413:185:0;;;;;:::i;:::-;;:::i;56443:172::-;;;;;;;;;;;;;:::i;45262:233::-;;;;;;;;;;-1:-1:-1;45262:233:0;;;;;:::i;:::-;;:::i;59951:120::-;;;;;;;;;;-1:-1:-1;59951:120:0;;;;;:::i;:::-;;:::i;31248:239::-;;;;;;;;;;-1:-1:-1;31248:239:0;;;;;:::i;:::-;;:::i;51711:403::-;;;;;;;;;;-1:-1:-1;51711:403:0;;;;;:::i;:::-;;:::i;30978:208::-;;;;;;;;;;-1:-1:-1;30978:208:0;;;;;:::i;:::-;;:::i;8581:94::-;;;;;;;;;;;;;:::i;58691:1008::-;;;;;;;;;;-1:-1:-1;58691:1008:0;;;;;:::i;:::-;;:::i;53188:346::-;;;;;;;;;;-1:-1:-1;53188:346:0;;;;;:::i;:::-;;:::i;7930:87::-;;;;;;;;;;-1:-1:-1;8003:6:0;;-1:-1:-1;;;;;8003:6:0;7930:87;;31723:104;;;;;;;;;;;;;:::i;56027:408::-;;;;;;;;;;-1:-1:-1;56027:408:0;;;;;:::i;:::-;;:::i;33406:295::-;;;;;;;;;;-1:-1:-1;33406:295:0;;;;;:::i;:::-;;:::i;52484:344::-;;;;;;;;;;-1:-1:-1;52484:344:0;;;;;:::i;:::-;;:::i;34669:328::-;;;;;;;;;;-1:-1:-1;34669:328:0;;;;;:::i;:::-;;:::i;55630:389::-;;;;;;;;;;-1:-1:-1;55630:389:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;57652:263::-;;;;;;;;;;-1:-1:-1;57652:263:0;;;;;:::i;:::-;;:::i;54608:338::-;;;;;;;;;;-1:-1:-1;54608:338:0;;;;;:::i;:::-;;:::i;57287:357::-;;;;;;;;;;-1:-1:-1;57287:357:0;;;;;:::i;:::-;;:::i;55294:328::-;;;;;;;;;;-1:-1:-1;55294:328:0;;;;;:::i;:::-;;:::i;59707:114::-;;;;;;;;;;-1:-1:-1;59707:114:0;;;;;:::i;:::-;;:::i;54958:328::-;;;;;;;;;;-1:-1:-1;54958:328:0;;;;;:::i;:::-;;:::i;50722:23::-;;;;;;;;;;-1:-1:-1;50722:23:0;;;;-1:-1:-1;;;50722:23:0;;;;;;50904:38;;;;;;;;;;;;;;;;51481:112;;;;;;;;;;-1:-1:-1;51481:112:0;;;;;:::i;:::-;;:::i;51601:102::-;;;;;;;;;;-1:-1:-1;51683:12:0;;51601:102;;52122:350;;;;;;;;;;-1:-1:-1;52122:350:0;;;;;:::i;:::-;;:::i;33772:164::-;;;;;;;;;;-1:-1:-1;33772:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33893:25:0;;;33869:4;33893:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33772:164;8830:192;;;;;;;;;;-1:-1:-1;8830:192:0;;;;;:::i;:::-;;:::i;51248:89::-;;;;;;;;;;;;;:::i;54256:340::-;;;;;;;;;;-1:-1:-1;54256:340:0;;;;;:::i;:::-;;:::i;44432:224::-;44534:4;-1:-1:-1;;;;;;44558:50:0;;-1:-1:-1;;;44558:50:0;;:90;;;44612:36;44636:11;44612:23;:36::i;:::-;44551:97;44432:224;-1:-1:-1;;44432:224:0:o;31554:100::-;31608:13;31641:5;31634:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31554:100;:::o;33113:221::-;33189:7;33217:16;33225:7;33217;:16::i;:::-;33209:73;;;;-1:-1:-1;;;33209:73:0;;19635:2:1;33209:73:0;;;19617:21:1;19674:2;19654:18;;;19647:30;19713:34;19693:18;;;19686:62;-1:-1:-1;;;19764:18:1;;;19757:42;19816:19;;33209:73:0;;;;;;;;;-1:-1:-1;33302:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33302:24:0;;33113:221::o;32636:411::-;32717:13;32733:23;32748:7;32733:14;:23::i;:::-;32717:39;;32781:5;-1:-1:-1;;;;;32775:11:0;:2;-1:-1:-1;;;;;32775:11:0;;;32767:57;;;;-1:-1:-1;;;32767:57:0;;21579:2:1;32767:57:0;;;21561:21:1;21618:2;21598:18;;;21591:30;21657:34;21637:18;;;21630:62;-1:-1:-1;;;21708:18:1;;;21701:31;21749:19;;32767:57:0;21551:223:1;32767:57:0;6884:10;-1:-1:-1;;;;;32859:21:0;;;;:62;;-1:-1:-1;32884:37:0;32901:5;6884:10;33772:164;:::i;32884:37::-;32837:168;;;;-1:-1:-1;;;32837:168:0;;16519:2:1;32837:168:0;;;16501:21:1;16558:2;16538:18;;;16531:30;16597:34;16577:18;;;16570:62;16668:26;16648:18;;;16641:54;16712:19;;32837:168:0;16491:246:1;32837:168:0;33018:21;33027:2;33031:7;33018:8;:21::i;:::-;32706:341;32636:411;;:::o;51345:128::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;51428:14:::1;:37:::0;;-1:-1:-1;;;;;;51428:37:0::1;-1:-1:-1::0;;;;;51428:37:0;;;::::1;::::0;;;::::1;::::0;;51345:128::o;56804:475::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;56906:10:::1;:17:::0;56898:25;::::1;56890:53;;;::::0;-1:-1:-1;;;56890:53:0;;10884:2:1;56890:53:0::1;::::0;::::1;10866:21:1::0;10923:2;10903:18;;;10896:30;-1:-1:-1;;;10942:18:1;;;10935:45;10997:18;;56890:53:0::1;10856:165:1::0;56890:53:0::1;56966:10;:17:::0;:21:::1;::::0;56986:1:::1;::::0;56966:21:::1;:::i;:::-;56957:5;:31;56954:143;;;57031:10;57042:9;:5:::0;57050:1:::1;57042:9;:::i;:::-;57031:21;;;;;;;;:::i;:::-;;;;;;;;;57022:6;:30;57014:71;;;::::0;-1:-1:-1;;;57014:71:0;;13580:2:1;57014:71:0::1;::::0;::::1;13562:21:1::0;13619:2;13599:18;;;13592:30;13658;13638:18;;;13631:58;13706:18;;57014:71:0::1;13552:178:1::0;57014:71:0::1;57110:9:::0;;57107:126:::1;;57162:10;57173:9;57181:1;57173:5:::0;:9:::1;:::i;:::-;57162:21;;;;;;;;:::i;:::-;;;;;;;;;57153:6;:30;57145:76;;;::::0;-1:-1:-1;;;57145:76:0;;12414:2:1;57145:76:0::1;::::0;::::1;12396:21:1::0;12453:2;12433:18;;;12426:30;12492:34;12472:18;;;12465:62;-1:-1:-1;;;12543:18:1;;;12536:31;12584:19;;57145:76:0::1;12386:223:1::0;57145:76:0::1;57265:6;57245:10;57256:5;57245:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:26:::0;-1:-1:-1;;56804:475:0:o;34003:339::-;34198:41;6884:10;34231:7;34198:18;:41::i;:::-;34190:103;;;;-1:-1:-1;;;34190:103:0;;;;;;;:::i;:::-;34306:28;34316:4;34322:2;34326:7;34306:9;:28::i;59829:114::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;59905:13:::1;:30:::0;;-1:-1:-1;;;;;;59905:30:0::1;-1:-1:-1::0;;;;;59905:30:0;;;::::1;::::0;;;::::1;::::0;;59829:114::o;56623:173::-;56723:8;;56682:7;;-1:-1:-1;;;;;56723:8:0;56709:10;:22;56701:52;;;;-1:-1:-1;;;56701:52:0;;17765:2:1;56701:52:0;;;17747:21:1;17804:2;17784:18;;;17777:30;-1:-1:-1;;;17823:18:1;;;17816:47;17880:18;;56701:52:0;17737:167:1;56701:52:0;56771:10;56782:5;56771:17;;;;;;;;:::i;:::-;;;;;;;;;56764:24;;56623:173;;;:::o;53546:344::-;53604:13;53638:16;53646:7;53638;:16::i;:::-;53630:76;;;;-1:-1:-1;;;53630:76:0;;;;;;;:::i;:::-;53795:8;;53824:32;;-1:-1:-1;;;53824:32:0;;;;;24162:25:1;;;53717:20:0;;-1:-1:-1;;;;;53795:8:0;;;;53824:23;;24135:18:1;;53824:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53824:32:0;;;;;;;;;;;;:::i;:::-;53815:41;53546:344;-1:-1:-1;;;;53546:344:0:o;44740:256::-;44837:7;44873:23;44890:5;44873:16;:23::i;:::-;44865:5;:31;44857:87;;;;-1:-1:-1;;;44857:87:0;;11583:2:1;44857:87:0;;;11565:21:1;11622:2;11602:18;;;11595:30;11661:34;11641:18;;;11634:62;-1:-1:-1;;;11712:18:1;;;11705:41;11763:19;;44857:87:0;11555:233:1;44857:87:0;-1:-1:-1;;;;;;44962:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44740:256::o;52840:340::-;52896:13;52930:16;52938:7;52930;:16::i;:::-;52922:76;;;;-1:-1:-1;;;52922:76:0;;;;;;;:::i;:::-;53087:8;;53116:30;;-1:-1:-1;;;53116:30:0;;;;;24162:25:1;;;53009:20:0;;-1:-1:-1;;;;;53087:8:0;;;;53116:21;;24135:18:1;;53116:30:0;24117:76:1;60079:440:0;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;60137:13:::1;::::0;-1:-1:-1;;;;;60137:13:0::1;60129:56;;;::::0;-1:-1:-1;;;60129:56:0;;22753:2:1;60129:56:0::1;::::0;::::1;22735:21:1::0;22792:2;22772:18;;;22765:30;-1:-1:-1;;;22811:18:1;;;22804:46;22867:18;;60129:56:0::1;22725:166:1::0;60129:56:0::1;60204:13;::::0;-1:-1:-1;;;;;60204:13:0::1;60196:56;;;::::0;-1:-1:-1;;;60196:56:0;;14696:2:1;60196:56:0::1;::::0;::::1;14678:21:1::0;14735:2;14715:18;;;14708:30;-1:-1:-1;;;14754:18:1;;;14747:46;14810:18;;60196:56:0::1;14668:166:1::0;60196:56:0::1;60263:15;60281:21;60263:39;;60313:21;60337:47;60380:3;60337:38;60355:19;;60349:3;:25;;;;:::i;:::-;60337:7:::0;;:11:::1;:38::i;:::-;:42:::0;::::1;:47::i;:::-;60403:13;::::0;60395:46:::1;::::0;60313:71;;-1:-1:-1;;;;;;60403:13:0::1;::::0;60395:46;::::1;;;::::0;60313:71;;60403:13:::1;60395:46:::0;60403:13;60395:46;60313:71;60403:13;60395:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;60460:13:0::1;::::0;-1:-1:-1;;;;;60460:13:0::1;60452:59;60484:26;:7:::0;60496:13;60484:11:::1;:26::i;:::-;60452:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;53898:346:::0;53957:13;53991:16;53999:7;53991;:16::i;:::-;53983:76;;;;-1:-1:-1;;;53983:76:0;;;;;;;:::i;:::-;54148:8;;54177:33;;-1:-1:-1;;;54177:33:0;;;;;24162:25:1;;;54070:20:0;;-1:-1:-1;;;;;54148:8:0;;;;54177:24;;24135:18:1;;54177:33:0;24117:76:1;34413:185:0;34551:39;34568:4;34574:2;34578:7;34551:39;;;;;;;;;;;;:16;:39::i;56443:172::-;56542:8;;56495:7;;-1:-1:-1;;;;;56542:8:0;56528:10;:22;56520:52;;;;-1:-1:-1;;;56520:52:0;;17765:2:1;56520:52:0;;;17747:21:1;17804:2;17784:18;;;17777:30;-1:-1:-1;;;17823:18:1;;;17816:47;17880:18;;56520:52:0;17737:167:1;56520:52:0;-1:-1:-1;56590:10:0;:17;;56443:172::o;45262:233::-;45337:7;45373:30;45160:10;:17;;45072:113;45373:30;45365:5;:38;45357:95;;;;-1:-1:-1;;;45357:95:0;;23098:2:1;45357:95:0;;;23080:21:1;23137:2;23117:18;;;23110:30;23176:34;23156:18;;;23149:62;-1:-1:-1;;;23227:18:1;;;23220:42;23279:19;;45357:95:0;23070:234:1;45357:95:0;45470:10;45481:5;45470:17;;;;;;;;:::i;59951:120::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;60037:8:::1;:26:::0;;-1:-1:-1;;;;;;60037:26:0::1;-1:-1:-1::0;;;;;60037:26:0;;;::::1;::::0;;;::::1;::::0;;59951:120::o;31248:239::-;31320:7;31356:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31356:16:0;31391:19;31383:73;;;;-1:-1:-1;;;31383:73:0;;17355:2:1;31383:73:0;;;17337:21:1;17394:2;17374:18;;;17367:30;17433:34;17413:18;;;17406:62;-1:-1:-1;;;17484:18:1;;;17477:39;17533:19;;31383:73:0;17327:231:1;51711:403:0;51766:13;51800:16;51808:7;51800;:16::i;:::-;51792:76;;;;-1:-1:-1;;;51792:76:0;;;;;;;:::i;:::-;51935:1;51891:33;;;:24;:33;;;;;51885:47;;;;;:::i;:::-;;;:51;51881:224;;;51960:33;;;;:24;:33;;;;;51953:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51711:403;;;:::o;51881:224::-;52074:17;52083:7;52074:8;:17::i;:::-;52040:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;52026:67;;51711:403;;;:::o;30978:208::-;31050:7;-1:-1:-1;;;;;31078:19:0;;31070:74;;;;-1:-1:-1;;;31070:74:0;;16944:2:1;31070:74:0;;;16926:21:1;16983:2;16963:18;;;16956:30;17022:34;17002:18;;;16995:62;-1:-1:-1;;;17073:18:1;;;17066:40;17123:19;;31070:74:0;16916:232:1;31070:74:0;-1:-1:-1;;;;;;31162:16:0;;;;;:9;:16;;;;;;;30978:208::o;8581:94::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;8646:21:::1;8664:1;8646:9;:21::i;:::-;8581:94::o:0;58691:1008::-;10863:1;11459:7;;:19;;11451:63;;;;-1:-1:-1;;;11451:63:0;;23858:2:1;11451:63:0;;;23840:21:1;23897:2;23877:18;;;23870:30;23936:33;23916:18;;;23909:61;23987:18;;11451:63:0;23830:181:1;11451:63:0;10863:1;11592:7;:18;58815:15:::1;::::0;58795:16;;:35:::1;;58787:78;;;::::0;-1:-1:-1;;;58787:78:0;;18513:2:1;58787:78:0::1;::::0;::::1;18495:21:1::0;18552:2;18532:18;;;18525:30;18591:32;18571:18;;;18564:60;18641:18;;58787:78:0::1;18485:180:1::0;58787:78:0::1;58884:11;::::0;-1:-1:-1;;;58884:11:0;::::1;;;58876:57;;;::::0;-1:-1:-1;;;58876:57:0;;18111:2:1;58876:57:0::1;::::0;::::1;18093:21:1::0;18150:2;18130:18;;;18123:30;18189:34;18169:18;;;18162:62;-1:-1:-1;;;18240:18:1;;;18233:31;18281:19;;58876:57:0::1;18083:223:1::0;58876:57:0::1;58954:15;58972:13;45160:10:::0;:17;;45072:113;58972:13:::1;:17;::::0;58988:1:::1;58972:17;:::i;:::-;58954:35:::0;-1:-1:-1;59081:15:0::1;59066:12;59109:583;59132:9;:16;59128:1;:20;59109:583;;;59187:14;::::0;59214:12;;59230:4;;-1:-1:-1;;;;;59187:14:0::1;::::0;:26:::1;::::0;59214:9;;59224:1;;59214:12;::::1;;;;;:::i;:::-;;;;;;;59187:40;;;;;;;;;;;;;24162:25:1::0;;24150:2;24135:18;;24117:76;59187:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;59179:86;;;::::0;-1:-1:-1;;;59179:86:0;;10529:2:1;59179:86:0::1;::::0;::::1;10511:21:1::0;10568:2;10548:18;;;10541:30;10607:28;10587:18;;;10580:56;10653:18;;59179:86:0::1;10501:176:1::0;59179:86:0::1;59288:23;:37;59312:9;59322:1;59312:12;;;;;;;;:::i;:::-;;;;;;;59288:37;;;;;;;;;;;;59329:1;59288:42;59280:81;;;::::0;-1:-1:-1;;;59280:81:0;;11228:2:1;59280:81:0::1;::::0;::::1;11210:21:1::0;11267:2;11247:18;;;11240:30;11306:28;11286:18;;;11279:56;11352:18;;59280:81:0::1;11200:176:1::0;59280:81:0::1;59407:1;59388:5;59394:1;59388:8;;;;;;;;:::i;:::-;;;;;;;59382:22;:26;59378:184;;;59437:22;59450:5;59456:1;59450:8;;;;;;;;:::i;:::-;;;;;;;59437:12;:22::i;:::-;59429:50;;;::::0;-1:-1:-1;;;59429:50:0;;20048:2:1;59429:50:0::1;::::0;::::1;20030:21:1::0;20087:2;20067:18;;;20060:30;-1:-1:-1;;;20106:18:1;;;20099:45;20161:18;;59429:50:0::1;20020:165:1::0;59429:50:0::1;59538:5;59544:1;59538:8;;;;;;;;:::i;:::-;;;;;;;59498:24;:37;59533:1;59523:7;:11;;;;:::i;:::-;59498:37;;;;;;;;;;;:48;;;;;;;;;;;;:::i;:::-;;59378:184;59618:11;59628:1:::0;59618:7;:11:::1;:::i;:::-;59578:23;:37;59602:9;59612:1;59602:12;;;;;;;;:::i;:::-;;;;;;;59578:37;;;;;;;;;;;:51;;;;59644:36;59654:12;6884:10:::0;;6804:98;59654:12:::1;59668:11;59678:1:::0;59668:7;:11:::1;:::i;:::-;59644:9;:36::i;:::-;59150:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59109:583;;;-1:-1:-1::0;;10819:1:0;11771:7;:22;-1:-1:-1;;;58691:1008:0:o;53188:346::-;53247:13;53281:16;53289:7;53281;:16::i;:::-;53273:76;;;;-1:-1:-1;;;53273:76:0;;;;;;;:::i;:::-;53438:8;;53467:33;;-1:-1:-1;;;53467:33:0;;;;;24162:25:1;;;53360:20:0;;-1:-1:-1;;;;;53438:8:0;;;;53467:24;;24135:18:1;;53467:33:0;24117:76:1;31723:104:0;31779:13;31812:7;31805:14;;;;;:::i;56027:408::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;56122:10:::1;:17:::0;:21;56119:152:::1;;56204:10;56215:17:::0;;:20:::1;::::0;56234:1:::1;::::0;56215:20:::1;:::i;:::-;56204:32;;;;;;;;:::i;:::-;;;;;;;;;56177:24;:59;56169:90;;;::::0;-1:-1:-1;;;56169:90:0;;23511:2:1;56169:90:0::1;::::0;::::1;23493:21:1::0;23550:2;23530:18;;;23523:30;-1:-1:-1;;;23569:18:1;;;23562:48;23627:18;;56169:90:0::1;23483:168:1::0;56169:90:0::1;56317:14;;;;;;;;;-1:-1:-1::0;;;;;56317:14:0::1;-1:-1:-1::0;;;;;56317:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56289:24;:56;;56281:94;;;::::0;-1:-1:-1;;;56281:94:0;;21981:2:1;56281:94:0::1;::::0;::::1;21963:21:1::0;22020:2;22000:18;;;21993:30;22059:27;22039:18;;;22032:55;22104:18;;56281:94:0::1;21953:175:1::0;56281:94:0::1;56386:10;:41:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;56386:41:0;;;;;::::1;::::0;56027:408::o;33406:295::-;-1:-1:-1;;;;;33509:24:0;;6884:10;33509:24;;33501:62;;;;-1:-1:-1;;;33501:62:0;;14342:2:1;33501:62:0;;;14324:21:1;14381:2;14361:18;;;14354:30;14420:27;14400:18;;;14393:55;14465:18;;33501:62:0;14314:175:1;33501:62:0;6884:10;33576:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33576:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33576:53:0;;;;;;;;;;33645:48;;9756:41:1;;;33576:42:0;;6884:10;33645:48;;9729:18:1;33645:48:0;;;;;;;33406:295;;:::o;52484:344::-;52542:13;52576:16;52584:7;52576;:16::i;:::-;52568:76;;;;-1:-1:-1;;;52568:76:0;;;;;;;:::i;:::-;52733:8;;52762:32;;-1:-1:-1;;;52762:32:0;;;;;24162:25:1;;;52655:20:0;;-1:-1:-1;;;;;52733:8:0;;;;52762:23;;24135:18:1;;52762:32:0;24117:76:1;34669:328:0;34844:41;6884:10;34877:7;34844:18;:41::i;:::-;34836:103;;;;-1:-1:-1;;;34836:103:0;;;;;;;:::i;:::-;34950:39;34964:4;34970:2;34974:7;34983:5;34950:13;:39::i;:::-;34669:328;;;;:::o;55630:389::-;55705:22;55729:17;55767:16;55775:7;55767;:16::i;:::-;55759:76;;;;-1:-1:-1;;;55759:76:0;;;;;;;:::i;:::-;55885:8;;55929:41;;-1:-1:-1;;;55929:41:0;;;;;24372:25:1;;;24413:18;;;24406:34;;;-1:-1:-1;;;;;55885:8:0;;;;;;55929:21;;24345:18:1;;55929:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55929:41:0;;;;;;;;;;;;:::i;:::-;55905:65;;;;-1:-1:-1;55630:389:0;-1:-1:-1;;;;55630:389:0:o;57652:263::-;6884:10;57738:16;57746:7;57738;:16::i;:::-;-1:-1:-1;;;;;57738:32:0;;57730:67;;;;-1:-1:-1;;;57730:67:0;;15400:2:1;57730:67:0;;;15382:21:1;15439:2;15419:18;;;15412:30;-1:-1:-1;;;15458:18:1;;;15451:52;15520:18;;57730:67:0;15372:172:1;57730:67:0;57816:19;57829:5;57816:12;:19::i;:::-;57808:47;;;;-1:-1:-1;;;57808:47:0;;20048:2:1;57808:47:0;;;20030:21:1;20087:2;20067:18;;;20060:30;-1:-1:-1;;;20106:18:1;;;20099:45;20161:18;;57808:47:0;20020:165:1;57808:47:0;57866:33;;;;:24;:33;;;;;;;;:41;;;;;;;;:::i;54608:338::-;54663:13;54697:16;54705:7;54697;:16::i;:::-;54689:76;;;;-1:-1:-1;;;54689:76:0;;;;;;;:::i;:::-;54854:8;;54883:29;;-1:-1:-1;;;54883:29:0;;;;;24162:25:1;;;54776:20:0;;-1:-1:-1;;;;;54854:8:0;;;;54883:20;;24135:18:1;;54883:29:0;24117:76:1;57287:357:0;57352:13;57386:16;57394:7;57386;:16::i;:::-;57378:76;;;;-1:-1:-1;;;57378:76:0;;;;;;;:::i;:::-;57543:8;;57576:30;;-1:-1:-1;;;57576:30:0;;;;;24162:25:1;;;57469:20:0;;-1:-1:-1;;;;;57543:8:0;;;;57576:21;;24135:18:1;;57576:30:0;24117:76:1;55294:328:0;55353:7;55381:16;55389:7;55381;:16::i;:::-;55373:76;;;;-1:-1:-1;;;55373:76:0;;;;;;;:::i;:::-;55526:8;;55555:33;;-1:-1:-1;;;55555:33:0;;;;;24162:25:1;;;55462:14:0;;-1:-1:-1;;;;;55526:8:0;;;;55555:24;;24135:18:1;;55555:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59707:114::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;59783:13:::1;:30:::0;;-1:-1:-1;;;;;;59783:30:0::1;-1:-1:-1::0;;;;;59783:30:0;;;::::1;::::0;;;::::1;::::0;;59707:114::o;54958:328::-;55012:13;55046:16;55054:7;55046;:16::i;:::-;55038:76;;;;-1:-1:-1;;;55038:76:0;;;;;;;:::i;:::-;55195:8;;55224:28;;-1:-1:-1;;;55224:28:0;;;;;24162:25:1;;;55125:20:0;;-1:-1:-1;;;;;55195:8:0;;;;55224:19;;24135:18:1;;55224:28:0;24117:76:1;51481:112:0;51540:4;51569:16;51577:7;51569;:16::i;52122:350::-;52183:13;52217:16;52225:7;52217;:16::i;:::-;52209:76;;;;-1:-1:-1;;;52209:76:0;;;;;;;:::i;:::-;52374:8;;52403:35;;-1:-1:-1;;;52403:35:0;;;;;24162:25:1;;;52296:20:0;;-1:-1:-1;;;;;52374:8:0;;;;52403:26;;24135:18:1;;52403:35:0;24117:76:1;8830:192:0;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8919:22:0;::::1;8911:73;;;::::0;-1:-1:-1;;;8911:73:0;;12816:2:1;8911:73:0::1;::::0;::::1;12798:21:1::0;12855:2;12835:18;;;12828:30;12894:34;12874:18;;;12867:62;-1:-1:-1;;;12945:18:1;;;12938:36;12991:19;;8911:73:0::1;12788:228:1::0;8911:73:0::1;8995:19;9005:8;8995:9;:19::i;:::-;8830:192:::0;:::o;51248:89::-;8003:6;;-1:-1:-1;;;;;8003:6:0;6884:10;8150:23;8142:68;;;;-1:-1:-1;;;8142:68:0;;;;;;;:::i;:::-;51318:11:::1;::::0;;-1:-1:-1;;;;51303:26:0;::::1;-1:-1:-1::0;;;51318:11:0;;;::::1;;;51317:12;51303:26:::0;;::::1;;::::0;;51248:89::o;54256:340::-;54312:13;54346:16;54354:7;54346;:16::i;:::-;54338:76;;;;-1:-1:-1;;;54338:76:0;;;;;;;:::i;:::-;54503:8;;54532:30;;-1:-1:-1;;;54532:30:0;;;;;24162:25:1;;;54425:20:0;;-1:-1:-1;;;;;54503:8:0;;;;54532:21;;24135:18:1;;54532:30:0;24117:76:1;30609:305:0;30711:4;-1:-1:-1;;;;;;30748:40:0;;-1:-1:-1;;;30748:40:0;;:105;;-1:-1:-1;;;;;;;30805:48:0;;-1:-1:-1;;;30805:48:0;30748:105;:158;;;-1:-1:-1;;;;;;;;;;29325:40:0;;;30870:36;29216:157;36507:127;36572:4;36596:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36596:16:0;:30;;;36507:127::o;40489:174::-;40564:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40564:29:0;-1:-1:-1;;;;;40564:29:0;;;;;;;;:24;;40618:23;40564:24;40618:14;:23::i;:::-;-1:-1:-1;;;;;40609:46:0;;;;;;;;;;;40489:174;;:::o;36801:348::-;36894:4;36919:16;36927:7;36919;:16::i;:::-;36911:73;;;;-1:-1:-1;;;36911:73:0;;15751:2:1;36911:73:0;;;15733:21:1;15790:2;15770:18;;;15763:30;15829:34;15809:18;;;15802:62;-1:-1:-1;;;15880:18:1;;;15873:42;15932:19;;36911:73:0;15723:234:1;36911:73:0;36995:13;37011:23;37026:7;37011:14;:23::i;:::-;36995:39;;37064:5;-1:-1:-1;;;;;37053:16:0;:7;-1:-1:-1;;;;;37053:16:0;;:51;;;;37097:7;-1:-1:-1;;;;;37073:31:0;:20;37085:7;37073:11;:20::i;:::-;-1:-1:-1;;;;;37073:31:0;;37053:51;:87;;;-1:-1:-1;;;;;;33893:25:0;;;33869:4;33893:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37108:32;33772:164;39793:578;39952:4;-1:-1:-1;;;;;39925:31:0;:23;39940:7;39925:14;:23::i;:::-;-1:-1:-1;;;;;39925:31:0;;39917:85;;;;-1:-1:-1;;;39917:85:0;;20753:2:1;39917:85:0;;;20735:21:1;20792:2;20772:18;;;20765:30;20831:34;20811:18;;;20804:62;-1:-1:-1;;;20882:18:1;;;20875:39;20931:19;;39917:85:0;20725:231:1;39917:85:0;-1:-1:-1;;;;;40021:16:0;;40013:65;;;;-1:-1:-1;;;40013:65:0;;13937:2:1;40013:65:0;;;13919:21:1;13976:2;13956:18;;;13949:30;14015:34;13995:18;;;13988:62;-1:-1:-1;;;14066:18:1;;;14059:34;14110:19;;40013:65:0;13909:226:1;40013:65:0;40091:39;40112:4;40118:2;40122:7;40091:20;:39::i;:::-;40195:29;40212:1;40216:7;40195:8;:29::i;:::-;-1:-1:-1;;;;;40237:15:0;;;;;;:9;:15;;;;;:20;;40256:1;;40237:15;:20;;40256:1;;40237:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40268:13:0;;;;;;:9;:13;;;;;:18;;40285:1;;40268:13;:18;;40285:1;;40268:18;:::i;:::-;;;;-1:-1:-1;;40297:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40297:21:0;-1:-1:-1;;;;;40297:21:0;;;;;;;;;40336:27;;40297:16;;40336:27;;;;;;;39793:578;;;:::o;24730:220::-;24788:7;24812:6;24808:20;;-1:-1:-1;24827:1:0;24820:8;;24808:20;24839:9;24851:5;24855:1;24851;:5;:::i;:::-;24839:17;-1:-1:-1;24884:1:0;24875:5;24879:1;24839:17;24875:5;:::i;:::-;:10;24867:56;;;;-1:-1:-1;;;24867:56:0;;19233:2:1;24867:56:0;;;19215:21:1;19272:2;19252:18;;;19245:30;19311:34;19291:18;;;19284:62;-1:-1:-1;;;19362:18:1;;;19355:31;19403:19;;24867:56:0;19205:223:1;24867:56:0;24941:1;24730:220;-1:-1:-1;;;24730:220:0:o;25428:153::-;25486:7;25518:1;25514;:5;25506:44;;;;-1:-1:-1;;;25506:44:0;;16164:2:1;25506:44:0;;;16146:21:1;16203:2;16183:18;;;16176:30;16242:28;16222:18;;;16215:56;16288:18;;25506:44:0;16136:176:1;25506:44:0;25568:5;25572:1;25568;:5;:::i;24313:158::-;24371:7;24404:1;24399;:6;;24391:49;;;;-1:-1:-1;;;24391:49:0;;15041:2:1;24391:49:0;;;15023:21:1;15080:2;15060:18;;;15053:30;15119:32;15099:18;;;15092:60;15169:18;;24391:49:0;15013:180:1;24391:49:0;24458:5;24462:1;24458;:5;:::i;61065:715::-;61121:13;61334:10;61330:53;;-1:-1:-1;;61361:10:0;;;;;;;;;;;;-1:-1:-1;;;61361:10:0;;;;;61065:715::o;61330:53::-;61408:5;61393:12;61449:78;61456:9;;61449:78;;61482:8;;;;:::i;:::-;;-1:-1:-1;61505:10:0;;-1:-1:-1;61513:2:0;61505:10;;:::i;:::-;;;61449:78;;;61537:19;61569:6;61559:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61559:17:0;;61537:39;;61587:154;61594:10;;61587:154;;61621:11;61631:1;61621:11;;:::i;:::-;;-1:-1:-1;61690:10:0;61698:2;61690:5;:10;:::i;:::-;61677:24;;:2;:24;:::i;:::-;61664:39;;61647:6;61654;61647:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;61647:56:0;;;;;;;;-1:-1:-1;61718:11:0;61727:2;61718:11;;:::i;:::-;;;61587:154;;9030:173;9105:6;;;-1:-1:-1;;;;;9122:17:0;;;-1:-1:-1;;;;;;9122:17:0;;;;;;;9155:40;;9105:6;;;9122:17;9105:6;;9155:40;;9086:16;;9155:40;9075:128;9030:173;:::o;57923:758::-;57987:4;57997:14;58020:3;57997:27;;58043:1;58032;:8;:12;58029:29;;;-1:-1:-1;58053:5:0;;57923:758;-1:-1:-1;;57923:758:0:o;58029:29::-;58077:2;58066:1;:8;:13;58063:30;;;-1:-1:-1;58088:5:0;;57923:758;-1:-1:-1;;57923:758:0:o;58063:30::-;58140:1;58142;58140:4;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;58140:4:0;-1:-1:-1;;;58140:12:0;58137:29;;;-1:-1:-1;58161:5:0;;57923:758;-1:-1:-1;;57923:758:0:o;58137:29::-;58192:1;58205;58194;:8;:12;;;;:::i;:::-;58192:15;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;58192:15:0;-1:-1:-1;;;58192:23:0;58188:41;;;-1:-1:-1;58224:5:0;;57923:758;-1:-1:-1;;57923:758:0:o;58188:41::-;58254:15;58272:1;58274;58272:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;58272:4:0;;-1:-1:-1;58287:6:0;58283:376;58297:1;:8;58295:1;:10;58283:376;;;58317:11;58331:1;58333;58331:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;58331:4:0;;-1:-1:-1;;;;58347:12:0;;:32;;;;-1:-1:-1;;;;;;;;;;58363:16:0;;;58347:32;58343:50;;;-1:-1:-1;58388:5:0;;57923:758;-1:-1:-1;;;;;57923:758:0:o;58343:50::-;-1:-1:-1;;;;;;;;;58447:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58463:12:0;;;;58447:28;58445:31;:77;;;;-1:-1:-1;;;;;;;;;;58493:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58509:12:0;;;;58493:28;58491:31;58445:77;:123;;;;-1:-1:-1;;;;;;;;;;58539:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58555:12:0;;;;58539:28;58537:31;58445:123;:153;;;;-1:-1:-1;;;;;;;;;;58585:12:0;;;58583:15;58445:153;58436:194;;;-1:-1:-1;58625:5:0;;57923:758;-1:-1:-1;;;;;57923:758:0:o;58436:194::-;58649:4;-1:-1:-1;58307:3:0;;;;:::i;:::-;;;;58283:376;;;-1:-1:-1;58672:4:0;;57923:758;-1:-1:-1;;;;57923:758:0:o;37491:110::-;37567:26;37577:2;37581:7;37567:26;;;;;;;;;;;;:9;:26::i;:::-;37491:110;;:::o;35879:315::-;36036:28;36046:4;36052:2;36056:7;36036:9;:28::i;:::-;36083:48;36106:4;36112:2;36116:7;36125:5;36083:22;:48::i;:::-;36075:111;;;;-1:-1:-1;;;36075:111:0;;;;;;;:::i;46108:589::-;-1:-1:-1;;;;;46314:18:0;;46310:187;;46349:40;46381:7;47524:10;:17;;47497:24;;;;:15;:24;;;;;:44;;;47552:24;;;;;;;;;;;;47420:164;46349:40;46310:187;;;46419:2;-1:-1:-1;;;;;46411:10:0;:4;-1:-1:-1;;;;;46411:10:0;;46407:90;;46438:47;46471:4;46477:7;46438:32;:47::i;:::-;-1:-1:-1;;;;;46511:16:0;;46507:183;;46544:45;46581:7;46544:36;:45::i;46507:183::-;46617:4;-1:-1:-1;;;;;46611:10:0;:2;-1:-1:-1;;;;;46611:10:0;;46607:83;;46638:40;46666:2;46670:7;46638:27;:40::i;37828:321::-;37958:18;37964:2;37968:7;37958:5;:18::i;:::-;38009:54;38040:1;38044:2;38048:7;38057:5;38009:22;:54::i;:::-;37987:154;;;;-1:-1:-1;;;37987:154:0;;;;;;;:::i;41228:803::-;41383:4;-1:-1:-1;;;;;41404:13:0;;14302:20;14350:8;41400:624;;41440:72;;-1:-1:-1;;;41440:72:0;;-1:-1:-1;;;;;41440:36:0;;;;;:72;;6884:10;;41491:4;;41497:7;;41506:5;;41440:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41440:72:0;;;;;;;;-1:-1:-1;;41440:72:0;;;;;;;;;;;;:::i;:::-;;;41436:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41686:13:0;;41682:272;;41729:60;;-1:-1:-1;;;41729:60:0;;;;;;;:::i;41682:272::-;41904:6;41898:13;41889:6;41885:2;41881:15;41874:38;41436:533;-1:-1:-1;;;;;;41563:55:0;-1:-1:-1;;;41563:55:0;;-1:-1:-1;41556:62:0;;48211:988;48477:22;48527:1;48502:22;48519:4;48502:16;:22::i;:::-;:26;;;;:::i;:::-;48539:18;48560:26;;;:17;:26;;;;;;48477:51;;-1:-1:-1;48693:28:0;;;48689:328;;-1:-1:-1;;;;;48760:18:0;;48738:19;48760:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48811:30;;;;;;:44;;;48928:30;;:17;:30;;;;;:43;;;48689:328;-1:-1:-1;49113:26:0;;;;:17;:26;;;;;;;;49106:33;;;-1:-1:-1;;;;;49157:18:0;;;;;:12;:18;;;;;:34;;;;;;;49150:41;48211:988::o;49494:1079::-;49772:10;:17;49747:22;;49772:21;;49792:1;;49772:21;:::i;:::-;49804:18;49825:24;;;:15;:24;;;;;;50198:10;:26;;49747:46;;-1:-1:-1;49825:24:0;;49747:46;;50198:26;;;;;;:::i;:::-;;;;;;;;;50176:48;;50262:11;50237:10;50248;50237:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;50342:28;;;:15;:28;;;;;;;:41;;;50514:24;;;;;50507:31;50549:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49565:1008;;;49494:1079;:::o;46998:221::-;47083:14;47100:20;47117:2;47100:16;:20::i;:::-;-1:-1:-1;;;;;47131:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;47176:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46998:221:0:o;38485:382::-;-1:-1:-1;;;;;38565:16:0;;38557:61;;;;-1:-1:-1;;;38557:61:0;;18872:2:1;38557:61:0;;;18854:21:1;;;18891:18;;;18884:30;18950:34;18930:18;;;18923:62;19002:18;;38557:61:0;18844:182:1;38557:61:0;38638:16;38646:7;38638;:16::i;:::-;38637:17;38629:58;;;;-1:-1:-1;;;38629:58:0;;13223:2:1;38629:58:0;;;13205:21:1;13262:2;13242:18;;;13235:30;13301;13281:18;;;13274:58;13349:18;;38629:58:0;13195:178:1;38629:58:0;38700:45;38729:1;38733:2;38737:7;38700:20;:45::i;:::-;-1:-1:-1;;;;;38758:13:0;;;;;;:9;:13;;;;;:18;;38775:1;;38758:13;:18;;38775:1;;38758:18;:::i;:::-;;;;-1:-1:-1;;38787:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38787:21:0;-1:-1:-1;;;;;38787:21:0;;;;;;;;38826:33;;38787:16;;;38826:33;;38787:16;;38826:33;38485:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:2;;;239:1;236;229:12;198:2;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;88:262;;;;;:::o;355:855::-;408:5;461:3;454:4;446:6;442:17;438:27;428:2;;479:1;476;469:12;428:2;515:6;502:20;541:4;565:59;581:42;620:2;581:42;:::i;565:59::-;646:3;670:2;665:3;658:15;698:2;693:3;689:12;682:19;;733:2;725:6;721:15;785:3;780:2;774;771:1;767:10;759:6;755:23;751:32;748:41;745:2;;;802:1;799;792:12;745:2;824:1;845;855:326;871:2;866:3;863:11;855:326;;;952:3;939:17;988:18;975:11;972:35;969:2;;;1020:1;1017;1010:12;969:2;1049:57;1102:3;1097:2;1083:11;1075:6;1071:24;1067:33;1049:57;:::i;:::-;1037:70;;-1:-1:-1;1127:12:1;;;;1159;;;;893:1;884:11;855:326;;;-1:-1:-1;1199:5:1;;418:792;-1:-1:-1;;;;;;;;418:792:1:o;1215:221::-;1258:5;1311:3;1304:4;1296:6;1292:17;1288:27;1278:2;;1329:1;1326;1319:12;1278:2;1351:79;1426:3;1417:6;1404:20;1397:4;1389:6;1385:17;1351:79;:::i;1441:429::-;1495:5;1548:3;1541:4;1533:6;1529:17;1525:27;1515:2;;1566:1;1563;1556:12;1515:2;1595:6;1589:13;1626:48;1642:31;1670:2;1642:31;:::i;1626:48::-;1699:2;1690:7;1683:19;1745:3;1738:4;1733:2;1725:6;1721:15;1717:26;1714:35;1711:2;;;1762:1;1759;1752:12;1711:2;1775:64;1836:2;1829:4;1820:7;1816:18;1809:4;1801:6;1797:17;1775:64;:::i;1875:247::-;1934:6;1987:2;1975:9;1966:7;1962:23;1958:32;1955:2;;;2003:1;2000;1993:12;1955:2;2042:9;2029:23;2061:31;2086:5;2061:31;:::i;2387:388::-;2455:6;2463;2516:2;2504:9;2495:7;2491:23;2487:32;2484:2;;;2532:1;2529;2522:12;2484:2;2571:9;2558:23;2590:31;2615:5;2590:31;:::i;:::-;2640:5;-1:-1:-1;2697:2:1;2682:18;;2669:32;2710:33;2669:32;2710:33;:::i;:::-;2762:7;2752:17;;;2474:301;;;;;:::o;2780:456::-;2857:6;2865;2873;2926:2;2914:9;2905:7;2901:23;2897:32;2894:2;;;2942:1;2939;2932:12;2894:2;2981:9;2968:23;3000:31;3025:5;3000:31;:::i;:::-;3050:5;-1:-1:-1;3107:2:1;3092:18;;3079:32;3120:33;3079:32;3120:33;:::i;:::-;2884:352;;3172:7;;-1:-1:-1;;;3226:2:1;3211:18;;;;3198:32;;2884:352::o;3241:794::-;3336:6;3344;3352;3360;3413:3;3401:9;3392:7;3388:23;3384:33;3381:2;;;3430:1;3427;3420:12;3381:2;3469:9;3456:23;3488:31;3513:5;3488:31;:::i;:::-;3538:5;-1:-1:-1;3595:2:1;3580:18;;3567:32;3608:33;3567:32;3608:33;:::i;:::-;3660:7;-1:-1:-1;3714:2:1;3699:18;;3686:32;;-1:-1:-1;3769:2:1;3754:18;;3741:32;3796:18;3785:30;;3782:2;;;3828:1;3825;3818:12;3782:2;3851:22;;3904:4;3896:13;;3892:27;-1:-1:-1;3882:2:1;;3933:1;3930;3923:12;3882:2;3956:73;4021:7;4016:2;4003:16;3998:2;3994;3990:11;3956:73;:::i;:::-;3946:83;;;3371:664;;;;;;;:::o;4040:416::-;4105:6;4113;4166:2;4154:9;4145:7;4141:23;4137:32;4134:2;;;4182:1;4179;4172:12;4134:2;4221:9;4208:23;4240:31;4265:5;4240:31;:::i;:::-;4290:5;-1:-1:-1;4347:2:1;4332:18;;4319:32;4389:15;;4382:23;4370:36;;4360:2;;4420:1;4417;4410:12;4461:315;4529:6;4537;4590:2;4578:9;4569:7;4565:23;4561:32;4558:2;;;4606:1;4603;4596:12;4558:2;4645:9;4632:23;4664:31;4689:5;4664:31;:::i;:::-;4714:5;4766:2;4751:18;;;;4738:32;;-1:-1:-1;;;4548:228:1:o;4781:1159::-;4909:6;4917;4970:2;4958:9;4949:7;4945:23;4941:32;4938:2;;;4986:1;4983;4976:12;4938:2;5026:9;5013:23;5055:18;5096:2;5088:6;5085:14;5082:2;;;5112:1;5109;5102:12;5082:2;5150:6;5139:9;5135:22;5125:32;;5195:7;5188:4;5184:2;5180:13;5176:27;5166:2;;5217:1;5214;5207:12;5166:2;5253;5240:16;5275:4;5299:59;5315:42;5354:2;5315:42;:::i;5299:59::-;5380:3;5404:2;5399:3;5392:15;5432:2;5427:3;5423:12;5416:19;;5463:2;5459;5455:11;5511:7;5506:2;5500;5497:1;5493:10;5489:2;5485:19;5481:28;5478:41;5475:2;;;5532:1;5529;5522:12;5475:2;5554:1;5545:10;;5564:163;5578:2;5575:1;5572:9;5564:163;;;5635:17;;5623:30;;5596:1;5589:9;;;;;5673:12;;;;5705;;5564:163;;;-1:-1:-1;5746:5:1;-1:-1:-1;;5789:18:1;;5776:32;;-1:-1:-1;;5820:16:1;;;5817:2;;;5849:1;5846;5839:12;5817:2;;5872:62;5926:7;5915:8;5904:9;5900:24;5872:62;:::i;:::-;5862:72;;;4928:1012;;;;;:::o;5945:245::-;6003:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:2;;;6072:1;6069;6062:12;6024:2;6111:9;6098:23;6130:30;6154:5;6130:30;:::i;6195:249::-;6264:6;6317:2;6305:9;6296:7;6292:23;6288:32;6285:2;;;6333:1;6330;6323:12;6285:2;6365:9;6359:16;6384:30;6408:5;6384:30;:::i;6449:337::-;6529:6;6582:2;6570:9;6561:7;6557:23;6553:32;6550:2;;;6598:1;6595;6588:12;6550:2;6631:9;6625:16;6664:18;6656:6;6653:30;6650:2;;;6696:1;6693;6686:12;6650:2;6719:61;6772:7;6763:6;6752:9;6748:22;6719:61;:::i;6791:398::-;6880:6;6888;6941:2;6929:9;6920:7;6916:23;6912:32;6909:2;;;6957:1;6954;6947:12;6909:2;6990:9;6984:16;7023:18;7015:6;7012:30;7009:2;;;7055:1;7052;7045:12;7009:2;7078:61;7131:7;7122:6;7111:9;7107:22;7078:61;:::i;:::-;7068:71;;;7179:2;7168:9;7164:18;7158:25;7148:35;;6899:290;;;;;:::o;7194:180::-;7253:6;7306:2;7294:9;7285:7;7281:23;7277:32;7274:2;;;7322:1;7319;7312:12;7274:2;-1:-1:-1;7345:23:1;;7264:110;-1:-1:-1;7264:110:1:o;7379:184::-;7449:6;7502:2;7490:9;7481:7;7477:23;7473:32;7470:2;;;7518:1;7515;7508:12;7470:2;-1:-1:-1;7541:16:1;;7460:103;-1:-1:-1;7460:103:1:o;7568:390::-;7646:6;7654;7707:2;7695:9;7686:7;7682:23;7678:32;7675:2;;;7723:1;7720;7713:12;7675:2;7759:9;7746:23;7736:33;;7820:2;7809:9;7805:18;7792:32;7847:18;7839:6;7836:30;7833:2;;;7879:1;7876;7869:12;7833:2;7902:50;7944:7;7935:6;7924:9;7920:22;7902:50;:::i;7963:248::-;8031:6;8039;8092:2;8080:9;8071:7;8067:23;8063:32;8060:2;;;8108:1;8105;8098:12;8060:2;-1:-1:-1;;8131:23:1;;;8201:2;8186:18;;;8173:32;;-1:-1:-1;8050:161:1:o;8216:257::-;8257:3;8295:5;8289:12;8322:6;8317:3;8310:19;8338:63;8394:6;8387:4;8382:3;8378:14;8371:4;8364:5;8360:16;8338:63;:::i;:::-;8455:2;8434:15;-1:-1:-1;;8430:29:1;8421:39;;;;8462:4;8417:50;;8265:208;-1:-1:-1;;8265:208:1:o;8478:432::-;-1:-1:-1;;;8735:3:1;8728:28;8710:3;8785:6;8779:13;8801:62;8856:6;8851:2;8846:3;8842:12;8835:4;8827:6;8823:17;8801:62;:::i;:::-;8883:16;;;;8901:2;8879:25;;8718:192;-1:-1:-1;;8718:192:1:o;9123:488::-;-1:-1:-1;;;;;9392:15:1;;;9374:34;;9444:15;;9439:2;9424:18;;9417:43;9491:2;9476:18;;9469:34;;;9539:3;9534:2;9519:18;;9512:31;;;9317:4;;9560:45;;9585:19;;9577:6;9560:45;:::i;:::-;9552:53;9326:285;-1:-1:-1;;;;;;9326:285:1:o;9808:219::-;9957:2;9946:9;9939:21;9920:4;9977:44;10017:2;10006:9;10002:18;9994:6;9977:44;:::i;10032:290::-;10209:2;10198:9;10191:21;10172:4;10229:44;10269:2;10258:9;10254:18;10246:6;10229:44;:::i;:::-;10221:52;;10309:6;10304:2;10293:9;10289:18;10282:34;10181:141;;;;;:::o;11793:414::-;11995:2;11977:21;;;12034:2;12014:18;;;12007:30;12073:34;12068:2;12053:18;;12046:62;-1:-1:-1;;;12139:2:1;12124:18;;12117:48;12197:3;12182:19;;11967:240::o;20190:356::-;20392:2;20374:21;;;20411:18;;;20404:30;20470:34;20465:2;20450:18;;20443:62;20537:2;20522:18;;20364:182::o;20961:411::-;21163:2;21145:21;;;21202:2;21182:18;;;21175:30;21241:34;21236:2;21221:18;;21214:62;-1:-1:-1;;;21307:2:1;21292:18;;21285:45;21362:3;21347:19;;21135:237::o;22133:413::-;22335:2;22317:21;;;22374:2;22354:18;;;22347:30;22413:34;22408:2;22393:18;;22386:62;-1:-1:-1;;;22479:2:1;22464:18;;22457:47;22536:3;22521:19;;22307:239::o;24451:275::-;24522:2;24516:9;24587:2;24568:13;;-1:-1:-1;;24564:27:1;24552:40;;24622:18;24607:34;;24643:22;;;24604:62;24601:2;;;24669:18;;:::i;:::-;24705:2;24698:22;24496:230;;-1:-1:-1;24496:230:1:o;24731:182::-;24790:4;24823:18;24815:6;24812:30;24809:2;;;24845:18;;:::i;:::-;-1:-1:-1;24890:1:1;24886:14;24902:4;24882:25;;24799:114::o;24918:186::-;24966:4;24999:18;24991:6;24988:30;24985:2;;;25021:18;;:::i;:::-;-1:-1:-1;25087:2:1;25066:15;-1:-1:-1;;25062:29:1;25093:4;25058:40;;24975:129::o;25109:128::-;25149:3;25180:1;25176:6;25173:1;25170:13;25167:2;;;25186:18;;:::i;:::-;-1:-1:-1;25222:9:1;;25157:80::o;25242:120::-;25282:1;25308;25298:2;;25313:18;;:::i;:::-;-1:-1:-1;25347:9:1;;25288:74::o;25367:168::-;25407:7;25473:1;25469;25465:6;25461:14;25458:1;25455:21;25450:1;25443:9;25436:17;25432:45;25429:2;;;25480:18;;:::i;:::-;-1:-1:-1;25520:9:1;;25419:116::o;25540:125::-;25580:4;25608:1;25605;25602:8;25599:2;;;25613:18;;:::i;:::-;-1:-1:-1;25650:9:1;;25589:76::o;25670:258::-;25742:1;25752:113;25766:6;25763:1;25760:13;25752:113;;;25842:11;;;25836:18;25823:11;;;25816:39;25788:2;25781:10;25752:113;;;25883:6;25880:1;25877:13;25874:2;;;-1:-1:-1;;25918:1:1;25900:16;;25893:27;25723:205::o;25933:380::-;26012:1;26008:12;;;;26055;;;26076:2;;26130:4;26122:6;26118:17;26108:27;;26076:2;26183;26175:6;26172:14;26152:18;26149:38;26146:2;;;26229:10;26224:3;26220:20;26217:1;26210:31;26264:4;26261:1;26254:15;26292:4;26289:1;26282:15;26146:2;;25988:325;;;:::o;26318:135::-;26357:3;-1:-1:-1;;26378:17:1;;26375:2;;;26398:18;;:::i;:::-;-1:-1:-1;26445:1:1;26434:13;;26365:88::o;26458:112::-;26490:1;26516;26506:2;;26521:18;;:::i;:::-;-1:-1:-1;26555:9:1;;26496:74::o;26575:127::-;26636:10;26631:3;26627:20;26624:1;26617:31;26667:4;26664:1;26657:15;26691:4;26688:1;26681:15;26707:127;26768:10;26763:3;26759:20;26756:1;26749:31;26799:4;26796:1;26789:15;26823:4;26820:1;26813:15;26839:127;26900:10;26895:3;26891:20;26888:1;26881:31;26931:4;26928:1;26921:15;26955:4;26952:1;26945:15;26971:127;27032:10;27027:3;27023:20;27020:1;27013:31;27063:4;27060:1;27053:15;27087:4;27084:1;27077:15;27103:127;27164:10;27159:3;27155:20;27152:1;27145:31;27195:4;27192:1;27185:15;27219:4;27216:1;27209:15;27235:131;-1:-1:-1;;;;;27310:31:1;;27300:42;;27290:2;;27356:1;27353;27346:12;27371:131;-1:-1:-1;;;;;;27445:32:1;;27435:43;;27425:2;;27492:1;27489;27482:12

Swarm Source

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