ETH Price: $2,270.47 (+1.68%)

Token

RR/MoonBirds (RR/MoonBirds)
 

Overview

Max Total Supply

995 RR/MoonBirds

Holders

184

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
feixin.eth
Balance
5 RR/MoonBirds
0x522026e760f573764d03a3ede04746fd1647989c
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:
RRMoonBirds

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-21
*/

/**
 *Submitted for verification at Etherscan.io on 2022-06-21
*/

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol



pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // 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
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @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 override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: 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 override {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * 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
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @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("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * 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`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

//SPDX-License-Identifier: MIT
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)

pragma solidity ^0.8.0;









contract RRMoonBirds is ERC721A, IERC2981, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private tokenCounter;

    
    address private openSeaProxyRegistryAddress = 0xa7ab756C709271C85BC23899a254125c19cc326A;
    bool private isOpenSeaProxyActive = true;

    uint256 public constant MAX_MINTS_PER_TX = 5;
    uint256 public maxSupply = 5555;

    uint256 public constant PUBLIC_SALE_PRICE = 0.005 ether;
    uint256 public NUM_FREE_MINTS = 888;
    bool public isPublicSaleActive = true;




    // ============ ACCESS CONTROL/SANITY MODIFIERS ============

    modifier publicSaleActive() {
        require(isPublicSaleActive, "Public sale is not open");
        _;
    }



    modifier maxMintsPerTX(uint256 numberOfTokens) {
        require(
            numberOfTokens <= MAX_MINTS_PER_TX,
            "Max mints per transaction exceeded"
        );
        _;
    }

    modifier canMintNFTs(uint256 numberOfTokens) {
        require(
            totalSupply() + numberOfTokens <=
                maxSupply,
            "Not enough mints remaining to mint"
        );
        _;
    }

    modifier freeMintsAvailable() {
        require(
            totalSupply() <=
                NUM_FREE_MINTS,
            "Not enough free mints remain"
        );
        _;
    }



    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        if(totalSupply()>NUM_FREE_MINTS){
        require(
            (price * numberOfTokens) == msg.value,
            "Incorrect ETH value sent"
        );
        }
        _;
    }


    constructor(
    ) ERC721A("RR/MoonBirds", "RR/MoonBirds", 100, maxSupply) {
    }

    // ============ PUBLIC FUNCTIONS FOR MINTING ============

    function mint(uint256 numberOfTokens)
        external
        payable
        nonReentrant
        isCorrectPayment(PUBLIC_SALE_PRICE, numberOfTokens)
        publicSaleActive
        canMintNFTs(numberOfTokens)
        maxMintsPerTX(numberOfTokens)
    {

        _safeMint(msg.sender, numberOfTokens);
    }



    //A simple free mint function to avoid confusion
    //The normal mint function with a cost of 0 would work too

    // ============ PUBLIC READ-ONLY FUNCTIONS ============

    

    // ============ OWNER-ONLY ADMIN FUNCTIONS ============

    

    // function to disable gasless listings for security in case
    // opensea ever shuts down or is compromised
    function setIsOpenSeaProxyActive(bool _isOpenSeaProxyActive)
        external
        onlyOwner
    {
        isOpenSeaProxyActive = _isOpenSeaProxyActive;
    }

    function setIsPublicSaleActive(bool _isPublicSaleActive)
        external
        onlyOwner
    {
        isPublicSaleActive = _isPublicSaleActive;
    }


    function setNumFreeMints(uint256 _numfreemints)
        external
        onlyOwner
    {
        NUM_FREE_MINTS = _numfreemints;
    }


    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(msg.sender, balance);
    }



    // ============ SUPPORTING FUNCTIONS ============

    function nextTokenId() private returns (uint256) {
        tokenCounter.increment();
        return tokenCounter.current();
    }

    // ============ FUNCTION OVERRIDES ============

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev Override isApprovedForAll to allowlist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Get a reference to OpenSea's proxy registry contract by instantiating
        // the contract using the already existing address.
        ProxyRegistry proxyRegistry = ProxyRegistry(
            openSeaProxyRegistryAddress
        );
        if (
            isOpenSeaProxyActive &&
            address(proxyRegistry.proxies(owner)) == operator
        ) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

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

        return
            string(abi.encodePacked("https://live---metadata-5covpqijaa-uc.a.run.app/metadata/", (tokenId+1).toString()));
    }

    /**
     * @dev See {IERC165-royaltyInfo}.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "Nonexistent token");

        return (address(this), SafeMath.div(SafeMath.mul(salePrice, 5), 100));
    }
}

// These contract definitions are used to create a reference to the OpenSea
// ProxyRegistry contract by using the registry's address (see isApprovedForAll).
contract OwnableDelegateProxy {

}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"bool","name":"_isOpenSeaProxyActive","type":"bool"}],"name":"setIsOpenSeaProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","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"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260008055600060075573a7ab756c709271c85bc23899a254125c19cc326a600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60146101000a81548160ff0219169083151502179055506115b3600c55610378600d556001600e60006101000a81548160ff021916908315150217905550348015620000b157600080fd5b506040518060400160405280600c81526020017f52522f4d6f6f6e426972647300000000000000000000000000000000000000008152506040518060400160405280600c81526020017f52522f4d6f6f6e426972647300000000000000000000000000000000000000008152506064600c546000811162000169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001609062000428565b60405180910390fd5b60008211620001af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a690620004c0565b60405180910390fd5b8360019080519060200190620001c7929190620002f1565b508260029080519060200190620001e0929190620002f1565b508160a0818152505080608081815250505050505062000215620002096200022360201b60201c565b6200022b60201b60201c565b600160098190555062000547565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ff9062000511565b90600052602060002090601f0160209004810192826200032357600085556200036f565b82601f106200033e57805160ff19168380011785556200036f565b828001600101855582156200036f579182015b828111156200036e57825182559160200191906001019062000351565b5b5090506200037e919062000382565b5090565b5b808211156200039d57600081600090555060010162000383565b5090565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b600062000410602e83620003a1565b91506200041d82620003b2565b604082019050919050565b60006020820190508181036000830152620004438162000401565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620004a8602783620003a1565b9150620004b5826200044a565b604082019050919050565b60006020820190508181036000830152620004db8162000499565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052a57607f821691505b60208210811415620005415762000540620004e2565b5b50919050565b60805160a051614821620005786000396000818161224f0152818161227801526129a50152600050506148216000f3fe6080604052600436106101e35760003560e01c80636352211e11610102578063b88d4fde11610095578063d7224ba011610064578063d7224ba0146106e6578063e43082f714610711578063e985e9c51461073a578063f2fde38b14610777576101e3565b8063b88d4fde1461062a578063c6a91b4214610653578063c87b56dd1461067e578063d5abeb01146106bb576101e3565b806395d89b41116100d157806395d89b411461058f578063982d669e146105ba578063a0712d68146105e5578063a22cb46514610601576101e3565b80636352211e146104d357806370a0823114610510578063715018a61461054d5780638da5cb5b14610564576101e3565b806323b872dd1161017a5780633ccfd60b116101495780633ccfd60b1461042d57806342842e0e1461044457806349df728c1461046d5780634f6ccce714610496576101e3565b806323b872dd1461036057806328cad13d146103895780632a55205a146103b25780632f745c59146103f0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b85780630a00ae83146102e157806318160ddd1461030a5780631e84c41314610335576101e3565b806301ffc9a7146101e857806306fdde031461022557806307e89ec014610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612e7c565b6107a0565b60405161021c9190612ec4565b60405180910390f35b34801561023157600080fd5b5061023a61081a565b6040516102479190612f78565b60405180910390f35b34801561025c57600080fd5b506102656108ac565b6040516102729190612fb3565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190612ffa565b6108b7565b6040516102af9190613068565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da91906130af565b61093c565b005b3480156102ed57600080fd5b5061030860048036038101906103039190612ffa565b610a55565b005b34801561031657600080fd5b5061031f610adb565b60405161032c9190612fb3565b60405180910390f35b34801561034157600080fd5b5061034a610ae4565b6040516103579190612ec4565b60405180910390f35b34801561036c57600080fd5b50610387600480360381019061038291906130ef565b610af7565b005b34801561039557600080fd5b506103b060048036038101906103ab919061316e565b610b07565b005b3480156103be57600080fd5b506103d960048036038101906103d4919061319b565b610ba0565b6040516103e79291906131db565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906130af565b610c0c565b6040516104249190612fb3565b60405180910390f35b34801561043957600080fd5b50610442610e0a565b005b34801561045057600080fd5b5061046b600480360381019061046691906130ef565b610ed5565b005b34801561047957600080fd5b50610494600480360381019061048f9190613242565b610ef5565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612ffa565b611090565b6040516104ca9190612fb3565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190612ffa565b6110e3565b6040516105079190613068565b60405180910390f35b34801561051c57600080fd5b506105376004803603810190610532919061326f565b6110f9565b6040516105449190612fb3565b60405180910390f35b34801561055957600080fd5b506105626111e2565b005b34801561057057600080fd5b5061057961126a565b6040516105869190613068565b60405180910390f35b34801561059b57600080fd5b506105a4611294565b6040516105b19190612f78565b60405180910390f35b3480156105c657600080fd5b506105cf611326565b6040516105dc9190612fb3565b60405180910390f35b6105ff60048036038101906105fa9190612ffa565b61132c565b005b34801561060d57600080fd5b506106286004803603810190610623919061329c565b6114e7565b005b34801561063657600080fd5b50610651600480360381019061064c9190613411565b611668565b005b34801561065f57600080fd5b506106686116c4565b6040516106759190612fb3565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612ffa565b6116c9565b6040516106b29190612f78565b60405180910390f35b3480156106c757600080fd5b506106d061174e565b6040516106dd9190612fb3565b60405180910390f35b3480156106f257600080fd5b506106fb611754565b6040516107089190612fb3565b60405180910390f35b34801561071d57600080fd5b506107386004803603810190610733919061316e565b61175a565b005b34801561074657600080fd5b50610761600480360381019061075c9190613494565b6117f3565b60405161076e9190612ec4565b60405180910390f35b34801561078357600080fd5b5061079e6004803603810190610799919061326f565b61190d565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610813575061081282611a05565b5b9050919050565b60606001805461082990613503565b80601f016020809104026020016040519081016040528092919081815260200182805461085590613503565b80156108a25780601f10610877576101008083540402835291602001916108a2565b820191906000526020600020905b81548152906001019060200180831161088557829003601f168201915b5050505050905090565b6611c37937e0800081565b60006108c282611b4f565b610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f8906135a7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610947826110e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90613639565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d7611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480610a065750610a0581610a00611b5c565b6117f3565b5b610a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3c906136cb565b60405180910390fd5b610a50838383611b64565b505050565b610a5d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610a7b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613737565b60405180910390fd5b80600d8190555050565b60008054905090565b600e60009054906101000a900460ff1681565b610b02838383611c16565b505050565b610b0f611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610b2d61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613737565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600080610bac84611b4f565b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906137a3565b60405180910390fd5b30610c01610bfa8560056121cf565b60646121e5565b915091509250929050565b6000610c17836110f9565b8210610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613835565b60405180910390fd5b6000610c62610adb565b905060008060005b83811015610dc8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db45786841415610da5578195505050505050610e04565b8380610db090613884565b9450505b508080610dc090613884565b915050610c6a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061393f565b60405180910390fd5b92915050565b610e12611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610e3061126a565b73ffffffffffffffffffffffffffffffffffffffff1614610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90613737565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed1573d6000803e3d6000fd5b5050565b610ef083838360405180602001604052806000815250611668565b505050565b610efd611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610f1b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613737565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fac9190613068565b60206040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffc9190613974565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016110399291906131db565b602060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108b91906139b6565b505050565b600061109a610adb565b82106110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613a55565b60405180910390fd5b819050919050565b60006110ee826121fb565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613ae7565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6111ea611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661120861126a565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613737565b60405180910390fd5b61126860006123fe565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546112a390613503565b80601f01602080910402602001604051908101604052809291908181526020018280546112cf90613503565b801561131c5780601f106112f15761010080835404028352916020019161131c565b820191906000526020600020905b8154815290600101906020018083116112ff57829003601f168201915b5050505050905090565b600d5481565b60026009541415611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613b53565b60405180910390fd5b60026009819055506611c37937e0800081600d5461138e610adb565b11156113e2573481836113a19190613b73565b146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890613c19565b60405180910390fd5b5b600e60009054906101000a900460ff16611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890613c85565b60405180910390fd5b82600c548161143e610adb565b6114489190613ca5565b1115611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090613d6d565b60405180910390fd5b8360058111156114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590613dff565b60405180910390fd5b6114d833866124c4565b50505050600160098190555050565b6114ef611b5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490613e6b565b60405180910390fd5b806006600061156a611b5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611617611b5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161165c9190612ec4565b60405180910390a35050565b611673848484611c16565b61167f848484846124e2565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590613efd565b60405180910390fd5b50505050565b600581565b60606116d482611b4f565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a906137a3565b60405180910390fd5b6117286001836117239190613ca5565b612679565b6040516020016117389190613fcb565b6040516020818303038152906040529050919050565b600c5481565b60075481565b611762611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661178061126a565b73ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613737565b60405180910390fd5b80600b60146101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60149054906101000a900460ff1680156118ea57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118829190613068565b60206040518083038186803b15801561189a57600080fd5b505afa1580156118ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d2919061402b565b73ffffffffffffffffffffffffffffffffffffffff16145b156118f9576001915050611907565b61190384846127da565b9150505b92915050565b611915611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661193361126a565b73ffffffffffffffffffffffffffffffffffffffff1614611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090613737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906140ca565b60405180910390fd5b611a02816123fe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ad057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b3857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b485750611b478261286e565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c21826121fb565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c48611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480611ca45750611c6d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16611c8c846108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc05750611cbf8260000151611cba611b5c565b6117f3565b5b905080611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061415c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b906141ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614280565b60405180910390fd5b611df185858560016128d8565b611e016000848460000151611b64565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611e6f91906142bc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f1391906142f0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120199190613ca5565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561215f5761208f81611b4f565b1561215e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121c786868660016128de565b505050505050565b600081836121dd9190613b73565b905092915050565b600081836121f39190614365565b905092915050565b612203612dd6565b61220c82611b4f565b61224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290614408565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106122af5760017f0000000000000000000000000000000000000000000000000000000000000000846122a29190614428565b6122ac9190613ca5565b90505b60008390505b8181106123bd576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123a9578093505050506123f9565b5080806123b59061445c565b9150506122b5565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f0906144f8565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124de8282604051806020016040528060008152506128e4565b5050565b60006125038473ffffffffffffffffffffffffffffffffffffffff16612dc3565b1561266c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261252c611b5c565b8786866040518563ffffffff1660e01b815260040161254e949392919061456d565b602060405180830381600087803b15801561256857600080fd5b505af192505050801561259957506040513d601f19601f8201168201806040525081019061259691906145ce565b60015b61261c573d80600081146125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b50600081511415612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260b90613efd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612671565b600190505b949350505050565b606060008214156126c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d5565b600082905060005b600082146126f35780806126dc90613884565b915050600a826126ec9190614365565b91506126c9565b60008167ffffffffffffffff81111561270f5761270e6132e6565b5b6040519080825280601f01601f1916602001820160405280156127415781602001600182028036833780820191505090505b5090505b600085146127ce5760018261275a9190614428565b9150600a8561276991906145fb565b60306127759190613ca5565b60f81b81838151811061278b5761278a61462c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c79190614365565b9450612745565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561295a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612951906146cd565b60405180910390fd5b61296381611b4f565b156129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a90614739565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd906147cb565b60405180910390fd5b612a1360008583866128d8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b1091906142f0565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b3791906142f0565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612da657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4660008884886124e2565b612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c90613efd565b60405180910390fd5b8180612d9090613884565b9250508080612d9e90613884565b915050612cd5565b5080600081905550612dbb60008785886128de565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5981612e24565b8114612e6457600080fd5b50565b600081359050612e7681612e50565b92915050565b600060208284031215612e9257612e91612e1a565b5b6000612ea084828501612e67565b91505092915050565b60008115159050919050565b612ebe81612ea9565b82525050565b6000602082019050612ed96000830184612eb5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f19578082015181840152602081019050612efe565b83811115612f28576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4a82612edf565b612f548185612eea565b9350612f64818560208601612efb565b612f6d81612f2e565b840191505092915050565b60006020820190508181036000830152612f928184612f3f565b905092915050565b6000819050919050565b612fad81612f9a565b82525050565b6000602082019050612fc86000830184612fa4565b92915050565b612fd781612f9a565b8114612fe257600080fd5b50565b600081359050612ff481612fce565b92915050565b6000602082840312156130105761300f612e1a565b5b600061301e84828501612fe5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061305282613027565b9050919050565b61306281613047565b82525050565b600060208201905061307d6000830184613059565b92915050565b61308c81613047565b811461309757600080fd5b50565b6000813590506130a981613083565b92915050565b600080604083850312156130c6576130c5612e1a565b5b60006130d48582860161309a565b92505060206130e585828601612fe5565b9150509250929050565b60008060006060848603121561310857613107612e1a565b5b60006131168682870161309a565b93505060206131278682870161309a565b925050604061313886828701612fe5565b9150509250925092565b61314b81612ea9565b811461315657600080fd5b50565b60008135905061316881613142565b92915050565b60006020828403121561318457613183612e1a565b5b600061319284828501613159565b91505092915050565b600080604083850312156131b2576131b1612e1a565b5b60006131c085828601612fe5565b92505060206131d185828601612fe5565b9150509250929050565b60006040820190506131f06000830185613059565b6131fd6020830184612fa4565b9392505050565b600061320f82613047565b9050919050565b61321f81613204565b811461322a57600080fd5b50565b60008135905061323c81613216565b92915050565b60006020828403121561325857613257612e1a565b5b60006132668482850161322d565b91505092915050565b60006020828403121561328557613284612e1a565b5b60006132938482850161309a565b91505092915050565b600080604083850312156132b3576132b2612e1a565b5b60006132c18582860161309a565b92505060206132d285828601613159565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331e82612f2e565b810181811067ffffffffffffffff8211171561333d5761333c6132e6565b5b80604052505050565b6000613350612e10565b905061335c8282613315565b919050565b600067ffffffffffffffff82111561337c5761337b6132e6565b5b61338582612f2e565b9050602081019050919050565b82818337600083830152505050565b60006133b46133af84613361565b613346565b9050828152602081018484840111156133d0576133cf6132e1565b5b6133db848285613392565b509392505050565b600082601f8301126133f8576133f76132dc565b5b81356134088482602086016133a1565b91505092915050565b6000806000806080858703121561342b5761342a612e1a565b5b60006134398782880161309a565b945050602061344a8782880161309a565b935050604061345b87828801612fe5565b925050606085013567ffffffffffffffff81111561347c5761347b612e1f565b5b613488878288016133e3565b91505092959194509250565b600080604083850312156134ab576134aa612e1a565b5b60006134b98582860161309a565b92505060206134ca8582860161309a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061351b57607f821691505b6020821081141561352f5761352e6134d4565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613591602d83612eea565b915061359c82613535565b604082019050919050565b600060208201905081810360008301526135c081613584565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613623602283612eea565b915061362e826135c7565b604082019050919050565b6000602082019050818103600083015261365281613616565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006136b5603983612eea565b91506136c082613659565b604082019050919050565b600060208201905081810360008301526136e4816136a8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613721602083612eea565b915061372c826136eb565b602082019050919050565b6000602082019050818103600083015261375081613714565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061378d601183612eea565b915061379882613757565b602082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061381f602283612eea565b915061382a826137c3565b604082019050919050565b6000602082019050818103600083015261384e81613812565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388f82612f9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c2576138c1613855565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613929602e83612eea565b9150613934826138cd565b604082019050919050565b600060208201905081810360008301526139588161391c565b9050919050565b60008151905061396e81612fce565b92915050565b60006020828403121561398a57613989612e1a565b5b60006139988482850161395f565b91505092915050565b6000815190506139b081613142565b92915050565b6000602082840312156139cc576139cb612e1a565b5b60006139da848285016139a1565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3f602383612eea565b9150613a4a826139e3565b604082019050919050565b60006020820190508181036000830152613a6e81613a32565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613ad1602b83612eea565b9150613adc82613a75565b604082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b3d601f83612eea565b9150613b4882613b07565b602082019050919050565b60006020820190508181036000830152613b6c81613b30565b9050919050565b6000613b7e82612f9a565b9150613b8983612f9a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc257613bc1613855565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000613c03601883612eea565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b6000613c6f601783612eea565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b6000613cb082612f9a565b9150613cbb83612f9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cf057613cef613855565b5b828201905092915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d57602283612eea565b9150613d6282613cfb565b604082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613de9602283612eea565b9150613df482613d8d565b604082019050919050565b60006020820190508181036000830152613e1881613ddc565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613e55601a83612eea565b9150613e6082613e1f565b602082019050919050565b60006020820190508181036000830152613e8481613e48565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613ee7603383612eea565b9150613ef282613e8b565b604082019050919050565b60006020820190508181036000830152613f1681613eda565b9050919050565b600081905092915050565b7f68747470733a2f2f6c6976652d2d2d6d657461646174612d35636f767071696a60008201527f61612d75632e612e72756e2e6170702f6d657461646174612f00000000000000602082015250565b6000613f84603983613f1d565b9150613f8f82613f28565b603982019050919050565b6000613fa582612edf565b613faf8185613f1d565b9350613fbf818560208601612efb565b80840191505092915050565b6000613fd682613f77565b9150613fe28284613f9a565b915081905092915050565b6000613ff882613047565b9050919050565b61400881613fed565b811461401357600080fd5b50565b60008151905061402581613fff565b92915050565b60006020828403121561404157614040612e1a565b5b600061404f84828501614016565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140b4602683612eea565b91506140bf82614058565b604082019050919050565b600060208201905081810360008301526140e3816140a7565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614146603283612eea565b9150614151826140ea565b604082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006141d8602683612eea565b91506141e38261417c565b604082019050919050565b60006020820190508181036000830152614207816141cb565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061426a602583612eea565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006142c7826142a0565b91506142d2836142a0565b9250828210156142e5576142e4613855565b5b828203905092915050565b60006142fb826142a0565b9150614306836142a0565b9250826fffffffffffffffffffffffffffffffff0382111561432b5761432a613855565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061437082612f9a565b915061437b83612f9a565b92508261438b5761438a614336565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006143f2602a83612eea565b91506143fd82614396565b604082019050919050565b60006020820190508181036000830152614421816143e5565b9050919050565b600061443382612f9a565b915061443e83612f9a565b92508282101561445157614450613855565b5b828203905092915050565b600061446782612f9a565b9150600082141561447b5761447a613855565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006144e2602f83612eea565b91506144ed82614486565b604082019050919050565b60006020820190508181036000830152614511816144d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061453f82614518565b6145498185614523565b9350614559818560208601612efb565b61456281612f2e565b840191505092915050565b60006080820190506145826000830187613059565b61458f6020830186613059565b61459c6040830185612fa4565b81810360608301526145ae8184614534565b905095945050505050565b6000815190506145c881612e50565b92915050565b6000602082840312156145e4576145e3612e1a565b5b60006145f2848285016145b9565b91505092915050565b600061460682612f9a565b915061461183612f9a565b92508261462157614620614336565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b7602183612eea565b91506146c28261465b565b604082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614723601d83612eea565b915061472e826146ed565b602082019050919050565b6000602082019050818103600083015261475281614716565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b5602283612eea565b91506147c082614759565b604082019050919050565b600060208201905081810360008301526147e4816147a8565b905091905056fea2646970667358221220e48a78956ad6ab95a531c7765bf00247172275c0e901b283d25a458c253f9d0664736f6c63430008090033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636352211e11610102578063b88d4fde11610095578063d7224ba011610064578063d7224ba0146106e6578063e43082f714610711578063e985e9c51461073a578063f2fde38b14610777576101e3565b8063b88d4fde1461062a578063c6a91b4214610653578063c87b56dd1461067e578063d5abeb01146106bb576101e3565b806395d89b41116100d157806395d89b411461058f578063982d669e146105ba578063a0712d68146105e5578063a22cb46514610601576101e3565b80636352211e146104d357806370a0823114610510578063715018a61461054d5780638da5cb5b14610564576101e3565b806323b872dd1161017a5780633ccfd60b116101495780633ccfd60b1461042d57806342842e0e1461044457806349df728c1461046d5780634f6ccce714610496576101e3565b806323b872dd1461036057806328cad13d146103895780632a55205a146103b25780632f745c59146103f0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b85780630a00ae83146102e157806318160ddd1461030a5780631e84c41314610335576101e3565b806301ffc9a7146101e857806306fdde031461022557806307e89ec014610250578063081812fc1461027b575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612e7c565b6107a0565b60405161021c9190612ec4565b60405180910390f35b34801561023157600080fd5b5061023a61081a565b6040516102479190612f78565b60405180910390f35b34801561025c57600080fd5b506102656108ac565b6040516102729190612fb3565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d9190612ffa565b6108b7565b6040516102af9190613068565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da91906130af565b61093c565b005b3480156102ed57600080fd5b5061030860048036038101906103039190612ffa565b610a55565b005b34801561031657600080fd5b5061031f610adb565b60405161032c9190612fb3565b60405180910390f35b34801561034157600080fd5b5061034a610ae4565b6040516103579190612ec4565b60405180910390f35b34801561036c57600080fd5b50610387600480360381019061038291906130ef565b610af7565b005b34801561039557600080fd5b506103b060048036038101906103ab919061316e565b610b07565b005b3480156103be57600080fd5b506103d960048036038101906103d4919061319b565b610ba0565b6040516103e79291906131db565b60405180910390f35b3480156103fc57600080fd5b50610417600480360381019061041291906130af565b610c0c565b6040516104249190612fb3565b60405180910390f35b34801561043957600080fd5b50610442610e0a565b005b34801561045057600080fd5b5061046b600480360381019061046691906130ef565b610ed5565b005b34801561047957600080fd5b50610494600480360381019061048f9190613242565b610ef5565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190612ffa565b611090565b6040516104ca9190612fb3565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190612ffa565b6110e3565b6040516105079190613068565b60405180910390f35b34801561051c57600080fd5b506105376004803603810190610532919061326f565b6110f9565b6040516105449190612fb3565b60405180910390f35b34801561055957600080fd5b506105626111e2565b005b34801561057057600080fd5b5061057961126a565b6040516105869190613068565b60405180910390f35b34801561059b57600080fd5b506105a4611294565b6040516105b19190612f78565b60405180910390f35b3480156105c657600080fd5b506105cf611326565b6040516105dc9190612fb3565b60405180910390f35b6105ff60048036038101906105fa9190612ffa565b61132c565b005b34801561060d57600080fd5b506106286004803603810190610623919061329c565b6114e7565b005b34801561063657600080fd5b50610651600480360381019061064c9190613411565b611668565b005b34801561065f57600080fd5b506106686116c4565b6040516106759190612fb3565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a09190612ffa565b6116c9565b6040516106b29190612f78565b60405180910390f35b3480156106c757600080fd5b506106d061174e565b6040516106dd9190612fb3565b60405180910390f35b3480156106f257600080fd5b506106fb611754565b6040516107089190612fb3565b60405180910390f35b34801561071d57600080fd5b506107386004803603810190610733919061316e565b61175a565b005b34801561074657600080fd5b50610761600480360381019061075c9190613494565b6117f3565b60405161076e9190612ec4565b60405180910390f35b34801561078357600080fd5b5061079e6004803603810190610799919061326f565b61190d565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610813575061081282611a05565b5b9050919050565b60606001805461082990613503565b80601f016020809104026020016040519081016040528092919081815260200182805461085590613503565b80156108a25780601f10610877576101008083540402835291602001916108a2565b820191906000526020600020905b81548152906001019060200180831161088557829003601f168201915b5050505050905090565b6611c37937e0800081565b60006108c282611b4f565b610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f8906135a7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610947826110e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90613639565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d7611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480610a065750610a0581610a00611b5c565b6117f3565b5b610a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3c906136cb565b60405180910390fd5b610a50838383611b64565b505050565b610a5d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610a7b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613737565b60405180910390fd5b80600d8190555050565b60008054905090565b600e60009054906101000a900460ff1681565b610b02838383611c16565b505050565b610b0f611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610b2d61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613737565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600080610bac84611b4f565b610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906137a3565b60405180910390fd5b30610c01610bfa8560056121cf565b60646121e5565b915091509250929050565b6000610c17836110f9565b8210610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90613835565b60405180910390fd5b6000610c62610adb565b905060008060005b83811015610dc8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db45786841415610da5578195505050505050610e04565b8380610db090613884565b9450505b508080610dc090613884565b915050610c6a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061393f565b60405180910390fd5b92915050565b610e12611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610e3061126a565b73ffffffffffffffffffffffffffffffffffffffff1614610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90613737565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed1573d6000803e3d6000fd5b5050565b610ef083838360405180602001604052806000815250611668565b505050565b610efd611b5c565b73ffffffffffffffffffffffffffffffffffffffff16610f1b61126a565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613737565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fac9190613068565b60206040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffc9190613974565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016110399291906131db565b602060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108b91906139b6565b505050565b600061109a610adb565b82106110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613a55565b60405180910390fd5b819050919050565b60006110ee826121fb565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613ae7565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6111ea611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661120861126a565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613737565b60405180910390fd5b61126860006123fe565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546112a390613503565b80601f01602080910402602001604051908101604052809291908181526020018280546112cf90613503565b801561131c5780601f106112f15761010080835404028352916020019161131c565b820191906000526020600020905b8154815290600101906020018083116112ff57829003601f168201915b5050505050905090565b600d5481565b60026009541415611372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136990613b53565b60405180910390fd5b60026009819055506611c37937e0800081600d5461138e610adb565b11156113e2573481836113a19190613b73565b146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890613c19565b60405180910390fd5b5b600e60009054906101000a900460ff16611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890613c85565b60405180910390fd5b82600c548161143e610adb565b6114489190613ca5565b1115611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148090613d6d565b60405180910390fd5b8360058111156114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590613dff565b60405180910390fd5b6114d833866124c4565b50505050600160098190555050565b6114ef611b5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490613e6b565b60405180910390fd5b806006600061156a611b5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611617611b5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161165c9190612ec4565b60405180910390a35050565b611673848484611c16565b61167f848484846124e2565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590613efd565b60405180910390fd5b50505050565b600581565b60606116d482611b4f565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a906137a3565b60405180910390fd5b6117286001836117239190613ca5565b612679565b6040516020016117389190613fcb565b6040516020818303038152906040529050919050565b600c5481565b60075481565b611762611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661178061126a565b73ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613737565b60405180910390fd5b80600b60146101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60149054906101000a900460ff1680156118ea57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118829190613068565b60206040518083038186803b15801561189a57600080fd5b505afa1580156118ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d2919061402b565b73ffffffffffffffffffffffffffffffffffffffff16145b156118f9576001915050611907565b61190384846127da565b9150505b92915050565b611915611b5c565b73ffffffffffffffffffffffffffffffffffffffff1661193361126a565b73ffffffffffffffffffffffffffffffffffffffff1614611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090613737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906140ca565b60405180910390fd5b611a02816123fe565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ad057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b3857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b485750611b478261286e565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c21826121fb565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c48611b5c565b73ffffffffffffffffffffffffffffffffffffffff161480611ca45750611c6d611b5c565b73ffffffffffffffffffffffffffffffffffffffff16611c8c846108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc05750611cbf8260000151611cba611b5c565b6117f3565b5b905080611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf99061415c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b906141ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90614280565b60405180910390fd5b611df185858560016128d8565b611e016000848460000151611b64565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611e6f91906142bc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f1391906142f0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120199190613ca5565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561215f5761208f81611b4f565b1561215e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121c786868660016128de565b505050505050565b600081836121dd9190613b73565b905092915050565b600081836121f39190614365565b905092915050565b612203612dd6565b61220c82611b4f565b61224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290614408565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106122af5760017f0000000000000000000000000000000000000000000000000000000000000064846122a29190614428565b6122ac9190613ca5565b90505b60008390505b8181106123bd576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123a9578093505050506123f9565b5080806123b59061445c565b9150506122b5565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f0906144f8565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124de8282604051806020016040528060008152506128e4565b5050565b60006125038473ffffffffffffffffffffffffffffffffffffffff16612dc3565b1561266c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261252c611b5c565b8786866040518563ffffffff1660e01b815260040161254e949392919061456d565b602060405180830381600087803b15801561256857600080fd5b505af192505050801561259957506040513d601f19601f8201168201806040525081019061259691906145ce565b60015b61261c573d80600081146125c9576040519150601f19603f3d011682016040523d82523d6000602084013e6125ce565b606091505b50600081511415612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260b90613efd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612671565b600190505b949350505050565b606060008214156126c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d5565b600082905060005b600082146126f35780806126dc90613884565b915050600a826126ec9190614365565b91506126c9565b60008167ffffffffffffffff81111561270f5761270e6132e6565b5b6040519080825280601f01601f1916602001820160405280156127415781602001600182028036833780820191505090505b5090505b600085146127ce5760018261275a9190614428565b9150600a8561276991906145fb565b60306127759190613ca5565b60f81b81838151811061278b5761278a61462c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c79190614365565b9450612745565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561295a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612951906146cd565b60405180910390fd5b61296381611b4f565b156129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a90614739565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd906147cb565b60405180910390fd5b612a1360008583866128d8565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b1091906142f0565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b3791906142f0565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612da657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d4660008884886124e2565b612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c90613efd565b60405180910390fd5b8180612d9090613884565b9250508080612d9e90613884565b915050612cd5565b5080600081905550612dbb60008785886128de565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5981612e24565b8114612e6457600080fd5b50565b600081359050612e7681612e50565b92915050565b600060208284031215612e9257612e91612e1a565b5b6000612ea084828501612e67565b91505092915050565b60008115159050919050565b612ebe81612ea9565b82525050565b6000602082019050612ed96000830184612eb5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f19578082015181840152602081019050612efe565b83811115612f28576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4a82612edf565b612f548185612eea565b9350612f64818560208601612efb565b612f6d81612f2e565b840191505092915050565b60006020820190508181036000830152612f928184612f3f565b905092915050565b6000819050919050565b612fad81612f9a565b82525050565b6000602082019050612fc86000830184612fa4565b92915050565b612fd781612f9a565b8114612fe257600080fd5b50565b600081359050612ff481612fce565b92915050565b6000602082840312156130105761300f612e1a565b5b600061301e84828501612fe5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061305282613027565b9050919050565b61306281613047565b82525050565b600060208201905061307d6000830184613059565b92915050565b61308c81613047565b811461309757600080fd5b50565b6000813590506130a981613083565b92915050565b600080604083850312156130c6576130c5612e1a565b5b60006130d48582860161309a565b92505060206130e585828601612fe5565b9150509250929050565b60008060006060848603121561310857613107612e1a565b5b60006131168682870161309a565b93505060206131278682870161309a565b925050604061313886828701612fe5565b9150509250925092565b61314b81612ea9565b811461315657600080fd5b50565b60008135905061316881613142565b92915050565b60006020828403121561318457613183612e1a565b5b600061319284828501613159565b91505092915050565b600080604083850312156131b2576131b1612e1a565b5b60006131c085828601612fe5565b92505060206131d185828601612fe5565b9150509250929050565b60006040820190506131f06000830185613059565b6131fd6020830184612fa4565b9392505050565b600061320f82613047565b9050919050565b61321f81613204565b811461322a57600080fd5b50565b60008135905061323c81613216565b92915050565b60006020828403121561325857613257612e1a565b5b60006132668482850161322d565b91505092915050565b60006020828403121561328557613284612e1a565b5b60006132938482850161309a565b91505092915050565b600080604083850312156132b3576132b2612e1a565b5b60006132c18582860161309a565b92505060206132d285828601613159565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331e82612f2e565b810181811067ffffffffffffffff8211171561333d5761333c6132e6565b5b80604052505050565b6000613350612e10565b905061335c8282613315565b919050565b600067ffffffffffffffff82111561337c5761337b6132e6565b5b61338582612f2e565b9050602081019050919050565b82818337600083830152505050565b60006133b46133af84613361565b613346565b9050828152602081018484840111156133d0576133cf6132e1565b5b6133db848285613392565b509392505050565b600082601f8301126133f8576133f76132dc565b5b81356134088482602086016133a1565b91505092915050565b6000806000806080858703121561342b5761342a612e1a565b5b60006134398782880161309a565b945050602061344a8782880161309a565b935050604061345b87828801612fe5565b925050606085013567ffffffffffffffff81111561347c5761347b612e1f565b5b613488878288016133e3565b91505092959194509250565b600080604083850312156134ab576134aa612e1a565b5b60006134b98582860161309a565b92505060206134ca8582860161309a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061351b57607f821691505b6020821081141561352f5761352e6134d4565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613591602d83612eea565b915061359c82613535565b604082019050919050565b600060208201905081810360008301526135c081613584565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613623602283612eea565b915061362e826135c7565b604082019050919050565b6000602082019050818103600083015261365281613616565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006136b5603983612eea565b91506136c082613659565b604082019050919050565b600060208201905081810360008301526136e4816136a8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613721602083612eea565b915061372c826136eb565b602082019050919050565b6000602082019050818103600083015261375081613714565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061378d601183612eea565b915061379882613757565b602082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061381f602283612eea565b915061382a826137c3565b604082019050919050565b6000602082019050818103600083015261384e81613812565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061388f82612f9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138c2576138c1613855565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613929602e83612eea565b9150613934826138cd565b604082019050919050565b600060208201905081810360008301526139588161391c565b9050919050565b60008151905061396e81612fce565b92915050565b60006020828403121561398a57613989612e1a565b5b60006139988482850161395f565b91505092915050565b6000815190506139b081613142565b92915050565b6000602082840312156139cc576139cb612e1a565b5b60006139da848285016139a1565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3f602383612eea565b9150613a4a826139e3565b604082019050919050565b60006020820190508181036000830152613a6e81613a32565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613ad1602b83612eea565b9150613adc82613a75565b604082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b3d601f83612eea565b9150613b4882613b07565b602082019050919050565b60006020820190508181036000830152613b6c81613b30565b9050919050565b6000613b7e82612f9a565b9150613b8983612f9a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc257613bc1613855565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000613c03601883612eea565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b6000613c6f601783612eea565b9150613c7a82613c39565b602082019050919050565b60006020820190508181036000830152613c9e81613c62565b9050919050565b6000613cb082612f9a565b9150613cbb83612f9a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cf057613cef613855565b5b828201905092915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d57602283612eea565b9150613d6282613cfb565b604082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613de9602283612eea565b9150613df482613d8d565b604082019050919050565b60006020820190508181036000830152613e1881613ddc565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613e55601a83612eea565b9150613e6082613e1f565b602082019050919050565b60006020820190508181036000830152613e8481613e48565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613ee7603383612eea565b9150613ef282613e8b565b604082019050919050565b60006020820190508181036000830152613f1681613eda565b9050919050565b600081905092915050565b7f68747470733a2f2f6c6976652d2d2d6d657461646174612d35636f767071696a60008201527f61612d75632e612e72756e2e6170702f6d657461646174612f00000000000000602082015250565b6000613f84603983613f1d565b9150613f8f82613f28565b603982019050919050565b6000613fa582612edf565b613faf8185613f1d565b9350613fbf818560208601612efb565b80840191505092915050565b6000613fd682613f77565b9150613fe28284613f9a565b915081905092915050565b6000613ff882613047565b9050919050565b61400881613fed565b811461401357600080fd5b50565b60008151905061402581613fff565b92915050565b60006020828403121561404157614040612e1a565b5b600061404f84828501614016565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140b4602683612eea565b91506140bf82614058565b604082019050919050565b600060208201905081810360008301526140e3816140a7565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614146603283612eea565b9150614151826140ea565b604082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006141d8602683612eea565b91506141e38261417c565b604082019050919050565b60006020820190508181036000830152614207816141cb565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061426a602583612eea565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006142c7826142a0565b91506142d2836142a0565b9250828210156142e5576142e4613855565b5b828203905092915050565b60006142fb826142a0565b9150614306836142a0565b9250826fffffffffffffffffffffffffffffffff0382111561432b5761432a613855565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061437082612f9a565b915061437b83612f9a565b92508261438b5761438a614336565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006143f2602a83612eea565b91506143fd82614396565b604082019050919050565b60006020820190508181036000830152614421816143e5565b9050919050565b600061443382612f9a565b915061443e83612f9a565b92508282101561445157614450613855565b5b828203905092915050565b600061446782612f9a565b9150600082141561447b5761447a613855565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006144e2602f83612eea565b91506144ed82614486565b604082019050919050565b60006020820190508181036000830152614511816144d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061453f82614518565b6145498185614523565b9350614559818560208601612efb565b61456281612f2e565b840191505092915050565b60006080820190506145826000830187613059565b61458f6020830186613059565b61459c6040830185612fa4565b81810360608301526145ae8184614534565b905095945050505050565b6000815190506145c881612e50565b92915050565b6000602082840312156145e4576145e3612e1a565b5b60006145f2848285016145b9565b91505092915050565b600061460682612f9a565b915061461183612f9a565b92508261462157614620614336565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b7602183612eea565b91506146c28261465b565b604082019050919050565b600060208201905081810360008301526146e6816146aa565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614723601d83612eea565b915061472e826146ed565b602082019050919050565b6000602082019050818103600083015261475281614716565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b5602283612eea565b91506147c082614759565b604082019050919050565b600060208201905081810360008301526147e4816147a8565b905091905056fea2646970667358221220e48a78956ad6ab95a531c7765bf00247172275c0e901b283d25a458c253f9d0664736f6c63430008090033

Deployed Bytecode Sourcemap

55091:5480:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58722:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44310:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55529:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45835:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45398:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57990:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41145:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55633:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46685:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57822:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60250:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;41776:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58139:143;;;;;;;;;;;;;:::i;:::-;;46890:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58290:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41308:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44133:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43010:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19168:103;;;;;;;;;;;;;:::i;:::-;;18517:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44465:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55591:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56937:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46103:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47110:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55438:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59839:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55489:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51525:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57648:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59151:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19426:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58722:292;58870:4;58927:26;58912:41;;;:11;:41;;;;:94;;;;58970:36;58994:11;58970:23;:36::i;:::-;58912:94;58892:114;;58722:292;;;:::o;44310:94::-;44364:13;44393:5;44386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44310:94;:::o;55529:55::-;55573:11;55529:55;:::o;45835:204::-;45903:7;45927:16;45935:7;45927;:16::i;:::-;45919:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46009:15;:24;46025:7;46009:24;;;;;;;;;;;;;;;;;;;;;46002:31;;45835:204;;;:::o;45398:379::-;45467:13;45483:24;45499:7;45483:15;:24::i;:::-;45467:40;;45528:5;45522:11;;:2;:11;;;;45514:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45613:5;45597:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45622:37;45639:5;45646:12;:10;:12::i;:::-;45622:16;:37::i;:::-;45597:62;45581:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45743:28;45752:2;45756:7;45765:5;45743:8;:28::i;:::-;45460:317;45398:379;;:::o;57990:139::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58108:13:::1;58091:14;:30;;;;57990:139:::0;:::o;41145:94::-;41198:7;41221:12;;41214:19;;41145:94;:::o;55633:37::-;;;;;;;;;;;;;:::o;46685:142::-;46793:28;46803:4;46809:2;46813:7;46793:9;:28::i;:::-;46685:142;;;:::o;57822:158::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57953:19:::1;57932:18;;:40;;;;;;;;;;;;;;;;;;57822:158:::0;:::o;60250:318::-;60375:16;60393:21;60440:16;60448:7;60440;:16::i;:::-;60432:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60507:4;60514:45;60527:26;60540:9;60551:1;60527:12;:26::i;:::-;60555:3;60514:12;:45::i;:::-;60491:69;;;;60250:318;;;;;:::o;41776:744::-;41885:7;41920:16;41930:5;41920:9;:16::i;:::-;41912:5;:24;41904:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41982:22;42007:13;:11;:13::i;:::-;41982:38;;42027:19;42057:25;42107:9;42102:350;42126:14;42122:1;:18;42102:350;;;42156:31;42190:11;:14;42202:1;42190:14;;;;;;;;;;;42156:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42243:1;42217:28;;:9;:14;;;:28;;;42213:89;;42278:9;:14;;;42258:34;;42213:89;42335:5;42314:26;;:17;:26;;;42310:135;;;42372:5;42357:11;:20;42353:59;;;42399:1;42392:8;;;;;;;;;42353:59;42422:13;;;;;:::i;:::-;;;;42310:135;42147:305;42142:3;;;;;:::i;:::-;;;;42102:350;;;;42458:56;;;;;;;;;;:::i;:::-;;;;;;;;41776:744;;;;;:::o;58139:143::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58187:15:::1;58205:21;58187:39;;58245:10;58237:28;;:37;58266:7;58237:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58176:106;58139:143::o:0;46890:157::-;47002:39;47019:4;47025:2;47029:7;47002:39;;;;;;;;;;;;:16;:39::i;:::-;46890:157;;;:::o;58290:168::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58356:15:::1;58374:5;:15;;;58398:4;58374:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58356:48;;58415:5;:14;;;58430:10;58442:7;58415:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58345:113;58290:168:::0;:::o;41308:177::-;41375:7;41407:13;:11;:13::i;:::-;41399:5;:21;41391:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41474:5;41467:12;;41308:177;;;:::o;44133:118::-;44197:7;44220:20;44232:7;44220:11;:20::i;:::-;:25;;;44213:32;;44133:118;;;:::o;43010:211::-;43074:7;43115:1;43098:19;;:5;:19;;;;43090:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43187:12;:19;43200:5;43187:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43179:36;;43172:43;;43010:211;;;:::o;19168:103::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19233:30:::1;19260:1;19233:18;:30::i;:::-;19168:103::o:0;18517:87::-;18563:7;18590:6;;;;;;;;;;;18583:13;;18517:87;:::o;44465:98::-;44521:13;44550:7;44543:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44465:98;:::o;55591:35::-;;;;:::o;56937:321::-;10446:1;11044:7;;:19;;11036:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10446:1;11177:7;:18;;;;55573:11:::1;57077:14;56602;;56588:13;:11;:13::i;:::-;:28;56585:166;;;56678:9;56659:14;56651:5;:22;;;;:::i;:::-;56650:37;56628:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56585:166;55800:18:::2;;;;;;;;;;;55792:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;57140:14:::3;56211:9;;56176:14;56160:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:60;;56138:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;57179:14:::4;55481:1;55958:14;:34;;55936:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;57213:37:::5;57223:10;57235:14;57213:9;:37::i;:::-;56293:1:::4;55857::::3;11208::::1;;10402::::0;11356:7;:22;;;;56937:321;:::o;46103:274::-;46206:12;:10;:12::i;:::-;46194:24;;:8;:24;;;;46186:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46303:8;46258:18;:32;46277:12;:10;:12::i;:::-;46258:32;;;;;;;;;;;;;;;:42;46291:8;46258:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46352:8;46323:48;;46338:12;:10;:12::i;:::-;46323:48;;;46362:8;46323:48;;;;;;:::i;:::-;;;;;;;;46103:274;;:::o;47110:311::-;47247:28;47257:4;47263:2;47267:7;47247:9;:28::i;:::-;47298:48;47321:4;47327:2;47331:7;47340:5;47298:22;:48::i;:::-;47282:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;47110:311;;;;:::o;55438:44::-;55481:1;55438:44;:::o;59839:345::-;59957:13;59996:16;60004:7;59996;:16::i;:::-;59988:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60152:22;60161:1;60153:7;:9;;;;:::i;:::-;60152:20;:22::i;:::-;60074:101;;;;;;;;:::i;:::-;;;;;;;;;;;;;60047:129;;59839:345;;;:::o;55489:31::-;;;;:::o;51525:43::-;;;;:::o;57648:166::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57785:21:::1;57762:20;;:44;;;;;;;;;;;;;;;;;;57648:166:::0;:::o;59151:617::-;59276:4;59441:27;59499;;;;;;;;;;;59441:96;;59566:20;;;;;;;;;;;:86;;;;;59644:8;59603:49;;59611:13;:21;;;59633:5;59611:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59603:49;;;59566:86;59548:154;;;59686:4;59679:11;;;;;59548:154;59721:39;59744:5;59751:8;59721:22;:39::i;:::-;59714:46;;;59151:617;;;;;:::o;19426:201::-;18748:12;:10;:12::i;:::-;18737:23;;:7;:5;:7::i;:::-;:23;;;18729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19535:1:::1;19515:22;;:8;:22;;;;19507:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19591:28;19610:8;19591:18;:28::i;:::-;19426:201:::0;:::o;42584:370::-;42711:4;42756:25;42741:40;;;:11;:40;;;;:99;;;;42807:33;42792:48;;;:11;:48;;;;42741:99;:160;;;;42866:35;42851:50;;;:11;:50;;;;42741:160;:207;;;;42912:36;42936:11;42912:23;:36::i;:::-;42741:207;42727:221;;42584:370;;;:::o;47660:105::-;47717:4;47747:12;;47737:7;:22;47730:29;;47660:105;;;:::o;17241:98::-;17294:7;17321:10;17314:17;;17241:98;:::o;51347:172::-;51471:2;51444:15;:24;51460:7;51444:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51505:7;51501:2;51485:28;;51494:5;51485:28;;;;;;;;;;;;51347:172;;;:::o;49712:1529::-;49809:35;49847:20;49859:7;49847:11;:20::i;:::-;49809:58;;49876:22;49918:13;:18;;;49902:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;49971:12;:10;:12::i;:::-;49947:36;;:20;49959:7;49947:11;:20::i;:::-;:36;;;49902:81;:142;;;;49994:50;50011:13;:18;;;50031:12;:10;:12::i;:::-;49994:16;:50::i;:::-;49902:142;49876:169;;50070:17;50054:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;50202:4;50180:26;;:13;:18;;;:26;;;50164:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;50291:1;50277:16;;:2;:16;;;;50269:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50344:43;50366:4;50372:2;50376:7;50385:1;50344:21;:43::i;:::-;50444:49;50461:1;50465:7;50474:13;:18;;;50444:8;:49::i;:::-;50532:1;50502:12;:18;50515:4;50502:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50568:1;50540:12;:16;50553:2;50540:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50599:43;;;;;;;;50614:2;50599:43;;;;;;50625:15;50599:43;;;;;50576:11;:20;50588:7;50576:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50870:19;50902:1;50892:7;:11;;;;:::i;:::-;50870:33;;50955:1;50914:43;;:11;:24;50926:11;50914:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50910:236;;;50972:20;50980:11;50972:7;:20::i;:::-;50968:171;;;51032:97;;;;;;;;51059:13;:18;;;51032:97;;;;;;51090:13;:28;;;51032:97;;;;;51005:11;:24;51017:11;51005:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50968:171;50910:236;51178:7;51174:2;51159:27;;51168:4;51159:27;;;;;;;;;;;;51193:42;51214:4;51220:2;51224:7;51233:1;51193:20;:42::i;:::-;49802:1439;;;49712:1529;;;:::o;3742:98::-;3800:7;3831:1;3827;:5;;;;:::i;:::-;3820:12;;3742:98;;;;:::o;4141:::-;4199:7;4230:1;4226;:5;;;;:::i;:::-;4219:12;;4141:98;;;;:::o;43473:606::-;43549:21;;:::i;:::-;43590:16;43598:7;43590;:16::i;:::-;43582:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43662:26;43710:12;43699:7;:23;43695:93;;43779:1;43764:12;43754:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;43733:47;;43695:93;43801:12;43816:7;43801:22;;43796:212;43833:18;43825:4;:26;43796:212;;43870:31;43904:11;:17;43916:4;43904:17;;;;;;;;;;;43870:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43960:1;43934:28;;:9;:14;;;:28;;;43930:71;;43982:9;43975:16;;;;;;;43930:71;43861:147;43853:6;;;;;:::i;:::-;;;;43796:212;;;;44016:57;;;;;;;;;;:::i;:::-;;;;;;;;43473:606;;;;:::o;19787:191::-;19861:16;19880:6;;;;;;;;;;;19861:25;;19906:8;19897:6;;:17;;;;;;;;;;;;;;;;;;19961:8;19930:40;;19951:8;19930:40;;;;;;;;;;;;19850:128;19787:191;:::o;47771:98::-;47836:27;47846:2;47850:8;47836:27;;;;;;;;;;;;:9;:27::i;:::-;47771:98;;:::o;53062:690::-;53199:4;53216:15;:2;:13;;;:15::i;:::-;53212:535;;;53271:2;53255:36;;;53292:12;:10;:12::i;:::-;53306:4;53312:7;53321:5;53255:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53242:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53503:1;53486:6;:13;:18;53482:215;;;53519:61;;;;;;;;;;:::i;:::-;;;;;;;;53482:215;53665:6;53659:13;53650:6;53646:2;53642:15;53635:38;53242:464;53387:45;;;53377:55;;;:6;:55;;;;53370:62;;;;;53212:535;53735:4;53728:11;;53062:690;;;;;;;:::o;14803:723::-;14859:13;15089:1;15080:5;:10;15076:53;;;15107:10;;;;;;;;;;;;;;;;;;;;;15076:53;15139:12;15154:5;15139:20;;15170:14;15195:78;15210:1;15202:4;:9;15195:78;;15228:8;;;;;:::i;:::-;;;;15259:2;15251:10;;;;;:::i;:::-;;;15195:78;;;15283:19;15315:6;15305:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15283:39;;15333:154;15349:1;15340:5;:10;15333:154;;15377:1;15367:11;;;;;:::i;:::-;;;15444:2;15436:5;:10;;;;:::i;:::-;15423:2;:24;;;;:::i;:::-;15410:39;;15393:6;15400;15393:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15473:2;15464:11;;;;;:::i;:::-;;;15333:154;;;15511:6;15497:21;;;;;14803:723;;;;:::o;46440:186::-;46562:4;46585:18;:25;46604:5;46585:25;;;;;;;;;;;;;;;:35;46611:8;46585:35;;;;;;;;;;;;;;;;;;;;;;;;;46578:42;;46440:186;;;;:::o;31917:157::-;32002:4;32041:25;32026:40;;;:11;:40;;;;32019:47;;31917:157;;;:::o;54214:141::-;;;;;:::o;54741:140::-;;;;;:::o;48208:1272::-;48313:20;48336:12;;48313:35;;48377:1;48363:16;;:2;:16;;;;48355:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48554:21;48562:12;48554:7;:21::i;:::-;48553:22;48545:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48636:12;48624:8;:24;;48616:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48696:61;48726:1;48730:2;48734:12;48748:8;48696:21;:61::i;:::-;48766:30;48799:12;:16;48812:2;48799:16;;;;;;;;;;;;;;;48766:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48841:119;;;;;;;;48891:8;48861:11;:19;;;:39;;;;:::i;:::-;48841:119;;;;;;48944:8;48909:11;:24;;;:44;;;;:::i;:::-;48841:119;;;;;48822:12;:16;48835:2;48822:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48995:43;;;;;;;;49010:2;48995:43;;;;;;49021:15;48995:43;;;;;48967:11;:25;48979:12;48967:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49047:20;49070:12;49047:35;;49096:9;49091:281;49115:8;49111:1;:12;49091:281;;;49169:12;49165:2;49144:38;;49161:1;49144:38;;;;;;;;;;;;49209:59;49240:1;49244:2;49248:12;49262:5;49209:22;:59::i;:::-;49191:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;49350:14;;;;;:::i;:::-;;;;49125:3;;;;;:::i;:::-;;;;49091:281;;;;49395:12;49380;:27;;;;49414:60;49443:1;49447:2;49451:12;49465:8;49414:20;:60::i;:::-;48306:1174;;;48208:1272;;;:::o;20805:387::-;20865:4;21073:12;21140:7;21128:20;21120:28;;21183:1;21176:4;:8;21169:15;;;20805:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:118::-;3078:24;3096:5;3078:24;:::i;:::-;3073:3;3066:37;2991:118;;:::o;3115:222::-;3208:4;3246:2;3235:9;3231:18;3223:26;;3259:71;3327:1;3316:9;3312:17;3303:6;3259:71;:::i;:::-;3115:222;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:474::-;6573:6;6581;6630:2;6618:9;6609:7;6605:23;6601:32;6598:119;;;6636:79;;:::i;:::-;6598:119;6756:1;6781:53;6826:7;6817:6;6806:9;6802:22;6781:53;:::i;:::-;6771:63;;6727:117;6883:2;6909:53;6954:7;6945:6;6934:9;6930:22;6909:53;:::i;:::-;6899:63;;6854:118;6505:474;;;;;:::o;6985:332::-;7106:4;7144:2;7133:9;7129:18;7121:26;;7157:71;7225:1;7214:9;7210:17;7201:6;7157:71;:::i;:::-;7238:72;7306:2;7295:9;7291:18;7282:6;7238:72;:::i;:::-;6985:332;;;;;:::o;7323:110::-;7374:7;7403:24;7421:5;7403:24;:::i;:::-;7392:35;;7323:110;;;:::o;7439:150::-;7526:38;7558:5;7526:38;:::i;:::-;7519:5;7516:49;7506:77;;7579:1;7576;7569:12;7506:77;7439:150;:::o;7595:167::-;7655:5;7693:6;7680:20;7671:29;;7709:47;7750:5;7709:47;:::i;:::-;7595:167;;;;:::o;7768:357::-;7841:6;7890:2;7878:9;7869:7;7865:23;7861:32;7858:119;;;7896:79;;:::i;:::-;7858:119;8016:1;8041:67;8100:7;8091:6;8080:9;8076:22;8041:67;:::i;:::-;8031:77;;7987:131;7768:357;;;;:::o;8131:329::-;8190:6;8239:2;8227:9;8218:7;8214:23;8210:32;8207:119;;;8245:79;;:::i;:::-;8207:119;8365:1;8390:53;8435:7;8426:6;8415:9;8411:22;8390:53;:::i;:::-;8380:63;;8336:117;8131:329;;;;:::o;8466:468::-;8531:6;8539;8588:2;8576:9;8567:7;8563:23;8559:32;8556:119;;;8594:79;;:::i;:::-;8556:119;8714:1;8739:53;8784:7;8775:6;8764:9;8760:22;8739:53;:::i;:::-;8729:63;;8685:117;8841:2;8867:50;8909:7;8900:6;8889:9;8885:22;8867:50;:::i;:::-;8857:60;;8812:115;8466:468;;;;;:::o;8940:117::-;9049:1;9046;9039:12;9063:117;9172:1;9169;9162:12;9186:180;9234:77;9231:1;9224:88;9331:4;9328:1;9321:15;9355:4;9352:1;9345:15;9372:281;9455:27;9477:4;9455:27;:::i;:::-;9447:6;9443:40;9585:6;9573:10;9570:22;9549:18;9537:10;9534:34;9531:62;9528:88;;;9596:18;;:::i;:::-;9528:88;9636:10;9632:2;9625:22;9415:238;9372:281;;:::o;9659:129::-;9693:6;9720:20;;:::i;:::-;9710:30;;9749:33;9777:4;9769:6;9749:33;:::i;:::-;9659:129;;;:::o;9794:307::-;9855:4;9945:18;9937:6;9934:30;9931:56;;;9967:18;;:::i;:::-;9931:56;10005:29;10027:6;10005:29;:::i;:::-;9997:37;;10089:4;10083;10079:15;10071:23;;9794:307;;;:::o;10107:154::-;10191:6;10186:3;10181;10168:30;10253:1;10244:6;10239:3;10235:16;10228:27;10107:154;;;:::o;10267:410::-;10344:5;10369:65;10385:48;10426:6;10385:48;:::i;:::-;10369:65;:::i;:::-;10360:74;;10457:6;10450:5;10443:21;10495:4;10488:5;10484:16;10533:3;10524:6;10519:3;10515:16;10512:25;10509:112;;;10540:79;;:::i;:::-;10509:112;10630:41;10664:6;10659:3;10654;10630:41;:::i;:::-;10350:327;10267:410;;;;;:::o;10696:338::-;10751:5;10800:3;10793:4;10785:6;10781:17;10777:27;10767:122;;10808:79;;:::i;:::-;10767:122;10925:6;10912:20;10950:78;11024:3;11016:6;11009:4;11001:6;10997:17;10950:78;:::i;:::-;10941:87;;10757:277;10696:338;;;;:::o;11040:943::-;11135:6;11143;11151;11159;11208:3;11196:9;11187:7;11183:23;11179:33;11176:120;;;11215:79;;:::i;:::-;11176:120;11335:1;11360:53;11405:7;11396:6;11385:9;11381:22;11360:53;:::i;:::-;11350:63;;11306:117;11462:2;11488:53;11533:7;11524:6;11513:9;11509:22;11488:53;:::i;:::-;11478:63;;11433:118;11590:2;11616:53;11661:7;11652:6;11641:9;11637:22;11616:53;:::i;:::-;11606:63;;11561:118;11746:2;11735:9;11731:18;11718:32;11777:18;11769:6;11766:30;11763:117;;;11799:79;;:::i;:::-;11763:117;11904:62;11958:7;11949:6;11938:9;11934:22;11904:62;:::i;:::-;11894:72;;11689:287;11040:943;;;;;;;:::o;11989:474::-;12057:6;12065;12114:2;12102:9;12093:7;12089:23;12085:32;12082:119;;;12120:79;;:::i;:::-;12082:119;12240:1;12265:53;12310:7;12301:6;12290:9;12286:22;12265:53;:::i;:::-;12255:63;;12211:117;12367:2;12393:53;12438:7;12429:6;12418:9;12414:22;12393:53;:::i;:::-;12383:63;;12338:118;11989:474;;;;;:::o;12469:180::-;12517:77;12514:1;12507:88;12614:4;12611:1;12604:15;12638:4;12635:1;12628:15;12655:320;12699:6;12736:1;12730:4;12726:12;12716:22;;12783:1;12777:4;12773:12;12804:18;12794:81;;12860:4;12852:6;12848:17;12838:27;;12794:81;12922:2;12914:6;12911:14;12891:18;12888:38;12885:84;;;12941:18;;:::i;:::-;12885:84;12706:269;12655:320;;;:::o;12981:232::-;13121:34;13117:1;13109:6;13105:14;13098:58;13190:15;13185:2;13177:6;13173:15;13166:40;12981:232;:::o;13219:366::-;13361:3;13382:67;13446:2;13441:3;13382:67;:::i;:::-;13375:74;;13458:93;13547:3;13458:93;:::i;:::-;13576:2;13571:3;13567:12;13560:19;;13219:366;;;:::o;13591:419::-;13757:4;13795:2;13784:9;13780:18;13772:26;;13844:9;13838:4;13834:20;13830:1;13819:9;13815:17;13808:47;13872:131;13998:4;13872:131;:::i;:::-;13864:139;;13591:419;;;:::o;14016:221::-;14156:34;14152:1;14144:6;14140:14;14133:58;14225:4;14220:2;14212:6;14208:15;14201:29;14016:221;:::o;14243:366::-;14385:3;14406:67;14470:2;14465:3;14406:67;:::i;:::-;14399:74;;14482:93;14571:3;14482:93;:::i;:::-;14600:2;14595:3;14591:12;14584:19;;14243:366;;;:::o;14615:419::-;14781:4;14819:2;14808:9;14804:18;14796:26;;14868:9;14862:4;14858:20;14854:1;14843:9;14839:17;14832:47;14896:131;15022:4;14896:131;:::i;:::-;14888:139;;14615:419;;;:::o;15040:244::-;15180:34;15176:1;15168:6;15164:14;15157:58;15249:27;15244:2;15236:6;15232:15;15225:52;15040:244;:::o;15290:366::-;15432:3;15453:67;15517:2;15512:3;15453:67;:::i;:::-;15446:74;;15529:93;15618:3;15529:93;:::i;:::-;15647:2;15642:3;15638:12;15631:19;;15290:366;;;:::o;15662:419::-;15828:4;15866:2;15855:9;15851:18;15843:26;;15915:9;15909:4;15905:20;15901:1;15890:9;15886:17;15879:47;15943:131;16069:4;15943:131;:::i;:::-;15935:139;;15662:419;;;:::o;16087:182::-;16227:34;16223:1;16215:6;16211:14;16204:58;16087:182;:::o;16275:366::-;16417:3;16438:67;16502:2;16497:3;16438:67;:::i;:::-;16431:74;;16514:93;16603:3;16514:93;:::i;:::-;16632:2;16627:3;16623:12;16616:19;;16275:366;;;:::o;16647:419::-;16813:4;16851:2;16840:9;16836:18;16828:26;;16900:9;16894:4;16890:20;16886:1;16875:9;16871:17;16864:47;16928:131;17054:4;16928:131;:::i;:::-;16920:139;;16647:419;;;:::o;17072:167::-;17212:19;17208:1;17200:6;17196:14;17189:43;17072:167;:::o;17245:366::-;17387:3;17408:67;17472:2;17467:3;17408:67;:::i;:::-;17401:74;;17484:93;17573:3;17484:93;:::i;:::-;17602:2;17597:3;17593:12;17586:19;;17245:366;;;:::o;17617:419::-;17783:4;17821:2;17810:9;17806:18;17798:26;;17870:9;17864:4;17860:20;17856:1;17845:9;17841:17;17834:47;17898:131;18024:4;17898:131;:::i;:::-;17890:139;;17617:419;;;:::o;18042:221::-;18182:34;18178:1;18170:6;18166:14;18159:58;18251:4;18246:2;18238:6;18234:15;18227:29;18042:221;:::o;18269:366::-;18411:3;18432:67;18496:2;18491:3;18432:67;:::i;:::-;18425:74;;18508:93;18597:3;18508:93;:::i;:::-;18626:2;18621:3;18617:12;18610:19;;18269:366;;;:::o;18641:419::-;18807:4;18845:2;18834:9;18830:18;18822:26;;18894:9;18888:4;18884:20;18880:1;18869:9;18865:17;18858:47;18922:131;19048:4;18922:131;:::i;:::-;18914:139;;18641:419;;;:::o;19066:180::-;19114:77;19111:1;19104:88;19211:4;19208:1;19201:15;19235:4;19232:1;19225:15;19252:233;19291:3;19314:24;19332:5;19314:24;:::i;:::-;19305:33;;19360:66;19353:5;19350:77;19347:103;;;19430:18;;:::i;:::-;19347:103;19477:1;19470:5;19466:13;19459:20;;19252:233;;;:::o;19491:::-;19631:34;19627:1;19619:6;19615:14;19608:58;19700:16;19695:2;19687:6;19683:15;19676:41;19491:233;:::o;19730:366::-;19872:3;19893:67;19957:2;19952:3;19893:67;:::i;:::-;19886:74;;19969:93;20058:3;19969:93;:::i;:::-;20087:2;20082:3;20078:12;20071:19;;19730:366;;;:::o;20102:419::-;20268:4;20306:2;20295:9;20291:18;20283:26;;20355:9;20349:4;20345:20;20341:1;20330:9;20326:17;20319:47;20383:131;20509:4;20383:131;:::i;:::-;20375:139;;20102:419;;;:::o;20527:143::-;20584:5;20615:6;20609:13;20600:22;;20631:33;20658:5;20631:33;:::i;:::-;20527:143;;;;:::o;20676:351::-;20746:6;20795:2;20783:9;20774:7;20770:23;20766:32;20763:119;;;20801:79;;:::i;:::-;20763:119;20921:1;20946:64;21002:7;20993:6;20982:9;20978:22;20946:64;:::i;:::-;20936:74;;20892:128;20676:351;;;;:::o;21033:137::-;21087:5;21118:6;21112:13;21103:22;;21134:30;21158:5;21134:30;:::i;:::-;21033:137;;;;:::o;21176:345::-;21243:6;21292:2;21280:9;21271:7;21267:23;21263:32;21260:119;;;21298:79;;:::i;:::-;21260:119;21418:1;21443:61;21496:7;21487:6;21476:9;21472:22;21443:61;:::i;:::-;21433:71;;21389:125;21176:345;;;;:::o;21527:222::-;21667:34;21663:1;21655:6;21651:14;21644:58;21736:5;21731:2;21723:6;21719:15;21712:30;21527:222;:::o;21755:366::-;21897:3;21918:67;21982:2;21977:3;21918:67;:::i;:::-;21911:74;;21994:93;22083:3;21994:93;:::i;:::-;22112:2;22107:3;22103:12;22096:19;;21755:366;;;:::o;22127:419::-;22293:4;22331:2;22320:9;22316:18;22308:26;;22380:9;22374:4;22370:20;22366:1;22355:9;22351:17;22344:47;22408:131;22534:4;22408:131;:::i;:::-;22400:139;;22127:419;;;:::o;22552:230::-;22692:34;22688:1;22680:6;22676:14;22669:58;22761:13;22756:2;22748:6;22744:15;22737:38;22552:230;:::o;22788:366::-;22930:3;22951:67;23015:2;23010:3;22951:67;:::i;:::-;22944:74;;23027:93;23116:3;23027:93;:::i;:::-;23145:2;23140:3;23136:12;23129:19;;22788:366;;;:::o;23160:419::-;23326:4;23364:2;23353:9;23349:18;23341:26;;23413:9;23407:4;23403:20;23399:1;23388:9;23384:17;23377:47;23441:131;23567:4;23441:131;:::i;:::-;23433:139;;23160:419;;;:::o;23585:181::-;23725:33;23721:1;23713:6;23709:14;23702:57;23585:181;:::o;23772:366::-;23914:3;23935:67;23999:2;23994:3;23935:67;:::i;:::-;23928:74;;24011:93;24100:3;24011:93;:::i;:::-;24129:2;24124:3;24120:12;24113:19;;23772:366;;;:::o;24144:419::-;24310:4;24348:2;24337:9;24333:18;24325:26;;24397:9;24391:4;24387:20;24383:1;24372:9;24368:17;24361:47;24425:131;24551:4;24425:131;:::i;:::-;24417:139;;24144:419;;;:::o;24569:348::-;24609:7;24632:20;24650:1;24632:20;:::i;:::-;24627:25;;24666:20;24684:1;24666:20;:::i;:::-;24661:25;;24854:1;24786:66;24782:74;24779:1;24776:81;24771:1;24764:9;24757:17;24753:105;24750:131;;;24861:18;;:::i;:::-;24750:131;24909:1;24906;24902:9;24891:20;;24569:348;;;;:::o;24923:174::-;25063:26;25059:1;25051:6;25047:14;25040:50;24923:174;:::o;25103:366::-;25245:3;25266:67;25330:2;25325:3;25266:67;:::i;:::-;25259:74;;25342:93;25431:3;25342:93;:::i;:::-;25460:2;25455:3;25451:12;25444:19;;25103:366;;;:::o;25475:419::-;25641:4;25679:2;25668:9;25664:18;25656:26;;25728:9;25722:4;25718:20;25714:1;25703:9;25699:17;25692:47;25756:131;25882:4;25756:131;:::i;:::-;25748:139;;25475:419;;;:::o;25900:173::-;26040:25;26036:1;26028:6;26024:14;26017:49;25900:173;:::o;26079:366::-;26221:3;26242:67;26306:2;26301:3;26242:67;:::i;:::-;26235:74;;26318:93;26407:3;26318:93;:::i;:::-;26436:2;26431:3;26427:12;26420:19;;26079:366;;;:::o;26451:419::-;26617:4;26655:2;26644:9;26640:18;26632:26;;26704:9;26698:4;26694:20;26690:1;26679:9;26675:17;26668:47;26732:131;26858:4;26732:131;:::i;:::-;26724:139;;26451:419;;;:::o;26876:305::-;26916:3;26935:20;26953:1;26935:20;:::i;:::-;26930:25;;26969:20;26987:1;26969:20;:::i;:::-;26964:25;;27123:1;27055:66;27051:74;27048:1;27045:81;27042:107;;;27129:18;;:::i;:::-;27042:107;27173:1;27170;27166:9;27159:16;;26876:305;;;;:::o;27187:221::-;27327:34;27323:1;27315:6;27311:14;27304:58;27396:4;27391:2;27383:6;27379:15;27372:29;27187:221;:::o;27414:366::-;27556:3;27577:67;27641:2;27636:3;27577:67;:::i;:::-;27570:74;;27653:93;27742:3;27653:93;:::i;:::-;27771:2;27766:3;27762:12;27755:19;;27414:366;;;:::o;27786:419::-;27952:4;27990:2;27979:9;27975:18;27967:26;;28039:9;28033:4;28029:20;28025:1;28014:9;28010:17;28003:47;28067:131;28193:4;28067:131;:::i;:::-;28059:139;;27786:419;;;:::o;28211:221::-;28351:34;28347:1;28339:6;28335:14;28328:58;28420:4;28415:2;28407:6;28403:15;28396:29;28211:221;:::o;28438:366::-;28580:3;28601:67;28665:2;28660:3;28601:67;:::i;:::-;28594:74;;28677:93;28766:3;28677:93;:::i;:::-;28795:2;28790:3;28786:12;28779:19;;28438:366;;;:::o;28810:419::-;28976:4;29014:2;29003:9;28999:18;28991:26;;29063:9;29057:4;29053:20;29049:1;29038:9;29034:17;29027:47;29091:131;29217:4;29091:131;:::i;:::-;29083:139;;28810:419;;;:::o;29235:176::-;29375:28;29371:1;29363:6;29359:14;29352:52;29235:176;:::o;29417:366::-;29559:3;29580:67;29644:2;29639:3;29580:67;:::i;:::-;29573:74;;29656:93;29745:3;29656:93;:::i;:::-;29774:2;29769:3;29765:12;29758:19;;29417:366;;;:::o;29789:419::-;29955:4;29993:2;29982:9;29978:18;29970:26;;30042:9;30036:4;30032:20;30028:1;30017:9;30013:17;30006:47;30070:131;30196:4;30070:131;:::i;:::-;30062:139;;29789:419;;;:::o;30214:238::-;30354:34;30350:1;30342:6;30338:14;30331:58;30423:21;30418:2;30410:6;30406:15;30399:46;30214:238;:::o;30458:366::-;30600:3;30621:67;30685:2;30680:3;30621:67;:::i;:::-;30614:74;;30697:93;30786:3;30697:93;:::i;:::-;30815:2;30810:3;30806:12;30799:19;;30458:366;;;:::o;30830:419::-;30996:4;31034:2;31023:9;31019:18;31011:26;;31083:9;31077:4;31073:20;31069:1;31058:9;31054:17;31047:47;31111:131;31237:4;31111:131;:::i;:::-;31103:139;;30830:419;;;:::o;31255:148::-;31357:11;31394:3;31379:18;;31255:148;;;;:::o;31409:252::-;31549:34;31545:1;31537:6;31533:14;31526:58;31622:27;31617:2;31609:6;31605:15;31598:52;31409:252;:::o;31671:418::-;31831:3;31856:85;31938:2;31933:3;31856:85;:::i;:::-;31849:92;;31954:93;32043:3;31954:93;:::i;:::-;32076:2;32071:3;32067:12;32060:19;;31671:418;;;:::o;32099:397::-;32205:3;32237:39;32270:5;32237:39;:::i;:::-;32296:89;32378:6;32373:3;32296:89;:::i;:::-;32289:96;;32398:52;32443:6;32438:3;32431:4;32424:5;32420:16;32398:52;:::i;:::-;32479:6;32474:3;32470:16;32463:23;;32209:287;32099:397;;;;:::o;32506:557::-;32739:3;32765:148;32909:3;32765:148;:::i;:::-;32758:155;;32934:95;33025:3;33016:6;32934:95;:::i;:::-;32927:102;;33050:3;33043:10;;32506:557;;;;:::o;33073:133::-;33139:7;33172:24;33190:5;33172:24;:::i;:::-;33161:35;;33073:133;;;:::o;33216:188::-;33322:53;33369:5;33322:53;:::i;:::-;33315:5;33312:64;33302:92;;33390:1;33387;33380:12;33302:92;33216:188;:::o;33414:213::-;33500:5;33535:6;33529:13;33520:22;;33555:62;33611:5;33555:62;:::i;:::-;33414:213;;;;:::o;33637:433::-;33736:6;33789:2;33777:9;33768:7;33764:23;33760:32;33757:119;;;33795:79;;:::i;:::-;33757:119;33923:1;33952:93;34037:7;34028:6;34017:9;34013:22;33952:93;:::i;:::-;33942:103;;33890:169;33637:433;;;;:::o;34080:237::-;34224:34;34220:1;34212:6;34208:14;34201:58;34297:8;34292:2;34284:6;34280:15;34273:33;34080:237;:::o;34327:382::-;34469:3;34494:67;34558:2;34553:3;34494:67;:::i;:::-;34487:74;;34574:93;34663:3;34574:93;:::i;:::-;34696:2;34691:3;34687:12;34680:19;;34327:382;;;:::o;34719:435::-;34885:4;34927:2;34916:9;34912:18;34904:26;;34980:9;34974:4;34970:20;34966:1;34955:9;34951:17;34944:47;35012:131;35138:4;35012:131;:::i;:::-;35004:139;;34719:435;;;:::o;35164:249::-;35308:34;35304:1;35296:6;35292:14;35285:58;35381:20;35376:2;35368:6;35364:15;35357:45;35164:249;:::o;35423:382::-;35565:3;35590:67;35654:2;35649:3;35590:67;:::i;:::-;35583:74;;35670:93;35759:3;35670:93;:::i;:::-;35792:2;35787:3;35783:12;35776:19;;35423:382;;;:::o;35815:435::-;35981:4;36023:2;36012:9;36008:18;36000:26;;36076:9;36070:4;36066:20;36062:1;36051:9;36047:17;36040:47;36108:131;36234:4;36108:131;:::i;:::-;36100:139;;35815:435;;;:::o;36260:237::-;36404:34;36400:1;36392:6;36388:14;36381:58;36477:8;36472:2;36464:6;36460:15;36453:33;36260:237;:::o;36507:382::-;36649:3;36674:67;36738:2;36733:3;36674:67;:::i;:::-;36667:74;;36754:93;36843:3;36754:93;:::i;:::-;36876:2;36871:3;36867:12;36860:19;;36507:382;;;:::o;36899:435::-;37065:4;37107:2;37096:9;37092:18;37084:26;;37160:9;37154:4;37150:20;37146:1;37135:9;37131:17;37124:47;37192:131;37318:4;37192:131;:::i;:::-;37184:139;;36899:435;;;:::o;37344:236::-;37488:34;37484:1;37476:6;37472:14;37465:58;37561:7;37556:2;37548:6;37544:15;37537:32;37344:236;:::o;37590:382::-;37732:3;37757:67;37821:2;37816:3;37757:67;:::i;:::-;37750:74;;37837:93;37926:3;37837:93;:::i;:::-;37959:2;37954:3;37950:12;37943:19;;37590:382;;;:::o;37982:435::-;38148:4;38190:2;38179:9;38175:18;38167:26;;38243:9;38237:4;38233:20;38229:1;38218:9;38214:17;38207:47;38275:131;38401:4;38275:131;:::i;:::-;38267:139;;37982:435;;;:::o;38427:126::-;38464:7;38508:34;38501:5;38497:46;38486:57;;38427:126;;;:::o;38563:211::-;38603:4;38627:20;38645:1;38627:20;:::i;:::-;38622:25;;38665:20;38683:1;38665:20;:::i;:::-;38660:25;;38708:1;38705;38702:8;38699:34;;;38713:18;;:::i;:::-;38699:34;38762:1;38759;38755:9;38747:17;;38563:211;;;;:::o;38784:297::-;38824:3;38847:20;38865:1;38847:20;:::i;:::-;38842:25;;38885:20;38903:1;38885:20;:::i;:::-;38880:25;;39015:1;38979:34;38975:42;38972:1;38969:49;38966:75;;;39021:18;;:::i;:::-;38966:75;39069:1;39066;39062:9;39055:16;;38784:297;;;;:::o;39091:196::-;39143:77;39140:1;39133:88;39244:4;39241:1;39234:15;39272:4;39269:1;39262:15;39297:205;39337:1;39358:20;39376:1;39358:20;:::i;:::-;39353:25;;39396:20;39414:1;39396:20;:::i;:::-;39391:25;;39439:1;39429:35;;39444:18;;:::i;:::-;39429:35;39490:1;39487;39483:9;39478:14;;39297:205;;;;:::o;39512:241::-;39656:34;39652:1;39644:6;39640:14;39633:58;39729:12;39724:2;39716:6;39712:15;39705:37;39512:241;:::o;39763:382::-;39905:3;39930:67;39994:2;39989:3;39930:67;:::i;:::-;39923:74;;40010:93;40099:3;40010:93;:::i;:::-;40132:2;40127:3;40123:12;40116:19;;39763:382;;;:::o;40155:435::-;40321:4;40363:2;40352:9;40348:18;40340:26;;40416:9;40410:4;40406:20;40402:1;40391:9;40387:17;40380:47;40448:131;40574:4;40448:131;:::i;:::-;40440:139;;40155:435;;;:::o;40600:211::-;40640:4;40664:20;40682:1;40664:20;:::i;:::-;40659:25;;40702:20;40720:1;40702:20;:::i;:::-;40697:25;;40745:1;40742;40739:8;40736:34;;;40750:18;;:::i;:::-;40736:34;40799:1;40796;40792:9;40784:17;;40600:211;;;;:::o;40821:187::-;40860:3;40887:24;40905:5;40887:24;:::i;:::-;40878:33;;40937:4;40930:5;40927:15;40924:41;;;40945:18;;:::i;:::-;40924:41;40996:1;40989:5;40985:13;40978:20;;40821:187;;;:::o;41018:246::-;41162:34;41158:1;41150:6;41146:14;41139:58;41235:17;41230:2;41222:6;41218:15;41211:42;41018:246;:::o;41274:382::-;41416:3;41441:67;41505:2;41500:3;41441:67;:::i;:::-;41434:74;;41521:93;41610:3;41521:93;:::i;:::-;41643:2;41638:3;41634:12;41627:19;;41274:382;;;:::o;41666:435::-;41832:4;41874:2;41863:9;41859:18;41851:26;;41927:9;41921:4;41917:20;41913:1;41902:9;41898:17;41891:47;41959:131;42085:4;41959:131;:::i;:::-;41951:139;;41666:435;;;:::o;42111:106::-;42162:6;42200:5;42194:12;42184:22;;42111:106;;;:::o;42227:180::-;42310:11;42348:6;42343:3;42336:19;42392:4;42387:3;42383:14;42368:29;;42227:180;;;;:::o;42417:380::-;42503:3;42535:38;42567:5;42535:38;:::i;:::-;42593:70;42656:6;42651:3;42593:70;:::i;:::-;42586:77;;42676:52;42721:6;42716:3;42709:4;42702:5;42698:16;42676:52;:::i;:::-;42757:29;42779:6;42757:29;:::i;:::-;42752:3;42748:39;42741:46;;42507:290;42417:380;;;;:::o;42807:668::-;43002:4;43044:3;43033:9;43029:19;43021:27;;43062:71;43130:1;43119:9;43115:17;43106:6;43062:71;:::i;:::-;43147:72;43215:2;43204:9;43200:18;43191:6;43147:72;:::i;:::-;43233;43301:2;43290:9;43286:18;43277:6;43233:72;:::i;:::-;43356:9;43350:4;43346:20;43341:2;43330:9;43326:18;43319:48;43388:76;43459:4;43450:6;43388:76;:::i;:::-;43380:84;;42807:668;;;;;;;:::o;43485:153::-;43541:5;43576:6;43570:13;43561:22;;43596:32;43622:5;43596:32;:::i;:::-;43485:153;;;;:::o;43648:373::-;43717:6;43770:2;43758:9;43749:7;43745:23;43741:32;43738:119;;;43776:79;;:::i;:::-;43738:119;43904:1;43933:63;43988:7;43979:6;43968:9;43964:22;43933:63;:::i;:::-;43923:73;;43871:139;43648:373;;;;:::o;44031:196::-;44063:1;44084:20;44102:1;44084:20;:::i;:::-;44079:25;;44122:20;44140:1;44122:20;:::i;:::-;44117:25;;44165:1;44155:35;;44170:18;;:::i;:::-;44155:35;44215:1;44212;44208:9;44203:14;;44031:196;;;;:::o;44237:::-;44289:77;44286:1;44279:88;44390:4;44387:1;44380:15;44418:4;44415:1;44408:15;44443:232;44587:34;44583:1;44575:6;44571:14;44564:58;44660:3;44655:2;44647:6;44643:15;44636:28;44443:232;:::o;44685:382::-;44827:3;44852:67;44916:2;44911:3;44852:67;:::i;:::-;44845:74;;44932:93;45021:3;44932:93;:::i;:::-;45054:2;45049:3;45045:12;45038:19;;44685:382;;;:::o;45077:435::-;45243:4;45285:2;45274:9;45270:18;45262:26;;45338:9;45332:4;45328:20;45324:1;45313:9;45309:17;45302:47;45370:131;45496:4;45370:131;:::i;:::-;45362:139;;45077:435;;;:::o;45522:187::-;45666:31;45662:1;45654:6;45650:14;45643:55;45522:187;:::o;45719:382::-;45861:3;45886:67;45950:2;45945:3;45886:67;:::i;:::-;45879:74;;45966:93;46055:3;45966:93;:::i;:::-;46088:2;46083:3;46079:12;46072:19;;45719:382;;;:::o;46111:435::-;46277:4;46319:2;46308:9;46304:18;46296:26;;46372:9;46366:4;46362:20;46358:1;46347:9;46343:17;46336:47;46404:131;46530:4;46404:131;:::i;:::-;46396:139;;46111:435;;;:::o;46556:233::-;46700:34;46696:1;46688:6;46684:14;46677:58;46773:4;46768:2;46760:6;46756:15;46749:29;46556:233;:::o;46799:382::-;46941:3;46966:67;47030:2;47025:3;46966:67;:::i;:::-;46959:74;;47046:93;47135:3;47046:93;:::i;:::-;47168:2;47163:3;47159:12;47152:19;;46799:382;;;:::o;47191:435::-;47357:4;47399:2;47388:9;47384:18;47376:26;;47452:9;47446:4;47442:20;47438:1;47427:9;47423:17;47416:47;47484:131;47610:4;47484:131;:::i;:::-;47476:139;;47191:435;;;:::o

Swarm Source

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