ETH Price: $3,450.87 (+1.54%)

Token

KEKISTANI NAMING SERVICE (.KEK)
 

Overview

Max Total Supply

1,449 .KEK

Holders

397

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
williamwallet.eth
Balance
1 .KEK
0xe12d731750e222ec53b001e00d978901b134cfc9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Building an EVM compatible & Scalable Blockchain for Frens.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KeKDomains

Compiler Version
v0.8.15+commit.e14f2714

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-07
*/

// SPDX-License-Identifier:MIT
pragma solidity >=0.7.0 <0.9.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

abstract contract WhiteList is AdminControl {

    mapping(address => uint256) public _whiteList;
	
	bool public isWhiteListActive = false;

    function setWhiteListActive(bool _isWhiteListActive) external onlyOwner {
        isWhiteListActive = _isWhiteListActive;
    }

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


contract KeKDomains 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 = "https://api-kek.herokuapp.com/";
	
	bool public _saleIsActive = false;
	
	bool public _saleTwoCharIsActive = false;

	uint256 private _price = 0.005 ether;
	
	uint256 private _2chartimes = 20;
	
	uint256 private _3chartimes = 10;
	
	uint256 private _4chartimes = 6;
	
    modifier onlyApprovedOrOwner(uint256 tokenId) {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId)
        );
        _;
    }
	
	constructor() ERC721("KEKISTANI NAMING SERVICE", ".KEK") {
		
	}
	
    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 _2chartimenew, uint256 _3chartimenew, uint256 _4chartimenew) public onlyOwner {
		_2chartimes = _2chartimenew;
        _3chartimes = _3chartimenew;
		_4chartimes = _4chartimenew;
    }
	
	function setPrice(uint256 price) public onlyOwner {
        _price = price;
    }
	
	function setSaleStateTwoChar() public onlyOwner {
        _saleTwoCharIsActive = !_saleTwoCharIsActive;
    }
	
	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 >= 2, "Domain requires at least 2 characters");	
		
		  // Check BookingList
		if (_isBookingListActive == true){
			string memory name = _bookingList[bytes(domain)];
			require(bytes(name).length == 0, "This name is already reserved");
		}
		
		
	    // Check WhiteList
		if (isWhiteListActive == true){
			uint256 numbers = _whiteList[msg.sender];
			require(numbers > 0, "The address is not in the Whitelist");
			require(numbers >= balanceOf(msg.sender), "Exceeded max available to purchase");
		}
		
		if (_length == 2)
		{
			require(_saleTwoCharIsActive == true, "2 Character domain names need to be allowed to buy");
			
			require(msg.value >= getPrice().mul(_2chartimes), "Insufficient Token or Token value sent is not correct");
		}
	
		if (_length == 3)
		{
			require(msg.value >= getPrice().mul(_3chartimes), "Insufficient Token or Token value sent is not correct");
		}
		
		if (_length == 4)
		{
			require(msg.value >= getPrice().mul(_4chartimes), "Insufficient Token or Token value sent is not correct");
		}
		
		if (_length >= 5)
		{
			require(msg.value >= getPrice(), "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 registerDomain(address to, string memory domain, string memory tld) external onlyMinterController 
	{
		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 set and get Resolver
	**/
	
	function setResolver(uint256 tokenId, address resolver) external onlyApprovedOrOwner(tokenId) {
        _setResolver(tokenId, resolver);
    }
	
	function resolverOf(string memory domain) external view returns (address) {
		uint256 tokenId = genTokenId(domain);
		if (_exists(tokenId) == false){
			return address(0);
		}
		address resolver = _tokenResolvers[tokenId];
        if (resolver == address(0)){
			resolver = address(this);
		}
        return resolver;
	}

    function resolverOf(uint256 tokenId) external view returns (address) {
		if (_exists(tokenId) == false){
			return address(0);
		}
		address resolver = _tokenResolvers[tokenId];
        if (resolver == address(0)){
			resolver = address(this);
		}
        return resolver;
    }
	
	function removeResolver(string memory domain) external {
        uint256 tokenId = genTokenId(domain);
        address _sender = _msgSender();
        require(_isApprovedOrOwner(_sender, tokenId), 'ReverseResolver: SENDER_IS_NOT_APPROVED_OR_OWNER');
        delete _tokenResolvers[tokenId];
    }
	
	function removeResolver(uint256 tokenId) external onlyApprovedOrOwner(tokenId) {
        require(tokenId != 0, 'ReverseResolver: REVERSE_RECORD_IS_EMPTY');
        delete _tokenResolvers[tokenId];
    }
    
	function _setResolver(uint256 tokenId, address resolver) internal {
        require (_exists(tokenId));
        _tokenResolvers[tokenId] = resolver;
    }
	/**
     * End:Resolver
     */

	/**
     * Begin: Subdomain
     */
    function registerSubDomain(address to, uint256 tokenId, string memory sub) external 
        onlyApprovedOrOwner(tokenId) 
    {
        _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));

        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":[{"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":"_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":"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"sub","type":"string"}],"name":"registerSubDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"removeBookingList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"domain","type":"string"}],"name":"removeResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"removeResolver","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":"string","name":"domain","type":"string"}],"name":"resolverOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resolverOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","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":"setSaleStateTwoChar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tld","type":"string"}],"name":"setTLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":[{"internalType":"bool","name":"_isWhiteListActive","type":"bool"}],"name":"setWhiteListActive","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"}]

6010805460ff1990811690915560128054909116905560c0604052601e60809081527f68747470733a2f2f6170692d6b656b2e6865726f6b756170702e636f6d2f000060a0526019906200005490826200034b565b50601a805461ffff191690556611c37937e08000601b556014601c55600a601d556006601e553480156200008757600080fd5b506040518060400160405280601881526020017f4b454b495354414e49204e414d494e4720534552564943450000000000000000815250604051806040016040528060048152602001632e4b454b60e01b8152508160009081620000ec91906200034b565b506001620000fb82826200034b565b50505062000118620001126200012960201b60201c565b6200012d565b62000123336200017f565b62000417565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200019a81600c6200019d60201b620033d01790919060201c565b50565b620001a9828262000221565b15620001fc5760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650060448201526064015b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620002865760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401620001f3565b506001600160a01b03166000908152602091909152604090205460ff1690565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002d157607f821691505b602082108103620002f257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034657600081815260208120601f850160051c81016020861015620003215750805b601f850160051c820191505b8181101562000342578281556001016200032d565b5050505b505050565b81516001600160401b03811115620003675762000367620002a6565b6200037f81620003788454620002bc565b84620002f8565b602080601f831160018114620003b757600084156200039e5750858301515b600019600386901b1c1916600185901b17855562000342565b600085815260208120601f198616915b82811015620003e857888601518255948401946001909101908401620003c7565b5085821015620004075787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615b6680620004276000396000f3fe6080604052600436106104e15760003560e01c80636bc2290f11610281578063b3f9e4cb1161015a578063ce92b33e116100cc578063ec129eea11610085578063ec129eea14610f77578063eceb7d5214610f97578063f25eb5c114610fb7578063f2fde38b14610fcc578063f5c1f76e14610fec578063f6283ad41461100c57600080fd5b8063ce92b33e14610e8c578063d231563014610eac578063d439daa214610ec1578063e5f9da8814610ef9578063e985e9c514610f19578063ea7b25be14610f6257600080fd5b8063bc7c8ceb1161011e578063bc7c8ceb14610dcf578063bcba4c1b14610dfd578063c479a80414610e1d578063c6438cb814610e3d578063c7bc6d6814610e52578063c87b56dd14610e6c57600080fd5b8063b3f9e4cb14610d21578063b85afd2814610d41578063b88d4fde14610d6f578063bb5b27e114610d8f578063bc7b6d6214610daf57600080fd5b80638da5cb5b116101f357806398d5fdca116101b757806398d5fdca14610c565780639cbf529d14610c6b578063a22cb46514610c8b578063a736868b14610cab578063ab3b87fe14610ce1578063ad59e22614610d0157600080fd5b80638da5cb5b14610bc35780638f704aec14610be157806391b7f5ed14610c0157806395d89b4114610c2157806398a6024314610c3657600080fd5b806377e9d00b1161024557806377e9d00b14610b0357806379f8072214610b235780637ce4538314610b435780637e37479e14610b635780637ef09bca14610b835780638a4c757714610ba357600080fd5b80636bc2290f14610a795780636e2db8d714610a8e57806370a0823114610aae578063715018a614610ace57806376f909ae14610ae357600080fd5b80633dd1eb61116103be5780634f558e7911610330578063573f5dae116102e9578063573f5dae146109c45780635d893ba0146109de5780636352211e146109f85780636506437014610a18578063672b9f8114610a2b57806369e2f0fb14610a5957600080fd5b80634f558e79146109045780634f6ccce71461092457806350382c1a1461094457806350b3a14414610964578063559f74141461098457806355f804b3146109a457600080fd5b8063434d8aca11610382578063434d8aca1461085a5780634500d4491461087a57806347c816991461088f5780634a72584d146108af5780634aaf4a12146108cf5780634cd637b5146108ef57600080fd5b80633dd1eb61146107ba578063426932c7146107da57806342842e0e146107fa57806342966c681461081a578063430c20811461083a57600080fd5b80631ed40559116104575780632dc50d9a1161041b5780632dc50d9a1461071d5780632f745c591461073d578063310bd74b1461075d578063358deb1c1461077d578063384e9a55146107925780633ccfd60b146107b257600080fd5b80631ed40559146106885780632319afde1461069d57806323b872dd146106bd57806323bbde56146106dd57806327f18975146106fd57600080fd5b8063095ea7b3116104a9578063095ea7b3146105cf5780630bb78ec1146105f1578063157c61381461061157806318160ddd146106265780631bd8cc1a1461063b5780631be5e7ed1461066857600080fd5b806301ffc9a7146104e65780630302e9531461051b57806305d60ffb1461053a57806306fdde0314610575578063081812fc14610597575b600080fd5b3480156104f257600080fd5b50610506610501366004614ba3565b61102c565b60405190151581526020015b60405180910390f35b34801561052757600080fd5b50601a5461050690610100900460ff1681565b34801561054657600080fd5b50610567610555366004614bdc565b600f6020526000908152604090205481565b604051908152602001610512565b34801561058157600080fd5b5061058a61103d565b6040516105129190614c4f565b3480156105a357600080fd5b506105b76105b2366004614c62565b6110cf565b6040516001600160a01b039091168152602001610512565b3480156105db57600080fd5b506105ef6105ea366004614c7b565b61115c565b005b3480156105fd57600080fd5b5061058a61060c366004614c62565b611271565b34801561061d57600080fd5b5061056761130b565b34801561063257600080fd5b50600854610567565b34801561064757600080fd5b5061065b610656366004614cf0565b611327565b6040516105129190614d90565b34801561067457600080fd5b5061058a610683366004614de4565b61141d565b34801561069457600080fd5b506105ef611468565b3480156106a957600080fd5b506105ef6106b8366004614e1b565b6114a6565b3480156106c957600080fd5b506105ef6106d8366004614e5c565b61155c565b3480156106e957600080fd5b506105ef6106f8366004614f3a565b611597565b34801561070957600080fd5b506105ef610718366004614f6e565b6115eb565b34801561072957600080fd5b50610567610738366004614fe1565b611613565b34801561074957600080fd5b50610567610758366004614c7b565b611648565b34801561076957600080fd5b506105ef610778366004614c62565b6116de565b34801561078957600080fd5b50601d54610567565b34801561079e57600080fd5b506105ef6107ad366004614c62565b6116fe565b6105ef61173f565b3480156107c657600080fd5b506105ef6107d5366004614bdc565b61178f565b3480156107e657600080fd5b506105ef6107f5366004614cf0565b6117c5565b34801561080657600080fd5b506105ef610815366004614e5c565b611853565b34801561082657600080fd5b506105ef610835366004614c62565b61186e565b34801561084657600080fd5b50610506610855366004614c7b565b611985565b34801561086657600080fd5b5061058a610875366004614f3a565b611991565b34801561088657600080fd5b506105ef6119b5565b34801561089b57600080fd5b506105ef6108aa366004615003565b6119fc565b3480156108bb57600080fd5b506105ef6108ca366004615064565b611a1c565b3480156108db57600080fd5b506105b76108ea366004614f3a565b611a42565b3480156108fb57600080fd5b50610567611a87565b34801561091057600080fd5b5061050661091f366004614c62565b611a98565b34801561093057600080fd5b5061056761093f366004614c62565b611aa3565b34801561095057600080fd5b506105ef61095f366004614f3a565b611b36565b34801561097057600080fd5b5061056761097f366004614f3a565b611b69565b34801561099057600080fd5b506105ef61099f3660046150b6565b611ba8565b3480156109b057600080fd5b506105ef6109bf366004614f3a565b611bfc565b3480156109d057600080fd5b506010546105069060ff1681565b3480156109ea57600080fd5b50601a546105069060ff1681565b348015610a0457600080fd5b506105b7610a13366004614c62565b611c32565b6105ef610a263660046150eb565b611ca9565b348015610a3757600080fd5b50610a4b610a46366004614fe1565b612294565b60405161051292919061514e565b348015610a6557600080fd5b506105ef610a74366004614bdc565b6122ac565b348015610a8557600080fd5b50601c54610567565b348015610a9a57600080fd5b506105ef610aa9366004614c7b565b6122df565b348015610aba57600080fd5b50610567610ac9366004614bdc565b612320565b348015610ada57600080fd5b506105ef6123a7565b348015610aef57600080fd5b50610567610afe366004614c62565b6123db565b348015610b0f57600080fd5b506105ef610b1e36600461517c565b612406565b348015610b2f57600080fd5b506105b7610b3e366004614f3a565b61262b565b348015610b4f57600080fd5b506105ef610b5e3660046150b6565b61267a565b348015610b6f57600080fd5b5061058a610b7e366004614bdc565b6126cb565b348015610b8f57600080fd5b50610506610b9e366004614bdc565b612815565b348015610baf57600080fd5b506105ef610bbe366004614c62565b612822565b348015610bcf57600080fd5b50600b546001600160a01b03166105b7565b348015610bed57600080fd5b506105ef610bfc3660046151ef565b612874565b348015610c0d57600080fd5b506105ef610c1c366004614c62565b6128ac565b348015610c2d57600080fd5b5061058a6128db565b348015610c4257600080fd5b506105ef610c5136600461521b565b6128ea565b348015610c6257600080fd5b50601b54610567565b348015610c7757600080fd5b506105ef610c86366004614f3a565b612918565b348015610c9757600080fd5b506105ef610ca6366004615277565b612967565b348015610cb757600080fd5b50610567610cc6366004614bdc565b6001600160a01b03166000908152600f602052604090205490565b348015610ced57600080fd5b506105ef610cfc366004614c7b565b612a2b565b348015610d0d57600080fd5b506105ef610d1c366004614f3a565b612a51565b348015610d2d57600080fd5b506105b7610d3c366004614c62565b612aa1565b348015610d4d57600080fd5b50610d61610d5c366004614cf0565b612ae2565b6040516105129291906152a1565b348015610d7b57600080fd5b506105ef610d8a3660046152c6565b612c04565b348015610d9b57600080fd5b5061058a610daa366004614c62565b612c3f565b348015610dbb57600080fd5b506105ef610dca36600461532d565b612ce1565b348015610ddb57600080fd5b50610def610dea366004614bdc565b612cfe565b604051610512929190615350565b348015610e0957600080fd5b5061058a610e18366004614c62565b612ee1565b348015610e2957600080fd5b506105ef610e383660046153a7565b612efa565b348015610e4957600080fd5b50610567612f17565b348015610e5e57600080fd5b506012546105069060ff1681565b348015610e7857600080fd5b5061058a610e87366004614c62565b612f28565b348015610e9857600080fd5b506105ef610ea7366004614f6e565b613091565b348015610eb857600080fd5b50601e54610567565b348015610ecd57600080fd5b50610506610edc366004614bdc565b6001600160a01b03166000908152600f6020526040902054151590565b348015610f0557600080fd5b50610506610f14366004614f3a565b6130b1565b348015610f2557600080fd5b50610506610f343660046153e3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610f6e57600080fd5b506105ef6130ee565b348015610f8357600080fd5b506105ef610f92366004614f6e565b61312c565b348015610fa357600080fd5b506105ef610fb236600461540d565b61314c565b348015610fc357600080fd5b506105ef613189565b348015610fd857600080fd5b506105ef610fe7366004614bdc565b6131d4565b348015610ff857600080fd5b5061065b611007366004614e1b565b61326c565b34801561101857600080fd5b506105066110273660046150b6565b613318565b60006110378261344c565b92915050565b60606000805461104c90615428565b80601f016020809104026020016040519081016040528092919081815260200182805461107890615428565b80156110c55780601f1061109a576101008083540402835291602001916110c5565b820191906000526020600020905b8154815290600101906020018083116110a857829003601f168201915b5050505050905090565b60006110da82613471565b6111405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061116782611c32565b9050806001600160a01b0316836001600160a01b0316036111d45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401611137565b336001600160a01b03821614806111f057506111f08133610f34565b6112625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401611137565b61126c838361348e565b505050565b6014602052600090815260409020805461128a90615428565b80601f01602080910402602001604051908101604052809291908181526020018280546112b690615428565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b505050505081565b6000611322601c5461131c601b5490565b906134fc565b905090565b6060826001600160401b0381111561134157611341614e98565b60405190808252806020026020018201604052801561137457816020015b606081526020019060019003908161135f5790505b50905060005b83811015611415576113e585858381811061139757611397615462565b90506020028101906113a99190615478565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250613508915050565b8282815181106113f7576113f7615462565b6020026020010181905250808061140d906154d4565b91505061137a565b509392505050565b606061146084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613508915050565b949350505050565b600b546001600160a01b031633146114925760405162461bcd60e51b8152600401611137906154ed565b601a805460ff19811660ff90911615179055565b6114af33612815565b6114cb5760405162461bcd60e51b815260040161113790615522565b60005b8181101561126c578282828181106114e8576114e8615462565b90506020028101906114fa9190615478565b601185858581811061150e5761150e615462565b90506020028101906115209190615478565b60405161152e92919061556c565b908152602001604051809103902091826115499291906155c2565b5080611554816154d4565b9150506114ce565b611567335b8261353d565b6115835760405162461bcd60e51b815260040161113790615681565b61158c81613623565b61126c838383613690565b60006115a282611b69565b9050336115af818361353d565b6115cb5760405162461bcd60e51b8152600401611137906156d2565b50600090815260166020526040902080546001600160a01b031916905550565b806115f533611561565b6115fe57600080fd5b61160b868686868661383b565b505050505050565b60008161161f846123db565b1161162957600080fd5b6000838152601360205260409020611641908361389e565b9392505050565b600061165383612320565b82106116b55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401611137565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b806116e833611561565b6116f157600080fd5b6116fa82613623565b5050565b33611709818361353d565b6117255760405162461bcd60e51b8152600401611137906156d2565b6001600160a01b0316600090815260176020526040902055565b600b546001600160a01b031633146117695760405162461bcd60e51b8152600401611137906154ed565b60405133904780156108fc02916000818181858888f1935050505061178d57600080fd5b565b600b546001600160a01b031633146117b95760405162461bcd60e51b8152600401611137906154ed565b6117c2816138aa565b50565b6117ce33612815565b6117ea5760405162461bcd60e51b815260040161113790615522565b60005b8281101561184d5781600f600086868581811061180c5761180c615462565b90506020020160208101906118219190614bdc565b6001600160a01b0316815260208101919091526040016000205580611845816154d4565b9150506117ed565b50505050565b61126c83838360405180602001604052806000815250612c04565b61187733611561565b6118dc5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401611137565b600081815260146020526040902080546118f590615428565b15905061191357600081815260146020526040812061191391614b43565b336000908152601760205260409020541561193957336000908152601760205260408120555b6000818152601660205260409020546001600160a01b03161561197357600081815260166020526040902080546001600160a01b03191690555b61197c81613623565b6117c2816138b5565b6000611641838361353d565b80516020818301810180516011825292820191909301209152805461128a90615428565b600b546001600160a01b031633146119df5760405162461bcd60e51b8152600401611137906154ed565b601a805461ff001981166101009182900460ff1615909102179055565b80611a0633611561565b611a0f57600080fd5b61160b868686868661395c565b80611a2633611561565b611a2f57600080fd5b611a3b85858585613a3b565b5050505050565b600080611a4e83613adb565b9050600081604051602001611a639190615722565b6040516020818303038152906040528051906020012060001c905061146081611c32565b6000611322601e5461131c601b5490565b600061103782613471565b6000611aae60085490565b8210611b115760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401611137565b60088281548110611b2457611b24615462565b90600052602060002001549050919050565b6117c281604051602001611b4a9190615722565b6040516020818303038152906040528051906020012060001c82613c35565b60008151600003611b7957600080fd5b81604051602001611b8a9190615722565b60408051601f19818403018152919052805160209091012092915050565b611bb133612815565b611bcd5760405162461bcd60e51b815260040161113790615522565b818160118484604051611be192919061556c565b9081526020016040518091039020918261126c9291906155c2565b600b546001600160a01b03163314611c265760405162461bcd60e51b8152600401611137906154ed565b60196116fa828261573e565b6000818152600260205260408120546001600160a01b0316806110375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401611137565b601a5460ff16611cfb5760405162461bcd60e51b815260206004820152601a60248201527f53616c65206d7573742062652061637469766520746f206275790000000000006044820152606401611137565b8051600003611d1c5760405162461bcd60e51b8152600401611137906157fd565b611d25816130b1565b1515600114611d765760405162461bcd60e51b815260206004820152601a60248201527f546f70206c6576656c20646f6d61696e206e6f742065786973740000000000006044820152606401611137565b611d7f82613c5a565b15611dcc5760405162461bcd60e51b815260206004820152601a60248201527f446f6d61696e732063616e6e6f7420636f6e7461696e20646f740000000000006044820152606401611137565b81516000819003611e1a5760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b6044820152606401611137565b6002811015611e795760405162461bcd60e51b815260206004820152602560248201527f446f6d61696e207265717569726573206174206c656173742032206368617261604482015264637465727360d81b6064820152608401611137565b60125460ff161515600103611f86576000601184604051611e9a9190615722565b90815260200160405180910390208054611eb390615428565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf90615428565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b505050505090508051600014611f845760405162461bcd60e51b815260206004820152601d60248201527f54686973206e616d6520697320616c72656164792072657365727665640000006044820152606401611137565b505b60105460ff16151560010361206357336000908152600f602052604090205480611ffe5760405162461bcd60e51b815260206004820152602360248201527f5468652061646472657373206973206e6f7420696e207468652057686974656c6044820152621a5cdd60ea1b6064820152608401611137565b61200733612320565b8110156120615760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b6064820152608401611137565b505b8060020361211157601a5460ff6101009091041615156001146120e35760405162461bcd60e51b815260206004820152603260248201527f322043686172616374657220646f6d61696e206e616d6573206e65656420746f60448201527120626520616c6c6f77656420746f2062757960701b6064820152608401611137565b6120f2601c5461131c601b5490565b3410156121115760405162461bcd60e51b81526004016111379061583f565b8060030361214757612128601d5461131c601b5490565b3410156121475760405162461bcd60e51b81526004016111379061583f565b8060040361217d5761215e601e5461131c601b5490565b34101561217d5760405162461bcd60e51b81526004016111379061583f565b600581106121a757601b543410156121a75760405162461bcd60e51b81526004016111379061583f565b60006121b284613adb565b905060006121bf84613adb565b905081816040516020016121d4929190615894565b604051602081830303815290604052915060006121f083611b69565b90506121fb81613471565b156122405760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b6044820152606401611137565b61224a3382613cb9565b6122548184613cd3565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516122849190614c4f565b60405180910390a2505050505050565b6060806122a18484613d55565b909590945092505050565b600b546001600160a01b031633146122d65760405162461bcd60e51b8152600401611137906154ed565b6117c281613d76565b6122e833612815565b6123045760405162461bcd60e51b815260040161113790615522565b6001600160a01b039091166000908152600f6020526040902055565b60006001600160a01b03821661238b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401611137565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146123d15760405162461bcd60e51b8152600401611137906154ed565b61178d6000613d81565b60006123e682613471565b6123ef57600080fd5b600082815260136020526040902061103790613dd3565b61240f33612815565b61242b5760405162461bcd60e51b815260040161113790615522565b6001600160a01b0383166124765760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b6044820152606401611137565b80516000036124975760405162461bcd60e51b8152600401611137906157fd565b6124a0816130b1565b15156001146124f15760405162461bcd60e51b815260206004820152601a60248201527f546f70206c6576656c20646f6d61696e206e6f742065786973740000000000006044820152606401611137565b815160000361253d5760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b6044820152606401611137565b61254682613c5a565b156125885760405162461bcd60e51b8152602060048201526012602482015271111bdb585a5b881b9bdd081cdd5c1c1bdc9d60721b6044820152606401611137565b600061259383613adb565b905060006125a083613adb565b905081816040516020016125b5929190615894565b604051602081830303815290604052915060006125d183611b69565b90506125dc81613471565b156126215760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b6044820152606401611137565b61224a8682613cb9565b60008061263783611b69565b905061264281613471565b15156000036126545750600092915050565b6000818152601660205260409020546001600160a01b0316806116415750309392505050565b61268333612815565b61269f5760405162461bcd60e51b815260040161113790615522565b601182826040516126b192919061556c565b908152602001604051809103902060006116fa9190614b43565b6001600160a01b0381166000908152601760205260408120546060918190036127065760405162461bcd60e51b8152600401611137906158d0565b612710838261353d565b6127765760405162461bcd60e51b815260206004820152603160248201527f526576657273655265736f6c7665723a204143434f554e545f49535f4e4f545f60448201527020a8282927ab22a22fa7a92fa7aba722a960791b6064820152608401611137565b6000818152601460205260409020805461278f90615428565b80601f01602080910402602001604051908101604052809291908181526020018280546127bb90615428565b80156128085780601f106127dd57610100808354040283529160200191612808565b820191906000526020600020905b8154815290600101906020018083116127eb57829003601f168201915b5050505050915050919050565b6000611037600c83613ddd565b8061282c33611561565b61283557600080fd5b816000036128555760405162461bcd60e51b8152600401611137906158d0565b50600090815260166020526040902080546001600160a01b0319169055565b600b546001600160a01b0316331461289e5760405162461bcd60e51b8152600401611137906154ed565b601c92909255601d55601e55565b600b546001600160a01b031633146128d65760405162461bcd60e51b8152600401611137906154ed565b601b55565b60606001805461104c90615428565b816128f433611561565b6128fd57600080fd5b61184d84848460405180602001604052806000815250613e60565b600061292382611b69565b905033612930818361353d565b61294c5760405162461bcd60e51b8152600401611137906156d2565b6001600160a01b031660009081526017602052604090205550565b336001600160a01b038316036129bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401611137565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b80612a3533611561565b612a3e57600080fd5b61126c612a4a83611c32565b8484613690565b600b546001600160a01b03163314612a7b5760405162461bcd60e51b8152600401611137906154ed565b6000612a8682611b69565b600081815260186020526040902090915061126c838261573e565b6000612aac82613471565b1515600003612abd57506000919050565b6000828152601660205260409020546001600160a01b03168061103757503092915050565b606080836001600160401b03811115612afd57612afd614e98565b604051908082528060200260200182016040528015612b3057816020015b6060815260200190600190039081612b1b5790505b509150836001600160401b03811115612b4b57612b4b614e98565b604051908082528060200260200182016040528015612b7e57816020015b6060815260200190600190039081612b695790505b50905060005b84811015612bfb57612bae868683818110612ba157612ba1615462565b9050602002013585613d55565b848381518110612bc057612bc0615462565b60200260200101848481518110612bd957612bd9615462565b6020026020010182905282905250508080612bf3906154d4565b915050612b84565b50935093915050565b612c0e338361353d565b612c2a5760405162461bcd60e51b815260040161113790615681565b612c3382613623565b61184d8484848461402f565b6000818152600a60205260409020805460609190612c5c90615428565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8890615428565b8015612cd55780601f10612caa57610100808354040283529160200191612cd5565b820191906000526020600020905b815481529060010190602001808311612cb857829003601f168201915b50505050509050919050565b81612ceb33611561565b612cf457600080fd5b61126c8383614062565b6060806000612d0c84612320565b905060008111612d385760405162461bcd60e51b81526020600482015260006024820152604401611137565b6000816001600160401b03811115612d5257612d52614e98565b604051908082528060200260200182016040528015612d7b578160200160208202803683370190505b5090506000826001600160401b03811115612d9857612d98614e98565b604051908082528060200260200182016040528015612dcb57816020015b6060815260200190600190039081612db65790505b50905060005b83811015612ed5576000612de58883611648565b600081815260146020526040812080549293509091612e0390615428565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2f90615428565b8015612e7c5780601f10612e5157610100808354040283529160200191612e7c565b820191906000526020600020905b815481529060010190602001808311612e5f57829003601f168201915b5050505050905081858481518110612e9657612e96615462565b60200260200101818152505080848481518110612eb557612eb5615462565b602002602001018190525050508080612ecd906154d4565b915050612dd1565b50909590945092505050565b6015602052600090815260409020805461128a90615428565b81612f0433611561565b612f0d57600080fd5b61126c83836140a2565b6000611322601d5461131c601b5490565b6060612f3382613471565b612f975760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611137565b60008281526014602052604081208054612fb090615428565b80601f0160208091040260200160405190810160405280929190818152602001828054612fdc90615428565b80156130295780601f10612ffe57610100808354040283529160200191613029565b820191906000526020600020905b81548152906001019060200180831161300c57829003601f168201915b50505050509050600061303a61414e565b9050805160000361304c575092915050565b81511561307e578082604051602001613066929190615918565b60405160208183030381529060405292505050919050565b8084604051602001613066929190615947565b8061309b33611561565b6130a457600080fd5b61160b868686868661415d565b600080806130be84611b69565b60008181526018602052604090208054919250906130db90615428565b1590506130e757600191505b5092915050565b600b546001600160a01b031633146131185760405162461bcd60e51b8152600401611137906154ed565b6012805460ff19811660ff90911615179055565b8061313633611561565b61313f57600080fd5b61160b86868686866141cb565b600b546001600160a01b031633146131765760405162461bcd60e51b8152600401611137906154ed565b6010805460ff1916911515919091179055565b33600081815260176020526040812054908190036131b95760405162461bcd60e51b8152600401611137906158d0565b506001600160a01b0316600090815260176020526040812055565b600b546001600160a01b031633146131fe5760405162461bcd60e51b8152600401611137906154ed565b6001600160a01b0381166132635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611137565b6117c281613d81565b6060816001600160401b0381111561328657613286614e98565b6040519080825280602002602001820160405280156132b957816020015b60608152602001906001900390816132a45790505b50905060005b828110156130e7576132e88484838181106132dc576132dc615462565b90506020020135612c3f565b8282815181106132fa576132fa615462565b60200260200101819052508080613310906154d4565b9150506132bf565b6000806011848460405161332d92919061556c565b9081526020016040518091039020805461334690615428565b80601f016020809104026020016040519081016040528092919081815260200182805461337290615428565b80156133bf5780601f10613394576101008083540402835291602001916133bf565b820191906000526020600020905b8154815290600101906020018083116133a257829003601f168201915b505092511515979650505050505050565b6133da8282613ddd565b156134275760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006044820152606401611137565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b14806110375750611037826141e1565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906134c382611c32565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116418284615969565b60606116418360405160200161351e9190615722565b6040516020818303038152906040528051906020012060001c83614231565b600061354882613471565b6135a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611137565b60006135b483611c32565b9050806001600160a01b0316846001600160a01b031614806135ef5750836001600160a01b03166135e4846110cf565b6001600160a01b0316145b8061146057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611460565b61362c816142f0565b60405160200161363e91815260200190565b60408051601f1981840301815282825280516020918201206000858152600e9092529181209190915582917f185c30856dadb58bf097c1f665a52ada7029752dbcad008ea3fefc73bee8c9fe9190a250565b826001600160a01b03166136a382611c32565b6001600160a01b03161461370b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401611137565b6001600160a01b03821661376d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401611137565b61377883838361431c565b61378360008261348e565b6001600160a01b03831660009081526003602052604081208054600192906137ac908490615988565b90915550506001600160a01b03821660009081526003602052604081208054600192906137da90849061599f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8481101561160b5761388c86868381811061385b5761385b615462565b9050602002013585858481811061387457613874615462565b90506020028101906138869190615478565b85613a3b565b80613896816154d4565b91505061383e565b60006116418383614327565b6117c2600c826133d0565b60006138c082611c32565b90506138ce8160008461431c565b6138d960008361348e565b6001600160a01b0381166000908152600360205260408120805460019290613902908490615988565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000858560405160200161397192919061556c565b60408051601f198184030181528282528051602091820120601f89018290048202840182019092528783529092506139c59183918990899081908401838280828437600092019190915250613c3592505050565b61160b8187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250889250614351915050565b613a4484614486565b613a905760405162461bcd60e51b815260206004820152601c60248201527f5265636f726453746f726167653a204b45595f4e4f545f464f554e44000000006044820152606401611137565b61184d84613a9d86612c3f565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250614351915050565b60606000829050600081516001600160401b03811115613afd57613afd614e98565b6040519080825280601f01601f191660200182016040528015613b27576020820181803683370190505b50905060005b8251811015611415576041838281518110613b4a57613b4a615462565b016020015160f81c10801590613b7a5750605a838281518110613b6f57613b6f615462565b016020015160f81c11155b15613bdc57828181518110613b9157613b91615462565b602001015160f81c60f81b60f81c6020613bab91906159b7565b60f81b828281518110613bc057613bc0615462565b60200101906001600160f81b031916908160001a905350613c23565b828181518110613bee57613bee615462565b602001015160f81c60f81b828281518110613c0b57613c0b615462565b60200101906001600160f81b031916908160001a9053505b80613c2d816154d4565b915050613b2d565b613c3e82614486565b6116fa576000828152600a6020526040902061126c828261573e565b805160009060018381019184010182805b82841015613cb057835160ff16602e819003613c8f57613c8c60018461599f565b92505b613c9a60018661599f565b9450508080613ca8906154d4565b915050613c6b565b50949350505050565b6116fa8282604051806020016040528060008152506144ac565b613cdc82613471565b613d3d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611137565b600082815260146020526040902061126c828261573e565b606080613d6184612c3f565b9150613d6d8484614231565b90509250929050565b6117c2600c826144df565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611037825490565b60006001600160a01b038216613e405760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401611137565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038416613e7357600080fd5b8151600003613e8157600080fd5b613e8a82613c5a565b15613e9457600080fd5b613e9d83613471565b613ea657600080fd5b6000613eb183613adb565b905060008160146000878152602001908152602001600020604051602001613eda9291906159dc565b60405160208183030381529060405290506000613ef682611b69565b90506000613f9e601460008981526020019081526020016000208054613f1b90615428565b80601f0160208091040260200160405190810160405280929190818152602001828054613f4790615428565b8015613f945780601f10613f6957610100808354040283529160200191613f94565b820191906000526020600020905b815481529060010190602001808311613f7757829003601f168201915b5050505050613c5a565b905080600103613fc2576000878152601360205260409020613fc09083614561565b505b845115613fd957613fd48883876144ac565b613fe3565b613fe38883613cb9565b613fed8284613cd3565b817fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c39528460405161401d9190614c4f565b60405180910390a25050505050505050565b61403a848484613690565b6140468484848461456d565b61184d5760405162461bcd60e51b815260040161113790615a78565b61406b82613471565b61407457600080fd5b60009182526016602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b60006140ad82613adb565b9050600081601460008681526020019081526020016000206040516020016140d69291906159dc565b604051602081830303815290604052905060006140f282611b69565b600086815260136020526040902090915061410d908261466e565b506000818152601460205260409020805461412790615428565b15905061414557600081815260146020526040812061414591614b43565b611a3b816138b5565b60606019805461104c90615428565b60005b8481101561160b576141b986868381811061417d5761417d615462565b905060200281019061418f9190615478565b8686858181106141a1576141a1615462565b90506020028101906141b39190615478565b8661395c565b806141c3816154d4565b915050614160565b6141d481613623565b611a3b858585858561415d565b60006001600160e01b031982166380ac58cd60e01b148061421257506001600160e01b03198216635b5e139f60e01b145b8061103757506301ffc9a760e01b6001600160e01b0319831614611037565b6060600d6000614240846142f0565b81526020019081526020016000206000848152602001908152602001600020805461426a90615428565b80601f016020809104026020016040519081016040528092919081815260200182805461429690615428565b80156142e35780601f106142b8576101008083540402835291602001916142e3565b820191906000526020600020905b8154815290600101906020018083116142c657829003601f168201915b5050505050905092915050565b6000818152600e602052604081205415614318576000828152600e6020526040902054611037565b5090565b61126c83838361467a565b600082600001828154811061433e5761433e615462565b9060005260206000200154905092915050565b600d600061435e836142f0565b81526020019081526020016000206000858152602001908152602001600020805461438890615428565b90506000036143e0578260405161439f9190615722565b6040518091039020817f7ae4f661958fbecc2f77be6b0eb280d2a6f604b29e1e7221c82b9da0c4af7f86856040516143d79190614c4f565b60405180910390a35b81600d60006143ee846142f0565b815260200190815260200160002060008681526020019081526020016000209081614419919061573e565b50816040516144289190615722565b60405180910390208360405161443e9190615722565b6040518091039020827f851ffe8e74d5015261dba0a1f9e1b0e5d42c5af5d2ad1908fee897c7d80a0d92868660405161447892919061514e565b60405180910390a450505050565b6000818152600a6020526040812080548291906144a290615428565b9050119050919050565b6144b68383614732565b6144c3600084848461456d565b61126c5760405162461bcd60e51b815260040161113790615a78565b6144e98282613ddd565b61453f5760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b6064820152608401611137565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006116418383614871565b60006001600160a01b0384163b1561466357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145b1903390899088908890600401615aca565b6020604051808303816000875af19250505080156145ec575060408051601f3d908101601f191682019092526145e991810190615afd565b60015b614649573d80801561461a576040519150601f19603f3d011682016040523d82523d6000602084013e61461f565b606091505b5080516000036146415760405162461bcd60e51b815260040161113790615a78565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611460565b506001949350505050565b600061164183836148c0565b6001600160a01b0383166146d5576146d081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6146f8565b816001600160a01b0316836001600160a01b0316146146f8576146f883826149b3565b6001600160a01b03821661470f5761126c81614a50565b826001600160a01b0316826001600160a01b03161461126c5761126c8282614aff565b6001600160a01b0382166147885760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401611137565b61479181613471565b156147de5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401611137565b6147ea6000838361431c565b6001600160a01b038216600090815260036020526040812080546001929061481390849061599f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120546148b857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611037565b506000611037565b600081815260018301602052604081205480156149a95760006148e4600183615988565b85549091506000906148f890600190615988565b905081811461495d57600086600001828154811061491857614918615462565b906000526020600020015490508087600001848154811061493b5761493b615462565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061496e5761496e615b1a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611037565b6000915050611037565b600060016149c084612320565b6149ca9190615988565b600083815260076020526040902054909150808214614a1d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614a6290600190615988565b60008381526009602052604081205460088054939450909284908110614a8a57614a8a615462565b906000526020600020015490508060088381548110614aab57614aab615462565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614ae357614ae3615b1a565b6001900381819060005260206000200160009055905550505050565b6000614b0a83612320565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b508054614b4f90615428565b6000825580601f10614b5f575050565b601f0160209004906000526020600020908101906117c291905b808211156143185760008155600101614b79565b6001600160e01b0319811681146117c257600080fd5b600060208284031215614bb557600080fd5b813561164181614b8d565b80356001600160a01b0381168114614bd757600080fd5b919050565b600060208284031215614bee57600080fd5b61164182614bc0565b60005b83811015614c12578181015183820152602001614bfa565b8381111561184d5750506000910152565b60008151808452614c3b816020860160208601614bf7565b601f01601f19169290920160200192915050565b6020815260006116416020830184614c23565b600060208284031215614c7457600080fd5b5035919050565b60008060408385031215614c8e57600080fd5b614c9783614bc0565b946020939093013593505050565b60008083601f840112614cb757600080fd5b5081356001600160401b03811115614cce57600080fd5b6020830191508360208260051b8501011115614ce957600080fd5b9250929050565b600080600060408486031215614d0557600080fd5b83356001600160401b03811115614d1b57600080fd5b614d2786828701614ca5565b909790965060209590950135949350505050565b600081518084526020808501808196508360051b8101915082860160005b85811015614d83578284038952614d71848351614c23565b98850198935090840190600101614d59565b5091979650505050505050565b6020815260006116416020830184614d3b565b60008083601f840112614db557600080fd5b5081356001600160401b03811115614dcc57600080fd5b602083019150836020828501011115614ce957600080fd5b600080600060408486031215614df957600080fd5b83356001600160401b03811115614e0f57600080fd5b614d2786828701614da3565b60008060208385031215614e2e57600080fd5b82356001600160401b03811115614e4457600080fd5b614e5085828601614ca5565b90969095509350505050565b600080600060608486031215614e7157600080fd5b614e7a84614bc0565b9250614e8860208501614bc0565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600082601f830112614ebf57600080fd5b81356001600160401b0380821115614ed957614ed9614e98565b604051601f8301601f19908116603f01168101908282118183101715614f0157614f01614e98565b81604052838152866020858801011115614f1a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215614f4c57600080fd5b81356001600160401b03811115614f6257600080fd5b61146084828501614eae565b600080600080600060608688031215614f8657600080fd5b85356001600160401b0380821115614f9d57600080fd5b614fa989838a01614ca5565b90975095506020880135915080821115614fc257600080fd5b50614fcf88828901614ca5565b96999598509660400135949350505050565b60008060408385031215614ff457600080fd5b50508035926020909101359150565b60008060008060006060868803121561501b57600080fd5b85356001600160401b038082111561503257600080fd5b61503e89838a01614da3565b9097509550602088013591508082111561505757600080fd5b50614fcf88828901614da3565b6000806000806060858703121561507a57600080fd5b8435935060208501356001600160401b0381111561509757600080fd5b6150a387828801614da3565b9598909750949560400135949350505050565b600080602083850312156150c957600080fd5b82356001600160401b038111156150df57600080fd5b614e5085828601614da3565b600080604083850312156150fe57600080fd5b82356001600160401b038082111561511557600080fd5b61512186838701614eae565b9350602085013591508082111561513757600080fd5b5061514485828601614eae565b9150509250929050565b6040815260006151616040830185614c23565b82810360208401526151738185614c23565b95945050505050565b60008060006060848603121561519157600080fd5b61519a84614bc0565b925060208401356001600160401b03808211156151b657600080fd5b6151c287838801614eae565b935060408601359150808211156151d857600080fd5b506151e586828701614eae565b9150509250925092565b60008060006060848603121561520457600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561523057600080fd5b61523984614bc0565b92506020840135915060408401356001600160401b0381111561525b57600080fd5b6151e586828701614eae565b80358015158114614bd757600080fd5b6000806040838503121561528a57600080fd5b61529383614bc0565b9150613d6d60208401615267565b6040815260006152b46040830185614d3b565b82810360208401526151738185614d3b565b600080600080608085870312156152dc57600080fd5b6152e585614bc0565b93506152f360208601614bc0565b92506040850135915060608501356001600160401b0381111561531557600080fd5b61532187828801614eae565b91505092959194509250565b6000806040838503121561534057600080fd5b82359150613d6d60208401614bc0565b604080825283519082018190526000906020906060840190828701845b828110156153895781518452928401929084019060010161536d565b5050508381038285015261539d8186614d3b565b9695505050505050565b600080604083850312156153ba57600080fd5b8235915060208301356001600160401b038111156153d757600080fd5b61514485828601614eae565b600080604083850312156153f657600080fd5b6153ff83614bc0565b9150613d6d60208401614bc0565b60006020828403121561541f57600080fd5b61164182615267565b600181811c9082168061543c57607f821691505b60208210810361545c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261548f57600080fd5b8301803591506001600160401b038211156154a957600080fd5b602001915036819003821315614ce957600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016154e6576154e66154be565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f41646d696e436f6e74726f6c3a2073656e646572206d75737420686173206d696040820152696e74696e6720726f6c6560b01b606082015260800190565b8183823760009101908152919050565b601f82111561126c57600081815260208120601f850160051c810160208610156155a35750805b601f850160051c820191505b8181101561160b578281556001016155af565b6001600160401b038311156155d9576155d9614e98565b6155ed836155e78354615428565b8361557c565b6000601f84116001811461562157600085156156095750838201355b600019600387901b1c1916600186901b178355611a3b565b600083815260209020601f19861690835b828110156156525786850135825560209485019460019092019101615632565b508682101561566f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526030908201527f526576657273655265736f6c7665723a2053454e4445525f49535f4e4f545f4160408201526f28282927ab22a22fa7a92fa7aba722a960811b606082015260800190565b60008251615734818460208701614bf7565b9190910192915050565b81516001600160401b0381111561575757615757614e98565b61576b816157658454615428565b8461557c565b602080601f8311600181146157a057600084156157885750858301515b600019600386901b1c1916600185901b17855561160b565b600085815260208120601f198616915b828110156157cf578886015182559484019460019091019084016157b0565b50858210156157ed5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526022908201527f546f70206c6576656c20646f6d61696e206d757374206265206e6f6e2d656d70604082015261747960f01b606082015260800190565b60208082526035908201527f496e73756666696369656e7420546f6b656e206f7220546f6b656e2076616c7560408201527419481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b606082015260800190565b600083516158a6818460208801614bf7565b601760f91b90830190815283516158c4816001840160208801614bf7565b01600101949350505050565b60208082526028908201527f526576657273655265736f6c7665723a20524556455253455f5245434f52445f60408201526749535f454d50545960c01b606082015260800190565b6000835161592a818460208801614bf7565b83519083019061593e818360208801614bf7565b01949350505050565b60008351615959818460208801614bf7565b9190910191825250602001919050565b6000816000190483118215151615615983576159836154be565b500290565b60008282101561599a5761599a6154be565b500390565b600082198211156159b2576159b26154be565b500190565b600060ff821660ff84168060ff038211156159d4576159d46154be565b019392505050565b6000835160206159ef8285838901614bf7565b8184019150601760f91b8252600160008654615a0a81615428565b8184168015615a205760018114615a3957615a69565b60ff198316878601528115158202870185019350615a69565b896000528560002060005b83811015615a5f578154898201880152908601908701615a44565b5050848288010193505b50919998505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061539d90830184614c23565b600060208284031215615b0f57600080fd5b815161164181614b8d565b634e487b7160e01b600052603160045260246000fdfea264697066735822122052c278f2daffab6d094c2a1c6cdad2cf970ae2f49a68c54444f9f6039fb6624464736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106104e15760003560e01c80636bc2290f11610281578063b3f9e4cb1161015a578063ce92b33e116100cc578063ec129eea11610085578063ec129eea14610f77578063eceb7d5214610f97578063f25eb5c114610fb7578063f2fde38b14610fcc578063f5c1f76e14610fec578063f6283ad41461100c57600080fd5b8063ce92b33e14610e8c578063d231563014610eac578063d439daa214610ec1578063e5f9da8814610ef9578063e985e9c514610f19578063ea7b25be14610f6257600080fd5b8063bc7c8ceb1161011e578063bc7c8ceb14610dcf578063bcba4c1b14610dfd578063c479a80414610e1d578063c6438cb814610e3d578063c7bc6d6814610e52578063c87b56dd14610e6c57600080fd5b8063b3f9e4cb14610d21578063b85afd2814610d41578063b88d4fde14610d6f578063bb5b27e114610d8f578063bc7b6d6214610daf57600080fd5b80638da5cb5b116101f357806398d5fdca116101b757806398d5fdca14610c565780639cbf529d14610c6b578063a22cb46514610c8b578063a736868b14610cab578063ab3b87fe14610ce1578063ad59e22614610d0157600080fd5b80638da5cb5b14610bc35780638f704aec14610be157806391b7f5ed14610c0157806395d89b4114610c2157806398a6024314610c3657600080fd5b806377e9d00b1161024557806377e9d00b14610b0357806379f8072214610b235780637ce4538314610b435780637e37479e14610b635780637ef09bca14610b835780638a4c757714610ba357600080fd5b80636bc2290f14610a795780636e2db8d714610a8e57806370a0823114610aae578063715018a614610ace57806376f909ae14610ae357600080fd5b80633dd1eb61116103be5780634f558e7911610330578063573f5dae116102e9578063573f5dae146109c45780635d893ba0146109de5780636352211e146109f85780636506437014610a18578063672b9f8114610a2b57806369e2f0fb14610a5957600080fd5b80634f558e79146109045780634f6ccce71461092457806350382c1a1461094457806350b3a14414610964578063559f74141461098457806355f804b3146109a457600080fd5b8063434d8aca11610382578063434d8aca1461085a5780634500d4491461087a57806347c816991461088f5780634a72584d146108af5780634aaf4a12146108cf5780634cd637b5146108ef57600080fd5b80633dd1eb61146107ba578063426932c7146107da57806342842e0e146107fa57806342966c681461081a578063430c20811461083a57600080fd5b80631ed40559116104575780632dc50d9a1161041b5780632dc50d9a1461071d5780632f745c591461073d578063310bd74b1461075d578063358deb1c1461077d578063384e9a55146107925780633ccfd60b146107b257600080fd5b80631ed40559146106885780632319afde1461069d57806323b872dd146106bd57806323bbde56146106dd57806327f18975146106fd57600080fd5b8063095ea7b3116104a9578063095ea7b3146105cf5780630bb78ec1146105f1578063157c61381461061157806318160ddd146106265780631bd8cc1a1461063b5780631be5e7ed1461066857600080fd5b806301ffc9a7146104e65780630302e9531461051b57806305d60ffb1461053a57806306fdde0314610575578063081812fc14610597575b600080fd5b3480156104f257600080fd5b50610506610501366004614ba3565b61102c565b60405190151581526020015b60405180910390f35b34801561052757600080fd5b50601a5461050690610100900460ff1681565b34801561054657600080fd5b50610567610555366004614bdc565b600f6020526000908152604090205481565b604051908152602001610512565b34801561058157600080fd5b5061058a61103d565b6040516105129190614c4f565b3480156105a357600080fd5b506105b76105b2366004614c62565b6110cf565b6040516001600160a01b039091168152602001610512565b3480156105db57600080fd5b506105ef6105ea366004614c7b565b61115c565b005b3480156105fd57600080fd5b5061058a61060c366004614c62565b611271565b34801561061d57600080fd5b5061056761130b565b34801561063257600080fd5b50600854610567565b34801561064757600080fd5b5061065b610656366004614cf0565b611327565b6040516105129190614d90565b34801561067457600080fd5b5061058a610683366004614de4565b61141d565b34801561069457600080fd5b506105ef611468565b3480156106a957600080fd5b506105ef6106b8366004614e1b565b6114a6565b3480156106c957600080fd5b506105ef6106d8366004614e5c565b61155c565b3480156106e957600080fd5b506105ef6106f8366004614f3a565b611597565b34801561070957600080fd5b506105ef610718366004614f6e565b6115eb565b34801561072957600080fd5b50610567610738366004614fe1565b611613565b34801561074957600080fd5b50610567610758366004614c7b565b611648565b34801561076957600080fd5b506105ef610778366004614c62565b6116de565b34801561078957600080fd5b50601d54610567565b34801561079e57600080fd5b506105ef6107ad366004614c62565b6116fe565b6105ef61173f565b3480156107c657600080fd5b506105ef6107d5366004614bdc565b61178f565b3480156107e657600080fd5b506105ef6107f5366004614cf0565b6117c5565b34801561080657600080fd5b506105ef610815366004614e5c565b611853565b34801561082657600080fd5b506105ef610835366004614c62565b61186e565b34801561084657600080fd5b50610506610855366004614c7b565b611985565b34801561086657600080fd5b5061058a610875366004614f3a565b611991565b34801561088657600080fd5b506105ef6119b5565b34801561089b57600080fd5b506105ef6108aa366004615003565b6119fc565b3480156108bb57600080fd5b506105ef6108ca366004615064565b611a1c565b3480156108db57600080fd5b506105b76108ea366004614f3a565b611a42565b3480156108fb57600080fd5b50610567611a87565b34801561091057600080fd5b5061050661091f366004614c62565b611a98565b34801561093057600080fd5b5061056761093f366004614c62565b611aa3565b34801561095057600080fd5b506105ef61095f366004614f3a565b611b36565b34801561097057600080fd5b5061056761097f366004614f3a565b611b69565b34801561099057600080fd5b506105ef61099f3660046150b6565b611ba8565b3480156109b057600080fd5b506105ef6109bf366004614f3a565b611bfc565b3480156109d057600080fd5b506010546105069060ff1681565b3480156109ea57600080fd5b50601a546105069060ff1681565b348015610a0457600080fd5b506105b7610a13366004614c62565b611c32565b6105ef610a263660046150eb565b611ca9565b348015610a3757600080fd5b50610a4b610a46366004614fe1565b612294565b60405161051292919061514e565b348015610a6557600080fd5b506105ef610a74366004614bdc565b6122ac565b348015610a8557600080fd5b50601c54610567565b348015610a9a57600080fd5b506105ef610aa9366004614c7b565b6122df565b348015610aba57600080fd5b50610567610ac9366004614bdc565b612320565b348015610ada57600080fd5b506105ef6123a7565b348015610aef57600080fd5b50610567610afe366004614c62565b6123db565b348015610b0f57600080fd5b506105ef610b1e36600461517c565b612406565b348015610b2f57600080fd5b506105b7610b3e366004614f3a565b61262b565b348015610b4f57600080fd5b506105ef610b5e3660046150b6565b61267a565b348015610b6f57600080fd5b5061058a610b7e366004614bdc565b6126cb565b348015610b8f57600080fd5b50610506610b9e366004614bdc565b612815565b348015610baf57600080fd5b506105ef610bbe366004614c62565b612822565b348015610bcf57600080fd5b50600b546001600160a01b03166105b7565b348015610bed57600080fd5b506105ef610bfc3660046151ef565b612874565b348015610c0d57600080fd5b506105ef610c1c366004614c62565b6128ac565b348015610c2d57600080fd5b5061058a6128db565b348015610c4257600080fd5b506105ef610c5136600461521b565b6128ea565b348015610c6257600080fd5b50601b54610567565b348015610c7757600080fd5b506105ef610c86366004614f3a565b612918565b348015610c9757600080fd5b506105ef610ca6366004615277565b612967565b348015610cb757600080fd5b50610567610cc6366004614bdc565b6001600160a01b03166000908152600f602052604090205490565b348015610ced57600080fd5b506105ef610cfc366004614c7b565b612a2b565b348015610d0d57600080fd5b506105ef610d1c366004614f3a565b612a51565b348015610d2d57600080fd5b506105b7610d3c366004614c62565b612aa1565b348015610d4d57600080fd5b50610d61610d5c366004614cf0565b612ae2565b6040516105129291906152a1565b348015610d7b57600080fd5b506105ef610d8a3660046152c6565b612c04565b348015610d9b57600080fd5b5061058a610daa366004614c62565b612c3f565b348015610dbb57600080fd5b506105ef610dca36600461532d565b612ce1565b348015610ddb57600080fd5b50610def610dea366004614bdc565b612cfe565b604051610512929190615350565b348015610e0957600080fd5b5061058a610e18366004614c62565b612ee1565b348015610e2957600080fd5b506105ef610e383660046153a7565b612efa565b348015610e4957600080fd5b50610567612f17565b348015610e5e57600080fd5b506012546105069060ff1681565b348015610e7857600080fd5b5061058a610e87366004614c62565b612f28565b348015610e9857600080fd5b506105ef610ea7366004614f6e565b613091565b348015610eb857600080fd5b50601e54610567565b348015610ecd57600080fd5b50610506610edc366004614bdc565b6001600160a01b03166000908152600f6020526040902054151590565b348015610f0557600080fd5b50610506610f14366004614f3a565b6130b1565b348015610f2557600080fd5b50610506610f343660046153e3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610f6e57600080fd5b506105ef6130ee565b348015610f8357600080fd5b506105ef610f92366004614f6e565b61312c565b348015610fa357600080fd5b506105ef610fb236600461540d565b61314c565b348015610fc357600080fd5b506105ef613189565b348015610fd857600080fd5b506105ef610fe7366004614bdc565b6131d4565b348015610ff857600080fd5b5061065b611007366004614e1b565b61326c565b34801561101857600080fd5b506105066110273660046150b6565b613318565b60006110378261344c565b92915050565b60606000805461104c90615428565b80601f016020809104026020016040519081016040528092919081815260200182805461107890615428565b80156110c55780601f1061109a576101008083540402835291602001916110c5565b820191906000526020600020905b8154815290600101906020018083116110a857829003601f168201915b5050505050905090565b60006110da82613471565b6111405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061116782611c32565b9050806001600160a01b0316836001600160a01b0316036111d45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401611137565b336001600160a01b03821614806111f057506111f08133610f34565b6112625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401611137565b61126c838361348e565b505050565b6014602052600090815260409020805461128a90615428565b80601f01602080910402602001604051908101604052809291908181526020018280546112b690615428565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b505050505081565b6000611322601c5461131c601b5490565b906134fc565b905090565b6060826001600160401b0381111561134157611341614e98565b60405190808252806020026020018201604052801561137457816020015b606081526020019060019003908161135f5790505b50905060005b83811015611415576113e585858381811061139757611397615462565b90506020028101906113a99190615478565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250613508915050565b8282815181106113f7576113f7615462565b6020026020010181905250808061140d906154d4565b91505061137a565b509392505050565b606061146084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613508915050565b949350505050565b600b546001600160a01b031633146114925760405162461bcd60e51b8152600401611137906154ed565b601a805460ff19811660ff90911615179055565b6114af33612815565b6114cb5760405162461bcd60e51b815260040161113790615522565b60005b8181101561126c578282828181106114e8576114e8615462565b90506020028101906114fa9190615478565b601185858581811061150e5761150e615462565b90506020028101906115209190615478565b60405161152e92919061556c565b908152602001604051809103902091826115499291906155c2565b5080611554816154d4565b9150506114ce565b611567335b8261353d565b6115835760405162461bcd60e51b815260040161113790615681565b61158c81613623565b61126c838383613690565b60006115a282611b69565b9050336115af818361353d565b6115cb5760405162461bcd60e51b8152600401611137906156d2565b50600090815260166020526040902080546001600160a01b031916905550565b806115f533611561565b6115fe57600080fd5b61160b868686868661383b565b505050505050565b60008161161f846123db565b1161162957600080fd5b6000838152601360205260409020611641908361389e565b9392505050565b600061165383612320565b82106116b55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401611137565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b806116e833611561565b6116f157600080fd5b6116fa82613623565b5050565b33611709818361353d565b6117255760405162461bcd60e51b8152600401611137906156d2565b6001600160a01b0316600090815260176020526040902055565b600b546001600160a01b031633146117695760405162461bcd60e51b8152600401611137906154ed565b60405133904780156108fc02916000818181858888f1935050505061178d57600080fd5b565b600b546001600160a01b031633146117b95760405162461bcd60e51b8152600401611137906154ed565b6117c2816138aa565b50565b6117ce33612815565b6117ea5760405162461bcd60e51b815260040161113790615522565b60005b8281101561184d5781600f600086868581811061180c5761180c615462565b90506020020160208101906118219190614bdc565b6001600160a01b0316815260208101919091526040016000205580611845816154d4565b9150506117ed565b50505050565b61126c83838360405180602001604052806000815250612c04565b61187733611561565b6118dc5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401611137565b600081815260146020526040902080546118f590615428565b15905061191357600081815260146020526040812061191391614b43565b336000908152601760205260409020541561193957336000908152601760205260408120555b6000818152601660205260409020546001600160a01b03161561197357600081815260166020526040902080546001600160a01b03191690555b61197c81613623565b6117c2816138b5565b6000611641838361353d565b80516020818301810180516011825292820191909301209152805461128a90615428565b600b546001600160a01b031633146119df5760405162461bcd60e51b8152600401611137906154ed565b601a805461ff001981166101009182900460ff1615909102179055565b80611a0633611561565b611a0f57600080fd5b61160b868686868661395c565b80611a2633611561565b611a2f57600080fd5b611a3b85858585613a3b565b5050505050565b600080611a4e83613adb565b9050600081604051602001611a639190615722565b6040516020818303038152906040528051906020012060001c905061146081611c32565b6000611322601e5461131c601b5490565b600061103782613471565b6000611aae60085490565b8210611b115760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401611137565b60088281548110611b2457611b24615462565b90600052602060002001549050919050565b6117c281604051602001611b4a9190615722565b6040516020818303038152906040528051906020012060001c82613c35565b60008151600003611b7957600080fd5b81604051602001611b8a9190615722565b60408051601f19818403018152919052805160209091012092915050565b611bb133612815565b611bcd5760405162461bcd60e51b815260040161113790615522565b818160118484604051611be192919061556c565b9081526020016040518091039020918261126c9291906155c2565b600b546001600160a01b03163314611c265760405162461bcd60e51b8152600401611137906154ed565b60196116fa828261573e565b6000818152600260205260408120546001600160a01b0316806110375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401611137565b601a5460ff16611cfb5760405162461bcd60e51b815260206004820152601a60248201527f53616c65206d7573742062652061637469766520746f206275790000000000006044820152606401611137565b8051600003611d1c5760405162461bcd60e51b8152600401611137906157fd565b611d25816130b1565b1515600114611d765760405162461bcd60e51b815260206004820152601a60248201527f546f70206c6576656c20646f6d61696e206e6f742065786973740000000000006044820152606401611137565b611d7f82613c5a565b15611dcc5760405162461bcd60e51b815260206004820152601a60248201527f446f6d61696e732063616e6e6f7420636f6e7461696e20646f740000000000006044820152606401611137565b81516000819003611e1a5760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b6044820152606401611137565b6002811015611e795760405162461bcd60e51b815260206004820152602560248201527f446f6d61696e207265717569726573206174206c656173742032206368617261604482015264637465727360d81b6064820152608401611137565b60125460ff161515600103611f86576000601184604051611e9a9190615722565b90815260200160405180910390208054611eb390615428565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf90615428565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b505050505090508051600014611f845760405162461bcd60e51b815260206004820152601d60248201527f54686973206e616d6520697320616c72656164792072657365727665640000006044820152606401611137565b505b60105460ff16151560010361206357336000908152600f602052604090205480611ffe5760405162461bcd60e51b815260206004820152602360248201527f5468652061646472657373206973206e6f7420696e207468652057686974656c6044820152621a5cdd60ea1b6064820152608401611137565b61200733612320565b8110156120615760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b6064820152608401611137565b505b8060020361211157601a5460ff6101009091041615156001146120e35760405162461bcd60e51b815260206004820152603260248201527f322043686172616374657220646f6d61696e206e616d6573206e65656420746f60448201527120626520616c6c6f77656420746f2062757960701b6064820152608401611137565b6120f2601c5461131c601b5490565b3410156121115760405162461bcd60e51b81526004016111379061583f565b8060030361214757612128601d5461131c601b5490565b3410156121475760405162461bcd60e51b81526004016111379061583f565b8060040361217d5761215e601e5461131c601b5490565b34101561217d5760405162461bcd60e51b81526004016111379061583f565b600581106121a757601b543410156121a75760405162461bcd60e51b81526004016111379061583f565b60006121b284613adb565b905060006121bf84613adb565b905081816040516020016121d4929190615894565b604051602081830303815290604052915060006121f083611b69565b90506121fb81613471565b156122405760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b6044820152606401611137565b61224a3382613cb9565b6122548184613cd3565b807fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c3952846040516122849190614c4f565b60405180910390a2505050505050565b6060806122a18484613d55565b909590945092505050565b600b546001600160a01b031633146122d65760405162461bcd60e51b8152600401611137906154ed565b6117c281613d76565b6122e833612815565b6123045760405162461bcd60e51b815260040161113790615522565b6001600160a01b039091166000908152600f6020526040902055565b60006001600160a01b03821661238b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401611137565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146123d15760405162461bcd60e51b8152600401611137906154ed565b61178d6000613d81565b60006123e682613471565b6123ef57600080fd5b600082815260136020526040902061103790613dd3565b61240f33612815565b61242b5760405162461bcd60e51b815260040161113790615522565b6001600160a01b0383166124765760405162461bcd60e51b8152602060048201526012602482015271151bc81859191c995cdcc81a5cc81b9d5b1b60721b6044820152606401611137565b80516000036124975760405162461bcd60e51b8152600401611137906157fd565b6124a0816130b1565b15156001146124f15760405162461bcd60e51b815260206004820152601a60248201527f546f70206c6576656c20646f6d61696e206e6f742065786973740000000000006044820152606401611137565b815160000361253d5760405162461bcd60e51b8152602060048201526018602482015277446f6d61696e206d757374206265206e6f6e2d656d70747960401b6044820152606401611137565b61254682613c5a565b156125885760405162461bcd60e51b8152602060048201526012602482015271111bdb585a5b881b9bdd081cdd5c1c1bdc9d60721b6044820152606401611137565b600061259383613adb565b905060006125a083613adb565b905081816040516020016125b5929190615894565b604051602081830303815290604052915060006125d183611b69565b90506125dc81613471565b156126215760405162461bcd60e51b8152602060048201526015602482015274446f6d61696e20616c72656164792065786973747360581b6044820152606401611137565b61224a8682613cb9565b60008061263783611b69565b905061264281613471565b15156000036126545750600092915050565b6000818152601660205260409020546001600160a01b0316806116415750309392505050565b61268333612815565b61269f5760405162461bcd60e51b815260040161113790615522565b601182826040516126b192919061556c565b908152602001604051809103902060006116fa9190614b43565b6001600160a01b0381166000908152601760205260408120546060918190036127065760405162461bcd60e51b8152600401611137906158d0565b612710838261353d565b6127765760405162461bcd60e51b815260206004820152603160248201527f526576657273655265736f6c7665723a204143434f554e545f49535f4e4f545f60448201527020a8282927ab22a22fa7a92fa7aba722a960791b6064820152608401611137565b6000818152601460205260409020805461278f90615428565b80601f01602080910402602001604051908101604052809291908181526020018280546127bb90615428565b80156128085780601f106127dd57610100808354040283529160200191612808565b820191906000526020600020905b8154815290600101906020018083116127eb57829003601f168201915b5050505050915050919050565b6000611037600c83613ddd565b8061282c33611561565b61283557600080fd5b816000036128555760405162461bcd60e51b8152600401611137906158d0565b50600090815260166020526040902080546001600160a01b0319169055565b600b546001600160a01b0316331461289e5760405162461bcd60e51b8152600401611137906154ed565b601c92909255601d55601e55565b600b546001600160a01b031633146128d65760405162461bcd60e51b8152600401611137906154ed565b601b55565b60606001805461104c90615428565b816128f433611561565b6128fd57600080fd5b61184d84848460405180602001604052806000815250613e60565b600061292382611b69565b905033612930818361353d565b61294c5760405162461bcd60e51b8152600401611137906156d2565b6001600160a01b031660009081526017602052604090205550565b336001600160a01b038316036129bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401611137565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b80612a3533611561565b612a3e57600080fd5b61126c612a4a83611c32565b8484613690565b600b546001600160a01b03163314612a7b5760405162461bcd60e51b8152600401611137906154ed565b6000612a8682611b69565b600081815260186020526040902090915061126c838261573e565b6000612aac82613471565b1515600003612abd57506000919050565b6000828152601660205260409020546001600160a01b03168061103757503092915050565b606080836001600160401b03811115612afd57612afd614e98565b604051908082528060200260200182016040528015612b3057816020015b6060815260200190600190039081612b1b5790505b509150836001600160401b03811115612b4b57612b4b614e98565b604051908082528060200260200182016040528015612b7e57816020015b6060815260200190600190039081612b695790505b50905060005b84811015612bfb57612bae868683818110612ba157612ba1615462565b9050602002013585613d55565b848381518110612bc057612bc0615462565b60200260200101848481518110612bd957612bd9615462565b6020026020010182905282905250508080612bf3906154d4565b915050612b84565b50935093915050565b612c0e338361353d565b612c2a5760405162461bcd60e51b815260040161113790615681565b612c3382613623565b61184d8484848461402f565b6000818152600a60205260409020805460609190612c5c90615428565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8890615428565b8015612cd55780601f10612caa57610100808354040283529160200191612cd5565b820191906000526020600020905b815481529060010190602001808311612cb857829003601f168201915b50505050509050919050565b81612ceb33611561565b612cf457600080fd5b61126c8383614062565b6060806000612d0c84612320565b905060008111612d385760405162461bcd60e51b81526020600482015260006024820152604401611137565b6000816001600160401b03811115612d5257612d52614e98565b604051908082528060200260200182016040528015612d7b578160200160208202803683370190505b5090506000826001600160401b03811115612d9857612d98614e98565b604051908082528060200260200182016040528015612dcb57816020015b6060815260200190600190039081612db65790505b50905060005b83811015612ed5576000612de58883611648565b600081815260146020526040812080549293509091612e0390615428565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2f90615428565b8015612e7c5780601f10612e5157610100808354040283529160200191612e7c565b820191906000526020600020905b815481529060010190602001808311612e5f57829003601f168201915b5050505050905081858481518110612e9657612e96615462565b60200260200101818152505080848481518110612eb557612eb5615462565b602002602001018190525050508080612ecd906154d4565b915050612dd1565b50909590945092505050565b6015602052600090815260409020805461128a90615428565b81612f0433611561565b612f0d57600080fd5b61126c83836140a2565b6000611322601d5461131c601b5490565b6060612f3382613471565b612f975760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611137565b60008281526014602052604081208054612fb090615428565b80601f0160208091040260200160405190810160405280929190818152602001828054612fdc90615428565b80156130295780601f10612ffe57610100808354040283529160200191613029565b820191906000526020600020905b81548152906001019060200180831161300c57829003601f168201915b50505050509050600061303a61414e565b9050805160000361304c575092915050565b81511561307e578082604051602001613066929190615918565b60405160208183030381529060405292505050919050565b8084604051602001613066929190615947565b8061309b33611561565b6130a457600080fd5b61160b868686868661415d565b600080806130be84611b69565b60008181526018602052604090208054919250906130db90615428565b1590506130e757600191505b5092915050565b600b546001600160a01b031633146131185760405162461bcd60e51b8152600401611137906154ed565b6012805460ff19811660ff90911615179055565b8061313633611561565b61313f57600080fd5b61160b86868686866141cb565b600b546001600160a01b031633146131765760405162461bcd60e51b8152600401611137906154ed565b6010805460ff1916911515919091179055565b33600081815260176020526040812054908190036131b95760405162461bcd60e51b8152600401611137906158d0565b506001600160a01b0316600090815260176020526040812055565b600b546001600160a01b031633146131fe5760405162461bcd60e51b8152600401611137906154ed565b6001600160a01b0381166132635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611137565b6117c281613d81565b6060816001600160401b0381111561328657613286614e98565b6040519080825280602002602001820160405280156132b957816020015b60608152602001906001900390816132a45790505b50905060005b828110156130e7576132e88484838181106132dc576132dc615462565b90506020020135612c3f565b8282815181106132fa576132fa615462565b60200260200101819052508080613310906154d4565b9150506132bf565b6000806011848460405161332d92919061556c565b9081526020016040518091039020805461334690615428565b80601f016020809104026020016040519081016040528092919081815260200182805461337290615428565b80156133bf5780601f10613394576101008083540402835291602001916133bf565b820191906000526020600020905b8154815290600101906020018083116133a257829003601f168201915b505092511515979650505050505050565b6133da8282613ddd565b156134275760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006044820152606401611137565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b14806110375750611037826141e1565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906134c382611c32565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116418284615969565b60606116418360405160200161351e9190615722565b6040516020818303038152906040528051906020012060001c83614231565b600061354882613471565b6135a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611137565b60006135b483611c32565b9050806001600160a01b0316846001600160a01b031614806135ef5750836001600160a01b03166135e4846110cf565b6001600160a01b0316145b8061146057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611460565b61362c816142f0565b60405160200161363e91815260200190565b60408051601f1981840301815282825280516020918201206000858152600e9092529181209190915582917f185c30856dadb58bf097c1f665a52ada7029752dbcad008ea3fefc73bee8c9fe9190a250565b826001600160a01b03166136a382611c32565b6001600160a01b03161461370b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401611137565b6001600160a01b03821661376d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401611137565b61377883838361431c565b61378360008261348e565b6001600160a01b03831660009081526003602052604081208054600192906137ac908490615988565b90915550506001600160a01b03821660009081526003602052604081208054600192906137da90849061599f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8481101561160b5761388c86868381811061385b5761385b615462565b9050602002013585858481811061387457613874615462565b90506020028101906138869190615478565b85613a3b565b80613896816154d4565b91505061383e565b60006116418383614327565b6117c2600c826133d0565b60006138c082611c32565b90506138ce8160008461431c565b6138d960008361348e565b6001600160a01b0381166000908152600360205260408120805460019290613902908490615988565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000858560405160200161397192919061556c565b60408051601f198184030181528282528051602091820120601f89018290048202840182019092528783529092506139c59183918990899081908401838280828437600092019190915250613c3592505050565b61160b8187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250889250614351915050565b613a4484614486565b613a905760405162461bcd60e51b815260206004820152601c60248201527f5265636f726453746f726167653a204b45595f4e4f545f464f554e44000000006044820152606401611137565b61184d84613a9d86612c3f565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250879250614351915050565b60606000829050600081516001600160401b03811115613afd57613afd614e98565b6040519080825280601f01601f191660200182016040528015613b27576020820181803683370190505b50905060005b8251811015611415576041838281518110613b4a57613b4a615462565b016020015160f81c10801590613b7a5750605a838281518110613b6f57613b6f615462565b016020015160f81c11155b15613bdc57828181518110613b9157613b91615462565b602001015160f81c60f81b60f81c6020613bab91906159b7565b60f81b828281518110613bc057613bc0615462565b60200101906001600160f81b031916908160001a905350613c23565b828181518110613bee57613bee615462565b602001015160f81c60f81b828281518110613c0b57613c0b615462565b60200101906001600160f81b031916908160001a9053505b80613c2d816154d4565b915050613b2d565b613c3e82614486565b6116fa576000828152600a6020526040902061126c828261573e565b805160009060018381019184010182805b82841015613cb057835160ff16602e819003613c8f57613c8c60018461599f565b92505b613c9a60018661599f565b9450508080613ca8906154d4565b915050613c6b565b50949350505050565b6116fa8282604051806020016040528060008152506144ac565b613cdc82613471565b613d3d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611137565b600082815260146020526040902061126c828261573e565b606080613d6184612c3f565b9150613d6d8484614231565b90509250929050565b6117c2600c826144df565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611037825490565b60006001600160a01b038216613e405760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401611137565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038416613e7357600080fd5b8151600003613e8157600080fd5b613e8a82613c5a565b15613e9457600080fd5b613e9d83613471565b613ea657600080fd5b6000613eb183613adb565b905060008160146000878152602001908152602001600020604051602001613eda9291906159dc565b60405160208183030381529060405290506000613ef682611b69565b90506000613f9e601460008981526020019081526020016000208054613f1b90615428565b80601f0160208091040260200160405190810160405280929190818152602001828054613f4790615428565b8015613f945780601f10613f6957610100808354040283529160200191613f94565b820191906000526020600020905b815481529060010190602001808311613f7757829003601f168201915b5050505050613c5a565b905080600103613fc2576000878152601360205260409020613fc09083614561565b505b845115613fd957613fd48883876144ac565b613fe3565b613fe38883613cb9565b613fed8284613cd3565b817fc5beef08f693b11c316c0c8394a377a0033c9cf701b8cd8afd79cecef60c39528460405161401d9190614c4f565b60405180910390a25050505050505050565b61403a848484613690565b6140468484848461456d565b61184d5760405162461bcd60e51b815260040161113790615a78565b61406b82613471565b61407457600080fd5b60009182526016602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b60006140ad82613adb565b9050600081601460008681526020019081526020016000206040516020016140d69291906159dc565b604051602081830303815290604052905060006140f282611b69565b600086815260136020526040902090915061410d908261466e565b506000818152601460205260409020805461412790615428565b15905061414557600081815260146020526040812061414591614b43565b611a3b816138b5565b60606019805461104c90615428565b60005b8481101561160b576141b986868381811061417d5761417d615462565b905060200281019061418f9190615478565b8686858181106141a1576141a1615462565b90506020028101906141b39190615478565b8661395c565b806141c3816154d4565b915050614160565b6141d481613623565b611a3b858585858561415d565b60006001600160e01b031982166380ac58cd60e01b148061421257506001600160e01b03198216635b5e139f60e01b145b8061103757506301ffc9a760e01b6001600160e01b0319831614611037565b6060600d6000614240846142f0565b81526020019081526020016000206000848152602001908152602001600020805461426a90615428565b80601f016020809104026020016040519081016040528092919081815260200182805461429690615428565b80156142e35780601f106142b8576101008083540402835291602001916142e3565b820191906000526020600020905b8154815290600101906020018083116142c657829003601f168201915b5050505050905092915050565b6000818152600e602052604081205415614318576000828152600e6020526040902054611037565b5090565b61126c83838361467a565b600082600001828154811061433e5761433e615462565b9060005260206000200154905092915050565b600d600061435e836142f0565b81526020019081526020016000206000858152602001908152602001600020805461438890615428565b90506000036143e0578260405161439f9190615722565b6040518091039020817f7ae4f661958fbecc2f77be6b0eb280d2a6f604b29e1e7221c82b9da0c4af7f86856040516143d79190614c4f565b60405180910390a35b81600d60006143ee846142f0565b815260200190815260200160002060008681526020019081526020016000209081614419919061573e565b50816040516144289190615722565b60405180910390208360405161443e9190615722565b6040518091039020827f851ffe8e74d5015261dba0a1f9e1b0e5d42c5af5d2ad1908fee897c7d80a0d92868660405161447892919061514e565b60405180910390a450505050565b6000818152600a6020526040812080548291906144a290615428565b9050119050919050565b6144b68383614732565b6144c3600084848461456d565b61126c5760405162461bcd60e51b815260040161113790615a78565b6144e98282613ddd565b61453f5760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b6064820152608401611137565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006116418383614871565b60006001600160a01b0384163b1561466357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145b1903390899088908890600401615aca565b6020604051808303816000875af19250505080156145ec575060408051601f3d908101601f191682019092526145e991810190615afd565b60015b614649573d80801561461a576040519150601f19603f3d011682016040523d82523d6000602084013e61461f565b606091505b5080516000036146415760405162461bcd60e51b815260040161113790615a78565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611460565b506001949350505050565b600061164183836148c0565b6001600160a01b0383166146d5576146d081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6146f8565b816001600160a01b0316836001600160a01b0316146146f8576146f883826149b3565b6001600160a01b03821661470f5761126c81614a50565b826001600160a01b0316826001600160a01b03161461126c5761126c8282614aff565b6001600160a01b0382166147885760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401611137565b61479181613471565b156147de5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401611137565b6147ea6000838361431c565b6001600160a01b038216600090815260036020526040812080546001929061481390849061599f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120546148b857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611037565b506000611037565b600081815260018301602052604081205480156149a95760006148e4600183615988565b85549091506000906148f890600190615988565b905081811461495d57600086600001828154811061491857614918615462565b906000526020600020015490508087600001848154811061493b5761493b615462565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061496e5761496e615b1a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611037565b6000915050611037565b600060016149c084612320565b6149ca9190615988565b600083815260076020526040902054909150808214614a1d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614a6290600190615988565b60008381526009602052604081205460088054939450909284908110614a8a57614a8a615462565b906000526020600020015490508060088381548110614aab57614aab615462565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614ae357614ae3615b1a565b6001900381819060005260206000200160009055905550505050565b6000614b0a83612320565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b508054614b4f90615428565b6000825580601f10614b5f575050565b601f0160209004906000526020600020908101906117c291905b808211156143185760008155600101614b79565b6001600160e01b0319811681146117c257600080fd5b600060208284031215614bb557600080fd5b813561164181614b8d565b80356001600160a01b0381168114614bd757600080fd5b919050565b600060208284031215614bee57600080fd5b61164182614bc0565b60005b83811015614c12578181015183820152602001614bfa565b8381111561184d5750506000910152565b60008151808452614c3b816020860160208601614bf7565b601f01601f19169290920160200192915050565b6020815260006116416020830184614c23565b600060208284031215614c7457600080fd5b5035919050565b60008060408385031215614c8e57600080fd5b614c9783614bc0565b946020939093013593505050565b60008083601f840112614cb757600080fd5b5081356001600160401b03811115614cce57600080fd5b6020830191508360208260051b8501011115614ce957600080fd5b9250929050565b600080600060408486031215614d0557600080fd5b83356001600160401b03811115614d1b57600080fd5b614d2786828701614ca5565b909790965060209590950135949350505050565b600081518084526020808501808196508360051b8101915082860160005b85811015614d83578284038952614d71848351614c23565b98850198935090840190600101614d59565b5091979650505050505050565b6020815260006116416020830184614d3b565b60008083601f840112614db557600080fd5b5081356001600160401b03811115614dcc57600080fd5b602083019150836020828501011115614ce957600080fd5b600080600060408486031215614df957600080fd5b83356001600160401b03811115614e0f57600080fd5b614d2786828701614da3565b60008060208385031215614e2e57600080fd5b82356001600160401b03811115614e4457600080fd5b614e5085828601614ca5565b90969095509350505050565b600080600060608486031215614e7157600080fd5b614e7a84614bc0565b9250614e8860208501614bc0565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600082601f830112614ebf57600080fd5b81356001600160401b0380821115614ed957614ed9614e98565b604051601f8301601f19908116603f01168101908282118183101715614f0157614f01614e98565b81604052838152866020858801011115614f1a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215614f4c57600080fd5b81356001600160401b03811115614f6257600080fd5b61146084828501614eae565b600080600080600060608688031215614f8657600080fd5b85356001600160401b0380821115614f9d57600080fd5b614fa989838a01614ca5565b90975095506020880135915080821115614fc257600080fd5b50614fcf88828901614ca5565b96999598509660400135949350505050565b60008060408385031215614ff457600080fd5b50508035926020909101359150565b60008060008060006060868803121561501b57600080fd5b85356001600160401b038082111561503257600080fd5b61503e89838a01614da3565b9097509550602088013591508082111561505757600080fd5b50614fcf88828901614da3565b6000806000806060858703121561507a57600080fd5b8435935060208501356001600160401b0381111561509757600080fd5b6150a387828801614da3565b9598909750949560400135949350505050565b600080602083850312156150c957600080fd5b82356001600160401b038111156150df57600080fd5b614e5085828601614da3565b600080604083850312156150fe57600080fd5b82356001600160401b038082111561511557600080fd5b61512186838701614eae565b9350602085013591508082111561513757600080fd5b5061514485828601614eae565b9150509250929050565b6040815260006151616040830185614c23565b82810360208401526151738185614c23565b95945050505050565b60008060006060848603121561519157600080fd5b61519a84614bc0565b925060208401356001600160401b03808211156151b657600080fd5b6151c287838801614eae565b935060408601359150808211156151d857600080fd5b506151e586828701614eae565b9150509250925092565b60008060006060848603121561520457600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561523057600080fd5b61523984614bc0565b92506020840135915060408401356001600160401b0381111561525b57600080fd5b6151e586828701614eae565b80358015158114614bd757600080fd5b6000806040838503121561528a57600080fd5b61529383614bc0565b9150613d6d60208401615267565b6040815260006152b46040830185614d3b565b82810360208401526151738185614d3b565b600080600080608085870312156152dc57600080fd5b6152e585614bc0565b93506152f360208601614bc0565b92506040850135915060608501356001600160401b0381111561531557600080fd5b61532187828801614eae565b91505092959194509250565b6000806040838503121561534057600080fd5b82359150613d6d60208401614bc0565b604080825283519082018190526000906020906060840190828701845b828110156153895781518452928401929084019060010161536d565b5050508381038285015261539d8186614d3b565b9695505050505050565b600080604083850312156153ba57600080fd5b8235915060208301356001600160401b038111156153d757600080fd5b61514485828601614eae565b600080604083850312156153f657600080fd5b6153ff83614bc0565b9150613d6d60208401614bc0565b60006020828403121561541f57600080fd5b61164182615267565b600181811c9082168061543c57607f821691505b60208210810361545c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261548f57600080fd5b8301803591506001600160401b038211156154a957600080fd5b602001915036819003821315614ce957600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016154e6576154e66154be565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f41646d696e436f6e74726f6c3a2073656e646572206d75737420686173206d696040820152696e74696e6720726f6c6560b01b606082015260800190565b8183823760009101908152919050565b601f82111561126c57600081815260208120601f850160051c810160208610156155a35750805b601f850160051c820191505b8181101561160b578281556001016155af565b6001600160401b038311156155d9576155d9614e98565b6155ed836155e78354615428565b8361557c565b6000601f84116001811461562157600085156156095750838201355b600019600387901b1c1916600186901b178355611a3b565b600083815260209020601f19861690835b828110156156525786850135825560209485019460019092019101615632565b508682101561566f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526030908201527f526576657273655265736f6c7665723a2053454e4445525f49535f4e4f545f4160408201526f28282927ab22a22fa7a92fa7aba722a960811b606082015260800190565b60008251615734818460208701614bf7565b9190910192915050565b81516001600160401b0381111561575757615757614e98565b61576b816157658454615428565b8461557c565b602080601f8311600181146157a057600084156157885750858301515b600019600386901b1c1916600185901b17855561160b565b600085815260208120601f198616915b828110156157cf578886015182559484019460019091019084016157b0565b50858210156157ed5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526022908201527f546f70206c6576656c20646f6d61696e206d757374206265206e6f6e2d656d70604082015261747960f01b606082015260800190565b60208082526035908201527f496e73756666696369656e7420546f6b656e206f7220546f6b656e2076616c7560408201527419481cd95b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b606082015260800190565b600083516158a6818460208801614bf7565b601760f91b90830190815283516158c4816001840160208801614bf7565b01600101949350505050565b60208082526028908201527f526576657273655265736f6c7665723a20524556455253455f5245434f52445f60408201526749535f454d50545960c01b606082015260800190565b6000835161592a818460208801614bf7565b83519083019061593e818360208801614bf7565b01949350505050565b60008351615959818460208801614bf7565b9190910191825250602001919050565b6000816000190483118215151615615983576159836154be565b500290565b60008282101561599a5761599a6154be565b500390565b600082198211156159b2576159b26154be565b500190565b600060ff821660ff84168060ff038211156159d4576159d46154be565b019392505050565b6000835160206159ef8285838901614bf7565b8184019150601760f91b8252600160008654615a0a81615428565b8184168015615a205760018114615a3957615a69565b60ff198316878601528115158202870185019350615a69565b896000528560002060005b83811015615a5f578154898201880152908601908701615a44565b5050848288010193505b50919998505050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061539d90830184614c23565b600060208284031215615b0f57600080fd5b815161164181614b8d565b634e487b7160e01b600052603160045260246000fdfea264697066735822122052c278f2daffab6d094c2a1c6cdad2cf970ae2f49a68c54444f9f6039fb6624464736f6c634300080f0033

Deployed Bytecode Sourcemap

75597:16930:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90955:162;;;;;;;;;;-1:-1:-1;90955:162:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;90955:162:0;;;;;;;;76300:40;;;;;;;;;;-1:-1:-1;76300:40:0;;;;;;;;;;;73803:45;;;;;;;;;;-1:-1:-1;73803:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1107:25:1;;;1095:2;1080:18;73803:45:0;961:177:1;29628:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31187:221::-;;;;;;;;;;-1:-1:-1;31187:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2243:32:1;;;2225:51;;2213:2;2198:18;31187:221:0;2079:203:1;30710:411:0;;;;;;;;;;-1:-1:-1;30710:411:0;;;;;:::i;:::-;;:::i;:::-;;75920:45;;;;;;;;;;-1:-1:-1;75920:45:0;;;;;:::i;:::-;;:::i;78003:108::-;;;;;;;;;;;;;:::i;42055:113::-;;;;;;;;;;-1:-1:-1;42143:10:0;:17;42055:113;;70160:280;;;;;;;;;;-1:-1:-1;70160:280:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70003:149::-;;;;;;;;;;-1:-1:-1;70003:149:0;;;;;:::i;:::-;;:::i;79448:90::-;;;;;;;;;;;;;:::i;74929:212::-;;;;;;;;;;-1:-1:-1;74929:212:0;;;;;:::i;:::-;;:::i;83729:332::-;;;;;;;;;;-1:-1:-1;83729:332:0;;;;;:::i;:::-;;:::i;87453:301::-;;;;;;;;;;-1:-1:-1;87453:301:0;;;;;:::i;:::-;;:::i;91896:239::-;;;;;;;;;;-1:-1:-1;91896:239:0;;;;;:::i;:::-;;:::i;90174:197::-;;;;;;;;;;-1:-1:-1;90174:197:0;;;;;:::i;:::-;;:::i;41723:256::-;;;;;;;;;;-1:-1:-1;41723:256:0;;;;;:::i;:::-;;:::i;92374:113::-;;;;;;;;;;-1:-1:-1;92374:113:0;;;;;:::i;:::-;;:::i;78443:92::-;;;;;;;;;;-1:-1:-1;78516:11:0;;78443:92;;85772:245;;;;;;;;;;-1:-1:-1;85772:245:0;;;;;:::i;:::-;;:::i;90650:122::-;;;:::i;49687:97::-;;;;;;;;;;-1:-1:-1;49687:97:0;;;;;:::i;:::-;;:::i;74038:227::-;;;;;;;;;;-1:-1:-1;74038:227:0;;;;;:::i;:::-;;:::i;84069:203::-;;;;;;;;;;-1:-1:-1;84069:203:0;;;;;:::i;:::-;;:::i;84662:542::-;;;;;;;;;;-1:-1:-1;84662:542:0;;;;;:::i;:::-;;:::i;76740:152::-;;;;;;;;;;-1:-1:-1;76740:152:0;;;;;:::i;:::-;;:::i;74707:44::-;;;;;;;;;;-1:-1:-1;74707:44:0;;;;;:::i;:::-;;:::i;78948:111::-;;;;;;;;;;;;;:::i;91262:191::-;;;;;;;;;;-1:-1:-1;91262:191:0;;;;;:::i;:::-;;:::i;91676:212::-;;;;;;;;;;-1:-1:-1;91676:212:0;;;;;:::i;:::-;;:::i;76901:241::-;;;;;;;;;;-1:-1:-1;76901:241:0;;;;;:::i;:::-;;:::i;78231:108::-;;;;;;;;;;;;;:::i;77804:104::-;;;;;;;;;;-1:-1:-1;77804:104:0;;;;;:::i;:::-;;:::i;42245:233::-;;;;;;;;;;-1:-1:-1;42245:233:0;;;;;:::i;:::-;;:::i;65902:118::-;;;;;;;;;;-1:-1:-1;65902:118:0;;;;;:::i;:::-;;:::i;90454:185::-;;;;;;;;;;-1:-1:-1;90454:185:0;;;;;:::i;:::-;;:::i;75147:127::-;;;;;;;;;;-1:-1:-1;75147:127:0;;;;;:::i;:::-;;:::i;79660:96::-;;;;;;;;;;-1:-1:-1;79660:96:0;;;;;:::i;:::-;;:::i;73855:37::-;;;;;;;;;;-1:-1:-1;73855:37:0;;;;;;;;76260:33;;;;;;;;;;-1:-1:-1;76260:33:0;;;;;;;;29322:239;;;;;;;;;;-1:-1:-1;29322:239:0;;;;;:::i;:::-;;:::i;80770:2094::-;;;;;;:::i;:::-;;:::i;70448:228::-;;;;;;;;;;-1:-1:-1;70448:228:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;49792:99::-;;;;;;;;;;-1:-1:-1;49792:99:0;;;;;:::i;:::-;;:::i;78345:92::-;;;;;;;;;;-1:-1:-1;78418:11:0;;78345:92;;74271:134;;;;;;;;;;-1:-1:-1;74271:134:0;;;;;:::i;:::-;;:::i;29052:208::-;;;;;;;;;;-1:-1:-1;29052:208:0;;;;;:::i;:::-;;:::i;21226:94::-;;;;;;;;;;;;;:::i;90005:163::-;;;;;;;;;;-1:-1:-1;90005:163:0;;;;;:::i;:::-;;:::i;82869:855::-;;;;;;;;;;-1:-1:-1;82869:855:0;;;;;:::i;:::-;;:::i;86822:330::-;;;;;;;;;;-1:-1:-1;86822:330:0;;;;;:::i;:::-;;:::i;75280:124::-;;;;;;;;;;-1:-1:-1;75280:124:0;;;;;:::i;:::-;;:::i;85413:353::-;;;;;;;;;;-1:-1:-1;85413:353:0;;;;;:::i;:::-;;:::i;49899:114::-;;;;;;;;;;-1:-1:-1;49899:114:0;;;;;:::i;:::-;;:::i;87760:205::-;;;;;;;;;;-1:-1:-1;87760:205:0;;;;;:::i;:::-;;:::i;20575:87::-;;;;;;;;;;-1:-1:-1;20648:6:0;;-1:-1:-1;;;;;20648:6:0;20575:87;;78639:214;;;;;;;;;;-1:-1:-1;78639:214:0;;;;;:::i;:::-;;:::i;78859:83::-;;;;;;;;;;-1:-1:-1;78859:83:0;;;;;:::i;:::-;;:::i;29797:104::-;;;;;;;;;;;;;:::i;88215:188::-;;;;;;;;;;-1:-1:-1;88215:188:0;;;;;:::i;:::-;;:::i;77915:82::-;;;;;;;;;;-1:-1:-1;77983:6:0;;77915:82;;86023:291;;;;;;;;;;-1:-1:-1;86023:291:0;;;;;:::i;:::-;;:::i;31480:295::-;;;;;;;;;;-1:-1:-1;31480:295:0;;;;;:::i;:::-;;:::i;74411:115::-;;;;;;;;;;-1:-1:-1;74411:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;74502:16:0;74475:7;74502:16;;;:10;:16;;;;;;;74411:115;85212:144;;;;;;;;;;-1:-1:-1;85212:144:0;;;;;:::i;:::-;;:::i;79065:132::-;;;;;;;;;;-1:-1:-1;79065:132:0;;;;;:::i;:::-;;:::i;87160:287::-;;;;;;;;;;-1:-1:-1;87160:287:0;;;;;:::i;:::-;;:::i;70684:435::-;;;;;;;;;;-1:-1:-1;70684:435:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;84282:373::-;;;;;;;;;;-1:-1:-1;84282:373:0;;;;;:::i;:::-;;:::i;65523:109::-;;;;;;;;;;-1:-1:-1;65523:109:0;;;;;:::i;:::-;;:::i;86672:144::-;;;;;;;;;;-1:-1:-1;86672:144:0;;;;;:::i;:::-;;:::i;77148:646::-;;;;;;;;;;-1:-1:-1;77148:646:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;75972:47::-;;;;;;;;;;-1:-1:-1;75972:47:0;;;;;:::i;:::-;;:::i;88412:147::-;;;;;;;;;;-1:-1:-1;88412:147:0;;;;;:::i;:::-;;:::i;78117:108::-;;;;;;;;;;;;;:::i;74758:40::-;;;;;;;;;;-1:-1:-1;74758:40:0;;;;;;;;79762:780;;;;;;;;;;-1:-1:-1;79762:780:0;;;;;:::i;:::-;;:::i;91461:207::-;;;;;;;;;;-1:-1:-1;91461:207:0;;;;;:::i;:::-;;:::i;78541:92::-;;;;;;;;;;-1:-1:-1;78614:11:0;;78541:92;;74532:113;;;;;;;;;;-1:-1:-1;74532:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;74617:16:0;74593:4;74617:16;;;:10;:16;;;;;;:20;;;74532:113;79203:239;;;;;;;;;;-1:-1:-1;79203:239:0;;;;;:::i;:::-;;:::i;31846:164::-;;;;;;;;;;-1:-1:-1;31846:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31967:25:0;;;31943:4;31967:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31846:164;74807:114;;;;;;;;;;;;;:::i;92143:223::-;;;;;;;;;;-1:-1:-1;92143:223:0;;;;;:::i;:::-;;:::i;73901:129::-;;;;;;;;;;-1:-1:-1;73901:129:0;;;;;:::i;:::-;;:::i;86320:250::-;;;;;;;;;;;;;:::i;21475:192::-;;;;;;;;;;-1:-1:-1;21475:192:0;;;;;:::i;:::-;;:::i;65640:254::-;;;;;;;;;;-1:-1:-1;65640:254:0;;;;;:::i;:::-;;:::i;75410:178::-;;;;;;;;;;-1:-1:-1;75410:178:0;;;;;:::i;:::-;;:::i;90955:162::-;91058:4;91076:36;91100:11;91076:23;:36::i;:::-;91069:43;90955:162;-1:-1:-1;;90955:162:0:o;29628:100::-;29682:13;29715:5;29708:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29628:100;:::o;31187:221::-;31263:7;31291:16;31299:7;31291;:16::i;:::-;31283:73;;;;-1:-1:-1;;;31283:73:0;;19331:2:1;31283:73:0;;;19313:21:1;19370:2;19350:18;;;19343:30;19409:34;19389:18;;;19382:62;-1:-1:-1;;;19460:18:1;;;19453:42;19512:19;;31283:73:0;;;;;;;;;-1:-1:-1;31376:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31376:24:0;;31187:221::o;30710:411::-;30791:13;30807:23;30822:7;30807:14;:23::i;:::-;30791:39;;30855:5;-1:-1:-1;;;;;30849:11:0;:2;-1:-1:-1;;;;;30849:11:0;;30841:57;;;;-1:-1:-1;;;30841:57:0;;19744:2:1;30841:57:0;;;19726:21:1;19783:2;19763:18;;;19756:30;19822:34;19802:18;;;19795:62;-1:-1:-1;;;19873:18:1;;;19866:31;19914:19;;30841:57:0;19542:397:1;30841:57:0;180:10;-1:-1:-1;;;;;30933:21:0;;;;:62;;-1:-1:-1;30958:37:0;30975:5;180:10;31846:164;:::i;30958:37::-;30911:168;;;;-1:-1:-1;;;30911:168:0;;20146:2:1;30911:168:0;;;20128:21:1;20185:2;20165:18;;;20158:30;20224:34;20204:18;;;20197:62;20295:26;20275:18;;;20268:54;20339:19;;30911:168:0;19944:420:1;30911:168:0;31092:21;31101:2;31105:7;31092:8;:21::i;:::-;30780:341;30710:411;;:::o;75920:45::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;78003:108::-;78049:7;78076:27;78091:11;;78076:10;77983:6;;;77915:82;78076:10;:14;;:27::i;:::-;78069:34;;78003:108;:::o;70160:280::-;70250:22;70307:4;-1:-1:-1;;;;;70294:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70285:34;;70335:9;70330:103;70350:15;;;70330:103;;;70399:22;70404:4;;70409:1;70404:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;70399:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70413:7:0;;-1:-1:-1;70399:4:0;;-1:-1:-1;;70399:22:0:i;:::-;70387:6;70394:1;70387:9;;;;;;;;:::i;:::-;;;;;;:34;;;;70367:3;;;;;:::i;:::-;;;;70330:103;;;;70160:280;;;;;:::o;70003:149::-;70086:19;70126:18;70131:3;;70126:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70136:7:0;;-1:-1:-1;70126:4:0;;-1:-1:-1;;70126:18:0:i;:::-;70118:26;70003:149;-1:-1:-1;;;;70003:149:0:o;79448:90::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;79517:13:::1;::::0;;-1:-1:-1;;79500:30:0;::::1;79517:13;::::0;;::::1;79516:14;79500:30;::::0;;79448:90::o;74929:212::-;49356:19;49364:10;49356:7;:19::i;:::-;49337:103;;;;-1:-1:-1;;;49337:103:0;;;;;;;:::i;:::-;75025:9:::1;75020:114;75040:16:::0;;::::1;75020:114;;;75114:5;;75120:1;75114:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;75082:12;75101:5;;75107:1;75101:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;75082:29;;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;-1:-1:-1::0;75058:3:0;::::1;::::0;::::1;:::i;:::-;;;;75020:114;;83729:332:::0;83891:41;180:10;83910:12;83924:7;83891:18;:41::i;:::-;83883:103;;;;-1:-1:-1;;;83883:103:0;;;;;;;:::i;:::-;83995:15;84002:7;83995:6;:15::i;:::-;84025:28;84035:4;84041:2;84045:7;84025:9;:28::i;87453:301::-;87519:15;87537:18;87548:6;87537:10;:18::i;:::-;87519:36;-1:-1:-1;180:10:0;87615:36;180:10;87519:36;87615:18;:36::i;:::-;87607:97;;;;-1:-1:-1;;;87607:97:0;;;;;;;:::i;:::-;-1:-1:-1;87722:24:0;;;;:15;:24;;;;;87715:31;;-1:-1:-1;;;;;;87715:31:0;;;-1:-1:-1;87453:301:0:o;91896:239::-;92064:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;92085:42:::1;92100:9;;92111:6;;92119:7;92085:14;:42::i;:::-;91896:239:::0;;;;;;:::o;90174:197::-;90254:7;90310:5;90283:24;90299:7;90283:15;:24::i;:::-;:32;90274:42;;;;;;90334:19;;;;:10;:19;;;;;:29;;90357:5;90334:22;:29::i;:::-;90327:36;90174:197;-1:-1:-1;;;90174:197:0:o;41723:256::-;41820:7;41856:23;41873:5;41856:16;:23::i;:::-;41848:5;:31;41840:87;;;;-1:-1:-1;;;41840:87:0;;25443:2:1;41840:87:0;;;25425:21:1;25482:2;25462:18;;;25455:30;25521:34;25501:18;;;25494:62;-1:-1:-1;;;25572:18:1;;;25565:41;25623:19;;41840:87:0;25241:407:1;41840:87:0;-1:-1:-1;;;;;;41945:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41723:256::o;92374:113::-;92444:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;92464:15:::1;92471:7;92464:6;:15::i;:::-;92374:113:::0;;:::o;85772:245::-;180:10;85876:36;180:10;85904:7;85876:18;:36::i;:::-;85868:97;;;;-1:-1:-1;;;85868:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;85976:23:0;;;;;:14;:23;;;;;:33;85772:245::o;90650:122::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;90716:47:::1;::::0;90724:10:::1;::::0;90741:21:::1;90716:47:::0;::::1;;;::::0;::::1;::::0;;;90741:21;90724:10;90716:47;::::1;;;;;;90708:56;;;::::0;::::1;;90650:122::o:0;49687:97::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;49757:19:::1;49768:7;49757:10;:19::i;:::-;49687:97:::0;:::o;74038:227::-;49356:19;49364:10;49356:7;:19::i;:::-;49337:103;;;;-1:-1:-1;;;49337:103:0;;;;;;;:::i;:::-;74153:9:::1;74148:110;74168:19:::0;;::::1;74148:110;;;74239:7;74213:10;:23;74224:8;;74233:1;74224:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74213:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;74213:23:0;:33;74189:3;::::1;::::0;::::1;:::i;:::-;;;;74148:110;;;;74038:227:::0;;;:::o;84069:203::-;84225:39;84242:4;84248:2;84252:7;84225:39;;;;;;;;;;;;:16;:39::i;84662:542::-;84727:41;180:10;84746:12;100:98;84727:41;84719:102;;;;-1:-1:-1;;;84719:102:0;;25855:2:1;84719:102:0;;;25837:21:1;25894:2;25874:18;;;25867:30;25933:34;25913:18;;;25906:62;-1:-1:-1;;;25984:18:1;;;25977:46;26040:19;;84719:102:0;25653:412:1;84719:102:0;84840:19;;;;:10;:19;;;;;84834:33;;;;;:::i;:::-;:38;;-1:-1:-1;84830:97:0;;84896:19;;;;:10;:19;;;;;84889:26;;;:::i;:::-;180:10;84939:28;;;;:14;:28;;;;;;:33;84935:101;;180:10;84996:28;;;;:14;:28;;;;;84989:35;84935:101;85084:1;85048:24;;;:15;:24;;;;;;-1:-1:-1;;;;;85048:24:0;:38;85044:102;;85110:24;;;;:15;:24;;;;;85103:31;;-1:-1:-1;;;;;;85103:31:0;;;85044:102;85154:15;85161:7;85154:6;:15::i;:::-;85182:14;85188:7;85182:5;:14::i;76740:152::-;76823:4;76848:36;76867:7;76876;76848:18;:36::i;74707:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;78948:111::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;79031:20:::1;::::0;;-1:-1:-1;;79007:44:0;::::1;79031:20;::::0;;;::::1;;;79030:21;79007:44:::0;;::::1;;::::0;;78948:111::o;91262:191::-;91399:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;91420:25:::1;91425:3;;91430:5;;91437:7;91420:4;:25::i;91676:212::-:0;91824:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;91845:35:::1;91856:7;91865:5;;91872:7;91845:10;:35::i;:::-;91676:212:::0;;;;;:::o;76901:241::-;76964:7;76979:21;77003:26;77022:6;77003:18;:26::i;:::-;76979:50;;77037:15;77090:7;77073:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;77063:36;;;;;;77055:45;;77037:63;;77118:16;77126:7;77118;:16::i;78231:108::-;78277:7;78304:27;78319:11;;78304:10;77983:6;;;77915:82;77804:104;77860:4;77884:16;77892:7;77884;:16::i;42245:233::-;42320:7;42356:30;42143:10;:17;;42055:113;42356:30;42348:5;:38;42340:95;;;;-1:-1:-1;;;42340:95:0;;26553:2:1;42340:95:0;;;26535:21:1;26592:2;26572:18;;;26565:30;26631:34;26611:18;;;26604:62;-1:-1:-1;;;26682:18:1;;;26675:42;26734:19;;42340:95:0;26351:408:1;42340:95:0;42453:10;42464:5;42453:17;;;;;;;;:::i;:::-;;;;;;;;;42446:24;;42245:233;;;:::o;65902:118::-;65957:55;66000:3;65983:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;65973:32;;;;;;65965:41;;66008:3;65957:7;:55::i;90454:185::-;90515:7;90551:5;90545:19;90568:1;90545:24;90536:34;;;;;;90623:5;90606:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;90606:23:0;;;;;;;;;90596:34;;90606:23;90596:34;;;;;90454:185;-1:-1:-1;;90454:185:0:o;75147:127::-;49356:19;49364:10;49356:7;:19::i;:::-;49337:103;;;;-1:-1:-1;;;49337:103:0;;;;;;;:::i;:::-;75262:4:::1;;75234:12;75253:4;;75234:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:32;;;;;;;:::i;79660:96::-:0;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;79730:11:::1;:18;79744:4:::0;79730:11;:18:::1;:::i;29322:239::-:0;29394:7;29430:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29430:16:0;;29457:73;;;;-1:-1:-1;;;29457:73:0;;28323:2:1;29457:73:0;;;28305:21:1;28362:2;28342:18;;;28335:30;28401:34;28381:18;;;28374:62;-1:-1:-1;;;28452:18:1;;;28445:39;28501:19;;29457:73:0;28121:405:1;80770:2094:0;80863:13;;;;80855:52;;;;-1:-1:-1;;;80855:52:0;;28733:2:1;80855:52:0;;;28715:21:1;28772:2;28752:18;;;28745:30;28811:28;28791:18;;;28784:56;28857:18;;80855:52:0;28531:350:1;80855:52:0;80930:3;80924:17;80945:1;80924:22;80916:69;;;;-1:-1:-1;;;80916:69:0;;;;;;;:::i;:::-;81002:10;81008:3;81002:5;:10::i;:::-;:18;;81016:4;81002:18;80994:57;;;;-1:-1:-1;;;80994:57:0;;29491:2:1;80994:57:0;;;29473:21:1;29530:2;29510:18;;;29503:30;29569:28;29549:18;;;29542:56;29615:18;;80994:57:0;29289:350:1;80994:57:0;81068:27;81088:6;81068:19;:27::i;:::-;:32;81060:71;;;;-1:-1:-1;;;81060:71:0;;29846:2:1;81060:71:0;;;29828:21:1;29885:2;29865:18;;;29858:30;29924:28;29904:18;;;29897:56;29970:18;;81060:71:0;29644:350:1;81060:71:0;81158:20;;81140:15;81195:12;;;81187:49;;;;-1:-1:-1;;;81187:49:0;;30201:2:1;81187:49:0;;;30183:21:1;30240:2;30220:18;;;30213:30;-1:-1:-1;;;30259:18:1;;;30252:54;30323:18;;81187:49:0;29999:348:1;81187:49:0;81265:1;81254:7;:12;;81246:62;;;;-1:-1:-1;;;81246:62:0;;30554:2:1;81246:62:0;;;30536:21:1;30593:2;30573:18;;;30566:30;30632:34;30612:18;;;30605:62;-1:-1:-1;;;30683:18:1;;;30676:35;30728:19;;81246:62:0;30352:401:1;81246:62:0;81348:20;;;;:28;;:20;:28;81344:164;;81383:18;81404:12;81423:6;81404:27;;;;;;:::i;:::-;;;;;;;;;;;;;81383:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81451:4;81445:18;81467:1;81445:23;81437:65;;;;-1:-1:-1;;;81437:65:0;;31239:2:1;81437:65:0;;;31221:21:1;31278:2;31258:18;;;31251:30;31317:31;31297:18;;;31290:59;31366:18;;81437:65:0;31037:353:1;81437:65:0;81377:131;81344:164;81549:17;;;;:25;;:17;:25;81545:232;;81610:10;81581:15;81599:22;;;:10;:22;;;;;;81635:11;81627:59;;;;-1:-1:-1;;;81627:59:0;;31597:2:1;81627:59:0;;;31579:21:1;31636:2;31616:18;;;31609:30;31675:34;31655:18;;;31648:62;-1:-1:-1;;;31726:18:1;;;31719:33;31769:19;;81627:59:0;31395:399:1;81627:59:0;81711:21;81721:10;81711:9;:21::i;:::-;81700:7;:32;;81692:79;;;;-1:-1:-1;;;81692:79:0;;32001:2:1;81692:79:0;;;31983:21:1;32040:2;32020:18;;;32013:30;32079:34;32059:18;;;32052:62;-1:-1:-1;;;32130:18:1;;;32123:32;32172:19;;81692:79:0;31799:398:1;81692:79:0;81575:202;81545:232;81789:7;81800:1;81789:12;81785:241;;81820:20;;;;;;;;:28;;:20;:28;81812:91;;;;-1:-1:-1;;;81812:91:0;;32404:2:1;81812:91:0;;;32386:21:1;32443:2;32423:18;;;32416:30;32482:34;32462:18;;;32455:62;-1:-1:-1;;;32533:18:1;;;32526:48;32591:19;;81812:91:0;32202:414:1;81812:91:0;81935:27;81950:11;;81935:10;77983:6;;;77915:82;81935:27;81922:9;:40;;81914:106;;;;-1:-1:-1;;;81914:106:0;;;;;;;:::i;:::-;82037:7;82048:1;82037:12;82033:139;;82081:27;82096:11;;82081:10;77983:6;;;77915:82;82081:27;82068:9;:40;;82060:106;;;;-1:-1:-1;;;82060:106:0;;;;;;;:::i;:::-;82184:7;82195:1;82184:12;82180:139;;82228:27;82243:11;;82228:10;77983:6;;;77915:82;82228:27;82215:9;:40;;82207:106;;;;-1:-1:-1;;;82207:106:0;;;;;;;:::i;:::-;82342:1;82331:7;:12;82327:122;;77983:6;;82362:9;:23;;82354:89;;;;-1:-1:-1;;;82354:89:0;;;;;;;:::i;:::-;82457:21;82481:26;82500:6;82481:18;:26::i;:::-;82457:50;;82516:18;82537:23;82556:3;82537:18;:23::i;:::-;82516:44;;82603:7;82617:4;82586:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82569:54;;82632:15;82650:19;82661:7;82650:10;:19::i;:::-;82632:37;;82688:16;82696:7;82688;:16::i;:::-;82687:17;82678:52;;;;-1:-1:-1;;;82678:52:0;;33864:2:1;82678:52:0;;;33846:21:1;33903:2;33883:18;;;33876:30;-1:-1:-1;;;33922:18:1;;;33915:51;33983:18;;82678:52:0;33662:345:1;82678:52:0;82741:30;82751:10;82763:7;82741:9;:30::i;:::-;82784;82797:7;82806;82784:12;:30::i;:::-;82839:7;82832:24;82848:7;82832:24;;;;;;:::i;:::-;;;;;;;;80850:2014;;;;80770:2094;;:::o;70448:228::-;70569:17;70588:19;70640:28;70651:7;70660;70640:10;:28::i;:::-;70625:43;;;;-1:-1:-1;70448:228:0;-1:-1:-1;;;70448:228:0:o;49792:99::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;49863:20:::1;49875:7;49863:11;:20::i;74271:134::-:0;49356:19;49364:10;49356:7;:19::i;:::-;49337:103;;;;-1:-1:-1;;;49337:103:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;74368:19:0;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:29;74271:134::o;29052:208::-;29124:7;-1:-1:-1;;;;;29152:19:0;;29144:74;;;;-1:-1:-1;;;29144:74:0;;34214:2:1;29144:74:0;;;34196:21:1;34253:2;34233:18;;;34226:30;34292:34;34272:18;;;34265:62;-1:-1:-1;;;34343:18:1;;;34336:40;34393:19;;29144:74:0;34012:406:1;29144:74:0;-1:-1:-1;;;;;;29236:16:0;;;;;:9;:16;;;;;;;29052:208::o;21226:94::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;21291:21:::1;21309:1;21291:9;:21::i;90005:163::-:0;90068:7;90097:16;90105:7;90097;:16::i;:::-;90088:26;;;;;;90132:19;;;;:10;:19;;;;;:28;;:26;:28::i;82869:855::-;49356:19;49364:10;49356:7;:19::i;:::-;49337:103;;;;-1:-1:-1;;;49337:103:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;82992:16:0;::::1;82984:47;;;::::0;-1:-1:-1;;;82984:47:0;;34625:2:1;82984:47:0::1;::::0;::::1;34607:21:1::0;34664:2;34644:18;;;34637:30;-1:-1:-1;;;34683:18:1;;;34676:48;34741:18;;82984:47:0::1;34423:342:1::0;82984:47:0::1;83054:3;83048:17;83069:1;83048:22:::0;83040:69:::1;;;;-1:-1:-1::0;;;83040:69:0::1;;;;;;;:::i;:::-;83126:10;83132:3;83126:5;:10::i;:::-;:18;;83140:4;83126:18;83118:57;;;::::0;-1:-1:-1;;;83118:57:0;;29491:2:1;83118:57:0::1;::::0;::::1;29473:21:1::0;29530:2;29510:18;;;29503:30;29569:28;29549:18;;;29542:56;29615:18;;83118:57:0::1;29289:350:1::0;83118:57:0::1;83198:6;83192:20;83216:1;83192:25:::0;83184:62:::1;;;::::0;-1:-1:-1;;;83184:62:0;;30201:2:1;83184:62:0::1;::::0;::::1;30183:21:1::0;30240:2;30220:18;;;30213:30;-1:-1:-1;;;30259:18:1;;;30252:54;30323:18;;83184:62:0::1;29999:348:1::0;83184:62:0::1;83264:27;83284:6;83264:19;:27::i;:::-;:32:::0;83256:63:::1;;;::::0;-1:-1:-1;;;83256:63:0;;34972:2:1;83256:63:0::1;::::0;::::1;34954:21:1::0;35011:2;34991:18;;;34984:30;-1:-1:-1;;;35030:18:1;;;35023:48;35088:18;;83256:63:0::1;34770:342:1::0;83256:63:0::1;83326:21;83350:26;83369:6;83350:18;:26::i;:::-;83326:50;;83383:18;83404:23;83423:3;83404:18;:23::i;:::-;83383:44;;83470:7;83484:4;83453:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83436:54;;83497:15;83515:19;83526:7;83515:10;:19::i;:::-;83497:37;;83553:16;83561:7;83553;:16::i;:::-;83552:17;83543:52;;;::::0;-1:-1:-1;;;83543:52:0;;33864:2:1;83543:52:0::1;::::0;::::1;33846:21:1::0;33903:2;33883:18;;;33876:30;-1:-1:-1;;;33922:18:1;;;33915:51;33983:18;;83543:52:0::1;33662:345:1::0;83543:52:0::1;83609:22;83619:2;83623:7;83609:9;:22::i;86822:330::-:0;86887:7;86901:15;86919:18;86930:6;86919:10;:18::i;:::-;86901:36;;86946:16;86954:7;86946;:16::i;:::-;:25;;86966:5;86946:25;86942:59;;-1:-1:-1;86993:1:0;;86822:330;-1:-1:-1;;86822:330:0:o;86942:59::-;87005:16;87024:24;;;:15;:24;;;;;;-1:-1:-1;;;;;87024:24:0;;87059:63;;-1:-1:-1;87111:4:0;87139:8;86822:330;-1:-1:-1;;;86822:330:0:o;75280:124::-;49356:19;49364:10;49356:7;:19::i;:::-;49337:103;;;;-1:-1:-1;;;49337:103:0;;;;;;;:::i;:::-;75371:12:::1;75390:4;;75371:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;75364:32;;;;:::i;85413:353::-:0;-1:-1:-1;;;;;85513:23:0;;85495:15;85513:23;;;:14;:23;;;;;;85470:13;;85555:12;;;85547:65;;;;-1:-1:-1;;;85547:65:0;;;;;;;:::i;:::-;85631:36;85650:7;85659;85631:18;:36::i;:::-;85623:98;;;;-1:-1:-1;;;85623:98:0;;35728:2:1;85623:98:0;;;35710:21:1;35767:2;35747:18;;;35740:30;35806:34;35786:18;;;35779:62;-1:-1:-1;;;35857:18:1;;;35850:47;35914:19;;85623:98:0;35526:413:1;85623:98:0;85739:19;;;;:10;:19;;;;;85732:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85413:353;;;:::o;49899:114::-;49954:4;49976:29;:16;49997:7;49976:20;:29::i;87760:205::-;87830:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;87858:7:::1;87869:1;87858:12:::0;87850:65:::1;;;;-1:-1:-1::0;;;87850:65:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;87933:24:0::1;::::0;;;:15:::1;:24;::::0;;;;87926:31;;-1:-1:-1;;;;;;87926:31:0::1;::::0;;87760:205::o;78639:214::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;78748:11:::1;:27:::0;;;;78786:11:::1;:27:::0;78818:11:::1;:27:::0;78639:214::o;78859:83::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;78920:6:::1;:14:::0;78859:83::o;29797:104::-;29853:13;29886:7;29879:14;;;;;:::i;88215:188::-;88329:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;88355:40:::1;88374:2;88378:7;88387:3;88355:40;;;;;;;;;;;::::0;:18:::1;:40::i;86023:291::-:0;86077:15;86095:18;86106:6;86095:10;:18::i;:::-;86077:36;-1:-1:-1;180:10:0;86173:36;180:10;86077:36;86173:18;:36::i;:::-;86165:97;;;;-1:-1:-1;;;86165:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;86273:23:0;;;;;:14;:23;;;;;:33;-1:-1:-1;86023:291:0:o;31480:295::-;180:10;-1:-1:-1;;;;;31583:24:0;;;31575:62;;;;-1:-1:-1;;;31575:62:0;;36146:2:1;31575:62:0;;;36128:21:1;36185:2;36165:18;;;36158:30;36224:27;36204:18;;;36197:55;36269:18;;31575:62:0;35944:349:1;31575:62:0;180:10;31650:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31650:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31650:53:0;;;;;;;;;;31719:48;;540:41:1;;;31650:42:0;;180:10;31719:48;;513:18:1;31719:48:0;;;;;;;31480:295;;:::o;85212:144::-;85288:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;85308:40:::1;85318:16;85326:7;85318;:16::i;:::-;85336:2;85340:7;85308:9;:40::i;79065:132::-:0;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;79129:15:::1;79147:16;79158:4;79147:10;:16::i;:::-;79168:14;::::0;;;:5:::1;:14;::::0;;;;79129:34;;-1:-1:-1;79168:21:0::1;79185:4:::0;79168:14;:21:::1;:::i;87160:287::-:0;87220:7;87238:16;87246:7;87238;:16::i;:::-;:25;;87258:5;87238:25;87234:59;;-1:-1:-1;87285:1:0;;87160:287;-1:-1:-1;87160:287:0:o;87234:59::-;87297:16;87316:24;;;:15;:24;;;;;;-1:-1:-1;;;;;87316:24:0;;87351:63;;-1:-1:-1;87403:4:0;87431:8;87160:287;-1:-1:-1;;87160:287:0:o;70684:435::-;70822:20;;70904:9;-1:-1:-1;;;;;70891:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70884:37:0;-1:-1:-1;70954:9:0;-1:-1:-1;;;;;70941:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70932:39;;70987:9;70982:130;71002:20;;;70982:130;;;71067:33;71078:9;;71088:1;71078:12;;;;;;;:::i;:::-;;;;;;;71092:7;71067:10;:33::i;:::-;71045:4;71050:1;71045:7;;;;;;;;:::i;:::-;;;;;;71054:6;71061:1;71054:9;;;;;;;;:::i;:::-;;;;;;71044:56;;;;;;;;71024:3;;;;;:::i;:::-;;;;70982:130;;;;70684:435;;;;;;:::o;84282:373::-;84474:41;180:10;84507:7;84474:18;:41::i;:::-;84466:103;;;;-1:-1:-1;;;84466:103:0;;;;;;;:::i;:::-;84578:15;84585:7;84578:6;:15::i;:::-;84608:39;84622:4;84628:2;84632:7;84641:5;84608:13;:39::i;65523:109::-;65610:14;;;;:5;:14;;;;;65603:21;;65577:13;;65610:14;65603:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65523:109;;;:::o;86672:144::-;86757:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;86777:31:::1;86790:7;86799:8;86777:12;:31::i;77148:646::-:0;77216:25;77244:23;77275:16;77294:18;77304:7;77294:9;:18::i;:::-;77275:37;;77342:1;77331:8;:12;77323:25;;;;-1:-1:-1;;;77323:25:0;;36500:2:1;77323:25:0;;;36482:21:1;-1:-1:-1;36519:18:1;;;36512:29;36558:18;;77323:25:0;36298:284:1;77323:25:0;77360:26;77403:8;-1:-1:-1;;;;;77389:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77389:23:0;;77360:52;;77423:24;77463:8;-1:-1:-1;;;;;77450:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77423:49;;77488:9;77483:244;77507:8;77503:1;:12;77483:244;;;77537:15;77555:31;77575:7;77584:1;77555:19;:31::i;:::-;77601:20;77624:19;;;:10;:19;;;;;77601:42;;77537:49;;-1:-1:-1;77601:20:0;;:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77673:7;77658:9;77668:1;77658:12;;;;;;;;:::i;:::-;;;;;;:22;;;;;77709:6;77695:8;77704:1;77695:11;;;;;;;;:::i;:::-;;;;;;:20;;;;77522:205;;77517:3;;;;;:::i;:::-;;;;77483:244;;;-1:-1:-1;77748:9:0;;77778:8;;-1:-1:-1;77148:646:0;-1:-1:-1;;;77148:646:0:o;75972:47::-;;;;;;;;;;;;;;;;:::i;88412:147::-;88500:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;88523:28:::1;88538:7;88547:3;88523:14;:28::i;78117:108::-:0;78163:7;78190:27;78205:11;;78190:10;77983:6;;;77915:82;79762:780;79827:13;79861:16;79869:7;79861;:16::i;:::-;79853:76;;;;-1:-1:-1;;;79853:76:0;;36789:2:1;79853:76:0;;;36771:21:1;36828:2;36808:18;;;36801:30;36867:34;36847:18;;;36840:62;-1:-1:-1;;;36918:18:1;;;36911:45;36973:19;;79853:76:0;36587:411:1;79853:76:0;79942:23;79968:19;;;:10;:19;;;;;79942:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80053:21;80077:10;:8;:10::i;:::-;80053:34;;80108:7;80102:21;80127:1;80102:26;80098:75;;-1:-1:-1;80152:9:0;79762:780;-1:-1:-1;;79762:780:0:o;80098:75::-;80277:23;;:27;80273:111;;80352:7;80361:9;80335:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80321:51;;;;79762:780;;;:::o;80273:111::-;80516:7;80525;80499:34;;;;;;;;;:::i;91461:207::-;91608:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;91629:31:::1;91638:4;;91644:6;;91652:7;91629:8;:31::i;79203:239::-:0;79259:4;;;79319:16;79330:4;79319:10;:16::i;:::-;79350:14;;;;:5;:14;;;;;79344:28;;79301:34;;-1:-1:-1;79350:14:0;79344:28;;;:::i;:::-;:33;;-1:-1:-1;79340:79:0;;79403:4;79393:14;;79340:79;-1:-1:-1;79430:7:0;79203:239;-1:-1:-1;;79203:239:0:o;74807:114::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;74893:20:::1;::::0;;-1:-1:-1;;74869:44:0;::::1;74893:20;::::0;;::::1;74892:21;74869:44;::::0;;74807:114::o;92143:223::-;92303:7;76587:41;180:10;76606:12;100:98;76587:41;76565:74;;;;;;92323:35:::1;92336:4;;92342:6;;92350:7;92323:12;:35::i;73901:129::-:0;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;73984:17:::1;:38:::0;;-1:-1:-1;;73984:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;73901:129::o;86320:250::-;180:10;86363:15;86422:23;;;:14;:23;;;;;;;86464:12;;;86456:65;;;;-1:-1:-1;;;86456:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;86539:23:0;;;;;:14;:23;;;;;86532:30;86320:250::o;21475:192::-;20648:6;;-1:-1:-1;;;;;20648:6:0;180:10;20795:23;20787:68;;;;-1:-1:-1;;;20787:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21564:22:0;::::1;21556:73;;;::::0;-1:-1:-1;;;21556:73:0;;38057:2:1;21556:73:0::1;::::0;::::1;38039:21:1::0;38096:2;38076:18;;;38069:30;38135:34;38115:18;;;38108:62;-1:-1:-1;;;38186:18:1;;;38179:36;38232:19;;21556:73:0::1;37855:402:1::0;21556:73:0::1;21640:19;21650:8;21640:9;:19::i;65640:254::-:0;65705:22;65762:6;-1:-1:-1;;;;;65749:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65740:36;;65792:9;65787:100;65807:17;;;65787:100;;;65858:17;65865:6;;65872:1;65865:9;;;;;;;:::i;:::-;;;;;;;65858:6;:17::i;:::-;65846:6;65853:1;65846:9;;;;;;;;:::i;:::-;;;;;;:29;;;;65826:3;;;;;:::i;:::-;;;;65787:100;;75410:178;75481:4;75492:19;75514:12;75533:4;;75514:25;;;;;;;:::i;:::-;;;;;;;;;;;;;75492:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75557:19:0;;:23;;;75410:178;-1:-1:-1;;;;;;;75410:178:0:o;48427:::-;48505:18;48509:4;48515:7;48505:3;:18::i;:::-;48504:19;48496:63;;;;-1:-1:-1;;;48496:63:0;;38464:2:1;48496:63:0;;;38446:21:1;38503:2;38483:18;;;38476:30;38542:33;38522:18;;;38515:61;38593:18;;48496:63:0;38262:355:1;48496:63:0;-1:-1:-1;;;;;48570:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;48570:27:0;48593:4;48570:27;;;48427:178::o;41415:224::-;41517:4;-1:-1:-1;;;;;;41541:50:0;;-1:-1:-1;;;41541:50:0;;:90;;;41595:36;41619:11;41595:23;:36::i;34581:127::-;34646:4;34670:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34670:16:0;:30;;;34581:127::o;38563:174::-;38638:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38638:29:0;-1:-1:-1;;;;;38638:29:0;;;;;;;;:24;;38692:23;38638:24;38692:14;:23::i;:::-;-1:-1:-1;;;;;38683:46:0;;;;;;;;;;;38563:174;;:::o;5123:98::-;5181:7;5208:5;5212:1;5208;:5;:::i;72787:169::-;72859:13;72892:56;72932:3;72915:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;72905:32;;;;;;72897:41;;72940:7;72892:4;:56::i;34875:348::-;34968:4;34993:16;35001:7;34993;:16::i;:::-;34985:73;;;;-1:-1:-1;;;34985:73:0;;38997:2:1;34985:73:0;;;38979:21:1;39036:2;39016:18;;;39009:30;39075:34;39055:18;;;39048:62;-1:-1:-1;;;39126:18:1;;;39119:42;39178:19;;34985:73:0;38795:408:1;34985:73:0;35069:13;35085:23;35100:7;35085:14;:23::i;:::-;35069:39;;35138:5;-1:-1:-1;;;;;35127:16:0;:7;-1:-1:-1;;;;;35127:16:0;;:51;;;;35171:7;-1:-1:-1;;;;;35147:31:0;:20;35159:7;35147:11;:20::i;:::-;-1:-1:-1;;;;;35147:31:0;;35127:51;:87;;;-1:-1:-1;;;;;;31967:25:0;;;31943:4;31967:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35182:32;31846:164;72600:179;72713:18;72723:7;72713:9;:18::i;:::-;72696:36;;;;;;39337:19:1;;39381:2;39372:12;;39208:182;72696:36:0;;;;-1:-1:-1;;72696:36:0;;;;;;;;;72686:47;;72696:36;72686:47;;;;72678:56;72653:22;;;:13;:22;;;;;;:81;;;;72667:7;;72750:21;;72678:56;72750:21;72600:179;:::o;37867:578::-;38026:4;-1:-1:-1;;;;;37999:31:0;:23;38014:7;37999:14;:23::i;:::-;-1:-1:-1;;;;;37999:31:0;;37991:85;;;;-1:-1:-1;;;37991:85:0;;39597:2:1;37991:85:0;;;39579:21:1;39636:2;39616:18;;;39609:30;39675:34;39655:18;;;39648:62;-1:-1:-1;;;39726:18:1;;;39719:39;39775:19;;37991:85:0;39395:405:1;37991:85:0;-1:-1:-1;;;;;38095:16:0;;38087:65;;;;-1:-1:-1;;;38087:65:0;;40007:2:1;38087:65:0;;;39989:21:1;40046:2;40026:18;;;40019:30;40085:34;40065:18;;;40058:62;-1:-1:-1;;;40136:18:1;;;40129:34;40180:19;;38087:65:0;39805:400:1;38087:65:0;38165:39;38186:4;38192:2;38196:7;38165:20;:39::i;:::-;38269:29;38286:1;38290:7;38269:8;:29::i;:::-;-1:-1:-1;;;;;38311:15:0;;;;;;:9;:15;;;;;:20;;38330:1;;38311:15;:20;;38330:1;;38311:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38342:13:0;;;;;;:9;:13;;;;;:18;;38359:1;;38342:13;:18;;38359:1;;38342:18;:::i;:::-;;;;-1:-1:-1;;38371:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38371:21:0;-1:-1:-1;;;;;38371:21:0;;;;;;;;;38410:27;;38371:16;;38410:27;;;;;;;37867:578;;;:::o;72100:276::-;72256:9;72251:118;72271:20;;;72251:118;;;72313:44;72324:9;;72334:1;72324:12;;;;;;;:::i;:::-;;;;;;;72338:6;;72345:1;72338:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;72349:7;72313:10;:44::i;:::-;72293:3;;;;:::i;:::-;;;;72251:118;;64481:137;64552:7;64587:22;64591:3;64603:5;64587:3;:22::i;50025:93::-;50081:29;:16;50102:7;50081:20;:29::i;37170:360::-;37230:13;37246:23;37261:7;37246:14;:23::i;:::-;37230:39;;37282:48;37303:5;37318:1;37322:7;37282:20;:48::i;:::-;37371:29;37388:1;37392:7;37371:8;:29::i;:::-;-1:-1:-1;;;;;37413:16:0;;;;;;:9;:16;;;;;:21;;37433:1;;37413:16;:21;;37433:1;;37413:21;:::i;:::-;;;;-1:-1:-1;;37452:16:0;;;;:7;:16;;;;;;37445:23;;-1:-1:-1;;;;;;37445:23:0;;;37486:36;37460:7;;37452:16;-1:-1:-1;;;;;37486:36:0;;;;;37452:16;;37486:36;37219:311;37170:360;:::o;71299:273::-;71428:15;71481:3;;71464:21;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;71464:21:0;;;;;;;;;71454:32;;71464:21;71454:32;;;;71498:21;;;;;;;;;;;;;;;;;;71454:32;;-1:-1:-1;71498:21:0;;71454:32;;71515:3;;;;;;71498:21;;71515:3;;;;71498:21;;;;;;;;;-1:-1:-1;71498:7:0;;-1:-1:-1;;;71498:21:0:i;:::-;71530:34;71535:7;71544:3;;71530:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;71530:34:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71549:5:0;;-1:-1:-1;71549:5:0;;;;71530:34;;71549:5;;;;71530:34;;;;;;;;;-1:-1:-1;71556:7:0;;-1:-1:-1;71530:4:0;;-1:-1:-1;;71530:34:0:i;71836:256::-;71975:19;71986:7;71975:10;:19::i;:::-;71967:60;;;;-1:-1:-1;;;71967:60:0;;40953:2:1;71967:60:0;;;40935:21:1;40992:2;40972:18;;;40965:30;41031;41011:18;;;41004:58;41079:18;;71967:60:0;40751:352:1;71967:60:0;72038:46;72043:7;72052:15;72059:7;72052:6;:15::i;:::-;72069:5;;72038:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72076:7:0;;-1:-1:-1;72038:4:0;;-1:-1:-1;;72038:46:0:i;50957:566::-;51016:13;51042:17;51068:3;51042:30;;51083:19;51115:4;:11;-1:-1:-1;;;;;51105:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51105:22:0;;51083:44;;51143:6;51138:346;51159:4;:11;51155:1;:15;51138:346;;;51254:2;51242:4;51247:1;51242:7;;;;;;;;:::i;:::-;;;;;;;51236:20;;;;51235:48;;;51280:2;51268:4;51273:1;51268:7;;;;;;;;:::i;:::-;;;;;;;51262:20;;51235:48;51231:242;;;51383:4;51388:1;51383:7;;;;;;;;:::i;:::-;;;;;;;;;51377:14;;51394:2;51377:19;;;;:::i;:::-;51370:27;;51358:6;51365:1;51358:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;51358:39:0;;;;;;;;;51231:242;;;51450:4;51455:1;51450:7;;;;;;;;:::i;:::-;;;;;;;;;51438:6;51445:1;51438:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;51438:19:0;;;;;;;;;51231:242;51172:3;;;;:::i;:::-;;;;51138:346;;66160:153;66238:19;66249:7;66238:10;:19::i;:::-;66233:73;;66274:14;;;;:5;:14;;;;;:20;66291:3;66274:14;:20;:::i;50334:617::-;50632:8;;50392:4;;50605:1;50598:9;;;;50628:18;;;50392:4;;50713:210;50729:3;50723;:9;50713:210;;;50798:10;;50810:4;50794:21;50840:4;50835:9;;;50831:58;;50865:8;50872:1;50865:8;;:::i;:::-;;;50831:58;50903:8;50910:1;50903:8;;:::i;:::-;;;50741:182;50734:5;;;;;:::i;:::-;;;;50713:210;;;-1:-1:-1;50940:3:0;50334:617;-1:-1:-1;;;;50334:617:0:o;35565:110::-;35641:26;35651:2;35655:7;35641:26;;;;;;;;;;;;:9;:26::i;80547:215::-;80647:16;80655:7;80647;:16::i;:::-;80639:73;;;;-1:-1:-1;;;80639:73:0;;41519:2:1;80639:73:0;;;41501:21:1;41558:2;41538:18;;;41531:30;41597:34;41577:18;;;41570:62;-1:-1:-1;;;41648:18:1;;;41641:42;41700:19;;80639:73:0;41317:408:1;80639:73:0;80723:19;;;;:10;:19;;;;;:31;80745:9;80723:19;:31;:::i;72964:229::-;73067:17;73086:19;73129:15;73136:7;73129:6;:15::i;:::-;73123:21;;73163:22;73168:7;73177;73163:4;:22::i;:::-;73155:30;;72964:229;;;;;:::o;50126:97::-;50183:32;:16;50207:7;50183:23;:32::i;21675:173::-;21750:6;;;-1:-1:-1;;;;;21767:17:0;;;-1:-1:-1;;;;;;21767:17:0;;;;;;;21800:40;;21750:6;;;21767:17;21750:6;;21800:40;;21731:16;;21800:40;21720:128;21675:173;:::o;64013:114::-;64073:7;64100:19;64108:3;57042:18;;56959:109;48963:203;49035:4;-1:-1:-1;;;;;49060:21:0;;49052:68;;;;-1:-1:-1;;;49052:68:0;;41932:2:1;49052:68:0;;;41914:21:1;41971:2;41951:18;;;41944:30;42010:34;41990:18;;;41983:62;-1:-1:-1;;;42061:18:1;;;42054:32;42103:19;;49052:68:0;41730:398:1;49052:68:0;-1:-1:-1;;;;;;49138:20:0;:11;:20;;;;;;;;;;;;;;;48963:203::o;88565:914::-;-1:-1:-1;;;;;88683:16:0;;88675:25;;;;;;88726:3;88720:17;88741:1;88720:22;88711:32;;;;;;88763:24;88783:3;88763:19;:24::i;:::-;:29;88754:39;;;;;;88813:16;88821:7;88813;:16::i;:::-;88804:26;;;;;;88839:18;88860:23;88879:3;88860:18;:23::i;:::-;88839:44;;88898:20;88938:4;88949:10;:19;88960:7;88949:19;;;;;;;;;;;88921:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;88898:71;;88978:19;89000:27;89018:7;89000:10;:27::i;:::-;88978:49;;89040:13;89056:40;89076:10;:19;89087:7;89076:19;;;;;;;;;;;89056:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:40::i;:::-;89040:56;;89115:5;89124:1;89115:10;89111:83;;89146:19;;;;:10;:19;;;;;:36;;89170:11;89146:23;:36::i;:::-;;89111:83;89210:19;;:24;89206:149;;89251:33;89261:2;89265:11;89278:5;89251:9;:33::i;:::-;89206:149;;;89317:26;89327:2;89331:11;89317:9;:26::i;:::-;89375:42;89388:11;89408:7;89375:12;:42::i;:::-;89442:11;89435:36;89462:7;89435:36;;;;;;:::i;:::-;;;;;;;;88670:809;;;;88565:914;;;;:::o;33953:315::-;34110:28;34120:4;34126:2;34130:7;34110:9;:28::i;:::-;34157:48;34180:4;34186:2;34190:7;34199:5;34157:22;:48::i;:::-;34149:111;;;;-1:-1:-1;;;34149:111:0;;;;;;;:::i;87974:157::-;88060:16;88068:7;88060;:16::i;:::-;88051:26;;;;;;88088:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;88088:35:0;-1:-1:-1;;;;;88088:35:0;;;;;;;;;87974:157::o;89485:517::-;89565:18;89586:23;89605:3;89586:18;:23::i;:::-;89565:44;;89624:20;89664:4;89675:10;:19;89686:7;89675:19;;;;;;;;;;;89647:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89624:71;;89704:19;89726:27;89744:7;89726:10;:27::i;:::-;89803:19;;;;:10;:19;;;;;89704:49;;-1:-1:-1;89803:39:0;;89704:49;89803:26;:39::i;:::-;-1:-1:-1;89861:23:0;;;;:10;:23;;;;;89855:37;;;;;:::i;:::-;:42;;-1:-1:-1;89851:105:0;;89921:23;;;;:10;:23;;;;;89914:30;;;:::i;:::-;89970:24;89982:11;89970;:24::i;79544:104::-;79596:13;79629:11;79622:18;;;;;:::i;71580:248::-;71724:9;71719:102;71739:15;;;71719:102;;;71776:33;71781:4;;71786:1;71781:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;71790:6;;71797:1;71790:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;71801:7;71776:4;:33::i;:::-;71756:3;;;;:::i;:::-;;;;71719:102;;72384:208;72527:15;72534:7;72527:6;:15::i;:::-;72553:31;72562:4;;72568:6;;72576:7;72553:8;:31::i;28683:305::-;28785:4;-1:-1:-1;;;;;;28822:40:0;;-1:-1:-1;;;28822:40:0;;:105;;-1:-1:-1;;;;;;;28879:48:0;;-1:-1:-1;;;28879:48:0;28822:105;:158;;;-1:-1:-1;;;;;;;;;;9227:40:0;;;28944:36;9118:157;73201:148;73271:13;73304:8;:28;73313:18;73323:7;73313:9;:18::i;:::-;73304:28;;;;;;;;;;;:37;73333:7;73304:37;;;;;;;;;;;73297:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73201:148;;;;:::o;71127:164::-;71194:7;71221:22;;;:13;:22;;;;;;:27;:62;;71261:22;;;;:13;:22;;;;;;71221:62;;;-1:-1:-1;71251:7:0;71127:164::o;90778:172::-;90900:45;90927:4;90933:2;90937:7;90900:26;:45::i;57422:120::-;57489:7;57516:3;:11;;57528:5;57516:18;;;;;;;;:::i;:::-;;;;;;;;;57509:25;;57422:120;;;;:::o;73357:386::-;73517:8;:28;73526:18;73536:7;73526:9;:18::i;:::-;73517:28;;;;;;;;;;;:37;73546:7;73517:37;;;;;;;;;;;73511:51;;;;;:::i;:::-;;;73566:1;73511:56;73507:119;;73605:3;73589:25;;;;;;:::i;:::-;;;;;;;;73596:7;73589:25;73610:3;73589:25;;;;;;:::i;:::-;;;;;;;;73507:119;73678:5;73638:8;:28;73647:18;73657:7;73647:9;:18::i;:::-;73638:28;;;;;;;;;;;:37;73667:7;73638:37;;;;;;;;;;;:45;;;;;;:::i;:::-;;73717:5;73699:36;;;;;;:::i;:::-;;;;;;;;73712:3;73699:36;;;;;;:::i;:::-;;;;;;;;73703:7;73699:36;73724:3;73729:5;73699:36;;;;;;;:::i;:::-;;;;;;;;73357:386;;;;:::o;66028:124::-;66088:4;66118:14;;;:5;:14;;;;;66112:28;;66088:4;;66118:14;66112:28;;;:::i;:::-;;;:32;66105:39;;66028:124;;;:::o;35902:321::-;36032:18;36038:2;36042:7;36032:5;:18::i;:::-;36083:54;36114:1;36118:2;36122:7;36131:5;36083:22;:54::i;:::-;36061:154;;;;-1:-1:-1;;;36061:154:0;;;;;;;:::i;48685:183::-;48765:18;48769:4;48775:7;48765:3;:18::i;:::-;48757:64;;;;-1:-1:-1;;;48757:64:0;;43961:2:1;48757:64:0;;;43943:21:1;44000:2;43980:18;;;43973:30;44039:34;44019:18;;;44012:62;-1:-1:-1;;;44090:18:1;;;44083:31;44131:19;;48757:64:0;43759:397:1;48757:64:0;-1:-1:-1;;;;;48832:20:0;48855:5;48832:20;;;;;;;;;;;:28;;-1:-1:-1;;48832:28:0;;;48685:183::o;63251:131::-;63318:4;63342:32;63347:3;63367:5;63342:4;:32::i;39302:799::-;39457:4;-1:-1:-1;;;;;39478:13:0;;13164:20;13212:8;39474:620;;39514:72;;-1:-1:-1;;;39514:72:0;;-1:-1:-1;;;;;39514:36:0;;;;;:72;;180:10;;39565:4;;39571:7;;39580:5;;39514:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39514:72:0;;;;;;;;-1:-1:-1;;39514:72:0;;;;;;;;;;;;:::i;:::-;;;39510:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39756:6;:13;39773:1;39756:18;39752:272;;39799:60;;-1:-1:-1;;;39799:60:0;;;;;;;:::i;39752:272::-;39974:6;39968:13;39959:6;39955:2;39951:15;39944:38;39510:529;-1:-1:-1;;;;;;39637:51:0;-1:-1:-1;;;39637:51:0;;-1:-1:-1;39630:58:0;;39474:620;-1:-1:-1;40078:4:0;39302:799;;;;;;:::o;63558:137::-;63628:4;63652:35;63660:3;63680:5;63652:7;:35::i;43091:589::-;-1:-1:-1;;;;;43297:18:0;;43293:187;;43332:40;43364:7;44507:10;:17;;44480:24;;;;:15;:24;;;;;:44;;;44535:24;;;;;;;;;;;;44403:164;43332:40;43293:187;;;43402:2;-1:-1:-1;;;;;43394:10:0;:4;-1:-1:-1;;;;;43394:10:0;;43390:90;;43421:47;43454:4;43460:7;43421:32;:47::i;:::-;-1:-1:-1;;;;;43494:16:0;;43490:183;;43527:45;43564:7;43527:36;:45::i;43490:183::-;43600:4;-1:-1:-1;;;;;43594:10:0;:2;-1:-1:-1;;;;;43594:10:0;;43590:83;;43621:40;43649:2;43653:7;43621:27;:40::i;36559:382::-;-1:-1:-1;;;;;36639:16:0;;36631:61;;;;-1:-1:-1;;;36631:61:0;;45111:2:1;36631:61:0;;;45093:21:1;;;45130:18;;;45123:30;45189:34;45169:18;;;45162:62;45241:18;;36631:61:0;44909:356:1;36631:61:0;36712:16;36720:7;36712;:16::i;:::-;36711:17;36703:58;;;;-1:-1:-1;;;36703:58:0;;45472:2:1;36703:58:0;;;45454:21:1;45511:2;45491:18;;;45484:30;45550;45530:18;;;45523:58;45598:18;;36703:58:0;45270:352:1;36703:58:0;36774:45;36803:1;36807:2;36811:7;36774:20;:45::i;:::-;-1:-1:-1;;;;;36832:13:0;;;;;;:9;:13;;;;;:18;;36849:1;;36832:13;:18;;36849:1;;36832:18;:::i;:::-;;;;-1:-1:-1;;36861:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36861:21:0;-1:-1:-1;;;;;36861:21:0;;;;;;;;36900:33;;36861:16;;;36900:33;;36861:16;;36900:33;36559:382;;:::o;54648:414::-;54711:4;56841:19;;;:12;;;:19;;;;;;54728:327;;-1:-1:-1;54771:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;54954:18;;54932:19;;;:12;;;:19;;;;;;:40;;;;54987:11;;54728:327;-1:-1:-1;55038:5:0;55031:12;;55238:1420;55304:4;55443:19;;;:12;;;:19;;;;;;55479:15;;55475:1176;;55854:21;55878:14;55891:1;55878:10;:14;:::i;:::-;55927:18;;55854:38;;-1:-1:-1;55907:17:0;;55927:22;;55948:1;;55927:22;:::i;:::-;55907:42;;55983:13;55970:9;:26;55966:405;;56017:17;56037:3;:11;;56049:9;56037:22;;;;;;;;:::i;:::-;;;;;;;;;56017:42;;56191:9;56162:3;:11;;56174:13;56162:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;56276:23;;;:12;;;:23;;;;;:36;;;55966:405;56452:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56547:3;:12;;:19;56560:5;56547:19;;;;;;;;;;;56540:26;;;56590:4;56583:11;;;;;;;55475:1176;56634:5;56627:12;;;;;45194:988;45460:22;45510:1;45485:22;45502:4;45485:16;:22::i;:::-;:26;;;;:::i;:::-;45522:18;45543:26;;;:17;:26;;;;;;45460:51;;-1:-1:-1;45676:28:0;;;45672:328;;-1:-1:-1;;;;;45743:18:0;;45721:19;45743:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45794:30;;;;;;:44;;;45911:30;;:17;:30;;;;;:43;;;45672:328;-1:-1:-1;46096:26:0;;;;:17;:26;;;;;;;;46089:33;;;-1:-1:-1;;;;;46140:18:0;;;;;:12;:18;;;;;:34;;;;;;;46133:41;45194:988::o;46477:1079::-;46755:10;:17;46730:22;;46755:21;;46775:1;;46755:21;:::i;:::-;46787:18;46808:24;;;:15;:24;;;;;;47181:10;:26;;46730:46;;-1:-1:-1;46808:24:0;;46730:46;;47181:26;;;;;;:::i;:::-;;;;;;;;;47159:48;;47245:11;47220:10;47231;47220:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47325:28;;;:15;:28;;;;;;;:41;;;47497:24;;;;;47490:31;47532:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46548:1008;;;46477:1079;:::o;43981:221::-;44066:14;44083:20;44100:2;44083:16;:20::i;:::-;-1:-1:-1;;;;;44114:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44159:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43981:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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:127::-;6055:10;6050:3;6046:20;6043:1;6036:31;6086:4;6083:1;6076:15;6110:4;6107:1;6100:15;6126:719;6169:5;6222:3;6215:4;6207:6;6203:17;6199:27;6189:55;;6240:1;6237;6230:12;6189:55;6276:6;6263:20;-1:-1:-1;;;;;6339:2:1;6335;6332:10;6329:36;;;6345:18;;:::i;:::-;6420:2;6414:9;6388:2;6474:13;;-1:-1:-1;;6470:22:1;;;6494:2;6466:31;6462:40;6450:53;;;6518:18;;;6538:22;;;6515:46;6512:72;;;6564:18;;:::i;:::-;6604:10;6600:2;6593:22;6639:2;6631:6;6624:18;6685:3;6678:4;6673:2;6665:6;6661:15;6657:26;6654:35;6651:55;;;6702:1;6699;6692:12;6651:55;6766:2;6759:4;6751:6;6747:17;6740:4;6732:6;6728:17;6715:54;6813:1;6806:4;6801:2;6793:6;6789:15;6785:26;6778:37;6833:6;6824:15;;;;;;6126:719;;;;:::o;6850:322::-;6919:6;6972:2;6960:9;6951:7;6947:23;6943:32;6940:52;;;6988:1;6985;6978:12;6940:52;7028:9;7015:23;-1:-1:-1;;;;;7053:6:1;7050:30;7047:50;;;7093:1;7090;7083:12;7047:50;7116;7158:7;7149:6;7138:9;7134:22;7116:50;:::i;7177:869::-;7320:6;7328;7336;7344;7352;7405:2;7393:9;7384:7;7380:23;7376:32;7373:52;;;7421:1;7418;7411:12;7373:52;7461:9;7448:23;-1:-1:-1;;;;;7531:2:1;7523:6;7520:14;7517:34;;;7547:1;7544;7537:12;7517:34;7586:78;7656:7;7647:6;7636:9;7632:22;7586:78;:::i;:::-;7683:8;;-1:-1:-1;7560:104:1;-1:-1:-1;7771:2:1;7756:18;;7743:32;;-1:-1:-1;7787:16:1;;;7784:36;;;7816:1;7813;7806:12;7784:36;;7855:80;7927:7;7916:8;7905:9;7901:24;7855:80;:::i;:::-;7177:869;;;;-1:-1:-1;7954:8:1;8036:2;8021:18;8008:32;;7177:869;-1:-1:-1;;;;7177:869:1:o;8051:248::-;8119:6;8127;8180:2;8168:9;8159:7;8155:23;8151:32;8148:52;;;8196:1;8193;8186:12;8148:52;-1:-1:-1;;8219:23:1;;;8289:2;8274:18;;;8261:32;;-1:-1:-1;8051:248:1:o;9148:789::-;9249:6;9257;9265;9273;9281;9334:2;9322:9;9313:7;9309:23;9305:32;9302:52;;;9350:1;9347;9340:12;9302:52;9390:9;9377:23;-1:-1:-1;;;;;9460:2:1;9452:6;9449:14;9446:34;;;9476:1;9473;9466:12;9446:34;9515:59;9566:7;9557:6;9546:9;9542:22;9515:59;:::i;:::-;9593:8;;-1:-1:-1;9489:85:1;-1:-1:-1;9681:2:1;9666:18;;9653:32;;-1:-1:-1;9697:16:1;;;9694:36;;;9726:1;9723;9716:12;9694:36;;9765:61;9818:7;9807:8;9796:9;9792:24;9765:61;:::i;9942:547::-;10031:6;10039;10047;10055;10108:2;10096:9;10087:7;10083:23;10079:32;10076:52;;;10124:1;10121;10114:12;10076:52;10160:9;10147:23;10137:33;;10221:2;10210:9;10206:18;10193:32;-1:-1:-1;;;;;10240:6:1;10237:30;10234:50;;;10280:1;10277;10270:12;10234:50;10319:59;10370:7;10361:6;10350:9;10346:22;10319:59;:::i;:::-;9942:547;;10397:8;;-1:-1:-1;10293:85:1;;10479:2;10464:18;10451:32;;9942:547;-1:-1:-1;;;;9942:547:1:o;10494:411::-;10565:6;10573;10626:2;10614:9;10605:7;10601:23;10597:32;10594:52;;;10642:1;10639;10632:12;10594:52;10682:9;10669:23;-1:-1:-1;;;;;10707:6:1;10704:30;10701:50;;;10747:1;10744;10737:12;10701:50;10786:59;10837:7;10828:6;10817:9;10813:22;10786:59;:::i;10910:543::-;10998:6;11006;11059:2;11047:9;11038:7;11034:23;11030:32;11027:52;;;11075:1;11072;11065:12;11027:52;11115:9;11102:23;-1:-1:-1;;;;;11185:2:1;11177:6;11174:14;11171:34;;;11201:1;11198;11191:12;11171:34;11224:50;11266:7;11257:6;11246:9;11242:22;11224:50;:::i;:::-;11214:60;;11327:2;11316:9;11312:18;11299:32;11283:48;;11356:2;11346:8;11343:16;11340:36;;;11372:1;11369;11362:12;11340:36;;11395:52;11439:7;11428:8;11417:9;11413:24;11395:52;:::i;:::-;11385:62;;;10910:543;;;;;:::o;11458:383::-;11655:2;11644:9;11637:21;11618:4;11681:45;11722:2;11711:9;11707:18;11699:6;11681:45;:::i;:::-;11774:9;11766:6;11762:22;11757:2;11746:9;11742:18;11735:50;11802:33;11828:6;11820;11802:33;:::i;:::-;11794:41;11458:383;-1:-1:-1;;;;;11458:383:1:o;11846:617::-;11943:6;11951;11959;12012:2;12000:9;11991:7;11987:23;11983:32;11980:52;;;12028:1;12025;12018:12;11980:52;12051:29;12070:9;12051:29;:::i;:::-;12041:39;;12131:2;12120:9;12116:18;12103:32;-1:-1:-1;;;;;12195:2:1;12187:6;12184:14;12181:34;;;12211:1;12208;12201:12;12181:34;12234:50;12276:7;12267:6;12256:9;12252:22;12234:50;:::i;:::-;12224:60;;12337:2;12326:9;12322:18;12309:32;12293:48;;12366:2;12356:8;12353:16;12350:36;;;12382:1;12379;12372:12;12350:36;;12405:52;12449:7;12438:8;12427:9;12423:24;12405:52;:::i;:::-;12395:62;;;11846:617;;;;;:::o;12468:316::-;12545:6;12553;12561;12614:2;12602:9;12593:7;12589:23;12585:32;12582:52;;;12630:1;12627;12620:12;12582:52;-1:-1:-1;;12653:23:1;;;12723:2;12708:18;;12695:32;;-1:-1:-1;12774:2:1;12759:18;;;12746:32;;12468:316;-1:-1:-1;12468:316:1:o;12789:464::-;12876:6;12884;12892;12945:2;12933:9;12924:7;12920:23;12916:32;12913:52;;;12961:1;12958;12951:12;12913:52;12984:29;13003:9;12984:29;:::i;:::-;12974:39;;13060:2;13049:9;13045:18;13032:32;13022:42;;13115:2;13104:9;13100:18;13087:32;-1:-1:-1;;;;;13134:6:1;13131:30;13128:50;;;13174:1;13171;13164:12;13128:50;13197;13239:7;13230:6;13219:9;13215:22;13197:50;:::i;13258:160::-;13323:20;;13379:13;;13372:21;13362:32;;13352:60;;13408:1;13405;13398:12;13423:254;13488:6;13496;13549:2;13537:9;13528:7;13524:23;13520:32;13517:52;;;13565:1;13562;13555:12;13517:52;13588:29;13607:9;13588:29;:::i;:::-;13578:39;;13636:35;13667:2;13656:9;13652:18;13636:35;:::i;14200:503::-;14497:2;14486:9;14479:21;14460:4;14523:55;14574:2;14563:9;14559:18;14551:6;14523:55;:::i;:::-;14626:9;14618:6;14614:22;14609:2;14598:9;14594:18;14587:50;14654:43;14690:6;14682;14654:43;:::i;14708:538::-;14803:6;14811;14819;14827;14880:3;14868:9;14859:7;14855:23;14851:33;14848:53;;;14897:1;14894;14887:12;14848:53;14920:29;14939:9;14920:29;:::i;:::-;14910:39;;14968:38;15002:2;14991:9;14987:18;14968:38;:::i;:::-;14958:48;;15053:2;15042:9;15038:18;15025:32;15015:42;;15108:2;15097:9;15093:18;15080:32;-1:-1:-1;;;;;15127:6:1;15124:30;15121:50;;;15167:1;15164;15157:12;15121:50;15190;15232:7;15223:6;15212:9;15208:22;15190:50;:::i;:::-;15180:60;;;14708:538;;;;;;;:::o;15251:254::-;15319:6;15327;15380:2;15368:9;15359:7;15355:23;15351:32;15348:52;;;15396:1;15393;15386:12;15348:52;15432:9;15419:23;15409:33;;15461:38;15495:2;15484:9;15480:18;15461:38;:::i;15510:825::-;15798:2;15810:21;;;15880:13;;15783:18;;;15902:22;;;15750:4;;15977;;15955:2;15940:18;;;16004:15;;;15750:4;16047:169;16061:6;16058:1;16055:13;16047:169;;;16122:13;;16110:26;;16156:12;;;;16191:15;;;;16083:1;16076:9;16047:169;;;16051:3;;;16261:9;16256:3;16252:19;16247:2;16236:9;16232:18;16225:47;16289:40;16325:3;16317:6;16289:40;:::i;:::-;16281:48;15510:825;-1:-1:-1;;;;;;15510:825:1:o;16563:390::-;16641:6;16649;16702:2;16690:9;16681:7;16677:23;16673:32;16670:52;;;16718:1;16715;16708:12;16670:52;16754:9;16741:23;16731:33;;16815:2;16804:9;16800:18;16787:32;-1:-1:-1;;;;;16834:6:1;16831:30;16828:50;;;16874:1;16871;16864:12;16828:50;16897;16939:7;16930:6;16919:9;16915:22;16897:50;:::i;17844:260::-;17912:6;17920;17973:2;17961:9;17952:7;17948:23;17944:32;17941:52;;;17989:1;17986;17979:12;17941:52;18012:29;18031:9;18012:29;:::i;:::-;18002:39;;18060:38;18094:2;18083:9;18079:18;18060:38;:::i;18109:180::-;18165:6;18218:2;18206:9;18197:7;18193:23;18189:32;18186:52;;;18234:1;18231;18224:12;18186:52;18257:26;18273:9;18257:26;:::i;18744:380::-;18823:1;18819:12;;;;18866;;;18887:61;;18941:4;18933:6;18929:17;18919:27;;18887:61;18994:2;18986:6;18983:14;18963:18;18960:38;18957:161;;19040:10;19035:3;19031:20;19028:1;19021:31;19075:4;19072:1;19065:15;19103:4;19100:1;19093:15;18957:161;;18744:380;;;:::o;20369:127::-;20430:10;20425:3;20421:20;20418:1;20411:31;20461:4;20458:1;20451:15;20485:4;20482:1;20475:15;20501:522;20579:4;20585:6;20645:11;20632:25;20739:2;20735:7;20724:8;20708:14;20704:29;20700:43;20680:18;20676:68;20666:96;;20758:1;20755;20748:12;20666:96;20785:33;;20837:20;;;-1:-1:-1;;;;;;20869:30:1;;20866:50;;;20912:1;20909;20902:12;20866:50;20945:4;20933:17;;-1:-1:-1;20976:14:1;20972:27;;;20962:38;;20959:58;;;21013:1;21010;21003:12;21028:127;21089:10;21084:3;21080:20;21077:1;21070:31;21120:4;21117:1;21110:15;21144:4;21141:1;21134:15;21160:135;21199:3;21220:17;;;21217:43;;21240:18;;:::i;:::-;-1:-1:-1;21287:1:1;21276:13;;21160:135::o;21300:356::-;21502:2;21484:21;;;21521:18;;;21514:30;21580:34;21575:2;21560:18;;21553:62;21647:2;21632:18;;21300:356::o;21661:406::-;21863:2;21845:21;;;21902:2;21882:18;;;21875:30;21941:34;21936:2;21921:18;;21914:62;-1:-1:-1;;;22007:2:1;21992:18;;21985:40;22057:3;22042:19;;21661:406::o;22072:271::-;22255:6;22247;22242:3;22229:33;22211:3;22281:16;;22306:13;;;22281:16;22072:271;-1:-1:-1;22072:271:1:o;22474:545::-;22576:2;22571:3;22568:11;22565:448;;;22612:1;22637:5;22633:2;22626:17;22682:4;22678:2;22668:19;22752:2;22740:10;22736:19;22733:1;22729:27;22723:4;22719:38;22788:4;22776:10;22773:20;22770:47;;;-1:-1:-1;22811:4:1;22770:47;22866:2;22861:3;22857:12;22854:1;22850:20;22844:4;22840:31;22830:41;;22921:82;22939:2;22932:5;22929:13;22921:82;;;22984:17;;;22965:1;22954:13;22921:82;;23195:1206;-1:-1:-1;;;;;23314:3:1;23311:27;23308:53;;;23341:18;;:::i;:::-;23370:94;23460:3;23420:38;23452:4;23446:11;23420:38;:::i;:::-;23414:4;23370:94;:::i;:::-;23490:1;23515:2;23510:3;23507:11;23532:1;23527:616;;;;24187:1;24204:3;24201:93;;;-1:-1:-1;24260:19:1;;;24247:33;24201:93;-1:-1:-1;;23152:1:1;23148:11;;;23144:24;23140:29;23130:40;23176:1;23172:11;;;23127:57;24307:78;;23500:895;;23527:616;22421:1;22414:14;;;22458:4;22445:18;;-1:-1:-1;;23563:17:1;;;23664:9;23686:229;23700:7;23697:1;23694:14;23686:229;;;23789:19;;;23776:33;23761:49;;23896:4;23881:20;;;;23849:1;23837:14;;;;23716:12;23686:229;;;23690:3;23943;23934:7;23931:16;23928:159;;;24067:1;24063:6;24057:3;24051;24048:1;24044:11;24040:21;24036:34;24032:39;24019:9;24014:3;24010:19;23997:33;23993:79;23985:6;23978:95;23928:159;;;24130:1;24124:3;24121:1;24117:11;24113:19;24107:4;24100:33;23500:895;;23195:1206;;;:::o;24406:413::-;24608:2;24590:21;;;24647:2;24627:18;;;24620:30;24686:34;24681:2;24666:18;;24659:62;-1:-1:-1;;;24752:2:1;24737:18;;24730:47;24809:3;24794:19;;24406:413::o;24824:412::-;25026:2;25008:21;;;25065:2;25045:18;;;25038:30;25104:34;25099:2;25084:18;;25077:62;-1:-1:-1;;;25170:2:1;25155:18;;25148:46;25226:3;25211:19;;24824:412::o;26070:276::-;26201:3;26239:6;26233:13;26255:53;26301:6;26296:3;26289:4;26281:6;26277:17;26255:53;:::i;:::-;26324:16;;;;;26070:276;-1:-1:-1;;26070:276:1:o;26764:1352::-;26890:3;26884:10;-1:-1:-1;;;;;26909:6:1;26906:30;26903:56;;;26939:18;;:::i;:::-;26968:97;27058:6;27018:38;27050:4;27044:11;27018:38;:::i;:::-;27012:4;26968:97;:::i;:::-;27120:4;;27184:2;27173:14;;27201:1;27196:663;;;;27903:1;27920:6;27917:89;;;-1:-1:-1;27972:19:1;;;27966:26;27917:89;-1:-1:-1;;23152:1:1;23148:11;;;23144:24;23140:29;23130:40;23176:1;23172:11;;;23127:57;28019:81;;27166:944;;27196:663;22421:1;22414:14;;;22458:4;22445:18;;-1:-1:-1;;27232:20:1;;;27350:236;27364:7;27361:1;27358:14;27350:236;;;27453:19;;;27447:26;27432:42;;27545:27;;;;27513:1;27501:14;;;;27380:19;;27350:236;;;27354:3;27614:6;27605:7;27602:19;27599:201;;;27675:19;;;27669:26;-1:-1:-1;;27758:1:1;27754:14;;;27770:3;27750:24;27746:37;27742:42;27727:58;27712:74;;27599:201;-1:-1:-1;;;;;27846:1:1;27830:14;;;27826:22;27813:36;;-1:-1:-1;26764:1352:1:o;28886:398::-;29088:2;29070:21;;;29127:2;29107:18;;;29100:30;29166:34;29161:2;29146:18;;29139:62;-1:-1:-1;;;29232:2:1;29217:18;;29210:32;29274:3;29259:19;;28886:398::o;32621:417::-;32823:2;32805:21;;;32862:2;32842:18;;;32835:30;32901:34;32896:2;32881:18;;32874:62;-1:-1:-1;;;32967:2:1;32952:18;;32945:51;33028:3;33013:19;;32621:417::o;33043:614::-;33323:3;33361:6;33355:13;33377:53;33423:6;33418:3;33411:4;33403:6;33399:17;33377:53;:::i;:::-;-1:-1:-1;;;33452:16:1;;;33477:18;;;33520:13;;33542:65;33520:13;33594:1;33583:13;;33576:4;33564:17;;33542:65;:::i;:::-;33627:20;33649:1;33623:28;;33043:614;-1:-1:-1;;;;33043:614:1:o;35117:404::-;35319:2;35301:21;;;35358:2;35338:18;;;35331:30;35397:34;35392:2;35377:18;;35370:62;-1:-1:-1;;;35463:2:1;35448:18;;35441:38;35511:3;35496:19;;35117:404::o;37003:470::-;37182:3;37220:6;37214:13;37236:53;37282:6;37277:3;37270:4;37262:6;37258:17;37236:53;:::i;:::-;37352:13;;37311:16;;;;37374:57;37352:13;37311:16;37408:4;37396:17;;37374:57;:::i;:::-;37447:20;;37003:470;-1:-1:-1;;;;37003:470:1:o;37478:372::-;37637:3;37675:6;37669:13;37691:53;37737:6;37732:3;37725:4;37717:6;37713:17;37691:53;:::i;:::-;37766:16;;;;37791:21;;;-1:-1:-1;37839:4:1;37828:16;;37478:372;-1:-1:-1;37478:372:1:o;38622:168::-;38662:7;38728:1;38724;38720:6;38716:14;38713:1;38710:21;38705:1;38698:9;38691:17;38687:45;38684:71;;;38735:18;;:::i;:::-;-1:-1:-1;38775:9:1;;38622:168::o;40210:125::-;40250:4;40278:1;40275;40272:8;40269:34;;;40283:18;;:::i;:::-;-1:-1:-1;40320:9:1;;40210:125::o;40340:128::-;40380:3;40411:1;40407:6;40404:1;40401:13;40398:39;;;40417:18;;:::i;:::-;-1:-1:-1;40453:9:1;;40340:128::o;41108:204::-;41146:3;41182:4;41179:1;41175:12;41214:4;41211:1;41207:12;41249:3;41243:4;41239:14;41234:3;41231:23;41228:49;;;41257:18;;:::i;:::-;41293:13;;41108:204;-1:-1:-1;;;41108:204:1:o;42133:1202::-;42410:3;42448:6;42442:13;42474:4;42487:51;42531:6;42526:3;42521:2;42513:6;42509:15;42487:51;:::i;:::-;42569:6;42564:3;42560:16;42547:29;;-1:-1:-1;;;42592:5:1;42585:18;42622:1;42643;42676:6;42670:13;42708:36;42734:9;42708:36;:::i;:::-;42760:18;;;42787:159;;;;42960:1;42955:355;;;;42753:557;;42787:159;-1:-1:-1;;42831:24:1;;42815:14;;;42808:48;42912:16;;42905:24;42891:39;;42880:51;;42876:60;;;-1:-1:-1;42787:159:1;;42955:355;42986:6;42983:1;42976:17;43034:2;43031:1;43021:16;43059:1;43073:178;43087:8;43084:1;43081:15;43073:178;;;43178:14;;43158:13;;;43154:22;;43147:46;43221:16;;;;43104:10;;43073:178;;;43077:3;;43297:2;43286:8;43279:5;43275:20;43271:29;43264:36;;42753:557;-1:-1:-1;43326:3:1;;42133:1202;-1:-1:-1;;;;;;;;;42133:1202:1:o;43340:414::-;43542:2;43524:21;;;43581:2;43561:18;;;43554:30;43620:34;43615:2;43600:18;;43593:62;-1:-1:-1;;;43686:2:1;43671:18;;43664:48;43744:3;43729:19;;43340:414::o;44161:489::-;-1:-1:-1;;;;;44430:15:1;;;44412:34;;44482:15;;44477:2;44462:18;;44455:43;44529:2;44514:18;;44507:34;;;44577:3;44572:2;44557:18;;44550:31;;;44355:4;;44598:46;;44624:19;;44616:6;44598:46;:::i;44655:249::-;44724:6;44777:2;44765:9;44756:7;44752:23;44748:32;44745:52;;;44793:1;44790;44783:12;44745:52;44825:9;44819:16;44844:30;44868:5;44844:30;:::i;45627:127::-;45688:10;45683:3;45679:20;45676:1;45669:31;45719:4;45716:1;45709:15;45743:4;45740:1;45733:15

Swarm Source

ipfs://52c278f2daffab6d094c2a1c6cdad2cf970ae2f49a68c54444f9f6039fb66244
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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