ETH Price: $3,300.66 (-3.26%)
Gas: 20 Gwei

Token

200 Keys (KEYS)
 

Overview

Max Total Supply

550 KEYS

Holders

192

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sgniwder.eth
Balance
3 KEYS
0xd1642fcc093202f30e64d28eb8de8d0714958f8f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

NFT keychains that unlock content created through proposal and DAO governance.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TwoHundredKeys

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-15
*/

// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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





// File: @openzeppelin/contracts/token/ERC721/IERC721.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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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




contract TwoHundredKeys is ERC721, ERC721Enumerable, Ownable {

  uint public constant MAX_SUPPLY = 10000;
  uint private constant MAX_MINT_PER_CALL = 20;

  bool public saleActive = false;

  uint256 private _price = 100000000000000000; //0.10 ETH
  string private _baseTokenURI = "ipfs://QmTN7q7KrGxPs2jAAtBgvKME1WZtEacEQUTCVXcoFehjke/";



  constructor() ERC721("200 Keys", "KEYS") {
  }



  function _baseURI() internal view override(ERC721) returns (string memory) {
    return _baseTokenURI;
  }

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

  function getBaseURI() external view returns(string memory) {
    return _baseTokenURI;
  }



  function setPrice(uint256 price) public onlyOwner {
    _price = price;
  }

  function getPrice() external view returns(uint256) {
    return _price;
  }


   function tokensOfHolder(address _holder) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_holder);
    if (tokenCount == 0) {
      // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_holder, index);
      }
      return result;
    }
  }

  function mint(uint256 numNFTs) public payable {
    require(saleActive, "Sale is not active");
    require(MAX_SUPPLY > totalSupply(), "Minting has already finished");
    require(numNFTs > 0 && numNFTs <= MAX_MINT_PER_CALL, "Mint exceeds MAX_MINT_PER_CALL");
    require(MAX_SUPPLY >= totalSupply() + numNFTs, "Mint would exceed MAX_SUPPLY");
    require(msg.value >= _price * numNFTs, "Too little ETH sent");

    for (uint i = 0; i < numNFTs; i++) {
      uint mintIndex = totalSupply() + 1; // +1 so it doesn't start on index 0.
      _safeMint(msg.sender, mintIndex);
    }
  }

  function toggleSaleState() public onlyOwner {
    saleActive = !saleActive;
  }

  function withdraw() public onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }

  function _beforeTokenTransfer(address from, address to, uint256 tokenId)
    internal
    override(ERC721, ERC721Enumerable)
  {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function _burn(uint256 tokenId) internal override(ERC721) {
    super._burn(tokenId);
  }

  function tokenURI(uint256 tokenId)
    public
    view
    override(ERC721)
    returns (string memory)
  {
    return super.tokenURI(tokenId);
  }


  function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721, ERC721Enumerable)
    returns (bool)
  {
    return super.supportsInterface(interfaceId);
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numNFTs","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"name":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"tokensOfHolder","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff02191690831515021790555067016345785d8a0000600b55604051806060016040528060368152602001620043c860369139600c90805190602001906200005c929190620001ff565b503480156200006a57600080fd5b506040518060400160405280600881526020017f323030204b6579730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4b455953000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ef929190620001ff565b50806001908051906020019062000108929190620001ff565b5050506200012b6200011f6200013160201b60201c565b6200013960201b60201c565b62000314565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020d90620002af565b90600052602060002090601f0160209004810192826200023157600085556200027d565b82601f106200024c57805160ff19168380011785556200027d565b828001600101855582156200027d579182015b828111156200027c5782518255916020019190600101906200025f565b5b5090506200028c919062000290565b5090565b5b80821115620002ab57600081600090555060010162000291565b5090565b60006002820490506001821680620002c857607f821691505b60208210811415620002df57620002de620002e5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6140a480620003246000396000f3fe6080604052600436106101c25760003560e01c806368428a1b116100f757806398d5fdca11610095578063c87b56dd11610064578063c87b56dd14610633578063daaeec8614610670578063e985e9c514610687578063f2fde38b146106c4576101c2565b806398d5fdca1461059a578063a0712d68146105c5578063a22cb465146105e1578063b88d4fde1461060a576101c2565b8063715018a6116100d1578063715018a6146105045780638da5cb5b1461051b57806391b7f5ed1461054657806395d89b411461056f576101c2565b806368428a1b1461047157806370a082311461049c578063714c5398146104d9576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103a55780634f6ccce7146103ce57806355f804b31461040b5780636352211e14610434576101c2565b80632f745c591461032657806332cb6b0c146103635780633ccfd60b1461038e576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c0578063283bf720146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612df7565b6106ed565b6040516101fb9190613889565b60405180910390f35b34801561021057600080fd5b506102196106ff565b60405161022691906138a4565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612e8a565b610791565b6040516102639190613800565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612dbb565b610816565b005b3480156102a157600080fd5b506102aa61092e565b6040516102b79190613ba6565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612cb5565b61093b565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612c50565b61099b565b60405161031d9190613867565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190612dbb565b610b17565b60405161035a9190613ba6565b60405180910390f35b34801561036f57600080fd5b50610378610bbc565b6040516103859190613ba6565b60405180910390f35b34801561039a57600080fd5b506103a3610bc2565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190612cb5565b610c7e565b005b3480156103da57600080fd5b506103f560048036038101906103f09190612e8a565b610c9e565b6040516104029190613ba6565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190612e49565b610d35565b005b34801561044057600080fd5b5061045b60048036038101906104569190612e8a565b610dcb565b6040516104689190613800565b60405180910390f35b34801561047d57600080fd5b50610486610e7d565b6040516104939190613889565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be9190612c50565b610e90565b6040516104d09190613ba6565b60405180910390f35b3480156104e557600080fd5b506104ee610f48565b6040516104fb91906138a4565b60405180910390f35b34801561051057600080fd5b50610519610fda565b005b34801561052757600080fd5b50610530611062565b60405161053d9190613800565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190612e8a565b61108c565b005b34801561057b57600080fd5b50610584611112565b60405161059191906138a4565b60405180910390f35b3480156105a657600080fd5b506105af6111a4565b6040516105bc9190613ba6565b60405180910390f35b6105df60048036038101906105da9190612e8a565b6111ae565b005b3480156105ed57600080fd5b5061060860048036038101906106039190612d7f565b611384565b005b34801561061657600080fd5b50610631600480360381019061062c9190612d04565b611505565b005b34801561063f57600080fd5b5061065a60048036038101906106559190612e8a565b611567565b60405161066791906138a4565b60405180910390f35b34801561067c57600080fd5b50610685611579565b005b34801561069357600080fd5b506106ae60048036038101906106a99190612c79565b611621565b6040516106bb9190613889565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612c50565b6116b5565b005b60006106f8826117ad565b9050919050565b60606000805461070e90613e99565b80601f016020809104026020016040519081016040528092919081815260200182805461073a90613e99565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b5050505050905090565b600061079c82611827565b6107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290613ac6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082182610dcb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088990613b46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b1611893565b73ffffffffffffffffffffffffffffffffffffffff1614806108e057506108df816108da611893565b611621565b5b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690613a06565b60405180910390fd5b610929838361189b565b505050565b6000600880549050905090565b61094c610946611893565b82611954565b61098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098290613b66565b60405180910390fd5b610996838383611a32565b505050565b606060006109a883610e90565b90506000811415610a2b57600067ffffffffffffffff8111156109f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a225781602001602082028036833780820191505090505b50915050610b12565b60008167ffffffffffffffff811115610a6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a9b5781602001602082028036833780820191505090505b50905060005b82811015610b0b57610ab38582610b17565b828281518110610aec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610b0390613ecb565b915050610aa1565b8193505050505b919050565b6000610b2283610e90565b8210610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a906138c6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610bca611893565b73ffffffffffffffffffffffffffffffffffffffff16610be8611062565b73ffffffffffffffffffffffffffffffffffffffff1614610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590613ae6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c7c57600080fd5b565b610c9983838360405180602001604052806000815250611505565b505050565b6000610ca861092e565b8210610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613b86565b60405180910390fd5b60088281548110610d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d3d611893565b73ffffffffffffffffffffffffffffffffffffffff16610d5b611062565b73ffffffffffffffffffffffffffffffffffffffff1614610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890613ae6565b60405180910390fd5b80600c9080519060200190610dc7929190612a74565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90613a46565b60405180910390fd5b80915050919050565b600a60149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613a26565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600c8054610f5790613e99565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8390613e99565b8015610fd05780601f10610fa557610100808354040283529160200191610fd0565b820191906000526020600020905b815481529060010190602001808311610fb357829003601f168201915b5050505050905090565b610fe2611893565b73ffffffffffffffffffffffffffffffffffffffff16611000611062565b73ffffffffffffffffffffffffffffffffffffffff1614611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d90613ae6565b60405180910390fd5b6110606000611c8e565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611094611893565b73ffffffffffffffffffffffffffffffffffffffff166110b2611062565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613ae6565b60405180910390fd5b80600b8190555050565b60606001805461112190613e99565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90613e99565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b6000600b54905090565b600a60149054906101000a900460ff166111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490613986565b60405180910390fd5b61120561092e565b61271011611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f906139e6565b60405180910390fd5b600081118015611259575060148111155b611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613a86565b60405180910390fd5b806112a161092e565b6112ab9190613cce565b61271010156112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e6906139a6565b60405180910390fd5b80600b546112fd9190613d55565b34101561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690613a66565b60405180910390fd5b60005b81811015611380576000600161135661092e565b6113609190613cce565b905061136c3382611d54565b50808061137890613ecb565b915050611342565b5050565b61138c611893565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190613966565b60405180910390fd5b8060056000611407611893565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b4611893565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f99190613889565b60405180910390a35050565b611516611510611893565b83611954565b611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c90613b66565b60405180910390fd5b61156184848484611d72565b50505050565b606061157282611dce565b9050919050565b611581611893565b73ffffffffffffffffffffffffffffffffffffffff1661159f611062565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90613ae6565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116bd611893565b73ffffffffffffffffffffffffffffffffffffffff166116db611062565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613ae6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890613906565b60405180910390fd5b6117aa81611c8e565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611820575061181f82611e75565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661190e83610dcb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061195f82611827565b61199e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611995906139c6565b60405180910390fd5b60006119a983610dcb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a1857508373ffffffffffffffffffffffffffffffffffffffff16611a0084610791565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a295750611a288185611621565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a5282610dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90613b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f90613946565b60405180910390fd5b611b23838383611f57565b611b2e60008261189b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b7e9190613daf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd59190613cce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d6e828260405180602001604052806000815250611f67565b5050565b611d7d848484611a32565b611d8984848484611fc2565b611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906138e6565b60405180910390fd5b50505050565b6060611dd982611827565b611e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0f90613b26565b60405180910390fd5b6000611e22612159565b90506000815111611e425760405180602001604052806000815250611e6d565b80611e4c846121eb565b604051602001611e5d9291906137dc565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f505750611f4f82612398565b5b9050919050565b611f62838383612402565b505050565b611f718383612516565b611f7e6000848484611fc2565b611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb4906138e6565b60405180910390fd5b505050565b6000611fe38473ffffffffffffffffffffffffffffffffffffffff166126e4565b1561214c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261200c611893565b8786866040518563ffffffff1660e01b815260040161202e949392919061381b565b602060405180830381600087803b15801561204857600080fd5b505af192505050801561207957506040513d601f19601f820116820180604052508101906120769190612e20565b60015b6120fc573d80600081146120a9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ae565b606091505b506000815114156120f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120eb906138e6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612151565b600190505b949350505050565b6060600c805461216890613e99565b80601f016020809104026020016040519081016040528092919081815260200182805461219490613e99565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b5050505050905090565b60606000821415612233576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612393565b600082905060005b6000821461226557808061224e90613ecb565b915050600a8261225e9190613d24565b915061223b565b60008167ffffffffffffffff8111156122a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d95781602001600182028036833780820191505090505b5090505b6000851461238c576001826122f29190613daf565b9150600a856123019190613f14565b603061230d9190613cce565b60f81b818381518110612349577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123859190613d24565b94506122dd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61240d8383836126f7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124505761244b816126fc565b61248f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461248e5761248d8382612745565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124d2576124cd816128b2565b612511565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125105761250f82826129f5565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90613aa6565b60405180910390fd5b61258f81611827565b156125cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c690613926565b60405180910390fd5b6125db60008383611f57565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262b9190613cce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161275284610e90565b61275c9190613daf565b9050600060076000848152602001908152602001600020549050818114612841576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128c69190613daf565b905060006009600084815260200190815260200160002054905060006008838154811061291c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612964577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a0083610e90565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612a8090613e99565b90600052602060002090601f016020900481019282612aa25760008555612ae9565b82601f10612abb57805160ff1916838001178555612ae9565b82800160010185558215612ae9579182015b82811115612ae8578251825591602001919060010190612acd565b5b509050612af69190612afa565b5090565b5b80821115612b13576000816000905550600101612afb565b5090565b6000612b2a612b2584613bf2565b613bc1565b905082815260208101848484011115612b4257600080fd5b612b4d848285613e57565b509392505050565b6000612b68612b6384613c22565b613bc1565b905082815260208101848484011115612b8057600080fd5b612b8b848285613e57565b509392505050565b600081359050612ba281614012565b92915050565b600081359050612bb781614029565b92915050565b600081359050612bcc81614040565b92915050565b600081519050612be181614040565b92915050565b600082601f830112612bf857600080fd5b8135612c08848260208601612b17565b91505092915050565b600082601f830112612c2257600080fd5b8135612c32848260208601612b55565b91505092915050565b600081359050612c4a81614057565b92915050565b600060208284031215612c6257600080fd5b6000612c7084828501612b93565b91505092915050565b60008060408385031215612c8c57600080fd5b6000612c9a85828601612b93565b9250506020612cab85828601612b93565b9150509250929050565b600080600060608486031215612cca57600080fd5b6000612cd886828701612b93565b9350506020612ce986828701612b93565b9250506040612cfa86828701612c3b565b9150509250925092565b60008060008060808587031215612d1a57600080fd5b6000612d2887828801612b93565b9450506020612d3987828801612b93565b9350506040612d4a87828801612c3b565b925050606085013567ffffffffffffffff811115612d6757600080fd5b612d7387828801612be7565b91505092959194509250565b60008060408385031215612d9257600080fd5b6000612da085828601612b93565b9250506020612db185828601612ba8565b9150509250929050565b60008060408385031215612dce57600080fd5b6000612ddc85828601612b93565b9250506020612ded85828601612c3b565b9150509250929050565b600060208284031215612e0957600080fd5b6000612e1784828501612bbd565b91505092915050565b600060208284031215612e3257600080fd5b6000612e4084828501612bd2565b91505092915050565b600060208284031215612e5b57600080fd5b600082013567ffffffffffffffff811115612e7557600080fd5b612e8184828501612c11565b91505092915050565b600060208284031215612e9c57600080fd5b6000612eaa84828501612c3b565b91505092915050565b6000612ebf83836137be565b60208301905092915050565b612ed481613de3565b82525050565b6000612ee582613c62565b612eef8185613c90565b9350612efa83613c52565b8060005b83811015612f2b578151612f128882612eb3565b9750612f1d83613c83565b925050600181019050612efe565b5085935050505092915050565b612f4181613df5565b82525050565b6000612f5282613c6d565b612f5c8185613ca1565b9350612f6c818560208601613e66565b612f7581614001565b840191505092915050565b6000612f8b82613c78565b612f958185613cb2565b9350612fa5818560208601613e66565b612fae81614001565b840191505092915050565b6000612fc482613c78565b612fce8185613cc3565b9350612fde818560208601613e66565b80840191505092915050565b6000612ff7602b83613cb2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061305d603283613cb2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006130c3602683613cb2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613129601c83613cb2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613169602483613cb2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131cf601983613cb2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061320f601283613cb2565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b600061324f601c83613cb2565b91507f4d696e7420776f756c6420657863656564204d41585f535550504c59000000006000830152602082019050919050565b600061328f602c83613cb2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006132f5601c83613cb2565b91507f4d696e74696e672068617320616c72656164792066696e6973686564000000006000830152602082019050919050565b6000613335603883613cb2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061339b602a83613cb2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613401602983613cb2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613467601383613cb2565b91507f546f6f206c6974746c65204554482073656e74000000000000000000000000006000830152602082019050919050565b60006134a7601e83613cb2565b91507f4d696e742065786365656473204d41585f4d494e545f5045525f43414c4c00006000830152602082019050919050565b60006134e7602083613cb2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613527602c83613cb2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061358d602083613cb2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006135cd602983613cb2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613633602f83613cb2565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613699602183613cb2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136ff603183613cb2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613765602c83613cb2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6137c781613e4d565b82525050565b6137d681613e4d565b82525050565b60006137e88285612fb9565b91506137f48284612fb9565b91508190509392505050565b60006020820190506138156000830184612ecb565b92915050565b60006080820190506138306000830187612ecb565b61383d6020830186612ecb565b61384a60408301856137cd565b818103606083015261385c8184612f47565b905095945050505050565b600060208201905081810360008301526138818184612eda565b905092915050565b600060208201905061389e6000830184612f38565b92915050565b600060208201905081810360008301526138be8184612f80565b905092915050565b600060208201905081810360008301526138df81612fea565b9050919050565b600060208201905081810360008301526138ff81613050565b9050919050565b6000602082019050818103600083015261391f816130b6565b9050919050565b6000602082019050818103600083015261393f8161311c565b9050919050565b6000602082019050818103600083015261395f8161315c565b9050919050565b6000602082019050818103600083015261397f816131c2565b9050919050565b6000602082019050818103600083015261399f81613202565b9050919050565b600060208201905081810360008301526139bf81613242565b9050919050565b600060208201905081810360008301526139df81613282565b9050919050565b600060208201905081810360008301526139ff816132e8565b9050919050565b60006020820190508181036000830152613a1f81613328565b9050919050565b60006020820190508181036000830152613a3f8161338e565b9050919050565b60006020820190508181036000830152613a5f816133f4565b9050919050565b60006020820190508181036000830152613a7f8161345a565b9050919050565b60006020820190508181036000830152613a9f8161349a565b9050919050565b60006020820190508181036000830152613abf816134da565b9050919050565b60006020820190508181036000830152613adf8161351a565b9050919050565b60006020820190508181036000830152613aff81613580565b9050919050565b60006020820190508181036000830152613b1f816135c0565b9050919050565b60006020820190508181036000830152613b3f81613626565b9050919050565b60006020820190508181036000830152613b5f8161368c565b9050919050565b60006020820190508181036000830152613b7f816136f2565b9050919050565b60006020820190508181036000830152613b9f81613758565b9050919050565b6000602082019050613bbb60008301846137cd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613be857613be7613fd2565b5b8060405250919050565b600067ffffffffffffffff821115613c0d57613c0c613fd2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613c3d57613c3c613fd2565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cd982613e4d565b9150613ce483613e4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1957613d18613f45565b5b828201905092915050565b6000613d2f82613e4d565b9150613d3a83613e4d565b925082613d4a57613d49613f74565b5b828204905092915050565b6000613d6082613e4d565b9150613d6b83613e4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613da457613da3613f45565b5b828202905092915050565b6000613dba82613e4d565b9150613dc583613e4d565b925082821015613dd857613dd7613f45565b5b828203905092915050565b6000613dee82613e2d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e84578082015181840152602081019050613e69565b83811115613e93576000848401525b50505050565b60006002820490506001821680613eb157607f821691505b60208210811415613ec557613ec4613fa3565b5b50919050565b6000613ed682613e4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0957613f08613f45565b5b600182019050919050565b6000613f1f82613e4d565b9150613f2a83613e4d565b925082613f3a57613f39613f74565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61401b81613de3565b811461402657600080fd5b50565b61403281613df5565b811461403d57600080fd5b50565b61404981613e01565b811461405457600080fd5b50565b61406081613e4d565b811461406b57600080fd5b5056fea264697066735822122030d531bc4914e51c21de8421e4fd9620510216ab52c4222d26a0b184e2f4d40e64736f6c63430008000033697066733a2f2f516d544e3771374b7247785073326a4141744267764b4d4531575a7445616345515554435658636f4665686a6b652f

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806368428a1b116100f757806398d5fdca11610095578063c87b56dd11610064578063c87b56dd14610633578063daaeec8614610670578063e985e9c514610687578063f2fde38b146106c4576101c2565b806398d5fdca1461059a578063a0712d68146105c5578063a22cb465146105e1578063b88d4fde1461060a576101c2565b8063715018a6116100d1578063715018a6146105045780638da5cb5b1461051b57806391b7f5ed1461054657806395d89b411461056f576101c2565b806368428a1b1461047157806370a082311461049c578063714c5398146104d9576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103a55780634f6ccce7146103ce57806355f804b31461040b5780636352211e14610434576101c2565b80632f745c591461032657806332cb6b0c146103635780633ccfd60b1461038e576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c0578063283bf720146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612df7565b6106ed565b6040516101fb9190613889565b60405180910390f35b34801561021057600080fd5b506102196106ff565b60405161022691906138a4565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612e8a565b610791565b6040516102639190613800565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612dbb565b610816565b005b3480156102a157600080fd5b506102aa61092e565b6040516102b79190613ba6565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612cb5565b61093b565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612c50565b61099b565b60405161031d9190613867565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190612dbb565b610b17565b60405161035a9190613ba6565b60405180910390f35b34801561036f57600080fd5b50610378610bbc565b6040516103859190613ba6565b60405180910390f35b34801561039a57600080fd5b506103a3610bc2565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190612cb5565b610c7e565b005b3480156103da57600080fd5b506103f560048036038101906103f09190612e8a565b610c9e565b6040516104029190613ba6565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190612e49565b610d35565b005b34801561044057600080fd5b5061045b60048036038101906104569190612e8a565b610dcb565b6040516104689190613800565b60405180910390f35b34801561047d57600080fd5b50610486610e7d565b6040516104939190613889565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be9190612c50565b610e90565b6040516104d09190613ba6565b60405180910390f35b3480156104e557600080fd5b506104ee610f48565b6040516104fb91906138a4565b60405180910390f35b34801561051057600080fd5b50610519610fda565b005b34801561052757600080fd5b50610530611062565b60405161053d9190613800565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190612e8a565b61108c565b005b34801561057b57600080fd5b50610584611112565b60405161059191906138a4565b60405180910390f35b3480156105a657600080fd5b506105af6111a4565b6040516105bc9190613ba6565b60405180910390f35b6105df60048036038101906105da9190612e8a565b6111ae565b005b3480156105ed57600080fd5b5061060860048036038101906106039190612d7f565b611384565b005b34801561061657600080fd5b50610631600480360381019061062c9190612d04565b611505565b005b34801561063f57600080fd5b5061065a60048036038101906106559190612e8a565b611567565b60405161066791906138a4565b60405180910390f35b34801561067c57600080fd5b50610685611579565b005b34801561069357600080fd5b506106ae60048036038101906106a99190612c79565b611621565b6040516106bb9190613889565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612c50565b6116b5565b005b60006106f8826117ad565b9050919050565b60606000805461070e90613e99565b80601f016020809104026020016040519081016040528092919081815260200182805461073a90613e99565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b5050505050905090565b600061079c82611827565b6107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d290613ac6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082182610dcb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088990613b46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b1611893565b73ffffffffffffffffffffffffffffffffffffffff1614806108e057506108df816108da611893565b611621565b5b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690613a06565b60405180910390fd5b610929838361189b565b505050565b6000600880549050905090565b61094c610946611893565b82611954565b61098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098290613b66565b60405180910390fd5b610996838383611a32565b505050565b606060006109a883610e90565b90506000811415610a2b57600067ffffffffffffffff8111156109f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a225781602001602082028036833780820191505090505b50915050610b12565b60008167ffffffffffffffff811115610a6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610a9b5781602001602082028036833780820191505090505b50905060005b82811015610b0b57610ab38582610b17565b828281518110610aec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610b0390613ecb565b915050610aa1565b8193505050505b919050565b6000610b2283610e90565b8210610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a906138c6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610bca611893565b73ffffffffffffffffffffffffffffffffffffffff16610be8611062565b73ffffffffffffffffffffffffffffffffffffffff1614610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3590613ae6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c7c57600080fd5b565b610c9983838360405180602001604052806000815250611505565b505050565b6000610ca861092e565b8210610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613b86565b60405180910390fd5b60088281548110610d23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d3d611893565b73ffffffffffffffffffffffffffffffffffffffff16610d5b611062565b73ffffffffffffffffffffffffffffffffffffffff1614610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890613ae6565b60405180910390fd5b80600c9080519060200190610dc7929190612a74565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90613a46565b60405180910390fd5b80915050919050565b600a60149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890613a26565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600c8054610f5790613e99565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8390613e99565b8015610fd05780601f10610fa557610100808354040283529160200191610fd0565b820191906000526020600020905b815481529060010190602001808311610fb357829003601f168201915b5050505050905090565b610fe2611893565b73ffffffffffffffffffffffffffffffffffffffff16611000611062565b73ffffffffffffffffffffffffffffffffffffffff1614611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d90613ae6565b60405180910390fd5b6110606000611c8e565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611094611893565b73ffffffffffffffffffffffffffffffffffffffff166110b2611062565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90613ae6565b60405180910390fd5b80600b8190555050565b60606001805461112190613e99565b80601f016020809104026020016040519081016040528092919081815260200182805461114d90613e99565b801561119a5780601f1061116f5761010080835404028352916020019161119a565b820191906000526020600020905b81548152906001019060200180831161117d57829003601f168201915b5050505050905090565b6000600b54905090565b600a60149054906101000a900460ff166111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490613986565b60405180910390fd5b61120561092e565b61271011611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f906139e6565b60405180910390fd5b600081118015611259575060148111155b611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613a86565b60405180910390fd5b806112a161092e565b6112ab9190613cce565b61271010156112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e6906139a6565b60405180910390fd5b80600b546112fd9190613d55565b34101561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690613a66565b60405180910390fd5b60005b81811015611380576000600161135661092e565b6113609190613cce565b905061136c3382611d54565b50808061137890613ecb565b915050611342565b5050565b61138c611893565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190613966565b60405180910390fd5b8060056000611407611893565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b4611893565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f99190613889565b60405180910390a35050565b611516611510611893565b83611954565b611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c90613b66565b60405180910390fd5b61156184848484611d72565b50505050565b606061157282611dce565b9050919050565b611581611893565b73ffffffffffffffffffffffffffffffffffffffff1661159f611062565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90613ae6565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116bd611893565b73ffffffffffffffffffffffffffffffffffffffff166116db611062565b73ffffffffffffffffffffffffffffffffffffffff1614611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613ae6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890613906565b60405180910390fd5b6117aa81611c8e565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611820575061181f82611e75565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661190e83610dcb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061195f82611827565b61199e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611995906139c6565b60405180910390fd5b60006119a983610dcb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a1857508373ffffffffffffffffffffffffffffffffffffffff16611a0084610791565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a295750611a288185611621565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a5282610dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90613b06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f90613946565b60405180910390fd5b611b23838383611f57565b611b2e60008261189b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b7e9190613daf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd59190613cce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d6e828260405180602001604052806000815250611f67565b5050565b611d7d848484611a32565b611d8984848484611fc2565b611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906138e6565b60405180910390fd5b50505050565b6060611dd982611827565b611e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0f90613b26565b60405180910390fd5b6000611e22612159565b90506000815111611e425760405180602001604052806000815250611e6d565b80611e4c846121eb565b604051602001611e5d9291906137dc565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f505750611f4f82612398565b5b9050919050565b611f62838383612402565b505050565b611f718383612516565b611f7e6000848484611fc2565b611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb4906138e6565b60405180910390fd5b505050565b6000611fe38473ffffffffffffffffffffffffffffffffffffffff166126e4565b1561214c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261200c611893565b8786866040518563ffffffff1660e01b815260040161202e949392919061381b565b602060405180830381600087803b15801561204857600080fd5b505af192505050801561207957506040513d601f19601f820116820180604052508101906120769190612e20565b60015b6120fc573d80600081146120a9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ae565b606091505b506000815114156120f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120eb906138e6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612151565b600190505b949350505050565b6060600c805461216890613e99565b80601f016020809104026020016040519081016040528092919081815260200182805461219490613e99565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b5050505050905090565b60606000821415612233576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612393565b600082905060005b6000821461226557808061224e90613ecb565b915050600a8261225e9190613d24565b915061223b565b60008167ffffffffffffffff8111156122a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d95781602001600182028036833780820191505090505b5090505b6000851461238c576001826122f29190613daf565b9150600a856123019190613f14565b603061230d9190613cce565b60f81b818381518110612349577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123859190613d24565b94506122dd565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61240d8383836126f7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124505761244b816126fc565b61248f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461248e5761248d8382612745565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124d2576124cd816128b2565b612511565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125105761250f82826129f5565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90613aa6565b60405180910390fd5b61258f81611827565b156125cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c690613926565b60405180910390fd5b6125db60008383611f57565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262b9190613cce565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161275284610e90565b61275c9190613daf565b9050600060076000848152602001908152602001600020549050818114612841576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128c69190613daf565b905060006009600084815260200190815260200160002054905060006008838154811061291c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612964577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a0083610e90565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612a8090613e99565b90600052602060002090601f016020900481019282612aa25760008555612ae9565b82601f10612abb57805160ff1916838001178555612ae9565b82800160010185558215612ae9579182015b82811115612ae8578251825591602001919060010190612acd565b5b509050612af69190612afa565b5090565b5b80821115612b13576000816000905550600101612afb565b5090565b6000612b2a612b2584613bf2565b613bc1565b905082815260208101848484011115612b4257600080fd5b612b4d848285613e57565b509392505050565b6000612b68612b6384613c22565b613bc1565b905082815260208101848484011115612b8057600080fd5b612b8b848285613e57565b509392505050565b600081359050612ba281614012565b92915050565b600081359050612bb781614029565b92915050565b600081359050612bcc81614040565b92915050565b600081519050612be181614040565b92915050565b600082601f830112612bf857600080fd5b8135612c08848260208601612b17565b91505092915050565b600082601f830112612c2257600080fd5b8135612c32848260208601612b55565b91505092915050565b600081359050612c4a81614057565b92915050565b600060208284031215612c6257600080fd5b6000612c7084828501612b93565b91505092915050565b60008060408385031215612c8c57600080fd5b6000612c9a85828601612b93565b9250506020612cab85828601612b93565b9150509250929050565b600080600060608486031215612cca57600080fd5b6000612cd886828701612b93565b9350506020612ce986828701612b93565b9250506040612cfa86828701612c3b565b9150509250925092565b60008060008060808587031215612d1a57600080fd5b6000612d2887828801612b93565b9450506020612d3987828801612b93565b9350506040612d4a87828801612c3b565b925050606085013567ffffffffffffffff811115612d6757600080fd5b612d7387828801612be7565b91505092959194509250565b60008060408385031215612d9257600080fd5b6000612da085828601612b93565b9250506020612db185828601612ba8565b9150509250929050565b60008060408385031215612dce57600080fd5b6000612ddc85828601612b93565b9250506020612ded85828601612c3b565b9150509250929050565b600060208284031215612e0957600080fd5b6000612e1784828501612bbd565b91505092915050565b600060208284031215612e3257600080fd5b6000612e4084828501612bd2565b91505092915050565b600060208284031215612e5b57600080fd5b600082013567ffffffffffffffff811115612e7557600080fd5b612e8184828501612c11565b91505092915050565b600060208284031215612e9c57600080fd5b6000612eaa84828501612c3b565b91505092915050565b6000612ebf83836137be565b60208301905092915050565b612ed481613de3565b82525050565b6000612ee582613c62565b612eef8185613c90565b9350612efa83613c52565b8060005b83811015612f2b578151612f128882612eb3565b9750612f1d83613c83565b925050600181019050612efe565b5085935050505092915050565b612f4181613df5565b82525050565b6000612f5282613c6d565b612f5c8185613ca1565b9350612f6c818560208601613e66565b612f7581614001565b840191505092915050565b6000612f8b82613c78565b612f958185613cb2565b9350612fa5818560208601613e66565b612fae81614001565b840191505092915050565b6000612fc482613c78565b612fce8185613cc3565b9350612fde818560208601613e66565b80840191505092915050565b6000612ff7602b83613cb2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061305d603283613cb2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006130c3602683613cb2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613129601c83613cb2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613169602483613cb2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131cf601983613cb2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061320f601283613cb2565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b600061324f601c83613cb2565b91507f4d696e7420776f756c6420657863656564204d41585f535550504c59000000006000830152602082019050919050565b600061328f602c83613cb2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006132f5601c83613cb2565b91507f4d696e74696e672068617320616c72656164792066696e6973686564000000006000830152602082019050919050565b6000613335603883613cb2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061339b602a83613cb2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613401602983613cb2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613467601383613cb2565b91507f546f6f206c6974746c65204554482073656e74000000000000000000000000006000830152602082019050919050565b60006134a7601e83613cb2565b91507f4d696e742065786365656473204d41585f4d494e545f5045525f43414c4c00006000830152602082019050919050565b60006134e7602083613cb2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613527602c83613cb2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061358d602083613cb2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006135cd602983613cb2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613633602f83613cb2565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613699602183613cb2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136ff603183613cb2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613765602c83613cb2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6137c781613e4d565b82525050565b6137d681613e4d565b82525050565b60006137e88285612fb9565b91506137f48284612fb9565b91508190509392505050565b60006020820190506138156000830184612ecb565b92915050565b60006080820190506138306000830187612ecb565b61383d6020830186612ecb565b61384a60408301856137cd565b818103606083015261385c8184612f47565b905095945050505050565b600060208201905081810360008301526138818184612eda565b905092915050565b600060208201905061389e6000830184612f38565b92915050565b600060208201905081810360008301526138be8184612f80565b905092915050565b600060208201905081810360008301526138df81612fea565b9050919050565b600060208201905081810360008301526138ff81613050565b9050919050565b6000602082019050818103600083015261391f816130b6565b9050919050565b6000602082019050818103600083015261393f8161311c565b9050919050565b6000602082019050818103600083015261395f8161315c565b9050919050565b6000602082019050818103600083015261397f816131c2565b9050919050565b6000602082019050818103600083015261399f81613202565b9050919050565b600060208201905081810360008301526139bf81613242565b9050919050565b600060208201905081810360008301526139df81613282565b9050919050565b600060208201905081810360008301526139ff816132e8565b9050919050565b60006020820190508181036000830152613a1f81613328565b9050919050565b60006020820190508181036000830152613a3f8161338e565b9050919050565b60006020820190508181036000830152613a5f816133f4565b9050919050565b60006020820190508181036000830152613a7f8161345a565b9050919050565b60006020820190508181036000830152613a9f8161349a565b9050919050565b60006020820190508181036000830152613abf816134da565b9050919050565b60006020820190508181036000830152613adf8161351a565b9050919050565b60006020820190508181036000830152613aff81613580565b9050919050565b60006020820190508181036000830152613b1f816135c0565b9050919050565b60006020820190508181036000830152613b3f81613626565b9050919050565b60006020820190508181036000830152613b5f8161368c565b9050919050565b60006020820190508181036000830152613b7f816136f2565b9050919050565b60006020820190508181036000830152613b9f81613758565b9050919050565b6000602082019050613bbb60008301846137cd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613be857613be7613fd2565b5b8060405250919050565b600067ffffffffffffffff821115613c0d57613c0c613fd2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613c3d57613c3c613fd2565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cd982613e4d565b9150613ce483613e4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1957613d18613f45565b5b828201905092915050565b6000613d2f82613e4d565b9150613d3a83613e4d565b925082613d4a57613d49613f74565b5b828204905092915050565b6000613d6082613e4d565b9150613d6b83613e4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613da457613da3613f45565b5b828202905092915050565b6000613dba82613e4d565b9150613dc583613e4d565b925082821015613dd857613dd7613f45565b5b828203905092915050565b6000613dee82613e2d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e84578082015181840152602081019050613e69565b83811115613e93576000848401525b50505050565b60006002820490506001821680613eb157607f821691505b60208210811415613ec557613ec4613fa3565b5b50919050565b6000613ed682613e4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0957613f08613f45565b5b600182019050919050565b6000613f1f82613e4d565b9150613f2a83613e4d565b925082613f3a57613f39613f74565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61401b81613de3565b811461402657600080fd5b50565b61403281613df5565b811461403d57600080fd5b50565b61404981613e01565b811461405457600080fd5b50565b61406081613e4d565b811461406b57600080fd5b5056fea264697066735822122030d531bc4914e51c21de8421e4fd9620510216ab52c4222d26a0b184e2f4d40e64736f6c63430008000033

Deployed Bytecode Sourcemap

42103:2827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44737:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13061:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14620:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14143:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25776:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15510:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43004:476;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25444:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42171:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44172:106;;;;;;;;;;;;;:::i;:::-;;15920:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25966:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42631:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12755:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42266:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12485:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42733:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2378:94;;;;;;;;;;;;;:::i;:::-;;1727:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42835:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13230:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42918:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43486:593;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14913:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16176:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44575:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44085:81;;;;;;;;;;;;;:::i;:::-;;15279:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2627:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44737:188;44860:4;44883:36;44907:11;44883:23;:36::i;:::-;44876:43;;44737:188;;;:::o;13061:100::-;13115:13;13148:5;13141:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13061:100;:::o;14620:221::-;14696:7;14724:16;14732:7;14724;:16::i;:::-;14716:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14809:15;:24;14825:7;14809:24;;;;;;;;;;;;;;;;;;;;;14802:31;;14620:221;;;:::o;14143:411::-;14224:13;14240:23;14255:7;14240:14;:23::i;:::-;14224:39;;14288:5;14282:11;;:2;:11;;;;14274:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;14382:5;14366:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;14391:37;14408:5;14415:12;:10;:12::i;:::-;14391:16;:37::i;:::-;14366:62;14344:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;14525:21;14534:2;14538:7;14525:8;:21::i;:::-;14143:411;;;:::o;25776:113::-;25837:7;25864:10;:17;;;;25857:24;;25776:113;:::o;15510:339::-;15705:41;15724:12;:10;:12::i;:::-;15738:7;15705:18;:41::i;:::-;15697:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;15813:28;15823:4;15829:2;15833:7;15813:9;:28::i;:::-;15510:339;;;:::o;43004:476::-;43067:16;43093:18;43114;43124:7;43114:9;:18::i;:::-;43093:39;;43157:1;43143:10;:15;43139:336;;;43222:1;43208:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43201:23;;;;;43139:336;43247:23;43287:10;43273:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43247:51;;43307:13;43329:117;43353:10;43345:5;:18;43329:117;;;43401:35;43421:7;43430:5;43401:19;:35::i;:::-;43385:6;43392:5;43385:13;;;;;;;;;;;;;;;;;;;;;:51;;;;;43365:7;;;;;:::i;:::-;;;;43329:117;;;43461:6;43454:13;;;;;43004:476;;;;:::o;25444:256::-;25541:7;25577:23;25594:5;25577:16;:23::i;:::-;25569:5;:31;25561:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;25666:12;:19;25679:5;25666:19;;;;;;;;;;;;;;;:26;25686:5;25666:26;;;;;;;;;;;;25659:33;;25444:256;;;;:::o;42171:39::-;42205:5;42171:39;:::o;44172:106::-;1958:12;:10;:12::i;:::-;1947:23;;:7;:5;:7::i;:::-;:23;;;1939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44232:10:::1;44224:24;;:47;44249:21;44224:47;;;;;;;;;;;;;;;;;;;;;;;44216:56;;;::::0;::::1;;44172:106::o:0;15920:185::-;16058:39;16075:4;16081:2;16085:7;16058:39;;;;;;;;;;;;:16;:39::i;:::-;15920:185;;;:::o;25966:233::-;26041:7;26077:30;:28;:30::i;:::-;26069:5;:38;26061:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;26174:10;26185:5;26174:17;;;;;;;;;;;;;;;;;;;;;;;;26167:24;;25966:233;;;:::o;42631:96::-;1958:12;:10;:12::i;:::-;1947:23;;:7;:5;:7::i;:::-;:23;;;1939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42714:7:::1;42698:13;:23;;;;;;;;;;;;:::i;:::-;;42631:96:::0;:::o;12755:239::-;12827:7;12847:13;12863:7;:16;12871:7;12863:16;;;;;;;;;;;;;;;;;;;;;12847:32;;12915:1;12898:19;;:5;:19;;;;12890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12981:5;12974:12;;;12755:239;;;:::o;42266:30::-;;;;;;;;;;;;;:::o;12485:208::-;12557:7;12602:1;12585:19;;:5;:19;;;;12577:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12669:9;:16;12679:5;12669:16;;;;;;;;;;;;;;;;12662:23;;12485:208;;;:::o;42733:92::-;42777:13;42806;42799:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42733:92;:::o;2378:94::-;1958:12;:10;:12::i;:::-;1947:23;;:7;:5;:7::i;:::-;:23;;;1939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2443:21:::1;2461:1;2443:9;:21::i;:::-;2378:94::o:0;1727:87::-;1773:7;1800:6;;;;;;;;;;;1793:13;;1727:87;:::o;42835:77::-;1958:12;:10;:12::i;:::-;1947:23;;:7;:5;:7::i;:::-;:23;;;1939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42901:5:::1;42892:6;:14;;;;42835:77:::0;:::o;13230:104::-;13286:13;13319:7;13312:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13230:104;:::o;42918:77::-;42960:7;42983:6;;42976:13;;42918:77;:::o;43486:593::-;43547:10;;;;;;;;;;;43539:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;43608:13;:11;:13::i;:::-;42205:5;43595:26;43587:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43679:1;43669:7;:11;:43;;;;;42257:2;43684:7;:28;;43669:43;43661:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;43792:7;43776:13;:11;:13::i;:::-;:23;;;;:::i;:::-;42205:5;43762:37;;43754:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;43869:7;43860:6;;:16;;;;:::i;:::-;43847:9;:29;;43839:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43914:6;43909:165;43930:7;43926:1;:11;43909:165;;;43953:14;43986:1;43970:13;:11;:13::i;:::-;:17;;;;:::i;:::-;43953:34;;44034:32;44044:10;44056:9;44034;:32::i;:::-;43909:165;43939:3;;;;;:::i;:::-;;;;43909:165;;;;43486:593;:::o;14913:295::-;15028:12;:10;:12::i;:::-;15016:24;;:8;:24;;;;15008:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;15128:8;15083:18;:32;15102:12;:10;:12::i;:::-;15083:32;;;;;;;;;;;;;;;:42;15116:8;15083:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;15181:8;15152:48;;15167:12;:10;:12::i;:::-;15152:48;;;15191:8;15152:48;;;;;;:::i;:::-;;;;;;;;14913:295;;:::o;16176:328::-;16351:41;16370:12;:10;:12::i;:::-;16384:7;16351:18;:41::i;:::-;16343:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;16457:39;16471:4;16477:2;16481:7;16490:5;16457:13;:39::i;:::-;16176:328;;;;:::o;44575:154::-;44668:13;44700:23;44715:7;44700:14;:23::i;:::-;44693:30;;44575:154;;;:::o;44085:81::-;1958:12;:10;:12::i;:::-;1947:23;;:7;:5;:7::i;:::-;:23;;;1939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44150:10:::1;;;;;;;;;;;44149:11;44136:10;;:24;;;;;;;;;;;;;;;;;;44085:81::o:0;15279:164::-;15376:4;15400:18;:25;15419:5;15400:25;;;;;;;;;;;;;;;:35;15426:8;15400:35;;;;;;;;;;;;;;;;;;;;;;;;;15393:42;;15279:164;;;;:::o;2627:192::-;1958:12;:10;:12::i;:::-;1947:23;;:7;:5;:7::i;:::-;:23;;;1939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2736:1:::1;2716:22;;:8;:22;;;;2708:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2792:19;2802:8;2792:9;:19::i;:::-;2627:192:::0;:::o;25136:224::-;25238:4;25277:35;25262:50;;;:11;:50;;;;:90;;;;25316:36;25340:11;25316:23;:36::i;:::-;25262:90;25255:97;;25136:224;;;:::o;18014:127::-;18079:4;18131:1;18103:30;;:7;:16;18111:7;18103:16;;;;;;;;;;;;;;;;;;;;;:30;;;;18096:37;;18014:127;;;:::o;603:98::-;656:7;683:10;676:17;;603:98;:::o;21996:174::-;22098:2;22071:15;:24;22087:7;22071:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22154:7;22150:2;22116:46;;22125:23;22140:7;22125:14;:23::i;:::-;22116:46;;;;;;;;;;;;21996:174;;:::o;18308:348::-;18401:4;18426:16;18434:7;18426;:16::i;:::-;18418:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18502:13;18518:23;18533:7;18518:14;:23::i;:::-;18502:39;;18571:5;18560:16;;:7;:16;;;:51;;;;18604:7;18580:31;;:20;18592:7;18580:11;:20::i;:::-;:31;;;18560:51;:87;;;;18615:32;18632:5;18639:7;18615:16;:32::i;:::-;18560:87;18552:96;;;18308:348;;;;:::o;21300:578::-;21459:4;21432:31;;:23;21447:7;21432:14;:23::i;:::-;:31;;;21424:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;21542:1;21528:16;;:2;:16;;;;21520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;21598:39;21619:4;21625:2;21629:7;21598:20;:39::i;:::-;21702:29;21719:1;21723:7;21702:8;:29::i;:::-;21763:1;21744:9;:15;21754:4;21744:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;21792:1;21775:9;:13;21785:2;21775:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;21823:2;21804:7;:16;21812:7;21804:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;21862:7;21858:2;21843:27;;21852:4;21843:27;;;;;;;;;;;;21300:578;;;:::o;2827:173::-;2883:16;2902:6;;;;;;;;;;;2883:25;;2928:8;2919:6;;:17;;;;;;;;;;;;;;;;;;2983:8;2952:40;;2973:8;2952:40;;;;;;;;;;;;2827:173;;:::o;18998:110::-;19074:26;19084:2;19088:7;19074:26;;;;;;;;;;;;:9;:26::i;:::-;18998:110;;:::o;17386:315::-;17543:28;17553:4;17559:2;17563:7;17543:9;:28::i;:::-;17590:48;17613:4;17619:2;17623:7;17632:5;17590:22;:48::i;:::-;17582:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;17386:315;;;;:::o;13405:334::-;13478:13;13512:16;13520:7;13512;:16::i;:::-;13504:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;13593:21;13617:10;:8;:10::i;:::-;13593:34;;13669:1;13651:7;13645:21;:25;:86;;;;;;;;;;;;;;;;;13697:7;13706:18;:7;:16;:18::i;:::-;13680:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13645:86;13638:93;;;13405:334;;;:::o;12116:305::-;12218:4;12270:25;12255:40;;;:11;:40;;;;:105;;;;12327:33;12312:48;;;:11;:48;;;;12255:105;:158;;;;12377:36;12401:11;12377:23;:36::i;:::-;12255:158;12235:178;;12116:305;;;:::o;44284:188::-;44421:45;44448:4;44454:2;44458:7;44421:26;:45::i;:::-;44284:188;;;:::o;19335:321::-;19465:18;19471:2;19475:7;19465:5;:18::i;:::-;19516:54;19547:1;19551:2;19555:7;19564:5;19516:22;:54::i;:::-;19494:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;19335:321;;;:::o;22735:803::-;22890:4;22911:15;:2;:13;;;:15::i;:::-;22907:624;;;22963:2;22947:36;;;22984:12;:10;:12::i;:::-;22998:4;23004:7;23013:5;22947:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;22943:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23210:1;23193:6;:13;:18;23189:272;;;23236:60;;;;;;;;;;:::i;:::-;;;;;;;;23189:272;23411:6;23405:13;23396:6;23392:2;23388:15;23381:38;22943:533;23080:45;;;23070:55;;;:6;:55;;;;23063:62;;;;;22907:624;23515:4;23508:11;;22735:803;;;;;;;:::o;42517:108::-;42577:13;42606;42599:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42517:108;:::o;31562:723::-;31618:13;31848:1;31839:5;:10;31835:53;;;31866:10;;;;;;;;;;;;;;;;;;;;;31835:53;31898:12;31913:5;31898:20;;31929:14;31954:78;31969:1;31961:4;:9;31954:78;;31987:8;;;;;:::i;:::-;;;;32018:2;32010:10;;;;;:::i;:::-;;;31954:78;;;32042:19;32074:6;32064:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32042:39;;32092:154;32108:1;32099:5;:10;32092:154;;32136:1;32126:11;;;;;:::i;:::-;;;32203:2;32195:5;:10;;;;:::i;:::-;32182:2;:24;;;;:::i;:::-;32169:39;;32152:6;32159;32152:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;32232:2;32223:11;;;;;:::i;:::-;;;32092:154;;;32270:6;32256:21;;;;;31562:723;;;;:::o;10038:157::-;10123:4;10162:25;10147:40;;;:11;:40;;;;10140:47;;10038:157;;;:::o;26812:589::-;26956:45;26983:4;26989:2;26993:7;26956:26;:45::i;:::-;27034:1;27018:18;;:4;:18;;;27014:187;;;27053:40;27085:7;27053:31;:40::i;:::-;27014:187;;;27123:2;27115:10;;:4;:10;;;27111:90;;27142:47;27175:4;27181:7;27142:32;:47::i;:::-;27111:90;27014:187;27229:1;27215:16;;:2;:16;;;27211:183;;;27248:45;27285:7;27248:36;:45::i;:::-;27211:183;;;27321:4;27315:10;;:2;:10;;;27311:83;;27342:40;27370:2;27374:7;27342:27;:40::i;:::-;27311:83;27211:183;26812:589;;;:::o;19992:382::-;20086:1;20072:16;;:2;:16;;;;20064:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;20145:16;20153:7;20145;:16::i;:::-;20144:17;20136:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;20207:45;20236:1;20240:2;20244:7;20207:20;:45::i;:::-;20282:1;20265:9;:13;20275:2;20265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;20313:2;20294:7;:16;20302:7;20294:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;20358:7;20354:2;20333:33;;20350:1;20333:33;;;;;;;;;;;;19992:382;;:::o;34054:387::-;34114:4;34322:12;34389:7;34377:20;34369:28;;34432:1;34425:4;:8;34418:15;;;34054:387;;;:::o;24110:126::-;;;;:::o;28124:164::-;28228:10;:17;;;;28201:15;:24;28217:7;28201:24;;;;;;;;;;;:44;;;;28256:10;28272:7;28256:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28124:164;:::o;28915:988::-;29181:22;29231:1;29206:22;29223:4;29206:16;:22::i;:::-;:26;;;;:::i;:::-;29181:51;;29243:18;29264:17;:26;29282:7;29264:26;;;;;;;;;;;;29243:47;;29411:14;29397:10;:28;29393:328;;29442:19;29464:12;:18;29477:4;29464:18;;;;;;;;;;;;;;;:34;29483:14;29464:34;;;;;;;;;;;;29442:56;;29548:11;29515:12;:18;29528:4;29515:18;;;;;;;;;;;;;;;:30;29534:10;29515:30;;;;;;;;;;;:44;;;;29665:10;29632:17;:30;29650:11;29632:30;;;;;;;;;;;:43;;;;29393:328;;29817:17;:26;29835:7;29817:26;;;;;;;;;;;29810:33;;;29861:12;:18;29874:4;29861:18;;;;;;;;;;;;;;;:34;29880:14;29861:34;;;;;;;;;;;29854:41;;;28915:988;;;;:::o;30198:1079::-;30451:22;30496:1;30476:10;:17;;;;:21;;;;:::i;:::-;30451:46;;30508:18;30529:15;:24;30545:7;30529:24;;;;;;;;;;;;30508:45;;30880:19;30902:10;30913:14;30902:26;;;;;;;;;;;;;;;;;;;;;;;;30880:48;;30966:11;30941:10;30952;30941:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;31077:10;31046:15;:28;31062:11;31046:28;;;;;;;;;;;:41;;;;31218:15;:24;31234:7;31218:24;;;;;;;;;;;31211:31;;;31253:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30198:1079;;;;:::o;27702:221::-;27787:14;27804:20;27821:2;27804:16;:20::i;:::-;27787:37;;27862:7;27835:12;:16;27848:2;27835:16;;;;;;;;;;;;;;;:24;27852:6;27835:24;;;;;;;;;;;:34;;;;27909:6;27880:17;:26;27898:7;27880:26;;;;;;;;;;;:35;;;;27702:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:179::-;;6174:46;6216:3;6208:6;6174:46;:::i;:::-;6252:4;6247:3;6243:14;6229:28;;6164:99;;;;:::o;6269:118::-;6356:24;6374:5;6356:24;:::i;:::-;6351:3;6344:37;6334:53;;:::o;6423:732::-;;6571:54;6619:5;6571:54;:::i;:::-;6641:86;6720:6;6715:3;6641:86;:::i;:::-;6634:93;;6751:56;6801:5;6751:56;:::i;:::-;6830:7;6861:1;6846:284;6871:6;6868:1;6865:13;6846:284;;;6947:6;6941:13;6974:63;7033:3;7018:13;6974:63;:::i;:::-;6967:70;;7060:60;7113:6;7060:60;:::i;:::-;7050:70;;6906:224;6893:1;6890;6886:9;6881:14;;6846:284;;;6850:14;7146:3;7139:10;;6547:608;;;;;;;:::o;7161:109::-;7242:21;7257:5;7242:21;:::i;:::-;7237:3;7230:34;7220:50;;:::o;7276:360::-;;7390:38;7422:5;7390:38;:::i;:::-;7444:70;7507:6;7502:3;7444:70;:::i;:::-;7437:77;;7523:52;7568:6;7563:3;7556:4;7549:5;7545:16;7523:52;:::i;:::-;7600:29;7622:6;7600:29;:::i;:::-;7595:3;7591:39;7584:46;;7366:270;;;;;:::o;7642:364::-;;7758:39;7791:5;7758:39;:::i;:::-;7813:71;7877:6;7872:3;7813:71;:::i;:::-;7806:78;;7893:52;7938:6;7933:3;7926:4;7919:5;7915:16;7893:52;:::i;:::-;7970:29;7992:6;7970:29;:::i;:::-;7965:3;7961:39;7954:46;;7734:272;;;;;:::o;8012:377::-;;8146:39;8179:5;8146:39;:::i;:::-;8201:89;8283:6;8278:3;8201:89;:::i;:::-;8194:96;;8299:52;8344:6;8339:3;8332:4;8325:5;8321:16;8299:52;:::i;:::-;8376:6;8371:3;8367:16;8360:23;;8122:267;;;;;:::o;8395:375::-;;8558:67;8622:2;8617:3;8558:67;:::i;:::-;8551:74;;8655:34;8651:1;8646:3;8642:11;8635:55;8721:13;8716:2;8711:3;8707:12;8700:35;8761:2;8756:3;8752:12;8745:19;;8541:229;;;:::o;8776:382::-;;8939:67;9003:2;8998:3;8939:67;:::i;:::-;8932:74;;9036:34;9032:1;9027:3;9023:11;9016:55;9102:20;9097:2;9092:3;9088:12;9081:42;9149:2;9144:3;9140:12;9133:19;;8922:236;;;:::o;9164:370::-;;9327:67;9391:2;9386:3;9327:67;:::i;:::-;9320:74;;9424:34;9420:1;9415:3;9411:11;9404:55;9490:8;9485:2;9480:3;9476:12;9469:30;9525:2;9520:3;9516:12;9509:19;;9310:224;;;:::o;9540:326::-;;9703:67;9767:2;9762:3;9703:67;:::i;:::-;9696:74;;9800:30;9796:1;9791:3;9787:11;9780:51;9857:2;9852:3;9848:12;9841:19;;9686:180;;;:::o;9872:368::-;;10035:67;10099:2;10094:3;10035:67;:::i;:::-;10028:74;;10132:34;10128:1;10123:3;10119:11;10112:55;10198:6;10193:2;10188:3;10184:12;10177:28;10231:2;10226:3;10222:12;10215:19;;10018:222;;;:::o;10246:323::-;;10409:67;10473:2;10468:3;10409:67;:::i;:::-;10402:74;;10506:27;10502:1;10497:3;10493:11;10486:48;10560:2;10555:3;10551:12;10544:19;;10392:177;;;:::o;10575:316::-;;10738:67;10802:2;10797:3;10738:67;:::i;:::-;10731:74;;10835:20;10831:1;10826:3;10822:11;10815:41;10882:2;10877:3;10873:12;10866:19;;10721:170;;;:::o;10897:326::-;;11060:67;11124:2;11119:3;11060:67;:::i;:::-;11053:74;;11157:30;11153:1;11148:3;11144:11;11137:51;11214:2;11209:3;11205:12;11198:19;;11043:180;;;:::o;11229:376::-;;11392:67;11456:2;11451:3;11392:67;:::i;:::-;11385:74;;11489:34;11485:1;11480:3;11476:11;11469:55;11555:14;11550:2;11545:3;11541:12;11534:36;11596:2;11591:3;11587:12;11580:19;;11375:230;;;:::o;11611:326::-;;11774:67;11838:2;11833:3;11774:67;:::i;:::-;11767:74;;11871:30;11867:1;11862:3;11858:11;11851:51;11928:2;11923:3;11919:12;11912:19;;11757:180;;;:::o;11943:388::-;;12106:67;12170:2;12165:3;12106:67;:::i;:::-;12099:74;;12203:34;12199:1;12194:3;12190:11;12183:55;12269:26;12264:2;12259:3;12255:12;12248:48;12322:2;12317:3;12313:12;12306:19;;12089:242;;;:::o;12337:374::-;;12500:67;12564:2;12559:3;12500:67;:::i;:::-;12493:74;;12597:34;12593:1;12588:3;12584:11;12577:55;12663:12;12658:2;12653:3;12649:12;12642:34;12702:2;12697:3;12693:12;12686:19;;12483:228;;;:::o;12717:373::-;;12880:67;12944:2;12939:3;12880:67;:::i;:::-;12873:74;;12977:34;12973:1;12968:3;12964:11;12957:55;13043:11;13038:2;13033:3;13029:12;13022:33;13081:2;13076:3;13072:12;13065:19;;12863:227;;;:::o;13096:317::-;;13259:67;13323:2;13318:3;13259:67;:::i;:::-;13252:74;;13356:21;13352:1;13347:3;13343:11;13336:42;13404:2;13399:3;13395:12;13388:19;;13242:171;;;:::o;13419:328::-;;13582:67;13646:2;13641:3;13582:67;:::i;:::-;13575:74;;13679:32;13675:1;13670:3;13666:11;13659:53;13738:2;13733:3;13729:12;13722:19;;13565:182;;;:::o;13753:330::-;;13916:67;13980:2;13975:3;13916:67;:::i;:::-;13909:74;;14013:34;14009:1;14004:3;14000:11;13993:55;14074:2;14069:3;14065:12;14058:19;;13899:184;;;:::o;14089:376::-;;14252:67;14316:2;14311:3;14252:67;:::i;:::-;14245:74;;14349:34;14345:1;14340:3;14336:11;14329:55;14415:14;14410:2;14405:3;14401:12;14394:36;14456:2;14451:3;14447:12;14440:19;;14235:230;;;:::o;14471:330::-;;14634:67;14698:2;14693:3;14634:67;:::i;:::-;14627:74;;14731:34;14727:1;14722:3;14718:11;14711:55;14792:2;14787:3;14783:12;14776:19;;14617:184;;;:::o;14807:373::-;;14970:67;15034:2;15029:3;14970:67;:::i;:::-;14963:74;;15067:34;15063:1;15058:3;15054:11;15047:55;15133:11;15128:2;15123:3;15119:12;15112:33;15171:2;15166:3;15162:12;15155:19;;14953:227;;;:::o;15186:379::-;;15349:67;15413:2;15408:3;15349:67;:::i;:::-;15342:74;;15446:34;15442:1;15437:3;15433:11;15426:55;15512:17;15507:2;15502:3;15498:12;15491:39;15556:2;15551:3;15547:12;15540:19;;15332:233;;;:::o;15571:365::-;;15734:67;15798:2;15793:3;15734:67;:::i;:::-;15727:74;;15831:34;15827:1;15822:3;15818:11;15811:55;15897:3;15892:2;15887:3;15883:12;15876:25;15927:2;15922:3;15918:12;15911:19;;15717:219;;;:::o;15942:381::-;;16105:67;16169:2;16164:3;16105:67;:::i;:::-;16098:74;;16202:34;16198:1;16193:3;16189:11;16182:55;16268:19;16263:2;16258:3;16254:12;16247:41;16314:2;16309:3;16305:12;16298:19;;16088:235;;;:::o;16329:376::-;;16492:67;16556:2;16551:3;16492:67;:::i;:::-;16485:74;;16589:34;16585:1;16580:3;16576:11;16569:55;16655:14;16650:2;16645:3;16641:12;16634:36;16696:2;16691:3;16687:12;16680:19;;16475:230;;;:::o;16711:108::-;16788:24;16806:5;16788:24;:::i;:::-;16783:3;16776:37;16766:53;;:::o;16825:118::-;16912:24;16930:5;16912:24;:::i;:::-;16907:3;16900:37;16890:53;;:::o;16949:435::-;;17151:95;17242:3;17233:6;17151:95;:::i;:::-;17144:102;;17263:95;17354:3;17345:6;17263:95;:::i;:::-;17256:102;;17375:3;17368:10;;17133:251;;;;;:::o;17390:222::-;;17521:2;17510:9;17506:18;17498:26;;17534:71;17602:1;17591:9;17587:17;17578:6;17534:71;:::i;:::-;17488:124;;;;:::o;17618:640::-;;17851:3;17840:9;17836:19;17828:27;;17865:71;17933:1;17922:9;17918:17;17909:6;17865:71;:::i;:::-;17946:72;18014:2;18003:9;17999:18;17990:6;17946:72;:::i;:::-;18028;18096:2;18085:9;18081:18;18072:6;18028:72;:::i;:::-;18147:9;18141:4;18137:20;18132:2;18121:9;18117:18;18110:48;18175:76;18246:4;18237:6;18175:76;:::i;:::-;18167:84;;17818:440;;;;;;;:::o;18264:373::-;;18445:2;18434:9;18430:18;18422:26;;18494:9;18488:4;18484:20;18480:1;18469:9;18465:17;18458:47;18522:108;18625:4;18616:6;18522:108;:::i;:::-;18514:116;;18412:225;;;;:::o;18643:210::-;;18768:2;18757:9;18753:18;18745:26;;18781:65;18843:1;18832:9;18828:17;18819:6;18781:65;:::i;:::-;18735:118;;;;:::o;18859:313::-;;19010:2;18999:9;18995:18;18987:26;;19059:9;19053:4;19049:20;19045:1;19034:9;19030:17;19023:47;19087:78;19160:4;19151:6;19087:78;:::i;:::-;19079:86;;18977:195;;;;:::o;19178:419::-;;19382:2;19371:9;19367:18;19359:26;;19431:9;19425:4;19421:20;19417:1;19406:9;19402:17;19395:47;19459:131;19585:4;19459:131;:::i;:::-;19451:139;;19349:248;;;:::o;19603:419::-;;19807:2;19796:9;19792:18;19784:26;;19856:9;19850:4;19846:20;19842:1;19831:9;19827:17;19820:47;19884:131;20010:4;19884:131;:::i;:::-;19876:139;;19774:248;;;:::o;20028:419::-;;20232:2;20221:9;20217:18;20209:26;;20281:9;20275:4;20271:20;20267:1;20256:9;20252:17;20245:47;20309:131;20435:4;20309:131;:::i;:::-;20301:139;;20199:248;;;:::o;20453:419::-;;20657:2;20646:9;20642:18;20634:26;;20706:9;20700:4;20696:20;20692:1;20681:9;20677:17;20670:47;20734:131;20860:4;20734:131;:::i;:::-;20726:139;;20624:248;;;:::o;20878:419::-;;21082:2;21071:9;21067:18;21059:26;;21131:9;21125:4;21121:20;21117:1;21106:9;21102:17;21095:47;21159:131;21285:4;21159:131;:::i;:::-;21151:139;;21049:248;;;:::o;21303:419::-;;21507:2;21496:9;21492:18;21484:26;;21556:9;21550:4;21546:20;21542:1;21531:9;21527:17;21520:47;21584:131;21710:4;21584:131;:::i;:::-;21576:139;;21474:248;;;:::o;21728:419::-;;21932:2;21921:9;21917:18;21909:26;;21981:9;21975:4;21971:20;21967:1;21956:9;21952:17;21945:47;22009:131;22135:4;22009:131;:::i;:::-;22001:139;;21899:248;;;:::o;22153:419::-;;22357:2;22346:9;22342:18;22334:26;;22406:9;22400:4;22396:20;22392:1;22381:9;22377:17;22370:47;22434:131;22560:4;22434:131;:::i;:::-;22426:139;;22324:248;;;:::o;22578:419::-;;22782:2;22771:9;22767:18;22759:26;;22831:9;22825:4;22821:20;22817:1;22806:9;22802:17;22795:47;22859:131;22985:4;22859:131;:::i;:::-;22851:139;;22749:248;;;:::o;23003:419::-;;23207:2;23196:9;23192:18;23184:26;;23256:9;23250:4;23246:20;23242:1;23231:9;23227:17;23220:47;23284:131;23410:4;23284:131;:::i;:::-;23276:139;;23174:248;;;:::o;23428:419::-;;23632:2;23621:9;23617:18;23609:26;;23681:9;23675:4;23671:20;23667:1;23656:9;23652:17;23645:47;23709:131;23835:4;23709:131;:::i;:::-;23701:139;;23599:248;;;:::o;23853:419::-;;24057:2;24046:9;24042:18;24034:26;;24106:9;24100:4;24096:20;24092:1;24081:9;24077:17;24070:47;24134:131;24260:4;24134:131;:::i;:::-;24126:139;;24024:248;;;:::o;24278:419::-;;24482:2;24471:9;24467:18;24459:26;;24531:9;24525:4;24521:20;24517:1;24506:9;24502:17;24495:47;24559:131;24685:4;24559:131;:::i;:::-;24551:139;;24449:248;;;:::o;24703:419::-;;24907:2;24896:9;24892:18;24884:26;;24956:9;24950:4;24946:20;24942:1;24931:9;24927:17;24920:47;24984:131;25110:4;24984:131;:::i;:::-;24976:139;;24874:248;;;:::o;25128:419::-;;25332:2;25321:9;25317:18;25309:26;;25381:9;25375:4;25371:20;25367:1;25356:9;25352:17;25345:47;25409:131;25535:4;25409:131;:::i;:::-;25401:139;;25299:248;;;:::o;25553:419::-;;25757:2;25746:9;25742:18;25734:26;;25806:9;25800:4;25796:20;25792:1;25781:9;25777:17;25770:47;25834:131;25960:4;25834:131;:::i;:::-;25826:139;;25724:248;;;:::o;25978:419::-;;26182:2;26171:9;26167:18;26159:26;;26231:9;26225:4;26221:20;26217:1;26206:9;26202:17;26195:47;26259:131;26385:4;26259:131;:::i;:::-;26251:139;;26149:248;;;:::o;26403:419::-;;26607:2;26596:9;26592:18;26584:26;;26656:9;26650:4;26646:20;26642:1;26631:9;26627:17;26620:47;26684:131;26810:4;26684:131;:::i;:::-;26676:139;;26574:248;;;:::o;26828:419::-;;27032:2;27021:9;27017:18;27009:26;;27081:9;27075:4;27071:20;27067:1;27056:9;27052:17;27045:47;27109:131;27235:4;27109:131;:::i;:::-;27101:139;;26999:248;;;:::o;27253:419::-;;27457:2;27446:9;27442:18;27434:26;;27506:9;27500:4;27496:20;27492:1;27481:9;27477:17;27470:47;27534:131;27660:4;27534:131;:::i;:::-;27526:139;;27424:248;;;:::o;27678:419::-;;27882:2;27871:9;27867:18;27859:26;;27931:9;27925:4;27921:20;27917:1;27906:9;27902:17;27895:47;27959:131;28085:4;27959:131;:::i;:::-;27951:139;;27849:248;;;:::o;28103:419::-;;28307:2;28296:9;28292:18;28284:26;;28356:9;28350:4;28346:20;28342:1;28331:9;28327:17;28320:47;28384:131;28510:4;28384:131;:::i;:::-;28376:139;;28274:248;;;:::o;28528:419::-;;28732:2;28721:9;28717:18;28709:26;;28781:9;28775:4;28771:20;28767:1;28756:9;28752:17;28745:47;28809:131;28935:4;28809:131;:::i;:::-;28801:139;;28699:248;;;:::o;28953:222::-;;29084:2;29073:9;29069:18;29061:26;;29097:71;29165:1;29154:9;29150:17;29141:6;29097:71;:::i;:::-;29051:124;;;;:::o;29181:283::-;;29247:2;29241:9;29231:19;;29289:4;29281:6;29277:17;29396:6;29384:10;29381:22;29360:18;29348:10;29345:34;29342:62;29339:2;;;29407:18;;:::i;:::-;29339:2;29447:10;29443:2;29436:22;29221:243;;;;:::o;29470:331::-;;29621:18;29613:6;29610:30;29607:2;;;29643:18;;:::i;:::-;29607:2;29728:4;29724:9;29717:4;29709:6;29705:17;29701:33;29693:41;;29789:4;29783;29779:15;29771:23;;29536:265;;;:::o;29807:332::-;;29959:18;29951:6;29948:30;29945:2;;;29981:18;;:::i;:::-;29945:2;30066:4;30062:9;30055:4;30047:6;30043:17;30039:33;30031:41;;30127:4;30121;30117:15;30109:23;;29874:265;;;:::o;30145:132::-;;30235:3;30227:11;;30265:4;30260:3;30256:14;30248:22;;30217:60;;;:::o;30283:114::-;;30384:5;30378:12;30368:22;;30357:40;;;:::o;30403:98::-;;30488:5;30482:12;30472:22;;30461:40;;;:::o;30507:99::-;;30593:5;30587:12;30577:22;;30566:40;;;:::o;30612:113::-;;30714:4;30709:3;30705:14;30697:22;;30687:38;;;:::o;30731:184::-;;30864:6;30859:3;30852:19;30904:4;30899:3;30895:14;30880:29;;30842:73;;;;:::o;30921:168::-;;31038:6;31033:3;31026:19;31078:4;31073:3;31069:14;31054:29;;31016:73;;;;:::o;31095:169::-;;31213:6;31208:3;31201:19;31253:4;31248:3;31244:14;31229:29;;31191:73;;;;:::o;31270:148::-;;31409:3;31394:18;;31384:34;;;;:::o;31424:305::-;;31483:20;31501:1;31483:20;:::i;:::-;31478:25;;31517:20;31535:1;31517:20;:::i;:::-;31512:25;;31671:1;31603:66;31599:74;31596:1;31593:81;31590:2;;;31677:18;;:::i;:::-;31590:2;31721:1;31718;31714:9;31707:16;;31468:261;;;;:::o;31735:185::-;;31792:20;31810:1;31792:20;:::i;:::-;31787:25;;31826:20;31844:1;31826:20;:::i;:::-;31821:25;;31865:1;31855:2;;31870:18;;:::i;:::-;31855:2;31912:1;31909;31905:9;31900:14;;31777:143;;;;:::o;31926:348::-;;31989:20;32007:1;31989:20;:::i;:::-;31984:25;;32023:20;32041:1;32023:20;:::i;:::-;32018:25;;32211:1;32143:66;32139:74;32136:1;32133:81;32128:1;32121:9;32114:17;32110:105;32107:2;;;32218:18;;:::i;:::-;32107:2;32266:1;32263;32259:9;32248:20;;31974:300;;;;:::o;32280:191::-;;32340:20;32358:1;32340:20;:::i;:::-;32335:25;;32374:20;32392:1;32374:20;:::i;:::-;32369:25;;32413:1;32410;32407:8;32404:2;;;32418:18;;:::i;:::-;32404:2;32463:1;32460;32456:9;32448:17;;32325:146;;;;:::o;32477:96::-;;32543:24;32561:5;32543:24;:::i;:::-;32532:35;;32522:51;;;:::o;32579:90::-;;32656:5;32649:13;32642:21;32631:32;;32621:48;;;:::o;32675:149::-;;32751:66;32744:5;32740:78;32729:89;;32719:105;;;:::o;32830:126::-;;32907:42;32900:5;32896:54;32885:65;;32875:81;;;:::o;32962:77::-;;33028:5;33017:16;;33007:32;;;:::o;33045:154::-;33129:6;33124:3;33119;33106:30;33191:1;33182:6;33177:3;33173:16;33166:27;33096:103;;;:::o;33205:307::-;33273:1;33283:113;33297:6;33294:1;33291:13;33283:113;;;33382:1;33377:3;33373:11;33367:18;33363:1;33358:3;33354:11;33347:39;33319:2;33316:1;33312:10;33307:15;;33283:113;;;33414:6;33411:1;33408:13;33405:2;;;33494:1;33485:6;33480:3;33476:16;33469:27;33405:2;33254:258;;;;:::o;33518:320::-;;33599:1;33593:4;33589:12;33579:22;;33646:1;33640:4;33636:12;33667:18;33657:2;;33723:4;33715:6;33711:17;33701:27;;33657:2;33785;33777:6;33774:14;33754:18;33751:38;33748:2;;;33804:18;;:::i;:::-;33748:2;33569:269;;;;:::o;33844:233::-;;33906:24;33924:5;33906:24;:::i;:::-;33897:33;;33952:66;33945:5;33942:77;33939:2;;;34022:18;;:::i;:::-;33939:2;34069:1;34062:5;34058:13;34051:20;;33887:190;;;:::o;34083:176::-;;34132:20;34150:1;34132:20;:::i;:::-;34127:25;;34166:20;34184:1;34166:20;:::i;:::-;34161:25;;34205:1;34195:2;;34210:18;;:::i;:::-;34195:2;34251:1;34248;34244:9;34239:14;;34117:142;;;;:::o;34265:180::-;34313:77;34310:1;34303:88;34410:4;34407:1;34400:15;34434:4;34431:1;34424:15;34451:180;34499:77;34496:1;34489:88;34596:4;34593:1;34586:15;34620:4;34617:1;34610:15;34637:180;34685:77;34682:1;34675:88;34782:4;34779:1;34772:15;34806:4;34803:1;34796:15;34823:180;34871:77;34868:1;34861:88;34968:4;34965:1;34958:15;34992:4;34989:1;34982:15;35009:102;;35101:2;35097:7;35092:2;35085:5;35081:14;35077:28;35067:38;;35057:54;;;:::o;35117:122::-;35190:24;35208:5;35190:24;:::i;:::-;35183:5;35180:35;35170:2;;35229:1;35226;35219:12;35170:2;35160:79;:::o;35245:116::-;35315:21;35330:5;35315:21;:::i;:::-;35308:5;35305:32;35295:2;;35351:1;35348;35341:12;35295:2;35285:76;:::o;35367:120::-;35439:23;35456:5;35439:23;:::i;:::-;35432:5;35429:34;35419:2;;35477:1;35474;35467:12;35419:2;35409:78;:::o;35493:122::-;35566:24;35584:5;35566:24;:::i;:::-;35559:5;35556:35;35546:2;;35605:1;35602;35595:12;35546:2;35536:79;:::o

Swarm Source

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