ETH Price: $3,060.04 (+2.67%)
Gas: 1 Gwei

Token

Mutant Age Camel Club (MACC)
 

Overview

Max Total Supply

1,600 MACC

Holders

735

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 MACC
0x0Bb521bD6B2A0eb81A0750E0d78C50917323d958
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Camel

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 2 of 12: Camels.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
import "./ERC721.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./Address.sol";

abstract contract AbstractRoyalties {
    mapping(uint256 => LibPart.Part[]) internal royalties;

    function _saveRoyalties(uint256 id, LibPart.Part[] memory _royalties)
        internal
    {
        uint256 totalValue;
        for (uint256 i = 0; i < _royalties.length; i++) {
            require(
                _royalties[i].account != address(0x0),
                "Recipient should be present"
            );
            require(
                _royalties[i].value != 0,
                "Royalty value should be positive"
            );
            totalValue += _royalties[i].value;
            royalties[id].push(_royalties[i]);
        }
        require(totalValue < 10000, "Royalty total value should be < 10000");
        _onRoyaltiesSet(id, _royalties);
    }

    function _updateAccount(
        uint256 _id,
        address _from,
        address _to
    ) internal {
        uint256 length = royalties[_id].length;
        for (uint256 i = 0; i < length; i++) {
            if (royalties[_id][i].account == _from) {
                royalties[_id][i].account = payable(address(uint160(_to)));
            }
        }
    }

    function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties)
        internal
        virtual;
}

interface IERC2981 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

library LibPart {
    bytes32 public constant TYPE_HASH =
        keccak256("Part(address account,uint96 value)");

    struct Part {
        address payable account;
        uint96 value;
    }

    function hash(Part memory part) internal pure returns (bytes32) {
        return keccak256(abi.encode(TYPE_HASH, part.account, part.value));
    }
}

library LibRoyaltiesV2 {
    /*
     * bytes4(keccak256('getRaribleV2Royalties(uint256)')) == 0xcad96cca
     */
    bytes4 constant _INTERFACE_ID_ROYALTIES = 0xcad96cca;
}

interface RoyaltiesV2 {
    event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);

    function getRaribleV2Royalties(uint256 id)
        external
        view
        returns (LibPart.Part[] memory);
}

contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2, IERC2981 {
    function getRaribleV2Royalties(uint256 id)
        external
        view
        override
        returns (LibPart.Part[] memory)
    {
        return royalties[id];
    }

    function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties)
        internal
        override
    {
        emit RoyaltiesSet(id, _royalties);
    }

    /*
     *Token (ERC721, ERC721Minimal, ERC721MinimalMeta, ERC1155 ) can have a number of different royalties beneficiaries
     *calculate sum all royalties, but royalties beneficiary will be only one royalties[0].account, according to rules of IERC2981
     */
    function royaltyInfo(uint256 id, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        if (royalties[id].length == 0) {
            receiver = address(0);
            royaltyAmount = 0;
            return (receiver, royaltyAmount);
        }
        LibPart.Part[] memory _royalties = royalties[id];
        receiver = _royalties[0].account;
        uint256 percent;
        for (uint256 i = 0; i < _royalties.length; i++) {
            percent += _royalties[i].value;
        }
        //don`t need require(percent < 10000, "Token royalty > 100%"); here, because check later in calculateRoyalties
        royaltyAmount = (percent * _salePrice) / 10000;
    }
}

contract Camel is ERC721, Ownable, RoyaltiesV2Impl {
    using Strings for uint256;

    string public baseURI;
    string public baseExtension = ".json";
    string public notRevealedUri;
    uint256 public cost = 0.1 ether;
    uint256 public costWL = 0.08 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmount = 15;
    uint256 public nftPerAddressLimit = 15;
    uint256 allTokens = 0;
    bool public paused = false;
    bool public revealed = false;
    mapping(address => uint256) public addressMintedBalance;

    bool public onlyWhitelisted = true;
    address[] public whitelistedAddresses;

    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;

    constructor() ERC721("Mutant Age Camel Club", "MACC") {
        setBaseURI("https://meta.mutantagecamelclub.io/");
    }

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

    function setRoyalties(
        uint256 _tokenId,
        address payable _royaltiesRecipientAddress,
        uint96 _percentageBasisPoint
    ) internal {
        LibPart.Part[] memory _royalties = new LibPart.Part[](1);
        _royalties[0].account = _royaltiesRecipientAddress;
        _royalties[0].value = _percentageBasisPoint;
        _saveRoyalties(_tokenId, _royalties);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721)
        returns (bool)
    {
        if (interfaceId == LibRoyaltiesV2._INTERFACE_ID_ROYALTIES) {
            return true;
        }
        if (interfaceId == _INTERFACE_ID_ERC2981) {
            return true;
        }
        return super.supportsInterface(interfaceId);
    }

    function mint(uint256 _mintAmount) public payable {
        require(!paused, "the contract is paused");
        uint256 supply = totalSupply();

        if (msg.sender != owner()) {
            require(_mintAmount > 0, "need to mint at least 1 NFT");
            require(
                _mintAmount <= maxMintAmount,
                "max mint amount per session exceeded"
            );
            require(
                supply + _mintAmount <= maxSupply,
                "max NFT limit exceeded"
            );

            if (onlyWhitelisted == true) {
                require(isWhitelisted(msg.sender), "user is not whitelisted");
                uint256 ownerMintedCount = addressMintedBalance[msg.sender];
                require(
                    ownerMintedCount + _mintAmount <= nftPerAddressLimit,
                    "max NFT per address exceeded"
                );
                require(
                    msg.value >= costWL * _mintAmount,
                    "insufficient funds"
                );
            } else {
                require(msg.value >= cost * _mintAmount, "insufficient funds");
            }
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(msg.sender, supply + i);
            setRoyalties(supply + i, payable(address(this)), 1000);
            allTokens++;
        }
    }

    function totalSupply() public view returns (uint256) {
        return allTokens;
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return notRevealedUri;
        }

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

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

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

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    function withdrawToHolders(
        address[] memory holders,
        uint256[] memory shares
    ) public payable onlyOwner {
        uint256 allHolders = holders.length;
        for (uint256 i = 0; i < allHolders; i++) {
            (bool os, ) = payable(holders[i]).call{
                value: (address(this).balance / 10000) * shares[i]
            }("");
            require(os);
        }
    }

    function withdraw() public payable onlyOwner {
        // This will payout the owner the contract balance.
        // Do not remove this otherwise you will not be able to withdraw the funds.
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
        // =============================================================================
    }
}

File 1 of 12: Address.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

// File: @openzeppelin/contracts/utils/Address.sol

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 12: Context.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 4 of 12: ERC165.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 5 of 12: ERC721.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
import './Address.sol';
import './Strings.sol';
import './Context.sol';
import './ERC165.sol';
import './IERC721.sol';
import './IERC721Metadata.sol';
import './IERC721Receiver.sol';

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 6 of 12: IERC165.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

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

File 7 of 12: IERC721.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import './IERC165.sol';

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 12: IERC721Enumerable.sol
// SPDX-License-Identifier: GPL-3.0

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

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

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

File 9 of 12: IERC721Metadata.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 10 of 12: IERC721Receiver.sol
// SPDX-License-Identifier: GPL-3.0

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

File 11 of 12: Ownable.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

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

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

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

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

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

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

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

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

File 12 of 12: Strings.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"name":"withdrawToHolders","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600990805190602001906200005192919062000370565b5067016345785d8a0000600b5567011c37937e080000600c55612710600d55600f600e55600f805560006010556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506001601360006101000a81548160ff021916908315150217905550348015620000dc57600080fd5b506040518060400160405280601581526020017f4d7574616e74204167652043616d656c20436c756200000000000000000000008152506040518060400160405280600481526020017f4d4143430000000000000000000000000000000000000000000000000000000081525081600090805190602001906200016192919062000370565b5080600190805190602001906200017a92919062000370565b5050506200019d62000191620001cd60201b60201c565b620001d560201b60201c565b620001c760405180606001604052806023815260200162005aff602391396200029b60201b60201c565b620004fa565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ab620001cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d16200034660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200032a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003219062000462565b60405180910390fd5b80600890805190602001906200034292919062000370565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200037e9062000495565b90600052602060002090601f016020900481019282620003a25760008555620003ee565b82601f10620003bd57805160ff1916838001178555620003ee565b82800160010185558215620003ee579182015b82811115620003ed578251825591602001919060010190620003d0565b5b509050620003fd919062000401565b5090565b5b808211156200041c57600081600090555060010162000402565b5090565b60006200042f60208362000484565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200047d8162000420565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004ae57607f821691505b60208210811415620004c557620004c4620004cb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6155f5806200050a6000396000f3fe60806040526004361061027d5760003560e01c80636c0360eb1161014f578063ba4e5c49116100c1578063d5abeb011161007a578063d5abeb0114610972578063da3ef23f1461099d578063e985e9c5146109c6578063edec5f2714610a03578063f2c4ce1e14610a2c578063f2fde38b14610a555761027d565b8063ba4e5c491461083c578063ba7d2c7614610879578063c6682862146108a4578063c87b56dd146108cf578063cad96cca1461090c578063d0eb26b0146109495761027d565b806395d89b411161011357806395d89b41146107615780639c70b5121461078c578063a0712d68146107b7578063a22cb465146107d3578063a475b5dd146107fc578063b88d4fde146108135761027d565b80636c0360eb1461068e57806370a08231146106b9578063715018a6146106f65780637f00c7a61461070d5780638da5cb5b146107365761027d565b806323b872dd116101f357806344a0d68a116101ac57806344a0d68a1461058d57806351830227146105b657806352545d7a146105e157806355f804b3146105fd5780635c975abb146106265780636352211e146106515761027d565b806323b872dd1461048d5780632a55205a146104b65780633af32abf146104f45780633c952764146105315780633ccfd60b1461055a57806342842e0e146105645761027d565b8063081c8c4411610245578063081c8c441461037b578063095ea7b3146103a657806313faede6146103cf57806318160ddd146103fa57806318cae26914610425578063239c70ae146104625761027d565b806301ffc9a71461028257806302329a29146102bf57806306afd592146102e857806306fdde0314610313578063081812fc1461033e575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614099565b610a7e565b6040516102b69190614cbd565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190614070565b610b3d565b005b3480156102f457600080fd5b506102fd610bd6565b60405161030a919061503a565b60405180910390f35b34801561031f57600080fd5b50610328610bdc565b6040516103359190614cd8565b60405180910390f35b34801561034a57600080fd5b506103656004803603810190610360919061412c565b610c6e565b6040516103729190614c0b565b60405180910390f35b34801561038757600080fd5b50610390610cf3565b60405161039d9190614cd8565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190613f83565b610d81565b005b3480156103db57600080fd5b506103e4610e99565b6040516103f1919061503a565b60405180910390f35b34801561040657600080fd5b5061040f610e9f565b60405161041c919061503a565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613e18565b610ea9565b604051610459919061503a565b60405180910390f35b34801561046e57600080fd5b50610477610ec1565b604051610484919061503a565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190613e7d565b610ec7565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190614155565b610f27565b6040516104eb929190614c72565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613e18565b611145565b6040516105289190614cbd565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190614070565b61121a565b005b6105626112b3565b005b34801561057057600080fd5b5061058b60048036038101906105869190613e7d565b6113af565b005b34801561059957600080fd5b506105b460048036038101906105af919061412c565b6113cf565b005b3480156105c257600080fd5b506105cb611455565b6040516105d89190614cbd565b60405180910390f35b6105fb60048036038101906105f69190614004565b611468565b005b34801561060957600080fd5b50610624600480360381019061061f91906140eb565b61161d565b005b34801561063257600080fd5b5061063b6116b3565b6040516106489190614cbd565b60405180910390f35b34801561065d57600080fd5b506106786004803603810190610673919061412c565b6116c6565b6040516106859190614c0b565b60405180910390f35b34801561069a57600080fd5b506106a3611778565b6040516106b09190614cd8565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db9190613e18565b611806565b6040516106ed919061503a565b60405180910390f35b34801561070257600080fd5b5061070b6118be565b005b34801561071957600080fd5b50610734600480360381019061072f919061412c565b611946565b005b34801561074257600080fd5b5061074b6119cc565b6040516107589190614c0b565b60405180910390f35b34801561076d57600080fd5b506107766119f6565b6040516107839190614cd8565b60405180910390f35b34801561079857600080fd5b506107a1611a88565b6040516107ae9190614cbd565b60405180910390f35b6107d160048036038101906107cc919061412c565b611a9b565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613f47565b611e69565b005b34801561080857600080fd5b50610811611fea565b005b34801561081f57600080fd5b5061083a60048036038101906108359190613ecc565b612083565b005b34801561084857600080fd5b50610863600480360381019061085e919061412c565b6120e5565b6040516108709190614c0b565b60405180910390f35b34801561088557600080fd5b5061088e612124565b60405161089b919061503a565b60405180910390f35b3480156108b057600080fd5b506108b961212a565b6040516108c69190614cd8565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f1919061412c565b6121b8565b6040516109039190614cd8565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e919061412c565b61230e565b6040516109409190614c9b565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b919061412c565b612410565b005b34801561097e57600080fd5b50610987612496565b604051610994919061503a565b60405180910390f35b3480156109a957600080fd5b506109c460048036038101906109bf91906140eb565b61249c565b005b3480156109d257600080fd5b506109ed60048036038101906109e89190613e41565b612532565b6040516109fa9190614cbd565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613fbf565b6125c6565b005b348015610a3857600080fd5b50610a536004803603810190610a4e91906140eb565b612666565b005b348015610a6157600080fd5b50610a7c6004803603810190610a779190613e18565b6126fc565b005b600063cad96cca60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ad65760019050610b38565b632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610b2c5760019050610b38565b610b35826127f4565b90505b919050565b610b456128d6565b73ffffffffffffffffffffffffffffffffffffffff16610b636119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090614eda565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b600c5481565b606060008054610beb906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610c17906153ea565b8015610c645780601f10610c3957610100808354040283529160200191610c64565b820191906000526020600020905b815481529060010190602001808311610c4757829003601f168201915b5050505050905090565b6000610c79826128de565b610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90614eba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a8054610d00906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2c906153ea565b8015610d795780601f10610d4e57610100808354040283529160200191610d79565b820191906000526020600020905b815481529060010190602001808311610d5c57829003601f168201915b505050505081565b6000610d8c826116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490614f5a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e1c6128d6565b73ffffffffffffffffffffffffffffffffffffffff161480610e4b5750610e4a81610e456128d6565b612532565b5b610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190614dfa565b60405180910390fd5b610e94838361294a565b505050565b600b5481565b6000601054905090565b60126020528060005260406000206000915090505481565b600e5481565b610ed8610ed26128d6565b82612a03565b610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90614f9a565b60405180910390fd5b610f22838383612ae1565b505050565b600080600060076000868152602001908152602001600020805490501415610f5657600091506000905061113e565b600060076000868152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561104d578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190610f8b565b5050505090508060008151811061108d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001519250600080600090505b825181101561111f578281815181106110e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516bffffffffffffffffffffffff168261110a91906151f5565b915080806111179061541c565b9150506110a3565b50612710858261112f919061527c565b611139919061524b565b925050505b9250929050565b600080600090505b60148054905081101561120f578273ffffffffffffffffffffffffffffffffffffffff16601482815481106111ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111fc576001915050611215565b80806112079061541c565b91505061114d565b50600090505b919050565b6112226128d6565b73ffffffffffffffffffffffffffffffffffffffff166112406119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90614eda565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6112bb6128d6565b73ffffffffffffffffffffffffffffffffffffffff166112d96119cc565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690614eda565b60405180910390fd5b60006113396119cc565b73ffffffffffffffffffffffffffffffffffffffff164760405161135c90614bf6565b60006040518083038185875af1925050503d8060008114611399576040519150601f19603f3d011682016040523d82523d6000602084013e61139e565b606091505b50509050806113ac57600080fd5b50565b6113ca83838360405180602001604052806000815250612083565b505050565b6113d76128d6565b73ffffffffffffffffffffffffffffffffffffffff166113f56119cc565b73ffffffffffffffffffffffffffffffffffffffff161461144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290614eda565b60405180910390fd5b80600b8190555050565b601160019054906101000a900460ff1681565b6114706128d6565b73ffffffffffffffffffffffffffffffffffffffff1661148e6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90614eda565b60405180910390fd5b60008251905060005b81811015611617576000848281518110611530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16848381518110611587577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516127104761159d919061524b565b6115a7919061527c565b6040516115b390614bf6565b60006040518083038185875af1925050503d80600081146115f0576040519150601f19603f3d011682016040523d82523d6000602084013e6115f5565b606091505b505090508061160357600080fd5b50808061160f9061541c565b9150506114ed565b50505050565b6116256128d6565b73ffffffffffffffffffffffffffffffffffffffff166116436119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090614eda565b60405180910390fd5b80600890805190602001906116af9291906139c7565b5050565b601160009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614e3a565b60405180910390fd5b80915050919050565b60088054611785906153ea565b80601f01602080910402602001604051908101604052809291908181526020018280546117b1906153ea565b80156117fe5780601f106117d3576101008083540402835291602001916117fe565b820191906000526020600020905b8154815290600101906020018083116117e157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e90614e1a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118c66128d6565b73ffffffffffffffffffffffffffffffffffffffff166118e46119cc565b73ffffffffffffffffffffffffffffffffffffffff161461193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614eda565b60405180910390fd5b6119446000612d3d565b565b61194e6128d6565b73ffffffffffffffffffffffffffffffffffffffff1661196c6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990614eda565b60405180910390fd5b80600e8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a05906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611a31906153ea565b8015611a7e5780601f10611a5357610100808354040283529160200191611a7e565b820191906000526020600020905b815481529060010190602001808311611a6157829003601f168201915b5050505050905090565b601360009054906101000a900460ff1681565b601160009054906101000a900460ff1615611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae290614efa565b60405180910390fd5b6000611af5610e9f565b9050611aff6119cc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da95760008211611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b9061501a565b60405180910390fd5b600e54821115611bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb090614e7a565b60405180910390fd5b600d548282611bc891906151f5565b1115611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0090614e5a565b60405180910390fd5b60011515601360009054906101000a900460ff1615151415611d5757611c2e33611145565b611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490614fda565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548382611cc091906151f5565b1115611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf890614d5a565b60405180910390fd5b82600c54611d0f919061527c565b341015611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890614f7a565b60405180910390fd5b50611da8565b81600b54611d65919061527c565b341015611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90614f7a565b60405180910390fd5b5b5b6000600190505b828111611e6457601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e079061541c565b9190505550611e21338284611e1c91906151f5565b612e03565b611e398183611e3091906151f5565b306103e8612e21565b60106000815480929190611e4c9061541c565b91905055508080611e5c9061541c565b915050611db0565b505050565b611e716128d6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614d9a565b60405180910390fd5b8060056000611eec6128d6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f996128d6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fde9190614cbd565b60405180910390a35050565b611ff26128d6565b73ffffffffffffffffffffffffffffffffffffffff166120106119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614eda565b60405180910390fd5b6001601160016101000a81548160ff021916908315150217905550565b61209461208e6128d6565b83612a03565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614f9a565b60405180910390fd5b6120df84848484612f92565b50505050565b601481815481106120f557600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60098054612137906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054612163906153ea565b80156121b05780601f10612185576101008083540402835291602001916121b0565b820191906000526020600020905b81548152906001019060200180831161219357829003601f168201915b505050505081565b60606121c3826128de565b612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f990614f3a565b60405180910390fd5b60001515601160019054906101000a900460ff16151514156122b057600a805461222b906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054612257906153ea565b80156122a45780601f10612279576101008083540402835291602001916122a4565b820191906000526020600020905b81548152906001019060200180831161228757829003601f168201915b50505050509050612309565b60006122ba612fee565b905060008151116122da5760405180602001604052806000815250612305565b806122e484613080565b6040516020016122f5929190614bd2565b6040516020818303038152906040525b9150505b919050565b606060076000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015612405578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190612343565b505050509050919050565b6124186128d6565b73ffffffffffffffffffffffffffffffffffffffff166124366119cc565b73ffffffffffffffffffffffffffffffffffffffff161461248c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248390614eda565b60405180910390fd5b80600f8190555050565b600d5481565b6124a46128d6565b73ffffffffffffffffffffffffffffffffffffffff166124c26119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250f90614eda565b60405180910390fd5b806009908051906020019061252e9291906139c7565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125ce6128d6565b73ffffffffffffffffffffffffffffffffffffffff166125ec6119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263990614eda565b60405180910390fd5b601460006126509190613a4d565b818160149190612661929190613a6e565b505050565b61266e6128d6565b73ffffffffffffffffffffffffffffffffffffffff1661268c6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146126e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d990614eda565b60405180910390fd5b80600a90805190602001906126f89291906139c7565b5050565b6127046128d6565b73ffffffffffffffffffffffffffffffffffffffff166127226119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90614eda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614d1a565b60405180910390fd5b6127f181612d3d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128bf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128cf57506128ce8261322d565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129bd836116c6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a0e826128de565b612a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4490614dba565b60405180910390fd5b6000612a58836116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ac757508373ffffffffffffffffffffffffffffffffffffffff16612aaf84610c6e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ad85750612ad78185612532565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b01826116c6565b73ffffffffffffffffffffffffffffffffffffffff1614612b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4e90614f1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbe90614d7a565b60405180910390fd5b612bd2838383613297565b612bdd60008261294a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c2d91906152d6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8491906151f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e1d82826040518060200160405280600081525061329c565b5050565b6000600167ffffffffffffffff811115612e64577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e9d57816020015b612e8a613b0e565b815260200190600190039081612e825790505b5090508281600081518110612edb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508181600081518110612f54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050612f8c84826132f7565b50505050565b612f9d848484612ae1565b612fa984848484613612565b612fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdf90614cfa565b60405180910390fd5b50505050565b606060088054612ffd906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054613029906153ea565b80156130765780601f1061304b57610100808354040283529160200191613076565b820191906000526020600020905b81548152906001019060200180831161305957829003601f168201915b5050505050905090565b606060008214156130c8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613228565b600082905060005b600082146130fa5780806130e39061541c565b915050600a826130f3919061524b565b91506130d0565b60008167ffffffffffffffff81111561313c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561316e5781602001600182028036833780820191505090505b5090505b600085146132215760018261318791906152d6565b9150600a856131969190615465565b60306131a291906151f5565b60f81b8183815181106131de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561321a919061524b565b9450613172565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6132a683836137a9565b6132b36000848484613612565b6132f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e990614cfa565b60405180910390fd5b505050565b600080600090505b82518110156135be57600073ffffffffffffffffffffffffffffffffffffffff16838281518110613359577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b390614ffa565b60405180910390fd5b60008382815181106133f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516bffffffffffffffffffffffff161415613452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344990614dda565b60405180910390fd5b82818151811061348b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516bffffffffffffffffffffffff16826134b091906151f5565b9150600760008581526020019081526020016000208382815181106134fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505080806135b69061541c565b9150506132ff565b506127108110613603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fa90614fba565b60405180910390fd5b61360d8383613977565b505050565b60006136338473ffffffffffffffffffffffffffffffffffffffff166139b4565b1561379c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261365c6128d6565b8786866040518563ffffffff1660e01b815260040161367e9493929190614c26565b602060405180830381600087803b15801561369857600080fd5b505af19250505080156136c957506040513d601f19601f820116820180604052508101906136c691906140c2565b60015b61374c573d80600081146136f9576040519150601f19603f3d011682016040523d82523d6000602084013e6136fe565b606091505b50600081511415613744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373b90614cfa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137a1565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381090614e9a565b60405180910390fd5b613822816128de565b15613862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385990614d3a565b60405180910390fd5b61386e60008383613297565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138be91906151f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df82826040516139a8929190615055565b60405180910390a15050565b600080823b905060008111915050919050565b8280546139d3906153ea565b90600052602060002090601f0160209004810192826139f55760008555613a3c565b82601f10613a0e57805160ff1916838001178555613a3c565b82800160010185558215613a3c579182015b82811115613a3b578251825591602001919060010190613a20565b5b509050613a499190613b4c565b5090565b5080546000825590600052602060002090810190613a6b9190613b4c565b50565b828054828255906000526020600020908101928215613afd579160200282015b82811115613afc57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613a8e565b5b509050613b0a9190613b4c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff1681525090565b5b80821115613b65576000816000905550600101613b4d565b5090565b6000613b7c613b77846150b6565b615085565b90508083825260208201905082856020860282011115613b9b57600080fd5b60005b85811015613bcb5781613bb18882613cbd565b845260208401935060208301925050600181019050613b9e565b5050509392505050565b6000613be8613be3846150e2565b615085565b90508083825260208201905082856020860282011115613c0757600080fd5b60005b85811015613c375781613c1d8882613e03565b845260208401935060208301925050600181019050613c0a565b5050509392505050565b6000613c54613c4f8461510e565b615085565b905082815260208101848484011115613c6c57600080fd5b613c778482856153a8565b509392505050565b6000613c92613c8d8461513e565b615085565b905082815260208101848484011115613caa57600080fd5b613cb58482856153a8565b509392505050565b600081359050613ccc81615563565b92915050565b60008083601f840112613ce457600080fd5b8235905067ffffffffffffffff811115613cfd57600080fd5b602083019150836020820283011115613d1557600080fd5b9250929050565b600082601f830112613d2d57600080fd5b8135613d3d848260208601613b69565b91505092915050565b600082601f830112613d5757600080fd5b8135613d67848260208601613bd5565b91505092915050565b600081359050613d7f8161557a565b92915050565b600081359050613d9481615591565b92915050565b600081519050613da981615591565b92915050565b600082601f830112613dc057600080fd5b8135613dd0848260208601613c41565b91505092915050565b600082601f830112613dea57600080fd5b8135613dfa848260208601613c7f565b91505092915050565b600081359050613e12816155a8565b92915050565b600060208284031215613e2a57600080fd5b6000613e3884828501613cbd565b91505092915050565b60008060408385031215613e5457600080fd5b6000613e6285828601613cbd565b9250506020613e7385828601613cbd565b9150509250929050565b600080600060608486031215613e9257600080fd5b6000613ea086828701613cbd565b9350506020613eb186828701613cbd565b9250506040613ec286828701613e03565b9150509250925092565b60008060008060808587031215613ee257600080fd5b6000613ef087828801613cbd565b9450506020613f0187828801613cbd565b9350506040613f1287828801613e03565b925050606085013567ffffffffffffffff811115613f2f57600080fd5b613f3b87828801613daf565b91505092959194509250565b60008060408385031215613f5a57600080fd5b6000613f6885828601613cbd565b9250506020613f7985828601613d70565b9150509250929050565b60008060408385031215613f9657600080fd5b6000613fa485828601613cbd565b9250506020613fb585828601613e03565b9150509250929050565b60008060208385031215613fd257600080fd5b600083013567ffffffffffffffff811115613fec57600080fd5b613ff885828601613cd2565b92509250509250929050565b6000806040838503121561401757600080fd5b600083013567ffffffffffffffff81111561403157600080fd5b61403d85828601613d1c565b925050602083013567ffffffffffffffff81111561405a57600080fd5b61406685828601613d46565b9150509250929050565b60006020828403121561408257600080fd5b600061409084828501613d70565b91505092915050565b6000602082840312156140ab57600080fd5b60006140b984828501613d85565b91505092915050565b6000602082840312156140d457600080fd5b60006140e284828501613d9a565b91505092915050565b6000602082840312156140fd57600080fd5b600082013567ffffffffffffffff81111561411757600080fd5b61412384828501613dd9565b91505092915050565b60006020828403121561413e57600080fd5b600061414c84828501613e03565b91505092915050565b6000806040838503121561416857600080fd5b600061417685828601613e03565b925050602061418785828601613e03565b9150509250929050565b600061419d8383614b85565b60408301905092915050565b6141b28161531c565b82525050565b6141c18161530a565b82525050565b60006141d28261517e565b6141dc81856151ac565b93506141e78361516e565b8060005b838110156142185781516141ff8882614191565b975061420a8361519f565b9250506001810190506141eb565b5085935050505092915050565b61422e8161532e565b82525050565b600061423f82615189565b61424981856151bd565b93506142598185602086016153b7565b61426281615552565b840191505092915050565b600061427882615194565b61428281856151d9565b93506142928185602086016153b7565b61429b81615552565b840191505092915050565b60006142b182615194565b6142bb81856151ea565b93506142cb8185602086016153b7565b80840191505092915050565b60006142e46032836151d9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061434a6026836151d9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143b0601c836151d9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143f0601c836151d9565b91507f6d6178204e4654207065722061646472657373206578636565646564000000006000830152602082019050919050565b60006144306024836151d9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144966019836151d9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144d6602c836151d9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061453c6020836151d9565b91507f526f79616c74792076616c75652073686f756c6420626520706f7369746976656000830152602082019050919050565b600061457c6038836151d9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006145e2602a836151d9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006146486029836151d9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ae6016836151d9565b91507f6d6178204e4654206c696d6974206578636565646564000000000000000000006000830152602082019050919050565b60006146ee6024836151d9565b91507f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008301527f65646564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147546020836151d9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614794602c836151d9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147fa6020836151d9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061483a6016836151d9565b91507f74686520636f6e747261637420697320706175736564000000000000000000006000830152602082019050919050565b600061487a6029836151d9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148e0602f836151d9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006149466021836151d9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149ac6000836151ce565b9150600082019050919050565b60006149c66012836151d9565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000614a066031836151d9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a6c6025836151d9565b91507f526f79616c747920746f74616c2076616c75652073686f756c64206265203c2060008301527f31303030300000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ad26017836151d9565b91507f75736572206973206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000614b12601b836151d9565b91507f526563697069656e742073686f756c642062652070726573656e7400000000006000830152602082019050919050565b6000614b52601b836151d9565b91507f6e65656420746f206d696e74206174206c656173742031204e465400000000006000830152602082019050919050565b604082016000820151614b9b60008501826141a9565b506020820151614bae6020850182614bc3565b50505050565b614bbd81615386565b82525050565b614bcc81615390565b82525050565b6000614bde82856142a6565b9150614bea82846142a6565b91508190509392505050565b6000614c018261499f565b9150819050919050565b6000602082019050614c2060008301846141b8565b92915050565b6000608082019050614c3b60008301876141b8565b614c4860208301866141b8565b614c556040830185614bb4565b8181036060830152614c678184614234565b905095945050505050565b6000604082019050614c8760008301856141b8565b614c946020830184614bb4565b9392505050565b60006020820190508181036000830152614cb581846141c7565b905092915050565b6000602082019050614cd26000830184614225565b92915050565b60006020820190508181036000830152614cf2818461426d565b905092915050565b60006020820190508181036000830152614d13816142d7565b9050919050565b60006020820190508181036000830152614d338161433d565b9050919050565b60006020820190508181036000830152614d53816143a3565b9050919050565b60006020820190508181036000830152614d73816143e3565b9050919050565b60006020820190508181036000830152614d9381614423565b9050919050565b60006020820190508181036000830152614db381614489565b9050919050565b60006020820190508181036000830152614dd3816144c9565b9050919050565b60006020820190508181036000830152614df38161452f565b9050919050565b60006020820190508181036000830152614e138161456f565b9050919050565b60006020820190508181036000830152614e33816145d5565b9050919050565b60006020820190508181036000830152614e538161463b565b9050919050565b60006020820190508181036000830152614e73816146a1565b9050919050565b60006020820190508181036000830152614e93816146e1565b9050919050565b60006020820190508181036000830152614eb381614747565b9050919050565b60006020820190508181036000830152614ed381614787565b9050919050565b60006020820190508181036000830152614ef3816147ed565b9050919050565b60006020820190508181036000830152614f138161482d565b9050919050565b60006020820190508181036000830152614f338161486d565b9050919050565b60006020820190508181036000830152614f53816148d3565b9050919050565b60006020820190508181036000830152614f7381614939565b9050919050565b60006020820190508181036000830152614f93816149b9565b9050919050565b60006020820190508181036000830152614fb3816149f9565b9050919050565b60006020820190508181036000830152614fd381614a5f565b9050919050565b60006020820190508181036000830152614ff381614ac5565b9050919050565b6000602082019050818103600083015261501381614b05565b9050919050565b6000602082019050818103600083015261503381614b45565b9050919050565b600060208201905061504f6000830184614bb4565b92915050565b600060408201905061506a6000830185614bb4565b818103602083015261507c81846141c7565b90509392505050565b6000604051905081810181811067ffffffffffffffff821117156150ac576150ab615523565b5b8060405250919050565b600067ffffffffffffffff8211156150d1576150d0615523565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150fd576150fc615523565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561512957615128615523565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561515957615158615523565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061520082615386565b915061520b83615386565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152405761523f615496565b5b828201905092915050565b600061525682615386565b915061526183615386565b925082615271576152706154c5565b5b828204905092915050565b600061528782615386565b915061529283615386565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152cb576152ca615496565b5b828202905092915050565b60006152e182615386565b91506152ec83615386565b9250828210156152ff576152fe615496565b5b828203905092915050565b600061531582615366565b9050919050565b600061532782615366565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156153d55780820151818401526020810190506153ba565b838111156153e4576000848401525b50505050565b6000600282049050600182168061540257607f821691505b60208210811415615416576154156154f4565b5b50919050565b600061542782615386565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545a57615459615496565b5b600182019050919050565b600061547082615386565b915061547b83615386565b92508261548b5761548a6154c5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61556c8161530a565b811461557757600080fd5b50565b6155838161532e565b811461558e57600080fd5b50565b61559a8161533a565b81146155a557600080fd5b50565b6155b181615386565b81146155bc57600080fd5b5056fea26469706673582212202b89f27a29452fe02837bc46a4f1086431fc89795bc1756098651eb6e54bd7d364736f6c6343000800003368747470733a2f2f6d6574612e6d7574616e7461676563616d656c636c75622e696f2f

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80636c0360eb1161014f578063ba4e5c49116100c1578063d5abeb011161007a578063d5abeb0114610972578063da3ef23f1461099d578063e985e9c5146109c6578063edec5f2714610a03578063f2c4ce1e14610a2c578063f2fde38b14610a555761027d565b8063ba4e5c491461083c578063ba7d2c7614610879578063c6682862146108a4578063c87b56dd146108cf578063cad96cca1461090c578063d0eb26b0146109495761027d565b806395d89b411161011357806395d89b41146107615780639c70b5121461078c578063a0712d68146107b7578063a22cb465146107d3578063a475b5dd146107fc578063b88d4fde146108135761027d565b80636c0360eb1461068e57806370a08231146106b9578063715018a6146106f65780637f00c7a61461070d5780638da5cb5b146107365761027d565b806323b872dd116101f357806344a0d68a116101ac57806344a0d68a1461058d57806351830227146105b657806352545d7a146105e157806355f804b3146105fd5780635c975abb146106265780636352211e146106515761027d565b806323b872dd1461048d5780632a55205a146104b65780633af32abf146104f45780633c952764146105315780633ccfd60b1461055a57806342842e0e146105645761027d565b8063081c8c4411610245578063081c8c441461037b578063095ea7b3146103a657806313faede6146103cf57806318160ddd146103fa57806318cae26914610425578063239c70ae146104625761027d565b806301ffc9a71461028257806302329a29146102bf57806306afd592146102e857806306fdde0314610313578063081812fc1461033e575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190614099565b610a7e565b6040516102b69190614cbd565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190614070565b610b3d565b005b3480156102f457600080fd5b506102fd610bd6565b60405161030a919061503a565b60405180910390f35b34801561031f57600080fd5b50610328610bdc565b6040516103359190614cd8565b60405180910390f35b34801561034a57600080fd5b506103656004803603810190610360919061412c565b610c6e565b6040516103729190614c0b565b60405180910390f35b34801561038757600080fd5b50610390610cf3565b60405161039d9190614cd8565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190613f83565b610d81565b005b3480156103db57600080fd5b506103e4610e99565b6040516103f1919061503a565b60405180910390f35b34801561040657600080fd5b5061040f610e9f565b60405161041c919061503a565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613e18565b610ea9565b604051610459919061503a565b60405180910390f35b34801561046e57600080fd5b50610477610ec1565b604051610484919061503a565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190613e7d565b610ec7565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190614155565b610f27565b6040516104eb929190614c72565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613e18565b611145565b6040516105289190614cbd565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190614070565b61121a565b005b6105626112b3565b005b34801561057057600080fd5b5061058b60048036038101906105869190613e7d565b6113af565b005b34801561059957600080fd5b506105b460048036038101906105af919061412c565b6113cf565b005b3480156105c257600080fd5b506105cb611455565b6040516105d89190614cbd565b60405180910390f35b6105fb60048036038101906105f69190614004565b611468565b005b34801561060957600080fd5b50610624600480360381019061061f91906140eb565b61161d565b005b34801561063257600080fd5b5061063b6116b3565b6040516106489190614cbd565b60405180910390f35b34801561065d57600080fd5b506106786004803603810190610673919061412c565b6116c6565b6040516106859190614c0b565b60405180910390f35b34801561069a57600080fd5b506106a3611778565b6040516106b09190614cd8565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db9190613e18565b611806565b6040516106ed919061503a565b60405180910390f35b34801561070257600080fd5b5061070b6118be565b005b34801561071957600080fd5b50610734600480360381019061072f919061412c565b611946565b005b34801561074257600080fd5b5061074b6119cc565b6040516107589190614c0b565b60405180910390f35b34801561076d57600080fd5b506107766119f6565b6040516107839190614cd8565b60405180910390f35b34801561079857600080fd5b506107a1611a88565b6040516107ae9190614cbd565b60405180910390f35b6107d160048036038101906107cc919061412c565b611a9b565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613f47565b611e69565b005b34801561080857600080fd5b50610811611fea565b005b34801561081f57600080fd5b5061083a60048036038101906108359190613ecc565b612083565b005b34801561084857600080fd5b50610863600480360381019061085e919061412c565b6120e5565b6040516108709190614c0b565b60405180910390f35b34801561088557600080fd5b5061088e612124565b60405161089b919061503a565b60405180910390f35b3480156108b057600080fd5b506108b961212a565b6040516108c69190614cd8565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f1919061412c565b6121b8565b6040516109039190614cd8565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e919061412c565b61230e565b6040516109409190614c9b565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b919061412c565b612410565b005b34801561097e57600080fd5b50610987612496565b604051610994919061503a565b60405180910390f35b3480156109a957600080fd5b506109c460048036038101906109bf91906140eb565b61249c565b005b3480156109d257600080fd5b506109ed60048036038101906109e89190613e41565b612532565b6040516109fa9190614cbd565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613fbf565b6125c6565b005b348015610a3857600080fd5b50610a536004803603810190610a4e91906140eb565b612666565b005b348015610a6157600080fd5b50610a7c6004803603810190610a779190613e18565b6126fc565b005b600063cad96cca60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ad65760019050610b38565b632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610b2c5760019050610b38565b610b35826127f4565b90505b919050565b610b456128d6565b73ffffffffffffffffffffffffffffffffffffffff16610b636119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090614eda565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b600c5481565b606060008054610beb906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610c17906153ea565b8015610c645780601f10610c3957610100808354040283529160200191610c64565b820191906000526020600020905b815481529060010190602001808311610c4757829003601f168201915b5050505050905090565b6000610c79826128de565b610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90614eba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a8054610d00906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2c906153ea565b8015610d795780601f10610d4e57610100808354040283529160200191610d79565b820191906000526020600020905b815481529060010190602001808311610d5c57829003601f168201915b505050505081565b6000610d8c826116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490614f5a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e1c6128d6565b73ffffffffffffffffffffffffffffffffffffffff161480610e4b5750610e4a81610e456128d6565b612532565b5b610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190614dfa565b60405180910390fd5b610e94838361294a565b505050565b600b5481565b6000601054905090565b60126020528060005260406000206000915090505481565b600e5481565b610ed8610ed26128d6565b82612a03565b610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90614f9a565b60405180910390fd5b610f22838383612ae1565b505050565b600080600060076000868152602001908152602001600020805490501415610f5657600091506000905061113e565b600060076000868152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561104d578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190610f8b565b5050505090508060008151811061108d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001519250600080600090505b825181101561111f578281815181106110e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516bffffffffffffffffffffffff168261110a91906151f5565b915080806111179061541c565b9150506110a3565b50612710858261112f919061527c565b611139919061524b565b925050505b9250929050565b600080600090505b60148054905081101561120f578273ffffffffffffffffffffffffffffffffffffffff16601482815481106111ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111fc576001915050611215565b80806112079061541c565b91505061114d565b50600090505b919050565b6112226128d6565b73ffffffffffffffffffffffffffffffffffffffff166112406119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90614eda565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6112bb6128d6565b73ffffffffffffffffffffffffffffffffffffffff166112d96119cc565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690614eda565b60405180910390fd5b60006113396119cc565b73ffffffffffffffffffffffffffffffffffffffff164760405161135c90614bf6565b60006040518083038185875af1925050503d8060008114611399576040519150601f19603f3d011682016040523d82523d6000602084013e61139e565b606091505b50509050806113ac57600080fd5b50565b6113ca83838360405180602001604052806000815250612083565b505050565b6113d76128d6565b73ffffffffffffffffffffffffffffffffffffffff166113f56119cc565b73ffffffffffffffffffffffffffffffffffffffff161461144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290614eda565b60405180910390fd5b80600b8190555050565b601160019054906101000a900460ff1681565b6114706128d6565b73ffffffffffffffffffffffffffffffffffffffff1661148e6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90614eda565b60405180910390fd5b60008251905060005b81811015611617576000848281518110611530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16848381518110611587577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516127104761159d919061524b565b6115a7919061527c565b6040516115b390614bf6565b60006040518083038185875af1925050503d80600081146115f0576040519150601f19603f3d011682016040523d82523d6000602084013e6115f5565b606091505b505090508061160357600080fd5b50808061160f9061541c565b9150506114ed565b50505050565b6116256128d6565b73ffffffffffffffffffffffffffffffffffffffff166116436119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090614eda565b60405180910390fd5b80600890805190602001906116af9291906139c7565b5050565b601160009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614e3a565b60405180910390fd5b80915050919050565b60088054611785906153ea565b80601f01602080910402602001604051908101604052809291908181526020018280546117b1906153ea565b80156117fe5780601f106117d3576101008083540402835291602001916117fe565b820191906000526020600020905b8154815290600101906020018083116117e157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e90614e1a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118c66128d6565b73ffffffffffffffffffffffffffffffffffffffff166118e46119cc565b73ffffffffffffffffffffffffffffffffffffffff161461193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614eda565b60405180910390fd5b6119446000612d3d565b565b61194e6128d6565b73ffffffffffffffffffffffffffffffffffffffff1661196c6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990614eda565b60405180910390fd5b80600e8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a05906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611a31906153ea565b8015611a7e5780601f10611a5357610100808354040283529160200191611a7e565b820191906000526020600020905b815481529060010190602001808311611a6157829003601f168201915b5050505050905090565b601360009054906101000a900460ff1681565b601160009054906101000a900460ff1615611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae290614efa565b60405180910390fd5b6000611af5610e9f565b9050611aff6119cc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da95760008211611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b9061501a565b60405180910390fd5b600e54821115611bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb090614e7a565b60405180910390fd5b600d548282611bc891906151f5565b1115611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0090614e5a565b60405180910390fd5b60011515601360009054906101000a900460ff1615151415611d5757611c2e33611145565b611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6490614fda565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548382611cc091906151f5565b1115611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf890614d5a565b60405180910390fd5b82600c54611d0f919061527c565b341015611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890614f7a565b60405180910390fd5b50611da8565b81600b54611d65919061527c565b341015611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90614f7a565b60405180910390fd5b5b5b6000600190505b828111611e6457601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e079061541c565b9190505550611e21338284611e1c91906151f5565b612e03565b611e398183611e3091906151f5565b306103e8612e21565b60106000815480929190611e4c9061541c565b91905055508080611e5c9061541c565b915050611db0565b505050565b611e716128d6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614d9a565b60405180910390fd5b8060056000611eec6128d6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f996128d6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fde9190614cbd565b60405180910390a35050565b611ff26128d6565b73ffffffffffffffffffffffffffffffffffffffff166120106119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205d90614eda565b60405180910390fd5b6001601160016101000a81548160ff021916908315150217905550565b61209461208e6128d6565b83612a03565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614f9a565b60405180910390fd5b6120df84848484612f92565b50505050565b601481815481106120f557600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60098054612137906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054612163906153ea565b80156121b05780601f10612185576101008083540402835291602001916121b0565b820191906000526020600020905b81548152906001019060200180831161219357829003601f168201915b505050505081565b60606121c3826128de565b612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f990614f3a565b60405180910390fd5b60001515601160019054906101000a900460ff16151514156122b057600a805461222b906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054612257906153ea565b80156122a45780601f10612279576101008083540402835291602001916122a4565b820191906000526020600020905b81548152906001019060200180831161228757829003601f168201915b50505050509050612309565b60006122ba612fee565b905060008151116122da5760405180602001604052806000815250612305565b806122e484613080565b6040516020016122f5929190614bd2565b6040516020818303038152906040525b9150505b919050565b606060076000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015612405578382906000526020600020016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505081526020019060010190612343565b505050509050919050565b6124186128d6565b73ffffffffffffffffffffffffffffffffffffffff166124366119cc565b73ffffffffffffffffffffffffffffffffffffffff161461248c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248390614eda565b60405180910390fd5b80600f8190555050565b600d5481565b6124a46128d6565b73ffffffffffffffffffffffffffffffffffffffff166124c26119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250f90614eda565b60405180910390fd5b806009908051906020019061252e9291906139c7565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125ce6128d6565b73ffffffffffffffffffffffffffffffffffffffff166125ec6119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263990614eda565b60405180910390fd5b601460006126509190613a4d565b818160149190612661929190613a6e565b505050565b61266e6128d6565b73ffffffffffffffffffffffffffffffffffffffff1661268c6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146126e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d990614eda565b60405180910390fd5b80600a90805190602001906126f89291906139c7565b5050565b6127046128d6565b73ffffffffffffffffffffffffffffffffffffffff166127226119cc565b73ffffffffffffffffffffffffffffffffffffffff1614612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f90614eda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614d1a565b60405180910390fd5b6127f181612d3d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128bf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128cf57506128ce8261322d565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129bd836116c6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a0e826128de565b612a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4490614dba565b60405180910390fd5b6000612a58836116c6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ac757508373ffffffffffffffffffffffffffffffffffffffff16612aaf84610c6e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ad85750612ad78185612532565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b01826116c6565b73ffffffffffffffffffffffffffffffffffffffff1614612b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4e90614f1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbe90614d7a565b60405180910390fd5b612bd2838383613297565b612bdd60008261294a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c2d91906152d6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8491906151f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e1d82826040518060200160405280600081525061329c565b5050565b6000600167ffffffffffffffff811115612e64577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e9d57816020015b612e8a613b0e565b815260200190600190039081612e825790505b5090508281600081518110612edb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508181600081518110612f54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050612f8c84826132f7565b50505050565b612f9d848484612ae1565b612fa984848484613612565b612fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdf90614cfa565b60405180910390fd5b50505050565b606060088054612ffd906153ea565b80601f0160208091040260200160405190810160405280929190818152602001828054613029906153ea565b80156130765780601f1061304b57610100808354040283529160200191613076565b820191906000526020600020905b81548152906001019060200180831161305957829003601f168201915b5050505050905090565b606060008214156130c8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613228565b600082905060005b600082146130fa5780806130e39061541c565b915050600a826130f3919061524b565b91506130d0565b60008167ffffffffffffffff81111561313c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561316e5781602001600182028036833780820191505090505b5090505b600085146132215760018261318791906152d6565b9150600a856131969190615465565b60306131a291906151f5565b60f81b8183815181106131de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561321a919061524b565b9450613172565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6132a683836137a9565b6132b36000848484613612565b6132f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e990614cfa565b60405180910390fd5b505050565b600080600090505b82518110156135be57600073ffffffffffffffffffffffffffffffffffffffff16838281518110613359577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b390614ffa565b60405180910390fd5b60008382815181106133f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516bffffffffffffffffffffffff161415613452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344990614dda565b60405180910390fd5b82818151811061348b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001516bffffffffffffffffffffffff16826134b091906151f5565b9150600760008581526020019081526020016000208382815181106134fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505080806135b69061541c565b9150506132ff565b506127108110613603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fa90614fba565b60405180910390fd5b61360d8383613977565b505050565b60006136338473ffffffffffffffffffffffffffffffffffffffff166139b4565b1561379c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261365c6128d6565b8786866040518563ffffffff1660e01b815260040161367e9493929190614c26565b602060405180830381600087803b15801561369857600080fd5b505af19250505080156136c957506040513d601f19601f820116820180604052508101906136c691906140c2565b60015b61374c573d80600081146136f9576040519150601f19603f3d011682016040523d82523d6000602084013e6136fe565b606091505b50600081511415613744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373b90614cfa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137a1565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381090614e9a565b60405180910390fd5b613822816128de565b15613862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385990614d3a565b60405180910390fd5b61386e60008383613297565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138be91906151f5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df82826040516139a8929190615055565b60405180910390a15050565b600080823b905060008111915050919050565b8280546139d3906153ea565b90600052602060002090601f0160209004810192826139f55760008555613a3c565b82601f10613a0e57805160ff1916838001178555613a3c565b82800160010185558215613a3c579182015b82811115613a3b578251825591602001919060010190613a20565b5b509050613a499190613b4c565b5090565b5080546000825590600052602060002090810190613a6b9190613b4c565b50565b828054828255906000526020600020908101928215613afd579160200282015b82811115613afc57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613a8e565b5b509050613b0a9190613b4c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff1681525090565b5b80821115613b65576000816000905550600101613b4d565b5090565b6000613b7c613b77846150b6565b615085565b90508083825260208201905082856020860282011115613b9b57600080fd5b60005b85811015613bcb5781613bb18882613cbd565b845260208401935060208301925050600181019050613b9e565b5050509392505050565b6000613be8613be3846150e2565b615085565b90508083825260208201905082856020860282011115613c0757600080fd5b60005b85811015613c375781613c1d8882613e03565b845260208401935060208301925050600181019050613c0a565b5050509392505050565b6000613c54613c4f8461510e565b615085565b905082815260208101848484011115613c6c57600080fd5b613c778482856153a8565b509392505050565b6000613c92613c8d8461513e565b615085565b905082815260208101848484011115613caa57600080fd5b613cb58482856153a8565b509392505050565b600081359050613ccc81615563565b92915050565b60008083601f840112613ce457600080fd5b8235905067ffffffffffffffff811115613cfd57600080fd5b602083019150836020820283011115613d1557600080fd5b9250929050565b600082601f830112613d2d57600080fd5b8135613d3d848260208601613b69565b91505092915050565b600082601f830112613d5757600080fd5b8135613d67848260208601613bd5565b91505092915050565b600081359050613d7f8161557a565b92915050565b600081359050613d9481615591565b92915050565b600081519050613da981615591565b92915050565b600082601f830112613dc057600080fd5b8135613dd0848260208601613c41565b91505092915050565b600082601f830112613dea57600080fd5b8135613dfa848260208601613c7f565b91505092915050565b600081359050613e12816155a8565b92915050565b600060208284031215613e2a57600080fd5b6000613e3884828501613cbd565b91505092915050565b60008060408385031215613e5457600080fd5b6000613e6285828601613cbd565b9250506020613e7385828601613cbd565b9150509250929050565b600080600060608486031215613e9257600080fd5b6000613ea086828701613cbd565b9350506020613eb186828701613cbd565b9250506040613ec286828701613e03565b9150509250925092565b60008060008060808587031215613ee257600080fd5b6000613ef087828801613cbd565b9450506020613f0187828801613cbd565b9350506040613f1287828801613e03565b925050606085013567ffffffffffffffff811115613f2f57600080fd5b613f3b87828801613daf565b91505092959194509250565b60008060408385031215613f5a57600080fd5b6000613f6885828601613cbd565b9250506020613f7985828601613d70565b9150509250929050565b60008060408385031215613f9657600080fd5b6000613fa485828601613cbd565b9250506020613fb585828601613e03565b9150509250929050565b60008060208385031215613fd257600080fd5b600083013567ffffffffffffffff811115613fec57600080fd5b613ff885828601613cd2565b92509250509250929050565b6000806040838503121561401757600080fd5b600083013567ffffffffffffffff81111561403157600080fd5b61403d85828601613d1c565b925050602083013567ffffffffffffffff81111561405a57600080fd5b61406685828601613d46565b9150509250929050565b60006020828403121561408257600080fd5b600061409084828501613d70565b91505092915050565b6000602082840312156140ab57600080fd5b60006140b984828501613d85565b91505092915050565b6000602082840312156140d457600080fd5b60006140e284828501613d9a565b91505092915050565b6000602082840312156140fd57600080fd5b600082013567ffffffffffffffff81111561411757600080fd5b61412384828501613dd9565b91505092915050565b60006020828403121561413e57600080fd5b600061414c84828501613e03565b91505092915050565b6000806040838503121561416857600080fd5b600061417685828601613e03565b925050602061418785828601613e03565b9150509250929050565b600061419d8383614b85565b60408301905092915050565b6141b28161531c565b82525050565b6141c18161530a565b82525050565b60006141d28261517e565b6141dc81856151ac565b93506141e78361516e565b8060005b838110156142185781516141ff8882614191565b975061420a8361519f565b9250506001810190506141eb565b5085935050505092915050565b61422e8161532e565b82525050565b600061423f82615189565b61424981856151bd565b93506142598185602086016153b7565b61426281615552565b840191505092915050565b600061427882615194565b61428281856151d9565b93506142928185602086016153b7565b61429b81615552565b840191505092915050565b60006142b182615194565b6142bb81856151ea565b93506142cb8185602086016153b7565b80840191505092915050565b60006142e46032836151d9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061434a6026836151d9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143b0601c836151d9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143f0601c836151d9565b91507f6d6178204e4654207065722061646472657373206578636565646564000000006000830152602082019050919050565b60006144306024836151d9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144966019836151d9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144d6602c836151d9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061453c6020836151d9565b91507f526f79616c74792076616c75652073686f756c6420626520706f7369746976656000830152602082019050919050565b600061457c6038836151d9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006145e2602a836151d9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006146486029836151d9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ae6016836151d9565b91507f6d6178204e4654206c696d6974206578636565646564000000000000000000006000830152602082019050919050565b60006146ee6024836151d9565b91507f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008301527f65646564000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147546020836151d9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614794602c836151d9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147fa6020836151d9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061483a6016836151d9565b91507f74686520636f6e747261637420697320706175736564000000000000000000006000830152602082019050919050565b600061487a6029836151d9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148e0602f836151d9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006149466021836151d9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149ac6000836151ce565b9150600082019050919050565b60006149c66012836151d9565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b6000614a066031836151d9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a6c6025836151d9565b91507f526f79616c747920746f74616c2076616c75652073686f756c64206265203c2060008301527f31303030300000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ad26017836151d9565b91507f75736572206973206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000614b12601b836151d9565b91507f526563697069656e742073686f756c642062652070726573656e7400000000006000830152602082019050919050565b6000614b52601b836151d9565b91507f6e65656420746f206d696e74206174206c656173742031204e465400000000006000830152602082019050919050565b604082016000820151614b9b60008501826141a9565b506020820151614bae6020850182614bc3565b50505050565b614bbd81615386565b82525050565b614bcc81615390565b82525050565b6000614bde82856142a6565b9150614bea82846142a6565b91508190509392505050565b6000614c018261499f565b9150819050919050565b6000602082019050614c2060008301846141b8565b92915050565b6000608082019050614c3b60008301876141b8565b614c4860208301866141b8565b614c556040830185614bb4565b8181036060830152614c678184614234565b905095945050505050565b6000604082019050614c8760008301856141b8565b614c946020830184614bb4565b9392505050565b60006020820190508181036000830152614cb581846141c7565b905092915050565b6000602082019050614cd26000830184614225565b92915050565b60006020820190508181036000830152614cf2818461426d565b905092915050565b60006020820190508181036000830152614d13816142d7565b9050919050565b60006020820190508181036000830152614d338161433d565b9050919050565b60006020820190508181036000830152614d53816143a3565b9050919050565b60006020820190508181036000830152614d73816143e3565b9050919050565b60006020820190508181036000830152614d9381614423565b9050919050565b60006020820190508181036000830152614db381614489565b9050919050565b60006020820190508181036000830152614dd3816144c9565b9050919050565b60006020820190508181036000830152614df38161452f565b9050919050565b60006020820190508181036000830152614e138161456f565b9050919050565b60006020820190508181036000830152614e33816145d5565b9050919050565b60006020820190508181036000830152614e538161463b565b9050919050565b60006020820190508181036000830152614e73816146a1565b9050919050565b60006020820190508181036000830152614e93816146e1565b9050919050565b60006020820190508181036000830152614eb381614747565b9050919050565b60006020820190508181036000830152614ed381614787565b9050919050565b60006020820190508181036000830152614ef3816147ed565b9050919050565b60006020820190508181036000830152614f138161482d565b9050919050565b60006020820190508181036000830152614f338161486d565b9050919050565b60006020820190508181036000830152614f53816148d3565b9050919050565b60006020820190508181036000830152614f7381614939565b9050919050565b60006020820190508181036000830152614f93816149b9565b9050919050565b60006020820190508181036000830152614fb3816149f9565b9050919050565b60006020820190508181036000830152614fd381614a5f565b9050919050565b60006020820190508181036000830152614ff381614ac5565b9050919050565b6000602082019050818103600083015261501381614b05565b9050919050565b6000602082019050818103600083015261503381614b45565b9050919050565b600060208201905061504f6000830184614bb4565b92915050565b600060408201905061506a6000830185614bb4565b818103602083015261507c81846141c7565b90509392505050565b6000604051905081810181811067ffffffffffffffff821117156150ac576150ab615523565b5b8060405250919050565b600067ffffffffffffffff8211156150d1576150d0615523565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150fd576150fc615523565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561512957615128615523565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561515957615158615523565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061520082615386565b915061520b83615386565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152405761523f615496565b5b828201905092915050565b600061525682615386565b915061526183615386565b925082615271576152706154c5565b5b828204905092915050565b600061528782615386565b915061529283615386565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152cb576152ca615496565b5b828202905092915050565b60006152e182615386565b91506152ec83615386565b9250828210156152ff576152fe615496565b5b828203905092915050565b600061531582615366565b9050919050565b600061532782615366565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156153d55780820151818401526020810190506153ba565b838111156153e4576000848401525b50505050565b6000600282049050600182168061540257607f821691505b60208210811415615416576154156154f4565b5b50919050565b600061542782615386565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545a57615459615496565b5b600182019050919050565b600061547082615386565b915061547b83615386565b92508261548b5761548a6154c5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61556c8161530a565b811461557757600080fd5b50565b6155838161532e565b811461558e57600080fd5b50565b61559a8161533a565b81146155a557600080fd5b50565b6155b181615386565b81146155bc57600080fd5b5056fea26469706673582212202b89f27a29452fe02837bc46a4f1086431fc89795bc1756098651eb6e54bd7d364736f6c63430008000033

Deployed Bytecode Sourcemap

4486:6221:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5826:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9479:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4716:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2560:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4193:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4645:28:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3731:401:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4679:31:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7639:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4970:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4794:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5207:364:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3738:744:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7731:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9562:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10231:474;;;:::i;:::-;;5637:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8873:84:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4936:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9824:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9089:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4904:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2185:313:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4575:21:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1845:283:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1631:92:10;;;;;;;;;;;;;:::i;:::-;;8963:120:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;999:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2722:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5032:34:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6226:1407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4555:318:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8686:67:1;;;;;;;;;;;;;:::i;:::-;;5882:354:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5072:37:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4833:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4602:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8004:659;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3130:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8759:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4756:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9197:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4939:206:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9667:151:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9349:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1872:223:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5826:394:1;5959:4;2827:10;5998:38;;5983:53;;;:11;:53;;;;5979:95;;;6059:4;6052:11;;;;5979:95;5164:10;6102:21;;6087:36;;;:11;:36;;;;6083:78;;;6146:4;6139:11;;;;6083:78;6177:36;6201:11;6177:23;:36::i;:::-;6170:43;;5826:394;;;;:::o;9479:77::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9543:6:1::1;9534;;:15;;;;;;;;;;;;;;;;;;9479:77:::0;:::o;4716:34::-;;;;:::o;2560:98:4:-;2614:13;2646:5;2639:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2560:98;:::o;4193:295::-;4309:7;4353:16;4361:7;4353;:16::i;:::-;4332:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;4457:15;:24;4473:7;4457:24;;;;;;;;;;;;;;;;;;;;;4450:31;;4193:295;;;:::o;4645:28:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3731:401:4:-;3811:13;3827:23;3842:7;3827:14;:23::i;:::-;3811:39;;3874:5;3868:11;;:2;:11;;;;3860:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3965:5;3949:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3974:37;3991:5;3998:12;:10;:12::i;:::-;3974:16;:37::i;:::-;3949:62;3928:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;4104:21;4113:2;4117:7;4104:8;:21::i;:::-;3731:401;;;:::o;4679:31:1:-;;;;:::o;7639:86::-;7683:7;7709:9;;7702:16;;7639:86;:::o;4970:55::-;;;;;;;;;;;;;;;;;:::o;4794:33::-;;;;:::o;5207:364:4:-;5409:41;5428:12;:10;:12::i;:::-;5442:7;5409:18;:41::i;:::-;5388:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;5536:28;5546:4;5552:2;5556:7;5536:9;:28::i;:::-;5207:364;;;:::o;3738:744:1:-;3855:16;3873:21;3938:1;3914:9;:13;3924:2;3914:13;;;;;;;;;;;:20;;;;:25;3910:154;;;3974:1;3955:21;;4006:1;3990:17;;4021:32;;3910:154;4073:32;4108:9;:13;4118:2;4108:13;;;;;;;;;;;4073:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4142:10;4153:1;4142:13;;;;;;;;;;;;;;;;;;;;;;:21;;;4131:32;;4173:15;4203:9;4215:1;4203:13;;4198:103;4222:10;:17;4218:1;:21;4198:103;;;4271:10;4282:1;4271:13;;;;;;;;;;;;;;;;;;;;;;:19;;;4260:30;;;;;;;:::i;:::-;;;4241:3;;;;;:::i;:::-;;;;4198:103;;;;4470:5;4456:10;4446:7;:20;;;;:::i;:::-;4445:30;;;;:::i;:::-;4429:46;;3738:744;;;;;;;;:::o;7731:267::-;7790:4;7811:9;7823:1;7811:13;;7806:164;7830:20;:27;;;;7826:1;:31;7806:164;;;7909:5;7882:32;;:20;7903:1;7882:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;7878:82;;;7941:4;7934:11;;;;;7878:82;7859:3;;;;;:::i;:::-;;;;7806:164;;;;7986:5;7979:12;;7731:267;;;;:::o;9562:99::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9648:6:1::1;9630:15;;:24;;;;;;;;;;;;;;;;;;9562:99:::0;:::o;10231:474::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10520:7:1::1;10541;:5;:7::i;:::-;10533:21;;10562;10533:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10519:69;;;10606:2;10598:11;;;::::0;::::1;;1281:1:10;10231:474:1:o:0;5637:179:4:-;5770:39;5787:4;5793:2;5797:7;5770:39;;;;;;;;;;;;:16;:39::i;:::-;5637:179;;;:::o;8873:84:1:-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8942:8:1::1;8935:4;:15;;;;8873:84:::0;:::o;4936:28::-;;;;;;;;;;;;;:::o;9824:401::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9959:18:1::1;9980:7;:14;9959:35;;10009:9;10004:215;10028:10;10024:1;:14;10004:215;;;10060:7;10081;10089:1;10081:10;;;;;;;;;;;;;;;;;;;;;;10073:24;;10156:6;10163:1;10156:9;;;;;;;;;;;;;;;;;;;;;;10147:5;10123:21;:29;;;;:::i;:::-;10122:43;;;;:::i;:::-;10073:110;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10059:124;;;10205:2;10197:11;;;::::0;::::1;;10004:215;10040:3;;;;;:::i;:::-;;;;10004:215;;;;1281:1:10;9824:401:1::0;;:::o;9089:102::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9173:11:1::1;9163:7;:21;;;;;;;;;;;;:::i;:::-;;9089:102:::0;:::o;4904:26::-;;;;;;;;;;;;;:::o;2185:313:4:-;2297:7;2320:13;2336:7;:16;2344:7;2336:16;;;;;;;;;;;;;;;;;;;;;2320:32;;2400:1;2383:19;;:5;:19;;;;2362:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2486:5;2479:12;;;2185:313;;;:::o;4575:21:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1845:283:4:-;1957:7;2018:1;2001:19;;:5;:19;;;;1980:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2105:9;:16;2115:5;2105:16;;;;;;;;;;;;;;;;2098:23;;1845:283;;;:::o;1631:92:10:-;1222:12;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1695:21:::1;1713:1;1695:9;:21::i;:::-;1631:92::o:0;8963:120:1:-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9059:17:1::1;9043:13;:33;;;;8963:120:::0;:::o;999:85:10:-;1045:7;1071:6;;;;;;;;;;;1064:13;;999:85;:::o;2722:102:4:-;2778:13;2810:7;2803:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2722:102;:::o;5032:34:1:-;;;;;;;;;;;;;:::o;6226:1407::-;6295:6;;;;;;;;;;;6294:7;6286:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;6338:14;6355:13;:11;:13::i;:::-;6338:30;;6397:7;:5;:7::i;:::-;6383:21;;:10;:21;;;6379:996;;6442:1;6428:11;:15;6420:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6529:13;;6514:11;:28;;6489:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;6675:9;;6660:11;6651:6;:20;;;;:::i;:::-;:33;;6626:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;6778:4;6759:23;;:15;;;;;;;;;;;:23;;;6755:610;;;6810:25;6824:10;6810:13;:25::i;:::-;6802:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;6881:24;6908:20;:32;6929:10;6908:32;;;;;;;;;;;;;;;;6881:59;;7021:18;;7006:11;6987:16;:30;;;;:::i;:::-;:52;;6958:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;7178:11;7169:6;;:20;;;;:::i;:::-;7156:9;:33;;7127:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;6755:610;;;;7316:11;7309:4;;:18;;;;:::i;:::-;7296:9;:31;;7288:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;6755:610;6379:996;7390:9;7402:1;7390:13;;7385:242;7410:11;7405:1;:16;7385:242;;7442:20;:32;7463:10;7442:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;7490:33;7500:10;7521:1;7512:6;:10;;;;:::i;:::-;7490:9;:33::i;:::-;7537:54;7559:1;7550:6;:10;;;;:::i;:::-;7578:4;7586;7537:12;:54::i;:::-;7605:9;;:11;;;;;;;;;:::i;:::-;;;;;;7423:3;;;;;:::i;:::-;;;;7385:242;;;;6226:1407;;:::o;4555:318:4:-;4697:12;:10;:12::i;:::-;4685:24;;:8;:24;;;;4677:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:8;4750:18;:32;4769:12;:10;:12::i;:::-;4750:32;;;;;;;;;;;;;;;:42;4783:8;4750:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4847:8;4818:48;;4833:12;:10;:12::i;:::-;4818:48;;;4857:8;4818:48;;;;;;:::i;:::-;;;;;;;;4555:318;;:::o;8686:67:1:-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8742:4:1::1;8731:8;;:15;;;;;;;;;;;;;;;;;;8686:67::o:0;5882:354:4:-;6064:41;6083:12;:10;:12::i;:::-;6097:7;6064:18;:41::i;:::-;6043:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;6190:39;6204:4;6210:2;6214:7;6223:5;6190:13;:39::i;:::-;5882:354;;;;:::o;5072:37:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4833:38::-;;;;:::o;4602:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8004:659::-;8117:13;8167:16;8175:7;8167;:16::i;:::-;8146:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;8283:5;8271:17;;:8;;;;;;;;;;;:17;;;8267:69;;;8311:14;8304:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8267:69;8346:28;8377:10;:8;:10::i;:::-;8346:41;;8447:1;8422:14;8416:28;:32;:240;;;;;;;;;;;;;;;;;8537:14;8577:18;:7;:16;:18::i;:::-;8495:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8416:240;8397:259;;;8004:659;;;;:::o;3130:171::-;3237:21;3281:9;:13;3291:2;3281:13;;;;;;;;;;;3274:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3130:171;;;:::o;8759:108::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8854:6:1::1;8833:18;:27;;;;8759:108:::0;:::o;4756:32::-;;;;:::o;9197:146::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9319:17:1::1;9303:13;:33;;;;;;;;;;;;:::i;:::-;;9197:146:::0;:::o;4939:206:4:-;5076:4;5103:18;:25;5122:5;5103:25;;;;;;;;;;;;;;;:35;5129:8;5103:35;;;;;;;;;;;;;;;;;;;;;;;;;5096:42;;4939:206;;;;:::o;9667:151:1:-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9752:20:1::1;;9745:27;;;;:::i;:::-;9805:6;;9782:20;:29;;;;;;;:::i;:::-;;9667:151:::0;;:::o;9349:124::-;1222:12:10;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9451:15:1::1;9434:14;:32;;;;;;;;;;;;:::i;:::-;;9349:124:::0;:::o;1872:223:10:-;1222:12;:10;:12::i;:::-;1211:23;;:7;:5;:7::i;:::-;:23;;;1203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1993:1:::1;1973:22;;:8;:22;;;;1952:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2069:19;2079:8;2069:9;:19::i;:::-;1872:223:::0;:::o;1442:344:4:-;1584:4;1638:25;1623:40;;;:11;:40;;;;:104;;;;1694:33;1679:48;;;:11;:48;;;;1623:104;:156;;;;1743:36;1767:11;1743:23;:36::i;:::-;1623:156;1604:175;;1442:344;;;:::o;599:96:2:-;652:7;678:10;671:17;;599:96;:::o;7742:125:4:-;7807:4;7858:1;7830:30;;:7;:16;7838:7;7830:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7823:37;;7742:125;;;:::o;11721:171::-;11822:2;11795:15;:24;11811:7;11795:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11877:7;11873:2;11839:46;;11848:23;11863:7;11848:14;:23::i;:::-;11839:46;;;;;;;;;;;;11721:171;;:::o;8025:438::-;8150:4;8191:16;8199:7;8191;:16::i;:::-;8170:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;8287:13;8303:23;8318:7;8303:14;:23::i;:::-;8287:39;;8355:5;8344:16;;:7;:16;;;:63;;;;8400:7;8376:31;;:20;8388:7;8376:11;:20::i;:::-;:31;;;8344:63;:111;;;;8423:32;8440:5;8447:7;8423:16;:32::i;:::-;8344:111;8336:120;;;8025:438;;;;:::o;11016:594::-;11183:4;11156:31;;:23;11171:7;11156:14;:23::i;:::-;:31;;;11135:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;11286:1;11272:16;;:2;:16;;;;11264:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11340:39;11361:4;11367:2;11371:7;11340:20;:39::i;:::-;11441:29;11458:1;11462:7;11441:8;:29::i;:::-;11500:1;11481:9;:15;11491:4;11481:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11528:1;11511:9;:13;11521:2;11511:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11558:2;11539:7;:16;11547:7;11539:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11595:7;11591:2;11576:27;;11585:4;11576:27;;;;;;;;;;;;11016:594;;;:::o;2101:169:10:-;2156:16;2175:6;;;;;;;;;;;2156:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2254:8;2223:40;;2244:8;2223:40;;;;;;;;;;;;2101:169;;:::o;8793:108:4:-;8868:26;8878:2;8882:7;8868:26;;;;;;;;;;;;:9;:26::i;:::-;8793:108;;:::o;5435:385:1:-;5598:32;5652:1;5633:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5598:56;;5688:26;5664:10;5675:1;5664:13;;;;;;;;;;;;;;;;;;;;;;:21;;:50;;;;;;;;;;;5746:21;5724:10;5735:1;5724:13;;;;;;;;;;;;;;;;;;;;;;:19;;:43;;;;;;;;;;;5777:36;5792:8;5802:10;5777:14;:36::i;:::-;5435:385;;;;:::o;7098:341:4:-;7249:28;7259:4;7265:2;7269:7;7249:9;:28::i;:::-;7308:48;7331:4;7337:2;7341:7;7350:5;7308:22;:48::i;:::-;7287:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;7098:341;;;;:::o;5323:106:1:-;5383:13;5415:7;5408:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5323:106;:::o;287:703:11:-;343:13;569:1;560:5;:10;556:51;;;586:10;;;;;;;;;;;;;;;;;;;;;556:51;616:12;631:5;616:20;;646:14;670:75;685:1;677:4;:9;670:75;;702:8;;;;;:::i;:::-;;;;732:2;724:10;;;;;:::i;:::-;;;670:75;;;754:19;786:6;776:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;754:39;;803:150;819:1;810:5;:10;803:150;;846:1;836:11;;;;;:::i;:::-;;;912:2;904:5;:10;;;;:::i;:::-;891:2;:24;;;;:::i;:::-;878:39;;861:6;868;861:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;940:2;931:11;;;;;:::i;:::-;;;803:150;;;976:6;962:21;;;;;287:703;;;;:::o;775:199:3:-;900:4;942:25;927:40;;;:11;:40;;;;920:47;;775:199;;;:::o;13951:122:4:-;;;;:::o;9122:311::-;9247:18;9253:2;9257:7;9247:5;:18::i;:::-;9296:54;9327:1;9331:2;9335:7;9344:5;9296:22;:54::i;:::-;9275:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;9122:311;;;:::o;267:673:1:-;368:18;401:9;413:1;401:13;;396:419;420:10;:17;416:1;:21;396:419;;;516:3;483:37;;:10;494:1;483:13;;;;;;;;;;;;;;;;;;;;;;:21;;;:37;;;;458:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;643:1;620:10;631:1;620:13;;;;;;;;;;;;;;;;;;;;;;:19;;;:24;;;;595:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;738:10;749:1;738:13;;;;;;;;;;;;;;;;;;;;;;:19;;;724:33;;;;;;;:::i;:::-;;;771:9;:13;781:2;771:13;;;;;;;;;;;790:10;801:1;790:13;;;;;;;;;;;;;;;;;;;;;;771:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;439:3;;;;;:::i;:::-;;;;396:419;;;;845:5;832:10;:18;824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;902:31;918:2;922:10;902:15;:31::i;:::-;267:673;;;:::o;12445:950:4:-;12595:4;12615:15;:2;:13;;;:15::i;:::-;12611:778;;;12682:2;12666:36;;;12724:12;:10;:12::i;:::-;12758:4;12784:7;12813:5;12666:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12646:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13032:1;13015:6;:13;:18;13011:312;;;13057:106;;;;;;;;;;:::i;:::-;;;;;;;;13011:312;13275:6;13269:13;13260:6;13256:2;13252:15;13245:38;12646:691;12908:41;;;12898:51;;;:6;:51;;;;12891:58;;;;;12611:778;13374:4;13367:11;;12445:950;;;;;;;:::o;9755:372::-;9848:1;9834:16;;:2;:16;;;;9826:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9906:16;9914:7;9906;:16::i;:::-;9905:17;9897:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9966:45;9995:1;9999:2;10003:7;9966:20;:45::i;:::-;10039:1;10022:9;:13;10032:2;10022:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10069:2;10050:7;:16;10058:7;10050:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10112:7;10108:2;10087:33;;10104:1;10087:33;;;;;;;;;;;;9755:372;;:::o;3307:159:1:-;3431:28;3444:2;3448:10;3431:28;;;;;;;:::i;:::-;;;;;;;;3307:159;;:::o;782:377:0:-;842:4;1045:12;1110:7;1098:20;1090:28;;1151:1;1144:4;:8;1137:15;;;782:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:12:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:342::-;;1399:64;1414:48;1455:6;1414:48;:::i;:::-;1399:64;:::i;:::-;1390:73;;1486:6;1479:5;1472:21;1524:4;1517:5;1513:16;1562:3;1553:6;1548:3;1544:16;1541:25;1538:2;;;1579:1;1576;1569:12;1538:2;1592:41;1626:6;1621:3;1616;1592:41;:::i;:::-;1380:259;;;;;;:::o;1645:344::-;;1748:65;1763:49;1805:6;1763:49;:::i;:::-;1748:65;:::i;:::-;1739:74;;1836:6;1829:5;1822:21;1874:4;1867:5;1863:16;1912:3;1903:6;1898:3;1894:16;1891:25;1888:2;;;1929:1;1926;1919:12;1888:2;1942:41;1976:6;1971:3;1966;1942:41;:::i;:::-;1729:260;;;;;;:::o;1995:139::-;;2079:6;2066:20;2057:29;;2095:33;2122:5;2095:33;:::i;:::-;2047:87;;;;:::o;2157:367::-;;;2290:3;2283:4;2275:6;2271:17;2267:27;2257:2;;2308:1;2305;2298:12;2257:2;2344:6;2331:20;2321:30;;2374:18;2366:6;2363:30;2360:2;;;2406:1;2403;2396:12;2360:2;2443:4;2435:6;2431:17;2419:29;;2497:3;2489:4;2481:6;2477:17;2467:8;2463:32;2460:41;2457:2;;;2514:1;2511;2504:12;2457:2;2247:277;;;;;:::o;2547:303::-;;2667:3;2660:4;2652:6;2648:17;2644:27;2634:2;;2685:1;2682;2675:12;2634:2;2725:6;2712:20;2750:94;2840:3;2832:6;2825:4;2817:6;2813:17;2750:94;:::i;:::-;2741:103;;2624:226;;;;;:::o;2873:303::-;;2993:3;2986:4;2978:6;2974:17;2970:27;2960:2;;3011:1;3008;3001:12;2960:2;3051:6;3038:20;3076:94;3166:3;3158:6;3151:4;3143:6;3139:17;3076:94;:::i;:::-;3067:103;;2950:226;;;;;:::o;3182:133::-;;3263:6;3250:20;3241:29;;3279:30;3303:5;3279:30;:::i;:::-;3231:84;;;;:::o;3321:137::-;;3404:6;3391:20;3382:29;;3420:32;3446:5;3420:32;:::i;:::-;3372:86;;;;:::o;3464:141::-;;3551:6;3545:13;3536:22;;3567:32;3593:5;3567:32;:::i;:::-;3526:79;;;;:::o;3624:271::-;;3728:3;3721:4;3713:6;3709:17;3705:27;3695:2;;3746:1;3743;3736:12;3695:2;3786:6;3773:20;3811:78;3885:3;3877:6;3870:4;3862:6;3858:17;3811:78;:::i;:::-;3802:87;;3685:210;;;;;:::o;3915:273::-;;4020:3;4013:4;4005:6;4001:17;3997:27;3987:2;;4038:1;4035;4028:12;3987:2;4078:6;4065:20;4103:79;4178:3;4170:6;4163:4;4155:6;4151:17;4103:79;:::i;:::-;4094:88;;3977:211;;;;;:::o;4194:139::-;;4278:6;4265:20;4256:29;;4294:33;4321:5;4294:33;:::i;:::-;4246:87;;;;:::o;4339:262::-;;4447:2;4435:9;4426:7;4422:23;4418:32;4415:2;;;4463:1;4460;4453:12;4415:2;4506:1;4531:53;4576:7;4567:6;4556:9;4552:22;4531:53;:::i;:::-;4521:63;;4477:117;4405:196;;;;:::o;4607:407::-;;;4732:2;4720:9;4711:7;4707:23;4703:32;4700:2;;;4748:1;4745;4738:12;4700:2;4791:1;4816:53;4861:7;4852:6;4841:9;4837:22;4816:53;:::i;:::-;4806:63;;4762:117;4918:2;4944:53;4989:7;4980:6;4969:9;4965:22;4944:53;:::i;:::-;4934:63;;4889:118;4690:324;;;;;:::o;5020:552::-;;;;5162:2;5150:9;5141:7;5137:23;5133:32;5130:2;;;5178:1;5175;5168:12;5130:2;5221:1;5246:53;5291:7;5282:6;5271:9;5267:22;5246:53;:::i;:::-;5236:63;;5192:117;5348:2;5374:53;5419:7;5410:6;5399:9;5395:22;5374:53;:::i;:::-;5364:63;;5319:118;5476:2;5502:53;5547:7;5538:6;5527:9;5523:22;5502:53;:::i;:::-;5492:63;;5447:118;5120:452;;;;;:::o;5578:809::-;;;;;5746:3;5734:9;5725:7;5721:23;5717:33;5714:2;;;5763:1;5760;5753:12;5714:2;5806:1;5831:53;5876:7;5867:6;5856:9;5852:22;5831:53;:::i;:::-;5821:63;;5777:117;5933:2;5959:53;6004:7;5995:6;5984:9;5980:22;5959:53;:::i;:::-;5949:63;;5904:118;6061:2;6087:53;6132:7;6123:6;6112:9;6108:22;6087:53;:::i;:::-;6077:63;;6032:118;6217:2;6206:9;6202:18;6189:32;6248:18;6240:6;6237:30;6234:2;;;6280:1;6277;6270:12;6234:2;6308:62;6362:7;6353:6;6342:9;6338:22;6308:62;:::i;:::-;6298:72;;6160:220;5704:683;;;;;;;:::o;6393:401::-;;;6515:2;6503:9;6494:7;6490:23;6486:32;6483:2;;;6531:1;6528;6521:12;6483:2;6574:1;6599:53;6644:7;6635:6;6624:9;6620:22;6599:53;:::i;:::-;6589:63;;6545:117;6701:2;6727:50;6769:7;6760:6;6749:9;6745:22;6727:50;:::i;:::-;6717:60;;6672:115;6473:321;;;;;:::o;6800:407::-;;;6925:2;6913:9;6904:7;6900:23;6896:32;6893:2;;;6941:1;6938;6931:12;6893:2;6984:1;7009:53;7054:7;7045:6;7034:9;7030:22;7009:53;:::i;:::-;6999:63;;6955:117;7111:2;7137:53;7182:7;7173:6;7162:9;7158:22;7137:53;:::i;:::-;7127:63;;7082:118;6883:324;;;;;:::o;7213:425::-;;;7356:2;7344:9;7335:7;7331:23;7327:32;7324:2;;;7372:1;7369;7362:12;7324:2;7443:1;7432:9;7428:17;7415:31;7473:18;7465:6;7462:30;7459:2;;;7505:1;7502;7495:12;7459:2;7541:80;7613:7;7604:6;7593:9;7589:22;7541:80;:::i;:::-;7523:98;;;;7386:245;7314:324;;;;;:::o;7644:693::-;;;7819:2;7807:9;7798:7;7794:23;7790:32;7787:2;;;7835:1;7832;7825:12;7787:2;7906:1;7895:9;7891:17;7878:31;7936:18;7928:6;7925:30;7922:2;;;7968:1;7965;7958:12;7922:2;7996:78;8066:7;8057:6;8046:9;8042:22;7996:78;:::i;:::-;7986:88;;7849:235;8151:2;8140:9;8136:18;8123:32;8182:18;8174:6;8171:30;8168:2;;;8214:1;8211;8204:12;8168:2;8242:78;8312:7;8303:6;8292:9;8288:22;8242:78;:::i;:::-;8232:88;;8094:236;7777:560;;;;;:::o;8343:256::-;;8448:2;8436:9;8427:7;8423:23;8419:32;8416:2;;;8464:1;8461;8454:12;8416:2;8507:1;8532:50;8574:7;8565:6;8554:9;8550:22;8532:50;:::i;:::-;8522:60;;8478:114;8406:193;;;;:::o;8605:260::-;;8712:2;8700:9;8691:7;8687:23;8683:32;8680:2;;;8728:1;8725;8718:12;8680:2;8771:1;8796:52;8840:7;8831:6;8820:9;8816:22;8796:52;:::i;:::-;8786:62;;8742:116;8670:195;;;;:::o;8871:282::-;;8989:2;8977:9;8968:7;8964:23;8960:32;8957:2;;;9005:1;9002;8995:12;8957:2;9048:1;9073:63;9128:7;9119:6;9108:9;9104:22;9073:63;:::i;:::-;9063:73;;9019:127;8947:206;;;;:::o;9159:375::-;;9277:2;9265:9;9256:7;9252:23;9248:32;9245:2;;;9293:1;9290;9283:12;9245:2;9364:1;9353:9;9349:17;9336:31;9394:18;9386:6;9383:30;9380:2;;;9426:1;9423;9416:12;9380:2;9454:63;9509:7;9500:6;9489:9;9485:22;9454:63;:::i;:::-;9444:73;;9307:220;9235:299;;;;:::o;9540:262::-;;9648:2;9636:9;9627:7;9623:23;9619:32;9616:2;;;9664:1;9661;9654:12;9616:2;9707:1;9732:53;9777:7;9768:6;9757:9;9753:22;9732:53;:::i;:::-;9722:63;;9678:117;9606:196;;;;:::o;9808:407::-;;;9933:2;9921:9;9912:7;9908:23;9904:32;9901:2;;;9949:1;9946;9939:12;9901:2;9992:1;10017:53;10062:7;10053:6;10042:9;10038:22;10017:53;:::i;:::-;10007:63;;9963:117;10119:2;10145:53;10190:7;10181:6;10170:9;10166:22;10145:53;:::i;:::-;10135:63;;10090:118;9891:324;;;;;:::o;10221:263::-;;10353:88;10437:3;10429:6;10353:88;:::i;:::-;10473:4;10468:3;10464:14;10450:28;;10343:141;;;;:::o;10490:132::-;10583:32;10609:5;10583:32;:::i;:::-;10578:3;10571:45;10561:61;;:::o;10628:118::-;10715:24;10733:5;10715:24;:::i;:::-;10710:3;10703:37;10693:53;;:::o;10806:900::-;;10996:75;11065:5;10996:75;:::i;:::-;11087:107;11187:6;11182:3;11087:107;:::i;:::-;11080:114;;11218:77;11289:5;11218:77;:::i;:::-;11318:7;11349:1;11334:347;11359:6;11356:1;11353:13;11334:347;;;11435:6;11429:13;11462:105;11563:3;11548:13;11462:105;:::i;:::-;11455:112;;11590:81;11664:6;11590:81;:::i;:::-;11580:91;;11394:287;11381:1;11378;11374:9;11369:14;;11334:347;;;11338:14;11697:3;11690:10;;10972:734;;;;;;;:::o;11712:109::-;11793:21;11808:5;11793:21;:::i;:::-;11788:3;11781:34;11771:50;;:::o;11827:360::-;;11941:38;11973:5;11941:38;:::i;:::-;11995:70;12058:6;12053:3;11995:70;:::i;:::-;11988:77;;12074:52;12119:6;12114:3;12107:4;12100:5;12096:16;12074:52;:::i;:::-;12151:29;12173:6;12151:29;:::i;:::-;12146:3;12142:39;12135:46;;11917:270;;;;;:::o;12193:364::-;;12309:39;12342:5;12309:39;:::i;:::-;12364:71;12428:6;12423:3;12364:71;:::i;:::-;12357:78;;12444:52;12489:6;12484:3;12477:4;12470:5;12466:16;12444:52;:::i;:::-;12521:29;12543:6;12521:29;:::i;:::-;12516:3;12512:39;12505:46;;12285:272;;;;;:::o;12563:377::-;;12697:39;12730:5;12697:39;:::i;:::-;12752:89;12834:6;12829:3;12752:89;:::i;:::-;12745:96;;12850:52;12895:6;12890:3;12883:4;12876:5;12872:16;12850:52;:::i;:::-;12927:6;12922:3;12918:16;12911:23;;12673:267;;;;;:::o;12946:382::-;;13109:67;13173:2;13168:3;13109:67;:::i;:::-;13102:74;;13206:34;13202:1;13197:3;13193:11;13186:55;13272:20;13267:2;13262:3;13258:12;13251:42;13319:2;13314:3;13310:12;13303:19;;13092:236;;;:::o;13334:370::-;;13497:67;13561:2;13556:3;13497:67;:::i;:::-;13490:74;;13594:34;13590:1;13585:3;13581:11;13574:55;13660:8;13655:2;13650:3;13646:12;13639:30;13695:2;13690:3;13686:12;13679:19;;13480:224;;;:::o;13710:326::-;;13873:67;13937:2;13932:3;13873:67;:::i;:::-;13866:74;;13970:30;13966:1;13961:3;13957:11;13950:51;14027:2;14022:3;14018:12;14011:19;;13856:180;;;:::o;14042:326::-;;14205:67;14269:2;14264:3;14205:67;:::i;:::-;14198:74;;14302:30;14298:1;14293:3;14289:11;14282:51;14359:2;14354:3;14350:12;14343:19;;14188:180;;;:::o;14374:368::-;;14537:67;14601:2;14596:3;14537:67;:::i;:::-;14530:74;;14634:34;14630:1;14625:3;14621:11;14614:55;14700:6;14695:2;14690:3;14686:12;14679:28;14733:2;14728:3;14724:12;14717:19;;14520:222;;;:::o;14748:323::-;;14911:67;14975:2;14970:3;14911:67;:::i;:::-;14904:74;;15008:27;15004:1;14999:3;14995:11;14988:48;15062:2;15057:3;15053:12;15046:19;;14894:177;;;:::o;15077:376::-;;15240:67;15304:2;15299:3;15240:67;:::i;:::-;15233:74;;15337:34;15333:1;15328:3;15324:11;15317:55;15403:14;15398:2;15393:3;15389:12;15382:36;15444:2;15439:3;15435:12;15428:19;;15223:230;;;:::o;15459:330::-;;15622:67;15686:2;15681:3;15622:67;:::i;:::-;15615:74;;15719:34;15715:1;15710:3;15706:11;15699:55;15780:2;15775:3;15771:12;15764:19;;15605:184;;;:::o;15795:388::-;;15958:67;16022:2;16017:3;15958:67;:::i;:::-;15951:74;;16055:34;16051:1;16046:3;16042:11;16035:55;16121:26;16116:2;16111:3;16107:12;16100:48;16174:2;16169:3;16165:12;16158:19;;15941:242;;;:::o;16189:374::-;;16352:67;16416:2;16411:3;16352:67;:::i;:::-;16345:74;;16449:34;16445:1;16440:3;16436:11;16429:55;16515:12;16510:2;16505:3;16501:12;16494:34;16554:2;16549:3;16545:12;16538:19;;16335:228;;;:::o;16569:373::-;;16732:67;16796:2;16791:3;16732:67;:::i;:::-;16725:74;;16829:34;16825:1;16820:3;16816:11;16809:55;16895:11;16890:2;16885:3;16881:12;16874:33;16933:2;16928:3;16924:12;16917:19;;16715:227;;;:::o;16948:320::-;;17111:67;17175:2;17170:3;17111:67;:::i;:::-;17104:74;;17208:24;17204:1;17199:3;17195:11;17188:45;17259:2;17254:3;17250:12;17243:19;;17094:174;;;:::o;17274:368::-;;17437:67;17501:2;17496:3;17437:67;:::i;:::-;17430:74;;17534:34;17530:1;17525:3;17521:11;17514:55;17600:6;17595:2;17590:3;17586:12;17579:28;17633:2;17628:3;17624:12;17617:19;;17420:222;;;:::o;17648:330::-;;17811:67;17875:2;17870:3;17811:67;:::i;:::-;17804:74;;17908:34;17904:1;17899:3;17895:11;17888:55;17969:2;17964:3;17960:12;17953:19;;17794:184;;;:::o;17984:376::-;;18147:67;18211:2;18206:3;18147:67;:::i;:::-;18140:74;;18244:34;18240:1;18235:3;18231:11;18224:55;18310:14;18305:2;18300:3;18296:12;18289:36;18351:2;18346:3;18342:12;18335:19;;18130:230;;;:::o;18366:330::-;;18529:67;18593:2;18588:3;18529:67;:::i;:::-;18522:74;;18626:34;18622:1;18617:3;18613:11;18606:55;18687:2;18682:3;18678:12;18671:19;;18512:184;;;:::o;18702:320::-;;18865:67;18929:2;18924:3;18865:67;:::i;:::-;18858:74;;18962:24;18958:1;18953:3;18949:11;18942:45;19013:2;19008:3;19004:12;18997:19;;18848:174;;;:::o;19028:373::-;;19191:67;19255:2;19250:3;19191:67;:::i;:::-;19184:74;;19288:34;19284:1;19279:3;19275:11;19268:55;19354:11;19349:2;19344:3;19340:12;19333:33;19392:2;19387:3;19383:12;19376:19;;19174:227;;;:::o;19407:379::-;;19570:67;19634:2;19629:3;19570:67;:::i;:::-;19563:74;;19667:34;19663:1;19658:3;19654:11;19647:55;19733:17;19728:2;19723:3;19719:12;19712:39;19777:2;19772:3;19768:12;19761:19;;19553:233;;;:::o;19792:365::-;;19955:67;20019:2;20014:3;19955:67;:::i;:::-;19948:74;;20052:34;20048:1;20043:3;20039:11;20032:55;20118:3;20113:2;20108:3;20104:12;20097:25;20148:2;20143:3;20139:12;20132:19;;19938:219;;;:::o;20163:297::-;;20343:83;20424:1;20419:3;20343:83;:::i;:::-;20336:90;;20452:1;20447:3;20443:11;20436:18;;20326:134;;;:::o;20466:316::-;;20629:67;20693:2;20688:3;20629:67;:::i;:::-;20622:74;;20726:20;20722:1;20717:3;20713:11;20706:41;20773:2;20768:3;20764:12;20757:19;;20612:170;;;:::o;20788:381::-;;20951:67;21015:2;21010:3;20951:67;:::i;:::-;20944:74;;21048:34;21044:1;21039:3;21035:11;21028:55;21114:19;21109:2;21104:3;21100:12;21093:41;21160:2;21155:3;21151:12;21144:19;;20934:235;;;:::o;21175:369::-;;21338:67;21402:2;21397:3;21338:67;:::i;:::-;21331:74;;21435:34;21431:1;21426:3;21422:11;21415:55;21501:7;21496:2;21491:3;21487:12;21480:29;21535:2;21530:3;21526:12;21519:19;;21321:223;;;:::o;21550:321::-;;21713:67;21777:2;21772:3;21713:67;:::i;:::-;21706:74;;21810:25;21806:1;21801:3;21797:11;21790:46;21862:2;21857:3;21853:12;21846:19;;21696:175;;;:::o;21877:325::-;;22040:67;22104:2;22099:3;22040:67;:::i;:::-;22033:74;;22137:29;22133:1;22128:3;22124:11;22117:50;22193:2;22188:3;22184:12;22177:19;;22023:179;;;:::o;22208:325::-;;22371:67;22435:2;22430:3;22371:67;:::i;:::-;22364:74;;22468:29;22464:1;22459:3;22455:11;22448:50;22524:2;22519:3;22515:12;22508:19;;22354:179;;;:::o;22589:507::-;22718:4;22713:3;22709:14;22808:4;22801:5;22797:16;22791:23;22827:79;22900:4;22895:3;22891:14;22877:12;22827:79;:::i;:::-;22733:183;22999:4;22992:5;22988:16;22982:23;23018:61;23073:4;23068:3;23064:14;23050:12;23018:61;:::i;:::-;22926:163;22687:409;;;:::o;23102:118::-;23189:24;23207:5;23189:24;:::i;:::-;23184:3;23177:37;23167:53;;:::o;23226:105::-;23301:23;23318:5;23301:23;:::i;:::-;23296:3;23289:36;23279:52;;:::o;23337:435::-;;23539:95;23630:3;23621:6;23539:95;:::i;:::-;23532:102;;23651:95;23742:3;23733:6;23651:95;:::i;:::-;23644:102;;23763:3;23756:10;;23521:251;;;;;:::o;23778:379::-;;23984:147;24127:3;23984:147;:::i;:::-;23977:154;;24148:3;24141:10;;23966:191;;;:::o;24163:222::-;;24294:2;24283:9;24279:18;24271:26;;24307:71;24375:1;24364:9;24360:17;24351:6;24307:71;:::i;:::-;24261:124;;;;:::o;24391:640::-;;24624:3;24613:9;24609:19;24601:27;;24638:71;24706:1;24695:9;24691:17;24682:6;24638:71;:::i;:::-;24719:72;24787:2;24776:9;24772:18;24763:6;24719:72;:::i;:::-;24801;24869:2;24858:9;24854:18;24845:6;24801:72;:::i;:::-;24920:9;24914:4;24910:20;24905:2;24894:9;24890:18;24883:48;24948:76;25019:4;25010:6;24948:76;:::i;:::-;24940:84;;24591:440;;;;;;;:::o;25037:332::-;;25196:2;25185:9;25181:18;25173:26;;25209:71;25277:1;25266:9;25262:17;25253:6;25209:71;:::i;:::-;25290:72;25358:2;25347:9;25343:18;25334:6;25290:72;:::i;:::-;25163:206;;;;;:::o;25375:457::-;;25598:2;25587:9;25583:18;25575:26;;25647:9;25641:4;25637:20;25633:1;25622:9;25618:17;25611:47;25675:150;25820:4;25811:6;25675:150;:::i;:::-;25667:158;;25565:267;;;;:::o;25838:210::-;;25963:2;25952:9;25948:18;25940:26;;25976:65;26038:1;26027:9;26023:17;26014:6;25976:65;:::i;:::-;25930:118;;;;:::o;26054:313::-;;26205:2;26194:9;26190:18;26182:26;;26254:9;26248:4;26244:20;26240:1;26229:9;26225:17;26218:47;26282:78;26355:4;26346:6;26282:78;:::i;:::-;26274:86;;26172:195;;;;:::o;26373:419::-;;26577:2;26566:9;26562:18;26554:26;;26626:9;26620:4;26616:20;26612:1;26601:9;26597:17;26590:47;26654:131;26780:4;26654:131;:::i;:::-;26646:139;;26544:248;;;:::o;26798:419::-;;27002:2;26991:9;26987:18;26979:26;;27051:9;27045:4;27041:20;27037:1;27026:9;27022:17;27015:47;27079:131;27205:4;27079:131;:::i;:::-;27071:139;;26969:248;;;:::o;27223:419::-;;27427:2;27416:9;27412:18;27404:26;;27476:9;27470:4;27466:20;27462:1;27451:9;27447:17;27440:47;27504:131;27630:4;27504:131;:::i;:::-;27496:139;;27394:248;;;:::o;27648:419::-;;27852:2;27841:9;27837:18;27829:26;;27901:9;27895:4;27891:20;27887:1;27876:9;27872:17;27865:47;27929:131;28055:4;27929:131;:::i;:::-;27921:139;;27819:248;;;:::o;28073:419::-;;28277:2;28266:9;28262:18;28254:26;;28326:9;28320:4;28316:20;28312:1;28301:9;28297:17;28290:47;28354:131;28480:4;28354:131;:::i;:::-;28346:139;;28244:248;;;:::o;28498:419::-;;28702:2;28691:9;28687:18;28679:26;;28751:9;28745:4;28741:20;28737:1;28726:9;28722:17;28715:47;28779:131;28905:4;28779:131;:::i;:::-;28771:139;;28669:248;;;:::o;28923:419::-;;29127:2;29116:9;29112:18;29104:26;;29176:9;29170:4;29166:20;29162:1;29151:9;29147:17;29140:47;29204:131;29330:4;29204:131;:::i;:::-;29196:139;;29094:248;;;:::o;29348:419::-;;29552:2;29541:9;29537:18;29529:26;;29601:9;29595:4;29591:20;29587:1;29576:9;29572:17;29565:47;29629:131;29755:4;29629:131;:::i;:::-;29621:139;;29519:248;;;:::o;29773:419::-;;29977:2;29966:9;29962:18;29954:26;;30026:9;30020:4;30016:20;30012:1;30001:9;29997:17;29990:47;30054:131;30180:4;30054:131;:::i;:::-;30046:139;;29944:248;;;:::o;30198:419::-;;30402:2;30391:9;30387:18;30379:26;;30451:9;30445:4;30441:20;30437:1;30426:9;30422:17;30415:47;30479:131;30605:4;30479:131;:::i;:::-;30471:139;;30369:248;;;:::o;30623:419::-;;30827:2;30816:9;30812:18;30804:26;;30876:9;30870:4;30866:20;30862:1;30851:9;30847:17;30840:47;30904:131;31030:4;30904:131;:::i;:::-;30896:139;;30794:248;;;:::o;31048:419::-;;31252:2;31241:9;31237:18;31229:26;;31301:9;31295:4;31291:20;31287:1;31276:9;31272:17;31265:47;31329:131;31455:4;31329:131;:::i;:::-;31321:139;;31219:248;;;:::o;31473:419::-;;31677:2;31666:9;31662:18;31654:26;;31726:9;31720:4;31716:20;31712:1;31701:9;31697:17;31690:47;31754:131;31880:4;31754:131;:::i;:::-;31746:139;;31644:248;;;:::o;31898:419::-;;32102:2;32091:9;32087:18;32079:26;;32151:9;32145:4;32141:20;32137:1;32126:9;32122:17;32115:47;32179:131;32305:4;32179:131;:::i;:::-;32171:139;;32069:248;;;:::o;32323:419::-;;32527:2;32516:9;32512:18;32504:26;;32576:9;32570:4;32566:20;32562:1;32551:9;32547:17;32540:47;32604:131;32730:4;32604:131;:::i;:::-;32596:139;;32494:248;;;:::o;32748:419::-;;32952:2;32941:9;32937:18;32929:26;;33001:9;32995:4;32991:20;32987:1;32976:9;32972:17;32965:47;33029:131;33155:4;33029:131;:::i;:::-;33021:139;;32919:248;;;:::o;33173:419::-;;33377:2;33366:9;33362:18;33354:26;;33426:9;33420:4;33416:20;33412:1;33401:9;33397:17;33390:47;33454:131;33580:4;33454:131;:::i;:::-;33446:139;;33344:248;;;:::o;33598:419::-;;33802:2;33791:9;33787:18;33779:26;;33851:9;33845:4;33841:20;33837:1;33826:9;33822:17;33815:47;33879:131;34005:4;33879:131;:::i;:::-;33871:139;;33769:248;;;:::o;34023:419::-;;34227:2;34216:9;34212:18;34204:26;;34276:9;34270:4;34266:20;34262:1;34251:9;34247:17;34240:47;34304:131;34430:4;34304:131;:::i;:::-;34296:139;;34194:248;;;:::o;34448:419::-;;34652:2;34641:9;34637:18;34629:26;;34701:9;34695:4;34691:20;34687:1;34676:9;34672:17;34665:47;34729:131;34855:4;34729:131;:::i;:::-;34721:139;;34619:248;;;:::o;34873:419::-;;35077:2;35066:9;35062:18;35054:26;;35126:9;35120:4;35116:20;35112:1;35101:9;35097:17;35090:47;35154:131;35280:4;35154:131;:::i;:::-;35146:139;;35044:248;;;:::o;35298:419::-;;35502:2;35491:9;35487:18;35479:26;;35551:9;35545:4;35541:20;35537:1;35526:9;35522:17;35515:47;35579:131;35705:4;35579:131;:::i;:::-;35571:139;;35469:248;;;:::o;35723:419::-;;35927:2;35916:9;35912:18;35904:26;;35976:9;35970:4;35966:20;35962:1;35951:9;35947:17;35940:47;36004:131;36130:4;36004:131;:::i;:::-;35996:139;;35894:248;;;:::o;36148:419::-;;36352:2;36341:9;36337:18;36329:26;;36401:9;36395:4;36391:20;36387:1;36376:9;36372:17;36365:47;36429:131;36555:4;36429:131;:::i;:::-;36421:139;;36319:248;;;:::o;36573:419::-;;36777:2;36766:9;36762:18;36754:26;;36826:9;36820:4;36816:20;36812:1;36801:9;36797:17;36790:47;36854:131;36980:4;36854:131;:::i;:::-;36846:139;;36744:248;;;:::o;36998:419::-;;37202:2;37191:9;37187:18;37179:26;;37251:9;37245:4;37241:20;37237:1;37226:9;37222:17;37215:47;37279:131;37405:4;37279:131;:::i;:::-;37271:139;;37169:248;;;:::o;37423:222::-;;37554:2;37543:9;37539:18;37531:26;;37567:71;37635:1;37624:9;37620:17;37611:6;37567:71;:::i;:::-;37521:124;;;;:::o;37651:567::-;;37902:2;37891:9;37887:18;37879:26;;37915:71;37983:1;37972:9;37968:17;37959:6;37915:71;:::i;:::-;38033:9;38027:4;38023:20;38018:2;38007:9;38003:18;37996:48;38061:150;38206:4;38197:6;38061:150;:::i;:::-;38053:158;;37869:349;;;;;:::o;38224:283::-;;38290:2;38284:9;38274:19;;38332:4;38324:6;38320:17;38439:6;38427:10;38424:22;38403:18;38391:10;38388:34;38385:62;38382:2;;;38450:18;;:::i;:::-;38382:2;38490:10;38486:2;38479:22;38264:243;;;;:::o;38513:311::-;;38680:18;38672:6;38669:30;38666:2;;;38702:18;;:::i;:::-;38666:2;38752:4;38744:6;38740:17;38732:25;;38812:4;38806;38802:15;38794:23;;38595:229;;;:::o;38830:311::-;;38997:18;38989:6;38986:30;38983:2;;;39019:18;;:::i;:::-;38983:2;39069:4;39061:6;39057:17;39049:25;;39129:4;39123;39119:15;39111:23;;38912:229;;;:::o;39147:331::-;;39298:18;39290:6;39287:30;39284:2;;;39320:18;;:::i;:::-;39284:2;39405:4;39401:9;39394:4;39386:6;39382:17;39378:33;39370:41;;39466:4;39460;39456:15;39448:23;;39213:265;;;:::o;39484:332::-;;39636:18;39628:6;39625:30;39622:2;;;39658:18;;:::i;:::-;39622:2;39743:4;39739:9;39732:4;39724:6;39720:17;39716:33;39708:41;;39804:4;39798;39794:15;39786:23;;39551:265;;;:::o;39822:153::-;;39933:3;39925:11;;39963:4;39958:3;39954:14;39946:22;;39915:60;;;:::o;39981:135::-;;40103:5;40097:12;40087:22;;40076:40;;;:::o;40122:98::-;;40207:5;40201:12;40191:22;;40180:40;;;:::o;40226:99::-;;40312:5;40306:12;40296:22;;40285:40;;;:::o;40331:134::-;;40454:4;40449:3;40445:14;40437:22;;40427:38;;;:::o;40471:205::-;;40625:6;40620:3;40613:19;40665:4;40660:3;40656:14;40641:29;;40603:73;;;;:::o;40682:168::-;;40799:6;40794:3;40787:19;40839:4;40834:3;40830:14;40815:29;;40777:73;;;;:::o;40856:147::-;;40994:3;40979:18;;40969:34;;;;:::o;41009:169::-;;41127:6;41122:3;41115:19;41167:4;41162:3;41158:14;41143:29;;41105:73;;;;:::o;41184:148::-;;41323:3;41308:18;;41298:34;;;;:::o;41338:305::-;;41397:20;41415:1;41397:20;:::i;:::-;41392:25;;41431:20;41449:1;41431:20;:::i;:::-;41426:25;;41585:1;41517:66;41513:74;41510:1;41507:81;41504:2;;;41591:18;;:::i;:::-;41504:2;41635:1;41632;41628:9;41621:16;;41382:261;;;;:::o;41649:185::-;;41706:20;41724:1;41706:20;:::i;:::-;41701:25;;41740:20;41758:1;41740:20;:::i;:::-;41735:25;;41779:1;41769:2;;41784:18;;:::i;:::-;41769:2;41826:1;41823;41819:9;41814:14;;41691:143;;;;:::o;41840:348::-;;41903:20;41921:1;41903:20;:::i;:::-;41898:25;;41937:20;41955:1;41937:20;:::i;:::-;41932:25;;42125:1;42057:66;42053:74;42050:1;42047:81;42042:1;42035:9;42028:17;42024:105;42021:2;;;42132:18;;:::i;:::-;42021:2;42180:1;42177;42173:9;42162:20;;41888:300;;;;:::o;42194:191::-;;42254:20;42272:1;42254:20;:::i;:::-;42249:25;;42288:20;42306:1;42288:20;:::i;:::-;42283:25;;42327:1;42324;42321:8;42318:2;;;42332:18;;:::i;:::-;42318:2;42377:1;42374;42370:9;42362:17;;42239:146;;;;:::o;42391:96::-;;42457:24;42475:5;42457:24;:::i;:::-;42446:35;;42436:51;;;:::o;42493:104::-;;42567:24;42585:5;42567:24;:::i;:::-;42556:35;;42546:51;;;:::o;42603:90::-;;42680:5;42673:13;42666:21;42655:32;;42645:48;;;:::o;42699:149::-;;42775:66;42768:5;42764:78;42753:89;;42743:105;;;:::o;42854:126::-;;42931:42;42924:5;42920:54;42909:65;;42899:81;;;:::o;42986:77::-;;43052:5;43041:16;;43031:32;;;:::o;43069:109::-;;43145:26;43138:5;43134:38;43123:49;;43113:65;;;:::o;43184:154::-;43268:6;43263:3;43258;43245:30;43330:1;43321:6;43316:3;43312:16;43305:27;43235:103;;;:::o;43344:307::-;43412:1;43422:113;43436:6;43433:1;43430:13;43422:113;;;43521:1;43516:3;43512:11;43506:18;43502:1;43497:3;43493:11;43486:39;43458:2;43455:1;43451:10;43446:15;;43422:113;;;43553:6;43550:1;43547:13;43544:2;;;43633:1;43624:6;43619:3;43615:16;43608:27;43544:2;43393:258;;;;:::o;43657:320::-;;43738:1;43732:4;43728:12;43718:22;;43785:1;43779:4;43775:12;43806:18;43796:2;;43862:4;43854:6;43850:17;43840:27;;43796:2;43924;43916:6;43913:14;43893:18;43890:38;43887:2;;;43943:18;;:::i;:::-;43887:2;43708:269;;;;:::o;43983:233::-;;44045:24;44063:5;44045:24;:::i;:::-;44036:33;;44091:66;44084:5;44081:77;44078:2;;;44161:18;;:::i;:::-;44078:2;44208:1;44201:5;44197:13;44190:20;;44026:190;;;:::o;44222:176::-;;44271:20;44289:1;44271:20;:::i;:::-;44266:25;;44305:20;44323:1;44305:20;:::i;:::-;44300:25;;44344:1;44334:2;;44349:18;;:::i;:::-;44334:2;44390:1;44387;44383:9;44378:14;;44256:142;;;;:::o;44404:180::-;44452:77;44449:1;44442:88;44549:4;44546:1;44539:15;44573:4;44570:1;44563:15;44590:180;44638:77;44635:1;44628:88;44735:4;44732:1;44725:15;44759:4;44756:1;44749:15;44776:180;44824:77;44821:1;44814:88;44921:4;44918:1;44911:15;44945:4;44942:1;44935:15;44962:180;45010:77;45007:1;45000:88;45107:4;45104:1;45097:15;45131:4;45128:1;45121:15;45148:102;;45240:2;45236:7;45231:2;45224:5;45220:14;45216:28;45206:38;;45196:54;;;:::o;45256:122::-;45329:24;45347:5;45329:24;:::i;:::-;45322:5;45319:35;45309:2;;45368:1;45365;45358:12;45309:2;45299:79;:::o;45384:116::-;45454:21;45469:5;45454:21;:::i;:::-;45447:5;45444:32;45434:2;;45490:1;45487;45480:12;45434:2;45424:76;:::o;45506:120::-;45578:23;45595:5;45578:23;:::i;:::-;45571:5;45568:34;45558:2;;45616:1;45613;45606:12;45558:2;45548:78;:::o;45632:122::-;45705:24;45723:5;45705:24;:::i;:::-;45698:5;45695:35;45685:2;;45744:1;45741;45734:12;45685:2;45675:79;:::o

Swarm Source

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