ETH Price: $3,456.52 (+1.70%)

Token

MetaCityRealEstate (MCRE)
 

Overview

Max Total Supply

1,798 MCRE

Holders

667

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
iwannabee.eth
Balance
5 MCRE
0xdf1fa21aad71c50e642fca3aa4332da17bbea409
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
HumansOfTheMetaverseRealEstate

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-12
*/

// SPDX-License-Identifier: GPL-3.0

/*
                                                        ,----,
                            ,--,     ,----..          ,/   .`|           ____
                          ,--.'|    /   /   \       ,`   .'  :         ,'  , `.
                       ,--,  | :   /   .     :    ;    ;     /      ,-+-,.' _ |
                    ,---.'|  : '  .   /   ;.  \ .'___,/    ,'    ,-+-. ;   , ||
                    |   | : _' | .   ;   /  ` ; |    :     |    ,--.'|'   |  ;|
                    :   : |.'  | ;   |  ; \ ; | ;    |.';  ;   |   |  ,', |  ':t
                    |   ' '  ; : |   :  | ; | ' `----'  |  |   |   | /  | |  ||
                    '   |  .'. | .   |  ' ' ' :     '   :  ;   '   | :  | :  |,
                    |   | :  | ' '   ;  \; /  |     |   |  '   ;   . |  ; |--'
                    '   : |  : ;  \   \  ',  /      '   :  |   |   : |  | ,
                    |   | '  ,/    ;   :    /       ;   |.'    |   : '  |/
                    ;   : ;--'      \   \ .'        '---'      ;   | |`-'
                    |   ,/           `---`                     |   ;/
                    '---'                                      '---'
*/

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;
    }
}

pragma solidity ^0.8.0;

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

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);
    }
}

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);
}

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;


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

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);
}

pragma solidity ^0.8.0;

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


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);
    }

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

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


pragma solidity ^0.8.0;

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

pragma solidity ^0.8.10;

abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
            if( owner == _owners[i] ){
                ++count;
            }
        }
        delete length;
        return count;
    }
    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;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.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);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    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);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    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);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    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);
    }
    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");
    }
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
    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"
        );
    }
    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);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721P.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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.10;

abstract contract ERC721Enum is ERC721P, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721P) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.10;

interface IBoostWatcher {
    function watchBooster(address _collection, uint256[] calldata _tokenIds, uint256[] calldata _startDates) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function burn(address add, uint256 amount) external;
    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

contract HumansOfTheMetaverseRealEstate is ERC721Enum, Ownable, Pausable {
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableSet for EnumerableSet.AddressSet;
    using Strings for uint256;

    uint8 bonusPercentage = 20;

    // business logic constants
    uint16 private constant LAND = 1;
    uint256 private constant ETHER = 1e18;

    string private baseURI;
    address public tokenAddress;

    struct Coordinate {
        int32 layer;
        int256 x;
        int256 y;
    }

    struct LayerConfiguration {
        bool lock;
        int32 layer;
        uint256 length;
        mapping(uint16 => uint32) typesPricing; // real estate prices will be dependent on the layer they are in
        mapping(uint256 => uint256) rangePricing;
    }

    EnumerableSet.AddressSet collections;
    EnumerableSet.AddressSet allowedRealEstateModifiers;

    mapping(int32 => LayerConfiguration) layerConfigurationMap;

    mapping(bytes32 => uint8) buildingEnrolmentSlotsMapping; // layer + buildingType => Enrolment

    mapping(bytes32 => bool) realEstateOccupancyMapping; // layer + x + y => bool

    mapping(bytes32 => bool) humanEnrolmentMapping; // address + tokenId => layer + x + y

    mapping(uint256 => EnumerableSet.UintSet) tokenEnrolmentEmployeesMapping;
    mapping(uint256 => uint64) tokensTypeMapping;
    mapping(uint256 => Coordinate) tokensCoordinates;

    // events
    event RealEstateMinted(uint256[] tokenIds, Coordinate[] coordinates, address caller);
    event RealEstateChanges(uint256[] tokenIds, uint16[] realEstateTypes, address caller);
    event RealEstateEnrolment(uint256[] tokenIds, uint256 office, uint256 timestamp, address caller, address collection);
    event RealEstateEnrolmentRetrieval(uint256[] tokenIds, uint256 office, uint256 timestamp, address caller, address collection);


    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        address[] memory _collectionAddresses,
        address _tokenAddress
    ) ERC721P(_name, _symbol) {
        _pause();
        setBaseURI(_initBaseURI);

        for (uint8 i = 0; i < _collectionAddresses.length; ++i) {
            collections.add(_collectionAddresses[i]);
        }

        tokenAddress = _tokenAddress;
    }

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

    function pause() external onlyOwner {
        _pause();
    }

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

    function setTokenAddress(address _address) external onlyOwner {
        tokenAddress = _address;
    }

    function addAllowedModifiers(address[] calldata _modifierAddresses) external onlyOwner {
        for (uint8 i = 0; i < _modifierAddresses.length; ++i) {
            allowedRealEstateModifiers.add(_modifierAddresses[i]);
        }
    }

    function removeAllowedModifiers(address[] calldata _modifierAddresses) external onlyOwner {
        for (uint8 i = 0; i < _modifierAddresses.length; ++i) {
            allowedRealEstateModifiers.remove(_modifierAddresses[i]);
        }
    }

    function addCollection(address _collection) external onlyOwner {
        collections.add(_collection);
    }

    function removeCollection(address _collection) external onlyOwner {
        require(collections.contains(_collection), "Specified address not found");
        collections.remove(_collection);
    }

    function setOfficeBoost(uint8 _boost) external onlyOwner {
        bonusPercentage = _boost;
    }

    function withdrawTokens() external onlyOwner {
        IERC20(tokenAddress).transfer(msg.sender, IERC20(tokenAddress).balanceOf(address(this)));
    }

    function setLayerConfiguration(
        int32 _layer,
        uint256 _length,
        uint16[] calldata _realEstateTypes,
        uint32[] calldata _realEstatePrices,
        uint8[] calldata _slots,
        uint256[] calldata _landPrices
    ) external onlyOwner {
        require(
            _realEstateTypes.length == _realEstatePrices.length
            && _realEstatePrices.length == _slots.length
            && _landPrices.length == _length / 2,
            "Incorrect input"
        );

        LayerConfiguration storage layerConfiguration = layerConfigurationMap[_layer];
        layerConfiguration.layer = _layer;
        layerConfiguration.length = _length;

        for (uint8 i = 0; i < _realEstateTypes.length; ++i) {
            layerConfiguration.typesPricing[_realEstateTypes[i]] = _realEstatePrices[i];
            buildingEnrolmentSlotsMapping[
            keccak256(abi.encode(_layer, _realEstateTypes[i]))
            ] = _slots[i];
        }

        for(uint256 i = 0; i < _length / 2; ++i) {
            layerConfiguration.rangePricing[i * 2] = _landPrices[i];
        }
    }

    function setLayerLock(int32 _layer, bool _lock) external onlyOwner {
        LayerConfiguration storage layerConfiguration = _getLayerConfiguration(_layer);
        layerConfiguration.lock = _lock;
    }

    function setLayerLength(int32 _layer, uint256 _length, uint256[] calldata _additionalPrices) external onlyOwner {
        LayerConfiguration storage layerConfiguration = _getLayerConfiguration(_layer);

        require(_additionalPrices.length == (_length / 2 - layerConfiguration.length / 2), "Incorrect input");

        for(uint256 i = layerConfiguration.length / 2; i < _length / 2; ++i) {
            layerConfiguration.rangePricing[i * 2] = _additionalPrices[i - layerConfiguration.length / 2];
        }

        layerConfiguration.length = _length;

    }

    function setLayerLandPricing(int32 _layer, uint256[] calldata prices) external onlyOwner {
        LayerConfiguration storage layerConfiguration = _getLayerConfiguration(_layer);

        require(prices.length == layerConfiguration.length / 2, "Incorrect input");

        for (uint256 i = 0; i < layerConfiguration.length / 2; ++i) {
            layerConfiguration.rangePricing[i * 2] = prices[i];
        }

    }

    function setLayerTypesPricing(
        int32 _layer,
        uint16[] calldata realEstateTypes,
        uint32[] calldata realEstatePrices
    ) external onlyOwner {
        require(realEstateTypes.length == realEstatePrices.length, "Incorrect input");
        LayerConfiguration storage layerConfiguration = _getLayerConfiguration(_layer);

        for (uint16 i = 0; i < realEstateTypes.length; ++i) {
            layerConfiguration.typesPricing[realEstateTypes[i]] = realEstatePrices[i];
        }
    }

    function removeLayerTypesPricing(int32 _layer, uint16[] calldata realEstateTypes) external onlyOwner {
        LayerConfiguration storage layerConfiguration = _getLayerConfiguration(_layer);
        for (uint256 i = 0; i < realEstateTypes.length; ++i) {
            delete layerConfiguration.typesPricing[realEstateTypes[i]];
            delete buildingEnrolmentSlotsMapping[keccak256(abi.encode(_layer, realEstateTypes[i]))];
        }
    }

    function setLayerRealEstateTypeEnrolmentConfig(int32 _layer, uint16[] calldata _realEstateTypes, uint8[] calldata _slots) external onlyOwner {
        require(_realEstateTypes.length == _slots.length, "Incorrect input");
        for (uint64 i = 0; i < _realEstateTypes.length; ++i) {
            buildingEnrolmentSlotsMapping[keccak256(abi.encode(_layer, _realEstateTypes[i]))] = _slots[i];
        }
    }

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

    function _getLayerConfiguration(int32 _layer) internal view returns (LayerConfiguration storage) {
        LayerConfiguration storage layerConfiguration = layerConfigurationMap[_layer];
        require(layerConfiguration.length != uint256(0), "There is no configuration for provided layer");

        return layerConfiguration;
    }

    function _abs(int256 x) internal pure returns(uint256) {
        return x >= 0 ? uint256(x) : uint256(-x);
    }

    function buyLand(Coordinate[] memory _coordinates) external whenNotPaused payable {
        uint256 price = calculateLandPrice(_coordinates);

        uint256[] memory tokenIds = occupyLand(_coordinates);

        IERC20(tokenAddress).transferFrom(msg.sender, address(this), price *  ETHER);

        emit RealEstateMinted(tokenIds, _coordinates, msg.sender);

        delete price;
        delete tokenIds;
    }

    function changeRealEstate(uint256[] calldata _tokenIds, uint16[] calldata _realEstateNewTypes) external whenNotPaused payable {
        require(_tokenIds.length == _realEstateNewTypes.length, "Incorrect input dat");

        validateTokensToBeChanged(_tokenIds, _realEstateNewTypes);

        uint256 price = calculateRealEstatePrice(_tokenIds, _realEstateNewTypes);

        for (uint64 i = 0; i < _tokenIds.length; ++i) {
            tokensTypeMapping[_tokenIds[i]] = _realEstateNewTypes[i];
        }

        IERC20(tokenAddress).transferFrom(msg.sender, address(this), price * ETHER);

        emit RealEstateChanges(_tokenIds, _realEstateNewTypes, msg.sender);

        delete price;
    }

    function externalChangeRealEstate(uint256[] calldata _tokenIds, uint16[] calldata _realEstateNewTypes, address owner, uint256 amount) external whenNotPaused {
        require(allowedRealEstateModifiers.contains(msg.sender), "Not an allowed real estate changer");
        require(_tokenIds.length == _realEstateNewTypes.length, "Incorrect input data");

        validateTokensToBeChanged(_tokenIds, _realEstateNewTypes);

        for (uint64 i = 0; i < _tokenIds.length; ++i) {
            tokensTypeMapping[_tokenIds[i]] = _realEstateNewTypes[i];
        }

        IERC20(tokenAddress).transferFrom(owner, address(this),  amount * ETHER);

        emit RealEstateChanges(_tokenIds, _realEstateNewTypes, owner);
    }

    function validateTokensToBeChanged(uint256[] calldata _tokenIds, uint16[] calldata _realEstateNewTypes) internal view {

        for (uint64 i = 0; i < _tokenIds.length; ++i) {
            if (tokensTypeMapping[_tokenIds[i]] == _realEstateNewTypes[i]) {
                revert("Operation not allowed");
            }

            require(msg.sender == ownerOf(_tokenIds[i]), "Not the owner of the real estate piece");
        }
    }

    function calculateLandPrice(Coordinate[] memory _coordinates) public view returns(uint256) {
        validateCoordinates(_coordinates);
        uint256 price = 0;

        for(uint128 i = 0; i < _coordinates.length; ++i) {
            Coordinate memory coordinate = _coordinates[i];
            LayerConfiguration storage layerConfiguration = _getLayerConfiguration(coordinate.layer);

            uint256 landPriceIndex = uint256(_abs(coordinate.x) + _abs(coordinate.y));

            landPriceIndex = landPriceIndex % 2 == 1 ? landPriceIndex - 1 : landPriceIndex;

            price += layerConfiguration.rangePricing[landPriceIndex];
        }

        return price;
    }

    function calculateRealEstatePrice(uint256[] calldata _tokenIds, uint16[] calldata _realEstateTypes) public view returns(uint256) {
        uint256 price = 0;

        for(uint128 i = 0; i < _tokenIds.length; ++i) {

            LayerConfiguration storage layerConfiguration = _getLayerConfiguration(tokensCoordinates[_tokenIds[i]].layer);

            uint256 realEstatePrice = layerConfiguration.typesPricing[_realEstateTypes[i]];

            require(realEstatePrice != uint32(0), "Unsupported building type");

            price += realEstatePrice;

        }

        return price;
    }

    function validateCoordinates(Coordinate[] memory _coordinates) public view {
        for (uint256 i = 0; i < _coordinates.length; ++i) {
            Coordinate memory coordinate = _coordinates[i];
            LayerConfiguration storage layerConfiguration = _getLayerConfiguration(coordinate.layer);

            require(
                _abs(coordinate.x) < layerConfiguration.length / 2
                && _abs(coordinate.y) < layerConfiguration.length / 2
                && !realEstateOccupancyMapping[keccak256(abi.encode(coordinate.x, coordinate.y, coordinate.layer))],
                "Coordinates invalid"
            );
        }
    }

    function enrollInOffice(uint256[] calldata _workers, uint256 _office, address _collection) external whenNotPaused {

        require(collections.contains(_collection), "Not amongst enrollable collections");
        require(ownerOf(_office) == msg.sender, "Not the owner of the office");

        if (
            buildingEnrolmentSlotsMapping[keccak256(abi.encode(tokensCoordinates[_office].layer, tokensTypeMapping[_office]))]
            - tokenEnrolmentEmployeesMapping[_office].length()
            < _workers.length
        ) {
            revert("The office does not have enough slots available");
        }

        for (uint8 i = 0; i < _workers.length; ++i) {
            require(IERC721(_collection).ownerOf(_workers[i]) == msg.sender, "Not the owner of the humans");
            require(!humanEnrolmentMapping[keccak256(abi.encode(_collection, _workers[i]))], "Human already enrolled");
            tokenEnrolmentEmployeesMapping[_office].add(_workers[i]);
            humanEnrolmentMapping[keccak256(abi.encode(_collection, _workers[i]))] = true;
        }

        uint256 value = block.timestamp;

        notifyYielder(value, _collection, _workers);

        emit RealEstateEnrolment(_workers, _office, value, msg.sender, _collection);

        delete value;

    }

    function retrieveHuman(uint256[] calldata _workers, uint256 _office, address _collection) external whenNotPaused {
        require(collections.contains(_collection));
        require(ownerOf(_office) == msg.sender);

        for (uint8 i = 0; i < _workers.length; ++i) {
            require(IERC721(_collection).ownerOf(_workers[i]) == msg.sender);
            require(humanEnrolmentMapping[keccak256(abi.encode(_collection, _workers[i]))], "Human not enrolled");
            require(tokenEnrolmentEmployeesMapping[_office].contains(_workers[i]), "Human not enrolled in specified office");
            tokenEnrolmentEmployeesMapping[_office].remove(_workers[i]);
            humanEnrolmentMapping[keccak256(abi.encode(_collection, _workers[i]))] = false;
        }

        notifyYielder(0, _collection, _workers);

        emit RealEstateEnrolmentRetrieval(_workers, _office, 0, msg.sender, _collection);
    }

    function notifyYielder(uint256 value, address _collection, uint256[] calldata tokens) internal {
        uint256[] memory startDates = new uint256[](tokens.length);
        for (uint8 i = 0; i < startDates.length; ++i) {
            startDates[i] = value;
        }

        IBoostWatcher(tokenAddress).watchBooster(_collection, tokens, startDates);

        delete startDates;
    }

    function lockCoordinates(Coordinate[] memory _coordinates) external onlyOwner {
        validateCoordinates(_coordinates);

        for (uint64 i = 0; i < _coordinates.length; ++i) {
            if (!realEstateOccupancyMapping[keccak256(abi.encode(_coordinates[i].x, _coordinates[i].y, _coordinates[i].layer))]) {
                realEstateOccupancyMapping[keccak256(abi.encode(_coordinates[i].x, _coordinates[i].y, _coordinates[i].layer))] = true;
            }
        }

    }

    function unlockCoordinates(Coordinate[] memory _coordinates) external onlyOwner {
        for (uint64 i = 0; i < _coordinates.length; ++i) {
            if (realEstateOccupancyMapping[keccak256(abi.encode(_coordinates[i].x, _coordinates[i].y, _coordinates[i].layer))]) {
                realEstateOccupancyMapping[keccak256(abi.encode(_coordinates[i].x, _coordinates[i].y, _coordinates[i].layer))] = false;
            }
        }

    }

    function reserveCoordinates(Coordinate[] memory _coordinates) external onlyOwner {
        validateCoordinates(_coordinates);

        uint256[] memory tokenIds = occupyLand(_coordinates);

        for (uint64 i = 0; i < _coordinates.length; ++i) {
            if (!realEstateOccupancyMapping[keccak256(abi.encode(_coordinates[i].x, _coordinates[i].y, _coordinates[i].layer))]) {
                realEstateOccupancyMapping[keccak256(abi.encode(_coordinates[i].x, _coordinates[i].y, _coordinates[i].layer))] = true;
            }
        }

        emit RealEstateMinted(tokenIds, _coordinates, msg.sender);
    }

    function occupyLand(Coordinate[] memory _coordinates) internal returns(uint256[] memory ){
        uint256[] memory tokenIds = new uint256[](_coordinates.length);
        uint256 totalSupply = totalSupply();

        for (uint256 i = 0; i < _coordinates.length; ++i) {
            tokenIds[i] = totalSupply + i;
            tokensTypeMapping[totalSupply + i] = LAND;
            tokensCoordinates[totalSupply + i] = _coordinates[i];
            realEstateOccupancyMapping[keccak256(abi.encode(_coordinates[i].x, _coordinates[i].y, _coordinates[i].layer))] = true;
            _safeMint(msg.sender, totalSupply + i);
        }

        return tokenIds;
    }

    // backend

    function getTokensType(uint256[] calldata _tokenIds) public view returns(uint256[] memory) {
        uint256[] memory types = new uint256[](_tokenIds.length);
        for (uint64 i = 0; i < _tokenIds.length; ++i) {
            types[i] = tokensTypeMapping[_tokenIds[i]];
        }

        return types;
    }

    function getTokensCoordinates(uint256[] calldata _tokenIds) public view returns(Coordinate[] memory) {
        Coordinate[] memory coordinates = new Coordinate[](_tokenIds.length);
        for (uint64 i = 0; i < _tokenIds.length; ++i) {
            coordinates[i] = tokensCoordinates[_tokenIds[i]];
        }

        return coordinates;
    }

    function getTokensEnrolments(uint256[] calldata _tokenIds) public view returns(uint256[][] memory) {
        uint256[][] memory enrolments = new uint256[][](_tokenIds.length);
        for (uint64 i = 0; i < _tokenIds.length; ++i) {
            enrolments[_tokenIds[i]] = new uint256[](tokenEnrolmentEmployeesMapping[_tokenIds[i]].length());

            for (uint8 j = 0; j < tokenEnrolmentEmployeesMapping[_tokenIds[i]].length(); ++i) {
                enrolments[_tokenIds[i]][j] = tokenEnrolmentEmployeesMapping[_tokenIds[i]].at(j);
            }
        }

        return enrolments;
    }

    function getTokensOwners(uint256[] calldata _tokenIds) external view returns(address[] memory) {
        address[] memory addresses = new address[](_tokenIds.length);

        for(uint64 i = 0; i < _tokenIds.length; ++i) {
            addresses[i] = ownerOf(_tokenIds[i]);
        }

        return addresses;
    }

    // overrides

    function tokenURI(uint256 _tokenId) external view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: Nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0	? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json")) : "";
    }

    // boosting

    function computeAmount(uint256 amount) external view returns(uint256) {
        return amount + amount * bonusPercentage / 100;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address[]","name":"_collectionAddresses","type":"address[]"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint16[]","name":"realEstateTypes","type":"uint16[]"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"RealEstateChanges","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"office","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"collection","type":"address"}],"name":"RealEstateEnrolment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"office","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"collection","type":"address"}],"name":"RealEstateEnrolmentRetrieval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"indexed":false,"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"coordinates","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"RealEstateMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"_modifierAddresses","type":"address[]"}],"name":"addAllowedModifiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"}],"name":"addCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"_coordinates","type":"tuple[]"}],"name":"buyLand","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"_coordinates","type":"tuple[]"}],"name":"calculateLandPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint16[]","name":"_realEstateTypes","type":"uint16[]"}],"name":"calculateRealEstatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint16[]","name":"_realEstateNewTypes","type":"uint16[]"}],"name":"changeRealEstate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"computeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_workers","type":"uint256[]"},{"internalType":"uint256","name":"_office","type":"uint256"},{"internalType":"address","name":"_collection","type":"address"}],"name":"enrollInOffice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint16[]","name":"_realEstateNewTypes","type":"uint16[]"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"externalChangeRealEstate","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":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokensCoordinates","outputs":[{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokensEnrolments","outputs":[{"internalType":"uint256[][]","name":"","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokensOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokensType","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"_coordinates","type":"tuple[]"}],"name":"lockCoordinates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_modifierAddresses","type":"address[]"}],"name":"removeAllowedModifiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"}],"name":"removeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int32","name":"_layer","type":"int32"},{"internalType":"uint16[]","name":"realEstateTypes","type":"uint16[]"}],"name":"removeLayerTypesPricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"_coordinates","type":"tuple[]"}],"name":"reserveCoordinates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_workers","type":"uint256[]"},{"internalType":"uint256","name":"_office","type":"uint256"},{"internalType":"address","name":"_collection","type":"address"}],"name":"retrieveHuman","outputs":[],"stateMutability":"nonpayable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int32","name":"_layer","type":"int32"},{"internalType":"uint256","name":"_length","type":"uint256"},{"internalType":"uint16[]","name":"_realEstateTypes","type":"uint16[]"},{"internalType":"uint32[]","name":"_realEstatePrices","type":"uint32[]"},{"internalType":"uint8[]","name":"_slots","type":"uint8[]"},{"internalType":"uint256[]","name":"_landPrices","type":"uint256[]"}],"name":"setLayerConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int32","name":"_layer","type":"int32"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"name":"setLayerLandPricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int32","name":"_layer","type":"int32"},{"internalType":"uint256","name":"_length","type":"uint256"},{"internalType":"uint256[]","name":"_additionalPrices","type":"uint256[]"}],"name":"setLayerLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int32","name":"_layer","type":"int32"},{"internalType":"bool","name":"_lock","type":"bool"}],"name":"setLayerLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int32","name":"_layer","type":"int32"},{"internalType":"uint16[]","name":"_realEstateTypes","type":"uint16[]"},{"internalType":"uint8[]","name":"_slots","type":"uint8[]"}],"name":"setLayerRealEstateTypeEnrolmentConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int32","name":"_layer","type":"int32"},{"internalType":"uint16[]","name":"realEstateTypes","type":"uint16[]"},{"internalType":"uint32[]","name":"realEstatePrices","type":"uint32[]"}],"name":"setLayerTypesPricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_boost","type":"uint8"}],"name":"setOfficeBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"tokenId","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"_coordinates","type":"tuple[]"}],"name":"unlockCoordinates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"int32","name":"layer","type":"int32"},{"internalType":"int256","name":"x","type":"int256"},{"internalType":"int256","name":"y","type":"int256"}],"internalType":"struct HumansOfTheMetaverseRealEstate.Coordinate[]","name":"_coordinates","type":"tuple[]"}],"name":"validateCoordinates","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526005805460ff60a81b1916600560aa1b1790553480156200002457600080fd5b5060405162006129380380620061298339810160408190526200004791620004d0565b845185908590620000609060009060208501906200032f565b508051620000769060019060208401906200032f565b505050620000936200008d6200013f60201b60201c565b62000143565b6005805460ff60a01b19169055620000aa62000195565b620000b58362000248565b60005b82518160ff1610156200011357620000ff838260ff1681518110620000e157620000e162000610565b60200260200101516008620002bd60201b62003ae91790919060201c565b506200010b8162000626565b9050620000b8565b50600780546001600160a01b0319166001600160a01b0392909216919091179055506200069292505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001a9600554600160a01b900460ff1690565b15620001ef5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200022b3390565b6040516001600160a01b03909116815260200160405180910390a1565b6005546001600160a01b03163314620002a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001e6565b8051620002b99060069060208401906200032f565b5050565b6000620002d4836001600160a01b038416620002dd565b90505b92915050565b60008181526001830160205260408120546200032657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620002d7565b506000620002d7565b8280546200033d9062000655565b90600052602060002090601f016020900481019282620003615760008555620003ac565b82601f106200037c57805160ff1916838001178555620003ac565b82800160010185558215620003ac579182015b82811115620003ac5782518255916020019190600101906200038f565b50620003ba929150620003be565b5090565b5b80821115620003ba5760008155600101620003bf565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004165762000416620003d5565b604052919050565b600082601f8301126200043057600080fd5b81516001600160401b038111156200044c576200044c620003d5565b602062000462601f8301601f19168201620003eb565b82815285828487010111156200047757600080fd5b60005b83811015620004975785810183015182820184015282016200047a565b83811115620004a95760008385840101525b5095945050505050565b80516001600160a01b0381168114620004cb57600080fd5b919050565b600080600080600060a08688031215620004e957600080fd5b85516001600160401b03808211156200050157600080fd5b6200050f89838a016200041e565b96506020915081880151818111156200052757600080fd5b620005358a828b016200041e565b9650506040880151818111156200054b57600080fd5b620005598a828b016200041e565b9550506060880151818111156200056f57600080fd5b8801601f81018a136200058157600080fd5b805182811115620005965762000596620003d5565b8060051b9250620005a9848401620003eb565b818152928201840192848101908c851115620005c457600080fd5b928501925b84841015620005ed57620005dd84620004b3565b82529285019290850190620005c9565b8097505050505050506200060460808701620004b3565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8114156200064c57634e487b7160e01b600052601160045260246000fd5b60010192915050565b600181811c908216806200066a57607f821691505b602082108114156200068c57634e487b7160e01b600052602260045260246000fd5b50919050565b615a8780620006a26000396000f3fe6080604052600436106103505760003560e01c80638249fd53116101c6578063a13882bf116100f7578063ce5d56d111610095578063e1159a301161006f578063e1159a30146109c5578063e985e9c5146109e5578063f2fde38b14610a2e578063ff9c954e14610a4e57600080fd5b8063ce5d56d114610965578063cee49f8014610985578063d90bab1d146109a557600080fd5b8063aa279078116100d1578063aa279078146108e5578063b88d4fde14610905578063c132228814610925578063c87b56dd1461094557600080fd5b8063a13882bf14610885578063a174e77a146108a5578063a22cb465146108c557600080fd5b80638e5f5fce1161016457806395d89b411161013e57806395d89b41146108035780639c8e4cc0146108185780639d76ea58146108385780639e05de3c1461085857600080fd5b80638e5f5fce146107965780638fdde8fb146107b65780639378d12b146107e357600080fd5b806388eeef6d116101a057806388eeef6d146107235780638d8f2adb146107435780638da5cb5b146107585780638e34795c1461077657600080fd5b80638249fd53146106c15780638456cb59146106ee5780638462151c1461070357600080fd5b80632f745c59116102a057806355f804b31161023e5780636352211e116102185780636352211e1461065957806370a0823114610679578063715018a61461069957806376dd63f6146106ae57600080fd5b806355f804b3146105fa57806358a4b3861461061a5780635c975abb1461063a57600080fd5b806341b9e8631161027a57806341b9e8631461057a57806342842e0e1461059a5780634f6ccce7146105ba5780635028d05a146105da57600080fd5b80632f745c591461052557806337f9ae02146105455780633f4ba83a1461056557600080fd5b80630d84c10e1161030d5780631fa43a66116102e75780631fa43a66146104a557806323b872dd146104c557806326a4e8d2146104e557806329a2204c1461050557600080fd5b80630d84c10e146104465780630eaf7c1e1461047357806318160ddd1461048657600080fd5b806301ffc9a71461035557806303e4c84b1461038a57806306fdde03146103ac57806307e37ab6146103ce578063081812fc146103ee578063095ea7b314610426575b600080fd5b34801561036157600080fd5b50610375610370366004614ae5565b610a6e565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b506103aa6103a5366004614b87565b610a99565b005b3480156103b857600080fd5b506103c1610ca0565b6040516103819190614cb9565b3480156103da57600080fd5b506103aa6103e9366004614ccc565b610d32565b3480156103fa57600080fd5b5061040e610409366004614cef565b610d7c565b6040516001600160a01b039091168152602001610381565b34801561043257600080fd5b506103aa610441366004614d1d565b610e04565b34801561045257600080fd5b50610466610461366004614d94565b610f1a565b6040516103819190614e10565b6103aa610481366004614b87565b611136565b34801561049257600080fd5b506002545b604051908152602001610381565b3480156104b157600080fd5b506103aa6104c0366004614d94565b611259565b3480156104d157600080fd5b506103aa6104e0366004614e72565b6112d7565b3480156104f157600080fd5b506103aa610500366004614eb3565b611308565b34801561051157600080fd5b506103aa610520366004614d94565b611354565b34801561053157600080fd5b50610497610540366004614d1d565b6113d2565b34801561055157600080fd5b50610497610560366004614b87565b611481565b34801561057157600080fd5b506103aa611560565b34801561058657600080fd5b506103aa610595366004614ed0565b611594565b3480156105a657600080fd5b506103aa6105b5366004614e72565b6116ab565b3480156105c657600080fd5b506104976105d5366004614cef565b6116c6565b3480156105e657600080fd5b506103aa6105f5366004614eb3565b611723565b34801561060657600080fd5b506103aa610615366004614f80565b6117af565b34801561062657600080fd5b506103aa610635366004614b87565b6117ec565b34801561064657600080fd5b50600554600160a01b900460ff16610375565b34801561066557600080fd5b5061040e610674366004614cef565b611a33565b34801561068557600080fd5b50610497610694366004614eb3565b611abf565b3480156106a557600080fd5b506103aa611b91565b6103aa6106bc366004614fc8565b611bc5565b3480156106cd57600080fd5b506106e16106dc366004614d94565b611de6565b6040516103819190615027565b3480156106fa57600080fd5b506103aa611ec9565b34801561070f57600080fd5b506106e161071e366004614eb3565b611efb565b34801561072f57600080fd5b506103aa61073e366004614b87565b611fbc565b34801561074f57600080fd5b506103aa6120f0565b34801561076457600080fd5b506005546001600160a01b031661040e565b34801561078257600080fd5b506103aa61079136600461503a565b612202565b3480156107a257600080fd5b506103aa6107b1366004615098565b612561565b3480156107c257600080fd5b506107d66107d1366004614d94565b612667565b6040516103819190615118565b3480156107ef57600080fd5b506103aa6107fe366004615165565b612730565b34801561080f57600080fd5b506103c161284b565b34801561082457600080fd5b506103aa610833366004615098565b61285a565b34801561084457600080fd5b5060075461040e906001600160a01b031681565b34801561086457600080fd5b50610878610873366004614d94565b61298d565b6040516103819190615200565b34801561089157600080fd5b506103aa6108a0366004615165565b612aaf565b3480156108b157600080fd5b506103aa6108c0366004614eb3565b612b7d565b3480156108d157600080fd5b506103aa6108e0366004615221565b612bb2565b3480156108f157600080fd5b506103aa610900366004614b87565b612c77565b34801561091157600080fd5b506103aa61092036600461525a565b612e69565b34801561093157600080fd5b506103aa6109403660046152d9565b612ea1565b34801561095157600080fd5b506103c1610960366004614cef565b613102565b34801561097157600080fd5b506103aa6109803660046153b9565b6131bf565b34801561099157600080fd5b506103aa6109a036600461503a565b613208565b3480156109b157600080fd5b506104976109c0366004614fc8565b613680565b3480156109d157600080fd5b506104976109e0366004614cef565b6137ab565b3480156109f157600080fd5b50610375610a003660046153d5565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610a3a57600080fd5b506103aa610a49366004614eb3565b6137dc565b348015610a5a57600080fd5b506103aa610a69366004615403565b613874565b60006001600160e01b0319821663780e9d6360e01b1480610a935750610a9382613afe565b92915050565b6005546001600160a01b03163314610acc5760405162461bcd60e51b8152600401610ac39061548e565b60405180910390fd5b610ad581611fbc565b60005b8151816001600160401b03161015610c9c57600e600083836001600160401b031681518110610b0957610b096154c3565b60200260200101516020015184846001600160401b031681518110610b3057610b306154c3565b60200260200101516040015185856001600160401b031681518110610b5757610b576154c3565b602002602001015160000151604051602001610b8993929190928352602083019190915260030b604082015260600190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16610c8c576001600e600084846001600160401b031681518110610bd757610bd76154c3565b60200260200101516020015185856001600160401b031681518110610bfe57610bfe6154c3565b60200260200101516040015186866001600160401b031681518110610c2557610c256154c3565b602002602001015160000151604051602001610c5793929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555b610c95816154ef565b9050610ad8565b5050565b606060008054610caf90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdb90615516565b8015610d285780601f10610cfd57610100808354040283529160200191610d28565b820191906000526020600020905b815481529060010190602001808311610d0b57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610d5c5760405162461bcd60e51b8152600401610ac39061548e565b6005805460ff909216600160a81b0260ff60a81b19909216919091179055565b6000610d8782613b4e565b610de85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ac3565b506000908152600360205260409020546001600160a01b031690565b6000610e0f82611a33565b9050806001600160a01b0316836001600160a01b03161415610e7d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ac3565b336001600160a01b0382161480610e995750610e998133610a00565b610f0b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ac3565b610f158383613b98565b505050565b60606000826001600160401b03811115610f3657610f36614b02565b604051908082528060200260200182016040528015610f6957816020015b6060815260200190600190039081610f545790505b50905060005b6001600160401b03811684111561112e57610fbc601060008787856001600160401b0316818110610fa257610fa26154c3565b905060200201358152602001908152602001600020613c06565b6001600160401b03811115610fd357610fd3614b02565b604051908082528060200260200182016040528015610ffc578160200160208202803683370190505b50828686846001600160401b0316818110611019576110196154c3565b9050602002013581518110611030576110306154c3565b602002602001018190525060005b611060601060008888866001600160401b0316818110610fa257610fa26154c3565b8160ff16101561111d576110b38160ff16601060008989876001600160401b0316818110611090576110906154c3565b905060200201358152602001908152602001600020613c1090919063ffffffff16565b838787856001600160401b03168181106110cf576110cf6154c3565b90506020020135815181106110e6576110e66154c3565b60200260200101518260ff1681518110611102576111026154c3565b6020908102919091010152611116826154ef565b915061103e565b50611127816154ef565b9050610f6f565b509392505050565b600554600160a01b900460ff16156111605760405162461bcd60e51b8152600401610ac390615551565b600061116b82611481565b9050600061117883613c1c565b6007549091506001600160a01b03166323b872dd33306111a0670de0b6b3a76400008761557b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156111f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611218919061559a565b507fa5f3babd86e9dc9d25da4acb001bdcbb02b785612ad3cba77e9501fc01312f8681843360405161124c939291906155b7565b60405180910390a1505050565b6005546001600160a01b031633146112835760405162461bcd60e51b8152600401610ac39061548e565b60005b60ff8116821115610f15576112c683838360ff168181106112a9576112a96154c3565b90506020020160208101906112be9190614eb3565b600a90613ae9565b506112d0816155f5565b9050611286565b6112e13382613e3d565b6112fd5760405162461bcd60e51b8152600401610ac390615615565b610f15838383613f23565b6005546001600160a01b031633146113325760405162461bcd60e51b8152600401610ac39061548e565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461137e5760405162461bcd60e51b8152600401610ac39061548e565b60005b60ff8116821115610f15576113c183838360ff168181106113a4576113a46154c3565b90506020020160208101906113b99190614eb3565b600a90614079565b506113cb816155f5565b9050611381565b60006113dd83611abf565b82106113fb5760405162461bcd60e51b8152600401610ac390615666565b6000805b600254811015611468576002818154811061141c5761141c6154c3565b6000918252602090912001546001600160a01b0386811691161415611458578382141561144c579150610a939050565b61145582615696565b91505b61146181615696565b90506113ff565b5060405162461bcd60e51b8152600401610ac390615666565b600061148c82611fbc565b6000805b8351816001600160801b0316101561155957600084826001600160801b0316815181106114bf576114bf6154c3565b6020026020010151905060006114d8826000015161408e565b905060006114e98360400151614107565b6114f68460200151614107565b61150091906156b1565b905061150d6002826156df565b60011461151a5780611525565b6115256001826156f3565b600081815260038401602052604090205490915061154390866156b1565b9450505050806115529061570a565b9050611490565b5092915050565b6005546001600160a01b0316331461158a5760405162461bcd60e51b8152600401610ac39061548e565b61159261411f565b565b6005546001600160a01b031633146115be5760405162461bcd60e51b8152600401610ac39061548e565b60006115c98561408e565b9050600281600101546115dc9190615727565b6115e7600286615727565b6115f191906156f3565b821461160f5760405162461bcd60e51b8152600401610ac39061573b565b6000600282600101546116229190615727565b90505b611630600286615727565b81101561169e5783836002846001015461164a9190615727565b61165490846156f3565b818110611663576116636154c3565b9050602002013582600301600083600261167d919061557b565b815260208101919091526040016000205561169781615696565b9050611625565b5060010192909255505050565b610f1583838360405180602001604052806000815250612e69565b60006116d160025490565b821061171f5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610ac3565b5090565b6005546001600160a01b0316331461174d5760405162461bcd60e51b8152600401610ac39061548e565b6117586008826141bc565b6117a45760405162461bcd60e51b815260206004820152601b60248201527f5370656369666965642061646472657373206e6f7420666f756e6400000000006044820152606401610ac3565b610c9c600882614079565b6005546001600160a01b031633146117d95760405162461bcd60e51b8152600401610ac39061548e565b8051610c9c906006906020840190614a3f565b6005546001600160a01b031633146118165760405162461bcd60e51b8152600401610ac39061548e565b61181f81611fbc565b600061182a82613c1c565b905060005b8251816001600160401b031610156119f357600e600084836001600160401b031681518110611860576118606154c3565b60200260200101516020015185846001600160401b031681518110611887576118876154c3565b60200260200101516040015186856001600160401b0316815181106118ae576118ae6154c3565b6020026020010151600001516040516020016118e093929190928352602083019190915260030b604082015260600190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff166119e3576001600e600085846001600160401b03168151811061192e5761192e6154c3565b60200260200101516020015186856001600160401b031681518110611955576119556154c3565b60200260200101516040015187866001600160401b03168151811061197c5761197c6154c3565b6020026020010151600001516040516020016119ae93929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555b6119ec816154ef565b905061182f565b507fa5f3babd86e9dc9d25da4acb001bdcbb02b785612ad3cba77e9501fc01312f86818333604051611a27939291906155b7565b60405180910390a15050565b60008060028381548110611a4957611a496154c3565b6000918252602090912001546001600160a01b0316905080610a935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ac3565b60006001600160a01b038216611b2a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ac3565b600254600090815b81811015611b885760028181548110611b4d57611b4d6154c3565b6000918252602090912001546001600160a01b0386811691161415611b7857611b7583615696565b92505b611b8181615696565b9050611b32565b50909392505050565b6005546001600160a01b03163314611bbb5760405162461bcd60e51b8152600401610ac39061548e565b61159260006141de565b600554600160a01b900460ff1615611bef5760405162461bcd60e51b8152600401610ac390615551565b828114611c345760405162461bcd60e51b8152602060048201526013602482015272125b98dbdc9c9958dd081a5b9c1d5d0819185d606a1b6044820152606401610ac3565b611c4084848484614230565b6000611c4e85858585613680565b905060005b6001600160401b038116851115611d01578383826001600160401b0316818110611c7f57611c7f6154c3565b9050602002016020810190611c949190615776565b61ffff16601160008888856001600160401b0316818110611cb757611cb76154c3565b90506020020135815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b0316021790555080611cfa906154ef565b9050611c53565b506007546001600160a01b03166323b872dd3330611d27670de0b6b3a76400008661557b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9f919061559a565b507f69c53ddc3d850a7175eb81c1fbb7c46b95b6e3d40bc52fe12c7491a27cf211948585858533604051611dd79594939291906157c7565b60405180910390a15050505050565b60606000826001600160401b03811115611e0257611e02614b02565b604051908082528060200260200182016040528015611e2b578160200160208202803683370190505b50905060005b6001600160401b03811684111561112e57601160008686846001600160401b0316818110611e6157611e616154c3565b90506020020135815260200190815260200160002060009054906101000a90046001600160401b03166001600160401b031682826001600160401b031681518110611eae57611eae6154c3565b6020908102919091010152611ec2816154ef565b9050611e31565b6005546001600160a01b03163314611ef35760405162461bcd60e51b8152600401610ac39061548e565b61159261439d565b6060611f0682611abf565b600010611f255760405162461bcd60e51b8152600401610ac390615666565b6000611f3083611abf565b90506000816001600160401b03811115611f4c57611f4c614b02565b604051908082528060200260200182016040528015611f75578160200160208202803683370190505b50905060005b8281101561112e57611f8d85826113d2565b828281518110611f9f57611f9f6154c3565b602090810291909101015280611fb481615696565b915050611f7b565b60005b8151811015610c9c576000828281518110611fdc57611fdc6154c3565b602002602001015190506000611ff5826000015161408e565b9050600281600101546120089190615727565b6120158360200151614107565b10801561203d57506002816001015461202e9190615727565b61203b8360400151614107565b105b801561209b575060208083015160408085015185518251948501939093529083015260030b6060820152600e9060009060800160408051601f198184030181529181528151602092830120835290820192909252016000205460ff16155b6120dd5760405162461bcd60e51b815260206004820152601360248201527210dbdbdc991a5b985d195cc81a5b9d985b1a59606a1b6044820152606401610ac3565b5050806120e990615696565b9050611fbf565b6005546001600160a01b0316331461211a5760405162461bcd60e51b8152600401610ac39061548e565b6007546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90339083906370a0823190602401602060405180830381865afa15801561216c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612190919061583b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156121db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ff919061559a565b50565b600554600160a01b900460ff161561222c5760405162461bcd60e51b8152600401610ac390615551565b6122376008826141bc565b61224057600080fd5b3361224a83611a33565b6001600160a01b03161461225d57600080fd5b60005b60ff811684111561250b57336001600160a01b038316636352211e878760ff8616818110612290576122906154c3565b905060200201356040518263ffffffff1660e01b81526004016122b591815260200190565b602060405180830381865afa1580156122d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f69190615854565b6001600160a01b03161461230957600080fd5b600f60008387878560ff16818110612323576123236154c3565b9050602002013560405160200161234f9291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff166123b95760405162461bcd60e51b8152602060048201526012602482015271121d5b585b881b9bdd08195b9c9bdb1b195960721b6044820152606401610ac3565b6123ee85858360ff168181106123d1576123d16154c3565b600087815260106020908152604090912093910201359050614402565b6124495760405162461bcd60e51b815260206004820152602660248201527f48756d616e206e6f7420656e726f6c6c656420696e20737065636966696564206044820152656f666669636560d01b6064820152608401610ac3565b61247e85858360ff16818110612461576124616154c3565b60008781526010602090815260409091209391020135905061441a565b506000600f60008488888660ff1681811061249b5761249b6154c3565b905060200201356040516020016124c79291906001600160a01b03929092168252602082015260400190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff1916911515919091179055612504816155f5565b9050612260565b506125196000828686614426565b7fc17a86de6a12b1a37e0ed155aa49a371567592da01fadb9ebbc7a226efe8fb018484846000338660405161255396959493929190615871565b60405180910390a150505050565b6005546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610ac39061548e565b8281146125aa5760405162461bcd60e51b8152600401610ac39061573b565b60006125b58661408e565b905060005b61ffff811685111561265e5783838261ffff168181106125dc576125dc6154c3565b90506020020160208101906125f191906158b3565b82600201600088888561ffff1681811061260d5761260d6154c3565b90506020020160208101906126229190615776565b61ffff1681526020810191909152604001600020805463ffffffff191663ffffffff92909216919091179055612657816158d9565b90506125ba565b50505050505050565b60606000826001600160401b0381111561268357612683614b02565b6040519080825280602002602001820160405280156126ac578160200160208202803683370190505b50905060005b6001600160401b03811684111561112e576126ed8585836001600160401b03168181106126e1576126e16154c3565b90506020020135611a33565b82826001600160401b031681518110612708576127086154c3565b6001600160a01b0390921660209283029190910190910152612729816154ef565b90506126b2565b6005546001600160a01b0316331461275a5760405162461bcd60e51b8152600401610ac39061548e565b60006127658461408e565b905060005b828110156128445781600201600085858481811061278a5761278a6154c3565b905060200201602081019061279f9190615776565b61ffff16815260208101919091526040016000908120805463ffffffff19169055600d90868686858181106127d6576127d66154c3565b90506020020160208101906127eb9190615776565b6040805160039390930b602084015261ffff9091169082015260600160408051601f19818403018152918152815160209283012083529082019290925201600020805460ff1916905561283d81615696565b905061276a565b5050505050565b606060018054610caf90615516565b6005546001600160a01b031633146128845760405162461bcd60e51b8152600401610ac39061548e565b8281146128a35760405162461bcd60e51b8152600401610ac39061573b565b60005b6001600160401b038116841115612985578282826001600160401b03168181106128d2576128d26154c3565b90506020020160208101906128e79190614ccc565b600d6000888888866001600160401b0316818110612907576129076154c3565b905060200201602081019061291c9190615776565b6040805160039390930b602084015261ffff9091169082015260600160405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508061297e906154ef565b90506128a6565b505050505050565b60606000826001600160401b038111156129a9576129a9614b02565b604051908082528060200260200182016040528015612a0157816020015b6129ee6040518060600160405280600060030b815260200160008152602001600081525090565b8152602001906001900390816129c75790505b50905060005b6001600160401b03811684111561112e57601260008686846001600160401b0316818110612a3757612a376154c3565b602090810292909201358352508181019290925260409081016000208151606081018352815460030b81526001820154938101939093526002015490820152825183906001600160401b038416908110612a9357612a936154c3565b602002602001018190525080612aa8906154ef565b9050612a07565b6005546001600160a01b03163314612ad95760405162461bcd60e51b8152600401610ac39061548e565b6000612ae48461408e565b905060028160010154612af79190615727565b8214612b155760405162461bcd60e51b8152600401610ac39061573b565b60005b60028260010154612b299190615727565b81101561284457838382818110612b4257612b426154c3565b90506020020135826003016000836002612b5c919061557b565b8152602081019190915260400160002055612b7681615696565b9050612b18565b6005546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610ac39061548e565b610c9c600882613ae9565b6001600160a01b038216331415612c0b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ac3565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6005546001600160a01b03163314612ca15760405162461bcd60e51b8152600401610ac39061548e565b60005b8151816001600160401b03161015610c9c57600e600083836001600160401b031681518110612cd557612cd56154c3565b60200260200101516020015184846001600160401b031681518110612cfc57612cfc6154c3565b60200260200101516040015185856001600160401b031681518110612d2357612d236154c3565b602002602001015160000151604051602001612d5593929190928352602083019190915260030b604082015260600190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615612e59576000600e600084846001600160401b031681518110612da457612da46154c3565b60200260200101516020015185856001600160401b031681518110612dcb57612dcb6154c3565b60200260200101516040015186866001600160401b031681518110612df257612df26154c3565b602002602001015160000151604051602001612e2493929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555b612e62816154ef565b9050612ca4565b612e733383613e3d565b612e8f5760405162461bcd60e51b8152600401610ac390615615565b612e9b8484848461451c565b50505050565b6005546001600160a01b03163314612ecb5760405162461bcd60e51b8152600401610ac39061548e565b8685148015612ed957508483145b8015612eee5750612eeb60028a615727565b81145b612f0a5760405162461bcd60e51b8152600401610ac39061573b565b60038a900b6000908152600c60205260408120805464ffffffff00191661010063ffffffff8e1602178155600181018b9055905b60ff81168911156130915787878260ff16818110612f5e57612f5e6154c3565b9050602002016020810190612f7391906158b3565b8260020160008c8c8560ff16818110612f8e57612f8e6154c3565b9050602002016020810190612fa39190615776565b61ffff1681526020810191909152604001600020805463ffffffff191663ffffffff92909216919091179055858560ff8316818110612fe457612fe46154c3565b9050602002016020810190612ff99190614ccc565b600d60008e8d8d8660ff16818110613013576130136154c3565b90506020020160208101906130289190615776565b6040805160039390930b602084015261ffff9091169082015260600160405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508061308a906155f5565b9050612f3e565b5060005b6130a060028c615727565b8110156130f4578383828181106130b9576130b96154c3565b905060200201358260030160008360026130d3919061557b565b81526020810191909152604001600020556130ed81615696565b9050613095565b505050505050505050505050565b606061310d82613b4e565b6131635760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610ac3565b600061316d61454f565b9050600081511161318d57604051806020016040528060008152506131b8565b806131978461455e565b6040516020016131a89291906158f1565b6040516020818303038152906040525b9392505050565b6005546001600160a01b031633146131e95760405162461bcd60e51b8152600401610ac39061548e565b60006131f48361408e565b805460ff1916921515929092179091555050565b600554600160a01b900460ff16156132325760405162461bcd60e51b8152600401610ac390615551565b61323d6008826141bc565b6132945760405162461bcd60e51b815260206004820152602260248201527f4e6f7420616d6f6e67737420656e726f6c6c61626c6520636f6c6c656374696f6044820152616e7360f01b6064820152608401610ac3565b3361329e83611a33565b6001600160a01b0316146132f45760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420746865206f776e6572206f6620746865206f666669636500000000006044820152606401610ac3565b6000828152601060205260409020839061330d90613c06565b6000848152601260209081526040808320546011835281842054825160039290920b828501526001600160401b031681830152815180820383018152606090910182528051908301208352600d90915290205461336d919060ff166156f3565b10156133d35760405162461bcd60e51b815260206004820152602f60248201527f546865206f666669636520646f6573206e6f74206861766520656e6f7567682060448201526e736c6f747320617661696c61626c6560881b6064820152608401610ac3565b60005b60ff811684111561363957336001600160a01b038316636352211e878760ff8616818110613406576134066154c3565b905060200201356040518263ffffffff1660e01b815260040161342b91815260200190565b602060405180830381865afa158015613448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346c9190615854565b6001600160a01b0316146134c25760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420746865206f776e6572206f66207468652068756d616e7300000000006044820152606401610ac3565b600f60008387878560ff168181106134dc576134dc6154c3565b905060200201356040516020016135089291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16156135775760405162461bcd60e51b8152602060048201526016602482015275121d5b585b88185b1c9958591e48195b9c9bdb1b195960521b6044820152606401610ac3565b6135ac85858360ff1681811061358f5761358f6154c3565b60008781526010602090815260409091209391020135905061465b565b506001600f60008488888660ff168181106135c9576135c96154c3565b905060200201356040516020016135f59291906001600160a01b03929092168252602082015260400190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff1916911515919091179055613632816155f5565b90506133d6565b504261364781838787614426565b7fff0a92b2c93c530ccb96e3f6a771007cda18875abeb0d6bf5ff3bf43889d6fc8858585843387604051611dd796959493929190615871565b600080805b6001600160801b03811686111561379f5760006136dc601260008a8a866001600160801b03168181106136ba576136ba6154c3565b602090810292909201358352508101919091526040016000205460030b61408e565b905060008160020160008888866001600160801b0316818110613701576137016154c3565b90506020020160208101906137169190615776565b61ffff16815260208101919091526040016000205463ffffffff169050806137805760405162461bcd60e51b815260206004820152601960248201527f556e737570706f72746564206275696c64696e672074797065000000000000006044820152606401610ac3565b61378a81856156b1565b93505050806137989061570a565b9050613685565b5090505b949350505050565b6005546000906064906137c890600160a81b900460ff168461557b565b6137d29190615727565b610a9390836156b1565b6005546001600160a01b031633146138065760405162461bcd60e51b8152600401610ac39061548e565b6001600160a01b03811661386b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ac3565b6121ff816141de565b600554600160a01b900460ff161561389e5760405162461bcd60e51b8152600401610ac390615551565b6138a9600a336141bc565b6139005760405162461bcd60e51b815260206004820152602260248201527f4e6f7420616e20616c6c6f776564207265616c20657374617465206368616e6760448201526132b960f11b6064820152608401610ac3565b8483146139465760405162461bcd60e51b8152602060048201526014602482015273496e636f727265637420696e707574206461746160601b6044820152606401610ac3565b61395286868686614230565b60005b6001600160401b038116861115613a03578484826001600160401b0316818110613981576139816154c3565b90506020020160208101906139969190615776565b61ffff16601160008989856001600160401b03168181106139b9576139b96154c3565b90506020020135815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b03160217905550806139fc906154ef565b9050613955565b506007546001600160a01b03166323b872dd8330613a29670de0b6b3a76400008661557b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015613a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa1919061559a565b507f69c53ddc3d850a7175eb81c1fbb7c46b95b6e3d40bc52fe12c7491a27cf211948686868686604051613ad99594939291906157c7565b60405180910390a1505050505050565b60006131b8836001600160a01b038416614663565b60006001600160e01b031982166380ac58cd60e01b1480613b2f57506001600160e01b03198216635b5e139f60e01b145b80610a9357506301ffc9a760e01b6001600160e01b0319831614610a93565b60025460009082108015610a93575060006001600160a01b031660028381548110613b7b57613b7b6154c3565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613bcd82611a33565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610a93825490565b60006131b883836146b2565b6060600082516001600160401b03811115613c3957613c39614b02565b604051908082528060200260200182016040528015613c62578160200160208202803683370190505b5090506000613c7060025490565b905060005b8451811015611b8857613c8881836156b1565b838281518110613c9a57613c9a6154c3565b6020908102919091010152600160116000613cb584866156b1565b815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b03160217905550848181518110613cf957613cf96154c3565b6020026020010151601260008385613d1191906156b1565b815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908360030b63ffffffff16021790555060208201518160010155604082015181600201559050506001600e6000878481518110613d7857613d786154c3565b602002602001015160200151888581518110613d9657613d966154c3565b602002602001015160400151898681518110613db457613db46154c3565b602002602001015160000151604051602001613de693929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff1916911515919091179055613e2d33613e2883856156b1565b6146dc565b613e3681615696565b9050613c75565b6000613e4882613b4e565b613ea95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ac3565b6000613eb483611a33565b9050806001600160a01b0316846001600160a01b03161480613eef5750836001600160a01b0316613ee484610d7c565b6001600160a01b0316145b806137a357506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff166137a3565b826001600160a01b0316613f3682611a33565b6001600160a01b031614613f9e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ac3565b6001600160a01b0382166140005760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ac3565b61400b600082613b98565b816002828154811061401f5761401f6154c3565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006131b8836001600160a01b0384166146f6565b600381900b6000908152600c602052604081206001810154610a935760405162461bcd60e51b815260206004820152602c60248201527f5468657265206973206e6f20636f6e66696775726174696f6e20666f7220707260448201526b37bb34b232b2103630bcb2b960a11b6064820152608401610ac3565b60008082121561171f5761411a82615930565b610a93565b600554600160a01b900460ff1661416f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ac3565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038116600090815260018301602052604081205415156131b8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b6001600160401b038116841115612844578282826001600160401b031681811061425f5761425f6154c3565b90506020020160208101906142749190615776565b61ffff16601160008787856001600160401b0316818110614297576142976154c3565b60209081029290920135835250810191909152604001600020546001600160401b031614156143005760405162461bcd60e51b815260206004820152601560248201527413dc195c985d1a5bdb881b9bdd08185b1b1bddd959605a1b6044820152606401610ac3565b61431e8585836001600160401b03168181106126e1576126e16154c3565b6001600160a01b0316336001600160a01b03161461438d5760405162461bcd60e51b815260206004820152602660248201527f4e6f7420746865206f776e6572206f6620746865207265616c2065737461746560448201526520706965636560d01b6064820152608401610ac3565b614396816154ef565b9050614233565b600554600160a01b900460ff16156143c75760405162461bcd60e51b8152600401610ac390615551565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861419f3390565b600081815260018301602052604081205415156131b8565b60006131b883836146f6565b6000816001600160401b0381111561444057614440614b02565b604051908082528060200260200182016040528015614469578160200160208202803683370190505b50905060005b81518160ff1610156144ac5785828260ff1681518110614491576144916154c3565b60209081029190910101526144a5816155f5565b905061446f565b50600754604051630df6e7a160e31b81526001600160a01b0390911690636fb73d08906144e390879087908790879060040161594d565b600060405180830381600087803b1580156144fd57600080fd5b505af1158015614511573d6000803e3d6000fd5b505050505050505050565b614527848484613f23565b614533848484846147e9565b612e9b5760405162461bcd60e51b8152600401610ac39061598f565b606060068054610caf90615516565b6060816145825750506040805180820190915260018152600360fc1b602082015290565b8160005b81156145ac578061459681615696565b91506145a59050600a83615727565b9150614586565b6000816001600160401b038111156145c6576145c6614b02565b6040519080825280601f01601f1916602001820160405280156145f0576020820181803683370190505b5090505b84156137a3576146056001836156f3565b9150614612600a866156df565b61461d9060306156b1565b60f81b818381518110614632576146326154c3565b60200101906001600160f81b031916908160001a905350614654600a86615727565b94506145f4565b60006131b883835b60008181526001830160205260408120546146aa57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a93565b506000610a93565b60008260000182815481106146c9576146c96154c3565b9060005260206000200154905092915050565b610c9c8282604051806020016040528060008152506148e4565b600081815260018301602052604081205480156147df57600061471a6001836156f3565b855490915060009061472e906001906156f3565b905081811461479357600086600001828154811061474e5761474e6154c3565b9060005260206000200154905080876000018481548110614771576147716154c3565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806147a4576147a46159e1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a93565b6000915050610a93565b60006001600160a01b0384163b156148dc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061482d9033908990889088906004016159f7565b6020604051808303816000875af1925050508015614868575060408051601f3d908101601f1916820190925261486591810190615a34565b60015b6148c2573d808015614896576040519150601f19603f3d011682016040523d82523d6000602084013e61489b565b606091505b5080516148ba5760405162461bcd60e51b8152600401610ac39061598f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506137a3565b5060016137a3565b6148ee8383614917565b6148fb60008484846147e9565b610f155760405162461bcd60e51b8152600401610ac39061598f565b6001600160a01b03821661496d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ac3565b61497681613b4e565b156149c35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ac3565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054614a4b90615516565b90600052602060002090601f016020900481019282614a6d5760008555614ab3565b82601f10614a8657805160ff1916838001178555614ab3565b82800160010185558215614ab3579182015b82811115614ab3578251825591602001919060010190614a98565b5061171f9291505b8082111561171f5760008155600101614abb565b6001600160e01b0319811681146121ff57600080fd5b600060208284031215614af757600080fd5b81356131b881614acf565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715614b3a57614b3a614b02565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6857614b68614b02565b604052919050565b8035600381900b8114614b8257600080fd5b919050565b60006020808385031215614b9a57600080fd5b82356001600160401b0380821115614bb157600080fd5b818501915085601f830112614bc557600080fd5b813581811115614bd757614bd7614b02565b614be5848260051b01614b40565b81815284810192506060918202840185019188831115614c0457600080fd5b938501935b82851015614c555780858a031215614c215760008081fd5b614c29614b18565b614c3286614b70565b815285870135878201526040808701359082015284529384019392850192614c09565b50979650505050505050565b60005b83811015614c7c578181015183820152602001614c64565b83811115612e9b5750506000910152565b60008151808452614ca5816020860160208601614c61565b601f01601f19169290920160200192915050565b6020815260006131b86020830184614c8d565b600060208284031215614cde57600080fd5b813560ff811681146131b857600080fd5b600060208284031215614d0157600080fd5b5035919050565b6001600160a01b03811681146121ff57600080fd5b60008060408385031215614d3057600080fd5b8235614d3b81614d08565b946020939093013593505050565b60008083601f840112614d5b57600080fd5b5081356001600160401b03811115614d7257600080fd5b6020830191508360208260051b8501011115614d8d57600080fd5b9250929050565b60008060208385031215614da757600080fd5b82356001600160401b03811115614dbd57600080fd5b614dc985828601614d49565b90969095509350505050565b600081518084526020808501945080840160005b83811015614e0557815187529582019590820190600101614de9565b509495945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015614e6557603f19888603018452614e53858351614dd5565b94509285019290850190600101614e37565b5092979650505050505050565b600080600060608486031215614e8757600080fd5b8335614e9281614d08565b92506020840135614ea281614d08565b929592945050506040919091013590565b600060208284031215614ec557600080fd5b81356131b881614d08565b60008060008060608587031215614ee657600080fd5b614eef85614b70565b93506020850135925060408501356001600160401b03811115614f1157600080fd5b614f1d87828801614d49565b95989497509550505050565b60006001600160401b03831115614f4257614f42614b02565b614f55601f8401601f1916602001614b40565b9050828152838383011115614f6957600080fd5b828260208301376000602084830101529392505050565b600060208284031215614f9257600080fd5b81356001600160401b03811115614fa857600080fd5b8201601f81018413614fb957600080fd5b6137a384823560208401614f29565b60008060008060408587031215614fde57600080fd5b84356001600160401b0380821115614ff557600080fd5b61500188838901614d49565b9096509450602087013591508082111561501a57600080fd5b50614f1d87828801614d49565b6020815260006131b86020830184614dd5565b6000806000806060858703121561505057600080fd5b84356001600160401b0381111561506657600080fd5b61507287828801614d49565b90955093505060208501359150604085013561508d81614d08565b939692955090935050565b6000806000806000606086880312156150b057600080fd5b6150b986614b70565b945060208601356001600160401b03808211156150d557600080fd5b6150e189838a01614d49565b909650945060408801359150808211156150fa57600080fd5b5061510788828901614d49565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b818110156151595783516001600160a01b031683529284019291840191600101615134565b50909695505050505050565b60008060006040848603121561517a57600080fd5b61518384614b70565b925060208401356001600160401b0381111561519e57600080fd5b6151aa86828701614d49565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614e05578151805160030b8852838101518489015260409081015190880152606090960195908201906001016151cb565b6020815260006131b860208301846151b7565b80151581146121ff57600080fd5b6000806040838503121561523457600080fd5b823561523f81614d08565b9150602083013561524f81615213565b809150509250929050565b6000806000806080858703121561527057600080fd5b843561527b81614d08565b9350602085013561528b81614d08565b92506040850135915060608501356001600160401b038111156152ad57600080fd5b8501601f810187136152be57600080fd5b6152cd87823560208401614f29565b91505092959194509250565b60008060008060008060008060008060c08b8d0312156152f857600080fd5b6153018b614b70565b995060208b0135985060408b01356001600160401b038082111561532457600080fd5b6153308e838f01614d49565b909a50985060608d013591508082111561534957600080fd5b6153558e838f01614d49565b909850965060808d013591508082111561536e57600080fd5b61537a8e838f01614d49565b909650945060a08d013591508082111561539357600080fd5b506153a08d828e01614d49565b915080935050809150509295989b9194979a5092959850565b600080604083850312156153cc57600080fd5b61523f83614b70565b600080604083850312156153e857600080fd5b82356153f381614d08565b9150602083013561524f81614d08565b6000806000806000806080878903121561541c57600080fd5b86356001600160401b038082111561543357600080fd5b61543f8a838b01614d49565b9098509650602089013591508082111561545857600080fd5b5061546589828a01614d49565b909550935050604087013561547981614d08565b80925050606087013590509295509295509295565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160401b038083168181141561550c5761550c6154d9565b6001019392505050565b600181811c9082168061552a57607f821691505b6020821081141561554b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6000816000190483118215151615615595576155956154d9565b500290565b6000602082840312156155ac57600080fd5b81516131b881615213565b6060815260006155ca6060830186614dd5565b82810360208401526155dc81866151b7565b91505060018060a01b0383166040830152949350505050565b600060ff821660ff81141561560c5761560c6154d9565b60010192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526016908201527522a9219b9918a2b73ab69d1037bbb732b91034b7b7b160511b604082015260600190565b60006000198214156156aa576156aa6154d9565b5060010190565b600082198211156156c4576156c46154d9565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826156ee576156ee6156c9565b500690565b600082821015615705576157056154d9565b500390565b60006001600160801b038083168181141561550c5761550c6154d9565b600082615736576157366156c9565b500490565b6020808252600f908201526e125b98dbdc9c9958dd081a5b9c1d5d608a1b604082015260600190565b803561ffff81168114614b8257600080fd5b60006020828403121561578857600080fd5b6131b882615764565b81835260006001600160fb1b038311156157aa57600080fd5b8260051b8083602087013760009401602001938452509192915050565b6060815260006157db606083018789615791565b8281036020848101919091528582528691810160005b878110156158185761ffff61580585615764565b16825292820192908201906001016157f1565b506001600160a01b03959095166040949094019390935250919695505050505050565b60006020828403121561584d57600080fd5b5051919050565b60006020828403121561586657600080fd5b81516131b881614d08565b60a08152600061588560a08301888a615791565b60208301969096525060408101939093526001600160a01b0391821660608401521660809091015292915050565b6000602082840312156158c557600080fd5b813563ffffffff811681146131b857600080fd5b600061ffff8083168181141561550c5761550c6154d9565b60008351615903818460208801614c61565b835190830190615917818360208801614c61565b64173539b7b760d91b9101908152600501949350505050565b6000600160ff1b821415615946576159466154d9565b5060000390565b6001600160a01b03851681526060602082018190526000906159729083018587615791565b82810360408401526159848185614dd5565b979650505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a2a90830184614c8d565b9695505050505050565b600060208284031215615a4657600080fd5b81516131b881614acf56fea26469706673582212206def07fd7d4a58c9e84d7978959e4e8eddefd981b54af98164bfe4f21515411364736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000068b1b0b89e52440df04237a21751331ae9e87a2300000000000000000000000000000000000000000000000000000000000000124d657461436974795265616c457374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d43524500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f68756d616e732d6d65746176657273652d7265616c2d6573746174652f6d657461646174612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008a9ece9d8806eb0cde56ac89ccb23a36e2c718cf

Deployed Bytecode

0x6080604052600436106103505760003560e01c80638249fd53116101c6578063a13882bf116100f7578063ce5d56d111610095578063e1159a301161006f578063e1159a30146109c5578063e985e9c5146109e5578063f2fde38b14610a2e578063ff9c954e14610a4e57600080fd5b8063ce5d56d114610965578063cee49f8014610985578063d90bab1d146109a557600080fd5b8063aa279078116100d1578063aa279078146108e5578063b88d4fde14610905578063c132228814610925578063c87b56dd1461094557600080fd5b8063a13882bf14610885578063a174e77a146108a5578063a22cb465146108c557600080fd5b80638e5f5fce1161016457806395d89b411161013e57806395d89b41146108035780639c8e4cc0146108185780639d76ea58146108385780639e05de3c1461085857600080fd5b80638e5f5fce146107965780638fdde8fb146107b65780639378d12b146107e357600080fd5b806388eeef6d116101a057806388eeef6d146107235780638d8f2adb146107435780638da5cb5b146107585780638e34795c1461077657600080fd5b80638249fd53146106c15780638456cb59146106ee5780638462151c1461070357600080fd5b80632f745c59116102a057806355f804b31161023e5780636352211e116102185780636352211e1461065957806370a0823114610679578063715018a61461069957806376dd63f6146106ae57600080fd5b806355f804b3146105fa57806358a4b3861461061a5780635c975abb1461063a57600080fd5b806341b9e8631161027a57806341b9e8631461057a57806342842e0e1461059a5780634f6ccce7146105ba5780635028d05a146105da57600080fd5b80632f745c591461052557806337f9ae02146105455780633f4ba83a1461056557600080fd5b80630d84c10e1161030d5780631fa43a66116102e75780631fa43a66146104a557806323b872dd146104c557806326a4e8d2146104e557806329a2204c1461050557600080fd5b80630d84c10e146104465780630eaf7c1e1461047357806318160ddd1461048657600080fd5b806301ffc9a71461035557806303e4c84b1461038a57806306fdde03146103ac57806307e37ab6146103ce578063081812fc146103ee578063095ea7b314610426575b600080fd5b34801561036157600080fd5b50610375610370366004614ae5565b610a6e565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b506103aa6103a5366004614b87565b610a99565b005b3480156103b857600080fd5b506103c1610ca0565b6040516103819190614cb9565b3480156103da57600080fd5b506103aa6103e9366004614ccc565b610d32565b3480156103fa57600080fd5b5061040e610409366004614cef565b610d7c565b6040516001600160a01b039091168152602001610381565b34801561043257600080fd5b506103aa610441366004614d1d565b610e04565b34801561045257600080fd5b50610466610461366004614d94565b610f1a565b6040516103819190614e10565b6103aa610481366004614b87565b611136565b34801561049257600080fd5b506002545b604051908152602001610381565b3480156104b157600080fd5b506103aa6104c0366004614d94565b611259565b3480156104d157600080fd5b506103aa6104e0366004614e72565b6112d7565b3480156104f157600080fd5b506103aa610500366004614eb3565b611308565b34801561051157600080fd5b506103aa610520366004614d94565b611354565b34801561053157600080fd5b50610497610540366004614d1d565b6113d2565b34801561055157600080fd5b50610497610560366004614b87565b611481565b34801561057157600080fd5b506103aa611560565b34801561058657600080fd5b506103aa610595366004614ed0565b611594565b3480156105a657600080fd5b506103aa6105b5366004614e72565b6116ab565b3480156105c657600080fd5b506104976105d5366004614cef565b6116c6565b3480156105e657600080fd5b506103aa6105f5366004614eb3565b611723565b34801561060657600080fd5b506103aa610615366004614f80565b6117af565b34801561062657600080fd5b506103aa610635366004614b87565b6117ec565b34801561064657600080fd5b50600554600160a01b900460ff16610375565b34801561066557600080fd5b5061040e610674366004614cef565b611a33565b34801561068557600080fd5b50610497610694366004614eb3565b611abf565b3480156106a557600080fd5b506103aa611b91565b6103aa6106bc366004614fc8565b611bc5565b3480156106cd57600080fd5b506106e16106dc366004614d94565b611de6565b6040516103819190615027565b3480156106fa57600080fd5b506103aa611ec9565b34801561070f57600080fd5b506106e161071e366004614eb3565b611efb565b34801561072f57600080fd5b506103aa61073e366004614b87565b611fbc565b34801561074f57600080fd5b506103aa6120f0565b34801561076457600080fd5b506005546001600160a01b031661040e565b34801561078257600080fd5b506103aa61079136600461503a565b612202565b3480156107a257600080fd5b506103aa6107b1366004615098565b612561565b3480156107c257600080fd5b506107d66107d1366004614d94565b612667565b6040516103819190615118565b3480156107ef57600080fd5b506103aa6107fe366004615165565b612730565b34801561080f57600080fd5b506103c161284b565b34801561082457600080fd5b506103aa610833366004615098565b61285a565b34801561084457600080fd5b5060075461040e906001600160a01b031681565b34801561086457600080fd5b50610878610873366004614d94565b61298d565b6040516103819190615200565b34801561089157600080fd5b506103aa6108a0366004615165565b612aaf565b3480156108b157600080fd5b506103aa6108c0366004614eb3565b612b7d565b3480156108d157600080fd5b506103aa6108e0366004615221565b612bb2565b3480156108f157600080fd5b506103aa610900366004614b87565b612c77565b34801561091157600080fd5b506103aa61092036600461525a565b612e69565b34801561093157600080fd5b506103aa6109403660046152d9565b612ea1565b34801561095157600080fd5b506103c1610960366004614cef565b613102565b34801561097157600080fd5b506103aa6109803660046153b9565b6131bf565b34801561099157600080fd5b506103aa6109a036600461503a565b613208565b3480156109b157600080fd5b506104976109c0366004614fc8565b613680565b3480156109d157600080fd5b506104976109e0366004614cef565b6137ab565b3480156109f157600080fd5b50610375610a003660046153d5565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610a3a57600080fd5b506103aa610a49366004614eb3565b6137dc565b348015610a5a57600080fd5b506103aa610a69366004615403565b613874565b60006001600160e01b0319821663780e9d6360e01b1480610a935750610a9382613afe565b92915050565b6005546001600160a01b03163314610acc5760405162461bcd60e51b8152600401610ac39061548e565b60405180910390fd5b610ad581611fbc565b60005b8151816001600160401b03161015610c9c57600e600083836001600160401b031681518110610b0957610b096154c3565b60200260200101516020015184846001600160401b031681518110610b3057610b306154c3565b60200260200101516040015185856001600160401b031681518110610b5757610b576154c3565b602002602001015160000151604051602001610b8993929190928352602083019190915260030b604082015260600190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16610c8c576001600e600084846001600160401b031681518110610bd757610bd76154c3565b60200260200101516020015185856001600160401b031681518110610bfe57610bfe6154c3565b60200260200101516040015186866001600160401b031681518110610c2557610c256154c3565b602002602001015160000151604051602001610c5793929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555b610c95816154ef565b9050610ad8565b5050565b606060008054610caf90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054610cdb90615516565b8015610d285780601f10610cfd57610100808354040283529160200191610d28565b820191906000526020600020905b815481529060010190602001808311610d0b57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610d5c5760405162461bcd60e51b8152600401610ac39061548e565b6005805460ff909216600160a81b0260ff60a81b19909216919091179055565b6000610d8782613b4e565b610de85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ac3565b506000908152600360205260409020546001600160a01b031690565b6000610e0f82611a33565b9050806001600160a01b0316836001600160a01b03161415610e7d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ac3565b336001600160a01b0382161480610e995750610e998133610a00565b610f0b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ac3565b610f158383613b98565b505050565b60606000826001600160401b03811115610f3657610f36614b02565b604051908082528060200260200182016040528015610f6957816020015b6060815260200190600190039081610f545790505b50905060005b6001600160401b03811684111561112e57610fbc601060008787856001600160401b0316818110610fa257610fa26154c3565b905060200201358152602001908152602001600020613c06565b6001600160401b03811115610fd357610fd3614b02565b604051908082528060200260200182016040528015610ffc578160200160208202803683370190505b50828686846001600160401b0316818110611019576110196154c3565b9050602002013581518110611030576110306154c3565b602002602001018190525060005b611060601060008888866001600160401b0316818110610fa257610fa26154c3565b8160ff16101561111d576110b38160ff16601060008989876001600160401b0316818110611090576110906154c3565b905060200201358152602001908152602001600020613c1090919063ffffffff16565b838787856001600160401b03168181106110cf576110cf6154c3565b90506020020135815181106110e6576110e66154c3565b60200260200101518260ff1681518110611102576111026154c3565b6020908102919091010152611116826154ef565b915061103e565b50611127816154ef565b9050610f6f565b509392505050565b600554600160a01b900460ff16156111605760405162461bcd60e51b8152600401610ac390615551565b600061116b82611481565b9050600061117883613c1c565b6007549091506001600160a01b03166323b872dd33306111a0670de0b6b3a76400008761557b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156111f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611218919061559a565b507fa5f3babd86e9dc9d25da4acb001bdcbb02b785612ad3cba77e9501fc01312f8681843360405161124c939291906155b7565b60405180910390a1505050565b6005546001600160a01b031633146112835760405162461bcd60e51b8152600401610ac39061548e565b60005b60ff8116821115610f15576112c683838360ff168181106112a9576112a96154c3565b90506020020160208101906112be9190614eb3565b600a90613ae9565b506112d0816155f5565b9050611286565b6112e13382613e3d565b6112fd5760405162461bcd60e51b8152600401610ac390615615565b610f15838383613f23565b6005546001600160a01b031633146113325760405162461bcd60e51b8152600401610ac39061548e565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461137e5760405162461bcd60e51b8152600401610ac39061548e565b60005b60ff8116821115610f15576113c183838360ff168181106113a4576113a46154c3565b90506020020160208101906113b99190614eb3565b600a90614079565b506113cb816155f5565b9050611381565b60006113dd83611abf565b82106113fb5760405162461bcd60e51b8152600401610ac390615666565b6000805b600254811015611468576002818154811061141c5761141c6154c3565b6000918252602090912001546001600160a01b0386811691161415611458578382141561144c579150610a939050565b61145582615696565b91505b61146181615696565b90506113ff565b5060405162461bcd60e51b8152600401610ac390615666565b600061148c82611fbc565b6000805b8351816001600160801b0316101561155957600084826001600160801b0316815181106114bf576114bf6154c3565b6020026020010151905060006114d8826000015161408e565b905060006114e98360400151614107565b6114f68460200151614107565b61150091906156b1565b905061150d6002826156df565b60011461151a5780611525565b6115256001826156f3565b600081815260038401602052604090205490915061154390866156b1565b9450505050806115529061570a565b9050611490565b5092915050565b6005546001600160a01b0316331461158a5760405162461bcd60e51b8152600401610ac39061548e565b61159261411f565b565b6005546001600160a01b031633146115be5760405162461bcd60e51b8152600401610ac39061548e565b60006115c98561408e565b9050600281600101546115dc9190615727565b6115e7600286615727565b6115f191906156f3565b821461160f5760405162461bcd60e51b8152600401610ac39061573b565b6000600282600101546116229190615727565b90505b611630600286615727565b81101561169e5783836002846001015461164a9190615727565b61165490846156f3565b818110611663576116636154c3565b9050602002013582600301600083600261167d919061557b565b815260208101919091526040016000205561169781615696565b9050611625565b5060010192909255505050565b610f1583838360405180602001604052806000815250612e69565b60006116d160025490565b821061171f5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610ac3565b5090565b6005546001600160a01b0316331461174d5760405162461bcd60e51b8152600401610ac39061548e565b6117586008826141bc565b6117a45760405162461bcd60e51b815260206004820152601b60248201527f5370656369666965642061646472657373206e6f7420666f756e6400000000006044820152606401610ac3565b610c9c600882614079565b6005546001600160a01b031633146117d95760405162461bcd60e51b8152600401610ac39061548e565b8051610c9c906006906020840190614a3f565b6005546001600160a01b031633146118165760405162461bcd60e51b8152600401610ac39061548e565b61181f81611fbc565b600061182a82613c1c565b905060005b8251816001600160401b031610156119f357600e600084836001600160401b031681518110611860576118606154c3565b60200260200101516020015185846001600160401b031681518110611887576118876154c3565b60200260200101516040015186856001600160401b0316815181106118ae576118ae6154c3565b6020026020010151600001516040516020016118e093929190928352602083019190915260030b604082015260600190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff166119e3576001600e600085846001600160401b03168151811061192e5761192e6154c3565b60200260200101516020015186856001600160401b031681518110611955576119556154c3565b60200260200101516040015187866001600160401b03168151811061197c5761197c6154c3565b6020026020010151600001516040516020016119ae93929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555b6119ec816154ef565b905061182f565b507fa5f3babd86e9dc9d25da4acb001bdcbb02b785612ad3cba77e9501fc01312f86818333604051611a27939291906155b7565b60405180910390a15050565b60008060028381548110611a4957611a496154c3565b6000918252602090912001546001600160a01b0316905080610a935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ac3565b60006001600160a01b038216611b2a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ac3565b600254600090815b81811015611b885760028181548110611b4d57611b4d6154c3565b6000918252602090912001546001600160a01b0386811691161415611b7857611b7583615696565b92505b611b8181615696565b9050611b32565b50909392505050565b6005546001600160a01b03163314611bbb5760405162461bcd60e51b8152600401610ac39061548e565b61159260006141de565b600554600160a01b900460ff1615611bef5760405162461bcd60e51b8152600401610ac390615551565b828114611c345760405162461bcd60e51b8152602060048201526013602482015272125b98dbdc9c9958dd081a5b9c1d5d0819185d606a1b6044820152606401610ac3565b611c4084848484614230565b6000611c4e85858585613680565b905060005b6001600160401b038116851115611d01578383826001600160401b0316818110611c7f57611c7f6154c3565b9050602002016020810190611c949190615776565b61ffff16601160008888856001600160401b0316818110611cb757611cb76154c3565b90506020020135815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b0316021790555080611cfa906154ef565b9050611c53565b506007546001600160a01b03166323b872dd3330611d27670de0b6b3a76400008661557b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9f919061559a565b507f69c53ddc3d850a7175eb81c1fbb7c46b95b6e3d40bc52fe12c7491a27cf211948585858533604051611dd79594939291906157c7565b60405180910390a15050505050565b60606000826001600160401b03811115611e0257611e02614b02565b604051908082528060200260200182016040528015611e2b578160200160208202803683370190505b50905060005b6001600160401b03811684111561112e57601160008686846001600160401b0316818110611e6157611e616154c3565b90506020020135815260200190815260200160002060009054906101000a90046001600160401b03166001600160401b031682826001600160401b031681518110611eae57611eae6154c3565b6020908102919091010152611ec2816154ef565b9050611e31565b6005546001600160a01b03163314611ef35760405162461bcd60e51b8152600401610ac39061548e565b61159261439d565b6060611f0682611abf565b600010611f255760405162461bcd60e51b8152600401610ac390615666565b6000611f3083611abf565b90506000816001600160401b03811115611f4c57611f4c614b02565b604051908082528060200260200182016040528015611f75578160200160208202803683370190505b50905060005b8281101561112e57611f8d85826113d2565b828281518110611f9f57611f9f6154c3565b602090810291909101015280611fb481615696565b915050611f7b565b60005b8151811015610c9c576000828281518110611fdc57611fdc6154c3565b602002602001015190506000611ff5826000015161408e565b9050600281600101546120089190615727565b6120158360200151614107565b10801561203d57506002816001015461202e9190615727565b61203b8360400151614107565b105b801561209b575060208083015160408085015185518251948501939093529083015260030b6060820152600e9060009060800160408051601f198184030181529181528151602092830120835290820192909252016000205460ff16155b6120dd5760405162461bcd60e51b815260206004820152601360248201527210dbdbdc991a5b985d195cc81a5b9d985b1a59606a1b6044820152606401610ac3565b5050806120e990615696565b9050611fbf565b6005546001600160a01b0316331461211a5760405162461bcd60e51b8152600401610ac39061548e565b6007546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90339083906370a0823190602401602060405180830381865afa15801561216c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612190919061583b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156121db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ff919061559a565b50565b600554600160a01b900460ff161561222c5760405162461bcd60e51b8152600401610ac390615551565b6122376008826141bc565b61224057600080fd5b3361224a83611a33565b6001600160a01b03161461225d57600080fd5b60005b60ff811684111561250b57336001600160a01b038316636352211e878760ff8616818110612290576122906154c3565b905060200201356040518263ffffffff1660e01b81526004016122b591815260200190565b602060405180830381865afa1580156122d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f69190615854565b6001600160a01b03161461230957600080fd5b600f60008387878560ff16818110612323576123236154c3565b9050602002013560405160200161234f9291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff166123b95760405162461bcd60e51b8152602060048201526012602482015271121d5b585b881b9bdd08195b9c9bdb1b195960721b6044820152606401610ac3565b6123ee85858360ff168181106123d1576123d16154c3565b600087815260106020908152604090912093910201359050614402565b6124495760405162461bcd60e51b815260206004820152602660248201527f48756d616e206e6f7420656e726f6c6c656420696e20737065636966696564206044820152656f666669636560d01b6064820152608401610ac3565b61247e85858360ff16818110612461576124616154c3565b60008781526010602090815260409091209391020135905061441a565b506000600f60008488888660ff1681811061249b5761249b6154c3565b905060200201356040516020016124c79291906001600160a01b03929092168252602082015260400190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff1916911515919091179055612504816155f5565b9050612260565b506125196000828686614426565b7fc17a86de6a12b1a37e0ed155aa49a371567592da01fadb9ebbc7a226efe8fb018484846000338660405161255396959493929190615871565b60405180910390a150505050565b6005546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610ac39061548e565b8281146125aa5760405162461bcd60e51b8152600401610ac39061573b565b60006125b58661408e565b905060005b61ffff811685111561265e5783838261ffff168181106125dc576125dc6154c3565b90506020020160208101906125f191906158b3565b82600201600088888561ffff1681811061260d5761260d6154c3565b90506020020160208101906126229190615776565b61ffff1681526020810191909152604001600020805463ffffffff191663ffffffff92909216919091179055612657816158d9565b90506125ba565b50505050505050565b60606000826001600160401b0381111561268357612683614b02565b6040519080825280602002602001820160405280156126ac578160200160208202803683370190505b50905060005b6001600160401b03811684111561112e576126ed8585836001600160401b03168181106126e1576126e16154c3565b90506020020135611a33565b82826001600160401b031681518110612708576127086154c3565b6001600160a01b0390921660209283029190910190910152612729816154ef565b90506126b2565b6005546001600160a01b0316331461275a5760405162461bcd60e51b8152600401610ac39061548e565b60006127658461408e565b905060005b828110156128445781600201600085858481811061278a5761278a6154c3565b905060200201602081019061279f9190615776565b61ffff16815260208101919091526040016000908120805463ffffffff19169055600d90868686858181106127d6576127d66154c3565b90506020020160208101906127eb9190615776565b6040805160039390930b602084015261ffff9091169082015260600160408051601f19818403018152918152815160209283012083529082019290925201600020805460ff1916905561283d81615696565b905061276a565b5050505050565b606060018054610caf90615516565b6005546001600160a01b031633146128845760405162461bcd60e51b8152600401610ac39061548e565b8281146128a35760405162461bcd60e51b8152600401610ac39061573b565b60005b6001600160401b038116841115612985578282826001600160401b03168181106128d2576128d26154c3565b90506020020160208101906128e79190614ccc565b600d6000888888866001600160401b0316818110612907576129076154c3565b905060200201602081019061291c9190615776565b6040805160039390930b602084015261ffff9091169082015260600160405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508061297e906154ef565b90506128a6565b505050505050565b60606000826001600160401b038111156129a9576129a9614b02565b604051908082528060200260200182016040528015612a0157816020015b6129ee6040518060600160405280600060030b815260200160008152602001600081525090565b8152602001906001900390816129c75790505b50905060005b6001600160401b03811684111561112e57601260008686846001600160401b0316818110612a3757612a376154c3565b602090810292909201358352508181019290925260409081016000208151606081018352815460030b81526001820154938101939093526002015490820152825183906001600160401b038416908110612a9357612a936154c3565b602002602001018190525080612aa8906154ef565b9050612a07565b6005546001600160a01b03163314612ad95760405162461bcd60e51b8152600401610ac39061548e565b6000612ae48461408e565b905060028160010154612af79190615727565b8214612b155760405162461bcd60e51b8152600401610ac39061573b565b60005b60028260010154612b299190615727565b81101561284457838382818110612b4257612b426154c3565b90506020020135826003016000836002612b5c919061557b565b8152602081019190915260400160002055612b7681615696565b9050612b18565b6005546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610ac39061548e565b610c9c600882613ae9565b6001600160a01b038216331415612c0b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ac3565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6005546001600160a01b03163314612ca15760405162461bcd60e51b8152600401610ac39061548e565b60005b8151816001600160401b03161015610c9c57600e600083836001600160401b031681518110612cd557612cd56154c3565b60200260200101516020015184846001600160401b031681518110612cfc57612cfc6154c3565b60200260200101516040015185856001600160401b031681518110612d2357612d236154c3565b602002602001015160000151604051602001612d5593929190928352602083019190915260030b604082015260600190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615612e59576000600e600084846001600160401b031681518110612da457612da46154c3565b60200260200101516020015185856001600160401b031681518110612dcb57612dcb6154c3565b60200260200101516040015186866001600160401b031681518110612df257612df26154c3565b602002602001015160000151604051602001612e2493929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff19169115159190911790555b612e62816154ef565b9050612ca4565b612e733383613e3d565b612e8f5760405162461bcd60e51b8152600401610ac390615615565b612e9b8484848461451c565b50505050565b6005546001600160a01b03163314612ecb5760405162461bcd60e51b8152600401610ac39061548e565b8685148015612ed957508483145b8015612eee5750612eeb60028a615727565b81145b612f0a5760405162461bcd60e51b8152600401610ac39061573b565b60038a900b6000908152600c60205260408120805464ffffffff00191661010063ffffffff8e1602178155600181018b9055905b60ff81168911156130915787878260ff16818110612f5e57612f5e6154c3565b9050602002016020810190612f7391906158b3565b8260020160008c8c8560ff16818110612f8e57612f8e6154c3565b9050602002016020810190612fa39190615776565b61ffff1681526020810191909152604001600020805463ffffffff191663ffffffff92909216919091179055858560ff8316818110612fe457612fe46154c3565b9050602002016020810190612ff99190614ccc565b600d60008e8d8d8660ff16818110613013576130136154c3565b90506020020160208101906130289190615776565b6040805160039390930b602084015261ffff9091169082015260600160405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508061308a906155f5565b9050612f3e565b5060005b6130a060028c615727565b8110156130f4578383828181106130b9576130b96154c3565b905060200201358260030160008360026130d3919061557b565b81526020810191909152604001600020556130ed81615696565b9050613095565b505050505050505050505050565b606061310d82613b4e565b6131635760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656044820152603760f91b6064820152608401610ac3565b600061316d61454f565b9050600081511161318d57604051806020016040528060008152506131b8565b806131978461455e565b6040516020016131a89291906158f1565b6040516020818303038152906040525b9392505050565b6005546001600160a01b031633146131e95760405162461bcd60e51b8152600401610ac39061548e565b60006131f48361408e565b805460ff1916921515929092179091555050565b600554600160a01b900460ff16156132325760405162461bcd60e51b8152600401610ac390615551565b61323d6008826141bc565b6132945760405162461bcd60e51b815260206004820152602260248201527f4e6f7420616d6f6e67737420656e726f6c6c61626c6520636f6c6c656374696f6044820152616e7360f01b6064820152608401610ac3565b3361329e83611a33565b6001600160a01b0316146132f45760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420746865206f776e6572206f6620746865206f666669636500000000006044820152606401610ac3565b6000828152601060205260409020839061330d90613c06565b6000848152601260209081526040808320546011835281842054825160039290920b828501526001600160401b031681830152815180820383018152606090910182528051908301208352600d90915290205461336d919060ff166156f3565b10156133d35760405162461bcd60e51b815260206004820152602f60248201527f546865206f666669636520646f6573206e6f74206861766520656e6f7567682060448201526e736c6f747320617661696c61626c6560881b6064820152608401610ac3565b60005b60ff811684111561363957336001600160a01b038316636352211e878760ff8616818110613406576134066154c3565b905060200201356040518263ffffffff1660e01b815260040161342b91815260200190565b602060405180830381865afa158015613448573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346c9190615854565b6001600160a01b0316146134c25760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420746865206f776e6572206f66207468652068756d616e7300000000006044820152606401610ac3565b600f60008387878560ff168181106134dc576134dc6154c3565b905060200201356040516020016135089291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff16156135775760405162461bcd60e51b8152602060048201526016602482015275121d5b585b88185b1c9958591e48195b9c9bdb1b195960521b6044820152606401610ac3565b6135ac85858360ff1681811061358f5761358f6154c3565b60008781526010602090815260409091209391020135905061465b565b506001600f60008488888660ff168181106135c9576135c96154c3565b905060200201356040516020016135f59291906001600160a01b03929092168252602082015260400190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff1916911515919091179055613632816155f5565b90506133d6565b504261364781838787614426565b7fff0a92b2c93c530ccb96e3f6a771007cda18875abeb0d6bf5ff3bf43889d6fc8858585843387604051611dd796959493929190615871565b600080805b6001600160801b03811686111561379f5760006136dc601260008a8a866001600160801b03168181106136ba576136ba6154c3565b602090810292909201358352508101919091526040016000205460030b61408e565b905060008160020160008888866001600160801b0316818110613701576137016154c3565b90506020020160208101906137169190615776565b61ffff16815260208101919091526040016000205463ffffffff169050806137805760405162461bcd60e51b815260206004820152601960248201527f556e737570706f72746564206275696c64696e672074797065000000000000006044820152606401610ac3565b61378a81856156b1565b93505050806137989061570a565b9050613685565b5090505b949350505050565b6005546000906064906137c890600160a81b900460ff168461557b565b6137d29190615727565b610a9390836156b1565b6005546001600160a01b031633146138065760405162461bcd60e51b8152600401610ac39061548e565b6001600160a01b03811661386b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ac3565b6121ff816141de565b600554600160a01b900460ff161561389e5760405162461bcd60e51b8152600401610ac390615551565b6138a9600a336141bc565b6139005760405162461bcd60e51b815260206004820152602260248201527f4e6f7420616e20616c6c6f776564207265616c20657374617465206368616e6760448201526132b960f11b6064820152608401610ac3565b8483146139465760405162461bcd60e51b8152602060048201526014602482015273496e636f727265637420696e707574206461746160601b6044820152606401610ac3565b61395286868686614230565b60005b6001600160401b038116861115613a03578484826001600160401b0316818110613981576139816154c3565b90506020020160208101906139969190615776565b61ffff16601160008989856001600160401b03168181106139b9576139b96154c3565b90506020020135815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b03160217905550806139fc906154ef565b9050613955565b506007546001600160a01b03166323b872dd8330613a29670de0b6b3a76400008661557b565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015613a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa1919061559a565b507f69c53ddc3d850a7175eb81c1fbb7c46b95b6e3d40bc52fe12c7491a27cf211948686868686604051613ad99594939291906157c7565b60405180910390a1505050505050565b60006131b8836001600160a01b038416614663565b60006001600160e01b031982166380ac58cd60e01b1480613b2f57506001600160e01b03198216635b5e139f60e01b145b80610a9357506301ffc9a760e01b6001600160e01b0319831614610a93565b60025460009082108015610a93575060006001600160a01b031660028381548110613b7b57613b7b6154c3565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613bcd82611a33565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610a93825490565b60006131b883836146b2565b6060600082516001600160401b03811115613c3957613c39614b02565b604051908082528060200260200182016040528015613c62578160200160208202803683370190505b5090506000613c7060025490565b905060005b8451811015611b8857613c8881836156b1565b838281518110613c9a57613c9a6154c3565b6020908102919091010152600160116000613cb584866156b1565b815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b03160217905550848181518110613cf957613cf96154c3565b6020026020010151601260008385613d1191906156b1565b815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908360030b63ffffffff16021790555060208201518160010155604082015181600201559050506001600e6000878481518110613d7857613d786154c3565b602002602001015160200151888581518110613d9657613d966154c3565b602002602001015160400151898681518110613db457613db46154c3565b602002602001015160000151604051602001613de693929190928352602083019190915260030b604082015260600190565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff1916911515919091179055613e2d33613e2883856156b1565b6146dc565b613e3681615696565b9050613c75565b6000613e4882613b4e565b613ea95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ac3565b6000613eb483611a33565b9050806001600160a01b0316846001600160a01b03161480613eef5750836001600160a01b0316613ee484610d7c565b6001600160a01b0316145b806137a357506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff166137a3565b826001600160a01b0316613f3682611a33565b6001600160a01b031614613f9e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ac3565b6001600160a01b0382166140005760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ac3565b61400b600082613b98565b816002828154811061401f5761401f6154c3565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006131b8836001600160a01b0384166146f6565b600381900b6000908152600c602052604081206001810154610a935760405162461bcd60e51b815260206004820152602c60248201527f5468657265206973206e6f20636f6e66696775726174696f6e20666f7220707260448201526b37bb34b232b2103630bcb2b960a11b6064820152608401610ac3565b60008082121561171f5761411a82615930565b610a93565b600554600160a01b900460ff1661416f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ac3565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038116600090815260018301602052604081205415156131b8565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b6001600160401b038116841115612844578282826001600160401b031681811061425f5761425f6154c3565b90506020020160208101906142749190615776565b61ffff16601160008787856001600160401b0316818110614297576142976154c3565b60209081029290920135835250810191909152604001600020546001600160401b031614156143005760405162461bcd60e51b815260206004820152601560248201527413dc195c985d1a5bdb881b9bdd08185b1b1bddd959605a1b6044820152606401610ac3565b61431e8585836001600160401b03168181106126e1576126e16154c3565b6001600160a01b0316336001600160a01b03161461438d5760405162461bcd60e51b815260206004820152602660248201527f4e6f7420746865206f776e6572206f6620746865207265616c2065737461746560448201526520706965636560d01b6064820152608401610ac3565b614396816154ef565b9050614233565b600554600160a01b900460ff16156143c75760405162461bcd60e51b8152600401610ac390615551565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861419f3390565b600081815260018301602052604081205415156131b8565b60006131b883836146f6565b6000816001600160401b0381111561444057614440614b02565b604051908082528060200260200182016040528015614469578160200160208202803683370190505b50905060005b81518160ff1610156144ac5785828260ff1681518110614491576144916154c3565b60209081029190910101526144a5816155f5565b905061446f565b50600754604051630df6e7a160e31b81526001600160a01b0390911690636fb73d08906144e390879087908790879060040161594d565b600060405180830381600087803b1580156144fd57600080fd5b505af1158015614511573d6000803e3d6000fd5b505050505050505050565b614527848484613f23565b614533848484846147e9565b612e9b5760405162461bcd60e51b8152600401610ac39061598f565b606060068054610caf90615516565b6060816145825750506040805180820190915260018152600360fc1b602082015290565b8160005b81156145ac578061459681615696565b91506145a59050600a83615727565b9150614586565b6000816001600160401b038111156145c6576145c6614b02565b6040519080825280601f01601f1916602001820160405280156145f0576020820181803683370190505b5090505b84156137a3576146056001836156f3565b9150614612600a866156df565b61461d9060306156b1565b60f81b818381518110614632576146326154c3565b60200101906001600160f81b031916908160001a905350614654600a86615727565b94506145f4565b60006131b883835b60008181526001830160205260408120546146aa57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a93565b506000610a93565b60008260000182815481106146c9576146c96154c3565b9060005260206000200154905092915050565b610c9c8282604051806020016040528060008152506148e4565b600081815260018301602052604081205480156147df57600061471a6001836156f3565b855490915060009061472e906001906156f3565b905081811461479357600086600001828154811061474e5761474e6154c3565b9060005260206000200154905080876000018481548110614771576147716154c3565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806147a4576147a46159e1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a93565b6000915050610a93565b60006001600160a01b0384163b156148dc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061482d9033908990889088906004016159f7565b6020604051808303816000875af1925050508015614868575060408051601f3d908101601f1916820190925261486591810190615a34565b60015b6148c2573d808015614896576040519150601f19603f3d011682016040523d82523d6000602084013e61489b565b606091505b5080516148ba5760405162461bcd60e51b8152600401610ac39061598f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506137a3565b5060016137a3565b6148ee8383614917565b6148fb60008484846147e9565b610f155760405162461bcd60e51b8152600401610ac39061598f565b6001600160a01b03821661496d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ac3565b61497681613b4e565b156149c35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ac3565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054614a4b90615516565b90600052602060002090601f016020900481019282614a6d5760008555614ab3565b82601f10614a8657805160ff1916838001178555614ab3565b82800160010185558215614ab3579182015b82811115614ab3578251825591602001919060010190614a98565b5061171f9291505b8082111561171f5760008155600101614abb565b6001600160e01b0319811681146121ff57600080fd5b600060208284031215614af757600080fd5b81356131b881614acf565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715614b3a57614b3a614b02565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6857614b68614b02565b604052919050565b8035600381900b8114614b8257600080fd5b919050565b60006020808385031215614b9a57600080fd5b82356001600160401b0380821115614bb157600080fd5b818501915085601f830112614bc557600080fd5b813581811115614bd757614bd7614b02565b614be5848260051b01614b40565b81815284810192506060918202840185019188831115614c0457600080fd5b938501935b82851015614c555780858a031215614c215760008081fd5b614c29614b18565b614c3286614b70565b815285870135878201526040808701359082015284529384019392850192614c09565b50979650505050505050565b60005b83811015614c7c578181015183820152602001614c64565b83811115612e9b5750506000910152565b60008151808452614ca5816020860160208601614c61565b601f01601f19169290920160200192915050565b6020815260006131b86020830184614c8d565b600060208284031215614cde57600080fd5b813560ff811681146131b857600080fd5b600060208284031215614d0157600080fd5b5035919050565b6001600160a01b03811681146121ff57600080fd5b60008060408385031215614d3057600080fd5b8235614d3b81614d08565b946020939093013593505050565b60008083601f840112614d5b57600080fd5b5081356001600160401b03811115614d7257600080fd5b6020830191508360208260051b8501011115614d8d57600080fd5b9250929050565b60008060208385031215614da757600080fd5b82356001600160401b03811115614dbd57600080fd5b614dc985828601614d49565b90969095509350505050565b600081518084526020808501945080840160005b83811015614e0557815187529582019590820190600101614de9565b509495945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015614e6557603f19888603018452614e53858351614dd5565b94509285019290850190600101614e37565b5092979650505050505050565b600080600060608486031215614e8757600080fd5b8335614e9281614d08565b92506020840135614ea281614d08565b929592945050506040919091013590565b600060208284031215614ec557600080fd5b81356131b881614d08565b60008060008060608587031215614ee657600080fd5b614eef85614b70565b93506020850135925060408501356001600160401b03811115614f1157600080fd5b614f1d87828801614d49565b95989497509550505050565b60006001600160401b03831115614f4257614f42614b02565b614f55601f8401601f1916602001614b40565b9050828152838383011115614f6957600080fd5b828260208301376000602084830101529392505050565b600060208284031215614f9257600080fd5b81356001600160401b03811115614fa857600080fd5b8201601f81018413614fb957600080fd5b6137a384823560208401614f29565b60008060008060408587031215614fde57600080fd5b84356001600160401b0380821115614ff557600080fd5b61500188838901614d49565b9096509450602087013591508082111561501a57600080fd5b50614f1d87828801614d49565b6020815260006131b86020830184614dd5565b6000806000806060858703121561505057600080fd5b84356001600160401b0381111561506657600080fd5b61507287828801614d49565b90955093505060208501359150604085013561508d81614d08565b939692955090935050565b6000806000806000606086880312156150b057600080fd5b6150b986614b70565b945060208601356001600160401b03808211156150d557600080fd5b6150e189838a01614d49565b909650945060408801359150808211156150fa57600080fd5b5061510788828901614d49565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b818110156151595783516001600160a01b031683529284019291840191600101615134565b50909695505050505050565b60008060006040848603121561517a57600080fd5b61518384614b70565b925060208401356001600160401b0381111561519e57600080fd5b6151aa86828701614d49565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614e05578151805160030b8852838101518489015260409081015190880152606090960195908201906001016151cb565b6020815260006131b860208301846151b7565b80151581146121ff57600080fd5b6000806040838503121561523457600080fd5b823561523f81614d08565b9150602083013561524f81615213565b809150509250929050565b6000806000806080858703121561527057600080fd5b843561527b81614d08565b9350602085013561528b81614d08565b92506040850135915060608501356001600160401b038111156152ad57600080fd5b8501601f810187136152be57600080fd5b6152cd87823560208401614f29565b91505092959194509250565b60008060008060008060008060008060c08b8d0312156152f857600080fd5b6153018b614b70565b995060208b0135985060408b01356001600160401b038082111561532457600080fd5b6153308e838f01614d49565b909a50985060608d013591508082111561534957600080fd5b6153558e838f01614d49565b909850965060808d013591508082111561536e57600080fd5b61537a8e838f01614d49565b909650945060a08d013591508082111561539357600080fd5b506153a08d828e01614d49565b915080935050809150509295989b9194979a5092959850565b600080604083850312156153cc57600080fd5b61523f83614b70565b600080604083850312156153e857600080fd5b82356153f381614d08565b9150602083013561524f81614d08565b6000806000806000806080878903121561541c57600080fd5b86356001600160401b038082111561543357600080fd5b61543f8a838b01614d49565b9098509650602089013591508082111561545857600080fd5b5061546589828a01614d49565b909550935050604087013561547981614d08565b80925050606087013590509295509295509295565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160401b038083168181141561550c5761550c6154d9565b6001019392505050565b600181811c9082168061552a57607f821691505b6020821081141561554b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6000816000190483118215151615615595576155956154d9565b500290565b6000602082840312156155ac57600080fd5b81516131b881615213565b6060815260006155ca6060830186614dd5565b82810360208401526155dc81866151b7565b91505060018060a01b0383166040830152949350505050565b600060ff821660ff81141561560c5761560c6154d9565b60010192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526016908201527522a9219b9918a2b73ab69d1037bbb732b91034b7b7b160511b604082015260600190565b60006000198214156156aa576156aa6154d9565b5060010190565b600082198211156156c4576156c46154d9565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826156ee576156ee6156c9565b500690565b600082821015615705576157056154d9565b500390565b60006001600160801b038083168181141561550c5761550c6154d9565b600082615736576157366156c9565b500490565b6020808252600f908201526e125b98dbdc9c9958dd081a5b9c1d5d608a1b604082015260600190565b803561ffff81168114614b8257600080fd5b60006020828403121561578857600080fd5b6131b882615764565b81835260006001600160fb1b038311156157aa57600080fd5b8260051b8083602087013760009401602001938452509192915050565b6060815260006157db606083018789615791565b8281036020848101919091528582528691810160005b878110156158185761ffff61580585615764565b16825292820192908201906001016157f1565b506001600160a01b03959095166040949094019390935250919695505050505050565b60006020828403121561584d57600080fd5b5051919050565b60006020828403121561586657600080fd5b81516131b881614d08565b60a08152600061588560a08301888a615791565b60208301969096525060408101939093526001600160a01b0391821660608401521660809091015292915050565b6000602082840312156158c557600080fd5b813563ffffffff811681146131b857600080fd5b600061ffff8083168181141561550c5761550c6154d9565b60008351615903818460208801614c61565b835190830190615917818360208801614c61565b64173539b7b760d91b9101908152600501949350505050565b6000600160ff1b821415615946576159466154d9565b5060000390565b6001600160a01b03851681526060602082018190526000906159729083018587615791565b82810360408401526159848185614dd5565b979650505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a2a90830184614c8d565b9695505050505050565b600060208284031215615a4657600080fd5b81516131b881614acf56fea26469706673582212206def07fd7d4a58c9e84d7978959e4e8eddefd981b54af98164bfe4f21515411364736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000068b1b0b89e52440df04237a21751331ae9e87a2300000000000000000000000000000000000000000000000000000000000000124d657461436974795265616c457374617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d43524500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f68756d616e732d6d65746176657273652d7265616c2d6573746174652f6d657461646174612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008a9ece9d8806eb0cde56ac89ccb23a36e2c718cf

-----Decoded View---------------
Arg [0] : _name (string): MetaCityRealEstate
Arg [1] : _symbol (string): MCRE
Arg [2] : _initBaseURI (string): https://storage.googleapis.com/humans-metaverse-real-estate/metadata/
Arg [3] : _collectionAddresses (address[]): 0x8a9ECe9d8806eB0CdE56Ac89cCB23a36E2C718cf
Arg [4] : _tokenAddress (address): 0x68B1b0b89E52440df04237A21751331ae9E87a23

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 00000000000000000000000068b1b0b89e52440df04237a21751331ae9e87a23
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 4d657461436974795265616c4573746174650000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4d43524500000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [10] : 68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f68
Arg [11] : 756d616e732d6d65746176657273652d7265616c2d6573746174652f6d657461
Arg [12] : 646174612f000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000008a9ece9d8806eb0cde56ac89ccb23a36e2c718cf


Deployed Bytecode Sourcemap

47333:19582:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30469:225;;;;;;;;;;-1:-1:-1;30469:225:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;30469:225:0;;;;;;;;62474:488;;;;;;;;;;-1:-1:-1;62474:488:0;;;;;:::i;:::-;;:::i;:::-;;24560:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50897:::-;;;;;;;;;;-1:-1:-1;50897:100:0;;;;;:::i;:::-;;:::i;25194:221::-;;;;;;;;;;-1:-1:-1;25194:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4156:32:1;;;4138:51;;4126:2;4111:18;25194:221:0;3992:203:1;24776:412:0;;;;;;;;;;-1:-1:-1;24776:412:0;;;;;:::i;:::-;;:::i;65432:604::-;;;;;;;;;;-1:-1:-1;65432:604:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55508:424::-;;;;;;:::i;:::-;;:::i;31630:110::-;;;;;;;;;;-1:-1:-1;31718:7:0;:14;31630:110;;;6905:25:1;;;6893:2;6878:18;31630:110:0;6759:177:1;50071:239:0;;;;;;;;;;-1:-1:-1;50071:239:0;;;;;:::i;:::-;;:::i;25892:339::-;;;;;;;;;;-1:-1:-1;25892:339:0;;;;;:::i;:::-;;:::i;49959:104::-;;;;;;;;;;-1:-1:-1;49959:104:0;;;;;:::i;:::-;;:::i;50318:245::-;;;;;;;;;;-1:-1:-1;50318:245:0;;;;;:::i;:::-;;:::i;30700:500::-;;;;;;;;;;-1:-1:-1;30700:500:0;;;;;:::i;:::-;;:::i;57847:691::-;;;;;;;;;;-1:-1:-1;57847:691:0;;;;;:::i;:::-;;:::i;49884:67::-;;;;;;;;;;;;;:::i;52519:574::-;;;;;;;;;;-1:-1:-1;52519:574:0;;;;;:::i;:::-;;:::i;26237:185::-;;;;;;;;;;-1:-1:-1;26237:185:0;;;;;:::i;:::-;;:::i;31746:194::-;;;;;;;;;;-1:-1:-1;31746:194:0;;;;;:::i;:::-;;:::i;50689:200::-;;;;;;;;;;-1:-1:-1;50689:200:0;;;;;:::i;:::-;;:::i;49701:104::-;;;;;;;;;;-1:-1:-1;49701:104:0;;;;;:::i;:::-;;:::i;63422:624::-;;;;;;;;;;-1:-1:-1;63422:624:0;;;;;:::i;:::-;;:::i;32957:86::-;;;;;;;;;;-1:-1:-1;33028:7:0;;-1:-1:-1;;;33028:7:0;;;;32957:86;;24315:239;;;;;;;;;;-1:-1:-1;24315:239:0;;;;;:::i;:::-;;:::i;23887:422::-;;;;;;;;;;-1:-1:-1;23887:422:0;;;;;:::i;:::-;;:::i;3578:94::-;;;;;;;;;;;;;:::i;55940:711::-;;;;;;:::i;:::-;;:::i;64750:316::-;;;;;;;;;;-1:-1:-1;64750:316:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49813:63::-;;;;;;;;;;;;;:::i;31206:418::-;;;;;;;;;;-1:-1:-1;31206:418:0;;;;;:::i;:::-;;:::i;59161:655::-;;;;;;;;;;-1:-1:-1;59161:655:0;;;;;:::i;:::-;;:::i;51005:152::-;;;;;;;;;;;;;:::i;2927:87::-;;;;;;;;;;-1:-1:-1;3000:6:0;;-1:-1:-1;;;;;3000:6:0;2927:87;;61140:926;;;;;;;;;;-1:-1:-1;61140:926:0;;;;;:::i;:::-;;:::i;53533:517::-;;;;;;;;;;-1:-1:-1;53533:517:0;;;;;:::i;:::-;;:::i;66044:323::-;;;;;;;;;;-1:-1:-1;66044:323:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54058:448::-;;;;;;;;;;-1:-1:-1;54058:448:0;;;;;:::i;:::-;;:::i;24666:104::-;;;;;;;;;;;;;:::i;54514:411::-;;;;;;;;;;-1:-1:-1;54514:411:0;;;;;:::i;:::-;;:::i;47736:27::-;;;;;;;;;;-1:-1:-1;47736:27:0;;;;-1:-1:-1;;;;;47736:27:0;;;65074:350;;;;;;;;;;-1:-1:-1;65074:350:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53101:424::-;;;;;;;;;;-1:-1:-1;53101:424:0;;;;;:::i;:::-;;:::i;50571:110::-;;;;;;;;;;-1:-1:-1;50571:110:0;;;;;:::i;:::-;;:::i;25421:295::-;;;;;;;;;;-1:-1:-1;25421:295:0;;;;;:::i;:::-;;:::i;62970:444::-;;;;;;;;;;-1:-1:-1;62970:444:0;;;;;:::i;:::-;;:::i;26428:328::-;;;;;;;;;;-1:-1:-1;26428:328:0;;;;;:::i;:::-;;:::i;51165:1132::-;;;;;;;;;;-1:-1:-1;51165:1132:0;;;;;:::i;:::-;;:::i;66395:353::-;;;;;;;;;;-1:-1:-1;66395:353:0;;;;;:::i;:::-;;:::i;52305:206::-;;;;;;;;;;-1:-1:-1;52305:206:0;;;;;:::i;:::-;;:::i;59824:1308::-;;;;;;;;;;-1:-1:-1;59824:1308:0;;;;;:::i;:::-;;:::i;58546:607::-;;;;;;;;;;-1:-1:-1;58546:607:0;;;;;:::i;:::-;;:::i;66775:135::-;;;;;;;;;;-1:-1:-1;66775:135:0;;;;;:::i;:::-;;:::i;25722:164::-;;;;;;;;;;-1:-1:-1;25722:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25843:25:0;;;25819:4;25843:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25722:164;3827:192;;;;;;;;;;-1:-1:-1;3827:192:0;;;;;:::i;:::-;;:::i;56659:730::-;;;;;;;;;;-1:-1:-1;56659:730:0;;;;;:::i;:::-;;:::i;30469:225::-;30572:4;-1:-1:-1;;;;;;30596:50:0;;-1:-1:-1;;;30596:50:0;;:90;;;30650:36;30674:11;30650:23;:36::i;:::-;30589:97;30469:225;-1:-1:-1;;30469:225:0:o;62474:488::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;;;;;;;;;62563:33:::1;62583:12;62563:19;:33::i;:::-;62614:8;62609:344;62632:12;:19;62628:1;-1:-1:-1::0;;;;;62628:23:0::1;;62609:344;;;62678:26;:110;62726:12;62739:1;-1:-1:-1::0;;;;;62726:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;62745:12;62758:1;-1:-1:-1::0;;;;;62745:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;62764:12;62777:1;-1:-1:-1::0;;;;;62764:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:21;;;62715:71;;;;;;;;;20805:25:1::0;;;20861:2;20846:18;;20839:34;;;;20920:1;20909:21;20904:2;20889:18;;20882:49;20793:2;20778:18;;20611:326;62715:71:0::1;;::::0;;-1:-1:-1;;62715:71:0;;::::1;::::0;;;;;;62705:82;;62715:71:::1;62705:82:::0;;::::1;::::0;62678:110;;;;::::1;::::0;;;;;-1:-1:-1;62678:110:0;;::::1;;62673:269;;62922:4;62809:26;:110;62857:12;62870:1;-1:-1:-1::0;;;;;62857:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;62876:12;62889:1;-1:-1:-1::0;;;;;62876:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;62895:12;62908:1;-1:-1:-1::0;;;;;62895:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:21;;;62846:71;;;;;;;;;20805:25:1::0;;;20861:2;20846:18;;20839:34;;;;20920:1;20909:21;20904:2;20889:18;;20882:49;20793:2;20778:18;;20611:326;62846:71:0::1;;::::0;;;;::::1;-1:-1:-1::0;;62846:71:0;;;;;;62836:82;;62846:71:::1;62836:82:::0;;::::1;::::0;62809:110;;;;::::1;::::0;;;;;-1:-1:-1;62809:110:0;:117;;-1:-1:-1;;62809:117:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62673:269:::1;62653:3;::::0;::::1;:::i;:::-;;;62609:344;;;;62474:488:::0;:::o;24560:100::-;24614:13;24647:5;24640:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24560:100;:::o;50897:::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;50965:15:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;50965:24:0::1;-1:-1:-1::0;;;;50965:24:0;;::::1;::::0;;;::::1;::::0;;50897:100::o;25194:221::-;25270:7;25298:16;25306:7;25298;:16::i;:::-;25290:73;;;;-1:-1:-1;;;25290:73:0;;21875:2:1;25290:73:0;;;21857:21:1;21914:2;21894:18;;;21887:30;21953:34;21933:18;;;21926:62;-1:-1:-1;;;22004:18:1;;;21997:42;22056:19;;25290:73:0;21673:408:1;25290:73:0;-1:-1:-1;25383:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25383:24:0;;25194:221::o;24776:412::-;24857:13;24873:24;24889:7;24873:15;:24::i;:::-;24857:40;;24922:5;-1:-1:-1;;;;;24916:11:0;:2;-1:-1:-1;;;;;24916:11:0;;;24908:57;;;;-1:-1:-1;;;24908:57:0;;22288:2:1;24908:57:0;;;22270:21:1;22327:2;22307:18;;;22300:30;22366:34;22346:18;;;22339:62;-1:-1:-1;;;22417:18:1;;;22410:31;22458:19;;24908:57:0;22086:397:1;24908:57:0;1856:10;-1:-1:-1;;;;;25000:21:0;;;;:62;;-1:-1:-1;25025:37:0;25042:5;1856:10;25722:164;:::i;25025:37::-;24978:168;;;;-1:-1:-1;;;24978:168:0;;22690:2:1;24978:168:0;;;22672:21:1;22729:2;22709:18;;;22702:30;22768:34;22748:18;;;22741:62;22839:26;22819:18;;;22812:54;22883:19;;24978:168:0;22488:420:1;24978:168:0;25159:21;25168:2;25172:7;25159:8;:21::i;:::-;24846:342;24776:412;;:::o;65432:604::-;65511:18;65542:29;65590:9;-1:-1:-1;;;;;65574:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65542:65;;65623:8;65618:381;-1:-1:-1;;;;;65637:20:0;;;-1:-1:-1;65618:381:0;;;65720:53;:30;:44;65751:9;;65761:1;-1:-1:-1;;;;;65751:12:0;;;;;;;;:::i;:::-;;;;;;;65720:44;;;;;;;;;;;:51;:53::i;:::-;-1:-1:-1;;;;;65706:68:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65706:68:0;;65679:10;65690:9;;65700:1;-1:-1:-1;;;;;65690:12:0;;;;;;;;:::i;:::-;;;;;;;65679:24;;;;;;;;:::i;:::-;;;;;;:95;;;;65796:7;65791:197;65813:53;:30;:44;65844:9;;65854:1;-1:-1:-1;;;;;65844:12:0;;;;;;;;:::i;65813:53::-;65809:1;:57;;;65791:197;;;65922:50;65970:1;65922:50;;:30;:44;65953:9;;65963:1;-1:-1:-1;;;;;65953:12:0;;;;;;;;:::i;:::-;;;;;;;65922:44;;;;;;;;;;;:47;;:50;;;;:::i;:::-;65892:10;65903:9;;65913:1;-1:-1:-1;;;;;65903:12:0;;;;;;;;:::i;:::-;;;;;;;65892:24;;;;;;;;:::i;:::-;;;;;;;65917:1;65892:27;;;;;;;;;;:::i;:::-;;;;;;;;;;:80;65868:3;;;:::i;:::-;;;65791:197;;;-1:-1:-1;65659:3:0;;;:::i;:::-;;;65618:381;;;-1:-1:-1;66018:10:0;65432:604;-1:-1:-1;;;65432:604:0:o;55508:424::-;33028:7;;-1:-1:-1;;;33028:7:0;;;;33282:9;33274:38;;;;-1:-1:-1;;;33274:38:0;;;;;;;:::i;:::-;55601:13:::1;55617:32;55636:12;55617:18;:32::i;:::-;55601:48;;55662:25;55690:24;55701:12;55690:10;:24::i;:::-;55734:12;::::0;55662:52;;-1:-1:-1;;;;;;55734:12:0::1;55727:33;55761:10;55781:4;55788:14;47694:4;55788:5:::0;:14:::1;:::i;:::-;55727:76;::::0;-1:-1:-1;;;;;;55727:76:0::1;::::0;;;;;;-1:-1:-1;;;;;23689:15:1;;;55727:76:0::1;::::0;::::1;23671:34:1::0;23741:15;;;;23721:18;;;23714:43;23773:18;;;23766:34;23606:18;;55727:76:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55821:52;55838:8;55848:12;55862:10;55821:52;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;55508:424:0:o;50071:239::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;50174:7:::1;50169:134;50187:29;::::0;::::1;::::0;-1:-1:-1;50169:134:0::1;;;50238:53;50269:18;;50288:1;50269:21;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50238:26;::::0;:30:::1;:53::i;:::-;-1:-1:-1::0;50218:3:0::1;::::0;::::1;:::i;:::-;;;50169:134;;25892:339:::0;26087:41;1856:10;26120:7;26087:18;:41::i;:::-;26079:103;;;;-1:-1:-1;;;26079:103:0;;;;;;;:::i;:::-;26195:28;26205:4;26211:2;26215:7;26195:9;:28::i;49959:104::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;50032:12:::1;:23:::0;;-1:-1:-1;;;;;;50032:23:0::1;-1:-1:-1::0;;;;;50032:23:0;;;::::1;::::0;;;::::1;::::0;;49959:104::o;50318:245::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;50424:7:::1;50419:137;50437:29;::::0;::::1;::::0;-1:-1:-1;50419:137:0::1;;;50488:56;50522:18;;50541:1;50522:21;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50488:26;::::0;:33:::1;:56::i;:::-;-1:-1:-1::0;50468:3:0::1;::::0;::::1;:::i;:::-;;;50419:137;;30700:500:::0;30789:15;30833:24;30851:5;30833:17;:24::i;:::-;30825:5;:32;30817:67;;;;-1:-1:-1;;;30817:67:0;;;;;;;:::i;:::-;30895:10;30921:6;30916:226;30933:7;:14;30929:18;;30916:226;;;30982:7;30990:1;30982:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;30973:19:0;;;30982:10;;30973:19;30969:162;;;31026:5;31017;:14;31013:102;;;31062:1;-1:-1:-1;31055:8:0;;-1:-1:-1;31055:8:0;31013:102;31108:7;;;:::i;:::-;;;31013:102;30949:3;;;:::i;:::-;;;30916:226;;;-1:-1:-1;31152:40:0;;-1:-1:-1;;;31152:40:0;;;;;;;:::i;57847:691::-;57929:7;57949:33;57969:12;57949:19;:33::i;:::-;57993:13;58027:9;58023:483;58046:12;:19;58042:1;-1:-1:-1;;;;;58042:23:0;;58023:483;;;58087:28;58118:12;58131:1;-1:-1:-1;;;;;58118:15:0;;;;;;;;;:::i;:::-;;;;;;;58087:46;;58148:45;58196:40;58219:10;:16;;;58196:22;:40::i;:::-;58148:88;;58253:22;58307:18;58312:10;:12;;;58307:4;:18::i;:::-;58286;58291:10;:12;;;58286:4;:18::i;:::-;:39;;;;:::i;:::-;58253:73;-1:-1:-1;58360:18:0;58377:1;58253:73;58360:18;:::i;:::-;58382:1;58360:23;:61;;58407:14;58360:61;;;58386:18;58403:1;58386:14;:18;:::i;:::-;58447:47;;;;:31;;;:47;;;;;;58343:78;;-1:-1:-1;58438:56:0;;;;:::i;:::-;;;58072:434;;;58067:3;;;;:::i;:::-;;;58023:483;;;-1:-1:-1;58525:5:0;57847:691;-1:-1:-1;;57847:691:0:o;49884:67::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;49933:10:::1;:8;:10::i;:::-;49884:67::o:0;52519:574::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;52642:45:::1;52690:30;52713:6;52690:22;:30::i;:::-;52642:78;;52812:1;52784:18;:25;;;:29;;;;:::i;:::-;52770:11;52780:1;52770:7:::0;:11:::1;:::i;:::-;:43;;;;:::i;:::-;52741:73:::0;::::1;52733:101;;;;-1:-1:-1::0;;;52733:101:0::1;;;;;;;:::i;:::-;52851:9;52891:1;52863:18;:25;;;:29;;;;:::i;:::-;52851:41;;52847:189;52898:11;52908:1;52898:7:::0;:11:::1;:::i;:::-;52894:1;:15;52847:189;;;52972:17;;53022:1;52994:18;:25;;;:29;;;;:::i;:::-;52990:33;::::0;:1;:33:::1;:::i;:::-;52972:52;;;;;;;:::i;:::-;;;;;;;52931:18;:31;;:38;52963:1;52967;52963:5;;;;:::i;:::-;52931:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;52931:38:0;:93;52911:3:::1;::::0;::::1;:::i;:::-;;;52847:189;;;-1:-1:-1::0;53048:25:0::1;;:35:::0;;;;-1:-1:-1;;;52519:574:0:o;26237:185::-;26375:39;26392:4;26398:2;26402:7;26375:39;;;;;;;;;;;;:16;:39::i;31746:194::-;31821:7;31857:24;31718:7;:14;;31630:110;31857:24;31849:5;:32;31841:68;;;;-1:-1:-1;;;31841:68:0;;27197:2:1;31841:68:0;;;27179:21:1;27236:2;27216:18;;;27209:30;27275:25;27255:18;;;27248:53;27318:18;;31841:68:0;26995:347:1;31841:68:0;-1:-1:-1;31927:5:0;31746:194::o;50689:200::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;50774:33:::1;:11;50795::::0;50774:20:::1;:33::i;:::-;50766:73;;;::::0;-1:-1:-1;;;50766:73:0;;27549:2:1;50766:73:0::1;::::0;::::1;27531:21:1::0;27588:2;27568:18;;;27561:30;27627:29;27607:18;;;27600:57;27674:18;;50766:73:0::1;27347:351:1::0;50766:73:0::1;50850:31;:11;50869::::0;50850:18:::1;:31::i;49701:104::-:0;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;49776:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;63422:624::-:0;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;63514:33:::1;63534:12;63514:19;:33::i;:::-;63560:25;63588:24;63599:12;63588:10;:24::i;:::-;63560:52;;63630:8;63625:344;63648:12;:19;63644:1;-1:-1:-1::0;;;;;63644:23:0::1;;63625:344;;;63694:26;:110;63742:12;63755:1;-1:-1:-1::0;;;;;63742:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63761:12;63774:1;-1:-1:-1::0;;;;;63761:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63780:12;63793:1;-1:-1:-1::0;;;;;63780:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:21;;;63731:71;;;;;;;;;20805:25:1::0;;;20861:2;20846:18;;20839:34;;;;20920:1;20909:21;20904:2;20889:18;;20882:49;20793:2;20778:18;;20611:326;63731:71:0::1;;::::0;;-1:-1:-1;;63731:71:0;;::::1;::::0;;;;;;63721:82;;63731:71:::1;63721:82:::0;;::::1;::::0;63694:110;;;;::::1;::::0;;;;;-1:-1:-1;63694:110:0;;::::1;;63689:269;;63938:4;63825:26;:110;63873:12;63886:1;-1:-1:-1::0;;;;;63873:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63892:12;63905:1;-1:-1:-1::0;;;;;63892:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63911:12;63924:1;-1:-1:-1::0;;;;;63911:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:21;;;63862:71;;;;;;;;;20805:25:1::0;;;20861:2;20846:18;;20839:34;;;;20920:1;20909:21;20904:2;20889:18;;20882:49;20793:2;20778:18;;20611:326;63862:71:0::1;;::::0;;;;::::1;-1:-1:-1::0;;63862:71:0;;;;;;63852:82;;63862:71:::1;63852:82:::0;;::::1;::::0;63825:110;;;;::::1;::::0;;;;;-1:-1:-1;63825:110:0;:117;;-1:-1:-1;;63825:117:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63689:269:::1;63669:3;::::0;::::1;:::i;:::-;;;63625:344;;;;63986:52;64003:8;64013:12;64027:10;63986:52;;;;;;;;:::i;:::-;;;;;;;;63503:543;63422:624:::0;:::o;24315:239::-;24387:7;24407:13;24423:7;24431;24423:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;24423:16:0;;-1:-1:-1;24458:19:0;24450:73;;;;-1:-1:-1;;;24450:73:0;;27905:2:1;24450:73:0;;;27887:21:1;27944:2;27924:18;;;27917:30;27983:34;27963:18;;;27956:62;-1:-1:-1;;;28034:18:1;;;28027:39;28083:19;;24450:73:0;27703:405:1;23887:422:0;23959:7;-1:-1:-1;;;;;23987:19:0;;23979:74;;;;-1:-1:-1;;;23979:74:0;;28315:2:1;23979:74:0;;;28297:21:1;28354:2;28334:18;;;28327:30;28393:34;28373:18;;;28366:62;-1:-1:-1;;;28444:18:1;;;28437:40;28494:19;;23979:74:0;28113:406:1;23979:74:0;24103:7;:14;24064:10;;;24128:127;24149:6;24145:1;:10;24128:127;;;24190:7;24198:1;24190:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;24181:19:0;;;24190:10;;24181:19;24177:67;;;24221:7;;;:::i;:::-;;;24177:67;24157:3;;;:::i;:::-;;;24128:127;;;-1:-1:-1;24296:5:0;;23887:422;-1:-1:-1;;;23887:422:0:o;3578:94::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;3643:21:::1;3661:1;3643:9;:21::i;55940:711::-:0;33028:7;;-1:-1:-1;;;33028:7:0;;;;33282:9;33274:38;;;;-1:-1:-1;;;33274:38:0;;;;;;;:::i;:::-;56085:46;;::::1;56077:78;;;::::0;-1:-1:-1;;;56077:78:0;;28726:2:1;56077:78:0::1;::::0;::::1;28708:21:1::0;28765:2;28745:18;;;28738:30;-1:-1:-1;;;28784:18:1;;;28777:49;28843:18;;56077:78:0::1;28524:343:1::0;56077:78:0::1;56168:57;56194:9;;56205:19;;56168:25;:57::i;:::-;56238:13;56254:56;56279:9;;56290:19;;56254:24;:56::i;:::-;56238:72;;56328:8;56323:129;-1:-1:-1::0;;;;;56342:20:0;::::1;::::0;-1:-1:-1;56323:129:0::1;;;56418:19;;56438:1;-1:-1:-1::0;;;;;56418:22:0::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;56384:56;;:17;:31;56402:9;;56412:1;-1:-1:-1::0;;;;;56402:12:0::1;;;;;;;;:::i;:::-;;;;;;;56384:31;;;;;;;;;;;;:56;;;;;-1:-1:-1::0;;;;;56384:56:0::1;;;;;-1:-1:-1::0;;;;;56384:56:0::1;;;;;;56364:3;;;;:::i;:::-;;;56323:129;;;-1:-1:-1::0;56471:12:0::1;::::0;-1:-1:-1;;;;;56471:12:0::1;56464:33;56498:10;56518:4;56525:13;47694:4;56525:5:::0;:13:::1;:::i;:::-;56464:75;::::0;-1:-1:-1;;;;;;56464:75:0::1;::::0;;;;;;-1:-1:-1;;;;;23689:15:1;;;56464:75:0::1;::::0;::::1;23671:34:1::0;23741:15;;;;23721:18;;;23714:43;23773:18;;;23766:34;23606:18;;56464:75:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56557:61;56575:9;;56586:19;;56607:10;56557:61;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;55940:711:0:o;64750:316::-;64823:16;64852:22;64891:9;-1:-1:-1;;;;;64877:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64877:31:0;;64852:56;;64924:8;64919:115;-1:-1:-1;;;;;64938:20:0;;;-1:-1:-1;64919:115:0;;;64991:17;:31;65009:9;;65019:1;-1:-1:-1;;;;;65009:12:0;;;;;;;;:::i;:::-;;;;;;;64991:31;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64991:31:0;-1:-1:-1;;;;;64980:42:0;:5;64986:1;-1:-1:-1;;;;;64980:8:0;;;;;;;;;:::i;:::-;;;;;;;;;;:42;64960:3;;;:::i;:::-;;;64919:115;;49813:63;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;49860:8:::1;:6;:8::i;31206:418::-:0;31265:16;31306:24;31324:5;31306:17;:24::i;:::-;31302:1;:28;31294:63;;;;-1:-1:-1;;;31294:63:0;;;;;;;:::i;:::-;31368:18;31389:16;31399:5;31389:9;:16::i;:::-;31368:37;;31416:25;31458:10;-1:-1:-1;;;;;31444:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31444:25:0;;31416:53;;31485:9;31480:111;31504:10;31500:1;:14;31480:111;;;31550:29;31570:5;31577:1;31550:19;:29::i;:::-;31536:8;31545:1;31536:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;31516:3;;;;:::i;:::-;;;;31480:111;;59161:655;59252:9;59247:562;59271:12;:19;59267:1;:23;59247:562;;;59312:28;59343:12;59356:1;59343:15;;;;;;;;:::i;:::-;;;;;;;59312:46;;59373:45;59421:40;59444:10;:16;;;59421:22;:40::i;:::-;59373:88;;59553:1;59525:18;:25;;;:29;;;;:::i;:::-;59504:18;59509:10;:12;;;59504:4;:18::i;:::-;:50;:121;;;;;59624:1;59596:18;:25;;;:29;;;;:::i;:::-;59575:18;59580:10;:12;;;59575:4;:18::i;:::-;:50;59504:121;:238;;;;-1:-1:-1;59695:12:0;;;;;59709;;;;;59723:16;;59684:56;;;;;20805:25:1;;;;20846:18;;;20839:34;20920:1;20909:21;20889:18;;;20882:49;59647:26:0;;:95;;20778:18:1;;59684:56:0;;;-1:-1:-1;;59684:56:0;;;;;;;;;59674:67;;59684:56;59674:67;;;;59647:95;;;;;;;;;;-1:-1:-1;59647:95:0;;;;59646:96;59504:238;59478:319;;;;-1:-1:-1;;;59478:319:0;;30707:2:1;59478:319:0;;;30689:21:1;30746:2;30726:18;;;30719:30;-1:-1:-1;;;30765:18:1;;;30758:49;30824:18;;59478:319:0;30505:343:1;59478:319:0;59297:512;;59292:3;;;;:::i;:::-;;;59247:562;;51005:152;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;51068:12:::1;::::0;51103:45:::1;::::0;-1:-1:-1;;;51103:45:0;;51142:4:::1;51103:45;::::0;::::1;4138:51:1::0;-1:-1:-1;;;;;51068:12:0;;::::1;::::0;51061:29:::1;::::0;51091:10:::1;::::0;51068:12;;51103:30:::1;::::0;4111:18:1;;51103:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51061:88;::::0;-1:-1:-1;;;;;;51061:88:0::1;::::0;;;;;;-1:-1:-1;;;;;31234:32:1;;;51061:88:0::1;::::0;::::1;31216:51:1::0;31283:18;;;31276:34;31189:18;;51061:88:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51005:152::o:0;61140:926::-;33028:7;;-1:-1:-1;;;33028:7:0;;;;33282:9;33274:38;;;;-1:-1:-1;;;33274:38:0;;;;;;;:::i;:::-;61272:33:::1;:11;61293::::0;61272:20:::1;:33::i;:::-;61264:42;;;::::0;::::1;;61345:10;61325:16;61333:7:::0;61325::::1;:16::i;:::-;-1:-1:-1::0;;;;;61325:30:0::1;;61317:39;;;::::0;::::1;;61374:7;61369:545;61387:19;::::0;::::1;::::0;-1:-1:-1;61369:545:0::1;;;61481:10;-1:-1:-1::0;;;;;61436:28:0;::::1;;61465:8:::0;;:11:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;61436:41;;;;;;;;;;;;;6905:25:1::0;;6893:2;6878:18;;6759:177;61436:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61436:55:0::1;;61428:64;;;::::0;::::1;;61515:21;:70;61558:11;61571:8;;61580:1;61571:11;;;;;;;;;:::i;:::-;;;;;;;61547:36;;;;;;;;-1:-1:-1::0;;;;;31234:32:1;;;;31216:51;;31298:2;31283:18;;31276:34;31204:2;31189:18;;31042:274;61547:36:0::1;;::::0;;-1:-1:-1;;61547:36:0;;::::1;::::0;;;;;;61537:47;;61547:36:::1;61537:47:::0;;::::1;::::0;61515:70;;;;::::1;::::0;;;;;-1:-1:-1;61515:70:0;;::::1;;61507:101;;;::::0;-1:-1:-1;;;61507:101:0;;31779:2:1;61507:101:0::1;::::0;::::1;31761:21:1::0;31818:2;31798:18;;;31791:30;-1:-1:-1;;;31837:18:1;;;31830:48;31895:18;;61507:101:0::1;31577:342:1::0;61507:101:0::1;61631:61;61680:8;;61689:1;61680:11;;;;;;;;;:::i;:::-;61631:39;::::0;;;:30:::1;61680:11;61631:39:::0;;;;;;;;61680:11;::::1;;;::::0;-1:-1:-1;61631:48:0::1;:61::i;:::-;61623:112;;;::::0;-1:-1:-1;;;61623:112:0;;32126:2:1;61623:112:0::1;::::0;::::1;32108:21:1::0;32165:2;32145:18;;;32138:30;32204:34;32184:18;;;32177:62;-1:-1:-1;;;32255:18:1;;;32248:36;32301:19;;61623:112:0::1;31924:402:1::0;61623:112:0::1;61750:59;61797:8;;61806:1;61797:11;;;;;;;;;:::i;:::-;61750:39;::::0;;;:30:::1;61797:11;61750:39:::0;;;;;;;;61797:11;::::1;;;::::0;-1:-1:-1;61750:46:0::1;:59::i;:::-;;61897:5;61824:21;:70;61867:11;61880:8;;61889:1;61880:11;;;;;;;;;:::i;:::-;;;;;;;61856:36;;;;;;;;-1:-1:-1::0;;;;;31234:32:1;;;;31216:51;;31298:2;31283:18;;31276:34;31204:2;31189:18;;31042:274;61856:36:0::1;;::::0;;;;::::1;-1:-1:-1::0;;61856:36:0;;;;;;61846:47;;61856:36:::1;61846:47:::0;;::::1;::::0;61824:70;;;;::::1;::::0;;;;;-1:-1:-1;61824:70:0;:78;;-1:-1:-1;;61824:78:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61408:3:::1;::::0;::::1;:::i;:::-;;;61369:545;;;;61926:39;61940:1;61943:11;61956:8;;61926:13;:39::i;:::-;61983:75;62012:8;;62022:7;62031:1;62034:10;62046:11;61983:75;;;;;;;;;;;:::i;:::-;;;;;;;;61140:926:::0;;;;:::o;53533:517::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;53720:49;;::::1;53712:77;;;;-1:-1:-1::0;;;53712:77:0::1;;;;;;;:::i;:::-;53800:45;53848:30;53871:6;53848:22;:30::i;:::-;53800:78;;53896:8;53891:152;53910:26;::::0;::::1;::::0;-1:-1:-1;53891:152:0::1;;;54012:16;;54029:1;54012:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53958:18;:31;;:51;53990:15;;54006:1;53990:18;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53958:51;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53958:51:0;:73;;-1:-1:-1;;53958:73:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;53938:3:::1;::::0;::::1;:::i;:::-;;;53891:152;;;;53701:349;53533:517:::0;;;;;:::o;66044:323::-;66121:16;66150:26;66193:9;-1:-1:-1;;;;;66179:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66179:31:0;;66150:60;;66227:8;66223:108;-1:-1:-1;;;;;66241:20:0;;;-1:-1:-1;66223:108:0;;;66298:21;66306:9;;66316:1;-1:-1:-1;;;;;66306:12:0;;;;;;;;:::i;:::-;;;;;;;66298:7;:21::i;:::-;66283:9;66293:1;-1:-1:-1;;;;;66283:12:0;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;66283:36:0;;;:12;;;;;;;;;;;:36;66263:3;;;:::i;:::-;;;66223:108;;54058:448;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;54170:45:::1;54218:30;54241:6;54218:22;:30::i;:::-;54170:78;;54264:9;54259:240;54279:26:::0;;::::1;54259:240;;;54334:18;:31;;:51;54366:15;;54382:1;54366:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;54334:51;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54334:51:0;;;54327:58;;-1:-1:-1;;54327:58:0::1;::::0;;54407:29:::1;::::0;54458:6;54466:15;;54482:1;54466:18;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;54447:38;::::0;;33655:1:1;33644:21;;;;54447:38:0::1;::::0;::::1;33626:40:1::0;33714:6;33702:19;;;33682:18;;;33675:47;33599:18;;54447:38:0::1;::::0;;-1:-1:-1;;54447:38:0;;::::1;::::0;;;;;;54437:49;;54447:38:::1;54437:49:::0;;::::1;::::0;54407:80;;;;::::1;::::0;;;;;-1:-1:-1;54407:80:0;54400:87;;-1:-1:-1;;54400:87:0::1;::::0;;54307:3:::1;::::0;::::1;:::i;:::-;;;54259:240;;;;54159:347;54058:448:::0;;;:::o;24666:104::-;24722:13;24755:7;24748:14;;;;;:::i;54514:411::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;54674:40;;::::1;54666:68;;;;-1:-1:-1::0;;;54666:68:0::1;;;;;;;:::i;:::-;54750:8;54745:173;-1:-1:-1::0;;;;;54764:27:0;::::1;::::0;-1:-1:-1;54745:173:0::1;;;54897:6;;54904:1;-1:-1:-1::0;;;;;54897:9:0::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;54813:29;:81;54864:6;54872:16;;54889:1;-1:-1:-1::0;;;;;54872:19:0::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;54853:39;::::0;;33655:1:1;33644:21;;;;54853:39:0::1;::::0;::::1;33626:40:1::0;33714:6;33702:19;;;33682:18;;;33675:47;33599:18;;54853:39:0::1;;;;;;;;;;;;54843:50;;;;;;54813:81;;;;;;;;;;;;:93;;;;;;;;;;;;;;;;;;54793:3;;;;:::i;:::-;;;54745:173;;;;54514:411:::0;;;;;:::o;65074:350::-;65154:19;65186:31;65237:9;-1:-1:-1;;;;;65220:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;65220:34:0;;;;;;;;;;;;;;;;;65186:68;;65270:8;65265:121;-1:-1:-1;;;;;65284:20:0;;;-1:-1:-1;65265:121:0;;;65343:17;:31;65361:9;;65371:1;-1:-1:-1;;;;;65361:12:0;;;;;;;;:::i;:::-;;;;;;;;;;65343:31;;-1:-1:-1;65343:31:0;;;;;;;;;;;-1:-1:-1;65343:31:0;65326:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;;:11;;-1:-1:-1;;;;;65326:14:0;;;;;;;;;:::i;:::-;;;;;;:48;;;;65306:3;;;;:::i;:::-;;;65265:121;;53101:424;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;53201:45:::1;53249:30;53272:6;53249:22;:30::i;:::-;53201:78;;53345:1;53317:18;:25;;;:29;;;;:::i;:::-;53300:46:::0;::::1;53292:74;;;;-1:-1:-1::0;;;53292:74:0::1;;;;;;;:::i;:::-;53384:9;53379:137;53431:1;53403:18;:25;;;:29;;;;:::i;:::-;53399:1;:33;53379:137;;;53495:6;;53502:1;53495:9;;;;;;;:::i;:::-;;;;;;;53454:18;:31;;:38;53486:1;53490;53486:5;;;;:::i;:::-;53454:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53454:38:0;:50;53434:3:::1;::::0;::::1;:::i;:::-;;;53379:137;;50571:110:::0;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;50645:28:::1;:11;50661::::0;50645:15:::1;:28::i;25421:295::-:0;-1:-1:-1;;;;;25524:24:0;;1856:10;25524:24;;25516:62;;;;-1:-1:-1;;;25516:62:0;;33935:2:1;25516:62:0;;;33917:21:1;33974:2;33954:18;;;33947:30;34013:27;33993:18;;;33986:55;34058:18;;25516:62:0;33733:349:1;25516:62:0;1856:10;25591:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25591:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25591:53:0;;;;;;;;;;25660:48;;540:41:1;;;25591:42:0;;1856:10;25660:48;;513:18:1;25660:48:0;;;;;;;25421:295;;:::o;62970:444::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;63066:8:::1;63061:344;63084:12;:19;63080:1;-1:-1:-1::0;;;;;63080:23:0::1;;63061:344;;;63129:26;:110;63177:12;63190:1;-1:-1:-1::0;;;;;63177:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63196:12;63209:1;-1:-1:-1::0;;;;;63196:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63215:12;63228:1;-1:-1:-1::0;;;;;63215:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:21;;;63166:71;;;;;;;;;20805:25:1::0;;;20861:2;20846:18;;20839:34;;;;20920:1;20909:21;20904:2;20889:18;;20882:49;20793:2;20778:18;;20611:326;63166:71:0::1;;::::0;;-1:-1:-1;;63166:71:0;;::::1;::::0;;;;;;63156:82;;63166:71:::1;63156:82:::0;;::::1;::::0;63129:110;;;;::::1;::::0;;;;;-1:-1:-1;63129:110:0;;::::1;;63125:269;;;63373:5;63260:26;:110;63308:12;63321:1;-1:-1:-1::0;;;;;63308:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63327:12;63340:1;-1:-1:-1::0;;;;;63327:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:17;;;63346:12;63359:1;-1:-1:-1::0;;;;;63346:15:0::1;;;;;;;;;:::i;:::-;;;;;;;:21;;;63297:71;;;;;;;;;20805:25:1::0;;;20861:2;20846:18;;20839:34;;;;20920:1;20909:21;20904:2;20889:18;;20882:49;20793:2;20778:18;;20611:326;63297:71:0::1;;::::0;;;;::::1;-1:-1:-1::0;;63297:71:0;;;;;;63287:82;;63297:71:::1;63287:82:::0;;::::1;::::0;63260:110;;;;::::1;::::0;;;;;-1:-1:-1;63260:110:0;:118;;-1:-1:-1;;63260:118:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63125:269:::1;63105:3;::::0;::::1;:::i;:::-;;;63061:344;;26428:328:::0;26603:41;1856:10;26636:7;26603:18;:41::i;:::-;26595:103;;;;-1:-1:-1;;;26595:103:0;;;;;;;:::i;:::-;26709:39;26723:4;26729:2;26733:7;26742:5;26709:13;:39::i;:::-;26428:328;;;;:::o;51165:1132::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;51470:51;;::::1;:109:::0;::::1;;;-1:-1:-1::0;51538:41:0;;::::1;51470:109;:159;;;;-1:-1:-1::0;51618:11:0::1;51628:1;51618:7:::0;:11:::1;:::i;:::-;51596:33:::0;::::1;51470:159;51448:224;;;;-1:-1:-1::0;;;51448:224:0::1;;;;;;;:::i;:::-;51733:29;::::0;;::::1;51685:45;51733:29:::0;;;:21:::1;:29;::::0;;;;51773:33;;-1:-1:-1;;51773:33:0::1;;;::::0;;::::1;;::::0;;-1:-1:-1;51817:25:0;::::1;:35:::0;;;51733:29;51865:290:::1;51883:27;::::0;::::1;::::0;-1:-1:-1;51865:290:0::1;;;51987:17;;52005:1;51987:20;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51932:18;:31;;:52;51964:16;;51981:1;51964:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51932:52;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;51932:52:0;:75;;-1:-1:-1;;51932:75:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;52134:6;;:9:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52022:29;:109;52087:6;52095:16;;52112:1;52095:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52076:39;::::0;;33655:1:1;33644:21;;;;52076:39:0::1;::::0;::::1;33626:40:1::0;33714:6;33702:19;;;33682:18;;;33675:47;33599:18;;52076:39:0::1;;;;;;;;;;;;52066:50;;;;;;52022:109;;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;51912:3;;;;:::i;:::-;;;51865:290;;;;52171:9;52167:123;52190:11;52200:1;52190:7:::0;:11:::1;:::i;:::-;52186:1;:15;52167:123;;;52264:11;;52276:1;52264:14;;;;;;;:::i;:::-;;;;;;;52223:18;:31;;:38;52255:1;52259;52255:5;;;;:::i;:::-;52223:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;52223:38:0;:55;52203:3:::1;::::0;::::1;:::i;:::-;;;52167:123;;;;51437:860;51165:1132:::0;;;;;;;;;;:::o;66395:353::-;66471:13;66505:17;66513:8;66505:7;:17::i;:::-;66497:63;;;;-1:-1:-1;;;66497:63:0;;34289:2:1;66497:63:0;;;34271:21:1;34328:2;34308:18;;;34301:30;34367:34;34347:18;;;34340:62;-1:-1:-1;;;34418:18:1;;;34411:31;34459:19;;66497:63:0;34087:397:1;66497:63:0;66571:28;66602:10;:8;:10::i;:::-;66571:41;;66661:1;66636:14;66630:28;:32;:110;;;;;;;;;;;;;;;;;66689:14;66705:19;:8;:17;:19::i;:::-;66672:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66630:110;66623:117;66395:353;-1:-1:-1;;;66395:353:0:o;52305:206::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;52383:45:::1;52431:30;52454:6;52431:22;:30::i;:::-;52472:31:::0;;-1:-1:-1;;52472:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;52305:206:0:o;59824:1308::-;33028:7;;-1:-1:-1;;;33028:7:0;;;;33282:9;33274:38;;;;-1:-1:-1;;;33274:38:0;;;;;;;:::i;:::-;59959:33:::1;:11;59980::::0;59959:20:::1;:33::i;:::-;59951:80;;;::::0;-1:-1:-1;;;59951:80:0;;35333:2:1;59951:80:0::1;::::0;::::1;35315:21:1::0;35372:2;35352:18;;;35345:30;35411:34;35391:18;;;35384:62;-1:-1:-1;;;35462:18:1;;;35455:32;35504:19;;59951:80:0::1;35131:398:1::0;59951:80:0::1;60070:10;60050:16;60058:7:::0;60050::::1;:16::i;:::-;-1:-1:-1::0;;;;;60050:30:0::1;;60042:70;;;::::0;-1:-1:-1;;;60042:70:0;;35736:2:1;60042:70:0::1;::::0;::::1;35718:21:1::0;35775:2;35755:18;;;35748:30;35814:29;35794:18;;;35787:57;35861:18;;60042:70:0::1;35534:351:1::0;60042:70:0::1;60273:39;::::0;;;:30:::1;:39;::::0;;;;60337:8;;60273:48:::1;::::0;:46:::1;:48::i;:::-;60143:114;60194:26:::0;;;:17:::1;:26;::::0;;;;;;;:32;60228:17:::1;:26:::0;;;;;;60183:72;;60194:32:::1;::::0;;;::::1;60183:72:::0;;::::1;36058:40:1::0;-1:-1:-1;;;;;60228:26:0::1;36114:18:1::0;;;36107:59;60183:72:0;;;;;;;;;36031:18:1;;;;60183:72:0;;60173:83;;;;::::1;::::0;60143:114;;:29:::1;:114:::0;;;;;;:178:::1;::::0;;:114:::1;;:178;:::i;:::-;:209;60125:323;;;60379:57;::::0;-1:-1:-1;;;60379:57:0;;36379:2:1;60379:57:0::1;::::0;::::1;36361:21:1::0;36418:2;36398:18;;;36391:30;36457:34;36437:18;;;36430:62;-1:-1:-1;;;36508:18:1;;;36501:45;36563:19;;60379:57:0::1;36177:411:1::0;60125:323:0::1;60465:7;60460:450;60478:19;::::0;::::1;::::0;-1:-1:-1;60460:450:0::1;;;60572:10;-1:-1:-1::0;;;;;60527:28:0;::::1;;60556:8:::0;;:11:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;60527:41;;;;;;;;;;;;;6905:25:1::0;;6893:2;6878:18;;6759:177;60527:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60527:55:0::1;;60519:95;;;::::0;-1:-1:-1;;;60519:95:0;;36795:2:1;60519:95:0::1;::::0;::::1;36777:21:1::0;36834:2;36814:18;;;36807:30;36873:29;36853:18;;;36846:57;36920:18;;60519:95:0::1;36593:351:1::0;60519:95:0::1;60638:21;:70;60681:11;60694:8;;60703:1;60694:11;;;;;;;;;:::i;:::-;;;;;;;60670:36;;;;;;;;-1:-1:-1::0;;;;;31234:32:1;;;;31216:51;;31298:2;31283:18;;31276:34;31204:2;31189:18;;31042:274;60670:36:0::1;;::::0;;-1:-1:-1;;60670:36:0;;::::1;::::0;;;;;;60660:47;;60670:36:::1;60660:47:::0;;::::1;::::0;60638:70;;;;::::1;::::0;;;;;-1:-1:-1;60638:70:0;;::::1;;60637:71;60629:106;;;::::0;-1:-1:-1;;;60629:106:0;;37151:2:1;60629:106:0::1;::::0;::::1;37133:21:1::0;37190:2;37170:18;;;37163:30;-1:-1:-1;;;37209:18:1;;;37202:52;37271:18;;60629:106:0::1;36949:346:1::0;60629:106:0::1;60750:56;60794:8;;60803:1;60794:11;;;;;;;;;:::i;:::-;60750:39;::::0;;;:30:::1;60794:11;60750:39:::0;;;;;;;;60794:11;::::1;;;::::0;-1:-1:-1;60750:43:0::1;:56::i;:::-;;60894:4;60821:21;:70;60864:11;60877:8;;60886:1;60877:11;;;;;;;;;:::i;:::-;;;;;;;60853:36;;;;;;;;-1:-1:-1::0;;;;;31234:32:1;;;;31216:51;;31298:2;31283:18;;31276:34;31204:2;31189:18;;31042:274;60853:36:0::1;;::::0;;;;::::1;-1:-1:-1::0;;60853:36:0;;;;;;60843:47;;60853:36:::1;60843:47:::0;;::::1;::::0;60821:70;;;;::::1;::::0;;;;;-1:-1:-1;60821:70:0;:77;;-1:-1:-1;;60821:77:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60499:3:::1;::::0;::::1;:::i;:::-;;;60460:450;;;-1:-1:-1::0;60938:15:0::1;60966:43;60938:15:::0;60987:11;61000:8;;60966:13:::1;:43::i;:::-;61027:70;61047:8;;61057:7;61066:5;61073:10;61085:11;61027:70;;;;;;;;;;;:::i;58546:607::-:0;58666:7;;;58716:405;-1:-1:-1;;;;;58735:20:0;;;-1:-1:-1;58716:405:0;;;58779:45;58827:61;58850:17;:31;58868:9;;58878:1;-1:-1:-1;;;;;58868:12:0;;;;;;;;:::i;:::-;;;;;;;;;;58850:31;;-1:-1:-1;58850:31:0;;;;;;;;-1:-1:-1;58850:31:0;:37;;;58827:22;:61::i;:::-;58779:109;;58905:23;58931:18;:31;;:52;58963:16;;58980:1;-1:-1:-1;;;;;58963:19:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;58931:52;;;;;;;;;;;;;-1:-1:-1;58931:52:0;;;;;-1:-1:-1;59008:28:0;59000:66;;;;-1:-1:-1;;;59000:66:0;;38138:2:1;59000:66:0;;;38120:21:1;38177:2;38157:18;;;38150:30;38216:27;38196:18;;;38189:55;38261:18;;59000:66:0;37936:349:1;59000:66:0;59083:24;59092:15;59083:24;;:::i;:::-;;;58762:359;;58757:3;;;;:::i;:::-;;;58716:405;;;-1:-1:-1;59140:5:0;-1:-1:-1;58546:607:0;;;;;;;:::o;66775:135::-;66881:15;;66836:7;;66899:3;;66872:24;;-1:-1:-1;;;66881:15:0;;;;66872:6;:24;:::i;:::-;:30;;;;:::i;:::-;66863:39;;:6;:39;:::i;3827:192::-;3000:6;;-1:-1:-1;;;;;3000:6:0;1856:10;3147:23;3139:68;;;;-1:-1:-1;;;3139:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3916:22:0;::::1;3908:73;;;::::0;-1:-1:-1;;;3908:73:0;;38492:2:1;3908:73:0::1;::::0;::::1;38474:21:1::0;38531:2;38511:18;;;38504:30;38570:34;38550:18;;;38543:62;-1:-1:-1;;;38621:18:1;;;38614:36;38667:19;;3908:73:0::1;38290:402:1::0;3908:73:0::1;3992:19;4002:8;3992:9;:19::i;56659:730::-:0;33028:7;;-1:-1:-1;;;33028:7:0;;;;33282:9;33274:38;;;;-1:-1:-1;;;33274:38:0;;;;;;;:::i;:::-;56835:47:::1;:26;56871:10;56835:35;:47::i;:::-;56827:94;;;::::0;-1:-1:-1;;;56827:94:0;;38899:2:1;56827:94:0::1;::::0;::::1;38881:21:1::0;38938:2;38918:18;;;38911:30;38977:34;38957:18;;;38950:62;-1:-1:-1;;;39028:18:1;;;39021:32;39070:19;;56827:94:0::1;38697:398:1::0;56827:94:0::1;56940:46:::0;;::::1;56932:79;;;::::0;-1:-1:-1;;;56932:79:0;;39302:2:1;56932:79:0::1;::::0;::::1;39284:21:1::0;39341:2;39321:18;;;39314:30;-1:-1:-1;;;39360:18:1;;;39353:50;39420:18;;56932:79:0::1;39100:344:1::0;56932:79:0::1;57024:57;57050:9;;57061:19;;57024:25;:57::i;:::-;57099:8;57094:129;-1:-1:-1::0;;;;;57113:20:0;::::1;::::0;-1:-1:-1;57094:129:0::1;;;57189:19;;57209:1;-1:-1:-1::0;;;;;57189:22:0::1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;57155:56;;:17;:31;57173:9;;57183:1;-1:-1:-1::0;;;;;57173:12:0::1;;;;;;;;:::i;:::-;;;;;;;57155:31;;;;;;;;;;;;:56;;;;;-1:-1:-1::0;;;;;57155:56:0::1;;;;;-1:-1:-1::0;;;;;57155:56:0::1;;;;;;57135:3;;;;:::i;:::-;;;57094:129;;;-1:-1:-1::0;57242:12:0::1;::::0;-1:-1:-1;;;;;57242:12:0::1;57235:33;57269:5:::0;57284:4:::1;57292:14;47694:4;57292:6:::0;:14:::1;:::i;:::-;57235:72;::::0;-1:-1:-1;;;;;;57235:72:0::1;::::0;;;;;;-1:-1:-1;;;;;23689:15:1;;;57235:72:0::1;::::0;::::1;23671:34:1::0;23741:15;;;;23721:18;;;23714:43;23773:18;;;23766:34;23606:18;;57235:72:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57325:56;57343:9;;57354:19;;57375:5;57325:56;;;;;;;;;;:::i;:::-;;;;;;;;56659:730:::0;;;;;;:::o;41875:152::-;41945:4;41969:50;41974:3;-1:-1:-1;;;;;41994:23:0;;41969:4;:50::i;23588:293::-;23690:4;-1:-1:-1;;;;;;23723:40:0;;-1:-1:-1;;;23723:40:0;;:101;;-1:-1:-1;;;;;;;23776:48:0;;-1:-1:-1;;;23776:48:0;23723:101;:150;;;-1:-1:-1;;;;;;;;;;23048:40:0;;;23837:36;22939:157;27083:155;27182:7;:14;27148:4;;27172:24;;:58;;;;;27228:1;-1:-1:-1;;;;;27200:30:0;:7;27208;27200:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27200:16:0;:30;;27165:65;27083:155;-1:-1:-1;;27083:155:0:o;29256:175::-;29331:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29331:29:0;-1:-1:-1;;;;;29331:29:0;;;;;;;;:24;;29385;29331;29385:15;:24::i;:::-;-1:-1:-1;;;;;29376:47:0;;;;;;;;;;;29256:175;;:::o;45155:114::-;45215:7;45242:19;45250:3;38184:18;;38101:109;45623:137;45694:7;45729:22;45733:3;45745:5;45729:3;:22::i;64054:670::-;64125:16;64154:25;64196:12;:19;-1:-1:-1;;;;;64182:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64182:34:0;;64154:62;;64227:19;64249:13;31718:7;:14;;31630:110;64249:13;64227:35;;64280:9;64275:414;64299:12;:19;64295:1;:23;64275:414;;;64354:15;64368:1;64354:11;:15;:::i;:::-;64340:8;64349:1;64340:11;;;;;;;;:::i;:::-;;;;;;;;;;:29;47653:1;64384:17;:34;64402:15;64416:1;64402:11;:15;:::i;:::-;64384:34;;;;;;;;;;;;:41;;;;;-1:-1:-1;;;;;64384:41:0;;;;;-1:-1:-1;;;;;64384:41:0;;;;;;64477:12;64490:1;64477:15;;;;;;;;:::i;:::-;;;;;;;64440:17;:34;64472:1;64458:11;:15;;;;:::i;:::-;64440:34;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64620:4;64507:26;:110;64555:12;64568:1;64555:15;;;;;;;;:::i;:::-;;;;;;;:17;;;64574:12;64587:1;64574:15;;;;;;;;:::i;:::-;;;;;;;:17;;;64593:12;64606:1;64593:15;;;;;;;;:::i;:::-;;;;;;;:21;;;64544:71;;;;;;;;;20805:25:1;;;20861:2;20846:18;;20839:34;;;;20920:1;20909:21;20904:2;20889:18;;20882:49;20793:2;20778:18;;20611:326;64544:71:0;;;;;;;-1:-1:-1;;64544:71:0;;;;;;64534:82;;64544:71;64534:82;;;;64507:110;;;;;;;;;;-1:-1:-1;64507:110:0;:117;;-1:-1:-1;;64507:117:0;;;;;;;;;;64639:38;64649:10;64661:15;64675:1;64661:11;:15;:::i;:::-;64639:9;:38::i;:::-;64320:3;;;:::i;:::-;;;64275:414;;27244:349;27337:4;27362:16;27370:7;27362;:16::i;:::-;27354:73;;;;-1:-1:-1;;;27354:73:0;;39651:2:1;27354:73:0;;;39633:21:1;39690:2;39670:18;;;39663:30;39729:34;39709:18;;;39702:62;-1:-1:-1;;;39780:18:1;;;39773:42;39832:19;;27354:73:0;39449:408:1;27354:73:0;27438:13;27454:24;27470:7;27454:15;:24::i;:::-;27438:40;;27508:5;-1:-1:-1;;;;;27497:16:0;:7;-1:-1:-1;;;;;27497:16:0;;:51;;;;27541:7;-1:-1:-1;;;;;27517:31:0;:20;27529:7;27517:11;:20::i;:::-;-1:-1:-1;;;;;27517:31:0;;27497:51;:87;;;-1:-1:-1;;;;;;25843:25:0;;;25819:4;25843:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27552:32;25722:164;28733:517;28893:4;-1:-1:-1;;;;;28865:32:0;:24;28881:7;28865:15;:24::i;:::-;-1:-1:-1;;;;;28865:32:0;;28857:86;;;;-1:-1:-1;;;28857:86:0;;40064:2:1;28857:86:0;;;40046:21:1;40103:2;40083:18;;;40076:30;40142:34;40122:18;;;40115:62;-1:-1:-1;;;40193:18:1;;;40186:39;40242:19;;28857:86:0;39862:405:1;28857:86:0;-1:-1:-1;;;;;28962:16:0;;28954:65;;;;-1:-1:-1;;;28954:65:0;;40474:2:1;28954:65:0;;;40456:21:1;40513:2;40493:18;;;40486:30;40552:34;40532:18;;;40525:62;-1:-1:-1;;;40603:18:1;;;40596:34;40647:19;;28954:65:0;40272:400:1;28954:65:0;29136:29;29153:1;29157:7;29136:8;:29::i;:::-;29195:2;29176:7;29184;29176:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;29176:21:0;-1:-1:-1;;;;;29176:21:0;;;;;;29215:27;;29234:7;;29215:27;;;;;;;;;;29176:16;29215:27;28733:517;;;:::o;42203:158::-;42276:4;42300:53;42308:3;-1:-1:-1;;;;;42328:23:0;;42300:7;:53::i;55040:338::-;55196:29;;;;55109:26;55196:29;;;:21;:29;;;;;55244:25;;;;55236:96;;;;-1:-1:-1;;;55236:96:0;;40879:2:1;55236:96:0;;;40861:21:1;40918:2;40898:18;;;40891:30;40957:34;40937:18;;;40930:62;-1:-1:-1;;;41008:18:1;;;41001:42;41060:19;;55236:96:0;40677:408:1;55386:114:0;55432:7;55464:1;55459;:6;;:33;;55489:2;55490:1;55489:2;:::i;:::-;55459:33;;34016:120;33028:7;;-1:-1:-1;;;33028:7:0;;;;33552:41;;;;-1:-1:-1;;;33552:41:0;;41433:2:1;33552:41:0;;;41415:21:1;41472:2;41452:18;;;41445:30;-1:-1:-1;;;41491:18:1;;;41484:50;41551:18;;33552:41:0;41231:344:1;33552:41:0;34075:7:::1;:15:::0;;-1:-1:-1;;;;34075:15:0::1;::::0;;34106:22:::1;1856:10:::0;34115:12:::1;34106:22;::::0;-1:-1:-1;;;;;4156:32:1;;;4138:51;;4126:2;4111:18;34106:22:0::1;;;;;;;34016:120::o:0;42447:167::-;-1:-1:-1;;;;;42581:23:0;;42527:4;37983:19;;;:12;;;:19;;;;;;:24;;42551:55;37886:129;4027:173;4102:6;;;-1:-1:-1;;;;;4119:17:0;;;-1:-1:-1;;;;;;4119:17:0;;;;;;;4152:40;;4102:6;;;4119:17;4102:6;;4152:40;;4083:16;;4152:40;4072:128;4027:173;:::o;57397:442::-;57533:8;57528:304;-1:-1:-1;;;;;57547:20:0;;;-1:-1:-1;57528:304:0;;;57628:19;;57648:1;-1:-1:-1;;;;;57628:22:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;57593:57;;:17;:31;57611:9;;57621:1;-1:-1:-1;;;;;57611:12:0;;;;;;;;:::i;:::-;;;;;;;;;;57593:31;;-1:-1:-1;57593:31:0;;;;;;;;-1:-1:-1;57593:31:0;;-1:-1:-1;;;;;57593:31:0;:57;57589:129;;;57671:31;;-1:-1:-1;;;57671:31:0;;41782:2:1;57671:31:0;;;41764:21:1;41821:2;41801:18;;;41794:30;-1:-1:-1;;;41840:18:1;;;41833:51;41901:18;;57671:31:0;41580:345:1;57589:129:0;57756:21;57764:9;;57774:1;-1:-1:-1;;;;;57764:12:0;;;;;;;;:::i;57756:21::-;-1:-1:-1;;;;;57742:35:0;:10;-1:-1:-1;;;;;57742:35:0;;57734:86;;;;-1:-1:-1;;;57734:86:0;;42132:2:1;57734:86:0;;;42114:21:1;42171:2;42151:18;;;42144:30;42210:34;42190:18;;;42183:62;-1:-1:-1;;;42261:18:1;;;42254:36;42307:19;;57734:86:0;41930:402:1;57734:86:0;57569:3;;;:::i;:::-;;;57528:304;;33757:118;33028:7;;-1:-1:-1;;;33028:7:0;;;;33282:9;33274:38;;;;-1:-1:-1;;;33274:38:0;;;;;;;:::i;:::-;33817:7:::1;:14:::0;;-1:-1:-1;;;;33817:14:0::1;-1:-1:-1::0;;;33817:14:0::1;::::0;;33847:20:::1;33854:12;1856:10:::0;;1776:98;44923:146;45000:4;37983:19;;;:12;;;:19;;;;;;:24;;45024:37;37886:129;44700:137;44770:4;44794:35;44802:3;44822:5;44794:7;:35::i;62074:392::-;62180:27;62224:6;-1:-1:-1;;;;;62210:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62210:28:0;;62180:58;;62254:7;62249:94;62271:10;:17;62267:1;:21;;;62249:94;;;62326:5;62310:10;62321:1;62310:13;;;;;;;;;;:::i;:::-;;;;;;;;;;:21;62290:3;;;:::i;:::-;;;62249:94;;;-1:-1:-1;62369:12:0;;62355:73;;-1:-1:-1;;;62355:73:0;;-1:-1:-1;;;;;62369:12:0;;;;62355:40;;:73;;62396:11;;62409:6;;;;62417:10;;62355:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;62074:392:0:o;26762:315::-;26919:28;26929:4;26935:2;26939:7;26919:9;:28::i;:::-;26966:48;26989:4;26995:2;26999:7;27008:5;26966:22;:48::i;:::-;26958:111;;;;-1:-1:-1;;;26958:111:0;;;;;;;:::i;54933:99::-;54984:13;55017:7;55010:14;;;;;:::i;4460:723::-;4516:13;4737:10;4733:53;;-1:-1:-1;;4764:10:0;;;;;;;;;;;;-1:-1:-1;;;4764:10:0;;;;;4460:723::o;4733:53::-;4811:5;4796:12;4852:78;4859:9;;4852:78;;4885:8;;;;:::i;:::-;;-1:-1:-1;4908:10:0;;-1:-1:-1;4916:2:0;4908:10;;:::i;:::-;;;4852:78;;;4940:19;4972:6;-1:-1:-1;;;;;4962:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4962:17:0;;4940:39;;4990:154;4997:10;;4990:154;;5024:11;5034:1;5024:11;;:::i;:::-;;-1:-1:-1;5093:10:0;5101:2;5093:5;:10;:::i;:::-;5080:24;;:2;:24;:::i;:::-;5067:39;;5050:6;5057;5050:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5050:56:0;;;;;;;;-1:-1:-1;5121:11:0;5130:2;5121:11;;:::i;:::-;;;4990:154;;44393:131;44460:4;44484:32;44489:3;44509:5;35790:414;35853:4;37983:19;;;:12;;;:19;;;;;;35870:327;;-1:-1:-1;35913:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;36096:18;;36074:19;;;:12;;;:19;;;;;;:40;;;;36129:11;;35870:327;-1:-1:-1;36180:5:0;36173:12;;38564:120;38631:7;38658:3;:11;;38670:5;38658:18;;;;;;;;:::i;:::-;;;;;;;;;38651:25;;38564:120;;;;:::o;27599:110::-;27675:26;27685:2;27689:7;27675:26;;;;;;;;;;;;:9;:26::i;36380:1420::-;36446:4;36585:19;;;:12;;;:19;;;;;;36621:15;;36617:1176;;36996:21;37020:14;37033:1;37020:10;:14;:::i;:::-;37069:18;;36996:38;;-1:-1:-1;37049:17:0;;37069:22;;37090:1;;37069:22;:::i;:::-;37049:42;;37125:13;37112:9;:26;37108:405;;37159:17;37179:3;:11;;37191:9;37179:22;;;;;;;;:::i;:::-;;;;;;;;;37159:42;;37333:9;37304:3;:11;;37316:13;37304:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;37418:23;;;:12;;;:23;;;;;:36;;;37108:405;37594:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37689:3;:12;;:19;37702:5;37689:19;;;;;;;;;;;37682:26;;;37732:4;37725:11;;;;;;;36617:1176;37776:5;37769:12;;;;;29437:799;29592:4;-1:-1:-1;;;;;29613:13:0;;15204:20;15252:8;29609:620;;29649:72;;-1:-1:-1;;;29649:72:0;;-1:-1:-1;;;;;29649:36:0;;;;;:72;;1856:10;;29700:4;;29706:7;;29715:5;;29649:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29649:72:0;;;;;;;;-1:-1:-1;;29649:72:0;;;;;;;;;;;;:::i;:::-;;;29645:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29891:13:0;;29887:272;;29934:60;;-1:-1:-1;;;29934:60:0;;;;;;;:::i;29887:272::-;30109:6;30103:13;30094:6;30090:2;30086:15;30079:38;29645:529;-1:-1:-1;;;;;;29772:51:0;-1:-1:-1;;;29772:51:0;;-1:-1:-1;29765:58:0;;29609:620;-1:-1:-1;30213:4:0;30206:11;;27715:321;27845:18;27851:2;27855:7;27845:5;:18::i;:::-;27896:54;27927:1;27931:2;27935:7;27944:5;27896:22;:54::i;:::-;27874:154;;;;-1:-1:-1;;;27874:154:0;;;;;;;:::i;28042:346::-;-1:-1:-1;;;;;28122:16:0;;28114:61;;;;-1:-1:-1;;;28114:61:0;;44432:2:1;28114:61:0;;;44414:21:1;;;44451:18;;;44444:30;44510:34;44490:18;;;44483:62;44562:18;;28114:61:0;44230:356:1;28114:61:0;28195:16;28203:7;28195;:16::i;:::-;28194:17;28186:58;;;;-1:-1:-1;;;28186:58:0;;44793:2:1;28186:58:0;;;44775:21:1;44832:2;44812:18;;;44805:30;44871;44851:18;;;44844:58;44919:18;;28186:58:0;44591:352:1;28186:58:0;28313:7;:16;;;;;;;-1:-1:-1;28313:16:0;;;;;;;-1:-1:-1;;;;;;28313:16:0;-1:-1:-1;;;;;28313:16:0;;;;;;;;28347:33;;28372:7;;-1:-1:-1;28347:33:0;;-1:-1:-1;;28347:33:0;28042:346;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:253;796:2;790:9;838:4;826:17;;-1:-1:-1;;;;;858:34:1;;894:22;;;855:62;852:88;;;920:18;;:::i;:::-;956:2;949:22;724:253;:::o;982:275::-;1053:2;1047:9;1118:2;1099:13;;-1:-1:-1;;1095:27:1;1083:40;;-1:-1:-1;;;;;1138:34:1;;1174:22;;;1135:62;1132:88;;;1200:18;;:::i;:::-;1236:2;1229:22;982:275;;-1:-1:-1;982:275:1:o;1262:160::-;1328:20;;1388:1;1377:20;;;1367:31;;1357:59;;1412:1;1409;1402:12;1357:59;1262:160;;;:::o;1427:1350::-;1539:6;1570:2;1613;1601:9;1592:7;1588:23;1584:32;1581:52;;;1629:1;1626;1619:12;1581:52;1669:9;1656:23;-1:-1:-1;;;;;1739:2:1;1731:6;1728:14;1725:34;;;1755:1;1752;1745:12;1725:34;1793:6;1782:9;1778:22;1768:32;;1838:7;1831:4;1827:2;1823:13;1819:27;1809:55;;1860:1;1857;1850:12;1809:55;1896:2;1883:16;1918:2;1914;1911:10;1908:36;;;1924:18;;:::i;:::-;1964:36;1996:2;1991;1988:1;1984:10;1980:19;1964:36;:::i;:::-;2034:15;;;2065:12;;;;-1:-1:-1;2096:4:1;2135:11;;;2127:20;;2123:29;;;2164:19;;;2161:39;;;2196:1;2193;2186:12;2161:39;2220:11;;;;2240:507;2256:6;2251:3;2248:15;2240:507;;;2336:2;2330:3;2321:7;2317:17;2313:26;2310:116;;;2380:1;2409:2;2405;2398:14;2310:116;2452:22;;:::i;:::-;2501:21;2518:3;2501:21;:::i;:::-;2487:36;;2572:12;;;2559:26;2543:14;;;2536:50;2609:2;2660:12;;;2647:26;2631:14;;;2624:50;2687:18;;2273:12;;;;2725;;;;2240:507;;;-1:-1:-1;2766:5:1;1427:1350;-1:-1:-1;;;;;;;1427:1350:1:o;2782:258::-;2854:1;2864:113;2878:6;2875:1;2872:13;2864:113;;;2954:11;;;2948:18;2935:11;;;2928:39;2900:2;2893:10;2864:113;;;2995:6;2992:1;2989:13;2986:48;;;-1:-1:-1;;3030:1:1;3012:16;;3005:27;2782:258::o;3045:::-;3087:3;3125:5;3119:12;3152:6;3147:3;3140:19;3168:63;3224:6;3217:4;3212:3;3208:14;3201:4;3194:5;3190:16;3168:63;:::i;:::-;3285:2;3264:15;-1:-1:-1;;3260:29:1;3251:39;;;;3292:4;3247:50;;3045:258;-1:-1:-1;;3045:258:1:o;3308:220::-;3457:2;3446:9;3439:21;3420:4;3477:45;3518:2;3507:9;3503:18;3495:6;3477:45;:::i;3533:269::-;3590:6;3643:2;3631:9;3622:7;3618:23;3614:32;3611:52;;;3659:1;3656;3649:12;3611:52;3698:9;3685:23;3748:4;3741:5;3737:16;3730:5;3727:27;3717:55;;3768:1;3765;3758:12;3807:180;3866:6;3919:2;3907:9;3898:7;3894:23;3890:32;3887:52;;;3935:1;3932;3925:12;3887:52;-1:-1:-1;3958:23:1;;3807:180;-1:-1:-1;3807:180:1:o;4200:131::-;-1:-1:-1;;;;;4275:31:1;;4265:42;;4255:70;;4321:1;4318;4311:12;4336:315;4404:6;4412;4465:2;4453:9;4444:7;4440:23;4436:32;4433:52;;;4481:1;4478;4471:12;4433:52;4520:9;4507:23;4539:31;4564:5;4539:31;:::i;:::-;4589:5;4641:2;4626:18;;;;4613:32;;-1:-1:-1;;;4336:315:1:o;4656:367::-;4719:8;4729:6;4783:3;4776:4;4768:6;4764:17;4760:27;4750:55;;4801:1;4798;4791:12;4750:55;-1:-1:-1;4824:20:1;;-1:-1:-1;;;;;4856:30:1;;4853:50;;;4899:1;4896;4889:12;4853:50;4936:4;4928:6;4924:17;4912:29;;4996:3;4989:4;4979:6;4976:1;4972:14;4964:6;4960:27;4956:38;4953:47;4950:67;;;5013:1;5010;5003:12;4950:67;4656:367;;;;;:::o;5028:437::-;5114:6;5122;5175:2;5163:9;5154:7;5150:23;5146:32;5143:52;;;5191:1;5188;5181:12;5143:52;5231:9;5218:23;-1:-1:-1;;;;;5256:6:1;5253:30;5250:50;;;5296:1;5293;5286:12;5250:50;5335:70;5397:7;5388:6;5377:9;5373:22;5335:70;:::i;:::-;5424:8;;5309:96;;-1:-1:-1;5028:437:1;-1:-1:-1;;;;5028:437:1:o;5470:435::-;5523:3;5561:5;5555:12;5588:6;5583:3;5576:19;5614:4;5643:2;5638:3;5634:12;5627:19;;5680:2;5673:5;5669:14;5701:1;5711:169;5725:6;5722:1;5719:13;5711:169;;;5786:13;;5774:26;;5820:12;;;;5855:15;;;;5747:1;5740:9;5711:169;;;-1:-1:-1;5896:3:1;;5470:435;-1:-1:-1;;;;;5470:435:1:o;5910:844::-;6102:4;6131:2;6171;6160:9;6156:18;6201:2;6190:9;6183:21;6224:6;6259;6253:13;6290:6;6282;6275:22;6328:2;6317:9;6313:18;6306:25;;6390:2;6380:6;6377:1;6373:14;6362:9;6358:30;6354:39;6340:53;;6428:2;6420:6;6416:15;6449:1;6459:266;6473:6;6470:1;6467:13;6459:266;;;6566:2;6562:7;6550:9;6542:6;6538:22;6534:36;6529:3;6522:49;6594:51;6638:6;6629;6623:13;6594:51;:::i;:::-;6584:61;-1:-1:-1;6703:12:1;;;;6668:15;;;;6495:1;6488:9;6459:266;;;-1:-1:-1;6742:6:1;;5910:844;-1:-1:-1;;;;;;;5910:844:1:o;7383:456::-;7460:6;7468;7476;7529:2;7517:9;7508:7;7504:23;7500:32;7497:52;;;7545:1;7542;7535:12;7497:52;7584:9;7571:23;7603:31;7628:5;7603:31;:::i;:::-;7653:5;-1:-1:-1;7710:2:1;7695:18;;7682:32;7723:33;7682:32;7723:33;:::i;:::-;7383:456;;7775:7;;-1:-1:-1;;;7829:2:1;7814:18;;;;7801:32;;7383:456::o;7844:247::-;7903:6;7956:2;7944:9;7935:7;7931:23;7927:32;7924:52;;;7972:1;7969;7962:12;7924:52;8011:9;7998:23;8030:31;8055:5;8030:31;:::i;8096:575::-;8198:6;8206;8214;8222;8275:2;8263:9;8254:7;8250:23;8246:32;8243:52;;;8291:1;8288;8281:12;8243:52;8314:27;8331:9;8314:27;:::i;:::-;8304:37;;8388:2;8377:9;8373:18;8360:32;8350:42;;8443:2;8432:9;8428:18;8415:32;-1:-1:-1;;;;;8462:6:1;8459:30;8456:50;;;8502:1;8499;8492:12;8456:50;8541:70;8603:7;8594:6;8583:9;8579:22;8541:70;:::i;:::-;8096:575;;;;-1:-1:-1;8630:8:1;-1:-1:-1;;;;8096:575:1:o;8676:407::-;8741:5;-1:-1:-1;;;;;8767:6:1;8764:30;8761:56;;;8797:18;;:::i;:::-;8835:57;8880:2;8859:15;;-1:-1:-1;;8855:29:1;8886:4;8851:40;8835:57;:::i;:::-;8826:66;;8915:6;8908:5;8901:21;8955:3;8946:6;8941:3;8937:16;8934:25;8931:45;;;8972:1;8969;8962:12;8931:45;9021:6;9016:3;9009:4;9002:5;8998:16;8985:43;9075:1;9068:4;9059:6;9052:5;9048:18;9044:29;9037:40;8676:407;;;;;:::o;9088:451::-;9157:6;9210:2;9198:9;9189:7;9185:23;9181:32;9178:52;;;9226:1;9223;9216:12;9178:52;9266:9;9253:23;-1:-1:-1;;;;;9291:6:1;9288:30;9285:50;;;9331:1;9328;9321:12;9285:50;9354:22;;9407:4;9399:13;;9395:27;-1:-1:-1;9385:55:1;;9436:1;9433;9426:12;9385:55;9459:74;9525:7;9520:2;9507:16;9502:2;9498;9494:11;9459:74;:::i;9544:772::-;9665:6;9673;9681;9689;9742:2;9730:9;9721:7;9717:23;9713:32;9710:52;;;9758:1;9755;9748:12;9710:52;9798:9;9785:23;-1:-1:-1;;;;;9868:2:1;9860:6;9857:14;9854:34;;;9884:1;9881;9874:12;9854:34;9923:70;9985:7;9976:6;9965:9;9961:22;9923:70;:::i;:::-;10012:8;;-1:-1:-1;9897:96:1;-1:-1:-1;10100:2:1;10085:18;;10072:32;;-1:-1:-1;10116:16:1;;;10113:36;;;10145:1;10142;10135:12;10113:36;;10184:72;10248:7;10237:8;10226:9;10222:24;10184:72;:::i;10321:261::-;10500:2;10489:9;10482:21;10463:4;10520:56;10572:2;10561:9;10557:18;10549:6;10520:56;:::i;10587:640::-;10691:6;10699;10707;10715;10768:2;10756:9;10747:7;10743:23;10739:32;10736:52;;;10784:1;10781;10774:12;10736:52;10824:9;10811:23;-1:-1:-1;;;;;10849:6:1;10846:30;10843:50;;;10889:1;10886;10879:12;10843:50;10928:70;10990:7;10981:6;10970:9;10966:22;10928:70;:::i;:::-;11017:8;;-1:-1:-1;10902:96:1;-1:-1:-1;;11099:2:1;11084:18;;11071:32;;-1:-1:-1;11153:2:1;11138:18;;11125:32;11166:31;11125:32;11166:31;:::i;:::-;10587:640;;;;-1:-1:-1;10587:640:1;;-1:-1:-1;;10587:640:1:o;11232:841::-;11359:6;11367;11375;11383;11391;11444:2;11432:9;11423:7;11419:23;11415:32;11412:52;;;11460:1;11457;11450:12;11412:52;11483:27;11500:9;11483:27;:::i;:::-;11473:37;;11561:2;11550:9;11546:18;11533:32;-1:-1:-1;;;;;11625:2:1;11617:6;11614:14;11611:34;;;11641:1;11638;11631:12;11611:34;11680:70;11742:7;11733:6;11722:9;11718:22;11680:70;:::i;:::-;11769:8;;-1:-1:-1;11654:96:1;-1:-1:-1;11857:2:1;11842:18;;11829:32;;-1:-1:-1;11873:16:1;;;11870:36;;;11902:1;11899;11892:12;11870:36;;11941:72;12005:7;11994:8;11983:9;11979:24;11941:72;:::i;:::-;11232:841;;;;-1:-1:-1;11232:841:1;;-1:-1:-1;12032:8:1;;11915:98;11232:841;-1:-1:-1;;;11232:841:1:o;12078:658::-;12249:2;12301:21;;;12371:13;;12274:18;;;12393:22;;;12220:4;;12249:2;12472:15;;;;12446:2;12431:18;;;12220:4;12515:195;12529:6;12526:1;12523:13;12515:195;;;12594:13;;-1:-1:-1;;;;;12590:39:1;12578:52;;12685:15;;;;12650:12;;;;12626:1;12544:9;12515:195;;;-1:-1:-1;12727:3:1;;12078:658;-1:-1:-1;;;;;;12078:658:1:o;12741:506::-;12833:6;12841;12849;12902:2;12890:9;12881:7;12877:23;12873:32;12870:52;;;12918:1;12915;12908:12;12870:52;12941:27;12958:9;12941:27;:::i;:::-;12931:37;;13019:2;13008:9;13004:18;12991:32;-1:-1:-1;;;;;13038:6:1;13035:30;13032:50;;;13078:1;13075;13068:12;13032:50;13117:70;13179:7;13170:6;13159:9;13155:22;13117:70;:::i;:::-;12741:506;;13206:8;;-1:-1:-1;13091:96:1;;-1:-1:-1;;;;12741:506:1:o;14097:627::-;14160:3;14198:5;14192:12;14225:6;14220:3;14213:19;14251:4;14280:2;14275:3;14271:12;14264:19;;14317:2;14310:5;14306:14;14338:1;14348:351;14362:6;14359:1;14356:13;14348:351;;;14421:13;;14473:9;;14470:1;14459:24;14447:37;;14524:11;;;14518:18;14504:12;;;14497:40;14560:4;14604:11;;;14598:18;14584:12;;;14577:40;14646:4;14637:14;;;;14674:15;;;;14384:1;14377:9;14348:351;;14729:327;14964:2;14953:9;14946:21;14927:4;14984:66;15046:2;15035:9;15031:18;15023:6;14984:66;:::i;15573:118::-;15659:5;15652:13;15645:21;15638:5;15635:32;15625:60;;15681:1;15678;15671:12;15696:382;15761:6;15769;15822:2;15810:9;15801:7;15797:23;15793:32;15790:52;;;15838:1;15835;15828:12;15790:52;15877:9;15864:23;15896:31;15921:5;15896:31;:::i;:::-;15946:5;-1:-1:-1;16003:2:1;15988:18;;15975:32;16016:30;15975:32;16016:30;:::i;:::-;16065:7;16055:17;;;15696:382;;;;;:::o;16083:795::-;16178:6;16186;16194;16202;16255:3;16243:9;16234:7;16230:23;16226:33;16223:53;;;16272:1;16269;16262:12;16223:53;16311:9;16298:23;16330:31;16355:5;16330:31;:::i;:::-;16380:5;-1:-1:-1;16437:2:1;16422:18;;16409:32;16450:33;16409:32;16450:33;:::i;:::-;16502:7;-1:-1:-1;16556:2:1;16541:18;;16528:32;;-1:-1:-1;16611:2:1;16596:18;;16583:32;-1:-1:-1;;;;;16627:30:1;;16624:50;;;16670:1;16667;16660:12;16624:50;16693:22;;16746:4;16738:13;;16734:27;-1:-1:-1;16724:55:1;;16775:1;16772;16765:12;16724:55;16798:74;16864:7;16859:2;16846:16;16841:2;16837;16833:11;16798:74;:::i;:::-;16788:84;;;16083:795;;;;;;;:::o;16883:1540::-;17089:6;17097;17105;17113;17121;17129;17137;17145;17153;17161;17214:3;17202:9;17193:7;17189:23;17185:33;17182:53;;;17231:1;17228;17221:12;17182:53;17254:27;17271:9;17254:27;:::i;:::-;17244:37;;17328:2;17317:9;17313:18;17300:32;17290:42;;17383:2;17372:9;17368:18;17355:32;-1:-1:-1;;;;;17447:2:1;17439:6;17436:14;17433:34;;;17463:1;17460;17453:12;17433:34;17502:70;17564:7;17555:6;17544:9;17540:22;17502:70;:::i;:::-;17591:8;;-1:-1:-1;17476:96:1;-1:-1:-1;17679:2:1;17664:18;;17651:32;;-1:-1:-1;17695:16:1;;;17692:36;;;17724:1;17721;17714:12;17692:36;17763:72;17827:7;17816:8;17805:9;17801:24;17763:72;:::i;:::-;17854:8;;-1:-1:-1;17737:98:1;-1:-1:-1;17942:3:1;17927:19;;17914:33;;-1:-1:-1;17959:16:1;;;17956:36;;;17988:1;17985;17978:12;17956:36;18027:72;18091:7;18080:8;18069:9;18065:24;18027:72;:::i;:::-;18118:8;;-1:-1:-1;18001:98:1;-1:-1:-1;18206:3:1;18191:19;;18178:33;;-1:-1:-1;18223:16:1;;;18220:36;;;18252:1;18249;18242:12;18220:36;;18291:72;18355:7;18344:8;18333:9;18329:24;18291:72;:::i;:::-;18265:98;;18382:8;18372:18;;;18409:8;18399:18;;;16883:1540;;;;;;;;;;;;;:::o;18428:311::-;18491:6;18499;18552:2;18540:9;18531:7;18527:23;18523:32;18520:52;;;18568:1;18565;18558:12;18520:52;18591:27;18608:9;18591:27;:::i;18744:388::-;18812:6;18820;18873:2;18861:9;18852:7;18848:23;18844:32;18841:52;;;18889:1;18886;18879:12;18841:52;18928:9;18915:23;18947:31;18972:5;18947:31;:::i;:::-;18997:5;-1:-1:-1;19054:2:1;19039:18;;19026:32;19067:33;19026:32;19067:33;:::i;19137:976::-;19276:6;19284;19292;19300;19308;19316;19369:3;19357:9;19348:7;19344:23;19340:33;19337:53;;;19386:1;19383;19376:12;19337:53;19426:9;19413:23;-1:-1:-1;;;;;19496:2:1;19488:6;19485:14;19482:34;;;19512:1;19509;19502:12;19482:34;19551:70;19613:7;19604:6;19593:9;19589:22;19551:70;:::i;:::-;19640:8;;-1:-1:-1;19525:96:1;-1:-1:-1;19728:2:1;19713:18;;19700:32;;-1:-1:-1;19744:16:1;;;19741:36;;;19773:1;19770;19763:12;19741:36;;19812:72;19876:7;19865:8;19854:9;19850:24;19812:72;:::i;:::-;19903:8;;-1:-1:-1;19786:98:1;-1:-1:-1;;19988:2:1;19973:18;;19960:32;20001:31;19960:32;20001:31;:::i;:::-;20051:5;20041:15;;;20103:2;20092:9;20088:18;20075:32;20065:42;;19137:976;;;;;;;;:::o;20118:356::-;20320:2;20302:21;;;20339:18;;;20332:30;20398:34;20393:2;20378:18;;20371:62;20465:2;20450:18;;20118:356::o;20479:127::-;20540:10;20535:3;20531:20;20528:1;20521:31;20571:4;20568:1;20561:15;20595:4;20592:1;20585:15;20942:127;21003:10;20998:3;20994:20;20991:1;20984:31;21034:4;21031:1;21024:15;21058:4;21055:1;21048:15;21074:209;21112:3;-1:-1:-1;;;;;21193:2:1;21186:5;21182:14;21220:2;21211:7;21208:15;21205:41;;;21226:18;;:::i;:::-;21275:1;21262:15;;21074:209;-1:-1:-1;;;21074:209:1:o;21288:380::-;21367:1;21363:12;;;;21410;;;21431:61;;21485:4;21477:6;21473:17;21463:27;;21431:61;21538:2;21530:6;21527:14;21507:18;21504:38;21501:161;;;21584:10;21579:3;21575:20;21572:1;21565:31;21619:4;21616:1;21609:15;21647:4;21644:1;21637:15;21501:161;;21288:380;;;:::o;22913:340::-;23115:2;23097:21;;;23154:2;23134:18;;;23127:30;-1:-1:-1;;;23188:2:1;23173:18;;23166:46;23244:2;23229:18;;22913:340::o;23258:168::-;23298:7;23364:1;23360;23356:6;23352:14;23349:1;23346:21;23341:1;23334:9;23327:17;23323:45;23320:71;;;23371:18;;:::i;:::-;-1:-1:-1;23411:9:1;;23258:168::o;23811:245::-;23878:6;23931:2;23919:9;23910:7;23906:23;23902:32;23899:52;;;23947:1;23944;23937:12;23899:52;23979:9;23973:16;23998:28;24020:5;23998:28;:::i;24061:628::-;24402:2;24391:9;24384:21;24365:4;24428:56;24480:2;24469:9;24465:18;24457:6;24428:56;:::i;:::-;24532:9;24524:6;24520:22;24515:2;24504:9;24500:18;24493:50;24560:54;24607:6;24599;24560:54;:::i;:::-;24552:62;;;24679:1;24675;24670:3;24666:11;24662:19;24654:6;24650:32;24645:2;24634:9;24630:18;24623:60;24061:628;;;;;;:::o;24694:175::-;24731:3;24775:4;24768:5;24764:16;24804:4;24795:7;24792:17;24789:43;;;24812:18;;:::i;:::-;24861:1;24848:15;;24694:175;-1:-1:-1;;24694:175:1:o;24874:413::-;25076:2;25058:21;;;25115:2;25095:18;;;25088:30;25154:34;25149:2;25134:18;;25127:62;-1:-1:-1;;;25220:2:1;25205:18;;25198:47;25277:3;25262:19;;24874:413::o;25292:346::-;25494:2;25476:21;;;25533:2;25513:18;;;25506:30;-1:-1:-1;;;25567:2:1;25552:18;;25545:52;25629:2;25614:18;;25292:346::o;25643:135::-;25682:3;-1:-1:-1;;25703:17:1;;25700:43;;;25723:18;;:::i;:::-;-1:-1:-1;25770:1:1;25759:13;;25643:135::o;25783:128::-;25823:3;25854:1;25850:6;25847:1;25844:13;25841:39;;;25860:18;;:::i;:::-;-1:-1:-1;25896:9:1;;25783:128::o;25916:127::-;25977:10;25972:3;25968:20;25965:1;25958:31;26008:4;26005:1;25998:15;26032:4;26029:1;26022:15;26048:112;26080:1;26106;26096:35;;26111:18;;:::i;:::-;-1:-1:-1;26145:9:1;;26048:112::o;26165:125::-;26205:4;26233:1;26230;26227:8;26224:34;;;26238:18;;:::i;:::-;-1:-1:-1;26275:9:1;;26165:125::o;26295:226::-;26334:3;-1:-1:-1;;;;;26431:2:1;26424:5;26420:14;26458:2;26449:7;26446:15;26443:41;;;26464:18;;:::i;26526:120::-;26566:1;26592;26582:35;;26597:18;;:::i;:::-;-1:-1:-1;26631:9:1;;26526:120::o;26651:339::-;26853:2;26835:21;;;26892:2;26872:18;;;26865:30;-1:-1:-1;;;26926:2:1;26911:18;;26904:45;26981:2;26966:18;;26651:339::o;28872:159::-;28939:20;;28999:6;28988:18;;28978:29;;28968:57;;29021:1;29018;29011:12;29036:184;29094:6;29147:2;29135:9;29126:7;29122:23;29118:32;29115:52;;;29163:1;29160;29153:12;29115:52;29186:28;29204:9;29186:28;:::i;29225:354::-;29313:19;;;29295:3;-1:-1:-1;;;;;29344:31:1;;29341:51;;;29388:1;29385;29378:12;29341:51;29424:6;29421:1;29417:14;29476:8;29469:5;29462:4;29457:3;29453:14;29440:45;29553:1;29508:18;;29528:4;29504:29;29542:13;;;-1:-1:-1;29504:29:1;;29225:354;-1:-1:-1;;29225:354:1:o;29584:916::-;29887:2;29876:9;29869:21;29850:4;29913:73;29982:2;29971:9;29967:18;29959:6;29951;29913:73;:::i;:::-;30043:22;;;30005:2;30023:18;;;30016:50;;;;30101:22;;;30177:6;;30139:15;;30201:1;30211:194;30225:6;30222:1;30219:13;30211:194;;;30317:6;30290:25;30308:6;30290:25;:::i;:::-;30286:38;30274:51;;30380:15;;;;30345:12;;;;30247:1;30240:9;30211:194;;;-1:-1:-1;;;;;;30461:32:1;;;;30456:2;30441:18;;;;30434:60;;;;-1:-1:-1;30422:3:1;;29584:916;-1:-1:-1;;;;;;29584:916:1:o;30853:184::-;30923:6;30976:2;30964:9;30955:7;30951:23;30947:32;30944:52;;;30992:1;30989;30982:12;30944:52;-1:-1:-1;31015:16:1;;30853:184;-1:-1:-1;30853:184:1:o;31321:251::-;31391:6;31444:2;31432:9;31423:7;31419:23;31415:32;31412:52;;;31460:1;31457;31450:12;31412:52;31492:9;31486:16;31511:31;31536:5;31511:31;:::i;32331:639::-;32640:3;32629:9;32622:22;32603:4;32661:74;32730:3;32719:9;32715:19;32707:6;32699;32661:74;:::i;:::-;32766:2;32751:18;;32744:34;;;;-1:-1:-1;32809:2:1;32794:18;;32787:34;;;;-1:-1:-1;;;;;32895:15:1;;;32890:2;32875:18;;32868:43;32948:15;32942:3;32927:19;;;32920:44;32653:82;32331:639;-1:-1:-1;;32331:639:1:o;32975:276::-;33033:6;33086:2;33074:9;33065:7;33061:23;33057:32;33054:52;;;33102:1;33099;33092:12;33054:52;33141:9;33128:23;33191:10;33184:5;33180:22;33173:5;33170:33;33160:61;;33217:1;33214;33207:12;33256:197;33294:3;33322:6;33363:2;33356:5;33352:14;33390:2;33381:7;33378:15;33375:41;;;33396:18;;:::i;34489:637::-;34769:3;34807:6;34801:13;34823:53;34869:6;34864:3;34857:4;34849:6;34845:17;34823:53;:::i;:::-;34939:13;;34898:16;;;;34961:57;34939:13;34898:16;34995:4;34983:17;;34961:57;:::i;:::-;-1:-1:-1;;;35040:20:1;;35069:22;;;35118:1;35107:13;;34489:637;-1:-1:-1;;;;34489:637:1:o;41090:136::-;41125:3;-1:-1:-1;;;41146:22:1;;41143:48;;;41171:18;;:::i;:::-;-1:-1:-1;41211:1:1;41207:13;;41090:136::o;42337:589::-;-1:-1:-1;;;;;42632:32:1;;42614:51;;42701:2;42696;42681:18;;42674:30;;;-1:-1:-1;;42727:73:1;;42781:18;;42773:6;42765;42727:73;:::i;:::-;42848:9;42840:6;42836:22;42831:2;42820:9;42816:18;42809:50;42876:44;42913:6;42905;42876:44;:::i;:::-;42868:52;42337:589;-1:-1:-1;;;;;;;42337:589:1:o;42931:414::-;43133:2;43115:21;;;43172:2;43152:18;;;43145:30;43211:34;43206:2;43191:18;;43184:62;-1:-1:-1;;;43277:2:1;43262:18;;43255:48;43335:3;43320:19;;42931:414::o;43350:127::-;43411:10;43406:3;43402:20;43399:1;43392:31;43442:4;43439:1;43432:15;43466:4;43463:1;43456:15;43482:489;-1:-1:-1;;;;;43751:15:1;;;43733:34;;43803:15;;43798:2;43783:18;;43776:43;43850:2;43835:18;;43828:34;;;43898:3;43893:2;43878:18;;43871:31;;;43676:4;;43919:46;;43945:19;;43937:6;43919:46;:::i;:::-;43911:54;43482:489;-1:-1:-1;;;;;;43482:489:1:o;43976:249::-;44045:6;44098:2;44086:9;44077:7;44073:23;44069:32;44066:52;;;44114:1;44111;44104:12;44066:52;44146:9;44140:16;44165:30;44189:5;44165:30;:::i

Swarm Source

ipfs://6def07fd7d4a58c9e84d7978959e4e8eddefd981b54af98164bfe4f215154113
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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