Token BitTorrent Web3 Domains

Overview BRC721

Total Supply:
564 BWD

Holders:
17 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

OVERVIEW

BitTorrent Web3 Domains - Get your favorite .btt domains and create your identity profile.


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

Contract Source Code Verified (Exact Match)

Contract Name:
Web3Domains

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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


library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

contract AdminControl is Ownable {

    using Roles for Roles.Role;

    Roles.Role private _controllerRoles;


    modifier onlyMinterController() {
      require (
        hasRole(msg.sender), 
        "AdminControl: sender must has minting role"
      );
      _;
    }

    modifier onlyMinter() {
      require (
        hasRole(msg.sender), 
        "AdminControl: sender must has minting role"
      );
      _;
    }

    constructor() {
      _grantRole(msg.sender);
    }

    function grantMinterRole (address account) public  onlyOwner {
      _grantRole(account);
    }

    function revokeMinterRole (address account) public  onlyOwner {
      _revokeRole(account);
    }

    function hasRole(address account) public view returns (bool) {
      return _controllerRoles.has(account);
    }
    
    function _grantRole (address account) internal {
      _controllerRoles.add(account);
    }

    function _revokeRole (address account) internal {
      _controllerRoles.remove(account);
    }

}



library StringUtil {

    /**
     * @dev Return the count of the dot "." in a string
    */
    function dotCount(string memory s) internal pure returns (uint) {
        s; // Don't warn about unused variables
        // Starting here means the LSB will be the byte we care about
        uint ptr;
        uint end;
        assembly {
            ptr := add(s, 1)
            end := add(mload(s), ptr)
        }
        uint num = 0;
        uint len = 0;
        for (len; ptr < end; len++) {
            uint8 b;
            assembly { b := and(mload(ptr), 0xFF) }
            if (b == 0x2e) {
                num += 1;
            }
            ptr += 1;
        }
        return num;
    }
	
	function toLower(string memory str) internal pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint i = 0; i < bStr.length; i++) {
            // Uppercase character...
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                // So we add 32 to make it lowercase
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }
	
	function toHash(string memory _s) internal pure returns (bytes32) {
        return keccak256(abi.encode(_s));
    }

    function isEmpty(string memory _s) internal pure returns (bool) {
        return bytes(_s).length == 0;
    }
	
	 function compare(string memory _a, string memory _b) internal pure returns (int) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) minLength = b.length;
        //@todo unroll the loop into increments of 32 and do full 32 byte comparisons
        for (uint i = 0; i < minLength; i ++)
            if (a[i] < b[i])
                return -1;
            else if (a[i] > b[i])
                return 1;
        if (a.length < b.length)
            return -1;
        else if (a.length > b.length)
            return 1;
        else
            return 0;
    }
    /// @dev Compares two strings and returns true iff they are equal.
    function equal(string memory _a, string memory _b) internal pure returns (bool) {
        return compare(_a, _b) == 0;
    }
    /// @dev Finds the index of the first occurrence of _needle in _haystack
    function indexOf(string memory _haystack, string memory _needle) internal pure returns (int)
    {
    	bytes memory h = bytes(_haystack);
    	bytes memory n = bytes(_needle);
    	if(h.length < 1 || n.length < 1 || (n.length > h.length)) 
    		return -1;
    	else if(h.length > (2**128 -1)) // since we have to be able to return -1 (if the char isn't found or input error), this function must return an "int" type with a max length of (2^128 - 1)
    		return -1;									
    	else
    	{
    		uint subindex = 0;
    		for (uint i = 0; i < h.length; i ++)
    		{
    			if (h[i] == n[0]) // found the first char of b
    			{
    				subindex = 1;
    				while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex]) // search until the chars don't match or until we reach the end of a or b
    				{
    					subindex++;
    				}	
    				if(subindex == n.length)
    					return int(i);
    			}
    		}
    		return -1;
    	}	
    }
	
	
}

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

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

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

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

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

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

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

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

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

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.0;

abstract contract KeyStorage {
    mapping(uint256 => string) private _keys;

    function getKey(uint256 keyHash) public view returns (string memory) {
        return _keys[keyHash];
    }

    function getKeys(uint256[] calldata hashes) public view returns (string[] memory values) {
        values = new string[](hashes.length);
        for (uint256 i = 0; i < hashes.length; i++) {
            values[i] = getKey(hashes[i]);
        }
    }

    function addKey(string memory key) external {
        _addKey(uint256(keccak256(abi.encodePacked(key))), key);
    }

    function _existsKey(uint256 keyHash) internal view returns (bool) {
        return bytes(_keys[keyHash]).length > 0;
    }

    function _addKey(uint256 keyHash, string memory key) internal {
        if (!_existsKey(keyHash)) {
            _keys[keyHash] = key;
        }
    }
}

pragma solidity ^0.8.0;

interface IRecordReader {
    /**
     * @dev Function to get record.
     * @param key The key to query the value of.
     * @param tokenId The token id to fetch.
     * @return The value string.
     */
    function get(string calldata key, uint256 tokenId) external view returns (string memory);

    /**
     * @dev Function to get multiple record.
     * @param keys The keys to query the value of.
     * @param tokenId The token id to fetch.
     * @return The values.
     */
    function getMany(string[] calldata keys, uint256 tokenId) external view returns (string[] memory);

    /**
     * @dev Function get value by provied key hash.
     * @param keyHash The key to query the value of.
     * @param tokenId The token id to set.
     */
    function getByHash(uint256 keyHash, uint256 tokenId) external view returns (string memory key, string memory value);

    /**
     * @dev Function get values by provied key hashes.
     * @param keyHashes The key to query the value of.
     * @param tokenId The token id to set.
     */
    function getManyByHash(uint256[] calldata keyHashes, uint256 tokenId)
        external
        view
        returns (string[] memory keys, string[] memory values);
}

pragma solidity ^0.8.0;


interface IRecordStorage is IRecordReader {
    event Set(uint256 indexed tokenId, string indexed keyIndex, string indexed valueIndex, string key, string value);

    event NewKey(uint256 indexed tokenId, string indexed keyIndex, string key);

    event ResetRecords(uint256 indexed tokenId);

    /**
     * @dev Set record by key
     * @param key The key set the value of
     * @param value The value to set key to
     * @param tokenId ERC-721 token id to set
     */
    function set(
        string calldata key,
        string calldata value,
        uint256 tokenId
    ) external;

    /**
     * @dev Set records by keys
     * @param keys The keys set the values of
     * @param values Records values
     * @param tokenId ERC-721 token id of the domain
     */
    function setMany(
        string[] memory keys,
        string[] memory values,
        uint256 tokenId
    ) external;

    /**
     * @dev Set record by key hash
     * @param keyHash The key hash set the value of
     * @param value The value to set key to
     * @param tokenId ERC-721 token id to set
     */
    function setByHash(
        uint256 keyHash,
        string calldata value,
        uint256 tokenId
    ) external;

    /**
     * @dev Set records by key hashes
     * @param keyHashes The key hashes set the values of
     * @param values Records values
     * @param tokenId ERC-721 token id of the domain
     */
    function setManyByHash(
        uint256[] calldata keyHashes,
        string[] calldata values,
        uint256 tokenId
    ) external;

    /**
     * @dev Reset all domain records and set new ones
     * @param keys New record keys
     * @param values New record values
     * @param tokenId ERC-721 token id of the domain
     */
    function reconfigure(
        string[] memory keys,
        string[] memory values,
        uint256 tokenId
    ) external;

    /**
     * @dev Function to reset all existing records on a domain.
     * @param tokenId ERC-721 token id to set.
     */
    function reset(uint256 tokenId) external;
}

pragma solidity ^0.8.0;


abstract contract RecordStorage is KeyStorage, IRecordStorage {
    /// @dev mapping of presetIds to keyIds to values
    mapping(uint256 => mapping(uint256 => string)) internal _records;

    /// @dev mapping of tokenIds to presetIds
    mapping(uint256 => uint256) internal _tokenPresets;

    function get(string calldata key, uint256 tokenId) external view override returns (string memory value) {
        value = _get(key, tokenId);
    }

    function getMany(string[] calldata keys, uint256 tokenId) external view override returns (string[] memory values) {
        values = new string[](keys.length);
        for (uint256 i = 0; i < keys.length; i++) {
            values[i] = _get(keys[i], tokenId);
        }
    }

    function getByHash(uint256 keyHash, uint256 tokenId)
        external
        view
        override
        returns (string memory key, string memory value)
    {
        (key, value) = _getByHash(keyHash, tokenId);
    }

    function getManyByHash(uint256[] calldata keyHashes, uint256 tokenId)
        external
        view
        override
        returns (string[] memory keys, string[] memory values)
    {
        keys = new string[](keyHashes.length);
        values = new string[](keyHashes.length);
        for (uint256 i = 0; i < keyHashes.length; i++) {
            (keys[i], values[i]) = _getByHash(keyHashes[i], tokenId);
        }
    }

    function _presetOf(uint256 tokenId) internal view virtual returns (uint256) {
        return _tokenPresets[tokenId] == 0 ? tokenId : _tokenPresets[tokenId];
    }

    function _set(
        string calldata key,
        string calldata value,
        uint256 tokenId
    ) internal {
        uint256 keyHash = uint256(keccak256(abi.encodePacked(key)));
        _addKey(keyHash, key);
        _set(keyHash, key, value, tokenId);
    }

    function _setMany(
        string[] calldata keys,
        string[] calldata values,
        uint256 tokenId
    ) internal {
        for (uint256 i = 0; i < keys.length; i++) {
            _set(keys[i], values[i], tokenId);
        }
    }

    function _setByHash(
        uint256 keyHash,
        string calldata value,
        uint256 tokenId
    ) internal {
        require(_existsKey(keyHash), 'RecordStorage: KEY_NOT_FOUND');
        _set(keyHash, getKey(keyHash), value, tokenId);
    }

    function _setManyByHash(
        uint256[] calldata keyHashes,
        string[] calldata values,
        uint256 tokenId
    ) internal {
        for (uint256 i = 0; i < keyHashes.length; i++) {
            _setByHash(keyHashes[i], values[i], tokenId);
        }
    }

    function _reconfigure(
        string[] calldata keys,
        string[] calldata values,
        uint256 tokenId
    ) internal {
        _reset(tokenId);
        _setMany(keys, values, tokenId);
    }

    function _reset(uint256 tokenId) internal {
        _tokenPresets[tokenId] = uint256(keccak256(abi.encodePacked(_presetOf(tokenId))));
        emit ResetRecords(tokenId);
    }

    function _get(string memory key, uint256 tokenId) private view returns (string memory) {
        return _get(uint256(keccak256(abi.encodePacked(key))), tokenId);
    }

    function _getByHash(uint256 keyHash, uint256 tokenId)
        private
        view
        returns (string memory key, string memory value)
    {
        key = getKey(keyHash);
        value = _get(keyHash, tokenId);
    }

    function _get(uint256 keyHash, uint256 tokenId) private view returns (string memory) {
        return _records[_presetOf(tokenId)][keyHash];
    }

    function _set(
        uint256 keyHash,
        string memory key,
        string memory value,
        uint256 tokenId
    ) private {
        if (bytes(_records[_presetOf(tokenId)][keyHash]).length == 0) {
            emit NewKey(tokenId, key, key);
        }

        _records[_presetOf(tokenId)][keyHash] = value;
        emit Set(tokenId, key, value, key, value);
    }
}

pragma solidity ^0.8.0;

abstract contract WhiteList is AdminControl {

    mapping(address => uint256) public _whiteList;
	
	bool public isWhiteListActive = false;
	
	bool public isWhiteList4Discount = false; // WL for discount
	
	uint256 public WhiteListDiscount = 0; // percent

    function setWhiteListActive(bool _isWhiteListActive) external onlyOwner {
        isWhiteListActive = _isWhiteListActive;
    }
	
	function setWhiteList4Discount() external onlyOwner {
        isWhiteList4Discount = !isWhiteList4Discount;
    }
	
	function setWhiteListDiscount(uint256 amount) external onlyOwner {
        WhiteListDiscount = amount;
    }

    function addWhiteLists(address[] calldata accounts, uint256 numbers) external onlyMinterController {
        for (uint256 i = 0; i < accounts.length; i++) 
		{
            _whiteList[accounts[i]] = numbers;
        }
    }
	
	function addWhiteList(address account, uint256 numbers) external onlyMinterController {
        _whiteList[account] = numbers;
    }
	
	function numberInWhiteList(address addr) external view returns (uint256) {
        return _whiteList[addr];
    }
	
	function chkInWhiteList(address addr) external view returns (bool) {
        return _whiteList[addr] > 0;
    }
}

abstract contract BookingList is AdminControl {

    mapping(bytes => string) public _bookingList;
	
	bool public _isBookingListActive = false;

    function setBookingListActive() external onlyOwner {
        _isBookingListActive = !_isBookingListActive;
    }

    function addBookingLists(string[] calldata names) external onlyMinterController {
        for (uint256 i = 0; i < names.length; i++) 
		{
            _bookingList[bytes(names[i])] = names[i];
        }
    }
	
	function addBookingList(string calldata name) external onlyMinterController {
        _bookingList[bytes(name)] = name;
    }
	
	function removeBookingList(string calldata name) external onlyMinterController {
		delete _bookingList[bytes(name)];
    }
	
	function chkInBookingList(string calldata name) external view returns (bool) {
		string memory _name = _bookingList[bytes(name)];
        return bytes(_name).length > 0;
    }
}


pragma solidity ^0.8.0;

contract Web3Domains is ERC721, ERC721Enumerable, AdminControl, RecordStorage, WhiteList, BookingList
{
	using SafeMath for uint256;
	 
	using EnumerableSet for EnumerableSet.UintSet;  
	
	event NewURI(uint256 indexed tokenId, string tokenUri);
		
	mapping (uint256 => EnumerableSet.UintSet) private _subTokens;

	mapping (uint256 => string) public _tokenURIs;
	
	mapping(uint256 => bytes) public _nativeAddress;
	
	mapping (uint256 => address) internal _tokenResolvers;
	
	mapping(address => uint256) private _tokenReverses;

    mapping(uint256 => string) private _tlds;
	
	string private _nftBaseURI = "";
	
	bool public _saleIsActive = true;
	
	bool public _saleTwoCharIsActive = false;
	
	bool public _saleOneCharIsActive = false;

	uint256 private _price = 1;
	
	uint256 private _1chartimes = 1000;
	
	uint256 private _2chartimes = 100;
	
	uint256 private _3chartimes = 20;
	
	uint256 private _4chartimes = 5;
	
	uint256 private _5chartimes = 1;
	
    modifier onlyApprovedOrOwner(uint256 tokenId) {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId)
        );
        _;
    }
	
	constructor() ERC721("BitTorrent Web3 Domains", "BWD") {
		
	}
	
    function isApprovedOrOwner(address account, uint256 tokenId) external view returns(bool)  {
        return _isApprovedOrOwner(account, tokenId);
    }
	
	
	function getOwner(string memory domain) external view returns (address)  {
		string memory _domain = StringUtil.toLower(domain);
	    uint256 tokenId = uint256(keccak256(abi.encodePacked(_domain)));
        return ownerOf(tokenId);
    }
	
	function getDomainbyAddress(address account) external view returns (uint256[] memory tokenIds,  string[] memory domains)  {
		uint256 _balance = balanceOf(account);
        require(_balance > 0, "");	
        uint256[] memory _tokenIds = new uint256[](_balance);
        string[] memory _domains = new string[](_balance);
        for (uint256 i = 0; i < _balance; i++) {
            uint256 tokenId = tokenOfOwnerByIndex(account, i);
            string memory domain = _tokenURIs[tokenId];
            _tokenIds[i] = tokenId;
            _domains[i] = domain;
        }
        tokenIds = _tokenIds;
        domains = _domains;
    }
	
		
	function exists(uint256 tokenId) external view returns (bool) {
        return _exists(tokenId);
    }


	function getPrice() public view returns (uint256) {
        return _price;
    }
	
	function getPrice2Char() public view returns (uint256) {
        return getPrice().mul(_2chartimes);
    }
	
	function getPrice3Char() public view returns (uint256) {
        return getPrice().mul(_3chartimes);
    }
	
	function getPrice4Char() public view returns (uint256) {
        return getPrice().mul(_4chartimes);
    }
	
	function get2charTimes() public view returns (uint256) {
        return _2chartimes;
    }
	
	function get3charTimes() public view returns (uint256) {
        return _3chartimes;
    }
	
	function get4charTimes() public view returns (uint256) {
        return _4chartimes;
    }
	
	function setTimes(uint256 _1chartimenew, uint256 _2chartimenew, uint256 _3chartimenew, uint256 _4chartimenew) public onlyOwner {
		_1chartimes = _1chartimenew;
		_2chartimes = _2chartimenew;
        _3chartimes = _3chartimenew;
		_4chartimes = _4chartimenew;
    }
	
	function setPrice(uint256 price) public onlyOwner {
        _price = price;
    }
	
	function setSaleStateTwoChar() public onlyOwner {
        _saleTwoCharIsActive = !_saleTwoCharIsActive;
    }
	
	function setSaleStateOneChar() public onlyOwner {
        _saleOneCharIsActive = !_saleOneCharIsActive;
    }
	
	function setTLD(string memory _tld) public onlyOwner {
        uint256 tokenId = genTokenId(_tld);
		_tlds[tokenId] = _tld;
    }
	
	function isTLD(string memory _tld) public view returns (bool) {
		bool isExist = false;
        uint256 tokenId = genTokenId(_tld);
		if (bytes(_tlds[tokenId]).length != 0){
            isExist = true;
        }
		return isExist;
	}
	
	function setSaleState() public onlyOwner {
        _saleIsActive = !_saleIsActive;
    }
	
	function _baseURI() internal view override returns (string memory) {
        return _nftBaseURI;
    }
    
    function setBaseURI(string memory _uri) external onlyOwner {
        _nftBaseURI = _uri;
    }
	
	function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];

        // If there is no base URI, return the token URI.
		string memory baseURI = _baseURI();
        if (bytes(baseURI).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(baseURI, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(baseURI, tokenId));
    }

	function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
	

	function buyDomain(string memory domain, string memory tld) external payable 
	{
		require(_saleIsActive, "Sale must be active to buy");
		
		require(bytes(tld).length != 0, "Top level domain must be non-empty");
		
		require(isTLD(tld) == true, "Top level domain not exist");
		
		require(StringUtil.dotCount(domain) == 0, "Domains cannot contain dot");
		
		uint256 _length = bytes(domain).length;
		
		require(_length != 0, "Domain must be non-empty");	
		
		//require(_length >= 1, "Domain requires at least 1 characters");	
		
		  // Check BookingList
		if (_isBookingListActive == true){
			string memory name = _bookingList[bytes(domain)];
			require(bytes(name).length == 0, "This name is already reserved");
		}
		
		uint256 _WhiteListDiscount = 0;
	    // Check WhiteList
		if (isWhiteListActive == true){
			uint256 numbers = _whiteList[msg.sender];
			if (isWhiteList4Discount == false){
				require(numbers > 0, "The address is not in the Whitelist");
				require(numbers >= balanceOf(msg.sender), "Exceeded max available to purchase");
			}
			else{
				if (numbers > 0){
					_WhiteListDiscount = WhiteListDiscount;
				}
			}
		}
		
		if (_length == 1)
		{
			require(_saleOneCharIsActive == true, "1 Character domain names need to be allowed to buy");
			
			uint256 __price1 = getPrice().mul(_1chartimes);
			if (_WhiteListDiscount > 0){
				__price1 = __price1 * ((100-_WhiteListDiscount)/100);
			}
	
			require(msg.value >= __price1, "Insufficient Token or Token value sent is not correct");
		}
		
		if (_length == 2)
		{
			require(_saleTwoCharIsActive == true, "2 Character domain names need to be allowed to buy");
			uint256 __price2 = getPrice().mul(_2chartimes);
			if (_WhiteListDiscount > 0){
				__price2 = __price2 * ((100-_WhiteListDiscount)/100);
			}
			
			require(msg.value >= __price2, "Insufficient Token or Token value sent is not correct");
		}
	
		if (_length == 3)
		{
			uint256 __price3 = getPrice().mul(_3chartimes);
			if (_WhiteListDiscount > 0){
				__price3 = __price3 * ((100-_WhiteListDiscount)/100);
			}
			require(msg.value >= __price3, "Insufficient Token or Token value sent is not correct");
		}
		
		if (_length == 4)
		{
			uint256 __price4 = getPrice().mul(_4chartimes);
			if (_WhiteListDiscount > 0){
				__price4 = __price4 * ((100-_WhiteListDiscount)/100);
			}
			require(msg.value >= __price4, "Insufficient Token or Token value sent is not correct");
		}
		
		if (_length >= 5)
		{
			uint256 __price5 = getPrice();
			if (_WhiteListDiscount > 0){
				__price5 = __price5 * ((100-_WhiteListDiscount)/100);
			}
			require(msg.value >= __price5, "Insufficient Token or Token value sent is not correct");
		}
		
		string memory _domain = StringUtil.toLower(domain);
		
		string memory _tld = StringUtil.toLower(tld);
		
		_domain = string(abi.encodePacked(_domain, ".", _tld));
		
		uint256 tokenId = genTokenId(_domain);
		
		require (!_exists(tokenId), "Domain already exists");
		
	   _safeMint(msg.sender, tokenId);
	   
	   _setTokenURI(tokenId, _domain);
	   
	   emit NewURI(tokenId, _domain);
    }
	
	function registerDomainBatch(address[] calldata owners, string[] memory domains, string memory tld) external onlyMinterController 
	{
		for (uint256 i = 0; i < owners.length; i++) 
		{
            string memory domain = domains[i];
			
			address owner = owners[i];
			
			if (bytes(domain).length > 0 && owner != address(0))
			{
				uint256 tokenId = genTokenId(domain);
				if (!_exists(tokenId))
				{
					_registerDomain(owner, domain, tld);
				}
			}
        }
	}
	
	function registerDomain(address to, string memory domain, string memory tld) external onlyMinterController 
	{
		_registerDomain(to, domain, tld);
    }

	function _registerDomain(address to, string memory domain, string memory tld) internal
	{
		require(to != address(0), "To address is null");
		
		require(bytes(tld).length != 0, "Top level domain must be non-empty");
		
		require(isTLD(tld) == true, "Top level domain not exist");
		
		require(bytes(domain).length != 0, "Domain must be non-empty");	
		
		require(StringUtil.dotCount(domain) == 0, "Domain not support");

		string memory _domain = StringUtil.toLower(domain);

		string memory _tld = StringUtil.toLower(tld);
		
		_domain = string(abi.encodePacked(_domain, ".", _tld));

		uint256 tokenId = genTokenId(_domain);
		
		require (!_exists(tokenId), "Domain already exists");
		
       _safeMint(to, tokenId);
	   
	   _setTokenURI(tokenId, _domain);
	   
	   emit NewURI(tokenId, _domain);
    }

	function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override(IERC721, ERC721)  {

        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
		
		_reset(tokenId);
		
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override(IERC721, ERC721)  {
        safeTransferFrom(from, to, tokenId, "");
    }


    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override(IERC721, ERC721) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
		
		_reset(tokenId);
		
        _safeTransfer(from, to, tokenId, _data);
    }
		
	function burn(uint256 tokenId) public virtual {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
		
		if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
		
		if (_tokenReverses[_msgSender()] != 0) {
            delete _tokenReverses[_msgSender()];
        }
		
		if (_tokenResolvers[tokenId] != address(0)) {
            delete _tokenResolvers[tokenId];
        }
		
		_reset(tokenId);

        _burn(tokenId);
    }

    function setOwner(address to, uint256 tokenId) external onlyApprovedOrOwner(tokenId) {
        _transfer(ownerOf(tokenId), to, tokenId);
    }
	
	/**
     * Begin: set and get Reverses
     */
	function reverseOf(address account) public view returns (string memory){
        uint256 tokenId = _tokenReverses[account];
        require(tokenId != 0, 'ReverseResolver: REVERSE_RECORD_IS_EMPTY');
        require(_isApprovedOrOwner(account, tokenId), 'ReverseResolver: ACCOUNT_IS_NOT_APPROVED_OR_OWNER');
        return _tokenURIs[tokenId];
    }
	
	function setReverse(uint256 tokenId) public {
        address _sender = _msgSender();
        require(_isApprovedOrOwner(_sender, tokenId), 'ReverseResolver: SENDER_IS_NOT_APPROVED_OR_OWNER');
        _tokenReverses[_sender] = tokenId;
    }
	
	function setReverse(string memory domain) public {
		uint256 tokenId = genTokenId(domain);
        address _sender = _msgSender();
        require(_isApprovedOrOwner(_sender, tokenId), 'ReverseResolver: SENDER_IS_NOT_APPROVED_OR_OWNER');
        _tokenReverses[_sender] = tokenId;
    }
	
	function removeReverse() public {
        address _sender = _msgSender();
        uint256 tokenId = _tokenReverses[_sender];
        require(tokenId != 0, 'ReverseResolver: REVERSE_RECORD_IS_EMPTY');
        delete _tokenReverses[_sender];
    }
	/**
     * End: set and get Reverses
     */
	 
	/**
     * Begin: Subdomain
     */
    function registerSubDomain(address to, uint256 tokenId, string memory sub) external 
        onlyApprovedOrOwner(tokenId) 
    {
        _safeMintSubDomain(to, tokenId, sub, "");
    }
	
	function registerSubDomainOwner(address to, uint256 tokenId, string memory sub) external onlyMinterController
    {
        _safeMintSubDomain(to, tokenId, sub, "");
    }
	
    function burnSubDomain(uint256 tokenId, string memory sub) external onlyApprovedOrOwner(tokenId) 
	{
        _burnSubDomain(tokenId, sub);
    }
	
	function _safeMintSubDomain(address to, uint256 tokenId, string memory sub, bytes memory _data) internal {
		require(to != address(0));
        require (bytes(sub).length != 0);
        require (StringUtil.dotCount(sub) == 0);
        require (_exists(tokenId));
		
		string memory _sub = StringUtil.toLower(sub);
		
        bytes memory _newUri = abi.encodePacked(_sub, ".", _tokenURIs[tokenId]);
		
		uint256 _newTokenId = genTokenId(string(_newUri));
		
		require (!_exists(_newTokenId), "Domain already exists");

        uint256 count = StringUtil.dotCount(_tokenURIs[tokenId]);
		
        if (count == 1) 
		{
            _subTokens[tokenId].add(_newTokenId);
        }

        if (bytes(_data).length != 0) {
            _safeMint(to, _newTokenId, _data);
        } else {
            _safeMint(to, _newTokenId);
        }
        
        _setTokenURI(_newTokenId, string(_newUri));

        emit NewURI(_newTokenId, string(_newUri));
    }
	
	function _burnSubDomain(uint256 tokenId, string memory sub) internal {
        string memory _sub = StringUtil.toLower(sub);
		
        bytes memory _newUri = abi.encodePacked(_sub, ".", _tokenURIs[tokenId]);
		
		uint256 _newTokenId = genTokenId(string(_newUri));
        // remove sub tokenIds itself
        _subTokens[tokenId].remove(_newTokenId);
		
		if (bytes(_tokenURIs[_newTokenId]).length != 0) {
            delete _tokenURIs[_newTokenId];
        }
		
        super._burn(_newTokenId);
    }
	function subTokenIdCount(uint256 tokenId) public view returns (uint256) {
        require (_exists(tokenId));
        return _subTokens[tokenId].length();
    }
	
	function subTokenIdByIndex(uint256 tokenId, uint256 index) public view returns (uint256) {
        require (subTokenIdCount(tokenId) > index);
        return _subTokens[tokenId].at(index);
    }
	/**
     * End:Subdomain
     */

  
	/**
     * Begin: System
     */
	function genTokenId(string memory label) public pure returns(uint256)  {
        require (bytes(label).length != 0);
        return uint256(keccak256(abi.encodePacked(label)));
    }

    
	function withdraw() external payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
	
	function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
		super._beforeTokenTransfer(from, to, tokenId);
	}

	function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
		return super.supportsInterface(interfaceId);
	}
	/**
     * End: System
     */
	/**
     * Begin: working with metadata like: avatar, cover, email, phone, address, social ...
     */
	function set(
        string calldata key,
        string calldata value,
        uint256 tokenId
    ) external onlyApprovedOrOwner(tokenId)  {
        _set(key, value, tokenId);
    }

    function setMany(
        string[] calldata keys,
        string[] calldata values,
        uint256 tokenId
    ) external onlyApprovedOrOwner(tokenId)  {
        _setMany(keys, values, tokenId);
    }

    function setByHash(
        uint256 keyHash,
        string calldata value,
        uint256 tokenId
    ) external override onlyApprovedOrOwner(tokenId)  {
        _setByHash(keyHash, value, tokenId);
    }

    function setManyByHash(
        uint256[] calldata keyHashes,
        string[] calldata values,
        uint256 tokenId
    ) external override onlyApprovedOrOwner(tokenId)  {
        _setManyByHash(keyHashes, values, tokenId);
    }

    function reconfigure(
        string[] calldata keys,
        string[] calldata values,
        uint256 tokenId
    ) external override onlyApprovedOrOwner(tokenId) {
        _reconfigure(keys, values, tokenId);
    }

    function reset(uint256 tokenId) external override onlyApprovedOrOwner(tokenId) {
        _reset(tokenId);
    }
	/**
     * End: metadata
     */
}

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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"keyIndex","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"NewKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenUri","type":"string"}],"name":"NewURI","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ResetRecords","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"keyIndex","type":"string"},{"indexed":true,"internalType":"string","name":"valueIndex","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"Set","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":[],"name":"WhiteListDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"_bookingList","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isBookingListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_nativeAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleOneCharIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleTwoCharIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whiteList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"addBookingList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"names","type":"string[]"}],"name":"addBookingLists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"addKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"numbers","type":"uint256"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"numbers","type":"uint256"}],"name":"addWhiteLists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"burnSubDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"},{"internalType":"string","name":"tld","type":"string"}],"name":"buyDomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"chkInBookingList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"chkInWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"label","type":"string"}],"name":"genTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"get","outputs":[{"internalType":"string","name":"value","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get2charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get3charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get4charTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getByHash","outputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDomainbyAddress","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"domains","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"}],"name":"getKey","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"hashes","type":"uint256[]"}],"name":"getKeys","outputs":[{"internalType":"string[]","name":"values","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMany","outputs":[{"internalType":"string[]","name":"values","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"keyHashes","type":"uint256[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getManyByHash","outputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice2Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice3Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice4Char","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tld","type":"string"}],"name":"isTLD","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteList4Discount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numberInWhiteList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reconfigure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"domain","type":"string"},{"internalType":"string","name":"tld","type":"string"}],"name":"registerDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"string[]","name":"domains","type":"string[]"},{"internalType":"string","name":"tld","type":"string"}],"name":"registerDomainBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"registerSubDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"registerSubDomainOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"removeBookingList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeReverse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"reverseOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeMinterRole","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":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBookingListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setByHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"keyHashes","type":"uint256[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setManyByHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setReverse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"}],"name":"setReverse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleStateOneChar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleStateTwoChar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tld","type":"string"}],"name":"setTLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_1chartimenew","type":"uint256"},{"internalType":"uint256","name":"_2chartimenew","type":"uint256"},{"internalType":"uint256","name":"_3chartimenew","type":"uint256"},{"internalType":"uint256","name":"_4chartimenew","type":"uint256"}],"name":"setTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhiteList4Discount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhiteListActive","type":"bool"}],"name":"setWhiteListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setWhiteListDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"subTokenIdByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"subTokenIdCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6010805461ffff19169055600060118190556013805460ff1916905560a0604081905260808290526200003691601a919062000295565b50601b805462ffffff19166001908117909155601c8190556103e8601d556064601e556014601f5560056020556021553480156200007357600080fd5b50604080518082018252601781527f426974546f7272656e74205765623320446f6d61696e730000000000000000006020808301918252835180850190945260038452621095d160ea1b908401528151919291620000d49160009162000295565b508051620000ea90600190602084019062000295565b50505062000107620001016200011860201b60201c565b6200011c565b62000112336200016e565b62000377565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200018981600c6200018c60201b620034191790919060201c565b50565b62000198828262000210565b15620001eb5760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650060448201526064015b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620002755760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401620001e2565b506001600160a01b03166000908152602091909152604090205460ff1690565b828054620002a3906200033b565b90600052602060002090601f016020900481019282620002c7576000855562000312565b82601f10620002e257805160ff191683800117855562000312565b8280016001018555821562000312579182015b8281111562000312578251825591602001919060010190620002f5565b506200032092915062000324565b5090565b5b8082111562000320576000815560010162000325565b600181811c908216806200035057607f821691505b6020821081036200037157634e487b7160e01b600052602260045260246000fd5b50919050565b615e6880620003876000396000f3fe6080604052600436106105025760003560e01c806369e2f0fb11610297578063b88d4fde11610165578063d439daa2116100cc578063ec129eea11610085578063ec129eea14610fd7578063eceb7d5214610ff7578063f25eb5c114611017578063f2fde38b1461102c578063f5c1f76e1461104c578063f6283ad41461106c57600080fd5b8063d439daa214610ee1578063e44c8fe314610f19578063e5f9da8814610f39578063e985e9c514610f59578063ea51819b14610fa2578063ea7b25be14610fc257600080fd5b8063c7bc6d681161011e578063c7bc6d6814610e3d578063c87b56dd14610e57578063c8b1df2a14610e77578063cc82d4f714610e8c578063ce92b33e14610eac578063d231563014610ecc57600080fd5b8063b88d4fde14610d7a578063bb5b27e114610d9a578063bc7c8ceb14610dba578063bcba4c1b14610de8578063c479a80414610e08578063c6438cb814610e2857600080fd5b80638c65480d116102095780639cbf529d116101c25780639cbf529d14610c96578063a22cb46514610cb6578063a736868b14610cd6578063ab3b87fe14610d0c578063ad59e22614610d2c578063b85afd2814610d4c57600080fd5b80638c65480d14610bf95780638da5cb5b14610c0e57806391b7f5ed14610c2c57806395d89b4114610c4c57806398a6024314610c6157806398d5fdca14610c8157600080fd5b806376f909ae1161025b57806376f909ae14610b3957806377e9d00b14610b595780637ce4538314610b795780637e37479e14610b995780637ef09bca14610bb95780638c1e374414610bd957600080fd5b806369e2f0fb14610aaf5780636bc2290f14610acf5780636e2db8d714610ae457806370a0823114610b04578063715018a614610b2457600080fd5b80633f6e7241116103d45780634cd637b51161034657806355f804b3116102ff57806355f804b3146109fa578063573f5dae14610a1a5780635d893ba014610a345780636352211e14610a4e5780636506437014610a6e578063672b9f8114610a8157600080fd5b80634cd637b5146109455780634f558e791461095a5780634f6ccce71461097a57806350382c1a1461099a57806350b3a144146109ba578063559f7414146109da57600080fd5b8063434d8aca11610398578063434d8aca1461089a5780634500d449146108ba5780634668b303146108cf57806347c81699146108e55780634a72584d146109055780634aaf4a121461092557600080fd5b80633f6e7241146107fb578063426932c71461081a57806342842e0e1461083a57806342966c681461085a578063430c20811461087a57600080fd5b80631be5e7ed116104785780632f745c59116104315780632f745c591461075e578063310bd74b1461077e578063358deb1c1461079e578063384e9a55146107b35780633ccfd60b146107d35780633dd1eb61146107db57600080fd5b80631be5e7ed146106a95780631ed40559146106c95780632319afde146106de57806323b872dd146106fe57806327f189751461071e5780632dc50d9a1461073e57600080fd5b8063095ea7b3116104ca578063095ea7b3146105f05780630bb78ec1146106125780630ea2f89e14610632578063157c61381461065257806318160ddd146106675780631bd8cc1a1461067c57600080fd5b806301ffc9a7146105075780630302e9531461053c57806305d60ffb1461055b57806306fdde0314610596578063081812fc146105b8575b600080fd5b34801561051357600080fd5b50610527610522366004614efd565b61108c565b60405190151581526020015b60405180910390f35b34801561054857600080fd5b50601b5461052790610100900460ff1681565b34801561056757600080fd5b50610588610576366004614f36565b600f6020526000908152604090205481565b604051908152602001610533565b3480156105a257600080fd5b506105ab61109d565b6040516105339190614fa9565b3480156105c457600080fd5b506105d86105d3366004614fbc565b61112f565b6040516001600160a01b039091168152602001610533565b3480156105fc57600080fd5b5061061061060b366004614fd5565b6111bc565b005b34801561061e57600080fd5b506105ab61062d366004614fbc565b6112d1565b34801561063e57600080fd5b50601b546105279062010000900460ff1681565b34801561065e57600080fd5b5061058861136b565b34801561067357600080fd5b50600854610588565b34801561068857600080fd5b5061069c61069736600461504a565b611387565b60405161053391906150ea565b3480156106b557600080fd5b506105ab6106c436600461513e565b61147d565b3480156106d557600080fd5b506106106114c8565b3480156106ea57600080fd5b506106106106f9366004615175565b611506565b34801561070a57600080fd5b506106106107193660046151b6565b6115bb565b34801561072a57600080fd5b506106106107393660046151f2565b6115f6565b34801561074a57600080fd5b50610588610759366004615265565b61161e565b34801561076a57600080fd5b50610588610779366004614fd5565b611653565b34801561078a57600080fd5b50610610610799366004614fbc565b6116e9565b3480156107aa57600080fd5b50601f54610588565b3480156107bf57600080fd5b506106106107ce366004614fbc565b611709565b61061061174a565b3480156107e757600080fd5b506106106107f6366004614f36565b61179a565b34801561080757600080fd5b5060105461052790610100900460ff1681565b34801561082657600080fd5b5061061061083536600461504a565b6117d0565b34801561084657600080fd5b506106106108553660046151b6565b61185e565b34801561086657600080fd5b50610610610875366004614fbc565b611879565b34801561088657600080fd5b50610527610895366004614fd5565b611990565b3480156108a657600080fd5b506105ab6108b536600461533c565b61199c565b3480156108c657600080fd5b506106106119c0565b3480156108db57600080fd5b5061058860115481565b3480156108f157600080fd5b50610610610900366004615370565b611a07565b34801561091157600080fd5b506106106109203660046153d1565b611a27565b34801561093157600080fd5b506105d861094036600461533c565b611a4d565b34801561095157600080fd5b50610588611a92565b34801561096657600080fd5b50610527610975366004614fbc565b611aa3565b34801561098657600080fd5b50610588610995366004614fbc565b611aae565b3480156109a657600080fd5b506106106109b536600461533c565b611b41565b3480156109c657600080fd5b506105886109d536600461533c565b611b74565b3480156109e657600080fd5b506106106109f5366004615423565b611bb3565b348015610a0657600080fd5b50610610610a1536600461533c565b611c06565b348015610a2657600080fd5b506010546105279060ff1681565b348015610a4057600080fd5b50601b546105279060ff1681565b348015610a5a57600080fd5b506105d8610a69366004614fbc565b611c43565b610610610a7c366004615458565b611cba565b348015610a8d57600080fd5b50610aa1610a9c366004615265565b6123f0565b6040516105339291906154bb565b348015610abb57600080fd5b50610610610aca366004614f36565b612408565b348015610adb57600080fd5b50601e54610588565b348015610af057600080fd5b50610610610aff366004614fd5565b61243b565b348015610b1057600080fd5b50610588610b1f366004614f36565b61247c565b348015610b3057600080fd5b50610610612503565b348015610b4557600080fd5b50610588610b54366004614fbc565b612537565b348015610b6557600080fd5b50610610610b743660046154e9565b612562565b348015610b8557600080fd5b50610610610b94366004615423565b612592565b348015610ba557600080fd5b506105ab610bb4366004614f36565b6125e3565b348015610bc557600080fd5b50610527610bd4366004614f36565b61272d565b348015610be557600080fd5b50610610610bf436600461555c565b61273a565b348015610c0557600080fd5b5061061061280d565b348015610c1a57600080fd5b50600b546001600160a01b03166105d8565b348015610c3857600080fd5b50610610610c47366004614fbc565b612854565b348015610c5857600080fd5b506105ab612883565b348015610c6d57600080fd5b50610610610c7c36600461566a565b612892565b348015610c8d57600080fd5b50601c54610588565b348015610ca257600080fd5b50610610610cb136600461533c565b6128c0565b348015610cc257600080fd5b50610610610cd13660046156c6565b61290f565b348015610ce257600080fd5b50610588610cf1366004614f36565b6001600160a01b03166000908152600f602052604090205490565b348015610d1857600080fd5b50610610610d27366004614fd5565b6129d3565b348015610d3857600080fd5b50610610610d4736600461533c565b6129f9565b348015610d5857600080fd5b50610d6c610d6736600461504a565b612a52565b6040516105339291906156f0565b348015610d8657600080fd5b50610610610d95366004615715565b612b74565b348015610da657600080fd5b506105ab610db5366004614fbc565b612baf565b348015610dc657600080fd5b50610dda610dd5366004614f36565b612c51565b604051610533929190615770565b348015610df457600080fd5b506105ab610e03366004614fbc565b612e34565b348015610e1457600080fd5b50610610610e233660046157c7565b612e4d565b348015610e3457600080fd5b50610588612e6a565b348015610e4957600080fd5b506013546105279060ff1681565b348015610e6357600080fd5b506105ab610e72366004614fbc565b612e7b565b348015610e8357600080fd5b50610610612fe4565b348015610e9857600080fd5b50610610610ea736600461566a565b61302d565b348015610eb857600080fd5b50610610610ec73660046151f2565b61306d565b348015610ed857600080fd5b50602054610588565b348015610eed57600080fd5b50610527610efc366004614f36565b6001600160a01b03166000908152600f6020526040902054151590565b348015610f2557600080fd5b50610610610f34366004614fbc565b61308d565b348015610f4557600080fd5b50610527610f5436600461533c565b6130bc565b348015610f6557600080fd5b50610527610f74366004615803565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610fae57600080fd5b50610610610fbd36600461582d565b6130f9565b348015610fce57600080fd5b50610610613137565b348015610fe357600080fd5b50610610610ff23660046151f2565b613175565b34801561100357600080fd5b5061061061101236600461585f565b613195565b34801561102357600080fd5b506106106131d2565b34801561103857600080fd5b50610610611047366004614f36565b61321d565b34801561105857600080fd5b5061069c611067366004615175565b6132b5565b34801561107857600080fd5b50610527611087366004615423565b613361565b600061109782613495565b92915050565b6060600080546110ac9061587a565b80601f01602080910402602001604051908101604052809291908181526020018280546110d89061587a565b80156111255780601f106110fa57610100808354040283529160200191611125565b820191906000526020600020905b81548152906001019060200180831161110857829003601f168201915b5050505050905090565b600061113a826134ba565b6111a05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006111c782611c43565b9050806001600160a01b0316836001600160a01b0316036112345760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401611197565b336001600160a01b038216148061125057506112508133610f74565b6112c25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401611197565b6112cc83836134d7565b505050565b601560205260009081526040902080546112ea9061587a565b80601f01602080910402602001604051908101604052809291908181526020018280546113169061587a565b80156113635780601f1061133857610100808354040283529160200191611363565b820191906000526020600020905b81548152906001019060200180831161134657829003601f168201915b505050505081565b6000611382601e5461137c601c5490565b90613545565b905090565b6060826001600160401b038111156113a1576113a1615287565b6040519080825280602002602001820160405280156113d457816020015b60608152602001906001900390816113bf5790505b50905060005b83811015611475576114458585838181106113f7576113f76158b4565b905060200281019061140991906158ca565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250613551915050565b828281518110611457576114576158b4565b6020026020010181905250808061146d90615926565b9150506113da565b509392505050565b60606114c084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613551915050565b949350505050565b600b546001600160a01b031633146114f25760405162461bcd60e51b81526004016111979061593f565b601b805460ff19811660ff90911615179055565b61150f3361272d565b61152b5760405162461bcd60e51b815260040161119790615974565b60005b818110156112cc57828282818110611548576115486158b4565b905060200281019061155a91906158ca565b601285858581811061156e5761156e6158b4565b905060200281019061158091906158ca565b60405161158e9291906159be565b9081526040519081900360200190206115a8929091614da4565b50806115b381615926565b91505061152e565b6115c6335b82613586565b6115e25760405162461bcd60e51b8152600401611197906159ce565b6115eb8161366c565b6112cc8383836136d9565b80611600336115c0565b61160957600080fd5b6116168686868686613884565b505050505050565b60008161162a84612537565b1161163457600080fd5b600083815260146020526040902061164c90836138e7565b9392505050565b600061165e8361247c565b82106116c05760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401611197565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b806116f3336115c0565b6116fc57600080fd5b6117058261366c565b5050565b336117148183613586565b6117305760405162461bcd60e51b815260040161119790615a1f565b6001600160a01b0316600090815260186020526040902055565b600b546001600160a01b031633146117745760405162461bcd60e51b81526004016111979061593f565b60405133904780156108fc02916000818181858888f1935050505061179857600080fd5b565b600b546001600160a01b031633146117c45760405162461bcd60e51b81526004016111979061593f565b6117cd816138f3565b50565b6117d93361272d565b6117f55760405162461bcd60e51b815260040161119790615974565b60005b828110156118585781600f6000868685818110611817576118176158b4565b905060200201602081019061182c9190614f36565b6001600160a01b031681526020810191909152604001600020558061185081615926565b9150506117f8565b50505050565b6112cc83838360405180602001604052806000815250612b74565b611882336115c0565b6118e75760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401611197565b600081815260156020526040902080546119009061587a565b15905061191e57600081815260156020526040812061191e91614e24565b336000908152601860205260409020541561194457336000908152601860205260408120555b6000818152601760205260409020546001600160a01b03161561197e57600081815260176020526040902080546001600160a01b03191690555b6119878161366c565b6117cd816138fe565b600061164c8383613586565b8051602081830181018051601282529282019190930120915280546112ea9061587a565b600b546001600160a01b031633146119ea5760405162461bcd60e51b81526004016111979061593f565b601b805461ff001981166101009182900460ff1615909102179055565b80611a11336115c0565b611a1a57600080fd5b61161686868686866139a5565b80611a31336115c0565b611a3a57600080fd5b611a4685858585613a84565b5050505050565b600080611a5983613b24565b9050600081604051602001611a6e9190615a6f565b6040516020818303038152906040528051906020012060001c90506114c081611c43565b600061138260205461137c601c5490565b6000611097826134ba565b6000611ab960085490565b8210611b1c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401611197565b60088281548110611b2f57611b2f6158b4565b90600052602060002001549050919050565b6117cd81604051602001611b559190615a6f565b6040516020818303038152906040528051906020012060001c82613c7e565b60008151600003611b8457600080fd5b81604051602001611b959190615a6f565b60408051601f19818403018152919052805160209091012092915050565b611bbc3361272d565b611bd85760405162461bcd60e51b815260040161119790615974565b818160128484604051611bec9291906159be565b9081526040519081900360200190206112cc929091614da4565b600b546001600160a01b03163314611c305760405162461bcd60e51b81526004016111979061593f565b805161170590601a906020840190614e5e565b6000818152600260205260408120546001600160a01b0316806110975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401611197565b601b5460ff16611d0c5760405162461bcd60e51b815260206004820152601a60248201527f53616c65206d7573742062652061637469766520746f206275790000000000006044820152606401611197565b8051600003611d2d5760405162461bcd60e51b815260040161119790615a8b565b611d36816130bc565b1515600114611d875760405162461bcd60e51b815260206004820152601a60248201527f546f70206c6576656c20646f6d61696e206e6f742065786973740000000000006044820152606401611197565b611d9082613caa565b15611ddd5760405162461bcd60e51b815260206004820152601a60248201527f446f6d61696e732063616e6e6f7420636f6e7461696e20646f740000000000006044820152606401611197565b81516000819003611e2b5760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b6044820152606401611197565b60135460ff161515600103611f38576000601284604051611e4c9190615a6f565b90815260200160405180910390208054611e659061587a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e919061587a565b8015611ede5780601f10611eb357610100808354040283529160200191611ede565b820191906000526020600020905b815481529060010190602001808311611ec157829003601f168201915b505050505090508051600014611f365760405162461bcd60e51b815260206004820152601d60248201527f54686973206e616d6520697320616c72656164792072657365727665640000006044820152606401611197565b505b60105460009060ff16151560010361204257336000908152600f6020526040812054601054909161010090910460ff16151590036120345760008111611fcc5760405162461bcd60e51b815260206004820152602360248201527f5468652061646472657373206973206e6f7420696e207468652057686974656c6044820152621a5cdd60ea1b6064820152608401611197565b611fd53361247c565b81101561202f5760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b6064820152608401611197565b612040565b80156120405760115491505b505b8160010361212057601b5462010000900460ff1615156001146120c25760405162461bcd60e51b815260206004820152603260248201527f312043686172616374657220646f6d61696e206e616d6573206e65656420746f60448201527120626520616c6c6f77656420746f2062757960701b6064820152608401611197565b60006120d3601d5461137c601c5490565b905081156120fe5760646120e78382615acd565b6120f19190615ae4565b6120fb9082615b06565b90505b8034101561211e5760405162461bcd60e51b815260040161119790615b25565b505b816002036121fe57601b5460ff6101009091041615156001146121a05760405162461bcd60e51b815260206004820152603260248201527f322043686172616374657220646f6d61696e206e616d6573206e65656420746f60448201527120626520616c6c6f77656420746f2062757960701b6064820152608401611197565b60006121b1601e5461137c601c5490565b905081156121dc5760646121c58382615acd565b6121cf9190615ae4565b6121d99082615b06565b90505b803410156121fc5760405162461bcd60e51b815260040161119790615b25565b505b81600303612264576000612217601f5461137c601c5490565b9050811561224257606461222b8382615acd565b6122359190615ae4565b61223f9082615b06565b90505b803410156122625760405162461bcd60e51b815260040161119790615b25565b505b816004036122ca57600061227d60205461137c601c5490565b905081156122a85760646122918382615acd565b61229b9190615ae4565b6122a59082615b06565b90505b803410156122c85760405162461bcd60e51b815260040161119790615b25565b505b6005821061232a5760006122dd601c5490565b905081156123085760646122f18382615acd565b6122fb9190615ae4565b6123059082615b06565b90505b803410156123285760405162461bcd60e51b815260040161119790615b25565b505b600061233585613b24565b9050600061234285613b24565b90508181604051602001612357929190615b7a565b6040516020818303038152906040529150600061237383611b74565b905061237e816134ba565b1561239b5760405162461bcd60e51b815260040161119790615bb6565b6123a53382613d09565b6123af8184613d23565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516123df9190614fa9565b60405180910390a250505050505050565b6060806123fd8484613dac565b909590945092505050565b600b546001600160a01b031633146124325760405162461bcd60e51b81526004016111979061593f565b6117cd81613dcd565b6124443361272d565b6124605760405162461bcd60e51b815260040161119790615974565b6001600160a01b039091166000908152600f6020526040902055565b60006001600160a01b0382166124e75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401611197565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461252d5760405162461bcd60e51b81526004016111979061593f565b6117986000613dd8565b6000612542826134ba565b61254b57600080fd5b600082815260146020526040902061109790613e2a565b61256b3361272d565b6125875760405162461bcd60e51b815260040161119790615974565b6112cc838383613e34565b61259b3361272d565b6125b75760405162461bcd60e51b815260040161119790615974565b601282826040516125c99291906159be565b908152602001604051809103902060006117059190614e24565b6001600160a01b03811660009081526018602052604081205460609181900361261e5760405162461bcd60e51b815260040161119790615be5565b6126288382613586565b61268e5760405162461bcd60e51b815260206004820152603160248201527f526576657273655265736f6c7665723a204143434f554e545f49535f4e4f545f60448201527020a8282927ab22a22fa7a92fa7aba722a960791b6064820152608401611197565b600081815260156020526040902080546126a79061587a565b80601f01602080910402602001604051908101604052809291908181526020018280546126d39061587a565b80156127205780601f106126f557610100808354040283529160200191612720565b820191906000526020600020905b81548152906001019060200180831161270357829003601f168201915b5050505050915050919050565b6000611097600c83614056565b6127433361272d565b61275f5760405162461bcd60e51b815260040161119790615974565b60005b83811015611a4657600083828151811061277e5761277e6158b4565b60200260200101519050600086868481811061279c5761279c6158b4565b90506020020160208101906127b19190614f36565b9050600082511180156127cc57506001600160a01b03811615155b156127f85760006127dc83611b74565b90506127e7816134ba565b6127f6576127f6828487613e34565b505b5050808061280590615926565b915050612762565b600b546001600160a01b031633146128375760405162461bcd60e51b81526004016111979061593f565b6010805461ff001981166101009182900460ff1615909102179055565b600b546001600160a01b0316331461287e5760405162461bcd60e51b81526004016111979061593f565b601c55565b6060600180546110ac9061587a565b8161289c336115c0565b6128a557600080fd5b611858848484604051806020016040528060008152506140d9565b60006128cb82611b74565b9050336128d88183613586565b6128f45760405162461bcd60e51b815260040161119790615a1f565b6001600160a01b031660009081526018602052604090205550565b336001600160a01b038316036129675760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401611197565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b806129dd336115c0565b6129e657600080fd5b6112cc6129f283611c43565b84846136d9565b600b546001600160a01b03163314612a235760405162461bcd60e51b81526004016111979061593f565b6000612a2e82611b74565b600081815260196020908152604090912084519293506112cc929091850190614e5e565b606080836001600160401b03811115612a6d57612a6d615287565b604051908082528060200260200182016040528015612aa057816020015b6060815260200190600190039081612a8b5790505b509150836001600160401b03811115612abb57612abb615287565b604051908082528060200260200182016040528015612aee57816020015b6060815260200190600190039081612ad95790505b50905060005b84811015612b6b57612b1e868683818110612b1157612b116158b4565b9050602002013585613dac565b848381518110612b3057612b306158b4565b60200260200101848481518110612b4957612b496158b4565b6020026020010182905282905250508080612b6390615926565b915050612af4565b50935093915050565b612b7e3383613586565b612b9a5760405162461bcd60e51b8152600401611197906159ce565b612ba38261366c565b611858848484846142c9565b6000818152600a60205260409020805460609190612bcc9061587a565b80601f0160208091040260200160405190810160405280929190818152602001828054612bf89061587a565b8015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b50505050509050919050565b6060806000612c5f8461247c565b905060008111612c8b5760405162461bcd60e51b81526020600482015260006024820152604401611197565b6000816001600160401b03811115612ca557612ca5615287565b604051908082528060200260200182016040528015612cce578160200160208202803683370190505b5090506000826001600160401b03811115612ceb57612ceb615287565b604051908082528060200260200182016040528015612d1e57816020015b6060815260200190600190039081612d095790505b50905060005b83811015612e28576000612d388883611653565b600081815260156020526040812080549293509091612d569061587a565b80601f0160208091040260200160405190810160405280929190818152602001828054612d829061587a565b8015612dcf5780601f10612da457610100808354040283529160200191612dcf565b820191906000526020600020905b815481529060010190602001808311612db257829003601f168201915b5050505050905081858481518110612de957612de96158b4565b60200260200101818152505080848481518110612e0857612e086158b4565b602002602001018190525050508080612e2090615926565b915050612d24565b50909590945092505050565b601660205260009081526040902080546112ea9061587a565b81612e57336115c0565b612e6057600080fd5b6112cc83836142fc565b6000611382601f5461137c601c5490565b6060612e86826134ba565b612eea5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611197565b60008281526015602052604081208054612f039061587a565b80601f0160208091040260200160405190810160405280929190818152602001828054612f2f9061587a565b8015612f7c5780601f10612f5157610100808354040283529160200191612f7c565b820191906000526020600020905b815481529060010190602001808311612f5f57829003601f168201915b505050505090506000612f8d6143a8565b90508051600003612f9f575092915050565b815115612fd1578082604051602001612fb9929190615c2d565b60405160208183030381529060405292505050919050565b8084604051602001612fb9929190615c5c565b600b546001600160a01b0316331461300e5760405162461bcd60e51b81526004016111979061593f565b601b805462ff0000198116620100009182900460ff1615909102179055565b6130363361272d565b6130525760405162461bcd60e51b815260040161119790615974565b6112cc838383604051806020016040528060008152506140d9565b80613077336115c0565b61308057600080fd5b61161686868686866143b7565b600b546001600160a01b031633146130b75760405162461bcd60e51b81526004016111979061593f565b601155565b600080806130c984611b74565b60008181526019602052604090208054919250906130e69061587a565b1590506130f257600191505b5092915050565b600b546001600160a01b031633146131235760405162461bcd60e51b81526004016111979061593f565b601d93909355601e91909155601f55602055565b600b546001600160a01b031633146131615760405162461bcd60e51b81526004016111979061593f565b6013805460ff19811660ff90911615179055565b8061317f336115c0565b61318857600080fd5b6116168686868686614425565b600b546001600160a01b031633146131bf5760405162461bcd60e51b81526004016111979061593f565b6010805460ff1916911515919091179055565b33600081815260186020526040812054908190036132025760405162461bcd60e51b815260040161119790615be5565b506001600160a01b0316600090815260186020526040812055565b600b546001600160a01b031633146132475760405162461bcd60e51b81526004016111979061593f565b6001600160a01b0381166132ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611197565b6117cd81613dd8565b6060816001600160401b038111156132cf576132cf615287565b60405190808252806020026020018201604052801561330257816020015b60608152602001906001900390816132ed5790505b50905060005b828110156130f257613331848483818110613325576133256158b4565b90506020020135612baf565b828281518110613343576133436158b4565b6020026020010181905250808061335990615926565b915050613308565b600080601284846040516133769291906159be565b9081526020016040518091039020805461338f9061587a565b80601f01602080910402602001604051908101604052809291908181526020018280546133bb9061587a565b80156134085780601f106133dd57610100808354040283529160200191613408565b820191906000526020600020905b8154815290600101906020018083116133eb57829003601f168201915b505092511515979650505050505050565b6134238282614056565b156134705760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006044820152606401611197565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b148061109757506110978261443b565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061350c82611c43565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061164c8284615b06565b606061164c836040516020016135679190615a6f565b6040516020818303038152906040528051906020012060001c8361448b565b6000613591826134ba565b6135f25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611197565b60006135fd83611c43565b9050806001600160a01b0316846001600160a01b031614806136385750836001600160a01b031661362d8461112f565b6001600160a01b0316145b806114c057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166114c0565b6136758161454a565b60405160200161368791815260200190565b60408051601f1981840301815282825280516020918201206000858152600e9092529181209190915582917f185c30856dadb58bf097c1f665a52ada7029752dbcad008ea3fefc73bee8c9fe9190a250565b826001600160a01b03166136ec82611c43565b6001600160a01b0316146137545760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401611197565b6001600160a01b0382166137b65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401611197565b6137c1838383614576565b6137cc6000826134d7565b6001600160a01b03831660009081526003602052604081208054600192906137f5908490615acd565b90915550506001600160a01b0382166000908152600360205260408120805460019290613823908490615c7e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b84811015611616576138d58686838181106138a4576138a46158b4565b905060200201358585848181106138bd576138bd6158b4565b90506020028101906138cf91906158ca565b85613a84565b806138df81615926565b915050613887565b600061164c8383614581565b6117cd600c82613419565b600061390982611c43565b905061391781600084614576565b6139226000836134d7565b6001600160a01b038116600090815260036020526040812080546001929061394b908490615acd565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600085856040516020016139ba9291906159be565b60408051601f198184030181528282528051602091820120601f8901829004820284018201909252878352909250613a0e9183918990899081908401838280828437600092019190915250613c7e92505050565b6116168187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152508892506145ab915050565b613a8d846146e7565b613ad95760405162461bcd60e51b815260206004820152601c60248201527f5265636f726453746f726167653a204b45595f4e4f545f464f554e44000000006044820152606401611197565b61185884613ae686612baf565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506145ab915050565b60606000829050600081516001600160401b03811115613b4657613b46615287565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b8251811015611475576041838281518110613b9357613b936158b4565b016020015160f81c10801590613bc35750605a838281518110613bb857613bb86158b4565b016020015160f81c11155b15613c2557828181518110613bda57613bda6158b4565b602001015160f81c60f81b60f81c6020613bf49190615c96565b60f81b828281518110613c0957613c096158b4565b60200101906001600160f81b031916908160001a905350613c6c565b828181518110613c3757613c376158b4565b602001015160f81c60f81b828281518110613c5457613c546158b4565b60200101906001600160f81b031916908160001a9053505b80613c7681615926565b915050613b76565b613c87826146e7565b611705576000828152600a6020908152604090912082516112cc92840190614e5e565b805160009060018381019184010182805b82841015613d0057835160ff16602e819003613cdf57613cdc600184615c7e565b92505b613cea600186615c7e565b9450508080613cf890615926565b915050613cbb565b50949350505050565b61170582826040518060200160405280600081525061470d565b613d2c826134ba565b613d8d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611197565b600082815260156020908152604090912082516112cc92840190614e5e565b606080613db884612baf565b9150613dc4848461448b565b90509250929050565b6117cd600c82614740565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611097825490565b6001600160a01b038316613e7f5760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b6044820152606401611197565b8051600003613ea05760405162461bcd60e51b815260040161119790615a8b565b613ea9816130bc565b1515600114613efa5760405162461bcd60e51b815260206004820152601a60248201527f546f70206c6576656c20646f6d61696e206e6f742065786973740000000000006044820152606401611197565b8151600003613f465760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b6044820152606401611197565b613f4f82613caa565b15613f915760405162461bcd60e51b8152602060048201526012602482015271111bdb585a5b881b9bdd081cdd5c1c1bdc9d60721b6044820152606401611197565b6000613f9c83613b24565b90506000613fa983613b24565b90508181604051602001613fbe929190615b7a565b60405160208183030381529060405291506000613fda83611b74565b9050613fe5816134ba565b156140025760405162461bcd60e51b815260040161119790615bb6565b61400c8682613d09565b6140168184613d23565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516140469190614fa9565b60405180910390a2505050505050565b60006001600160a01b0382166140b95760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401611197565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b0384166140ec57600080fd5b81516000036140fa57600080fd5b61410382613caa565b1561410d57600080fd5b614116836134ba565b61411f57600080fd5b600061412a83613b24565b905060008160156000878152602001908152602001600020604051602001614153929190615cbb565b6040516020818303038152906040529050600061416f82611b74565b905061417a816134ba565b156141975760405162461bcd60e51b815260040161119790615bb6565b6000868152601560205260408120805461423891906141b59061587a565b80601f01602080910402602001604051908101604052809291908181526020018280546141e19061587a565b801561422e5780601f106142035761010080835404028352916020019161422e565b820191906000526020600020905b81548152906001019060200180831161421157829003601f168201915b5050505050613caa565b90508060010361425c57600087815260146020526040902061425a90836147c2565b505b8451156142735761426e88838761470d565b61427d565b61427d8883613d09565b6142878284613d23565b817fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516142b79190614fa9565b60405180910390a25050505050505050565b6142d48484846136d9565b6142e0848484846147ce565b6118585760405162461bcd60e51b815260040161119790615d7a565b600061430782613b24565b905060008160156000868152602001908152602001600020604051602001614330929190615cbb565b6040516020818303038152906040529050600061434c82611b74565b600086815260146020526040902090915061436790826148cf565b50600081815260156020526040902080546143819061587a565b15905061439f57600081815260156020526040812061439f91614e24565b611a46816138fe565b6060601a80546110ac9061587a565b60005b84811015611616576144138686838181106143d7576143d76158b4565b90506020028101906143e991906158ca565b8686858181106143fb576143fb6158b4565b905060200281019061440d91906158ca565b866139a5565b8061441d81615926565b9150506143ba565b61442e8161366c565b611a4685858585856143b7565b60006001600160e01b031982166380ac58cd60e01b148061446c57506001600160e01b03198216635b5e139f60e01b145b8061109757506301ffc9a760e01b6001600160e01b0319831614611097565b6060600d600061449a8461454a565b8152602001908152602001600020600084815260200190815260200160002080546144c49061587a565b80601f01602080910402602001604051908101604052809291908181526020018280546144f09061587a565b801561453d5780601f106145125761010080835404028352916020019161453d565b820191906000526020600020905b81548152906001019060200180831161452057829003601f168201915b5050505050905092915050565b6000818152600e602052604081205415614572576000828152600e6020526040902054611097565b5090565b6112cc8383836148db565b6000826000018281548110614598576145986158b4565b9060005260206000200154905092915050565b600d60006145b88361454a565b8152602001908152602001600020600085815260200190815260200160002080546145e29061587a565b905060000361463a57826040516145f99190615a6f565b6040518091039020817f7ae4f661958fbecc2f77be6b0eb280d2a6f604b29e1e7221c82b9da0c4af7f86856040516146319190614fa9565b60405180910390a35b81600d60006146488461454a565b81526020019081526020016000206000868152602001908152602001600020908051906020019061467a929190614e5e565b50816040516146899190615a6f565b60405180910390208360405161469f9190615a6f565b6040518091039020827f851ffe8e74d5015261dba0a1f9e1b0e5d42c5af5d2ad1908fee897c7d80a0d9286866040516146d99291906154bb565b60405180910390a450505050565b6000818152600a6020526040812080548291906147039061587a565b9050119050919050565b6147178383614993565b61472460008484846147ce565b6112cc5760405162461bcd60e51b815260040161119790615d7a565b61474a8282614056565b6147a05760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b6064820152608401611197565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600061164c8383614ad2565b60006001600160a01b0384163b156148c457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614812903390899088908890600401615dcc565b6020604051808303816000875af192505050801561484d575060408051601f3d908101601f1916820190925261484a91810190615dff565b60015b6148aa573d80801561487b576040519150601f19603f3d011682016040523d82523d6000602084013e614880565b606091505b5080516000036148a25760405162461bcd60e51b815260040161119790615d7a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114c0565b506001949350505050565b600061164c8383614b21565b6001600160a01b0383166149365761493181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614959565b816001600160a01b0316836001600160a01b031614614959576149598382614c14565b6001600160a01b038216614970576112cc81614cb1565b826001600160a01b0316826001600160a01b0316146112cc576112cc8282614d60565b6001600160a01b0382166149e95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401611197565b6149f2816134ba565b15614a3f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401611197565b614a4b60008383614576565b6001600160a01b0382166000908152600360205260408120805460019290614a74908490615c7e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600183016020526040812054614b1957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611097565b506000611097565b60008181526001830160205260408120548015614c0a576000614b45600183615acd565b8554909150600090614b5990600190615acd565b9050818114614bbe576000866000018281548110614b7957614b796158b4565b9060005260206000200154905080876000018481548110614b9c57614b9c6158b4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614bcf57614bcf615e1c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611097565b6000915050611097565b60006001614c218461247c565b614c2b9190615acd565b600083815260076020526040902054909150808214614c7e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614cc390600190615acd565b60008381526009602052604081205460088054939450909284908110614ceb57614ceb6158b4565b906000526020600020015490508060088381548110614d0c57614d0c6158b4565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614d4457614d44615e1c565b6001900381819060005260206000200160009055905550505050565b6000614d6b8361247c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054614db09061587a565b90600052602060002090601f016020900481019282614dd25760008555614e18565b82601f10614deb5782800160ff19823516178555614e18565b82800160010185558215614e18579182015b82811115614e18578235825591602001919060010190614dfd565b50614572929150614ed2565b508054614e309061587a565b6000825580601f10614e40575050565b601f0160209004906000526020600020908101906117cd9190614ed2565b828054614e6a9061587a565b90600052602060002090601f016020900481019282614e8c5760008555614e18565b82601f10614ea557805160ff1916838001178555614e18565b82800160010185558215614e18579182015b82811115614e18578251825591602001919060010190614eb7565b5b808211156145725760008155600101614ed3565b6001600160e01b0319811681146117cd57600080fd5b600060208284031215614f0f57600080fd5b813561164c81614ee7565b80356001600160a01b0381168114614f3157600080fd5b919050565b600060208284031215614f4857600080fd5b61164c82614f1a565b60005b83811015614f6c578181015183820152602001614f54565b838111156118585750506000910152565b60008151808452614f95816020860160208601614f51565b601f01601f19169290920160200192915050565b60208152600061164c6020830184614f7d565b600060208284031215614fce57600080fd5b5035919050565b60008060408385031215614fe857600080fd5b614ff183614f1a565b946020939093013593505050565b60008083601f84011261501157600080fd5b5081356001600160401b0381111561502857600080fd5b6020830191508360208260051b850101111561504357600080fd5b9250929050565b60008060006040848603121561505f57600080fd5b83356001600160401b0381111561507557600080fd5b61508186828701614fff565b909790965060209590950135949350505050565b600081518084526020808501808196508360051b8101915082860160005b858110156150dd5782840389526150cb848351614f7d565b988501989350908401906001016150b3565b5091979650505050505050565b60208152600061164c6020830184615095565b60008083601f84011261510f57600080fd5b5081356001600160401b0381111561512657600080fd5b60208301915083602082850101111561504357600080fd5b60008060006040848603121561515357600080fd5b83356001600160401b0381111561516957600080fd5b615081868287016150fd565b6000806020838503121561518857600080fd5b82356001600160401b0381111561519e57600080fd5b6151aa85828601614fff565b90969095509350505050565b6000806000606084860312156151cb57600080fd5b6151d484614f1a565b92506151e260208501614f1a565b9150604084013590509250925092565b60008060008060006060868803121561520a57600080fd5b85356001600160401b038082111561522157600080fd5b61522d89838a01614fff565b9097509550602088013591508082111561524657600080fd5b5061525388828901614fff565b96999598509660400135949350505050565b6000806040838503121561527857600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156152c5576152c5615287565b604052919050565b600082601f8301126152de57600080fd5b81356001600160401b038111156152f7576152f7615287565b61530a601f8201601f191660200161529d565b81815284602083860101111561531f57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561534e57600080fd5b81356001600160401b0381111561536457600080fd5b6114c0848285016152cd565b60008060008060006060868803121561538857600080fd5b85356001600160401b038082111561539f57600080fd5b6153ab89838a016150fd565b909750955060208801359150808211156153c457600080fd5b50615253888289016150fd565b600080600080606085870312156153e757600080fd5b8435935060208501356001600160401b0381111561540457600080fd5b615410878288016150fd565b9598909750949560400135949350505050565b6000806020838503121561543657600080fd5b82356001600160401b0381111561544c57600080fd5b6151aa858286016150fd565b6000806040838503121561546b57600080fd5b82356001600160401b038082111561548257600080fd5b61548e868387016152cd565b935060208501359150808211156154a457600080fd5b506154b1858286016152cd565b9150509250929050565b6040815260006154ce6040830185614f7d565b82810360208401526154e08185614f7d565b95945050505050565b6000806000606084860312156154fe57600080fd5b61550784614f1a565b925060208401356001600160401b038082111561552357600080fd5b61552f878388016152cd565b9350604086013591508082111561554557600080fd5b50615552868287016152cd565b9150509250925092565b6000806000806060858703121561557257600080fd5b84356001600160401b038082111561558957600080fd5b61559588838901614fff565b90965094506020915086820135818111156155af57600080fd5b8701601f810189136155c057600080fd5b8035828111156155d2576155d2615287565b8060051b6155e185820161529d565b918252828101850191858101908c8411156155fb57600080fd5b86850192505b83831015615637578235868111156156195760008081fd5b6156278e89838901016152cd565b8352509186019190860190615601565b975050505060408801359250508082111561565157600080fd5b5061565e878288016152cd565b91505092959194509250565b60008060006060848603121561567f57600080fd5b61568884614f1a565b92506020840135915060408401356001600160401b038111156156aa57600080fd5b615552868287016152cd565b80358015158114614f3157600080fd5b600080604083850312156156d957600080fd5b6156e283614f1a565b9150613dc4602084016156b6565b6040815260006157036040830185615095565b82810360208401526154e08185615095565b6000806000806080858703121561572b57600080fd5b61573485614f1a565b935061574260208601614f1a565b92506040850135915060608501356001600160401b0381111561576457600080fd5b61565e878288016152cd565b604080825283519082018190526000906020906060840190828701845b828110156157a95781518452928401929084019060010161578d565b505050838103828501526157bd8186615095565b9695505050505050565b600080604083850312156157da57600080fd5b8235915060208301356001600160401b038111156157f757600080fd5b6154b1858286016152cd565b6000806040838503121561581657600080fd5b61581f83614f1a565b9150613dc460208401614f1a565b6000806000806080858703121561584357600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561587157600080fd5b61164c826156b6565b600181811c9082168061588e57607f821691505b6020821081036158ae57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126158e157600080fd5b8301803591506001600160401b038211156158fb57600080fd5b60200191503681900382131561504357600080fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161593857615938615910565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f41646d696e436f6e74726f6c3a2073656e646572206d75737420686173206d696040820152696e74696e6720726f6c6560b01b606082015260800190565b8183823760009101908152919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526030908201527f526576657273655265736f6c7665723a2053454e4445525f49535f4e4f545f4160408201526f28282927ab22a22fa7a92fa7aba722a960811b606082015260800190565b60008251615a81818460208701614f51565b9190910192915050565b60208082526022908201527f546f70206c6576656c20646f6d61696e206d757374206265206e6f6e2d656d70604082015261747960f01b606082015260800190565b600082821015615adf57615adf615910565b500390565b600082615b0157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615b2057615b20615910565b500290565b60208082526035908201527f496e73756666696369656e7420546f6b656e206f7220546f6b656e2076616c7560408201527419481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b606082015260800190565b60008351615b8c818460208801614f51565b601760f91b9083019081528351615baa816001840160208801614f51565b01600101949350505050565b602080825260159082015274446f6d61696e20616c72656164792065786973747360581b604082015260600190565b60208082526028908201527f526576657273655265736f6c7665723a20524556455253455f5245434f52445f60408201526749535f454d50545960c01b606082015260800190565b60008351615c3f818460208801614f51565b835190830190615c53818360208801614f51565b01949350505050565b60008351615c6e818460208801614f51565b9190910191825250602001919050565b60008219821115615c9157615c91615910565b500190565b600060ff821660ff84168060ff03821115615cb357615cb3615910565b019392505050565b600083516020615cce8285838901614f51565b601760f91b918401918252845460019060009080831c81841680615cf357607f821691505b8582108103615d1057634e487b7160e01b84526022600452602484fd5b808015615d245760018114615d3957615d6a565b60ff1984168887015282880186019450615d6a565b60008b81526020902060005b84811015615d605781548a8201890152908701908801615d45565b5050858389010194505b50929a9950505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906157bd90830184614f7d565b600060208284031215615e1157600080fd5b815161164c81614ee7565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220818bcd4d757a80f9cde64c1e2896e33df301b171a76e674051a300d8d91c833c64736f6c634300080e0033

Deployed ByteCode Sourcemap

79048:17600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95076:162;;;;;;;;;;-1:-1:-1;95076:162:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;95076:162:0;;;;;;;;79721:40;;;;;;;;;;-1:-1:-1;79721:40:0;;;;;;;;;;;76870:45;;;;;;;;;;-1:-1:-1;76870:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1107:25:1;;;1095:2;1080:18;76870:45:0;961:177:1;32338:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33897:221::-;;;;;;;;;;-1:-1:-1;33897:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2243:32:1;;;2225:51;;2213:2;2198:18;33897:221:0;2079:203:1;33420:411:0;;;;;;;;;;-1:-1:-1;33420:411:0;;;;;:::i;:::-;;:::i;:::-;;79372:45;;;;;;;;;;-1:-1:-1;79372:45:0;;;;;:::i;:::-;;:::i;79768:40::-;;;;;;;;;;-1:-1:-1;79768:40:0;;;;;;;;;;;81539:108;;;;;;;;;;;;;:::i;44792:113::-;;;;;;;;;;-1:-1:-1;44880:10:0;:17;44792:113;;73200:280;;;;;;;;;;-1:-1:-1;73200:280:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73043:149::-;;;;;;;;;;-1:-1:-1;73043:149:0;;;;;:::i;:::-;;:::i;83156:90::-;;;;;;;;;;;;;:::i;78353:212::-;;;;;;;;;;-1:-1:-1;78353:212:0;;;;;:::i;:::-;;:::i;89151:332::-;;;;;;;;;;-1:-1:-1;89151:332:0;;;;;:::i;:::-;;:::i;96017:239::-;;;;;;;;;;-1:-1:-1;96017:239:0;;;;;:::i;:::-;;:::i;94295:197::-;;;;;;;;;;-1:-1:-1;94295:197:0;;;;;:::i;:::-;;:::i;44460:256::-;;;;;;;;;;-1:-1:-1;44460:256:0;;;;;:::i;:::-;;:::i;96495:113::-;;;;;;;;;;-1:-1:-1;96495:113:0;;;;;:::i;:::-;;:::i;81979:92::-;;;;;;;;;;-1:-1:-1;82052:11:0;;81979:92;;91194:245;;;;;;;;;;-1:-1:-1;91194:245:0;;;;;:::i;:::-;;:::i;94771:122::-;;;:::i;52611:97::-;;;;;;;;;;-1:-1:-1;52611:97:0;;;;;:::i;:::-;;:::i;76966:40::-;;;;;;;;;;-1:-1:-1;76966:40:0;;;;;;;;;;;77462:227;;;;;;;;;;-1:-1:-1;77462:227:0;;;;;:::i;:::-;;:::i;89491:203::-;;;;;;;;;;-1:-1:-1;89491:203:0;;;;;:::i;:::-;;:::i;90084:542::-;;;;;;;;;;-1:-1:-1;90084:542:0;;;;;:::i;:::-;;:::i;80276:152::-;;;;;;;;;;-1:-1:-1;80276:152:0;;;;;:::i;:::-;;:::i;78131:44::-;;;;;;;;;;-1:-1:-1;78131:44:0;;;;;:::i;:::-;;:::i;82539:111::-;;;;;;;;;;;;;:::i;77032:36::-;;;;;;;;;;;;;;;;95383:191;;;;;;;;;;-1:-1:-1;95383:191:0;;;;;:::i;:::-;;:::i;95797:212::-;;;;;;;;;;-1:-1:-1;95797:212:0;;;;;:::i;:::-;;:::i;80437:241::-;;;;;;;;;;-1:-1:-1;80437:241:0;;;;;:::i;:::-;;:::i;81767:108::-;;;;;;;;;;;;;:::i;81340:104::-;;;;;;;;;;-1:-1:-1;81340:104:0;;;;;:::i;:::-;;:::i;44982:233::-;;;;;;;;;;-1:-1:-1;44982:233:0;;;;;:::i;:::-;;:::i;68857:118::-;;;;;;;;;;-1:-1:-1;68857:118:0;;;;;:::i;:::-;;:::i;94575:185::-;;;;;;;;;;-1:-1:-1;94575:185:0;;;;;:::i;:::-;;:::i;78571:127::-;;;;;;;;;;-1:-1:-1;78571:127:0;;;;;:::i;:::-;;:::i;83368:96::-;;;;;;;;;;-1:-1:-1;83368:96:0;;;;;:::i;:::-;;:::i;76922:37::-;;;;;;;;;;-1:-1:-1;76922:37:0;;;;;;;;79682:32;;;;;;;;;;-1:-1:-1;79682:32:0;;;;;;;;32032:239;;;;;;;;;;-1:-1:-1;32032:239:0;;;;;:::i;:::-;;:::i;84478:3174::-;;;;;;:::i;:::-;;:::i;73488:228::-;;;;;;;;;;-1:-1:-1;73488:228:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;52716:99::-;;;;;;;;;;-1:-1:-1;52716:99:0;;;;;:::i;:::-;;:::i;81881:92::-;;;;;;;;;;-1:-1:-1;81954:11:0;;81881:92;;77695:134;;;;;;;;;;-1:-1:-1;77695:134:0;;;;;:::i;:::-;;:::i;31762:208::-;;;;;;;;;;-1:-1:-1;31762:208:0;;;;;:::i;:::-;;:::i;23222:94::-;;;;;;;;;;;;;:::i;94126:163::-;;;;;;;;;;-1:-1:-1;94126:163:0;;;;;:::i;:::-;;:::i;88152:155::-;;;;;;;;;;-1:-1:-1;88152:155:0;;;;;:::i;:::-;;:::i;78704:124::-;;;;;;;;;;-1:-1:-1;78704:124:0;;;;;:::i;:::-;;:::i;90835:353::-;;;;;;;;;;-1:-1:-1;90835:353:0;;;;;:::i;:::-;;:::i;52823:114::-;;;;;;;;;;-1:-1:-1;52823:114:0;;;;;:::i;:::-;;:::i;87658:488::-;;;;;;;;;;-1:-1:-1;87658:488:0;;;;;:::i;:::-;;:::i;77223:115::-;;;;;;;;;;;;;:::i;22571:87::-;;;;;;;;;;-1:-1:-1;22644:6:0;;-1:-1:-1;;;;;22644:6:0;22571:87;;82450:83;;;;;;;;;;-1:-1:-1;82450:83:0;;;;;:::i;:::-;;:::i;32507:104::-;;;;;;;;;;;;;:::i;92091:188::-;;;;;;;;;;-1:-1:-1;92091:188:0;;;;;:::i;:::-;;:::i;81451:82::-;;;;;;;;;;-1:-1:-1;81519:6:0;;81451:82;;91445:291;;;;;;;;;;-1:-1:-1;91445:291:0;;;;;:::i;:::-;;:::i;34190:295::-;;;;;;;;;;-1:-1:-1;34190:295:0;;;;;:::i;:::-;;:::i;77835:115::-;;;;;;;;;;-1:-1:-1;77835:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;77926:16:0;77899:7;77926:16;;;:10;:16;;;;;;;77835:115;90634:144;;;;;;;;;;-1:-1:-1;90634:144:0;;;;;:::i;:::-;;:::i;82773:132::-;;;;;;;;;;-1:-1:-1;82773:132:0;;;;;:::i;:::-;;:::i;73724:435::-;;;;;;;;;;-1:-1:-1;73724:435:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;89704:373::-;;;;;;;;;;-1:-1:-1;89704:373:0;;;;;:::i;:::-;;:::i;68478:109::-;;;;;;;;;;-1:-1:-1;68478:109:0;;;;;:::i;:::-;;:::i;80684:646::-;;;;;;;;;;-1:-1:-1;80684:646:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;79424:47::-;;;;;;;;;;-1:-1:-1;79424:47:0;;;;;:::i;:::-;;:::i;92468:147::-;;;;;;;;;;-1:-1:-1;92468:147:0;;;;;:::i;:::-;;:::i;81653:108::-;;;;;;;;;;;;;:::i;78182:40::-;;;;;;;;;;-1:-1:-1;78182:40:0;;;;;;;;83470:780;;;;;;;;;;-1:-1:-1;83470:780:0;;;;;:::i;:::-;;:::i;82656:111::-;;;;;;;;;;;;;:::i;92285:174::-;;;;;;;;;;-1:-1:-1;92285:174:0;;;;;:::i;:::-;;:::i;95582:207::-;;;;;;;;;;-1:-1:-1;95582:207:0;;;;;:::i;:::-;;:::i;82077:92::-;;;;;;;;;;-1:-1:-1;82150:11:0;;82077:92;;77956:113;;;;;;;;;;-1:-1:-1;77956:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;78041:16:0;78017:4;78041:16;;;:10;:16;;;;;;:20;;;77956:113;77344:110;;;;;;;;;;-1:-1:-1;77344:110:0;;;;;:::i;:::-;;:::i;82911:239::-;;;;;;;;;;-1:-1:-1;82911:239:0;;;;;:::i;:::-;;:::i;34556:164::-;;;;;;;;;;-1:-1:-1;34556:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34677:25:0;;;34653:4;34677:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34556:164;82175:269;;;;;;;;;;-1:-1:-1;82175:269:0;;;;;:::i;:::-;;:::i;78231:114::-;;;;;;;;;;;;;:::i;96264:223::-;;;;;;;;;;-1:-1:-1;96264:223:0;;;;;:::i;:::-;;:::i;77088:129::-;;;;;;;;;;-1:-1:-1;77088:129:0;;;;;:::i;:::-;;:::i;91742:250::-;;;;;;;;;;;;;:::i;23471:192::-;;;;;;;;;;-1:-1:-1;23471:192:0;;;;;:::i;:::-;;:::i;68595:254::-;;;;;;;;;;-1:-1:-1;68595:254:0;;;;;:::i;:::-;;:::i;78834:178::-;;;;;;;;;;-1:-1:-1;78834:178:0;;;;;:::i;:::-;;:::i;95076:162::-;95179:4;95197:36;95221:11;95197:23;:36::i;:::-;95190:43;95076:162;-1:-1:-1;;95076:162:0:o;32338:100::-;32392:13;32425:5;32418:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32338:100;:::o;33897:221::-;33973:7;34001:16;34009:7;34001;:16::i;:::-;33993:73;;;;-1:-1:-1;;;33993:73:0;;20916:2:1;33993:73:0;;;20898:21:1;20955:2;20935:18;;;20928:30;20994:34;20974:18;;;20967:62;-1:-1:-1;;;21045:18:1;;;21038:42;21097:19;;33993:73:0;;;;;;;;;-1:-1:-1;34086:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34086:24:0;;33897:221::o;33420:411::-;33501:13;33517:23;33532:7;33517:14;:23::i;:::-;33501:39;;33565:5;-1:-1:-1;;;;;33559:11:0;:2;-1:-1:-1;;;;;33559:11:0;;33551:57;;;;-1:-1:-1;;;33551:57:0;;21329:2:1;33551:57:0;;;21311:21:1;21368:2;21348:18;;;21341:30;21407:34;21387:18;;;21380:62;-1:-1:-1;;;21458:18:1;;;21451:31;21499:19;;33551:57:0;21127:397:1;33551:57:0;682:10;-1:-1:-1;;;;;33643:21:0;;;;:62;;-1:-1:-1;33668:37:0;33685:5;682:10;34556:164;:::i;33668:37::-;33621:168;;;;-1:-1:-1;;;33621:168:0;;21731:2:1;33621:168:0;;;21713:21:1;21770:2;21750:18;;;21743:30;21809:34;21789:18;;;21782:62;21880:26;21860:18;;;21853:54;21924:19;;33621:168:0;21529:420:1;33621:168:0;33802:21;33811:2;33815:7;33802:8;:21::i;:::-;33490:341;33420:411;;:::o;79372:45::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81539:108::-;81585:7;81612:27;81627:11;;81612:10;81519:6;;;81451:82;81612:10;:14;;:27::i;:::-;81605:34;;81539:108;:::o;73200:280::-;73290:22;73347:4;-1:-1:-1;;;;;73334:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73325:34;;73375:9;73370:103;73390:15;;;73370:103;;;73439:22;73444:4;;73449:1;73444:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73439:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73453:7:0;;-1:-1:-1;73439:4:0;;-1:-1:-1;;73439:22:0:i;:::-;73427:6;73434:1;73427:9;;;;;;;;:::i;:::-;;;;;;:34;;;;73407:3;;;;;:::i;:::-;;;;73370:103;;;;73200:280;;;;;:::o;73043:149::-;73126:19;73166:18;73171:3;;73166:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73176:7:0;;-1:-1:-1;73166:4:0;;-1:-1:-1;;73166:18:0:i;:::-;73158:26;73043:149;-1:-1:-1;;;;73043:149:0:o;83156:90::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;83225:13:::1;::::0;;-1:-1:-1;;83208:30:0;::::1;83225:13;::::0;;::::1;83224:14;83208:30;::::0;;83156:90::o;78353:212::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;78449:9:::1;78444:114;78464:16:::0;;::::1;78444:114;;;78538:5;;78544:1;78538:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;78506:12;78525:5;;78531:1;78525:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;78506:29;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:40:::1;::::0;:29;;:40:::1;:::i;:::-;-1:-1:-1::0;78482:3:0;::::1;::::0;::::1;:::i;:::-;;;;78444:114;;89151:332:::0;89313:41;682:10;89332:12;89346:7;89313:18;:41::i;:::-;89305:103;;;;-1:-1:-1;;;89305:103:0;;;;;;;:::i;:::-;89417:15;89424:7;89417:6;:15::i;:::-;89447:28;89457:4;89463:2;89467:7;89447:9;:28::i;96017:239::-;96185:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;96206:42:::1;96221:9;;96232:6;;96240:7;96206:14;:42::i;:::-;96017:239:::0;;;;;;:::o;94295:197::-;94375:7;94431:5;94404:24;94420:7;94404:15;:24::i;:::-;:32;94395:42;;;;;;94455:19;;;;:10;:19;;;;;:29;;94478:5;94455:22;:29::i;:::-;94448:36;94295:197;-1:-1:-1;;;94295:197:0:o;44460:256::-;44557:7;44593:23;44610:5;44593:16;:23::i;:::-;44585:5;:31;44577:87;;;;-1:-1:-1;;;44577:87:0;;24553:2:1;44577:87:0;;;24535:21:1;24592:2;24572:18;;;24565:30;24631:34;24611:18;;;24604:62;-1:-1:-1;;;24682:18:1;;;24675:41;24733:19;;44577:87:0;24351:407:1;44577:87:0;-1:-1:-1;;;;;;44682:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44460:256::o;96495:113::-;96565:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;96585:15:::1;96592:7;96585:6;:15::i;:::-;96495:113:::0;;:::o;91194:245::-;682:10;91298:36;682:10;91326:7;91298:18;:36::i;:::-;91290:97;;;;-1:-1:-1;;;91290:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;91398:23:0;;;;;:14;:23;;;;;:33;91194:245::o;94771:122::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;94837:47:::1;::::0;94845:10:::1;::::0;94862:21:::1;94837:47:::0;::::1;;;::::0;::::1;::::0;;;94862:21;94845:10;94837:47;::::1;;;;;;94829:56;;;::::0;::::1;;94771:122::o:0;52611:97::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;52681:19:::1;52692:7;52681:10;:19::i;:::-;52611:97:::0;:::o;77462:227::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;77577:9:::1;77572:110;77592:19:::0;;::::1;77572:110;;;77663:7;77637:10;:23;77648:8;;77657:1;77648:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;77637:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;77637:23:0;:33;77613:3;::::1;::::0;::::1;:::i;:::-;;;;77572:110;;;;77462:227:::0;;;:::o;89491:203::-;89647:39;89664:4;89670:2;89674:7;89647:39;;;;;;;;;;;;:16;:39::i;90084:542::-;90149:41;682:10;90168:12;602:98;90149:41;90141:102;;;;-1:-1:-1;;;90141:102:0;;25382:2:1;90141:102:0;;;25364:21:1;25421:2;25401:18;;;25394:30;25460:34;25440:18;;;25433:62;-1:-1:-1;;;25511:18:1;;;25504:46;25567:19;;90141:102:0;25180:412:1;90141:102:0;90262:19;;;;:10;:19;;;;;90256:33;;;;;:::i;:::-;:38;;-1:-1:-1;90252:97:0;;90318:19;;;;:10;:19;;;;;90311:26;;;:::i;:::-;682:10;90361:28;;;;:14;:28;;;;;;:33;90357:101;;682:10;90418:28;;;;:14;:28;;;;;90411:35;90357:101;90506:1;90470:24;;;:15;:24;;;;;;-1:-1:-1;;;;;90470:24:0;:38;90466:102;;90532:24;;;;:15;:24;;;;;90525:31;;-1:-1:-1;;;;;;90525:31:0;;;90466:102;90576:15;90583:7;90576:6;:15::i;:::-;90604:14;90610:7;90604:5;:14::i;80276:152::-;80359:4;80384:36;80403:7;80412;80384:18;:36::i;78131:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;82539:111::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82622:20:::1;::::0;;-1:-1:-1;;82598:44:0;::::1;82622:20;::::0;;;::::1;;;82621:21;82598:44:::0;;::::1;;::::0;;82539:111::o;95383:191::-;95520:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;95541:25:::1;95546:3;;95551:5;;95558:7;95541:4;:25::i;95797:212::-:0;95945:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;95966:35:::1;95977:7;95986:5;;95993:7;95966:10;:35::i;:::-;95797:212:::0;;;;;:::o;80437:241::-;80500:7;80515:21;80539:26;80558:6;80539:18;:26::i;:::-;80515:50;;80573:15;80626:7;80609:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;80599:36;;;;;;80591:45;;80573:63;;80654:16;80662:7;80654;:16::i;81767:108::-;81813:7;81840:27;81855:11;;81840:10;81519:6;;;81451:82;81340:104;81396:4;81420:16;81428:7;81420;:16::i;44982:233::-;45057:7;45093:30;44880:10;:17;;44792:113;45093:30;45085:5;:38;45077:95;;;;-1:-1:-1;;;45077:95:0;;26080:2:1;45077:95:0;;;26062:21:1;26119:2;26099:18;;;26092:30;26158:34;26138:18;;;26131:62;-1:-1:-1;;;26209:18:1;;;26202:42;26261:19;;45077:95:0;25878:408:1;45077:95:0;45190:10;45201:5;45190:17;;;;;;;;:::i;:::-;;;;;;;;;45183:24;;44982:233;;;:::o;68857:118::-;68912:55;68955:3;68938:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;68928:32;;;;;;68920:41;;68963:3;68912:7;:55::i;94575:185::-;94636:7;94672:5;94666:19;94689:1;94666:24;94657:34;;;;;;94744:5;94727:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;94727:23:0;;;;;;;;;94717:34;;94727:23;94717:34;;;;;94575:185;-1:-1:-1;;94575:185:0:o;78571:127::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;78686:4:::1;;78658:12;78677:4;;78658:25;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:32:::1;::::0;:25;;:32:::1;:::i;83368:96::-:0;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;83438:18;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;32032:239::-:0;32104:7;32140:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32140:16:0;;32167:73;;;;-1:-1:-1;;;32167:73:0;;26493:2:1;32167:73:0;;;26475:21:1;26532:2;26512:18;;;26505:30;26571:34;26551:18;;;26544:62;-1:-1:-1;;;26622:18:1;;;26615:39;26671:19;;32167:73:0;26291:405:1;84478:3174:0;84571:13;;;;84563:52;;;;-1:-1:-1;;;84563:52:0;;26903:2:1;84563:52:0;;;26885:21:1;26942:2;26922:18;;;26915:30;26981:28;26961:18;;;26954:56;27027:18;;84563:52:0;26701:350:1;84563:52:0;84638:3;84632:17;84653:1;84632:22;84624:69;;;;-1:-1:-1;;;84624:69:0;;;;;;;:::i;:::-;84710:10;84716:3;84710:5;:10::i;:::-;:18;;84724:4;84710:18;84702:57;;;;-1:-1:-1;;;84702:57:0;;27661:2:1;84702:57:0;;;27643:21:1;27700:2;27680:18;;;27673:30;27739:28;27719:18;;;27712:56;27785:18;;84702:57:0;27459:350:1;84702:57:0;84776:27;84796:6;84776:19;:27::i;:::-;:32;84768:71;;;;-1:-1:-1;;;84768:71:0;;28016:2:1;84768:71:0;;;27998:21:1;28055:2;28035:18;;;28028:30;28094:28;28074:18;;;28067:56;28140:18;;84768:71:0;27814:350:1;84768:71:0;84866:20;;84848:15;84903:12;;;84895:49;;;;-1:-1:-1;;;84895:49:0;;28371:2:1;84895:49:0;;;28353:21:1;28410:2;28390:18;;;28383:30;-1:-1:-1;;;28429:18:1;;;28422:54;28493:18;;84895:49:0;28169:348:1;84895:49:0;85058:20;;;;:28;;:20;:28;85054:164;;85093:18;85114:12;85133:6;85114:27;;;;;;:::i;:::-;;;;;;;;;;;;;85093:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85161:4;85155:18;85177:1;85155:23;85147:65;;;;-1:-1:-1;;;85147:65:0;;29003:2:1;85147:65:0;;;28985:21:1;29042:2;29022:18;;;29015:30;29081:31;29061:18;;;29054:59;29130:18;;85147:65:0;28801:353:1;85147:65:0;85087:131;85054:164;85290:17;;85226:26;;85290:17;;:25;;:17;:25;85286:372;;85351:10;85322:15;85340:22;;;:10;:22;;;;;;85372:20;;85340:22;;85372:20;;;;;;:29;;;;85368:285;;85427:1;85417:7;:11;85409:59;;;;-1:-1:-1;;;85409:59:0;;29361:2:1;85409:59:0;;;29343:21:1;29400:2;29380:18;;;29373:30;29439:34;29419:18;;;29412:62;-1:-1:-1;;;29490:18:1;;;29483:33;29533:19;;85409:59:0;29159:399:1;85409:59:0;85494:21;85504:10;85494:9;:21::i;:::-;85483:7;:32;;85475:79;;;;-1:-1:-1;;;85475:79:0;;29765:2:1;85475:79:0;;;29747:21:1;29804:2;29784:18;;;29777:30;29843:34;29823:18;;;29816:62;-1:-1:-1;;;29894:18:1;;;29887:32;29936:19;;85475:79:0;29563:398:1;85475:79:0;85368:285;;;85581:11;;85577:70;;85622:17;;85601:38;;85577:70;85316:342;85286:372;85670:7;85681:1;85670:12;85666:375;;85701:20;;;;;;;:28;;85725:4;85701:28;85693:91;;;;-1:-1:-1;;;85693:91:0;;30168:2:1;85693:91:0;;;30150:21:1;30207:2;30187:18;;;30180:30;30246:34;30226:18;;;30219:62;-1:-1:-1;;;30297:18:1;;;30290:48;30355:19;;85693:91:0;29966:414:1;85693:91:0;85795:16;85814:27;85829:11;;85814:10;81519:6;;;81451:82;85814:27;85795:46;-1:-1:-1;85851:22:0;;85847:93;;85929:3;85905:22;85909:18;85929:3;85905:22;:::i;:::-;85904:28;;;;:::i;:::-;85892:41;;:8;:41;:::i;:::-;85881:52;;85847:93;85969:8;85956:9;:21;;85948:87;;;;-1:-1:-1;;;85948:87:0;;;;;;;:::i;:::-;85687:354;85666:375;86053:7;86064:1;86053:12;86049:372;;86084:20;;;;;;;;:28;;:20;:28;86076:91;;;;-1:-1:-1;;;86076:91:0;;31534:2:1;86076:91:0;;;31516:21:1;31573:2;31553:18;;;31546:30;31612:34;31592:18;;;31585:62;-1:-1:-1;;;31663:18:1;;;31656:48;31721:19;;86076:91:0;31332:414:1;86076:91:0;86173:16;86192:27;86207:11;;86192:10;81519:6;;;81451:82;86192:27;86173:46;-1:-1:-1;86229:22:0;;86225:93;;86307:3;86283:22;86287:18;86307:3;86283:22;:::i;:::-;86282:28;;;;:::i;:::-;86270:41;;:8;:41;:::i;:::-;86259:52;;86225:93;86349:8;86336:9;:21;;86328:87;;;;-1:-1:-1;;;86328:87:0;;;;;;;:::i;:::-;86070:351;86049:372;86432:7;86443:1;86432:12;86428:270;;86455:16;86474:27;86489:11;;86474:10;81519:6;;;81451:82;86474:27;86455:46;-1:-1:-1;86511:22:0;;86507:93;;86589:3;86565:22;86569:18;86589:3;86565:22;:::i;:::-;86564:28;;;;:::i;:::-;86552:41;;:8;:41;:::i;:::-;86541:52;;86507:93;86626:8;86613:9;:21;;86605:87;;;;-1:-1:-1;;;86605:87:0;;;;;;;:::i;:::-;86449:249;86428:270;86710:7;86721:1;86710:12;86706:270;;86733:16;86752:27;86767:11;;86752:10;81519:6;;;81451:82;86752:27;86733:46;-1:-1:-1;86789:22:0;;86785:93;;86867:3;86843:22;86847:18;86867:3;86843:22;:::i;:::-;86842:28;;;;:::i;:::-;86830:41;;:8;:41;:::i;:::-;86819:52;;86785:93;86904:8;86891:9;:21;;86883:87;;;;-1:-1:-1;;;86883:87:0;;;;;;;:::i;:::-;86727:249;86706:270;86999:1;86988:7;:12;86984:253;;87011:16;87030:10;81519:6;;;81451:82;87030:10;87011:29;-1:-1:-1;87050:22:0;;87046:93;;87128:3;87104:22;87108:18;87128:3;87104:22;:::i;:::-;87103:28;;;;:::i;:::-;87091:41;;:8;:41;:::i;:::-;87080:52;;87046:93;87165:8;87152:9;:21;;87144:87;;;;-1:-1:-1;;;87144:87:0;;;;;;;:::i;:::-;87005:232;86984:253;87245:21;87269:26;87288:6;87269:18;:26::i;:::-;87245:50;;87304:18;87325:23;87344:3;87325:18;:23::i;:::-;87304:44;;87391:7;87405:4;87374:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87357:54;;87420:15;87438:19;87449:7;87438:10;:19::i;:::-;87420:37;;87476:16;87484:7;87476;:16::i;:::-;87475:17;87466:52;;;;-1:-1:-1;;;87466:52:0;;;;;;;:::i;:::-;87529:30;87539:10;87551:7;87529:9;:30::i;:::-;87572;87585:7;87594;87572:12;:30::i;:::-;87627:7;87620:24;87636:7;87620:24;;;;;;:::i;:::-;;;;;;;;84558:3094;;;;;84478:3174;;:::o;73488:228::-;73609:17;73628:19;73680:28;73691:7;73700;73680:10;:28::i;:::-;73665:43;;;;-1:-1:-1;73488:228:0;-1:-1:-1;;;73488:228:0:o;52716:99::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;52787:20:::1;52799:7;52787:11;:20::i;77695:134::-:0;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;77792:19:0;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:29;77695:134::o;31762:208::-;31834:7;-1:-1:-1;;;;;31862:19:0;;31854:74;;;;-1:-1:-1;;;31854:74:0;;32922:2:1;31854:74:0;;;32904:21:1;32961:2;32941:18;;;32934:30;33000:34;32980:18;;;32973:62;-1:-1:-1;;;33051:18:1;;;33044:40;33101:19;;31854:74:0;32720:406:1;31854:74:0;-1:-1:-1;;;;;;31946:16:0;;;;;:9;:16;;;;;;;31762:208::o;23222:94::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;23287:21:::1;23305:1;23287:9;:21::i;94126:163::-:0;94189:7;94218:16;94226:7;94218;:16::i;:::-;94209:26;;;;;;94253:19;;;;:10;:19;;;;;:28;;:26;:28::i;88152:155::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;88267:32:::1;88283:2;88287:6;88295:3;88267:15;:32::i;78704:124::-:0;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;78795:12:::1;78814:4;;78795:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;78788:32;;;;:::i;90835:353::-:0;-1:-1:-1;;;;;90935:23:0;;90917:15;90935:23;;;:14;:23;;;;;;90892:13;;90977:12;;;90969:65;;;;-1:-1:-1;;;90969:65:0;;;;;;;:::i;:::-;91053:36;91072:7;91081;91053:18;:36::i;:::-;91045:98;;;;-1:-1:-1;;;91045:98:0;;33742:2:1;91045:98:0;;;33724:21:1;33781:2;33761:18;;;33754:30;33820:34;33800:18;;;33793:62;-1:-1:-1;;;33871:18:1;;;33864:47;33928:19;;91045:98:0;33540:413:1;91045:98:0;91161:19;;;;:10;:19;;;;;91154:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90835:353;;;:::o;52823:114::-;52878:4;52900:29;:16;52921:7;52900:20;:29::i;87658:488::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;87801:9:::1;87796:346;87816:17:::0;;::::1;87796:346;;;87859:20;87882:7;87890:1;87882:10;;;;;;;;:::i;:::-;;;;;;;87859:33;;87903:13;87919:6;;87926:1;87919:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;87903:25;;87966:1;87949:6;87943:20;:24;:47;;;;-1:-1:-1::0;;;;;;87971:19:0;::::1;::::0;::::1;87943:47;87939:192;;;88003:15;88021:18;88032:6;88021:10;:18::i;:::-;88003:36;;88051:16;88059:7;88051;:16::i;:::-;88046:79;;88082:35;88098:5;88105:6;88113:3;88082:15;:35::i;:::-;87996:135;87939:192;87844:298;;87835:3;;;;;:::i;:::-;;;;87796:346;;77223:115:::0;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;77310:20:::1;::::0;;-1:-1:-1;;77286:44:0;::::1;77310:20;::::0;;;::::1;;;77309:21;77286:44:::0;;::::1;;::::0;;77223:115::o;82450:83::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82511:6:::1;:14:::0;82450:83::o;32507:104::-;32563:13;32596:7;32589:14;;;;;:::i;92091:188::-;92205:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;92231:40:::1;92250:2;92254:7;92263:3;92231:40;;;;;;;;;;;::::0;:18:::1;:40::i;91445:291::-:0;91499:15;91517:18;91528:6;91517:10;:18::i;:::-;91499:36;-1:-1:-1;682:10:0;91595:36;682:10;91499:36;91595:18;:36::i;:::-;91587:97;;;;-1:-1:-1;;;91587:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;91695:23:0;;;;;:14;:23;;;;;:33;-1:-1:-1;91445:291:0:o;34190:295::-;682:10;-1:-1:-1;;;;;34293:24:0;;;34285:62;;;;-1:-1:-1;;;34285:62:0;;34160:2:1;34285:62:0;;;34142:21:1;34199:2;34179:18;;;34172:30;34238:27;34218:18;;;34211:55;34283:18;;34285:62:0;33958:349:1;34285:62:0;682:10;34360:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34360:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34360:53:0;;;;;;;;;;34429:48;;540:41:1;;;34360:42:0;;682:10;34429:48;;513:18:1;34429:48:0;;;;;;;34190:295;;:::o;90634:144::-;90710:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;90730:40:::1;90740:16;90748:7;90740;:16::i;:::-;90758:2;90762:7;90730:9;:40::i;82773:132::-:0;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82837:15:::1;82855:16;82866:4;82855:10;:16::i;:::-;82876:14;::::0;;;:5:::1;:14;::::0;;;;;;;:21;;82837:34;;-1:-1:-1;82876:21:0::1;::::0;:14;;:21;::::1;::::0;::::1;:::i;73724:435::-:0;73862:20;;73944:9;-1:-1:-1;;;;;73931:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73924:37:0;-1:-1:-1;73994:9:0;-1:-1:-1;;;;;73981:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73972:39;;74027:9;74022:130;74042:20;;;74022:130;;;74107:33;74118:9;;74128:1;74118:12;;;;;;;:::i;:::-;;;;;;;74132:7;74107:10;:33::i;:::-;74085:4;74090:1;74085:7;;;;;;;;:::i;:::-;;;;;;74094:6;74101:1;74094:9;;;;;;;;:::i;:::-;;;;;;74084:56;;;;;;;;74064:3;;;;;:::i;:::-;;;;74022:130;;;;73724:435;;;;;;:::o;89704:373::-;89896:41;682:10;89929:7;89896:18;:41::i;:::-;89888:103;;;;-1:-1:-1;;;89888:103:0;;;;;;;:::i;:::-;90000:15;90007:7;90000:6;:15::i;:::-;90030:39;90044:4;90050:2;90054:7;90063:5;90030:13;:39::i;68478:109::-;68565:14;;;;:5;:14;;;;;68558:21;;68532:13;;68565:14;68558:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68478:109;;;:::o;80684:646::-;80752:25;80780:23;80811:16;80830:18;80840:7;80830:9;:18::i;:::-;80811:37;;80878:1;80867:8;:12;80859:25;;;;-1:-1:-1;;;80859:25:0;;34514:2:1;80859:25:0;;;34496:21:1;-1:-1:-1;34533:18:1;;;34526:29;34572:18;;80859:25:0;34312:284:1;80859:25:0;80896:26;80939:8;-1:-1:-1;;;;;80925:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80925:23:0;;80896:52;;80959:24;80999:8;-1:-1:-1;;;;;80986:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80959:49;;81024:9;81019:244;81043:8;81039:1;:12;81019:244;;;81073:15;81091:31;81111:7;81120:1;81091:19;:31::i;:::-;81137:20;81160:19;;;:10;:19;;;;;81137:42;;81073:49;;-1:-1:-1;81137:20:0;;:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81209:7;81194:9;81204:1;81194:12;;;;;;;;:::i;:::-;;;;;;:22;;;;;81245:6;81231:8;81240:1;81231:11;;;;;;;;:::i;:::-;;;;;;:20;;;;81058:205;;81053:3;;;;;:::i;:::-;;;;81019:244;;;-1:-1:-1;81284:9:0;;81314:8;;-1:-1:-1;80684:646:0;-1:-1:-1;;;80684:646:0:o;79424:47::-;;;;;;;;;;;;;;;;:::i;92468:147::-;92556:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;92579:28:::1;92594:7;92603:3;92579:14;:28::i;81653:108::-:0;81699:7;81726:27;81741:11;;81726:10;81519:6;;;81451:82;83470:780;83535:13;83569:16;83577:7;83569;:16::i;:::-;83561:76;;;;-1:-1:-1;;;83561:76:0;;34803:2:1;83561:76:0;;;34785:21:1;34842:2;34822:18;;;34815:30;34881:34;34861:18;;;34854:62;-1:-1:-1;;;34932:18:1;;;34925:45;34987:19;;83561:76:0;34601:411:1;83561:76:0;83650:23;83676:19;;;:10;:19;;;;;83650:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83761:21;83785:10;:8;:10::i;:::-;83761:34;;83816:7;83810:21;83835:1;83810:26;83806:75;;-1:-1:-1;83860:9:0;83470:780;-1:-1:-1;;83470:780:0:o;83806:75::-;83985:23;;:27;83981:111;;84060:7;84069:9;84043:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84029:51;;;;83470:780;;;:::o;83981:111::-;84224:7;84233;84207:34;;;;;;;;;:::i;82656:111::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82739:20:::1;::::0;;-1:-1:-1;;82715:44:0;::::1;82739:20:::0;;;;::::1;;;82738:21;82715:44:::0;;::::1;;::::0;;82656:111::o;92285:174::-;52280:19;52288:10;52280:7;:19::i;:::-;52261:103;;;;-1:-1:-1;;;52261:103:0;;;;;;;:::i;:::-;92411:40:::1;92430:2;92434:7;92443:3;92411:40;;;;;;;;;;;::::0;:18:::1;:40::i;95582:207::-:0;95729:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;95750:31:::1;95759:4;;95765:6;;95773:7;95750:8;:31::i;77344:110::-:0;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;77420:17:::1;:26:::0;77344:110::o;82911:239::-;82967:4;;;83027:16;83038:4;83027:10;:16::i;:::-;83058:14;;;;:5;:14;;;;;83052:28;;83009:34;;-1:-1:-1;83058:14:0;83052:28;;;:::i;:::-;:33;;-1:-1:-1;83048:79:0;;83111:4;83101:14;;83048:79;-1:-1:-1;83138:7:0;82911:239;-1:-1:-1;;82911:239:0:o;82175:269::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;82307:11:::1;:27:::0;;;;82339:11:::1;:27:::0;;;;82377:11:::1;:27:::0;82409:11:::1;:27:::0;82175:269::o;78231:114::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;78317:20:::1;::::0;;-1:-1:-1;;78293:44:0;::::1;78317:20;::::0;;::::1;78316:21;78293:44;::::0;;78231:114::o;96264:223::-;96424:7;80125:41;682:10;80144:12;602:98;80125:41;80103:74;;;;;;96444:35:::1;96457:4;;96463:6;;96471:7;96444:12;:35::i;77088:129::-:0;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;77171:17:::1;:38:::0;;-1:-1:-1;;77171:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77088:129::o;91742:250::-;682:10;91785:15;91844:23;;;:14;:23;;;;;;;91886:12;;;91878:65;;;;-1:-1:-1;;;91878:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;91961:23:0;;;;;:14;:23;;;;;91954:30;91742:250::o;23471:192::-;22644:6;;-1:-1:-1;;;;;22644:6:0;682:10;22791:23;22783:68;;;;-1:-1:-1;;;22783:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23560:22:0;::::1;23552:73;;;::::0;-1:-1:-1;;;23552:73:0;;36071:2:1;23552:73:0::1;::::0;::::1;36053:21:1::0;36110:2;36090:18;;;36083:30;36149:34;36129:18;;;36122:62;-1:-1:-1;;;36200:18:1;;;36193:36;36246:19;;23552:73:0::1;35869:402:1::0;23552:73:0::1;23636:19;23646:8;23636:9;:19::i;68595:254::-:0;68660:22;68717:6;-1:-1:-1;;;;;68704:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68695:36;;68747:9;68742:100;68762:17;;;68742:100;;;68813:17;68820:6;;68827:1;68820:9;;;;;;;:::i;:::-;;;;;;;68813:6;:17::i;:::-;68801:6;68808:1;68801:9;;;;;;;;:::i;:::-;;;;;;:29;;;;68781:3;;;;;:::i;:::-;;;;68742:100;;78834:178;78905:4;78916:19;78938:12;78957:4;;78938:25;;;;;;;:::i;:::-;;;;;;;;;;;;;78916:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;78981:19:0;;:23;;;78834:178;-1:-1:-1;;;;;;;78834:178:0:o;51351:::-;51429:18;51433:4;51439:7;51429:3;:18::i;:::-;51428:19;51420:63;;;;-1:-1:-1;;;51420:63:0;;36478:2:1;51420:63:0;;;36460:21:1;36517:2;36497:18;;;36490:30;36556:33;36536:18;;;36529:61;36607:18;;51420:63:0;36276:355:1;51420:63:0;-1:-1:-1;;;;;51494:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;51494:27:0;51517:4;51494:27;;;51351:178::o;44152:224::-;44254:4;-1:-1:-1;;;;;;44278:50:0;;-1:-1:-1;;;44278:50:0;;:90;;;44332:36;44356:11;44332:23;:36::i;37291:127::-;37356:4;37380:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37380:16:0;:30;;;37291:127::o;41273:174::-;41348:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41348:29:0;-1:-1:-1;;;;;41348:29:0;;;;;;;;:24;;41402:23;41348:24;41402:14;:23::i;:::-;-1:-1:-1;;;;;41393:46:0;;;;;;;;;;;41273:174;;:::o;6480:98::-;6538:7;6565:5;6569:1;6565;:5;:::i;75827:169::-;75899:13;75932:56;75972:3;75955:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;75945:32;;;;;;75937:41;;75980:7;75932:4;:56::i;37585:348::-;37678:4;37703:16;37711:7;37703;:16::i;:::-;37695:73;;;;-1:-1:-1;;;37695:73:0;;36838:2:1;37695:73:0;;;36820:21:1;36877:2;36857:18;;;36850:30;36916:34;36896:18;;;36889:62;-1:-1:-1;;;36967:18:1;;;36960:42;37019:19;;37695:73:0;36636:408:1;37695:73:0;37779:13;37795:23;37810:7;37795:14;:23::i;:::-;37779:39;;37848:5;-1:-1:-1;;;;;37837:16:0;:7;-1:-1:-1;;;;;37837:16:0;;:51;;;;37881:7;-1:-1:-1;;;;;37857:31:0;:20;37869:7;37857:11;:20::i;:::-;-1:-1:-1;;;;;37857:31:0;;37837:51;:87;;;-1:-1:-1;;;;;;34677:25:0;;;34653:4;34677:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37892:32;34556:164;75640:179;75753:18;75763:7;75753:9;:18::i;:::-;75736:36;;;;;;37178:19:1;;37222:2;37213:12;;37049:182;75736:36:0;;;;-1:-1:-1;;75736:36:0;;;;;;;;;75726:47;;75736:36;75726:47;;;;75718:56;75693:22;;;:13;:22;;;;;;:81;;;;75707:7;;75790:21;;75718:56;75790:21;75640:179;:::o;40577:578::-;40736:4;-1:-1:-1;;;;;40709:31:0;:23;40724:7;40709:14;:23::i;:::-;-1:-1:-1;;;;;40709:31:0;;40701:85;;;;-1:-1:-1;;;40701:85:0;;37438:2:1;40701:85:0;;;37420:21:1;37477:2;37457:18;;;37450:30;37516:34;37496:18;;;37489:62;-1:-1:-1;;;37567:18:1;;;37560:39;37616:19;;40701:85:0;37236:405:1;40701:85:0;-1:-1:-1;;;;;40805:16:0;;40797:65;;;;-1:-1:-1;;;40797:65:0;;37848:2:1;40797:65:0;;;37830:21:1;37887:2;37867:18;;;37860:30;37926:34;37906:18;;;37899:62;-1:-1:-1;;;37977:18:1;;;37970:34;38021:19;;40797:65:0;37646:400:1;40797:65:0;40875:39;40896:4;40902:2;40906:7;40875:20;:39::i;:::-;40979:29;40996:1;41000:7;40979:8;:29::i;:::-;-1:-1:-1;;;;;41021:15:0;;;;;;:9;:15;;;;;:20;;41040:1;;41021:15;:20;;41040:1;;41021:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41052:13:0;;;;;;:9;:13;;;;;:18;;41069:1;;41052:13;:18;;41069:1;;41052:18;:::i;:::-;;;;-1:-1:-1;;41081:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41081:21:0;-1:-1:-1;;;;;41081:21:0;;;;;;;;;41120:27;;41081:16;;41120:27;;;;;;;40577:578;;;:::o;75140:276::-;75296:9;75291:118;75311:20;;;75291:118;;;75353:44;75364:9;;75374:1;75364:12;;;;;;;:::i;:::-;;;;;;;75378:6;;75385:1;75378:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;75389:7;75353:10;:44::i;:::-;75333:3;;;;:::i;:::-;;;;75291:118;;67409:137;67480:7;67515:22;67519:3;67531:5;67515:3;:22::i;52949:93::-;53005:29;:16;53026:7;53005:20;:29::i;39880:360::-;39940:13;39956:23;39971:7;39956:14;:23::i;:::-;39940:39;;39992:48;40013:5;40028:1;40032:7;39992:20;:48::i;:::-;40081:29;40098:1;40102:7;40081:8;:29::i;:::-;-1:-1:-1;;;;;40123:16:0;;;;;;:9;:16;;;;;:21;;40143:1;;40123:16;:21;;40143:1;;40123:21;:::i;:::-;;;;-1:-1:-1;;40162:16:0;;;;:7;:16;;;;;;40155:23;;-1:-1:-1;;;;;;40155:23:0;;;40196:36;40170:7;;40162:16;-1:-1:-1;;;;;40196:36:0;;;;;40162:16;;40196:36;39929:311;39880:360;:::o;74339:273::-;74468:15;74521:3;;74504:21;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;74504:21:0;;;;;;;;;74494:32;;74504:21;74494:32;;;;74538:21;;;;;;;;;;;;;;;;;;74494:32;;-1:-1:-1;74538:21:0;;74494:32;;74555:3;;;;;;74538:21;;74555:3;;;;74538:21;;;;;;;;;-1:-1:-1;74538:7:0;;-1:-1:-1;;;74538:21:0:i;:::-;74570:34;74575:7;74584:3;;74570:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74570:34:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74589:5:0;;-1:-1:-1;74589:5:0;;;;74570:34;;74589:5;;;;74570:34;;;;;;;;;-1:-1:-1;74596:7:0;;-1:-1:-1;74570:4:0;;-1:-1:-1;;74570:34:0:i;74876:256::-;75015:19;75026:7;75015:10;:19::i;:::-;75007:60;;;;-1:-1:-1;;;75007:60:0;;38664:2:1;75007:60:0;;;38646:21:1;38703:2;38683:18;;;38676:30;38742;38722:18;;;38715:58;38790:18;;75007:60:0;38462:352:1;75007:60:0;75078:46;75083:7;75092:15;75099:7;75092:6;:15::i;:::-;75109:5;;75078:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75116:7:0;;-1:-1:-1;75078:4:0;;-1:-1:-1;;75078:46:0:i;53885:566::-;53944:13;53970:17;53996:3;53970:30;;54011:19;54043:4;:11;-1:-1:-1;;;;;54033:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54033:22:0;;54011:44;;54071:6;54066:346;54087:4;:11;54083:1;:15;54066:346;;;54182:2;54170:4;54175:1;54170:7;;;;;;;;:::i;:::-;;;;;;;54164:20;;;;54163:48;;;54208:2;54196:4;54201:1;54196:7;;;;;;;;:::i;:::-;;;;;;;54190:20;;54163:48;54159:242;;;54311:4;54316:1;54311:7;;;;;;;;:::i;:::-;;;;;;;;;54305:14;;54322:2;54305:19;;;;:::i;:::-;54298:27;;54286:6;54293:1;54286:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;54286:39:0;;;;;;;;;54159:242;;;54378:4;54383:1;54378:7;;;;;;;;:::i;:::-;;;;;;;;;54366:6;54373:1;54366:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;54366:19:0;;;;;;;;;54159:242;54100:3;;;;:::i;:::-;;;;54066:346;;69115:153;69193:19;69204:7;69193:10;:19::i;:::-;69188:73;;69229:14;;;;:5;:14;;;;;;;;:20;;;;;;;;:::i;53262:617::-;53560:8;;53320:4;;53533:1;53526:9;;;;53556:18;;;53320:4;;53641:210;53657:3;53651;:9;53641:210;;;53726:10;;53738:4;53722:21;53768:4;53763:9;;;53759:58;;53793:8;53800:1;53793:8;;:::i;:::-;;;53759:58;53831:8;53838:1;53831:8;;:::i;:::-;;;53669:182;53662:5;;;;;:::i;:::-;;;;53641:210;;;-1:-1:-1;53868:3:0;53262:617;-1:-1:-1;;;;53262:617:0:o;38275:110::-;38351:26;38361:2;38365:7;38351:26;;;;;;;;;;;;:9;:26::i;84255:215::-;84355:16;84363:7;84355;:16::i;:::-;84347:73;;;;-1:-1:-1;;;84347:73:0;;39230:2:1;84347:73:0;;;39212:21:1;39269:2;39249:18;;;39242:30;39308:34;39288:18;;;39281:62;-1:-1:-1;;;39359:18:1;;;39352:42;39411:19;;84347:73:0;39028:408:1;84347:73:0;84431:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;76004:229::-;76107:17;76126:19;76169:15;76176:7;76169:6;:15::i;:::-;76163:21;;76203:22;76208:7;76217;76203:4;:22::i;:::-;76195:30;;76004:229;;;;;:::o;53050:97::-;53107:32;:16;53131:7;53107:23;:32::i;23671:173::-;23746:6;;;-1:-1:-1;;;;;23763:17:0;;;-1:-1:-1;;;;;;23763:17:0;;;;;;;23796:40;;23746:6;;;23763:17;23746:6;;23796:40;;23727:16;;23796:40;23716:128;23671:173;:::o;66941:114::-;67001:7;67028:19;67036:3;59970:18;;59887:109;88312:834;-1:-1:-1;;;;;88414:16:0;;88406:47;;;;-1:-1:-1;;;88406:47:0;;39643:2:1;88406:47:0;;;39625:21:1;39682:2;39662:18;;;39655:30;-1:-1:-1;;;39701:18:1;;;39694:48;39759:18;;88406:47:0;39441:342:1;88406:47:0;88476:3;88470:17;88491:1;88470:22;88462:69;;;;-1:-1:-1;;;88462:69:0;;;;;;;:::i;:::-;88548:10;88554:3;88548:5;:10::i;:::-;:18;;88562:4;88548:18;88540:57;;;;-1:-1:-1;;;88540:57:0;;27661:2:1;88540:57:0;;;27643:21:1;27700:2;27680:18;;;27673:30;27739:28;27719:18;;;27712:56;27785:18;;88540:57:0;27459:350:1;88540:57:0;88620:6;88614:20;88638:1;88614:25;88606:62;;;;-1:-1:-1;;;88606:62:0;;28371:2:1;88606:62:0;;;28353:21:1;28410:2;28390:18;;;28383:30;-1:-1:-1;;;28429:18:1;;;28422:54;28493:18;;88606:62:0;28169:348:1;88606:62:0;88686:27;88706:6;88686:19;:27::i;:::-;:32;88678:63;;;;-1:-1:-1;;;88678:63:0;;39990:2:1;88678:63:0;;;39972:21:1;40029:2;40009:18;;;40002:30;-1:-1:-1;;;40048:18:1;;;40041:48;40106:18;;88678:63:0;39788:342:1;88678:63:0;88748:21;88772:26;88791:6;88772:18;:26::i;:::-;88748:50;;88805:18;88826:23;88845:3;88826:18;:23::i;:::-;88805:44;;88892:7;88906:4;88875:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;88858:54;;88919:15;88937:19;88948:7;88937:10;:19::i;:::-;88919:37;;88975:16;88983:7;88975;:16::i;:::-;88974:17;88965:52;;;;-1:-1:-1;;;88965:52:0;;;;;;;:::i;:::-;89031:22;89041:2;89045:7;89031:9;:22::i;:::-;89066:30;89079:7;89088;89066:12;:30::i;:::-;89121:7;89114:24;89130:7;89114:24;;;;;;:::i;:::-;;;;;;;;88401:745;;;88312:834;;;:::o;51887:203::-;51959:4;-1:-1:-1;;;;;51984:21:0;;51976:68;;;;-1:-1:-1;;;51976:68:0;;40337:2:1;51976:68:0;;;40319:21:1;40376:2;40356:18;;;40349:30;40415:34;40395:18;;;40388:62;-1:-1:-1;;;40466:18:1;;;40459:32;40508:19;;51976:68:0;40135:398:1;51976:68:0;-1:-1:-1;;;;;;52062:20:0;:11;:20;;;;;;;;;;;;;;;51887:203::o;92621:979::-;-1:-1:-1;;;;;92739:16:0;;92731:25;;;;;;92782:3;92776:17;92797:1;92776:22;92767:32;;;;;;92819:24;92839:3;92819:19;:24::i;:::-;:29;92810:39;;;;;;92869:16;92877:7;92869;:16::i;:::-;92860:26;;;;;;92895:18;92916:23;92935:3;92916:18;:23::i;:::-;92895:44;;92954:20;92994:4;93005:10;:19;93016:7;93005:19;;;;;;;;;;;92977:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;92954:71;;93034:19;93056:27;93074:7;93056:10;:27::i;:::-;93034:49;;93102:20;93110:11;93102:7;:20::i;:::-;93101:21;93092:56;;;;-1:-1:-1;;;93092:56:0;;;;;;;:::i;:::-;93161:13;93197:19;;;:10;:19;;;;;93177:40;;;;93197:19;93177:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:40::i;:::-;93161:56;;93236:5;93245:1;93236:10;93232:83;;93267:19;;;;:10;:19;;;;;:36;;93291:11;93267:23;:36::i;:::-;;93232:83;93331:19;;:24;93327:149;;93372:33;93382:2;93386:11;93399:5;93372:9;:33::i;:::-;93327:149;;;93438:26;93448:2;93452:11;93438:9;:26::i;:::-;93496:42;93509:11;93529:7;93496:12;:42::i;:::-;93563:11;93556:36;93583:7;93556:36;;;;;;:::i;:::-;;;;;;;;92726:874;;;;92621:979;;;;:::o;36663:315::-;36820:28;36830:4;36836:2;36840:7;36820:9;:28::i;:::-;36867:48;36890:4;36896:2;36900:7;36909:5;36867:22;:48::i;:::-;36859:111;;;;-1:-1:-1;;;36859:111:0;;;;;;;:::i;93606:517::-;93686:18;93707:23;93726:3;93707:18;:23::i;:::-;93686:44;;93745:20;93785:4;93796:10;:19;93807:7;93796:19;;;;;;;;;;;93768:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;93745:71;;93825:19;93847:27;93865:7;93847:10;:27::i;:::-;93924:19;;;;:10;:19;;;;;93825:49;;-1:-1:-1;93924:39:0;;93825:49;93924:26;:39::i;:::-;-1:-1:-1;93982:23:0;;;;:10;:23;;;;;93976:37;;;;;:::i;:::-;:42;;-1:-1:-1;93972:105:0;;94042:23;;;;:10;:23;;;;;94035:30;;;:::i;:::-;94091:24;94103:11;94091;:24::i;83252:104::-;83304:13;83337:11;83330:18;;;;;:::i;74620:248::-;74764:9;74759:102;74779:15;;;74759:102;;;74816:33;74821:4;;74826:1;74821:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;74830:6;;74837:1;74830:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;74841:7;74816:4;:33::i;:::-;74796:3;;;;:::i;:::-;;;;74759:102;;75424:208;75567:15;75574:7;75567:6;:15::i;:::-;75593:31;75602:4;;75608:6;;75616:7;75593:8;:31::i;31393:305::-;31495:4;-1:-1:-1;;;;;;31532:40:0;;-1:-1:-1;;;31532:40:0;;:105;;-1:-1:-1;;;;;;;31589:48:0;;-1:-1:-1;;;31589:48:0;31532:105;:158;;;-1:-1:-1;;;;;;;;;;11520:40:0;;;31654:36;11411:157;76241:148;76311:13;76344:8;:28;76353:18;76363:7;76353:9;:18::i;:::-;76344:28;;;;;;;;;;;:37;76373:7;76344:37;;;;;;;;;;;76337:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76241:148;;;;:::o;74167:164::-;74234:7;74261:22;;;:13;:22;;;;;;:27;:62;;74301:22;;;;:13;:22;;;;;;74261:62;;;-1:-1:-1;74291:7:0;74167:164::o;94899:172::-;95021:45;95048:4;95054:2;95058:7;95021:26;:45::i;60350:120::-;60417:7;60444:3;:11;;60456:5;60444:18;;;;;;;;:::i;:::-;;;;;;;;;60437:25;;60350:120;;;;:::o;76397:386::-;76557:8;:28;76566:18;76576:7;76566:9;:18::i;:::-;76557:28;;;;;;;;;;;:37;76586:7;76557:37;;;;;;;;;;;76551:51;;;;;:::i;:::-;;;76606:1;76551:56;76547:119;;76645:3;76629:25;;;;;;:::i;:::-;;;;;;;;76636:7;76629:25;76650:3;76629:25;;;;;;:::i;:::-;;;;;;;;76547:119;76718:5;76678:8;:28;76687:18;76697:7;76687:9;:18::i;:::-;76678:28;;;;;;;;;;;:37;76707:7;76678:37;;;;;;;;;;;:45;;;;;;;;;;;;:::i;:::-;;76757:5;76739:36;;;;;;:::i;:::-;;;;;;;;76752:3;76739:36;;;;;;:::i;:::-;;;;;;;;76743:7;76739:36;76764:3;76769:5;76739:36;;;;;;;:::i;:::-;;;;;;;;76397:386;;;;:::o;68983:124::-;69043:4;69073:14;;;:5;:14;;;;;69067:28;;69043:4;;69073:14;69067:28;;;:::i;:::-;;;:32;69060:39;;68983:124;;;:::o;38612:321::-;38742:18;38748:2;38752:7;38742:5;:18::i;:::-;38793:54;38824:1;38828:2;38832:7;38841:5;38793:22;:54::i;:::-;38771:154;;;;-1:-1:-1;;;38771:154:0;;;;;;;:::i;51609:183::-;51689:18;51693:4;51699:7;51689:3;:18::i;:::-;51681:64;;;;-1:-1:-1;;;51681:64:0;;42789:2:1;51681:64:0;;;42771:21:1;42828:2;42808:18;;;42801:30;42867:34;42847:18;;;42840:62;-1:-1:-1;;;42918:18:1;;;42911:31;42959:19;;51681:64:0;42587:397:1;51681:64:0;-1:-1:-1;;;;;51756:20:0;51779:5;51756:20;;;;;;;;;;;:28;;-1:-1:-1;;51756:28:0;;;51609:183::o;66179:131::-;66246:4;66270:32;66275:3;66295:5;66270:4;:32::i;42012:799::-;42167:4;-1:-1:-1;;;;;42188:13:0;;14624:20;14672:8;42184:620;;42224:72;;-1:-1:-1;;;42224:72:0;;-1:-1:-1;;;;;42224:36:0;;;;;:72;;682:10;;42275:4;;42281:7;;42290:5;;42224:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42224:72:0;;;;;;;;-1:-1:-1;;42224:72:0;;;;;;;;;;;;:::i;:::-;;;42220:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42466:6;:13;42483:1;42466:18;42462:272;;42509:60;;-1:-1:-1;;;42509:60:0;;;;;;;:::i;42462:272::-;42684:6;42678:13;42669:6;42665:2;42661:15;42654:38;42220:529;-1:-1:-1;;;;;;42347:51:0;-1:-1:-1;;;42347:51:0;;-1:-1:-1;42340:58:0;;42184:620;-1:-1:-1;42788:4:0;42012:799;;;;;;:::o;66486:137::-;66556:4;66580:35;66588:3;66608:5;66580:7;:35::i;45828:589::-;-1:-1:-1;;;;;46034:18:0;;46030:187;;46069:40;46101:7;47244:10;:17;;47217:24;;;;:15;:24;;;;;:44;;;47272:24;;;;;;;;;;;;47140:164;46069:40;46030:187;;;46139:2;-1:-1:-1;;;;;46131:10:0;:4;-1:-1:-1;;;;;46131:10:0;;46127:90;;46158:47;46191:4;46197:7;46158:32;:47::i;:::-;-1:-1:-1;;;;;46231:16:0;;46227:183;;46264:45;46301:7;46264:36;:45::i;46227:183::-;46337:4;-1:-1:-1;;;;;46331:10:0;:2;-1:-1:-1;;;;;46331:10:0;;46327:83;;46358:40;46386:2;46390:7;46358:27;:40::i;39269:382::-;-1:-1:-1;;;;;39349:16:0;;39341:61;;;;-1:-1:-1;;;39341:61:0;;43939:2:1;39341:61:0;;;43921:21:1;;;43958:18;;;43951:30;44017:34;43997:18;;;43990:62;44069:18;;39341:61:0;43737:356:1;39341:61:0;39422:16;39430:7;39422;:16::i;:::-;39421:17;39413:58;;;;-1:-1:-1;;;39413:58:0;;44300:2:1;39413:58:0;;;44282:21:1;44339:2;44319:18;;;44312:30;44378;44358:18;;;44351:58;44426:18;;39413:58:0;44098:352:1;39413:58:0;39484:45;39513:1;39517:2;39521:7;39484:20;:45::i;:::-;-1:-1:-1;;;;;39542:13:0;;;;;;:9;:13;;;;;:18;;39559:1;;39542:13;:18;;39559:1;;39542:18;:::i;:::-;;;;-1:-1:-1;;39571:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39571:21:0;-1:-1:-1;;;;;39571:21:0;;;;;;;;39610:33;;39571:16;;;39610:33;;39571:16;;39610:33;39269:382;;:::o;57576:414::-;57639:4;59769:19;;;:12;;;:19;;;;;;57656:327;;-1:-1:-1;57699:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;57882:18;;57860:19;;;:12;;;:19;;;;;;:40;;;;57915:11;;57656:327;-1:-1:-1;57966:5:0;57959:12;;58166:1420;58232:4;58371:19;;;:12;;;:19;;;;;;58407:15;;58403:1176;;58782:21;58806:14;58819:1;58806:10;:14;:::i;:::-;58855:18;;58782:38;;-1:-1:-1;58835:17:0;;58855:22;;58876:1;;58855:22;:::i;:::-;58835:42;;58911:13;58898:9;:26;58894:405;;58945:17;58965:3;:11;;58977:9;58965:22;;;;;;;;:::i;:::-;;;;;;;;;58945:42;;59119:9;59090:3;:11;;59102:13;59090:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;59204:23;;;:12;;;:23;;;;;:36;;;58894:405;59380:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;59475:3;:12;;:19;59488:5;59475:19;;;;;;;;;;;59468:26;;;59518:4;59511:11;;;;;;;58403:1176;59562:5;59555:12;;;;;47931:988;48197:22;48247:1;48222:22;48239:4;48222:16;:22::i;:::-;:26;;;;:::i;:::-;48259:18;48280:26;;;:17;:26;;;;;;48197:51;;-1:-1:-1;48413:28:0;;;48409:328;;-1:-1:-1;;;;;48480:18:0;;48458:19;48480:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48531:30;;;;;;:44;;;48648:30;;:17;:30;;;;;:43;;;48409:328;-1:-1:-1;48833:26:0;;;;:17;:26;;;;;;;;48826:33;;;-1:-1:-1;;;;;48877:18:0;;;;;:12;:18;;;;;:34;;;;;;;48870:41;47931:988::o;49214:1079::-;49492:10;:17;49467:22;;49492:21;;49512:1;;49492:21;:::i;:::-;49524:18;49545:24;;;:15;:24;;;;;;49918:10;:26;;49467:46;;-1:-1:-1;49545:24:0;;49467:46;;49918:26;;;;;;:::i;:::-;;;;;;;;;49896:48;;49982:11;49957:10;49968;49957:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;50062:28;;;:15;:28;;;;;;;:41;;;50234:24;;;;;50227:31;50269:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49285:1008;;;49214:1079;:::o;46718:221::-;46803:14;46820:20;46837:2;46820:16;:20::i;:::-;-1:-1:-1;;;;;46851:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;46896:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46718:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;1143:258::-;1215:1;1225:113;1239:6;1236:1;1233:13;1225:113;;;1315:11;;;1309:18;1296:11;;;1289:39;1261:2;1254:10;1225:113;;;1356:6;1353:1;1350:13;1347:48;;;-1:-1:-1;;1391:1:1;1373:16;;1366:27;1143:258::o;1406:::-;1448:3;1486:5;1480:12;1513:6;1508:3;1501:19;1529:63;1585:6;1578:4;1573:3;1569:14;1562:4;1555:5;1551:16;1529:63;:::i;:::-;1646:2;1625:15;-1:-1:-1;;1621:29:1;1612:39;;;;1653:4;1608:50;;1406:258;-1:-1:-1;;1406:258:1:o;1669:220::-;1818:2;1807:9;1800:21;1781:4;1838:45;1879:2;1868:9;1864:18;1856:6;1838:45;:::i;1894:180::-;1953:6;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;-1:-1:-1;2045:23:1;;1894:180;-1:-1:-1;1894:180:1:o;2287:254::-;2355:6;2363;2416:2;2404:9;2395:7;2391:23;2387:32;2384:52;;;2432:1;2429;2422:12;2384:52;2455:29;2474:9;2455:29;:::i;:::-;2445:39;2531:2;2516:18;;;;2503:32;;-1:-1:-1;;;2287:254:1:o;2546:375::-;2617:8;2627:6;2681:3;2674:4;2666:6;2662:17;2658:27;2648:55;;2699:1;2696;2689:12;2648:55;-1:-1:-1;2722:20:1;;-1:-1:-1;;;;;2754:30:1;;2751:50;;;2797:1;2794;2787:12;2751:50;2834:4;2826:6;2822:17;2810:29;;2894:3;2887:4;2877:6;2874:1;2870:14;2862:6;2858:27;2854:38;2851:47;2848:67;;;2911:1;2908;2901:12;2848:67;2546:375;;;;;:::o;2926:525::-;3033:6;3041;3049;3102:2;3090:9;3081:7;3077:23;3073:32;3070:52;;;3118:1;3115;3108:12;3070:52;3158:9;3145:23;-1:-1:-1;;;;;3183:6:1;3180:30;3177:50;;;3223:1;3220;3213:12;3177:50;3262:78;3332:7;3323:6;3312:9;3308:22;3262:78;:::i;:::-;3359:8;;3236:104;;-1:-1:-1;3441:2:1;3426:18;;;;3413:32;;2926:525;-1:-1:-1;;;;2926:525:1:o;3456:616::-;3508:3;3546:5;3540:12;3573:6;3568:3;3561:19;3599:4;3640:2;3635:3;3631:12;3665:11;3692;3685:18;;3742:6;3739:1;3735:14;3728:5;3724:26;3712:38;;3784:2;3777:5;3773:14;3805:1;3815:231;3829:6;3826:1;3823:13;3815:231;;;3900:5;3894:4;3890:16;3885:3;3878:29;3928:38;3961:4;3952:6;3946:13;3928:38;:::i;:::-;4024:12;;;;3920:46;-1:-1:-1;3989:15:1;;;;3851:1;3844:9;3815:231;;;-1:-1:-1;4062:4:1;;3456:616;-1:-1:-1;;;;;;;3456:616:1:o;4077:280::-;4276:2;4265:9;4258:21;4239:4;4296:55;4347:2;4336:9;4332:18;4324:6;4296:55;:::i;4362:348::-;4414:8;4424:6;4478:3;4471:4;4463:6;4459:17;4455:27;4445:55;;4496:1;4493;4486:12;4445:55;-1:-1:-1;4519:20:1;;-1:-1:-1;;;;;4551:30:1;;4548:50;;;4594:1;4591;4584:12;4548:50;4631:4;4623:6;4619:17;4607:29;;4683:3;4676:4;4667:6;4659;4655:19;4651:30;4648:39;4645:59;;;4700:1;4697;4690:12;4715:479;4795:6;4803;4811;4864:2;4852:9;4843:7;4839:23;4835:32;4832:52;;;4880:1;4877;4870:12;4832:52;4920:9;4907:23;-1:-1:-1;;;;;4945:6:1;4942:30;4939:50;;;4985:1;4982;4975:12;4939:50;5024:59;5075:7;5066:6;5055:9;5051:22;5024:59;:::i;5199:457::-;5297:6;5305;5358:2;5346:9;5337:7;5333:23;5329:32;5326:52;;;5374:1;5371;5364:12;5326:52;5414:9;5401:23;-1:-1:-1;;;;;5439:6:1;5436:30;5433:50;;;5479:1;5476;5469:12;5433:50;5518:78;5588:7;5579:6;5568:9;5564:22;5518:78;:::i;:::-;5615:8;;5492:104;;-1:-1:-1;5199:457:1;-1:-1:-1;;;;5199:457:1:o;5661:328::-;5738:6;5746;5754;5807:2;5795:9;5786:7;5782:23;5778:32;5775:52;;;5823:1;5820;5813:12;5775:52;5846:29;5865:9;5846:29;:::i;:::-;5836:39;;5894:38;5928:2;5917:9;5913:18;5894:38;:::i;:::-;5884:48;;5979:2;5968:9;5964:18;5951:32;5941:42;;5661:328;;;;;:::o;5994:869::-;6137:6;6145;6153;6161;6169;6222:2;6210:9;6201:7;6197:23;6193:32;6190:52;;;6238:1;6235;6228:12;6190:52;6278:9;6265:23;-1:-1:-1;;;;;6348:2:1;6340:6;6337:14;6334:34;;;6364:1;6361;6354:12;6334:34;6403:78;6473:7;6464:6;6453:9;6449:22;6403:78;:::i;:::-;6500:8;;-1:-1:-1;6377:104:1;-1:-1:-1;6588:2:1;6573:18;;6560:32;;-1:-1:-1;6604:16:1;;;6601:36;;;6633:1;6630;6623:12;6601:36;;6672:80;6744:7;6733:8;6722:9;6718:24;6672:80;:::i;:::-;5994:869;;;;-1:-1:-1;6771:8:1;6853:2;6838:18;6825:32;;5994:869;-1:-1:-1;;;;5994:869:1:o;6868:248::-;6936:6;6944;6997:2;6985:9;6976:7;6972:23;6968:32;6965:52;;;7013:1;7010;7003:12;6965:52;-1:-1:-1;;7036:23:1;;;7106:2;7091:18;;;7078:32;;-1:-1:-1;6868:248:1:o;7639:127::-;7700:10;7695:3;7691:20;7688:1;7681:31;7731:4;7728:1;7721:15;7755:4;7752:1;7745:15;7771:275;7842:2;7836:9;7907:2;7888:13;;-1:-1:-1;;7884:27:1;7872:40;;-1:-1:-1;;;;;7927:34:1;;7963:22;;;7924:62;7921:88;;;7989:18;;:::i;:::-;8025:2;8018:22;7771:275;;-1:-1:-1;7771:275:1:o;8051:530::-;8093:5;8146:3;8139:4;8131:6;8127:17;8123:27;8113:55;;8164:1;8161;8154:12;8113:55;8200:6;8187:20;-1:-1:-1;;;;;8222:2:1;8219:26;8216:52;;;8248:18;;:::i;:::-;8292:55;8335:2;8316:13;;-1:-1:-1;;8312:27:1;8341:4;8308:38;8292:55;:::i;:::-;8372:2;8363:7;8356:19;8418:3;8411:4;8406:2;8398:6;8394:15;8390:26;8387:35;8384:55;;;8435:1;8432;8425:12;8384:55;8500:2;8493:4;8485:6;8481:17;8474:4;8465:7;8461:18;8448:55;8548:1;8523:16;;;8541:4;8519:27;8512:38;;;;8527:7;8051:530;-1:-1:-1;;;8051:530:1:o;8586:320::-;8654:6;8707:2;8695:9;8686:7;8682:23;8678:32;8675:52;;;8723:1;8720;8713:12;8675:52;8763:9;8750:23;-1:-1:-1;;;;;8788:6:1;8785:30;8782:50;;;8828:1;8825;8818:12;8782:50;8851:49;8892:7;8883:6;8872:9;8868:22;8851:49;:::i;8911:789::-;9012:6;9020;9028;9036;9044;9097:2;9085:9;9076:7;9072:23;9068:32;9065:52;;;9113:1;9110;9103:12;9065:52;9153:9;9140:23;-1:-1:-1;;;;;9223:2:1;9215:6;9212:14;9209:34;;;9239:1;9236;9229:12;9209:34;9278:59;9329:7;9320:6;9309:9;9305:22;9278:59;:::i;:::-;9356:8;;-1:-1:-1;9252:85:1;-1:-1:-1;9444:2:1;9429:18;;9416:32;;-1:-1:-1;9460:16:1;;;9457:36;;;9489:1;9486;9479:12;9457:36;;9528:61;9581:7;9570:8;9559:9;9555:24;9528:61;:::i;9705:547::-;9794:6;9802;9810;9818;9871:2;9859:9;9850:7;9846:23;9842:32;9839:52;;;9887:1;9884;9877:12;9839:52;9923:9;9910:23;9900:33;;9984:2;9973:9;9969:18;9956:32;-1:-1:-1;;;;;10003:6:1;10000:30;9997:50;;;10043:1;10040;10033:12;9997:50;10082:59;10133:7;10124:6;10113:9;10109:22;10082:59;:::i;:::-;9705:547;;10160:8;;-1:-1:-1;10056:85:1;;10242:2;10227:18;10214:32;;9705:547;-1:-1:-1;;;;9705:547:1:o;10583:411::-;10654:6;10662;10715:2;10703:9;10694:7;10690:23;10686:32;10683:52;;;10731:1;10728;10721:12;10683:52;10771:9;10758:23;-1:-1:-1;;;;;10796:6:1;10793:30;10790:50;;;10836:1;10833;10826:12;10790:50;10875:59;10926:7;10917:6;10906:9;10902:22;10875:59;:::i;10999:541::-;11087:6;11095;11148:2;11136:9;11127:7;11123:23;11119:32;11116:52;;;11164:1;11161;11154:12;11116:52;11204:9;11191:23;-1:-1:-1;;;;;11274:2:1;11266:6;11263:14;11260:34;;;11290:1;11287;11280:12;11260:34;11313:49;11354:7;11345:6;11334:9;11330:22;11313:49;:::i;:::-;11303:59;;11415:2;11404:9;11400:18;11387:32;11371:48;;11444:2;11434:8;11431:16;11428:36;;;11460:1;11457;11450:12;11428:36;;11483:51;11526:7;11515:8;11504:9;11500:24;11483:51;:::i;:::-;11473:61;;;10999:541;;;;;:::o;11545:383::-;11742:2;11731:9;11724:21;11705:4;11768:45;11809:2;11798:9;11794:18;11786:6;11768:45;:::i;:::-;11861:9;11853:6;11849:22;11844:2;11833:9;11829:18;11822:50;11889:33;11915:6;11907;11889:33;:::i;:::-;11881:41;11545:383;-1:-1:-1;;;;;11545:383:1:o;11933:615::-;12030:6;12038;12046;12099:2;12087:9;12078:7;12074:23;12070:32;12067:52;;;12115:1;12112;12105:12;12067:52;12138:29;12157:9;12138:29;:::i;:::-;12128:39;;12218:2;12207:9;12203:18;12190:32;-1:-1:-1;;;;;12282:2:1;12274:6;12271:14;12268:34;;;12298:1;12295;12288:12;12268:34;12321:49;12362:7;12353:6;12342:9;12338:22;12321:49;:::i;:::-;12311:59;;12423:2;12412:9;12408:18;12395:32;12379:48;;12452:2;12442:8;12439:16;12436:36;;;12468:1;12465;12458:12;12436:36;;12491:51;12534:7;12523:8;12512:9;12508:24;12491:51;:::i;:::-;12481:61;;;11933:615;;;;;:::o;12553:1688::-;12702:6;12710;12718;12726;12779:2;12767:9;12758:7;12754:23;12750:32;12747:52;;;12795:1;12792;12785:12;12747:52;12835:9;12822:23;-1:-1:-1;;;;;12905:2:1;12897:6;12894:14;12891:34;;;12921:1;12918;12911:12;12891:34;12960:78;13030:7;13021:6;13010:9;13006:22;12960:78;:::i;:::-;13057:8;;-1:-1:-1;12934:104:1;-1:-1:-1;13111:2:1;;-1:-1:-1;13151:18:1;;;13138:32;13182:16;;;13179:36;;;13211:1;13208;13201:12;13179:36;13234:24;;13289:4;13281:13;;13277:27;-1:-1:-1;13267:55:1;;13318:1;13315;13308:12;13267:55;13354:2;13341:16;13376:2;13372;13369:10;13366:36;;;13382:18;;:::i;:::-;13428:2;13425:1;13421:10;13451:28;13475:2;13471;13467:11;13451:28;:::i;:::-;13513:15;;;13583:11;;;13579:20;;;13544:12;;;;13611:19;;;13608:39;;;13643:1;13640;13633:12;13608:39;13675:2;13671;13667:11;13656:22;;13687:352;13703:6;13698:3;13695:15;13687:352;;;13789:3;13776:17;13825:2;13812:11;13809:19;13806:109;;;13869:1;13898:2;13894;13887:14;13806:109;13940:56;13988:7;13983:2;13969:11;13965:2;13961:20;13957:29;13940:56;:::i;:::-;13928:69;;-1:-1:-1;13720:12:1;;;;14017;;;;13687:352;;;14058:5;-1:-1:-1;;;;14116:2:1;14101:18;;14088:32;;-1:-1:-1;;14132:16:1;;;14129:36;;;14161:1;14158;14151:12;14129:36;;14184:51;14227:7;14216:8;14205:9;14201:24;14184:51;:::i;:::-;14174:61;;;12553:1688;;;;;;;:::o;14246:463::-;14333:6;14341;14349;14402:2;14390:9;14381:7;14377:23;14373:32;14370:52;;;14418:1;14415;14408:12;14370:52;14441:29;14460:9;14441:29;:::i;:::-;14431:39;;14517:2;14506:9;14502:18;14489:32;14479:42;;14572:2;14561:9;14557:18;14544:32;-1:-1:-1;;;;;14591:6:1;14588:30;14585:50;;;14631:1;14628;14621:12;14585:50;14654:49;14695:7;14686:6;14675:9;14671:22;14654:49;:::i;14714:160::-;14779:20;;14835:13;;14828:21;14818:32;;14808:60;;14864:1;14861;14854:12;14879:254;14944:6;14952;15005:2;14993:9;14984:7;14980:23;14976:32;14973:52;;;15021:1;15018;15011:12;14973:52;15044:29;15063:9;15044:29;:::i;:::-;15034:39;;15092:35;15123:2;15112:9;15108:18;15092:35;:::i;15656:503::-;15953:2;15942:9;15935:21;15916:4;15979:55;16030:2;16019:9;16015:18;16007:6;15979:55;:::i;:::-;16082:9;16074:6;16070:22;16065:2;16054:9;16050:18;16043:50;16110:43;16146:6;16138;16110:43;:::i;16164:537::-;16259:6;16267;16275;16283;16336:3;16324:9;16315:7;16311:23;16307:33;16304:53;;;16353:1;16350;16343:12;16304:53;16376:29;16395:9;16376:29;:::i;:::-;16366:39;;16424:38;16458:2;16447:9;16443:18;16424:38;:::i;:::-;16414:48;;16509:2;16498:9;16494:18;16481:32;16471:42;;16564:2;16553:9;16549:18;16536:32;-1:-1:-1;;;;;16583:6:1;16580:30;16577:50;;;16623:1;16620;16613:12;16577:50;16646:49;16687:7;16678:6;16667:9;16663:22;16646:49;:::i;16706:825::-;16994:2;17006:21;;;17076:13;;16979:18;;;17098:22;;;16946:4;;17173;;17151:2;17136:18;;;17200:15;;;16946:4;17243:169;17257:6;17254:1;17251:13;17243:169;;;17318:13;;17306:26;;17352:12;;;;17387:15;;;;17279:1;17272:9;17243:169;;;17247:3;;;17457:9;17452:3;17448:19;17443:2;17432:9;17428:18;17421:47;17485:40;17521:3;17513:6;17485:40;:::i;:::-;17477:48;16706:825;-1:-1:-1;;;;;;16706:825:1:o;17759:389::-;17837:6;17845;17898:2;17886:9;17877:7;17873:23;17869:32;17866:52;;;17914:1;17911;17904:12;17866:52;17950:9;17937:23;17927:33;;18011:2;18000:9;17996:18;17983:32;-1:-1:-1;;;;;18030:6:1;18027:30;18024:50;;;18070:1;18067;18060:12;18024:50;18093:49;18134:7;18125:6;18114:9;18110:22;18093:49;:::i;19039:260::-;19107:6;19115;19168:2;19156:9;19147:7;19143:23;19139:32;19136:52;;;19184:1;19181;19174:12;19136:52;19207:29;19226:9;19207:29;:::i;:::-;19197:39;;19255:38;19289:2;19278:9;19274:18;19255:38;:::i;19304:385::-;19390:6;19398;19406;19414;19467:3;19455:9;19446:7;19442:23;19438:33;19435:53;;;19484:1;19481;19474:12;19435:53;-1:-1:-1;;19507:23:1;;;19577:2;19562:18;;19549:32;;-1:-1:-1;19628:2:1;19613:18;;19600:32;;19679:2;19664:18;19651:32;;-1:-1:-1;19304:385:1;-1:-1:-1;19304:385:1:o;19694:180::-;19750:6;19803:2;19791:9;19782:7;19778:23;19774:32;19771:52;;;19819:1;19816;19809:12;19771:52;19842:26;19858:9;19842:26;:::i;20329:380::-;20408:1;20404:12;;;;20451;;;20472:61;;20526:4;20518:6;20514:17;20504:27;;20472:61;20579:2;20571:6;20568:14;20548:18;20545:38;20542:161;;20625:10;20620:3;20616:20;20613:1;20606:31;20660:4;20657:1;20650:15;20688:4;20685:1;20678:15;20542:161;;20329:380;;;:::o;21954:127::-;22015:10;22010:3;22006:20;22003:1;21996:31;22046:4;22043:1;22036:15;22070:4;22067:1;22060:15;22086:522;22164:4;22170:6;22230:11;22217:25;22324:2;22320:7;22309:8;22293:14;22289:29;22285:43;22265:18;22261:68;22251:96;;22343:1;22340;22333:12;22251:96;22370:33;;22422:20;;;-1:-1:-1;;;;;;22454:30:1;;22451:50;;;22497:1;22494;22487:12;22451:50;22530:4;22518:17;;-1:-1:-1;22561:14:1;22557:27;;;22547:38;;22544:58;;;22598:1;22595;22588:12;22613:127;22674:10;22669:3;22665:20;22662:1;22655:31;22705:4;22702:1;22695:15;22729:4;22726:1;22719:15;22745:135;22784:3;22805:17;;;22802:43;;22825:18;;:::i;:::-;-1:-1:-1;22872:1:1;22861:13;;22745:135::o;22885:356::-;23087:2;23069:21;;;23106:18;;;23099:30;23165:34;23160:2;23145:18;;23138:62;23232:2;23217:18;;22885:356::o;23246:406::-;23448:2;23430:21;;;23487:2;23467:18;;;23460:30;23526:34;23521:2;23506:18;;23499:62;-1:-1:-1;;;23592:2:1;23577:18;;23570:40;23642:3;23627:19;;23246:406::o;23657:271::-;23840:6;23832;23827:3;23814:33;23796:3;23866:16;;23891:13;;;23866:16;23657:271;-1:-1:-1;23657:271:1:o;23933:413::-;24135:2;24117:21;;;24174:2;24154:18;;;24147:30;24213:34;24208:2;24193:18;;24186:62;-1:-1:-1;;;24279:2:1;24264:18;;24257:47;24336:3;24321:19;;23933:413::o;24763:412::-;24965:2;24947:21;;;25004:2;24984:18;;;24977:30;25043:34;25038:2;25023:18;;25016:62;-1:-1:-1;;;25109:2:1;25094:18;;25087:46;25165:3;25150:19;;24763:412::o;25597:276::-;25728:3;25766:6;25760:13;25782:53;25828:6;25823:3;25816:4;25808:6;25804:17;25782:53;:::i;:::-;25851:16;;;;;25597:276;-1:-1:-1;;25597:276:1:o;27056:398::-;27258:2;27240:21;;;27297:2;27277:18;;;27270:30;27336:34;27331:2;27316:18;;27309:62;-1:-1:-1;;;27402:2:1;27387:18;;27380:32;27444:3;27429:19;;27056:398::o;30385:125::-;30425:4;30453:1;30450;30447:8;30444:34;;;30458:18;;:::i;:::-;-1:-1:-1;30495:9:1;;30385:125::o;30515:217::-;30555:1;30581;30571:132;;30625:10;30620:3;30616:20;30613:1;30606:31;30660:4;30657:1;30650:15;30688:4;30685:1;30678:15;30571:132;-1:-1:-1;30717:9:1;;30515:217::o;30737:168::-;30777:7;30843:1;30839;30835:6;30831:14;30828:1;30825:21;30820:1;30813:9;30806:17;30802:45;30799:71;;;30850:18;;:::i;:::-;-1:-1:-1;30890:9:1;;30737:168::o;30910:417::-;31112:2;31094:21;;;31151:2;31131:18;;;31124:30;31190:34;31185:2;31170:18;;31163:62;-1:-1:-1;;;31256:2:1;31241:18;;31234:51;31317:3;31302:19;;30910:417::o;31751:614::-;32031:3;32069:6;32063:13;32085:53;32131:6;32126:3;32119:4;32111:6;32107:17;32085:53;:::i;:::-;-1:-1:-1;;;32160:16:1;;;32185:18;;;32228:13;;32250:65;32228:13;32302:1;32291:13;;32284:4;32272:17;;32250:65;:::i;:::-;32335:20;32357:1;32331:28;;31751:614;-1:-1:-1;;;;31751:614:1:o;32370:345::-;32572:2;32554:21;;;32611:2;32591:18;;;32584:30;-1:-1:-1;;;32645:2:1;32630:18;;32623:51;32706:2;32691:18;;32370:345::o;33131:404::-;33333:2;33315:21;;;33372:2;33352:18;;;33345:30;33411:34;33406:2;33391:18;;33384:62;-1:-1:-1;;;33477:2:1;33462:18;;33455:38;33525:3;33510:19;;33131:404::o;35017:470::-;35196:3;35234:6;35228:13;35250:53;35296:6;35291:3;35284:4;35276:6;35272:17;35250:53;:::i;:::-;35366:13;;35325:16;;;;35388:57;35366:13;35325:16;35422:4;35410:17;;35388:57;:::i;:::-;35461:20;;35017:470;-1:-1:-1;;;;35017:470:1:o;35492:372::-;35651:3;35689:6;35683:13;35705:53;35751:6;35746:3;35739:4;35731:6;35727:17;35705:53;:::i;:::-;35780:16;;;;35805:21;;;-1:-1:-1;35853:4:1;35842:16;;35492:372;-1:-1:-1;35492:372:1:o;38051:128::-;38091:3;38122:1;38118:6;38115:1;38112:13;38109:39;;;38128:18;;:::i;:::-;-1:-1:-1;38164:9:1;;38051:128::o;38819:204::-;38857:3;38893:4;38890:1;38886:12;38925:4;38922:1;38918:12;38960:3;38954:4;38950:14;38945:3;38942:23;38939:49;;;38968:18;;:::i;:::-;39004:13;;38819:204;-1:-1:-1;;;38819:204:1:o;40664:1499::-;40941:3;40979:6;40973:13;41005:4;41018:51;41062:6;41057:3;41052:2;41044:6;41040:15;41018:51;:::i;:::-;-1:-1:-1;;;41091:16:1;;;41116:18;;;41201:13;;41153:1;;41174;;41263:18;;;41316;;;;41343:93;;41421:4;41411:8;41407:19;41395:31;;41343:93;41484:2;41474:8;41471:16;41451:18;41448:40;41445:167;;-1:-1:-1;;;41511:33:1;;41567:4;41564:1;41557:15;41597:4;41518:3;41585:17;41445:167;41628:18;41655:128;;;;41797:1;41792:346;;;;41621:517;;41655:128;-1:-1:-1;;41699:24:1;;41683:14;;;41676:48;41748:20;;;41744:29;;;-1:-1:-1;41655:128:1;;41792:346;40611:1;40604:14;;;40648:4;40635:18;;41887:1;41901:178;41915:8;41912:1;41909:15;41901:178;;;42006:14;;41986:13;;;41982:22;;41975:46;42049:16;;;;41932:10;;41901:178;;;41905:3;;42125:2;42114:8;42107:5;42103:20;42099:29;42092:36;;41621:517;-1:-1:-1;42154:3:1;;40664:1499;-1:-1:-1;;;;;;;;;;40664:1499:1:o;42168:414::-;42370:2;42352:21;;;42409:2;42389:18;;;42382:30;42448:34;42443:2;42428:18;;42421:62;-1:-1:-1;;;42514:2:1;42499:18;;42492:48;42572:3;42557:19;;42168:414::o;42989:489::-;-1:-1:-1;;;;;43258:15:1;;;43240:34;;43310:15;;43305:2;43290:18;;43283:43;43357:2;43342:18;;43335:34;;;43405:3;43400:2;43385:18;;43378:31;;;43183:4;;43426:46;;43452:19;;43444:6;43426:46;:::i;43483:249::-;43552:6;43605:2;43593:9;43584:7;43580:23;43576:32;43573:52;;;43621:1;43618;43611:12;43573:52;43653:9;43647:16;43672:30;43696:5;43672:30;:::i;44455:127::-;44516:10;44511:3;44507:20;44504:1;44497:31;44547:4;44544:1;44537:15;44571:4;44568:1;44561:15

Swarm Source

ipfs://818bcd4d757a80f9cde64c1e2896e33df301b171a76e674051a300d8d91c833c
Loading