ETH Price: $2,484.90 (+2.64%)

Token

Wuliangye NFT (WLY)
 

Overview

Max Total Supply

0 WLY

Holders

430

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 WLY
0xe0118f6fdf37c55d64828fcdd93b80cf7c6f33cd
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

"Wuliangye NFT" is a collection of NFTs authorized by the well-known domestic baijiu brand "Wuliangye".

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WLYBox

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 15 : wuliangyebox2.sol
// SPDX-License-Identifier: MIT
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

pragma solidity ^0.8.7;

abstract contract WLYInterface {
    function mint(address address_, uint256 tokenId_) public virtual returns (uint256);
}

contract WLYBox is ERC721, Ownable, Pausable, ReentrancyGuard {
    event BaseURIChanged(string newBaseURI);
    event WhitelistSaleConfigChanged(WhitelistSaleConfig config);
    event PublicSaleConfigChanged(PublicSaleConfig config);
    event RevealConfigChanged(RevealConfig config);
    event Withdraw(address indexed account, uint256 amount);
    event ContractSealed();

    struct WhitelistSaleConfig {
        uint64 mintQuota;
        uint256 startTime;
        uint256 endTime;
        bytes32 merkleRoot;
        uint256 price;
    }

    struct WaitlistSaleConfig {
        uint64 mintQuota;
        uint256 startTime;
        uint256 endTime;
        bytes32 merkleRoot;
        uint256 price;
    }


    struct PublicSaleConfig {
        uint256 startTime;
        uint256 price;
        uint64 mintQuota;
    }
    struct RevealConfig {
        uint64 startTime;
        address wlyContractAddress;
    }

    struct AirdropConfig {
        address airdropAddress;
        uint64 num;
    }

    uint256 public MAX_TOKEN = 3000;
    uint256 public totalMinted=0;
    bool public contractSealed;
    string public baseURI;
    mapping(address=>uint256) userMintCount;
    WhitelistSaleConfig public whitelistSaleConfig;
    WaitlistSaleConfig public waitlistSaleConfig;
    PublicSaleConfig public publicSaleConfig;
    RevealConfig public revealConfig;

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    constructor(string memory baseURI_, WhitelistSaleConfig memory whiteSaleConfig_) ERC721("Wuliangye NFT", "WLY") {
        baseURI = baseURI_;
        whitelistSaleConfig = whiteSaleConfig_;
    }

    function giveaway(AirdropConfig[] memory air) external onlyOwner nonReentrant {
        for (uint256 j;j<air.length;j++){
            require(air[j].airdropAddress != address(0), "zero address");
            require(air[j].num > 0, "invalid number of tokens");
            require(totalMinted + air[j].num <= MAX_TOKEN, "max supply exceeded");
            for(uint64 i=0;i<air[j].num;i++){
                mintNFT(air[j].airdropAddress);
            }
        }
    }

    function whitelistSale(bytes32[] calldata signature_) external payable callerIsUser nonReentrant {
        require(isWhitelistSaleEnabled(), "whitelist sale has not enabled");
        require(isWhitelistAddress(_msgSender(), signature_), "caller is not in whitelist or invalid signature");
        require(userMintCount[_msgSender()] < whitelistSaleConfig.mintQuota, "every account max supply exceeded");
        _sale(getWhitelistSalePrice());
    }

    function waitlistSale(bytes32[] calldata signature_) external payable callerIsUser nonReentrant {
        require(isWaitlistSaleEnabled(), "waitlist sale has not enabled");
        require(isWaitlistAddress(_msgSender(), signature_), "caller is not in waitlist or invalid signature");
        require(userMintCount[_msgSender()] < waitlistSaleConfig.mintQuota, "every account max supply exceeded");
        _sale(getWaitlistSalePrice());
    }

    function publicSale() external payable callerIsUser nonReentrant {
        require(isPublicSaleEnabled(), "public sale has not enabled");
        require(userMintCount[_msgSender()] < publicSaleConfig.mintQuota, "every account max supply exceeded");
        _sale(getPublicSalePrice());
    }

    function _sale(uint256 price_) internal {
        require(totalMinted+1 <= MAX_TOKEN, "max supply exceeded");
        require(price_ <= msg.value, "ether value sent is not correct");
        mintNFT(_msgSender());
    }
    function mintNFT(address to) internal {
        totalMinted++;
        userMintCount[_msgSender()]+=1;
        _tokenIdCounter.increment();
        uint256 tokenId = _tokenIdCounter.current();
        _safeMint(to, tokenId);
    }

    function reveal(uint256 tokenId_) external callerIsUser nonReentrant returns (uint256) {
        require(isRevealEnabled(), "reveal has not enabled");
        require(ownerOf(tokenId_) == _msgSender(), "caller is not owner");
        _burn(tokenId_);
        WLYInterface wlyContract = WLYInterface(revealConfig.wlyContractAddress);
        uint256 wlyTokenId = wlyContract.mint(_msgSender(), tokenId_);
        return wlyTokenId;
    }

    function withdraw(uint256 _amount) external onlyOwner nonReentrant {
        payable(_msgSender()).transfer(_amount);
        emit Withdraw(_msgSender(), _amount);
    }

    function isWhitelistSaleEnabled() public view returns (bool) {
        if (whitelistSaleConfig.endTime > 0 && block.timestamp > whitelistSaleConfig.endTime) {
            return false;
        }
        return whitelistSaleConfig.startTime > 0 &&
        block.timestamp > whitelistSaleConfig.startTime &&
        whitelistSaleConfig.price > 0 &&
        whitelistSaleConfig.merkleRoot != "";
    }

    function isWaitlistSaleEnabled() public view returns (bool) {
        if (waitlistSaleConfig.endTime > 0 && block.timestamp > waitlistSaleConfig.endTime) {
            return false;
        }
        return waitlistSaleConfig.startTime > 0 &&
        block.timestamp > waitlistSaleConfig.startTime &&
        waitlistSaleConfig.price > 0 &&
        waitlistSaleConfig.merkleRoot != "";
    }

    function isRevealEnabled() public view returns (bool) {
        return revealConfig.startTime > 0 &&
        block.timestamp > revealConfig.startTime &&
        revealConfig.wlyContractAddress != address(0);
    }

    function isWhitelistAddress(address address_, bytes32[] calldata signature_) public view returns (bool) {
        if (whitelistSaleConfig.merkleRoot == "") {
            return false;
        }
        return MerkleProof.verify(
            signature_,
            whitelistSaleConfig.merkleRoot,
            keccak256(abi.encodePacked(address_))
        );
    }

    function isWaitlistAddress(address address_, bytes32[] calldata signature_) public view returns (bool) {
        if (waitlistSaleConfig.merkleRoot == "") {
            return false;
        }
        return MerkleProof.verify(
            signature_,
            waitlistSaleConfig.merkleRoot,
            keccak256(abi.encodePacked(address_))
        );
    }

    function getWhitelistSalePrice() public view returns (uint256) {
        return whitelistSaleConfig.price;
    }
    function getWaitlistSalePrice() public view returns (uint256) {
        return waitlistSaleConfig.price;
    }

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

    function setBaseURI(string calldata baseURI_) external onlyOwner {
        baseURI = baseURI_;
        emit BaseURIChanged(baseURI_);
    }

    function setWhitelistSaleConfig(WhitelistSaleConfig calldata config_) external onlyOwner {
        require(config_.price > 0, "sale price must greater than zero");
        whitelistSaleConfig = config_;
        emit WhitelistSaleConfigChanged(config_);
    }

    function setWaitlistSaleConfig(WaitlistSaleConfig calldata config_) external onlyOwner {
        require(config_.price > 0, "sale price must greater than zero");
        waitlistSaleConfig = config_;
    }

    function setPublicSaleConfig(PublicSaleConfig calldata config_) external onlyOwner {
        require(config_.price > 0, "sale price must greater than zero");
        publicSaleConfig = config_;
        emit PublicSaleConfigChanged(config_);
    }

    function setRevealConfig(RevealConfig calldata config_) external onlyOwner {
        revealConfig = config_;
        emit RevealConfigChanged(config_);
    }

    function isPublicSaleEnabled() public view returns (bool) {
        return publicSaleConfig.startTime > 0 &&
        block.timestamp > publicSaleConfig.startTime &&
        publicSaleConfig.price > 0;
    }

    function getPublicSalePrice() public view returns (uint256) {
        return publicSaleConfig.price;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 startTokenId
    ) internal override{
        super._beforeTokenTransfer(from, to, startTokenId);
        require(!paused(), "token transfer paused");
    }

    function emergencyPause() external onlyOwner notSealed {
        _pause();
    }

    function unpause() external onlyOwner notSealed {
        _unpause();
    }

    function sealContract() external onlyOwner {
        contractSealed = true;
        emit ContractSealed();
    }

    modifier callerIsUser() {
        require(tx.origin == _msgSender(), "caller is another contract");
        _;
    }

    modifier notSealed() {
        require(!contractSealed, "contract sealed");
        _;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

File 3 of 15 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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

pragma solidity ^0.8.0;

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 15 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

File 11 of 15 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 13 of 15 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 14 of 15 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"components":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct WLYBox.WhitelistSaleConfig","name":"whiteSaleConfig_","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newBaseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractSealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint64","name":"mintQuota","type":"uint64"}],"indexed":false,"internalType":"struct WLYBox.PublicSaleConfig","name":"config","type":"tuple"}],"name":"PublicSaleConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"address","name":"wlyContractAddress","type":"address"}],"indexed":false,"internalType":"struct WLYBox.RevealConfig","name":"config","type":"tuple"}],"name":"RevealConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"}],"indexed":false,"internalType":"struct WLYBox.WhitelistSaleConfig","name":"config","type":"tuple"}],"name":"WhitelistSaleConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWaitlistSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"airdropAddress","type":"address"},{"internalType":"uint64","name":"num","type":"uint64"}],"internalType":"struct WLYBox.AirdropConfig[]","name":"air","type":"tuple[]"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"}],"name":"isWaitlistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWaitlistSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"}],"name":"isWhitelistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint64","name":"mintQuota","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"reveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealConfig","outputs":[{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"address","name":"wlyContractAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealContract","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":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint64","name":"mintQuota","type":"uint64"}],"internalType":"struct WLYBox.PublicSaleConfig","name":"config_","type":"tuple"}],"name":"setPublicSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"address","name":"wlyContractAddress","type":"address"}],"internalType":"struct WLYBox.RevealConfig","name":"config_","type":"tuple"}],"name":"setRevealConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct WLYBox.WaitlistSaleConfig","name":"config_","type":"tuple"}],"name":"setWaitlistSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"struct WLYBox.WhitelistSaleConfig","name":"config_","type":"tuple"}],"name":"setWhitelistSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"}],"name":"waitlistSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"waitlistSaleConfig","outputs":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"signature_","type":"bytes32[]"}],"name":"whitelistSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleConfig","outputs":[{"internalType":"uint64","name":"mintQuota","type":"uint64"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610bb860085560006009553480156200001c57600080fd5b506040516200424d3803806200424d8339810160408190526200003f91620002b4565b604080518082018252600d81526c15dd5b1a585b99de5948139195609a1b602080830191825283518085019094526003845262574c5960e81b9084015281519192916200008f9160009162000187565b508051620000a590600190602084019062000187565b505050620000c2620000bc6200013160201b60201c565b62000135565b6006805460ff60a01b1916905560016007558151620000e990600b90602085019062000187565b508051600d80546001600160401b0319166001600160401b039092169190911790556020810151600e556040810151600f55606081015160105560800151601155506200040d565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019590620003ba565b90600052602060002090601f016020900481019282620001b9576000855562000204565b82601f10620001d457805160ff191683800117855562000204565b8280016001018555821562000204579182015b8281111562000204578251825591602001919060010190620001e7565b506200021292915062000216565b5090565b5b8082111562000212576000815560010162000217565b600060a082840312156200024057600080fd5b60405160a081016001600160401b038082118383101715620002665762000266620003f7565b816040528293508451915080821682146200028057600080fd5b5080825250602083015160208201526040830151604082015260608301516060820152608083015160808201525092915050565b60008060c08385031215620002c857600080fd5b82516001600160401b0380821115620002e057600080fd5b818501915085601f830112620002f557600080fd5b8151818111156200030a576200030a620003f7565b6020915062000322601f8201601f1916830162000387565b81815287838386010111156200033757600080fd5b60005b82811015620003575784810184015182820185015283016200033a565b82811115620003695760008484840101525b5094506200037c9050868683016200022d565b925050509250929050565b604051601f8201601f191681016001600160401b0381118282101715620003b257620003b2620003f7565b604052919050565b600181811c90821680620003cf57607f821691505b60208210811415620003f157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613e30806200041d6000396000f3fe6080604052600436106103135760003560e01c80638e8bdd0d1161019a578063c2ca0ac5116100e1578063dd4225e61161008a578063ecbd68df11610064578063ecbd68df146108cc578063ed23cac0146108e1578063f2fde38b1461094157600080fd5b8063dd4225e614610843578063e39cf89514610863578063e985e9c51461088357600080fd5b8063cb46c26d116100bb578063cb46c26d146107ee578063ce565aa014610803578063d41da0e01461082357600080fd5b8063c2ca0ac51461078e578063c87b56dd146107ae578063c88e0755146107ce57600080fd5b8063a4d6ec4f11610143578063ba0987b71161011d578063ba0987b714610746578063bd28c35414610759578063c0ca8ae31461076e57600080fd5b8063a4d6ec4f146106ec578063b65016371461070c578063b88d4fde1461072657600080fd5b8063a2309ff811610174578063a2309ff814610673578063a3fd2c4414610689578063a4b36c1c146106d757600080fd5b80638e8bdd0d1461062957806395d89b411461063e578063a22cb4651461065357600080fd5b80634430d9711161025e57806368bd580e1161020757806370a08231116101e157806370a08231146105d6578063715018a6146105f65780638da5cb5b1461060b57600080fd5b806368bd580e146105965780636c0360eb146105ab5780636e1bd323146105c057600080fd5b80635c975abb116102385780635c975abb146105265780636352211e14610545578063656cf9181461056557600080fd5b80634430d971146104d257806351858e27146104f157806355f804b31461050657600080fd5b806329a41ca4116102c05780633f4ba83a1161029a5780633f4ba83a146104885780634009920d1461049d57806342842e0e146104b257600080fd5b806329a41ca4146103fc5780632e1a7d4d1461046057806333bc1c5c1461048057600080fd5b8063095ea7b3116102f1578063095ea7b3146103a7578063236fab4c146103c957806323b872dd146103dc57600080fd5b806301ffc9a71461031857806306fdde031461034d578063081812fc1461036f575b600080fd5b34801561032457600080fd5b506103386103333660046137fe565b610961565b60405190151581526020015b60405180910390f35b34801561035957600080fd5b50610362610a46565b60405161034491906139e2565b34801561037b57600080fd5b5061038f61038a3660046138ea565b610ad8565b6040516001600160a01b039091168152602001610344565b3480156103b357600080fd5b506103c76103c23660046136ac565b610b83565b005b6103c76103d73660046136d8565b610cb5565b3480156103e857600080fd5b506103c76103f736600461351f565b610ebd565b34801561040857600080fd5b5060125460135460145460155460165461042d9467ffffffffffffffff169392919085565b6040805167ffffffffffffffff90961686526020860194909452928401919091526060830152608082015260a001610344565b34801561046c57600080fd5b506103c761047b3660046138ea565b610f44565b6103c7611061565b34801561049457600080fd5b506103c76111e5565b3480156104a957600080fd5b5061033861129c565b3480156104be57600080fd5b506103c76104cd36600461351f565b6112c3565b3480156104de57600080fd5b506016545b604051908152602001610344565b3480156104fd57600080fd5b506103c76112de565b34801561051257600080fd5b506103c7610521366004613838565b611393565b34801561053257600080fd5b50600654600160a01b900460ff16610338565b34801561055157600080fd5b5061038f6105603660046138ea565b611437565b34801561057157600080fd5b50600d54600e54600f5460105460115461042d9467ffffffffffffffff169392919085565b3480156105a257600080fd5b506103c76114c2565b3480156105b757600080fd5b50610362611554565b3480156105cc57600080fd5b506104e360085481565b3480156105e257600080fd5b506104e36105f13660046134c9565b6115e2565b34801561060257600080fd5b506103c761167c565b34801561061757600080fd5b506006546001600160a01b031661038f565b34801561063557600080fd5b506018546104e3565b34801561064a57600080fd5b506103626116e0565b34801561065f57600080fd5b506103c761066e366004613679565b6116ef565b34801561067f57600080fd5b506104e360095481565b34801561069557600080fd5b506017546018546019546106b292919067ffffffffffffffff1683565b60408051938452602084019290925267ffffffffffffffff1690820152606001610344565b3480156106e357600080fd5b506103386116fe565b3480156106f857600080fd5b506103c761070736600461371a565b61174d565b34801561071857600080fd5b50600a546103389060ff1681565b34801561073257600080fd5b506103c7610741366004613560565b611a0f565b6103c76107543660046136d8565b611a9d565b34801561076557600080fd5b506011546104e3565b34801561077a57600080fd5b506103c76107893660046138ce565b611c97565b34801561079a57600080fd5b506104e36107a93660046138ea565b611d99565b3480156107ba57600080fd5b506103626107c93660046138ea565b611fc5565b3480156107da57600080fd5b506103c76107e93660046138aa565b6120ae565b3480156107fa57600080fd5b506103386121a5565b34801561080f57600080fd5b506103c761081e3660046138ce565b6121f4565b34801561082f57600080fd5b5061033861083e366004613624565b6122b9565b34801561084f57600080fd5b506103c761085e3660046138bc565b61234a565b34801561086f57600080fd5b5061033861087e366004613624565b6123e3565b34801561088f57600080fd5b5061033861089e3660046134e6565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108d857600080fd5b50610338612455565b3480156108ed57600080fd5b50601a546109199067ffffffffffffffff8116906801000000000000000090046001600160a01b031682565b6040805167ffffffffffffffff90931683526001600160a01b03909116602083015201610344565b34801561094d57600080fd5b506103c761095c3660046134c9565b6124a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109f457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a4057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060008054610a5590613bd2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8190613bd2565b8015610ace5780601f10610aa357610100808354040283529160200191610ace565b820191906000526020600020905b815481529060010190602001808311610ab157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b8e82611437565b9050806001600160a01b0316836001600160a01b03161415610c185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b5e565b336001600160a01b0382161480610c345750610c34813361089e565b610ca65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b5e565b610cb08383612586565b505050565b323314610d045760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b60026007541415610d575760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755610d646121a5565b610db05760405162461bcd60e51b815260206004820152601d60248201527f776169746c6973742073616c6520686173206e6f7420656e61626c65640000006044820152606401610b5e565b610dbb3383836123e3565b610e2d5760405162461bcd60e51b815260206004820152602e60248201527f63616c6c6572206973206e6f7420696e20776169746c697374206f7220696e7660448201527f616c6964207369676e61747572650000000000000000000000000000000000006064820152608401610b5e565b601254336000908152600c602052604090205467ffffffffffffffff90911611610ea35760405162461bcd60e51b815260206004820152602160248201527f6576657279206163636f756e74206d617820737570706c7920657863656564656044820152601960fa1b6064820152608401610b5e565b610eb4610eaf60165490565b612601565b50506001600755565b610ec733826126b9565b610f395760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b5e565b610cb08383836127c0565b6006546001600160a01b03163314610f9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b60026007541415610ff15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755604051339082156108fc029083906000818181858888f19350505050158015611023573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2506001600755565b3233146110b05760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b600260075414156111035760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b600260075561111061129c565b61115c5760405162461bcd60e51b815260206004820152601b60248201527f7075626c69632073616c6520686173206e6f7420656e61626c656400000000006044820152606401610b5e565b601954336000908152600c602052604090205467ffffffffffffffff909116116111d25760405162461bcd60e51b815260206004820152602160248201527f6576657279206163636f756e74206d617820737570706c7920657863656564656044820152601960fa1b6064820152608401610b5e565b6111de610eaf60185490565b6001600755565b6006546001600160a01b0316331461123f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600a5460ff16156112925760405162461bcd60e51b815260206004820152600f60248201527f636f6e7472616374207365616c656400000000000000000000000000000000006044820152606401610b5e565b61129a6129a5565b565b601754600090158015906112b1575060175442115b80156112be575060185415155b905090565b610cb083838360405180602001604052806000815250611a0f565b6006546001600160a01b031633146113385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600a5460ff161561138b5760405162461bcd60e51b815260206004820152600f60248201527f636f6e7472616374207365616c656400000000000000000000000000000000006044820152606401610b5e565b61129a612a66565b6006546001600160a01b031633146113ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b6113f9600b83836133cc565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6828260405161142b9291906139b3565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610a405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b5e565b6006546001600160a01b0316331461151c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600a805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b600b805461156190613bd2565b80601f016020809104026020016040519081016040528092919081815260200182805461158d90613bd2565b80156115da5780601f106115af576101008083540402835291602001916115da565b820191906000526020600020905b8154815290600101906020018083116115bd57829003601f168201915b505050505081565b60006001600160a01b0382166116605760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b5e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146116d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b61129a6000612b16565b606060018054610a5590613bd2565b6116fa338383612b75565b5050565b601a5460009067ffffffffffffffff16158015906117275750601a5467ffffffffffffffff1642115b80156112be5750601a546801000000000000000090046001600160a01b03161515905090565b6006546001600160a01b031633146117a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600260075414156117fa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b600260075560005b8151811015610eb45760006001600160a01b031682828151811061182857611828613ca8565b6020026020010151600001516001600160a01b0316141561188b5760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610b5e565b600082828151811061189f5761189f613ca8565b60200260200101516020015167ffffffffffffffff16116119025760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e756d626572206f6620746f6b656e7300000000000000006044820152606401610b5e565b60085482828151811061191757611917613ca8565b60200260200101516020015167ffffffffffffffff1660095461193a9190613b10565b11156119885760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610b5e565b60005b82828151811061199d5761199d613ca8565b60200260200101516020015167ffffffffffffffff168167ffffffffffffffff1610156119fc576119ea8383815181106119d9576119d9613ca8565b602002602001015160000151612c44565b806119f481613c40565b91505061198b565b5080611a0781613c07565b915050611802565b611a1933836126b9565b611a8b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b5e565b611a9784848484612cba565b50505050565b323314611aec5760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b60026007541415611b3f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755611b4c612455565b611b985760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610b5e565b611ba33383836122b9565b611c155760405162461bcd60e51b815260206004820152602f60248201527f63616c6c6572206973206e6f7420696e2077686974656c697374206f7220696e60448201527f76616c6964207369676e617475726500000000000000000000000000000000006064820152608401610b5e565b600d54336000908152600c602052604090205467ffffffffffffffff90911611611c8b5760405162461bcd60e51b815260206004820152602160248201527f6576657279206163636f756e74206d617820737570706c7920657863656564656044820152601960fa1b6064820152608401610b5e565b610eb4610eaf60115490565b6006546001600160a01b03163314611cf15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b6000816080013511611d4f5760405162461bcd60e51b815260206004820152602160248201527f73616c65207072696365206d7573742067726561746572207468616e207a65726044820152606f60f81b6064820152608401610b5e565b80600d611d5c8282613d97565b9050507fc63950192edd44e9a42e476446704fbd3458b1fafd659312e04905abf413770e81604051611d8e9190613a6b565b60405180910390a150565b6000323314611dea5760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b60026007541415611e3d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755611e4a6116fe565b611e965760405162461bcd60e51b815260206004820152601660248201527f72657665616c20686173206e6f7420656e61626c6564000000000000000000006044820152606401610b5e565b33611ea083611437565b6001600160a01b031614611ef65760405162461bcd60e51b815260206004820152601360248201527f63616c6c6572206973206e6f74206f776e6572000000000000000000000000006044820152606401610b5e565b611eff82612d43565b601a546801000000000000000090046001600160a01b03166000816340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101879052604401602060405180830381600087803b158015611f8057600080fd5b505af1158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613903565b6001600755949350505050565b6000818152600260205260409020546060906001600160a01b03166120525760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b5e565b600061205c612df7565b9050600081511161207c57604051806020016040528060008152506120a7565b8061208684612e06565b604051602001612097929190613948565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146121085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b60008160200135116121665760405162461bcd60e51b815260206004820152602160248201527f73616c65207072696365206d7573742067726561746572207468616e207a65726044820152606f60f81b6064820152608401610b5e565b8060176121738282613cd4565b9050507f22d93eb64f8cfeafdbd9f176765848fb25b1f91970ac63bebe2d5b874314449a81604051611d8e91906139f5565b601454600090158015906121ba575060145442115b156121c55750600090565b601354158015906121d7575060135442115b80156121e4575060165415155b80156112be575050601554151590565b6006546001600160a01b0316331461224e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b60008160800135116122ac5760405162461bcd60e51b815260206004820152602160248201527f73616c65207072696365206d7573742067726561746572207468616e207a65726044820152606f60f81b6064820152608401610b5e565b806012610cb08282613d97565b6010546000906122cb575060006120a7565b612342838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010546040516bffffffffffffffffffffffff1960608b901b16602082015290925060340190505b60405160208183030381529060405280519060200120612f38565b949350505050565b6006546001600160a01b031633146123a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b80601a6123b18282613d14565b9050507f853ddf2f9753e1923a62c565bcee4eb04ec37eb39280abff9db2140e2948dde481604051611d8e9190613a2c565b6015546000906123f5575060006120a7565b612342838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050612327565b600f546000901580159061246a5750600f5442115b156124755750600090565b600e54158015906124875750600e5442115b8015612494575060115415155b80156112be575050601054151590565b6006546001600160a01b031633146124fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b6001600160a01b03811661257a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b5e565b61258381612b16565b50565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906125c882611437565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600854600954612612906001613b10565b11156126605760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610b5e565b348111156126b05760405162461bcd60e51b815260206004820152601f60248201527f65746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610b5e565b61258333612c44565b6000818152600260205260408120546001600160a01b03166127435760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b5e565b600061274e83611437565b9050806001600160a01b0316846001600160a01b0316148061279557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806123425750836001600160a01b03166127ae84610ad8565b6001600160a01b031614949350505050565b826001600160a01b03166127d382611437565b6001600160a01b03161461284f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610b5e565b6001600160a01b0382166128ca5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b5e565b6128d5838383612f4e565b6128e0600082612586565b6001600160a01b0383166000908152600360205260408120805460019290612909908490613b3c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612937908490613b10565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600654600160a01b900460ff166129fe5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b5e565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600654600160a01b900460ff1615612ac05760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b5e565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a493390565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612bd75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b5e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60098054906000612c5483613c07565b91905055506001600c6000612c663390565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254612c959190613b10565b9091555050601b805460010190556000612cae601b5490565b90506116fa8282612fa8565b612cc58484846127c0565b612cd184848484612fc2565b611a975760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b5e565b6000612d4e82611437565b9050612d5c81600084612f4e565b612d67600083612586565b6001600160a01b0381166000908152600360205260408120805460019290612d90908490613b3c565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060600b8054610a5590613bd2565b606081612e4657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e705780612e5a81613c07565b9150612e699050600a83613b28565b9150612e4a565b60008167ffffffffffffffff811115612e8b57612e8b613cbe565b6040519080825280601f01601f191660200182016040528015612eb5576020820181803683370190505b5090505b841561234257612eca600183613b3c565b9150612ed7600a86613c68565b612ee2906030613b10565b60f81b818381518110612ef757612ef7613ca8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f31600a86613b28565b9450612eb9565b600082612f45858461316f565b14949350505050565b600654600160a01b900460ff1615610cb05760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e736665722070617573656400000000000000000000006044820152606401610b5e565b6116fa8282604051806020016040528060008152506131bc565b60006001600160a01b0384163b15613164576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061301f903390899088908890600401613977565b602060405180830381600087803b15801561303957600080fd5b505af1925050508015613069575060408051601f3d908101601f191682019092526130669181019061381b565b60015b613119573d808015613097576040519150601f19603f3d011682016040523d82523d6000602084013e61309c565b606091505b5080516131115760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b5e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612342565b506001949350505050565b600081815b84518110156131b4576131a08286838151811061319357613193613ca8565b6020026020010151613245565b9150806131ac81613c07565b915050613174565b509392505050565b6131c68383613271565b6131d36000848484612fc2565b610cb05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b5e565b60008183106132615760008281526020849052604090206120a7565b5060009182526020526040902090565b6001600160a01b0382166132c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b5e565b6000818152600260205260409020546001600160a01b03161561332c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b5e565b61333860008383612f4e565b6001600160a01b0382166000908152600360205260408120805460019290613361908490613b10565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546133d890613bd2565b90600052602060002090601f0160209004810192826133fa5760008555613440565b82601f106134135782800160ff19823516178555613440565b82800160010185558215613440579182015b82811115613440578235825591602001919060010190613425565b5061344c929150613450565b5090565b5b8082111561344c5760008155600101613451565b60008083601f84011261347757600080fd5b50813567ffffffffffffffff81111561348f57600080fd5b6020830191508360208260051b85010111156134aa57600080fd5b9250929050565b600060a082840312156134c357600080fd5b50919050565b6000602082840312156134db57600080fd5b81356120a781613da1565b600080604083850312156134f957600080fd5b823561350481613da1565b9150602083013561351481613da1565b809150509250929050565b60008060006060848603121561353457600080fd5b833561353f81613da1565b9250602084013561354f81613da1565b929592945050506040919091013590565b6000806000806080858703121561357657600080fd5b843561358181613da1565b935060208581013561359281613da1565b935060408601359250606086013567ffffffffffffffff808211156135b657600080fd5b818801915088601f8301126135ca57600080fd5b8135818111156135dc576135dc613cbe565b6135ee84601f19601f84011601613adf565b9150808252898482850101111561360457600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060006040848603121561363957600080fd5b833561364481613da1565b9250602084013567ffffffffffffffff81111561366057600080fd5b61366c86828701613465565b9497909650939450505050565b6000806040838503121561368c57600080fd5b823561369781613da1565b91506020830135801515811461351457600080fd5b600080604083850312156136bf57600080fd5b82356136ca81613da1565b946020939093013593505050565b600080602083850312156136eb57600080fd5b823567ffffffffffffffff81111561370257600080fd5b61370e85828601613465565b90969095509350505050565b6000602080838503121561372d57600080fd5b823567ffffffffffffffff8082111561374557600080fd5b818501915085601f83011261375957600080fd5b81358181111561376b5761376b613cbe565b613779848260051b01613adf565b8181528481019250838501600683901b8501860189101561379957600080fd5b60009450845b838110156137f057604080838c0312156137b7578687fd5b6137bf613ab6565b83356137ca81613da1565b8152838901356137d981613de4565b818a0152865294870194919091019060010161379f565b509098975050505050505050565b60006020828403121561381057600080fd5b81356120a781613db6565b60006020828403121561382d57600080fd5b81516120a781613db6565b6000806020838503121561384b57600080fd5b823567ffffffffffffffff8082111561386357600080fd5b818501915085601f83011261387757600080fd5b81358181111561388657600080fd5b86602082850101111561389857600080fd5b60209290920196919550909350505050565b6000606082840312156134c357600080fd5b6000604082840312156134c357600080fd5b600060a082840312156138e057600080fd5b6120a783836134b1565b6000602082840312156138fc57600080fd5b5035919050565b60006020828403121561391557600080fd5b5051919050565b60008151808452613934816020860160208601613b53565b601f01601f19169290920160200192915050565b6000835161395a818460208801613b53565b83519083019061396e818360208801613b53565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526139a9608083018461391c565b9695505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020815260006120a7602083018461391c565b8135815260208083013590820152606081016040830135613a1581613de4565b67ffffffffffffffff811660408401525092915050565b604081018235613a3b81613de4565b67ffffffffffffffff1682526020830135613a5581613da1565b6001600160a01b03811660208401525092915050565b60a081018235613a7a81613de4565b67ffffffffffffffff81168352506020830135602083015260408301356040830152606083013560608301526080830135608083015292915050565b6040805190810167ffffffffffffffff81118282101715613ad957613ad9613cbe565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613b0857613b08613cbe565b604052919050565b60008219821115613b2357613b23613c7c565b500190565b600082613b3757613b37613c92565b500490565b600082821015613b4e57613b4e613c7c565b500390565b60005b83811015613b6e578181015183820152602001613b56565b83811115611a975750506000910152565b8135613b8a81613de4565b815467ffffffffffffffff191667ffffffffffffffff821617825550602082013560018201556040820135600282015560608201356003820155608082013560048201555050565b600181811c90821680613be657607f821691505b602082108114156134c357634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c3957613c39613c7c565b5060010190565b600067ffffffffffffffff80831681811415613c5e57613c5e613c7c565b6001019392505050565b600082613c7757613c77613c92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b81358155602082013560018201556040820135613cf081613de4565b60028201805467ffffffffffffffff191667ffffffffffffffff8316179055505050565b8135613d1f81613de4565b815467ffffffffffffffff191667ffffffffffffffff8216178255506020820135613d4981613da1565b81547fffffffff0000000000000000000000000000000000000000ffffffffffffffff1660409190911b7bffffffffffffffffffffffffffffffffffffffff00000000000000001617905550565b6116fa8282613b7f565b6001600160a01b038116811461258357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461258357600080fd5b67ffffffffffffffff8116811461258357600080fdfea2646970667358221220f87e4cb2b479deca59f2bb901b315471017f4b595ad87a8fd0ea22ed607fbe8064736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000062e490a00000000000000000000000000000000000000000000000000000000062e5e220ec0c2ff00172a2c8960866988602537a2a98fb884db25ed02b90bb2874018676000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f77756c69616e6779656c6162732e6d7970696e6174612e636c6f75642f697066732f516d6653727562664b6b4d505738374834325a716b594d7a774d43775047414c63795264747a6a687a33346f744e2f00000000000000

Deployed Bytecode

0x6080604052600436106103135760003560e01c80638e8bdd0d1161019a578063c2ca0ac5116100e1578063dd4225e61161008a578063ecbd68df11610064578063ecbd68df146108cc578063ed23cac0146108e1578063f2fde38b1461094157600080fd5b8063dd4225e614610843578063e39cf89514610863578063e985e9c51461088357600080fd5b8063cb46c26d116100bb578063cb46c26d146107ee578063ce565aa014610803578063d41da0e01461082357600080fd5b8063c2ca0ac51461078e578063c87b56dd146107ae578063c88e0755146107ce57600080fd5b8063a4d6ec4f11610143578063ba0987b71161011d578063ba0987b714610746578063bd28c35414610759578063c0ca8ae31461076e57600080fd5b8063a4d6ec4f146106ec578063b65016371461070c578063b88d4fde1461072657600080fd5b8063a2309ff811610174578063a2309ff814610673578063a3fd2c4414610689578063a4b36c1c146106d757600080fd5b80638e8bdd0d1461062957806395d89b411461063e578063a22cb4651461065357600080fd5b80634430d9711161025e57806368bd580e1161020757806370a08231116101e157806370a08231146105d6578063715018a6146105f65780638da5cb5b1461060b57600080fd5b806368bd580e146105965780636c0360eb146105ab5780636e1bd323146105c057600080fd5b80635c975abb116102385780635c975abb146105265780636352211e14610545578063656cf9181461056557600080fd5b80634430d971146104d257806351858e27146104f157806355f804b31461050657600080fd5b806329a41ca4116102c05780633f4ba83a1161029a5780633f4ba83a146104885780634009920d1461049d57806342842e0e146104b257600080fd5b806329a41ca4146103fc5780632e1a7d4d1461046057806333bc1c5c1461048057600080fd5b8063095ea7b3116102f1578063095ea7b3146103a7578063236fab4c146103c957806323b872dd146103dc57600080fd5b806301ffc9a71461031857806306fdde031461034d578063081812fc1461036f575b600080fd5b34801561032457600080fd5b506103386103333660046137fe565b610961565b60405190151581526020015b60405180910390f35b34801561035957600080fd5b50610362610a46565b60405161034491906139e2565b34801561037b57600080fd5b5061038f61038a3660046138ea565b610ad8565b6040516001600160a01b039091168152602001610344565b3480156103b357600080fd5b506103c76103c23660046136ac565b610b83565b005b6103c76103d73660046136d8565b610cb5565b3480156103e857600080fd5b506103c76103f736600461351f565b610ebd565b34801561040857600080fd5b5060125460135460145460155460165461042d9467ffffffffffffffff169392919085565b6040805167ffffffffffffffff90961686526020860194909452928401919091526060830152608082015260a001610344565b34801561046c57600080fd5b506103c761047b3660046138ea565b610f44565b6103c7611061565b34801561049457600080fd5b506103c76111e5565b3480156104a957600080fd5b5061033861129c565b3480156104be57600080fd5b506103c76104cd36600461351f565b6112c3565b3480156104de57600080fd5b506016545b604051908152602001610344565b3480156104fd57600080fd5b506103c76112de565b34801561051257600080fd5b506103c7610521366004613838565b611393565b34801561053257600080fd5b50600654600160a01b900460ff16610338565b34801561055157600080fd5b5061038f6105603660046138ea565b611437565b34801561057157600080fd5b50600d54600e54600f5460105460115461042d9467ffffffffffffffff169392919085565b3480156105a257600080fd5b506103c76114c2565b3480156105b757600080fd5b50610362611554565b3480156105cc57600080fd5b506104e360085481565b3480156105e257600080fd5b506104e36105f13660046134c9565b6115e2565b34801561060257600080fd5b506103c761167c565b34801561061757600080fd5b506006546001600160a01b031661038f565b34801561063557600080fd5b506018546104e3565b34801561064a57600080fd5b506103626116e0565b34801561065f57600080fd5b506103c761066e366004613679565b6116ef565b34801561067f57600080fd5b506104e360095481565b34801561069557600080fd5b506017546018546019546106b292919067ffffffffffffffff1683565b60408051938452602084019290925267ffffffffffffffff1690820152606001610344565b3480156106e357600080fd5b506103386116fe565b3480156106f857600080fd5b506103c761070736600461371a565b61174d565b34801561071857600080fd5b50600a546103389060ff1681565b34801561073257600080fd5b506103c7610741366004613560565b611a0f565b6103c76107543660046136d8565b611a9d565b34801561076557600080fd5b506011546104e3565b34801561077a57600080fd5b506103c76107893660046138ce565b611c97565b34801561079a57600080fd5b506104e36107a93660046138ea565b611d99565b3480156107ba57600080fd5b506103626107c93660046138ea565b611fc5565b3480156107da57600080fd5b506103c76107e93660046138aa565b6120ae565b3480156107fa57600080fd5b506103386121a5565b34801561080f57600080fd5b506103c761081e3660046138ce565b6121f4565b34801561082f57600080fd5b5061033861083e366004613624565b6122b9565b34801561084f57600080fd5b506103c761085e3660046138bc565b61234a565b34801561086f57600080fd5b5061033861087e366004613624565b6123e3565b34801561088f57600080fd5b5061033861089e3660046134e6565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108d857600080fd5b50610338612455565b3480156108ed57600080fd5b50601a546109199067ffffffffffffffff8116906801000000000000000090046001600160a01b031682565b6040805167ffffffffffffffff90931683526001600160a01b03909116602083015201610344565b34801561094d57600080fd5b506103c761095c3660046134c9565b6124a4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109f457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a4057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060008054610a5590613bd2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8190613bd2565b8015610ace5780601f10610aa357610100808354040283529160200191610ace565b820191906000526020600020905b815481529060010190602001808311610ab157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b8e82611437565b9050806001600160a01b0316836001600160a01b03161415610c185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b5e565b336001600160a01b0382161480610c345750610c34813361089e565b610ca65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b5e565b610cb08383612586565b505050565b323314610d045760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b60026007541415610d575760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755610d646121a5565b610db05760405162461bcd60e51b815260206004820152601d60248201527f776169746c6973742073616c6520686173206e6f7420656e61626c65640000006044820152606401610b5e565b610dbb3383836123e3565b610e2d5760405162461bcd60e51b815260206004820152602e60248201527f63616c6c6572206973206e6f7420696e20776169746c697374206f7220696e7660448201527f616c6964207369676e61747572650000000000000000000000000000000000006064820152608401610b5e565b601254336000908152600c602052604090205467ffffffffffffffff90911611610ea35760405162461bcd60e51b815260206004820152602160248201527f6576657279206163636f756e74206d617820737570706c7920657863656564656044820152601960fa1b6064820152608401610b5e565b610eb4610eaf60165490565b612601565b50506001600755565b610ec733826126b9565b610f395760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b5e565b610cb08383836127c0565b6006546001600160a01b03163314610f9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b60026007541415610ff15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755604051339082156108fc029083906000818181858888f19350505050158015611023573d6000803e3d6000fd5b5060405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2506001600755565b3233146110b05760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b600260075414156111035760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b600260075561111061129c565b61115c5760405162461bcd60e51b815260206004820152601b60248201527f7075626c69632073616c6520686173206e6f7420656e61626c656400000000006044820152606401610b5e565b601954336000908152600c602052604090205467ffffffffffffffff909116116111d25760405162461bcd60e51b815260206004820152602160248201527f6576657279206163636f756e74206d617820737570706c7920657863656564656044820152601960fa1b6064820152608401610b5e565b6111de610eaf60185490565b6001600755565b6006546001600160a01b0316331461123f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600a5460ff16156112925760405162461bcd60e51b815260206004820152600f60248201527f636f6e7472616374207365616c656400000000000000000000000000000000006044820152606401610b5e565b61129a6129a5565b565b601754600090158015906112b1575060175442115b80156112be575060185415155b905090565b610cb083838360405180602001604052806000815250611a0f565b6006546001600160a01b031633146113385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600a5460ff161561138b5760405162461bcd60e51b815260206004820152600f60248201527f636f6e7472616374207365616c656400000000000000000000000000000000006044820152606401610b5e565b61129a612a66565b6006546001600160a01b031633146113ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b6113f9600b83836133cc565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6828260405161142b9291906139b3565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610a405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b5e565b6006546001600160a01b0316331461151c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600a805460ff191660011790556040517fa0058887862c892ade184993a48c672897bca2e36ebf7fa2b4703d4805fc3a0190600090a1565b600b805461156190613bd2565b80601f016020809104026020016040519081016040528092919081815260200182805461158d90613bd2565b80156115da5780601f106115af576101008083540402835291602001916115da565b820191906000526020600020905b8154815290600101906020018083116115bd57829003601f168201915b505050505081565b60006001600160a01b0382166116605760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b5e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146116d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b61129a6000612b16565b606060018054610a5590613bd2565b6116fa338383612b75565b5050565b601a5460009067ffffffffffffffff16158015906117275750601a5467ffffffffffffffff1642115b80156112be5750601a546801000000000000000090046001600160a01b03161515905090565b6006546001600160a01b031633146117a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b600260075414156117fa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b600260075560005b8151811015610eb45760006001600160a01b031682828151811061182857611828613ca8565b6020026020010151600001516001600160a01b0316141561188b5760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610b5e565b600082828151811061189f5761189f613ca8565b60200260200101516020015167ffffffffffffffff16116119025760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e756d626572206f6620746f6b656e7300000000000000006044820152606401610b5e565b60085482828151811061191757611917613ca8565b60200260200101516020015167ffffffffffffffff1660095461193a9190613b10565b11156119885760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610b5e565b60005b82828151811061199d5761199d613ca8565b60200260200101516020015167ffffffffffffffff168167ffffffffffffffff1610156119fc576119ea8383815181106119d9576119d9613ca8565b602002602001015160000151612c44565b806119f481613c40565b91505061198b565b5080611a0781613c07565b915050611802565b611a1933836126b9565b611a8b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b5e565b611a9784848484612cba565b50505050565b323314611aec5760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b60026007541415611b3f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755611b4c612455565b611b985760405162461bcd60e51b815260206004820152601e60248201527f77686974656c6973742073616c6520686173206e6f7420656e61626c656400006044820152606401610b5e565b611ba33383836122b9565b611c155760405162461bcd60e51b815260206004820152602f60248201527f63616c6c6572206973206e6f7420696e2077686974656c697374206f7220696e60448201527f76616c6964207369676e617475726500000000000000000000000000000000006064820152608401610b5e565b600d54336000908152600c602052604090205467ffffffffffffffff90911611611c8b5760405162461bcd60e51b815260206004820152602160248201527f6576657279206163636f756e74206d617820737570706c7920657863656564656044820152601960fa1b6064820152608401610b5e565b610eb4610eaf60115490565b6006546001600160a01b03163314611cf15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b6000816080013511611d4f5760405162461bcd60e51b815260206004820152602160248201527f73616c65207072696365206d7573742067726561746572207468616e207a65726044820152606f60f81b6064820152608401610b5e565b80600d611d5c8282613d97565b9050507fc63950192edd44e9a42e476446704fbd3458b1fafd659312e04905abf413770e81604051611d8e9190613a6b565b60405180910390a150565b6000323314611dea5760405162461bcd60e51b815260206004820152601a60248201527f63616c6c657220697320616e6f7468657220636f6e74726163740000000000006044820152606401610b5e565b60026007541415611e3d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b5e565b6002600755611e4a6116fe565b611e965760405162461bcd60e51b815260206004820152601660248201527f72657665616c20686173206e6f7420656e61626c6564000000000000000000006044820152606401610b5e565b33611ea083611437565b6001600160a01b031614611ef65760405162461bcd60e51b815260206004820152601360248201527f63616c6c6572206973206e6f74206f776e6572000000000000000000000000006044820152606401610b5e565b611eff82612d43565b601a546801000000000000000090046001600160a01b03166000816340c10f19336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101879052604401602060405180830381600087803b158015611f8057600080fd5b505af1158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613903565b6001600755949350505050565b6000818152600260205260409020546060906001600160a01b03166120525760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b5e565b600061205c612df7565b9050600081511161207c57604051806020016040528060008152506120a7565b8061208684612e06565b604051602001612097929190613948565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146121085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b60008160200135116121665760405162461bcd60e51b815260206004820152602160248201527f73616c65207072696365206d7573742067726561746572207468616e207a65726044820152606f60f81b6064820152608401610b5e565b8060176121738282613cd4565b9050507f22d93eb64f8cfeafdbd9f176765848fb25b1f91970ac63bebe2d5b874314449a81604051611d8e91906139f5565b601454600090158015906121ba575060145442115b156121c55750600090565b601354158015906121d7575060135442115b80156121e4575060165415155b80156112be575050601554151590565b6006546001600160a01b0316331461224e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b60008160800135116122ac5760405162461bcd60e51b815260206004820152602160248201527f73616c65207072696365206d7573742067726561746572207468616e207a65726044820152606f60f81b6064820152608401610b5e565b806012610cb08282613d97565b6010546000906122cb575060006120a7565b612342838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010546040516bffffffffffffffffffffffff1960608b901b16602082015290925060340190505b60405160208183030381529060405280519060200120612f38565b949350505050565b6006546001600160a01b031633146123a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b80601a6123b18282613d14565b9050507f853ddf2f9753e1923a62c565bcee4eb04ec37eb39280abff9db2140e2948dde481604051611d8e9190613a2c565b6015546000906123f5575060006120a7565b612342838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050612327565b600f546000901580159061246a5750600f5442115b156124755750600090565b600e54158015906124875750600e5442115b8015612494575060115415155b80156112be575050601054151590565b6006546001600160a01b031633146124fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b5e565b6001600160a01b03811661257a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b5e565b61258381612b16565b50565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906125c882611437565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600854600954612612906001613b10565b11156126605760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610b5e565b348111156126b05760405162461bcd60e51b815260206004820152601f60248201527f65746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610b5e565b61258333612c44565b6000818152600260205260408120546001600160a01b03166127435760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b5e565b600061274e83611437565b9050806001600160a01b0316846001600160a01b0316148061279557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806123425750836001600160a01b03166127ae84610ad8565b6001600160a01b031614949350505050565b826001600160a01b03166127d382611437565b6001600160a01b03161461284f5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610b5e565b6001600160a01b0382166128ca5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b5e565b6128d5838383612f4e565b6128e0600082612586565b6001600160a01b0383166000908152600360205260408120805460019290612909908490613b3c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612937908490613b10565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600654600160a01b900460ff166129fe5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b5e565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600654600160a01b900460ff1615612ac05760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b5e565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a493390565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612bd75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b5e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60098054906000612c5483613c07565b91905055506001600c6000612c663390565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254612c959190613b10565b9091555050601b805460010190556000612cae601b5490565b90506116fa8282612fa8565b612cc58484846127c0565b612cd184848484612fc2565b611a975760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b5e565b6000612d4e82611437565b9050612d5c81600084612f4e565b612d67600083612586565b6001600160a01b0381166000908152600360205260408120805460019290612d90908490613b3c565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060600b8054610a5590613bd2565b606081612e4657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e705780612e5a81613c07565b9150612e699050600a83613b28565b9150612e4a565b60008167ffffffffffffffff811115612e8b57612e8b613cbe565b6040519080825280601f01601f191660200182016040528015612eb5576020820181803683370190505b5090505b841561234257612eca600183613b3c565b9150612ed7600a86613c68565b612ee2906030613b10565b60f81b818381518110612ef757612ef7613ca8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f31600a86613b28565b9450612eb9565b600082612f45858461316f565b14949350505050565b600654600160a01b900460ff1615610cb05760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e736665722070617573656400000000000000000000006044820152606401610b5e565b6116fa8282604051806020016040528060008152506131bc565b60006001600160a01b0384163b15613164576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061301f903390899088908890600401613977565b602060405180830381600087803b15801561303957600080fd5b505af1925050508015613069575060408051601f3d908101601f191682019092526130669181019061381b565b60015b613119573d808015613097576040519150601f19603f3d011682016040523d82523d6000602084013e61309c565b606091505b5080516131115760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b5e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612342565b506001949350505050565b600081815b84518110156131b4576131a08286838151811061319357613193613ca8565b6020026020010151613245565b9150806131ac81613c07565b915050613174565b509392505050565b6131c68383613271565b6131d36000848484612fc2565b610cb05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b5e565b60008183106132615760008281526020849052604090206120a7565b5060009182526020526040902090565b6001600160a01b0382166132c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b5e565b6000818152600260205260409020546001600160a01b03161561332c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b5e565b61333860008383612f4e565b6001600160a01b0382166000908152600360205260408120805460019290613361908490613b10565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546133d890613bd2565b90600052602060002090601f0160209004810192826133fa5760008555613440565b82601f106134135782800160ff19823516178555613440565b82800160010185558215613440579182015b82811115613440578235825591602001919060010190613425565b5061344c929150613450565b5090565b5b8082111561344c5760008155600101613451565b60008083601f84011261347757600080fd5b50813567ffffffffffffffff81111561348f57600080fd5b6020830191508360208260051b85010111156134aa57600080fd5b9250929050565b600060a082840312156134c357600080fd5b50919050565b6000602082840312156134db57600080fd5b81356120a781613da1565b600080604083850312156134f957600080fd5b823561350481613da1565b9150602083013561351481613da1565b809150509250929050565b60008060006060848603121561353457600080fd5b833561353f81613da1565b9250602084013561354f81613da1565b929592945050506040919091013590565b6000806000806080858703121561357657600080fd5b843561358181613da1565b935060208581013561359281613da1565b935060408601359250606086013567ffffffffffffffff808211156135b657600080fd5b818801915088601f8301126135ca57600080fd5b8135818111156135dc576135dc613cbe565b6135ee84601f19601f84011601613adf565b9150808252898482850101111561360457600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060006040848603121561363957600080fd5b833561364481613da1565b9250602084013567ffffffffffffffff81111561366057600080fd5b61366c86828701613465565b9497909650939450505050565b6000806040838503121561368c57600080fd5b823561369781613da1565b91506020830135801515811461351457600080fd5b600080604083850312156136bf57600080fd5b82356136ca81613da1565b946020939093013593505050565b600080602083850312156136eb57600080fd5b823567ffffffffffffffff81111561370257600080fd5b61370e85828601613465565b90969095509350505050565b6000602080838503121561372d57600080fd5b823567ffffffffffffffff8082111561374557600080fd5b818501915085601f83011261375957600080fd5b81358181111561376b5761376b613cbe565b613779848260051b01613adf565b8181528481019250838501600683901b8501860189101561379957600080fd5b60009450845b838110156137f057604080838c0312156137b7578687fd5b6137bf613ab6565b83356137ca81613da1565b8152838901356137d981613de4565b818a0152865294870194919091019060010161379f565b509098975050505050505050565b60006020828403121561381057600080fd5b81356120a781613db6565b60006020828403121561382d57600080fd5b81516120a781613db6565b6000806020838503121561384b57600080fd5b823567ffffffffffffffff8082111561386357600080fd5b818501915085601f83011261387757600080fd5b81358181111561388657600080fd5b86602082850101111561389857600080fd5b60209290920196919550909350505050565b6000606082840312156134c357600080fd5b6000604082840312156134c357600080fd5b600060a082840312156138e057600080fd5b6120a783836134b1565b6000602082840312156138fc57600080fd5b5035919050565b60006020828403121561391557600080fd5b5051919050565b60008151808452613934816020860160208601613b53565b601f01601f19169290920160200192915050565b6000835161395a818460208801613b53565b83519083019061396e818360208801613b53565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526139a9608083018461391c565b9695505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020815260006120a7602083018461391c565b8135815260208083013590820152606081016040830135613a1581613de4565b67ffffffffffffffff811660408401525092915050565b604081018235613a3b81613de4565b67ffffffffffffffff1682526020830135613a5581613da1565b6001600160a01b03811660208401525092915050565b60a081018235613a7a81613de4565b67ffffffffffffffff81168352506020830135602083015260408301356040830152606083013560608301526080830135608083015292915050565b6040805190810167ffffffffffffffff81118282101715613ad957613ad9613cbe565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613b0857613b08613cbe565b604052919050565b60008219821115613b2357613b23613c7c565b500190565b600082613b3757613b37613c92565b500490565b600082821015613b4e57613b4e613c7c565b500390565b60005b83811015613b6e578181015183820152602001613b56565b83811115611a975750506000910152565b8135613b8a81613de4565b815467ffffffffffffffff191667ffffffffffffffff821617825550602082013560018201556040820135600282015560608201356003820155608082013560048201555050565b600181811c90821680613be657607f821691505b602082108114156134c357634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c3957613c39613c7c565b5060010190565b600067ffffffffffffffff80831681811415613c5e57613c5e613c7c565b6001019392505050565b600082613c7757613c77613c92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b81358155602082013560018201556040820135613cf081613de4565b60028201805467ffffffffffffffff191667ffffffffffffffff8316179055505050565b8135613d1f81613de4565b815467ffffffffffffffff191667ffffffffffffffff8216178255506020820135613d4981613da1565b81547fffffffff0000000000000000000000000000000000000000ffffffffffffffff1660409190911b7bffffffffffffffffffffffffffffffffffffffff00000000000000001617905550565b6116fa8282613b7f565b6001600160a01b038116811461258357600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461258357600080fd5b67ffffffffffffffff8116811461258357600080fdfea2646970667358221220f87e4cb2b479deca59f2bb901b315471017f4b595ad87a8fd0ea22ed607fbe8064736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000062e490a00000000000000000000000000000000000000000000000000000000062e5e220ec0c2ff00172a2c8960866988602537a2a98fb884db25ed02b90bb2874018676000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f77756c69616e6779656c6162732e6d7970696e6174612e636c6f75642f697066732f516d6653727562664b6b4d505738374834325a716b594d7a774d43775047414c63795264747a6a687a33346f744e2f00000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): https://wuliangyelabs.mypinata.cloud/ipfs/QmfSrubfKkMPW87H42ZqkYMzwMCwPGALcyRdtzjhz34otN/
Arg [1] : whiteSaleConfig_ (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 0000000000000000000000000000000000000000000000000000000062e490a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000062e5e220
Arg [4] : ec0c2ff00172a2c8960866988602537a2a98fb884db25ed02b90bb2874018676
Arg [5] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [7] : 68747470733a2f2f77756c69616e6779656c6162732e6d7970696e6174612e63
Arg [8] : 6c6f75642f697066732f516d6653727562664b6b4d505738374834325a716b59
Arg [9] : 4d7a774d43775047414c63795264747a6a687a33346f744e2f00000000000000


Deployed Bytecode Sourcemap

548:8870:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1570:300:3;;;;;;;;;;-1:-1:-1;1570:300:3;;;;;:::i;:::-;;:::i;:::-;;;10691:14:15;;10684:22;10666:41;;10654:2;10639:18;1570:300:3;;;;;;;;2488:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4000:217::-;;;;;;;;;;-1:-1:-1;4000:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9641:55:15;;;9623:74;;9611:2;9596:18;4000:217:3;9477:226:15;3538:401:3;;;;;;;;;;-1:-1:-1;3538:401:3;;;;;:::i;:::-;;:::i;:::-;;3216:448:14;;;;;;:::i;:::-;;:::i;4727:330:3:-;;;;;;;;;;-1:-1:-1;4727:330:3;;;;;:::i;:::-;;:::i;1833:44:14:-;;;;;;;;;;-1:-1:-1;1833:44:14;;;;;;;;;;;;;;;;;;;;;;;;27509:18:15;27497:31;;;27479:50;;27560:2;27545:18;;27538:34;;;;27588:18;;;27581:34;;;;27646:2;27631:18;;27624:34;27689:3;27674:19;;27667:35;27466:3;27451:19;1833:44:14;27222:486:15;4900:172:14;;;;;;;;;;-1:-1:-1;4900:172:14;;;;;:::i;:::-;;:::i;3672:296::-;;;:::i;8985:77::-;;;;;;;;;;;;;:::i;8301:210::-;;;;;;;;;;;;;:::i;5123:179:3:-;;;;;;;;;;-1:-1:-1;5123:179:3;;;;;:::i;:::-;;:::i;7003:112:14:-;;;;;;;;;;-1:-1:-1;7083:24:14;;7003:112;;;26514:25:15;;;26502:2;26487:18;7003:112:14;26368:177:15;8895:82:14;;;;;;;;;;;;;:::i;7239:142::-;;;;;;;;;;-1:-1:-1;7239:142:14;;;;;:::i;:::-;;:::i;1098:84:1:-;;;;;;;;;;-1:-1:-1;1168:7:1;;-1:-1:-1;;;1168:7:1;;;;1098:84;;2191:235:3;;;;;;;;;;-1:-1:-1;2191:235:3;;;;;:::i;:::-;;:::i;1780:46:14:-;;;;;;;;;;-1:-1:-1;1780:46:14;;;;;;;;;;;;;;;;;;;;9070:115;;;;;;;;;;;;;:::i;1706:21::-;;;;;;;;;;;;;:::i;1600:31::-;;;;;;;;;;;;;;;;1929:205:3;;;;;;;;;;-1:-1:-1;1929:205:3;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;1036:85::-;;;;;;;;;;-1:-1:-1;1108:6:0;;-1:-1:-1;;;;;1108:6:0;1036:85;;8519:108:14;;;;;;;;;;-1:-1:-1;8597:22:14;;8519:108;;2650:102:3;;;;;;;;;;;;;:::i;4284:153::-;;;;;;;;;;-1:-1:-1;4284:153:3;;;;;:::i;:::-;;:::i;1638:28:14:-;;;;;;;;;;;;;;;;1884:40;;;;;;;;;;-1:-1:-1;1884:40:14;;;;;;;;;;;;;;;;;;26750:25:15;;;26806:2;26791:18;;26784:34;;;;26866:18;26854:31;26834:18;;;26827:59;26738:2;26723:18;1884:40:14;26550:342:15;5901:217:14;;;;;;;;;;;;;:::i;2269:476::-;;;;;;;;;;-1:-1:-1;2269:476:14;;;;;:::i;:::-;;:::i;1673:26::-;;;;;;;;;;-1:-1:-1;1673:26:14;;;;;;;;5368:320:3;;;;;;;;;;-1:-1:-1;5368:320:3;;;;;:::i;:::-;;:::i;2753:455:14:-;;;;;;:::i;:::-;;:::i;6883:114::-;;;;;;;;;;-1:-1:-1;6964:25:14;;6883:114;;7389:262;;;;;;;;;;-1:-1:-1;7389:262:14;;;;;:::i;:::-;;:::i;4449:443::-;;;;;;;;;;-1:-1:-1;4449:443:14;;;;;:::i;:::-;;:::i;2818:329:3:-;;;;;;;;;;-1:-1:-1;2818:329:3;;;;;:::i;:::-;;:::i;7875:250:14:-;;;;;;;;;;-1:-1:-1;7875:250:14;;;;;:::i;:::-;;:::i;5494:399::-;;;;;;;;;;;;;:::i;7659:208::-;;;;;;;;;;-1:-1:-1;7659:208:14;;;;;:::i;:::-;;:::i;6126:372::-;;;;;;;;;;-1:-1:-1;6126:372:14;;;;;:::i;:::-;;:::i;8133:160::-;;;;;;;;;;-1:-1:-1;8133:160:14;;;;;:::i;:::-;;:::i;6506:369::-;;;;;;;;;;-1:-1:-1;6506:369:14;;;;;:::i;:::-;;:::i;4503:162:3:-;;;;;;;;;;-1:-1:-1;4503:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4623:25:3;;;4600:4;4623:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4503:162;5080:406:14;;;;;;;;;;;;;:::i;1931:32::-;;;;;;;;;;-1:-1:-1;1931:32:14;;;;;;;;;;;-1:-1:-1;;;;;1931:32:14;;;;;;;27099:18:15;27087:31;;;27069:50;;-1:-1:-1;;;;;27155:55:15;;;27150:2;27135:18;;27128:83;27042:18;1931:32:14;26897:320:15;1918:198:0;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;1570:300:3:-;1672:4;1707:40;;;1722:25;1707:40;;:104;;-1:-1:-1;1763:48:3;;;1778:33;1763:48;1707:104;:156;;;-1:-1:-1;952:25:12;937:40;;;;1827:36:3;1688:175;1570:300;-1:-1:-1;;1570:300:3:o;2488:98::-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;4000:217::-;4076:7;7248:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7248:16:3;4095:73;;;;-1:-1:-1;;;4095:73:3;;21818:2:15;4095:73:3;;;21800:21:15;21857:2;21837:18;;;21830:30;21896:34;21876:18;;;21869:62;21967:14;21947:18;;;21940:42;21999:19;;4095:73:3;;;;;;;;;-1:-1:-1;4186:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4186:24:3;;4000:217::o;3538:401::-;3618:13;3634:23;3649:7;3634:14;:23::i;:::-;3618:39;;3681:5;-1:-1:-1;;;;;3675:11:3;:2;-1:-1:-1;;;;;3675:11:3;;;3667:57;;;;-1:-1:-1;;;3667:57:3;;23349:2:15;3667:57:3;;;23331:21:15;23388:2;23368:18;;;23361:30;23427:34;23407:18;;;23400:62;23498:3;23478:18;;;23471:31;23519:19;;3667:57:3;23147:397:15;3667:57:3;719:10:8;-1:-1:-1;;;;;3756:21:3;;;;:62;;-1:-1:-1;3781:37:3;3798:5;719:10:8;4503:162:3;:::i;3781:37::-;3735:165;;;;-1:-1:-1;;;3735:165:3;;18381:2:15;3735:165:3;;;18363:21:15;18420:2;18400:18;;;18393:30;18459:34;18439:18;;;18432:62;18530:26;18510:18;;;18503:54;18574:19;;3735:165:3;18179:420:15;3735:165:3;3911:21;3920:2;3924:7;3911:8;:21::i;:::-;3608:331;3538:401;;:::o;3216:448:14:-;9236:9;719:10:8;9236:25:14;9228:64;;;;-1:-1:-1;;;9228:64:14;;20326:2:15;9228:64:14;;;20308:21:15;20365:2;20345:18;;;20338:30;20404:28;20384:18;;;20377:56;20450:18;;9228:64:14;20124:350:15;9228:64:14;1744:1:2::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:2;;24528:2:15;2317:63:2::1;::::0;::::1;24510:21:15::0;24567:2;24547:18;;;24540:30;24606:33;24586:18;;;24579:61;24657:18;;2317:63:2::1;24326:355:15::0;2317:63:2::1;1744:1;2455:7;:18:::0;3331:23:14::2;:21;:23::i;:::-;3323:65;;;::::0;-1:-1:-1;;;3323:65:14;;18023:2:15;3323:65:14::2;::::0;::::2;18005:21:15::0;18062:2;18042:18;;;18035:30;18101:31;18081:18;;;18074:59;18150:18;;3323:65:14::2;17821:353:15::0;3323:65:14::2;3407:43;719:10:8::0;3439::14::2;;3407:17;:43::i;:::-;3399:102;;;::::0;-1:-1:-1;;;3399:102:14;;14288:2:15;3399:102:14::2;::::0;::::2;14270:21:15::0;14327:2;14307:18;;;14300:30;14366:34;14346:18;;;14339:62;14437:16;14417:18;;;14410:44;14471:19;;3399:102:14::2;14086:410:15::0;3399:102:14::2;3550:18;:28:::0;719:10:8;3550:28:14::2;3520:27:::0;;;:13:::2;:27;::::0;;;;;3550:28:::2;::::0;;::::2;-1:-1:-1::0;3512:104:14::2;;;::::0;-1:-1:-1;;;3512:104:14;;15751:2:15;3512:104:14::2;::::0;::::2;15733:21:15::0;15790:2;15770:18;;;15763:30;15829:34;15809:18;;;15802:62;-1:-1:-1;;;15880:18:15;;;15873:31;15921:19;;3512:104:14::2;15549:397:15::0;3512:104:14::2;3627:29;3633:22;7083:24:::0;;;7003:112;3633:22:::2;3627:5;:29::i;:::-;-1:-1:-1::0;;1701:1:2::1;2628:7;:22:::0;3216:448:14:o;4727:330:3:-;4916:41;719:10:8;4949:7:3;4916:18;:41::i;:::-;4908:103;;;;-1:-1:-1;;;4908:103:3;;23751:2:15;4908:103:3;;;23733:21:15;23790:2;23770:18;;;23763:30;23829:34;23809:18;;;23802:62;23900:19;23880:18;;;23873:47;23937:19;;4908:103:3;23549:413:15;4908:103:3;5022:28;5032:4;5038:2;5042:7;5022:9;:28::i;4900:172:14:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;1744:1:2::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:2;;24528:2:15;2317:63:2::1;::::0;::::1;24510:21:15::0;24567:2;24547:18;;;24540:30;24606:33;24586:18;;;24579:61;24657:18;;2317:63:2::1;24326:355:15::0;2317:63:2::1;1744:1;2455:7;:18:::0;4978:39:14::2;::::0;719:10:8;;4978:39:14;::::2;;;::::0;5009:7;;4978:39:::2;::::0;;;5009:7;719:10:8;4978:39:14;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;5033:31:14::2;::::0;26514:25:15;;;719:10:8;;5033:31:14::2;::::0;26502:2:15;26487:18;5033:31:14::2;;;;;;;-1:-1:-1::0;1701:1:2::1;2628:7;:22:::0;4900:172:14:o;3672:296::-;9236:9;719:10:8;9236:25:14;9228:64;;;;-1:-1:-1;;;9228:64:14;;20326:2:15;9228:64:14;;;20308:21:15;20365:2;20345:18;;;20338:30;20404:28;20384:18;;;20377:56;20450:18;;9228:64:14;20124:350:15;9228:64:14;1744:1:2::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:2;;24528:2:15;2317:63:2::1;::::0;::::1;24510:21:15::0;24567:2;24547:18;;;24540:30;24606:33;24586:18;;;24579:61;24657:18;;2317:63:2::1;24326:355:15::0;2317:63:2::1;1744:1;2455:7;:18:::0;3756:21:14::2;:19;:21::i;:::-;3748:61;;;::::0;-1:-1:-1;;;3748:61:14;;15051:2:15;3748:61:14::2;::::0;::::2;15033:21:15::0;15090:2;15070:18;;;15063:30;15129:29;15109:18;;;15102:57;15176:18;;3748:61:14::2;14849:351:15::0;3748:61:14::2;3858:26:::0;;719:10:8;3858:26:14::2;3828:27:::0;;;:13:::2;:27;::::0;;;;;3858:26:::2;::::0;;::::2;-1:-1:-1::0;3820:102:14::2;;;::::0;-1:-1:-1;;;3820:102:14;;15751:2:15;3820:102:14::2;::::0;::::2;15733:21:15::0;15790:2;15770:18;;;15763:30;15829:34;15809:18;;;15802:62;-1:-1:-1;;;15880:18:15;;;15873:31;15921:19;;3820:102:14::2;15549:397:15::0;3820:102:14::2;3933:27;3939:20;8597:22:::0;;;8519:108;3933:27:::2;1701:1:2::1;2628:7;:22:::0;3672:296:14:o;8985:77::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;9361:14:14::1;::::0;::::1;;9360:15;9352:43;;;::::0;-1:-1:-1;;;9352:43:14;;15407:2:15;9352:43:14::1;::::0;::::1;15389:21:15::0;15446:2;15426:18;;;15419:30;15485:17;15465:18;;;15458:45;15520:18;;9352:43:14::1;15205:339:15::0;9352:43:14::1;9044:10:::2;:8;:10::i;:::-;8985:77::o:0;8301:210::-;8377:16;:26;8353:4;;8377:30;;;;:87;;-1:-1:-1;8438:16:14;:26;8420:15;:44;8377:87;:126;;;;-1:-1:-1;8477:22:14;;:26;;8377:126;8370:133;;8301:210;:::o;5123:179:3:-;5256:39;5273:4;5279:2;5283:7;5256:39;;;;;;;;;;;;:16;:39::i;8895:82:14:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;9361:14:14::1;::::0;::::1;;9360:15;9352:43;;;::::0;-1:-1:-1;;;9352:43:14;;15407:2:15;9352:43:14::1;::::0;::::1;15389:21:15::0;15446:2;15426:18;;;15419:30;15485:17;15465:18;;;15458:45;15520:18;;9352:43:14::1;15205:339:15::0;9352:43:14::1;8961:8:::2;:6;:8::i;7239:142::-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;7315:18:14::1;:7;7325:8:::0;;7315:18:::1;:::i;:::-;;7349:24;7364:8;;7349:24;;;;;;;:::i;:::-;;;;;;;;7239:142:::0;;:::o;2191:235:3:-;2263:7;2298:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2298:16:3;2332:19;2324:73;;;;-1:-1:-1;;;2324:73:3;;19565:2:15;2324:73:3;;;19547:21:15;19604:2;19584:18;;;19577:30;19643:34;19623:18;;;19616:62;19714:11;19694:18;;;19687:39;19743:19;;2324:73:3;19363:405:15;9070:115:14;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;9124:14:14::1;:21:::0;;-1:-1:-1;;9124:21:14::1;9141:4;9124:21;::::0;;9161:16:::1;::::0;::::1;::::0;9124:14:::1;::::0;9161:16:::1;9070:115::o:0;1706:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1929:205:3:-;2001:7;-1:-1:-1;;;;;2028:19:3;;2020:74;;;;-1:-1:-1;;;2020:74:3;;19154:2:15;2020:74:3;;;19136:21:15;19193:2;19173:18;;;19166:30;19232:34;19212:18;;;19205:62;19303:12;19283:18;;;19276:40;19333:19;;2020:74:3;18952:406:15;2020:74:3;-1:-1:-1;;;;;;2111:16:3;;;;;:9;:16;;;;;;;1929:205::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;1732:30:::1;1759:1;1732:18;:30::i;2650:102:3:-:0;2706:13;2738:7;2731:14;;;;;:::i;4284:153::-;4378:52;719:10:8;4411:8:3;4421;4378:18;:52::i;:::-;4284:153;;:::o;5901:217:14:-;5973:12;:22;5949:4;;5973:22;;:26;;;;:79;;-1:-1:-1;6030:12:14;:22;;;6012:15;:40;5973:79;:137;;;;-1:-1:-1;6065:12:14;:31;;;;-1:-1:-1;;;;;6065:31:14;:45;;5966:144;;5901:217;:::o;2269:476::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;1744:1:2::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:2;;24528:2:15;2317:63:2::1;::::0;::::1;24510:21:15::0;24567:2;24547:18;;;24540:30;24606:33;24586:18;;;24579:61;24657:18;;2317:63:2::1;24326:355:15::0;2317:63:2::1;1744:1;2455:7;:18:::0;2363:9:14::2;2358:380;2375:3;:10;2373:1;:12;2358:380;;;2446:1;-1:-1:-1::0;;;;;2413:35:14::2;:3;2417:1;2413:6;;;;;;;;:::i;:::-;;;;;;;:21;;;-1:-1:-1::0;;;;;2413:35:14::2;;;2405:60;;;::::0;-1:-1:-1;;;2405:60:14;;23008:2:15;2405:60:14::2;::::0;::::2;22990:21:15::0;23047:2;23027:18;;;23020:30;23086:14;23066:18;;;23059:42;23118:18;;2405:60:14::2;22806:336:15::0;2405:60:14::2;2501:1;2488:3;2492:1;2488:6;;;;;;;;:::i;:::-;;;;;;;:10;;;:14;;;2480:51;;;::::0;-1:-1:-1;;;2480:51:14;;16912:2:15;2480:51:14::2;::::0;::::2;16894:21:15::0;16951:2;16931:18;;;16924:30;16990:26;16970:18;;;16963:54;17034:18;;2480:51:14::2;16710:348:15::0;2480:51:14::2;2582:9;;2568:3;2572:1;2568:6;;;;;;;;:::i;:::-;;;;;;;:10;;;2554:24;;:11;;:24;;;;:::i;:::-;:37;;2546:69;;;::::0;-1:-1:-1;;;2546:69:14;;14703:2:15;2546:69:14::2;::::0;::::2;14685:21:15::0;14742:2;14722:18;;;14715:30;14781:21;14761:18;;;14754:49;14820:18;;2546:69:14::2;14501:343:15::0;2546:69:14::2;2634:8;2630:97;2647:3;2651:1;2647:6;;;;;;;;:::i;:::-;;;;;;;:10;;;2645:12;;:1;:12;;;2630:97;;;2681:30;2689:3;2693:1;2689:6;;;;;;;;:::i;:::-;;;;;;;:21;;;2681:7;:30::i;:::-;2658:3:::0;::::2;::::0;::::2;:::i;:::-;;;;2630:97;;;-1:-1:-1::0;2386:3:14;::::2;::::0;::::2;:::i;:::-;;;;2358:380;;5368:320:3::0;5537:41;719:10:8;5570:7:3;5537:18;:41::i;:::-;5529:103;;;;-1:-1:-1;;;5529:103:3;;23751:2:15;5529:103:3;;;23733:21:15;23790:2;23770:18;;;23763:30;23829:34;23809:18;;;23802:62;23900:19;23880:18;;;23873:47;23937:19;;5529:103:3;23549:413:15;5529:103:3;5642:39;5656:4;5662:2;5666:7;5675:5;5642:13;:39::i;:::-;5368:320;;;;:::o;2753:455:14:-;9236:9;719:10:8;9236:25:14;9228:64;;;;-1:-1:-1;;;9228:64:14;;20326:2:15;9228:64:14;;;20308:21:15;20365:2;20345:18;;;20338:30;20404:28;20384:18;;;20377:56;20450:18;;9228:64:14;20124:350:15;9228:64:14;1744:1:2::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:2;;24528:2:15;2317:63:2::1;::::0;::::1;24510:21:15::0;24567:2;24547:18;;;24540:30;24606:33;24586:18;;;24579:61;24657:18;;2317:63:2::1;24326:355:15::0;2317:63:2::1;1744:1;2455:7;:18:::0;2869:24:14::2;:22;:24::i;:::-;2861:67;;;::::0;-1:-1:-1;;;2861:67:14;;24169:2:15;2861:67:14::2;::::0;::::2;24151:21:15::0;24208:2;24188:18;;;24181:30;24247:32;24227:18;;;24220:60;24297:18;;2861:67:14::2;23967:354:15::0;2861:67:14::2;2947:44;719:10:8::0;2980::14::2;;2947:18;:44::i;:::-;2939:104;;;::::0;-1:-1:-1;;;2939:104:14;;21402:2:15;2939:104:14::2;::::0;::::2;21384:21:15::0;21441:2;21421:18;;;21414:30;21480:34;21460:18;;;21453:62;21551:17;21531:18;;;21524:45;21586:19;;2939:104:14::2;21200:411:15::0;2939:104:14::2;3092:19;:29:::0;719:10:8;3092:29:14::2;3062:27:::0;;;:13:::2;:27;::::0;;;;;3092:29:::2;::::0;;::::2;-1:-1:-1::0;3054:105:14::2;;;::::0;-1:-1:-1;;;3054:105:14;;15751:2:15;3054:105:14::2;::::0;::::2;15733:21:15::0;15790:2;15770:18;;;15763:30;15829:34;15809:18;;;15802:62;-1:-1:-1;;;15880:18:15;;;15873:31;15921:19;;3054:105:14::2;15549:397:15::0;3054:105:14::2;3170:30;3176:23;6964:25:::0;;;6883:114;7389:262;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;7513:1:14::1;7497:7;:13;;;:17;7489:63;;;::::0;-1:-1:-1;;;7489:63:14;;13886:2:15;7489:63:14::1;::::0;::::1;13868:21:15::0;13925:2;13905:18;;;13898:30;13964:34;13944:18;;;13937:62;-1:-1:-1;;;14015:18:15;;;14008:31;14056:19;;7489:63:14::1;13684:397:15::0;7489:63:14::1;7585:7:::0;7563:19:::1;:29;7585:7:::0;7563:19;:29:::1;:::i;:::-;;;;7608:35;7635:7;7608:35;;;;;;:::i;:::-;;;;;;;;7389:262:::0;:::o;4449:443::-;4527:7;9236:9;719:10:8;9236:25:14;9228:64;;;;-1:-1:-1;;;9228:64:14;;20326:2:15;9228:64:14;;;20308:21:15;20365:2;20345:18;;;20338:30;20404:28;20384:18;;;20377:56;20450:18;;9228:64:14;20124:350:15;9228:64:14;1744:1:2::1;2325:7;;:19;;2317:63;;;::::0;-1:-1:-1;;;2317:63:2;;24528:2:15;2317:63:2::1;::::0;::::1;24510:21:15::0;24567:2;24547:18;;;24540:30;24606:33;24586:18;;;24579:61;24657:18;;2317:63:2::1;24326:355:15::0;2317:63:2::1;1744:1;2455:7;:18:::0;4555:17:14::2;:15;:17::i;:::-;4547:52;;;::::0;-1:-1:-1;;;4547:52:14;;19975:2:15;4547:52:14::2;::::0;::::2;19957:21:15::0;20014:2;19994:18;;;19987:30;20053:24;20033:18;;;20026:52;20095:18;;4547:52:14::2;19773:346:15::0;4547:52:14::2;719:10:8::0;4618:17:14::2;4626:8:::0;4618:7:::2;:17::i;:::-;-1:-1:-1::0;;;;;4618:33:14::2;;4610:65;;;::::0;-1:-1:-1;;;4610:65:14;;18806:2:15;4610:65:14::2;::::0;::::2;18788:21:15::0;18845:2;18825:18;;;18818:30;18884:21;18864:18;;;18857:49;18923:18;;4610:65:14::2;18604:343:15::0;4610:65:14::2;4686:15;4692:8;4686:5;:15::i;:::-;4752:12;:31:::0;;;::::2;-1:-1:-1::0;;;;;4752:31:14::2;4712:24;4752:31:::0;4816:16:::2;719:10:8::0;4816:40:14::2;::::0;;::::2;::::0;;;;;;-1:-1:-1;;;;;10416:55:15;;;4816:40:14::2;::::0;::::2;10398:74:15::0;10488:18;;;10481:34;;;10371:18;;4816:40:14::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1701:1:2::1;2628:7;:22:::0;4795:61:14;4449:443;-1:-1:-1;;;;4449:443:14:o;2818:329:3:-;7225:4;7248:16;;;:7;:16;;;;;;2891:13;;-1:-1:-1;;;;;7248:16:3;2916:76;;;;-1:-1:-1;;;2916:76:3;;22592:2:15;2916:76:3;;;22574:21:15;22631:2;22611:18;;;22604:30;22670:34;22650:18;;;22643:62;22741:17;22721:18;;;22714:45;22776:19;;2916:76:3;22390:411:15;2916:76:3;3003:21;3027:10;:8;:10::i;:::-;3003:34;;3078:1;3060:7;3054:21;:25;:86;;;;;;;;;;;;;;;;;3106:7;3115:18;:7;:16;:18::i;:::-;3089:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3054:86;3047:93;2818:329;-1:-1:-1;;;2818:329:3:o;7875:250:14:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;7993:1:14::1;7977:7;:13;;;:17;7969:63;;;::::0;-1:-1:-1;;;7969:63:14;;13886:2:15;7969:63:14::1;::::0;::::1;13868:21:15::0;13925:2;13905:18;;;13898:30;13964:34;13944:18;;;13937:62;-1:-1:-1;;;14015:18:15;;;14008:31;14056:19;;7969:63:14::1;13684:397:15::0;7969:63:14::1;8062:7:::0;8043:16:::1;:26;8062:7:::0;8043:16;:26:::1;:::i;:::-;;;;8085:32;8109:7;8085:32;;;;;;:::i;5494:399::-:0;5569:26;;5548:4;;5569:30;;;;:78;;-1:-1:-1;5621:26:14;;5603:15;:44;5569:78;5565:123;;;-1:-1:-1;5671:5:14;;5494:399::o;5565:123::-;5705:28;;:32;;;;:91;;-1:-1:-1;5768:28:14;;5750:15;:46;5705:91;:132;;;;-1:-1:-1;5809:24:14;;:28;;5705:132;:180;;;;-1:-1:-1;;5850:29:14;;:35;;;5494:399::o;7659:208::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;7781:1:14::1;7765:7;:13;;;:17;7757:63;;;::::0;-1:-1:-1;;;7757:63:14;;13886:2:15;7757:63:14::1;::::0;::::1;13868:21:15::0;13925:2;13905:18;;;13898:30;13964:34;13944:18;;;13937:62;-1:-1:-1;;;14015:18:15;;;14008:31;14056:19;;7757:63:14::1;13684:397:15::0;7757:63:14::1;7852:7:::0;7831:18:::1;:28;7852:7:::0;7831:18;:28:::1;:::i;6126:372::-:0;6245:30;;6224:4;;6241:81;;-1:-1:-1;6305:5:14;6298:12;;6241:81;6339:151;6372:10;;6339:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6397:30:14;;6452:26;;-1:-1:-1;;8882:2:15;8878:15;;;8874:88;6452:26:14;;;8862:101:15;6397:30:14;;-1:-1:-1;8979:12:15;;;-1:-1:-1;6452:26:14;;;;;;;;;;;;;6442:37;;;;;;6339:18;:151::i;:::-;6332:158;6126:372;-1:-1:-1;;;;6126:372:14:o;8133:160::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;8234:7:14;8219:12:::1;:22;8234:7:::0;8219:12;:22:::1;:::i;:::-;;;;8257:28;8277:7;8257:28;;;;;;:::i;6506:369::-:0;6624:29;;6603:4;;6620:80;;-1:-1:-1;6683:5:14;6676:12;;6620:80;6717:150;6750:10;;6717:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6775:29:14;;6829:26;;-1:-1:-1;;8882:2:15;8878:15;;;8874:88;6829:26:14;;;8862:101:15;6775:29:14;;-1:-1:-1;8979:12:15;;;-1:-1:-1;6829:26:14;8733:264:15;5080:406:14;5156:27;;5135:4;;5156:31;;;;:80;;-1:-1:-1;5209:27:14;;5191:15;:45;5156:80;5152:125;;;-1:-1:-1;5260:5:14;;5080:406::o;5152:125::-;5294:29;;:33;;;;:93;;-1:-1:-1;5358:29:14;;5340:15;:47;5294:93;:135;;;;-1:-1:-1;5400:25:14;;:29;;5294:135;:184;;;;-1:-1:-1;;5442:30:14;;:36;;;5080:406::o;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;22231:2:15;1240:68:0;;;22213:21:15;;;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;22361:18;;1240:68:0;22029:356:15;1240:68:0;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;12716:2:15;1998:73:0::1;::::0;::::1;12698:21:15::0;12755:2;12735:18;;;12728:30;12794:34;12774:18;;;12767:62;12865:8;12845:18;;;12838:36;12891:19;;1998:73:0::1;12514:402:15::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;11169:171:3:-;11243:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;11243:29:3;-1:-1:-1;;;;;11243:29:3;;;;;;;;:24;;11296:23;11243:24;11296:14;:23::i;:::-;-1:-1:-1;;;;;11287:46:3;;;;;;;;;;;11169:171;;:::o;3976:223:14:-;4052:9;;4035:11;;:13;;4047:1;4035:13;:::i;:::-;:26;;4027:58;;;;-1:-1:-1;;;4027:58:14;;14703:2:15;4027:58:14;;;14685:21:15;14742:2;14722:18;;;14715:30;14781:21;14761:18;;;14754:49;14820:18;;4027:58:14;14501:343:15;4027:58:14;4114:9;4104:6;:19;;4096:63;;;;-1:-1:-1;;;4096:63:14;;20681:2:15;4096:63:14;;;20663:21:15;20720:2;20700:18;;;20693:30;20759:33;20739:18;;;20732:61;20810:18;;4096:63:14;20479:355:15;4096:63:14;4170:21;719:10:8;4170:7:14;:21::i;7443:344:3:-;7536:4;7248:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7248:16:3;7552:73;;;;-1:-1:-1;;;7552:73:3;;17265:2:15;7552:73:3;;;17247:21:15;17304:2;17284:18;;;17277:30;17343:34;17323:18;;;17316:62;17414:14;17394:18;;;17387:42;17446:19;;7552:73:3;17063:408:15;7552:73:3;7635:13;7651:23;7666:7;7651:14;:23::i;:::-;7635:39;;7703:5;-1:-1:-1;;;;;7692:16:3;:7;-1:-1:-1;;;;;7692:16:3;;:52;;;-1:-1:-1;;;;;;4623:25:3;;;4600:4;4623:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7712:32;7692:87;;;;7772:7;-1:-1:-1;;;;;7748:31:3;:20;7760:7;7748:11;:20::i;:::-;-1:-1:-1;;;;;7748:31:3;;7684:96;7443:344;-1:-1:-1;;;;7443:344:3:o;10453:605::-;10607:4;-1:-1:-1;;;;;10580:31:3;:23;10595:7;10580:14;:23::i;:::-;-1:-1:-1;;;;;10580:31:3;;10572:81;;;;-1:-1:-1;;;10572:81:3;;13123:2:15;10572:81:3;;;13105:21:15;13162:2;13142:18;;;13135:30;13201:34;13181:18;;;13174:62;13272:7;13252:18;;;13245:35;13297:19;;10572:81:3;12921:401:15;10572:81:3;-1:-1:-1;;;;;10671:16:3;;10663:65;;;;-1:-1:-1;;;10663:65:3;;16153:2:15;10663:65:3;;;16135:21:15;16192:2;16172:18;;;16165:30;16231:34;16211:18;;;16204:62;16302:6;16282:18;;;16275:34;16326:19;;10663:65:3;15951:400:15;10663:65:3;10739:39;10760:4;10766:2;10770:7;10739:20;:39::i;:::-;10840:29;10857:1;10861:7;10840:8;:29::i;:::-;-1:-1:-1;;;;;10880:15:3;;;;;;:9;:15;;;;;:20;;10899:1;;10880:15;:20;;10899:1;;10880:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10910:13:3;;;;;;:9;:13;;;;;:18;;10927:1;;10910:13;:18;;10927:1;;10910:18;:::i;:::-;;;;-1:-1:-1;;10938:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;10938:21:3;-1:-1:-1;;;;;10938:21:3;;;;;;;;;10975:27;;10938:16;;10975:27;;;;;;;3608:331;3538:401;;:::o;2110:117:1:-;1168:7;;-1:-1:-1;;;1168:7:1;;;;1669:41;;;;-1:-1:-1;;;1669:41:1;;11598:2:15;1669:41:1;;;11580:21:15;11637:2;11617:18;;;11610:30;11676:22;11656:18;;;11649:50;11716:18;;1669:41:1;11396:344:15;1669:41:1;2168:7:::1;:15:::0;;;::::1;::::0;;2198:22:::1;719:10:8::0;2207:12:1::1;2198:22;::::0;-1:-1:-1;;;;;9641:55:15;;;9623:74;;9611:2;9596:18;2198:22:1::1;;;;;;;2110:117::o:0;1863:115::-;1168:7;;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;17678:2:15;1403:38:1;;;17660:21:15;17717:2;17697:18;;;17690:30;17756:18;17736;;;17729:46;17792:18;;1403:38:1;17476:340:15;1403:38:1;1922:7:::1;:14:::0;;;::::1;-1:-1:-1::0;;;1922:14:1::1;::::0;;1951:20:::1;1958:12;719:10:8::0;;640:96;2270:187:0;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;11475:307:3:-;11625:8;-1:-1:-1;;;;;11616:17:3;:5;-1:-1:-1;;;;;11616:17:3;;;11608:55;;;;-1:-1:-1;;;11608:55:3;;16558:2:15;11608:55:3;;;16540:21:15;16597:2;16577:18;;;16570:30;16636:27;16616:18;;;16609:55;16681:18;;11608:55:3;16356:349:15;11608:55:3;-1:-1:-1;;;;;11673:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11673:46:3;;;;;;;;;;11734:41;;10666::15;;;11734::3;;10639:18:15;11734:41:3;;;;;;;11475:307;;;:::o;4205:236:14:-;4254:11;:13;;;:11;:13;;;:::i;:::-;;;;;;4307:1;4278:13;:27;4292:12;719:10:8;;640:96;4292:12:14;-1:-1:-1;;;;;4278:27:14;-1:-1:-1;;;;;4278:27:14;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;4319:15:14;1032:19:9;;1050:1;1032:19;;;4357:15:14;4375:25;:15;918:14:9;;827:112;4375:25:14;4357:43;;4411:22;4421:2;4425:7;4411:9;:22::i;6550:307:3:-;6701:28;6711:4;6717:2;6721:7;6701:9;:28::i;:::-;6747:48;6770:4;6776:2;6780:7;6789:5;6747:22;:48::i;:::-;6739:111;;;;-1:-1:-1;;;6739:111:3;;12297:2:15;6739:111:3;;;12279:21:15;12336:2;12316:18;;;12309:30;12375:34;12355:18;;;12348:62;12446:20;12426:18;;;12419:48;12484:19;;6739:111:3;12095:414:15;9723:406:3;9782:13;9798:23;9813:7;9798:14;:23::i;:::-;9782:39;;9832:48;9853:5;9868:1;9872:7;9832:20;:48::i;:::-;9918:29;9935:1;9939:7;9918:8;:29::i;:::-;-1:-1:-1;;;;;9958:16:3;;;;;;:9;:16;;;;;:21;;9978:1;;9958:16;:21;;9978:1;;9958:21;:::i;:::-;;;;-1:-1:-1;;9996:16:3;;;;:7;:16;;;;;;9989:23;;-1:-1:-1;;9989:23:3;;;10028:36;10004:7;;9996:16;-1:-1:-1;;;;;10028:36:3;;;;;9996:16;;10028:36;4284:153;;:::o;7123:108:14:-;7183:13;7216:7;7209:14;;;;;:::i;328:703:10:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:10;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:10;;-1:-1:-1;773:2:10;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:10;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:10;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:10;981:2;972:11;;:::i;:::-;;;844:150;;1153:184:11;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;;1153:184;-1:-1:-1;;;;1153:184:11:o;8635:252:14:-;1168:7:1;;-1:-1:-1;;;1168:7:1;;;;8844:9:14;8836:43;;;;-1:-1:-1;;;8836:43:14;;11947:2:15;8836:43:14;;;11929:21:15;11986:2;11966:18;;;11959:30;12025:23;12005:18;;;11998:51;12066:18;;8836:43:14;11745:345:15;8117:108:3;8192:26;8202:2;8206:7;8192:26;;;;;;;;;;;;:9;:26::i;12335:778::-;12485:4;-1:-1:-1;;;;;12505:13:3;;1465:19:7;:23;12501:606:3;;12540:72;;;;;-1:-1:-1;;;;;12540:36:3;;;;;:72;;719:10:8;;12591:4:3;;12597:7;;12606:5;;12540:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:72:3;;;;;;;;-1:-1:-1;;12540:72:3;;;;;;;;;;;;:::i;:::-;;;12536:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12779:13:3;;12775:266;;12821:60;;-1:-1:-1;;;12821:60:3;;12297:2:15;12821:60:3;;;12279:21:15;12336:2;12316:18;;;12309:30;12375:34;12355:18;;;12348:62;12446:20;12426:18;;;12419:48;12484:19;;12821:60:3;12095:414:15;12775:266:3;12993:6;12987:13;12978:6;12974:2;12970:15;12963:38;12536:519;12662:51;;12672:41;12662:51;;-1:-1:-1;12655:58:3;;12501:606;-1:-1:-1;13092:4:3;12335:778;;;;;;:::o;1991:290:11:-;2074:7;2116:4;2074:7;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;2202:9;:33::i;:::-;2187:48;-1:-1:-1;2168:3:11;;;;:::i;:::-;;;;2130:116;;;-1:-1:-1;2262:12:11;1991:290;-1:-1:-1;;;1991:290:11:o;8446:311:3:-;8571:18;8577:2;8581:7;8571:5;:18::i;:::-;8620:54;8651:1;8655:2;8659:7;8668:5;8620:22;:54::i;:::-;8599:151;;;;-1:-1:-1;;;8599:151:3;;12297:2:15;8599:151:3;;;12279:21:15;12336:2;12316:18;;;12309:30;12375:34;12355:18;;;12348:62;12446:20;12426:18;;;12419:48;12484:19;;8599:151:3;12095:414:15;8054:147:11;8117:7;8147:1;8143;:5;:51;;8275:13;8366:15;;;8401:4;8394:15;;;8447:4;8431:21;;8143:51;;;-1:-1:-1;8275:13:11;8366:15;;;8401:4;8394:15;8447:4;8431:21;;;8054:147::o;9079:427:3:-;-1:-1:-1;;;;;9158:16:3;;9150:61;;;;-1:-1:-1;;;9150:61:3;;21041:2:15;9150:61:3;;;21023:21:15;;;21060:18;;;21053:30;21119:34;21099:18;;;21092:62;21171:18;;9150:61:3;20839:356:15;9150:61:3;7225:4;7248:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7248:16:3;:30;9221:58;;;;-1:-1:-1;;;9221:58:3;;13529:2:15;9221:58:3;;;13511:21:15;13568:2;13548:18;;;13541:30;13607;13587:18;;;13580:58;13655:18;;9221:58:3;13327:352:15;9221:58:3;9290:45;9319:1;9323:2;9327:7;9290:20;:45::i;:::-;-1:-1:-1;;;;;9346:13:3;;;;;;:9;:13;;;;;:18;;9363:1;;9346:13;:18;;9363:1;;9346:18;:::i;:::-;;;;-1:-1:-1;;9374:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;9374:21:3;-1:-1:-1;;;;;9374:21:3;;;;;;;;9411:33;;9374:16;;;9411:33;;9374:16;;9411:33;4284:153;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:367:15;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:15;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:167::-;457:5;502:3;493:6;488:3;484:16;480:26;477:46;;;519:1;516;509:12;477:46;-1:-1:-1;541:6:15;386:167;-1:-1:-1;386:167:15:o;558:247::-;617:6;670:2;658:9;649:7;645:23;641:32;638:52;;;686:1;683;676:12;638:52;725:9;712:23;744:31;769:5;744:31;:::i;810:388::-;878:6;886;939:2;927:9;918:7;914:23;910:32;907:52;;;955:1;952;945:12;907:52;994:9;981:23;1013:31;1038:5;1013:31;:::i;:::-;1063:5;-1:-1:-1;1120:2:15;1105:18;;1092:32;1133:33;1092:32;1133:33;:::i;:::-;1185:7;1175:17;;;810:388;;;;;:::o;1203:456::-;1280:6;1288;1296;1349:2;1337:9;1328:7;1324:23;1320:32;1317:52;;;1365:1;1362;1355:12;1317:52;1404:9;1391:23;1423:31;1448:5;1423:31;:::i;:::-;1473:5;-1:-1:-1;1530:2:15;1515:18;;1502:32;1543:33;1502:32;1543:33;:::i;:::-;1203:456;;1595:7;;-1:-1:-1;;;1649:2:15;1634:18;;;;1621:32;;1203:456::o;1664:1167::-;1759:6;1767;1775;1783;1836:3;1824:9;1815:7;1811:23;1807:33;1804:53;;;1853:1;1850;1843:12;1804:53;1892:9;1879:23;1911:31;1936:5;1911:31;:::i;:::-;1961:5;-1:-1:-1;1985:2:15;2024:18;;;2011:32;2052:33;2011:32;2052:33;:::i;:::-;2104:7;-1:-1:-1;2158:2:15;2143:18;;2130:32;;-1:-1:-1;2213:2:15;2198:18;;2185:32;2236:18;2266:14;;;2263:34;;;2293:1;2290;2283:12;2263:34;2331:6;2320:9;2316:22;2306:32;;2376:7;2369:4;2365:2;2361:13;2357:27;2347:55;;2398:1;2395;2388:12;2347:55;2434:2;2421:16;2456:2;2452;2449:10;2446:36;;;2462:18;;:::i;:::-;2504:112;2612:2;-1:-1:-1;;2536:4:15;2532:2;2528:13;2524:86;2520:95;2504:112;:::i;:::-;2491:125;;2639:2;2632:5;2625:17;2679:7;2674:2;2669;2665;2661:11;2657:20;2654:33;2651:53;;;2700:1;2697;2690:12;2651:53;2755:2;2750;2746;2742:11;2737:2;2730:5;2726:14;2713:45;2799:1;2794:2;2789;2782:5;2778:14;2774:23;2767:34;;2820:5;2810:15;;;;;1664:1167;;;;;;;:::o;2836:572::-;2931:6;2939;2947;3000:2;2988:9;2979:7;2975:23;2971:32;2968:52;;;3016:1;3013;3006:12;2968:52;3055:9;3042:23;3074:31;3099:5;3074:31;:::i;:::-;3124:5;-1:-1:-1;3180:2:15;3165:18;;3152:32;3207:18;3196:30;;3193:50;;;3239:1;3236;3229:12;3193:50;3278:70;3340:7;3331:6;3320:9;3316:22;3278:70;:::i;:::-;2836:572;;3367:8;;-1:-1:-1;3252:96:15;;-1:-1:-1;;;;2836:572:15:o;3413:416::-;3478:6;3486;3539:2;3527:9;3518:7;3514:23;3510:32;3507:52;;;3555:1;3552;3545:12;3507:52;3594:9;3581:23;3613:31;3638:5;3613:31;:::i;:::-;3663:5;-1:-1:-1;3720:2:15;3705:18;;3692:32;3762:15;;3755:23;3743:36;;3733:64;;3793:1;3790;3783:12;3834:315;3902:6;3910;3963:2;3951:9;3942:7;3938:23;3934:32;3931:52;;;3979:1;3976;3969:12;3931:52;4018:9;4005:23;4037:31;4062:5;4037:31;:::i;:::-;4087:5;4139:2;4124:18;;;;4111:32;;-1:-1:-1;;;3834:315:15:o;4154:437::-;4240:6;4248;4301:2;4289:9;4280:7;4276:23;4272:32;4269:52;;;4317:1;4314;4307:12;4269:52;4357:9;4344:23;4390:18;4382:6;4379:30;4376:50;;;4422:1;4419;4412:12;4376:50;4461:70;4523:7;4514:6;4503:9;4499:22;4461:70;:::i;:::-;4550:8;;4435:96;;-1:-1:-1;4154:437:15;-1:-1:-1;;;;4154:437:15:o;4596:1393::-;4711:6;4742:2;4785;4773:9;4764:7;4760:23;4756:32;4753:52;;;4801:1;4798;4791:12;4753:52;4841:9;4828:23;4870:18;4911:2;4903:6;4900:14;4897:34;;;4927:1;4924;4917:12;4897:34;4965:6;4954:9;4950:22;4940:32;;5010:7;5003:4;4999:2;4995:13;4991:27;4981:55;;5032:1;5029;5022:12;4981:55;5068:2;5055:16;5090:2;5086;5083:10;5080:36;;;5096:18;;:::i;:::-;5136:36;5168:2;5163;5160:1;5156:10;5152:19;5136:36;:::i;:::-;5206:15;;;5237:12;;;;-1:-1:-1;5269:11:15;;;5311:1;5307:10;;;5299:19;;5295:28;;5292:41;-1:-1:-1;5289:61:15;;;5346:1;5343;5336:12;5289:61;5368:1;5359:10;;5389:1;5399:560;5415:2;5410:3;5407:11;5399:560;;;5474:4;5517:2;5511:3;5502:7;5498:17;5494:26;5491:46;;;5533:1;5530;5523:12;5491:46;5563:22;;:::i;:::-;5626:3;5613:17;5643:33;5668:7;5643:33;:::i;:::-;5689:22;;5752:12;;;5739:26;5778:32;5739:26;5778:32;:::i;:::-;5830:14;;;5823:31;5867:18;;5905:12;;;;5937;;;;;5437:1;5428:11;5399:560;;;-1:-1:-1;5978:5:15;;4596:1393;-1:-1:-1;;;;;;;;4596:1393:15:o;5994:245::-;6052:6;6105:2;6093:9;6084:7;6080:23;6076:32;6073:52;;;6121:1;6118;6111:12;6073:52;6160:9;6147:23;6179:30;6203:5;6179:30;:::i;6244:249::-;6313:6;6366:2;6354:9;6345:7;6341:23;6337:32;6334:52;;;6382:1;6379;6372:12;6334:52;6414:9;6408:16;6433:30;6457:5;6433:30;:::i;6498:592::-;6569:6;6577;6630:2;6618:9;6609:7;6605:23;6601:32;6598:52;;;6646:1;6643;6636:12;6598:52;6686:9;6673:23;6715:18;6756:2;6748:6;6745:14;6742:34;;;6772:1;6769;6762:12;6742:34;6810:6;6799:9;6795:22;6785:32;;6855:7;6848:4;6844:2;6840:13;6836:27;6826:55;;6877:1;6874;6867:12;6826:55;6917:2;6904:16;6943:2;6935:6;6932:14;6929:34;;;6959:1;6956;6949:12;6929:34;7004:7;6999:2;6990:6;6986:2;6982:15;6978:24;6975:37;6972:57;;;7025:1;7022;7015:12;6972:57;7056:2;7048:11;;;;;7078:6;;-1:-1:-1;6498:592:15;;-1:-1:-1;;;;6498:592:15:o;7095:202::-;7190:6;7243:2;7231:9;7222:7;7218:23;7214:32;7211:52;;;7259:1;7256;7249:12;7302:198;7393:6;7446:2;7434:9;7425:7;7421:23;7417:32;7414:52;;;7462:1;7459;7452:12;7505:261;7602:6;7655:3;7643:9;7634:7;7630:23;7626:33;7623:53;;;7672:1;7669;7662:12;7623:53;7695:65;7752:7;7741:9;7695:65;:::i;8038:180::-;8097:6;8150:2;8138:9;8129:7;8125:23;8121:32;8118:52;;;8166:1;8163;8156:12;8118:52;-1:-1:-1;8189:23:15;;8038:180;-1:-1:-1;8038:180:15:o;8223:184::-;8293:6;8346:2;8334:9;8325:7;8321:23;8317:32;8314:52;;;8362:1;8359;8352:12;8314:52;-1:-1:-1;8385:16:15;;8223:184;-1:-1:-1;8223:184:15:o;8412:316::-;8453:3;8491:5;8485:12;8518:6;8513:3;8506:19;8534:63;8590:6;8583:4;8578:3;8574:14;8567:4;8560:5;8556:16;8534:63;:::i;:::-;8642:2;8630:15;-1:-1:-1;;8626:88:15;8617:98;;;;8717:4;8613:109;;8412:316;-1:-1:-1;;8412:316:15:o;9002:470::-;9181:3;9219:6;9213:13;9235:53;9281:6;9276:3;9269:4;9261:6;9257:17;9235:53;:::i;:::-;9351:13;;9310:16;;;;9373:57;9351:13;9310:16;9407:4;9395:17;;9373:57;:::i;:::-;9446:20;;9002:470;-1:-1:-1;;;;9002:470:15:o;9708:511::-;9902:4;-1:-1:-1;;;;;10012:2:15;10004:6;10000:15;9989:9;9982:34;10064:2;10056:6;10052:15;10047:2;10036:9;10032:18;10025:43;;10104:6;10099:2;10088:9;10084:18;10077:34;10147:3;10142:2;10131:9;10127:18;10120:31;10168:45;10208:3;10197:9;10193:19;10185:6;10168:45;:::i;:::-;10160:53;9708:511;-1:-1:-1;;;;;;9708:511:15:o;10718:449::-;10877:2;10866:9;10859:21;10916:6;10911:2;10900:9;10896:18;10889:34;10973:6;10965;10960:2;10949:9;10945:18;10932:48;11029:1;11000:22;;;11024:2;10996:31;;;10989:42;;;;11083:2;11071:15;;;-1:-1:-1;;11067:88:15;11052:104;11048:113;;10718:449;-1:-1:-1;10718:449:15:o;11172:219::-;11321:2;11310:9;11303:21;11284:4;11341:44;11381:2;11370:9;11366:18;11358:6;11341:44;:::i;24686:492::-;24920:20;;24902:39;;25004:4;24992:17;;;24979:31;24957:20;;;24950:61;24890:2;24875:18;;25058:4;25046:17;;25033:31;25073:30;25033:31;25073:30;:::i;:::-;25152:18;25145:5;25141:30;25134:4;25123:9;25119:20;25112:60;;24686:492;;;;:::o;25183:536::-;25379:2;25364:18;;25404:20;;25433:30;25404:20;25433:30;:::i;:::-;25501:18;25490:30;25472:49;;25570:4;25558:17;;25545:31;25585:33;25545:31;25585:33;:::i;:::-;-1:-1:-1;;;;;25660:7:15;25656:56;25649:4;25638:9;25634:20;25627:86;;25183:536;;;;:::o;25724:639::-;25934:3;25919:19;;25960:20;;25989:30;25960:20;25989:30;:::i;:::-;26057:18;26050:5;26046:30;26035:9;26028:49;;26140:4;26132:6;26128:17;26115:31;26108:4;26097:9;26093:20;26086:61;26210:4;26202:6;26198:17;26185:31;26178:4;26167:9;26163:20;26156:61;26280:4;26272:6;26268:17;26255:31;26248:4;26237:9;26233:20;26226:61;26350:4;26342:6;26338:17;26325:31;26318:4;26307:9;26303:20;26296:61;25724:639;;;;:::o;27713:257::-;27785:4;27779:11;;;27817:17;;27864:18;27849:34;;27885:22;;;27846:62;27843:88;;;27911:18;;:::i;:::-;27947:4;27940:24;27713:257;:::o;27975:334::-;28046:2;28040:9;28102:2;28092:13;;-1:-1:-1;;28088:86:15;28076:99;;28205:18;28190:34;;28226:22;;;28187:62;28184:88;;;28252:18;;:::i;:::-;28288:2;28281:22;27975:334;;-1:-1:-1;27975:334:15:o;28314:128::-;28354:3;28385:1;28381:6;28378:1;28375:13;28372:39;;;28391:18;;:::i;:::-;-1:-1:-1;28427:9:15;;28314:128::o;28447:120::-;28487:1;28513;28503:35;;28518:18;;:::i;:::-;-1:-1:-1;28552:9:15;;28447:120::o;28572:125::-;28612:4;28640:1;28637;28634:8;28631:34;;;28645:18;;:::i;:::-;-1:-1:-1;28682:9:15;;28572:125::o;28702:258::-;28774:1;28784:113;28798:6;28795:1;28792:13;28784:113;;;28874:11;;;28868:18;28855:11;;;28848:39;28820:2;28813:10;28784:113;;;28915:6;28912:1;28909:13;28906:48;;;-1:-1:-1;;28950:1:15;28932:16;;28925:27;28702:258::o;28965:515::-;29121:5;29108:19;29136:32;29160:7;29136:32;:::i;:::-;32905:11;;-1:-1:-1;;32901:84:15;32998:18;32987:30;;32898:120;32885:134;;29177:60;29291:2;29284:5;29280:14;29267:28;29263:1;29257:4;29253:12;29246:50;29350:2;29343:5;29339:14;29326:28;29322:1;29316:4;29312:12;29305:50;29409:2;29402:5;29398:14;29385:28;29381:1;29375:4;29371:12;29364:50;29468:3;29461:5;29457:15;29444:29;29440:1;29434:4;29430:12;29423:51;28965:515;;:::o;29485:437::-;29564:1;29560:12;;;;29607;;;29628:61;;29682:4;29674:6;29670:17;29660:27;;29628:61;29735:2;29727:6;29724:14;29704:18;29701:38;29698:218;;;-1:-1:-1;;;29769:1:15;29762:88;29873:4;29870:1;29863:15;29901:4;29898:1;29891:15;29927:195;29966:3;29997:66;29990:5;29987:77;29984:103;;;30067:18;;:::i;:::-;-1:-1:-1;30114:1:15;30103:13;;29927:195::o;30127:209::-;30165:3;30193:18;30246:2;30239:5;30235:14;30273:2;30264:7;30261:15;30258:41;;;30279:18;;:::i;:::-;30328:1;30315:15;;30127:209;-1:-1:-1;;;30127:209:15:o;30341:112::-;30373:1;30399;30389:35;;30404:18;;:::i;:::-;-1:-1:-1;30438:9:15;;30341:112::o;30458:184::-;-1:-1:-1;;;30507:1:15;30500:88;30607:4;30604:1;30597:15;30631:4;30628:1;30621:15;30647:184;-1:-1:-1;;;30696:1:15;30689:88;30796:4;30793:1;30786:15;30820:4;30817:1;30810:15;30836:184;-1:-1:-1;;;30885:1:15;30878:88;30985:4;30982:1;30975:15;31009:4;31006:1;30999:15;31025:184;-1:-1:-1;;;31074:1:15;31067:88;31174:4;31171:1;31164:15;31198:4;31195:1;31188:15;31214:423;31395:5;31382:19;31376:4;31369:33;31456:2;31449:5;31445:14;31432:28;31428:1;31422:4;31418:12;31411:50;31509:2;31502:5;31498:14;31485:28;31522:32;31546:7;31522:32;:::i;:::-;31619:1;31609:12;;32905:11;;-1:-1:-1;;32901:84:15;32998:18;32987:30;;32898:120;32885:134;;3608:331:3;3538:401;;:::o;31642:606:15:-;31817:5;31804:19;31832:32;31856:7;31832:32;:::i;:::-;32905:11;;-1:-1:-1;;32901:84:15;32998:18;32987:30;;32898:120;32885:134;;31873:60;31981:2;31974:5;31970:14;31957:28;31994:33;32019:7;31994:33;:::i;:::-;32046:11;;32090:66;32082:75;32167:2;32163:16;;;;32181:58;32159:81;32079:162;32066:176;;-1:-1:-1;31642:606:15:o;32253:269::-;32412:104;32510:5;32504:4;32412:104;:::i;33030:154::-;-1:-1:-1;;;;;33109:5:15;33105:54;33098:5;33095:65;33085:93;;33174:1;33171;33164:12;33189:177;33274:66;33267:5;33263:78;33256:5;33253:89;33243:117;;33356:1;33353;33346:12;33371:129;33456:18;33449:5;33445:30;33438:5;33435:41;33425:69;;33490:1;33487;33480:12

Swarm Source

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