ETH Price: $2,335.48 (-0.55%)

Token

Dusko (DUSKO)
 

Overview

Max Total Supply

80 DUSKO

Holders

54

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jelder.eth
Balance
1 DUSKO
0x650051fa564f6c772aac48ecc2c53050b6337799
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:
Dusko

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 17: Dusko.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

// This is an NFT for Dusko https://twitter.com/duskoworld
// Smart contract developed by Ian Cherkowski https://twitter.com/IanCherkowski
// Thanks to chiru-labs for their gas friendly ERC721A implementation.
//

import "./ERC721A.sol";
import "./Ownable.sol";
import "./IERC20.sol";
import "./ReentrancyGuard.sol";
import "./PaymentSplitter.sol";
import "./ERC2981.sol";

contract Dusko is
    ERC721A,
    ReentrancyGuard,
    PaymentSplitter,
    Ownable,
    ERC2981
{
    string private constant _name = "Dusko";
    string private constant _symbol = "DUSKO";
    string public baseURI = "https://ipfs.io/ipfs/QmTmuozNTeBCoSdKiAo3zWo51mY62rPLyqQSea3QQiT5bR/";
    uint256 public maxMint = 3;
    uint256 public preCost = 0.15 ether;
    uint256 public mainCost = 0.2 ether;
    uint256 public maxSupply = 137;
    uint256 public presaleCount;
    bool public freezeURI = false;
    bool public freezeSupply = false;
	bool public mainSale = false;
	bool public presale = false;
	mapping(address => uint256) public presaleList;
	mapping(address => uint256) public mintList;

    address[] private firstPayees = [0xF34ddAf8984E115700AEf4EfDC5cb1Bec69785D3,0xCc81ec04591f56a730E429795729D3bD6C21D877,0xD8f9B770fe183463a1ECF45b72CBb8a460047CdB];
    uint16[] private firstShares = [10,30,60];

    constructor() ERC721A(_name, _symbol) PaymentSplitter(firstPayees, firstShares) payable {
        _setDefaultRoyalty(address(this), 500);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

	// @dev owner can mint to a list of addresses with the quantity entered
	function gift(address[] calldata recipients, uint256[] calldata amounts) external onlyOwner {
        uint256 numTokens = 0;
        uint256 i;
        
        require(recipients.length == amounts.length, "Dusko: The number of addresses is not matching the number of amounts");

        //find total to be minted
        for (i = 0; i < recipients.length; i++) {
            require(Address.isContract(recipients[i]) == false, "Dusko: no contracts");
            numTokens += amounts[i];
        }

        require(totalSupply() + numTokens <= maxSupply, "Dusko: Can't mint more than the max supply");

        //mint to the list
        for (i = 0; i < amounts.length; i++) {
            _safeMint(recipients[i], amounts[i]);
        }
	}

    // @dev public minting, accepts affiliate address
	function mint(uint256 _mintAmount) external payable nonReentrant {
        uint256 supply = totalSupply();

        require(Address.isContract(msg.sender) == false, "Dusko: no contracts");
        require(mainSale || presale, "Dusko: Minting not started yet");
        require(_mintAmount > 0, "Dusko: Cant mint 0");
        require(supply + _mintAmount <= maxSupply, "Dusko: Cant mint more than max supply");
        require(msg.value >= cost() * _mintAmount, "Dusko: Must send eth of cost per nft");
        
        if (presale && !mainSale) {
            uint256 reserve = presaleList[msg.sender];
            require(reserve > 0, "Dusko: None left for you");
            require(_mintAmount <= reserve, "Dusko: Cant mint more than your allocation");
            presaleList[msg.sender] -= _mintAmount;
        }

        require(mintList[msg.sender] + _mintAmount <= maxMint, "Dusko: Must mint less than the max");
        mintList[msg.sender] += _mintAmount;

        _safeMint(msg.sender, _mintAmount);
	}

    function cost() public view returns (uint256) {
        uint256 _cost;
        if (!mainSale) {
            _cost = preCost;
        } else {
            _cost = mainCost;
        }
        return _cost;
    }

	// @dev record addresses of presale list
	function presaleSet(address[] calldata _addresses, uint256[] calldata _amounts) external onlyOwner {
        uint256 previous;

        require(_addresses.length == _amounts.length,
            "Dusko: The number of addresses is not matching the number of amounts");

        for(uint256 i; i < _addresses.length; i++) {
            require(Address.isContract(_addresses[i]) == false, "Dusko: no contracts");

            previous = presaleList[_addresses[i]];
            presaleList[_addresses[i]] = _amounts[i];
            presaleCount = presaleCount + _amounts[i] - previous;
        }
	}

    // @dev set cost of minting
	function setMainCost(uint256 _newCost) external onlyOwner {
    	mainCost = _newCost;
	}
		
    // @dev set presale cost of minting
	function setPreCost(uint256 _newCost) external onlyOwner {
    	preCost = _newCost;
	}
		
    // @dev max mint amount per transaction
    function setMaxMint(uint256 _newMaxMintAmount) external onlyOwner {
	    maxMint = _newMaxMintAmount;
	}

    // @dev unpause main minting stage
	function setMainStatus(bool _status) external onlyOwner {
    	mainSale = _status;
	}
	
    // @dev unpause presale minting stage
	function setPresaleStatus(bool _presale) external onlyOwner {
    	presale = _presale;
	}

    // @dev Set the base url path to the metadata used by opensea
    function setBaseURI(string memory _baseTokenURI) external onlyOwner {
        require(freezeURI == false, "Dusko: uri is frozen");
        baseURI = _baseTokenURI;
    }

    // @dev freeze the URI
    function setFreezeURI() external onlyOwner {
        freezeURI = true;
    }

    // @dev freeze the total supply
    function setFreezeSupply() external onlyOwner {
        freezeSupply = true;
    }

    // @dev show the baseuri
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // @dev used to reduce the max supply instead of a burn
    function setMaxSupply(uint256 newMax) external onlyOwner {
        require(freezeSupply == false, "Dusko: Total supply is locked");
        require(newMax >= totalSupply(), "Dusko: New maximum can't be less than minted count");
        maxSupply = newMax;
    }

    // @dev Add payee for payment splitter
    function addPayee(address account, uint16 shares_) external onlyOwner {
        _addPayee(account, shares_);
    }

    // @dev Set the number of shares for payment splitter
    function setShares(address account, uint16 shares_) external onlyOwner {
        _setShares(account, shares_);
    }

    // @dev add tokens that are used by payment splitter
    function addToken(address account) external onlyOwner {
        _addToken(account);
    }

    // @dev release payments for minting to one payee
    function release(address payable account) external nonReentrant {
        require(Address.isContract(account) == false, "Dusko: no contracts");
        _release(account);
    }

    // @dev release ERC20 tokens due to a payee
    function releaseToken(IERC20 token, address payable account) external nonReentrant {
        require(Address.isContract(account) == false, "Dusko: no contracts");
        _releaseToken(token, account);
    }

    // @dev anyone can run withdraw which will send all payments for minting
    function withdraw() external nonReentrant {
        _withdraw();
    }

    /**
     * @dev External onlyOwner version of {ERC2981-_setDefaultRoyalty}.
     */
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }
}

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

pragma solidity 0.8.13;

/**
 * @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 2 of 17: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity 0.8.13;

/**
 * @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 4 of 17: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity 0.8.13;

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 5 of 17: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

pragma solidity 0.8.13;

import "./IERC2981.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 6 of 17: ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs
//https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol

pragma solidity 0.8.13;

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

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

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

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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

pragma solidity 0.8.13;

/**
 * @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 8 of 17: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity 0.8.13;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 9 of 17: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity 0.8.13;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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

pragma solidity 0.8.13;

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

pragma solidity 0.8.13;

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 12 of 17: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity 0.8.13;

/**
 * @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 13 of 17: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity 0.8.13;

import "./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 14 of 17: PaymentSplitter.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity 0.8.13;

import "./SafeERC20.sol";
import "./Address.sol";
import "./Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 * 
 * Changes were made to code as client needs to change shares in the future. Also made it easier to manage withdrawls.
 */

contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint16 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;
    address[] private _payees;
    IERC20[] private _tokenList;
    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;


    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint16[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint16 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
        //Can add tokens eg wrapped ETH
        //_addToken(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619);
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleasedToken(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function releasedToken(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function _release(address payable account) internal virtual {
        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));
 
        //in case calculation is wrong then give remaining balance
        if (payment > address(this).balance) {
            payment = address(this).balance;
        }

        if (payment > 0) {
            _released[account] += payment;
            _totalReleased += payment;

            Address.sendValue(account, payment);
            emit PaymentReleased(account, payment);
        }
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function _releaseToken(IERC20 token, address payable account) internal virtual {
        uint256 totalReceived = token.balanceOf(address(this)) + totalReleasedToken(token);
        uint256 payment = _pendingPayment(account, totalReceived, releasedToken(token, account));

        //in case calculation is wrong then give remaining balance
        if (payment > token.balanceOf(address(this))) {
            payment = token.balanceOf(address(this));
        }

        if (payment > 0) {
            _erc20Released[token][account] += payment;
            _erc20TotalReleased[token] += payment;

            SafeERC20.safeTransfer(token, account, payment);
            emit ERC20PaymentReleased(token, account, payment);
        }
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        uint256 _pending;
        if (_totalShares == 0) {
            _pending = 0;
        } else {
            _pending = (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
        }
        return _pending;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint16 shares_) internal virtual {
        uint256 i;
        uint256 j;

        require(Address.isContract(account) == false, "PaymentSplitter: no contracts");

        //prevent duplicates as can be run after contract deployed
        uint payeeExists;
        for (i = 0; i < _payees.length; i++) {
            if (_payees[i] == account) {
                payeeExists = 1;
            }
        }

        //if new payee then add
        if (payeeExists == 0) {
            //make pay outs and reset values so next payout is correct
            if (shares_ > 0) {
                _withdraw();
                _totalReleased = 0;
                for (i = 0; i < _payees.length; i++) {
                    _released[_payees[i]] = 0;
                }

                //for each token
                for (j = 0; j < _tokenList.length; j++) {
                    IERC20 token = _tokenList[j];
                    _erc20TotalReleased[token] = 0;            
                    for (i = 0; i < _payees.length; i++) {
                        _erc20Released[token][_payees[i]] = 0;
                    }
                }
            }

            _payees.push(account);
            _shares[account] = shares_;
            _totalShares = _totalShares + shares_;
            emit PayeeAdded(account, shares_);
        }
    }

    // @dev set shares of payout account
    function _setShares(address account, uint256 shares_) internal virtual {
        uint256 i;
        uint256 j;
        uint256 pendingTotal;

        //make sure payee exists
        uint payeeExists = 0;
        for (i = 0; i < _payees.length; i++) {
            if (_payees[i] == account) {
                payeeExists = 1;
            }
        }
        require(payeeExists == 1, "PaymentSplitter: payee does not exist, add payee first");

        pendingTotal = _totalShares - _shares[account] + shares_;
        require(pendingTotal > 0, "PaymentSplitter: total shares must be greater than 0");

        //make pay outs and reset values so next payout is correct
        _withdraw();
        _totalReleased = 0;
        for (i = 0; i < _payees.length; i++) {
            _released[_payees[i]] = 0;
        }

        //for each token
        for (j = 0; j < _tokenList.length; j++) {
            IERC20 token = _tokenList[j];
            _erc20TotalReleased[token] = 0;            
            for (i = 0; i < _payees.length; i++) {
                _erc20Released[token][_payees[i]] = 0;
            }
        }

        _totalShares = pendingTotal;
        _shares[account] = shares_;
    }

    // @dev add erc20 token address to the list
    function _addToken(address token) internal virtual {
        require(Address.isContract(token) == true, "PaymentSplitter: must be a contract");

        //test if token exists
        IERC20(token).balanceOf(address(this));

        //prevent duplicates as can be run after contract deployed
        uint tokenExists = 0;
        for (uint256 i = 0; i < _tokenList.length; i++) {
            if (_tokenList[i] == IERC20(token)) {
                tokenExists = 1;
            }
        }
        require(tokenExists == 0, "PaymentSplitter: token already added");

        _tokenList.push(IERC20(token));
    }

    // @dev show list of erc20 tokens added in payment splitter
    function showTokens() public view returns (IERC20[] memory) {
        return _tokenList;
    }

    // @dev show list of payees added in payment splitter
    function showPayees() public view returns (address[] memory) {
        return _payees;
    }

    // @dev releases payments for all payees for ETH and all tokens
    function _withdraw() internal virtual {
        //for each payee
        for (uint256 i = 0; i < _payees.length; i++) {

            //for each token
            for (uint256 j = 0; j < _tokenList.length; j++) {
                IERC20 token = _tokenList[j];
                _releaseToken(token, payable(_payees[i]));
            }

            _release(payable(_payees[i]));
        }
    }
}

File 15 of 17: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity 0.8.13;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 16 of 17: SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity 0.8.13;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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

pragma solidity 0.8.13;

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint16","name":"shares","type":"uint16"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"account","type":"address"},{"internalType":"uint16","name":"shares_","type":"uint16"}],"name":"addPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToken","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"mainCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"presaleSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address payable","name":"account","type":"address"}],"name":"releaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFreezeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFreezeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setMainCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setMainStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setPreCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_presale","type":"bool"}],"name":"setPresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16","name":"shares_","type":"uint16"}],"name":"setShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"showPayees","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"showTokens","outputs":[{"internalType":"contract IERC20[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleasedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405260446080818152906200535f60a03980516200002a9160149160209091019062001058565b5060036015819055670214e8348c4f00006016556702c68af0bb1400006017556089601855601a805463ffffffff191690556040805160608101825273f34ddaf8984e115700aef4efdc5cb1bec69785d3815273cc81ec04591f56a730e429795729d3bd6c21d877602082015273d8f9b770fe183463a1ecf45b72cbb8a460047cdb91810191909152620000c291601d9190620010e7565b5060408051606081018252600a8152601e60208201819052603c92820192909252620000f1919060036200113f565b50601d8054806020026020016040519081016040528092919081815260200182805480156200014a57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200012b575b5050505050601e805480602002602001604051908101604052809291908181526020018280548015620001c557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116200018b5790505b5050505050604051806040016040528060058152602001644475736b6f60d81b815250604051806040016040528060058152602001644455534b4f60d81b81525081600290805190602001906200021e92919062001058565b5080516200023490600390602084019062001058565b506001600055505060016008558051825114620002b35760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620003065760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620002aa565b60005b82518161ffff1610156200037e5762000369838261ffff1681518110620003345762000334620011fb565b6020026020010151838361ffff1681518110620003555762000355620011fb565b6020026020010151620003af60201b60201c565b80620003758162001227565b91505062000309565b5050506200039b62000395620006a560201b60201c565b620006a9565b620003a9306101f4620006fb565b620013dd565b600080620003c884620007fc60201b6200132b1760201c565b15620004175760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a206e6f20636f6e7472616374730000006044820152606401620002aa565b60008092505b600b548310156200047c57846001600160a01b0316600b8481548110620004485762000448620011fb565b6000918252602090912001546001600160a01b03160362000467575060015b8262000473816200124b565b9350506200041d565b806000036200069e5761ffff841615620005e6576200049a62000802565b6000600a81905592505b600b5483101562000505576000600e6000600b8681548110620004cb57620004cb620011fb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205582620004fc816200124b565b935050620004a4565b600091505b600c54821015620005e6576000600c83815481106200052d576200052d620011fb565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590945090505b600b54841015620005d0576001600160a01b0381166000908152601060205260408120600b805483919088908110620005965762000596620011fb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205583620005c7816200124b565b94505062000559565b5081620005dd816200124b565b9250506200050a565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0387169081179091556000908152600d6020526040902061ffff85169081905560095462000655919062001267565b600955604080516001600160a01b038716815261ffff861660208201527fefb20bd7b432b3f89ef344f5dd4dbc10c62729e41df4363592a810661c8c7ae4910160405180910390a15b5050505050565b3390565b601180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b03821611156200076b5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620002aa565b6001600160a01b038216620007c35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620002aa565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601255565b3b151590565b60005b600b54811015620008ed5760005b600c54811015620008a2576000600c8281548110620008365762000836620011fb565b9060005260206000200160009054906101000a90046001600160a01b031690506200088c81600b8581548110620008715762000871620011fb565b6000918252602090912001546001600160a01b0316620008f0565b508062000899816200124b565b91505062000813565b50620008d8600b8281548110620008bd57620008bd620011fb565b6000918252602090912001546001600160a01b031662000b80565b80620008e4816200124b565b91505062000805565b50565b6001600160a01b0382166000908152600f60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156200094e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000974919062001282565b62000980919062001267565b90506000620009c18383620009bb87836001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b62000c82565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a0823190602401602060405180830381865afa15801562000a09573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a2f919062001282565b81111562000aa5576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801562000a7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000aa2919062001282565b90505b801562000b7a576001600160a01b0380851660009081526010602090815260408083209387168352929052908120805483929062000ae590849062001267565b90915550506001600160a01b0384166000908152600f60205260408120805483929062000b1490849062001267565b9250508190555062000b3384848362000ce960201b62001de21760201c565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a25b50505050565b600062000b8c600a5490565b62000b98904762001267565b9050600062000bc28383620009bb826001600160a01b03166000908152600e602052604090205490565b90504781111562000bd05750475b801562000c7d576001600160a01b0383166000908152600e60205260408120805483929062000c0190849062001267565b9250508190555080600a600082825462000c1c919062001267565b9250508190555062000c3a838262000d4160201b62001e341760201c565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15b505050565b60008060095460000362000c995750600062000cdf565b6009546001600160a01b0386166000908152600d602052604090205484919062000cc490876200129c565b62000cd09190620012be565b62000cdc9190620012e1565b90505b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000c7d91859162000e6016565b8047101562000d935760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401620002aa565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811462000de2576040519150601f19603f3d011682016040523d82523d6000602084013e62000de7565b606091505b505090508062000c7d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401620002aa565b600062000ebc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000f3e60201b62001f4d179092919060201c565b80519091501562000c7d578080602001905181019062000edd9190620012fb565b62000c7d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620002aa565b606062000cdf848460008585843b62000f9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620002aa565b600080866001600160a01b0316858760405162000fb891906200134e565b60006040518083038185875af1925050503d806000811462000ff7576040519150601f19603f3d011682016040523d82523d6000602084013e62000ffc565b606091505b5090925090506200100f8282866200101a565b979650505050505050565b606083156200102b57508162000ce2565b8251156200103c5782518084602001fd5b8160405162461bcd60e51b8152600401620002aa91906200136c565b8280546200106690620013a1565b90600052602060002090601f0160209004810192826200108a5760008555620010d5565b82601f10620010a557805160ff1916838001178555620010d5565b82800160010185558215620010d5579182015b82811115620010d5578251825591602001919060010190620010b8565b50620010e3929150620011e4565b5090565b828054828255906000526020600020908101928215620010d5579160200282015b82811115620010d557825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062001108565b82805482825590600052602060002090600f01601090048101928215620010d55791602002820160005b83821115620011aa57835183826101000a81548161ffff021916908360ff160217905550926020019260020160208160010104928301926001030262001169565b8015620011da5782816101000a81549061ffff0219169055600201602081600101049283019260010302620011aa565b5050620010e39291505b5b80821115620010e35760008155600101620011e5565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681810362001241576200124162001211565b6001019392505050565b60006001820162001260576200126062001211565b5060010190565b600082198211156200127d576200127d62001211565b500190565b6000602082840312156200129557600080fd5b5051919050565b6000816000190483118215151615620012b957620012b962001211565b500290565b600082620012dc57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015620012f657620012f662001211565b500390565b6000602082840312156200130e57600080fd5b8151801515811462000ce257600080fd5b60005b838110156200133c57818101518382015260200162001322565b8381111562000b7a5750506000910152565b60008251620013628184602087016200131f565b9190910192915050565b60208152600082518060208401526200138d8160408501602087016200131f565b601f01601f19169190910160400192915050565b600181811c90821680620013b657607f821691505b602082108103620013d757634e487b7160e01b600052602260045260246000fd5b50919050565b613f7280620013ed6000396000f3fe6080604052600436106103905760003560e01c80637501f741116101dc578063b6374e3511610102578063ce7c2ac2116100a0578063e985e9c51161006f578063e985e9c514610ae8578063ea74fa2814610b31578063f2fde38b14610b51578063fdea8e0b14610b7157600080fd5b8063ce7c2ac214610a67578063d48bfca714610a9d578063d5abeb0114610abd578063e33b7de314610ad357600080fd5b8063bef432c6116100dc578063bef432c6146109ea578063c793803c14610a17578063c87b56dd14610a31578063cde27a3514610a5157600080fd5b8063b6374e3514610994578063b746033c146109aa578063b88d4fde146109ca57600080fd5b80638da5cb5b1161017a5780639ce8a55b116101495780639ce8a55b1461092b578063a0712d681461094b578063a22cb4651461095e578063b4c3b2131461097e57600080fd5b80638da5cb5b146108ad57806394ea82cd146108cb57806395d89b41146108e05780639852595c146108f557600080fd5b80637ec2402f116101b65780637ec2402f146108395780638516124b146108585780638895283f1461086d5780638b83209b1461088d57600080fd5b80637501f741146107e35780637705f9b5146107f9578063796a69961461081957600080fd5b80633018f54f116102c157806355f804b31161025f5780636f8b44b01161022e5780636f8b44b01461076e57806370a082311461078e578063715018a6146107ae578063732e71ef146107c357600080fd5b806355f804b3146106f957806360cfd359146107195780636352211e146107395780636c0360eb1461075957600080fd5b806342842e0e1161029b57806342842e0e146106535780634ac7ef12146106735780634f37cad814610693578063547520fe146106d957600080fd5b80633018f54f146106095780633a98ef39146106295780633ccfd60b1461063e57600080fd5b806312fb92e01161032e5780631916558711610308578063191655871461055457806323b872dd1461057457806324180d74146105945780632a55205a146105ca57600080fd5b806312fb92e0146104e657806313faede61461052157806318160ddd1461053657600080fd5b8063081812fc1161036a578063081812fc14610457578063095ea7b31461048f57806311164f54146104af57806311d4bc9a146104d157600080fd5b806301ffc9a7146103de57806304634d8d1461041357806306fdde031461043557600080fd5b366103d9577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103ea57600080fd5b506103fe6103f936600461378d565b610b92565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046137bf565b610ba3565b005b34801561044157600080fd5b5061044a610be4565b60405161040a919061385c565b34801561046357600080fd5b5061047761047236600461386f565b610c76565b6040516001600160a01b03909116815260200161040a565b34801561049b57600080fd5b506104336104aa366004613888565b610cba565b3480156104bb57600080fd5b506104c4610d47565b60405161040a91906138b4565b3480156104dd57600080fd5b50610433610da8565b3480156104f257600080fd5b50610513610501366004613901565b601b6020526000908152604090205481565b60405190815260200161040a565b34801561052d57600080fd5b50610513610de1565b34801561054257600080fd5b50610513600154600054036000190190565b34801561056057600080fd5b5061043361056f366004613901565b610e06565b34801561058057600080fd5b5061043361058f36600461391e565b610e5d565b3480156105a057600080fd5b506105136105af366004613901565b6001600160a01b03166000908152600f602052604090205490565b3480156105d657600080fd5b506105ea6105e536600461395f565b610e68565b604080516001600160a01b03909316835260208301919091520161040a565b34801561061557600080fd5b5061043361062436600461386f565b610f16565b34801561063557600080fd5b50600954610513565b34801561064a57600080fd5b50610433610f45565b34801561065f57600080fd5b5061043361066e36600461391e565b610f7b565b34801561067f57600080fd5b5061043361068e366004613981565b610f96565b34801561069f57600080fd5b506105136106ae3660046139b6565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b3480156106e557600080fd5b506104336106f436600461386f565b610fce565b34801561070557600080fd5b50610433610714366004613a70565b610ffd565b34801561072557600080fd5b50601a546103fe9062010000900460ff1681565b34801561074557600080fd5b5061047761075436600461386f565b611084565b34801561076557600080fd5b5061044a611096565b34801561077a57600080fd5b5061043361078936600461386f565b611124565b34801561079a57600080fd5b506105136107a9366004613901565b611226565b3480156107ba57600080fd5b50610433611275565b3480156107cf57600080fd5b506104336107de366004613afe565b6112ab565b3480156107ef57600080fd5b5061051360155481565b34801561080557600080fd5b50610433610814366004613afe565b611448565b34801561082557600080fd5b506104336108343660046139b6565b6115f0565b34801561084557600080fd5b50601a546103fe90610100900460ff1681565b34801561086457600080fd5b50610433611649565b34801561087957600080fd5b50610433610888366004613b78565b611684565b34801561089957600080fd5b506104776108a836600461386f565b6116cc565b3480156108b957600080fd5b506011546001600160a01b0316610477565b3480156108d757600080fd5b506104c46116fc565b3480156108ec57600080fd5b5061044a61175c565b34801561090157600080fd5b50610513610910366004613901565b6001600160a01b03166000908152600e602052604090205490565b34801561093757600080fd5b50610433610946366004613981565b61176b565b61043361095936600461386f565b61179f565b34801561096a57600080fd5b50610433610979366004613b95565b611b35565b34801561098a57600080fd5b5061051360175481565b3480156109a057600080fd5b5061051360165481565b3480156109b657600080fd5b506104336109c536600461386f565b611bca565b3480156109d657600080fd5b506104336109e5366004613bc3565b611bf9565b3480156109f657600080fd5b50610513610a05366004613901565b601c6020526000908152604090205481565b348015610a2357600080fd5b50601a546103fe9060ff1681565b348015610a3d57600080fd5b5061044a610a4c36600461386f565b611c4a565b348015610a5d57600080fd5b5061051360195481565b348015610a7357600080fd5b50610513610a82366004613901565b6001600160a01b03166000908152600d602052604090205490565b348015610aa957600080fd5b50610433610ab8366004613901565b611cce565b348015610ac957600080fd5b5061051360185481565b348015610adf57600080fd5b50600a54610513565b348015610af457600080fd5b506103fe610b033660046139b6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b3d57600080fd5b50610433610b4c366004613b78565b611d04565b348015610b5d57600080fd5b50610433610b6c366004613901565b611d4a565b348015610b7d57600080fd5b50601a546103fe906301000000900460ff1681565b6000610b9d82611f64565b92915050565b6011546001600160a01b03163314610bd65760405162461bcd60e51b8152600401610bcd90613c43565b60405180910390fd5b610be08282611f89565b5050565b606060028054610bf390613c78565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90613c78565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b5050505050905090565b6000610c8182612086565b610c9e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cc582611084565b9050806001600160a01b0316836001600160a01b031603610cf95760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d195750610d178133610b03565b155b15610d37576040516367d9dca160e11b815260040160405180910390fd5b610d428383836120bf565b505050565b6060600b805480602002602001604051908101604052809291908181526020018280548015610c6c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d81575050505050905090565b6011546001600160a01b03163314610dd25760405162461bcd60e51b8152600401610bcd90613c43565b601a805460ff19166001179055565b601a54600090819062010000900460ff16610dfe57505060165490565b505060175490565b600260085403610e285760405162461bcd60e51b8152600401610bcd90613cb2565b6002600855803b15610e4c5760405162461bcd60e51b8152600401610bcd90613ce9565b610e558161211b565b506001600855565b610d42838383612208565b60008281526013602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610edd5750604080518082019091526012546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610efc906001600160601b031687613d2c565b610f069190613d61565b91519350909150505b9250929050565b6011546001600160a01b03163314610f405760405162461bcd60e51b8152600401610bcd90613c43565b601655565b600260085403610f675760405162461bcd60e51b8152600401610bcd90613cb2565b6002600855610f746123f8565b6001600855565b610d4283838360405180602001604052806000815250611bf9565b6011546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610bcd90613c43565b610be0828261ffff166124ce565b6011546001600160a01b03163314610ff85760405162461bcd60e51b8152600401610bcd90613c43565b601555565b6011546001600160a01b031633146110275760405162461bcd60e51b8152600401610bcd90613c43565b601a5460ff16156110715760405162461bcd60e51b8152602060048201526014602482015273223ab9b5b79d103ab9349034b990333937bd32b760611b6044820152606401610bcd565b8051610be09060149060208401906136de565b600061108f8261279b565b5192915050565b601480546110a390613c78565b80601f01602080910402602001604051908101604052809291908181526020018280546110cf90613c78565b801561111c5780601f106110f15761010080835404028352916020019161111c565b820191906000526020600020905b8154815290600101906020018083116110ff57829003601f168201915b505050505081565b6011546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610bcd90613c43565b601a54610100900460ff16156111a65760405162461bcd60e51b815260206004820152601d60248201527f4475736b6f3a20546f74616c20737570706c79206973206c6f636b65640000006044820152606401610bcd565b6111b7600154600054036000190190565b8110156112215760405162461bcd60e51b815260206004820152603260248201527f4475736b6f3a204e6577206d6178696d756d2063616e2774206265206c657373604482015271081d1a185b881b5a5b9d19590818dbdd5b9d60721b6064820152608401610bcd565b601855565b60006001600160a01b03821661124f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6011546001600160a01b0316331461129f5760405162461bcd60e51b8152600401610bcd90613c43565b6112a960006128c4565b565b6011546001600160a01b031633146112d55760405162461bcd60e51b8152600401610bcd90613c43565b60008382146112f65760405162461bcd60e51b8152600401610bcd90613d75565b60005b848110156114405761133186868381811061131657611316613ddf565b905060200201602081019061132b9190613901565b3b151590565b1561134e5760405162461bcd60e51b8152600401610bcd90613ce9565b601b600087878481811061136457611364613ddf565b90506020020160208101906113799190613901565b6001600160a01b03166001600160a01b031681526020019081526020016000205491508383828181106113ae576113ae613ddf565b90506020020135601b60008888858181106113cb576113cb613ddf565b90506020020160208101906113e09190613901565b6001600160a01b031681526020810191909152604001600020558184848381811061140d5761140d613ddf565b905060200201356019546114219190613df5565b61142b9190613e0d565b6019558061143881613e24565b9150506112f9565b505050505050565b6011546001600160a01b031633146114725760405162461bcd60e51b8152600401610bcd90613c43565b6000808483146114945760405162461bcd60e51b8152600401610bcd90613d75565b5060005b8481101561150a576114b586868381811061131657611316613ddf565b156114d25760405162461bcd60e51b8152600401610bcd90613ce9565b8383828181106114e4576114e4613ddf565b90506020020135826114f69190613df5565b91508061150281613e24565b915050611498565b6018548261151f600154600054036000190190565b6115299190613df5565b111561158a5760405162461bcd60e51b815260206004820152602a60248201527f4475736b6f3a2043616e2774206d696e74206d6f7265207468616e20746865206044820152696d617820737570706c7960b01b6064820152608401610bcd565b5060005b82811015611440576115de8686838181106115ab576115ab613ddf565b90506020020160208101906115c09190613901565b8585848181106115d2576115d2613ddf565b90506020020135612916565b806115e881613e24565b91505061158e565b6002600854036116125760405162461bcd60e51b8152600401610bcd90613cb2565b6002600855803b156116365760405162461bcd60e51b8152600401610bcd90613ce9565b6116408282612930565b50506001600855565b6011546001600160a01b031633146116735760405162461bcd60e51b8152600401610bcd90613c43565b601a805461ff001916610100179055565b6011546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610bcd90613c43565b601a805491151563010000000263ff00000019909216919091179055565b6000600b82815481106116e1576116e1613ddf565b6000918252602090912001546001600160a01b031692915050565b6060600c805480602002602001604051908101604052809291908181526020018280548015610c6c576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d81575050505050905090565b606060038054610bf390613c78565b6011546001600160a01b031633146117955760405162461bcd60e51b8152600401610bcd90613c43565b610be08282612b98565b6002600854036117c15760405162461bcd60e51b8152600401610bcd90613cb2565b600260085560006117d9600154600054036000190190565b9050333b156117fa5760405162461bcd60e51b8152600401610bcd90613ce9565b601a5462010000900460ff168061181a5750601a546301000000900460ff165b6118665760405162461bcd60e51b815260206004820152601e60248201527f4475736b6f3a204d696e74696e67206e6f7420737461727465642079657400006044820152606401610bcd565b600082116118ab5760405162461bcd60e51b815260206004820152601260248201527104475736b6f3a2043616e74206d696e7420360741b6044820152606401610bcd565b6018546118b88383613df5565b11156119145760405162461bcd60e51b815260206004820152602560248201527f4475736b6f3a2043616e74206d696e74206d6f7265207468616e206d617820736044820152647570706c7960d81b6064820152608401610bcd565b8161191d610de1565b6119279190613d2c565b3410156119825760405162461bcd60e51b8152602060048201526024808201527f4475736b6f3a204d7573742073656e6420657468206f6620636f737420706572604482015263081b999d60e21b6064820152608401610bcd565b601a546301000000900460ff1680156119a45750601a5462010000900460ff16155b15611a8f57336000908152601b602052604090205480611a065760405162461bcd60e51b815260206004820152601860248201527f4475736b6f3a204e6f6e65206c65667420666f7220796f7500000000000000006044820152606401610bcd565b80831115611a695760405162461bcd60e51b815260206004820152602a60248201527f4475736b6f3a2043616e74206d696e74206d6f7265207468616e20796f75722060448201526930b63637b1b0ba34b7b760b11b6064820152608401610bcd565b336000908152601b602052604081208054859290611a88908490613e0d565b9091555050505b601554336000908152601c6020526040902054611aad908490613df5565b1115611b065760405162461bcd60e51b815260206004820152602260248201527f4475736b6f3a204d757374206d696e74206c657373207468616e20746865206d6044820152610c2f60f31b6064820152608401610bcd565b336000908152601c602052604081208054849290611b25908490613df5565b9091555061164090503383612916565b336001600160a01b03831603611b5e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6011546001600160a01b03163314611bf45760405162461bcd60e51b8152600401610bcd90613c43565b601755565b611c04848484612208565b6001600160a01b0383163b15158015611c265750611c2484848484612e54565b155b15611c44576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611c5582612086565b611c7257604051630a14c4b560e41b815260040160405180910390fd5b6000611c7c612f3f565b90508051600003611c9c5760405180602001604052806000815250611cc7565b80611ca684612f4e565b604051602001611cb7929190613e3d565b6040516020818303038152906040525b9392505050565b6011546001600160a01b03163314611cf85760405162461bcd60e51b8152600401610bcd90613c43565b611d018161304f565b50565b6011546001600160a01b03163314611d2e5760405162461bcd60e51b8152600401610bcd90613c43565b601a8054911515620100000262ff000019909216919091179055565b6011546001600160a01b03163314611d745760405162461bcd60e51b8152600401610bcd90613c43565b6001600160a01b038116611dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcd565b611d01816128c4565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d42908490613221565b80471015611e845760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bcd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ed1576040519150601f19603f3d011682016040523d82523d6000602084013e611ed6565b606091505b5050905080610d425760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bcd565b6060611f5c84846000856132f3565b949350505050565b60006001600160e01b0319821663152a902d60e11b1480610b9d5750610b9d8261341b565b6127106001600160601b0382161115611ff75760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610bcd565b6001600160a01b03821661204d5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610bcd565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601255565b60008160011115801561209a575060005482105b8015610b9d575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612126600a5490565b6121309047613df5565b9050600061215d8383612158866001600160a01b03166000908152600e602052604090205490565b61346b565b90504781111561216a5750475b8015610d42576001600160a01b0383166000908152600e602052604081208054839290612198908490613df5565b9250508190555080600a60008282546121b19190613df5565b909155506121c190508382611e34565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60006122138261279b565b9050836001600160a01b031681600001516001600160a01b03161461224a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061226857506122688533610b03565b8061228357503361227884610c76565b6001600160a01b0316145b9050806122a357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166122ca57604051633a954ecd60e21b815260040160405180910390fd5b6122d6600084876120bf565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166123ac5760005482146123ac578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60005b600b54811015611d015760005b600c5481101561248b576000600c828154811061242757612427613ddf565b9060005260206000200160009054906101000a90046001600160a01b0316905061247881600b858154811061245e5761245e613ddf565b6000918252602090912001546001600160a01b0316612930565b508061248381613e24565b915050612408565b506124bc600b82815481106124a2576124a2613ddf565b6000918252602090912001546001600160a01b031661211b565b806124c681613e24565b9150506123fb565b60008080805b600b5484101561252b57856001600160a01b0316600b85815481106124fb576124fb613ddf565b6000918252602090912001546001600160a01b031603612519575060015b8361252381613e24565b9450506124d4565b8060011461259a5760405162461bcd60e51b815260206004820152603660248201527f5061796d656e7453706c69747465723a20706179656520646f6573206e6f7420604482015275195e1a5cdd0b08185919081c185e595948199a5c9cdd60521b6064820152608401610bcd565b6001600160a01b0386166000908152600d602052604090205460095486916125c191613e0d565b6125cb9190613df5565b91506000821161263a5760405162461bcd60e51b815260206004820152603460248201527f5061796d656e7453706c69747465723a20746f74616c20736861726573206d75604482015273073742062652067726561746572207468616e20360641b6064820152608401610bcd565b6126426123f8565b6000600a81905593505b600b548410156126a6576000600e6000600b878154811061266f5761266f613ddf565b60009182526020808320909101546001600160a01b031683528201929092526040019020558361269e81613e24565b94505061264c565b600092505b600c54831015612779576000600c84815481106126ca576126ca613ddf565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590955090505b600b54851015612766576001600160a01b0381166000908152601060205260408120600b80548391908990811061272f5761272f613ddf565b60009182526020808320909101546001600160a01b031683528201929092526040019020558461275e81613e24565b9550506126f6565b508261277181613e24565b9350506126ab565b5060095550506001600160a01b039091166000908152600d6020526040902055565b604080516060810182526000808252602082018190529181019190915281806001111580156127cb575060005481105b156128ab57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906128a95780516001600160a01b03161561283f579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff16151592810192909252156128a4579392505050565b61283f565b505b604051636f96cda160e11b815260040160405180910390fd5b601180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610be08282604051806020016040528060008152506134c6565b6001600160a01b0382166000908152600f60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613e7c565b6129bb9190613df5565b905060006129f4838361215887876001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a0823190602401602060405180830381865afa158015612a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5f9190613e7c565b811115612ad1576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ace9190613e7c565b90505b8015611c44576001600160a01b03808516600090815260106020908152604080832093871683529290529081208054839290612b0e908490613df5565b90915550506001600160a01b0384166000908152600f602052604081208054839290612b3b908490613df5565b90915550612b4c9050848483611de2565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600080833b15612bea5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a206e6f20636f6e7472616374730000006044820152606401610bcd565b60008092505b600b54831015612c4757846001600160a01b0316600b8481548110612c1757612c17613ddf565b6000918252602090912001546001600160a01b031603612c35575060015b82612c3f81613e24565b935050612bf0565b806000036123f15761ffff841615612d9857612c616123f8565b6000600a81905592505b600b54831015612cc5576000600e6000600b8681548110612c8e57612c8e613ddf565b60009182526020808320909101546001600160a01b0316835282019290925260400190205582612cbd81613e24565b935050612c6b565b600091505b600c54821015612d98576000600c8381548110612ce957612ce9613ddf565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590945090505b600b54841015612d85576001600160a01b0381166000908152601060205260408120600b805483919088908110612d4e57612d4e613ddf565b60009182526020808320909101546001600160a01b0316835282019290925260400190205583612d7d81613e24565b945050612d15565b5081612d9081613e24565b925050612cca565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0387169081179091556000908152600d6020526040902061ffff851690819055600954612e059190613df5565b600955604080516001600160a01b038716815261ffff861660208201527fefb20bd7b432b3f89ef344f5dd4dbc10c62729e41df4363592a810661c8c7ae4910160405180910390a15050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612e89903390899088908890600401613e95565b6020604051808303816000875af1925050508015612ec4575060408051601f3d908101601f19168201909252612ec191810190613ed2565b60015b612f22573d808015612ef2576040519150601f19603f3d011682016040523d82523d6000602084013e612ef7565b606091505b508051600003612f1a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060148054610bf390613c78565b606081600003612f755750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f9f5780612f8981613e24565b9150612f989050600a83613d61565b9150612f79565b60008167ffffffffffffffff811115612fba57612fba6139e4565b6040519080825280601f01601f191660200182016040528015612fe4576020820181803683370190505b5090505b8415611f5c57612ff9600183613e0d565b9150613006600a86613eef565b613011906030613df5565b60f81b81838151811061302657613026613ddf565b60200101906001600160f81b031916908160001a905350613048600a86613d61565b9450612fe8565b6001813b1515146130ae5760405162461bcd60e51b815260206004820152602360248201527f5061796d656e7453706c69747465723a206d757374206265206120636f6e74726044820152621858dd60ea1b6064820152608401610bcd565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa1580156130f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131169190613e7c565b506000805b600c5481101561317357826001600160a01b0316600c828154811061314257613142613ddf565b6000918252602090912001546001600160a01b03160361316157600191505b8061316b81613e24565b91505061311b565b5080156131ce5760405162461bcd60e51b8152602060048201526024808201527f5061796d656e7453706c69747465723a20746f6b656e20616c726561647920616044820152631919195960e21b6064820152608401610bcd565b50600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b6000613276826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f4d9092919063ffffffff16565b805190915015610d4257808060200190518101906132949190613f03565b610d425760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bcd565b6060824710156133545760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bcd565b843b6133a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bcd565b600080866001600160a01b031685876040516133be9190613f20565b60006040518083038185875af1925050503d80600081146133fb576040519150601f19603f3d011682016040523d82523d6000602084013e613400565b606091505b50915091506134108282866134d3565b979650505050505050565b60006001600160e01b031982166380ac58cd60e01b148061344c57506001600160e01b03198216635b5e139f60e01b145b80610b9d57506301ffc9a760e01b6001600160e01b0319831614610b9d565b60008060095460000361348057506000611f5c565b6009546001600160a01b0386166000908152600d60205260409020548491906134a99087613d2c565b6134b39190613d61565b6134bd9190613e0d565b95945050505050565b610d42838383600161350c565b606083156134e2575081611cc7565b8251156134f25782518084602001fd5b8160405162461bcd60e51b8152600401610bcd919061385c565b6000546001600160a01b03851661353557604051622e076360e81b815260040160405180910390fd5b836000036135565760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561360857506001600160a01b0387163b15155b15613690575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46136596000888480600101955088612e54565b613676576040516368d2bf6b60e11b815260040160405180910390fd5b80820361360e57826000541461368b57600080fd5b6136d5565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613691575b506000556123f1565b8280546136ea90613c78565b90600052602060002090601f01602090048101928261370c5760008555613752565b82601f1061372557805160ff1916838001178555613752565b82800160010185558215613752579182015b82811115613752578251825591602001919060010190613737565b5061375e929150613762565b5090565b5b8082111561375e5760008155600101613763565b6001600160e01b031981168114611d0157600080fd5b60006020828403121561379f57600080fd5b8135611cc781613777565b6001600160a01b0381168114611d0157600080fd5b600080604083850312156137d257600080fd5b82356137dd816137aa565b915060208301356001600160601b03811681146137f957600080fd5b809150509250929050565b60005b8381101561381f578181015183820152602001613807565b83811115611c445750506000910152565b60008151808452613848816020860160208601613804565b601f01601f19169290920160200192915050565b602081526000611cc76020830184613830565b60006020828403121561388157600080fd5b5035919050565b6000806040838503121561389b57600080fd5b82356138a6816137aa565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156138f55783516001600160a01b0316835292840192918401916001016138d0565b50909695505050505050565b60006020828403121561391357600080fd5b8135611cc7816137aa565b60008060006060848603121561393357600080fd5b833561393e816137aa565b9250602084013561394e816137aa565b929592945050506040919091013590565b6000806040838503121561397257600080fd5b50508035926020909101359150565b6000806040838503121561399457600080fd5b823561399f816137aa565b9150602083013561ffff811681146137f957600080fd5b600080604083850312156139c957600080fd5b82356139d4816137aa565b915060208301356137f9816137aa565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613a1557613a156139e4565b604051601f8501601f19908116603f01168101908282118183101715613a3d57613a3d6139e4565b81604052809350858152868686011115613a5657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a8257600080fd5b813567ffffffffffffffff811115613a9957600080fd5b8201601f81018413613aaa57600080fd5b611f5c848235602084016139fa565b60008083601f840112613acb57600080fd5b50813567ffffffffffffffff811115613ae357600080fd5b6020830191508360208260051b8501011115610f0f57600080fd5b60008060008060408587031215613b1457600080fd5b843567ffffffffffffffff80821115613b2c57600080fd5b613b3888838901613ab9565b90965094506020870135915080821115613b5157600080fd5b50613b5e87828801613ab9565b95989497509550505050565b8015158114611d0157600080fd5b600060208284031215613b8a57600080fd5b8135611cc781613b6a565b60008060408385031215613ba857600080fd5b8235613bb3816137aa565b915060208301356137f981613b6a565b60008060008060808587031215613bd957600080fd5b8435613be4816137aa565b93506020850135613bf4816137aa565b925060408501359150606085013567ffffffffffffffff811115613c1757600080fd5b8501601f81018713613c2857600080fd5b613c37878235602084016139fa565b91505092959194509250565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613c8c57607f821691505b602082108103613cac57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601390820152724475736b6f3a206e6f20636f6e74726163747360681b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613d4657613d46613d16565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613d7057613d70613d4b565b500490565b60208082526044908201527f4475736b6f3a20546865206e756d626572206f6620616464726573736573206960408201527f73206e6f74206d61746368696e6720746865206e756d626572206f6620616d6f606082015263756e747360e01b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60008219821115613e0857613e08613d16565b500190565b600082821015613e1f57613e1f613d16565b500390565b600060018201613e3657613e36613d16565b5060010190565b60008351613e4f818460208801613804565b835190830190613e63818360208801613804565b64173539b7b760d91b9101908152600501949350505050565b600060208284031215613e8e57600080fd5b5051919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ec890830184613830565b9695505050505050565b600060208284031215613ee457600080fd5b8151611cc781613777565b600082613efe57613efe613d4b565b500690565b600060208284031215613f1557600080fd5b8151611cc781613b6a565b60008251613f32818460208701613804565b919091019291505056fea26469706673582212200a8bd03817018bc4afc24209e435eef3f5c73469fd39a0dd2c35f4c8236b648a64736f6c634300080d003368747470733a2f2f697066732e696f2f697066732f516d546d756f7a4e546542436f53644b69416f337a576f35316d59363272504c79715153656133515169543562522f

Deployed Bytecode

0x6080604052600436106103905760003560e01c80637501f741116101dc578063b6374e3511610102578063ce7c2ac2116100a0578063e985e9c51161006f578063e985e9c514610ae8578063ea74fa2814610b31578063f2fde38b14610b51578063fdea8e0b14610b7157600080fd5b8063ce7c2ac214610a67578063d48bfca714610a9d578063d5abeb0114610abd578063e33b7de314610ad357600080fd5b8063bef432c6116100dc578063bef432c6146109ea578063c793803c14610a17578063c87b56dd14610a31578063cde27a3514610a5157600080fd5b8063b6374e3514610994578063b746033c146109aa578063b88d4fde146109ca57600080fd5b80638da5cb5b1161017a5780639ce8a55b116101495780639ce8a55b1461092b578063a0712d681461094b578063a22cb4651461095e578063b4c3b2131461097e57600080fd5b80638da5cb5b146108ad57806394ea82cd146108cb57806395d89b41146108e05780639852595c146108f557600080fd5b80637ec2402f116101b65780637ec2402f146108395780638516124b146108585780638895283f1461086d5780638b83209b1461088d57600080fd5b80637501f741146107e35780637705f9b5146107f9578063796a69961461081957600080fd5b80633018f54f116102c157806355f804b31161025f5780636f8b44b01161022e5780636f8b44b01461076e57806370a082311461078e578063715018a6146107ae578063732e71ef146107c357600080fd5b806355f804b3146106f957806360cfd359146107195780636352211e146107395780636c0360eb1461075957600080fd5b806342842e0e1161029b57806342842e0e146106535780634ac7ef12146106735780634f37cad814610693578063547520fe146106d957600080fd5b80633018f54f146106095780633a98ef39146106295780633ccfd60b1461063e57600080fd5b806312fb92e01161032e5780631916558711610308578063191655871461055457806323b872dd1461057457806324180d74146105945780632a55205a146105ca57600080fd5b806312fb92e0146104e657806313faede61461052157806318160ddd1461053657600080fd5b8063081812fc1161036a578063081812fc14610457578063095ea7b31461048f57806311164f54146104af57806311d4bc9a146104d157600080fd5b806301ffc9a7146103de57806304634d8d1461041357806306fdde031461043557600080fd5b366103d9577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103ea57600080fd5b506103fe6103f936600461378d565b610b92565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046137bf565b610ba3565b005b34801561044157600080fd5b5061044a610be4565b60405161040a919061385c565b34801561046357600080fd5b5061047761047236600461386f565b610c76565b6040516001600160a01b03909116815260200161040a565b34801561049b57600080fd5b506104336104aa366004613888565b610cba565b3480156104bb57600080fd5b506104c4610d47565b60405161040a91906138b4565b3480156104dd57600080fd5b50610433610da8565b3480156104f257600080fd5b50610513610501366004613901565b601b6020526000908152604090205481565b60405190815260200161040a565b34801561052d57600080fd5b50610513610de1565b34801561054257600080fd5b50610513600154600054036000190190565b34801561056057600080fd5b5061043361056f366004613901565b610e06565b34801561058057600080fd5b5061043361058f36600461391e565b610e5d565b3480156105a057600080fd5b506105136105af366004613901565b6001600160a01b03166000908152600f602052604090205490565b3480156105d657600080fd5b506105ea6105e536600461395f565b610e68565b604080516001600160a01b03909316835260208301919091520161040a565b34801561061557600080fd5b5061043361062436600461386f565b610f16565b34801561063557600080fd5b50600954610513565b34801561064a57600080fd5b50610433610f45565b34801561065f57600080fd5b5061043361066e36600461391e565b610f7b565b34801561067f57600080fd5b5061043361068e366004613981565b610f96565b34801561069f57600080fd5b506105136106ae3660046139b6565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b3480156106e557600080fd5b506104336106f436600461386f565b610fce565b34801561070557600080fd5b50610433610714366004613a70565b610ffd565b34801561072557600080fd5b50601a546103fe9062010000900460ff1681565b34801561074557600080fd5b5061047761075436600461386f565b611084565b34801561076557600080fd5b5061044a611096565b34801561077a57600080fd5b5061043361078936600461386f565b611124565b34801561079a57600080fd5b506105136107a9366004613901565b611226565b3480156107ba57600080fd5b50610433611275565b3480156107cf57600080fd5b506104336107de366004613afe565b6112ab565b3480156107ef57600080fd5b5061051360155481565b34801561080557600080fd5b50610433610814366004613afe565b611448565b34801561082557600080fd5b506104336108343660046139b6565b6115f0565b34801561084557600080fd5b50601a546103fe90610100900460ff1681565b34801561086457600080fd5b50610433611649565b34801561087957600080fd5b50610433610888366004613b78565b611684565b34801561089957600080fd5b506104776108a836600461386f565b6116cc565b3480156108b957600080fd5b506011546001600160a01b0316610477565b3480156108d757600080fd5b506104c46116fc565b3480156108ec57600080fd5b5061044a61175c565b34801561090157600080fd5b50610513610910366004613901565b6001600160a01b03166000908152600e602052604090205490565b34801561093757600080fd5b50610433610946366004613981565b61176b565b61043361095936600461386f565b61179f565b34801561096a57600080fd5b50610433610979366004613b95565b611b35565b34801561098a57600080fd5b5061051360175481565b3480156109a057600080fd5b5061051360165481565b3480156109b657600080fd5b506104336109c536600461386f565b611bca565b3480156109d657600080fd5b506104336109e5366004613bc3565b611bf9565b3480156109f657600080fd5b50610513610a05366004613901565b601c6020526000908152604090205481565b348015610a2357600080fd5b50601a546103fe9060ff1681565b348015610a3d57600080fd5b5061044a610a4c36600461386f565b611c4a565b348015610a5d57600080fd5b5061051360195481565b348015610a7357600080fd5b50610513610a82366004613901565b6001600160a01b03166000908152600d602052604090205490565b348015610aa957600080fd5b50610433610ab8366004613901565b611cce565b348015610ac957600080fd5b5061051360185481565b348015610adf57600080fd5b50600a54610513565b348015610af457600080fd5b506103fe610b033660046139b6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b3d57600080fd5b50610433610b4c366004613b78565b611d04565b348015610b5d57600080fd5b50610433610b6c366004613901565b611d4a565b348015610b7d57600080fd5b50601a546103fe906301000000900460ff1681565b6000610b9d82611f64565b92915050565b6011546001600160a01b03163314610bd65760405162461bcd60e51b8152600401610bcd90613c43565b60405180910390fd5b610be08282611f89565b5050565b606060028054610bf390613c78565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90613c78565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b5050505050905090565b6000610c8182612086565b610c9e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cc582611084565b9050806001600160a01b0316836001600160a01b031603610cf95760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610d195750610d178133610b03565b155b15610d37576040516367d9dca160e11b815260040160405180910390fd5b610d428383836120bf565b505050565b6060600b805480602002602001604051908101604052809291908181526020018280548015610c6c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d81575050505050905090565b6011546001600160a01b03163314610dd25760405162461bcd60e51b8152600401610bcd90613c43565b601a805460ff19166001179055565b601a54600090819062010000900460ff16610dfe57505060165490565b505060175490565b600260085403610e285760405162461bcd60e51b8152600401610bcd90613cb2565b6002600855803b15610e4c5760405162461bcd60e51b8152600401610bcd90613ce9565b610e558161211b565b506001600855565b610d42838383612208565b60008281526013602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610edd5750604080518082019091526012546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610efc906001600160601b031687613d2c565b610f069190613d61565b91519350909150505b9250929050565b6011546001600160a01b03163314610f405760405162461bcd60e51b8152600401610bcd90613c43565b601655565b600260085403610f675760405162461bcd60e51b8152600401610bcd90613cb2565b6002600855610f746123f8565b6001600855565b610d4283838360405180602001604052806000815250611bf9565b6011546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610bcd90613c43565b610be0828261ffff166124ce565b6011546001600160a01b03163314610ff85760405162461bcd60e51b8152600401610bcd90613c43565b601555565b6011546001600160a01b031633146110275760405162461bcd60e51b8152600401610bcd90613c43565b601a5460ff16156110715760405162461bcd60e51b8152602060048201526014602482015273223ab9b5b79d103ab9349034b990333937bd32b760611b6044820152606401610bcd565b8051610be09060149060208401906136de565b600061108f8261279b565b5192915050565b601480546110a390613c78565b80601f01602080910402602001604051908101604052809291908181526020018280546110cf90613c78565b801561111c5780601f106110f15761010080835404028352916020019161111c565b820191906000526020600020905b8154815290600101906020018083116110ff57829003601f168201915b505050505081565b6011546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610bcd90613c43565b601a54610100900460ff16156111a65760405162461bcd60e51b815260206004820152601d60248201527f4475736b6f3a20546f74616c20737570706c79206973206c6f636b65640000006044820152606401610bcd565b6111b7600154600054036000190190565b8110156112215760405162461bcd60e51b815260206004820152603260248201527f4475736b6f3a204e6577206d6178696d756d2063616e2774206265206c657373604482015271081d1a185b881b5a5b9d19590818dbdd5b9d60721b6064820152608401610bcd565b601855565b60006001600160a01b03821661124f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6011546001600160a01b0316331461129f5760405162461bcd60e51b8152600401610bcd90613c43565b6112a960006128c4565b565b6011546001600160a01b031633146112d55760405162461bcd60e51b8152600401610bcd90613c43565b60008382146112f65760405162461bcd60e51b8152600401610bcd90613d75565b60005b848110156114405761133186868381811061131657611316613ddf565b905060200201602081019061132b9190613901565b3b151590565b1561134e5760405162461bcd60e51b8152600401610bcd90613ce9565b601b600087878481811061136457611364613ddf565b90506020020160208101906113799190613901565b6001600160a01b03166001600160a01b031681526020019081526020016000205491508383828181106113ae576113ae613ddf565b90506020020135601b60008888858181106113cb576113cb613ddf565b90506020020160208101906113e09190613901565b6001600160a01b031681526020810191909152604001600020558184848381811061140d5761140d613ddf565b905060200201356019546114219190613df5565b61142b9190613e0d565b6019558061143881613e24565b9150506112f9565b505050505050565b6011546001600160a01b031633146114725760405162461bcd60e51b8152600401610bcd90613c43565b6000808483146114945760405162461bcd60e51b8152600401610bcd90613d75565b5060005b8481101561150a576114b586868381811061131657611316613ddf565b156114d25760405162461bcd60e51b8152600401610bcd90613ce9565b8383828181106114e4576114e4613ddf565b90506020020135826114f69190613df5565b91508061150281613e24565b915050611498565b6018548261151f600154600054036000190190565b6115299190613df5565b111561158a5760405162461bcd60e51b815260206004820152602a60248201527f4475736b6f3a2043616e2774206d696e74206d6f7265207468616e20746865206044820152696d617820737570706c7960b01b6064820152608401610bcd565b5060005b82811015611440576115de8686838181106115ab576115ab613ddf565b90506020020160208101906115c09190613901565b8585848181106115d2576115d2613ddf565b90506020020135612916565b806115e881613e24565b91505061158e565b6002600854036116125760405162461bcd60e51b8152600401610bcd90613cb2565b6002600855803b156116365760405162461bcd60e51b8152600401610bcd90613ce9565b6116408282612930565b50506001600855565b6011546001600160a01b031633146116735760405162461bcd60e51b8152600401610bcd90613c43565b601a805461ff001916610100179055565b6011546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610bcd90613c43565b601a805491151563010000000263ff00000019909216919091179055565b6000600b82815481106116e1576116e1613ddf565b6000918252602090912001546001600160a01b031692915050565b6060600c805480602002602001604051908101604052809291908181526020018280548015610c6c576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d81575050505050905090565b606060038054610bf390613c78565b6011546001600160a01b031633146117955760405162461bcd60e51b8152600401610bcd90613c43565b610be08282612b98565b6002600854036117c15760405162461bcd60e51b8152600401610bcd90613cb2565b600260085560006117d9600154600054036000190190565b9050333b156117fa5760405162461bcd60e51b8152600401610bcd90613ce9565b601a5462010000900460ff168061181a5750601a546301000000900460ff165b6118665760405162461bcd60e51b815260206004820152601e60248201527f4475736b6f3a204d696e74696e67206e6f7420737461727465642079657400006044820152606401610bcd565b600082116118ab5760405162461bcd60e51b815260206004820152601260248201527104475736b6f3a2043616e74206d696e7420360741b6044820152606401610bcd565b6018546118b88383613df5565b11156119145760405162461bcd60e51b815260206004820152602560248201527f4475736b6f3a2043616e74206d696e74206d6f7265207468616e206d617820736044820152647570706c7960d81b6064820152608401610bcd565b8161191d610de1565b6119279190613d2c565b3410156119825760405162461bcd60e51b8152602060048201526024808201527f4475736b6f3a204d7573742073656e6420657468206f6620636f737420706572604482015263081b999d60e21b6064820152608401610bcd565b601a546301000000900460ff1680156119a45750601a5462010000900460ff16155b15611a8f57336000908152601b602052604090205480611a065760405162461bcd60e51b815260206004820152601860248201527f4475736b6f3a204e6f6e65206c65667420666f7220796f7500000000000000006044820152606401610bcd565b80831115611a695760405162461bcd60e51b815260206004820152602a60248201527f4475736b6f3a2043616e74206d696e74206d6f7265207468616e20796f75722060448201526930b63637b1b0ba34b7b760b11b6064820152608401610bcd565b336000908152601b602052604081208054859290611a88908490613e0d565b9091555050505b601554336000908152601c6020526040902054611aad908490613df5565b1115611b065760405162461bcd60e51b815260206004820152602260248201527f4475736b6f3a204d757374206d696e74206c657373207468616e20746865206d6044820152610c2f60f31b6064820152608401610bcd565b336000908152601c602052604081208054849290611b25908490613df5565b9091555061164090503383612916565b336001600160a01b03831603611b5e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6011546001600160a01b03163314611bf45760405162461bcd60e51b8152600401610bcd90613c43565b601755565b611c04848484612208565b6001600160a01b0383163b15158015611c265750611c2484848484612e54565b155b15611c44576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611c5582612086565b611c7257604051630a14c4b560e41b815260040160405180910390fd5b6000611c7c612f3f565b90508051600003611c9c5760405180602001604052806000815250611cc7565b80611ca684612f4e565b604051602001611cb7929190613e3d565b6040516020818303038152906040525b9392505050565b6011546001600160a01b03163314611cf85760405162461bcd60e51b8152600401610bcd90613c43565b611d018161304f565b50565b6011546001600160a01b03163314611d2e5760405162461bcd60e51b8152600401610bcd90613c43565b601a8054911515620100000262ff000019909216919091179055565b6011546001600160a01b03163314611d745760405162461bcd60e51b8152600401610bcd90613c43565b6001600160a01b038116611dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcd565b611d01816128c4565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d42908490613221565b80471015611e845760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bcd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ed1576040519150601f19603f3d011682016040523d82523d6000602084013e611ed6565b606091505b5050905080610d425760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bcd565b6060611f5c84846000856132f3565b949350505050565b60006001600160e01b0319821663152a902d60e11b1480610b9d5750610b9d8261341b565b6127106001600160601b0382161115611ff75760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610bcd565b6001600160a01b03821661204d5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610bcd565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601255565b60008160011115801561209a575060005482105b8015610b9d575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612126600a5490565b6121309047613df5565b9050600061215d8383612158866001600160a01b03166000908152600e602052604090205490565b61346b565b90504781111561216a5750475b8015610d42576001600160a01b0383166000908152600e602052604081208054839290612198908490613df5565b9250508190555080600a60008282546121b19190613df5565b909155506121c190508382611e34565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60006122138261279b565b9050836001600160a01b031681600001516001600160a01b03161461224a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061226857506122688533610b03565b8061228357503361227884610c76565b6001600160a01b0316145b9050806122a357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166122ca57604051633a954ecd60e21b815260040160405180910390fd5b6122d6600084876120bf565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166123ac5760005482146123ac578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60005b600b54811015611d015760005b600c5481101561248b576000600c828154811061242757612427613ddf565b9060005260206000200160009054906101000a90046001600160a01b0316905061247881600b858154811061245e5761245e613ddf565b6000918252602090912001546001600160a01b0316612930565b508061248381613e24565b915050612408565b506124bc600b82815481106124a2576124a2613ddf565b6000918252602090912001546001600160a01b031661211b565b806124c681613e24565b9150506123fb565b60008080805b600b5484101561252b57856001600160a01b0316600b85815481106124fb576124fb613ddf565b6000918252602090912001546001600160a01b031603612519575060015b8361252381613e24565b9450506124d4565b8060011461259a5760405162461bcd60e51b815260206004820152603660248201527f5061796d656e7453706c69747465723a20706179656520646f6573206e6f7420604482015275195e1a5cdd0b08185919081c185e595948199a5c9cdd60521b6064820152608401610bcd565b6001600160a01b0386166000908152600d602052604090205460095486916125c191613e0d565b6125cb9190613df5565b91506000821161263a5760405162461bcd60e51b815260206004820152603460248201527f5061796d656e7453706c69747465723a20746f74616c20736861726573206d75604482015273073742062652067726561746572207468616e20360641b6064820152608401610bcd565b6126426123f8565b6000600a81905593505b600b548410156126a6576000600e6000600b878154811061266f5761266f613ddf565b60009182526020808320909101546001600160a01b031683528201929092526040019020558361269e81613e24565b94505061264c565b600092505b600c54831015612779576000600c84815481106126ca576126ca613ddf565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590955090505b600b54851015612766576001600160a01b0381166000908152601060205260408120600b80548391908990811061272f5761272f613ddf565b60009182526020808320909101546001600160a01b031683528201929092526040019020558461275e81613e24565b9550506126f6565b508261277181613e24565b9350506126ab565b5060095550506001600160a01b039091166000908152600d6020526040902055565b604080516060810182526000808252602082018190529181019190915281806001111580156127cb575060005481105b156128ab57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906128a95780516001600160a01b03161561283f579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff16151592810192909252156128a4579392505050565b61283f565b505b604051636f96cda160e11b815260040160405180910390fd5b601180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610be08282604051806020016040528060008152506134c6565b6001600160a01b0382166000908152600f60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613e7c565b6129bb9190613df5565b905060006129f4838361215887876001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a0823190602401602060405180830381865afa158015612a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a5f9190613e7c565b811115612ad1576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ace9190613e7c565b90505b8015611c44576001600160a01b03808516600090815260106020908152604080832093871683529290529081208054839290612b0e908490613df5565b90915550506001600160a01b0384166000908152600f602052604081208054839290612b3b908490613df5565b90915550612b4c9050848483611de2565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600080833b15612bea5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a206e6f20636f6e7472616374730000006044820152606401610bcd565b60008092505b600b54831015612c4757846001600160a01b0316600b8481548110612c1757612c17613ddf565b6000918252602090912001546001600160a01b031603612c35575060015b82612c3f81613e24565b935050612bf0565b806000036123f15761ffff841615612d9857612c616123f8565b6000600a81905592505b600b54831015612cc5576000600e6000600b8681548110612c8e57612c8e613ddf565b60009182526020808320909101546001600160a01b0316835282019290925260400190205582612cbd81613e24565b935050612c6b565b600091505b600c54821015612d98576000600c8381548110612ce957612ce9613ddf565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590945090505b600b54841015612d85576001600160a01b0381166000908152601060205260408120600b805483919088908110612d4e57612d4e613ddf565b60009182526020808320909101546001600160a01b0316835282019290925260400190205583612d7d81613e24565b945050612d15565b5081612d9081613e24565b925050612cca565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0387169081179091556000908152600d6020526040902061ffff851690819055600954612e059190613df5565b600955604080516001600160a01b038716815261ffff861660208201527fefb20bd7b432b3f89ef344f5dd4dbc10c62729e41df4363592a810661c8c7ae4910160405180910390a15050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612e89903390899088908890600401613e95565b6020604051808303816000875af1925050508015612ec4575060408051601f3d908101601f19168201909252612ec191810190613ed2565b60015b612f22573d808015612ef2576040519150601f19603f3d011682016040523d82523d6000602084013e612ef7565b606091505b508051600003612f1a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060148054610bf390613c78565b606081600003612f755750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f9f5780612f8981613e24565b9150612f989050600a83613d61565b9150612f79565b60008167ffffffffffffffff811115612fba57612fba6139e4565b6040519080825280601f01601f191660200182016040528015612fe4576020820181803683370190505b5090505b8415611f5c57612ff9600183613e0d565b9150613006600a86613eef565b613011906030613df5565b60f81b81838151811061302657613026613ddf565b60200101906001600160f81b031916908160001a905350613048600a86613d61565b9450612fe8565b6001813b1515146130ae5760405162461bcd60e51b815260206004820152602360248201527f5061796d656e7453706c69747465723a206d757374206265206120636f6e74726044820152621858dd60ea1b6064820152608401610bcd565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa1580156130f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131169190613e7c565b506000805b600c5481101561317357826001600160a01b0316600c828154811061314257613142613ddf565b6000918252602090912001546001600160a01b03160361316157600191505b8061316b81613e24565b91505061311b565b5080156131ce5760405162461bcd60e51b8152602060048201526024808201527f5061796d656e7453706c69747465723a20746f6b656e20616c726561647920616044820152631919195960e21b6064820152608401610bcd565b50600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b6000613276826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f4d9092919063ffffffff16565b805190915015610d4257808060200190518101906132949190613f03565b610d425760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bcd565b6060824710156133545760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bcd565b843b6133a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bcd565b600080866001600160a01b031685876040516133be9190613f20565b60006040518083038185875af1925050503d80600081146133fb576040519150601f19603f3d011682016040523d82523d6000602084013e613400565b606091505b50915091506134108282866134d3565b979650505050505050565b60006001600160e01b031982166380ac58cd60e01b148061344c57506001600160e01b03198216635b5e139f60e01b145b80610b9d57506301ffc9a760e01b6001600160e01b0319831614610b9d565b60008060095460000361348057506000611f5c565b6009546001600160a01b0386166000908152600d60205260409020548491906134a99087613d2c565b6134b39190613d61565b6134bd9190613e0d565b95945050505050565b610d42838383600161350c565b606083156134e2575081611cc7565b8251156134f25782518084602001fd5b8160405162461bcd60e51b8152600401610bcd919061385c565b6000546001600160a01b03851661353557604051622e076360e81b815260040160405180910390fd5b836000036135565760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561360857506001600160a01b0387163b15155b15613690575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46136596000888480600101955088612e54565b613676576040516368d2bf6b60e11b815260040160405180910390fd5b80820361360e57826000541461368b57600080fd5b6136d5565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613691575b506000556123f1565b8280546136ea90613c78565b90600052602060002090601f01602090048101928261370c5760008555613752565b82601f1061372557805160ff1916838001178555613752565b82800160010185558215613752579182015b82811115613752578251825591602001919060010190613737565b5061375e929150613762565b5090565b5b8082111561375e5760008155600101613763565b6001600160e01b031981168114611d0157600080fd5b60006020828403121561379f57600080fd5b8135611cc781613777565b6001600160a01b0381168114611d0157600080fd5b600080604083850312156137d257600080fd5b82356137dd816137aa565b915060208301356001600160601b03811681146137f957600080fd5b809150509250929050565b60005b8381101561381f578181015183820152602001613807565b83811115611c445750506000910152565b60008151808452613848816020860160208601613804565b601f01601f19169290920160200192915050565b602081526000611cc76020830184613830565b60006020828403121561388157600080fd5b5035919050565b6000806040838503121561389b57600080fd5b82356138a6816137aa565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156138f55783516001600160a01b0316835292840192918401916001016138d0565b50909695505050505050565b60006020828403121561391357600080fd5b8135611cc7816137aa565b60008060006060848603121561393357600080fd5b833561393e816137aa565b9250602084013561394e816137aa565b929592945050506040919091013590565b6000806040838503121561397257600080fd5b50508035926020909101359150565b6000806040838503121561399457600080fd5b823561399f816137aa565b9150602083013561ffff811681146137f957600080fd5b600080604083850312156139c957600080fd5b82356139d4816137aa565b915060208301356137f9816137aa565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613a1557613a156139e4565b604051601f8501601f19908116603f01168101908282118183101715613a3d57613a3d6139e4565b81604052809350858152868686011115613a5657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a8257600080fd5b813567ffffffffffffffff811115613a9957600080fd5b8201601f81018413613aaa57600080fd5b611f5c848235602084016139fa565b60008083601f840112613acb57600080fd5b50813567ffffffffffffffff811115613ae357600080fd5b6020830191508360208260051b8501011115610f0f57600080fd5b60008060008060408587031215613b1457600080fd5b843567ffffffffffffffff80821115613b2c57600080fd5b613b3888838901613ab9565b90965094506020870135915080821115613b5157600080fd5b50613b5e87828801613ab9565b95989497509550505050565b8015158114611d0157600080fd5b600060208284031215613b8a57600080fd5b8135611cc781613b6a565b60008060408385031215613ba857600080fd5b8235613bb3816137aa565b915060208301356137f981613b6a565b60008060008060808587031215613bd957600080fd5b8435613be4816137aa565b93506020850135613bf4816137aa565b925060408501359150606085013567ffffffffffffffff811115613c1757600080fd5b8501601f81018713613c2857600080fd5b613c37878235602084016139fa565b91505092959194509250565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680613c8c57607f821691505b602082108103613cac57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601390820152724475736b6f3a206e6f20636f6e74726163747360681b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613d4657613d46613d16565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613d7057613d70613d4b565b500490565b60208082526044908201527f4475736b6f3a20546865206e756d626572206f6620616464726573736573206960408201527f73206e6f74206d61746368696e6720746865206e756d626572206f6620616d6f606082015263756e747360e01b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60008219821115613e0857613e08613d16565b500190565b600082821015613e1f57613e1f613d16565b500390565b600060018201613e3657613e36613d16565b5060010190565b60008351613e4f818460208801613804565b835190830190613e63818360208801613804565b64173539b7b760d91b9101908152600501949350505050565b600060208284031215613e8e57600080fd5b5051919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ec890830184613830565b9695505050505050565b600060208284031215613ee457600080fd5b8151611cc781613777565b600082613efe57613efe613d4b565b500690565b600060208284031215613f1557600080fd5b8151611cc781613b6a565b60008251613f32818460208701613804565b919091019291505056fea26469706673582212200a8bd03817018bc4afc24209e435eef3f5c73469fd39a0dd2c35f4c8236b648a64736f6c634300080d0033

Deployed Bytecode Sourcemap

446:7174:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3547:40:13;736:10:1;3547:40:13;;;-1:-1:-1;;;;;206:32:17;;;188:51;;3577:9:13;270:2:17;255:18;;248:34;161:18;3547:40:13;;;;;;;446:7174:2;;;;;1549:171;;;;;;;;;;-1:-1:-1;1549:171:2;;;;;:::i;:::-;;:::i;:::-;;;844:14:17;;837:22;819:41;;807:2;792:18;1549:171:2;;;;;;;;7471:146;;;;;;;;;;-1:-1:-1;7471:146:2;;;;;:::i;:::-;;:::i;:::-;;7623:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9134:204::-;;;;;;;;;;-1:-1:-1;9134:204:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2547:32:17;;;2529:51;;2517:2;2502:18;9134:204:5;2383:203:17;8697:371:5;;;;;;;;;;-1:-1:-1;8697:371:5;;;;;:::i;:::-;;:::i;11363:94:13:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5508:78:2:-;;;;;;;;;;;;;:::i;1075:46::-;;;;;;;;;;-1:-1:-1;1075:46:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3972:25:17;;;3960:2;3945:18;1075:46:2;3826:177:17;3657:217:2;;;;;;;;;;;;;:::i;3759:303:5:-;;;;;;;;;;;;3616:1;4013:12;3803:7;3997:13;:28;-1:-1:-1;;3997:46:5;;3759:303;6768:179:2;;;;;;;;;;-1:-1:-1;6768:179:2;;;;;:::i;:::-;;:::i;9999:170:5:-;;;;;;;;;;-1:-1:-1;9999:170:5;;;;;:::i;:::-;;:::i;4115:124:13:-;;;;;;;;;;-1:-1:-1;4115:124:13;;;;;:::i;:::-;-1:-1:-1;;;;;4205:26:13;4178:7;4205:26;;;:19;:26;;;;;;;4115:124;1674:442:4;;;;;;;;;;-1:-1:-1;1674:442:4;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;206:32:17;;;188:51;;270:2;255:18;;248:34;;;;161:18;1674:442:4;14:274:17;4704:88:2;;;;;;;;;;-1:-1:-1;4704:88:2;;;;;:::i;:::-;;:::i;3678:91:13:-;;;;;;;;;;-1:-1:-1;3749:12:13;;3678:91;;7300:72:2;;;;;;;;;;;;;:::i;10240:185:5:-;;;;;;;;;;-1:-1:-1;10240:185:5;;;;;:::i;:::-;;:::i;6430:118:2:-;;;;;;;;;;-1:-1:-1;6430:118:2;;;;;:::i;:::-;;:::i;4812:140:13:-;;;;;;;;;;-1:-1:-1;4812:140:13;;;;;:::i;:::-;-1:-1:-1;;;;;4914:21:13;;;4887:7;4914:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4812:140;4847:106:2;;;;;;;;;;-1:-1:-1;4847:106:2;;;;;:::i;:::-;;:::i;5300:172::-;;;;;;;;;;-1:-1:-1;5300:172:2;;;;;:::i;:::-;;:::i;1012:28::-;;;;;;;;;;-1:-1:-1;1012:28:2;;;;;;;;;;;7431:125:5;;;;;;;;;;-1:-1:-1;7431:125:5;;;;;:::i;:::-;;:::i;651:94:2:-;;;;;;;;;;;;;:::i;5930:265::-;;;;;;;;;;-1:-1:-1;5930:265:2;;;;;:::i;:::-;;:::i;4879:206:5:-;;;;;;;;;;-1:-1:-1;4879:206:5;;;;;:::i;:::-;;:::i;1714:103:12:-;;;;;;;;;;;;;:::i;3922:606:2:-;;;;;;;;;;-1:-1:-1;3922:606:2;;;;;:::i;:::-;;:::i;752:26::-;;;;;;;;;;;;;;;;1799:758;;;;;;;;;;-1:-1:-1;1799:758:2;;;;;:::i;:::-;;:::i;7004:210::-;;;;;;;;;;-1:-1:-1;7004:210:2;;;;;:::i;:::-;;:::i;976:32::-;;;;;;;;;;-1:-1:-1;976:32:2;;;;;;;;;;;5631:84;;;;;;;;;;;;;:::i;5134:91::-;;;;;;;;;;-1:-1:-1;5134:91:2;;;;;:::i;:::-;;:::i;5043:100:13:-;;;;;;;;;;-1:-1:-1;5043:100:13;;;;;:::i;:::-;;:::i;1063:87:12:-;;;;;;;;;;-1:-1:-1;1136:6:12;;-1:-1:-1;;;;;1136:6:12;1063:87;;11200:96:13;;;;;;;;;;;;;:::i;7792:104:5:-;;;;;;;;;;;;;:::i;4534:109:13:-;;;;;;;;;;-1:-1:-1;4534:109:13;;;;;:::i;:::-;-1:-1:-1;;;;;4617:18:13;4590:7;4617:18;;;:9;:18;;;;;;;4534:109;6247:116:2;;;;;;;;;;-1:-1:-1;6247:116:2;;;;;:::i;:::-;;:::i;2617:1032::-;;;;;;:::i;:::-;;:::i;9410:287:5:-;;;;;;;;;;-1:-1:-1;9410:287:5;;;;;:::i;:::-;;:::i;827:35:2:-;;;;;;;;;;;;;;;;785;;;;;;;;;;;;;;;;4566:90;;;;;;;;;;-1:-1:-1;4566:90:2;;;;;:::i;:::-;;:::i;10496:369:5:-;;;;;;;;;;-1:-1:-1;10496:369:5;;;;;:::i;:::-;;:::i;1125:43:2:-;;;;;;;;;;-1:-1:-1;1125:43:2;;;;;:::i;:::-;;;;;;;;;;;;;;940:29;;;;;;;;;;-1:-1:-1;940:29:2;;;;;;;;7967:326:5;;;;;;;;;;-1:-1:-1;7967:326:5;;;;;:::i;:::-;;:::i;906:27:2:-;;;;;;;;;;;;;;;;4330:105:13;;;;;;;;;;-1:-1:-1;4330:105:13;;;;;:::i;:::-;-1:-1:-1;;;;;4411:16:13;4384:7;4411:16;;;:7;:16;;;;;;;4330:105;6614:91:2;;;;;;;;;;-1:-1:-1;6614:91:2;;;;;:::i;:::-;;:::i;869:30::-;;;;;;;;;;;;;;;;3863:95:13;;;;;;;;;;-1:-1:-1;3936:14:13;;3863:95;;9768:164:5;;;;;;;;;;-1:-1:-1;9768:164:5;;;;;:::i;:::-;-1:-1:-1;;;;;9889:25:5;;;9865:4;9889:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9768:164;4998:87:2;;;;;;;;;;-1:-1:-1;4998:87:2;;;;;:::i;:::-;;:::i;1972:201:12:-;;;;;;;;;;-1:-1:-1;1972:201:12;;;;;:::i;:::-;;:::i;1044:27:2:-;;;;;;;;;;-1:-1:-1;1044:27:2;;;;;;;;;;;1549:171;1652:4;1676:36;1700:11;1676:23;:36::i;:::-;1669:43;1549:171;-1:-1:-1;;1549:171:2:o;7471:146::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;;;;;;;;;7567:42:2::1;7586:8;7596:12;7567:18;:42::i;:::-;7471:146:::0;;:::o;7623:100:5:-;7677:13;7710:5;7703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7623:100;:::o;9134:204::-;9202:7;9227:16;9235:7;9227;:16::i;:::-;9222:64;;9252:34;;-1:-1:-1;;;9252:34:5;;;;;;;;;;;9222:64;-1:-1:-1;9306:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;9306:24:5;;9134:204::o;8697:371::-;8770:13;8786:24;8802:7;8786:15;:24::i;:::-;8770:40;;8831:5;-1:-1:-1;;;;;8825:11:5;:2;-1:-1:-1;;;;;8825:11:5;;8821:48;;8845:24;;-1:-1:-1;;;8845:24:5;;;;;;;;;;;8821:48;736:10:1;-1:-1:-1;;;;;8886:21:5;;;;;;:63;;-1:-1:-1;8912:37:5;8929:5;736:10:1;9768:164:5;:::i;8912:37::-;8911:38;8886:63;8882:138;;;8973:35;;-1:-1:-1;;;8973:35:5;;;;;;;;;;;8882:138;9032:28;9041:2;9045:7;9054:5;9032:8;:28::i;:::-;8759:309;8697:371;;:::o;11363:94:13:-;11406:16;11442:7;11435:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11435:14:13;;;;;;;;;;;;;;;;;;;;;;11363:94;:::o;5508:78:2:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5562:9:2::1;:16:::0;;-1:-1:-1;;5562:16:2::1;5574:4;5562:16;::::0;;5508:78::o;3657:217::-;3743:8;;3694:7;;;;3743:8;;;;;3738:106;;-1:-1:-1;;3776:7:2;;;3657:217::o;3738:106::-;-1:-1:-1;;3824:8:2;;;3657:217::o;6768:179::-;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;;;;;;:::i;:::-;1778:1;2509:7;:18;1120:20:0;;1168:8;6843:68:2::1;;;;-1:-1:-1::0;;;6843:68:2::1;;;;;;;:::i;:::-;6922:17;6931:7;6922:8;:17::i;:::-;-1:-1:-1::0;1734:1:14;2688:7;:22;6768:179:2:o;9999:170:5:-;10133:28;10143:4;10149:2;10153:7;10133:9;:28::i;1674:442:4:-;1771:7;1829:27;;;:17;:27;;;;;;;;1800:56;;;;;;;;;-1:-1:-1;;;;;1800:56:4;;;;;-1:-1:-1;;;1800:56:4;;;-1:-1:-1;;;;;1800:56:4;;;;;;;;1771:7;;1869:92;;-1:-1:-1;1920:29:4;;;;;;;;;1930:19;1920:29;-1:-1:-1;;;;;1920:29:4;;;;-1:-1:-1;;;1920:29:4;;-1:-1:-1;;;;;1920:29:4;;;;;1869:92;2011:23;;;;1973:21;;2482:5;;1998:36;;-1:-1:-1;;;;;1998:36:4;:10;:36;:::i;:::-;1997:58;;;;:::i;:::-;2076:16;;;-1:-1:-1;1973:82:4;;-1:-1:-1;;1674:442:4;;;;;;:::o;4704:88:2:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;4769:7:2::1;:18:::0;4704:88::o;7300:72::-;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;;;;;;:::i;:::-;1778:1;2509:7;:18;7353:11:2::1;:9;:11::i;:::-;1734:1:14::0;2688:7;:22;7300:72:2:o;10240:185:5:-;10378:39;10395:4;10401:2;10405:7;10378:39;;;;;;;;;;;;:16;:39::i;6430:118:2:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;6512:28:2::1;6523:7;6532;6512:28;;:10;:28::i;4847:106::-:0;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;4921:7:2::1;:27:::0;4847:106::o;5300:172::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5387:9:2::1;::::0;::::1;;:18;5379:51;;;::::0;-1:-1:-1;;;5379:51:2;;13713:2:17;5379:51:2::1;::::0;::::1;13695:21:17::0;13752:2;13732:18;;;13725:30;-1:-1:-1;;;13771:18:17;;;13764:50;13831:18;;5379:51:2::1;13511:344:17::0;5379:51:2::1;5441:23:::0;;::::1;::::0;:7:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;7431:125:5:-:0;7495:7;7522:21;7535:7;7522:12;:21::i;:::-;:26;;7431:125;-1:-1:-1;;7431:125:5:o;651:94:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5930:265::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;6006:12:2::1;::::0;::::1;::::0;::::1;;;:21;5998:63;;;::::0;-1:-1:-1;;;5998:63:2;;14062:2:17;5998:63:2::1;::::0;::::1;14044:21:17::0;14101:2;14081:18;;;14074:30;14140:31;14120:18;;;14113:59;14189:18;;5998:63:2::1;13860:353:17::0;5998:63:2::1;6090:13;3616:1:5::0;4013:12;3803:7;3997:13;:28;-1:-1:-1;;3997:46:5;;3759:303;6090:13:2::1;6080:6;:23;;6072:86;;;::::0;-1:-1:-1;;;6072:86:2;;14420:2:17;6072:86:2::1;::::0;::::1;14402:21:17::0;14459:2;14439:18;;;14432:30;14498:34;14478:18;;;14471:62;-1:-1:-1;;;14549:18:17;;;14542:48;14607:19;;6072:86:2::1;14218:414:17::0;6072:86:2::1;6169:9;:18:::0;5930:265::o;4879:206:5:-;4943:7;-1:-1:-1;;;;;4967:19:5;;4963:60;;4995:28;;-1:-1:-1;;;4995:28:5;;;;;;;;;;;4963:60;-1:-1:-1;;;;;;5049:19:5;;;;;:12;:19;;;;;:27;;;;4879:206::o;1714:103:12:-;1136:6;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;3922:606:2:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;4032:16:2::1;4069:36:::0;;::::1;4061:130;;;;-1:-1:-1::0;;;4061:130:2::1;;;;;;;:::i;:::-;4208:9;4204:320;4219:21:::0;;::::1;4204:320;;;4270:33;4289:10;;4300:1;4289:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1120:20:0::0;1168:8;;;797:387;4270:33:2::1;:42;4262:74;;;;-1:-1:-1::0;;;4262:74:2::1;;;;;;;:::i;:::-;4364:11;:26;4376:10;;4387:1;4376:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4364:26:2::1;-1:-1:-1::0;;;;;4364:26:2::1;;;;;;;;;;;;;4353:37;;4434:8;;4443:1;4434:11;;;;;;;:::i;:::-;;;;;;;4405;:26;4417:10;;4428:1;4417:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4405:26:2::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;4405:26:2;:40;4504:8;4490;;4499:1;4490:11;;::::1;;;;;:::i;:::-;;;;;;;4475:12;;:26;;;;:::i;:::-;:37;;;;:::i;:::-;4460:12;:52:::0;4242:3;::::1;::::0;::::1;:::i;:::-;;;;4204:320;;;;4021:507;3922:606:::0;;;;:::o;1799:758::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;1902:17:2::1;::::0;1972:35;;::::1;1964:116;;;;-1:-1:-1::0;;;1964:116:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;2137:1:2::1;2128:179;2140:21:::0;;::::1;2128:179;;;2191:33;2210:10;;2221:1;2210:13;;;;;;;:::i;2191:33::-;:42;2183:74;;;;-1:-1:-1::0;;;2183:74:2::1;;;;;;;:::i;:::-;2285:7;;2293:1;2285:10;;;;;;;:::i;:::-;;;;;;;2272:23;;;;;:::i;:::-;::::0;-1:-1:-1;2163:3:2;::::1;::::0;::::1;:::i;:::-;;;;2128:179;;;2356:9;;2343;2327:13;3616:1:5::0;4013:12;3803:7;3997:13;:28;-1:-1:-1;;3997:46:5;;3759:303;2327:13:2::1;:25;;;;:::i;:::-;:38;;2319:93;;;::::0;-1:-1:-1;;;2319:93:2;;15851:2:17;2319:93:2::1;::::0;::::1;15833:21:17::0;15890:2;15870:18;;;15863:30;15929:34;15909:18;;;15902:62;-1:-1:-1;;;15980:18:17;;;15973:40;16030:19;;2319:93:2::1;15649:406:17::0;2319:93:2::1;-1:-1:-1::0;2462:1:2::1;2453:100;2465:18:::0;;::::1;2453:100;;;2505:36;2515:10;;2526:1;2515:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2530:7;;2538:1;2530:10;;;;;;;:::i;:::-;;;;;;;2505:9;:36::i;:::-;2485:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2453:100;;7004:210:::0;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;;;;;;:::i;:::-;1778:1;2509:7;:18;1120:20:0;;1168:8;7098:68:2::1;;;;-1:-1:-1::0;;;7098:68:2::1;;;;;;;:::i;:::-;7177:29;7191:5;7198:7;7177:13;:29::i;:::-;-1:-1:-1::0;;1734:1:14;2688:7;:22;7004:210:2:o;5631:84::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5688:12:2::1;:19:::0;;-1:-1:-1;;5688:19:2::1;;;::::0;;5631:84::o;5134:91::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5202:7:2::1;:18:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;5202:18:2;;::::1;::::0;;;::::1;::::0;;5134:91::o;5043:100:13:-;5094:7;5121;5129:5;5121:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;5121:14:13;;5043:100;-1:-1:-1;;5043:100:13:o;11200:96::-;11243:15;11278:10;11271:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11271:17:13;;;;;;;;;;;;;;;;;;;;;;11200:96;:::o;7792:104:5:-;7848:13;7881:7;7874:14;;;;;:::i;6247:116:2:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;6328:27:2::1;6338:7;6347;6328:9;:27::i;2617:1032::-:0;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;;;;;;:::i;:::-;1778:1;2509:7;:18;2693:14:2::1;2710:13;3616:1:5::0;4013:12;3803:7;3997:13;:28;-1:-1:-1;;3997:46:5;;3759:303;2710:13:2::1;2693:30:::0;-1:-1:-1;2763:10:2::1;1120:20:0::0;1168:8;2736:71:2::1;;;;-1:-1:-1::0;;;2736:71:2::1;;;;;;;:::i;:::-;2826:8;::::0;;;::::1;;;::::0;:19:::1;;-1:-1:-1::0;2838:7:2::1;::::0;;;::::1;;;2826:19;2818:62;;;::::0;-1:-1:-1;;;2818:62:2;;16262:2:17;2818:62:2::1;::::0;::::1;16244:21:17::0;16301:2;16281:18;;;16274:30;16340:32;16320:18;;;16313:60;16390:18;;2818:62:2::1;16060:354:17::0;2818:62:2::1;2913:1;2899:11;:15;2891:46;;;::::0;-1:-1:-1;;;2891:46:2;;16621:2:17;2891:46:2::1;::::0;::::1;16603:21:17::0;16660:2;16640:18;;;16633:30;-1:-1:-1;;;16679:18:17;;;16672:48;16737:18;;2891:46:2::1;16419:342:17::0;2891:46:2::1;2980:9;::::0;2956:20:::1;2965:11:::0;2956:6;:20:::1;:::i;:::-;:33;;2948:83;;;::::0;-1:-1:-1;;;2948:83:2;;16968:2:17;2948:83:2::1;::::0;::::1;16950:21:17::0;17007:2;16987:18;;;16980:30;17046:34;17026:18;;;17019:62;-1:-1:-1;;;17097:18:17;;;17090:35;17142:19;;2948:83:2::1;16766:401:17::0;2948:83:2::1;3072:11;3063:6;:4;:6::i;:::-;:20;;;;:::i;:::-;3050:9;:33;;3042:82;;;::::0;-1:-1:-1;;;3042:82:2;;17374:2:17;3042:82:2::1;::::0;::::1;17356:21:17::0;17413:2;17393:18;;;17386:30;17452:34;17432:18;;;17425:62;-1:-1:-1;;;17503:18:17;;;17496:34;17547:19;;3042:82:2::1;17172:400:17::0;3042:82:2::1;3149:7;::::0;;;::::1;;;:20:::0;::::1;;;-1:-1:-1::0;3161:8:2::1;::::0;;;::::1;;;3160:9;3149:20;3145:302;;;3216:10;3186:15;3204:23:::0;;;:11:::1;:23;::::0;;;;;3250:11;3242:48:::1;;;::::0;-1:-1:-1;;;3242:48:2;;17779:2:17;3242:48:2::1;::::0;::::1;17761:21:17::0;17818:2;17798:18;;;17791:30;17857:26;17837:18;;;17830:54;17901:18;;3242:48:2::1;17577:348:17::0;3242:48:2::1;3328:7;3313:11;:22;;3305:77;;;::::0;-1:-1:-1;;;3305:77:2;;18132:2:17;3305:77:2::1;::::0;::::1;18114:21:17::0;18171:2;18151:18;;;18144:30;18210:34;18190:18;;;18183:62;-1:-1:-1;;;18261:18:17;;;18254:40;18311:19;;3305:77:2::1;17930:406:17::0;3305:77:2::1;3409:10;3397:23;::::0;;;:11:::1;:23;::::0;;;;:38;;3424:11;;3397:23;:38:::1;::::0;3424:11;;3397:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;;3145:302:2::1;3505:7;::::0;3476:10:::1;3467:20;::::0;;;:8:::1;:20;::::0;;;;;:34:::1;::::0;3490:11;;3467:34:::1;:::i;:::-;:45;;3459:92;;;::::0;-1:-1:-1;;;3459:92:2;;18543:2:17;3459:92:2::1;::::0;::::1;18525:21:17::0;18582:2;18562:18;;;18555:30;18621:34;18601:18;;;18594:62;-1:-1:-1;;;18672:18:17;;;18665:32;18714:19;;3459:92:2::1;18341:398:17::0;3459:92:2::1;3571:10;3562:20;::::0;;;:8:::1;:20;::::0;;;;:35;;3586:11;;3562:20;:35:::1;::::0;3586:11;;3562:35:::1;:::i;:::-;::::0;;;-1:-1:-1;3610:34:2::1;::::0;-1:-1:-1;3620:10:2::1;3632:11:::0;3610:9:::1;:34::i;9410:287:5:-:0;736:10:1;-1:-1:-1;;;;;9509:24:5;;;9505:54;;9542:17;;-1:-1:-1;;;9542:17:5;;;;;;;;;;;9505:54;736:10:1;9572:32:5;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9572:42:5;;;;;;;;;;;;:53;;-1:-1:-1;;9572:53:5;;;;;;;;;;9641:48;;819:41:17;;;9572:42:5;;736:10:1;9641:48:5;;792:18:17;9641:48:5;;;;;;;9410:287;;:::o;4566:90:2:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;4632:8:2::1;:19:::0;4566:90::o;10496:369:5:-;10663:28;10673:4;10679:2;10683:7;10663:9;:28::i;:::-;-1:-1:-1;;;;;10706:13:5;;1120:20:0;1168:8;;10706:76:5;;;;;10726:56;10757:4;10763:2;10767:7;10776:5;10726:30;:56::i;:::-;10725:57;10706:76;10702:156;;;10806:40;;-1:-1:-1;;;10806:40:5;;;;;;;;;;;10702:156;10496:369;;;;:::o;7967:326::-;8040:13;8071:16;8079:7;8071;:16::i;:::-;8066:59;;8096:29;;-1:-1:-1;;;8096:29:5;;;;;;;;;;;8066:59;8138:21;8162:10;:8;:10::i;:::-;8138:34;;8196:7;8190:21;8215:1;8190:26;:95;;;;;;;;;;;;;;;;;8243:7;8252:18;:7;:16;:18::i;:::-;8226:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8190:95;8183:102;7967:326;-1:-1:-1;;;7967:326:5:o;6614:91:2:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;6679:18:2::1;6689:7;6679:9;:18::i;:::-;6614:91:::0;:::o;4998:87::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5062:8:2::1;:18:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;5062:18:2;;::::1;::::0;;;::::1;::::0;;4998:87::o;1972:201:12:-;1136:6;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2061:22:12;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:12;;19588:2:17;2053:73:12::1;::::0;::::1;19570:21:17::0;19627:2;19607:18;;;19600:30;19666:34;19646:18;;;19639:62;-1:-1:-1;;;19717:18:17;;;19710:36;19763:19;;2053:73:12::1;19386:402:17::0;2053:73:12::1;2137:28;2156:8;2137:18;:28::i;707:211:15:-:0;851:58;;;-1:-1:-1;;;;;206:32:17;;851:58:15;;;188:51:17;255:18;;;;248:34;;;851:58:15;;;;;;;;;;161:18:17;;;;851:58:15;;;;;;;;-1:-1:-1;;;;;851:58:15;-1:-1:-1;;;851:58:15;;;824:86;;844:5;;824:19;:86::i;2119:317:0:-;2234:6;2209:21;:31;;2201:73;;;;-1:-1:-1;;;2201:73:0;;19995:2:17;2201:73:0;;;19977:21:17;20034:2;20014:18;;;20007:30;20073:31;20053:18;;;20046:59;20122:18;;2201:73:0;19793:353:17;2201:73:0;2288:12;2306:9;-1:-1:-1;;;;;2306:14:0;2328:6;2306:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2287:52;;;2358:7;2350:78;;;;-1:-1:-1;;;2350:78:0;;20563:2:17;2350:78:0;;;20545:21:17;20602:2;20582:18;;;20575:30;20641:34;20621:18;;;20614:62;20712:28;20692:18;;;20685:56;20758:19;;2350:78:0;20361:422:17;3603:229:0;3740:12;3772:52;3794:6;3802:4;3808:1;3811:12;3772:21;:52::i;:::-;3765:59;3603:229;-1:-1:-1;;;;3603:229:0:o;1404:215:4:-;1506:4;-1:-1:-1;;;;;;1530:41:4;;-1:-1:-1;;;1530:41:4;;:81;;;1575:36;1599:11;1575:23;:36::i;2766:332::-;2482:5;-1:-1:-1;;;;;2869:33:4;;;;2861:88;;;;-1:-1:-1;;;2861:88:4;;20990:2:17;2861:88:4;;;20972:21:17;21029:2;21009:18;;;21002:30;21068:34;21048:18;;;21041:62;-1:-1:-1;;;21119:18:17;;;21112:40;21169:19;;2861:88:4;20788:406:17;2861:88:4;-1:-1:-1;;;;;2968:22:4;;2960:60;;;;-1:-1:-1;;;2960:60:4;;21401:2:17;2960:60:4;;;21383:21:17;21440:2;21420:18;;;21413:30;21479:27;21459:18;;;21452:55;21524:18;;2960:60:4;21199:349:17;2960:60:4;3055:35;;;;;;;;;-1:-1:-1;;;;;3055:35:4;;;;;;-1:-1:-1;;;;;3055:35:4;;;;;;;;;;-1:-1:-1;;;3033:57:4;;;;:19;:57;2766:332::o;11120:174:5:-;11177:4;11220:7;3616:1;11201:26;;:53;;;;;11241:13;;11231:7;:23;11201:53;:85;;;;-1:-1:-1;;11259:20:5;;;;:11;:20;;;;;:27;-1:-1:-1;;;11259:27:5;;;;11258:28;;11120:174::o;19277:196::-;19392:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19392:29:5;-1:-1:-1;;;;;19392:29:5;;;;;;;;;19437:28;;19392:24;;19437:28;;;;;;;19277:196;;;:::o;5343:635:13:-;5414:21;5462:15;3936:14;;;3863:95;5462:15;5438:39;;:21;:39;:::i;:::-;5414:63;;5488:15;5506:58;5522:7;5531:13;5546:17;5555:7;-1:-1:-1;;;;;4617:18:13;4590:7;4617:18;;;:9;:18;;;;;;;4534:109;5546:17;5506:15;:58::i;:::-;5488:76;;5660:21;5650:7;:31;5646:95;;;-1:-1:-1;5708:21:13;5646:95;5757:11;;5753:218;;-1:-1:-1;;;;;5785:18:13;;;;;;:9;:18;;;;;:29;;5807:7;;5785:18;:29;;5807:7;;5785:29;:::i;:::-;;;;;;;;5847:7;5829:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;5871:35:13;;-1:-1:-1;5889:7:13;5898;5871:17;:35::i;:::-;5926:33;;;-1:-1:-1;;;;;206:32:17;;188:51;;270:2;255:18;;248:34;;;5926:33:13;;161:18:17;5926:33:13;;;;;;;5403:575;;5343:635;:::o;14220:2130:5:-;14335:35;14373:21;14386:7;14373:12;:21::i;:::-;14335:59;;14433:4;-1:-1:-1;;;;;14411:26:5;:13;:18;;;-1:-1:-1;;;;;14411:26:5;;14407:67;;14446:28;;-1:-1:-1;;;14446:28:5;;;;;;;;;;;14407:67;14487:22;736:10:1;-1:-1:-1;;;;;14513:20:5;;;;:73;;-1:-1:-1;14550:36:5;14567:4;736:10:1;9768:164:5;:::i;14550:36::-;14513:126;;;-1:-1:-1;736:10:1;14603:20:5;14615:7;14603:11;:20::i;:::-;-1:-1:-1;;;;;14603:36:5;;14513:126;14487:153;;14658:17;14653:66;;14684:35;;-1:-1:-1;;;14684:35:5;;;;;;;;;;;14653:66;-1:-1:-1;;;;;14734:16:5;;14730:52;;14759:23;;-1:-1:-1;;;14759:23:5;;;;;;;;;;;14730:52;14903:35;14920:1;14924:7;14933:4;14903:8;:35::i;:::-;-1:-1:-1;;;;;15234:18:5;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15234:31:5;;;;;;;-1:-1:-1;;15234:31:5;;;;;;;15280:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15280:29:5;;;;;;;;;;;15360:20;;;:11;:20;;;;;;15395:18;;-1:-1:-1;;;;;;15428:49:5;;;;-1:-1:-1;;;15461:15:5;15428:49;;;;;;;;;;15751:11;;15811:24;;;;;15854:13;;15360:20;;15811:24;;15854:13;15850:384;;16064:13;;16049:11;:28;16045:174;;16102:20;;16171:28;;;;16145:54;;-1:-1:-1;;;16145:54:5;-1:-1:-1;;;;;;16145:54:5;;;-1:-1:-1;;;;;16102:20:5;;16145:54;;;;16045:174;15209:1036;;;16281:7;16277:2;-1:-1:-1;;;;;16262:27:5;16271:4;-1:-1:-1;;;;;16262:27:5;;;;;;;;;;;16300:42;14324:2026;;14220:2130;;;:::o;11534:402:13:-;11614:9;11609:320;11633:7;:14;11629:18;;11609:320;;;11706:9;11701:171;11725:10;:17;11721:21;;11701:171;;;11768:12;11783:10;11794:1;11783:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11783:13:13;11768:28;;11815:41;11829:5;11844:7;11852:1;11844:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11844:10:13;11815:13;:41::i;:::-;-1:-1:-1;11744:3:13;;;;:::i;:::-;;;;11701:171;;;;11888:29;11905:7;11913:1;11905:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11905:10:13;11888:8;:29::i;:::-;11649:3;;;;:::i;:::-;;;;11609:320;;9214:1232;9296:9;;;;9434:140;9450:7;:14;9446:18;;9434:140;;;9504:7;-1:-1:-1;;;;;9490:21:13;:7;9498:1;9490:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;9490:10:13;:21;9486:77;;-1:-1:-1;9546:1:13;9486:77;9466:3;;;;:::i;:::-;;;;9434:140;;;9592:11;9607:1;9592:16;9584:83;;;;-1:-1:-1;;;9584:83:13;;22042:2:17;9584:83:13;;;22024:21:17;22081:2;22061:18;;;22054:30;22120:34;22100:18;;;22093:62;-1:-1:-1;;;22171:18:17;;;22164:52;22233:19;;9584:83:13;21840:418:17;9584:83:13;-1:-1:-1;;;;;9710:16:13;;;;;;:7;:16;;;;;;9695:12;;9729:7;;9695:31;;;:::i;:::-;:41;;;;:::i;:::-;9680:56;;9770:1;9755:12;:16;9747:81;;;;-1:-1:-1;;;9747:81:13;;22465:2:17;9747:81:13;;;22447:21:17;22504:2;22484:18;;;22477:30;22543:34;22523:18;;;22516:62;-1:-1:-1;;;22594:18:17;;;22587:50;22654:19;;9747:81:13;22263:416:17;9747:81:13;9909:11;:9;:11::i;:::-;9948:1;9931:14;:18;;;9948:1;-1:-1:-1;9960:89:13;9976:7;:14;9972:18;;9960:89;;;10036:1;10012:9;:21;10022:7;10030:1;10022:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;10022:10:13;10012:21;;;;;;;;;;;;:25;9992:3;;;;:::i;:::-;;;;9960:89;;;10096:1;10092:5;;10087:275;10103:10;:17;10099:21;;10087:275;;;10142:12;10157:10;10168:1;10157:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;10157:13:13;10185:26;;;:19;:26;;;;;;:30;;;10157:13;;-1:-1:-1;10157:13:13;-1:-1:-1;10242:109:13;10258:7;:14;10254:18;;10242:109;;;-1:-1:-1;;;;;10298:21:13;;10334:1;10298:21;;;:14;:21;;;;;10320:7;:10;;10334:1;;10320:7;10328:1;;10320:10;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;10320:10:13;10298:33;;;;;;;;;;;;:37;10274:3;;;;:::i;:::-;;;;10242:109;;;-1:-1:-1;10122:3:13;;;;:::i;:::-;;;;10087:275;;;-1:-1:-1;10374:12:13;:27;-1:-1:-1;;;;;;;10412:16:13;;;;;;;:7;:16;;;;;:26;9214:1232::o;6260:1109:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6371:7:5;;3616:1;6420:23;;:47;;;;;6454:13;;6447:4;:20;6420:47;6416:886;;;6488:31;6522:17;;;:11;:17;;;;;;;;;6488:51;;;;;;;;;-1:-1:-1;;;;;6488:51:5;;;;-1:-1:-1;;;6488:51:5;;;;;;;;;;;-1:-1:-1;;;6488:51:5;;;;;;;;;;;;;;6558:729;;6608:14;;-1:-1:-1;;;;;6608:28:5;;6604:101;;6672:9;6260:1109;-1:-1:-1;;;6260:1109:5:o;6604:101::-;-1:-1:-1;;;7047:6:5;7092:17;;;;:11;:17;;;;;;;;;7080:29;;;;;;;;;-1:-1:-1;;;;;7080:29:5;;;;;-1:-1:-1;;;7080:29:5;;;;;;;;;;;-1:-1:-1;;;7080:29:5;;;;;;;;;;;;;7140:28;7136:109;;7208:9;6260:1109;-1:-1:-1;;;6260:1109:5:o;7136:109::-;7007:261;;;6469:833;6416:886;7330:31;;-1:-1:-1;;;7330:31:5;;;;;;;;;;;2333:191:12;2426:6;;;-1:-1:-1;;;;;2443:17:12;;;-1:-1:-1;;;;;;2443:17:12;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;11302:104:5:-;11371:27;11381:2;11385:8;11371:27;;;;;;;;;;;;:9;:27::i;6246:750:13:-;-1:-1:-1;;;;;4205:26:13;;6336:21;4205:26;;;:19;:26;;;;;;6360:30;;-1:-1:-1;;;6360:30:13;;6384:4;6360:30;;;2529:51:17;-1:-1:-1;;;;;6360:15:13;;;;;2502:18:17;;6360:30:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;;:::i;:::-;6336:82;;6429:15;6447:70;6463:7;6472:13;6487:29;6501:5;6508:7;-1:-1:-1;;;;;4914:21:13;;;4887:7;4914:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4812:140;6447:70;6612:30;;-1:-1:-1;;;6612:30:13;;6636:4;6612:30;;;2529:51:17;6429:88:13;;-1:-1:-1;;;;;;6612:15:13;;;;;2502:18:17;;6612:30:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6602:7;:40;6598:113;;;6669:30;;-1:-1:-1;;;6669:30:13;;6693:4;6669:30;;;2529:51:17;-1:-1:-1;;;;;6669:15:13;;;;;2502:18:17;;6669:30:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6659:40;;6598:113;6727:11;;6723:266;;-1:-1:-1;;;;;6755:21:13;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;6789:7;;6755:21;:41;;6789:7;;6755:41;:::i;:::-;;;;-1:-1:-1;;;;;;;6811:26:13;;;;;;:19;:26;;;;;:37;;6841:7;;6811:26;:37;;6841:7;;6811:37;:::i;:::-;;;;-1:-1:-1;6865:47:13;;-1:-1:-1;6888:5:13;6895:7;6904;6865:22;:47::i;:::-;6932:45;;;-1:-1:-1;;;;;206:32:17;;;188:51;;270:2;255:18;;248:34;;;6932:45:13;;;;;161:18:17;6932:45:13;;;;;;;6325:671;;6246:750;;:::o;7765:1399::-;7845:9;;1120:20:0;;1168:8;7887:78:13;;;;-1:-1:-1;;;7887:78:13;;23075:2:17;7887:78:13;;;23057:21:17;23114:2;23094:18;;;23087:30;23153:31;23133:18;;;23126:59;23202:18;;7887:78:13;22873:353:17;7887:78:13;8046:16;8082:1;8078:5;;8073:140;8089:7;:14;8085:18;;8073:140;;;8143:7;-1:-1:-1;;;;;8129:21:13;:7;8137:1;8129:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;8129:10:13;:21;8125:77;;-1:-1:-1;8185:1:13;8125:77;8105:3;;;;:::i;:::-;;;;8073:140;;;8262:11;8277:1;8262:16;8258:899;;8371:11;;;;8367:600;;8403:11;:9;:11::i;:::-;8450:1;8433:14;:18;;;8450:1;-1:-1:-1;8470:105:13;8486:7;:14;8482:18;;8470:105;;;8554:1;8530:9;:21;8540:7;8548:1;8540:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;8540:10:13;8530:21;;;;;;;;;;;;:25;8502:3;;;;:::i;:::-;;;;8470:105;;;8638:1;8634:5;;8629:323;8645:10;:17;8641:21;;8629:323;;;8692:12;8707:10;8718:1;8707:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;8707:13:13;8743:26;;;:19;:26;;;;;;:30;;;8707:13;;-1:-1:-1;8707:13:13;-1:-1:-1;8808:125:13;8824:7;:14;8820:18;;8808:125;;;-1:-1:-1;;;;;8872:21:13;;8908:1;8872:21;;;:14;:21;;;;;8894:7;:10;;8908:1;;8894:7;8902:1;;8894:10;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;8894:10:13;8872:33;;;;;;;;;;;;:37;8840:3;;;;:::i;:::-;;;;8808:125;;;-1:-1:-1;8664:3:13;;;;:::i;:::-;;;;8629:323;;;8983:7;:21;;;;;;;;;;;;-1:-1:-1;;;;;;8983:21:13;-1:-1:-1;;;;;8983:21:13;;;;;;;;-1:-1:-1;9019:16:13;;;:7;8983:21;9019:16;;;;:26;;;;;;;9075:12;;:22;;9019:26;9075:22;:::i;:::-;9060:12;:37;9117:28;;;-1:-1:-1;;;;;23421:32:17;;23403:51;;23502:6;23490:19;;23485:2;23470:18;;23463:47;9117:28:13;;23376:18:17;9117:28:13;;;;;;;7834:1330;;;7765:1399;;:::o;19965:667:5:-;20149:72;;-1:-1:-1;;;20149:72:5;;20128:4;;-1:-1:-1;;;;;20149:36:5;;;;;:72;;736:10:1;;20200:4:5;;20206:7;;20215:5;;20149:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20149:72:5;;;;;;;;-1:-1:-1;;20149:72:5;;;;;;;;;;;;:::i;:::-;;;20145:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20383:6;:13;20400:1;20383:18;20379:235;;20429:40;;-1:-1:-1;;;20429:40:5;;;;;;;;;;;20379:235;20572:6;20566:13;20557:6;20553:2;20549:15;20542:38;20145:480;-1:-1:-1;;;;;;20268:55:5;-1:-1:-1;;;20268:55:5;;-1:-1:-1;19965:667:5;;;;;;:::o;5753:108:2:-;5813:13;5846:7;5839:14;;;;;:::i;342:723:16:-;398:13;619:5;628:1;619:10;615:53;;-1:-1:-1;;646:10:16;;;;;;;;;;;;-1:-1:-1;;;646:10:16;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:16;;-1:-1:-1;798:2:16;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:16;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:16;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:16;;;;;;;;-1:-1:-1;1003:11:16;1012:2;1003:11;;:::i;:::-;;;872:154;;10503:624:13;10602:4;1120:20:0;;1168:8;;10573:33:13;10565:81;;;;-1:-1:-1;;;10565:81:13;;24588:2:17;10565:81:13;;;24570:21:17;24627:2;24607:18;;;24600:30;24666:34;24646:18;;;24639:62;-1:-1:-1;;;24717:18:17;;;24710:33;24760:19;;10565:81:13;24386:399:17;10565:81:13;10691:38;;-1:-1:-1;;;10691:38:13;;10723:4;10691:38;;;2529:51:17;-1:-1:-1;;;;;10691:23:13;;;;;2502:18:17;;10691:38:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10810:16;10846:9;10841:160;10865:10;:17;10861:21;;10841:160;;;10932:5;-1:-1:-1;;;;;10908:30:13;:10;10919:1;10908:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;10908:13:13;:30;10904:86;;10973:1;10959:15;;10904:86;10884:3;;;;:::i;:::-;;;;10841:160;;;-1:-1:-1;11019:16:13;;11011:65;;;;-1:-1:-1;;;11011:65:13;;24992:2:17;11011:65:13;;;24974:21:17;25031:2;25011:18;;;25004:30;25070:34;25050:18;;;25043:62;-1:-1:-1;;;25121:18:17;;;25114:34;25165:19;;11011:65:13;24790:400:17;11011:65:13;-1:-1:-1;11089:10:13;:30;;;;;;;-1:-1:-1;11089:30:13;;;;;;;;-1:-1:-1;;;;;;11089:30:13;-1:-1:-1;;;;;11089:30:13;;;;;;;;;;10503:624::o;3280:716:15:-;3704:23;3730:69;3758:4;3730:69;;;;;;;;;;;;;;;;;3738:5;-1:-1:-1;;;;;3730:27:15;;;:69;;;;;:::i;:::-;3814:17;;3704:95;;-1:-1:-1;3814:21:15;3810:179;;3911:10;3900:30;;;;;;;;;;;;:::i;:::-;3892:85;;;;-1:-1:-1;;;3892:85:15;;25647:2:17;3892:85:15;;;25629:21:17;25686:2;25666:18;;;25659:30;25725:34;25705:18;;;25698:62;-1:-1:-1;;;25776:18:17;;;25769:40;25826:19;;3892:85:15;25445:406:17;4723:510:0;4893:12;4951:5;4926:21;:30;;4918:81;;;;-1:-1:-1;;;4918:81:0;;26058:2:17;4918:81:0;;;26040:21:17;26097:2;26077:18;;;26070:30;26136:34;26116:18;;;26109:62;-1:-1:-1;;;26187:18:17;;;26180:36;26233:19;;4918:81:0;25856:402:17;4918:81:0;1120:20;;5010:60;;;;-1:-1:-1;;;5010:60:0;;26465:2:17;5010:60:0;;;26447:21:17;26504:2;26484:18;;;26477:30;26543:31;26523:18;;;26516:59;26592:18;;5010:60:0;26263:353:17;5010:60:0;5084:12;5098:23;5125:6;-1:-1:-1;;;;;5125:11:0;5144:5;5151:4;5125:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5083:73;;;;5174:51;5191:7;5200:10;5212:12;5174:16;:51::i;:::-;5167:58;4723:510;-1:-1:-1;;;;;;;4723:510:0:o;4510:305:5:-;4612:4;-1:-1:-1;;;;;;4649:40:5;;-1:-1:-1;;;4649:40:5;;:105;;-1:-1:-1;;;;;;;4706:48:5;;-1:-1:-1;;;4706:48:5;4649:105;:158;;;-1:-1:-1;;;;;;;;;;963:40:3;;;4771:36:5;854:157:3;7174:399:13;7320:7;7340:16;7371:12;;7387:1;7371:17;7367:173;;-1:-1:-1;7416:1:13;7367:173;;;7498:12;;-1:-1:-1;;;;;7478:16:13;;;;;;:7;:16;;;;;;7513:15;;7498:12;7462:32;;:13;:32;:::i;:::-;7461:49;;;;:::i;:::-;:67;;;;:::i;:::-;7450:78;7557:8;-1:-1:-1;;;;;7174:399:13:o;11769:163:5:-;11892:32;11898:2;11902:8;11912:5;11919:4;11892:5;:32::i;7409:712:0:-;7559:12;7588:7;7584:530;;;-1:-1:-1;7619:10:0;7612:17;;7584:530;7733:17;;:21;7729:374;;7931:10;7925:17;7992:15;7979:10;7975:2;7971:19;7964:44;7729:374;8074:12;8067:20;;-1:-1:-1;;;8067:20:0;;;;;;;;:::i;12191:1775:5:-;12330:20;12353:13;-1:-1:-1;;;;;12381:16:5;;12377:48;;12406:19;;-1:-1:-1;;;12406:19:5;;;;;;;;;;;12377:48;12440:8;12452:1;12440:13;12436:44;;12462:18;;-1:-1:-1;;;12462:18:5;;;;;;;;;;;12436:44;-1:-1:-1;;;;;12831:16:5;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;12890:49:5;;12831:44;;;;;;;;12890:49;;;;-1:-1:-1;;12831:44:5;;;;;;12890:49;;;;;;;;;;;;;;;;12956:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;13006:66:5;;;;-1:-1:-1;;;13056:15:5;13006:66;;;;;;;;;;12956:25;13153:23;;;13197:4;:23;;;;-1:-1:-1;;;;;;13205:13:5;;1120:20:0;1168:8;;13205:15:5;13193:641;;;13241:314;13272:38;;13297:12;;-1:-1:-1;;;;;13272:38:5;;;13289:1;;13272:38;;13289:1;;13272:38;13338:69;13377:1;13381:2;13385:14;;;;;;13401:5;13338:30;:69::i;:::-;13333:174;;13443:40;;-1:-1:-1;;;13443:40:5;;;;;;;;;;;13333:174;13550:3;13534:12;:19;13241:314;;13636:12;13619:13;;:29;13615:43;;13650:8;;;13615:43;13193:641;;;13699:120;13730:40;;13755:14;;;;;-1:-1:-1;;;;;13730:40:5;;;13747:1;;13730:40;;13747:1;;13730:40;13814:3;13798:12;:19;13699:120;;13193:641;-1:-1:-1;13848:13:5;:28;13898:60;10496:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;293:131:17;-1:-1:-1;;;;;;367:32:17;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:131::-;-1:-1:-1;;;;;946:31:17;;936:42;;926:70;;992:1;989;982:12;1007:435;1074:6;1082;1135:2;1123:9;1114:7;1110:23;1106:32;1103:52;;;1151:1;1148;1141:12;1103:52;1190:9;1177:23;1209:31;1234:5;1209:31;:::i;:::-;1259:5;-1:-1:-1;1316:2:17;1301:18;;1288:32;-1:-1:-1;;;;;1351:40:17;;1339:53;;1329:81;;1406:1;1403;1396:12;1329:81;1429:7;1419:17;;;1007:435;;;;;:::o;1447:258::-;1519:1;1529:113;1543:6;1540:1;1537:13;1529:113;;;1619:11;;;1613:18;1600:11;;;1593:39;1565:2;1558:10;1529:113;;;1660:6;1657:1;1654:13;1651:48;;;-1:-1:-1;;1695:1:17;1677:16;;1670:27;1447:258::o;1710:::-;1752:3;1790:5;1784:12;1817:6;1812:3;1805:19;1833:63;1889:6;1882:4;1877:3;1873:14;1866:4;1859:5;1855:16;1833:63;:::i;:::-;1950:2;1929:15;-1:-1:-1;;1925:29:17;1916:39;;;;1957:4;1912:50;;1710:258;-1:-1:-1;;1710:258:17:o;1973:220::-;2122:2;2111:9;2104:21;2085:4;2142:45;2183:2;2172:9;2168:18;2160:6;2142:45;:::i;2198:180::-;2257:6;2310:2;2298:9;2289:7;2285:23;2281:32;2278:52;;;2326:1;2323;2316:12;2278:52;-1:-1:-1;2349:23:17;;2198:180;-1:-1:-1;2198:180:17:o;2591:315::-;2659:6;2667;2720:2;2708:9;2699:7;2695:23;2691:32;2688:52;;;2736:1;2733;2726:12;2688:52;2775:9;2762:23;2794:31;2819:5;2794:31;:::i;:::-;2844:5;2896:2;2881:18;;;;2868:32;;-1:-1:-1;;;2591:315:17:o;2911:658::-;3082:2;3134:21;;;3204:13;;3107:18;;;3226:22;;;3053:4;;3082:2;3305:15;;;;3279:2;3264:18;;;3053:4;3348:195;3362:6;3359:1;3356:13;3348:195;;;3427:13;;-1:-1:-1;;;;;3423:39:17;3411:52;;3518:15;;;;3483:12;;;;3459:1;3377:9;3348:195;;;-1:-1:-1;3560:3:17;;2911:658;-1:-1:-1;;;;;;2911:658:17:o;3574:247::-;3633:6;3686:2;3674:9;3665:7;3661:23;3657:32;3654:52;;;3702:1;3699;3692:12;3654:52;3741:9;3728:23;3760:31;3785:5;3760:31;:::i;4268:456::-;4345:6;4353;4361;4414:2;4402:9;4393:7;4389:23;4385:32;4382:52;;;4430:1;4427;4420:12;4382:52;4469:9;4456:23;4488:31;4513:5;4488:31;:::i;:::-;4538:5;-1:-1:-1;4595:2:17;4580:18;;4567:32;4608:33;4567:32;4608:33;:::i;:::-;4268:456;;4660:7;;-1:-1:-1;;;4714:2:17;4699:18;;;;4686:32;;4268:456::o;4996:248::-;5064:6;5072;5125:2;5113:9;5104:7;5100:23;5096:32;5093:52;;;5141:1;5138;5131:12;5093:52;-1:-1:-1;;5164:23:17;;;5234:2;5219:18;;;5206:32;;-1:-1:-1;4996:248:17:o;5249:415::-;5316:6;5324;5377:2;5365:9;5356:7;5352:23;5348:32;5345:52;;;5393:1;5390;5383:12;5345:52;5432:9;5419:23;5451:31;5476:5;5451:31;:::i;:::-;5501:5;-1:-1:-1;5558:2:17;5543:18;;5530:32;5606:6;5593:20;;5581:33;;5571:61;;5628:1;5625;5618:12;5669:403;5752:6;5760;5813:2;5801:9;5792:7;5788:23;5784:32;5781:52;;;5829:1;5826;5819:12;5781:52;5868:9;5855:23;5887:31;5912:5;5887:31;:::i;:::-;5937:5;-1:-1:-1;5994:2:17;5979:18;;5966:32;6007:33;5966:32;6007:33;:::i;6077:127::-;6138:10;6133:3;6129:20;6126:1;6119:31;6169:4;6166:1;6159:15;6193:4;6190:1;6183:15;6209:632;6274:5;6304:18;6345:2;6337:6;6334:14;6331:40;;;6351:18;;:::i;:::-;6426:2;6420:9;6394:2;6480:15;;-1:-1:-1;;6476:24:17;;;6502:2;6472:33;6468:42;6456:55;;;6526:18;;;6546:22;;;6523:46;6520:72;;;6572:18;;:::i;:::-;6612:10;6608:2;6601:22;6641:6;6632:15;;6671:6;6663;6656:22;6711:3;6702:6;6697:3;6693:16;6690:25;6687:45;;;6728:1;6725;6718:12;6687:45;6778:6;6773:3;6766:4;6758:6;6754:17;6741:44;6833:1;6826:4;6817:6;6809;6805:19;6801:30;6794:41;;;;6209:632;;;;;:::o;6846:451::-;6915:6;6968:2;6956:9;6947:7;6943:23;6939:32;6936:52;;;6984:1;6981;6974:12;6936:52;7024:9;7011:23;7057:18;7049:6;7046:30;7043:50;;;7089:1;7086;7079:12;7043:50;7112:22;;7165:4;7157:13;;7153:27;-1:-1:-1;7143:55:17;;7194:1;7191;7184:12;7143:55;7217:74;7283:7;7278:2;7265:16;7260:2;7256;7252:11;7217:74;:::i;7302:367::-;7365:8;7375:6;7429:3;7422:4;7414:6;7410:17;7406:27;7396:55;;7447:1;7444;7437:12;7396:55;-1:-1:-1;7470:20:17;;7513:18;7502:30;;7499:50;;;7545:1;7542;7535:12;7499:50;7582:4;7574:6;7570:17;7558:29;;7642:3;7635:4;7625:6;7622:1;7618:14;7610:6;7606:27;7602:38;7599:47;7596:67;;;7659:1;7656;7649:12;7674:773;7796:6;7804;7812;7820;7873:2;7861:9;7852:7;7848:23;7844:32;7841:52;;;7889:1;7886;7879:12;7841:52;7929:9;7916:23;7958:18;7999:2;7991:6;7988:14;7985:34;;;8015:1;8012;8005:12;7985:34;8054:70;8116:7;8107:6;8096:9;8092:22;8054:70;:::i;:::-;8143:8;;-1:-1:-1;8028:96:17;-1:-1:-1;8231:2:17;8216:18;;8203:32;;-1:-1:-1;8247:16:17;;;8244:36;;;8276:1;8273;8266:12;8244:36;;8315:72;8379:7;8368:8;8357:9;8353:24;8315:72;:::i;:::-;7674:773;;;;-1:-1:-1;8406:8:17;-1:-1:-1;;;;7674:773:17:o;8868:118::-;8954:5;8947:13;8940:21;8933:5;8930:32;8920:60;;8976:1;8973;8966:12;8991:241;9047:6;9100:2;9088:9;9079:7;9075:23;9071:32;9068:52;;;9116:1;9113;9106:12;9068:52;9155:9;9142:23;9174:28;9196:5;9174:28;:::i;9915:382::-;9980:6;9988;10041:2;10029:9;10020:7;10016:23;10012:32;10009:52;;;10057:1;10054;10047:12;10009:52;10096:9;10083:23;10115:31;10140:5;10115:31;:::i;:::-;10165:5;-1:-1:-1;10222:2:17;10207:18;;10194:32;10235:30;10194:32;10235:30;:::i;10302:795::-;10397:6;10405;10413;10421;10474:3;10462:9;10453:7;10449:23;10445:33;10442:53;;;10491:1;10488;10481:12;10442:53;10530:9;10517:23;10549:31;10574:5;10549:31;:::i;:::-;10599:5;-1:-1:-1;10656:2:17;10641:18;;10628:32;10669:33;10628:32;10669:33;:::i;:::-;10721:7;-1:-1:-1;10775:2:17;10760:18;;10747:32;;-1:-1:-1;10830:2:17;10815:18;;10802:32;10857:18;10846:30;;10843:50;;;10889:1;10886;10879:12;10843:50;10912:22;;10965:4;10957:13;;10953:27;-1:-1:-1;10943:55:17;;10994:1;10991;10984:12;10943:55;11017:74;11083:7;11078:2;11065:16;11060:2;11056;11052:11;11017:74;:::i;:::-;11007:84;;;10302:795;;;;;;;:::o;11495:356::-;11697:2;11679:21;;;11716:18;;;11709:30;11775:34;11770:2;11755:18;;11748:62;11842:2;11827:18;;11495:356::o;11856:380::-;11935:1;11931:12;;;;11978;;;11999:61;;12053:4;12045:6;12041:17;12031:27;;11999:61;12106:2;12098:6;12095:14;12075:18;12072:38;12069:161;;12152:10;12147:3;12143:20;12140:1;12133:31;12187:4;12184:1;12177:15;12215:4;12212:1;12205:15;12069:161;;11856:380;;;:::o;12241:355::-;12443:2;12425:21;;;12482:2;12462:18;;;12455:30;12521:33;12516:2;12501:18;;12494:61;12587:2;12572:18;;12241:355::o;12601:343::-;12803:2;12785:21;;;12842:2;12822:18;;;12815:30;-1:-1:-1;;;12876:2:17;12861:18;;12854:49;12935:2;12920:18;;12601:343::o;12949:127::-;13010:10;13005:3;13001:20;12998:1;12991:31;13041:4;13038:1;13031:15;13065:4;13062:1;13055:15;13081:168;13121:7;13187:1;13183;13179:6;13175:14;13172:1;13169:21;13164:1;13157:9;13150:17;13146:45;13143:71;;;13194:18;;:::i;:::-;-1:-1:-1;13234:9:17;;13081:168::o;13254:127::-;13315:10;13310:3;13306:20;13303:1;13296:31;13346:4;13343:1;13336:15;13370:4;13367:1;13360:15;13386:120;13426:1;13452;13442:35;;13457:18;;:::i;:::-;-1:-1:-1;13491:9:17;;13386:120::o;14637:472::-;14839:2;14821:21;;;14878:2;14858:18;;;14851:30;14917:34;14912:2;14897:18;;14890:62;14988:34;14983:2;14968:18;;14961:62;-1:-1:-1;;;15054:3:17;15039:19;;15032:35;15099:3;15084:19;;14637:472::o;15114:127::-;15175:10;15170:3;15166:20;15163:1;15156:31;15206:4;15203:1;15196:15;15230:4;15227:1;15220:15;15246:128;15286:3;15317:1;15313:6;15310:1;15307:13;15304:39;;;15323:18;;:::i;:::-;-1:-1:-1;15359:9:17;;15246:128::o;15379:125::-;15419:4;15447:1;15444;15441:8;15438:34;;;15452:18;;:::i;:::-;-1:-1:-1;15489:9:17;;15379:125::o;15509:135::-;15548:3;15569:17;;;15566:43;;15589:18;;:::i;:::-;-1:-1:-1;15636:1:17;15625:13;;15509:135::o;18744:637::-;19024:3;19062:6;19056:13;19078:53;19124:6;19119:3;19112:4;19104:6;19100:17;19078:53;:::i;:::-;19194:13;;19153:16;;;;19216:57;19194:13;19153:16;19250:4;19238:17;;19216:57;:::i;:::-;-1:-1:-1;;;19295:20:17;;19324:22;;;19373:1;19362:13;;18744:637;-1:-1:-1;;;;18744:637:17:o;22684:184::-;22754:6;22807:2;22795:9;22786:7;22782:23;22778:32;22775:52;;;22823:1;22820;22813:12;22775:52;-1:-1:-1;22846:16:17;;22684:184;-1:-1:-1;22684:184:17:o;23521:489::-;-1:-1:-1;;;;;23790:15:17;;;23772:34;;23842:15;;23837:2;23822:18;;23815:43;23889:2;23874:18;;23867:34;;;23937:3;23932:2;23917:18;;23910:31;;;23715:4;;23958:46;;23984:19;;23976:6;23958:46;:::i;:::-;23950:54;23521:489;-1:-1:-1;;;;;;23521:489:17:o;24015:249::-;24084:6;24137:2;24125:9;24116:7;24112:23;24108:32;24105:52;;;24153:1;24150;24143:12;24105:52;24185:9;24179:16;24204:30;24228:5;24204:30;:::i;24269:112::-;24301:1;24327;24317:35;;24332:18;;:::i;:::-;-1:-1:-1;24366:9:17;;24269:112::o;25195:245::-;25262:6;25315:2;25303:9;25294:7;25290:23;25286:32;25283:52;;;25331:1;25328;25321:12;25283:52;25363:9;25357:16;25382:28;25404:5;25382:28;:::i;26621:274::-;26750:3;26788:6;26782:13;26804:53;26850:6;26845:3;26838:4;26830:6;26826:17;26804:53;:::i;:::-;26873:16;;;;;26621:274;-1:-1:-1;;26621:274:17:o

Swarm Source

ipfs://0a8bd03817018bc4afc24209e435eef3f5c73469fd39a0dd2c35f4c8236b648a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.