ETH Price: $3,932.10 (+1.13%)

Token

Cash Cows (CASHCOW)
 

Overview

Max Total Supply

1,180 CASHCOW

Holders

63

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x00d86afeee11c7a71b6eccf1c19189fa650f2e10
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:
CashCows

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : Ownerfy-CashCows.sol
pragma solidity ^0.8.0;
/**
* The Cash Cows contract was deployed by Ownerfy Inc. of Ownerfy.com
* https://ownerfy.com/cashcows
* Must have Chic-A-Dee EGGS to mint https://ownerfy.com/chicadees
* Visit Ownerfy.com for exclusive NFT drops or inquiries for your project.
*
* This contract is not a proxy. 
* This contract is not pausable.
* This contract is not lockable.
* This contract cannot be rug pulled.
* The URIs are not changeable after mint. 
* This contract uses IPFS 
* This contract puts SHA256 media hash into the Update event for permanent on-chain documentation
* The NFT Owners and only the NFT Owners have complete control over their NFTs 
*/

// SPDX-License-Identifier: UNLICENSED

// From base: 
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

// interface IMILKInterface {
//     function balanceOf(address account, uint256 id) external view returns (uint);
// }

interface IERC20 {
    function totalSupply() external view returns (uint);

    function balanceOf(address account) external view returns (uint);

    function transfer(address recipient, uint amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

contract CashCows is Context, Ownable, ERC1155Burnable {

  using SafeMath for uint256;
  using Counters for Counters.Counter;

  address public eggsContract = 0xA16AB7dC3C7dc55aA0a59726144dcc4Bc30822c7;
  IERC20 eggsToken = IERC20(eggsContract);

  Counters.Counter private _tokenIdTracker;

  string public constant name = 'Cash Cows';
  string public constant symbol = 'CASHCOW';
  uint256 public price = 25000 * 10**18;
  uint256 public constant MAX_ELEMENTS = 3333;
  address public constant creatorAddress = 0x6c474099ad6d9Af49201a38b9842111d4ACd10BC;
  string public baseTokenURI;
  bool public placeHolder = true;

  uint256 private _royaltyBps = 500;
  address payable private _royaltyRecipient;

  bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6;
  bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;
  bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;


  event Sale(address indexed sender, uint256 count, uint256 paid, uint256 price);
  event UpdateRoyalty(address indexed _address, uint256 _bps);


    /**
     * deploys the contract.
     */
    constructor(string memory _uri) payable ERC1155(_uri) {
      _royaltyRecipient = payable(msg.sender);
      baseTokenURI = _uri;
    }

    function _totalSupply() internal view returns (uint) {
        return _tokenIdTracker.current();
    }


    modifier saleIsOpen {
        require(_totalSupply() <= MAX_ELEMENTS, "Sale end");
        
        _;
    }

    function totalMint() public view returns (uint256) {
        return _totalSupply();
    }


    // This function is monitored by an external process which completes the minting
    // * Must have Chic-A-Dee EGGS to mint https://ownerfy.com/chicadees
    // * Must approve your Chic-A-Dees EGGS to spend by this contract to mint
    function mint(uint256 _count) public saleIsOpen {
        uint256 total = _totalSupply();
        uint256 eggCost = price.mul(_count);
        require(total + _count <= MAX_ELEMENTS, "Max limit");
        require(total <= MAX_ELEMENTS, "Sale end");

        require(eggCost <= _eggBalance(), "Must have more than or equal to EGGS cost");
        bool sent = eggsToken.transferFrom(msg.sender, address(this), eggCost);
        require(sent, "Token transfer failed");

        Sale(msg.sender, _count, eggCost, price);

        for (uint256 i = 0; i < _count; i++) {
            _mint(msg.sender, _tokenIdTracker.current(), 1, '');
            _tokenIdTracker.increment(); 
        }
    }


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

    /**
     * @dev Checks `balance` eggs of sender.
     *
     */
    function _eggBalance() internal virtual returns(uint256 balance){

       return eggsToken.balanceOf(msg.sender);

    }


    // Function to withdraw all Ether and tokens from this contract.
    function withdraw() public onlyOwner{
        uint amount = address(this).balance;
        uint eggBalance = eggsToken.balanceOf(address(this));
        bool sent = eggsToken.transfer(msg.sender, eggBalance);

        require(sent, "Token transfer failed");
        if(amount > 0){
          (bool success, ) = _msgSender().call{value: amount}("");
          require(success, "Failed to send Ether");
        }
        
    }

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

    function setEggsContract(address _contract) public onlyOwner {
        eggsContract = _contract;
    }

    function setPlaceHolder(bool isOn) public onlyOwner {
        placeHolder = isOn;
    }


    function uri(uint256 _id) public view virtual override returns (string memory) {
        if(placeHolder) {
          return baseTokenURI;
        } else {
          return string(abi.encodePacked(baseTokenURI, uint2str(_id), ".json"));
        }
    }


    /**
    * @dev Update royalties
    */
    function updateRoyalties(address payable recipient, uint256 bps) external onlyOwner {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
        emit UpdateRoyalty(recipient, bps);
    }

    /**
      * ROYALTY FUNCTIONS
      */
    function getRoyalties(uint256) external view returns (address payable[] memory recipients, uint256[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return (recipients, bps);
    }

    function getFeeRecipients(uint256) external view returns (address payable[] memory recipients) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
        }
        return recipients;
    }

    function getFeeBps(uint256) external view returns (uint[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, value*_royaltyBps/10000);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155) returns (bool) {
        return ERC1155.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE
               || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE;
    }

     function uint2str(
      uint256 _i
    )
      internal
      pure
      returns (string memory str)
    {
      if (_i == 0)
      {
        return "0";
      }
      uint256 j = _i;
      uint256 length;
      while (j != 0)
      {
        length++;
        j /= 10;
      }
      bytes memory bstr = new bytes(length);
      uint256 k = length;
      j = _i;
      while (j != 0)
      {
        bstr[--k] = bytes1(uint8(48 + j % 10));
        j /= 10;
      }
      str = string(bstr);
    }

}

File 2 of 13 : ERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][account] = accountBalance - amount;
            }
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 3 of 13 : ERC1155Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

File 4 of 13 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 5 of 13 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 13 : Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 7 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

File 8 of 13 : IERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 9 of 13 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 13 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 11 of 13 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 13 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Sale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"UpdateRoyalty","type":"event"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eggsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setEggsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOn","type":"bool"}],"name":"setPlaceHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273a16ab7dc3c7dc55aa0a59726144dcc4bc30822c7600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555069054b40b1f852bda000006007556001600960006101000a81548160ff0219169083151502179055506101f4600a55604051620059cd380380620059cd8339818101604052810190620001109190620003ae565b806200013162000125620001a460201b60201c565b620001ac60201b60201c565b62000142816200027060201b60201c565b5033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600890805190602001906200019c9291906200028c565b505062000524565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060039080519060200190620002889291906200028c565b5050565b8280546200029a9062000490565b90600052602060002090601f016020900481019282620002be57600085556200030a565b82601f10620002d957805160ff19168380011785556200030a565b828001600101855582156200030a579182015b8281111562000309578251825591602001919060010190620002ec565b5b5090506200031991906200031d565b5090565b5b80821115620003385760008160009055506001016200031e565b5090565b6000620003536200034d8462000427565b620003f3565b9050828152602081018484840111156200036c57600080fd5b620003798482856200045a565b509392505050565b600082601f8301126200039357600080fd5b8151620003a58482602086016200033c565b91505092915050565b600060208284031215620003c157600080fd5b600082015167ffffffffffffffff811115620003dc57600080fd5b620003ea8482850162000381565b91505092915050565b6000604051905081810181811067ffffffffffffffff821117156200041d576200041c620004f5565b5b8060405250919050565b600067ffffffffffffffff821115620004455762000444620004f5565b5b601f19601f8301169050602081019050919050565b60005b838110156200047a5780820151818401526020810190506200045d565b838111156200048a576000848401525b50505050565b60006002820490506001821680620004a957607f821691505b60208210811415620004c057620004bf620004c6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61549980620005346000396000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636c2f5acd1161011a578063a22cb465116100ad578063e927fc5c1161007c578063e927fc5c1461059f578063e985e9c5146105bd578063f242432a146105ed578063f2fde38b14610609578063f5298aca14610625576101fa565b8063a22cb46514610504578063b9c4d9fb14610520578063bb3bafd614610550578063d547cfb714610581576101fa565b806391b7f5ed116100e957806391b7f5ed1461049057806395d89b41146104ac578063a035b1fe146104ca578063a0712d68146104e8576101fa565b80636c2f5acd1461042e578063715018a61461044a5780638da5cb5b146104545780638e89457a14610472576101fa565b80633502a7161161019257806359a7715a1161016157806359a7715a146103ba57806359a9b1e3146103d857806366ac99c5146103f65780636b20c45414610412576101fa565b80633502a716146103465780633ccfd60b146103645780634e1273f41461036e57806355f804b31461039e576101fa565b80630ebd4c7f116101ce5780630ebd4c7f146102ad5780631e960d20146102dd5780632a55205a146102f95780632eb2c2d61461032a576101fa565b8062fdd58e146101ff57806301ffc9a71461022f57806306fdde031461025f5780630e89341c1461027d575b600080fd5b61021960048036038101906102149190613c61565b610641565b6040516102269190614da8565b60405180910390f35b61024960048036038101906102449190613daa565b61070b565b6040516102569190614aeb565b60405180910390f35b61026761080a565b6040516102749190614b06565b60405180910390f35b61029760048036038101906102929190613e3d565b610843565b6040516102a49190614b06565b60405180910390f35b6102c760048036038101906102c29190613e3d565b61091f565b6040516102d49190614a92565b60405180910390f35b6102f760048036038101906102f29190613d58565b610a38565b005b610313600480360381019061030e9190613e8f565b610ad1565b604051610321929190614a10565b60405180910390f35b610344600480360381019061033f9190613a58565b610b1d565b005b61034e610bbe565b60405161035b9190614da8565b60405180910390f35b61036c610bc4565b005b61038860048036038101906103839190613cec565b610eaa565b6040516103959190614a92565b60405180910390f35b6103b860048036038101906103b39190613dfc565b61105b565b005b6103c26110f1565b6040516103cf9190614da8565b60405180910390f35b6103e0611100565b6040516103ed91906148fc565b60405180910390f35b610410600480360381019061040b91906139b7565b611126565b005b61042c60048036038101906104279190613ba6565b6111e6565b005b610448600480360381019061044391906139e0565b611283565b005b610452611399565b005b61045c611421565b60405161046991906148fc565b60405180910390f35b61047a61144a565b6040516104879190614aeb565b60405180910390f35b6104aa60048036038101906104a59190613e3d565b61145d565b005b6104b46114e3565b6040516104c19190614b06565b60405180910390f35b6104d261151c565b6040516104df9190614da8565b60405180910390f35b61050260048036038101906104fd9190613e3d565b611522565b005b61051e60048036038101906105199190613c25565b61180f565b005b61053a60048036038101906105359190613e3d565b611990565b6040516105479190614a39565b60405180910390f35b61056a60048036038101906105659190613e3d565b611af7565b604051610578929190614a5b565b60405180910390f35b610589611d1a565b6040516105969190614b06565b60405180910390f35b6105a7611da8565b6040516105b491906148fc565b60405180910390f35b6105d760048036038101906105d29190613a1c565b611dc0565b6040516105e49190614aeb565b60405180910390f35b61060760048036038101906106029190613b17565b611e54565b005b610623600480360381019061061e91906139b7565b611ef5565b005b61063f600480360381019061063a9190613c9d565b611fed565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a990614b68565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006107168261208a565b80610765575063bb3bafd660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b45750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610803575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6040518060400160405280600981526020017f4361736820436f7773000000000000000000000000000000000000000000000081525081565b6060600960009054906101000a900460ff16156108ec5760088054610867906151b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610893906151b4565b80156108e05780601f106108b5576101008083540402835291602001916108e0565b820191906000526020600020905b8154815290600101906020018083116108c357829003601f168201915b5050505050905061091a565b60086108f78361216c565b6040516020016109089291906148b8565b60405160208183030381529060405290505b919050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3357600167ffffffffffffffff8111156109b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109e65781602001602082028036833780820191505090505b509050600a5481600081518110610a26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b919050565b610a4061231f565b73ffffffffffffffffffffffffffffffffffffffff16610a5e611421565b73ffffffffffffffffffffffffffffffffffffffff1614610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90614d08565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600a5485610b089190615068565b610b129190615037565b915091509250929050565b610b2561231f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b6b5750610b6a85610b6561231f565b611dc0565b5b610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba190614c48565b60405180910390fd5b610bb78585858585612327565b5050505050565b610d0581565b610bcc61231f565b73ffffffffffffffffffffffffffffffffffffffff16610bea611421565b73ffffffffffffffffffffffffffffffffffffffff1614610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790614d08565b60405180910390fd5b60004790506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca291906148fc565b60206040518083038186803b158015610cba57600080fd5b505afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190613e66565b90506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610d53929190614a10565b602060405180830381600087803b158015610d6d57600080fd5b505af1158015610d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da59190613d81565b905080610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90614c68565b60405180910390fd5b6000831115610ea5576000610dfa61231f565b73ffffffffffffffffffffffffffffffffffffffff1684604051610e1d906148e7565b60006040518083038185875af1925050503d8060008114610e5a576040519150601f19603f3d011682016040523d82523d6000602084013e610e5f565b606091505b5050905080610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90614be8565b60405180910390fd5b505b505050565b60608151835114610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614d48565b60405180910390fd5b6000835167ffffffffffffffff811115610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f615781602001602082028036833780820191505090505b50905060005b845181101561105057610ffa858281518110610fac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610fed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610641565b828281518110611033577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080611049906151e6565b9050610f67565b508091505092915050565b61106361231f565b73ffffffffffffffffffffffffffffffffffffffff16611081611421565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90614d08565b60405180910390fd5b80600890805190602001906110ed929190613670565b5050565b60006110fb61268a565b905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61112e61231f565b73ffffffffffffffffffffffffffffffffffffffff1661114c611421565b73ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990614d08565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111ee61231f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061123457506112338361122e61231f565b611dc0565b5b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614bc8565b60405180910390fd5b61127e83838361269b565b505050565b61128b61231f565b73ffffffffffffffffffffffffffffffffffffffff166112a9611421565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614d08565b60405180910390fd5b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a819055508173ffffffffffffffffffffffffffffffffffffffff167fa0a3764a6a020070a984037ddad31af783c92eae7581e99c957792d105717dd48260405161138d9190614da8565b60405180910390a25050565b6113a161231f565b73ffffffffffffffffffffffffffffffffffffffff166113bf611421565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614d08565b60405180910390fd5b61141f600061299a565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960009054906101000a900460ff1681565b61146561231f565b73ffffffffffffffffffffffffffffffffffffffff16611483611421565b73ffffffffffffffffffffffffffffffffffffffff16146114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090614d08565b60405180910390fd5b8060078190555050565b6040518060400160405280600781526020017f43415348434f570000000000000000000000000000000000000000000000000081525081565b60075481565b610d0561152d61268a565b111561156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590614ca8565b60405180910390fd5b600061157861268a565b9050600061159183600754612a5e90919063ffffffff16565b9050610d0583836115a29190614fe1565b11156115e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115da90614c08565b60405180910390fd5b610d05821115611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90614ca8565b60405180910390fd5b611630612a74565b811115611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990614ce8565b60405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016116d39392919061497f565b602060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117259190613d81565b905080611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614c68565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f4e26b0356a15833a75d497ecc40ebbb716b99466ed0dba9454f1fff451e25a9085846007546040516117b393929190614dec565b60405180910390a260005b84811015611808576117eb336117d46006612b26565b600160405180602001604052806000815250612b34565b6117f56006612ccb565b8080611800906151e6565b9150506117be565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff1661182e61231f565b73ffffffffffffffffffffffffffffffffffffffff161415611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90614d28565b60405180910390fd5b806002600061189261231f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661193f61231f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119849190614aeb565b60405180910390a35050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611af257600167ffffffffffffffff811115611a29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a575781602001602082028036833780820191505090505b509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b919050565b606080600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d1557600167ffffffffffffffff811115611b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611bbf5781602001602082028036833780820191505090505b509150600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600081518110611c1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600167ffffffffffffffff811115611c9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611cc85781602001602082028036833780820191505090505b509050600a5481600081518110611d08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b915091565b60088054611d27906151b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d53906151b4565b8015611da05780601f10611d7557610100808354040283529160200191611da0565b820191906000526020600020905b815481529060010190602001808311611d8357829003601f168201915b505050505081565b736c474099ad6d9af49201a38b9842111d4acd10bc81565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e5c61231f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ea25750611ea185611e9c61231f565b611dc0565b5b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614bc8565b60405180910390fd5b611eee8585858585612ce1565b5050505050565b611efd61231f565b73ffffffffffffffffffffffffffffffffffffffff16611f1b611421565b73ffffffffffffffffffffffffffffffffffffffff1614611f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6890614d08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614b88565b60405180910390fd5b611fea8161299a565b50565b611ff561231f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061203b575061203a8361203561231f565b611dc0565b5b61207a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207190614bc8565b60405180910390fd5b612085838383612f66565b505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061215557507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612165575061216482613185565b5b9050919050565b606060008214156121b4576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061231a565b600082905060005b600082146121e65780806121cf906151e6565b915050600a826121df9190615037565b91506121bc565b60008167ffffffffffffffff811115612228577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561225a5781602001600182028036833780820191505090505b50905060008290508593505b6000841461231257600a8461227b919061522f565b60306122879190614fe1565b60f81b82826122959061518a565b925082815181106122cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8461230b9190615037565b9350612266565b819450505050505b919050565b600033905090565b815183511461236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290614d68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d290614c28565b60405180910390fd5b60006123e561231f565b90506123f58187878787876131ef565b60005b84518110156125f557600085828151811061243c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110612481577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a90614cc8565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125da9190614fe1565b92505081905550505050806125ee906151e6565b90506123f8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161266c929190614ab4565b60405180910390a46126828187878787876131f7565b505050505050565b60006126966006612b26565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290614c88565b60405180910390fd5b805182511461274f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274690614d68565b60405180910390fd5b600061275961231f565b9050612779818560008686604051806020016040528060008152506131ef565b60005b83518110156129145760008482815181106127c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612805577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006001600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e90614ba8565b60405180910390fd5b8181036001600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061290c906151e6565b91505061277c565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161298c929190614ab4565b60405180910390a450505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612a6c9190615068565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612ad191906148fc565b60206040518083038186803b158015612ae957600080fd5b505afa158015612afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b219190613e66565b905090565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9b90614d88565b60405180910390fd5b6000612bae61231f565b9050612bcf81600087612bc0886133c7565b612bc9886133c7565b876131ef565b826001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c2f9190614fe1565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612cad929190614dc3565b60405180910390a4612cc48160008787878761348d565b5050505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4890614c28565b60405180910390fd5b6000612d5b61231f565b9050612d7b818787612d6c886133c7565b612d75886133c7565b876131ef565b60006001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614cc8565b60405180910390fd5b8381036001600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eca9190614fe1565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612f47929190614dc3565b60405180910390a4612f5d82888888888861348d565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcd90614c88565b60405180910390fd5b6000612fe061231f565b905061301081856000612ff2876133c7565b612ffb876133c7565b604051806020016040528060008152506131ef565b60006001600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156130a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309f90614ba8565b60405180910390fd5b8281036001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051613176929190614dc3565b60405180910390a45050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b6132168473ffffffffffffffffffffffffffffffffffffffff1661365d565b156133bf578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161325c959493929190614917565b602060405180830381600087803b15801561327657600080fd5b505af19250505080156132a757506040513d601f19601f820116820180604052508101906132a49190613dd3565b60015b613336576132b361533a565b806132be57506132fb565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f29190614b06565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332d90614b28565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b490614b48565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561340c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561343a5781602001602082028036833780820191505090505b5090508281600081518110613478577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b6134ac8473ffffffffffffffffffffffffffffffffffffffff1661365d565b15613655578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016134f29594939291906149b6565b602060405180830381600087803b15801561350c57600080fd5b505af192505050801561353d57506040513d601f19601f8201168201806040525081019061353a9190613dd3565b60015b6135cc5761354961533a565b806135545750613591565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135889190614b06565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c390614b28565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364a90614b48565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b82805461367c906151b4565b90600052602060002090601f01602090048101928261369e57600085556136e5565b82601f106136b757805160ff19168380011785556136e5565b828001600101855582156136e5579182015b828111156136e45782518255916020019190600101906136c9565b5b5090506136f291906136f6565b5090565b5b8082111561370f5760008160009055506001016136f7565b5090565b600061372661372184614e54565b614e23565b9050808382526020820190508285602086028201111561374557600080fd5b60005b85811015613775578161375b8882613867565b845260208401935060208301925050600181019050613748565b5050509392505050565b600061379261378d84614e80565b614e23565b905080838252602082019050828560208602820111156137b157600080fd5b60005b858110156137e157816137c7888261398d565b8452602084019350602083019250506001810190506137b4565b5050509392505050565b60006137fe6137f984614eac565b614e23565b90508281526020810184848401111561381657600080fd5b613821848285615148565b509392505050565b600061383c61383784614edc565b614e23565b90508281526020810184848401111561385457600080fd5b61385f848285615148565b509392505050565b600081359050613876816153f0565b92915050565b60008135905061388b81615407565b92915050565b600082601f8301126138a257600080fd5b81356138b2848260208601613713565b91505092915050565b600082601f8301126138cc57600080fd5b81356138dc84826020860161377f565b91505092915050565b6000813590506138f48161541e565b92915050565b6000815190506139098161541e565b92915050565b60008135905061391e81615435565b92915050565b60008151905061393381615435565b92915050565b600082601f83011261394a57600080fd5b813561395a8482602086016137eb565b91505092915050565b600082601f83011261397457600080fd5b8135613984848260208601613829565b91505092915050565b60008135905061399c8161544c565b92915050565b6000815190506139b18161544c565b92915050565b6000602082840312156139c957600080fd5b60006139d784828501613867565b91505092915050565b600080604083850312156139f357600080fd5b6000613a018582860161387c565b9250506020613a128582860161398d565b9150509250929050565b60008060408385031215613a2f57600080fd5b6000613a3d85828601613867565b9250506020613a4e85828601613867565b9150509250929050565b600080600080600060a08688031215613a7057600080fd5b6000613a7e88828901613867565b9550506020613a8f88828901613867565b945050604086013567ffffffffffffffff811115613aac57600080fd5b613ab8888289016138bb565b935050606086013567ffffffffffffffff811115613ad557600080fd5b613ae1888289016138bb565b925050608086013567ffffffffffffffff811115613afe57600080fd5b613b0a88828901613939565b9150509295509295909350565b600080600080600060a08688031215613b2f57600080fd5b6000613b3d88828901613867565b9550506020613b4e88828901613867565b9450506040613b5f8882890161398d565b9350506060613b708882890161398d565b925050608086013567ffffffffffffffff811115613b8d57600080fd5b613b9988828901613939565b9150509295509295909350565b600080600060608486031215613bbb57600080fd5b6000613bc986828701613867565b935050602084013567ffffffffffffffff811115613be657600080fd5b613bf2868287016138bb565b925050604084013567ffffffffffffffff811115613c0f57600080fd5b613c1b868287016138bb565b9150509250925092565b60008060408385031215613c3857600080fd5b6000613c4685828601613867565b9250506020613c57858286016138e5565b9150509250929050565b60008060408385031215613c7457600080fd5b6000613c8285828601613867565b9250506020613c938582860161398d565b9150509250929050565b600080600060608486031215613cb257600080fd5b6000613cc086828701613867565b9350506020613cd18682870161398d565b9250506040613ce28682870161398d565b9150509250925092565b60008060408385031215613cff57600080fd5b600083013567ffffffffffffffff811115613d1957600080fd5b613d2585828601613891565b925050602083013567ffffffffffffffff811115613d4257600080fd5b613d4e858286016138bb565b9150509250929050565b600060208284031215613d6a57600080fd5b6000613d78848285016138e5565b91505092915050565b600060208284031215613d9357600080fd5b6000613da1848285016138fa565b91505092915050565b600060208284031215613dbc57600080fd5b6000613dca8482850161390f565b91505092915050565b600060208284031215613de557600080fd5b6000613df384828501613924565b91505092915050565b600060208284031215613e0e57600080fd5b600082013567ffffffffffffffff811115613e2857600080fd5b613e3484828501613963565b91505092915050565b600060208284031215613e4f57600080fd5b6000613e5d8482850161398d565b91505092915050565b600060208284031215613e7857600080fd5b6000613e86848285016139a2565b91505092915050565b60008060408385031215613ea257600080fd5b6000613eb08582860161398d565b9250506020613ec18582860161398d565b9150509250929050565b6000613ed78383613efb565b60208301905092915050565b6000613eef838361489a565b60208301905092915050565b613f04816150d4565b82525050565b613f13816150c2565b82525050565b6000613f2482614f41565b613f2e8185614f87565b9350613f3983614f0c565b8060005b83811015613f6a578151613f518882613ecb565b9750613f5c83614f6d565b925050600181019050613f3d565b5085935050505092915050565b6000613f8282614f4c565b613f8c8185614f98565b9350613f9783614f1c565b8060005b83811015613fc8578151613faf8882613ee3565b9750613fba83614f7a565b925050600181019050613f9b565b5085935050505092915050565b613fde816150e6565b82525050565b6000613fef82614f57565b613ff98185614fa9565b9350614009818560208601615157565b6140128161531c565b840191505092915050565b600061402882614f62565b6140328185614fc5565b9350614042818560208601615157565b61404b8161531c565b840191505092915050565b600061406182614f62565b61406b8185614fd6565b935061407b818560208601615157565b80840191505092915050565b60008154614094816151b4565b61409e8186614fd6565b945060018216600081146140b957600181146140ca576140fd565b60ff198316865281860193506140fd565b6140d385614f2c565b60005b838110156140f5578154818901526001820191506020810190506140d6565b838801955050505b50505092915050565b6000614113603483614fc5565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000614179602883614fc5565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141df602b83614fc5565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614245602683614fc5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ab602483614fc5565b91507f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614311602983614fc5565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614377601483614fc5565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b60006143b7600983614fc5565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b60006143f7602583614fc5565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061445d603283614fc5565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006144c3601583614fc5565b91507f546f6b656e207472616e73666572206661696c656400000000000000000000006000830152602082019050919050565b6000614503602383614fc5565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614569600883614fc5565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b60006145a9602a83614fc5565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b600061460f602983614fc5565b91507f4d7573742068617665206d6f7265207468616e206f7220657175616c20746f2060008301527f4547475320636f737400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614675600583614fd6565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006146b5602083614fc5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146f5600083614fba565b9150600082019050919050565b600061470f602983614fc5565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614775602983614fc5565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b60006147db602883614fc5565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614841602183614fc5565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6148a38161513e565b82525050565b6148b28161513e565b82525050565b60006148c48285614087565b91506148d08284614056565b91506148db82614668565b91508190509392505050565b60006148f2826146e8565b9150819050919050565b60006020820190506149116000830184613f0a565b92915050565b600060a08201905061492c6000830188613f0a565b6149396020830187613f0a565b818103604083015261494b8186613f77565b9050818103606083015261495f8185613f77565b905081810360808301526149738184613fe4565b90509695505050505050565b60006060820190506149946000830186613f0a565b6149a16020830185613f0a565b6149ae60408301846148a9565b949350505050565b600060a0820190506149cb6000830188613f0a565b6149d86020830187613f0a565b6149e560408301866148a9565b6149f260608301856148a9565b8181036080830152614a048184613fe4565b90509695505050505050565b6000604082019050614a256000830185613f0a565b614a3260208301846148a9565b9392505050565b60006020820190508181036000830152614a538184613f19565b905092915050565b60006040820190508181036000830152614a758185613f19565b90508181036020830152614a898184613f77565b90509392505050565b60006020820190508181036000830152614aac8184613f77565b905092915050565b60006040820190508181036000830152614ace8185613f77565b90508181036020830152614ae28184613f77565b90509392505050565b6000602082019050614b006000830184613fd5565b92915050565b60006020820190508181036000830152614b20818461401d565b905092915050565b60006020820190508181036000830152614b4181614106565b9050919050565b60006020820190508181036000830152614b618161416c565b9050919050565b60006020820190508181036000830152614b81816141d2565b9050919050565b60006020820190508181036000830152614ba181614238565b9050919050565b60006020820190508181036000830152614bc18161429e565b9050919050565b60006020820190508181036000830152614be181614304565b9050919050565b60006020820190508181036000830152614c018161436a565b9050919050565b60006020820190508181036000830152614c21816143aa565b9050919050565b60006020820190508181036000830152614c41816143ea565b9050919050565b60006020820190508181036000830152614c6181614450565b9050919050565b60006020820190508181036000830152614c81816144b6565b9050919050565b60006020820190508181036000830152614ca1816144f6565b9050919050565b60006020820190508181036000830152614cc18161455c565b9050919050565b60006020820190508181036000830152614ce18161459c565b9050919050565b60006020820190508181036000830152614d0181614602565b9050919050565b60006020820190508181036000830152614d21816146a8565b9050919050565b60006020820190508181036000830152614d4181614702565b9050919050565b60006020820190508181036000830152614d6181614768565b9050919050565b60006020820190508181036000830152614d81816147ce565b9050919050565b60006020820190508181036000830152614da181614834565b9050919050565b6000602082019050614dbd60008301846148a9565b92915050565b6000604082019050614dd860008301856148a9565b614de560208301846148a9565b9392505050565b6000606082019050614e0160008301866148a9565b614e0e60208301856148a9565b614e1b60408301846148a9565b949350505050565b6000604051905081810181811067ffffffffffffffff82111715614e4a57614e496152ed565b5b8060405250919050565b600067ffffffffffffffff821115614e6f57614e6e6152ed565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e9b57614e9a6152ed565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ec757614ec66152ed565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ef757614ef66152ed565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fec8261513e565b9150614ff78361513e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561502c5761502b615260565b5b828201905092915050565b60006150428261513e565b915061504d8361513e565b92508261505d5761505c61528f565b5b828204905092915050565b60006150738261513e565b915061507e8361513e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150b7576150b6615260565b5b828202905092915050565b60006150cd8261511e565b9050919050565b60006150df8261511e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561517557808201518184015260208101905061515a565b83811115615184576000848401525b50505050565b60006151958261513e565b915060008214156151a9576151a8615260565b5b600182039050919050565b600060028204905060018216806151cc57607f821691505b602082108114156151e0576151df6152be565b5b50919050565b60006151f18261513e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561522457615223615260565b5b600182019050919050565b600061523a8261513e565b91506152458361513e565b9250826152555761525461528f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d101561534a576153ed565b60046000803e61535b60005161532d565b6308c379a0811461536c57506153ed565b60405160043d036004823e80513d602482011167ffffffffffffffff82111715615398575050506153ed565b808201805167ffffffffffffffff8111156153b75750505050506153ed565b8060208301013d85018111156153d2575050505050506153ed565b6153db8261531c565b60208401016040528296505050505050505b90565b6153f9816150c2565b811461540457600080fd5b50565b615410816150d4565b811461541b57600080fd5b50565b615427816150e6565b811461543257600080fd5b50565b61543e816150f2565b811461544957600080fd5b50565b6154558161513e565b811461546057600080fd5b5056fea264697066735822122095166f497bbd3d7848e49c1615011b6d84e024384e03266bd2a59c0604fa833a64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d59434e5741705247426e3644635335736f62524e31335356714c69517a5133787478567071786b78663150782f312e67696600000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636c2f5acd1161011a578063a22cb465116100ad578063e927fc5c1161007c578063e927fc5c1461059f578063e985e9c5146105bd578063f242432a146105ed578063f2fde38b14610609578063f5298aca14610625576101fa565b8063a22cb46514610504578063b9c4d9fb14610520578063bb3bafd614610550578063d547cfb714610581576101fa565b806391b7f5ed116100e957806391b7f5ed1461049057806395d89b41146104ac578063a035b1fe146104ca578063a0712d68146104e8576101fa565b80636c2f5acd1461042e578063715018a61461044a5780638da5cb5b146104545780638e89457a14610472576101fa565b80633502a7161161019257806359a7715a1161016157806359a7715a146103ba57806359a9b1e3146103d857806366ac99c5146103f65780636b20c45414610412576101fa565b80633502a716146103465780633ccfd60b146103645780634e1273f41461036e57806355f804b31461039e576101fa565b80630ebd4c7f116101ce5780630ebd4c7f146102ad5780631e960d20146102dd5780632a55205a146102f95780632eb2c2d61461032a576101fa565b8062fdd58e146101ff57806301ffc9a71461022f57806306fdde031461025f5780630e89341c1461027d575b600080fd5b61021960048036038101906102149190613c61565b610641565b6040516102269190614da8565b60405180910390f35b61024960048036038101906102449190613daa565b61070b565b6040516102569190614aeb565b60405180910390f35b61026761080a565b6040516102749190614b06565b60405180910390f35b61029760048036038101906102929190613e3d565b610843565b6040516102a49190614b06565b60405180910390f35b6102c760048036038101906102c29190613e3d565b61091f565b6040516102d49190614a92565b60405180910390f35b6102f760048036038101906102f29190613d58565b610a38565b005b610313600480360381019061030e9190613e8f565b610ad1565b604051610321929190614a10565b60405180910390f35b610344600480360381019061033f9190613a58565b610b1d565b005b61034e610bbe565b60405161035b9190614da8565b60405180910390f35b61036c610bc4565b005b61038860048036038101906103839190613cec565b610eaa565b6040516103959190614a92565b60405180910390f35b6103b860048036038101906103b39190613dfc565b61105b565b005b6103c26110f1565b6040516103cf9190614da8565b60405180910390f35b6103e0611100565b6040516103ed91906148fc565b60405180910390f35b610410600480360381019061040b91906139b7565b611126565b005b61042c60048036038101906104279190613ba6565b6111e6565b005b610448600480360381019061044391906139e0565b611283565b005b610452611399565b005b61045c611421565b60405161046991906148fc565b60405180910390f35b61047a61144a565b6040516104879190614aeb565b60405180910390f35b6104aa60048036038101906104a59190613e3d565b61145d565b005b6104b46114e3565b6040516104c19190614b06565b60405180910390f35b6104d261151c565b6040516104df9190614da8565b60405180910390f35b61050260048036038101906104fd9190613e3d565b611522565b005b61051e60048036038101906105199190613c25565b61180f565b005b61053a60048036038101906105359190613e3d565b611990565b6040516105479190614a39565b60405180910390f35b61056a60048036038101906105659190613e3d565b611af7565b604051610578929190614a5b565b60405180910390f35b610589611d1a565b6040516105969190614b06565b60405180910390f35b6105a7611da8565b6040516105b491906148fc565b60405180910390f35b6105d760048036038101906105d29190613a1c565b611dc0565b6040516105e49190614aeb565b60405180910390f35b61060760048036038101906106029190613b17565b611e54565b005b610623600480360381019061061e91906139b7565b611ef5565b005b61063f600480360381019061063a9190613c9d565b611fed565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a990614b68565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006107168261208a565b80610765575063bb3bafd660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b45750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610803575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6040518060400160405280600981526020017f4361736820436f7773000000000000000000000000000000000000000000000081525081565b6060600960009054906101000a900460ff16156108ec5760088054610867906151b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610893906151b4565b80156108e05780601f106108b5576101008083540402835291602001916108e0565b820191906000526020600020905b8154815290600101906020018083116108c357829003601f168201915b5050505050905061091a565b60086108f78361216c565b6040516020016109089291906148b8565b60405160208183030381529060405290505b919050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3357600167ffffffffffffffff8111156109b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109e65781602001602082028036833780820191505090505b509050600a5481600081518110610a26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b919050565b610a4061231f565b73ffffffffffffffffffffffffffffffffffffffff16610a5e611421565b73ffffffffffffffffffffffffffffffffffffffff1614610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90614d08565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600a5485610b089190615068565b610b129190615037565b915091509250929050565b610b2561231f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b6b5750610b6a85610b6561231f565b611dc0565b5b610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba190614c48565b60405180910390fd5b610bb78585858585612327565b5050505050565b610d0581565b610bcc61231f565b73ffffffffffffffffffffffffffffffffffffffff16610bea611421565b73ffffffffffffffffffffffffffffffffffffffff1614610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790614d08565b60405180910390fd5b60004790506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ca291906148fc565b60206040518083038186803b158015610cba57600080fd5b505afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190613e66565b90506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610d53929190614a10565b602060405180830381600087803b158015610d6d57600080fd5b505af1158015610d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da59190613d81565b905080610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90614c68565b60405180910390fd5b6000831115610ea5576000610dfa61231f565b73ffffffffffffffffffffffffffffffffffffffff1684604051610e1d906148e7565b60006040518083038185875af1925050503d8060008114610e5a576040519150601f19603f3d011682016040523d82523d6000602084013e610e5f565b606091505b5050905080610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90614be8565b60405180910390fd5b505b505050565b60608151835114610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614d48565b60405180910390fd5b6000835167ffffffffffffffff811115610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f615781602001602082028036833780820191505090505b50905060005b845181101561105057610ffa858281518110610fac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610fed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610641565b828281518110611033577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080611049906151e6565b9050610f67565b508091505092915050565b61106361231f565b73ffffffffffffffffffffffffffffffffffffffff16611081611421565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90614d08565b60405180910390fd5b80600890805190602001906110ed929190613670565b5050565b60006110fb61268a565b905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61112e61231f565b73ffffffffffffffffffffffffffffffffffffffff1661114c611421565b73ffffffffffffffffffffffffffffffffffffffff16146111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990614d08565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111ee61231f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061123457506112338361122e61231f565b611dc0565b5b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614bc8565b60405180910390fd5b61127e83838361269b565b505050565b61128b61231f565b73ffffffffffffffffffffffffffffffffffffffff166112a9611421565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614d08565b60405180910390fd5b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a819055508173ffffffffffffffffffffffffffffffffffffffff167fa0a3764a6a020070a984037ddad31af783c92eae7581e99c957792d105717dd48260405161138d9190614da8565b60405180910390a25050565b6113a161231f565b73ffffffffffffffffffffffffffffffffffffffff166113bf611421565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614d08565b60405180910390fd5b61141f600061299a565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960009054906101000a900460ff1681565b61146561231f565b73ffffffffffffffffffffffffffffffffffffffff16611483611421565b73ffffffffffffffffffffffffffffffffffffffff16146114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090614d08565b60405180910390fd5b8060078190555050565b6040518060400160405280600781526020017f43415348434f570000000000000000000000000000000000000000000000000081525081565b60075481565b610d0561152d61268a565b111561156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590614ca8565b60405180910390fd5b600061157861268a565b9050600061159183600754612a5e90919063ffffffff16565b9050610d0583836115a29190614fe1565b11156115e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115da90614c08565b60405180910390fd5b610d05821115611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90614ca8565b60405180910390fd5b611630612a74565b811115611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990614ce8565b60405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016116d39392919061497f565b602060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117259190613d81565b905080611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e90614c68565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f4e26b0356a15833a75d497ecc40ebbb716b99466ed0dba9454f1fff451e25a9085846007546040516117b393929190614dec565b60405180910390a260005b84811015611808576117eb336117d46006612b26565b600160405180602001604052806000815250612b34565b6117f56006612ccb565b8080611800906151e6565b9150506117be565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff1661182e61231f565b73ffffffffffffffffffffffffffffffffffffffff161415611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90614d28565b60405180910390fd5b806002600061189261231f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661193f61231f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119849190614aeb565b60405180910390a35050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611af257600167ffffffffffffffff811115611a29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a575781602001602082028036833780820191505090505b509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b919050565b606080600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d1557600167ffffffffffffffff811115611b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611bbf5781602001602082028036833780820191505090505b509150600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600081518110611c1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600167ffffffffffffffff811115611c9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611cc85781602001602082028036833780820191505090505b509050600a5481600081518110611d08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b915091565b60088054611d27906151b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d53906151b4565b8015611da05780601f10611d7557610100808354040283529160200191611da0565b820191906000526020600020905b815481529060010190602001808311611d8357829003601f168201915b505050505081565b736c474099ad6d9af49201a38b9842111d4acd10bc81565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e5c61231f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ea25750611ea185611e9c61231f565b611dc0565b5b611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890614bc8565b60405180910390fd5b611eee8585858585612ce1565b5050505050565b611efd61231f565b73ffffffffffffffffffffffffffffffffffffffff16611f1b611421565b73ffffffffffffffffffffffffffffffffffffffff1614611f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6890614d08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614b88565b60405180910390fd5b611fea8161299a565b50565b611ff561231f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061203b575061203a8361203561231f565b611dc0565b5b61207a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207190614bc8565b60405180910390fd5b612085838383612f66565b505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061215557507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612165575061216482613185565b5b9050919050565b606060008214156121b4576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061231a565b600082905060005b600082146121e65780806121cf906151e6565b915050600a826121df9190615037565b91506121bc565b60008167ffffffffffffffff811115612228577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561225a5781602001600182028036833780820191505090505b50905060008290508593505b6000841461231257600a8461227b919061522f565b60306122879190614fe1565b60f81b82826122959061518a565b925082815181106122cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8461230b9190615037565b9350612266565b819450505050505b919050565b600033905090565b815183511461236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290614d68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156123db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d290614c28565b60405180910390fd5b60006123e561231f565b90506123f58187878787876131ef565b60005b84518110156125f557600085828151811061243c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110612481577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a90614cc8565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125da9190614fe1565b92505081905550505050806125ee906151e6565b90506123f8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161266c929190614ab4565b60405180910390a46126828187878787876131f7565b505050505050565b60006126966006612b26565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290614c88565b60405180910390fd5b805182511461274f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274690614d68565b60405180910390fd5b600061275961231f565b9050612779818560008686604051806020016040528060008152506131ef565b60005b83518110156129145760008482815181106127c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110612805577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060006001600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e90614ba8565b60405180910390fd5b8181036001600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061290c906151e6565b91505061277c565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161298c929190614ab4565b60405180910390a450505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183612a6c9190615068565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612ad191906148fc565b60206040518083038186803b158015612ae957600080fd5b505afa158015612afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b219190613e66565b905090565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9b90614d88565b60405180910390fd5b6000612bae61231f565b9050612bcf81600087612bc0886133c7565b612bc9886133c7565b876131ef565b826001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c2f9190614fe1565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612cad929190614dc3565b60405180910390a4612cc48160008787878761348d565b5050505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4890614c28565b60405180910390fd5b6000612d5b61231f565b9050612d7b818787612d6c886133c7565b612d75886133c7565b876131ef565b60006001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614cc8565b60405180910390fd5b8381036001600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eca9190614fe1565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612f47929190614dc3565b60405180910390a4612f5d82888888888861348d565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fcd90614c88565b60405180910390fd5b6000612fe061231f565b905061301081856000612ff2876133c7565b612ffb876133c7565b604051806020016040528060008152506131ef565b60006001600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156130a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309f90614ba8565b60405180910390fd5b8281036001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051613176929190614dc3565b60405180910390a45050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b6132168473ffffffffffffffffffffffffffffffffffffffff1661365d565b156133bf578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161325c959493929190614917565b602060405180830381600087803b15801561327657600080fd5b505af19250505080156132a757506040513d601f19601f820116820180604052508101906132a49190613dd3565b60015b613336576132b361533a565b806132be57506132fb565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f29190614b06565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332d90614b28565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b490614b48565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561340c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561343a5781602001602082028036833780820191505090505b5090508281600081518110613478577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b6134ac8473ffffffffffffffffffffffffffffffffffffffff1661365d565b15613655578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016134f29594939291906149b6565b602060405180830381600087803b15801561350c57600080fd5b505af192505050801561353d57506040513d601f19601f8201168201806040525081019061353a9190613dd3565b60015b6135cc5761354961533a565b806135545750613591565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135889190614b06565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c390614b28565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364a90614b48565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b82805461367c906151b4565b90600052602060002090601f01602090048101928261369e57600085556136e5565b82601f106136b757805160ff19168380011785556136e5565b828001600101855582156136e5579182015b828111156136e45782518255916020019190600101906136c9565b5b5090506136f291906136f6565b5090565b5b8082111561370f5760008160009055506001016136f7565b5090565b600061372661372184614e54565b614e23565b9050808382526020820190508285602086028201111561374557600080fd5b60005b85811015613775578161375b8882613867565b845260208401935060208301925050600181019050613748565b5050509392505050565b600061379261378d84614e80565b614e23565b905080838252602082019050828560208602820111156137b157600080fd5b60005b858110156137e157816137c7888261398d565b8452602084019350602083019250506001810190506137b4565b5050509392505050565b60006137fe6137f984614eac565b614e23565b90508281526020810184848401111561381657600080fd5b613821848285615148565b509392505050565b600061383c61383784614edc565b614e23565b90508281526020810184848401111561385457600080fd5b61385f848285615148565b509392505050565b600081359050613876816153f0565b92915050565b60008135905061388b81615407565b92915050565b600082601f8301126138a257600080fd5b81356138b2848260208601613713565b91505092915050565b600082601f8301126138cc57600080fd5b81356138dc84826020860161377f565b91505092915050565b6000813590506138f48161541e565b92915050565b6000815190506139098161541e565b92915050565b60008135905061391e81615435565b92915050565b60008151905061393381615435565b92915050565b600082601f83011261394a57600080fd5b813561395a8482602086016137eb565b91505092915050565b600082601f83011261397457600080fd5b8135613984848260208601613829565b91505092915050565b60008135905061399c8161544c565b92915050565b6000815190506139b18161544c565b92915050565b6000602082840312156139c957600080fd5b60006139d784828501613867565b91505092915050565b600080604083850312156139f357600080fd5b6000613a018582860161387c565b9250506020613a128582860161398d565b9150509250929050565b60008060408385031215613a2f57600080fd5b6000613a3d85828601613867565b9250506020613a4e85828601613867565b9150509250929050565b600080600080600060a08688031215613a7057600080fd5b6000613a7e88828901613867565b9550506020613a8f88828901613867565b945050604086013567ffffffffffffffff811115613aac57600080fd5b613ab8888289016138bb565b935050606086013567ffffffffffffffff811115613ad557600080fd5b613ae1888289016138bb565b925050608086013567ffffffffffffffff811115613afe57600080fd5b613b0a88828901613939565b9150509295509295909350565b600080600080600060a08688031215613b2f57600080fd5b6000613b3d88828901613867565b9550506020613b4e88828901613867565b9450506040613b5f8882890161398d565b9350506060613b708882890161398d565b925050608086013567ffffffffffffffff811115613b8d57600080fd5b613b9988828901613939565b9150509295509295909350565b600080600060608486031215613bbb57600080fd5b6000613bc986828701613867565b935050602084013567ffffffffffffffff811115613be657600080fd5b613bf2868287016138bb565b925050604084013567ffffffffffffffff811115613c0f57600080fd5b613c1b868287016138bb565b9150509250925092565b60008060408385031215613c3857600080fd5b6000613c4685828601613867565b9250506020613c57858286016138e5565b9150509250929050565b60008060408385031215613c7457600080fd5b6000613c8285828601613867565b9250506020613c938582860161398d565b9150509250929050565b600080600060608486031215613cb257600080fd5b6000613cc086828701613867565b9350506020613cd18682870161398d565b9250506040613ce28682870161398d565b9150509250925092565b60008060408385031215613cff57600080fd5b600083013567ffffffffffffffff811115613d1957600080fd5b613d2585828601613891565b925050602083013567ffffffffffffffff811115613d4257600080fd5b613d4e858286016138bb565b9150509250929050565b600060208284031215613d6a57600080fd5b6000613d78848285016138e5565b91505092915050565b600060208284031215613d9357600080fd5b6000613da1848285016138fa565b91505092915050565b600060208284031215613dbc57600080fd5b6000613dca8482850161390f565b91505092915050565b600060208284031215613de557600080fd5b6000613df384828501613924565b91505092915050565b600060208284031215613e0e57600080fd5b600082013567ffffffffffffffff811115613e2857600080fd5b613e3484828501613963565b91505092915050565b600060208284031215613e4f57600080fd5b6000613e5d8482850161398d565b91505092915050565b600060208284031215613e7857600080fd5b6000613e86848285016139a2565b91505092915050565b60008060408385031215613ea257600080fd5b6000613eb08582860161398d565b9250506020613ec18582860161398d565b9150509250929050565b6000613ed78383613efb565b60208301905092915050565b6000613eef838361489a565b60208301905092915050565b613f04816150d4565b82525050565b613f13816150c2565b82525050565b6000613f2482614f41565b613f2e8185614f87565b9350613f3983614f0c565b8060005b83811015613f6a578151613f518882613ecb565b9750613f5c83614f6d565b925050600181019050613f3d565b5085935050505092915050565b6000613f8282614f4c565b613f8c8185614f98565b9350613f9783614f1c565b8060005b83811015613fc8578151613faf8882613ee3565b9750613fba83614f7a565b925050600181019050613f9b565b5085935050505092915050565b613fde816150e6565b82525050565b6000613fef82614f57565b613ff98185614fa9565b9350614009818560208601615157565b6140128161531c565b840191505092915050565b600061402882614f62565b6140328185614fc5565b9350614042818560208601615157565b61404b8161531c565b840191505092915050565b600061406182614f62565b61406b8185614fd6565b935061407b818560208601615157565b80840191505092915050565b60008154614094816151b4565b61409e8186614fd6565b945060018216600081146140b957600181146140ca576140fd565b60ff198316865281860193506140fd565b6140d385614f2c565b60005b838110156140f5578154818901526001820191506020810190506140d6565b838801955050505b50505092915050565b6000614113603483614fc5565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000614179602883614fc5565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141df602b83614fc5565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614245602683614fc5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ab602483614fc5565b91507f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614311602983614fc5565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614377601483614fc5565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b60006143b7600983614fc5565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b60006143f7602583614fc5565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061445d603283614fc5565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b60006144c3601583614fc5565b91507f546f6b656e207472616e73666572206661696c656400000000000000000000006000830152602082019050919050565b6000614503602383614fc5565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614569600883614fc5565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b60006145a9602a83614fc5565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b600061460f602983614fc5565b91507f4d7573742068617665206d6f7265207468616e206f7220657175616c20746f2060008301527f4547475320636f737400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614675600583614fd6565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006146b5602083614fc5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146f5600083614fba565b9150600082019050919050565b600061470f602983614fc5565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614775602983614fc5565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b60006147db602883614fc5565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614841602183614fc5565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6148a38161513e565b82525050565b6148b28161513e565b82525050565b60006148c48285614087565b91506148d08284614056565b91506148db82614668565b91508190509392505050565b60006148f2826146e8565b9150819050919050565b60006020820190506149116000830184613f0a565b92915050565b600060a08201905061492c6000830188613f0a565b6149396020830187613f0a565b818103604083015261494b8186613f77565b9050818103606083015261495f8185613f77565b905081810360808301526149738184613fe4565b90509695505050505050565b60006060820190506149946000830186613f0a565b6149a16020830185613f0a565b6149ae60408301846148a9565b949350505050565b600060a0820190506149cb6000830188613f0a565b6149d86020830187613f0a565b6149e560408301866148a9565b6149f260608301856148a9565b8181036080830152614a048184613fe4565b90509695505050505050565b6000604082019050614a256000830185613f0a565b614a3260208301846148a9565b9392505050565b60006020820190508181036000830152614a538184613f19565b905092915050565b60006040820190508181036000830152614a758185613f19565b90508181036020830152614a898184613f77565b90509392505050565b60006020820190508181036000830152614aac8184613f77565b905092915050565b60006040820190508181036000830152614ace8185613f77565b90508181036020830152614ae28184613f77565b90509392505050565b6000602082019050614b006000830184613fd5565b92915050565b60006020820190508181036000830152614b20818461401d565b905092915050565b60006020820190508181036000830152614b4181614106565b9050919050565b60006020820190508181036000830152614b618161416c565b9050919050565b60006020820190508181036000830152614b81816141d2565b9050919050565b60006020820190508181036000830152614ba181614238565b9050919050565b60006020820190508181036000830152614bc18161429e565b9050919050565b60006020820190508181036000830152614be181614304565b9050919050565b60006020820190508181036000830152614c018161436a565b9050919050565b60006020820190508181036000830152614c21816143aa565b9050919050565b60006020820190508181036000830152614c41816143ea565b9050919050565b60006020820190508181036000830152614c6181614450565b9050919050565b60006020820190508181036000830152614c81816144b6565b9050919050565b60006020820190508181036000830152614ca1816144f6565b9050919050565b60006020820190508181036000830152614cc18161455c565b9050919050565b60006020820190508181036000830152614ce18161459c565b9050919050565b60006020820190508181036000830152614d0181614602565b9050919050565b60006020820190508181036000830152614d21816146a8565b9050919050565b60006020820190508181036000830152614d4181614702565b9050919050565b60006020820190508181036000830152614d6181614768565b9050919050565b60006020820190508181036000830152614d81816147ce565b9050919050565b60006020820190508181036000830152614da181614834565b9050919050565b6000602082019050614dbd60008301846148a9565b92915050565b6000604082019050614dd860008301856148a9565b614de560208301846148a9565b9392505050565b6000606082019050614e0160008301866148a9565b614e0e60208301856148a9565b614e1b60408301846148a9565b949350505050565b6000604051905081810181811067ffffffffffffffff82111715614e4a57614e496152ed565b5b8060405250919050565b600067ffffffffffffffff821115614e6f57614e6e6152ed565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e9b57614e9a6152ed565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ec757614ec66152ed565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ef757614ef66152ed565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fec8261513e565b9150614ff78361513e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561502c5761502b615260565b5b828201905092915050565b60006150428261513e565b915061504d8361513e565b92508261505d5761505c61528f565b5b828204905092915050565b60006150738261513e565b915061507e8361513e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150b7576150b6615260565b5b828202905092915050565b60006150cd8261511e565b9050919050565b60006150df8261511e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561517557808201518184015260208101905061515a565b83811115615184576000848401525b50505050565b60006151958261513e565b915060008214156151a9576151a8615260565b5b600182039050919050565b600060028204905060018216806151cc57607f821691505b602082108114156151e0576151df6152be565b5b50919050565b60006151f18261513e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561522457615223615260565b5b600182019050919050565b600061523a8261513e565b91506152458361513e565b9250826152555761525461528f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d101561534a576153ed565b60046000803e61535b60005161532d565b6308c379a0811461536c57506153ed565b60405160043d036004823e80513d602482011167ffffffffffffffff82111715615398575050506153ed565b808201805167ffffffffffffffff8111156153b75750505050506153ed565b8060208301013d85018111156153d2575050505050506153ed565b6153db8261531c565b60208401016040528296505050505050505b90565b6153f9816150c2565b811461540457600080fd5b50565b615410816150d4565b811461541b57600080fd5b50565b615427816150e6565b811461543257600080fd5b50565b61543e816150f2565b811461544957600080fd5b50565b6154558161513e565b811461546057600080fd5b5056fea264697066735822122095166f497bbd3d7848e49c1615011b6d84e024384e03266bd2a59c0604fa833a64736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d59434e5741705247426e3644635335736f62524e31335356714c69517a5133787478567071786b78663150782f312e67696600000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://gateway.pinata.cloud/ipfs/QmYCNWApRGBn6DcS5sobRN13SVqLiQzQ3xtxVpqxkxf1Px/1.gif

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000056
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d59434e5741705247426e3644635335736f62524e31335356714c6951
Arg [4] : 7a5133787478567071786b78663150782f312e67696600000000000000000000


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.