ETH Price: $2,523.25 (-5.06%)
Gas: 5.97 Gwei

Token

Powerphant (PwP)
 

Overview

Max Total Supply

1,000 PwP

Holders

7

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Powerphant: Deployer
Balance
994 PwP
0xeD5c00132ae1Ec02A4EfaE1B4dd8fb84E969E347
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:
Powerphant

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 18 : Powerphant.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721Tradable.sol";

/**
 * @title Powerphant
 * Powerphant - 
 */
contract Powerphant is ERC721Tradable {
    // Base token URI
    string private _baseTokenURI;

    constructor()
        ERC721Tradable("Powerphant", "PwP")
    {
        _baseTokenURI = "ipfs://bafybeibfqmqlivk2w23rkakssnj265ul7lhn6mdgdf57x7ubkd5vvslwae/";
    }

    function baseTokenURI() override public view returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseTokenURI(string memory _uri) public onlyOwner {
        _baseTokenURI = _uri;
    }
}

File 2 of 18 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 3 of 18 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 4 of 18 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @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 5 of 18 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// 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 6 of 18 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @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 7 of 18 : Address.sol
// SPDX-License-Identifier: MIT
// 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 8 of 18 : Context.sol
// SPDX-License-Identifier: MIT
// 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 9 of 18 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 10 of 18 : Strings.sol
// SPDX-License-Identifier: MIT
// 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 11 of 18 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 12 of 18 : IERC165.sol
// SPDX-License-Identifier: MIT
// 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 13 of 18 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 14 of 18 : ERC721Tradable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

import "./common/meta-transactions/ContentMixin.sol";
import "./common/meta-transactions/NativeMetaTransaction.sol";

/**
 * @title ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ERC721, ContextMixin, NativeMetaTransaction, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    /**
     * We rely on the OZ Counter util to keep track of the next available ID.
     * We track the nextTokenId instead of the currentTokenId to save users on gas costs. 
     * Read more about it here: https://shiny.mirror.xyz/OUampBbIz9ebEicfGnQf5At_ReMHlZy0tB4glb9xQ0E
     */ 
    Counters.Counter private _nextTokenId;

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC721(_name, _symbol) {
        // nextTokenId is initialized to 1, since starting at 0 leads to higher gas cost for the first minter
        _nextTokenId.increment();
        _initializeEIP712(_name);
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function mintTo(address _to) public onlyOwner {
        uint256 currentTokenId = _nextTokenId.current();
        _nextTokenId.increment();
        _safeMint(_to, currentTokenId);
    }

    /**
        @dev Returns the total tokens minted so far.
        1 is always subtracted from the Counter since it tracks the next available tokenId.
     */
    function totalSupply() public view returns (uint256) {
        return _nextTokenId.current() - 1;
    }

    function baseTokenURI() virtual public view returns (string memory);

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)));
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender()
        internal
        override
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }
}

File 15 of 18 : ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 16 of 18 : EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 17 of 18 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 18 of 18 : NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {SafeMath} from  "@openzeppelin/contracts/utils/math/SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "london",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600660006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600a81526020017f506f7765727068616e74000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f507750000000000000000000000000000000000000000000000000000000000081525081818160009080519060200190620000b392919062000439565b508060019080519060200190620000cc92919062000439565b505050620000ef620000e36200015160201b60201c565b6200016d60201b60201c565b62000106600a6200023360201b620013681760201c565b62000117826200024960201b60201c565b50506040518060800160405280604381526020016200422160439139600b90805190602001906200014a92919062000439565b506200068d565b600062000168620002cb60201b6200137e1760201c565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600660009054906101000a900460ff16156200029c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000293906200054a565b60405180910390fd5b620002ad816200037d60201b60201c565b6001600660006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036200037657600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506200037a565b3390505b90565b6040518060800160405280604f8152602001620041d2604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620003f46200042c60201b60201c565b60001b6040516020016200040d959493929190620005cc565b6040516020818303038152906040528051906020012060078190555050565b6000804690508091505090565b828054620004479062000658565b90600052602060002090601f0160209004810192826200046b5760008555620004b7565b82601f106200048657805160ff1916838001178555620004b7565b82800160010185558215620004b7579182015b82811115620004b657825182559160200191906001019062000499565b5b509050620004c69190620004ca565b5090565b5b80821115620004e5576000816000905550600101620004cb565b5090565b600082825260208201905092915050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b600062000532600e83620004e9565b91506200053f82620004fa565b602082019050919050565b60006020820190508181036000830152620005658162000523565b9050919050565b6000819050919050565b62000581816200056c565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005b48262000587565b9050919050565b620005c681620005a7565b82525050565b600060a082019050620005e3600083018862000576565b620005f2602083018762000576565b62000601604083018662000576565b620006106060830185620005bb565b6200061f608083018462000576565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200067157607f821691505b60208210810362000687576200068662000629565b5b50919050565b613b35806200069d6000396000f3fe6080604052600436106101665760003560e01c806342842e0e116100d157806395d89b411161008a578063c87b56dd11610064578063c87b56dd1461052f578063d547cfb71461056c578063e985e9c514610597578063f2fde38b146105d457610166565b806395d89b41146104b2578063a22cb465146104dd578063b88d4fde1461050657610166565b806342842e0e146103a45780636352211e146103cd57806370a082311461040a578063715018a614610447578063755edd171461045e5780638da5cb5b1461048757610166565b806318160ddd1161012357806318160ddd1461029457806320379ee5146102bf57806323b872dd146102ea5780632d0335ab1461031357806330176e13146103505780633408e4701461037957610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b3146102105780630c53c51c146102395780630f7e597014610269575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906123e0565b6105fd565b60405161019f9190612428565b60405180910390f35b3480156101b457600080fd5b506101bd6106df565b6040516101ca91906124dc565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612534565b610771565b60405161020791906125a2565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906125e9565b6107f6565b005b610253600480360381019061024e91906127cd565b61090d565b60405161026091906128b9565b60405180910390f35b34801561027557600080fd5b5061027e610b7f565b60405161028b91906124dc565b60405180910390f35b3480156102a057600080fd5b506102a9610bb8565b6040516102b691906128ea565b60405180910390f35b3480156102cb57600080fd5b506102d4610bd5565b6040516102e19190612914565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c919061292f565b610bdf565b005b34801561031f57600080fd5b5061033a60048036038101906103359190612982565b610c3f565b60405161034791906128ea565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190612a50565b610c88565b005b34801561038557600080fd5b5061038e610d1e565b60405161039b91906128ea565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c6919061292f565b610d2b565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190612534565b610d4b565b60405161040191906125a2565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c9190612982565b610dfc565b60405161043e91906128ea565b60405180910390f35b34801561045357600080fd5b5061045c610eb3565b005b34801561046a57600080fd5b5061048560048036038101906104809190612982565b610f3b565b005b34801561049357600080fd5b5061049c610fdd565b6040516104a991906125a2565b60405180910390f35b3480156104be57600080fd5b506104c7611007565b6040516104d491906124dc565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff9190612ac5565b611099565b005b34801561051257600080fd5b5061052d60048036038101906105289190612b05565b6110af565b005b34801561053b57600080fd5b5061055660048036038101906105519190612534565b611111565b60405161056391906124dc565b60405180910390f35b34801561057857600080fd5b5061058161114b565b60405161058e91906124dc565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b99190612b88565b6111dd565b6040516105cb9190612428565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190612982565b611271565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106d857506106d78261142e565b5b9050919050565b6060600080546106ee90612bf7565b80601f016020809104026020016040519081016040528092919081815260200182805461071a90612bf7565b80156107675780601f1061073c57610100808354040283529160200191610767565b820191906000526020600020905b81548152906001019060200180831161074a57829003601f168201915b5050505050905090565b600061077c82611498565b6107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290612c9a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080182610d4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890612d2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610890611504565b73ffffffffffffffffffffffffffffffffffffffff1614806108bf57506108be816108b9611504565b6111dd565b5b6108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590612dbe565b60405180910390fd5b6109088383611513565b505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815250905061099087828787876115cc565b6109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690612e50565b60405180910390fd5b610a226001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d490919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610a9893929190612e91565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610acd929190612f53565b604051602081830303815290604052604051610ae99190612f7b565b6000604051808303816000865af19150503d8060008114610b26576040519150601f19603f3d011682016040523d82523d6000602084013e610b2b565b606091505b509150915081610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612fde565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60006001610bc6600a6116ea565b610bd0919061302d565b905090565b6000600754905090565b610bf0610bea611504565b826116f8565b610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c26906130d3565b60405180910390fd5b610c3a8383836117d6565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c90611504565b73ffffffffffffffffffffffffffffffffffffffff16610cae610fdd565b73ffffffffffffffffffffffffffffffffffffffff1614610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb9061313f565b60405180910390fd5b80600b9080519060200190610d1a9291906122d1565b5050565b6000804690508091505090565b610d46838383604051806020016040528060008152506110af565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906131d1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390613263565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ebb611504565b73ffffffffffffffffffffffffffffffffffffffff16610ed9610fdd565b73ffffffffffffffffffffffffffffffffffffffff1614610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f269061313f565b60405180910390fd5b610f396000611a3c565b565b610f43611504565b73ffffffffffffffffffffffffffffffffffffffff16610f61610fdd565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae9061313f565b60405180910390fd5b6000610fc3600a6116ea565b9050610fcf600a611368565b610fd98282611b02565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461101690612bf7565b80601f016020809104026020016040519081016040528092919081815260200182805461104290612bf7565b801561108f5780601f106110645761010080835404028352916020019161108f565b820191906000526020600020905b81548152906001019060200180831161107257829003601f168201915b5050505050905090565b6110ab6110a4611504565b8383611b20565b5050565b6110c06110ba611504565b836116f8565b6110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f6906130d3565b60405180910390fd5b61110b84848484611c8c565b50505050565b606061111b61114b565b61112483611ce8565b6040516020016111359291906132bf565b6040516020818303038152906040529050919050565b6060600b805461115a90612bf7565b80601f016020809104026020016040519081016040528092919081815260200182805461118690612bf7565b80156111d35780601f106111a8576101008083540402835291602001916111d3565b820191906000526020600020905b8154815290600101906020018083116111b657829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611279611504565b73ffffffffffffffffffffffffffffffffffffffff16611297610fdd565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e49061313f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390613355565b60405180910390fd5b61136581611a3c565b50565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361142757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061142b565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061150e61137e565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661158683610d4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff160361163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906133e7565b60405180910390fd5b600161164f61164a87611e48565b611eb0565b8386866040516000815260200160405260405161166f9493929190613416565b6020604051602081039080840390855afa158015611691573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600081836116e2919061345b565b905092915050565b600081600001549050919050565b600061170382611498565b611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613523565b60405180910390fd5b600061174d83610d4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061178f575061178e81856111dd565b5b806117cd57508373ffffffffffffffffffffffffffffffffffffffff166117b584610771565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117f682610d4b565b73ffffffffffffffffffffffffffffffffffffffff161461184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906135b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613647565b60405180910390fd5b6118c6838383611ee9565b6118d1600082611513565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611921919061302d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611978919061345b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a37838383611eee565b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b1c828260405180602001604052806000815250611ef3565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906136b3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c7f9190612428565b60405180910390a3505050565b611c978484846117d6565b611ca384848484611f4e565b611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd990613745565b60405180910390fd5b50505050565b606060008203611d2f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e43565b600082905060005b60008214611d61578080611d4a90613765565b915050600a82611d5a91906137dc565b9150611d37565b60008167ffffffffffffffff811115611d7d57611d7c612633565b5b6040519080825280601f01601f191660200182016040528015611daf5781602001600182028036833780820191505090505b5090505b60008514611e3c57600182611dc8919061302d565b9150600a85611dd7919061380d565b6030611de3919061345b565b60f81b818381518110611df957611df861383e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e3591906137dc565b9450611db3565b8093505050505b919050565b6000604051806080016040528060438152602001613abd604391398051906020012082600001518360200151846040015180519060200120604051602001611e93949392919061386d565b604051602081830303815290604052805190602001209050919050565b6000611eba610bd5565b82604051602001611ecc92919061391f565b604051602081830303815290604052805190602001209050919050565b505050565b505050565b611efd83836120d5565b611f0a6000848484611f4e565b611f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4090613745565b60405180910390fd5b505050565b6000611f6f8473ffffffffffffffffffffffffffffffffffffffff166122ae565b156120c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f98611504565b8786866040518563ffffffff1660e01b8152600401611fba9493929190613956565b6020604051808303816000875af1925050508015611ff657506040513d601f19601f82011682018060405250810190611ff391906139b7565b60015b612078573d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b506000815103612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790613745565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506120cd565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90613a30565b60405180910390fd5b61214d81611498565b1561218d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218490613a9c565b60405180910390fd5b61219960008383611ee9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e9919061345b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122aa60008383611eee565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546122dd90612bf7565b90600052602060002090601f0160209004810192826122ff5760008555612346565b82601f1061231857805160ff1916838001178555612346565b82800160010185558215612346579182015b8281111561234557825182559160200191906001019061232a565b5b5090506123539190612357565b5090565b5b80821115612370576000816000905550600101612358565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6123bd81612388565b81146123c857600080fd5b50565b6000813590506123da816123b4565b92915050565b6000602082840312156123f6576123f561237e565b5b6000612404848285016123cb565b91505092915050565b60008115159050919050565b6124228161240d565b82525050565b600060208201905061243d6000830184612419565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561247d578082015181840152602081019050612462565b8381111561248c576000848401525b50505050565b6000601f19601f8301169050919050565b60006124ae82612443565b6124b8818561244e565b93506124c881856020860161245f565b6124d181612492565b840191505092915050565b600060208201905081810360008301526124f681846124a3565b905092915050565b6000819050919050565b612511816124fe565b811461251c57600080fd5b50565b60008135905061252e81612508565b92915050565b60006020828403121561254a5761254961237e565b5b60006125588482850161251f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061258c82612561565b9050919050565b61259c81612581565b82525050565b60006020820190506125b76000830184612593565b92915050565b6125c681612581565b81146125d157600080fd5b50565b6000813590506125e3816125bd565b92915050565b60008060408385031215612600576125ff61237e565b5b600061260e858286016125d4565b925050602061261f8582860161251f565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61266b82612492565b810181811067ffffffffffffffff8211171561268a57612689612633565b5b80604052505050565b600061269d612374565b90506126a98282612662565b919050565b600067ffffffffffffffff8211156126c9576126c8612633565b5b6126d282612492565b9050602081019050919050565b82818337600083830152505050565b60006127016126fc846126ae565b612693565b90508281526020810184848401111561271d5761271c61262e565b5b6127288482856126df565b509392505050565b600082601f83011261274557612744612629565b5b81356127558482602086016126ee565b91505092915050565b6000819050919050565b6127718161275e565b811461277c57600080fd5b50565b60008135905061278e81612768565b92915050565b600060ff82169050919050565b6127aa81612794565b81146127b557600080fd5b50565b6000813590506127c7816127a1565b92915050565b600080600080600060a086880312156127e9576127e861237e565b5b60006127f7888289016125d4565b955050602086013567ffffffffffffffff81111561281857612817612383565b5b61282488828901612730565b94505060406128358882890161277f565b93505060606128468882890161277f565b9250506080612857888289016127b8565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b600061288b82612864565b612895818561286f565b93506128a581856020860161245f565b6128ae81612492565b840191505092915050565b600060208201905081810360008301526128d38184612880565b905092915050565b6128e4816124fe565b82525050565b60006020820190506128ff60008301846128db565b92915050565b61290e8161275e565b82525050565b60006020820190506129296000830184612905565b92915050565b6000806000606084860312156129485761294761237e565b5b6000612956868287016125d4565b9350506020612967868287016125d4565b92505060406129788682870161251f565b9150509250925092565b6000602082840312156129985761299761237e565b5b60006129a6848285016125d4565b91505092915050565b600067ffffffffffffffff8211156129ca576129c9612633565b5b6129d382612492565b9050602081019050919050565b60006129f36129ee846129af565b612693565b905082815260208101848484011115612a0f57612a0e61262e565b5b612a1a8482856126df565b509392505050565b600082601f830112612a3757612a36612629565b5b8135612a478482602086016129e0565b91505092915050565b600060208284031215612a6657612a6561237e565b5b600082013567ffffffffffffffff811115612a8457612a83612383565b5b612a9084828501612a22565b91505092915050565b612aa28161240d565b8114612aad57600080fd5b50565b600081359050612abf81612a99565b92915050565b60008060408385031215612adc57612adb61237e565b5b6000612aea858286016125d4565b9250506020612afb85828601612ab0565b9150509250929050565b60008060008060808587031215612b1f57612b1e61237e565b5b6000612b2d878288016125d4565b9450506020612b3e878288016125d4565b9350506040612b4f8782880161251f565b925050606085013567ffffffffffffffff811115612b7057612b6f612383565b5b612b7c87828801612730565b91505092959194509250565b60008060408385031215612b9f57612b9e61237e565b5b6000612bad858286016125d4565b9250506020612bbe858286016125d4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c0f57607f821691505b602082108103612c2257612c21612bc8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c84602c8361244e565b9150612c8f82612c28565b604082019050919050565b60006020820190508181036000830152612cb381612c77565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d1660218361244e565b9150612d2182612cba565b604082019050919050565b60006020820190508181036000830152612d4581612d09565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612da860388361244e565b9150612db382612d4c565b604082019050919050565b60006020820190508181036000830152612dd781612d9b565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e3a60218361244e565b9150612e4582612dde565b604082019050919050565b60006020820190508181036000830152612e6981612e2d565b9050919050565b6000612e7b82612561565b9050919050565b612e8b81612e70565b82525050565b6000606082019050612ea66000830186612593565b612eb36020830185612e82565b8181036040830152612ec58184612880565b9050949350505050565b600081905092915050565b6000612ee582612864565b612eef8185612ecf565b9350612eff81856020860161245f565b80840191505092915050565b60008160601b9050919050565b6000612f2382612f0b565b9050919050565b6000612f3582612f18565b9050919050565b612f4d612f4882612581565b612f2a565b82525050565b6000612f5f8285612eda565b9150612f6b8284612f3c565b6014820191508190509392505050565b6000612f878284612eda565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000612fc8601c8361244e565b9150612fd382612f92565b602082019050919050565b60006020820190508181036000830152612ff781612fbb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613038826124fe565b9150613043836124fe565b92508282101561305657613055612ffe565b5b828203905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006130bd60318361244e565b91506130c882613061565b604082019050919050565b600060208201905081810360008301526130ec816130b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061312960208361244e565b9150613134826130f3565b602082019050919050565b600060208201905081810360008301526131588161311c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006131bb60298361244e565b91506131c68261315f565b604082019050919050565b600060208201905081810360008301526131ea816131ae565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061324d602a8361244e565b9150613258826131f1565b604082019050919050565b6000602082019050818103600083015261327c81613240565b9050919050565b600081905092915050565b600061329982612443565b6132a38185613283565b93506132b381856020860161245f565b80840191505092915050565b60006132cb828561328e565b91506132d7828461328e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061333f60268361244e565b915061334a826132e3565b604082019050919050565b6000602082019050818103600083015261336e81613332565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b60006133d160258361244e565b91506133dc82613375565b604082019050919050565b60006020820190508181036000830152613400816133c4565b9050919050565b61341081612794565b82525050565b600060808201905061342b6000830187612905565b6134386020830186613407565b6134456040830185612905565b6134526060830184612905565b95945050505050565b6000613466826124fe565b9150613471836124fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134a6576134a5612ffe565b5b828201905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061350d602c8361244e565b9150613518826134b1565b604082019050919050565b6000602082019050818103600083015261353c81613500565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061359f60258361244e565b91506135aa82613543565b604082019050919050565b600060208201905081810360008301526135ce81613592565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061363160248361244e565b915061363c826135d5565b604082019050919050565b6000602082019050818103600083015261366081613624565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061369d60198361244e565b91506136a882613667565b602082019050919050565b600060208201905081810360008301526136cc81613690565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061372f60328361244e565b915061373a826136d3565b604082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b6000613770826124fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137a2576137a1612ffe565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137e7826124fe565b91506137f2836124fe565b925082613802576138016137ad565b5b828204905092915050565b6000613818826124fe565b9150613823836124fe565b925082613833576138326137ad565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190506138826000830187612905565b61388f60208301866128db565b61389c6040830185612593565b6138a96060830184612905565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006138e8600283613283565b91506138f3826138b2565b600282019050919050565b6000819050919050565b6139196139148261275e565b6138fe565b82525050565b600061392a826138db565b91506139368285613908565b6020820191506139468284613908565b6020820191508190509392505050565b600060808201905061396b6000830187612593565b6139786020830186612593565b61398560408301856128db565b81810360608301526139978184612880565b905095945050505050565b6000815190506139b1816123b4565b92915050565b6000602082840312156139cd576139cc61237e565b5b60006139db848285016139a2565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613a1a60208361244e565b9150613a25826139e4565b602082019050919050565b60006020820190508181036000830152613a4981613a0d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613a86601c8361244e565b9150613a9182613a50565b602082019050919050565b60006020820190508181036000830152613ab581613a79565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220c4744c62ef09131842fe7a24f66bd6c38180ca75898aa88ab7676fd55deed22e64736f6c634300080d0033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429697066733a2f2f626166796265696266716d716c69766b32773233726b616b73736e6a323635756c376c686e366d646764663537783775626b64357676736c7761652f

Deployed Bytecode

0x6080604052600436106101665760003560e01c806342842e0e116100d157806395d89b411161008a578063c87b56dd11610064578063c87b56dd1461052f578063d547cfb71461056c578063e985e9c514610597578063f2fde38b146105d457610166565b806395d89b41146104b2578063a22cb465146104dd578063b88d4fde1461050657610166565b806342842e0e146103a45780636352211e146103cd57806370a082311461040a578063715018a614610447578063755edd171461045e5780638da5cb5b1461048757610166565b806318160ddd1161012357806318160ddd1461029457806320379ee5146102bf57806323b872dd146102ea5780632d0335ab1461031357806330176e13146103505780633408e4701461037957610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b3146102105780630c53c51c146102395780630f7e597014610269575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906123e0565b6105fd565b60405161019f9190612428565b60405180910390f35b3480156101b457600080fd5b506101bd6106df565b6040516101ca91906124dc565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612534565b610771565b60405161020791906125a2565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906125e9565b6107f6565b005b610253600480360381019061024e91906127cd565b61090d565b60405161026091906128b9565b60405180910390f35b34801561027557600080fd5b5061027e610b7f565b60405161028b91906124dc565b60405180910390f35b3480156102a057600080fd5b506102a9610bb8565b6040516102b691906128ea565b60405180910390f35b3480156102cb57600080fd5b506102d4610bd5565b6040516102e19190612914565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c919061292f565b610bdf565b005b34801561031f57600080fd5b5061033a60048036038101906103359190612982565b610c3f565b60405161034791906128ea565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190612a50565b610c88565b005b34801561038557600080fd5b5061038e610d1e565b60405161039b91906128ea565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c6919061292f565b610d2b565b005b3480156103d957600080fd5b506103f460048036038101906103ef9190612534565b610d4b565b60405161040191906125a2565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c9190612982565b610dfc565b60405161043e91906128ea565b60405180910390f35b34801561045357600080fd5b5061045c610eb3565b005b34801561046a57600080fd5b5061048560048036038101906104809190612982565b610f3b565b005b34801561049357600080fd5b5061049c610fdd565b6040516104a991906125a2565b60405180910390f35b3480156104be57600080fd5b506104c7611007565b6040516104d491906124dc565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff9190612ac5565b611099565b005b34801561051257600080fd5b5061052d60048036038101906105289190612b05565b6110af565b005b34801561053b57600080fd5b5061055660048036038101906105519190612534565b611111565b60405161056391906124dc565b60405180910390f35b34801561057857600080fd5b5061058161114b565b60405161058e91906124dc565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b99190612b88565b6111dd565b6040516105cb9190612428565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190612982565b611271565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106d857506106d78261142e565b5b9050919050565b6060600080546106ee90612bf7565b80601f016020809104026020016040519081016040528092919081815260200182805461071a90612bf7565b80156107675780601f1061073c57610100808354040283529160200191610767565b820191906000526020600020905b81548152906001019060200180831161074a57829003601f168201915b5050505050905090565b600061077c82611498565b6107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b290612c9a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080182610d4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890612d2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610890611504565b73ffffffffffffffffffffffffffffffffffffffff1614806108bf57506108be816108b9611504565b6111dd565b5b6108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590612dbe565b60405180910390fd5b6109088383611513565b505050565b606060006040518060600160405280600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815250905061099087828787876115cc565b6109cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c690612e50565b60405180910390fd5b610a226001600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d490919063ffffffff16565b600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610a9893929190612e91565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610acd929190612f53565b604051602081830303815290604052604051610ae99190612f7b565b6000604051808303816000865af19150503d8060008114610b26576040519150601f19603f3d011682016040523d82523d6000602084013e610b2b565b606091505b509150915081610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612fde565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60006001610bc6600a6116ea565b610bd0919061302d565b905090565b6000600754905090565b610bf0610bea611504565b826116f8565b610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c26906130d3565b60405180910390fd5b610c3a8383836117d6565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c90611504565b73ffffffffffffffffffffffffffffffffffffffff16610cae610fdd565b73ffffffffffffffffffffffffffffffffffffffff1614610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb9061313f565b60405180910390fd5b80600b9080519060200190610d1a9291906122d1565b5050565b6000804690508091505090565b610d46838383604051806020016040528060008152506110af565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906131d1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390613263565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ebb611504565b73ffffffffffffffffffffffffffffffffffffffff16610ed9610fdd565b73ffffffffffffffffffffffffffffffffffffffff1614610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f269061313f565b60405180910390fd5b610f396000611a3c565b565b610f43611504565b73ffffffffffffffffffffffffffffffffffffffff16610f61610fdd565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae9061313f565b60405180910390fd5b6000610fc3600a6116ea565b9050610fcf600a611368565b610fd98282611b02565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461101690612bf7565b80601f016020809104026020016040519081016040528092919081815260200182805461104290612bf7565b801561108f5780601f106110645761010080835404028352916020019161108f565b820191906000526020600020905b81548152906001019060200180831161107257829003601f168201915b5050505050905090565b6110ab6110a4611504565b8383611b20565b5050565b6110c06110ba611504565b836116f8565b6110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f6906130d3565b60405180910390fd5b61110b84848484611c8c565b50505050565b606061111b61114b565b61112483611ce8565b6040516020016111359291906132bf565b6040516020818303038152906040529050919050565b6060600b805461115a90612bf7565b80601f016020809104026020016040519081016040528092919081815260200182805461118690612bf7565b80156111d35780601f106111a8576101008083540402835291602001916111d3565b820191906000526020600020905b8154815290600101906020018083116111b657829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611279611504565b73ffffffffffffffffffffffffffffffffffffffff16611297610fdd565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e49061313f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390613355565b60405180910390fd5b61136581611a3c565b50565b6001816000016000828254019250508190555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361142757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061142b565b3390505b90565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061150e61137e565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661158683610d4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff160361163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906133e7565b60405180910390fd5b600161164f61164a87611e48565b611eb0565b8386866040516000815260200160405260405161166f9493929190613416565b6020604051602081039080840390855afa158015611691573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600081836116e2919061345b565b905092915050565b600081600001549050919050565b600061170382611498565b611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613523565b60405180910390fd5b600061174d83610d4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061178f575061178e81856111dd565b5b806117cd57508373ffffffffffffffffffffffffffffffffffffffff166117b584610771565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117f682610d4b565b73ffffffffffffffffffffffffffffffffffffffff161461184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906135b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613647565b60405180910390fd5b6118c6838383611ee9565b6118d1600082611513565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611921919061302d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611978919061345b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a37838383611eee565b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b1c828260405180602001604052806000815250611ef3565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906136b3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c7f9190612428565b60405180910390a3505050565b611c978484846117d6565b611ca384848484611f4e565b611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd990613745565b60405180910390fd5b50505050565b606060008203611d2f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e43565b600082905060005b60008214611d61578080611d4a90613765565b915050600a82611d5a91906137dc565b9150611d37565b60008167ffffffffffffffff811115611d7d57611d7c612633565b5b6040519080825280601f01601f191660200182016040528015611daf5781602001600182028036833780820191505090505b5090505b60008514611e3c57600182611dc8919061302d565b9150600a85611dd7919061380d565b6030611de3919061345b565b60f81b818381518110611df957611df861383e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e3591906137dc565b9450611db3565b8093505050505b919050565b6000604051806080016040528060438152602001613abd604391398051906020012082600001518360200151846040015180519060200120604051602001611e93949392919061386d565b604051602081830303815290604052805190602001209050919050565b6000611eba610bd5565b82604051602001611ecc92919061391f565b604051602081830303815290604052805190602001209050919050565b505050565b505050565b611efd83836120d5565b611f0a6000848484611f4e565b611f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4090613745565b60405180910390fd5b505050565b6000611f6f8473ffffffffffffffffffffffffffffffffffffffff166122ae565b156120c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f98611504565b8786866040518563ffffffff1660e01b8152600401611fba9493929190613956565b6020604051808303816000875af1925050508015611ff657506040513d601f19601f82011682018060405250810190611ff391906139b7565b60015b612078573d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b506000815103612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790613745565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506120cd565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90613a30565b60405180910390fd5b61214d81611498565b1561218d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218490613a9c565b60405180910390fd5b61219960008383611ee9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e9919061345b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122aa60008383611eee565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546122dd90612bf7565b90600052602060002090601f0160209004810192826122ff5760008555612346565b82601f1061231857805160ff1916838001178555612346565b82800160010185558215612346579182015b8281111561234557825182559160200191906001019061232a565b5b5090506123539190612357565b5090565b5b80821115612370576000816000905550600101612358565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6123bd81612388565b81146123c857600080fd5b50565b6000813590506123da816123b4565b92915050565b6000602082840312156123f6576123f561237e565b5b6000612404848285016123cb565b91505092915050565b60008115159050919050565b6124228161240d565b82525050565b600060208201905061243d6000830184612419565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561247d578082015181840152602081019050612462565b8381111561248c576000848401525b50505050565b6000601f19601f8301169050919050565b60006124ae82612443565b6124b8818561244e565b93506124c881856020860161245f565b6124d181612492565b840191505092915050565b600060208201905081810360008301526124f681846124a3565b905092915050565b6000819050919050565b612511816124fe565b811461251c57600080fd5b50565b60008135905061252e81612508565b92915050565b60006020828403121561254a5761254961237e565b5b60006125588482850161251f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061258c82612561565b9050919050565b61259c81612581565b82525050565b60006020820190506125b76000830184612593565b92915050565b6125c681612581565b81146125d157600080fd5b50565b6000813590506125e3816125bd565b92915050565b60008060408385031215612600576125ff61237e565b5b600061260e858286016125d4565b925050602061261f8582860161251f565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61266b82612492565b810181811067ffffffffffffffff8211171561268a57612689612633565b5b80604052505050565b600061269d612374565b90506126a98282612662565b919050565b600067ffffffffffffffff8211156126c9576126c8612633565b5b6126d282612492565b9050602081019050919050565b82818337600083830152505050565b60006127016126fc846126ae565b612693565b90508281526020810184848401111561271d5761271c61262e565b5b6127288482856126df565b509392505050565b600082601f83011261274557612744612629565b5b81356127558482602086016126ee565b91505092915050565b6000819050919050565b6127718161275e565b811461277c57600080fd5b50565b60008135905061278e81612768565b92915050565b600060ff82169050919050565b6127aa81612794565b81146127b557600080fd5b50565b6000813590506127c7816127a1565b92915050565b600080600080600060a086880312156127e9576127e861237e565b5b60006127f7888289016125d4565b955050602086013567ffffffffffffffff81111561281857612817612383565b5b61282488828901612730565b94505060406128358882890161277f565b93505060606128468882890161277f565b9250506080612857888289016127b8565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b600061288b82612864565b612895818561286f565b93506128a581856020860161245f565b6128ae81612492565b840191505092915050565b600060208201905081810360008301526128d38184612880565b905092915050565b6128e4816124fe565b82525050565b60006020820190506128ff60008301846128db565b92915050565b61290e8161275e565b82525050565b60006020820190506129296000830184612905565b92915050565b6000806000606084860312156129485761294761237e565b5b6000612956868287016125d4565b9350506020612967868287016125d4565b92505060406129788682870161251f565b9150509250925092565b6000602082840312156129985761299761237e565b5b60006129a6848285016125d4565b91505092915050565b600067ffffffffffffffff8211156129ca576129c9612633565b5b6129d382612492565b9050602081019050919050565b60006129f36129ee846129af565b612693565b905082815260208101848484011115612a0f57612a0e61262e565b5b612a1a8482856126df565b509392505050565b600082601f830112612a3757612a36612629565b5b8135612a478482602086016129e0565b91505092915050565b600060208284031215612a6657612a6561237e565b5b600082013567ffffffffffffffff811115612a8457612a83612383565b5b612a9084828501612a22565b91505092915050565b612aa28161240d565b8114612aad57600080fd5b50565b600081359050612abf81612a99565b92915050565b60008060408385031215612adc57612adb61237e565b5b6000612aea858286016125d4565b9250506020612afb85828601612ab0565b9150509250929050565b60008060008060808587031215612b1f57612b1e61237e565b5b6000612b2d878288016125d4565b9450506020612b3e878288016125d4565b9350506040612b4f8782880161251f565b925050606085013567ffffffffffffffff811115612b7057612b6f612383565b5b612b7c87828801612730565b91505092959194509250565b60008060408385031215612b9f57612b9e61237e565b5b6000612bad858286016125d4565b9250506020612bbe858286016125d4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c0f57607f821691505b602082108103612c2257612c21612bc8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c84602c8361244e565b9150612c8f82612c28565b604082019050919050565b60006020820190508181036000830152612cb381612c77565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d1660218361244e565b9150612d2182612cba565b604082019050919050565b60006020820190508181036000830152612d4581612d09565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612da860388361244e565b9150612db382612d4c565b604082019050919050565b60006020820190508181036000830152612dd781612d9b565b9050919050565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e3a60218361244e565b9150612e4582612dde565b604082019050919050565b60006020820190508181036000830152612e6981612e2d565b9050919050565b6000612e7b82612561565b9050919050565b612e8b81612e70565b82525050565b6000606082019050612ea66000830186612593565b612eb36020830185612e82565b8181036040830152612ec58184612880565b9050949350505050565b600081905092915050565b6000612ee582612864565b612eef8185612ecf565b9350612eff81856020860161245f565b80840191505092915050565b60008160601b9050919050565b6000612f2382612f0b565b9050919050565b6000612f3582612f18565b9050919050565b612f4d612f4882612581565b612f2a565b82525050565b6000612f5f8285612eda565b9150612f6b8284612f3c565b6014820191508190509392505050565b6000612f878284612eda565b915081905092915050565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b6000612fc8601c8361244e565b9150612fd382612f92565b602082019050919050565b60006020820190508181036000830152612ff781612fbb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613038826124fe565b9150613043836124fe565b92508282101561305657613055612ffe565b5b828203905092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006130bd60318361244e565b91506130c882613061565b604082019050919050565b600060208201905081810360008301526130ec816130b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061312960208361244e565b9150613134826130f3565b602082019050919050565b600060208201905081810360008301526131588161311c565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006131bb60298361244e565b91506131c68261315f565b604082019050919050565b600060208201905081810360008301526131ea816131ae565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061324d602a8361244e565b9150613258826131f1565b604082019050919050565b6000602082019050818103600083015261327c81613240565b9050919050565b600081905092915050565b600061329982612443565b6132a38185613283565b93506132b381856020860161245f565b80840191505092915050565b60006132cb828561328e565b91506132d7828461328e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061333f60268361244e565b915061334a826132e3565b604082019050919050565b6000602082019050818103600083015261336e81613332565b9050919050565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b60006133d160258361244e565b91506133dc82613375565b604082019050919050565b60006020820190508181036000830152613400816133c4565b9050919050565b61341081612794565b82525050565b600060808201905061342b6000830187612905565b6134386020830186613407565b6134456040830185612905565b6134526060830184612905565b95945050505050565b6000613466826124fe565b9150613471836124fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134a6576134a5612ffe565b5b828201905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061350d602c8361244e565b9150613518826134b1565b604082019050919050565b6000602082019050818103600083015261353c81613500565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061359f60258361244e565b91506135aa82613543565b604082019050919050565b600060208201905081810360008301526135ce81613592565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061363160248361244e565b915061363c826135d5565b604082019050919050565b6000602082019050818103600083015261366081613624565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061369d60198361244e565b91506136a882613667565b602082019050919050565b600060208201905081810360008301526136cc81613690565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061372f60328361244e565b915061373a826136d3565b604082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b6000613770826124fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137a2576137a1612ffe565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137e7826124fe565b91506137f2836124fe565b925082613802576138016137ad565b5b828204905092915050565b6000613818826124fe565b9150613823836124fe565b925082613833576138326137ad565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190506138826000830187612905565b61388f60208301866128db565b61389c6040830185612593565b6138a96060830184612905565b95945050505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006138e8600283613283565b91506138f3826138b2565b600282019050919050565b6000819050919050565b6139196139148261275e565b6138fe565b82525050565b600061392a826138db565b91506139368285613908565b6020820191506139468284613908565b6020820191508190509392505050565b600060808201905061396b6000830187612593565b6139786020830186612593565b61398560408301856128db565b81810360608301526139978184612880565b905095945050505050565b6000815190506139b1816123b4565b92915050565b6000602082840312156139cd576139cc61237e565b5b60006139db848285016139a2565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613a1a60208361244e565b9150613a25826139e4565b602082019050919050565b60006020820190508181036000830152613a4981613a0d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613a86601c8361244e565b9150613a9182613a50565b602082019050919050565b60006020820190508181036000830152613ab581613a79565b905091905056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220c4744c62ef09131842fe7a24f66bd6c38180ca75898aa88ab7676fd55deed22e64736f6c634300080d0033

Deployed Bytecode Sourcemap

136:484:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1570:300:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2488:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4000:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3538:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;976:1117:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;288:43:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1861:103:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1264:99:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4727:330:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2501:105:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;519:99:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1369:155:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5123:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2191:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;1510:184:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2650:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4284:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5368:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2044:173:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;407:106:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4503:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1570:300:1;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;2488:98::-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;4000:217::-;4076:7;4103:16;4111:7;4103;:16::i;:::-;4095:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4186:15;:24;4202:7;4186:24;;;;;;;;;;;;;;;;;;;;;4179:31;;4000:217;;;:::o;3538:401::-;3618:13;3634:23;3649:7;3634:14;:23::i;:::-;3618:39;;3681:5;3675:11;;:2;:11;;;3667:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3772:5;3756:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3781:37;3798:5;3805:12;:10;:12::i;:::-;3781:16;:37::i;:::-;3756:62;3735:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3911:21;3920:2;3924:7;3911:8;:21::i;:::-;3608:331;3538:401;;:::o;976:1117:17:-;1171:12;1195:29;1227:148;;;;;;;;1264:6;:19;1271:11;1264:19;;;;;;;;;;;;;;;;1227:148;;;;1303:11;1227:148;;;;;;1347:17;1227:148;;;1195:180;;1407:45;1414:11;1427:6;1435:4;1441;1447;1407:6;:45::i;:::-;1386:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;1597:26;1621:1;1597:6;:19;1604:11;1597:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;1575:6;:19;1582:11;1575:19;;;;;;;;;;;;;;;:48;;;;1639:122;1676:11;1709:10;1734:17;1639:122;;;;;;;;:::i;:::-;;;;;;;;1869:12;1883:23;1918:4;1910:18;;1959:17;1978:11;1942:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1910:90;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1868:132;;;;2018:7;2010:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;2076:10;2069:17;;;;;976:1117;;;;;;;:::o;288:43:15:-;;;;;;;;;;;;;;;;;;;:::o;1861:103:12:-;1905:7;1956:1;1931:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;1924:33;;1861:103;:::o;1264:99:15:-;1315:7;1341:15;;1334:22;;1264:99;:::o;4727:330:1:-;4916:41;4935:12;:10;:12::i;:::-;4949:7;4916:18;:41::i;:::-;4908:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5022:28;5032:4;5038:2;5042:7;5022:9;:28::i;:::-;4727:330;;;:::o;2501:105:17:-;2554:13;2587:6;:12;2594:4;2587:12;;;;;;;;;;;;;;;;2579:20;;2501:105;;;:::o;519:99:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;607:4:13::1;591:13;:20;;;;;;;;;;;;:::i;:::-;;519:99:::0;:::o;1369:155:15:-;1412:7;1431:10;1480:9;1474:15;;1515:2;1508:9;;;1369:155;:::o;5123:179:1:-;5256:39;5273:4;5279:2;5283:7;5256:39;;;;;;;;;;;;:16;:39::i;:::-;5123:179;;;:::o;2191:235::-;2263:7;2282:13;2298:7;:16;2306:7;2298:16;;;;;;;;;;;;;;;;;;;;;2282:32;;2349:1;2332:19;;:5;:19;;;2324:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:5;2407:12;;;2191:235;;;:::o;1929:205::-;2001:7;2045:1;2028:19;;:5;:19;;;2020:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2111:9;:16;2121:5;2111:16;;;;;;;;;;;;;;;;2104:23;;1929:205;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1510:184:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1566:22:12::1;1591;:12;:20;:22::i;:::-;1566:47;;1623:24;:12;:22;:24::i;:::-;1657:30;1667:3;1672:14;1657:9;:30::i;:::-;1556:138;1510:184:::0;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2650:102:1:-;2706:13;2738:7;2731:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2650:102;:::o;4284:153::-;4378:52;4397:12;:10;:12::i;:::-;4411:8;4421;4378:18;:52::i;:::-;4284:153;;:::o;5368:320::-;5537:41;5556:12;:10;:12::i;:::-;5570:7;5537:18;:41::i;:::-;5529:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5642:39;5656:4;5662:2;5666:7;5675:5;5642:13;:39::i;:::-;5368:320;;;;:::o;2044:173:12:-;2110:13;2166:14;:12;:14::i;:::-;2182:26;2199:8;2182:16;:26::i;:::-;2149:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2135:75;;2044:173;;;:::o;407:106:13:-;461:13;493;486:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;407:106;:::o;4503:162:1:-;4600:4;4623:18;:25;4642:5;4623:25;;;;;;;;;;;;;;;:35;4649:8;4623:35;;;;;;;;;;;;;;;;;;;;;;;;;4616:42;;4503:162;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;::::0;1998:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;945:123:7:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;95:631:14:-;163:22;227:4;205:27;;:10;:27;;;201:496;;248:18;269:8;;248:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;291:13;307:8;;:15;;291:31;;554:42;525:5;518;514:17;508:24;483:131;473:141;;345:283;;201:496;;;675:10;658:28;;201:496;95:631;:::o;829:155:9:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7160:125:1:-;7225:4;7276:1;7248:30;;:7;:16;7256:7;7248:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7241:37;;7160:125;;;:::o;2356:154:12:-;2442:14;2479:24;:22;:24::i;:::-;2472:31;;2356:154;:::o;11169:171:1:-;11270:2;11243:15;:24;11259:7;11243:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11325:7;11321:2;11287:46;;11296:23;11311:7;11296:14;:23::i;:::-;11287:46;;;;;;;;;;;;11169:171;;:::o;2612:470:17:-;2784:4;2826:1;2808:20;;:6;:20;;;2800:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2921:154;2948:47;2967:27;2987:6;2967:19;:27::i;:::-;2948:18;:47::i;:::-;3013:4;3035;3057;2921:154;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2899:176;;:6;:176;;;2880:195;;2612:470;;;;;;;:::o;2755:96:11:-;2813:7;2843:1;2839;:5;;;;:::i;:::-;2832:12;;2755:96;;;;:::o;827:112:7:-;892:7;918;:14;;;911:21;;827:112;;;:::o;7443:344:1:-;7536:4;7560:16;7568:7;7560;:16::i;:::-;7552:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7635:13;7651:23;7666:7;7651:14;:23::i;:::-;7635:39;;7703:5;7692:16;;:7;:16;;;:52;;;;7712:32;7729:5;7736:7;7712:16;:32::i;:::-;7692:52;:87;;;;7772:7;7748:31;;:20;7760:7;7748:11;:20::i;:::-;:31;;;7692:87;7684:96;;;7443:344;;;;:::o;10453:605::-;10607:4;10580:31;;:23;10595:7;10580:14;:23::i;:::-;:31;;;10572:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10685:1;10671:16;;:2;:16;;;10663:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10739:39;10760:4;10766:2;10770:7;10739:20;:39::i;:::-;10840:29;10857:1;10861:7;10840:8;:29::i;:::-;10899:1;10880:9;:15;10890:4;10880:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10927:1;10910:9;:13;10920:2;10910:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10957:2;10938:7;:16;10946:7;10938:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10994:7;10990:2;10975:27;;10984:4;10975:27;;;;;;;;;;;;11013:38;11033:4;11039:2;11043:7;11013:19;:38::i;:::-;10453:605;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;8117:108:1:-;8192:26;8202:2;8206:7;8192:26;;;;;;;;;;;;:9;:26::i;:::-;8117:108;;:::o;11475:307::-;11625:8;11616:17;;:5;:17;;;11608:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11711:8;11673:18;:25;11692:5;11673:25;;;;;;;;;;;;;;;:35;11699:8;11673:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11756:8;11734:41;;11749:5;11734:41;;;11766:8;11734:41;;;;;;:::i;:::-;;;;;;;;11475:307;;;:::o;6550:::-;6701:28;6711:4;6717:2;6721:7;6701:9;:28::i;:::-;6747:48;6770:4;6776:2;6780:7;6789:5;6747:22;:48::i;:::-;6739:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6550:307;;;;:::o;328:703:8:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;2099:396:17:-;2206:7;334:98;;;;;;;;;;;;;;;;;315:123;;;;;;2354:6;:12;;;2388:6;:11;;;2431:6;:24;;;2421:35;;;;;;2275:199;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2248:240;;;;;;2229:259;;2099:396;;;:::o;1884:249:15:-;1980:7;2078:20;:18;:20::i;:::-;2100:11;2049:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2022:104;;;;;;2003:123;;1884:249;;;:::o;13669:122:1:-;;;;:::o;14163:121::-;;;;:::o;8446:311::-;8571:18;8577:2;8581:7;8571:5;:18::i;:::-;8620:54;8651:1;8655:2;8659:7;8668:5;8620:22;:54::i;:::-;8599:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8446:311;;;:::o;12335:778::-;12485:4;12505:15;:2;:13;;;:15::i;:::-;12501:606;;;12556:2;12540:36;;;12577:12;:10;:12::i;:::-;12591:4;12597:7;12606:5;12540:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12536:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12796:1;12779:6;:13;:18;12775:266;;12821:60;;;;;;;;;;:::i;:::-;;;;;;;;12775:266;12993:6;12987:13;12978:6;12974:2;12970:15;12963:38;12536:519;12672:41;;;12662:51;;;:6;:51;;;;12655:58;;;;;12501:606;13092:4;13085:11;;12335:778;;;;;;;:::o;9079:427::-;9172:1;9158:16;;:2;:16;;;9150:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9230:16;9238:7;9230;:16::i;:::-;9229:17;9221:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9290:45;9319:1;9323:2;9327:7;9290:20;:45::i;:::-;9363:1;9346:9;:13;9356:2;9346:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9393:2;9374:7;:16;9382:7;9374:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9436:7;9432:2;9411:33;;9428:1;9411:33;;;;;;;;;;;;9455:44;9483:1;9487:2;9491:7;9455:19;:44::i;:::-;9079:427;;:::o;1175:320:5:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:307::-;5853:4;5943:18;5935:6;5932:30;5929:56;;;5965:18;;:::i;:::-;5929:56;6003:29;6025:6;6003:29;:::i;:::-;5995:37;;6087:4;6081;6077:15;6069:23;;5792:307;;;:::o;6105:154::-;6189:6;6184:3;6179;6166:30;6251:1;6242:6;6237:3;6233:16;6226:27;6105:154;;;:::o;6265:410::-;6342:5;6367:65;6383:48;6424:6;6383:48;:::i;:::-;6367:65;:::i;:::-;6358:74;;6455:6;6448:5;6441:21;6493:4;6486:5;6482:16;6531:3;6522:6;6517:3;6513:16;6510:25;6507:112;;;6538:79;;:::i;:::-;6507:112;6628:41;6662:6;6657:3;6652;6628:41;:::i;:::-;6348:327;6265:410;;;;;:::o;6694:338::-;6749:5;6798:3;6791:4;6783:6;6779:17;6775:27;6765:122;;6806:79;;:::i;:::-;6765:122;6923:6;6910:20;6948:78;7022:3;7014:6;7007:4;6999:6;6995:17;6948:78;:::i;:::-;6939:87;;6755:277;6694:338;;;;:::o;7038:77::-;7075:7;7104:5;7093:16;;7038:77;;;:::o;7121:122::-;7194:24;7212:5;7194:24;:::i;:::-;7187:5;7184:35;7174:63;;7233:1;7230;7223:12;7174:63;7121:122;:::o;7249:139::-;7295:5;7333:6;7320:20;7311:29;;7349:33;7376:5;7349:33;:::i;:::-;7249:139;;;;:::o;7394:86::-;7429:7;7469:4;7462:5;7458:16;7447:27;;7394:86;;;:::o;7486:118::-;7557:22;7573:5;7557:22;:::i;:::-;7550:5;7547:33;7537:61;;7594:1;7591;7584:12;7537:61;7486:118;:::o;7610:135::-;7654:5;7692:6;7679:20;7670:29;;7708:31;7733:5;7708:31;:::i;:::-;7610:135;;;;:::o;7751:1085::-;7853:6;7861;7869;7877;7885;7934:3;7922:9;7913:7;7909:23;7905:33;7902:120;;;7941:79;;:::i;:::-;7902:120;8061:1;8086:53;8131:7;8122:6;8111:9;8107:22;8086:53;:::i;:::-;8076:63;;8032:117;8216:2;8205:9;8201:18;8188:32;8247:18;8239:6;8236:30;8233:117;;;8269:79;;:::i;:::-;8233:117;8374:62;8428:7;8419:6;8408:9;8404:22;8374:62;:::i;:::-;8364:72;;8159:287;8485:2;8511:53;8556:7;8547:6;8536:9;8532:22;8511:53;:::i;:::-;8501:63;;8456:118;8613:2;8639:53;8684:7;8675:6;8664:9;8660:22;8639:53;:::i;:::-;8629:63;;8584:118;8741:3;8768:51;8811:7;8802:6;8791:9;8787:22;8768:51;:::i;:::-;8758:61;;8712:117;7751:1085;;;;;;;;:::o;8842:98::-;8893:6;8927:5;8921:12;8911:22;;8842:98;;;:::o;8946:168::-;9029:11;9063:6;9058:3;9051:19;9103:4;9098:3;9094:14;9079:29;;8946:168;;;;:::o;9120:360::-;9206:3;9234:38;9266:5;9234:38;:::i;:::-;9288:70;9351:6;9346:3;9288:70;:::i;:::-;9281:77;;9367:52;9412:6;9407:3;9400:4;9393:5;9389:16;9367:52;:::i;:::-;9444:29;9466:6;9444:29;:::i;:::-;9439:3;9435:39;9428:46;;9210:270;9120:360;;;;:::o;9486:309::-;9597:4;9635:2;9624:9;9620:18;9612:26;;9684:9;9678:4;9674:20;9670:1;9659:9;9655:17;9648:47;9712:76;9783:4;9774:6;9712:76;:::i;:::-;9704:84;;9486:309;;;;:::o;9801:118::-;9888:24;9906:5;9888:24;:::i;:::-;9883:3;9876:37;9801:118;;:::o;9925:222::-;10018:4;10056:2;10045:9;10041:18;10033:26;;10069:71;10137:1;10126:9;10122:17;10113:6;10069:71;:::i;:::-;9925:222;;;;:::o;10153:118::-;10240:24;10258:5;10240:24;:::i;:::-;10235:3;10228:37;10153:118;;:::o;10277:222::-;10370:4;10408:2;10397:9;10393:18;10385:26;;10421:71;10489:1;10478:9;10474:17;10465:6;10421:71;:::i;:::-;10277:222;;;;:::o;10505:619::-;10582:6;10590;10598;10647:2;10635:9;10626:7;10622:23;10618:32;10615:119;;;10653:79;;:::i;:::-;10615:119;10773:1;10798:53;10843:7;10834:6;10823:9;10819:22;10798:53;:::i;:::-;10788:63;;10744:117;10900:2;10926:53;10971:7;10962:6;10951:9;10947:22;10926:53;:::i;:::-;10916:63;;10871:118;11028:2;11054:53;11099:7;11090:6;11079:9;11075:22;11054:53;:::i;:::-;11044:63;;10999:118;10505:619;;;;;:::o;11130:329::-;11189:6;11238:2;11226:9;11217:7;11213:23;11209:32;11206:119;;;11244:79;;:::i;:::-;11206:119;11364:1;11389:53;11434:7;11425:6;11414:9;11410:22;11389:53;:::i;:::-;11379:63;;11335:117;11130:329;;;;:::o;11465:308::-;11527:4;11617:18;11609:6;11606:30;11603:56;;;11639:18;;:::i;:::-;11603:56;11677:29;11699:6;11677:29;:::i;:::-;11669:37;;11761:4;11755;11751:15;11743:23;;11465:308;;;:::o;11779:412::-;11857:5;11882:66;11898:49;11940:6;11898:49;:::i;:::-;11882:66;:::i;:::-;11873:75;;11971:6;11964:5;11957:21;12009:4;12002:5;11998:16;12047:3;12038:6;12033:3;12029:16;12026:25;12023:112;;;12054:79;;:::i;:::-;12023:112;12144:41;12178:6;12173:3;12168;12144:41;:::i;:::-;11863:328;11779:412;;;;;:::o;12211:340::-;12267:5;12316:3;12309:4;12301:6;12297:17;12293:27;12283:122;;12324:79;;:::i;:::-;12283:122;12441:6;12428:20;12466:79;12541:3;12533:6;12526:4;12518:6;12514:17;12466:79;:::i;:::-;12457:88;;12273:278;12211:340;;;;:::o;12557:509::-;12626:6;12675:2;12663:9;12654:7;12650:23;12646:32;12643:119;;;12681:79;;:::i;:::-;12643:119;12829:1;12818:9;12814:17;12801:31;12859:18;12851:6;12848:30;12845:117;;;12881:79;;:::i;:::-;12845:117;12986:63;13041:7;13032:6;13021:9;13017:22;12986:63;:::i;:::-;12976:73;;12772:287;12557:509;;;;:::o;13072:116::-;13142:21;13157:5;13142:21;:::i;:::-;13135:5;13132:32;13122:60;;13178:1;13175;13168:12;13122:60;13072:116;:::o;13194:133::-;13237:5;13275:6;13262:20;13253:29;;13291:30;13315:5;13291:30;:::i;:::-;13194:133;;;;:::o;13333:468::-;13398:6;13406;13455:2;13443:9;13434:7;13430:23;13426:32;13423:119;;;13461:79;;:::i;:::-;13423:119;13581:1;13606:53;13651:7;13642:6;13631:9;13627:22;13606:53;:::i;:::-;13596:63;;13552:117;13708:2;13734:50;13776:7;13767:6;13756:9;13752:22;13734:50;:::i;:::-;13724:60;;13679:115;13333:468;;;;;:::o;13807:943::-;13902:6;13910;13918;13926;13975:3;13963:9;13954:7;13950:23;13946:33;13943:120;;;13982:79;;:::i;:::-;13943:120;14102:1;14127:53;14172:7;14163:6;14152:9;14148:22;14127:53;:::i;:::-;14117:63;;14073:117;14229:2;14255:53;14300:7;14291:6;14280:9;14276:22;14255:53;:::i;:::-;14245:63;;14200:118;14357:2;14383:53;14428:7;14419:6;14408:9;14404:22;14383:53;:::i;:::-;14373:63;;14328:118;14513:2;14502:9;14498:18;14485:32;14544:18;14536:6;14533:30;14530:117;;;14566:79;;:::i;:::-;14530:117;14671:62;14725:7;14716:6;14705:9;14701:22;14671:62;:::i;:::-;14661:72;;14456:287;13807:943;;;;;;;:::o;14756:474::-;14824:6;14832;14881:2;14869:9;14860:7;14856:23;14852:32;14849:119;;;14887:79;;:::i;:::-;14849:119;15007:1;15032:53;15077:7;15068:6;15057:9;15053:22;15032:53;:::i;:::-;15022:63;;14978:117;15134:2;15160:53;15205:7;15196:6;15185:9;15181:22;15160:53;:::i;:::-;15150:63;;15105:118;14756:474;;;;;:::o;15236:180::-;15284:77;15281:1;15274:88;15381:4;15378:1;15371:15;15405:4;15402:1;15395:15;15422:320;15466:6;15503:1;15497:4;15493:12;15483:22;;15550:1;15544:4;15540:12;15571:18;15561:81;;15627:4;15619:6;15615:17;15605:27;;15561:81;15689:2;15681:6;15678:14;15658:18;15655:38;15652:84;;15708:18;;:::i;:::-;15652:84;15473:269;15422:320;;;:::o;15748:231::-;15888:34;15884:1;15876:6;15872:14;15865:58;15957:14;15952:2;15944:6;15940:15;15933:39;15748:231;:::o;15985:366::-;16127:3;16148:67;16212:2;16207:3;16148:67;:::i;:::-;16141:74;;16224:93;16313:3;16224:93;:::i;:::-;16342:2;16337:3;16333:12;16326:19;;15985:366;;;:::o;16357:419::-;16523:4;16561:2;16550:9;16546:18;16538:26;;16610:9;16604:4;16600:20;16596:1;16585:9;16581:17;16574:47;16638:131;16764:4;16638:131;:::i;:::-;16630:139;;16357:419;;;:::o;16782:220::-;16922:34;16918:1;16910:6;16906:14;16899:58;16991:3;16986:2;16978:6;16974:15;16967:28;16782:220;:::o;17008:366::-;17150:3;17171:67;17235:2;17230:3;17171:67;:::i;:::-;17164:74;;17247:93;17336:3;17247:93;:::i;:::-;17365:2;17360:3;17356:12;17349:19;;17008:366;;;:::o;17380:419::-;17546:4;17584:2;17573:9;17569:18;17561:26;;17633:9;17627:4;17623:20;17619:1;17608:9;17604:17;17597:47;17661:131;17787:4;17661:131;:::i;:::-;17653:139;;17380:419;;;:::o;17805:243::-;17945:34;17941:1;17933:6;17929:14;17922:58;18014:26;18009:2;18001:6;17997:15;17990:51;17805:243;:::o;18054:366::-;18196:3;18217:67;18281:2;18276:3;18217:67;:::i;:::-;18210:74;;18293:93;18382:3;18293:93;:::i;:::-;18411:2;18406:3;18402:12;18395:19;;18054:366;;;:::o;18426:419::-;18592:4;18630:2;18619:9;18615:18;18607:26;;18679:9;18673:4;18669:20;18665:1;18654:9;18650:17;18643:47;18707:131;18833:4;18707:131;:::i;:::-;18699:139;;18426:419;;;:::o;18851:220::-;18991:34;18987:1;18979:6;18975:14;18968:58;19060:3;19055:2;19047:6;19043:15;19036:28;18851:220;:::o;19077:366::-;19219:3;19240:67;19304:2;19299:3;19240:67;:::i;:::-;19233:74;;19316:93;19405:3;19316:93;:::i;:::-;19434:2;19429:3;19425:12;19418:19;;19077:366;;;:::o;19449:419::-;19615:4;19653:2;19642:9;19638:18;19630:26;;19702:9;19696:4;19692:20;19688:1;19677:9;19673:17;19666:47;19730:131;19856:4;19730:131;:::i;:::-;19722:139;;19449:419;;;:::o;19874:104::-;19919:7;19948:24;19966:5;19948:24;:::i;:::-;19937:35;;19874:104;;;:::o;19984:142::-;20087:32;20113:5;20087:32;:::i;:::-;20082:3;20075:45;19984:142;;:::o;20132:561::-;20315:4;20353:2;20342:9;20338:18;20330:26;;20366:71;20434:1;20423:9;20419:17;20410:6;20366:71;:::i;:::-;20447:88;20531:2;20520:9;20516:18;20507:6;20447:88;:::i;:::-;20582:9;20576:4;20572:20;20567:2;20556:9;20552:18;20545:48;20610:76;20681:4;20672:6;20610:76;:::i;:::-;20602:84;;20132:561;;;;;;:::o;20699:147::-;20800:11;20837:3;20822:18;;20699:147;;;;:::o;20852:373::-;20956:3;20984:38;21016:5;20984:38;:::i;:::-;21038:88;21119:6;21114:3;21038:88;:::i;:::-;21031:95;;21135:52;21180:6;21175:3;21168:4;21161:5;21157:16;21135:52;:::i;:::-;21212:6;21207:3;21203:16;21196:23;;20960:265;20852:373;;;;:::o;21231:94::-;21264:8;21312:5;21308:2;21304:14;21283:35;;21231:94;;;:::o;21331:::-;21370:7;21399:20;21413:5;21399:20;:::i;:::-;21388:31;;21331:94;;;:::o;21431:100::-;21470:7;21499:26;21519:5;21499:26;:::i;:::-;21488:37;;21431:100;;;:::o;21537:157::-;21642:45;21662:24;21680:5;21662:24;:::i;:::-;21642:45;:::i;:::-;21637:3;21630:58;21537:157;;:::o;21700:412::-;21858:3;21880:93;21969:3;21960:6;21880:93;:::i;:::-;21873:100;;21983:75;22054:3;22045:6;21983:75;:::i;:::-;22083:2;22078:3;22074:12;22067:19;;22103:3;22096:10;;21700:412;;;;;:::o;22118:271::-;22248:3;22270:93;22359:3;22350:6;22270:93;:::i;:::-;22263:100;;22380:3;22373:10;;22118:271;;;;:::o;22395:178::-;22535:30;22531:1;22523:6;22519:14;22512:54;22395:178;:::o;22579:366::-;22721:3;22742:67;22806:2;22801:3;22742:67;:::i;:::-;22735:74;;22818:93;22907:3;22818:93;:::i;:::-;22936:2;22931:3;22927:12;22920:19;;22579:366;;;:::o;22951:419::-;23117:4;23155:2;23144:9;23140:18;23132:26;;23204:9;23198:4;23194:20;23190:1;23179:9;23175:17;23168:47;23232:131;23358:4;23232:131;:::i;:::-;23224:139;;22951:419;;;:::o;23376:180::-;23424:77;23421:1;23414:88;23521:4;23518:1;23511:15;23545:4;23542:1;23535:15;23562:191;23602:4;23622:20;23640:1;23622:20;:::i;:::-;23617:25;;23656:20;23674:1;23656:20;:::i;:::-;23651:25;;23695:1;23692;23689:8;23686:34;;;23700:18;;:::i;:::-;23686:34;23745:1;23742;23738:9;23730:17;;23562:191;;;;:::o;23759:236::-;23899:34;23895:1;23887:6;23883:14;23876:58;23968:19;23963:2;23955:6;23951:15;23944:44;23759:236;:::o;24001:366::-;24143:3;24164:67;24228:2;24223:3;24164:67;:::i;:::-;24157:74;;24240:93;24329:3;24240:93;:::i;:::-;24358:2;24353:3;24349:12;24342:19;;24001:366;;;:::o;24373:419::-;24539:4;24577:2;24566:9;24562:18;24554:26;;24626:9;24620:4;24616:20;24612:1;24601:9;24597:17;24590:47;24654:131;24780:4;24654:131;:::i;:::-;24646:139;;24373:419;;;:::o;24798:182::-;24938:34;24934:1;24926:6;24922:14;24915:58;24798:182;:::o;24986:366::-;25128:3;25149:67;25213:2;25208:3;25149:67;:::i;:::-;25142:74;;25225:93;25314:3;25225:93;:::i;:::-;25343:2;25338:3;25334:12;25327:19;;24986:366;;;:::o;25358:419::-;25524:4;25562:2;25551:9;25547:18;25539:26;;25611:9;25605:4;25601:20;25597:1;25586:9;25582:17;25575:47;25639:131;25765:4;25639:131;:::i;:::-;25631:139;;25358:419;;;:::o;25783:228::-;25923:34;25919:1;25911:6;25907:14;25900:58;25992:11;25987:2;25979:6;25975:15;25968:36;25783:228;:::o;26017:366::-;26159:3;26180:67;26244:2;26239:3;26180:67;:::i;:::-;26173:74;;26256:93;26345:3;26256:93;:::i;:::-;26374:2;26369:3;26365:12;26358:19;;26017:366;;;:::o;26389:419::-;26555:4;26593:2;26582:9;26578:18;26570:26;;26642:9;26636:4;26632:20;26628:1;26617:9;26613:17;26606:47;26670:131;26796:4;26670:131;:::i;:::-;26662:139;;26389:419;;;:::o;26814:229::-;26954:34;26950:1;26942:6;26938:14;26931:58;27023:12;27018:2;27010:6;27006:15;26999:37;26814:229;:::o;27049:366::-;27191:3;27212:67;27276:2;27271:3;27212:67;:::i;:::-;27205:74;;27288:93;27377:3;27288:93;:::i;:::-;27406:2;27401:3;27397:12;27390:19;;27049:366;;;:::o;27421:419::-;27587:4;27625:2;27614:9;27610:18;27602:26;;27674:9;27668:4;27664:20;27660:1;27649:9;27645:17;27638:47;27702:131;27828:4;27702:131;:::i;:::-;27694:139;;27421:419;;;:::o;27846:148::-;27948:11;27985:3;27970:18;;27846:148;;;;:::o;28000:377::-;28106:3;28134:39;28167:5;28134:39;:::i;:::-;28189:89;28271:6;28266:3;28189:89;:::i;:::-;28182:96;;28287:52;28332:6;28327:3;28320:4;28313:5;28309:16;28287:52;:::i;:::-;28364:6;28359:3;28355:16;28348:23;;28110:267;28000:377;;;;:::o;28383:435::-;28563:3;28585:95;28676:3;28667:6;28585:95;:::i;:::-;28578:102;;28697:95;28788:3;28779:6;28697:95;:::i;:::-;28690:102;;28809:3;28802:10;;28383:435;;;;;:::o;28824:225::-;28964:34;28960:1;28952:6;28948:14;28941:58;29033:8;29028:2;29020:6;29016:15;29009:33;28824:225;:::o;29055:366::-;29197:3;29218:67;29282:2;29277:3;29218:67;:::i;:::-;29211:74;;29294:93;29383:3;29294:93;:::i;:::-;29412:2;29407:3;29403:12;29396:19;;29055:366;;;:::o;29427:419::-;29593:4;29631:2;29620:9;29616:18;29608:26;;29680:9;29674:4;29670:20;29666:1;29655:9;29651:17;29644:47;29708:131;29834:4;29708:131;:::i;:::-;29700:139;;29427:419;;;:::o;29852:224::-;29992:34;29988:1;29980:6;29976:14;29969:58;30061:7;30056:2;30048:6;30044:15;30037:32;29852:224;:::o;30082:366::-;30224:3;30245:67;30309:2;30304:3;30245:67;:::i;:::-;30238:74;;30321:93;30410:3;30321:93;:::i;:::-;30439:2;30434:3;30430:12;30423:19;;30082:366;;;:::o;30454:419::-;30620:4;30658:2;30647:9;30643:18;30635:26;;30707:9;30701:4;30697:20;30693:1;30682:9;30678:17;30671:47;30735:131;30861:4;30735:131;:::i;:::-;30727:139;;30454:419;;;:::o;30879:112::-;30962:22;30978:5;30962:22;:::i;:::-;30957:3;30950:35;30879:112;;:::o;30997:545::-;31170:4;31208:3;31197:9;31193:19;31185:27;;31222:71;31290:1;31279:9;31275:17;31266:6;31222:71;:::i;:::-;31303:68;31367:2;31356:9;31352:18;31343:6;31303:68;:::i;:::-;31381:72;31449:2;31438:9;31434:18;31425:6;31381:72;:::i;:::-;31463;31531:2;31520:9;31516:18;31507:6;31463:72;:::i;:::-;30997:545;;;;;;;:::o;31548:305::-;31588:3;31607:20;31625:1;31607:20;:::i;:::-;31602:25;;31641:20;31659:1;31641:20;:::i;:::-;31636:25;;31795:1;31727:66;31723:74;31720:1;31717:81;31714:107;;;31801:18;;:::i;:::-;31714:107;31845:1;31842;31838:9;31831:16;;31548:305;;;;:::o;31859:231::-;31999:34;31995:1;31987:6;31983:14;31976:58;32068:14;32063:2;32055:6;32051:15;32044:39;31859:231;:::o;32096:366::-;32238:3;32259:67;32323:2;32318:3;32259:67;:::i;:::-;32252:74;;32335:93;32424:3;32335:93;:::i;:::-;32453:2;32448:3;32444:12;32437:19;;32096:366;;;:::o;32468:419::-;32634:4;32672:2;32661:9;32657:18;32649:26;;32721:9;32715:4;32711:20;32707:1;32696:9;32692:17;32685:47;32749:131;32875:4;32749:131;:::i;:::-;32741:139;;32468:419;;;:::o;32893:224::-;33033:34;33029:1;33021:6;33017:14;33010:58;33102:7;33097:2;33089:6;33085:15;33078:32;32893:224;:::o;33123:366::-;33265:3;33286:67;33350:2;33345:3;33286:67;:::i;:::-;33279:74;;33362:93;33451:3;33362:93;:::i;:::-;33480:2;33475:3;33471:12;33464:19;;33123:366;;;:::o;33495:419::-;33661:4;33699:2;33688:9;33684:18;33676:26;;33748:9;33742:4;33738:20;33734:1;33723:9;33719:17;33712:47;33776:131;33902:4;33776:131;:::i;:::-;33768:139;;33495:419;;;:::o;33920:223::-;34060:34;34056:1;34048:6;34044:14;34037:58;34129:6;34124:2;34116:6;34112:15;34105:31;33920:223;:::o;34149:366::-;34291:3;34312:67;34376:2;34371:3;34312:67;:::i;:::-;34305:74;;34388:93;34477:3;34388:93;:::i;:::-;34506:2;34501:3;34497:12;34490:19;;34149:366;;;:::o;34521:419::-;34687:4;34725:2;34714:9;34710:18;34702:26;;34774:9;34768:4;34764:20;34760:1;34749:9;34745:17;34738:47;34802:131;34928:4;34802:131;:::i;:::-;34794:139;;34521:419;;;:::o;34946:175::-;35086:27;35082:1;35074:6;35070:14;35063:51;34946:175;:::o;35127:366::-;35269:3;35290:67;35354:2;35349:3;35290:67;:::i;:::-;35283:74;;35366:93;35455:3;35366:93;:::i;:::-;35484:2;35479:3;35475:12;35468:19;;35127:366;;;:::o;35499:419::-;35665:4;35703:2;35692:9;35688:18;35680:26;;35752:9;35746:4;35742:20;35738:1;35727:9;35723:17;35716:47;35780:131;35906:4;35780:131;:::i;:::-;35772:139;;35499:419;;;:::o;35924:237::-;36064:34;36060:1;36052:6;36048:14;36041:58;36133:20;36128:2;36120:6;36116:15;36109:45;35924:237;:::o;36167:366::-;36309:3;36330:67;36394:2;36389:3;36330:67;:::i;:::-;36323:74;;36406:93;36495:3;36406:93;:::i;:::-;36524:2;36519:3;36515:12;36508:19;;36167:366;;;:::o;36539:419::-;36705:4;36743:2;36732:9;36728:18;36720:26;;36792:9;36786:4;36782:20;36778:1;36767:9;36763:17;36756:47;36820:131;36946:4;36820:131;:::i;:::-;36812:139;;36539:419;;;:::o;36964:233::-;37003:3;37026:24;37044:5;37026:24;:::i;:::-;37017:33;;37072:66;37065:5;37062:77;37059:103;;37142:18;;:::i;:::-;37059:103;37189:1;37182:5;37178:13;37171:20;;36964:233;;;:::o;37203:180::-;37251:77;37248:1;37241:88;37348:4;37345:1;37338:15;37372:4;37369:1;37362:15;37389:185;37429:1;37446:20;37464:1;37446:20;:::i;:::-;37441:25;;37480:20;37498:1;37480:20;:::i;:::-;37475:25;;37519:1;37509:35;;37524:18;;:::i;:::-;37509:35;37566:1;37563;37559:9;37554:14;;37389:185;;;;:::o;37580:176::-;37612:1;37629:20;37647:1;37629:20;:::i;:::-;37624:25;;37663:20;37681:1;37663:20;:::i;:::-;37658:25;;37702:1;37692:35;;37707:18;;:::i;:::-;37692:35;37748:1;37745;37741:9;37736:14;;37580:176;;;;:::o;37762:180::-;37810:77;37807:1;37800:88;37907:4;37904:1;37897:15;37931:4;37928:1;37921:15;37948:553;38125:4;38163:3;38152:9;38148:19;38140:27;;38177:71;38245:1;38234:9;38230:17;38221:6;38177:71;:::i;:::-;38258:72;38326:2;38315:9;38311:18;38302:6;38258:72;:::i;:::-;38340;38408:2;38397:9;38393:18;38384:6;38340:72;:::i;:::-;38422;38490:2;38479:9;38475:18;38466:6;38422:72;:::i;:::-;37948:553;;;;;;;:::o;38507:214::-;38647:66;38643:1;38635:6;38631:14;38624:90;38507:214;:::o;38727:400::-;38887:3;38908:84;38990:1;38985:3;38908:84;:::i;:::-;38901:91;;39001:93;39090:3;39001:93;:::i;:::-;39119:1;39114:3;39110:11;39103:18;;38727:400;;;:::o;39133:79::-;39172:7;39201:5;39190:16;;39133:79;;;:::o;39218:157::-;39323:45;39343:24;39361:5;39343:24;:::i;:::-;39323:45;:::i;:::-;39318:3;39311:58;39218:157;;:::o;39381:663::-;39622:3;39644:148;39788:3;39644:148;:::i;:::-;39637:155;;39802:75;39873:3;39864:6;39802:75;:::i;:::-;39902:2;39897:3;39893:12;39886:19;;39915:75;39986:3;39977:6;39915:75;:::i;:::-;40015:2;40010:3;40006:12;39999:19;;40035:3;40028:10;;39381:663;;;;;:::o;40050:640::-;40245:4;40283:3;40272:9;40268:19;40260:27;;40297:71;40365:1;40354:9;40350:17;40341:6;40297:71;:::i;:::-;40378:72;40446:2;40435:9;40431:18;40422:6;40378:72;:::i;:::-;40460;40528:2;40517:9;40513:18;40504:6;40460:72;:::i;:::-;40579:9;40573:4;40569:20;40564:2;40553:9;40549:18;40542:48;40607:76;40678:4;40669:6;40607:76;:::i;:::-;40599:84;;40050:640;;;;;;;:::o;40696:141::-;40752:5;40783:6;40777:13;40768:22;;40799:32;40825:5;40799:32;:::i;:::-;40696:141;;;;:::o;40843:349::-;40912:6;40961:2;40949:9;40940:7;40936:23;40932:32;40929:119;;;40967:79;;:::i;:::-;40929:119;41087:1;41112:63;41167:7;41158:6;41147:9;41143:22;41112:63;:::i;:::-;41102:73;;41058:127;40843:349;;;;:::o;41198:182::-;41338:34;41334:1;41326:6;41322:14;41315:58;41198:182;:::o;41386:366::-;41528:3;41549:67;41613:2;41608:3;41549:67;:::i;:::-;41542:74;;41625:93;41714:3;41625:93;:::i;:::-;41743:2;41738:3;41734:12;41727:19;;41386:366;;;:::o;41758:419::-;41924:4;41962:2;41951:9;41947:18;41939:26;;42011:9;42005:4;42001:20;41997:1;41986:9;41982:17;41975:47;42039:131;42165:4;42039:131;:::i;:::-;42031:139;;41758:419;;;:::o;42183:178::-;42323:30;42319:1;42311:6;42307:14;42300:54;42183:178;:::o;42367:366::-;42509:3;42530:67;42594:2;42589:3;42530:67;:::i;:::-;42523:74;;42606:93;42695:3;42606:93;:::i;:::-;42724:2;42719:3;42715:12;42708:19;;42367:366;;;:::o;42739:419::-;42905:4;42943:2;42932:9;42928:18;42920:26;;42992:9;42986:4;42982:20;42978:1;42967:9;42963:17;42956:47;43020:131;43146:4;43020:131;:::i;:::-;43012:139;;42739:419;;;:::o

Swarm Source

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