Token CRO CROW PUNK

Overview CRC721

Total Supply:
2,934 CROWPUNK

Holders:
451 addresses
Balance
2 CROWPUNK
0xd156f87ea9f25b7820582b460553ee621eddc258
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CROWPUNK

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 5 of 21: CROWPUNK.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./CROCROW.sol";
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./ERC2981PerTokenRoyalties.sol";
import "./Context.sol";
import "./Counters.sol";

contract CROWPUNK is
    Context,
    Ownable,
    ERC721Enumerable,
    ERC2981PerTokenRoyalties
{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdTracker;
    
    bool public tokenURIFrozen = false;
    string private baseTokenURI;
    uint256 public max = 3500;
    bool public mintStarted = false;

    address public punkAddress = 0x13d13e2410A34Bfe5502D50ea4FCFBd591D7589E;
    address public crowAddress = 0xE4ab77ED89528d90E6bcf0E1Ac99C58Da24e79d5;
    ERC721 private punks;
    CROCROW private crows;

    mapping(uint256 => bool) private crowUsed;

    constructor(
        string memory name,
        string memory symbol,
        string memory uri
    ) ERC721(name, symbol) {
        baseTokenURI = uri;
        _tokenIdTracker.increment();
        punks = ERC721(punkAddress);
        crows = CROCROW(crowAddress);
    }
    
    function mint(uint256 id1, uint256 id2) public {
        require(mintStarted == true, "Mint not started");
        require(!crowUsed[id1], "Crow 1 already used");
        require(_msgSender() == crows.ownerOf(id1), "Crow 1 not owned");
        crowUsed[id1] = true;
        require(!crowUsed[id2], "Crow 2 already used");
        require(_msgSender() == crows.ownerOf(id2), "Crow 2 not owned");
        crowUsed[id2] = true;
        require(punks.balanceOf(_msgSender()) > 0, "Need to own at least one Punk");
        require(_tokenIdTracker.current() <= max, "Collection max size has been reached");
        _safeMint(_msgSender(), _tokenIdTracker.current());
        _setTokenRoyalty(_tokenIdTracker.current(), owner(), 700);
        _tokenIdTracker.increment();
    }

    function updateRoyalty(uint256 id, address recipient, uint256 amount) public onlyOwner{
        _setTokenRoyalty(id, recipient, amount);
    }
    
    function setBaseTokenURI(string memory uri) public onlyOwner {
        require(tokenURIFrozen == false, "Token URIs are frozen");
        baseTokenURI = uri;
    }
    
    function freezeBaseURI() public onlyOwner {
        tokenURIFrozen = true;
    }
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }
    
    function startMint() public onlyOwner {
        mintStarted = true;
    }

    function isCrowUsed(uint256 tokenId) public view returns (bool) {
        require(0 < tokenId && tokenId < max, "Token out of range");
        return crowUsed[tokenId];
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function availableCrows(address _owner) public view returns (uint256[] memory, bool[] memory) {
        uint256 ownerTokenCount = crows.balanceOf(_owner);
        uint256[] memory tokenIds = crows.walletOfOwner(_owner);
        bool[] memory availableArray = new bool[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            availableArray[i] = crowUsed[tokenIds[i]];
        }
        return (tokenIds, availableArray);
    }

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

File 1 of 21: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 21: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 3 of 21: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 4 of 21: CROCROW.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./Context.sol";
import "./Counters.sol";
import "./IERC20.sol";

contract CROCROW is
    Context,
    Ownable,
    ERC721Enumerable,
    ERC721Burnable
{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdTracker;

    string private _baseTokenURI;
    string private _contractURI;
    uint256 public max = 7777;
    uint256 public maxMintPerTx = 20;
    uint256 public maxMintPerTxWL = 4;

    mapping(address => bool) whitelist;

    bool public publicSaleStarted = false;

    bool public tokenURIFrozen = false;
    uint256 public cost = 100 ether;
    
    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI,
        uint256 reserved,
        address[] memory _address
    ) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;
        _tokenIdTracker.increment();
        
        for (uint256 i = 1; i <= reserved; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
        
        uint256 count = _address.length;
        for (uint256 i = 0; i < count; i++){
            whitelist[_address[i]] = true;
        }
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }
    
    function adminMint(uint256 _mintAmount) public onlyOwner{
        for (uint256 i = 1; i <= _mintAmount; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
    }
    function whitelistMint(uint256 _mintAmount) public payable {
        require(whitelist[_msgSender()] == true, "User is not whitelisted");
        require(_mintAmount <= maxMintPerTxWL, "Exceeds max amount per WL mint");
        require(msg.value >= cost * _mintAmount, "Not enough ether provided");
        for (uint256 i = 1; i <= _mintAmount; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
        whitelist[_msgSender()] = false;
    }
    function mint(uint256 _mintAmount) public payable {
        require(publicSaleStarted == true, "Public Sale not started yet");
        require(_mintAmount <= maxMintPerTx, "Exceeds max amount per mint");
        require(msg.value >= cost * _mintAmount, "Not enough ether provided");
        for (uint256 i = 1; i <= _mintAmount; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
    }
    function withdraw(address token, uint256 amount) public onlyOwner {
        if(token == address(0)) { 
            payable(_msgSender()).transfer(amount);
        } else {
            IERC20(token).transfer(_msgSender(), amount);
        }
    }
    
    function setContractURI(string memory uri) public onlyOwner {
        require(tokenURIFrozen == false, "Token URIs are frozen");
        _contractURI = uri;
    }
    function setBaseTokenURI(string memory uri) public onlyOwner {
        require(tokenURIFrozen == false, "Token URIs are frozen");
        _baseTokenURI = uri;
    }
    
    function setCost(uint256 price) public onlyOwner {
        cost = price;
    }
    
    function freezeBaseURI() public onlyOwner {
        tokenURIFrozen = true;
    }
    
    function startPublicSale() public onlyOwner {
        publicSaleStarted = true;
    }
    
    function setWL(address[] memory _address) public onlyOwner {
        uint256 count = _address.length;
        for (uint256 i = 0; i < count; i++){
            whitelist[_address[i]] = true;
        }
    }

    function isWhitelisted(address _address) public view returns(bool) {
        return whitelist[_address];
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

File 6 of 21: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 7 of 21: ERC2981PerTokenRoyalties.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC165.sol";
import "./IERC2981Royalties.sol";

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981PerTokenRoyalties is ERC165, IERC2981Royalties {
    struct Royalty {
        address recipient;
        uint256 value;
    }

    mapping(uint256 => Royalty) internal _royalties;

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev Sets token royalties
    /// @param id the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 id,
        address recipient,
        uint256 value
    ) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");

        _royalties[id] = Royalty(recipient, value);
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        Royalty memory royalty = _royalties[tokenId];
        return (royalty.recipient, (value * royalty.value) / 10000);
    }
}

File 8 of 21: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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(to).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 9 of 21: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

File 10 of 21: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 11 of 21: ERC721Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Pausable.sol";

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 14 of 21: IERC2981Royalties.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @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 _value - 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 value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

File 15 of 21: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 16 of 21: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.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 17 of 21: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 18 of 21: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 19 of 21: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.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 20 of 21: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

File 21 of 21: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"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":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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"availableCrows","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crowAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"tokenId","type":"uint256"}],"name":"isCrowUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id1","type":"uint256"},{"internalType":"uint256","name":"id2","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","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":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"tokenURIFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60806040526000600d60006101000a81548160ff021916908315150217905550610dac600f556000601060006101000a81548160ff0219169083151502179055507313d13e2410a34bfe5502d50ea4fcfbd591d7589e601060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e4ab77ed89528d90e6bcf0e1ac99c58da24e79d5601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f757600080fd5b50604051620054c8380380620054c883398181016040528101906200011d919062000482565b82826200013f620001336200027260201b60201c565b6200027a60201b60201c565b81600190805190602001906200015792919062000354565b5080600290805190602001906200017092919062000354565b50505080600e90805190602001906200018b92919062000354565b50620001a3600c6200033e60201b62001d831760201c565b601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620006bf565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8280546200036290620005d0565b90600052602060002090601f016020900481019282620003865760008555620003d2565b82601f10620003a157805160ff1916838001178555620003d2565b82800160010185558215620003d2579182015b82811115620003d1578251825591602001919060010190620003b4565b5b509050620003e19190620003e5565b5090565b5b8082111562000400576000816000905550600101620003e6565b5090565b60006200041b620004158462000564565b6200053b565b9050828152602081018484840111156200043a57620004396200069f565b5b620004478482856200059a565b509392505050565b600082601f8301126200046757620004666200069a565b5b81516200047984826020860162000404565b91505092915050565b6000806000606084860312156200049e576200049d620006a9565b5b600084015167ffffffffffffffff811115620004bf57620004be620006a4565b5b620004cd868287016200044f565b935050602084015167ffffffffffffffff811115620004f157620004f0620006a4565b5b620004ff868287016200044f565b925050604084015167ffffffffffffffff811115620005235762000522620006a4565b5b62000531868287016200044f565b9150509250925092565b6000620005476200055a565b905062000555828262000606565b919050565b6000604051905090565b600067ffffffffffffffff8211156200058257620005816200066b565b5b6200058d82620006ae565b9050602081019050919050565b60005b83811015620005ba5780820151818401526020810190506200059d565b83811115620005ca576000848401525b50505050565b60006002820490506001821680620005e957607f821691505b602082108114156200060057620005ff6200063c565b5b50919050565b6200061182620006ae565b810181811067ffffffffffffffff821117156200063357620006326200066b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b614df980620006cf6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636ac5db191161011a578063afa69e1a116100ad578063c87b56dd1161007c578063c87b56dd146105c8578063d59cf26c146105f8578063e7bc820814610614578063e985e9c51461061e578063f2fde38b1461064e576101fb565b8063afa69e1a1461053f578063b88d4fde14610570578063b9aba48d1461058c578063c29de630146105aa576101fb565b80638da5cb5b116100e95780638da5cb5b146104c957806395d89b41146104e7578063a22cb46514610505578063a9722cf314610521576101fb565b80636ac5db191461045357806370a0823114610471578063715018a6146104a15780638c03c974146104ab576101fb565b80632be0956111610192578063438b630011610161578063438b6300146103935780634f6ccce7146103c35780635006008e146103f35780636352211e14610423576101fb565b80632be09561146103215780632f745c591461032b57806330176e131461035b57806342842e0e14610377576101fb565b806318160ddd116101ce57806318160ddd1461029a5780631b2ef1ca146102b857806323b872dd146102d45780632a55205a146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a6004803603810190610215919061353a565b61066a565b6040516102279190613d85565b60405180910390f35b61023861067c565b6040516102459190613da0565b60405180910390f35b610268600480360381019061026391906135dd565b61070e565b6040516102759190613c9c565b60405180910390f35b610298600480360381019061029391906134b1565b610793565b005b6102a26108ab565b6040516102af9190614142565b60405180910390f35b6102d260048036038101906102cd919061368a565b6108b8565b005b6102ee60048036038101906102e9919061339b565b610ded565b005b61030a6004803603810190610305919061368a565b610e4d565b604051610318929190613d03565b60405180910390f35b610329610f00565b005b610345600480360381019061034091906134b1565b610f99565b6040516103529190614142565b60405180910390f35b61037560048036038101906103709190613594565b61103e565b005b610391600480360381019061038c919061339b565b61112a565b005b6103ad60048036038101906103a89190613301565b61114a565b6040516103ba9190613d2c565b60405180910390f35b6103dd60048036038101906103d891906135dd565b6111f8565b6040516103ea9190614142565b60405180910390f35b61040d600480360381019061040891906135dd565b611269565b60405161041a9190613d85565b60405180910390f35b61043d600480360381019061043891906135dd565b6112e3565b60405161044a9190613c9c565b60405180910390f35b61045b611395565b6040516104689190614142565b60405180910390f35b61048b60048036038101906104869190613301565b61139b565b6040516104989190614142565b60405180910390f35b6104a9611453565b005b6104b36114db565b6040516104c09190613c9c565b60405180910390f35b6104d1611501565b6040516104de9190613c9c565b60405180910390f35b6104ef61152a565b6040516104fc9190613da0565b60405180910390f35b61051f600480360381019061051a9190613471565b6115bc565b005b61052961173d565b6040516105369190613d85565b60405180910390f35b61055960048036038101906105549190613301565b611750565b604051610567929190613d4e565b60405180910390f35b61058a600480360381019061058591906133ee565b611990565b005b6105946119f2565b6040516105a19190613c9c565b60405180910390f35b6105b2611a18565b6040516105bf9190613d85565b60405180910390f35b6105e260048036038101906105dd91906135dd565b611a2b565b6040516105ef9190613da0565b60405180910390f35b610612600480360381019061060d9190613637565b611ad2565b005b61061c611b5e565b005b6106386004803603810190610633919061335b565b611bf7565b6040516106459190613d85565b60405180910390f35b61066860048036038101906106639190613301565b611c8b565b005b600061067582611d99565b9050919050565b60606001805461068b90614490565b80601f01602080910402602001604051908101604052809291908181526020018280546106b790614490565b80156107045780601f106106d957610100808354040283529160200191610704565b820191906000526020600020905b8154815290600101906020018083116106e757829003601f168201915b5050505050905090565b600061071982611e13565b610758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074f90613fc2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079e826112e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561080f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080690614062565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082e611e7f565b73ffffffffffffffffffffffffffffffffffffffff16148061085d575061085c81610857611e7f565b611bf7565b5b61089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390613f22565b60405180910390fd5b6108a68383611e87565b505050565b6000600980549050905090565b60011515601060009054906101000a900460ff1615151461090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590613ec2565b60405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff161561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690614102565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109ca9190614142565b60206040518083038186803b1580156109e257600080fd5b505afa1580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a919061332e565b73ffffffffffffffffffffffffffffffffffffffff16610a38611e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8590613e62565b60405180910390fd5b60016014600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506014600082815260200190815260200160002060009054906101000a900460ff1615610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290613f02565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b8152600401610b769190614142565b60206040518083038186803b158015610b8e57600080fd5b505afa158015610ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc6919061332e565b73ffffffffffffffffffffffffffffffffffffffff16610be4611e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c31906140e2565b60405180910390fd5b60016014600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610cae611e7f565b6040518263ffffffff1660e01b8152600401610cca9190613c9c565b60206040518083038186803b158015610ce257600080fd5b505afa158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a919061360a565b11610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614122565b60405180910390fd5b600f54610d67600c611f40565b1115610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90613fa2565b60405180910390fd5b610dc2610db3611e7f565b610dbd600c611f40565b611f4e565b610ddf610dcf600c611f40565b610dd7611501565b6102bc611f6c565b610de9600c611d83565b5050565b610dfe610df8611e7f565b82612048565b610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3490614082565b60405180910390fd5b610e48838383612126565b505050565b6000806000600b60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505090508060000151612710826020015186610eea919061434c565b610ef4919061431b565b92509250509250929050565b610f08611e7f565b73ffffffffffffffffffffffffffffffffffffffff16610f26611501565b73ffffffffffffffffffffffffffffffffffffffff1614610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613fe2565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6000610fa48361139b565b8210610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc90613de2565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611046611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611064611501565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190613fe2565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611107906140a2565b60405180910390fd5b80600e908051906020019061112692919061304d565b5050565b61114583838360405180602001604052806000815250611990565b505050565b606060006111578361139b565b905060008167ffffffffffffffff81111561117557611174614658565b5b6040519080825280602002602001820160405280156111a35781602001602082028036833780820191505090505b50905060005b828110156111ed576111bb8582610f99565b8282815181106111ce576111cd614629565b5b60200260200101818152505080806111e5906144f3565b9150506111a9565b508092505050919050565b60006112026108ab565b8210611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a906140c2565b60405180910390fd5b6009828154811061125757611256614629565b5b90600052602060002001549050919050565b600081600010801561127c5750600f5482105b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614042565b60405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390613f62565b60405180910390fd5b80915050919050565b600f5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613f42565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61145b611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611479611501565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613fe2565b60405180910390fd5b6114d96000612382565b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461153990614490565b80601f016020809104026020016040519081016040528092919081815260200182805461156590614490565b80156115b25780601f10611587576101008083540402835291602001916115b2565b820191906000526020600020905b81548152906001019060200180831161159557829003601f168201915b5050505050905090565b6115c4611e7f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990613ea2565b60405180910390fd5b806006600061163f611e7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116ec611e7f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117319190613d85565b60405180910390a35050565b601060009054906101000a900460ff1681565b6060806000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016117b09190613c9c565b60206040518083038186803b1580156117c857600080fd5b505afa1580156117dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611800919061360a565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300866040518263ffffffff1660e01b815260040161185f9190613c9c565b60006040518083038186803b15801561187757600080fd5b505afa15801561188b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b491906134f1565b905060008267ffffffffffffffff8111156118d2576118d1614658565b5b6040519080825280602002602001820160405280156119005781602001602082028036833780820191505090505b50905060005b83811015611981576014600084838151811061192557611924614629565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1682828151811061195c5761195b614629565b5b6020026020010190151590811515815250508080611979906144f3565b915050611906565b50818194509450505050915091565b6119a161199b611e7f565b83612048565b6119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790614082565b60405180910390fd5b6119ec84848484612446565b50505050565b601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900460ff1681565b6060611a3682611e13565b611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c90614022565b60405180910390fd5b6000611a7f6124a2565b90506000815111611a9f5760405180602001604052806000815250611aca565b80611aa984612534565b604051602001611aba929190613c78565b6040516020818303038152906040525b915050919050565b611ada611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611af8611501565b73ffffffffffffffffffffffffffffffffffffffff1614611b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4590613fe2565b60405180910390fd5b611b59838383611f6c565b505050565b611b66611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611b84611501565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd190613fe2565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c93611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611cb1611501565b73ffffffffffffffffffffffffffffffffffffffff1614611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90613fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e90613e22565b60405180910390fd5b611d8081612382565b50565b6001816000016000828254019250508190555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e0c5750611e0b82612695565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611efa836112e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b611f6882826040518060200160405280600081525061270f565b5050565b612710811115611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890613dc2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200182815250600b600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050505050565b600061205382611e13565b612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613ee2565b60405180910390fd5b600061209d836112e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061210c57508373ffffffffffffffffffffffffffffffffffffffff166120f48461070e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061211d575061211c8185611bf7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612146826112e3565b73ffffffffffffffffffffffffffffffffffffffff161461219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390614002565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613e82565b60405180910390fd5b61221783838361276a565b612222600082611e87565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227291906143a6565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c991906142c5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612451848484612126565b61245d8484848461287e565b61249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249390613e02565b60405180910390fd5b50505050565b6060600e80546124b190614490565b80601f01602080910402602001604051908101604052809291908181526020018280546124dd90614490565b801561252a5780601f106124ff5761010080835404028352916020019161252a565b820191906000526020600020905b81548152906001019060200180831161250d57829003601f168201915b5050505050905090565b6060600082141561257c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612690565b600082905060005b600082146125ae578080612597906144f3565b915050600a826125a7919061431b565b9150612584565b60008167ffffffffffffffff8111156125ca576125c9614658565b5b6040519080825280601f01601f1916602001820160405280156125fc5781602001600182028036833780820191505090505b5090505b600085146126895760018261261591906143a6565b9150600a85612624919061453c565b603061263091906142c5565b60f81b81838151811061264657612645614629565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612682919061431b565b9450612600565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612708575061270782612a15565b5b9050919050565b6127198383612af7565b612726600084848461287e565b612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90613e02565b60405180910390fd5b505050565b612775838383612cc5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127b8576127b381612cca565b6127f7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127f6576127f58382612d13565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561283a5761283581612e80565b612879565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612878576128778282612f51565b5b5b505050565b600061289f8473ffffffffffffffffffffffffffffffffffffffff16612fd0565b15612a08578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c8611e7f565b8786866040518563ffffffff1660e01b81526004016128ea9493929190613cb7565b602060405180830381600087803b15801561290457600080fd5b505af192505050801561293557506040513d601f19601f820116820180604052508101906129329190613567565b60015b6129b8573d8060008114612965576040519150601f19603f3d011682016040523d82523d6000602084013e61296a565b606091505b506000815114156129b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a790613e02565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a0d565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612af05750612aef82612fe3565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5e90613f82565b60405180910390fd5b612b7081611e13565b15612bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba790613e42565b60405180910390fd5b612bbc6000838361276a565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c0c91906142c5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d208461139b565b612d2a91906143a6565b9050600060086000848152602001908152602001600020549050818114612e0f576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e9491906143a6565b90506000600a6000848152602001908152602001600020549050600060098381548110612ec457612ec3614629565b5b906000526020600020015490508060098381548110612ee657612ee5614629565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f3557612f346145fa565b5b6001900381819060005260206000200160009055905550505050565b6000612f5c8361139b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461305990614490565b90600052602060002090601f01602090048101928261307b57600085556130c2565b82601f1061309457805160ff19168380011785556130c2565b828001600101855582156130c2579182015b828111156130c15782518255916020019190600101906130a6565b5b5090506130cf91906130d3565b5090565b5b808211156130ec5760008160009055506001016130d4565b5090565b60006131036130fe84614182565b61415d565b905080838252602082019050828560208602820111156131265761312561468c565b5b60005b85811015613156578161313c88826132ec565b845260208401935060208301925050600181019050613129565b5050509392505050565b600061317361316e846141ae565b61415d565b90508281526020810184848401111561318f5761318e614691565b5b61319a84828561444e565b509392505050565b60006131b56131b0846141df565b61415d565b9050828152602081018484840111156131d1576131d0614691565b5b6131dc84828561444e565b509392505050565b6000813590506131f381614d67565b92915050565b60008151905061320881614d67565b92915050565b600082601f83011261322357613222614687565b5b81516132338482602086016130f0565b91505092915050565b60008135905061324b81614d7e565b92915050565b60008135905061326081614d95565b92915050565b60008151905061327581614d95565b92915050565b600082601f8301126132905761328f614687565b5b81356132a0848260208601613160565b91505092915050565b600082601f8301126132be576132bd614687565b5b81356132ce8482602086016131a2565b91505092915050565b6000813590506132e681614dac565b92915050565b6000815190506132fb81614dac565b92915050565b6000602082840312156133175761331661469b565b5b6000613325848285016131e4565b91505092915050565b6000602082840312156133445761334361469b565b5b6000613352848285016131f9565b91505092915050565b600080604083850312156133725761337161469b565b5b6000613380858286016131e4565b9250506020613391858286016131e4565b9150509250929050565b6000806000606084860312156133b4576133b361469b565b5b60006133c2868287016131e4565b93505060206133d3868287016131e4565b92505060406133e4868287016132d7565b9150509250925092565b600080600080608085870312156134085761340761469b565b5b6000613416878288016131e4565b9450506020613427878288016131e4565b9350506040613438878288016132d7565b925050606085013567ffffffffffffffff81111561345957613458614696565b5b6134658782880161327b565b91505092959194509250565b600080604083850312156134885761348761469b565b5b6000613496858286016131e4565b92505060206134a78582860161323c565b9150509250929050565b600080604083850312156134c8576134c761469b565b5b60006134d6858286016131e4565b92505060206134e7858286016132d7565b9150509250929050565b6000602082840312156135075761350661469b565b5b600082015167ffffffffffffffff81111561352557613524614696565b5b6135318482850161320e565b91505092915050565b6000602082840312156135505761354f61469b565b5b600061355e84828501613251565b91505092915050565b60006020828403121561357d5761357c61469b565b5b600061358b84828501613266565b91505092915050565b6000602082840312156135aa576135a961469b565b5b600082013567ffffffffffffffff8111156135c8576135c7614696565b5b6135d4848285016132a9565b91505092915050565b6000602082840312156135f3576135f261469b565b5b6000613601848285016132d7565b91505092915050565b6000602082840312156136205761361f61469b565b5b600061362e848285016132ec565b91505092915050565b6000806000606084860312156136505761364f61469b565b5b600061365e868287016132d7565b935050602061366f868287016131e4565b9250506040613680868287016132d7565b9150509250925092565b600080604083850312156136a1576136a061469b565b5b60006136af858286016132d7565b92505060206136c0858286016132d7565b9150509250929050565b60006136d683836137c5565b60208301905092915050565b60006136ee8383613c5a565b60208301905092915050565b613703816143da565b82525050565b600061371482614230565b61371e8185614276565b935061372983614210565b8060005b8381101561375a57815161374188826136ca565b975061374c8361425c565b92505060018101905061372d565b5085935050505092915050565b60006137728261423b565b61377c8185614287565b935061378783614220565b8060005b838110156137b857815161379f88826136e2565b97506137aa83614269565b92505060018101905061378b565b5085935050505092915050565b6137ce816143ec565b82525050565b6137dd816143ec565b82525050565b60006137ee82614246565b6137f88185614298565b935061380881856020860161445d565b613811816146a0565b840191505092915050565b600061382782614251565b61383181856142a9565b935061384181856020860161445d565b61384a816146a0565b840191505092915050565b600061386082614251565b61386a81856142ba565b935061387a81856020860161445d565b80840191505092915050565b6000613893601a836142a9565b915061389e826146b1565b602082019050919050565b60006138b6602b836142a9565b91506138c1826146da565b604082019050919050565b60006138d96032836142a9565b91506138e482614729565b604082019050919050565b60006138fc6026836142a9565b915061390782614778565b604082019050919050565b600061391f601c836142a9565b915061392a826147c7565b602082019050919050565b60006139426010836142a9565b915061394d826147f0565b602082019050919050565b60006139656024836142a9565b915061397082614819565b604082019050919050565b60006139886019836142a9565b915061399382614868565b602082019050919050565b60006139ab6010836142a9565b91506139b682614891565b602082019050919050565b60006139ce602c836142a9565b91506139d9826148ba565b604082019050919050565b60006139f16013836142a9565b91506139fc82614909565b602082019050919050565b6000613a146038836142a9565b9150613a1f82614932565b604082019050919050565b6000613a37602a836142a9565b9150613a4282614981565b604082019050919050565b6000613a5a6029836142a9565b9150613a65826149d0565b604082019050919050565b6000613a7d6020836142a9565b9150613a8882614a1f565b602082019050919050565b6000613aa06024836142a9565b9150613aab82614a48565b604082019050919050565b6000613ac3602c836142a9565b9150613ace82614a97565b604082019050919050565b6000613ae66020836142a9565b9150613af182614ae6565b602082019050919050565b6000613b096029836142a9565b9150613b1482614b0f565b604082019050919050565b6000613b2c602f836142a9565b9150613b3782614b5e565b604082019050919050565b6000613b4f6012836142a9565b9150613b5a82614bad565b602082019050919050565b6000613b726021836142a9565b9150613b7d82614bd6565b604082019050919050565b6000613b956031836142a9565b9150613ba082614c25565b604082019050919050565b6000613bb86015836142a9565b9150613bc382614c74565b602082019050919050565b6000613bdb602c836142a9565b9150613be682614c9d565b604082019050919050565b6000613bfe6010836142a9565b9150613c0982614cec565b602082019050919050565b6000613c216013836142a9565b9150613c2c82614d15565b602082019050919050565b6000613c44601d836142a9565b9150613c4f82614d3e565b602082019050919050565b613c6381614444565b82525050565b613c7281614444565b82525050565b6000613c848285613855565b9150613c908284613855565b91508190509392505050565b6000602082019050613cb160008301846136fa565b92915050565b6000608082019050613ccc60008301876136fa565b613cd960208301866136fa565b613ce66040830185613c69565b8181036060830152613cf881846137e3565b905095945050505050565b6000604082019050613d1860008301856136fa565b613d256020830184613c69565b9392505050565b60006020820190508181036000830152613d468184613767565b905092915050565b60006040820190508181036000830152613d688185613767565b90508181036020830152613d7c8184613709565b90509392505050565b6000602082019050613d9a60008301846137d4565b92915050565b60006020820190508181036000830152613dba818461381c565b905092915050565b60006020820190508181036000830152613ddb81613886565b9050919050565b60006020820190508181036000830152613dfb816138a9565b9050919050565b60006020820190508181036000830152613e1b816138cc565b9050919050565b60006020820190508181036000830152613e3b816138ef565b9050919050565b60006020820190508181036000830152613e5b81613912565b9050919050565b60006020820190508181036000830152613e7b81613935565b9050919050565b60006020820190508181036000830152613e9b81613958565b9050919050565b60006020820190508181036000830152613ebb8161397b565b9050919050565b60006020820190508181036000830152613edb8161399e565b9050919050565b60006020820190508181036000830152613efb816139c1565b9050919050565b60006020820190508181036000830152613f1b816139e4565b9050919050565b60006020820190508181036000830152613f3b81613a07565b9050919050565b60006020820190508181036000830152613f5b81613a2a565b9050919050565b60006020820190508181036000830152613f7b81613a4d565b9050919050565b60006020820190508181036000830152613f9b81613a70565b9050919050565b60006020820190508181036000830152613fbb81613a93565b9050919050565b60006020820190508181036000830152613fdb81613ab6565b9050919050565b60006020820190508181036000830152613ffb81613ad9565b9050919050565b6000602082019050818103600083015261401b81613afc565b9050919050565b6000602082019050818103600083015261403b81613b1f565b9050919050565b6000602082019050818103600083015261405b81613b42565b9050919050565b6000602082019050818103600083015261407b81613b65565b9050919050565b6000602082019050818103600083015261409b81613b88565b9050919050565b600060208201905081810360008301526140bb81613bab565b9050919050565b600060208201905081810360008301526140db81613bce565b9050919050565b600060208201905081810360008301526140fb81613bf1565b9050919050565b6000602082019050818103600083015261411b81613c14565b9050919050565b6000602082019050818103600083015261413b81613c37565b9050919050565b60006020820190506141576000830184613c69565b92915050565b6000614167614178565b905061417382826144c2565b919050565b6000604051905090565b600067ffffffffffffffff82111561419d5761419c614658565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141c9576141c8614658565b5b6141d2826146a0565b9050602081019050919050565b600067ffffffffffffffff8211156141fa576141f9614658565b5b614203826146a0565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142d082614444565b91506142db83614444565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143105761430f61456d565b5b828201905092915050565b600061432682614444565b915061433183614444565b9250826143415761434061459c565b5b828204905092915050565b600061435782614444565b915061436283614444565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561439b5761439a61456d565b5b828202905092915050565b60006143b182614444565b91506143bc83614444565b9250828210156143cf576143ce61456d565b5b828203905092915050565b60006143e582614424565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561447b578082015181840152602081019050614460565b8381111561448a576000848401525b50505050565b600060028204905060018216806144a857607f821691505b602082108114156144bc576144bb6145cb565b5b50919050565b6144cb826146a0565b810181811067ffffffffffffffff821117156144ea576144e9614658565b5b80604052505050565b60006144fe82614444565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145315761453061456d565b5b600182019050919050565b600061454782614444565b915061455283614444565b9250826145625761456161459c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43726f772031206e6f74206f776e656400000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d696e74206e6f74207374617274656400000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43726f77203220616c7265616479207573656400000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6c6c656374696f6e206d61782073697a6520686173206265656e2072656160008201527f6368656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546f6b656e206f7574206f662072616e67650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546f6b656e2055524973206172652066726f7a656e0000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43726f772032206e6f74206f776e656400000000000000000000000000000000600082015250565b7f43726f77203120616c7265616479207573656400000000000000000000000000600082015250565b7f4e65656420746f206f776e206174206c65617374206f6e652050756e6b000000600082015250565b614d70816143da565b8114614d7b57600080fd5b50565b614d87816143ec565b8114614d9257600080fd5b50565b614d9e816143f8565b8114614da957600080fd5b50565b614db581614444565b8114614dc057600080fd5b5056fea26469706673582212206786f3effa13b3855e6edf25f38d4048318437b7aa048e5e12b165b9719d0bf064736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d43524f2043524f572050554e4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000843524f5750554e4b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636ac5db191161011a578063afa69e1a116100ad578063c87b56dd1161007c578063c87b56dd146105c8578063d59cf26c146105f8578063e7bc820814610614578063e985e9c51461061e578063f2fde38b1461064e576101fb565b8063afa69e1a1461053f578063b88d4fde14610570578063b9aba48d1461058c578063c29de630146105aa576101fb565b80638da5cb5b116100e95780638da5cb5b146104c957806395d89b41146104e7578063a22cb46514610505578063a9722cf314610521576101fb565b80636ac5db191461045357806370a0823114610471578063715018a6146104a15780638c03c974146104ab576101fb565b80632be0956111610192578063438b630011610161578063438b6300146103935780634f6ccce7146103c35780635006008e146103f35780636352211e14610423576101fb565b80632be09561146103215780632f745c591461032b57806330176e131461035b57806342842e0e14610377576101fb565b806318160ddd116101ce57806318160ddd1461029a5780631b2ef1ca146102b857806323b872dd146102d45780632a55205a146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a6004803603810190610215919061353a565b61066a565b6040516102279190613d85565b60405180910390f35b61023861067c565b6040516102459190613da0565b60405180910390f35b610268600480360381019061026391906135dd565b61070e565b6040516102759190613c9c565b60405180910390f35b610298600480360381019061029391906134b1565b610793565b005b6102a26108ab565b6040516102af9190614142565b60405180910390f35b6102d260048036038101906102cd919061368a565b6108b8565b005b6102ee60048036038101906102e9919061339b565b610ded565b005b61030a6004803603810190610305919061368a565b610e4d565b604051610318929190613d03565b60405180910390f35b610329610f00565b005b610345600480360381019061034091906134b1565b610f99565b6040516103529190614142565b60405180910390f35b61037560048036038101906103709190613594565b61103e565b005b610391600480360381019061038c919061339b565b61112a565b005b6103ad60048036038101906103a89190613301565b61114a565b6040516103ba9190613d2c565b60405180910390f35b6103dd60048036038101906103d891906135dd565b6111f8565b6040516103ea9190614142565b60405180910390f35b61040d600480360381019061040891906135dd565b611269565b60405161041a9190613d85565b60405180910390f35b61043d600480360381019061043891906135dd565b6112e3565b60405161044a9190613c9c565b60405180910390f35b61045b611395565b6040516104689190614142565b60405180910390f35b61048b60048036038101906104869190613301565b61139b565b6040516104989190614142565b60405180910390f35b6104a9611453565b005b6104b36114db565b6040516104c09190613c9c565b60405180910390f35b6104d1611501565b6040516104de9190613c9c565b60405180910390f35b6104ef61152a565b6040516104fc9190613da0565b60405180910390f35b61051f600480360381019061051a9190613471565b6115bc565b005b61052961173d565b6040516105369190613d85565b60405180910390f35b61055960048036038101906105549190613301565b611750565b604051610567929190613d4e565b60405180910390f35b61058a600480360381019061058591906133ee565b611990565b005b6105946119f2565b6040516105a19190613c9c565b60405180910390f35b6105b2611a18565b6040516105bf9190613d85565b60405180910390f35b6105e260048036038101906105dd91906135dd565b611a2b565b6040516105ef9190613da0565b60405180910390f35b610612600480360381019061060d9190613637565b611ad2565b005b61061c611b5e565b005b6106386004803603810190610633919061335b565b611bf7565b6040516106459190613d85565b60405180910390f35b61066860048036038101906106639190613301565b611c8b565b005b600061067582611d99565b9050919050565b60606001805461068b90614490565b80601f01602080910402602001604051908101604052809291908181526020018280546106b790614490565b80156107045780601f106106d957610100808354040283529160200191610704565b820191906000526020600020905b8154815290600101906020018083116106e757829003601f168201915b5050505050905090565b600061071982611e13565b610758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074f90613fc2565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079e826112e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561080f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080690614062565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082e611e7f565b73ffffffffffffffffffffffffffffffffffffffff16148061085d575061085c81610857611e7f565b611bf7565b5b61089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390613f22565b60405180910390fd5b6108a68383611e87565b505050565b6000600980549050905090565b60011515601060009054906101000a900460ff1615151461090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590613ec2565b60405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff161561096f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096690614102565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109ca9190614142565b60206040518083038186803b1580156109e257600080fd5b505afa1580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a919061332e565b73ffffffffffffffffffffffffffffffffffffffff16610a38611e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8590613e62565b60405180910390fd5b60016014600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506014600082815260200190815260200160002060009054906101000a900460ff1615610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290613f02565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b8152600401610b769190614142565b60206040518083038186803b158015610b8e57600080fd5b505afa158015610ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc6919061332e565b73ffffffffffffffffffffffffffffffffffffffff16610be4611e7f565b73ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c31906140e2565b60405180910390fd5b60016014600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610cae611e7f565b6040518263ffffffff1660e01b8152600401610cca9190613c9c565b60206040518083038186803b158015610ce257600080fd5b505afa158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a919061360a565b11610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614122565b60405180910390fd5b600f54610d67600c611f40565b1115610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f90613fa2565b60405180910390fd5b610dc2610db3611e7f565b610dbd600c611f40565b611f4e565b610ddf610dcf600c611f40565b610dd7611501565b6102bc611f6c565b610de9600c611d83565b5050565b610dfe610df8611e7f565b82612048565b610e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3490614082565b60405180910390fd5b610e48838383612126565b505050565b6000806000600b60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505090508060000151612710826020015186610eea919061434c565b610ef4919061431b565b92509250509250929050565b610f08611e7f565b73ffffffffffffffffffffffffffffffffffffffff16610f26611501565b73ffffffffffffffffffffffffffffffffffffffff1614610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613fe2565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6000610fa48361139b565b8210610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc90613de2565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611046611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611064611501565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190613fe2565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611107906140a2565b60405180910390fd5b80600e908051906020019061112692919061304d565b5050565b61114583838360405180602001604052806000815250611990565b505050565b606060006111578361139b565b905060008167ffffffffffffffff81111561117557611174614658565b5b6040519080825280602002602001820160405280156111a35781602001602082028036833780820191505090505b50905060005b828110156111ed576111bb8582610f99565b8282815181106111ce576111cd614629565b5b60200260200101818152505080806111e5906144f3565b9150506111a9565b508092505050919050565b60006112026108ab565b8210611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a906140c2565b60405180910390fd5b6009828154811061125757611256614629565b5b90600052602060002001549050919050565b600081600010801561127c5750600f5482105b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614042565b60405180910390fd5b6014600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138390613f62565b60405180910390fd5b80915050919050565b600f5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613f42565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61145b611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611479611501565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613fe2565b60405180910390fd5b6114d96000612382565b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461153990614490565b80601f016020809104026020016040519081016040528092919081815260200182805461156590614490565b80156115b25780601f10611587576101008083540402835291602001916115b2565b820191906000526020600020905b81548152906001019060200180831161159557829003601f168201915b5050505050905090565b6115c4611e7f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162990613ea2565b60405180910390fd5b806006600061163f611e7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116ec611e7f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117319190613d85565b60405180910390a35050565b601060009054906101000a900460ff1681565b6060806000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016117b09190613c9c565b60206040518083038186803b1580156117c857600080fd5b505afa1580156117dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611800919061360a565b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300866040518263ffffffff1660e01b815260040161185f9190613c9c565b60006040518083038186803b15801561187757600080fd5b505afa15801561188b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b491906134f1565b905060008267ffffffffffffffff8111156118d2576118d1614658565b5b6040519080825280602002602001820160405280156119005781602001602082028036833780820191505090505b50905060005b83811015611981576014600084838151811061192557611924614629565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1682828151811061195c5761195b614629565b5b6020026020010190151590811515815250508080611979906144f3565b915050611906565b50818194509450505050915091565b6119a161199b611e7f565b83612048565b6119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790614082565b60405180910390fd5b6119ec84848484612446565b50505050565b601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900460ff1681565b6060611a3682611e13565b611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c90614022565b60405180910390fd5b6000611a7f6124a2565b90506000815111611a9f5760405180602001604052806000815250611aca565b80611aa984612534565b604051602001611aba929190613c78565b6040516020818303038152906040525b915050919050565b611ada611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611af8611501565b73ffffffffffffffffffffffffffffffffffffffff1614611b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4590613fe2565b60405180910390fd5b611b59838383611f6c565b505050565b611b66611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611b84611501565b73ffffffffffffffffffffffffffffffffffffffff1614611bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd190613fe2565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c93611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611cb1611501565b73ffffffffffffffffffffffffffffffffffffffff1614611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90613fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e90613e22565b60405180910390fd5b611d8081612382565b50565b6001816000016000828254019250508190555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e0c5750611e0b82612695565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611efa836112e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b611f6882826040518060200160405280600081525061270f565b5050565b612710811115611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890613dc2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200182815250600b600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050505050565b600061205382611e13565b612092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208990613ee2565b60405180910390fd5b600061209d836112e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061210c57508373ffffffffffffffffffffffffffffffffffffffff166120f48461070e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061211d575061211c8185611bf7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612146826112e3565b73ffffffffffffffffffffffffffffffffffffffff161461219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390614002565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613e82565b60405180910390fd5b61221783838361276a565b612222600082611e87565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227291906143a6565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c991906142c5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612451848484612126565b61245d8484848461287e565b61249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249390613e02565b60405180910390fd5b50505050565b6060600e80546124b190614490565b80601f01602080910402602001604051908101604052809291908181526020018280546124dd90614490565b801561252a5780601f106124ff5761010080835404028352916020019161252a565b820191906000526020600020905b81548152906001019060200180831161250d57829003601f168201915b5050505050905090565b6060600082141561257c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612690565b600082905060005b600082146125ae578080612597906144f3565b915050600a826125a7919061431b565b9150612584565b60008167ffffffffffffffff8111156125ca576125c9614658565b5b6040519080825280601f01601f1916602001820160405280156125fc5781602001600182028036833780820191505090505b5090505b600085146126895760018261261591906143a6565b9150600a85612624919061453c565b603061263091906142c5565b60f81b81838151811061264657612645614629565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612682919061431b565b9450612600565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612708575061270782612a15565b5b9050919050565b6127198383612af7565b612726600084848461287e565b612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90613e02565b60405180910390fd5b505050565b612775838383612cc5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127b8576127b381612cca565b6127f7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127f6576127f58382612d13565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561283a5761283581612e80565b612879565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612878576128778282612f51565b5b5b505050565b600061289f8473ffffffffffffffffffffffffffffffffffffffff16612fd0565b15612a08578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c8611e7f565b8786866040518563ffffffff1660e01b81526004016128ea9493929190613cb7565b602060405180830381600087803b15801561290457600080fd5b505af192505050801561293557506040513d601f19601f820116820180604052508101906129329190613567565b60015b6129b8573d8060008114612965576040519150601f19603f3d011682016040523d82523d6000602084013e61296a565b606091505b506000815114156129b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a790613e02565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a0d565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ae057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612af05750612aef82612fe3565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5e90613f82565b60405180910390fd5b612b7081611e13565b15612bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba790613e42565b60405180910390fd5b612bbc6000838361276a565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c0c91906142c5565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d208461139b565b612d2a91906143a6565b9050600060086000848152602001908152602001600020549050818114612e0f576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e9491906143a6565b90506000600a6000848152602001908152602001600020549050600060098381548110612ec457612ec3614629565b5b906000526020600020015490508060098381548110612ee657612ee5614629565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f3557612f346145fa565b5b6001900381819060005260206000200160009055905550505050565b6000612f5c8361139b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461305990614490565b90600052602060002090601f01602090048101928261307b57600085556130c2565b82601f1061309457805160ff19168380011785556130c2565b828001600101855582156130c2579182015b828111156130c15782518255916020019190600101906130a6565b5b5090506130cf91906130d3565b5090565b5b808211156130ec5760008160009055506001016130d4565b5090565b60006131036130fe84614182565b61415d565b905080838252602082019050828560208602820111156131265761312561468c565b5b60005b85811015613156578161313c88826132ec565b845260208401935060208301925050600181019050613129565b5050509392505050565b600061317361316e846141ae565b61415d565b90508281526020810184848401111561318f5761318e614691565b5b61319a84828561444e565b509392505050565b60006131b56131b0846141df565b61415d565b9050828152602081018484840111156131d1576131d0614691565b5b6131dc84828561444e565b509392505050565b6000813590506131f381614d67565b92915050565b60008151905061320881614d67565b92915050565b600082601f83011261322357613222614687565b5b81516132338482602086016130f0565b91505092915050565b60008135905061324b81614d7e565b92915050565b60008135905061326081614d95565b92915050565b60008151905061327581614d95565b92915050565b600082601f8301126132905761328f614687565b5b81356132a0848260208601613160565b91505092915050565b600082601f8301126132be576132bd614687565b5b81356132ce8482602086016131a2565b91505092915050565b6000813590506132e681614dac565b92915050565b6000815190506132fb81614dac565b92915050565b6000602082840312156133175761331661469b565b5b6000613325848285016131e4565b91505092915050565b6000602082840312156133445761334361469b565b5b6000613352848285016131f9565b91505092915050565b600080604083850312156133725761337161469b565b5b6000613380858286016131e4565b9250506020613391858286016131e4565b9150509250929050565b6000806000606084860312156133b4576133b361469b565b5b60006133c2868287016131e4565b93505060206133d3868287016131e4565b92505060406133e4868287016132d7565b9150509250925092565b600080600080608085870312156134085761340761469b565b5b6000613416878288016131e4565b9450506020613427878288016131e4565b9350506040613438878288016132d7565b925050606085013567ffffffffffffffff81111561345957613458614696565b5b6134658782880161327b565b91505092959194509250565b600080604083850312156134885761348761469b565b5b6000613496858286016131e4565b92505060206134a78582860161323c565b9150509250929050565b600080604083850312156134c8576134c761469b565b5b60006134d6858286016131e4565b92505060206134e7858286016132d7565b9150509250929050565b6000602082840312156135075761350661469b565b5b600082015167ffffffffffffffff81111561352557613524614696565b5b6135318482850161320e565b91505092915050565b6000602082840312156135505761354f61469b565b5b600061355e84828501613251565b91505092915050565b60006020828403121561357d5761357c61469b565b5b600061358b84828501613266565b91505092915050565b6000602082840312156135aa576135a961469b565b5b600082013567ffffffffffffffff8111156135c8576135c7614696565b5b6135d4848285016132a9565b91505092915050565b6000602082840312156135f3576135f261469b565b5b6000613601848285016132d7565b91505092915050565b6000602082840312156136205761361f61469b565b5b600061362e848285016132ec565b91505092915050565b6000806000606084860312156136505761364f61469b565b5b600061365e868287016132d7565b935050602061366f868287016131e4565b9250506040613680868287016132d7565b9150509250925092565b600080604083850312156136a1576136a061469b565b5b60006136af858286016132d7565b92505060206136c0858286016132d7565b9150509250929050565b60006136d683836137c5565b60208301905092915050565b60006136ee8383613c5a565b60208301905092915050565b613703816143da565b82525050565b600061371482614230565b61371e8185614276565b935061372983614210565b8060005b8381101561375a57815161374188826136ca565b975061374c8361425c565b92505060018101905061372d565b5085935050505092915050565b60006137728261423b565b61377c8185614287565b935061378783614220565b8060005b838110156137b857815161379f88826136e2565b97506137aa83614269565b92505060018101905061378b565b5085935050505092915050565b6137ce816143ec565b82525050565b6137dd816143ec565b82525050565b60006137ee82614246565b6137f88185614298565b935061380881856020860161445d565b613811816146a0565b840191505092915050565b600061382782614251565b61383181856142a9565b935061384181856020860161445d565b61384a816146a0565b840191505092915050565b600061386082614251565b61386a81856142ba565b935061387a81856020860161445d565b80840191505092915050565b6000613893601a836142a9565b915061389e826146b1565b602082019050919050565b60006138b6602b836142a9565b91506138c1826146da565b604082019050919050565b60006138d96032836142a9565b91506138e482614729565b604082019050919050565b60006138fc6026836142a9565b915061390782614778565b604082019050919050565b600061391f601c836142a9565b915061392a826147c7565b602082019050919050565b60006139426010836142a9565b915061394d826147f0565b602082019050919050565b60006139656024836142a9565b915061397082614819565b604082019050919050565b60006139886019836142a9565b915061399382614868565b602082019050919050565b60006139ab6010836142a9565b91506139b682614891565b602082019050919050565b60006139ce602c836142a9565b91506139d9826148ba565b604082019050919050565b60006139f16013836142a9565b91506139fc82614909565b602082019050919050565b6000613a146038836142a9565b9150613a1f82614932565b604082019050919050565b6000613a37602a836142a9565b9150613a4282614981565b604082019050919050565b6000613a5a6029836142a9565b9150613a65826149d0565b604082019050919050565b6000613a7d6020836142a9565b9150613a8882614a1f565b602082019050919050565b6000613aa06024836142a9565b9150613aab82614a48565b604082019050919050565b6000613ac3602c836142a9565b9150613ace82614a97565b604082019050919050565b6000613ae66020836142a9565b9150613af182614ae6565b602082019050919050565b6000613b096029836142a9565b9150613b1482614b0f565b604082019050919050565b6000613b2c602f836142a9565b9150613b3782614b5e565b604082019050919050565b6000613b4f6012836142a9565b9150613b5a82614bad565b602082019050919050565b6000613b726021836142a9565b9150613b7d82614bd6565b604082019050919050565b6000613b956031836142a9565b9150613ba082614c25565b604082019050919050565b6000613bb86015836142a9565b9150613bc382614c74565b602082019050919050565b6000613bdb602c836142a9565b9150613be682614c9d565b604082019050919050565b6000613bfe6010836142a9565b9150613c0982614cec565b602082019050919050565b6000613c216013836142a9565b9150613c2c82614d15565b602082019050919050565b6000613c44601d836142a9565b9150613c4f82614d3e565b602082019050919050565b613c6381614444565b82525050565b613c7281614444565b82525050565b6000613c848285613855565b9150613c908284613855565b91508190509392505050565b6000602082019050613cb160008301846136fa565b92915050565b6000608082019050613ccc60008301876136fa565b613cd960208301866136fa565b613ce66040830185613c69565b8181036060830152613cf881846137e3565b905095945050505050565b6000604082019050613d1860008301856136fa565b613d256020830184613c69565b9392505050565b60006020820190508181036000830152613d468184613767565b905092915050565b60006040820190508181036000830152613d688185613767565b90508181036020830152613d7c8184613709565b90509392505050565b6000602082019050613d9a60008301846137d4565b92915050565b60006020820190508181036000830152613dba818461381c565b905092915050565b60006020820190508181036000830152613ddb81613886565b9050919050565b60006020820190508181036000830152613dfb816138a9565b9050919050565b60006020820190508181036000830152613e1b816138cc565b9050919050565b60006020820190508181036000830152613e3b816138ef565b9050919050565b60006020820190508181036000830152613e5b81613912565b9050919050565b60006020820190508181036000830152613e7b81613935565b9050919050565b60006020820190508181036000830152613e9b81613958565b9050919050565b60006020820190508181036000830152613ebb8161397b565b9050919050565b60006020820190508181036000830152613edb8161399e565b9050919050565b60006020820190508181036000830152613efb816139c1565b9050919050565b60006020820190508181036000830152613f1b816139e4565b9050919050565b60006020820190508181036000830152613f3b81613a07565b9050919050565b60006020820190508181036000830152613f5b81613a2a565b9050919050565b60006020820190508181036000830152613f7b81613a4d565b9050919050565b60006020820190508181036000830152613f9b81613a70565b9050919050565b60006020820190508181036000830152613fbb81613a93565b9050919050565b60006020820190508181036000830152613fdb81613ab6565b9050919050565b60006020820190508181036000830152613ffb81613ad9565b9050919050565b6000602082019050818103600083015261401b81613afc565b9050919050565b6000602082019050818103600083015261403b81613b1f565b9050919050565b6000602082019050818103600083015261405b81613b42565b9050919050565b6000602082019050818103600083015261407b81613b65565b9050919050565b6000602082019050818103600083015261409b81613b88565b9050919050565b600060208201905081810360008301526140bb81613bab565b9050919050565b600060208201905081810360008301526140db81613bce565b9050919050565b600060208201905081810360008301526140fb81613bf1565b9050919050565b6000602082019050818103600083015261411b81613c14565b9050919050565b6000602082019050818103600083015261413b81613c37565b9050919050565b60006020820190506141576000830184613c69565b92915050565b6000614167614178565b905061417382826144c2565b919050565b6000604051905090565b600067ffffffffffffffff82111561419d5761419c614658565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141c9576141c8614658565b5b6141d2826146a0565b9050602081019050919050565b600067ffffffffffffffff8211156141fa576141f9614658565b5b614203826146a0565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142d082614444565b91506142db83614444565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143105761430f61456d565b5b828201905092915050565b600061432682614444565b915061433183614444565b9250826143415761434061459c565b5b828204905092915050565b600061435782614444565b915061436283614444565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561439b5761439a61456d565b5b828202905092915050565b60006143b182614444565b91506143bc83614444565b9250828210156143cf576143ce61456d565b5b828203905092915050565b60006143e582614424565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561447b578082015181840152602081019050614460565b8381111561448a576000848401525b50505050565b600060028204905060018216806144a857607f821691505b602082108114156144bc576144bb6145cb565b5b50919050565b6144cb826146a0565b810181811067ffffffffffffffff821117156144ea576144e9614658565b5b80604052505050565b60006144fe82614444565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145315761453061456d565b5b600182019050919050565b600061454782614444565b915061455283614444565b9250826145625761456161459c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43726f772031206e6f74206f776e656400000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d696e74206e6f74207374617274656400000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43726f77203220616c7265616479207573656400000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6c6c656374696f6e206d61782073697a6520686173206265656e2072656160008201527f6368656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f546f6b656e206f7574206f662072616e67650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546f6b656e2055524973206172652066726f7a656e0000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43726f772032206e6f74206f776e656400000000000000000000000000000000600082015250565b7f43726f77203120616c7265616479207573656400000000000000000000000000600082015250565b7f4e65656420746f206f776e206174206c65617374206f6e652050756e6b000000600082015250565b614d70816143da565b8114614d7b57600080fd5b50565b614d87816143ec565b8114614d9257600080fd5b50565b614d9e816143f8565b8114614da957600080fd5b50565b614db581614444565b8114614dc057600080fd5b5056fea26469706673582212206786f3effa13b3855e6edf25f38d4048318437b7aa048e5e12b165b9719d0bf064736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d43524f2043524f572050554e4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000843524f5750554e4b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): CRO CROW PUNK
Arg [1] : symbol (string): CROWPUNK
Arg [2] : uri (string):

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [4] : 43524f2043524f572050554e4b00000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 43524f5750554e4b000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

265:3598:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3613:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1577:113:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1172:783:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4875:339:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1254:300:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2510:75:2;;;:::i;:::-;;1245:256:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2119:166:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5285:185:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2778:358:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1767:233:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2593:177:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:239:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;545:25:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:208:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:18;;;:::i;:::-;;695:71:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:87:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4278:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;577:31:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3144:461;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5541:328:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;617:71:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;470:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2770:334:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1963:144:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2297:82;;;:::i;:::-;;4644:164:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:18;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3613:247:2;3787:4;3816:36;3840:11;3816:23;:36::i;:::-;3809:43;;3613:247;;;:::o;2426:100:7:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3578:341;3508:411;;:::o;1577:113:9:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;1172:783:2:-;1253:4;1238:19;;:11;;;;;;;;;;;:19;;;1230:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1298:8;:13;1307:3;1298:13;;;;;;;;;;;;;;;;;;;;;1297:14;1289:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;1370:5;;;;;;;;;;;:13;;;1384:3;1370:18;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1354:34;;:12;:10;:12::i;:::-;:34;;;1346:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1436:4;1420:8;:13;1429:3;1420:13;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;1460:8;:13;1469:3;1460:13;;;;;;;;;;;;;;;;;;;;;1459:14;1451:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;1532:5;;;;;;;;;;;:13;;;1546:3;1532:18;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1516:34;;:12;:10;:12::i;:::-;:34;;;1508:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1598:4;1582:8;:13;1591:3;1582:13;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;1653:1;1621:5;;;;;;;;;;;:15;;;1637:12;:10;:12::i;:::-;1621:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;1613:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1736:3;;1707:25;:15;:23;:25::i;:::-;:32;;1699:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;1791:50;1801:12;:10;:12::i;:::-;1815:25;:15;:23;:25::i;:::-;1791:9;:50::i;:::-;1852:57;1869:25;:15;:23;:25::i;:::-;1896:7;:5;:7::i;:::-;1905:3;1852:16;:57::i;:::-;1920:27;:15;:25;:27::i;:::-;1172:783;;:::o;4875:339:7:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;1254:300:6:-;1375:16;1393:21;1432:22;1457:10;:19;1468:7;1457:19;;;;;;;;;;;1432:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1495:7;:17;;;1540:5;1523:7;:13;;;1515:5;:21;;;;:::i;:::-;1514:31;;;;:::i;:::-;1487:59;;;;;1254:300;;;;;:::o;2510:75:2:-;1230:12:18;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2573:4:2::1;2559:11;;:18;;;;;;;;;;;;;;;;;;2510:75::o:0;1245:256:9:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;2119:166:2:-;1230:12:18;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2217:5:2::1;2199:23;;:14;;;;;;;;;;;:23;;;2191:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2274:3;2259:12;:18;;;;;;;;;;;;:::i;:::-;;2119:166:::0;:::o;5285:185:7:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;2778:358:2:-;2838:16;2867:23;2893:17;2903:6;2893:9;:17::i;:::-;2867:43;;2921:25;2963:15;2949:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2921:58;;2995:9;2990:113;3010:15;3006:1;:19;2990:113;;;3061:30;3081:6;3089:1;3061:19;:30::i;:::-;3047:8;3056:1;3047:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;3027:3;;;;;:::i;:::-;;;;2990:113;;;;3120:8;3113:15;;;;2778:358;;;:::o;1767:233:9:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;:::i;:::-;;;;;;;;;;1968:24;;1767:233;;;:::o;2593:177:2:-;2651:4;2680:7;2676:1;:11;:28;;;;;2701:3;;2691:7;:13;2676:28;2668:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;2745:8;:17;2754:7;2745:17;;;;;;;;;;;;;;;;;;;;;2738:24;;2593:177;;;:::o;2120:239:7:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;545:25:2:-;;;;:::o;1850:208:7:-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:18:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;695:71:2:-;;;;;;;;;;;;;:::o;999:87:18:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;2595:104:7:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;4278:295::-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;577:31:2:-;;;;;;;;;;;;;:::o;3144:461::-;3205:16;3223:13;3249:23;3275:5;;;;;;;;;;;:15;;;3291:6;3275:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3249:49;;3309:25;3337:5;;;;;;;;;;;:19;;;3357:6;3337:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3309:55;;3375:28;3417:15;3406:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3375:58;;3449:9;3444:110;3464:15;3460:1;:19;3444:110;;;3521:8;:21;3530:8;3539:1;3530:11;;;;;;;;:::i;:::-;;;;;;;;3521:21;;;;;;;;;;;;;;;;;;;;;3501:14;3516:1;3501:17;;;;;;;;:::i;:::-;;;;;;;:41;;;;;;;;;;;3481:3;;;;;:::i;:::-;;;;3444:110;;;;3572:8;3582:14;3564:33;;;;;;;3144:461;;;:::o;5541:328:7:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;617:71:2:-;;;;;;;;;;;;;:::o;470:34::-;;;;;;;;;;;;;:::o;2770:334:7:-;2843:13;2877:16;2885:7;2877;:16::i;:::-;2869:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2958:21;2982:10;:8;:10::i;:::-;2958:34;;3034:1;3016:7;3010:21;:25;:86;;;;;;;;;;;;;;;;;3062:7;3071:18;:7;:16;:18::i;:::-;3045:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3010:86;3003:93;;;2770:334;;;:::o;1963:144:2:-;1230:12:18;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2060:39:2::1;2077:2;2081:9;2092:6;2060:16;:39::i;:::-;1963:144:::0;;;:::o;2297:82::-;1230:12:18;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2367:4:2::1;2350:14;;:21;;;;;;;;;;;;;;;;;;2297:82::o:0;4644:164:7:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;1899:192:18:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;915:127:4:-;1022:1;1004:7;:14;;;:19;;;;;;;;;;;915:127;:::o;445:283:6:-;575:4;632:35;617:50;;;:11;:50;;;;:103;;;;684:36;708:11;684:23;:36::i;:::-;617:103;597:123;;445:283;;;:::o;7379:127:7:-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;601:98:3:-;654:7;681:10;674:17;;601:98;:::o;11361:174:7:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;793:114:4:-;858:7;885;:14;;;878:21;;793:114;;;:::o;8363:110:7:-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;965:242:6:-;1108:5;1099;:14;;1091:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1174:25;;;;;;;;1182:9;1174:25;;;;;;1193:5;1174:25;;;1157:10;:14;1168:2;1157:14;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;965:242;;;:::o;7673:348:7:-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;2099:173:18:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2144:128;2099:173;:::o;6751:315:7:-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;2385:113:2:-;2445:13;2478:12;2471:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2385:113;:::o;288:723:20:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;937:224:9:-;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;8700:321:7:-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;2613:589:9:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;12100:803:7:-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;1481:305::-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;9357:382::-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;13475:126::-;;;;:::o;3925:164:9:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5228:294;5194:328;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4797:907;;4716:988;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;:::i;:::-;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6070:1008;;;5999:1079;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3577:147;3503:221;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;787:157:5:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:744:21:-;131:5;156:81;172:64;229:6;172:64;:::i;:::-;156:81;:::i;:::-;147:90;;257:5;286:6;279:5;272:21;320:4;313:5;309:16;302:23;;346:6;396:3;388:4;380:6;376:17;371:3;367:27;364:36;361:143;;;415:79;;:::i;:::-;361:143;528:1;513:249;538:6;535:1;532:13;513:249;;;606:3;635:48;679:3;667:10;635:48;:::i;:::-;630:3;623:61;713:4;708:3;704:14;697:21;;747:4;742:3;738:14;731:21;;573:189;560:1;557;553:9;548:14;;513:249;;;517:14;137:631;;24:744;;;;;:::o;774:410::-;851:5;876:65;892:48;933:6;892:48;:::i;:::-;876:65;:::i;:::-;867:74;;964:6;957:5;950:21;1002:4;995:5;991:16;1040:3;1031:6;1026:3;1022:16;1019:25;1016:112;;;1047:79;;:::i;:::-;1016:112;1137:41;1171:6;1166:3;1161;1137:41;:::i;:::-;857:327;774:410;;;;;:::o;1190:412::-;1268:5;1293:66;1309:49;1351:6;1309:49;:::i;:::-;1293:66;:::i;:::-;1284:75;;1382:6;1375:5;1368:21;1420:4;1413:5;1409:16;1458:3;1449:6;1444:3;1440:16;1437:25;1434:112;;;1465:79;;:::i;:::-;1434:112;1555:41;1589:6;1584:3;1579;1555:41;:::i;:::-;1274:328;1190:412;;;;;:::o;1608:139::-;1654:5;1692:6;1679:20;1670:29;;1708:33;1735:5;1708:33;:::i;:::-;1608:139;;;;:::o;1753:143::-;1810:5;1841:6;1835:13;1826:22;;1857:33;1884:5;1857:33;:::i;:::-;1753:143;;;;:::o;1919:385::-;2001:5;2050:3;2043:4;2035:6;2031:17;2027:27;2017:122;;2058:79;;:::i;:::-;2017:122;2168:6;2162:13;2193:105;2294:3;2286:6;2279:4;2271:6;2267:17;2193:105;:::i;:::-;2184:114;;2007:297;1919:385;;;;:::o;2310:133::-;2353:5;2391:6;2378:20;2369:29;;2407:30;2431:5;2407:30;:::i;:::-;2310:133;;;;:::o;2449:137::-;2494:5;2532:6;2519:20;2510:29;;2548:32;2574:5;2548:32;:::i;:::-;2449:137;;;;:::o;2592:141::-;2648:5;2679:6;2673:13;2664:22;;2695:32;2721:5;2695:32;:::i;:::-;2592:141;;;;:::o;2752:338::-;2807:5;2856:3;2849:4;2841:6;2837:17;2833:27;2823:122;;2864:79;;:::i;:::-;2823:122;2981:6;2968:20;3006:78;3080:3;3072:6;3065:4;3057:6;3053:17;3006:78;:::i;:::-;2997:87;;2813:277;2752:338;;;;:::o;3110:340::-;3166:5;3215:3;3208:4;3200:6;3196:17;3192:27;3182:122;;3223:79;;:::i;:::-;3182:122;3340:6;3327:20;3365:79;3440:3;3432:6;3425:4;3417:6;3413:17;3365:79;:::i;:::-;3356:88;;3172:278;3110:340;;;;:::o;3456:139::-;3502:5;3540:6;3527:20;3518:29;;3556:33;3583:5;3556:33;:::i;:::-;3456:139;;;;:::o;3601:143::-;3658:5;3689:6;3683:13;3674:22;;3705:33;3732:5;3705:33;:::i;:::-;3601:143;;;;:::o;3750:329::-;3809:6;3858:2;3846:9;3837:7;3833:23;3829:32;3826:119;;;3864:79;;:::i;:::-;3826:119;3984:1;4009:53;4054:7;4045:6;4034:9;4030:22;4009:53;:::i;:::-;3999:63;;3955:117;3750:329;;;;:::o;4085:351::-;4155:6;4204:2;4192:9;4183:7;4179:23;4175:32;4172:119;;;4210:79;;:::i;:::-;4172:119;4330:1;4355:64;4411:7;4402:6;4391:9;4387:22;4355:64;:::i;:::-;4345:74;;4301:128;4085:351;;;;:::o;4442:474::-;4510:6;4518;4567:2;4555:9;4546:7;4542:23;4538:32;4535:119;;;4573:79;;:::i;:::-;4535:119;4693:1;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4664:117;4820:2;4846:53;4891:7;4882:6;4871:9;4867:22;4846:53;:::i;:::-;4836:63;;4791:118;4442:474;;;;;:::o;4922:619::-;4999:6;5007;5015;5064:2;5052:9;5043:7;5039:23;5035:32;5032:119;;;5070:79;;:::i;:::-;5032:119;5190:1;5215:53;5260:7;5251:6;5240:9;5236:22;5215:53;:::i;:::-;5205:63;;5161:117;5317:2;5343:53;5388:7;5379:6;5368:9;5364:22;5343:53;:::i;:::-;5333:63;;5288:118;5445:2;5471:53;5516:7;5507:6;5496:9;5492:22;5471:53;:::i;:::-;5461:63;;5416:118;4922:619;;;;;:::o;5547:943::-;5642:6;5650;5658;5666;5715:3;5703:9;5694:7;5690:23;5686:33;5683:120;;;5722:79;;:::i;:::-;5683:120;5842:1;5867:53;5912:7;5903:6;5892:9;5888:22;5867:53;:::i;:::-;5857:63;;5813:117;5969:2;5995:53;6040:7;6031:6;6020:9;6016:22;5995:53;:::i;:::-;5985:63;;5940:118;6097:2;6123:53;6168:7;6159:6;6148:9;6144:22;6123:53;:::i;:::-;6113:63;;6068:118;6253:2;6242:9;6238:18;6225:32;6284:18;6276:6;6273:30;6270:117;;;6306:79;;:::i;:::-;6270:117;6411:62;6465:7;6456:6;6445:9;6441:22;6411:62;:::i;:::-;6401:72;;6196:287;5547:943;;;;;;;:::o;6496:468::-;6561:6;6569;6618:2;6606:9;6597:7;6593:23;6589:32;6586:119;;;6624:79;;:::i;:::-;6586:119;6744:1;6769:53;6814:7;6805:6;6794:9;6790:22;6769:53;:::i;:::-;6759:63;;6715:117;6871:2;6897:50;6939:7;6930:6;6919:9;6915:22;6897:50;:::i;:::-;6887:60;;6842:115;6496:468;;;;;:::o;6970:474::-;7038:6;7046;7095:2;7083:9;7074:7;7070:23;7066:32;7063:119;;;7101:79;;:::i;:::-;7063:119;7221:1;7246:53;7291:7;7282:6;7271:9;7267:22;7246:53;:::i;:::-;7236:63;;7192:117;7348:2;7374:53;7419:7;7410:6;7399:9;7395:22;7374:53;:::i;:::-;7364:63;;7319:118;6970:474;;;;;:::o;7450:554::-;7545:6;7594:2;7582:9;7573:7;7569:23;7565:32;7562:119;;;7600:79;;:::i;:::-;7562:119;7741:1;7730:9;7726:17;7720:24;7771:18;7763:6;7760:30;7757:117;;;7793:79;;:::i;:::-;7757:117;7898:89;7979:7;7970:6;7959:9;7955:22;7898:89;:::i;:::-;7888:99;;7691:306;7450:554;;;;:::o;8010:327::-;8068:6;8117:2;8105:9;8096:7;8092:23;8088:32;8085:119;;;8123:79;;:::i;:::-;8085:119;8243:1;8268:52;8312:7;8303:6;8292:9;8288:22;8268:52;:::i;:::-;8258:62;;8214:116;8010:327;;;;:::o;8343:349::-;8412:6;8461:2;8449:9;8440:7;8436:23;8432:32;8429:119;;;8467:79;;:::i;:::-;8429:119;8587:1;8612:63;8667:7;8658:6;8647:9;8643:22;8612:63;:::i;:::-;8602:73;;8558:127;8343:349;;;;:::o;8698:509::-;8767:6;8816:2;8804:9;8795:7;8791:23;8787:32;8784:119;;;8822:79;;:::i;:::-;8784:119;8970:1;8959:9;8955:17;8942:31;9000:18;8992:6;8989:30;8986:117;;;9022:79;;:::i;:::-;8986:117;9127:63;9182:7;9173:6;9162:9;9158:22;9127:63;:::i;:::-;9117:73;;8913:287;8698:509;;;;:::o;9213:329::-;9272:6;9321:2;9309:9;9300:7;9296:23;9292:32;9289:119;;;9327:79;;:::i;:::-;9289:119;9447:1;9472:53;9517:7;9508:6;9497:9;9493:22;9472:53;:::i;:::-;9462:63;;9418:117;9213:329;;;;:::o;9548:351::-;9618:6;9667:2;9655:9;9646:7;9642:23;9638:32;9635:119;;;9673:79;;:::i;:::-;9635:119;9793:1;9818:64;9874:7;9865:6;9854:9;9850:22;9818:64;:::i;:::-;9808:74;;9764:128;9548:351;;;;:::o;9905:619::-;9982:6;9990;9998;10047:2;10035:9;10026:7;10022:23;10018:32;10015:119;;;10053:79;;:::i;:::-;10015:119;10173:1;10198:53;10243:7;10234:6;10223:9;10219:22;10198:53;:::i;:::-;10188:63;;10144:117;10300:2;10326:53;10371:7;10362:6;10351:9;10347:22;10326:53;:::i;:::-;10316:63;;10271:118;10428:2;10454:53;10499:7;10490:6;10479:9;10475:22;10454:53;:::i;:::-;10444:63;;10399:118;9905:619;;;;;:::o;10530:474::-;10598:6;10606;10655:2;10643:9;10634:7;10630:23;10626:32;10623:119;;;10661:79;;:::i;:::-;10623:119;10781:1;10806:53;10851:7;10842:6;10831:9;10827:22;10806:53;:::i;:::-;10796:63;;10752:117;10908:2;10934:53;10979:7;10970:6;10959:9;10955:22;10934:53;:::i;:::-;10924:63;;10879:118;10530:474;;;;;:::o;11010:167::-;11073:10;11094:40;11130:3;11122:6;11094:40;:::i;:::-;11166:4;11161:3;11157:14;11143:28;;11010:167;;;;:::o;11183:179::-;11252:10;11273:46;11315:3;11307:6;11273:46;:::i;:::-;11351:4;11346:3;11342:14;11328:28;;11183:179;;;;:::o;11368:118::-;11455:24;11473:5;11455:24;:::i;:::-;11450:3;11443:37;11368:118;;:::o;11516:708::-;11629:3;11658:51;11703:5;11658:51;:::i;:::-;11725:83;11801:6;11796:3;11725:83;:::i;:::-;11718:90;;11832:53;11879:5;11832:53;:::i;:::-;11908:7;11939:1;11924:275;11949:6;11946:1;11943:13;11924:275;;;12025:6;12019:13;12052:57;12105:3;12090:13;12052:57;:::i;:::-;12045:64;;12132:57;12182:6;12132:57;:::i;:::-;12122:67;;11984:215;11971:1;11968;11964:9;11959:14;;11924:275;;;11928:14;12215:3;12208:10;;11634:590;;;11516:708;;;;:::o;12260:732::-;12379:3;12408:54;12456:5;12408:54;:::i;:::-;12478:86;12557:6;12552:3;12478:86;:::i;:::-;12471:93;;12588:56;12638:5;12588:56;:::i;:::-;12667:7;12698:1;12683:284;12708:6;12705:1;12702:13;12683:284;;;12784:6;12778:13;12811:63;12870:3;12855:13;12811:63;:::i;:::-;12804:70;;12897:60;12950:6;12897:60;:::i;:::-;12887:70;;12743:224;12730:1;12727;12723:9;12718:14;;12683:284;;;12687:14;12983:3;12976:10;;12384:608;;;12260:732;;;;:::o;12998:99::-;13069:21;13084:5;13069:21;:::i;:::-;13064:3;13057:34;12998:99;;:::o;13103:109::-;13184:21;13199:5;13184:21;:::i;:::-;13179:3;13172:34;13103:109;;:::o;13218:360::-;13304:3;13332:38;13364:5;13332:38;:::i;:::-;13386:70;13449:6;13444:3;13386:70;:::i;:::-;13379:77;;13465:52;13510:6;13505:3;13498:4;13491:5;13487:16;13465:52;:::i;:::-;13542:29;13564:6;13542:29;:::i;:::-;13537:3;13533:39;13526:46;;13308:270;13218:360;;;;:::o;13584:364::-;13672:3;13700:39;13733:5;13700:39;:::i;:::-;13755:71;13819:6;13814:3;13755:71;:::i;:::-;13748:78;;13835:52;13880:6;13875:3;13868:4;13861:5;13857:16;13835:52;:::i;:::-;13912:29;13934:6;13912:29;:::i;:::-;13907:3;13903:39;13896:46;;13676:272;13584:364;;;;:::o;13954:377::-;14060:3;14088:39;14121:5;14088:39;:::i;:::-;14143:89;14225:6;14220:3;14143:89;:::i;:::-;14136:96;;14241:52;14286:6;14281:3;14274:4;14267:5;14263:16;14241:52;:::i;:::-;14318:6;14313:3;14309:16;14302:23;;14064:267;13954:377;;;;:::o;14337:366::-;14479:3;14500:67;14564:2;14559:3;14500:67;:::i;:::-;14493:74;;14576:93;14665:3;14576:93;:::i;:::-;14694:2;14689:3;14685:12;14678:19;;14337:366;;;:::o;14709:::-;14851:3;14872:67;14936:2;14931:3;14872:67;:::i;:::-;14865:74;;14948:93;15037:3;14948:93;:::i;:::-;15066:2;15061:3;15057:12;15050:19;;14709:366;;;:::o;15081:::-;15223:3;15244:67;15308:2;15303:3;15244:67;:::i;:::-;15237:74;;15320:93;15409:3;15320:93;:::i;:::-;15438:2;15433:3;15429:12;15422:19;;15081:366;;;:::o;15453:::-;15595:3;15616:67;15680:2;15675:3;15616:67;:::i;:::-;15609:74;;15692:93;15781:3;15692:93;:::i;:::-;15810:2;15805:3;15801:12;15794:19;;15453:366;;;:::o;15825:::-;15967:3;15988:67;16052:2;16047:3;15988:67;:::i;:::-;15981:74;;16064:93;16153:3;16064:93;:::i;:::-;16182:2;16177:3;16173:12;16166:19;;15825:366;;;:::o;16197:::-;16339:3;16360:67;16424:2;16419:3;16360:67;:::i;:::-;16353:74;;16436:93;16525:3;16436:93;:::i;:::-;16554:2;16549:3;16545:12;16538:19;;16197:366;;;:::o;16569:::-;16711:3;16732:67;16796:2;16791:3;16732:67;:::i;:::-;16725:74;;16808:93;16897:3;16808:93;:::i;:::-;16926:2;16921:3;16917:12;16910:19;;16569:366;;;:::o;16941:::-;17083:3;17104:67;17168:2;17163:3;17104:67;:::i;:::-;17097:74;;17180:93;17269:3;17180:93;:::i;:::-;17298:2;17293:3;17289:12;17282:19;;16941:366;;;:::o;17313:::-;17455:3;17476:67;17540:2;17535:3;17476:67;:::i;:::-;17469:74;;17552:93;17641:3;17552:93;:::i;:::-;17670:2;17665:3;17661:12;17654:19;;17313:366;;;:::o;17685:::-;17827:3;17848:67;17912:2;17907:3;17848:67;:::i;:::-;17841:74;;17924:93;18013:3;17924:93;:::i;:::-;18042:2;18037:3;18033:12;18026:19;;17685:366;;;:::o;18057:::-;18199:3;18220:67;18284:2;18279:3;18220:67;:::i;:::-;18213:74;;18296:93;18385:3;18296:93;:::i;:::-;18414:2;18409:3;18405:12;18398:19;;18057:366;;;:::o;18429:::-;18571:3;18592:67;18656:2;18651:3;18592:67;:::i;:::-;18585:74;;18668:93;18757:3;18668:93;:::i;:::-;18786:2;18781:3;18777:12;18770:19;;18429:366;;;:::o;18801:::-;18943:3;18964:67;19028:2;19023:3;18964:67;:::i;:::-;18957:74;;19040:93;19129:3;19040:93;:::i;:::-;19158:2;19153:3;19149:12;19142:19;;18801:366;;;:::o;19173:::-;19315:3;19336:67;19400:2;19395:3;19336:67;:::i;:::-;19329:74;;19412:93;19501:3;19412:93;:::i;:::-;19530:2;19525:3;19521:12;19514:19;;19173:366;;;:::o;19545:::-;19687:3;19708:67;19772:2;19767:3;19708:67;:::i;:::-;19701:74;;19784:93;19873:3;19784:93;:::i;:::-;19902:2;19897:3;19893:12;19886:19;;19545:366;;;:::o;19917:::-;20059:3;20080:67;20144:2;20139:3;20080:67;:::i;:::-;20073:74;;20156:93;20245:3;20156:93;:::i;:::-;20274:2;20269:3;20265:12;20258:19;;19917:366;;;:::o;20289:::-;20431:3;20452:67;20516:2;20511:3;20452:67;:::i;:::-;20445:74;;20528:93;20617:3;20528:93;:::i;:::-;20646:2;20641:3;20637:12;20630:19;;20289:366;;;:::o;20661:::-;20803:3;20824:67;20888:2;20883:3;20824:67;:::i;:::-;20817:74;;20900:93;20989:3;20900:93;:::i;:::-;21018:2;21013:3;21009:12;21002:19;;20661:366;;;:::o;21033:::-;21175:3;21196:67;21260:2;21255:3;21196:67;:::i;:::-;21189:74;;21272:93;21361:3;21272:93;:::i;:::-;21390:2;21385:3;21381:12;21374:19;;21033:366;;;:::o;21405:::-;21547:3;21568:67;21632:2;21627:3;21568:67;:::i;:::-;21561:74;;21644:93;21733:3;21644:93;:::i;:::-;21762:2;21757:3;21753:12;21746:19;;21405:366;;;:::o;21777:::-;21919:3;21940:67;22004:2;21999:3;21940:67;:::i;:::-;21933:74;;22016:93;22105:3;22016:93;:::i;:::-;22134:2;22129:3;22125:12;22118:19;;21777:366;;;:::o;22149:::-;22291:3;22312:67;22376:2;22371:3;22312:67;:::i;:::-;22305:74;;22388:93;22477:3;22388:93;:::i;:::-;22506:2;22501:3;22497:12;22490:19;;22149:366;;;:::o;22521:::-;22663:3;22684:67;22748:2;22743:3;22684:67;:::i;:::-;22677:74;;22760:93;22849:3;22760:93;:::i;:::-;22878:2;22873:3;22869:12;22862:19;;22521:366;;;:::o;22893:::-;23035:3;23056:67;23120:2;23115:3;23056:67;:::i;:::-;23049:74;;23132:93;23221:3;23132:93;:::i;:::-;23250:2;23245:3;23241:12;23234:19;;22893:366;;;:::o;23265:::-;23407:3;23428:67;23492:2;23487:3;23428:67;:::i;:::-;23421:74;;23504:93;23593:3;23504:93;:::i;:::-;23622:2;23617:3;23613:12;23606:19;;23265:366;;;:::o;23637:::-;23779:3;23800:67;23864:2;23859:3;23800:67;:::i;:::-;23793:74;;23876:93;23965:3;23876:93;:::i;:::-;23994:2;23989:3;23985:12;23978:19;;23637:366;;;:::o;24009:::-;24151:3;24172:67;24236:2;24231:3;24172:67;:::i;:::-;24165:74;;24248:93;24337:3;24248:93;:::i;:::-;24366:2;24361:3;24357:12;24350:19;;24009:366;;;:::o;24381:::-;24523:3;24544:67;24608:2;24603:3;24544:67;:::i;:::-;24537:74;;24620:93;24709:3;24620:93;:::i;:::-;24738:2;24733:3;24729:12;24722:19;;24381:366;;;:::o;24753:108::-;24830:24;24848:5;24830:24;:::i;:::-;24825:3;24818:37;24753:108;;:::o;24867:118::-;24954:24;24972:5;24954:24;:::i;:::-;24949:3;24942:37;24867:118;;:::o;24991:435::-;25171:3;25193:95;25284:3;25275:6;25193:95;:::i;:::-;25186:102;;25305:95;25396:3;25387:6;25305:95;:::i;:::-;25298:102;;25417:3;25410:10;;24991:435;;;;;:::o;25432:222::-;25525:4;25563:2;25552:9;25548:18;25540:26;;25576:71;25644:1;25633:9;25629:17;25620:6;25576:71;:::i;:::-;25432:222;;;;:::o;25660:640::-;25855:4;25893:3;25882:9;25878:19;25870:27;;25907:71;25975:1;25964:9;25960:17;25951:6;25907:71;:::i;:::-;25988:72;26056:2;26045:9;26041:18;26032:6;25988:72;:::i;:::-;26070;26138:2;26127:9;26123:18;26114:6;26070:72;:::i;:::-;26189:9;26183:4;26179:20;26174:2;26163:9;26159:18;26152:48;26217:76;26288:4;26279:6;26217:76;:::i;:::-;26209:84;;25660:640;;;;;;;:::o;26306:332::-;26427:4;26465:2;26454:9;26450:18;26442:26;;26478:71;26546:1;26535:9;26531:17;26522:6;26478:71;:::i;:::-;26559:72;26627:2;26616:9;26612:18;26603:6;26559:72;:::i;:::-;26306:332;;;;;:::o;26644:373::-;26787:4;26825:2;26814:9;26810:18;26802:26;;26874:9;26868:4;26864:20;26860:1;26849:9;26845:17;26838:47;26902:108;27005:4;26996:6;26902:108;:::i;:::-;26894:116;;26644:373;;;;:::o;27023:622::-;27238:4;27276:2;27265:9;27261:18;27253:26;;27325:9;27319:4;27315:20;27311:1;27300:9;27296:17;27289:47;27353:108;27456:4;27447:6;27353:108;:::i;:::-;27345:116;;27508:9;27502:4;27498:20;27493:2;27482:9;27478:18;27471:48;27536:102;27633:4;27624:6;27536:102;:::i;:::-;27528:110;;27023:622;;;;;:::o;27651:210::-;27738:4;27776:2;27765:9;27761:18;27753:26;;27789:65;27851:1;27840:9;27836:17;27827:6;27789:65;:::i;:::-;27651:210;;;;:::o;27867:313::-;27980:4;28018:2;28007:9;28003:18;27995:26;;28067:9;28061:4;28057:20;28053:1;28042:9;28038:17;28031:47;28095:78;28168:4;28159:6;28095:78;:::i;:::-;28087:86;;27867:313;;;;:::o;28186:419::-;28352:4;28390:2;28379:9;28375:18;28367:26;;28439:9;28433:4;28429:20;28425:1;28414:9;28410:17;28403:47;28467:131;28593:4;28467:131;:::i;:::-;28459:139;;28186:419;;;:::o;28611:::-;28777:4;28815:2;28804:9;28800:18;28792:26;;28864:9;28858:4;28854:20;28850:1;28839:9;28835:17;28828:47;28892:131;29018:4;28892:131;:::i;:::-;28884:139;;28611:419;;;:::o;29036:::-;29202:4;29240:2;29229:9;29225:18;29217:26;;29289:9;29283:4;29279:20;29275:1;29264:9;29260:17;29253:47;29317:131;29443:4;29317:131;:::i;:::-;29309:139;;29036:419;;;:::o;29461:::-;29627:4;29665:2;29654:9;29650:18;29642:26;;29714:9;29708:4;29704:20;29700:1;29689:9;29685:17;29678:47;29742:131;29868:4;29742:131;:::i;:::-;29734:139;;29461:419;;;:::o;29886:::-;30052:4;30090:2;30079:9;30075:18;30067:26;;30139:9;30133:4;30129:20;30125:1;30114:9;30110:17;30103:47;30167:131;30293:4;30167:131;:::i;:::-;30159:139;;29886:419;;;:::o;30311:::-;30477:4;30515:2;30504:9;30500:18;30492:26;;30564:9;30558:4;30554:20;30550:1;30539:9;30535:17;30528:47;30592:131;30718:4;30592:131;:::i;:::-;30584:139;;30311:419;;;:::o;30736:::-;30902:4;30940:2;30929:9;30925:18;30917:26;;30989:9;30983:4;30979:20;30975:1;30964:9;30960:17;30953:47;31017:131;31143:4;31017:131;:::i;:::-;31009:139;;30736:419;;;:::o;31161:::-;31327:4;31365:2;31354:9;31350:18;31342:26;;31414:9;31408:4;31404:20;31400:1;31389:9;31385:17;31378:47;31442:131;31568:4;31442:131;:::i;:::-;31434:139;;31161:419;;;:::o;31586:::-;31752:4;31790:2;31779:9;31775:18;31767:26;;31839:9;31833:4;31829:20;31825:1;31814:9;31810:17;31803:47;31867:131;31993:4;31867:131;:::i;:::-;31859:139;;31586:419;;;:::o;32011:::-;32177:4;32215:2;32204:9;32200:18;32192:26;;32264:9;32258:4;32254:20;32250:1;32239:9;32235:17;32228:47;32292:131;32418:4;32292:131;:::i;:::-;32284:139;;32011:419;;;:::o;32436:::-;32602:4;32640:2;32629:9;32625:18;32617:26;;32689:9;32683:4;32679:20;32675:1;32664:9;32660:17;32653:47;32717:131;32843:4;32717:131;:::i;:::-;32709:139;;32436:419;;;:::o;32861:::-;33027:4;33065:2;33054:9;33050:18;33042:26;;33114:9;33108:4;33104:20;33100:1;33089:9;33085:17;33078:47;33142:131;33268:4;33142:131;:::i;:::-;33134:139;;32861:419;;;:::o;33286:::-;33452:4;33490:2;33479:9;33475:18;33467:26;;33539:9;33533:4;33529:20;33525:1;33514:9;33510:17;33503:47;33567:131;33693:4;33567:131;:::i;:::-;33559:139;;33286:419;;;:::o;33711:::-;33877:4;33915:2;33904:9;33900:18;33892:26;;33964:9;33958:4;33954:20;33950:1;33939:9;33935:17;33928:47;33992:131;34118:4;33992:131;:::i;:::-;33984:139;;33711:419;;;:::o;34136:::-;34302:4;34340:2;34329:9;34325:18;34317:26;;34389:9;34383:4;34379:20;34375:1;34364:9;34360:17;34353:47;34417:131;34543:4;34417:131;:::i;:::-;34409:139;;34136:419;;;:::o;34561:::-;34727:4;34765:2;34754:9;34750:18;34742:26;;34814:9;34808:4;34804:20;34800:1;34789:9;34785:17;34778:47;34842:131;34968:4;34842:131;:::i;:::-;34834:139;;34561:419;;;:::o;34986:::-;35152:4;35190:2;35179:9;35175:18;35167:26;;35239:9;35233:4;35229:20;35225:1;35214:9;35210:17;35203:47;35267:131;35393:4;35267:131;:::i;:::-;35259:139;;34986:419;;;:::o;35411:::-;35577:4;35615:2;35604:9;35600:18;35592:26;;35664:9;35658:4;35654:20;35650:1;35639:9;35635:17;35628:47;35692:131;35818:4;35692:131;:::i;:::-;35684:139;;35411:419;;;:::o;35836:::-;36002:4;36040:2;36029:9;36025:18;36017:26;;36089:9;36083:4;36079:20;36075:1;36064:9;36060:17;36053:47;36117:131;36243:4;36117:131;:::i;:::-;36109:139;;35836:419;;;:::o;36261:::-;36427:4;36465:2;36454:9;36450:18;36442:26;;36514:9;36508:4;36504:20;36500:1;36489:9;36485:17;36478:47;36542:131;36668:4;36542:131;:::i;:::-;36534:139;;36261:419;;;:::o;36686:::-;36852:4;36890:2;36879:9;36875:18;36867:26;;36939:9;36933:4;36929:20;36925:1;36914:9;36910:17;36903:47;36967:131;37093:4;36967:131;:::i;:::-;36959:139;;36686:419;;;:::o;37111:::-;37277:4;37315:2;37304:9;37300:18;37292:26;;37364:9;37358:4;37354:20;37350:1;37339:9;37335:17;37328:47;37392:131;37518:4;37392:131;:::i;:::-;37384:139;;37111:419;;;:::o;37536:::-;37702:4;37740:2;37729:9;37725:18;37717:26;;37789:9;37783:4;37779:20;37775:1;37764:9;37760:17;37753:47;37817:131;37943:4;37817:131;:::i;:::-;37809:139;;37536:419;;;:::o;37961:::-;38127:4;38165:2;38154:9;38150:18;38142:26;;38214:9;38208:4;38204:20;38200:1;38189:9;38185:17;38178:47;38242:131;38368:4;38242:131;:::i;:::-;38234:139;;37961:419;;;:::o;38386:::-;38552:4;38590:2;38579:9;38575:18;38567:26;;38639:9;38633:4;38629:20;38625:1;38614:9;38610:17;38603:47;38667:131;38793:4;38667:131;:::i;:::-;38659:139;;38386:419;;;:::o;38811:::-;38977:4;39015:2;39004:9;39000:18;38992:26;;39064:9;39058:4;39054:20;39050:1;39039:9;39035:17;39028:47;39092:131;39218:4;39092:131;:::i;:::-;39084:139;;38811:419;;;:::o;39236:::-;39402:4;39440:2;39429:9;39425:18;39417:26;;39489:9;39483:4;39479:20;39475:1;39464:9;39460:17;39453:47;39517:131;39643:4;39517:131;:::i;:::-;39509:139;;39236:419;;;:::o;39661:::-;39827:4;39865:2;39854:9;39850:18;39842:26;;39914:9;39908:4;39904:20;39900:1;39889:9;39885:17;39878:47;39942:131;40068:4;39942:131;:::i;:::-;39934:139;;39661:419;;;:::o;40086:222::-;40179:4;40217:2;40206:9;40202:18;40194:26;;40230:71;40298:1;40287:9;40283:17;40274:6;40230:71;:::i;:::-;40086:222;;;;:::o;40314:129::-;40348:6;40375:20;;:::i;:::-;40365:30;;40404:33;40432:4;40424:6;40404:33;:::i;:::-;40314:129;;;:::o;40449:75::-;40482:6;40515:2;40509:9;40499:19;;40449:75;:::o;40530:311::-;40607:4;40697:18;40689:6;40686:30;40683:56;;;40719:18;;:::i;:::-;40683:56;40769:4;40761:6;40757:17;40749:25;;40829:4;40823;40819:15;40811:23;;40530:311;;;:::o;40847:307::-;40908:4;40998:18;40990:6;40987:30;40984:56;;;41020:18;;:::i;:::-;40984:56;41058:29;41080:6;41058:29;:::i;:::-;41050:37;;41142:4;41136;41132:15;41124:23;;40847:307;;;:::o;41160:308::-;41222:4;41312:18;41304:6;41301:30;41298:56;;;41334:18;;:::i;:::-;41298:56;41372:29;41394:6;41372:29;:::i;:::-;41364:37;;41456:4;41450;41446:15;41438:23;;41160:308;;;:::o;41474:129::-;41538:4;41561:3;41553:11;;41591:4;41586:3;41582:14;41574:22;;41474:129;;;:::o;41609:132::-;41676:4;41699:3;41691:11;;41729:4;41724:3;41720:14;41712:22;;41609:132;;;:::o;41747:111::-;41811:6;41845:5;41839:12;41829:22;;41747:111;;;:::o;41864:114::-;41931:6;41965:5;41959:12;41949:22;;41864:114;;;:::o;41984:98::-;42035:6;42069:5;42063:12;42053:22;;41984:98;;;:::o;42088:99::-;42140:6;42174:5;42168:12;42158:22;;42088:99;;;:::o;42193:110::-;42260:4;42292;42287:3;42283:14;42275:22;;42193:110;;;:::o;42309:113::-;42379:4;42411;42406:3;42402:14;42394:22;;42309:113;;;:::o;42428:181::-;42524:11;42558:6;42553:3;42546:19;42598:4;42593:3;42589:14;42574:29;;42428:181;;;;:::o;42615:184::-;42714:11;42748:6;42743:3;42736:19;42788:4;42783:3;42779:14;42764:29;;42615:184;;;;:::o;42805:168::-;42888:11;42922:6;42917:3;42910:19;42962:4;42957:3;42953:14;42938:29;;42805:168;;;;:::o;42979:169::-;43063:11;43097:6;43092:3;43085:19;43137:4;43132:3;43128:14;43113:29;;42979:169;;;;:::o;43154:148::-;43256:11;43293:3;43278:18;;43154:148;;;;:::o;43308:305::-;43348:3;43367:20;43385:1;43367:20;:::i;:::-;43362:25;;43401:20;43419:1;43401:20;:::i;:::-;43396:25;;43555:1;43487:66;43483:74;43480:1;43477:81;43474:107;;;43561:18;;:::i;:::-;43474:107;43605:1;43602;43598:9;43591:16;;43308:305;;;;:::o;43619:185::-;43659:1;43676:20;43694:1;43676:20;:::i;:::-;43671:25;;43710:20;43728:1;43710:20;:::i;:::-;43705:25;;43749:1;43739:35;;43754:18;;:::i;:::-;43739:35;43796:1;43793;43789:9;43784:14;;43619:185;;;;:::o;43810:348::-;43850:7;43873:20;43891:1;43873:20;:::i;:::-;43868:25;;43907:20;43925:1;43907:20;:::i;:::-;43902:25;;44095:1;44027:66;44023:74;44020:1;44017:81;44012:1;44005:9;43998:17;43994:105;43991:131;;;44102:18;;:::i;:::-;43991:131;44150:1;44147;44143:9;44132:20;;43810:348;;;;:::o;44164:191::-;44204:4;44224:20;44242:1;44224:20;:::i;:::-;44219:25;;44258:20;44276:1;44258:20;:::i;:::-;44253:25;;44297:1;44294;44291:8;44288:34;;;44302:18;;:::i;:::-;44288:34;44347:1;44344;44340:9;44332:17;;44164:191;;;;:::o;44361:96::-;44398:7;44427:24;44445:5;44427:24;:::i;:::-;44416:35;;44361:96;;;:::o;44463:90::-;44497:7;44540:5;44533:13;44526:21;44515:32;;44463:90;;;:::o;44559:149::-;44595:7;44635:66;44628:5;44624:78;44613:89;;44559:149;;;:::o;44714:126::-;44751:7;44791:42;44784:5;44780:54;44769:65;;44714:126;;;:::o;44846:77::-;44883:7;44912:5;44901:16;;44846:77;;;:::o;44929:154::-;45013:6;45008:3;45003;44990:30;45075:1;45066:6;45061:3;45057:16;45050:27;44929:154;;;:::o;45089:307::-;45157:1;45167:113;45181:6;45178:1;45175:13;45167:113;;;45266:1;45261:3;45257:11;45251:18;45247:1;45242:3;45238:11;45231:39;45203:2;45200:1;45196:10;45191:15;;45167:113;;;45298:6;45295:1;45292:13;45289:101;;;45378:1;45369:6;45364:3;45360:16;45353:27;45289:101;45138:258;45089:307;;;:::o;45402:320::-;45446:6;45483:1;45477:4;45473:12;45463:22;;45530:1;45524:4;45520:12;45551:18;45541:81;;45607:4;45599:6;45595:17;45585:27;;45541:81;45669:2;45661:6;45658:14;45638:18;45635:38;45632:84;;;45688:18;;:::i;:::-;45632:84;45453:269;45402:320;;;:::o;45728:281::-;45811:27;45833:4;45811:27;:::i;:::-;45803:6;45799:40;45941:6;45929:10;45926:22;45905:18;45893:10;45890:34;45887:62;45884:88;;;45952:18;;:::i;:::-;45884:88;45992:10;45988:2;45981:22;45771:238;45728:281;;:::o;46015:233::-;46054:3;46077:24;46095:5;46077:24;:::i;:::-;46068:33;;46123:66;46116:5;46113:77;46110:103;;;46193:18;;:::i;:::-;46110:103;46240:1;46233:5;46229:13;46222:20;;46015:233;;;:::o;46254:176::-;46286:1;46303:20;46321:1;46303:20;:::i;:::-;46298:25;;46337:20;46355:1;46337:20;:::i;:::-;46332:25;;46376:1;46366:35;;46381:18;;:::i;:::-;46366:35;46422:1;46419;46415:9;46410:14;;46254:176;;;;:::o;46436:180::-;46484:77;46481:1;46474:88;46581:4;46578:1;46571:15;46605:4;46602:1;46595:15;46622:180;46670:77;46667:1;46660:88;46767:4;46764:1;46757:15;46791:4;46788:1;46781:15;46808:180;46856:77;46853:1;46846:88;46953:4;46950:1;46943:15;46977:4;46974:1;46967:15;46994:180;47042:77;47039:1;47032:88;47139:4;47136:1;47129:15;47163:4;47160:1;47153:15;47180:180;47228:77;47225:1;47218:88;47325:4;47322:1;47315:15;47349:4;47346:1;47339:15;47366:180;47414:77;47411:1;47404:88;47511:4;47508:1;47501:15;47535:4;47532:1;47525:15;47552:117;47661:1;47658;47651:12;47675:117;47784:1;47781;47774:12;47798:117;47907:1;47904;47897:12;47921:117;48030:1;48027;48020:12;48044:117;48153:1;48150;48143:12;48167:102;48208:6;48259:2;48255:7;48250:2;48243:5;48239:14;48235:28;48225:38;;48167:102;;;:::o;48275:176::-;48415:28;48411:1;48403:6;48399:14;48392:52;48275:176;:::o;48457:230::-;48597:34;48593:1;48585:6;48581:14;48574:58;48666:13;48661:2;48653:6;48649:15;48642:38;48457:230;:::o;48693:237::-;48833:34;48829:1;48821:6;48817:14;48810:58;48902:20;48897:2;48889:6;48885:15;48878:45;48693:237;:::o;48936:225::-;49076:34;49072:1;49064:6;49060:14;49053:58;49145:8;49140:2;49132:6;49128:15;49121:33;48936:225;:::o;49167:178::-;49307:30;49303:1;49295:6;49291:14;49284:54;49167:178;:::o;49351:166::-;49491:18;49487:1;49479:6;49475:14;49468:42;49351:166;:::o;49523:223::-;49663:34;49659:1;49651:6;49647:14;49640:58;49732:6;49727:2;49719:6;49715:15;49708:31;49523:223;:::o;49752:175::-;49892:27;49888:1;49880:6;49876:14;49869:51;49752:175;:::o;49933:166::-;50073:18;50069:1;50061:6;50057:14;50050:42;49933:166;:::o;50105:231::-;50245:34;50241:1;50233:6;50229:14;50222:58;50314:14;50309:2;50301:6;50297:15;50290:39;50105:231;:::o;50342:169::-;50482:21;50478:1;50470:6;50466:14;50459:45;50342:169;:::o;50517:243::-;50657:34;50653:1;50645:6;50641:14;50634:58;50726:26;50721:2;50713:6;50709:15;50702:51;50517:243;:::o;50766:229::-;50906:34;50902:1;50894:6;50890:14;50883:58;50975:12;50970:2;50962:6;50958:15;50951:37;50766:229;:::o;51001:228::-;51141:34;51137:1;51129:6;51125:14;51118:58;51210:11;51205:2;51197:6;51193:15;51186:36;51001:228;:::o;51235:182::-;51375:34;51371:1;51363:6;51359:14;51352:58;51235:182;:::o;51423:223::-;51563:34;51559:1;51551:6;51547:14;51540:58;51632:6;51627:2;51619:6;51615:15;51608:31;51423:223;:::o;51652:231::-;51792:34;51788:1;51780:6;51776:14;51769:58;51861:14;51856:2;51848:6;51844:15;51837:39;51652:231;:::o;51889:182::-;52029:34;52025:1;52017:6;52013:14;52006:58;51889:182;:::o;52077:228::-;52217:34;52213:1;52205:6;52201:14;52194:58;52286:11;52281:2;52273:6;52269:15;52262:36;52077:228;:::o;52311:234::-;52451:34;52447:1;52439:6;52435:14;52428:58;52520:17;52515:2;52507:6;52503:15;52496:42;52311:234;:::o;52551:168::-;52691:20;52687:1;52679:6;52675:14;52668:44;52551:168;:::o;52725:220::-;52865:34;52861:1;52853:6;52849:14;52842:58;52934:3;52929:2;52921:6;52917:15;52910:28;52725:220;:::o;52951:236::-;53091:34;53087:1;53079:6;53075:14;53068:58;53160:19;53155:2;53147:6;53143:15;53136:44;52951:236;:::o;53193:171::-;53333:23;53329:1;53321:6;53317:14;53310:47;53193:171;:::o;53370:231::-;53510:34;53506:1;53498:6;53494:14;53487:58;53579:14;53574:2;53566:6;53562:15;53555:39;53370:231;:::o;53607:166::-;53747:18;53743:1;53735:6;53731:14;53724:42;53607:166;:::o;53779:169::-;53919:21;53915:1;53907:6;53903:14;53896:45;53779:169;:::o;53954:179::-;54094:31;54090:1;54082:6;54078:14;54071:55;53954:179;:::o;54139:122::-;54212:24;54230:5;54212:24;:::i;:::-;54205:5;54202:35;54192:63;;54251:1;54248;54241:12;54192:63;54139:122;:::o;54267:116::-;54337:21;54352:5;54337:21;:::i;:::-;54330:5;54327:32;54317:60;;54373:1;54370;54363:12;54317:60;54267:116;:::o;54389:120::-;54461:23;54478:5;54461:23;:::i;:::-;54454:5;54451:34;54441:62;;54499:1;54496;54489:12;54441:62;54389:120;:::o;54515:122::-;54588:24;54606:5;54588:24;:::i;:::-;54581:5;54578:35;54568:63;;54627:1;54624;54617:12;54568:63;54515:122;:::o

Swarm Source

ipfs://6786f3effa13b3855e6edf25f38d4048318437b7aa048e5e12b165b9719d0bf0
Loading