ETH Price: $2,284.00 (-3.38%)

BearHood ((● ̄(エ) ̄●))
 

Overview

TokenID

305

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BearHood

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 16 : bearhood.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.0;

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

abstract contract ERC721Tradable is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter _tokenIdCounter;
    string public _tokenUri = "https://bearhood.club/metadata/";

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC721(_name, _symbol) {
        _tokenIdCounter.increment();
    }

    function totalSupply() public view override returns (uint256) {
        return _tokenIdCounter.current() - 1;
    }

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

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

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

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

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

contract BearHood is ERC721Tradable {
    using Counters for Counters.Counter;

    uint256 MaxSupply = 10000;

    address blindboxAddress;
    bool canOpen = false;
    bool openMarket = false;

    modifier allowOpenBox() {
        require(canOpen, "Box cannot be opened yet!");
        _;
    }

    modifier marketOpened() {
        require(openMarket, "Market closed");
        _;
    }

    constructor()
        ERC721Tradable("BearHood", unicode"(● ̄(エ) ̄●)")
    {}

    function openBox(address to) public allowOpenBox returns(uint256) {
        require(msg.sender == blindboxAddress, "Not authorized");
        require(_tokenIdCounter.current() <= MaxSupply);
        uint256 mintedId =  _tokenIdCounter.current();

        _safeMint(to, mintedId);
        _tokenIdCounter.increment();
        return mintedId;
    }

    function setBoxAddress(address newAddress) public onlyOwner { 
        blindboxAddress = newAddress;
    }

    function adjustBaseUri(string memory newUri) public onlyOwner {
        _tokenUri = newUri;
    }

    function contractURI() public pure returns (string memory) {
        return "https://bearhood.eth.link/contact-meta";
    }

    function toggle(uint256 _switcher) public onlyOwner {
        if(_switcher == 0) {
            canOpen = !canOpen;
        } else if(_switcher == 1) {
            openMarket = !openMarket;
        }
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
		uint256 tokenCount = balanceOf(_owner);
		if (tokenCount == 0) return new uint256[](0);
		else {
			uint256[] memory result = new uint256[](tokenCount);
			uint256 index;
			for (index = 0; index < tokenCount; index++) {
				result[index] = tokenOfOwnerByIndex(_owner, index);
			}
			return result;
		}
	}

    //MarketPlace
    event BearOffered(uint256 indexed bearId, uint256 minValue, address indexed toAddress);
    event BearBidEntered(uint256 indexed bearId, uint256 value, address indexed fromAddress);
    event BearBidWithdrawn(uint256 indexed bearId, uint256 value, address indexed fromAddress);
    event BearBought(uint256 indexed bearId, uint256 value, address indexed fromAddress, address indexed toAddress);
    event BearNoLongerForSale(uint256 indexed bearId);

    uint256 royalFee = 950;

    struct Offer {
        bool isForSale;
        uint256 bearId;
        address seller;
        uint256 minValue;
        address onlySellTo;
    }

    struct Bid {
        bool hasBid;
        uint256 bearId;
        address bidder;
        uint256 value;
    }

    mapping (uint256 => Offer) public bearOffers;
    mapping (uint256 => Bid) public bearBids;

    function bearListForSale(uint256 bearId, uint256 price) public marketOpened {
        require(bearId <= 10000, "Index out of range!");
        require(ownerOf(bearId) == msg.sender, "You are not the Owner!");
        bearOffers[bearId] = Offer(true, bearId, msg.sender, price, address(0));
        emit BearOffered(bearId, price, address(0));
    }

    function bearUnlist(uint256 bearId) public marketOpened {
        require(bearId <= 10000, "Index out of range!");
        require(ownerOf(bearId) == msg.sender, "You are not the Owner!");
        bearOffers[bearId] = Offer(false, bearId, msg.sender, 0, address(0));
        emit BearNoLongerForSale(bearId);
    }

    function offerBearToAddress(uint256 bearId, uint256 price, address toAddress) public marketOpened {
        require(bearId <= 10000, "Index out of range!");
        require(ownerOf(bearId) == msg.sender, "You are not the Owner!");
        bearOffers[bearId] = Offer(true, bearId, msg.sender, price, toAddress);
        emit BearOffered(bearId, price, toAddress);
    }

    function buyBear(uint256 bearId) public payable marketOpened {
        Offer storage offer = bearOffers[bearId];
        require(bearId <= 10000, "Index out of range!");
        require(offer.isForSale, "This Bear is not for sale!");
        require(offer.onlySellTo == address(0) || offer.onlySellTo == msg.sender, "You cannot buy this bear!");
        require(msg.value >= offer.minValue, "Insuffcient Fund");
        require(ownerOf(bearId) != msg.sender, "Owner cannot buy!");

        address payable seller = payable(offer.seller);
        _safeTransfer(seller, msg.sender, bearId, "");

        seller.transfer(offer.minValue*royalFee/1000);
        bearOffers[bearId] = Offer(false, bearId, msg.sender, 0, address(0));
        emit BearBought(bearId, msg.value, seller, msg.sender);

        Bid storage bid = bearBids[bearId];
        if (bid.bidder == msg.sender) {
            payable(msg.sender).transfer(bid.value);
            bearBids[bearId] = Bid(false, bearId, address(0), 0);
        }
    }

    function bidBear(uint256 bearId, uint256 bidPrice) public payable marketOpened {
        require(bearId <= 10000, "Index out of range!");
        require(ownerOf(bearId) != msg.sender, "Owner cannot bid!");
        require(bidPrice > 0);
        Bid storage existing = bearBids[bearId];
        require(msg.value >= bidPrice && msg.value >= existing.value, "Insuffcient Bid");
        if (existing.value > 0) {
            payable(existing.bidder).transfer(existing.value);
        }
        bearBids[bearId] = Bid(true, bearId, msg.sender, msg.value);
        emit BearBidEntered(bearId, bidPrice, msg.sender);
    }

    function acceptBid(uint256 bearId) public marketOpened {
        require(bearId <= 10000, "Index out of range!");
        require(ownerOf(bearId) == msg.sender, "You are not the Owner!");
        address payable seller = payable(msg.sender);
        Bid storage bid = bearBids[bearId];
        require(bid.value > 0);
        _safeTransfer(msg.sender, bid.bidder, bearId, "");

        bearOffers[bearId] = Offer(false, bearId, bid.bidder, 0, address(0));
        uint256 amount = bid.value;
        seller.transfer(amount*royalFee/1000);
        bearBids[bearId] = Bid(false, bearId, address(0), 0);
        emit BearBought(bearId, bid.value, seller, bid.bidder);
    }

    function withdrawBid(uint256 bearId) public marketOpened {
        require(bearId <= 10000, "Index out of range!");
        Bid storage bid = bearBids[bearId];
        require(bid.bidder == msg.sender, "You are not the bidder!");
        
        uint256 amount = bid.value;
        bearBids[bearId] = Bid(false, bearId, address(0), 0);
        emit BearBidWithdrawn(bearId, bid.value, msg.sender);
        payable(msg.sender).transfer(amount);
    }

    function setRoyalFee(uint256 fee) public onlyOwner {
        royalFee = fee;
    }

    function ifBearOffered(uint256 bearId) public view returns(bool){
        Offer memory offer = bearOffers[bearId];
        return offer.isForSale;
    }

    function ifBearBidded(uint256 bearId) public view returns(bool){
        Bid memory bid = bearBids[bearId];
        return bid.hasBid;
    }

    function getBearOffer(uint256 bearId) public view returns(
        bool isForSale,
        address owner,
        uint256 price,
        address onlySellTo
    ) {
        Offer memory offer = bearOffers[bearId];
        isForSale = offer.isForSale;
        owner = offer.seller;
        price = offer.minValue;
        onlySellTo = offer.onlySellTo;
    }

    function getBearBid(uint256 bearId) public view returns(
        bool hasBid,
        address owner,
        address bidder,
        uint256 bidPrice
    ) {
        Bid memory bid = bearBids[bearId];
        hasBid = bid.hasBid;
        owner = ownerOf(bearId);
        bidder = bid.bidder;
        bidPrice = bid.value;
    }

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

File 2 of 16 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

File 3 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 5 of 16 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 6 of 16 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 7 of 16 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 9 of 16 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 10 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 11 of 16 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.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 12 of 16 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 13 of 16 : ERC721URIStorage.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

File 15 of 16 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 16 of 16 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bearId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BearBidEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bearId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BearBidWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bearId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"BearBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"BearNoLongerForSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bearId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"BearOffered","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":"_tokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"adjustBaseUri","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"bearBids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"uint256","name":"bearId","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"bearListForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bearOffers","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"uint256","name":"bearId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"address","name":"onlySellTo","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"bearUnlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"},{"internalType":"uint256","name":"bidPrice","type":"uint256"}],"name":"bidBear","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"buyBear","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"getBearBid","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"bidPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"getBearOffer","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"onlySellTo","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"ifBearBidded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"ifBearOffered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bearId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"offerBearToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"openBox","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setBoxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setRoyalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_switcher","type":"uint256"}],"name":"toggle","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":"_owner","type":"address"}],"name":"tokensOfOwner","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":[{"internalType":"uint256","name":"bearId","type":"uint256"}],"name":"withdrawBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601f60808190527f68747470733a2f2f62656172686f6f642e636c75622f6d657461646174612f0060a09081526200004091600d919062000183565b50612710600e55600f805461ffff60a01b191690556103b66010553480156200006857600080fd5b5060408051808201825260088152671099585c921bdbd960c21b60208083019182528351808501909452601384527f28e2978fefbfa328efbdb429efbfa3e2978f290000000000000000000000000090840152815191929183918391620000d29160009162000183565b508051620000e890600190602084019062000183565b50505062000105620000ff6200012460201b60201c565b62000128565b6200011c600c6200017a60201b62001eac1760201c565b505062000266565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b828054620001919062000229565b90600052602060002090601f016020900481019282620001b5576000855562000200565b82601f10620001d057805160ff191683800117855562000200565b8280016001018555821562000200579182015b8281111562000200578251825591602001919060010190620001e3565b506200020e92915062000212565b5090565b5b808211156200020e576000815560010162000213565b6002810460018216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b61388c80620002766000396000f3fe6080604052600436106102465760003560e01c8063848b9dce11610139578063c0750872116100b6578063dc1fe1b91161007a578063dc1fe1b9146106cb578063df6552b9146106eb578063e311ce0f14610700578063e8a3d48514610731578063e985e9c514610746578063f2fde38b1461076657610246565b8063c075087214610628578063c1de405b14610648578063c254cc7b14610678578063c87b56dd14610698578063da5186ec146106b857610246565b8063a99fd988116100fd578063a99fd98814610568578063abd81c3014610598578063af4aa6d7146105c8578063b88d4fde146105e8578063c00340c91461060857610246565b8063848b9dce146104de5780638da5cb5b146104fe57806395d89b41146105135780639b4f8fd714610528578063a22cb4651461054857610246565b80632b1fd58a116101c757806370a082311161018b57806370a082311461044957806370e8c5ea14610469578063715018a61461047c578063751ef753146104915780638462151c146104b157610246565b80632b1fd58a146103a95780632f745c59146103c957806342842e0e146103e95780634f6ccce7146104095780636352211e1461042957610246565b80630eaaf4c81161020e5780630eaaf4c81461031257806318160ddd14610332578063190625d71461035457806323b872dd1461037457806324600fc31461039457610246565b806301ffc9a71461024b57806306fdde03146102815780630769abb5146102a3578063081812fc146102c5578063095ea7b3146102f2575b600080fd5b34801561025757600080fd5b5061026b610266366004612cc1565b610786565b6040516102789190612e9c565b60405180910390f35b34801561028d57600080fd5b50610296610799565b6040516102789190612f4b565b3480156102af57600080fd5b506102c36102be366004612d3f565b61082b565b005b3480156102d157600080fd5b506102e56102e0366004612d3f565b610965565b6040516102789190612e07565b3480156102fe57600080fd5b506102c361030d366004612c98565b6109a8565b34801561031e57600080fd5b506102c361032d366004612d3f565b610a40565b34801561033e57600080fd5b50610347610bab565b60405161027891906136dd565b34801561036057600080fd5b5061034761036f366004612b5e565b610bc8565b34801561038057600080fd5b506102c361038f366004612baa565b610c58565b3480156103a057600080fd5b506102c3610c90565b3480156103b557600080fd5b506102c36103c4366004612d3f565b610cfe565b3480156103d557600080fd5b506103476103e4366004612c98565b610f69565b3480156103f557600080fd5b506102c3610404366004612baa565b610fbb565b34801561041557600080fd5b50610347610424366004612d3f565b610fd6565b34801561043557600080fd5b506102e5610444366004612d3f565b611031565b34801561045557600080fd5b50610347610464366004612b5e565b611066565b6102c3610477366004612d3f565b6110aa565b34801561048857600080fd5b506102c36113d6565b34801561049d57600080fd5b506102c36104ac366004612d3f565b611421565b3480156104bd57600080fd5b506104d16104cc366004612b5e565b6114b4565b6040516102789190612e58565b3480156104ea57600080fd5b506102c36104f9366004612d78565b611595565b34801561050a57600080fd5b506102e56116e4565b34801561051f57600080fd5b506102966116f3565b34801561053457600080fd5b506102c3610543366004612cf9565b611702565b34801561055457600080fd5b506102c3610563366004612c5e565b611758565b34801561057457600080fd5b50610588610583366004612d3f565b61176a565b6040516102789493929190612ea7565b3480156105a457600080fd5b506105b86105b3366004612d3f565b6117df565b6040516102789493929190612ef7565b3480156105d457600080fd5b5061026b6105e3366004612d3f565b611816565b3480156105f457600080fd5b506102c3610603366004612be5565b61186b565b34801561061457600080fd5b506102c3610623366004612d57565b6118a4565b34801561063457600080fd5b506102c3610643366004612d3f565b6119eb565b34801561065457600080fd5b50610668610663366004612d3f565b611a2f565b6040516102789493929190612ece565b34801561068457600080fd5b506102c3610693366004612b5e565b611a97565b3480156106a457600080fd5b506102966106b3366004612d3f565b611af8565b6102c36106c6366004612d57565b611b03565b3480156106d757600080fd5b5061026b6106e6366004612d3f565b611cbe565b3480156106f757600080fd5b50610296611d24565b34801561070c57600080fd5b5061072061071b366004612d3f565b611db2565b604051610278959493929190612f1d565b34801561073d57600080fd5b50610296611df0565b34801561075257600080fd5b5061026b610761366004612b78565b611e10565b34801561077257600080fd5b506102c3610781366004612b5e565b611e3e565b600061079182611eb5565b90505b919050565b6060600080546107a890613774565b80601f01602080910402602001604051908101604052809291908181526020018280546107d490613774565b80156108215780601f106107f657610100808354040283529160200191610821565b820191906000526020600020905b81548152906001019060200180831161080457829003601f168201915b5050505050905090565b600f54600160a81b900460ff1661085d5760405162461bcd60e51b81526004016108549061351f565b60405180910390fd5b61271081111561087f5760405162461bcd60e51b815260040161085490613651565b3361088982611031565b6001600160a01b0316146108af5760405162461bcd60e51b8152600401610854906132bc565b6040805160a0810182526000808252602080830185815233848601908152606085018481526080860185815288865260119094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917f255b61fa2ffc4c709740f5521db1bc2cc1cdf07938494210fa5f61881fb9e69291a250565b600061097082611eda565b61098c5760405162461bcd60e51b81526004016108549061339b565b506000908152600460205260409020546001600160a01b031690565b60006109b382611031565b9050806001600160a01b0316836001600160a01b031614156109e75760405162461bcd60e51b8152600401610854906134de565b806001600160a01b03166109f9611ef7565b6001600160a01b03161480610a155750610a1581610761611ef7565b610a315760405162461bcd60e51b815260040161085490613195565b610a3b8383611efb565b505050565b600f54600160a81b900460ff16610a695760405162461bcd60e51b81526004016108549061351f565b612710811115610a8b5760405162461bcd60e51b815260040161085490613651565b600081815260126020526040902060028101546001600160a01b03163314610ac55760405162461bcd60e51b81526004016108549061367e565b600381810180546040805160808101825260008082526020808301898152838501838152606085018481528b85526012909352928590209351845460ff191690151517845551600184015590516002830180546001600160a01b0319166001600160a01b0390921691909117905551940193909355905491519091339185917f1a7e33f5517c526ae6d292514f4880ca2de53ac252a7de3236d3c58978af0a3691610b7091906136dd565b60405180910390a3604051339082156108fc029083906000818181858888f19350505050158015610ba5573d6000803e3d6000fd5b50505050565b60006001610bb9600c611f69565b610bc39190613731565b905090565b600f54600090600160a01b900460ff16610bf45760405162461bcd60e51b81526004016108549061361a565b600f546001600160a01b03163314610c1e5760405162461bcd60e51b8152600401610854906136b5565b600e54610c2b600c611f69565b1115610c3657600080fd5b6000610c42600c611f69565b9050610c4e8382611f6d565b610791600c611eac565b610c69610c63611ef7565b82611f87565b610c855760405162461bcd60e51b815260040161085490613546565b610a3b83838361200c565b610c98611ef7565b6001600160a01b0316610ca96116e4565b6001600160a01b031614610ccf5760405162461bcd60e51b8152600401610854906133e7565b60405133904780156108fc02916000818181858888f19350505050158015610cfb573d6000803e3d6000fd5b50565b600f54600160a81b900460ff16610d275760405162461bcd60e51b81526004016108549061351f565b612710811115610d495760405162461bcd60e51b815260040161085490613651565b33610d5382611031565b6001600160a01b031614610d795760405162461bcd60e51b8152600401610854906132bc565b60008181526012602052604090206003810154339190610d9857600080fd5b6002810154604080516020810190915260008152610dc59133916001600160a01b03909116908690612139565b6040805160a081018252600080825260208083018781526002808701546001600160a01b0390811686880190815260608701868152608088018781528c88526011909652979095209551865490151560ff1990911617865591516001860155925192840180549382166001600160a01b031994851617905593516003808501919091559051600490930180549385169390921692909217905582015460105490918416906108fc906103e890610e7b9085613712565b610e8591906136fe565b6040518115909202916000818181858888f19350505050158015610ead573d6000803e3d6000fd5b506040805160808101825260008082526020808301888152838501838152606085018481528a85526012909352928590209351845460ff19169015151784555160018401559051600280840180546001600160a01b0319166001600160a01b03938416179055915160039384015590850154918501549251918116929086169187917ffef56da5757859e97b6fb427f4cd63b97a3fdc89ea1e3607feb19c52fd00c73d91610f5b91906136dd565b60405180910390a450505050565b6000610f7483611066565b8210610f925760405162461bcd60e51b815260040161085490612f89565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610a3b8383836040518060200160405280600081525061186b565b6000610fe061216c565b8210610ffe5760405162461bcd60e51b8152600401610854906135ce565b6008828154811061101f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107915760405162461bcd60e51b81526004016108549061323c565b60006001600160a01b03821661108e5760405162461bcd60e51b8152600401610854906131f2565b506001600160a01b031660009081526003602052604090205490565b600f54600160a81b900460ff166110d35760405162461bcd60e51b81526004016108549061351f565b60008181526011602052604090206127108211156111035760405162461bcd60e51b815260040161085490613651565b805460ff166111245760405162461bcd60e51b815260040161085490613597565b60048101546001600160a01b0316158061114a575060048101546001600160a01b031633145b6111665760405162461bcd60e51b815260040161085490613285565b806003015434101561118a5760405162461bcd60e51b8152600401610854906134b4565b3361119483611031565b6001600160a01b031614156111bb5760405162461bcd60e51b815260040161085490612f5e565b60028101546040805160208101909152600081526001600160a01b03909116906111ea90829033908690612139565b806001600160a01b03166108fc6103e8601054856003015461120c9190613712565b61121691906136fe565b6040518115909202916000818181858888f1935050505015801561123e573d6000803e3d6000fd5b506040805160a081018252600080825260208083018781523384860181815260608601858152608087018681528b87526011909552948790209551865460ff19169015151786559151600186015590516002850180546001600160a01b03199081166001600160a01b039384161790915593516003860155915160049094018054909316938216939093179091559151909183169085907ffef56da5757859e97b6fb427f4cd63b97a3fdc89ea1e3607feb19c52fd00c73d906113029034906136dd565b60405180910390a4600083815260126020526040902060028101546001600160a01b0316331415610ba5576003810154604051339180156108fc02916000818181858888f1935050505015801561135d573d6000803e3d6000fd5b50506040805160808101825260008082526020808301878152838501838152606085018481529884526012909252939091209151825460ff19169015151782559151600182015590516002820180546001600160a01b0319166001600160a01b0390921691909117905592516003909301929092555050565b6113de611ef7565b6001600160a01b03166113ef6116e4565b6001600160a01b0316146114155760405162461bcd60e51b8152600401610854906133e7565b61141f6000612172565b565b611429611ef7565b6001600160a01b031661143a6116e4565b6001600160a01b0316146114605760405162461bcd60e51b8152600401610854906133e7565b8061148957600f805460ff60a01b198116600160a01b9182900460ff1615909102179055610cfb565b8060011415610cfb5750600f805460ff60a81b198116600160a81b9182900460ff1615909102179055565b606060006114c183611066565b9050806114de575050604080516000815260208101909152610794565b60008167ffffffffffffffff81111561150757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611530578160200160208202803683370190505b50905060005b82811015611585576115488582610f69565b82828151811061156857634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061157d816137a9565b915050611536565b5091506107949050565b50919050565b600f54600160a81b900460ff166115be5760405162461bcd60e51b81526004016108549061351f565b6127108311156115e05760405162461bcd60e51b815260040161085490613651565b336115ea84611031565b6001600160a01b0316146116105760405162461bcd60e51b8152600401610854906132bc565b6040805160a0810182526001808252602080830187815233848601908152606085018881526001600160a01b038881166080880181815260008d81526011909752958990209751885490151560ff1990911617885593519587019590955590516002860180549186166001600160a01b0319928316179055905160038601559151600490940180549490931693909116929092179055905184907fcf99bdf131f7b3184e8839e1528141a6cc81872c3a3e7f8f887f69b61d4c94d9906116d79086906136dd565b60405180910390a3505050565b600b546001600160a01b031690565b6060600180546107a890613774565b61170a611ef7565b6001600160a01b031661171b6116e4565b6001600160a01b0316146117415760405162461bcd60e51b8152600401610854906133e7565b805161175490600d906020840190612a3e565b5050565b611754611763611ef7565b83836121c4565b60008181526012602090815260408083208151608081018352815460ff16151580825260018301549482019490945260028201546001600160a01b031692810192909252600301546060820152909190819081906117c786611031565b93508060400151925080606001519150509193509193565b601260205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b039091169084565b6000908152601260209081526040918290208251608081018452815460ff16151580825260018301549382019390935260028201546001600160a01b0316938101939093526003015460609092019190915290565b61187c611876611ef7565b83611f87565b6118985760405162461bcd60e51b815260040161085490613546565b610ba584848484612139565b600f54600160a81b900460ff166118cd5760405162461bcd60e51b81526004016108549061351f565b6127108211156118ef5760405162461bcd60e51b815260040161085490613651565b336118f983611031565b6001600160a01b03161461191f5760405162461bcd60e51b8152600401610854906132bc565b6040805160a0810182526001808252602080830186815233848601908152606085018781526000608087018181528a825260119095528781209651875460ff1916901515178755925194860194909455516002850180546001600160a01b03199081166001600160a01b03938416179091559351600386015591516004909401805490931693909116929092179055905183907fcf99bdf131f7b3184e8839e1528141a6cc81872c3a3e7f8f887f69b61d4c94d9906119df9085906136dd565b60405180910390a35050565b6119f3611ef7565b6001600160a01b0316611a046116e4565b6001600160a01b031614611a2a5760405162461bcd60e51b8152600401610854906133e7565b601055565b600090815260116020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b039081169482018590526003830154606083018190526004909301541660809091018190529193909190565b611a9f611ef7565b6001600160a01b0316611ab06116e4565b6001600160a01b031614611ad65760405162461bcd60e51b8152600401610854906133e7565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60606107918261225a565b600f54600160a81b900460ff16611b2c5760405162461bcd60e51b81526004016108549061351f565b612710821115611b4e5760405162461bcd60e51b815260040161085490613651565b33611b5883611031565b6001600160a01b03161415611b7f5760405162461bcd60e51b81526004016108549061316a565b60008111611b8c57600080fd5b6000828152601260205260409020348211801590611bae575080600301543410155b611bca5760405162461bcd60e51b8152600401610854906132ec565b600381015415611c1657600281015460038201546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015611c14573d6000803e3d6000fd5b505b604080516080810182526001808252602080830187815233848601818152346060870190815260008b81526012909552938790209551865460ff1916901515178655915193850193909355516002840180546001600160a01b0319166001600160a01b0390921691909117905551600390920191909155905184907f334b5966009028a92cecd5ff78bf6066046556b785115fa863a3838deca7c444906116d79086906136dd565b600090815260116020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b03908116948201949094526003820154606082015260049091015490921660809092019190915290565b600d8054611d3190613774565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5d90613774565b8015611daa5780601f10611d7f57610100808354040283529160200191611daa565b820191906000526020600020905b815481529060010190602001808311611d8d57829003601f168201915b505050505081565b6011602052600090815260409020805460018201546002830154600384015460049094015460ff9093169391926001600160a01b0391821692911685565b606060405180606001604052806026815260200161383160269139905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611e46611ef7565b6001600160a01b0316611e576116e4565b6001600160a01b031614611e7d5760405162461bcd60e51b8152600401610854906133e7565b6001600160a01b038116611ea35760405162461bcd60e51b815260040161085490613026565b610cfb81612172565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b1480610791575061079182612373565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f3082611031565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5490565b6117548282604051806020016040528060008152506123b3565b6000611f9282611eda565b611fae5760405162461bcd60e51b81526004016108549061311e565b6000611fb983611031565b9050806001600160a01b0316846001600160a01b03161480611ff45750836001600160a01b0316611fe984610965565b6001600160a01b0316145b8061200457506120048185611e10565b949350505050565b826001600160a01b031661201f82611031565b6001600160a01b0316146120455760405162461bcd60e51b81526004016108549061341c565b6001600160a01b03821661206b5760405162461bcd60e51b8152600401610854906130a3565b6120768383836123e6565b612081600082611efb565b6001600160a01b03831660009081526003602052604081208054600192906120aa908490613731565b90915550506001600160a01b03821660009081526003602052604081208054600192906120d89084906136e6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61214484848461200c565b612150848484846123f1565b610ba55760405162461bcd60e51b815260040161085490612fd4565b60085490565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156121f65760405162461bcd60e51b8152600401610854906130e7565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906116d7908590612e9c565b606061226582611eda565b6122815760405162461bcd60e51b81526004016108549061334a565b6000828152600a60205260408120805461229a90613774565b80601f01602080910402602001604051908101604052809291908181526020018280546122c690613774565b80156123135780601f106122e857610100808354040283529160200191612313565b820191906000526020600020905b8154815290600101906020018083116122f657829003601f168201915b50505050509050600061232461250c565b905080516000141561233857509050610794565b81511561236a578082604051602001612352929190612dd8565b60405160208183030381529060405292505050610794565b6120048461251b565b60006001600160e01b031982166380ac58cd60e01b14806123a457506001600160e01b03198216635b5e139f60e01b145b8061079157506107918261259e565b6123bd83836125b7565b6123ca60008484846123f1565b610a3b5760405162461bcd60e51b815260040161085490612fd4565b610a3b838383612696565b6000612405846001600160a01b031661271f565b1561250157836001600160a01b031663150b7a02612421611ef7565b8786866040518563ffffffff1660e01b81526004016124439493929190612e1b565b602060405180830381600087803b15801561245d57600080fd5b505af192505050801561248d575060408051601f3d908101601f1916820190925261248a91810190612cdd565b60015b6124e7573d8080156124bb576040519150601f19603f3d011682016040523d82523d6000602084013e6124c0565b606091505b5080516124df5760405162461bcd60e51b815260040161085490612fd4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612004565b506001949350505050565b6060600d80546107a890613774565b606061252682611eda565b6125425760405162461bcd60e51b815260040161085490613465565b600061254c61250c565b9050600081511161256c5760405180602001604052806000815250612597565b8061257684612725565b604051602001612587929190612dd8565b6040516020818303038152906040525b9392505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b0382166125dd5760405162461bcd60e51b815260040161085490613315565b6125e681611eda565b156126035760405162461bcd60e51b81526004016108549061306c565b61260f600083836123e6565b6001600160a01b03821660009081526003602052604081208054600192906126389084906136e6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6126a1838383610a3b565b6001600160a01b0383166126bd576126b881612840565b6126e0565b816001600160a01b0316836001600160a01b0316146126e0576126e08382612884565b6001600160a01b0382166126fc576126f781612921565b610a3b565b826001600160a01b0316826001600160a01b031614610a3b57610a3b82826129fa565b3b151590565b60608161274a57506040805180820190915260018152600360fc1b6020820152610794565b8160005b8115612774578061275e816137a9565b915061276d9050600a836136fe565b915061274e565b60008167ffffffffffffffff81111561279d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127c7576020820181803683370190505b5090505b8415612004576127dc600183613731565b91506127e9600a866137c4565b6127f49060306136e6565b60f81b81838151811061281757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612839600a866136fe565b94506127cb565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161289184611066565b61289b9190613731565b6000838152600760205260409020549091508082146128ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061293390600190613731565b6000838152600960205260408120546008805493945090928490811061296957634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061299857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806129de57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a0583611066565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612a4a90613774565b90600052602060002090601f016020900481019282612a6c5760008555612ab2565b82601f10612a8557805160ff1916838001178555612ab2565b82800160010185558215612ab2579182015b82811115612ab2578251825591602001919060010190612a97565b50612abe929150612ac2565b5090565b5b80821115612abe5760008155600101612ac3565b600067ffffffffffffffff80841115612af257612af2613804565b604051601f8501601f191681016020018281118282101715612b1657612b16613804565b604052848152915081838501861015612b2e57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461079457600080fd5b600060208284031215612b6f578081fd5b61259782612b47565b60008060408385031215612b8a578081fd5b612b9383612b47565b9150612ba160208401612b47565b90509250929050565b600080600060608486031215612bbe578081fd5b612bc784612b47565b9250612bd560208501612b47565b9150604084013590509250925092565b60008060008060808587031215612bfa578081fd5b612c0385612b47565b9350612c1160208601612b47565b925060408501359150606085013567ffffffffffffffff811115612c33578182fd5b8501601f81018713612c43578182fd5b612c5287823560208401612ad7565b91505092959194509250565b60008060408385031215612c70578182fd5b612c7983612b47565b915060208301358015158114612c8d578182fd5b809150509250929050565b60008060408385031215612caa578182fd5b612cb383612b47565b946020939093013593505050565b600060208284031215612cd2578081fd5b81356125978161381a565b600060208284031215612cee578081fd5b81516125978161381a565b600060208284031215612d0a578081fd5b813567ffffffffffffffff811115612d20578182fd5b8201601f81018413612d30578182fd5b61200484823560208401612ad7565b600060208284031215612d50578081fd5b5035919050565b60008060408385031215612d69578182fd5b50508035926020909101359150565b600080600060608486031215612d8c578283fd5b8335925060208401359150612da360408501612b47565b90509250925092565b60008151808452612dc4816020860160208601613748565b601f01601f19169290920160200192915050565b60008351612dea818460208801613748565b835190830190612dfe818360208801613748565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e4e90830184612dac565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9057835183529284019291840191600101612e74565b50909695505050505050565b901515815260200190565b93151584526001600160a01b03928316602085015291166040830152606082015260800190565b93151584526001600160a01b039283166020850152604084019190915216606082015260800190565b931515845260208401929092526001600160a01b03166040830152606082015260800190565b941515855260208501939093526001600160a01b039182166040850152606084015216608082015260a00190565b6000602082526125976020830184612dac565b6020808252601190820152704f776e65722063616e6e6f74206275792160781b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601190820152704f776e65722063616e6e6f74206269642160781b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f596f752063616e6e6f7420627579207468697320626561722100000000000000604082015260600190565b602080825260169082015275596f7520617265206e6f7420746865204f776e65722160501b604082015260600190565b6020808252600f908201526e125b9cdd599998da595b9d08109a59608a1b604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526010908201526f125b9cdd599998da595b9d08119d5b9960821b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252600d908201526c13585c9ad95d0818db1bdcd959609a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601a908201527f546869732042656172206973206e6f7420666f722073616c6521000000000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526019908201527f426f782063616e6e6f74206265206f70656e6564207965742100000000000000604082015260600190565b602080825260139082015272496e646578206f7574206f662072616e67652160681b604082015260600190565b60208082526017908201527f596f7520617265206e6f74207468652062696464657221000000000000000000604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b90815260200190565b600082198211156136f9576136f96137d8565b500190565b60008261370d5761370d6137ee565b500490565b600081600019048311821515161561372c5761372c6137d8565b500290565b600082821015613743576137436137d8565b500390565b60005b8381101561376357818101518382015260200161374b565b83811115610ba55750506000910152565b60028104600182168061378857607f821691505b6020821081141561158f57634e487b7160e01b600052602260045260246000fd5b60006000198214156137bd576137bd6137d8565b5060010190565b6000826137d3576137d36137ee565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cfb57600080fdfe68747470733a2f2f62656172686f6f642e6574682e6c696e6b2f636f6e746163742d6d657461a2646970667358221220c692f540adaa28cf594944c8f3da6eaf57c946e001867a10b9b36492a9cdacab64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063848b9dce11610139578063c0750872116100b6578063dc1fe1b91161007a578063dc1fe1b9146106cb578063df6552b9146106eb578063e311ce0f14610700578063e8a3d48514610731578063e985e9c514610746578063f2fde38b1461076657610246565b8063c075087214610628578063c1de405b14610648578063c254cc7b14610678578063c87b56dd14610698578063da5186ec146106b857610246565b8063a99fd988116100fd578063a99fd98814610568578063abd81c3014610598578063af4aa6d7146105c8578063b88d4fde146105e8578063c00340c91461060857610246565b8063848b9dce146104de5780638da5cb5b146104fe57806395d89b41146105135780639b4f8fd714610528578063a22cb4651461054857610246565b80632b1fd58a116101c757806370a082311161018b57806370a082311461044957806370e8c5ea14610469578063715018a61461047c578063751ef753146104915780638462151c146104b157610246565b80632b1fd58a146103a95780632f745c59146103c957806342842e0e146103e95780634f6ccce7146104095780636352211e1461042957610246565b80630eaaf4c81161020e5780630eaaf4c81461031257806318160ddd14610332578063190625d71461035457806323b872dd1461037457806324600fc31461039457610246565b806301ffc9a71461024b57806306fdde03146102815780630769abb5146102a3578063081812fc146102c5578063095ea7b3146102f2575b600080fd5b34801561025757600080fd5b5061026b610266366004612cc1565b610786565b6040516102789190612e9c565b60405180910390f35b34801561028d57600080fd5b50610296610799565b6040516102789190612f4b565b3480156102af57600080fd5b506102c36102be366004612d3f565b61082b565b005b3480156102d157600080fd5b506102e56102e0366004612d3f565b610965565b6040516102789190612e07565b3480156102fe57600080fd5b506102c361030d366004612c98565b6109a8565b34801561031e57600080fd5b506102c361032d366004612d3f565b610a40565b34801561033e57600080fd5b50610347610bab565b60405161027891906136dd565b34801561036057600080fd5b5061034761036f366004612b5e565b610bc8565b34801561038057600080fd5b506102c361038f366004612baa565b610c58565b3480156103a057600080fd5b506102c3610c90565b3480156103b557600080fd5b506102c36103c4366004612d3f565b610cfe565b3480156103d557600080fd5b506103476103e4366004612c98565b610f69565b3480156103f557600080fd5b506102c3610404366004612baa565b610fbb565b34801561041557600080fd5b50610347610424366004612d3f565b610fd6565b34801561043557600080fd5b506102e5610444366004612d3f565b611031565b34801561045557600080fd5b50610347610464366004612b5e565b611066565b6102c3610477366004612d3f565b6110aa565b34801561048857600080fd5b506102c36113d6565b34801561049d57600080fd5b506102c36104ac366004612d3f565b611421565b3480156104bd57600080fd5b506104d16104cc366004612b5e565b6114b4565b6040516102789190612e58565b3480156104ea57600080fd5b506102c36104f9366004612d78565b611595565b34801561050a57600080fd5b506102e56116e4565b34801561051f57600080fd5b506102966116f3565b34801561053457600080fd5b506102c3610543366004612cf9565b611702565b34801561055457600080fd5b506102c3610563366004612c5e565b611758565b34801561057457600080fd5b50610588610583366004612d3f565b61176a565b6040516102789493929190612ea7565b3480156105a457600080fd5b506105b86105b3366004612d3f565b6117df565b6040516102789493929190612ef7565b3480156105d457600080fd5b5061026b6105e3366004612d3f565b611816565b3480156105f457600080fd5b506102c3610603366004612be5565b61186b565b34801561061457600080fd5b506102c3610623366004612d57565b6118a4565b34801561063457600080fd5b506102c3610643366004612d3f565b6119eb565b34801561065457600080fd5b50610668610663366004612d3f565b611a2f565b6040516102789493929190612ece565b34801561068457600080fd5b506102c3610693366004612b5e565b611a97565b3480156106a457600080fd5b506102966106b3366004612d3f565b611af8565b6102c36106c6366004612d57565b611b03565b3480156106d757600080fd5b5061026b6106e6366004612d3f565b611cbe565b3480156106f757600080fd5b50610296611d24565b34801561070c57600080fd5b5061072061071b366004612d3f565b611db2565b604051610278959493929190612f1d565b34801561073d57600080fd5b50610296611df0565b34801561075257600080fd5b5061026b610761366004612b78565b611e10565b34801561077257600080fd5b506102c3610781366004612b5e565b611e3e565b600061079182611eb5565b90505b919050565b6060600080546107a890613774565b80601f01602080910402602001604051908101604052809291908181526020018280546107d490613774565b80156108215780601f106107f657610100808354040283529160200191610821565b820191906000526020600020905b81548152906001019060200180831161080457829003601f168201915b5050505050905090565b600f54600160a81b900460ff1661085d5760405162461bcd60e51b81526004016108549061351f565b60405180910390fd5b61271081111561087f5760405162461bcd60e51b815260040161085490613651565b3361088982611031565b6001600160a01b0316146108af5760405162461bcd60e51b8152600401610854906132bc565b6040805160a0810182526000808252602080830185815233848601908152606085018481526080860185815288865260119094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917f255b61fa2ffc4c709740f5521db1bc2cc1cdf07938494210fa5f61881fb9e69291a250565b600061097082611eda565b61098c5760405162461bcd60e51b81526004016108549061339b565b506000908152600460205260409020546001600160a01b031690565b60006109b382611031565b9050806001600160a01b0316836001600160a01b031614156109e75760405162461bcd60e51b8152600401610854906134de565b806001600160a01b03166109f9611ef7565b6001600160a01b03161480610a155750610a1581610761611ef7565b610a315760405162461bcd60e51b815260040161085490613195565b610a3b8383611efb565b505050565b600f54600160a81b900460ff16610a695760405162461bcd60e51b81526004016108549061351f565b612710811115610a8b5760405162461bcd60e51b815260040161085490613651565b600081815260126020526040902060028101546001600160a01b03163314610ac55760405162461bcd60e51b81526004016108549061367e565b600381810180546040805160808101825260008082526020808301898152838501838152606085018481528b85526012909352928590209351845460ff191690151517845551600184015590516002830180546001600160a01b0319166001600160a01b0390921691909117905551940193909355905491519091339185917f1a7e33f5517c526ae6d292514f4880ca2de53ac252a7de3236d3c58978af0a3691610b7091906136dd565b60405180910390a3604051339082156108fc029083906000818181858888f19350505050158015610ba5573d6000803e3d6000fd5b50505050565b60006001610bb9600c611f69565b610bc39190613731565b905090565b600f54600090600160a01b900460ff16610bf45760405162461bcd60e51b81526004016108549061361a565b600f546001600160a01b03163314610c1e5760405162461bcd60e51b8152600401610854906136b5565b600e54610c2b600c611f69565b1115610c3657600080fd5b6000610c42600c611f69565b9050610c4e8382611f6d565b610791600c611eac565b610c69610c63611ef7565b82611f87565b610c855760405162461bcd60e51b815260040161085490613546565b610a3b83838361200c565b610c98611ef7565b6001600160a01b0316610ca96116e4565b6001600160a01b031614610ccf5760405162461bcd60e51b8152600401610854906133e7565b60405133904780156108fc02916000818181858888f19350505050158015610cfb573d6000803e3d6000fd5b50565b600f54600160a81b900460ff16610d275760405162461bcd60e51b81526004016108549061351f565b612710811115610d495760405162461bcd60e51b815260040161085490613651565b33610d5382611031565b6001600160a01b031614610d795760405162461bcd60e51b8152600401610854906132bc565b60008181526012602052604090206003810154339190610d9857600080fd5b6002810154604080516020810190915260008152610dc59133916001600160a01b03909116908690612139565b6040805160a081018252600080825260208083018781526002808701546001600160a01b0390811686880190815260608701868152608088018781528c88526011909652979095209551865490151560ff1990911617865591516001860155925192840180549382166001600160a01b031994851617905593516003808501919091559051600490930180549385169390921692909217905582015460105490918416906108fc906103e890610e7b9085613712565b610e8591906136fe565b6040518115909202916000818181858888f19350505050158015610ead573d6000803e3d6000fd5b506040805160808101825260008082526020808301888152838501838152606085018481528a85526012909352928590209351845460ff19169015151784555160018401559051600280840180546001600160a01b0319166001600160a01b03938416179055915160039384015590850154918501549251918116929086169187917ffef56da5757859e97b6fb427f4cd63b97a3fdc89ea1e3607feb19c52fd00c73d91610f5b91906136dd565b60405180910390a450505050565b6000610f7483611066565b8210610f925760405162461bcd60e51b815260040161085490612f89565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610a3b8383836040518060200160405280600081525061186b565b6000610fe061216c565b8210610ffe5760405162461bcd60e51b8152600401610854906135ce565b6008828154811061101f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107915760405162461bcd60e51b81526004016108549061323c565b60006001600160a01b03821661108e5760405162461bcd60e51b8152600401610854906131f2565b506001600160a01b031660009081526003602052604090205490565b600f54600160a81b900460ff166110d35760405162461bcd60e51b81526004016108549061351f565b60008181526011602052604090206127108211156111035760405162461bcd60e51b815260040161085490613651565b805460ff166111245760405162461bcd60e51b815260040161085490613597565b60048101546001600160a01b0316158061114a575060048101546001600160a01b031633145b6111665760405162461bcd60e51b815260040161085490613285565b806003015434101561118a5760405162461bcd60e51b8152600401610854906134b4565b3361119483611031565b6001600160a01b031614156111bb5760405162461bcd60e51b815260040161085490612f5e565b60028101546040805160208101909152600081526001600160a01b03909116906111ea90829033908690612139565b806001600160a01b03166108fc6103e8601054856003015461120c9190613712565b61121691906136fe565b6040518115909202916000818181858888f1935050505015801561123e573d6000803e3d6000fd5b506040805160a081018252600080825260208083018781523384860181815260608601858152608087018681528b87526011909552948790209551865460ff19169015151786559151600186015590516002850180546001600160a01b03199081166001600160a01b039384161790915593516003860155915160049094018054909316938216939093179091559151909183169085907ffef56da5757859e97b6fb427f4cd63b97a3fdc89ea1e3607feb19c52fd00c73d906113029034906136dd565b60405180910390a4600083815260126020526040902060028101546001600160a01b0316331415610ba5576003810154604051339180156108fc02916000818181858888f1935050505015801561135d573d6000803e3d6000fd5b50506040805160808101825260008082526020808301878152838501838152606085018481529884526012909252939091209151825460ff19169015151782559151600182015590516002820180546001600160a01b0319166001600160a01b0390921691909117905592516003909301929092555050565b6113de611ef7565b6001600160a01b03166113ef6116e4565b6001600160a01b0316146114155760405162461bcd60e51b8152600401610854906133e7565b61141f6000612172565b565b611429611ef7565b6001600160a01b031661143a6116e4565b6001600160a01b0316146114605760405162461bcd60e51b8152600401610854906133e7565b8061148957600f805460ff60a01b198116600160a01b9182900460ff1615909102179055610cfb565b8060011415610cfb5750600f805460ff60a81b198116600160a81b9182900460ff1615909102179055565b606060006114c183611066565b9050806114de575050604080516000815260208101909152610794565b60008167ffffffffffffffff81111561150757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611530578160200160208202803683370190505b50905060005b82811015611585576115488582610f69565b82828151811061156857634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061157d816137a9565b915050611536565b5091506107949050565b50919050565b600f54600160a81b900460ff166115be5760405162461bcd60e51b81526004016108549061351f565b6127108311156115e05760405162461bcd60e51b815260040161085490613651565b336115ea84611031565b6001600160a01b0316146116105760405162461bcd60e51b8152600401610854906132bc565b6040805160a0810182526001808252602080830187815233848601908152606085018881526001600160a01b038881166080880181815260008d81526011909752958990209751885490151560ff1990911617885593519587019590955590516002860180549186166001600160a01b0319928316179055905160038601559151600490940180549490931693909116929092179055905184907fcf99bdf131f7b3184e8839e1528141a6cc81872c3a3e7f8f887f69b61d4c94d9906116d79086906136dd565b60405180910390a3505050565b600b546001600160a01b031690565b6060600180546107a890613774565b61170a611ef7565b6001600160a01b031661171b6116e4565b6001600160a01b0316146117415760405162461bcd60e51b8152600401610854906133e7565b805161175490600d906020840190612a3e565b5050565b611754611763611ef7565b83836121c4565b60008181526012602090815260408083208151608081018352815460ff16151580825260018301549482019490945260028201546001600160a01b031692810192909252600301546060820152909190819081906117c786611031565b93508060400151925080606001519150509193509193565b601260205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b039091169084565b6000908152601260209081526040918290208251608081018452815460ff16151580825260018301549382019390935260028201546001600160a01b0316938101939093526003015460609092019190915290565b61187c611876611ef7565b83611f87565b6118985760405162461bcd60e51b815260040161085490613546565b610ba584848484612139565b600f54600160a81b900460ff166118cd5760405162461bcd60e51b81526004016108549061351f565b6127108211156118ef5760405162461bcd60e51b815260040161085490613651565b336118f983611031565b6001600160a01b03161461191f5760405162461bcd60e51b8152600401610854906132bc565b6040805160a0810182526001808252602080830186815233848601908152606085018781526000608087018181528a825260119095528781209651875460ff1916901515178755925194860194909455516002850180546001600160a01b03199081166001600160a01b03938416179091559351600386015591516004909401805490931693909116929092179055905183907fcf99bdf131f7b3184e8839e1528141a6cc81872c3a3e7f8f887f69b61d4c94d9906119df9085906136dd565b60405180910390a35050565b6119f3611ef7565b6001600160a01b0316611a046116e4565b6001600160a01b031614611a2a5760405162461bcd60e51b8152600401610854906133e7565b601055565b600090815260116020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b039081169482018590526003830154606083018190526004909301541660809091018190529193909190565b611a9f611ef7565b6001600160a01b0316611ab06116e4565b6001600160a01b031614611ad65760405162461bcd60e51b8152600401610854906133e7565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60606107918261225a565b600f54600160a81b900460ff16611b2c5760405162461bcd60e51b81526004016108549061351f565b612710821115611b4e5760405162461bcd60e51b815260040161085490613651565b33611b5883611031565b6001600160a01b03161415611b7f5760405162461bcd60e51b81526004016108549061316a565b60008111611b8c57600080fd5b6000828152601260205260409020348211801590611bae575080600301543410155b611bca5760405162461bcd60e51b8152600401610854906132ec565b600381015415611c1657600281015460038201546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015611c14573d6000803e3d6000fd5b505b604080516080810182526001808252602080830187815233848601818152346060870190815260008b81526012909552938790209551865460ff1916901515178655915193850193909355516002840180546001600160a01b0319166001600160a01b0390921691909117905551600390920191909155905184907f334b5966009028a92cecd5ff78bf6066046556b785115fa863a3838deca7c444906116d79086906136dd565b600090815260116020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b03908116948201949094526003820154606082015260049091015490921660809092019190915290565b600d8054611d3190613774565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5d90613774565b8015611daa5780601f10611d7f57610100808354040283529160200191611daa565b820191906000526020600020905b815481529060010190602001808311611d8d57829003601f168201915b505050505081565b6011602052600090815260409020805460018201546002830154600384015460049094015460ff9093169391926001600160a01b0391821692911685565b606060405180606001604052806026815260200161383160269139905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611e46611ef7565b6001600160a01b0316611e576116e4565b6001600160a01b031614611e7d5760405162461bcd60e51b8152600401610854906133e7565b6001600160a01b038116611ea35760405162461bcd60e51b815260040161085490613026565b610cfb81612172565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b1480610791575061079182612373565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f3082611031565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5490565b6117548282604051806020016040528060008152506123b3565b6000611f9282611eda565b611fae5760405162461bcd60e51b81526004016108549061311e565b6000611fb983611031565b9050806001600160a01b0316846001600160a01b03161480611ff45750836001600160a01b0316611fe984610965565b6001600160a01b0316145b8061200457506120048185611e10565b949350505050565b826001600160a01b031661201f82611031565b6001600160a01b0316146120455760405162461bcd60e51b81526004016108549061341c565b6001600160a01b03821661206b5760405162461bcd60e51b8152600401610854906130a3565b6120768383836123e6565b612081600082611efb565b6001600160a01b03831660009081526003602052604081208054600192906120aa908490613731565b90915550506001600160a01b03821660009081526003602052604081208054600192906120d89084906136e6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61214484848461200c565b612150848484846123f1565b610ba55760405162461bcd60e51b815260040161085490612fd4565b60085490565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156121f65760405162461bcd60e51b8152600401610854906130e7565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906116d7908590612e9c565b606061226582611eda565b6122815760405162461bcd60e51b81526004016108549061334a565b6000828152600a60205260408120805461229a90613774565b80601f01602080910402602001604051908101604052809291908181526020018280546122c690613774565b80156123135780601f106122e857610100808354040283529160200191612313565b820191906000526020600020905b8154815290600101906020018083116122f657829003601f168201915b50505050509050600061232461250c565b905080516000141561233857509050610794565b81511561236a578082604051602001612352929190612dd8565b60405160208183030381529060405292505050610794565b6120048461251b565b60006001600160e01b031982166380ac58cd60e01b14806123a457506001600160e01b03198216635b5e139f60e01b145b8061079157506107918261259e565b6123bd83836125b7565b6123ca60008484846123f1565b610a3b5760405162461bcd60e51b815260040161085490612fd4565b610a3b838383612696565b6000612405846001600160a01b031661271f565b1561250157836001600160a01b031663150b7a02612421611ef7565b8786866040518563ffffffff1660e01b81526004016124439493929190612e1b565b602060405180830381600087803b15801561245d57600080fd5b505af192505050801561248d575060408051601f3d908101601f1916820190925261248a91810190612cdd565b60015b6124e7573d8080156124bb576040519150601f19603f3d011682016040523d82523d6000602084013e6124c0565b606091505b5080516124df5760405162461bcd60e51b815260040161085490612fd4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612004565b506001949350505050565b6060600d80546107a890613774565b606061252682611eda565b6125425760405162461bcd60e51b815260040161085490613465565b600061254c61250c565b9050600081511161256c5760405180602001604052806000815250612597565b8061257684612725565b604051602001612587929190612dd8565b6040516020818303038152906040525b9392505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6001600160a01b0382166125dd5760405162461bcd60e51b815260040161085490613315565b6125e681611eda565b156126035760405162461bcd60e51b81526004016108549061306c565b61260f600083836123e6565b6001600160a01b03821660009081526003602052604081208054600192906126389084906136e6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6126a1838383610a3b565b6001600160a01b0383166126bd576126b881612840565b6126e0565b816001600160a01b0316836001600160a01b0316146126e0576126e08382612884565b6001600160a01b0382166126fc576126f781612921565b610a3b565b826001600160a01b0316826001600160a01b031614610a3b57610a3b82826129fa565b3b151590565b60608161274a57506040805180820190915260018152600360fc1b6020820152610794565b8160005b8115612774578061275e816137a9565b915061276d9050600a836136fe565b915061274e565b60008167ffffffffffffffff81111561279d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127c7576020820181803683370190505b5090505b8415612004576127dc600183613731565b91506127e9600a866137c4565b6127f49060306136e6565b60f81b81838151811061281757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612839600a866136fe565b94506127cb565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161289184611066565b61289b9190613731565b6000838152600760205260409020549091508082146128ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061293390600190613731565b6000838152600960205260408120546008805493945090928490811061296957634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061299857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806129de57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a0583611066565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612a4a90613774565b90600052602060002090601f016020900481019282612a6c5760008555612ab2565b82601f10612a8557805160ff1916838001178555612ab2565b82800160010185558215612ab2579182015b82811115612ab2578251825591602001919060010190612a97565b50612abe929150612ac2565b5090565b5b80821115612abe5760008155600101612ac3565b600067ffffffffffffffff80841115612af257612af2613804565b604051601f8501601f191681016020018281118282101715612b1657612b16613804565b604052848152915081838501861015612b2e57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461079457600080fd5b600060208284031215612b6f578081fd5b61259782612b47565b60008060408385031215612b8a578081fd5b612b9383612b47565b9150612ba160208401612b47565b90509250929050565b600080600060608486031215612bbe578081fd5b612bc784612b47565b9250612bd560208501612b47565b9150604084013590509250925092565b60008060008060808587031215612bfa578081fd5b612c0385612b47565b9350612c1160208601612b47565b925060408501359150606085013567ffffffffffffffff811115612c33578182fd5b8501601f81018713612c43578182fd5b612c5287823560208401612ad7565b91505092959194509250565b60008060408385031215612c70578182fd5b612c7983612b47565b915060208301358015158114612c8d578182fd5b809150509250929050565b60008060408385031215612caa578182fd5b612cb383612b47565b946020939093013593505050565b600060208284031215612cd2578081fd5b81356125978161381a565b600060208284031215612cee578081fd5b81516125978161381a565b600060208284031215612d0a578081fd5b813567ffffffffffffffff811115612d20578182fd5b8201601f81018413612d30578182fd5b61200484823560208401612ad7565b600060208284031215612d50578081fd5b5035919050565b60008060408385031215612d69578182fd5b50508035926020909101359150565b600080600060608486031215612d8c578283fd5b8335925060208401359150612da360408501612b47565b90509250925092565b60008151808452612dc4816020860160208601613748565b601f01601f19169290920160200192915050565b60008351612dea818460208801613748565b835190830190612dfe818360208801613748565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e4e90830184612dac565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e9057835183529284019291840191600101612e74565b50909695505050505050565b901515815260200190565b93151584526001600160a01b03928316602085015291166040830152606082015260800190565b93151584526001600160a01b039283166020850152604084019190915216606082015260800190565b931515845260208401929092526001600160a01b03166040830152606082015260800190565b941515855260208501939093526001600160a01b039182166040850152606084015216608082015260a00190565b6000602082526125976020830184612dac565b6020808252601190820152704f776e65722063616e6e6f74206275792160781b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601190820152704f776e65722063616e6e6f74206269642160781b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f596f752063616e6e6f7420627579207468697320626561722100000000000000604082015260600190565b602080825260169082015275596f7520617265206e6f7420746865204f776e65722160501b604082015260600190565b6020808252600f908201526e125b9cdd599998da595b9d08109a59608a1b604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526010908201526f125b9cdd599998da595b9d08119d5b9960821b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252600d908201526c13585c9ad95d0818db1bdcd959609a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601a908201527f546869732042656172206973206e6f7420666f722073616c6521000000000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526019908201527f426f782063616e6e6f74206265206f70656e6564207965742100000000000000604082015260600190565b602080825260139082015272496e646578206f7574206f662072616e67652160681b604082015260600190565b60208082526017908201527f596f7520617265206e6f74207468652062696464657221000000000000000000604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b90815260200190565b600082198211156136f9576136f96137d8565b500190565b60008261370d5761370d6137ee565b500490565b600081600019048311821515161561372c5761372c6137d8565b500290565b600082821015613743576137436137d8565b500390565b60005b8381101561376357818101518382015260200161374b565b83811115610ba55750506000910152565b60028104600182168061378857607f821691505b6020821081141561158f57634e487b7160e01b600052602260045260246000fd5b60006000198214156137bd576137bd6137d8565b5060010190565b6000826137d3576137d36137ee565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cfb57600080fdfe68747470733a2f2f62656172686f6f642e6574682e6c696e6b2f636f6e746163742d6d657461a2646970667358221220c692f540adaa28cf594944c8f3da6eaf57c946e001867a10b9b36492a9cdacab64736f6c63430008000033

Deployed Bytecode Sourcemap

1779:7668:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1035:169;;;;;;;;;;-1:-1:-1;1035:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2473:98:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4792:314:0:-;;;;;;;;;;-1:-1:-1;4792:314:0;;;;;:::i;:::-;;:::i;:::-;;3984:217:2;;;;;;;;;;-1:-1:-1;3984:217:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3522:401::-;;;;;;;;;;-1:-1:-1;3522:401:2;;;;;:::i;:::-;;:::i;7801:450:0:-;;;;;;;;;;-1:-1:-1;7801:450:0;;;;;:::i;:::-;;:::i;914:115::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2268:347::-;;;;;;;;;;-1:-1:-1;2268:347:0;;;;;:::i;:::-;;:::i;4711:330:2:-;;;;;;;;;;-1:-1:-1;4711:330:2;;;;;:::i;:::-;;:::i;9344:101:0:-;;;;;;;;;;;;;:::i;7125:670::-;;;;;;;;;;-1:-1:-1;7125:670:0;;;;;:::i;:::-;;:::i;1291:253:5:-;;;;;;;;;;-1:-1:-1;1291:253:5;;;;;:::i;:::-;;:::i;5107:179:2:-;;;;;;;;;;-1:-1:-1;5107:179:2;;;;;:::i;:::-;;:::i;1798:230:5:-;;;;;;;;;;-1:-1:-1;1798:230:5;;;;;:::i;:::-;;:::i;2176:235:2:-;;;;;;;;;;-1:-1:-1;2176:235:2;;;;;:::i;:::-;;:::i;1914:205::-;;;;;;;;;;-1:-1:-1;1914:205:2;;;;;:::i;:::-;;:::i;5486:1010:0:-;;;;;;:::i;:::-;;:::i;1668:101:1:-;;;;;;;;;;;;;:::i;2965:204:0:-;;;;;;;;;;-1:-1:-1;2965:204:0;;;;;:::i;:::-;;:::i;3175:390::-;;;;;;;;;;-1:-1:-1;3175:390:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5112:368::-;;;;;;;;;;-1:-1:-1;5112:368:0;;;;;:::i;:::-;;:::i;1036:85:1:-;;;;;;;;;;;;;:::i;2635:102:2:-;;;;;;;;;;;;;:::i;2733:97:0:-;;;;;;;;;;-1:-1:-1;2733:97:0;;;;;:::i;:::-;;:::i;4268:153:2:-;;;;;;;;;;-1:-1:-1;4268:153:2;;;;;:::i;:::-;;:::i;9011:327:0:-;;;;;;;;;;-1:-1:-1;9011:327:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;4391:40::-;;;;;;;;;;-1:-1:-1;4391:40:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;8503:140::-;;;;;;;;;;-1:-1:-1;8503:140:0;;;;;:::i;:::-;;:::i;5352:320:2:-;;;;;;;;;;-1:-1:-1;5352:320:2;;;;;:::i;:::-;;:::i;4438:348:0:-;;;;;;;;;;-1:-1:-1;4438:348:0;;;;;:::i;:::-;;:::i;8257:82::-;;;;;;;;;;-1:-1:-1;8257:82:0;;;;;:::i;:::-;;:::i;8649:356::-;;;;;;;;;;-1:-1:-1;8649:356:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2621:106::-;;;;;;;;;;-1:-1:-1;2621:106:0;;;;;:::i;:::-;;:::i;1501:155::-;;;;;;;;;;-1:-1:-1;1501:155:0;;;;;:::i;:::-;;:::i;6502:617::-;;;;;;:::i;:::-;;:::i;8345:152::-;;;;;;;;;;-1:-1:-1;8345:152:0;;;;;:::i;:::-;;:::i;697:59::-;;;;;;;;;;;;;:::i;4341:44::-;;;;;;;;;;-1:-1:-1;4341:44:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;2836:123::-;;;;;;;;;;;;;:::i;4487:162:2:-;;;;;;;;;;-1:-1:-1;4487:162:2;;;;;:::i;:::-;;:::i;1918:198:1:-;;;;;;;;;;-1:-1:-1;1918:198:1;;;;;:::i;:::-;;:::i;1035:169:0:-;1138:4;1161:36;1185:11;1161:23;:36::i;:::-;1154:43;;1035:169;;;;:::o;2473:98:2:-;2527:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:98;:::o;4792:314:0:-;2125:10;;-1:-1:-1;;;2125:10:0;;;;2117:36;;;;-1:-1:-1;;;2117:36:0;;;;;;;:::i;:::-;;;;;;;;;4876:5:::1;4866:6;:15;;4858:47;;;;-1:-1:-1::0;;;4858:47:0::1;;;;;;;:::i;:::-;4942:10;4923:15;4931:6:::0;4923:7:::1;:15::i;:::-;-1:-1:-1::0;;;;;4923:29:0::1;;4915:64;;;;-1:-1:-1::0;;;4915:64:0::1;;;;;;;:::i;:::-;5010:47;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;5010:47:0;;;::::1;::::0;;::::1;::::0;;;5031:10:::1;5010:47:::0;;;;;;;;;;;;;;;;;;4989:18;;;:10:::1;:18:::0;;;;;;:68;;;;-1:-1:-1;;4989:68:0::1;::::0;::::1;;;::::0;;;;-1:-1:-1;4989:68:0;::::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;4989:68:0;;::::1;-1:-1:-1::0;;;;;4989:68:0;;::::1;;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;5072:27;;5010:47;;5072:27:::1;::::0;::::1;4792:314:::0;:::o;3984:217:2:-;4060:7;4087:16;4095:7;4087;:16::i;:::-;4079:73;;;;-1:-1:-1;;;4079:73:2;;;;;;;:::i;:::-;-1:-1:-1;4170:24:2;;;;:15;:24;;;;;;-1:-1:-1;;;;;4170:24:2;;3984:217::o;3522:401::-;3602:13;3618:23;3633:7;3618:14;:23::i;:::-;3602:39;;3665:5;-1:-1:-1;;;;;3659:11:2;:2;-1:-1:-1;;;;;3659:11:2;;;3651:57;;;;-1:-1:-1;;;3651:57:2;;;;;;;:::i;:::-;3756:5;-1:-1:-1;;;;;3740:21:2;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3740:21:2;;:62;;;;3765:37;3782:5;3789:12;:10;:12::i;3765:37::-;3719:165;;;;-1:-1:-1;;;3719:165:2;;;;;;;:::i;:::-;3895:21;3904:2;3908:7;3895:8;:21::i;:::-;3522:401;;;:::o;7801:450:0:-;2125:10;;-1:-1:-1;;;2125:10:0;;;;2117:36;;;;-1:-1:-1;;;2117:36:0;;;;;;;:::i;:::-;7886:5:::1;7876:6;:15;;7868:47;;;;-1:-1:-1::0;;;7868:47:0::1;;;;;;;:::i;:::-;7925:15;7943:16:::0;;;:8:::1;:16;::::0;;;;7977:10:::1;::::0;::::1;::::0;-1:-1:-1;;;;;7977:10:0::1;7991;7977:24;7969:60;;;;-1:-1:-1::0;;;7969:60:0::1;;;;;;;:::i;:::-;8065:9;::::0;;::::1;::::0;;8103:33:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;8103:33:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;8084:16;;;:8:::1;:16:::0;;;;;;;:52;;;;-1:-1:-1;;8084:52:0::1;::::0;::::1;;;::::0;;;-1:-1:-1;8084:52:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;8084:52:0::1;-1:-1:-1::0;;;;;8084:52:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;;8176:9;;8151:47;;8065:9;;8187:10:::1;::::0;8103:33;;8151:47:::1;::::0;::::1;::::0;8176:9;8151:47:::1;:::i;:::-;;;;;;;;8208:36;::::0;8216:10:::1;::::0;8208:36;::::1;;;::::0;8237:6;;8208:36:::1;::::0;;;8237:6;8216:10;8208:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;2163:1;;7801:450:::0;:::o;914:115::-;967:7;1021:1;993:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;986:36;;914:115;:::o;2268:347::-;2022:7;;2325;;-1:-1:-1;;;2022:7:0;;;;2014:45;;;;-1:-1:-1;;;2014:45:0;;;;;;;:::i;:::-;2366:15:::1;::::0;-1:-1:-1;;;;;2366:15:0::1;2352:10;:29;2344:56;;;;-1:-1:-1::0;;;2344:56:0::1;;;;;;;:::i;:::-;2447:9;;2418:25;:15;:23;:25::i;:::-;:38;;2410:47;;;::::0;::::1;;2467:16;2487:25;:15;:23;:25::i;:::-;2467:45;;2523:23;2533:2;2537:8;2523:9;:23::i;:::-;2556:27;:15;:25;:27::i;4711:330:2:-:0;4900:41;4919:12;:10;:12::i;:::-;4933:7;4900:18;:41::i;:::-;4892:103;;;;-1:-1:-1;;;4892:103:2;;;;;;;:::i;:::-;5006:28;5016:4;5022:2;5026:7;5006:9;:28::i;9344:101:0:-;1259:12:1;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:1;;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;9390:51:0::1;::::0;9398:10:::1;::::0;9419:21:::1;9390:51:::0;::::1;;;::::0;::::1;::::0;;;9419:21;9398:10;9390:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;9344:101::o:0;7125:670::-;2125:10;;-1:-1:-1;;;2125:10:0;;;;2117:36;;;;-1:-1:-1;;;2117:36:0;;;;;;;:::i;:::-;7208:5:::1;7198:6;:15;;7190:47;;;;-1:-1:-1::0;;;7190:47:0::1;;;;;;;:::i;:::-;7274:10;7255:15;7263:6:::0;7255:7:::1;:15::i;:::-;-1:-1:-1::0;;;;;7255:29:0::1;;7247:64;;;;-1:-1:-1::0;;;7247:64:0::1;;;;;;;:::i;:::-;7321:22;7393:16:::0;;;:8:::1;:16;::::0;;;;7427:9:::1;::::0;::::1;::::0;7354:10:::1;::::0;7393:16;7419:22:::1;;;::::0;::::1;;7477:10;::::0;::::1;::::0;7451:49:::1;::::0;;::::1;::::0;::::1;::::0;;;7477:10:::1;7451:49:::0;;::::1;::::0;7465:10:::1;::::0;-1:-1:-1;;;;;7477:10:0;;::::1;::::0;7489:6;;7451:13:::1;:49::i;:::-;7532:47;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;7532:47:0;;;::::1;::::0;;::::1;::::0;;;7553:10:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;7553:10:0;;::::1;7532:47:::0;;;;;;;;;;;;;;;;;;7511:18;;;:10:::1;:18:::0;;;;;;;:68;;;;;::::1;;-1:-1:-1::0;;7511:68:0;;::::1;;::::0;;;;7532:47;7511:68;::::1;::::0;;;;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;7511:68:0;;::::1;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;7606:9;::::1;::::0;7648:8:::1;::::0;7606:9;;7625:15;::::1;::::0;:37:::1;::::0;7657:4:::1;::::0;7641:15:::1;::::0;7606:9;7641:15:::1;:::i;:::-;:20;;;;:::i;:::-;7625:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;7691:33:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;7691:33:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;7672:16;;;:8:::1;:16:::0;;;;;;;:52;;;;-1:-1:-1;;7672:52:0::1;::::0;::::1;;;::::0;;;-1:-1:-1;7672:52:0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;7672:52:0::1;-1:-1:-1::0;;;;;7672:52:0;;::::1;;::::0;;;;::::1;::::0;;::::1;::::0;7777:10;;::::1;::::0;7758:9;;::::1;::::0;7739:49;;7777:10;;::::1;::::0;7739:49;;::::1;::::0;7691:33;;7739:49:::1;::::0;::::1;::::0;7758:9;7739:49:::1;:::i;:::-;;;;;;;;2163:1;;;7125:670:::0;:::o;1291:253:5:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;-1:-1:-1;;;1407:87:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1511:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;5107:179:2:-;5240:39;5257:4;5263:2;5267:7;5240:39;;;;;;;;;;;;:16;:39::i;1798:230:5:-;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;-1:-1:-1;;;1892:95:5;;;;;;;:::i;:::-;2004:10;2015:5;2004:17;;;;;;-1:-1:-1;;;2004:17:5;;;;;;;;;;;;;;;;;1997:24;;1798:230;;;:::o;2176:235:2:-;2248:7;2283:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2283:16:2;2317:19;2309:73;;;;-1:-1:-1;;;2309:73:2;;;;;;;:::i;1914:205::-;1986:7;-1:-1:-1;;;;;2013:19:2;;2005:74;;;;-1:-1:-1;;;2005:74:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2096:16:2;;;;;:9;:16;;;;;;;1914:205::o;5486:1010:0:-;2125:10;;-1:-1:-1;;;2125:10:0;;;;2117:36;;;;-1:-1:-1;;;2117:36:0;;;;;;;:::i;:::-;5557:19:::1;5579:18:::0;;;:10:::1;:18;::::0;;;;5625:5:::1;5615:15:::0;::::1;;5607:47;;;;-1:-1:-1::0;;;5607:47:0::1;;;;;;;:::i;:::-;5672:15:::0;;::::1;;5664:54;;;;-1:-1:-1::0;;;5664:54:0::1;;;;;;;:::i;:::-;5736:16;::::0;::::1;::::0;-1:-1:-1;;;;;5736:16:0::1;:30:::0;;:64:::1;;-1:-1:-1::0;5770:16:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;5770:16:0::1;5790:10;5770:30;5736:64;5728:102;;;;-1:-1:-1::0;;;5728:102:0::1;;;;;;;:::i;:::-;5861:5;:14;;;5848:9;:27;;5840:56;;;;-1:-1:-1::0;;;5840:56:0::1;;;;;;;:::i;:::-;5933:10;5914:15;5922:6:::0;5914:7:::1;:15::i;:::-;-1:-1:-1::0;;;;;5914:29:0::1;;;5906:59;;;;-1:-1:-1::0;;;5906:59:0::1;;;;;;;:::i;:::-;6009:12;::::0;::::1;::::0;6032:45:::1;::::0;;::::1;::::0;::::1;::::0;;;5976:22:::1;6032:45:::0;;-1:-1:-1;;;;;6009:12:0;;::::1;::::0;6032:45:::1;::::0;6009:12;;6054:10:::1;::::0;6066:6;;6032:13:::1;:45::i;:::-;6088:6;-1:-1:-1::0;;;;;6088:15:0::1;:45;6128:4;6119:8;;6104:5;:14;;;:23;;;;:::i;:::-;:28;;;;:::i;:::-;6088:45;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;6164:47:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;6164:47:0;;;::::1;::::0;;::::1;::::0;;;6185:10:::1;6164:47:::0;;;;;;;;;;;;;;;;;;6143:18;;;:10:::1;:18:::0;;;;;;;:68;;;;-1:-1:-1;;6143:68:0::1;::::0;::::1;;;::::0;;;;-1:-1:-1;6143:68:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;6143:68:0;;::::1;-1:-1:-1::0;;;;;6143:68:0;;::::1;;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;6226:49;;6185:10;;6226:49;::::1;::::0;6164:47;;6226:49:::1;::::0;::::1;::::0;6245:9:::1;::::0;6226:49:::1;:::i;:::-;;;;;;;;6286:15;6304:16:::0;;;:8:::1;:16;::::0;;;;6334:10:::1;::::0;::::1;::::0;-1:-1:-1;;;;;6334:10:0::1;6348;6334:24;6330:160;;;6403:9;::::0;::::1;::::0;6374:39:::1;::::0;6382:10:::1;::::0;6374:39;::::1;;;::::0;::::1;::::0;;;6403:9;6382:10;6374:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;6446:33:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;6446:33:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;6427:16;;;:8:::1;:16:::0;;;;;;;:52;;;;-1:-1:-1;;6427:52:0::1;::::0;::::1;;;::::0;;;;-1:-1:-1;6427:52:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;6427:52:0::1;-1:-1:-1::0;;;;;6427:52:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;5486:1010:0:o;1668:101:1:-;1259:12;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:1;;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;2965:204:0:-;1259:12:1;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:1;;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;3030:14:0;3027:136:::1;;3071:7;::::0;;-1:-1:-1;;;;3060:18:0;::::1;-1:-1:-1::0;;;3071:7:0;;;::::1;;;3070:8;3060:18:::0;;::::1;;::::0;;3027:136:::1;;;3098:9;3111:1;3098:14;3095:68;;;-1:-1:-1::0;3142:10:0::1;::::0;;-1:-1:-1;;;;3128:24:0;::::1;-1:-1:-1::0;;;3142:10:0;;;::::1;;;3141:11;3128:24:::0;;::::1;;::::0;;2965:204::o;3175:390::-;3237:16;3259:18;3280:17;3290:6;3280:9;:17::i;:::-;3259:38;-1:-1:-1;3305:15:0;3301:261;;-1:-1:-1;;3329:16:0;;;3343:1;3329:16;;;;;;;;3322:23;;3301:261;3359:23;3399:10;3385:25;;;;;;-1:-1:-1;;;3385:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3385:25:0;;3359:51;;3415:13;3433:107;3457:10;3449:5;:18;3433:107;;;3500:34;3520:6;3528:5;3500:19;:34::i;:::-;3484:6;3491:5;3484:13;;;;;;-1:-1:-1;;;3484:13:0;;;;;;;;;;;;;;;;;;:50;3469:7;;;;:::i;:::-;;;;3433:107;;;-1:-1:-1;3551:6:0;-1:-1:-1;3544:13:0;;-1:-1:-1;3544:13:0;3301:261;3175:390;;;;:::o;5112:368::-;2125:10;;-1:-1:-1;;;2125:10:0;;;;2117:36;;;;-1:-1:-1;;;2117:36:0;;;;;;;:::i;:::-;5238:5:::1;5228:6;:15;;5220:47;;;;-1:-1:-1::0;;;5220:47:0::1;;;;;;;:::i;:::-;5304:10;5285:15;5293:6:::0;5285:7:::1;:15::i;:::-;-1:-1:-1::0;;;;;5285:29:0::1;;5277:64;;;;-1:-1:-1::0;;;5277:64:0::1;;;;;;;:::i;:::-;5372:49;::::0;;::::1;::::0;::::1;::::0;;5378:4:::1;5372:49:::0;;;::::1;::::0;;::::1;::::0;;;5392:10:::1;5372:49:::0;;;;;;;;;;;;-1:-1:-1;;;;;5372:49:0;;::::1;::::0;;;;;;-1:-1:-1;5351:18:0;;;:10:::1;:18:::0;;;;;;;:70;;;;;::::1;;-1:-1:-1::0;;5351:70:0;;::::1;;::::0;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;5351:70:0;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;5436:37;;5384:6;;5436:37:::1;::::0;::::1;::::0;5404:5;;5436:37:::1;:::i;:::-;;;;;;;;5112:368:::0;;;:::o;1036:85:1:-;1108:6;;-1:-1:-1;;;;;1108:6:1;1036:85;:::o;2635:102:2:-;2691:13;2723:7;2716:14;;;;;:::i;2733:97:0:-;1259:12:1;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:1;;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;2805:18:0;;::::1;::::0;:9:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2733:97:::0;:::o;4268:153:2:-;4362:52;4381:12;:10;:12::i;:::-;4395:8;4405;4362:18;:52::i;9011:327:0:-;9076:11;9194:16;;;:8;:16;;;;;;;;9177:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9177:33:0;;;;;;;;;;;;;;;;;9076:11;;;;;9257:15;9203:6;9257:7;:15::i;:::-;9249:23;;9291:3;:10;;;9282:19;;9322:3;:9;;;9311:20;;9011:327;;;;;;:::o;4391:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4391:40:0;;;;;:::o;8503:140::-;8561:4;8593:16;;;:8;:16;;;;;;;;;8576:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8576:33:0;;;;;;;;;;;;;;;;;;;;8503:140::o;5352:320:2:-;5521:41;5540:12;:10;:12::i;:::-;5554:7;5521:18;:41::i;:::-;5513:103;;;;-1:-1:-1;;;5513:103:2;;;;;;;:::i;:::-;5626:39;5640:4;5646:2;5650:7;5659:5;5626:13;:39::i;4438:348:0:-;2125:10;;-1:-1:-1;;;2125:10:0;;;;2117:36;;;;-1:-1:-1;;;2117:36:0;;;;;;;:::i;:::-;4542:5:::1;4532:6;:15;;4524:47;;;;-1:-1:-1::0;;;4524:47:0::1;;;;;;;:::i;:::-;4608:10;4589:15;4597:6:::0;4589:7:::1;:15::i;:::-;-1:-1:-1::0;;;;;4589:29:0::1;;4581:64;;;;-1:-1:-1::0;;;4581:64:0::1;;;;;;;:::i;:::-;4676:50;::::0;;::::1;::::0;::::1;::::0;;4682:4:::1;4676:50:::0;;;::::1;::::0;;::::1;::::0;;;4696:10:::1;4676:50:::0;;;;;;;;;;;;-1:-1:-1;4676:50:0;;;;;;4655:18;;;:10:::1;:18:::0;;;;;;:71;;;;-1:-1:-1;;4655:71:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;4655:71:0;;::::1;-1:-1:-1::0;;;;;4655:71:0;;::::1;;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;4741:38;;4676:50;;4741:38:::1;::::0;::::1;::::0;4676:50;;4741:38:::1;:::i;:::-;;;;;;;;4438:348:::0;;:::o;8257:82::-;1259:12:1;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:1;;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;8318:8:0::1;:14:::0;8257:82::o;8649:356::-;8716:14;8842:18;;;:10;:18;;;;;;;;;8821:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8821:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8649:356::o;2621:106::-;1259:12:1;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:1;;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;2692:15:0::1;:28:::0;;-1:-1:-1;;;;;;2692:28:0::1;-1:-1:-1::0;;;;;2692:28:0;;;::::1;::::0;;;::::1;::::0;;2621:106::o;1501:155::-;1593:13;1625:24;1640:8;1625:14;:24::i;6502:617::-;2125:10;;-1:-1:-1;;;2125:10:0;;;;2117:36;;;;-1:-1:-1;;;2117:36:0;;;;;;;:::i;:::-;6609:5:::1;6599:6;:15;;6591:47;;;;-1:-1:-1::0;;;6591:47:0::1;;;;;;;:::i;:::-;6675:10;6656:15;6664:6:::0;6656:7:::1;:15::i;:::-;-1:-1:-1::0;;;;;6656:29:0::1;;;6648:59;;;;-1:-1:-1::0;;;6648:59:0::1;;;;;;;:::i;:::-;6736:1;6725:8;:12;6717:21;;;::::0;::::1;;6748:20;6771:16:::0;;;:8:::1;:16;::::0;;;;6805:9:::1;:21:::0;-1:-1:-1;6805:21:0;::::1;::::0;:52:::1;;;6843:8;:14;;;6830:9;:27;;6805:52;6797:80;;;;-1:-1:-1::0;;;6797:80:0::1;;;;;;;:::i;:::-;6891:14;::::0;::::1;::::0;:18;6887:98:::1;;6933:15;::::0;::::1;::::0;6959:14:::1;::::0;::::1;::::0;6925:49:::1;::::0;-1:-1:-1;;;;;6933:15:0;;::::1;::::0;6925:49;::::1;;;::::0;6959:14;6933:15:::1;6925:49:::0;6933:15;6925:49;6959:14;6933:15;6925:49;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;6887:98;7013:40;::::0;;::::1;::::0;::::1;::::0;;7017:4:::1;7013:40:::0;;;::::1;::::0;;::::1;::::0;;;7031:10:::1;7013:40:::0;;;;;;7043:9:::1;7013:40:::0;;;;;;-1:-1:-1;6994:16:0;;;:8:::1;:16:::0;;;;;;;:59;;;;-1:-1:-1;;6994:59:0::1;::::0;::::1;;;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;6994:59:0::1;-1:-1:-1::0;;;;;6994:59:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;7068:44;;7013:40;;7068:44:::1;::::0;::::1;::::0;7091:8;;7068:44:::1;:::i;8345:152::-:0;8404:4;8440:18;;;:10;:18;;;;;;;;;8419:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8419:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8345:152::o;697:59::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4341:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4341:44:0;;;;;;;:::o;2836:123::-;2880:13;2905:47;;;;;;;;;;;;;;;;;;;2836:123;:::o;4487:162:2:-;-1:-1:-1;;;;;4607:25:2;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4487:162::o;1918:198:1:-;1259:12;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:1;;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:1;::::1;1998:73;;;;-1:-1:-1::0;;;1998:73:1::1;;;;;;;:::i;:::-;2081:28;2100:8;2081:18;:28::i;945:123:11:-:0;1032:19;;1050:1;1032:19;;;945:123::o;990:222:5:-;1092:4;-1:-1:-1;;;;;;1115:50:5;;-1:-1:-1;;;1115:50:5;;:90;;;1169:36;1193:11;1169:23;:36::i;7144:125:2:-;7209:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:2;:30;;;7144:125::o;640:96:10:-;719:10;640:96;:::o;10995:171:2:-;11069:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11069:29:2;-1:-1:-1;;;;;11069:29:2;;;;;;;;:24;;11122:23;11069:24;11122:14;:23::i;:::-;-1:-1:-1;;;;;11113:46:2;;;;;;;;;;;10995:171;;:::o;827:112:11:-;918:14;;827:112::o;8101:108:2:-;8176:26;8186:2;8190:7;8176:26;;;;;;;;;;;;:9;:26::i;7427:344::-;7520:4;7544:16;7552:7;7544;:16::i;:::-;7536:73;;;;-1:-1:-1;;;7536:73:2;;;;;;;:::i;:::-;7619:13;7635:23;7650:7;7635:14;:23::i;:::-;7619:39;;7687:5;-1:-1:-1;;;;;7676:16:2;:7;-1:-1:-1;;;;;7676:16:2;;:51;;;;7720:7;-1:-1:-1;;;;;7696:31:2;:20;7708:7;7696:11;:20::i;:::-;-1:-1:-1;;;;;7696:31:2;;7676:51;:87;;;;7731:32;7748:5;7755:7;7731:16;:32::i;:::-;7668:96;7427:344;-1:-1:-1;;;;7427:344:2:o;10324:560::-;10478:4;-1:-1:-1;;;;;10451:31:2;:23;10466:7;10451:14;:23::i;:::-;-1:-1:-1;;;;;10451:31:2;;10443:85;;;;-1:-1:-1;;;10443:85:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;10546:16:2;;10538:65;;;;-1:-1:-1;;;10538:65:2;;;;;;;:::i;:::-;10614:39;10635:4;10641:2;10645:7;10614:20;:39::i;:::-;10715:29;10732:1;10736:7;10715:8;:29::i;:::-;-1:-1:-1;;;;;10755:15:2;;;;;;:9;:15;;;;;:20;;10774:1;;10755:15;:20;;10774:1;;10755:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10785:13:2;;;;;;:9;:13;;;;;:18;;10802:1;;10785:13;:18;;10802:1;;10785:18;:::i;:::-;;;;-1:-1:-1;;10813:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10813:21:2;-1:-1:-1;;;;;10813:21:2;;;;;;;;;10850:27;;10813:16;;10850:27;;;;;;;10324:560;;;:::o;6534:307::-;6685:28;6695:4;6701:2;6705:7;6685:9;:28::i;:::-;6731:48;6754:4;6760:2;6764:7;6773:5;6731:22;:48::i;:::-;6723:111;;;;-1:-1:-1;;;6723:111:2;;;;;;;:::i;1615::5:-;1702:10;:17;1615:111;:::o;2270:187:1:-;2362:6;;;-1:-1:-1;;;;;2378:17:1;;;-1:-1:-1;;;;;;2378:17:1;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2270:187;;:::o;11301:307:2:-;11451:8;-1:-1:-1;;;;;11442:17:2;:5;-1:-1:-1;;;;;11442:17:2;;;11434:55;;;;-1:-1:-1;;;11434:55:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;11499:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;11499:46:2;;;;;;;11560:41;;;;;11499:46;;11560:41;:::i;467:663:6:-;540:13;573:16;581:7;573;:16::i;:::-;565:78;;;;-1:-1:-1;;;565:78:6;;;;;;;:::i;:::-;654:23;680:19;;;:10;:19;;;;;654:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;709:18;730:10;:8;:10::i;:::-;709:31;;819:4;813:18;835:1;813:23;809:70;;;-1:-1:-1;859:9:6;-1:-1:-1;852:16:6;;809:70;981:23;;:27;977:106;;1055:4;1061:9;1038:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1024:48;;;;;;977:106;1100:23;1115:7;1100:14;:23::i;1555:300:2:-;1657:4;-1:-1:-1;;;;;;1692:40:2;;-1:-1:-1;;;1692:40:2;;:104;;-1:-1:-1;;;;;;;1748:48:2;;-1:-1:-1;;;1748:48:2;1692:104;:156;;;;1812:36;1836:11;1812:23;:36::i;8430:311::-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8604:54;8635:1;8639:2;8643:7;8652:5;8604:22;:54::i;:::-;8583:151;;;;-1:-1:-1;;;8583:151:2;;;;;;;:::i;1210:179:0:-;1337:45;1364:4;1370:2;1374:7;1337:26;:45::i;12161:778:2:-;12311:4;12331:15;:2;-1:-1:-1;;;;;12331:13:2;;:15::i;:::-;12327:606;;;12382:2;-1:-1:-1;;;;;12366:36:2;;12403:12;:10;:12::i;:::-;12417:4;12423:7;12432:5;12366:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12366:72:2;;;;;;;;-1:-1:-1;;12366:72:2;;;;;;;;;;;;:::i;:::-;;;12362:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12605:13:2;;12601:266;;12647:60;;-1:-1:-1;;;12647:60:2;;;;;;;:::i;12601:266::-;12819:6;12813:13;12804:6;12800:2;12796:15;12789:38;12362:519;-1:-1:-1;;;;;;12488:51:2;-1:-1:-1;;;12488:51:2;;-1:-1:-1;12481:58:2;;12327:606;-1:-1:-1;12918:4:2;12161:778;;;;;;:::o;1395:100:0:-;1447:13;1479:9;1472:16;;;;;:::i;2803:329:2:-;2876:13;2909:16;2917:7;2909;:16::i;:::-;2901:76;;;;-1:-1:-1;;;2901:76:2;;;;;;;:::i;:::-;2988:21;3012:10;:8;:10::i;:::-;2988:34;;3063:1;3045:7;3039:21;:25;:86;;;;;;;;;;;;;;;;;3091:7;3100:18;:7;:16;:18::i;:::-;3074:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3039:86;3032:93;2803:329;-1:-1:-1;;;2803:329:2:o;829:155:13:-;-1:-1:-1;;;;;;937:40:13;;-1:-1:-1;;;937:40:13;829:155;;;:::o;9063:372:2:-;-1:-1:-1;;;;;9142:16:2;;9134:61;;;;-1:-1:-1;;;9134:61:2;;;;;;;:::i;:::-;9214:16;9222:7;9214;:16::i;:::-;9213:17;9205:58;;;;-1:-1:-1;;;9205:58:2;;;;;;;:::i;:::-;9274:45;9303:1;9307:2;9311:7;9274:20;:45::i;:::-;-1:-1:-1;;;;;9330:13:2;;;;;;:9;:13;;;;;:18;;9347:1;;9330:13;:18;;9347:1;;9330:18;:::i;:::-;;;;-1:-1:-1;;9358:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9358:21:2;-1:-1:-1;;;;;9358:21:2;;;;;;;;9395:33;;9358:16;;;9395:33;;9358:16;;9395:33;9063:372;;:::o;2624:572:5:-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;-1:-1:-1;;;;;2823:18:5;;2819:183;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;-1:-1:-1;;;;;2918:10:5;:4;-1:-1:-1;;;;;2918:10:5;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3015:16:5;;3011:179;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;-1:-1:-1;;;;;3113:10:5;:2;-1:-1:-1;;;;;3113:10:5;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;771:377:9:-;1087:20;1133:8;;;771:377::o;328:703:12:-;384:13;601:10;597:51;;-1:-1:-1;627:10:12;;;;;;;;;;;;-1:-1:-1;;;627:10:12;;;;;;597:51;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:12;;-1:-1:-1;773:2:12;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;-1:-1:-1;;;817:17:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:12;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:12;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:12;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:12;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;3902:161:5;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:5;;;5150:323;;-1:-1:-1;;;;;5220:18:5;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:5;;;;:17;:26;;;;;;;;5559:33;;;-1:-1:-1;;;;;5609:18:5;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:5;;6187:46;;6632:26;;;;-1:-1:-1;;;6632:26:5;;;;;;;;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;-1:-1:-1;;;6669:22:5;;;;;;;;;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;-1:-1:-1;;;6976:16:5;;;;;;;;;;;;;;;;;;;;;;;;;;5938:1061;;;;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;-1:-1:-1;;;;;3621:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:5:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:16;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:16;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:16;473:16;;;470:25;-1:-1:-1;467:2:16;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:16;;735:42;;725:2;;791:1;788;781:12;806:198;;918:2;906:9;897:7;893:23;889:32;886:2;;;939:6;931;924:22;886:2;967:31;988:9;967:31;:::i;1009:274::-;;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;:::-;1177:41;;1237:40;1273:2;1262:9;1258:18;1237:40;:::i;:::-;1227:50;;1096:187;;;;;:::o;1288:342::-;;;;1434:2;1422:9;1413:7;1409:23;1405:32;1402:2;;;1455:6;1447;1440:22;1402:2;1483:31;1504:9;1483:31;:::i;:::-;1473:41;;1533:40;1569:2;1558:9;1554:18;1533:40;:::i;:::-;1523:50;;1620:2;1609:9;1605:18;1592:32;1582:42;;1392:238;;;;;:::o;1635:702::-;;;;;1807:3;1795:9;1786:7;1782:23;1778:33;1775:2;;;1829:6;1821;1814:22;1775:2;1857:31;1878:9;1857:31;:::i;:::-;1847:41;;1907:40;1943:2;1932:9;1928:18;1907:40;:::i;:::-;1897:50;;1994:2;1983:9;1979:18;1966:32;1956:42;;2049:2;2038:9;2034:18;2021:32;2076:18;2068:6;2065:30;2062:2;;;2113:6;2105;2098:22;2062:2;2141:22;;2194:4;2186:13;;2182:27;-1:-1:-1;2172:2:16;;2228:6;2220;2213:22;2172:2;2256:75;2323:7;2318:2;2305:16;2300:2;2296;2292:11;2256:75;:::i;:::-;2246:85;;;1765:572;;;;;;;:::o;2342:369::-;;;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2489:6;2481;2474:22;2436:2;2517:31;2538:9;2517:31;:::i;:::-;2507:41;;2598:2;2587:9;2583:18;2570:32;2645:5;2638:13;2631:21;2624:5;2621:32;2611:2;;2672:6;2664;2657:22;2611:2;2700:5;2690:15;;;2426:285;;;;;:::o;2716:266::-;;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2866:6;2858;2851:22;2813:2;2894:31;2915:9;2894:31;:::i;:::-;2884:41;2972:2;2957:18;;;;2944:32;;-1:-1:-1;;;2803:179:16:o;2987:257::-;;3098:2;3086:9;3077:7;3073:23;3069:32;3066:2;;;3119:6;3111;3104:22;3066:2;3163:9;3150:23;3182:32;3208:5;3182:32;:::i;3249:261::-;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3392:6;3384;3377:22;3339:2;3429:9;3423:16;3448:32;3474:5;3448:32;:::i;3515:482::-;;3637:2;3625:9;3616:7;3612:23;3608:32;3605:2;;;3658:6;3650;3643:22;3605:2;3703:9;3690:23;3736:18;3728:6;3725:30;3722:2;;;3773:6;3765;3758:22;3722:2;3801:22;;3854:4;3846:13;;3842:27;-1:-1:-1;3832:2:16;;3888:6;3880;3873:22;3832:2;3916:75;3983:7;3978:2;3965:16;3960:2;3956;3952:11;3916:75;:::i;4002:190::-;;4114:2;4102:9;4093:7;4089:23;4085:32;4082:2;;;4135:6;4127;4120:22;4082:2;-1:-1:-1;4163:23:16;;4072:120;-1:-1:-1;4072:120:16:o;4197:258::-;;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4347:6;4339;4332:22;4294:2;-1:-1:-1;;4375:23:16;;;4445:2;4430:18;;;4417:32;;-1:-1:-1;4284:171:16:o;4460:334::-;;;;4606:2;4594:9;4585:7;4581:23;4577:32;4574:2;;;4627:6;4619;4612:22;4574:2;4668:9;4655:23;4645:33;;4725:2;4714:9;4710:18;4697:32;4687:42;;4748:40;4784:2;4773:9;4769:18;4748:40;:::i;:::-;4738:50;;4564:230;;;;;:::o;4799:259::-;;4880:5;4874:12;4907:6;4902:3;4895:19;4923:63;4979:6;4972:4;4967:3;4963:14;4956:4;4949:5;4945:16;4923:63;:::i;:::-;5040:2;5019:15;-1:-1:-1;;5015:29:16;5006:39;;;;5047:4;5002:50;;4850:208;-1:-1:-1;;4850:208:16:o;5063:470::-;;5280:6;5274:13;5296:53;5342:6;5337:3;5330:4;5322:6;5318:17;5296:53;:::i;:::-;5412:13;;5371:16;;;;5434:57;5412:13;5371:16;5468:4;5456:17;;5434:57;:::i;:::-;5507:20;;5250:283;-1:-1:-1;;;;5250:283:16:o;5538:203::-;-1:-1:-1;;;;;5702:32:16;;;;5684:51;;5672:2;5657:18;;5639:102::o;5746:490::-;-1:-1:-1;;;;;6015:15:16;;;5997:34;;6067:15;;6062:2;6047:18;;6040:43;6114:2;6099:18;;6092:34;;;6162:3;6157:2;6142:18;;6135:31;;;5746:490;;6183:47;;6210:19;;6202:6;6183:47;:::i;:::-;6175:55;5949:287;-1:-1:-1;;;;;;5949:287:16:o;6241:635::-;6412:2;6464:21;;;6534:13;;6437:18;;;6556:22;;;6241:635;;6412:2;6635:15;;;;6609:2;6594:18;;;6241:635;6681:169;6695:6;6692:1;6689:13;6681:169;;;6756:13;;6744:26;;6825:15;;;;6790:12;;;;6717:1;6710:9;6681:169;;;-1:-1:-1;6867:3:16;;6392:484;-1:-1:-1;;;;;;6392:484:16:o;6881:187::-;7046:14;;7039:22;7021:41;;7009:2;6994:18;;6976:92::o;7073:457::-;7323:14;;7316:22;7298:41;;-1:-1:-1;;;;;7413:15:16;;;7408:2;7393:18;;7386:43;7465:15;;7460:2;7445:18;;7438:43;7512:2;7497:18;;7490:34;7285:3;7270:19;;7252:278::o;7535:457::-;7785:14;;7778:22;7760:41;;-1:-1:-1;;;;;7875:15:16;;;7870:2;7855:18;;7848:43;7922:2;7907:18;;7900:34;;;;7970:15;7965:2;7950:18;;7943:43;7747:3;7732:19;;7714:278::o;7997:427::-;8247:14;;8240:22;8222:41;;8294:2;8279:18;;8272:34;;;;-1:-1:-1;;;;;8342:32:16;8337:2;8322:18;;8315:60;8406:2;8391:18;;8384:34;8209:3;8194:19;;8176:248::o;8429:529::-;8707:14;;8700:22;8682:41;;8754:2;8739:18;;8732:34;;;;-1:-1:-1;;;;;8840:15:16;;;8835:2;8820:18;;8813:43;8887:2;8872:18;;8865:34;8936:15;8930:3;8915:19;;8908:44;8669:3;8654:19;;8636:322::o;8963:221::-;;9112:2;9101:9;9094:21;9132:46;9174:2;9163:9;9159:18;9151:6;9132:46;:::i;9189:341::-;9391:2;9373:21;;;9430:2;9410:18;;;9403:30;-1:-1:-1;;;9464:2:16;9449:18;;9442:47;9521:2;9506:18;;9363:167::o;9535:407::-;9737:2;9719:21;;;9776:2;9756:18;;;9749:30;9815:34;9810:2;9795:18;;9788:62;-1:-1:-1;;;9881:2:16;9866:18;;9859:41;9932:3;9917:19;;9709:233::o;9947:414::-;10149:2;10131:21;;;10188:2;10168:18;;;10161:30;10227:34;10222:2;10207:18;;10200:62;-1:-1:-1;;;10293:2:16;10278:18;;10271:48;10351:3;10336:19;;10121:240::o;10366:402::-;10568:2;10550:21;;;10607:2;10587:18;;;10580:30;10646:34;10641:2;10626:18;;10619:62;-1:-1:-1;;;10712:2:16;10697:18;;10690:36;10758:3;10743:19;;10540:228::o;10773:352::-;10975:2;10957:21;;;11014:2;10994:18;;;10987:30;11053;11048:2;11033:18;;11026:58;11116:2;11101:18;;10947:178::o;11130:400::-;11332:2;11314:21;;;11371:2;11351:18;;;11344:30;11410:34;11405:2;11390:18;;11383:62;-1:-1:-1;;;11476:2:16;11461:18;;11454:34;11520:3;11505:19;;11304:226::o;11535:349::-;11737:2;11719:21;;;11776:2;11756:18;;;11749:30;11815:27;11810:2;11795:18;;11788:55;11875:2;11860:18;;11709:175::o;11889:408::-;12091:2;12073:21;;;12130:2;12110:18;;;12103:30;12169:34;12164:2;12149:18;;12142:62;-1:-1:-1;;;12235:2:16;12220:18;;12213:42;12287:3;12272:19;;12063:234::o;12302:341::-;12504:2;12486:21;;;12543:2;12523:18;;;12516:30;-1:-1:-1;;;12577:2:16;12562:18;;12555:47;12634:2;12619:18;;12476:167::o;12648:420::-;12850:2;12832:21;;;12889:2;12869:18;;;12862:30;12928:34;12923:2;12908:18;;12901:62;12999:26;12994:2;12979:18;;12972:54;13058:3;13043:19;;12822:246::o;13073:406::-;13275:2;13257:21;;;13314:2;13294:18;;;13287:30;13353:34;13348:2;13333:18;;13326:62;-1:-1:-1;;;13419:2:16;13404:18;;13397:40;13469:3;13454:19;;13247:232::o;13484:405::-;13686:2;13668:21;;;13725:2;13705:18;;;13698:30;13764:34;13759:2;13744:18;;13737:62;-1:-1:-1;;;13830:2:16;13815:18;;13808:39;13879:3;13864:19;;13658:231::o;13894:349::-;14096:2;14078:21;;;14135:2;14115:18;;;14108:30;14174:27;14169:2;14154:18;;14147:55;14234:2;14219:18;;14068:175::o;14248:346::-;14450:2;14432:21;;;14489:2;14469:18;;;14462:30;-1:-1:-1;;;14523:2:16;14508:18;;14501:52;14585:2;14570:18;;14422:172::o;14599:339::-;14801:2;14783:21;;;14840:2;14820:18;;;14813:30;-1:-1:-1;;;14874:2:16;14859:18;;14852:45;14929:2;14914:18;;14773:165::o;14943:356::-;15145:2;15127:21;;;15164:18;;;15157:30;15223:34;15218:2;15203:18;;15196:62;15290:2;15275:18;;15117:182::o;15304:413::-;15506:2;15488:21;;;15545:2;15525:18;;;15518:30;15584:34;15579:2;15564:18;;15557:62;-1:-1:-1;;;15650:2:16;15635:18;;15628:47;15707:3;15692:19;;15478:239::o;15722:408::-;15924:2;15906:21;;;15963:2;15943:18;;;15936:30;16002:34;15997:2;15982:18;;15975:62;-1:-1:-1;;;16068:2:16;16053:18;;16046:42;16120:3;16105:19;;15896:234::o;16135:356::-;16337:2;16319:21;;;16356:18;;;16349:30;16415:34;16410:2;16395:18;;16388:62;16482:2;16467:18;;16309:182::o;16496:405::-;16698:2;16680:21;;;16737:2;16717:18;;;16710:30;16776:34;16771:2;16756:18;;16749:62;-1:-1:-1;;;16842:2:16;16827:18;;16820:39;16891:3;16876:19;;16670:231::o;16906:411::-;17108:2;17090:21;;;17147:2;17127:18;;;17120:30;17186:34;17181:2;17166:18;;17159:62;-1:-1:-1;;;17252:2:16;17237:18;;17230:45;17307:3;17292:19;;17080:237::o;17322:340::-;17524:2;17506:21;;;17563:2;17543:18;;;17536:30;-1:-1:-1;;;17597:2:16;17582:18;;17575:46;17653:2;17638:18;;17496:166::o;17667:397::-;17869:2;17851:21;;;17908:2;17888:18;;;17881:30;17947:34;17942:2;17927:18;;17920:62;-1:-1:-1;;;18013:2:16;17998:18;;17991:31;18054:3;18039:19;;17841:223::o;18069:337::-;18271:2;18253:21;;;18310:2;18290:18;;;18283:30;-1:-1:-1;;;18344:2:16;18329:18;;18322:43;18397:2;18382:18;;18243:163::o;18411:413::-;18613:2;18595:21;;;18652:2;18632:18;;;18625:30;18691:34;18686:2;18671:18;;18664:62;-1:-1:-1;;;18757:2:16;18742:18;;18735:47;18814:3;18799:19;;18585:239::o;18829:350::-;19031:2;19013:21;;;19070:2;19050:18;;;19043:30;19109:28;19104:2;19089:18;;19082:56;19170:2;19155:18;;19003:176::o;19184:408::-;19386:2;19368:21;;;19425:2;19405:18;;;19398:30;19464:34;19459:2;19444:18;;19437:62;-1:-1:-1;;;19530:2:16;19515:18;;19508:42;19582:3;19567:19;;19358:234::o;19597:349::-;19799:2;19781:21;;;19838:2;19818:18;;;19811:30;19877:27;19872:2;19857:18;;19850:55;19937:2;19922:18;;19771:175::o;19951:343::-;20153:2;20135:21;;;20192:2;20172:18;;;20165:30;-1:-1:-1;;;20226:2:16;20211:18;;20204:49;20285:2;20270:18;;20125:169::o;20299:347::-;20501:2;20483:21;;;20540:2;20520:18;;;20513:30;20579:25;20574:2;20559:18;;20552:53;20637:2;20622:18;;20473:173::o;20651:338::-;20853:2;20835:21;;;20892:2;20872:18;;;20865:30;-1:-1:-1;;;20926:2:16;20911:18;;20904:44;20980:2;20965:18;;20825:164::o;20994:177::-;21140:25;;;21128:2;21113:18;;21095:76::o;21176:128::-;;21247:1;21243:6;21240:1;21237:13;21234:2;;;21253:18;;:::i;:::-;-1:-1:-1;21289:9:16;;21224:80::o;21309:120::-;;21375:1;21365:2;;21380:18;;:::i;:::-;-1:-1:-1;21414:9:16;;21355:74::o;21434:168::-;;21540:1;21536;21532:6;21528:14;21525:1;21522:21;21517:1;21510:9;21503:17;21499:45;21496:2;;;21547:18;;:::i;:::-;-1:-1:-1;21587:9:16;;21486:116::o;21607:125::-;;21675:1;21672;21669:8;21666:2;;;21680:18;;:::i;:::-;-1:-1:-1;21717:9:16;;21656:76::o;21737:258::-;21809:1;21819:113;21833:6;21830:1;21827:13;21819:113;;;21909:11;;;21903:18;21890:11;;;21883:39;21855:2;21848:10;21819:113;;;21950:6;21947:1;21944:13;21941:2;;;-1:-1:-1;;21985:1:16;21967:16;;21960:27;21790:205::o;22000:380::-;22085:1;22075:12;;22132:1;22122:12;;;22143:2;;22197:4;22189:6;22185:17;22175:27;;22143:2;22250;22242:6;22239:14;22219:18;22216:38;22213:2;;;22296:10;22291:3;22287:20;22284:1;22277:31;22331:4;22328:1;22321:15;22359:4;22356:1;22349:15;22385:135;;-1:-1:-1;;22445:17:16;;22442:2;;;22465:18;;:::i;:::-;-1:-1:-1;22512:1:16;22501:13;;22432:88::o;22525:112::-;;22583:1;22573:2;;22588:18;;:::i;:::-;-1:-1:-1;22622:9:16;;22563:74::o;22642:127::-;22703:10;22698:3;22694:20;22691:1;22684:31;22734:4;22731:1;22724:15;22758:4;22755:1;22748:15;22774:127;22835:10;22830:3;22826:20;22823:1;22816:31;22866:4;22863:1;22856:15;22890:4;22887:1;22880:15;22906:127;22967:10;22962:3;22958:20;22955:1;22948:31;22998:4;22995:1;22988:15;23022:4;23019:1;23012:15;23038:133;-1:-1:-1;;;;;;23114:32:16;;23104:43;;23094:2;;23161:1;23158;23151:12

Swarm Source

ipfs://c692f540adaa28cf594944c8f3da6eaf57c946e001867a10b9b36492a9cdacab
Loading...
Loading
Loading...
Loading
[ 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.