ETH Price: $2,908.03 (+3.14%)
Gas: 9.92 Gwei
 

Overview

Max Total Supply

3,770 NTOCTZN

Holders

431

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ramondalabs.eth
Balance
0 NTOCTZN
0xe490e386dd0ab8ce31b5def6b56170e6adf5eabb
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:
NTOuterCitizenDeploy

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
* Generated by @Thrasher66099
* Email [email protected] for your NFT launch needs
*/

pragma solidity ^0.8.0;

interface IByteContract {
    function burn(address _from, uint256 _amount) external;
    function getReward(address _to) external;
    function updateRewardOnMint(address _user, uint256 tokenId) external;
    function updateReward(address _from, address _to, uint256 _tokenId) external;
}

interface IMintContract {
    function generateURI(uint256 citizenId) external view returns (string memory);
    function calculateRewardRate(uint256 identityId, uint256 vaultId) external view returns(uint256);
}

interface IIdentityContract {  
    function getClass(uint256 tokenId) external view returns (string memory);
}

interface IBoughtIdentityContract {
    function claimIdentity(address _to) external;
}

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

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



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


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


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


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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



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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract OwnableDelegateProxy { }

contract BytProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract NTOuterCitizenDeploy is ERC721Enumerable, IERC721Receiver, ReentrancyGuard, Ownable {
    
    bool citizenMintActive;
    bool boughtIdentitiesActive;
    bool femaleActive;
    address citizenMintContract;
    address citizenAlternateMintContract;
    address public itemContract;
    address public identityContract;
    address public boughtIdentityContract;
    address public landContract;
    address public bytesContract;
    uint256 public newestCitizen;
    uint256 public mintedIdentityCost = 2000 ether;
    uint256 public changeGenderCost = 25 ether;
    uint256 public changeSpecialMessageCost = 10 ether;
    uint256 creationTime;

    address proxyRegistryAddress;

    // Mapping for identity tokenIds that were used to creat a citizen
    mapping(uint256 => uint256) private _identityDataByCitizenId;
    // Mapping for item cache tokenIds that were used to creat a citizen
    mapping(uint256 => uint256) private _itemCacheDataByCitizenId;
    // Mapping for land deed tokenIds that were used to creat a citizen
    mapping(uint256 => uint256) private _landDeedDataByCitizenId;
    // Mapping for special messages uploaded when a citizen was created
    mapping(uint256 => string) private _specialMessageByCitizenId;
    // Mapping for citizen creation date
    mapping(uint256 => uint256) public _citizenCreationTime;
    // Mapping for gender of a citizen
    mapping(uint256 => bool ) private _genderFemale;

    function getIdentityIdOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _identityDataByCitizenId[citizenId];
    }
    function getItemCacheIdOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _itemCacheDataByCitizenId[citizenId];
    }
    function getLandDeedIdOfTokenId(uint256 citizenId) public view returns (uint256) {
        return _landDeedDataByCitizenId[citizenId];
    }
    function getSpecialMessageOfTokenId(uint256 citizenId) public view returns (string memory) {
        return _specialMessageByCitizenId[citizenId];
    }
    function getGenderOfTokenId(uint256 citizenId) public view returns (bool) {
        return _genderFemale[citizenId];
    }

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) public override pure returns (bytes4) {
        return this.onERC721Received.selector ^ 0x23b872dd;
    }

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

        if(_genderFemale[tokenId])
        {
            dataContract = IMintContract(citizenAlternateMintContract);
        }
        else
        {
            dataContract = IMintContract(citizenMintContract);
        }
        
        output = dataContract.generateURI(tokenId);

        return output;
    }

    function createCitizen(uint256 identityId, uint256 itemCacheId, uint256 landDeedId, bool genderFemale, string memory specialMessage) public nonReentrant {
        require(citizenMintActive, "Uploading is not currently active");
        require(identityValidated(identityId), "You are not the owner of that identity");
        require(itemCacheValidated(itemCacheId), "You are not the owner of that item cache");
        require(landDeedValidated(landDeedId), "You are not the owner of that land deed");

        if(genderFemale)
        {
           require(femaleActive, "Females cannot be uploaded yet"); 
        }

        _safeMint(_msgSender(), newestCitizen + 1);

        newestCitizen++;

        ERC721 _identityContract;

        if(identityId < 4501)
        {
            _identityContract = ERC721(identityContract);
        }
        else
        {
            _identityContract = ERC721(boughtIdentityContract);
        }
        _identityContract.transferFrom(_msgSender(), address(this), identityId);

        ERC721 _itemContract = ERC721(itemContract);
        _itemContract.transferFrom(_msgSender(), address(this), itemCacheId);

        ERC721 _landContract = ERC721(landContract);
        _landContract.transferFrom(_msgSender(), address(this), landDeedId);

        // Set the underlying component data mappings
        _identityDataByCitizenId[newestCitizen] = identityId;
        _itemCacheDataByCitizenId[newestCitizen] = itemCacheId;
        _landDeedDataByCitizenId[newestCitizen] = landDeedId;
        if(genderFemale)
        {
            _genderFemale[newestCitizen] = genderFemale;
        }
        if(bytes(specialMessage).length > 0)
        {
            _specialMessageByCitizenId[newestCitizen] = specialMessage;
        }

        _citizenCreationTime[newestCitizen] = block.timestamp;
    }

    function disassembleCitizen(uint256 citizenId)public nonReentrant {
        require(ownerOf(citizenId) == _msgSender(), "You do not own that citizen");

        ERC721 _identityContract;

        if(_identityDataByCitizenId[citizenId] < 4501)
        {
            _identityContract = ERC721(identityContract);
        }
        else
        {
            _identityContract = ERC721(boughtIdentityContract);
        }
        _identityContract.transferFrom(address(this), _msgSender(), _identityDataByCitizenId[citizenId]);

        ERC721 _itemContract = ERC721(itemContract);
        _itemContract.transferFrom(address(this), _msgSender(), _itemCacheDataByCitizenId[citizenId]);

        ERC721 _landContract = ERC721(landContract);
        _landContract.transferFrom(address(this), _msgSender(), _landDeedDataByCitizenId[citizenId]);

        _burn(citizenId);

        delete _identityDataByCitizenId[citizenId];
        delete _itemCacheDataByCitizenId[citizenId];
        delete _landDeedDataByCitizenId[citizenId];
        delete _genderFemale[citizenId];
        delete _specialMessageByCitizenId[citizenId];
    }

     function changeGender(uint256 tokenId) public nonReentrant {
        require(femaleActive, "Females cannot be uploaded yet"); 
        require(ownerOf(tokenId) == _msgSender(), "You do not own that citizen");

        IByteContract iBytes = IByteContract(bytesContract);
        iBytes.burn(_msgSender(), changeGenderCost);
        _genderFemale[tokenId] = !_genderFemale[tokenId];
     }

     function changeSpecialMessage(uint256 tokenId, string memory _message) public nonReentrant {
        require(ownerOf(tokenId) == _msgSender(), "You do not own that citizen");

        IByteContract iBytes = IByteContract(bytesContract);
        iBytes.burn(_msgSender(), changeSpecialMessageCost);
        _specialMessageByCitizenId[tokenId] = _message;
     }

     function setChangeGenderCost(uint256 _cost) external onlyOwner {
         changeGenderCost = _cost;
     }

     function setChangeMessageCost(uint256 _cost) external onlyOwner {
         changeSpecialMessageCost = _cost;
     }

    function identityValidated(uint256 identityId) internal view returns (bool) {
        ERC721Enumerable identityEnumerable;
        if(identityId < 4501)
        {
            identityEnumerable = ERC721Enumerable(identityContract);
        }
        else
        {
            identityEnumerable = ERC721Enumerable(boughtIdentityContract);
        }
        return(identityEnumerable.ownerOf(identityId) == _msgSender());
    }

    function itemCacheValidated(uint256 itemCacheId) internal view returns (bool) {
        ERC721Enumerable itemCacheEnumerable = ERC721Enumerable(itemContract);
        return(itemCacheEnumerable.ownerOf(itemCacheId) == _msgSender());
    }

    function landDeedValidated(uint256 landDeedId) internal view returns (bool) {
        ERC721Enumerable landDeedEnumerable = ERC721Enumerable(landContract);
        return(landDeedEnumerable.ownerOf(landDeedId) == _msgSender());
    }

    function setFemaleActive() public onlyOwner {
        femaleActive = !femaleActive;
    }

    function setCitizenMintActive() public onlyOwner {
        citizenMintActive = !citizenMintActive;
    }

    function setBoughtIdentitiesActive() public onlyOwner {
        boughtIdentitiesActive = !boughtIdentitiesActive;
    }

    function setBoughtIdentityContract(address _address) external onlyOwner {
        boughtIdentityContract = _address;
    }

    function setIdentityAddress(address contractAddress) public onlyOwner {
        identityContract = contractAddress;
    }

    function setLandContract(address contractAddress) public onlyOwner {
        landContract = contractAddress;
    }

    function setItemContract(address contractAddress) public onlyOwner {
        itemContract = contractAddress;
    }

    function setBytesAddress(address contractAddress) public onlyOwner {
        bytesContract = contractAddress;
    }

    function setCitizenMintContract(address contractAddress) public onlyOwner {
        citizenMintContract = contractAddress;
    }

    function setCitizenAlternateMintContract(address contractAddress) public onlyOwner {
        citizenAlternateMintContract = contractAddress;
    }

    function setMintedIdentityCost(uint256 _cost) public onlyOwner {
        mintedIdentityCost = _cost;
    }

    function mintIdentity() public
    {
        require(boughtIdentitiesActive, "Identities cannot be bought yet");
        require(address(boughtIdentityContract) != address(0), "Identity contract not set");
        IByteContract iBytes = IByteContract(bytesContract);
        iBytes.burn(_msgSender(), mintedIdentityCost);
        IBoughtIdentityContract iBoughtIdentitiesContract = IBoughtIdentityContract(boughtIdentityContract);
        iBoughtIdentitiesContract.claimIdentity(_msgSender());
    }

    function isApprovedForAll(address _owner, address operator) public view override returns (bool) {
        BytProxyRegistry proxyRegistry = BytProxyRegistry(proxyRegistryAddress);
        if(address(proxyRegistry.proxies(_owner)) == operator) return true;
        return super.isApprovedForAll(_owner, operator);
    }

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Neo Tokyo Outer Citizen", "NTOCTZN") Ownable() {
        creationTime = block.timestamp;
        bytesContract = 0x7d647b1A0dcD5525e9C6B3D14BE58f27674f8c95;
        itemContract = 0x7AC66d40d80D2d8D1E45D6b5B10a1C9D1fd69354;
        identityContract = 0x698FbAACA64944376e2CDC4CAD86eaa91362cF54;
        landContract = 0xf90980AE7A44E2d18B9615396FF5E9252F1DF639;
        citizenMintContract = 0xeEb06C3A02B51dc8fCb26c19928844108cA5f857;
        proxyRegistryAddress = 0xe850eB266384A133844976aC66B98A44eDBFCb0d;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_citizenCreationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boughtIdentityContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bytesContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"changeGender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeGenderCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_message","type":"string"}],"name":"changeSpecialMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeSpecialMessageCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"identityId","type":"uint256"},{"internalType":"uint256","name":"itemCacheId","type":"uint256"},{"internalType":"uint256","name":"landDeedId","type":"uint256"},{"internalType":"bool","name":"genderFemale","type":"bool"},{"internalType":"string","name":"specialMessage","type":"string"}],"name":"createCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"disassembleCitizen","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":"citizenId","type":"uint256"}],"name":"getGenderOfTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getIdentityIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getItemCacheIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getLandDeedIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"citizenId","type":"uint256"}],"name":"getSpecialMessageOfTokenId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identityContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintIdentity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedIdentityCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newestCitizen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"renounceOwnership","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":[],"name":"setBoughtIdentitiesActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBoughtIdentityContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setBytesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setChangeGenderCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setChangeMessageCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setCitizenAlternateMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setCitizenMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setCitizenMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFemaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setIdentityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setItemContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setLandContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMintedIdentityCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"}]

6080604052686c6b935b8bbd40000060145568015af1d78b58c40000601555678ac7230489e800006016553480156200003757600080fd5b50604080518082018252601781527f4e656f20546f6b796f204f7574657220436974697a656e000000000000000000602080830191825283518085019094526007845266272a27a1aa2d2760c91b9084015281519192916200009c91600091620001e1565b508051620000b2906001906020840190620001e1565b50506001600a5550620000c5336200018f565b42601755601280546001600160a01b0319908116737d647b1a0dcd5525e9c6b3d14be58f27674f8c9517909155600e80548216737ac66d40d80d2d8d1e45d6b5b10a1c9d1fd69354179055600f8054821673698fbaaca64944376e2cdc4cad86eaa91362cf5417905560118054821673f90980ae7a44e2d18b9615396ff5e9252f1df639179055600c8054821673eeb06c3a02b51dc8fcb26c19928844108ca5f8571790556018805490911673e850eb266384a133844976ac66b98a44edbfcb0d179055620002c4565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ef9062000287565b90600052602060002090601f0160209004810192826200021357600085556200025e565b82601f106200022e57805160ff19168380011785556200025e565b828001600101855582156200025e579182015b828111156200025e57825182559160200191906001019062000241565b506200026c92915062000270565b5090565b5b808211156200026c576000815560010162000271565b600181811c908216806200029c57607f821691505b60208210811415620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b61317b80620002d46000396000f3fe608060405234801561001057600080fd5b50600436106103275760003560e01c8063715018a6116101b8578063b88d4fde11610104578063e3df4296116100a2578063eb4807dc1161007c578063eb4807dc14610700578063eead4b1614610713578063f2fde38b14610726578063ffef6c071461073957600080fd5b8063e3df4296146106ba578063e86dd092146106da578063e985e9c5146106ed57600080fd5b8063cad8a327116100de578063cad8a32714610683578063cbaaf86b1461068c578063d1506be41461069f578063dddec1ba146106b257600080fd5b8063b88d4fde1461064a578063bfd58ea61461065d578063c87b56dd1461067057600080fd5b806395d89b4111610171578063a22cb4651161014b578063a22cb46514610609578063a68bfa6e1461061c578063a712043314610624578063b79c30241461063757600080fd5b806395d89b41146105db5780639eb936b9146105e3578063a1e4aff2146105f657600080fd5b8063715018a6146105735780638860b6611461057b5780638bb192ff1461058e5780638d76f940146105ae5780638da5cb5b146105c157806392aa8eec146105d257600080fd5b806342842e0e11610277578063652296f11161023057806368241af41161020a57806368241af414610517578063695349b81461052a5780636d58cb301461053d57806370a082311461056057600080fd5b8063652296f1146104d157806366ad0752146104e457806367031bae1461050457600080fd5b806342842e0e146104745780634f6ccce714610487578063552cbf331461049a57806355ed458e146104a35780635f7159bd146104b65780636352211e146104be57600080fd5b80630d68ad5d116102e45780631682c3c9116102be5780631682c3c91461043d57806318160ddd1461044657806323b872dd1461044e5780632f745c591461046157600080fd5b80630d68ad5d146103ea578063140c08a5146103f2578063150b7a021461040557600080fd5b806301ffc9a71461032c57806303d073401461035457806306fdde031461037f578063081812fc14610394578063095ea7b3146103a75780630b633c84146103bc575b600080fd5b61033f61033a366004612c56565b61074c565b60405190151581526020015b60405180910390f35b601154610367906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b610387610777565b60405161034b9190612e5f565b6103676103a2366004612d07565b610809565b6103ba6103b5366004612c2a565b6108a3565b005b6103dc6103ca366004612d07565b6000908152601b602052604090205490565b60405190815260200161034b565b6103ba6109b9565b6103ba610400366004612a22565b610a04565b610424610413366004612ad6565b6336b308df60e01b95945050505050565b6040516001600160e01b0319909116815260200161034b565b6103dc60165481565b6008546103dc565b6103ba61045c366004612a95565b610a50565b6103dc61046f366004612c2a565b610a81565b6103ba610482366004612a95565b610b17565b6103dc610495366004612d07565b610b32565b6103dc60155481565b6103876104b1366004612d07565b610bc5565b6103ba610c67565b6103676104cc366004612d07565b610cb2565b6103ba6104df366004612d07565b610d29565b6103dc6104f2366004612d07565b6000908152601a602052604090205490565b600f54610367906001600160a01b031681565b6103ba610525366004612a22565b610e74565b6103ba610538366004612d07565b610ec0565b61033f61054b366004612d07565b6000908152601e602052604090205460ff1690565b6103dc61056e366004612a22565b61110a565b6103ba611191565b6103ba610589366004612d67565b6111c7565b6103dc61059c366004612d07565b601d6020526000908152604090205481565b600e54610367906001600160a01b031681565b600b546001600160a01b0316610367565b6103dc60145481565b61038761160e565b6103ba6105f1366004612d07565b61161d565b6103ba610604366004612a22565b61164c565b6103ba610617366004612bf5565b611698565b6103ba61175d565b6103ba610632366004612a22565b6118f4565b6103ba610645366004612d07565b611940565b6103ba610658366004612b75565b61196f565b6103ba61066b366004612a22565b6119a7565b61038761067e366004612d07565b6119f3565b6103dc60135481565b6103ba61069a366004612d07565b611b31565b601254610367906001600160a01b031681565b6103ba611b60565b6103dc6106c8366004612d07565b60009081526019602052604090205490565b6103ba6106e8366004612a22565b611bab565b61033f6106fb366004612a5c565b611bf7565b6103ba61070e366004612d20565b611cc3565b601054610367906001600160a01b031681565b6103ba610734366004612a22565b611db0565b6103ba610747366004612a22565b611e4b565b60006001600160e01b0319821663780e9d6360e01b1480610771575061077182611e97565b92915050565b6060600080546107869061306c565b80601f01602080910402602001604051908101604052809291908181526020018280546107b29061306c565b80156107ff5780601f106107d4576101008083540402835291602001916107ff565b820191906000526020600020905b8154815290600101906020018083116107e257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108ae82610cb2565b9050806001600160a01b0316836001600160a01b0316141561091c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161087e565b336001600160a01b038216148061093857506109388133611bf7565b6109aa5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087e565b6109b48383611ee7565b505050565b600b546001600160a01b031633146109e35760405162461bcd60e51b815260040161087e90612ec4565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600b546001600160a01b03163314610a2e5760405162461bcd60e51b815260040161087e90612ec4565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610a5a3382611f55565b610a765760405162461bcd60e51b815260040161087e90612ef9565b6109b4838383612024565b6000610a8c8361110a565b8210610aee5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109b48383836040518060200160405280600081525061196f565b6000610b3d60085490565b8210610ba05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087e565b60088281548110610bb357610bb36130ee565b90600052602060002001549050919050565b6000818152601c60205260409020805460609190610be29061306c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e9061306c565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b50505050509050919050565b600b546001600160a01b03163314610c915760405162461bcd60e51b815260040161087e90612ec4565b600b805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806107715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161087e565b6002600a541415610d4c5760405162461bcd60e51b815260040161087e90612f81565b6002600a55600b54600160b01b900460ff16610daa5760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161087e565b33610db482610cb2565b6001600160a01b031614610dda5760405162461bcd60e51b815260040161087e90612f4a565b6012546001600160a01b031680639dc29fac336015546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610e3657600080fd5b505af1158015610e4a573d6000803e3d6000fd5b50505060009283525050601e60205260409020805460ff19811660ff909116151790556001600a55565b600b546001600160a01b03163314610e9e5760405162461bcd60e51b815260040161087e90612ec4565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6002600a541415610ee35760405162461bcd60e51b815260040161087e90612f81565b6002600a5533610ef282610cb2565b6001600160a01b031614610f185760405162461bcd60e51b815260040161087e90612f4a565b6000818152601960205260408120546111951115610f425750600f546001600160a01b0316610f50565b506010546001600160a01b03165b600082815260196020526040908190205490516323b872dd60e01b81526001600160a01b038316916323b872dd91610f8f913091339190600401612dfe565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b5050600e546000858152601a6020526040908190205490516323b872dd60e01b81526001600160a01b0390921693508392506323b872dd91611006913091339190600401612dfe565b600060405180830381600087803b15801561102057600080fd5b505af1158015611034573d6000803e3d6000fd5b50506011546000868152601b6020526040908190205490516323b872dd60e01b81526001600160a01b0390921693508392506323b872dd9161107d913091339190600401612dfe565b600060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b505050506110b8846121cf565b6000848152601960209081526040808320839055601a8252808320839055601b8252808320839055601e8252808320805460ff19169055601c90915281206110ff916128d5565b50506001600a555050565b60006001600160a01b0382166111755760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161087e565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146111bb5760405162461bcd60e51b815260040161087e90612ec4565b6111c56000612276565b565b6002600a5414156111ea5760405162461bcd60e51b815260040161087e90612f81565b6002600a55600b54600160a01b900460ff166112525760405162461bcd60e51b815260206004820152602160248201527f55706c6f6164696e67206973206e6f742063757272656e746c792061637469766044820152606560f81b606482015260840161087e565b61125b856122c8565b6112b65760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206964604482015265656e7469747960d01b606482015260840161087e565b6112bf84612384565b61131c5760405162461bcd60e51b815260206004820152602860248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206974604482015267656d20636163686560c01b606482015260840161087e565b61132583612399565b6113815760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206c616044820152661b99081919595960ca1b606482015260840161087e565b81156113e057600b54600160b01b900460ff166113e05760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161087e565b6113f7336013546113f2906001613011565b6123ae565b60138054906000611407836130a7565b9190505550600061119586101561142a5750600f546001600160a01b0316611438565b506010546001600160a01b03165b6040516323b872dd60e01b81526001600160a01b038216906323b872dd9061146890339030908b90600401612dfe565b600060405180830381600087803b15801561148257600080fd5b505af1158015611496573d6000803e3d6000fd5b5050600e546040516323b872dd60e01b81526001600160a01b0390911692508291506323b872dd906114d090339030908b90600401612dfe565b600060405180830381600087803b1580156114ea57600080fd5b505af11580156114fe573d6000803e3d6000fd5b50506011546040516323b872dd60e01b81526001600160a01b0390911692508291506323b872dd9061153890339030908b90600401612dfe565b600060405180830381600087803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b50506013805460009081526019602090815260408083208e905583548352601a82528083208d905592548252601b905220889055505084156115c0576013546000908152601e60205260409020805460ff19168615151790555b8351156115eb576013546000908152601c6020908152604090912085516115e99287019061290f565b505b50506013546000908152601d6020526040902042905550506001600a5550505050565b6060600180546107869061306c565b600b546001600160a01b031633146116475760405162461bcd60e51b815260040161087e90612ec4565b601655565b600b546001600160a01b031633146116765760405162461bcd60e51b815260040161087e90612ec4565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156116f15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54600160a81b900460ff166117b65760405162461bcd60e51b815260206004820152601f60248201527f4964656e7469746965732063616e6e6f7420626520626f756768742079657400604482015260640161087e565b6010546001600160a01b031661180e5760405162461bcd60e51b815260206004820152601960248201527f4964656e7469747920636f6e7472616374206e6f742073657400000000000000604482015260640161087e565b6012546001600160a01b031680639dc29fac336014546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561186a57600080fd5b505af115801561187e573d6000803e3d6000fd5b50506010546001600160a01b031691508190506374570e50336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156118d857600080fd5b505af11580156118ec573d6000803e3d6000fd5b505050505050565b600b546001600160a01b0316331461191e5760405162461bcd60e51b815260040161087e90612ec4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b0316331461196a5760405162461bcd60e51b815260040161087e90612ec4565b601555565b6119793383611f55565b6119955760405162461bcd60e51b815260040161087e90612ef9565b6119a1848484846123cc565b50505050565b600b546001600160a01b031633146119d15760405162461bcd60e51b815260040161087e90612ec4565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260409020546060906001600160a01b0316611a725760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161087e565b6000828152601e60205260408120546060919060ff1615611a9f5750600d546001600160a01b0316611aad565b50600c546001600160a01b03165b60405163db790e0960e01b8152600481018590526001600160a01b0382169063db790e099060240160006040518083038186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b299190810190612c90565b949350505050565b600b546001600160a01b03163314611b5b5760405162461bcd60e51b815260040161087e90612ec4565b601455565b600b546001600160a01b03163314611b8a5760405162461bcd60e51b815260040161087e90612ec4565b600b805460ff60b01b198116600160b01b9182900460ff1615909102179055565b600b546001600160a01b03163314611bd55760405162461bcd60e51b815260040161087e90612ec4565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60185460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611c4457600080fd5b505afa158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c9190612a3f565b6001600160a01b03161415611c95576001915050610771565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff16611b29565b6002600a541415611ce65760405162461bcd60e51b815260040161087e90612f81565b6002600a5533611cf583610cb2565b6001600160a01b031614611d1b5760405162461bcd60e51b815260040161087e90612f4a565b6012546001600160a01b031680639dc29fac336016546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b5050506000848152601c6020908152604090912084516110ff9350909185019061290f565b600b546001600160a01b03163314611dda5760405162461bcd60e51b815260040161087e90612ec4565b6001600160a01b038116611e3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087e565b611e4881612276565b50565b600b546001600160a01b03163314611e755760405162461bcd60e51b815260040161087e90612ec4565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611ec857506001600160e01b03198216635b5e139f60e01b145b8061077157506301ffc9a760e01b6001600160e01b0319831614610771565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f1c82610cb2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611fce5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087e565b6000611fd983610cb2565b9050806001600160a01b0316846001600160a01b031614806120145750836001600160a01b031661200984610809565b6001600160a01b0316145b80611b295750611b298185611bf7565b826001600160a01b031661203782610cb2565b6001600160a01b03161461209f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161087e565b6001600160a01b0382166121015760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087e565b61210c8383836123ff565b612117600082611ee7565b6001600160a01b0383166000908152600360205260408120805460019290612140908490613029565b90915550506001600160a01b038216600090815260036020526040812080546001929061216e908490613011565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006121da82610cb2565b90506121e8816000846123ff565b6121f3600083611ee7565b6001600160a01b038116600090815260036020526040812080546001929061221c908490613029565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806111958310156122e75750600f546001600160a01b03166122f5565b506010546001600160a01b03165b335b6040516331a9108f60e11b8152600481018590526001600160a01b0391821691831690636352211e9060240160206040518083038186803b15801561233b57600080fd5b505afa15801561234f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123739190612a3f565b6001600160a01b0316149392505050565b600e546000906001600160a01b0316336122f7565b6011546000906001600160a01b0316336122f7565b6123c88282604051806020016040528060008152506124b7565b5050565b6123d7848484612024565b6123e3848484846124ea565b6119a15760405162461bcd60e51b815260040161087e90612e72565b6001600160a01b03831661245a5761245581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61247d565b816001600160a01b0316836001600160a01b03161461247d5761247d83826125f7565b6001600160a01b038216612494576109b481612694565b826001600160a01b0316826001600160a01b0316146109b4576109b48282612743565b6124c18383612787565b6124ce60008484846124ea565b6109b45760405162461bcd60e51b815260040161087e90612e72565b60006001600160a01b0384163b156125ec57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061252e903390899088908890600401612e22565b602060405180830381600087803b15801561254857600080fd5b505af1925050508015612578575060408051601f3d908101601f1916820190925261257591810190612c73565b60015b6125d2573d8080156125a6576040519150601f19603f3d011682016040523d82523d6000602084013e6125ab565b606091505b5080516125ca5760405162461bcd60e51b815260040161087e90612e72565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b29565b506001949350505050565b600060016126048461110a565b61260e9190613029565b600083815260076020526040902054909150808214612661576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126a690600190613029565b600083815260096020526040812054600880549394509092849081106126ce576126ce6130ee565b9060005260206000200154905080600883815481106126ef576126ef6130ee565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612727576127276130d8565b6001900381819060005260206000200160009055905550505050565b600061274e8361110a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166127dd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087e565b6000818152600260205260409020546001600160a01b0316156128425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087e565b61284e600083836123ff565b6001600160a01b0382166000908152600360205260408120805460019290612877908490613011565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546128e19061306c565b6000825580601f106128f1575050565b601f016020900490600052602060002090810190611e489190612993565b82805461291b9061306c565b90600052602060002090601f01602090048101928261293d5760008555612983565b82601f1061295657805160ff1916838001178555612983565b82800160010185558215612983579182015b82811115612983578251825591602001919060010190612968565b5061298f929150612993565b5090565b5b8082111561298f5760008155600101612994565b60006129bb6129b684612fe9565b612fb8565b90508281528383830111156129cf57600080fd5b828260208301376000602084830101529392505050565b803580151581146129f657600080fd5b919050565b600082601f830112612a0c57600080fd5b612a1b838335602085016129a8565b9392505050565b600060208284031215612a3457600080fd5b8135612a1b8161311a565b600060208284031215612a5157600080fd5b8151612a1b8161311a565b60008060408385031215612a6f57600080fd5b8235612a7a8161311a565b91506020830135612a8a8161311a565b809150509250929050565b600080600060608486031215612aaa57600080fd5b8335612ab58161311a565b92506020840135612ac58161311a565b929592945050506040919091013590565b600080600080600060808688031215612aee57600080fd5b8535612af98161311a565b94506020860135612b098161311a565b935060408601359250606086013567ffffffffffffffff80821115612b2d57600080fd5b818801915088601f830112612b4157600080fd5b813581811115612b5057600080fd5b896020828501011115612b6257600080fd5b9699959850939650602001949392505050565b60008060008060808587031215612b8b57600080fd5b8435612b968161311a565b93506020850135612ba68161311a565b925060408501359150606085013567ffffffffffffffff811115612bc957600080fd5b8501601f81018713612bda57600080fd5b612be9878235602084016129a8565b91505092959194509250565b60008060408385031215612c0857600080fd5b8235612c138161311a565b9150612c21602084016129e6565b90509250929050565b60008060408385031215612c3d57600080fd5b8235612c488161311a565b946020939093013593505050565b600060208284031215612c6857600080fd5b8135612a1b8161312f565b600060208284031215612c8557600080fd5b8151612a1b8161312f565b600060208284031215612ca257600080fd5b815167ffffffffffffffff811115612cb957600080fd5b8201601f81018413612cca57600080fd5b8051612cd86129b682612fe9565b818152856020838501011115612ced57600080fd5b612cfe826020830160208601613040565b95945050505050565b600060208284031215612d1957600080fd5b5035919050565b60008060408385031215612d3357600080fd5b82359150602083013567ffffffffffffffff811115612d5157600080fd5b612d5d858286016129fb565b9150509250929050565b600080600080600060a08688031215612d7f57600080fd5b853594506020860135935060408601359250612d9d606087016129e6565b9150608086013567ffffffffffffffff811115612db957600080fd5b612dc5888289016129fb565b9150509295509295909350565b60008151808452612dea816020860160208601613040565b601f01601f19169290920160200192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e5590830184612dd2565b9695505050505050565b602081526000612a1b6020830184612dd2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601b908201527f596f7520646f206e6f74206f776e207468617420636974697a656e0000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612fe157612fe1613104565b604052919050565b600067ffffffffffffffff82111561300357613003613104565b50601f01601f191660200190565b60008219821115613024576130246130c2565b500190565b60008282101561303b5761303b6130c2565b500390565b60005b8381101561305b578181015183820152602001613043565b838111156119a15750506000910152565b600181811c9082168061308057607f821691505b602082108114156130a157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130bb576130bb6130c2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611e4857600080fd5b6001600160e01b031981168114611e4857600080fdfea2646970667358221220bbc2d44b7f15d41a7ac1579926d87b98be353d969b952672b45df1c46cd98c0564736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103275760003560e01c8063715018a6116101b8578063b88d4fde11610104578063e3df4296116100a2578063eb4807dc1161007c578063eb4807dc14610700578063eead4b1614610713578063f2fde38b14610726578063ffef6c071461073957600080fd5b8063e3df4296146106ba578063e86dd092146106da578063e985e9c5146106ed57600080fd5b8063cad8a327116100de578063cad8a32714610683578063cbaaf86b1461068c578063d1506be41461069f578063dddec1ba146106b257600080fd5b8063b88d4fde1461064a578063bfd58ea61461065d578063c87b56dd1461067057600080fd5b806395d89b4111610171578063a22cb4651161014b578063a22cb46514610609578063a68bfa6e1461061c578063a712043314610624578063b79c30241461063757600080fd5b806395d89b41146105db5780639eb936b9146105e3578063a1e4aff2146105f657600080fd5b8063715018a6146105735780638860b6611461057b5780638bb192ff1461058e5780638d76f940146105ae5780638da5cb5b146105c157806392aa8eec146105d257600080fd5b806342842e0e11610277578063652296f11161023057806368241af41161020a57806368241af414610517578063695349b81461052a5780636d58cb301461053d57806370a082311461056057600080fd5b8063652296f1146104d157806366ad0752146104e457806367031bae1461050457600080fd5b806342842e0e146104745780634f6ccce714610487578063552cbf331461049a57806355ed458e146104a35780635f7159bd146104b65780636352211e146104be57600080fd5b80630d68ad5d116102e45780631682c3c9116102be5780631682c3c91461043d57806318160ddd1461044657806323b872dd1461044e5780632f745c591461046157600080fd5b80630d68ad5d146103ea578063140c08a5146103f2578063150b7a021461040557600080fd5b806301ffc9a71461032c57806303d073401461035457806306fdde031461037f578063081812fc14610394578063095ea7b3146103a75780630b633c84146103bc575b600080fd5b61033f61033a366004612c56565b61074c565b60405190151581526020015b60405180910390f35b601154610367906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b610387610777565b60405161034b9190612e5f565b6103676103a2366004612d07565b610809565b6103ba6103b5366004612c2a565b6108a3565b005b6103dc6103ca366004612d07565b6000908152601b602052604090205490565b60405190815260200161034b565b6103ba6109b9565b6103ba610400366004612a22565b610a04565b610424610413366004612ad6565b6336b308df60e01b95945050505050565b6040516001600160e01b0319909116815260200161034b565b6103dc60165481565b6008546103dc565b6103ba61045c366004612a95565b610a50565b6103dc61046f366004612c2a565b610a81565b6103ba610482366004612a95565b610b17565b6103dc610495366004612d07565b610b32565b6103dc60155481565b6103876104b1366004612d07565b610bc5565b6103ba610c67565b6103676104cc366004612d07565b610cb2565b6103ba6104df366004612d07565b610d29565b6103dc6104f2366004612d07565b6000908152601a602052604090205490565b600f54610367906001600160a01b031681565b6103ba610525366004612a22565b610e74565b6103ba610538366004612d07565b610ec0565b61033f61054b366004612d07565b6000908152601e602052604090205460ff1690565b6103dc61056e366004612a22565b61110a565b6103ba611191565b6103ba610589366004612d67565b6111c7565b6103dc61059c366004612d07565b601d6020526000908152604090205481565b600e54610367906001600160a01b031681565b600b546001600160a01b0316610367565b6103dc60145481565b61038761160e565b6103ba6105f1366004612d07565b61161d565b6103ba610604366004612a22565b61164c565b6103ba610617366004612bf5565b611698565b6103ba61175d565b6103ba610632366004612a22565b6118f4565b6103ba610645366004612d07565b611940565b6103ba610658366004612b75565b61196f565b6103ba61066b366004612a22565b6119a7565b61038761067e366004612d07565b6119f3565b6103dc60135481565b6103ba61069a366004612d07565b611b31565b601254610367906001600160a01b031681565b6103ba611b60565b6103dc6106c8366004612d07565b60009081526019602052604090205490565b6103ba6106e8366004612a22565b611bab565b61033f6106fb366004612a5c565b611bf7565b6103ba61070e366004612d20565b611cc3565b601054610367906001600160a01b031681565b6103ba610734366004612a22565b611db0565b6103ba610747366004612a22565b611e4b565b60006001600160e01b0319821663780e9d6360e01b1480610771575061077182611e97565b92915050565b6060600080546107869061306c565b80601f01602080910402602001604051908101604052809291908181526020018280546107b29061306c565b80156107ff5780601f106107d4576101008083540402835291602001916107ff565b820191906000526020600020905b8154815290600101906020018083116107e257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108ae82610cb2565b9050806001600160a01b0316836001600160a01b0316141561091c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161087e565b336001600160a01b038216148061093857506109388133611bf7565b6109aa5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087e565b6109b48383611ee7565b505050565b600b546001600160a01b031633146109e35760405162461bcd60e51b815260040161087e90612ec4565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600b546001600160a01b03163314610a2e5760405162461bcd60e51b815260040161087e90612ec4565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b610a5a3382611f55565b610a765760405162461bcd60e51b815260040161087e90612ef9565b6109b4838383612024565b6000610a8c8361110a565b8210610aee5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109b48383836040518060200160405280600081525061196f565b6000610b3d60085490565b8210610ba05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087e565b60088281548110610bb357610bb36130ee565b90600052602060002001549050919050565b6000818152601c60205260409020805460609190610be29061306c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e9061306c565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b50505050509050919050565b600b546001600160a01b03163314610c915760405162461bcd60e51b815260040161087e90612ec4565b600b805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806107715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161087e565b6002600a541415610d4c5760405162461bcd60e51b815260040161087e90612f81565b6002600a55600b54600160b01b900460ff16610daa5760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161087e565b33610db482610cb2565b6001600160a01b031614610dda5760405162461bcd60e51b815260040161087e90612f4a565b6012546001600160a01b031680639dc29fac336015546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610e3657600080fd5b505af1158015610e4a573d6000803e3d6000fd5b50505060009283525050601e60205260409020805460ff19811660ff909116151790556001600a55565b600b546001600160a01b03163314610e9e5760405162461bcd60e51b815260040161087e90612ec4565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6002600a541415610ee35760405162461bcd60e51b815260040161087e90612f81565b6002600a5533610ef282610cb2565b6001600160a01b031614610f185760405162461bcd60e51b815260040161087e90612f4a565b6000818152601960205260408120546111951115610f425750600f546001600160a01b0316610f50565b506010546001600160a01b03165b600082815260196020526040908190205490516323b872dd60e01b81526001600160a01b038316916323b872dd91610f8f913091339190600401612dfe565b600060405180830381600087803b158015610fa957600080fd5b505af1158015610fbd573d6000803e3d6000fd5b5050600e546000858152601a6020526040908190205490516323b872dd60e01b81526001600160a01b0390921693508392506323b872dd91611006913091339190600401612dfe565b600060405180830381600087803b15801561102057600080fd5b505af1158015611034573d6000803e3d6000fd5b50506011546000868152601b6020526040908190205490516323b872dd60e01b81526001600160a01b0390921693508392506323b872dd9161107d913091339190600401612dfe565b600060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b505050506110b8846121cf565b6000848152601960209081526040808320839055601a8252808320839055601b8252808320839055601e8252808320805460ff19169055601c90915281206110ff916128d5565b50506001600a555050565b60006001600160a01b0382166111755760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161087e565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146111bb5760405162461bcd60e51b815260040161087e90612ec4565b6111c56000612276565b565b6002600a5414156111ea5760405162461bcd60e51b815260040161087e90612f81565b6002600a55600b54600160a01b900460ff166112525760405162461bcd60e51b815260206004820152602160248201527f55706c6f6164696e67206973206e6f742063757272656e746c792061637469766044820152606560f81b606482015260840161087e565b61125b856122c8565b6112b65760405162461bcd60e51b815260206004820152602660248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206964604482015265656e7469747960d01b606482015260840161087e565b6112bf84612384565b61131c5760405162461bcd60e51b815260206004820152602860248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206974604482015267656d20636163686560c01b606482015260840161087e565b61132583612399565b6113815760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420746865206f776e6572206f662074686174206c616044820152661b99081919595960ca1b606482015260840161087e565b81156113e057600b54600160b01b900460ff166113e05760405162461bcd60e51b815260206004820152601e60248201527f46656d616c65732063616e6e6f742062652075706c6f61646564207965740000604482015260640161087e565b6113f7336013546113f2906001613011565b6123ae565b60138054906000611407836130a7565b9190505550600061119586101561142a5750600f546001600160a01b0316611438565b506010546001600160a01b03165b6040516323b872dd60e01b81526001600160a01b038216906323b872dd9061146890339030908b90600401612dfe565b600060405180830381600087803b15801561148257600080fd5b505af1158015611496573d6000803e3d6000fd5b5050600e546040516323b872dd60e01b81526001600160a01b0390911692508291506323b872dd906114d090339030908b90600401612dfe565b600060405180830381600087803b1580156114ea57600080fd5b505af11580156114fe573d6000803e3d6000fd5b50506011546040516323b872dd60e01b81526001600160a01b0390911692508291506323b872dd9061153890339030908b90600401612dfe565b600060405180830381600087803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b50506013805460009081526019602090815260408083208e905583548352601a82528083208d905592548252601b905220889055505084156115c0576013546000908152601e60205260409020805460ff19168615151790555b8351156115eb576013546000908152601c6020908152604090912085516115e99287019061290f565b505b50506013546000908152601d6020526040902042905550506001600a5550505050565b6060600180546107869061306c565b600b546001600160a01b031633146116475760405162461bcd60e51b815260040161087e90612ec4565b601655565b600b546001600160a01b031633146116765760405162461bcd60e51b815260040161087e90612ec4565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382163314156116f15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b54600160a81b900460ff166117b65760405162461bcd60e51b815260206004820152601f60248201527f4964656e7469746965732063616e6e6f7420626520626f756768742079657400604482015260640161087e565b6010546001600160a01b031661180e5760405162461bcd60e51b815260206004820152601960248201527f4964656e7469747920636f6e7472616374206e6f742073657400000000000000604482015260640161087e565b6012546001600160a01b031680639dc29fac336014546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561186a57600080fd5b505af115801561187e573d6000803e3d6000fd5b50506010546001600160a01b031691508190506374570e50336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156118d857600080fd5b505af11580156118ec573d6000803e3d6000fd5b505050505050565b600b546001600160a01b0316331461191e5760405162461bcd60e51b815260040161087e90612ec4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b0316331461196a5760405162461bcd60e51b815260040161087e90612ec4565b601555565b6119793383611f55565b6119955760405162461bcd60e51b815260040161087e90612ef9565b6119a1848484846123cc565b50505050565b600b546001600160a01b031633146119d15760405162461bcd60e51b815260040161087e90612ec4565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260409020546060906001600160a01b0316611a725760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161087e565b6000828152601e60205260408120546060919060ff1615611a9f5750600d546001600160a01b0316611aad565b50600c546001600160a01b03165b60405163db790e0960e01b8152600481018590526001600160a01b0382169063db790e099060240160006040518083038186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b299190810190612c90565b949350505050565b600b546001600160a01b03163314611b5b5760405162461bcd60e51b815260040161087e90612ec4565b601455565b600b546001600160a01b03163314611b8a5760405162461bcd60e51b815260040161087e90612ec4565b600b805460ff60b01b198116600160b01b9182900460ff1615909102179055565b600b546001600160a01b03163314611bd55760405162461bcd60e51b815260040161087e90612ec4565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60185460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611c4457600080fd5b505afa158015611c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7c9190612a3f565b6001600160a01b03161415611c95576001915050610771565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff16611b29565b6002600a541415611ce65760405162461bcd60e51b815260040161087e90612f81565b6002600a5533611cf583610cb2565b6001600160a01b031614611d1b5760405162461bcd60e51b815260040161087e90612f4a565b6012546001600160a01b031680639dc29fac336016546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b5050506000848152601c6020908152604090912084516110ff9350909185019061290f565b600b546001600160a01b03163314611dda5760405162461bcd60e51b815260040161087e90612ec4565b6001600160a01b038116611e3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087e565b611e4881612276565b50565b600b546001600160a01b03163314611e755760405162461bcd60e51b815260040161087e90612ec4565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611ec857506001600160e01b03198216635b5e139f60e01b145b8061077157506301ffc9a760e01b6001600160e01b0319831614610771565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f1c82610cb2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611fce5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087e565b6000611fd983610cb2565b9050806001600160a01b0316846001600160a01b031614806120145750836001600160a01b031661200984610809565b6001600160a01b0316145b80611b295750611b298185611bf7565b826001600160a01b031661203782610cb2565b6001600160a01b03161461209f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161087e565b6001600160a01b0382166121015760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087e565b61210c8383836123ff565b612117600082611ee7565b6001600160a01b0383166000908152600360205260408120805460019290612140908490613029565b90915550506001600160a01b038216600090815260036020526040812080546001929061216e908490613011565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006121da82610cb2565b90506121e8816000846123ff565b6121f3600083611ee7565b6001600160a01b038116600090815260036020526040812080546001929061221c908490613029565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806111958310156122e75750600f546001600160a01b03166122f5565b506010546001600160a01b03165b335b6040516331a9108f60e11b8152600481018590526001600160a01b0391821691831690636352211e9060240160206040518083038186803b15801561233b57600080fd5b505afa15801561234f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123739190612a3f565b6001600160a01b0316149392505050565b600e546000906001600160a01b0316336122f7565b6011546000906001600160a01b0316336122f7565b6123c88282604051806020016040528060008152506124b7565b5050565b6123d7848484612024565b6123e3848484846124ea565b6119a15760405162461bcd60e51b815260040161087e90612e72565b6001600160a01b03831661245a5761245581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61247d565b816001600160a01b0316836001600160a01b03161461247d5761247d83826125f7565b6001600160a01b038216612494576109b481612694565b826001600160a01b0316826001600160a01b0316146109b4576109b48282612743565b6124c18383612787565b6124ce60008484846124ea565b6109b45760405162461bcd60e51b815260040161087e90612e72565b60006001600160a01b0384163b156125ec57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061252e903390899088908890600401612e22565b602060405180830381600087803b15801561254857600080fd5b505af1925050508015612578575060408051601f3d908101601f1916820190925261257591810190612c73565b60015b6125d2573d8080156125a6576040519150601f19603f3d011682016040523d82523d6000602084013e6125ab565b606091505b5080516125ca5760405162461bcd60e51b815260040161087e90612e72565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b29565b506001949350505050565b600060016126048461110a565b61260e9190613029565b600083815260076020526040902054909150808214612661576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126a690600190613029565b600083815260096020526040812054600880549394509092849081106126ce576126ce6130ee565b9060005260206000200154905080600883815481106126ef576126ef6130ee565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612727576127276130d8565b6001900381819060005260206000200160009055905550505050565b600061274e8361110a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166127dd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087e565b6000818152600260205260409020546001600160a01b0316156128425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087e565b61284e600083836123ff565b6001600160a01b0382166000908152600360205260408120805460019290612877908490613011565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546128e19061306c565b6000825580601f106128f1575050565b601f016020900490600052602060002090810190611e489190612993565b82805461291b9061306c565b90600052602060002090601f01602090048101928261293d5760008555612983565b82601f1061295657805160ff1916838001178555612983565b82800160010185558215612983579182015b82811115612983578251825591602001919060010190612968565b5061298f929150612993565b5090565b5b8082111561298f5760008155600101612994565b60006129bb6129b684612fe9565b612fb8565b90508281528383830111156129cf57600080fd5b828260208301376000602084830101529392505050565b803580151581146129f657600080fd5b919050565b600082601f830112612a0c57600080fd5b612a1b838335602085016129a8565b9392505050565b600060208284031215612a3457600080fd5b8135612a1b8161311a565b600060208284031215612a5157600080fd5b8151612a1b8161311a565b60008060408385031215612a6f57600080fd5b8235612a7a8161311a565b91506020830135612a8a8161311a565b809150509250929050565b600080600060608486031215612aaa57600080fd5b8335612ab58161311a565b92506020840135612ac58161311a565b929592945050506040919091013590565b600080600080600060808688031215612aee57600080fd5b8535612af98161311a565b94506020860135612b098161311a565b935060408601359250606086013567ffffffffffffffff80821115612b2d57600080fd5b818801915088601f830112612b4157600080fd5b813581811115612b5057600080fd5b896020828501011115612b6257600080fd5b9699959850939650602001949392505050565b60008060008060808587031215612b8b57600080fd5b8435612b968161311a565b93506020850135612ba68161311a565b925060408501359150606085013567ffffffffffffffff811115612bc957600080fd5b8501601f81018713612bda57600080fd5b612be9878235602084016129a8565b91505092959194509250565b60008060408385031215612c0857600080fd5b8235612c138161311a565b9150612c21602084016129e6565b90509250929050565b60008060408385031215612c3d57600080fd5b8235612c488161311a565b946020939093013593505050565b600060208284031215612c6857600080fd5b8135612a1b8161312f565b600060208284031215612c8557600080fd5b8151612a1b8161312f565b600060208284031215612ca257600080fd5b815167ffffffffffffffff811115612cb957600080fd5b8201601f81018413612cca57600080fd5b8051612cd86129b682612fe9565b818152856020838501011115612ced57600080fd5b612cfe826020830160208601613040565b95945050505050565b600060208284031215612d1957600080fd5b5035919050565b60008060408385031215612d3357600080fd5b82359150602083013567ffffffffffffffff811115612d5157600080fd5b612d5d858286016129fb565b9150509250929050565b600080600080600060a08688031215612d7f57600080fd5b853594506020860135935060408601359250612d9d606087016129e6565b9150608086013567ffffffffffffffff811115612db957600080fd5b612dc5888289016129fb565b9150509295509295909350565b60008151808452612dea816020860160208601613040565b601f01601f19169290920160200192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e5590830184612dd2565b9695505050505050565b602081526000612a1b6020830184612dd2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601b908201527f596f7520646f206e6f74206f776e207468617420636974697a656e0000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612fe157612fe1613104565b604052919050565b600067ffffffffffffffff82111561300357613003613104565b50601f01601f191660200190565b60008219821115613024576130246130c2565b500190565b60008282101561303b5761303b6130c2565b500390565b60005b8381101561305b578181015183820152602001613043565b838111156119a15750506000910152565b600181811c9082168061308057607f821691505b602082108114156130a157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130bb576130bb6130c2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611e4857600080fd5b6001600160e01b031981168114611e4857600080fdfea2646970667358221220bbc2d44b7f15d41a7ac1579926d87b98be353d969b952672b45df1c46cd98c0564736f6c63430008060033

Deployed Bytecode Sourcemap

45334:11567:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39053:224;;;;;;:::i;:::-;;:::i;:::-;;;8885:14:1;;8878:22;8860:41;;8848:2;8833:18;39053:224:0;;;;;;;;45720:27;;;;;-1:-1:-1;;;;;45720:27:0;;;;;;-1:-1:-1;;;;;7524:32:1;;;7506:51;;7494:2;7479:18;45720:27:0;7461:102:1;26175:100:0;;;:::i;:::-;;;;;;;:::i;27734:221::-;;;;;;:::i;:::-;;:::i;27257:411::-;;;;;;:::i;:::-;;:::i;:::-;;47109:142;;;;;;:::i;:::-;47181:7;47208:35;;;:24;:35;;;;;;;47109:142;;;;20111:25:1;;;20099:2;20084:18;47109:142:0;20066:76:1;53492:106:0;;;:::i;54246:117::-;;;;;;:::i;:::-;;:::i;47549:246::-;;;;;;:::i;:::-;-1:-1:-1;;;47549:246:0;;;;;;;;;;;-1:-1:-1;;;;;;9074:33:1;;;9056:52;;9044:2;9029:18;47549:246:0;9011:103:1;45926:50:0;;;;;;39693:113;39781:10;:17;39693:113;;28624:339;;;;;;:::i;:::-;;:::i;39361:256::-;;;;;;:::i;:::-;;:::i;29034:185::-;;;;;;:::i;:::-;;:::i;39883:233::-;;;;;;:::i;:::-;;:::i;45877:42::-;;;;;;47257:154;;;;;;:::i;:::-;;:::i;53606:121::-;;;:::i;25869:239::-;;;;;;:::i;:::-;;:::i;51433:395::-;;;;;;:::i;:::-;;:::i;46959:144::-;;;;;;:::i;:::-;47032:7;47059:36;;;:25;:36;;;;;;;46959:144;45638:31;;;;;-1:-1:-1;;;;;45638:31:0;;;53867:123;;;;;;:::i;:::-;;:::i;50274:1150::-;;;;;;:::i;:::-;;:::i;47417:124::-;;;;;;:::i;:::-;47485:4;47509:24;;;:13;:24;;;;;;;;;47417:124;25599:208;;;;;;:::i;:::-;;:::i;10621:94::-;;;:::i;48386:1880::-;;;;;;:::i;:::-;;:::i;46653:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;45604:27;;;;;-1:-1:-1;;;;;45604:27:0;;;9970:87;10043:6;;-1:-1:-1;;;;;10043:6:0;9970:87;;45824:46;;;;;;26344:104;;;:::i;52329:117::-;;;;;;:::i;:::-;;:::i;53735:124::-;;;;;;:::i;:::-;;:::i;28027:295::-;;;;;;:::i;:::-;;:::i;54781:507::-;;;:::i;54122:116::-;;;;;;:::i;:::-;;:::i;52212:108::-;;;;;;:::i;:::-;;:::i;29290:328::-;;;;;;:::i;:::-;;:::i;54509:148::-;;;;;;:::i;:::-;;:::i;47803:575::-;;;;;;:::i;:::-;;:::i;45789:28::-;;;;;;54665:108;;;;;;:::i;:::-;;:::i;45754:28::-;;;;;-1:-1:-1;;;;;45754:28:0;;;53393:91;;;:::i;46811:142::-;;;;;;:::i;:::-;46883:7;46910:35;;;:24;:35;;;;;;;46811:142;53998:116;;;;;;:::i;:::-;;:::i;55296:321::-;;;;;;:::i;:::-;;:::i;51837:366::-;;;;;;:::i;:::-;;:::i;45676:37::-;;;;;-1:-1:-1;;;;;45676:37:0;;;10870:192;;;;;;:::i;:::-;;:::i;54371:130::-;;;;;;:::i;:::-;;:::i;39053:224::-;39155:4;-1:-1:-1;;;;;;39179:50:0;;-1:-1:-1;;;39179:50:0;;:90;;;39233:36;39257:11;39233:23;:36::i;:::-;39172:97;39053:224;-1:-1:-1;;39053:224:0:o;26175:100::-;26229:13;26262:5;26255:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26175:100;:::o;27734:221::-;27810:7;31217:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31217:16:0;27830:73;;;;-1:-1:-1;;;27830:73:0;;15849:2:1;27830:73:0;;;15831:21:1;15888:2;15868:18;;;15861:30;15927:34;15907:18;;;15900:62;-1:-1:-1;;;15978:18:1;;;15971:42;16030:19;;27830:73:0;;;;;;;;;-1:-1:-1;27923:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27923:24:0;;27734:221::o;27257:411::-;27338:13;27354:23;27369:7;27354:14;:23::i;:::-;27338:39;;27402:5;-1:-1:-1;;;;;27396:11:0;:2;-1:-1:-1;;;;;27396:11:0;;;27388:57;;;;-1:-1:-1;;;27388:57:0;;17858:2:1;27388:57:0;;;17840:21:1;17897:2;17877:18;;;17870:30;17936:34;17916:18;;;17909:62;-1:-1:-1;;;17987:18:1;;;17980:31;18028:19;;27388:57:0;17830:223:1;27388:57:0;8924:10;-1:-1:-1;;;;;27480:21:0;;;;:62;;-1:-1:-1;27505:37:0;27522:5;8924:10;55296:321;:::i;27505:37::-;27458:168;;;;-1:-1:-1;;;27458:168:0;;13432:2:1;27458:168:0;;;13414:21:1;13471:2;13451:18;;;13444:30;13510:34;13490:18;;;13483:62;13581:26;13561:18;;;13554:54;13625:19;;27458:168:0;13404:246:1;27458:168:0;27639:21;27648:2;27652:7;27639:8;:21::i;:::-;27327:341;27257:411;;:::o;53492:106::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;53573:17:::1;::::0;;-1:-1:-1;;;;53552:38:0;::::1;-1:-1:-1::0;;;53573:17:0;;;::::1;;;53572:18;53552:38:::0;;::::1;;::::0;;53492:106::o;54246:117::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;54324:13:::1;:31:::0;;-1:-1:-1;;;;;;54324:31:0::1;-1:-1:-1::0;;;;;54324:31:0;;;::::1;::::0;;;::::1;::::0;;54246:117::o;28624:339::-;28819:41;8924:10;28852:7;28819:18;:41::i;:::-;28811:103;;;;-1:-1:-1;;;28811:103:0;;;;;;;:::i;:::-;28927:28;28937:4;28943:2;28947:7;28927:9;:28::i;39361:256::-;39458:7;39494:23;39511:5;39494:16;:23::i;:::-;39486:5;:31;39478:87;;;;-1:-1:-1;;;39478:87:0;;9545:2:1;39478:87:0;;;9527:21:1;9584:2;9564:18;;;9557:30;9623:34;9603:18;;;9596:62;-1:-1:-1;;;9674:18:1;;;9667:41;9725:19;;39478:87:0;9517:233:1;39478:87:0;-1:-1:-1;;;;;;39583:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39361:256::o;29034:185::-;29172:39;29189:4;29195:2;29199:7;29172:39;;;;;;;;;;;;:16;:39::i;39883:233::-;39958:7;39994:30;39781:10;:17;;39693:113;39994:30;39986:5;:38;39978:95;;;;-1:-1:-1;;;39978:95:0;;18678:2:1;39978:95:0;;;18660:21:1;18717:2;18697:18;;;18690:30;18756:34;18736:18;;;18729:62;-1:-1:-1;;;18807:18:1;;;18800:42;18859:19;;39978:95:0;18650:234:1;39978:95:0;40091:10;40102:5;40091:17;;;;;;;;:::i;:::-;;;;;;;;;40084:24;;39883:233;;;:::o;47257:154::-;47366:37;;;;:26;:37;;;;;47359:44;;47333:13;;47366:37;47359:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47257:154;;;:::o;53606:121::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;53697:22:::1;::::0;;-1:-1:-1;;;;53671:48:0;::::1;-1:-1:-1::0;;;53697:22:0;;;::::1;;;53696:23;53671:48:::0;;::::1;;::::0;;53606:121::o;25869:239::-;25941:7;25977:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25977:16:0;26012:19;26004:73;;;;-1:-1:-1;;;26004:73:0;;14268:2:1;26004:73:0;;;14250:21:1;14307:2;14287:18;;;14280:30;14346:34;14326:18;;;14319:62;-1:-1:-1;;;14397:18:1;;;14390:39;14446:19;;26004:73:0;14240:231:1;51433:395:0;12903:1;13499:7;;:19;;13491:63;;;;-1:-1:-1;;;13491:63:0;;;;;;;:::i;:::-;12903:1;13632:7;:18;51511:12:::1;::::0;-1:-1:-1;;;51511:12:0;::::1;;;51503:55;;;::::0;-1:-1:-1;;;51503:55:0;;12660:2:1;51503:55:0::1;::::0;::::1;12642:21:1::0;12699:2;12679:18;;;12672:30;12738:32;12718:18;;;12711:60;12788:18;;51503:55:0::1;12632:180:1::0;51503:55:0::1;8924:10:::0;51578:16:::1;51586:7:::0;51578::::1;:16::i;:::-;-1:-1:-1::0;;;;;51578:32:0::1;;51570:72;;;;-1:-1:-1::0;;;51570:72:0::1;;;;;;;:::i;:::-;51692:13;::::0;-1:-1:-1;;;;;51692:13:0::1;::::0;51717:11:::1;8924:10:::0;51743:16:::1;::::0;51717:43:::1;::::0;-1:-1:-1;;;;;;51717:43:0::1;::::0;;;;;;-1:-1:-1;;;;;8633:32:1;;;51717:43:0::1;::::0;::::1;8615:51:1::0;8682:18;;;8675:34;8588:18;;51717:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;51797:22:0::1;::::0;;;-1:-1:-1;;51797:13:0::1;:22;::::0;;;;;;-1:-1:-1;;51771:48:0;::::1;51797:22;::::0;;::::1;51796:23;51771:48;::::0;;51797:22;13811:7;:22;51433:395::o;53867:123::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;53948:16:::1;:34:::0;;-1:-1:-1;;;;;;53948:34:0::1;-1:-1:-1::0;;;;;53948:34:0;;;::::1;::::0;;;::::1;::::0;;53867:123::o;50274:1150::-;12903:1;13499:7;;:19;;13491:63;;;;-1:-1:-1;;;13491:63:0;;;;;;;:::i;:::-;12903:1;13632:7;:18;8924:10;50359:18:::1;50367:9:::0;50359:7:::1;:18::i;:::-;-1:-1:-1::0;;;;;50359:34:0::1;;50351:74;;;;-1:-1:-1::0;;;50351:74:0::1;;;;;;;:::i;:::-;50438:24;50478:35:::0;;;:24:::1;:35;::::0;;;;;50516:4:::1;-1:-1:-1::0;50475:228:0::1;;;-1:-1:-1::0;50573:16:0::1;::::0;-1:-1:-1;;;;;50573:16:0::1;50475:228;;;-1:-1:-1::0;50668:22:0::1;::::0;-1:-1:-1;;;;;50668:22:0::1;50475:228;50773:35;::::0;;;:24:::1;:35;::::0;;;;;;;50713:96;;-1:-1:-1;;;50713:96:0;;-1:-1:-1;;;;;50713:30:0;::::1;::::0;::::1;::::0;:96:::1;::::0;50752:4:::1;::::0;8924:10;;50773:35;50713:96:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;50852:12:0::1;::::0;50932:36:::1;::::0;;;:25:::1;:36;::::0;;;;;;;50876:93;;-1:-1:-1;;;50876:93:0;;-1:-1:-1;;;;;50852:12:0;;::::1;::::0;-1:-1:-1;50852:12:0;;-1:-1:-1;50876:26:0::1;::::0;:93:::1;::::0;50911:4:::1;::::0;8924:10;;50932:36;50876:93:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51012:12:0::1;::::0;51092:35:::1;::::0;;;:24:::1;:35;::::0;;;;;;;51036:92;;-1:-1:-1;;;51036:92:0;;-1:-1:-1;;;;;51012:12:0;;::::1;::::0;-1:-1:-1;51012:12:0;;-1:-1:-1;51036:26:0::1;::::0;:92:::1;::::0;51071:4:::1;::::0;8924:10;;51092:35;51036:92:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51141:16;51147:9;51141:5;:16::i;:::-;51177:35;::::0;;;:24:::1;:35;::::0;;;;;;;51170:42;;;51230:25:::1;:36:::0;;;;;51223:43;;;51284:24:::1;:35:::0;;;;;51277:42;;;51337:13:::1;:24:::0;;;;;51330:31;;-1:-1:-1;;51330:31:0::1;::::0;;51379:26:::1;:37:::0;;;;;51372:44:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;12859:1:0;13811:7;:22;-1:-1:-1;;50274:1150:0:o;25599:208::-;25671:7;-1:-1:-1;;;;;25699:19:0;;25691:74;;;;-1:-1:-1;;;25691:74:0;;13857:2:1;25691:74:0;;;13839:21:1;13896:2;13876:18;;;13869:30;13935:34;13915:18;;;13908:62;-1:-1:-1;;;13986:18:1;;;13979:40;14036:19;;25691:74:0;13829:232:1;25691:74:0;-1:-1:-1;;;;;;25783:16:0;;;;;:9;:16;;;;;;;25599:208::o;10621:94::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;10686:21:::1;10704:1;10686:9;:21::i;:::-;10621:94::o:0;48386:1880::-;12903:1;13499:7;;:19;;13491:63;;;;-1:-1:-1;;;13491:63:0;;;;;;;:::i;:::-;12903:1;13632:7;:18;48558:17:::1;::::0;-1:-1:-1;;;48558:17:0;::::1;;;48550:63;;;::::0;-1:-1:-1;;;48550:63:0;;14678:2:1;48550:63:0::1;::::0;::::1;14660:21:1::0;14717:2;14697:18;;;14690:30;14756:34;14736:18;;;14729:62;-1:-1:-1;;;14807:18:1;;;14800:31;14848:19;;48550:63:0::1;14650:223:1::0;48550:63:0::1;48632:29;48650:10;48632:17;:29::i;:::-;48624:80;;;::::0;-1:-1:-1;;;48624:80:0;;11494:2:1;48624:80:0::1;::::0;::::1;11476:21:1::0;11533:2;11513:18;;;11506:30;11572:34;11552:18;;;11545:62;-1:-1:-1;;;11623:18:1;;;11616:36;11669:19;;48624:80:0::1;11466:228:1::0;48624:80:0::1;48723:31;48742:11;48723:18;:31::i;:::-;48715:84;;;::::0;-1:-1:-1;;;48715:84:0;;17033:2:1;48715:84:0::1;::::0;::::1;17015:21:1::0;17072:2;17052:18;;;17045:30;17111:34;17091:18;;;17084:62;-1:-1:-1;;;17162:18:1;;;17155:38;17210:19;;48715:84:0::1;17005:230:1::0;48715:84:0::1;48818:29;48836:10;48818:17;:29::i;:::-;48810:81;;;::::0;-1:-1:-1;;;48810:81:0;;15441:2:1;48810:81:0::1;::::0;::::1;15423:21:1::0;15480:2;15460:18;;;15453:30;15519:34;15499:18;;;15492:62;-1:-1:-1;;;15570:18:1;;;15563:37;15617:19;;48810:81:0::1;15413:229:1::0;48810:81:0::1;48907:12;48904:108;;;48952:12;::::0;-1:-1:-1;;;48952:12:0;::::1;;;48944:55;;;::::0;-1:-1:-1;;;48944:55:0;;12660:2:1;48944:55:0::1;::::0;::::1;12642:21:1::0;12699:2;12679:18;;;12672:30;12738:32;12718:18;;;12711:60;12788:18;;48944:55:0::1;12632:180:1::0;48944:55:0::1;49024:42;8924:10:::0;49048:13:::1;::::0;:17:::1;::::0;49064:1:::1;49048:17;:::i;:::-;49024:9;:42::i;:::-;49079:13;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;49107:24;49160:4;49147:10;:17;49144:203;;;-1:-1:-1::0;49217:16:0::1;::::0;-1:-1:-1;;;;;49217:16:0::1;49144:203;;;-1:-1:-1::0;49312:22:0::1;::::0;-1:-1:-1;;;;;49312:22:0::1;49144:203;49357:71;::::0;-1:-1:-1;;;49357:71:0;;-1:-1:-1;;;;;49357:30:0;::::1;::::0;::::1;::::0;:71:::1;::::0;8924:10;;49410:4:::1;::::0;49417:10;;49357:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49471:12:0::1;::::0;49495:68:::1;::::0;-1:-1:-1;;;49495:68:0;;-1:-1:-1;;;;;49471:12:0;;::::1;::::0;-1:-1:-1;49471:12:0;;-1:-1:-1;49495:26:0::1;::::0;:68:::1;::::0;8924:10;;49544:4:::1;::::0;49551:11;;49495:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49606:12:0::1;::::0;49630:67:::1;::::0;-1:-1:-1;;;49630:67:0;;-1:-1:-1;;;;;49606:12:0;;::::1;::::0;-1:-1:-1;49606:12:0;;-1:-1:-1;49630:26:0::1;::::0;:67:::1;::::0;8924:10;;49679:4:::1;::::0;49686:10;;49630:67:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49790:13:0::1;::::0;;49765:39:::1;::::0;;;:24:::1;:39;::::0;;;;;;;:52;;;49854:13;;49828:40;;:25:::1;:40:::0;;;;;:54;;;49918:13;;49893:39;;:24:::1;:39:::0;;;:52;;;-1:-1:-1;;49956:96:0;::::1;;;50011:13;::::0;49997:28:::1;::::0;;;:13:::1;:28;::::0;;;;:43;;-1:-1:-1;;49997:43:0::1;::::0;::::1;;;::::0;;49956:96:::1;50065:28:::0;;:32;50062:131:::1;;50150:13;::::0;50123:41:::1;::::0;;;:26:::1;:41;::::0;;;;;;;:58;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;50062:131;-1:-1:-1::0;;50226:13:0::1;::::0;50205:35:::1;::::0;;;:20:::1;:35;::::0;;;;50243:15:::1;50205:53:::0;;-1:-1:-1;;12859:1:0;13811:7;:22;-1:-1:-1;;;;48386:1880:0:o;26344:104::-;26400:13;26433:7;26426:14;;;;;:::i;52329:117::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;52405:24:::1;:32:::0;52329:117::o;53735:124::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;53818:22:::1;:33:::0;;-1:-1:-1;;;;;;53818:33:0::1;-1:-1:-1::0;;;;;53818:33:0;;;::::1;::::0;;;::::1;::::0;;53735:124::o;28027:295::-;-1:-1:-1;;;;;28130:24:0;;8924:10;28130:24;;28122:62;;;;-1:-1:-1;;;28122:62:0;;12306:2:1;28122:62:0;;;12288:21:1;12345:2;12325:18;;;12318:30;12384:27;12364:18;;;12357:55;12429:18;;28122:62:0;12278:175:1;28122:62:0;8924:10;28197:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28197:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28197:53:0;;;;;;;;;;28266:48;;8860:41:1;;;28197:42:0;;8924:10;28266:48;;8833:18:1;28266:48:0;;;;;;;28027:295;;:::o;54781:507::-;54836:22;;-1:-1:-1;;;54836:22:0;;;;54828:66;;;;-1:-1:-1;;;54828:66:0;;19447:2:1;54828:66:0;;;19429:21:1;19486:2;19466:18;;;19459:30;19525:33;19505:18;;;19498:61;19576:18;;54828:66:0;19419:181:1;54828:66:0;54921:22;;-1:-1:-1;;;;;54921:22:0;54905:83;;;;-1:-1:-1;;;54905:83:0;;11140:2:1;54905:83:0;;;11122:21:1;11179:2;11159:18;;;11152:30;11218:27;11198:18;;;11191:55;11263:18;;54905:83:0;11112:175:1;54905:83:0;55036:13;;-1:-1:-1;;;;;55036:13:0;;55061:11;8924:10;55087:18;;55061:45;;-1:-1:-1;;;;;;55061:45:0;;;;;;;-1:-1:-1;;;;;8633:32:1;;;55061:45:0;;;8615:51:1;8682:18;;;8675:34;8588:18;;55061:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55193:22:0;;-1:-1:-1;;;;;55193:22:0;;-1:-1:-1;55193:22:0;;-1:-1:-1;55227:39:0;8924:10;55227:53;;-1:-1:-1;;;;;;55227:53:0;;;;;;;-1:-1:-1;;;;;7524:32:1;;;55227:53:0;;;7506:51:1;7479:18;;55227:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54817:471;;54781:507::o;54122:116::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;54200:12:::1;:30:::0;;-1:-1:-1;;;;;;54200:30:0::1;-1:-1:-1::0;;;;;54200:30:0;;;::::1;::::0;;;::::1;::::0;;54122:116::o;52212:108::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;52287:16:::1;:24:::0;52212:108::o;29290:328::-;29465:41;8924:10;29498:7;29465:18;:41::i;:::-;29457:103;;;;-1:-1:-1;;;29457:103:0;;;;;;;:::i;:::-;29571:39;29585:4;29591:2;29595:7;29604:5;29571:13;:39::i;:::-;29290:328;;;;:::o;54509:148::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;54603:28:::1;:46:::0;;-1:-1:-1;;;;;;54603:46:0::1;-1:-1:-1::0;;;;;54603:46:0;;;::::1;::::0;;;::::1;::::0;;54509:148::o;47803:575::-;31193:4;31217:16;;;:7;:16;;;;;;47868:13;;-1:-1:-1;;;;;31217:16:0;47894:76;;;;-1:-1:-1;;;47894:76:0;;17442:2:1;47894:76:0;;;17424:21:1;17481:2;17461:18;;;17454:30;17520:34;17500:18;;;17493:62;-1:-1:-1;;;17571:18:1;;;17564:45;17626:19;;47894:76:0;17414:237:1;47894:76:0;48022:26;48064:22;;;:13;:22;;;;;;47991:20;;48022:26;48064:22;;48061:221;;;-1:-1:-1;48141:28:0;;-1:-1:-1;;;;;48141:28:0;48061:221;;;-1:-1:-1;48250:19:0;;-1:-1:-1;;;;;48250:19:0;48061:221;48311:33;;-1:-1:-1;;;48311:33:0;;;;;20111:25:1;;;-1:-1:-1;;;;;48311:24:0;;;;;20084:18:1;;48311:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48311:33:0;;;;;;;;;;;;:::i;:::-;48302:42;47803:575;-1:-1:-1;;;;47803:575:0:o;54665:108::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;54739:18:::1;:26:::0;54665:108::o;53393:91::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;53464:12:::1;::::0;;-1:-1:-1;;;;53448:28:0;::::1;-1:-1:-1::0;;;53464:12:0;;;::::1;;;53463:13;53448:28:::0;;::::1;;::::0;;53393:91::o;53998:116::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;54076:12:::1;:30:::0;;-1:-1:-1;;;;;;54076:30:0::1;-1:-1:-1::0;;;;;54076:30:0;;;::::1;::::0;;;::::1;::::0;;53998:116::o;55296:321::-;55453:20;;55496:29;;-1:-1:-1;;;55496:29:0;;-1:-1:-1;;;;;7524:32:1;;;55496:29:0;;;7506:51:1;55386:4:0;;55453:20;;;55488:50;;;;55453:20;;55496:21;;7479:18:1;;55496:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55488:50:0;;55485:66;;;55547:4;55540:11;;;;;55485:66;-1:-1:-1;;;;;28514:25:0;;;28490:4;28514:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;55569:40;28393:164;51837:366;12903:1;13499:7;;:19;;13491:63;;;;-1:-1:-1;;;13491:63:0;;;;;;;:::i;:::-;12903:1;13632:7;:18;8924:10;51947:16:::1;51955:7:::0;51947::::1;:16::i;:::-;-1:-1:-1::0;;;;;51947:32:0::1;;51939:72;;;;-1:-1:-1::0;;;51939:72:0::1;;;;;;;:::i;:::-;52061:13;::::0;-1:-1:-1;;;;;52061:13:0::1;::::0;52086:11:::1;8924:10:::0;52112:24:::1;::::0;52086:51:::1;::::0;-1:-1:-1;;;;;;52086:51:0::1;::::0;;;;;;-1:-1:-1;;;;;8633:32:1;;;52086:51:0::1;::::0;::::1;8615::1::0;8682:18;;;8675:34;8588:18;;52086:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;52148:35:0::1;::::0;;;:26:::1;:35;::::0;;;;;;;:46;;::::1;::::0;-1:-1:-1;52148:35:0;;:46;::::1;::::0;::::1;:::i;10870:192::-:0;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10959:22:0;::::1;10951:73;;;::::0;-1:-1:-1;;;10951:73:0;;10376:2:1;10951:73:0::1;::::0;::::1;10358:21:1::0;10415:2;10395:18;;;10388:30;10454:34;10434:18;;;10427:62;-1:-1:-1;;;10505:18:1;;;10498:36;10551:19;;10951:73:0::1;10348:228:1::0;10951:73:0::1;11035:19;11045:8;11035:9;:19::i;:::-;10870:192:::0;:::o;54371:130::-;10043:6;;-1:-1:-1;;;;;10043:6:0;8924:10;10190:23;10182:68;;;;-1:-1:-1;;;10182:68:0;;;;;;;:::i;:::-;54456:19:::1;:37:::0;;-1:-1:-1;;;;;;54456:37:0::1;-1:-1:-1::0;;;;;54456:37:0;;;::::1;::::0;;;::::1;::::0;;54371:130::o;25230:305::-;25332:4;-1:-1:-1;;;;;;25369:40:0;;-1:-1:-1;;;25369:40:0;;:105;;-1:-1:-1;;;;;;;25426:48:0;;-1:-1:-1;;;25426:48:0;25369:105;:158;;;-1:-1:-1;;;;;;;;;;23946:40:0;;;25491:36;23837:157;35110:174;35185:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35185:29:0;-1:-1:-1;;;;;35185:29:0;;;;;;;;:24;;35239:23;35185:24;35239:14;:23::i;:::-;-1:-1:-1;;;;;35230:46:0;;;;;;;;;;;35110:174;;:::o;31422:348::-;31515:4;31217:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31217:16:0;31532:73;;;;-1:-1:-1;;;31532:73:0;;13019:2:1;31532:73:0;;;13001:21:1;13058:2;13038:18;;;13031:30;13097:34;13077:18;;;13070:62;-1:-1:-1;;;13148:18:1;;;13141:42;13200:19;;31532:73:0;12991:234:1;31532:73:0;31616:13;31632:23;31647:7;31632:14;:23::i;:::-;31616:39;;31685:5;-1:-1:-1;;;;;31674:16:0;:7;-1:-1:-1;;;;;31674:16:0;;:51;;;;31718:7;-1:-1:-1;;;;;31694:31:0;:20;31706:7;31694:11;:20::i;:::-;-1:-1:-1;;;;;31694:31:0;;31674:51;:87;;;;31729:32;31746:5;31753:7;31729:16;:32::i;34414:578::-;34573:4;-1:-1:-1;;;;;34546:31:0;:23;34561:7;34546:14;:23::i;:::-;-1:-1:-1;;;;;34546:31:0;;34538:85;;;;-1:-1:-1;;;34538:85:0;;16623:2:1;34538:85:0;;;16605:21:1;16662:2;16642:18;;;16635:30;16701:34;16681:18;;;16674:62;-1:-1:-1;;;16752:18:1;;;16745:39;16801:19;;34538:85:0;16595:231:1;34538:85:0;-1:-1:-1;;;;;34642:16:0;;34634:65;;;;-1:-1:-1;;;34634:65:0;;11901:2:1;34634:65:0;;;11883:21:1;11940:2;11920:18;;;11913:30;11979:34;11959:18;;;11952:62;-1:-1:-1;;;12030:18:1;;;12023:34;12074:19;;34634:65:0;11873:226:1;34634:65:0;34712:39;34733:4;34739:2;34743:7;34712:20;:39::i;:::-;34816:29;34833:1;34837:7;34816:8;:29::i;:::-;-1:-1:-1;;;;;34858:15:0;;;;;;:9;:15;;;;;:20;;34877:1;;34858:15;:20;;34877:1;;34858:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34889:13:0;;;;;;:9;:13;;;;;:18;;34906:1;;34889:13;:18;;34906:1;;34889:18;:::i;:::-;;;;-1:-1:-1;;34918:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34918:21:0;-1:-1:-1;;;;;34918:21:0;;;;;;;;;34957:27;;34918:16;;34957:27;;;;;;;34414:578;;;:::o;33717:360::-;33777:13;33793:23;33808:7;33793:14;:23::i;:::-;33777:39;;33829:48;33850:5;33865:1;33869:7;33829:20;:48::i;:::-;33918:29;33935:1;33939:7;33918:8;:29::i;:::-;-1:-1:-1;;;;;33960:16:0;;;;;;:9;:16;;;;;:21;;33980:1;;33960:16;:21;;33980:1;;33960:21;:::i;:::-;;;;-1:-1:-1;;33999:16:0;;;;:7;:16;;;;;;33992:23;;-1:-1:-1;;;;;;33992:23:0;;;34033:36;34007:7;;33999:16;-1:-1:-1;;;;;34033:36:0;;;;;33999:16;;34033:36;33766:311;33717:360;:::o;11070:173::-;11145:6;;;-1:-1:-1;;;;;11162:17:0;;;-1:-1:-1;;;;;;11162:17:0;;;;;;;11195:40;;11145:6;;;11162:17;11145:6;;11195:40;;11126:16;;11195:40;11115:128;11070:173;:::o;52454:438::-;52524:4;52541:35;52603:4;52590:10;:17;52587:225;;;-1:-1:-1;52671:16:0;;-1:-1:-1;;;;;52671:16:0;52587:225;;;-1:-1:-1;52777:22:0;;-1:-1:-1;;;;;52777:22:0;52587:225;8924:10;52871:12;52829:38;;-1:-1:-1;;;52829:38:0;;;;;20111:25:1;;;-1:-1:-1;;;;;52829:54:0;;;;:26;;;;;20084:18:1;;52829:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52829:54:0;;;52454:438;-1:-1:-1;;;52454:438:0:o;52900:241::-;53045:12;;52972:4;;-1:-1:-1;;;;;53045:12:0;8924:10;53120:12;8844:98;53149:236;53291:12;;53219:4;;-1:-1:-1;;;;;53291:12:0;8924:10;53364:12;8844:98;32112:110;32188:26;32198:2;32202:7;32188:26;;;;;;;;;;;;:9;:26::i;:::-;32112:110;;:::o;30500:315::-;30657:28;30667:4;30673:2;30677:7;30657:9;:28::i;:::-;30704:48;30727:4;30733:2;30737:7;30746:5;30704:22;:48::i;:::-;30696:111;;;;-1:-1:-1;;;30696:111:0;;;;;;;:::i;40729:589::-;-1:-1:-1;;;;;40935:18:0;;40931:187;;40970:40;41002:7;42145:10;:17;;42118:24;;;;:15;:24;;;;;:44;;;42173:24;;;;;;;;;;;;42041:164;40970:40;40931:187;;;41040:2;-1:-1:-1;;;;;41032:10:0;:4;-1:-1:-1;;;;;41032:10:0;;41028:90;;41059:47;41092:4;41098:7;41059:32;:47::i;:::-;-1:-1:-1;;;;;41132:16:0;;41128:183;;41165:45;41202:7;41165:36;:45::i;41128:183::-;41238:4;-1:-1:-1;;;;;41232:10:0;:2;-1:-1:-1;;;;;41232:10:0;;41228:83;;41259:40;41287:2;41291:7;41259:27;:40::i;32449:321::-;32579:18;32585:2;32589:7;32579:5;:18::i;:::-;32630:54;32661:1;32665:2;32669:7;32678:5;32630:22;:54::i;:::-;32608:154;;;;-1:-1:-1;;;32608:154:0;;;;;;;:::i;35849:803::-;36004:4;-1:-1:-1;;;;;36025:13:0;;16342:20;16390:8;36021:624;;36061:72;;-1:-1:-1;;;36061:72:0;;-1:-1:-1;;;;;36061:36:0;;;;;:72;;8924:10;;36112:4;;36118:7;;36127:5;;36061:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36061:72:0;;;;;;;;-1:-1:-1;;36061:72:0;;;;;;;;;;;;:::i;:::-;;;36057:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36307:13:0;;36303:272;;36350:60;;-1:-1:-1;;;36350:60:0;;;;;;;:::i;36303:272::-;36525:6;36519:13;36510:6;36506:2;36502:15;36495:38;36057:533;-1:-1:-1;;;;;;36184:55:0;-1:-1:-1;;;36184:55:0;;-1:-1:-1;36177:62:0;;36021:624;-1:-1:-1;36629:4:0;35849:803;;;;;;:::o;42832:988::-;43098:22;43148:1;43123:22;43140:4;43123:16;:22::i;:::-;:26;;;;:::i;:::-;43160:18;43181:26;;;:17;:26;;;;;;43098:51;;-1:-1:-1;43314:28:0;;;43310:328;;-1:-1:-1;;;;;43381:18:0;;43359:19;43381:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43432:30;;;;;;:44;;;43549:30;;:17;:30;;;;;:43;;;43310:328;-1:-1:-1;43734:26:0;;;;:17;:26;;;;;;;;43727:33;;;-1:-1:-1;;;;;43778:18:0;;;;;:12;:18;;;;;:34;;;;;;;43771:41;42832:988::o;44115:1079::-;44393:10;:17;44368:22;;44393:21;;44413:1;;44393:21;:::i;:::-;44425:18;44446:24;;;:15;:24;;;;;;44819:10;:26;;44368:46;;-1:-1:-1;44446:24:0;;44368:46;;44819:26;;;;;;:::i;:::-;;;;;;;;;44797:48;;44883:11;44858:10;44869;44858:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44963:28;;;:15;:28;;;;;;;:41;;;45135:24;;;;;45128:31;45170:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;44186:1008;;;44115:1079;:::o;41619:221::-;41704:14;41721:20;41738:2;41721:16;:20::i;:::-;-1:-1:-1;;;;;41752:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41797:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41619:221:0:o;33106:382::-;-1:-1:-1;;;;;33186:16:0;;33178:61;;;;-1:-1:-1;;;33178:61:0;;15080:2:1;33178:61:0;;;15062:21:1;;;15099:18;;;15092:30;15158:34;15138:18;;;15131:62;15210:18;;33178:61:0;15052:182:1;33178:61:0;31193:4;31217:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31217:16:0;:30;33250:58;;;;-1:-1:-1;;;33250:58:0;;10783:2:1;33250:58:0;;;10765:21:1;10822:2;10802:18;;;10795:30;10861;10841:18;;;10834:58;10909:18;;33250:58:0;10755:178:1;33250:58:0;33321:45;33350:1;33354:2;33358:7;33321:20;:45::i;:::-;-1:-1:-1;;;;;33379:13:0;;;;;;:9;:13;;;;;:18;;33396:1;;33379:13;:18;;33396:1;;33379:18;:::i;:::-;;;;-1:-1:-1;;33408:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33408:21:0;-1:-1:-1;;;;;33408:21:0;;;;;;;;33447:33;;33408:16;;;33447:33;;33408:16;;33447:33;33106:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:2;;;239:1;236;229:12;198:2;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;88:262;;;;;:::o;355:160::-;420:20;;476:13;;469:21;459:32;;449:2;;505:1;502;495:12;449:2;401:114;;;:::o;520:221::-;563:5;616:3;609:4;601:6;597:17;593:27;583:2;;634:1;631;624:12;583:2;656:79;731:3;722:6;709:20;702:4;694:6;690:17;656:79;:::i;:::-;647:88;573:168;-1:-1:-1;;;573:168:1:o;746:247::-;805:6;858:2;846:9;837:7;833:23;829:32;826:2;;;874:1;871;864:12;826:2;913:9;900:23;932:31;957:5;932:31;:::i;998:251::-;1068:6;1121:2;1109:9;1100:7;1096:23;1092:32;1089:2;;;1137:1;1134;1127:12;1089:2;1169:9;1163:16;1188:31;1213:5;1188:31;:::i;1254:388::-;1322:6;1330;1383:2;1371:9;1362:7;1358:23;1354:32;1351:2;;;1399:1;1396;1389:12;1351:2;1438:9;1425:23;1457:31;1482:5;1457:31;:::i;:::-;1507:5;-1:-1:-1;1564:2:1;1549:18;;1536:32;1577:33;1536:32;1577:33;:::i;:::-;1629:7;1619:17;;;1341:301;;;;;:::o;1647:456::-;1724:6;1732;1740;1793:2;1781:9;1772:7;1768:23;1764:32;1761:2;;;1809:1;1806;1799:12;1761:2;1848:9;1835:23;1867:31;1892:5;1867:31;:::i;:::-;1917:5;-1:-1:-1;1974:2:1;1959:18;;1946:32;1987:33;1946:32;1987:33;:::i;:::-;1751:352;;2039:7;;-1:-1:-1;;;2093:2:1;2078:18;;;;2065:32;;1751:352::o;2108:936::-;2205:6;2213;2221;2229;2237;2290:3;2278:9;2269:7;2265:23;2261:33;2258:2;;;2307:1;2304;2297:12;2258:2;2346:9;2333:23;2365:31;2390:5;2365:31;:::i;:::-;2415:5;-1:-1:-1;2472:2:1;2457:18;;2444:32;2485:33;2444:32;2485:33;:::i;:::-;2537:7;-1:-1:-1;2591:2:1;2576:18;;2563:32;;-1:-1:-1;2646:2:1;2631:18;;2618:32;2669:18;2699:14;;;2696:2;;;2726:1;2723;2716:12;2696:2;2764:6;2753:9;2749:22;2739:32;;2809:7;2802:4;2798:2;2794:13;2790:27;2780:2;;2831:1;2828;2821:12;2780:2;2871;2858:16;2897:2;2889:6;2886:14;2883:2;;;2913:1;2910;2903:12;2883:2;2958:7;2953:2;2944:6;2940:2;2936:15;2932:24;2929:37;2926:2;;;2979:1;2976;2969:12;2926:2;2248:796;;;;-1:-1:-1;2248:796:1;;-1:-1:-1;3010:2:1;3002:11;;3032:6;2248:796;-1:-1:-1;;;2248:796:1:o;3049:794::-;3144:6;3152;3160;3168;3221:3;3209:9;3200:7;3196:23;3192:33;3189:2;;;3238:1;3235;3228:12;3189:2;3277:9;3264:23;3296:31;3321:5;3296:31;:::i;:::-;3346:5;-1:-1:-1;3403:2:1;3388:18;;3375:32;3416:33;3375:32;3416:33;:::i;:::-;3468:7;-1:-1:-1;3522:2:1;3507:18;;3494:32;;-1:-1:-1;3577:2:1;3562:18;;3549:32;3604:18;3593:30;;3590:2;;;3636:1;3633;3626:12;3590:2;3659:22;;3712:4;3704:13;;3700:27;-1:-1:-1;3690:2:1;;3741:1;3738;3731:12;3690:2;3764:73;3829:7;3824:2;3811:16;3806:2;3802;3798:11;3764:73;:::i;:::-;3754:83;;;3179:664;;;;;;;:::o;3848:315::-;3913:6;3921;3974:2;3962:9;3953:7;3949:23;3945:32;3942:2;;;3990:1;3987;3980:12;3942:2;4029:9;4016:23;4048:31;4073:5;4048:31;:::i;:::-;4098:5;-1:-1:-1;4122:35:1;4153:2;4138:18;;4122:35;:::i;:::-;4112:45;;3932:231;;;;;:::o;4168:315::-;4236:6;4244;4297:2;4285:9;4276:7;4272:23;4268:32;4265:2;;;4313:1;4310;4303:12;4265:2;4352:9;4339:23;4371:31;4396:5;4371:31;:::i;:::-;4421:5;4473:2;4458:18;;;;4445:32;;-1:-1:-1;;;4255:228:1:o;4488:245::-;4546:6;4599:2;4587:9;4578:7;4574:23;4570:32;4567:2;;;4615:1;4612;4605:12;4567:2;4654:9;4641:23;4673:30;4697:5;4673:30;:::i;4738:249::-;4807:6;4860:2;4848:9;4839:7;4835:23;4831:32;4828:2;;;4876:1;4873;4866:12;4828:2;4908:9;4902:16;4927:30;4951:5;4927:30;:::i;5277:635::-;5357:6;5410:2;5398:9;5389:7;5385:23;5381:32;5378:2;;;5426:1;5423;5416:12;5378:2;5459:9;5453:16;5492:18;5484:6;5481:30;5478:2;;;5524:1;5521;5514:12;5478:2;5547:22;;5600:4;5592:13;;5588:27;-1:-1:-1;5578:2:1;;5629:1;5626;5619:12;5578:2;5658;5652:9;5683:48;5699:31;5727:2;5699:31;:::i;5683:48::-;5754:2;5747:5;5740:17;5794:7;5789:2;5784;5780;5776:11;5772:20;5769:33;5766:2;;;5815:1;5812;5805:12;5766:2;5828:54;5879:2;5874;5867:5;5863:14;5858:2;5854;5850:11;5828:54;:::i;:::-;5901:5;5368:544;-1:-1:-1;;;;;5368:544:1:o;5917:180::-;5976:6;6029:2;6017:9;6008:7;6004:23;6000:32;5997:2;;;6045:1;6042;6035:12;5997:2;-1:-1:-1;6068:23:1;;5987:110;-1:-1:-1;5987:110:1:o;6102:390::-;6180:6;6188;6241:2;6229:9;6220:7;6216:23;6212:32;6209:2;;;6257:1;6254;6247:12;6209:2;6293:9;6280:23;6270:33;;6354:2;6343:9;6339:18;6326:32;6381:18;6373:6;6370:30;6367:2;;;6413:1;6410;6403:12;6367:2;6436:50;6478:7;6469:6;6458:9;6454:22;6436:50;:::i;:::-;6426:60;;;6199:293;;;;;:::o;6497:596::-;6599:6;6607;6615;6623;6631;6684:3;6672:9;6663:7;6659:23;6655:33;6652:2;;;6701:1;6698;6691:12;6652:2;6737:9;6724:23;6714:33;;6794:2;6783:9;6779:18;6766:32;6756:42;;6845:2;6834:9;6830:18;6817:32;6807:42;;6868:35;6899:2;6888:9;6884:18;6868:35;:::i;:::-;6858:45;;6954:3;6943:9;6939:19;6926:33;6982:18;6974:6;6971:30;6968:2;;;7014:1;7011;7004:12;6968:2;7037:50;7079:7;7070:6;7059:9;7055:22;7037:50;:::i;:::-;7027:60;;;6642:451;;;;;;;;:::o;7098:257::-;7139:3;7177:5;7171:12;7204:6;7199:3;7192:19;7220:63;7276:6;7269:4;7264:3;7260:14;7253:4;7246:5;7242:16;7220:63;:::i;:::-;7337:2;7316:15;-1:-1:-1;;7312:29:1;7303:39;;;;7344:4;7299:50;;7147:208;-1:-1:-1;;7147:208:1:o;7568:375::-;-1:-1:-1;;;;;7826:15:1;;;7808:34;;7878:15;;;;7873:2;7858:18;;7851:43;7925:2;7910:18;;7903:34;;;;7758:2;7743:18;;7725:218::o;7948:488::-;-1:-1:-1;;;;;8217:15:1;;;8199:34;;8269:15;;8264:2;8249:18;;8242:43;8316:2;8301:18;;8294:34;;;8364:3;8359:2;8344:18;;8337:31;;;8142:4;;8385:45;;8410:19;;8402:6;8385:45;:::i;:::-;8377:53;8151:285;-1:-1:-1;;;;;;8151:285:1:o;9119:219::-;9268:2;9257:9;9250:21;9231:4;9288:44;9328:2;9317:9;9313:18;9305:6;9288:44;:::i;9755:414::-;9957:2;9939:21;;;9996:2;9976:18;;;9969:30;10035:34;10030:2;10015:18;;10008:62;-1:-1:-1;;;10101:2:1;10086:18;;10079:48;10159:3;10144:19;;9929:240::o;16060:356::-;16262:2;16244:21;;;16281:18;;;16274:30;16340:34;16335:2;16320:18;;16313:62;16407:2;16392:18;;16234:182::o;18058:413::-;18260:2;18242:21;;;18299:2;18279:18;;;18272:30;18338:34;18333:2;18318:18;;18311:62;-1:-1:-1;;;18404:2:1;18389:18;;18382:47;18461:3;18446:19;;18232:239::o;18889:351::-;19091:2;19073:21;;;19130:2;19110:18;;;19103:30;19169:29;19164:2;19149:18;;19142:57;19231:2;19216:18;;19063:177::o;19605:355::-;19807:2;19789:21;;;19846:2;19826:18;;;19819:30;19885:33;19880:2;19865:18;;19858:61;19951:2;19936:18;;19779:181::o;20147:275::-;20218:2;20212:9;20283:2;20264:13;;-1:-1:-1;;20260:27:1;20248:40;;20318:18;20303:34;;20339:22;;;20300:62;20297:2;;;20365:18;;:::i;:::-;20401:2;20394:22;20192:230;;-1:-1:-1;20192:230:1:o;20427:186::-;20475:4;20508:18;20500:6;20497:30;20494:2;;;20530:18;;:::i;:::-;-1:-1:-1;20596:2:1;20575:15;-1:-1:-1;;20571:29:1;20602:4;20567:40;;20484:129::o;20618:128::-;20658:3;20689:1;20685:6;20682:1;20679:13;20676:2;;;20695:18;;:::i;:::-;-1:-1:-1;20731:9:1;;20666:80::o;20751:125::-;20791:4;20819:1;20816;20813:8;20810:2;;;20824:18;;:::i;:::-;-1:-1:-1;20861:9:1;;20800:76::o;20881:258::-;20953:1;20963:113;20977:6;20974:1;20971:13;20963:113;;;21053:11;;;21047:18;21034:11;;;21027:39;20999:2;20992:10;20963:113;;;21094:6;21091:1;21088:13;21085:2;;;-1:-1:-1;;21129:1:1;21111:16;;21104:27;20934:205::o;21144:380::-;21223:1;21219:12;;;;21266;;;21287:2;;21341:4;21333:6;21329:17;21319:27;;21287:2;21394;21386:6;21383:14;21363:18;21360:38;21357:2;;;21440:10;21435:3;21431:20;21428:1;21421:31;21475:4;21472:1;21465:15;21503:4;21500:1;21493:15;21357:2;;21199:325;;;:::o;21529:135::-;21568:3;-1:-1:-1;;21589:17:1;;21586:2;;;21609:18;;:::i;:::-;-1:-1:-1;21656:1:1;21645:13;;21576:88::o;21669:127::-;21730:10;21725:3;21721:20;21718:1;21711:31;21761:4;21758:1;21751:15;21785:4;21782:1;21775:15;21801:127;21862:10;21857:3;21853:20;21850:1;21843:31;21893:4;21890:1;21883:15;21917:4;21914:1;21907:15;21933:127;21994:10;21989:3;21985:20;21982:1;21975:31;22025:4;22022:1;22015:15;22049:4;22046:1;22039:15;22065:127;22126:10;22121:3;22117:20;22114:1;22107:31;22157:4;22154:1;22147:15;22181:4;22178:1;22171:15;22197:131;-1:-1:-1;;;;;22272:31:1;;22262:42;;22252:2;;22318:1;22315;22308:12;22333:131;-1:-1:-1;;;;;;22407:32:1;;22397:43;;22387:2;;22454:1;22451;22444:12

Swarm Source

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