ETH Price: $3,324.54 (+2.46%)

SJ741 Emeralds (EMERALD)
 

Overview

TokenID

100000115

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

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:
SJ741

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 1 : emeralds.sol
//   ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//   ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣷⣾⣿⣿⣿⣿⣶⣾⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//   ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠉⢉⡽⢋⣙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//   ⠀⠀⠀⠀⠀⠀⠀⢰⣿⣦⣀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣛⣓⣒⠶⢤⣾⠀⠀⠸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//   ⠀⠀⠀⠀⠀⠀⠀⢸⣿⠳⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⡄⠀⠀⢳⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//   ⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⡦⠀⠀⠻⠿⣦⣀⡀⠀⠀⠀⠀⠀⠀
//   ⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢿⡏⠀⠜⡴⠁⠀⠀⠀⡀⠀⠀⠉⠉⠲⢦⡀⠀⠀
//   ⠀⠀⠀⠀⠀⠀⠀⢠⣿⣷⡾⢿⣿⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⡿⠛⠉⠁⠀⠀⣸⠀⠀⠀⢧⠀⠀⠀⠀⠹⠒⢤⣀⠀⠀⠁⠈⢢⠀
//   ⠀⠀⠀⠀⠀⠀⠀⠈⣿⣟⠀⠀⠈⠻⣿⠏⢨⠔⢦⠈⢻⣿⡼⠋⢀⣤⣶⣶⣿⣿⣿⣄⢠⣀⡜⠆⠀⢀⡠⠴⠒⠂⠈⢻⢦⡀⠀⠈⡇
//   ⠀⠀⢀⣶⣿⣷⠀⠀⠘⣿⡄⠀⠐⣶⢬⣇⠉⢣⡸⠀⣰⣿⣁⣴⣿⣿⣿⣿⣿⣿⣟⢿⣽⡛⣧⠔⠒⡏⣀⠀⠀⣀⣀⣾⠀⠑⠢⠤⠃
//   ⠀⣴⡟⣾⡟⣿⡇⣀⣼⣿⣿⣦⡀⠀⠙⠻⡆⠀⠇⢰⠟⠻⣿⣿⣿⣿⣿⡿⣿⣿⣿⣷⡿⠟⣇⠀⠀⢙⣰⣺⣽⣿⣿⣿⠀⠀⠀⠀⠀
//   ⢸⡿⢸⡿⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡴⠃⠀⠀⢸⡀⠀⢹⣿⣿⣿⣿⣿⢹⣿⣿⣯⣀⣀⣀⣭⣏⠁⠀⠀⠈⠻⣿⣿⠀⠀⠀⠀⠀
//   ⣿⡇⢸⡗⢸⠛⣿⡍⠉⠙⠛⠻⢭⣻⣿⣧⠀⠀⢀⣴⠷⣄⡀⠻⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⡻⡆⠀⠀⠀⠀⠙⠇⠀⠀⠀⠀⠀
//   ⣿⡇⢸⣷⣽⠶⠛⢷⡀⣠⠤⢤⣾⣿⣿⣽⣞⣿⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡙⢿⣿⠉⠛⢿⣿⣷⡇⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀
//   ⣿⣇⣼⢿⠁⠀⠀⢠⡷⡇⢠⣶⡽⣿⠋⠉⢻⠿⠛⠋⠉⠉⢹⠉⢻⢻⣿⣿⣿⣿⣿⣷⡶⢏⡠⠿⣿⣷⡞⠛⠙⢳⣦⡀⠀⠀⠀⠀⠀
//   ⣿⡏⢠⡋⣆⠀⠀⡞⠀⠇⠈⢿⣿⣏⠀⠀⠸⡀⠀⠀⠀⢀⡞⠀⢸⢸⣿⡏⠛⠛⠛⠉⣠⠋⣠⠀⠸⠧⢻⡝⢷⡄⢿⣷⠀⠀⠀⠀⠀
//   ⢸⣧⠸⡹⡌⢆⣴⣿⡀⠀⠀⠈⠻⠿⣆⠀⠀⠳⣄⣰⣚⠉⠉⠉⠻⣾⣿⡻⣦⣀⣠⣴⠷⠟⣻⠀⠀⠀⢸⡇⢸⣧⢨⣿⠀⠀⠀⠀⠀
//   ⠀⢿⣇⠓⠃⣼⣇⡈⠻⣄⠀⠰⢦⣀⢀⣷⡄⠀⠀⠀⠈⠉⠓⡤⣄⡈⡿⣿⣷⣶⣶⣶⣾⣿⠟⢀⠆⠀⡾⢷⣾⡇⣼⡟⠀⠀⠀⠀⠀
//   ⠀⠈⢿⢷⣞⠛⣿⣿⣤⡍⠳⣤⣤⣤⡿⠗⠁⠀⠀⠀⠀⠀⠀⠙⠀⠹⡅⠀⠈⠉⠉⠉⠻⣤⠔⠚⠒⠊⠀⠀⠈⣿⡿⠃⠀⠀⠀⠀⠀
//  ██████  █████  █████     ███   ██⡷⠀⠀⠀⢀⣴⠞⠓⠲⠦⣤⡀⠀⠀⣠⡿⠁⠀⠀                    
// ██          ██     ██   ██ ██  ███⣃⣤⠶⠞⣫⣤⣟⣛⣷⣶⣿⢟⡦⣾⠟⠀⠀⠀                    
// ██████      ██    ██  ██   ██   ██⡏⠾⠿⣶⣿⣿⣿⠿⣛⣽⣾⡿⠚⠁⠀                    
//      ██ ██  ██   ██   ████████  ██⠀⣠⠏⠉⠛⠳⠶⢶⣶⡿⠿⠟⠊⠉⠀                    
// ██████   ████    ██        ██  ████⠁⠀⠀⠀⠀⠀⣀⣀⣀⡀  

// ███████ ███    ███ ███████ ██████   █████  ██      ██████   ██████ 
// ██      ████  ████ ██      ██   ██ ██   ██ ██      ██   ██ ██      
// █████   ██ ████ ██ █████   ██████  ███████ ██      ██   ██ ███████ 
// ██      ██  ██  ██ ██      ██   ██ ██   ██ ██      ██   ██      ██ 
// ███████ ██      ██ ███████ ██   ██ ██   ██ ███████ ██████  ███████
// A public demonstration in single-contract dual-token implementations
// with zero-conflict events, and function overloading.
// https://github.com/SerecThunderson/SJ741
// https://t.me/partyhat
// SJ741 EMERALDS

// WARNING - Fungible NFT specs are universally new, and inherently DANGEROUS
// no systems have been built with these usecases in mind, and there are a number of 
// ways that experimental, complex contracts can lead to unforseen consequences.
// INTERACT WITH EXPERIMENTAL SMART CONTRACTS AT YOUR OWN RISK

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// libraries to separate ERC20 and ERC721 events, and certain signature-specific functions
// ERC20 events
library libSJ20 {
    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function emitTransfer(address _from, address _to, uint _amount) internal { emit Transfer(_from, _to, _amount); }
    function emitApproval(address _owner, address _spender, uint _value) internal { emit Approval(_owner, _spender, _value); }
}

// ERC721 events
library libSJ721 {
    event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function emitTransfer(address _from, address _to, uint _tokenId) internal { emit Transfer(_from, _to, _tokenId); }
    function emitApproval(address _owner, address _approve, uint _tokenId) internal { emit Approval(_owner, _approve, _tokenId); }
    function emitApprovalForAll(address _owner, address _operator, bool _approved) internal { emit ApprovalForAll(_owner, _operator, _approved); }
}

// ERC165 https://eips.ethereum.org/EIPS/eip-721
interface IERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// ERC20 https://eips.ethereum.org/EIPS/eip-20
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// ERC721 https://eips.ethereum.org/EIPS/eip-721
interface IERC721 is IERC165 {
    function balanceOf(address account) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    // payable removed for erc20 etherscan compatibility
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface ISJ741 is IERC20, IERC721 {
    // library transfers can not be included in the interface
    // incorporate them directly with library
    // libSJ20.Transfer
    // libSJ20.Approval
    // libSJ721.Transfer
    // libSJ721.Approval
    // libSJ721.ApprovalForAll
    function balanceOf(address account) external override(IERC20, IERC721) view returns (uint256);
    function approve(address spender, uint256 value) external override(IERC20, IERC721) returns (bool);
    function transferFrom(address from, address to, uint256 value) external override(IERC20, IERC721) returns (bool);
}

// ERC721 Token Receiver https://eips.ethereum.org/EIPS/eip-721
interface IERC721TokenReceiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

contract SJ741 is ISJ741 {

    string public baseURI = "https://raw.githubusercontent.com/SerecThunderson/assets/main/emeralds/metadata/";
    string internal constant _name = "SJ741 Emeralds";
    string internal constant _symbol = "EMERALD";

    uint internal constant _decimals = 8;
    uint internal constant _totalIds = 7777;
    uint internal constant _totalSupply = _totalIds * 10**_decimals; 
    uint internal constant ONE = 10**_decimals; // 1.0 token(s)
    uint internal constant MAXID = ONE + _totalIds;  // 1.00000001 : 1.00007777 is the range for NFT IDs

    uint32 public minted; // number of unique ID mints
    uint32[] private broken; // broken NFTs stored in limbo list 

    address public dev;
    bool public supportsNFTinterface;

    mapping(address => mapping(address => bool)) private _operatorApprovals;
    mapping(address => mapping(address => uint)) internal _allowance;
    mapping(uint256 tokenId => address) public ownerOf;
    mapping(uint256 => address) private _nftApprovals;
    mapping(address => uint) internal _balanceOf;
    mapping(address => uint32[]) public ownedNFTs;
    mapping(uint32 => uint256) private idToIndex; 

    error UnsupportedReceiver();

    modifier onlyDev() {
        require(msg.sender == dev, "Not the developer");
        _;
    }

    constructor() {
        //set minted at ONE to ensure correct operation within range of IDs
        minted = uint32(ONE);

        //the message sender receives the entire supply, and is set as "dev"
        _balanceOf[msg.sender] = _totalSupply; 
        dev = msg.sender;
    }

    function name() public view virtual returns (string memory) { return _name; }
    function symbol() public view virtual returns (string memory) { return _symbol; }
    function decimals() public view virtual returns (uint) { return _decimals; }
    function totalSupply() public pure override returns (uint) { return _totalSupply; }
    function balanceOf( address account) public view override returns (uint) { return _balanceOf[account]; }
    function allowance(address owner, address spender) public view override returns (uint) { return _allowance[owner][spender]; }
    function setBaseURI(string memory newBaseURI) public onlyDev {baseURI = newBaseURI;}
    function changeDev(address newDev) public onlyDev {dev = newDev;}//simple function to change developer address, or revoke ownership (with address(0))
    // @DEV toggleNFTinterface is for the small possibility of frontend system changes leading the contract to favor enabling the disabled supportsNFTinterface flag
    // don't waste it, as frontends don't typically change classification of contracts
    // probably never to be used.
    function toggelNFTinterface() public onlyDev {supportsNFTinterface = !supportsNFTinterface;}


    function approve(address spender, uint amount) public override returns (bool) {

        // if the amount is greater than one token, and within range of IDs for NFTs 
        // then set NFT approval for the given ID
        if(amount > ONE && amount <= MAXID) {
            address owner = ownerOf[amount]; // getting the owner of token ID via the `amount` input
            if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert("SJ741: You are not approved");
            _nftApprovals[amount] = spender; // calling nft approval for the token and spender
            libSJ721.emitApproval(owner, spender, amount);
            return true;
        }
        
        // else set the ERC20 allowance
        // the NFT ID range being set within a limited subset of ONE token(s)
        // allows for non-clashing interactions
        _allowance[msg.sender][spender] = amount;
        libSJ20.emitApproval(msg.sender, spender, amount);
        return true;
    }

    function _transfer741(address from, address to, uint amount) internal virtual {
        
        require(_balanceOf[from] >= amount, "SJ741: transfer amount exceeds balance");
        
        // checking the decimal amount of tokens owned before transaction for both participants
        uint256 fromDecimalsPre = _balanceOf[from] % ONE;
        uint256 toDecimalsPre = _balanceOf[to] % ONE;
        
        // simple erc20 balance operations
        _transfer20(from, to, amount);

        // checking the decimal amount of tokens after transaction for both partcipants
        uint256 fromDecimalsPost = _balanceOf[from] % ONE;
        uint256 toDecimalsPost = _balanceOf[to] % ONE;

        // stores the NFT IDs owned by `from`, enabling NFT management for that address.
        uint32[] storage ownedNFTsArray = ownedNFTs[from];

        // references NFTs marked as "broken", tracking these special state NFTs.
        uint32[] storage brokenIDsArray = broken;

        // if sender has higher decimal count after transaction, then they "roll under" and break an NFT
        if (fromDecimalsPre < fromDecimalsPost) {

            if(ownedNFTsArray.length > 0) { // if the sender has an nft to send

                uint32 tokenId = ownedNFTsArray[0];//selects the user's first NFT from the list

                brokenIDsArray.push(tokenId);//pushes the nft into the "broken list" for limbo NFTs
                _transfer721(from, address(0), tokenId);//transfers the NFT ID ownership to (0) address for stewardship
            }
        }

        // if receiver has lower decimal count after transaction then they "roll over" and will "remake" an nft 
        if (toDecimalsPre > toDecimalsPost) {

            if(brokenIDsArray.length > 0) { // recover an id from broken list

                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }
            else { // mint new id
                _mint(to);
            }
            
        }
        
        // amount of tokens - amount of whole tokens being processed in int
        uint amountInTokens = amount / ONE;

        // ignore minting nfts from dev when they call -- this allows for gas-efficient team operations
        // @DEV if dev gathers NFTs, use the ERC721 transferFrom method to extract
        // @DEV be careful, don't let the wallet fall to some convoluted transferFrom scam to do something unexpected
        if(from == dev) return;


        if(amountInTokens > 0) {

            uint len = ownedNFTsArray.length; //len is the length, or number of NFTs in the addresses's owned array
            len = amountInTokens < len ? amountInTokens : len;
            // transfers owned NFTs from `from` to `to` until either all are transferred or the desired amount is reached
            // Subtracts transferred NFT count from `amountInTokens` to update remaining transfers
            for (uint i = 0; i < len; i++) {
                _transfer721(from, to, ownedNFTsArray[0]); 
            }
            amountInTokens -= len;
            len = brokenIDsArray.length;
            len = amountInTokens < len ? amountInTokens : len;
            
            // recovers NFTs from the broken state to `to`, or mints new ones if not enough broken NFTs are available
            // if any tokens remain to be allocated, it mints new NFTs to `to` for the remaining balance
            for (uint i = 0; i < len; i++) {        
                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }

            _mintBatch(to, amountInTokens - len);

        }
    }

    function _mintBatch(address to, uint256 amount) internal {
        if(amount == 0) return; // Exit if no NFTs to mint

        if(amount == 1) { // Optimize single mint process
            _mint(to);
            return;
        }
        uint32 id = minted; // Start ID from last minted value
        uint256 ownedLen = ownedNFTs[to].length; // Current number of NFTs owned by 'to'
        for(uint i = 0; i < amount;) {
            unchecked {
                id++; // Increment ID for each new NFT
            }
            ownerOf[id] = to; // Assign new NFT to owner.
            idToIndex[id] = ownedLen; // Map NFT ID to its index in owner's array
            ownedNFTs[to].push(id); // Add new NFT ID to owner's list

            libSJ721.emitTransfer(address(0), to, id); // Emit NFT transfer event

            unchecked {
                ownedLen++; // Increment count of owned NFTs
                i++; // Move to next NFT
            }
        }
        unchecked {
            minted += uint32(amount); // Update total minted count
        }
    }


    function _mint(address to) internal returns(uint32 tokenId){
        unchecked {
            minted++; // Increment the total number of minted tokens
        }
        tokenId = minted; // Assign the newly minted token ID

        ownerOf[tokenId] = to; // Set ownership of the new token to 'to'
        idToIndex[tokenId] = ownedNFTs[to].length; // Map the new token ID to its index in the owner's list
        ownedNFTs[to].push(tokenId); // Add the new token ID to the owner's list of owned tokens
        
        libSJ721.emitTransfer(address(0), to, tokenId); // Emit an event for the token transfer
    }


    // Updates the mappings and arrays managing ownership and index of NFTs after a transfer
    function _updateOwnedNFTs(address from, address to, uint32 tokenId) internal { 
        uint256 index = idToIndex[tokenId]; // Get current index of the token in the owner's list
        uint32[] storage nftArray = ownedNFTs[from]; // Reference to the list of NFTs owned by 'from'
        uint256 len = nftArray.length; // Current number of NFTs owned by 'from'
        uint32 lastTokenId = nftArray[len - 1]; // Last token in the 'from' array to swap with transferred token
        
        nftArray[index] = lastTokenId; // Replace the transferred token with the last token in the array
        nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from'
        
        if(len - 1 != 0){ 
            idToIndex[lastTokenId] = index; // Update the index of the swapped token
        } 
    
        ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array
        idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token
    }

    // Executes a simple ERC20 token transfer.
    function _transfer20(address from, address to, uint256 amount) internal {
        _balanceOf[from] -= amount; // Deduct the amount from the sender's balance
        unchecked {
            _balanceOf[to] += amount; // Add the amount to the recipient's balance
        }
        libSJ20.emitTransfer(from, to, amount); // Emit an ERC20 transfer event
    }

    // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission
    function _transfer721(address from, address to, uint32 tokenId) internal virtual {
        require(from == ownerOf[tokenId], "SJ741: Incorrect owner"); // Ensure 'from' is the current owner
        
        delete _nftApprovals[tokenId]; // Clear any approvals for this token
        ownerOf[tokenId] = to; // Transfer ownership of the token to 'to'
        _updateOwnedNFTs(from, to, tokenId); // Update ownership tracking structures
        libSJ721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event
    }


    // only erc20 calls this
    // if amount is a token id owned my the caller send as an NFT
    // else transfer741
    function transfer(address to, uint amount) public override returns (bool) {
        if(ownerOf[amount] == msg.sender) {
            _transfer721(msg.sender, to, uint32(amount));
            _transfer20(msg.sender, to, ONE);
            return true;
        }
        _transfer741(msg.sender, to, amount);
        return true;
    }

    // erc20 and erc721 call this
    function transferFrom(address from, address to, uint amount) public override returns (bool) {

        //if amount is within the NFT id range, then a simple NFT transfer + token amount (ONE)
        if(amount > ONE && amount <= MAXID) {
            require(
                //require from is the msg caller, or that caller is approved for that specific NFT, or all NFTs 
                msg.sender == from || msg.sender == getApproved(amount) || isApprovedForAll(from, msg.sender),
                "SJ741: You don't have the right"
                );

            _transfer721(from, to, uint32(amount));
            _transfer20(from, to, ONE);
            return true;
        }

        _spendAllowance(from, msg.sender, amount);
        _transfer741(from, to, amount);
        return true;

    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "SJ741: You don't have the right"
            );
        _transfer721(from, to, uint32(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "SJ741: You don't have the right"
            );
        _transfer721(from, to, uint32(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    function _spendAllowance(address owner, address spender, uint amount) internal virtual {
        require(_allowance[owner][spender] >= amount, "SJ741: insufficient allowance");
        _allowance[owner][spender] -= amount;
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        if (ownerOf[tokenId] == address(0)) revert();
        return _nftApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        _operatorApprovals[msg.sender][operator] = approved;
        libSJ721.emitApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        require(tokenId <= MAXID, "SJ741: invalid id");
        if (bytes(baseURI).length == 0) {return "";}
        return string(abi.encodePacked(baseURI, toString(tokenId - ONE), ".json"));
    }

    function toString(uint256 value) internal pure returns (string memory) {
        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(value % 10) + 48); value /= 10;}
        return string(buffer);
    }

    function withdraw() external onlyDev {
        payable(dev).transfer(address(this).balance);
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return
            // Even though we support ERC721 and should return true, etherscan wants to treat us as ERC721 instead of ERC20
            // @DEV ERC165 for ERC721 can be toggled on for reasons of frontend/dapp/script implementations, but is very specific
            (supportsNFTinterface && interfaceId == 0x80ac58cd) || // ERC165 interface ID for ERC721
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165
            interfaceId == 0x36372b07;   // ERC165 interface ID for ERC20
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"UnsupportedReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDev","type":"address"}],"name":"changeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFTs","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","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":"supportsNFTinterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggelNFTinterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040526050608081815290620023de60a0395f906200002290826200013d565b503480156200002f575f80fd5b506200003e6008600a62000318565b6001805463ffffffff191663ffffffff92909216919091179055620000666008600a62000318565b6200007490611e616200032c565b335f81815260086020526040902091909155600380546001600160a01b031916909117905562000346565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620000c857607f821691505b602082108103620000e757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200013857805f5260205f20601f840160051c81016020851015620001145750805b601f840160051c820191505b8181101562000135575f815560010162000120565b50505b505050565b81516001600160401b038111156200015957620001596200009f565b62000171816200016a8454620000b3565b84620000ed565b602080601f831160018114620001a7575f84156200018f5750858301515b5f19600386901b1c1916600185901b17855562000201565b5f85815260208120601f198616915b82811015620001d757888601518255948401946001909101908401620001b6565b5085821015620001f557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200025d57815f190482111562000241576200024162000209565b808516156200024f57918102915b93841c939080029062000222565b509250929050565b5f82620002755750600162000312565b816200028357505f62000312565b81600181146200029c5760028114620002a757620002c7565b600191505062000312565b60ff841115620002bb57620002bb62000209565b50506001821b62000312565b5060208310610133831016604e8410600b8410161715620002ec575081810a62000312565b620002f883836200021d565b805f19048211156200030e576200030e62000209565b0290505b92915050565b5f62000325838362000265565b9392505050565b808202811582820484141762000312576200031262000209565b61208a80620003545f395ff3fe60806040526004361061017b575f3560e01c80636bcef9a6116100cd578063a22cb46511610087578063b88d4fde11610062578063b88d4fde1461048f578063c87b56dd146104a2578063dd62ed3e146104c1578063e985e9c514610505575f80fd5b8063a22cb46514610431578063a563833b14610450578063a9059cbb14610470575f80fd5b80636bcef9a6146103685780636c0360eb1461037c57806370a082311461039057806388a8c95c146103c457806391cca3db146103e357806395d89b4114610402575f80fd5b806323b872dd1161013857806342842e0e1161011357806342842e0e146102e65780634f02c420146102f957806355f804b3146103155780636352211e14610334575f80fd5b806323b872dd1461029e578063313ce567146102bd5780633ccfd60b146102d0575f80fd5b806301ffc9a71461017f57806306fdde03146101b3578063081812fc146101f2578063095ea7b31461022957806318160ddd146102485780631a72b87d1461026a575b5f80fd5b34801561018a575f80fd5b5061019e610199366004611937565b610524565b60405190151581526020015b60405180910390f35b3480156101be575f80fd5b5060408051808201909152600e81526d534a37343120456d6572616c647360901b60208201525b6040516101aa919061199f565b3480156101fd575f80fd5b5061021161020c3660046119b1565b61058b565b6040516001600160a01b0390911681526020016101aa565b348015610234575f80fd5b5061019e6102433660046119de565b6105c5565b348015610253575f80fd5b5061025c6106f1565b6040519081526020016101aa565b348015610275575f80fd5b506102896102843660046119de565b61070f565b60405163ffffffff90911681526020016101aa565b3480156102a9575f80fd5b5061019e6102b8366004611a06565b610753565b3480156102c8575f80fd5b50600861025c565b3480156102db575f80fd5b506102e4610831565b005b6102e46102f4366004611a06565b610894565b348015610304575f80fd5b506001546102899063ffffffff1681565b348015610320575f80fd5b506102e461032f366004611ac6565b6109d7565b34801561033f575f80fd5b5061021161034e3660046119b1565b60066020525f90815260409020546001600160a01b031681565b348015610373575f80fd5b506102e4610a10565b348015610387575f80fd5b506101e5610a5b565b34801561039b575f80fd5b5061025c6103aa366004611b0b565b6001600160a01b03165f9081526008602052604090205490565b3480156103cf575f80fd5b506102e46103de366004611b0b565b610ae6565b3480156103ee575f80fd5b50600354610211906001600160a01b031681565b34801561040d575f80fd5b506040805180820190915260078152661153515490531160ca1b60208201526101e5565b34801561043c575f80fd5b506102e461044b366004611b24565b610b32565b34801561045b575f80fd5b5060035461019e90600160a01b900460ff1681565b34801561047b575f80fd5b5061019e61048a3660046119de565b610b6b565b6102e461049d366004611b5d565b610bb9565b3480156104ad575f80fd5b506101e56104bc3660046119b1565b610cea565b3480156104cc575f80fd5b5061025c6104db366004611bd4565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610510575f80fd5b5061019e61051f366004611bd4565b610db5565b6003545f90600160a01b900460ff16801561054f57506380ac58cd60e01b6001600160e01b03198316145b8061056a57506301ffc9a760e01b6001600160e01b03198316145b8061058557506336372b0760e01b6001600160e01b03198316145b92915050565b5f818152600660205260408120546001600160a01b03166105aa575f80fd5b505f908152600760205260409020546001600160a01b031690565b5f6105d26008600a611cea565b821180156105f85750611e616105ea6008600a611cea565b6105f49190611cf5565b8211155b156106b8575f828152600660205260409020546001600160a01b031633811480159061062b57506106298133610db5565b155b1561067d5760405162461bcd60e51b815260206004820152601b60248201527f534a3734313a20596f7520617265206e6f7420617070726f766564000000000060448201526064015b60405180910390fd5b5f83815260076020526040902080546001600160a01b0319166001600160a01b0386161790556106ae818585610de2565b6001915050610585565b335f8181526005602090815260408083206001600160a01b038816845290915290208390556106e8908484610e28565b50600192915050565b5f6106fe6008600a611cea565b61070a90611e61611d08565b905090565b6009602052815f5260405f208181548110610728575f80fd5b905f5260205f209060089182820401919006600402915091509054906101000a900463ffffffff1681565b5f6107606008600a611cea565b821180156107865750611e616107786008600a611cea565b6107829190611cf5565b8211155b1561081057336001600160a01b03851614806107bb57506107a68261058b565b6001600160a01b0316336001600160a01b0316145b806107cb57506107cb8433610db5565b6107e75760405162461bcd60e51b815260040161067490611d1f565b6107f2848484610e7a565b61080884846108036008600a611cea565b610f40565b50600161082a565b61081b843384610f94565b610826848484611048565b5060015b9392505050565b6003546001600160a01b0316331461085b5760405162461bcd60e51b815260040161067490611d56565b6003546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015610891573d5f803e3d5ffd5b50565b336001600160a01b03841614806108c457506108af8161058b565b6001600160a01b0316336001600160a01b0316145b806108d457506108d48333610db5565b6108f05760405162461bcd60e51b815260040161067490611d1f565b6108fb838383610e7a565b61090c83836108036008600a611cea565b6001600160a01b0382163b158015906109b45750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610983573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a79190611d81565b6001600160e01b03191614155b156109d2576040516301d6c93560e61b815260040160405180910390fd5b505050565b6003546001600160a01b03163314610a015760405162461bcd60e51b815260040161067490611d56565b5f610a0c8282611e1f565b5050565b6003546001600160a01b03163314610a3a5760405162461bcd60e51b815260040161067490611d56565b6003805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610a6790611d9c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9390611d9c565b8015610ade5780601f10610ab557610100808354040283529160200191610ade565b820191905f5260205f20905b815481529060010190602001808311610ac157829003601f168201915b505050505081565b6003546001600160a01b03163314610b105760405162461bcd60e51b815260040161067490611d56565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b335f8181526004602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610a0c908383611406565b5f81815260066020526040812054336001600160a01b0390911603610bae57610b95338484610e7a565b610ba633846108036008600a611cea565b506001610585565b6106e8338484611048565b336001600160a01b0385161480610be95750610bd48261058b565b6001600160a01b0316336001600160a01b0316145b80610bf95750610bf98433610db5565b610c155760405162461bcd60e51b815260040161067490611d1f565b610c20848484610e7a565b610c3184846108036008600a611cea565b6001600160a01b0383163b15801590610cc65750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610c79903390899088908890600401611edf565b6020604051808303815f875af1158015610c95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb99190611d81565b6001600160e01b03191614155b15610ce4576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060611e61610cfb6008600a611cea565b610d059190611cf5565b821115610d485760405162461bcd60e51b815260206004820152601160248201527014d28dcd0c4e881a5b9d985b1a59081a59607a1b6044820152606401610674565b5f8054610d5490611d9c565b90505f03610d6f57505060408051602081019091525f815290565b5f610d8e610d7f6008600a611cea565b610d899085611f1b565b61144d565b604051602001610d9f929190611f2e565b6040516020818303038152906040529050919050565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610e6d91815260200190565b60405180910390a3505050565b63ffffffff81165f908152600660205260409020546001600160a01b03848116911614610ee25760405162461bcd60e51b815260206004820152601660248201527529a51b9a189d1024b731b7b93932b1ba1037bbb732b960511b6044820152606401610674565b63ffffffff81165f90815260076020908152604080832080546001600160a01b0319908116909155600690925290912080549091166001600160a01b038416179055610f2f838383611552565b6109d283838363ffffffff166116f0565b6001600160a01b0383165f9081526008602052604081208054839290610f67908490611f1b565b90915550506001600160a01b0382165f9081526008602052604090208054820190556109d2838383611736565b6001600160a01b038084165f908152600560209081526040808320938616835292905220548111156110085760405162461bcd60e51b815260206004820152601d60248201527f534a3734313a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610674565b6001600160a01b038084165f9081526005602090815260408083209386168352929052908120805483929061103e908490611f1b565b9091555050505050565b6001600160a01b0383165f908152600860205260409020548111156110be5760405162461bcd60e51b815260206004820152602660248201527f534a3734313a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610674565b5f6110cb6008600a611cea565b6001600160a01b0385165f908152600860205260409020546110ed9190611fd5565b90505f6110fc6008600a611cea565b6001600160a01b0385165f9081526008602052604090205461111e9190611fd5565b905061112b858585610f40565b5f6111386008600a611cea565b6001600160a01b0387165f9081526008602052604090205461115a9190611fd5565b90505f6111696008600a611cea565b6001600160a01b0387165f9081526008602052604090205461118b9190611fd5565b6001600160a01b0388165f90815260096020526040902090915060028386101561123357815415611233575f825f815481106111c9576111c9611fe8565b5f9182526020808320600880840490910154865460018101885587865292852091830490910180546007948516600490810261010090810a90940463ffffffff908116969095160290920a8481029302199091169190911790559150611231908b9083610e7a565b505b828511156112de578054156112d3576112925f8983600185805490506112599190611f1b565b8154811061126957611269611fe8565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16610e7a565b808054806112a2576112a2611ffc565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a021916905590556112de565b6112dc8861177b565b505b5f6112eb6008600a611cea565b6112f59089612010565b6003549091506001600160a01b03908116908b160361131a5750505050505050505050565b80156113fa57825480821061132f5780611331565b815b90505f5b8181101561135c576113548c8c875f8154811061126957611269611fe8565b600101611335565b506113678183611f1b565b8354909250905080821061137b578061137d565b815b90505f5b818110156113e4576113a05f8c86600188805490506112599190611f1b565b838054806113b0576113b0611ffc565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055600101611381565b506113f88a6113f38385611f1b565b61181e565b505b50505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e6d911515815260200190565b6060815f036114735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561149c578061148681612023565b91506114959050600a83612010565b9150611476565b5f8167ffffffffffffffff8111156114b6576114b6611a3f565b6040519080825280601f01601f1916602001820160405280156114e0576020820181803683370190505b5090505b841561154a576114f5600183611f1b565b9150611502600a86611fd5565b61150d90603061203b565b60f81b81838151811061152257611522611fe8565b60200101906001600160f81b03191690815f1a905350611543600a86612010565b94506114e4565b949350505050565b63ffffffff81165f908152600a60209081526040808320546001600160a01b0387168452600990925282208054919290919082611590600184611f1b565b815481106115a0576115a0611fe8565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff169050808385815481106115d9576115d9611fe8565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055508280548061161a5761161a611ffc565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055611651600183611f1b565b1561166e5763ffffffff81165f908152600a602052604090208490555b6001600160a01b0386165f81815260096020908152604082208054600180820183558285529284206008820401805460079092166004026101000a63ffffffff81810219909316928c16029190911790559290915290546116cf9190611f1b565b63ffffffff9095165f908152600a6020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e6d91815260200190565b6001805463ffffffff19811663ffffffff9182168301821690811783555f81815260066020908152604080832080546001600160a01b0319166001600160a01b038916908117909155835260098083528184208054868652600a8552928520839055908352958101865594825281206008850401805460079095166004026101000a93840219909416928202929092179092556118199083836116f0565b919050565b805f03611829575050565b8060010361183a576109d28261177b565b6001546001600160a01b0383165f9081526009602052604081205463ffffffff90921691905b838110156118fc57600192830163ffffffff8181165f81815260066020908152604080832080546001600160a01b0319166001600160a01b038d16908117909155600a8352818420899055835260098252822080549889018155825281206008880401805460079098166004026101000a938402199097169282029290921790955590936118f0919087906116f0565b60019182019101611860565b50506001805463ffffffff19811663ffffffff9182169490940116929092179091555050565b6001600160e01b031981168114610891575f80fd5b5f60208284031215611947575f80fd5b813561082a81611922565b5f5b8381101561196c578181015183820152602001611954565b50505f910152565b5f815180845261198b816020860160208601611952565b601f01601f19169290920160200192915050565b602081525f61082a6020830184611974565b5f602082840312156119c1575f80fd5b5035919050565b80356001600160a01b0381168114611819575f80fd5b5f80604083850312156119ef575f80fd5b6119f8836119c8565b946020939093013593505050565b5f805f60608486031215611a18575f80fd5b611a21846119c8565b9250611a2f602085016119c8565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115611a6d57611a6d611a3f565b604051601f8501601f19908116603f01168101908282118183101715611a9557611a95611a3f565b81604052809350858152868686011115611aad575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611ad6575f80fd5b813567ffffffffffffffff811115611aec575f80fd5b8201601f81018413611afc575f80fd5b61154a84823560208401611a53565b5f60208284031215611b1b575f80fd5b61082a826119c8565b5f8060408385031215611b35575f80fd5b611b3e836119c8565b915060208301358015158114611b52575f80fd5b809150509250929050565b5f805f8060808587031215611b70575f80fd5b611b79856119c8565b9350611b87602086016119c8565b925060408501359150606085013567ffffffffffffffff811115611ba9575f80fd5b8501601f81018713611bb9575f80fd5b611bc887823560208401611a53565b91505092959194509250565b5f8060408385031215611be5575f80fd5b611bee836119c8565b9150611bfc602084016119c8565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115611c5357815f1904821115611c3957611c39611c05565b80851615611c4657918102915b93841c9390800290611c1e565b509250929050565b5f82611c6957506001610585565b81611c7557505f610585565b81600181146106ae5760028103611ca25760ff841115611c9757611c97611c05565b50506001821b610585565b5060208310610133831016604e8410600b8410161715611cc5575081810a610585565b611ccf8383611c19565b805f1904821115611ce257611ce2611c05565b029392505050565b5f61082a8383611c5b565b8082018082111561058557610585611c05565b808202811582820484141761058557610585611c05565b6020808252601f908201527f534a3734313a20596f7520646f6e277420686176652074686520726967687400604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f60208284031215611d91575f80fd5b815161082a81611922565b600181811c90821680611db057607f821691505b602082108103611dce57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156109d257805f5260205f20601f840160051c81016020851015611df95750805b601f840160051c820191505b81811015611e18575f8155600101611e05565b5050505050565b815167ffffffffffffffff811115611e3957611e39611a3f565b611e4d81611e478454611d9c565b84611dd4565b602080601f831160018114611e80575f8415611e695750858301515b5f19600386901b1c1916600185901b178555611ed7565b5f85815260208120601f198616915b82811015611eae57888601518255948401946001909101908401611e8f565b5085821015611ecb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611f1190830184611974565b9695505050505050565b8181038181111561058557610585611c05565b5f808454611f3b81611d9c565b60018281168015611f535760018114611f6857611f94565b60ff1984168752821515830287019450611f94565b885f526020805f205f5b85811015611f8b5781548a820152908401908201611f72565b50505082870194505b505050508351611fa8818360208801611952565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611fe357611fe3611fc1565b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f8261201e5761201e611fc1565b500490565b5f6001820161203457612034611c05565b5060010190565b60ff818116838216019081111561058557610585611c0556fea26469706673582212204aee2a28c37c680b65f83917246894b8c27600584178872e11334127ee4dfd1d64736f6c6343000818003368747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f53657265635468756e646572736f6e2f6173736574732f6d61696e2f656d6572616c64732f6d657461646174612f

Deployed Bytecode

0x60806040526004361061017b575f3560e01c80636bcef9a6116100cd578063a22cb46511610087578063b88d4fde11610062578063b88d4fde1461048f578063c87b56dd146104a2578063dd62ed3e146104c1578063e985e9c514610505575f80fd5b8063a22cb46514610431578063a563833b14610450578063a9059cbb14610470575f80fd5b80636bcef9a6146103685780636c0360eb1461037c57806370a082311461039057806388a8c95c146103c457806391cca3db146103e357806395d89b4114610402575f80fd5b806323b872dd1161013857806342842e0e1161011357806342842e0e146102e65780634f02c420146102f957806355f804b3146103155780636352211e14610334575f80fd5b806323b872dd1461029e578063313ce567146102bd5780633ccfd60b146102d0575f80fd5b806301ffc9a71461017f57806306fdde03146101b3578063081812fc146101f2578063095ea7b31461022957806318160ddd146102485780631a72b87d1461026a575b5f80fd5b34801561018a575f80fd5b5061019e610199366004611937565b610524565b60405190151581526020015b60405180910390f35b3480156101be575f80fd5b5060408051808201909152600e81526d534a37343120456d6572616c647360901b60208201525b6040516101aa919061199f565b3480156101fd575f80fd5b5061021161020c3660046119b1565b61058b565b6040516001600160a01b0390911681526020016101aa565b348015610234575f80fd5b5061019e6102433660046119de565b6105c5565b348015610253575f80fd5b5061025c6106f1565b6040519081526020016101aa565b348015610275575f80fd5b506102896102843660046119de565b61070f565b60405163ffffffff90911681526020016101aa565b3480156102a9575f80fd5b5061019e6102b8366004611a06565b610753565b3480156102c8575f80fd5b50600861025c565b3480156102db575f80fd5b506102e4610831565b005b6102e46102f4366004611a06565b610894565b348015610304575f80fd5b506001546102899063ffffffff1681565b348015610320575f80fd5b506102e461032f366004611ac6565b6109d7565b34801561033f575f80fd5b5061021161034e3660046119b1565b60066020525f90815260409020546001600160a01b031681565b348015610373575f80fd5b506102e4610a10565b348015610387575f80fd5b506101e5610a5b565b34801561039b575f80fd5b5061025c6103aa366004611b0b565b6001600160a01b03165f9081526008602052604090205490565b3480156103cf575f80fd5b506102e46103de366004611b0b565b610ae6565b3480156103ee575f80fd5b50600354610211906001600160a01b031681565b34801561040d575f80fd5b506040805180820190915260078152661153515490531160ca1b60208201526101e5565b34801561043c575f80fd5b506102e461044b366004611b24565b610b32565b34801561045b575f80fd5b5060035461019e90600160a01b900460ff1681565b34801561047b575f80fd5b5061019e61048a3660046119de565b610b6b565b6102e461049d366004611b5d565b610bb9565b3480156104ad575f80fd5b506101e56104bc3660046119b1565b610cea565b3480156104cc575f80fd5b5061025c6104db366004611bd4565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610510575f80fd5b5061019e61051f366004611bd4565b610db5565b6003545f90600160a01b900460ff16801561054f57506380ac58cd60e01b6001600160e01b03198316145b8061056a57506301ffc9a760e01b6001600160e01b03198316145b8061058557506336372b0760e01b6001600160e01b03198316145b92915050565b5f818152600660205260408120546001600160a01b03166105aa575f80fd5b505f908152600760205260409020546001600160a01b031690565b5f6105d26008600a611cea565b821180156105f85750611e616105ea6008600a611cea565b6105f49190611cf5565b8211155b156106b8575f828152600660205260409020546001600160a01b031633811480159061062b57506106298133610db5565b155b1561067d5760405162461bcd60e51b815260206004820152601b60248201527f534a3734313a20596f7520617265206e6f7420617070726f766564000000000060448201526064015b60405180910390fd5b5f83815260076020526040902080546001600160a01b0319166001600160a01b0386161790556106ae818585610de2565b6001915050610585565b335f8181526005602090815260408083206001600160a01b038816845290915290208390556106e8908484610e28565b50600192915050565b5f6106fe6008600a611cea565b61070a90611e61611d08565b905090565b6009602052815f5260405f208181548110610728575f80fd5b905f5260205f209060089182820401919006600402915091509054906101000a900463ffffffff1681565b5f6107606008600a611cea565b821180156107865750611e616107786008600a611cea565b6107829190611cf5565b8211155b1561081057336001600160a01b03851614806107bb57506107a68261058b565b6001600160a01b0316336001600160a01b0316145b806107cb57506107cb8433610db5565b6107e75760405162461bcd60e51b815260040161067490611d1f565b6107f2848484610e7a565b61080884846108036008600a611cea565b610f40565b50600161082a565b61081b843384610f94565b610826848484611048565b5060015b9392505050565b6003546001600160a01b0316331461085b5760405162461bcd60e51b815260040161067490611d56565b6003546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015610891573d5f803e3d5ffd5b50565b336001600160a01b03841614806108c457506108af8161058b565b6001600160a01b0316336001600160a01b0316145b806108d457506108d48333610db5565b6108f05760405162461bcd60e51b815260040161067490611d1f565b6108fb838383610e7a565b61090c83836108036008600a611cea565b6001600160a01b0382163b158015906109b45750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610983573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a79190611d81565b6001600160e01b03191614155b156109d2576040516301d6c93560e61b815260040160405180910390fd5b505050565b6003546001600160a01b03163314610a015760405162461bcd60e51b815260040161067490611d56565b5f610a0c8282611e1f565b5050565b6003546001600160a01b03163314610a3a5760405162461bcd60e51b815260040161067490611d56565b6003805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610a6790611d9c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9390611d9c565b8015610ade5780601f10610ab557610100808354040283529160200191610ade565b820191905f5260205f20905b815481529060010190602001808311610ac157829003601f168201915b505050505081565b6003546001600160a01b03163314610b105760405162461bcd60e51b815260040161067490611d56565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b335f8181526004602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610a0c908383611406565b5f81815260066020526040812054336001600160a01b0390911603610bae57610b95338484610e7a565b610ba633846108036008600a611cea565b506001610585565b6106e8338484611048565b336001600160a01b0385161480610be95750610bd48261058b565b6001600160a01b0316336001600160a01b0316145b80610bf95750610bf98433610db5565b610c155760405162461bcd60e51b815260040161067490611d1f565b610c20848484610e7a565b610c3184846108036008600a611cea565b6001600160a01b0383163b15801590610cc65750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610c79903390899088908890600401611edf565b6020604051808303815f875af1158015610c95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb99190611d81565b6001600160e01b03191614155b15610ce4576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060611e61610cfb6008600a611cea565b610d059190611cf5565b821115610d485760405162461bcd60e51b815260206004820152601160248201527014d28dcd0c4e881a5b9d985b1a59081a59607a1b6044820152606401610674565b5f8054610d5490611d9c565b90505f03610d6f57505060408051602081019091525f815290565b5f610d8e610d7f6008600a611cea565b610d899085611f1b565b61144d565b604051602001610d9f929190611f2e565b6040516020818303038152906040529050919050565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610e6d91815260200190565b60405180910390a3505050565b63ffffffff81165f908152600660205260409020546001600160a01b03848116911614610ee25760405162461bcd60e51b815260206004820152601660248201527529a51b9a189d1024b731b7b93932b1ba1037bbb732b960511b6044820152606401610674565b63ffffffff81165f90815260076020908152604080832080546001600160a01b0319908116909155600690925290912080549091166001600160a01b038416179055610f2f838383611552565b6109d283838363ffffffff166116f0565b6001600160a01b0383165f9081526008602052604081208054839290610f67908490611f1b565b90915550506001600160a01b0382165f9081526008602052604090208054820190556109d2838383611736565b6001600160a01b038084165f908152600560209081526040808320938616835292905220548111156110085760405162461bcd60e51b815260206004820152601d60248201527f534a3734313a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610674565b6001600160a01b038084165f9081526005602090815260408083209386168352929052908120805483929061103e908490611f1b565b9091555050505050565b6001600160a01b0383165f908152600860205260409020548111156110be5760405162461bcd60e51b815260206004820152602660248201527f534a3734313a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610674565b5f6110cb6008600a611cea565b6001600160a01b0385165f908152600860205260409020546110ed9190611fd5565b90505f6110fc6008600a611cea565b6001600160a01b0385165f9081526008602052604090205461111e9190611fd5565b905061112b858585610f40565b5f6111386008600a611cea565b6001600160a01b0387165f9081526008602052604090205461115a9190611fd5565b90505f6111696008600a611cea565b6001600160a01b0387165f9081526008602052604090205461118b9190611fd5565b6001600160a01b0388165f90815260096020526040902090915060028386101561123357815415611233575f825f815481106111c9576111c9611fe8565b5f9182526020808320600880840490910154865460018101885587865292852091830490910180546007948516600490810261010090810a90940463ffffffff908116969095160290920a8481029302199091169190911790559150611231908b9083610e7a565b505b828511156112de578054156112d3576112925f8983600185805490506112599190611f1b565b8154811061126957611269611fe8565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff16610e7a565b808054806112a2576112a2611ffc565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a021916905590556112de565b6112dc8861177b565b505b5f6112eb6008600a611cea565b6112f59089612010565b6003549091506001600160a01b03908116908b160361131a5750505050505050505050565b80156113fa57825480821061132f5780611331565b815b90505f5b8181101561135c576113548c8c875f8154811061126957611269611fe8565b600101611335565b506113678183611f1b565b8354909250905080821061137b578061137d565b815b90505f5b818110156113e4576113a05f8c86600188805490506112599190611f1b565b838054806113b0576113b0611ffc565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055600101611381565b506113f88a6113f38385611f1b565b61181e565b505b50505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e6d911515815260200190565b6060815f036114735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561149c578061148681612023565b91506114959050600a83612010565b9150611476565b5f8167ffffffffffffffff8111156114b6576114b6611a3f565b6040519080825280601f01601f1916602001820160405280156114e0576020820181803683370190505b5090505b841561154a576114f5600183611f1b565b9150611502600a86611fd5565b61150d90603061203b565b60f81b81838151811061152257611522611fe8565b60200101906001600160f81b03191690815f1a905350611543600a86612010565b94506114e4565b949350505050565b63ffffffff81165f908152600a60209081526040808320546001600160a01b0387168452600990925282208054919290919082611590600184611f1b565b815481106115a0576115a0611fe8565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff169050808385815481106115d9576115d9611fe8565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055508280548061161a5761161a611ffc565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055611651600183611f1b565b1561166e5763ffffffff81165f908152600a602052604090208490555b6001600160a01b0386165f81815260096020908152604082208054600180820183558285529284206008820401805460079092166004026101000a63ffffffff81810219909316928c16029190911790559290915290546116cf9190611f1b565b63ffffffff9095165f908152600a6020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e6d91815260200190565b6001805463ffffffff19811663ffffffff9182168301821690811783555f81815260066020908152604080832080546001600160a01b0319166001600160a01b038916908117909155835260098083528184208054868652600a8552928520839055908352958101865594825281206008850401805460079095166004026101000a93840219909416928202929092179092556118199083836116f0565b919050565b805f03611829575050565b8060010361183a576109d28261177b565b6001546001600160a01b0383165f9081526009602052604081205463ffffffff90921691905b838110156118fc57600192830163ffffffff8181165f81815260066020908152604080832080546001600160a01b0319166001600160a01b038d16908117909155600a8352818420899055835260098252822080549889018155825281206008880401805460079098166004026101000a938402199097169282029290921790955590936118f0919087906116f0565b60019182019101611860565b50506001805463ffffffff19811663ffffffff9182169490940116929092179091555050565b6001600160e01b031981168114610891575f80fd5b5f60208284031215611947575f80fd5b813561082a81611922565b5f5b8381101561196c578181015183820152602001611954565b50505f910152565b5f815180845261198b816020860160208601611952565b601f01601f19169290920160200192915050565b602081525f61082a6020830184611974565b5f602082840312156119c1575f80fd5b5035919050565b80356001600160a01b0381168114611819575f80fd5b5f80604083850312156119ef575f80fd5b6119f8836119c8565b946020939093013593505050565b5f805f60608486031215611a18575f80fd5b611a21846119c8565b9250611a2f602085016119c8565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115611a6d57611a6d611a3f565b604051601f8501601f19908116603f01168101908282118183101715611a9557611a95611a3f565b81604052809350858152868686011115611aad575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611ad6575f80fd5b813567ffffffffffffffff811115611aec575f80fd5b8201601f81018413611afc575f80fd5b61154a84823560208401611a53565b5f60208284031215611b1b575f80fd5b61082a826119c8565b5f8060408385031215611b35575f80fd5b611b3e836119c8565b915060208301358015158114611b52575f80fd5b809150509250929050565b5f805f8060808587031215611b70575f80fd5b611b79856119c8565b9350611b87602086016119c8565b925060408501359150606085013567ffffffffffffffff811115611ba9575f80fd5b8501601f81018713611bb9575f80fd5b611bc887823560208401611a53565b91505092959194509250565b5f8060408385031215611be5575f80fd5b611bee836119c8565b9150611bfc602084016119c8565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115611c5357815f1904821115611c3957611c39611c05565b80851615611c4657918102915b93841c9390800290611c1e565b509250929050565b5f82611c6957506001610585565b81611c7557505f610585565b81600181146106ae5760028103611ca25760ff841115611c9757611c97611c05565b50506001821b610585565b5060208310610133831016604e8410600b8410161715611cc5575081810a610585565b611ccf8383611c19565b805f1904821115611ce257611ce2611c05565b029392505050565b5f61082a8383611c5b565b8082018082111561058557610585611c05565b808202811582820484141761058557610585611c05565b6020808252601f908201527f534a3734313a20596f7520646f6e277420686176652074686520726967687400604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f60208284031215611d91575f80fd5b815161082a81611922565b600181811c90821680611db057607f821691505b602082108103611dce57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156109d257805f5260205f20601f840160051c81016020851015611df95750805b601f840160051c820191505b81811015611e18575f8155600101611e05565b5050505050565b815167ffffffffffffffff811115611e3957611e39611a3f565b611e4d81611e478454611d9c565b84611dd4565b602080601f831160018114611e80575f8415611e695750858301515b5f19600386901b1c1916600185901b178555611ed7565b5f85815260208120601f198616915b82811015611eae57888601518255948401946001909101908401611e8f565b5085821015611ecb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611f1190830184611974565b9695505050505050565b8181038181111561058557610585611c05565b5f808454611f3b81611d9c565b60018281168015611f535760018114611f6857611f94565b60ff1984168752821515830287019450611f94565b885f526020805f205f5b85811015611f8b5781548a820152908401908201611f72565b50505082870194505b505050508351611fa8818360208801611952565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b5f52601260045260245ffd5b5f82611fe357611fe3611fc1565b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f8261201e5761201e611fc1565b500490565b5f6001820161203457612034611c05565b5060010190565b60ff818116838216019081111561058557610585611c0556fea26469706673582212204aee2a28c37c680b65f83917246894b8c27600584178872e11334127ee4dfd1d64736f6c63430008180033

Deployed Bytecode Sourcemap

8560:16134:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24083:609;;;;;;;;;;-1:-1:-1;24083:609:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24083:609:0;;;;;;;;10152:77;;;;;;;;;;-1:-1:-1;10221:5:0;;;;;;;;;;;;-1:-1:-1;;;10221:5:0;;;;10152:77;;;;;;;:::i;22746:177::-;;;;;;;;;;-1:-1:-1;22746:177:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;22746:177:0;1533:203:1;11356:979:0;;;;;;;;;;-1:-1:-1;11356:979:0;;;;;:::i;:::-;;:::i;10401:83::-;;;;;;;;;;;;;:::i;:::-;;;2324:25:1;;;2312:2;2297:18;10401:83:0;2178:177:1;9630:45:0;;;;;;;;;;-1:-1:-1;9630:45:0;;;;;:::i;:::-;;:::i;:::-;;;2534:10:1;2522:23;;;2504:42;;2492:2;2477:18;9630:45:0;2360:192:1;20367:798:0;;;;;;;;;;-1:-1:-1;20367:798:0;;;;;:::i;:::-;;:::i;10320:76::-;;;;;;;;;;-1:-1:-1;8845:1:0;10320:76;;23979:98;;;;;;;;;;;;;:::i;:::-;;21185:640;;;;;;:::i;:::-;;:::i;9137:20::-;;;;;;;;;;-1:-1:-1;9137:20:0;;;;;;;;10728:84;;;;;;;;;;-1:-1:-1;10728:84:0;;;;;:::i;:::-;;:::i;9469:50::-;;;;;;;;;;-1:-1:-1;9469:50:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;9469:50:0;;;11257:92;;;;;;;;;;;;;:::i;8592:106::-;;;;;;;;;;;;;:::i;10489:104::-;;;;;;;;;;-1:-1:-1;10489:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;10571:19:0;10556:4;10571:19;;;:10;:19;;;;;;;10489:104;10817:65;;;;;;;;;;-1:-1:-1;10817:65:0;;;;;:::i;:::-;;:::i;9259:18::-;;;;;;;;;;-1:-1:-1;9259:18:0;;;;-1:-1:-1;;;;;9259:18:0;;;10234:81;;;;;;;;;;-1:-1:-1;10305:7:0;;;;;;;;;;;;-1:-1:-1;;;10305:7:0;;;;10234:81;;22929:213;;;;;;;;;;-1:-1:-1;22929:213:0;;;;;:::i;:::-;;:::i;9283:32::-;;;;;;;;;;-1:-1:-1;9283:32:0;;;;-1:-1:-1;;;9283:32:0;;;;;;19996:331;;;;;;;;;;-1:-1:-1;19996:331:0;;;;;:::i;:::-;;:::i;21845:661::-;;;;;;:::i;:::-;;:::i;23308:279::-;;;;;;;;;;-1:-1:-1;23308:279:0;;;;;:::i;:::-;;:::i;10598:125::-;;;;;;;;;;-1:-1:-1;10598:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;10694:17:0;;;10679:4;10694:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;10598:125;23148:154;;;;;;;;;;-1:-1:-1;23148:154:0;;;;;:::i;:::-;;:::i;24083:609::-;24450:20;;24160:4;;-1:-1:-1;;;24450:20:0;;;;:49;;;;-1:-1:-1;;;;;;;;;;24474:25:0;;;24450:49;24449:126;;;-1:-1:-1;;;;;;;;;;24550:25:0;;;24449:126;:201;;;-1:-1:-1;;;;;;;;;;24625:25:0;;;24449:201;24176:474;24083:609;-1:-1:-1;;24083:609:0:o;22746:177::-;22814:7;22837:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22837:16:0;22833:44;;22869:8;;;22833:44;-1:-1:-1;22894:22:0;;;;:13;:22;;;;;;-1:-1:-1;;;;;22894:22:0;;22746:177::o;11356:979::-;11428:4;8996:13;8845:1;8996:2;:13;:::i;:::-;11584:6;:12;:31;;;;-1:-1:-1;8887:4:0;8996:13;8845:1;8996:2;:13;:::i;:::-;9062:15;;;;:::i;:::-;11600:6;:15;;11584:31;11581:443;;;11631:13;11647:15;;;:7;:15;;;;;;-1:-1:-1;;;;;11647:15:0;11736:10;:19;;;;;:59;;;11760:35;11777:5;11784:10;11760:16;:35::i;:::-;11759:36;11736:59;11732:102;;;11797:37;;-1:-1:-1;;;11797:37:0;;7427:2:1;11797:37:0;;;7409:21:1;7466:2;7446:18;;;7439:30;7505:29;7485:18;;;7478:57;7552:18;;11797:37:0;;;;;;;;11732:102;11848:21;;;;:13;:21;;;;;:31;;-1:-1:-1;;;;;;11848:31:0;-1:-1:-1;;;;;11848:31:0;;;;;11943:45;11965:5;11848:31;:21;11943;:45::i;:::-;12009:4;12002:11;;;;;11581:443;12219:10;12208:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12208:31:0;;;;;;;;;:40;;;12258:49;;12231:7;12242:6;12258:20;:49::i;:::-;-1:-1:-1;12324:4:0;11356:979;;;;:::o;10401:83::-;10454:4;8947:13;8845:1;8947:2;:13;:::i;:::-;8935:25;;8887:4;8935:25;:::i;:::-;10462:19;;10401:83;:::o;9630:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20367:798::-;20453:4;8996:13;8845:1;8996:2;:13;:::i;:::-;20569:6;:12;:31;;;;-1:-1:-1;8887:4:0;8996:13;8845:1;8996:2;:13;:::i;:::-;9062:15;;;;:::i;:::-;20585:6;:15;;20569:31;20566:479;;;20754:10;-1:-1:-1;;;;;20754:18:0;;;;:55;;;20790:19;20802:6;20790:11;:19::i;:::-;-1:-1:-1;;;;;20776:33:0;:10;-1:-1:-1;;;;;20776:33:0;;20754:55;:93;;;;20813:34;20830:4;20836:10;20813:16;:34::i;:::-;20616:300;;;;-1:-1:-1;;;20616:300:0;;;;;;;:::i;:::-;20931:38;20944:4;20950:2;20961:6;20931:12;:38::i;:::-;20983:26;20995:4;21001:2;8996:13;8845:1;8996:2;:13;:::i;:::-;20983:11;:26::i;:::-;-1:-1:-1;21030:4:0;21023:11;;20566:479;21055:41;21071:4;21077:10;21089:6;21055:15;:41::i;:::-;21106:30;21119:4;21125:2;21129:6;21106:12;:30::i;:::-;-1:-1:-1;21153:4:0;20367:798;;;;;;:::o;23979:98::-;9818:3;;-1:-1:-1;;;;;9818:3:0;9804:10;:17;9796:47;;;;-1:-1:-1;;;9796:47:0;;;;;;;:::i;:::-;24034:3:::1;::::0;24026:44:::1;::::0;-1:-1:-1;;;;;24034:3:0;;::::1;::::0;24048:21:::1;24026:44:::0;::::1;;;::::0;24034:3:::1;24026:44:::0;24034:3;24026:44;24048:21;24034:3;24026:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;23979:98::o:0;21185:640::-;21313:10;-1:-1:-1;;;;;21313:18:0;;;;:56;;;21349:20;21361:7;21349:11;:20::i;:::-;-1:-1:-1;;;;;21335:34:0;:10;-1:-1:-1;;;;;21335:34:0;;21313:56;:94;;;;21373:34;21390:4;21396:10;21373:16;:34::i;:::-;21288:184;;;;-1:-1:-1;;;21288:184:0;;;;;;;:::i;:::-;21482:39;21495:4;21501:2;21512:7;21482:12;:39::i;:::-;21532:26;21544:4;21550:2;8996:13;8845:1;8996:2;:13;:::i;21532:26::-;-1:-1:-1;;;;;21586:14:0;;;:19;;;;:169;;-1:-1:-1;21621:72:0;;-1:-1:-1;;;21621:72:0;;;21663:10;21621:72;;;8765:34:1;-1:-1:-1;;;;;8835:15:1;;;8815:18;;;8808:43;8867:18;;;8860:34;;;8930:3;8910:18;;;8903:31;-1:-1:-1;8950:19:1;;;8943:30;21709:46:0;;21621:41;;;;21709:46;;8990:19:1;;21621:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21621:134:0;;;21586:169;21569:250;;;21787:21;;-1:-1:-1;;;21787:21:0;;;;;;;;;;;21569:250;21185:640;;;:::o;10728:84::-;9818:3;;-1:-1:-1;;;;;9818:3:0;9804:10;:17;9796:47;;;;-1:-1:-1;;;9796:47:0;;;;;;;:::i;:::-;10790:7:::1;:20;10800:10:::0;10790:7;:20:::1;:::i;:::-;;10728:84:::0;:::o;11257:92::-;9818:3;;-1:-1:-1;;;;;9818:3:0;9804:10;:17;9796:47;;;;-1:-1:-1;;;9796:47:0;;;;;;;:::i;:::-;11327:20:::1;::::0;;-1:-1:-1;;;;11303:44:0;::::1;-1:-1:-1::0;;;11327:20:0;;;::::1;;;11326:21;11303:44:::0;;::::1;;::::0;;11257:92::o;8592:106::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10817:65::-;9818:3;;-1:-1:-1;;;;;9818:3:0;9804:10;:17;9796:47;;;;-1:-1:-1;;;9796:47:0;;;;;;;:::i;:::-;10868:3:::1;:12:::0;;-1:-1:-1;;;;;;10868:12:0::1;-1:-1:-1::0;;;;;10868:12:0;;;::::1;::::0;;;::::1;::::0;;10817:65::o;22929:213::-;23034:10;23015:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;23015:40:0;;;;;;;;;:51;;-1:-1:-1;;23015:51:0;;;;;;;23076:59;;23015:40;:51;23076:27;:59::i;19996:331::-;20064:4;20083:15;;;:7;:15;;;;;;20102:10;-1:-1:-1;;;;;20083:15:0;;;:29;20080:174;;20128:44;20141:10;20153:2;20164:6;20128:12;:44::i;:::-;20186:32;20198:10;20210:2;8996:13;8845:1;8996:2;:13;:::i;20186:32::-;-1:-1:-1;20239:4:0;20232:11;;20080:174;20263:36;20276:10;20288:2;20292:6;20263:12;:36::i;21845:661::-;21992:10;-1:-1:-1;;;;;21992:18:0;;;;:56;;;22028:20;22040:7;22028:11;:20::i;:::-;-1:-1:-1;;;;;22014:34:0;:10;-1:-1:-1;;;;;22014:34:0;;21992:56;:94;;;;22052:34;22069:4;22075:10;22052:16;:34::i;:::-;21967:184;;;;-1:-1:-1;;;21967:184:0;;;;;;;:::i;:::-;22161:39;22174:4;22180:2;22191:7;22161:12;:39::i;:::-;22211:26;22223:4;22229:2;8996:13;8845:1;8996:2;:13;:::i;22211:26::-;-1:-1:-1;;;;;22265:14:0;;;:19;;;;:171;;-1:-1:-1;22300:74:0;;-1:-1:-1;;;22300:74:0;;;22390:46;-1:-1:-1;;;;;22300:41:0;;;22390:46;;22300:74;;22342:10;;22354:4;;22360:7;;22369:4;;22300:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22300:136:0;;;22265:171;22248:252;;;22468:21;;-1:-1:-1;;;22468:21:0;;;;;;;;;;;22248:252;21845:661;;;;:::o;23308:279::-;23372:13;8887:4;8996:13;8845:1;8996:2;:13;:::i;:::-;9062:15;;;;:::i;:::-;23405:7;:16;;23397:46;;;;-1:-1:-1;;;23397:46:0;;12525:2:1;23397:46:0;;;12507:21:1;12564:2;12544:18;;;12537:30;-1:-1:-1;;;12583:18:1;;;12576:47;12640:18;;23397:46:0;12323:341:1;23397:46:0;23463:7;23457:21;;;;;:::i;:::-;;;23482:1;23457:26;23453:44;;-1:-1:-1;;23486:9:0;;;;;;;;;-1:-1:-1;23486:9:0;;;23308:279::o;23453:44::-;23537:7;23546:23;8996:13;8845:1;8996:2;:13;:::i;:::-;23555;;:7;:13;:::i;:::-;23546:8;:23::i;:::-;23520:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23506:74;;23308:279;;;:::o;23148:154::-;-1:-1:-1;;;;;23260:25:0;;;23237:4;23260:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23148:154::o;5860:126::-;5974:8;5964;-1:-1:-1;;;;;5947:36:0;5956:6;-1:-1:-1;;;;;5947:36:0;;;;;;;;;;;5860:126;;;:::o;5301:122::-;5403:8;-1:-1:-1;;;;;5386:34:0;5395:6;-1:-1:-1;;;;;5386:34:0;;5413:6;5386:34;;;;2324:25:1;;2312:2;2297:18;;2178:177;5386:34:0;;;;;;;;5301:122;;;:::o;19347:523::-;19454:16;;;;;;;:7;:16;;;;;;-1:-1:-1;;;;;19446:24:0;;;19454:16;;19446:24;19438:59;;;;-1:-1:-1;;;19438:59:0;;14197:2:1;19438:59:0;;;14179:21:1;14236:2;14216:18;;;14209:30;-1:-1:-1;;;14255:18:1;;;14248:52;14317:18;;19438:59:0;13995:346:1;19438:59:0;19561:22;;;;;;;:13;:22;;;;;;;;19554:29;;-1:-1:-1;;;;;;19554:29:0;;;;;;19631:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;19631:21:0;;;;;19705:35;19722:4;19631:21;19561:22;19705:16;:35::i;:::-;19790:40;19812:4;19818:2;19822:7;19790:40;;:21;:40::i;18893:355::-;-1:-1:-1;;;;;18975:16:0;;;;;;:10;:16;;;;;:26;;18995:6;;18975:16;:26;;18995:6;;18975:26;:::i;:::-;;;;-1:-1:-1;;;;;;;19082:14:0;;;;;;:10;:14;;;;;:24;;;;;;19171:38;19192:4;19093:2;19100:6;19171:20;:38::i;22512:228::-;-1:-1:-1;;;;;22617:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;:36;-1:-1:-1;22617:36:0;22609:78;;;;-1:-1:-1;;;22609:78:0;;14548:2:1;22609:78:0;;;14530:21:1;14587:2;14567:18;;;14560:30;14626:31;14606:18;;;14599:59;14675:18;;22609:78:0;14346:353:1;22609:78:0;-1:-1:-1;;;;;22697:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;:36;;22727:6;;22697:17;:36;;22727:6;;22697:36;:::i;:::-;;;;-1:-1:-1;;;;;22512:228:0:o;12341:3685::-;-1:-1:-1;;;;;12446:16:0;;;;;;:10;:16;;;;;;:26;-1:-1:-1;12446:26:0;12438:77;;;;-1:-1:-1;;;12438:77:0;;14906:2:1;12438:77:0;;;14888:21:1;14945:2;14925:18;;;14918:30;14984:34;14964:18;;;14957:62;-1:-1:-1;;;15035:18:1;;;15028:36;15081:19;;12438:77:0;14704:402:1;12438:77:0;12630:23;8996:13;8845:1;8996:2;:13;:::i;:::-;-1:-1:-1;;;;;12656:16:0;;;;;;:10;:16;;;;;;:22;;;;:::i;:::-;12630:48;-1:-1:-1;12688:21:0;8996:13;8845:1;8996:2;:13;:::i;:::-;-1:-1:-1;;;;;12712:14:0;;;;;;:10;:14;;;;;;:20;;;;:::i;:::-;12688:44;;12794:29;12806:4;12812:2;12816:6;12794:11;:29::i;:::-;12922:24;8996:13;8845:1;8996:2;:13;:::i;:::-;-1:-1:-1;;;;;12949:16:0;;;;;;:10;:16;;;;;;:22;;;;:::i;:::-;12922:49;-1:-1:-1;12981:22:0;8996:13;8845:1;8996:2;:13;:::i;:::-;-1:-1:-1;;;;;13006:14:0;;;;;;:10;:14;;;;;;:20;;;;:::i;:::-;-1:-1:-1;;;;;13160:15:0;;13126:31;13160:15;;;:9;:15;;;;;12981:45;;-1:-1:-1;13302:6:0;13428:34;;;13424:464;;;13482:21;;:25;13479:399;;13564:14;13581;13596:1;13581:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;13661:28;;;;;;;;;;;;;;;;;;;;;13581:17;;;;;;;;;;;;;;;;;;;13661:28;;;;;;;;;;;;;;;;;;;;;;;13581:17;-1:-1:-1;13761:39:0;;13774:4;;13581:17;13761:12;:39::i;:::-;13509:369;13479:399;14031:14;14015:13;:30;14011:356;;;14065:21;;:25;14062:282;;14145:71;14166:1;14170:2;14174:14;14213:1;14189:14;:21;;;;:25;;;;:::i;:::-;14174:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;14145:12;:71::i;:::-;14234:14;:20;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;14234:20:0;;;;;;;;;;;;;;;;;;;;;;;;14062:282;;;14320:9;14326:2;14320:5;:9::i;:::-;;14062:282;14461:19;8996:13;8845:1;8996:2;:13;:::i;:::-;14483:12;;:6;:12;:::i;:::-;14822:3;;14461:34;;-1:-1:-1;;;;;;14822:3:0;;;14814:11;;;;14811:23;;14827:7;;;;;;;12341:3685;;;:::o;14811:23::-;14848:18;;14845:1175;;14894:21;;15005:20;;;:43;;15045:3;15005:43;;;15028:14;15005:43;14999:49;;15288:6;15283:106;15304:3;15300:1;:7;15283:106;;;15332:41;15345:4;15351:2;15355:14;15370:1;15355:17;;;;;;;;:::i;15332:41::-;15309:3;;15283:106;;;-1:-1:-1;15402:21:0;15420:3;15402:21;;:::i;:::-;15443;;15402;;-1:-1:-1;15443:21:0;-1:-1:-1;15484:20:0;;;:43;;15524:3;15484:43;;;15507:14;15484:43;15478:49;;15782:6;15777:181;15798:3;15794:1;:7;15777:181;;;15834:71;15855:1;15859:2;15863:14;15902:1;15878:14;:21;;;;:25;;;;:::i;15834:71::-;15923:14;:20;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;15923:20:0;;;;;;;;;;;;;;;;;;;;;;;;;15803:3;15777:181;;;-1:-1:-1;15972:36:0;15983:2;15987:20;16004:3;15987:14;:20;:::i;:::-;15972:10;:36::i;:::-;14868:1152;14845:1175;12419:3607;;;;;;;12341:3685;;;:::o;5991:142::-;6109:9;-1:-1:-1;;;;;6086:44:0;6101:6;-1:-1:-1;;;;;6086:44:0;;6120:9;6086:44;;;;565:14:1;558:22;540:41;;528:2;513:18;;400:187;23593:380:0;23649:13;23678:5;23687:1;23678:10;23674:29;;-1:-1:-1;;23691:10:0;;;;;;;;;;;;-1:-1:-1;;;23691:10:0;;;;;23593:380::o;23674:29::-;23719:5;23704:12;23750:41;23757:9;;23750:41;;23769:8;;;;:::i;:::-;;-1:-1:-1;23779:10:0;;-1:-1:-1;23787:2:0;23779:10;;:::i;:::-;;;23750:41;;;23792:19;23824:6;23814:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23814:17:0;;23792:39;;23841:95;23848:10;;23841:95;;23861:11;23871:1;23861:11;;:::i;:::-;;-1:-1:-1;23904:10:0;23912:2;23904:5;:10;:::i;:::-;23898:22;;23918:2;23898:22;:::i;:::-;23891:30;;23874:6;23881;23874:14;;;;;;;;:::i;:::-;;;;:47;-1:-1:-1;;;;;23874:47:0;;;;;;;;-1:-1:-1;23923:11:0;23932:2;23923:11;;:::i;:::-;;;23841:95;;;23959:6;23593:380;-1:-1:-1;;;;23593:380:0:o;17810:1030::-;17914:18;;;17898:13;17914:18;;;:9;:18;;;;;;;;;-1:-1:-1;;;;;18024:15:0;;;;:9;:15;;;;;18112;;17914:18;;18024:15;;18112;18024;18209:7;18215:1;18112:15;18209:7;:::i;:::-;18200:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;18179:38;;18319:11;18301:8;18310:5;18301:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;18406:8;:14;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;18406:14:0;;;;;;;;;;;;;;;;;;;;;;;;18525:7;18406:14;18525:3;:7;:::i;:::-;:12;18522:113;;18553:22;;;;;;;:9;:22;;;;;:30;;;18522:113;-1:-1:-1;;;;;18650:13:0;;;;;;:9;:13;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18755:13;;;;:20;;:24;;18650:27;18755:24;:::i;:::-;18734:18;;;;;;;;:9;:18;;;;;:45;;;;-1:-1:-1;;;;;;17810:1030:0:o;5741:114::-;5843:8;5838:3;-1:-1:-1;;;;;5822:30:0;5831:5;-1:-1:-1;;;;;5822:30:0;;;;;;;;;;;5741:114;;;:::o;5184:112::-;5280:3;-1:-1:-1;;;;;5264:29:0;5273:5;-1:-1:-1;;;;;5264:29:0;;5285:7;5264:29;;;;2324:25:1;;2312:2;2297:18;;2178:177;17099:611:0;17192:6;:8;;-1:-1:-1;;17192:8:0;;;;;;;;;;;;;;;-1:-1:-1;17330:16:0;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;17330:21:0;-1:-1:-1;;;;;17330:21:0;;;;;;;;17424:13;;:9;:13;;;;;;:20;;17403:18;;;:9;:18;;;;;:41;;;17511:13;;;:27;;;;;;;;;;;;;;;;;;;;;;17192:8;17511:27;;;;;;;;;;;;;;;;;;17617:46;;17330:21;17192:8;17617:21;:46::i;:::-;17099:611;;;:::o;16032:1060::-;16102:6;16112:1;16102:11;16099:23;;16032:1060;;:::o;16099:23::-;16162:6;16172:1;16162:11;16159:102;;16221:9;16227:2;16221:5;:9::i;16159:102::-;16282:6;;-1:-1:-1;;;;;16352:13:0;;16270:9;16352:13;;;:9;:13;;;;;:20;16282:6;;;;;16352:20;16422:567;16442:6;16438:1;:10;16422:567;;;16493:4;;;;16558:11;;;;;;;;:7;:11;;;;;;;;:16;;-1:-1:-1;;;;;;16558:16:0;-1:-1:-1;;;;;16558:16:0;;;;;;;;16616:9;:13;;;;;:24;;;16698:13;;:9;:13;;;;:22;;;;;;;;;;;;;;;;;;;;;;;16558:16;16698:22;;;;;;;;;;;;;;;;;;16493:4;;16769:41;;16558:11;:16;;16769:21;:41::i;:::-;16880:10;;;;;16941:3;16422:567;;;-1:-1:-1;;17022:6:0;:24;;-1:-1:-1;;17022:24:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;16032:1060:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2557:328::-;2634:6;2642;2650;2703:2;2691:9;2682:7;2678:23;2674:32;2671:52;;;2719:1;2716;2709:12;2671:52;2742:29;2761:9;2742:29;:::i;:::-;2732:39;;2790:38;2824:2;2813:9;2809:18;2790:38;:::i;:::-;2780:48;;2875:2;2864:9;2860:18;2847:32;2837:42;;2557:328;;;;;:::o;2890:127::-;2951:10;2946:3;2942:20;2939:1;2932:31;2982:4;2979:1;2972:15;3006:4;3003:1;2996:15;3022:632;3087:5;3117:18;3158:2;3150:6;3147:14;3144:40;;;3164:18;;:::i;:::-;3239:2;3233:9;3207:2;3293:15;;-1:-1:-1;;3289:24:1;;;3315:2;3285:33;3281:42;3269:55;;;3339:18;;;3359:22;;;3336:46;3333:72;;;3385:18;;:::i;:::-;3425:10;3421:2;3414:22;3454:6;3445:15;;3484:6;3476;3469:22;3524:3;3515:6;3510:3;3506:16;3503:25;3500:45;;;3541:1;3538;3531:12;3500:45;3591:6;3586:3;3579:4;3571:6;3567:17;3554:44;3646:1;3639:4;3630:6;3622;3618:19;3614:30;3607:41;;;;3022:632;;;;;:::o;3659:451::-;3728:6;3781:2;3769:9;3760:7;3756:23;3752:32;3749:52;;;3797:1;3794;3787:12;3749:52;3837:9;3824:23;3870:18;3862:6;3859:30;3856:50;;;3902:1;3899;3892:12;3856:50;3925:22;;3978:4;3970:13;;3966:27;-1:-1:-1;3956:55:1;;4007:1;4004;3997:12;3956:55;4030:74;4096:7;4091:2;4078:16;4073:2;4069;4065:11;4030:74;:::i;4115:186::-;4174:6;4227:2;4215:9;4206:7;4202:23;4198:32;4195:52;;;4243:1;4240;4233:12;4195:52;4266:29;4285:9;4266:29;:::i;4306:347::-;4371:6;4379;4432:2;4420:9;4411:7;4407:23;4403:32;4400:52;;;4448:1;4445;4438:12;4400:52;4471:29;4490:9;4471:29;:::i;:::-;4461:39;;4550:2;4539:9;4535:18;4522:32;4597:5;4590:13;4583:21;4576:5;4573:32;4563:60;;4619:1;4616;4609:12;4563:60;4642:5;4632:15;;;4306:347;;;;;:::o;4658:667::-;4753:6;4761;4769;4777;4830:3;4818:9;4809:7;4805:23;4801:33;4798:53;;;4847:1;4844;4837:12;4798:53;4870:29;4889:9;4870:29;:::i;:::-;4860:39;;4918:38;4952:2;4941:9;4937:18;4918:38;:::i;:::-;4908:48;;5003:2;4992:9;4988:18;4975:32;4965:42;;5058:2;5047:9;5043:18;5030:32;5085:18;5077:6;5074:30;5071:50;;;5117:1;5114;5107:12;5071:50;5140:22;;5193:4;5185:13;;5181:27;-1:-1:-1;5171:55:1;;5222:1;5219;5212:12;5171:55;5245:74;5311:7;5306:2;5293:16;5288:2;5284;5280:11;5245:74;:::i;:::-;5235:84;;;4658:667;;;;;;;:::o;5330:260::-;5398:6;5406;5459:2;5447:9;5438:7;5434:23;5430:32;5427:52;;;5475:1;5472;5465:12;5427:52;5498:29;5517:9;5498:29;:::i;:::-;5488:39;;5546:38;5580:2;5569:9;5565:18;5546:38;:::i;:::-;5536:48;;5330:260;;;;;:::o;5595:127::-;5656:10;5651:3;5647:20;5644:1;5637:31;5687:4;5684:1;5677:15;5711:4;5708:1;5701:15;5727:416;5816:1;5853:5;5816:1;5867:270;5888:7;5878:8;5875:21;5867:270;;;5947:4;5943:1;5939:6;5935:17;5929:4;5926:27;5923:53;;;5956:18;;:::i;:::-;6006:7;5996:8;5992:22;5989:55;;;6026:16;;;;5989:55;6105:22;;;;6065:15;;;;5867:270;;;5871:3;5727:416;;;;;:::o;6148:806::-;6197:5;6227:8;6217:80;;-1:-1:-1;6268:1:1;6282:5;;6217:80;6316:4;6306:76;;-1:-1:-1;6353:1:1;6367:5;;6306:76;6398:4;6416:1;6411:59;;;;6484:1;6479:130;;6391:218;6479:130;6516:3;6506:8;6503:17;6500:43;;;6523:18;;:::i;:::-;-1:-1:-1;;6579:1:1;6565:16;;6594:5;;6391:218;;6693:2;6683:8;6680:16;6674:3;6668:4;6665:13;6661:36;6655:2;6645:8;6642:16;6637:2;6631:4;6628:12;6624:35;6621:77;6618:159;;;-1:-1:-1;6730:19:1;;;6762:5;;6618:159;6809:34;6834:8;6828:4;6809:34;:::i;:::-;6879:6;6875:1;6871:6;6867:19;6858:7;6855:32;6852:58;;;6890:18;;:::i;:::-;6928:20;;6148:806;-1:-1:-1;;;6148:806:1:o;6959:131::-;7019:5;7048:36;7075:8;7069:4;7048:36;:::i;7095:125::-;7160:9;;;7181:10;;;7178:36;;;7194:18;;:::i;7581:168::-;7654:9;;;7685;;7702:15;;;7696:22;;7682:37;7672:71;;7723:18;;:::i;7754:355::-;7956:2;7938:21;;;7995:2;7975:18;;;7968:30;8034:33;8029:2;8014:18;;8007:61;8100:2;8085:18;;7754:355::o;8114:341::-;8316:2;8298:21;;;8355:2;8335:18;;;8328:30;-1:-1:-1;;;8389:2:1;8374:18;;8367:47;8446:2;8431:18;;8114:341::o;9020:249::-;9089:6;9142:2;9130:9;9121:7;9117:23;9113:32;9110:52;;;9158:1;9155;9148:12;9110:52;9190:9;9184:16;9209:30;9233:5;9209:30;:::i;9274:380::-;9353:1;9349:12;;;;9396;;;9417:61;;9471:4;9463:6;9459:17;9449:27;;9417:61;9524:2;9516:6;9513:14;9493:18;9490:38;9487:161;;9570:10;9565:3;9561:20;9558:1;9551:31;9605:4;9602:1;9595:15;9633:4;9630:1;9623:15;9487:161;;9274:380;;;:::o;9785:518::-;9887:2;9882:3;9879:11;9876:421;;;9923:5;9920:1;9913:16;9967:4;9964:1;9954:18;10037:2;10025:10;10021:19;10018:1;10014:27;10008:4;10004:38;10073:4;10061:10;10058:20;10055:47;;;-1:-1:-1;10096:4:1;10055:47;10151:2;10146:3;10142:12;10139:1;10135:20;10129:4;10125:31;10115:41;;10206:81;10224:2;10217:5;10214:13;10206:81;;;10283:1;10269:16;;10250:1;10239:13;10206:81;;;10210:3;;9785:518;;;:::o;10479:1345::-;10605:3;10599:10;10632:18;10624:6;10621:30;10618:56;;;10654:18;;:::i;:::-;10683:97;10773:6;10733:38;10765:4;10759:11;10733:38;:::i;:::-;10727:4;10683:97;:::i;:::-;10835:4;;10892:2;10881:14;;10909:1;10904:663;;;;11611:1;11628:6;11625:89;;;-1:-1:-1;11680:19:1;;;11674:26;11625:89;-1:-1:-1;;10436:1:1;10432:11;;;10428:24;10424:29;10414:40;10460:1;10456:11;;;10411:57;11727:81;;10874:944;;10904:663;9732:1;9725:14;;;9769:4;9756:18;;-1:-1:-1;;10940:20:1;;;11058:236;11072:7;11069:1;11066:14;11058:236;;;11161:19;;;11155:26;11140:42;;11253:27;;;;11221:1;11209:14;;;;11088:19;;11058:236;;;11062:3;11322:6;11313:7;11310:19;11307:201;;;11383:19;;;11377:26;-1:-1:-1;;11466:1:1;11462:14;;;11478:3;11458:24;11454:37;11450:42;11435:58;11420:74;;11307:201;;;11554:1;11545:6;11542:1;11538:14;11534:22;11528:4;11521:36;10874:944;;;;;10479:1345;;:::o;11829:489::-;-1:-1:-1;;;;;12098:15:1;;;12080:34;;12150:15;;12145:2;12130:18;;12123:43;12197:2;12182:18;;12175:34;;;12245:3;12240:2;12225:18;;12218:31;;;12023:4;;12266:46;;12292:19;;12284:6;12266:46;:::i;:::-;12258:54;11829:489;-1:-1:-1;;;;;;11829:489:1:o;12669:128::-;12736:9;;;12757:11;;;12754:37;;;12771:18;;:::i;12802:1188::-;13079:3;13108:1;13141:6;13135:13;13171:36;13197:9;13171:36;:::i;:::-;13226:1;13243:17;;;13269:133;;;;13416:1;13411:358;;;;13236:533;;13269:133;-1:-1:-1;;13302:24:1;;13290:37;;13375:14;;13368:22;13356:35;;13347:45;;;-1:-1:-1;13269:133:1;;13411:358;13442:6;13439:1;13432:17;13472:4;13517;13514:1;13504:18;13544:1;13558:165;13572:6;13569:1;13566:13;13558:165;;;13650:14;;13637:11;;;13630:35;13693:16;;;;13587:10;;13558:165;;;13562:3;;;13752:6;13747:3;13743:16;13736:23;;13236:533;;;;;13800:6;13794:13;13816:68;13875:8;13870:3;13863:4;13855:6;13851:17;13816:68;:::i;:::-;-1:-1:-1;;;13906:18:1;;13933:22;;;13982:1;13971:13;;12802:1188;-1:-1:-1;;;;12802:1188:1:o;15111:127::-;15172:10;15167:3;15163:20;15160:1;15153:31;15203:4;15200:1;15193:15;15227:4;15224:1;15217:15;15243:112;15275:1;15301;15291:35;;15306:18;;:::i;:::-;-1:-1:-1;15340:9:1;;15243:112::o;15360:127::-;15421:10;15416:3;15412:20;15409:1;15402:31;15452:4;15449:1;15442:15;15476:4;15473:1;15466:15;15492:127;15553:10;15548:3;15544:20;15541:1;15534:31;15584:4;15581:1;15574:15;15608:4;15605:1;15598:15;15624:120;15664:1;15690;15680:35;;15695:18;;:::i;:::-;-1:-1:-1;15729:9:1;;15624:120::o;15749:135::-;15788:3;15809:17;;;15806:43;;15829:18;;:::i;:::-;-1:-1:-1;15876:1:1;15865:13;;15749:135::o;15889:148::-;15977:4;15956:12;;;15970;;;15952:31;;15995:13;;15992:39;;;16011:18;;:::i

Swarm Source

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