ETH Price: $2,388.24 (-0.62%)

Token

RulersofTheSea (ROS)
 

Overview

Max Total Supply

67 ROS

Holders

37

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Ethereum Pro: Deployer 2
Balance
1 ROS
0x0fe60E55a8C0700b47d4a2663079c445Fc4A5893
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RulersofTheSea

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-30
*/

// SPDX-License-Identifier: MIT

 
// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity >=0.6.0 <0.8.0;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/introspection/IERC165.sol



pragma solidity >=0.6.0 <0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol



pragma solidity >=0.6.2 <0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol



pragma solidity >=0.6.2 <0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity >=0.6.0 <0.8.0;

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

// File: @openzeppelin/contracts/introspection/ERC165.sol



pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity >=0.6.2 <0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/EnumerableSet.sol



pragma solidity >=0.6.0 <0.8.0;

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

    struct Set {
        // Storage of set values
        bytes32[] _values;

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

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

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

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

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

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            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] = toDeleteIndex + 1; // All indexes are 1-based

            // 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) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

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

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


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

// File: @openzeppelin/contracts/utils/EnumerableMap.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

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

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

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

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

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

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

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

   /**
    * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
 
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).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(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.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 _tokenOwners.contains(tokenId);
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(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); // internal owner

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


pragma solidity ^0.7.0;
pragma abicoder v2;

contract RulersofTheSea is ERC721, Ownable {
    
    using SafeMath for uint256;

    string public RULER_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN BANANAS ARE ALL SOLD OUT
    
    string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS
    
    bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE

    uint256 public constant rulerPrice = 80000000000000000; // 0.025 ETH

    uint public constant maxRulerPurchase = 20;

    uint256 public constant MAX_RULERS = 10000;

    bool public saleIsActive = false;
    
    mapping(uint => string) public rulerNames;
    
    // Reserve 80 Rulers for team - Giveaways/Prizes etc
    uint public rulerReserve = 80;
    
    event rulerNameChange(address _by, uint _tokenId, string _name);
    
    event licenseisLocked(string _licenseText);

    constructor() ERC721("RulersofTheSea", "ROS") { }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        msg.sender.transfer(balance);
    }
    
    function reserveRulers(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= rulerReserve, "Not enough reserve left for team");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        rulerReserve = rulerReserve.sub(_reserveAmount);
    }


    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        RULER_PROVENANCE = provenanceHash;
    }

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


    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    // Returns the license for tokens
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "CHOOSE A RULER WITHIN RANGE");
        return LICENSE_TEXT;
    }
    
    // Locks the license to prevent further changes 
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit licenseisLocked(LICENSE_TEXT);
    }
    
    // Change the license
    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }
    
    
    function mintRuler(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Banana");
        require(numberOfTokens > 0 && numberOfTokens <= maxRulerPurchase, "Can only mint 20 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_RULERS, "Purchase would exceed max supply of Rulers");
        require(msg.value >= rulerPrice.mul(numberOfTokens), "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_RULERS) {
                _safeMint(msg.sender, mintIndex);
            }
        }

    }
     
    function changeRulerName(uint _tokenId, string memory _name) public {
        require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this ruler!");
        require(sha256(bytes(_name)) != sha256(bytes(rulerNames[_tokenId])), "New name is same as the current one");
        rulerNames[_tokenId] = _name;
        
        emit rulerNameChange(msg.sender, _tokenId, _name);
        
    }
    
    function viewRulerName(uint _tokenId) public view returns( string memory ){
        require( _tokenId < totalSupply(), "Choose a ruler within range" );
        return rulerNames[_tokenId];
    }
    
    
    // GET ALL RULERS OF A WALLET AS AN ARRAY OF STRINGS. WOULD BE BETTER MAYBE IF IT RETURNED A STRUCT WITH ID-NAME MATCH
    function rulerNamesOfOwner(address _owner) external view returns(string[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new string[](0);
        } else {
            string[] memory result = new string[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = rulerNames[ tokenOfOwnerByIndex(_owner, index) ] ;
            }
            return result;
        }
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"rulerNameChange","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RULERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RULER_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeRulerName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxRulerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintRuler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveRulers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rulerNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"rulerNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rulerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rulerReserve","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":"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewRulerName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b92919062000334565b5060405180602001604052806000815250600c90805190602001906200005392919062000334565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506050600f553480156200009c57600080fd5b506040518060400160405280600e81526020017f52756c6572736f665468655365610000000000000000000000000000000000008152506040518060400160405280600381526020017f524f530000000000000000000000000000000000000000000000000000000000815250620001216301ffc9a760e01b6200025460201b60201c565b81600690805190602001906200013992919062000334565b5080600790805190602001906200015292919062000334565b506200016b6380ac58cd60e01b6200025460201b60201c565b62000183635b5e139f60e01b6200025460201b60201c565b6200019b63780e9d6360e01b6200025460201b60201c565b50506000620001af6200032c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200045f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b7906200042c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200036c5760008555620003b8565b82601f106200038757805160ff1916838001178555620003b8565b82800160010185558215620003b8579182015b82811115620003b75782518255916020019190600101906200039a565b5b509050620003c79190620003cb565b5090565b5b80821115620003e6576000816000905550600101620003cc565b5090565b6000620003f9601c836200044e565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200044781620003ea565b9050919050565b600082825260208201905092915050565b6153c5806200046f6000396000f3fe6080604052600436106102465760003560e01c80636c0360eb11610139578063b09904b5116100b6578063d9b137b21161007a578063d9b137b21461086d578063dc7c9566146108aa578063e985e9c5146108d5578063eb8d244414610912578063f2fde38b1461093d578063f6a20be31461096657610246565b8063b09904b51461079e578063b88d4fde146107c7578063ba0ae34d146107f0578063bf4702fc14610819578063c87b56dd1461083057610246565b80638da5cb5b116100fd5780638da5cb5b146106b757806395d89b41146106e25780639c3e72bd1461070d578063a22cb46514610738578063aefd4fb01461076157610246565b80636c0360eb146105d057806370a08231146105fb578063715018a6146106385780638462151c1461064f5780638ad085031461068c57610246565b80632f745c59116101c757806347cc7ba01161018b57806347cc7ba0146104e65780634f6ccce71461050257806355f804b31461053f5780636352211e1461056857806369000b0d146105a557610246565b80632f745c591461042757806334918dfd1461046457806339ad2ea31461047b5780633ccfd60b146104a657806342842e0e146104bd57610246565b80630c7900391161020e5780630c79003914610356578063109695231461037f57806318160ddd146103a857806323598a4b146103d357806323b872dd146103fe57610246565b806301ffc9a71461024b578063058f53eb1461028857806306fdde03146102c5578063081812fc146102f0578063095ea7b31461032d575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613ada565b6109a3565b60405161027f9190614ba0565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613b6d565b610a0a565b6040516102bc9190614bbb565b60405180910390f35b3480156102d157600080fd5b506102da610b08565b6040516102e79190614bbb565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613b6d565b610baa565b6040516103249190614ab7565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613a75565b610c2f565b005b34801561036257600080fd5b5061037d60048036038101906103789190613b96565b610d47565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613b2c565b610f17565b005b3480156103b457600080fd5b506103bd610fad565b6040516103ca9190614fff565b60405180910390f35b3480156103df57600080fd5b506103e8610fbe565b6040516103f59190614fff565b60405180910390f35b34801561040a57600080fd5b506104256004803603810190610420919061396f565b610fca565b005b34801561043357600080fd5b5061044e60048036038101906104499190613a75565b61102a565b60405161045b9190614fff565b60405180910390f35b34801561047057600080fd5b50610479611085565b005b34801561048757600080fd5b5061049061112d565b60405161049d9190614fff565b60405180910390f35b3480156104b257600080fd5b506104bb611133565b005b3480156104c957600080fd5b506104e460048036038101906104df919061396f565b6111fe565b005b61050060048036038101906104fb9190613b6d565b61121e565b005b34801561050e57600080fd5b5061052960048036038101906105249190613b6d565b6113bd565b6040516105369190614fff565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613b2c565b6113e0565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613b6d565b611468565b60405161059c9190614ab7565b60405180910390f35b3480156105b157600080fd5b506105ba61149f565b6040516105c79190614fff565b60405180910390f35b3480156105dc57600080fd5b506105e56114a4565b6040516105f29190614bbb565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d919061390a565b611546565b60405161062f9190614fff565b60405180910390f35b34801561064457600080fd5b5061064d611605565b005b34801561065b57600080fd5b506106766004803603810190610671919061390a565b611742565b6040516106839190614b7e565b60405180910390f35b34801561069857600080fd5b506106a161183b565b6040516106ae9190614bbb565b60405180910390f35b3480156106c357600080fd5b506106cc6118d9565b6040516106d99190614ab7565b60405180910390f35b3480156106ee57600080fd5b506106f7611903565b6040516107049190614bbb565b60405180910390f35b34801561071957600080fd5b506107226119a5565b60405161072f9190614bbb565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a9190613a39565b611a43565b005b34801561076d57600080fd5b5061078860048036038101906107839190613b6d565b611bc4565b6040516107959190614bbb565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613b2c565b611c74565b005b3480156107d357600080fd5b506107ee60048036038101906107e991906139be565b611d60565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613a75565b611dc2565b005b34801561082557600080fd5b5061082e611ee0565b005b34801561083c57600080fd5b5061085760048036038101906108529190613b6d565b611fb1565b6040516108649190614bbb565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613b6d565b612134565b6040516108a19190614bbb565b60405180910390f35b3480156108b657600080fd5b506108bf612221565b6040516108cc9190614fff565b60405180910390f35b3480156108e157600080fd5b506108fc60048036038101906108f79190613933565b612227565b6040516109099190614ba0565b60405180910390f35b34801561091e57600080fd5b506109276122bb565b6040516109349190614ba0565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f919061390a565b6122ce565b005b34801561097257600080fd5b5061098d6004803603810190610988919061390a565b61247a565b60405161099a9190614b5c565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060610a14610fad565b8210610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90614eff565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b50505050509050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ba05780601f10610b7557610100808354040283529160200191610ba0565b820191906000526020600020905b815481529060010190602001808311610b8357829003601f168201915b5050505050905090565b6000610bb582612627565b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614e5f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3a82611468565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca290614f1f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cca612644565b73ffffffffffffffffffffffffffffffffffffffff161480610cf95750610cf881610cf3612644565b612227565b5b610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90614d9f565b60405180910390fd5b610d42838361264c565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610d6783611468565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db490614e1f565b60405180910390fd5b6002600e6000848152602001908152602001600020604051610ddf9190614a7c565b602060405180830381855afa158015610dfc573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e1f9190613ab1565b600282604051610e2f9190614a65565b602060405180830381855afa158015610e4c573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e6f9190613ab1565b1415610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614edf565b60405180910390fd5b80600e60008481526020019081526020016000209080519060200190610ed7929190613711565b507fb3a8f30651af6ebb5a3a7e6c4615c33c539192877ac3be9d8079812f1663d453338383604051610f0b93929190614b1e565b60405180910390a15050565b610f1f612644565b73ffffffffffffffffffffffffffffffffffffffff16610f3d6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614e7f565b60405180910390fd5b80600b9080519060200190610fa9929190613711565b5050565b6000610fb96002612705565b905090565b67011c37937e08000081565b610fdb610fd5612644565b8261271a565b61101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190614f7f565b60405180910390fd5b6110258383836127f8565b505050565b600061107d82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a0f90919063ffffffff16565b905092915050565b61108d612644565b73ffffffffffffffffffffffffffffffffffffffff166110ab6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890614e7f565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b600f5481565b61113b612644565b73ffffffffffffffffffffffffffffffffffffffff166111596118d9565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690614e7f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111fa573d6000803e3d6000fd5b5050565b61121983838360405180602001604052806000815250611d60565b505050565b600d60019054906101000a900460ff1661126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490614f3f565b60405180910390fd5b60008111801561127e575060148111155b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490614d7f565b60405180910390fd5b6127106112da826112cc610fad565b612a2990919063ffffffff16565b111561131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290614fdf565b60405180910390fd5b6113368167011c37937e080000612a7e90919063ffffffff16565b341015611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90614cff565b60405180910390fd5b60005b818110156113b957600061138d610fad565b905061271061139a610fad565b10156113ab576113aa3382612aee565b5b50808060010191505061137b565b5050565b6000806113d4836002612b0c90919063ffffffff16565b50905080915050919050565b6113e8612644565b73ffffffffffffffffffffffffffffffffffffffff166114066118d9565b73ffffffffffffffffffffffffffffffffffffffff161461145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390614e7f565b60405180910390fd5b61146581612b38565b50565b600061149882604051806060016040528060298152602001615367602991396002612b529092919063ffffffff16565b9050919050565b601481565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561153c5780601f106115115761010080835404028352916020019161153c565b820191906000526020600020905b81548152906001019060200180831161151f57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614dbf565b60405180910390fd5b6115fe600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b71565b9050919050565b61160d612644565b73ffffffffffffffffffffffffffffffffffffffff1661162b6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614e7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061174f83611546565b905060008114156117aa57600067ffffffffffffffff8111801561177257600080fd5b506040519080825280602002602001820160405280156117a15781602001602082028036833780820191505090505b50915050611836565b60008167ffffffffffffffff811180156117c357600080fd5b506040519080825280602002602001820160405280156117f25781602001602082028036833780820191505090505b50905060005b8281101561182f5761180a858261102a565b82828151811061181657fe5b60200260200101818152505080806001019150506117f8565b8193505050505b919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118d15780601f106118a6576101008083540402835291602001916118d1565b820191906000526020600020905b8154815290600101906020018083116118b457829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561199b5780601f106119705761010080835404028352916020019161199b565b820191906000526020600020905b81548152906001019060200180831161197e57829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a3b5780601f10611a1057610100808354040283529160200191611a3b565b820191906000526020600020905b815481529060010190602001808311611a1e57829003601f168201915b505050505081565b611a4b612644565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090614cdf565b60405180910390fd5b8060056000611ac6612644565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b73612644565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bb89190614ba0565b60405180910390a35050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c6c5780601f10611c4157610100808354040283529160200191611c6c565b820191906000526020600020905b815481529060010190602001808311611c4f57829003601f168201915b505050505081565b611c7c612644565b73ffffffffffffffffffffffffffffffffffffffff16611c9a6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790614e7f565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614f5f565b60405180910390fd5b80600c9080519060200190611d5c929190613711565b5050565b611d71611d6b612644565b8361271a565b611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da790614f7f565b60405180910390fd5b611dbc84848484612b86565b50505050565b611dca612644565b73ffffffffffffffffffffffffffffffffffffffff16611de86118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590614e7f565b60405180910390fd5b6000611e48610fad565b9050600082118015611e5c5750600f548211155b611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290614c9f565b60405180910390fd5b60005b82811015611ebf57611eb284828401612aee565b8080600101915050611e9e565b50611ed582600f54612be290919063ffffffff16565b600f81905550505050565b611ee8612644565b73ffffffffffffffffffffffffffffffffffffffff16611f066118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390614e7f565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611fa79190614bdd565b60405180910390a1565b6060611fbc82612627565b611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff290614ebf565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120a45780601f10612079576101008083540402835291602001916120a4565b820191906000526020600020905b81548152906001019060200180831161208757829003601f168201915b5050505050905060006120b56114a4565b90506000815114156120cb57819250505061212f565b6000825111156121005780826040516020016120e8929190614a93565b6040516020818303038152906040529250505061212f565b8061210a85612c32565b60405160200161211b929190614a93565b604051602081830303815290604052925050505b919050565b606061213e610fad565b821061217f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217690614fbf565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122155780601f106121ea57610100808354040283529160200191612215565b820191906000526020600020905b8154815290600101906020018083116121f857829003601f168201915b50505050509050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b6122d6612644565b73ffffffffffffffffffffffffffffffffffffffff166122f46118d9565b73ffffffffffffffffffffffffffffffffffffffff161461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614e7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b190614c3f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600061248783611546565b905060008114156124e757600067ffffffffffffffff811180156124aa57600080fd5b506040519080825280602002602001820160405280156124de57816020015b60608152602001906001900390816124c95790505b50915050612622565b60008167ffffffffffffffff8111801561250057600080fd5b5060405190808252806020026020018201604052801561253457816020015b606081526020019060019003908161251f5790505b50905060005b8281101561261b57600e6000612550878461102a565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125f25780601f106125c7576101008083540402835291602001916125f2565b820191906000526020600020905b8154815290600101906020018083116125d557829003601f168201915b505050505082828151811061260357fe5b6020026020010181905250808060010191505061253a565b8193505050505b919050565b600061263d826002612d7990919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126bf83611468565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061271382600001612d93565b9050919050565b600061272582612627565b612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90614d5f565b60405180910390fd5b600061276f83611468565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127de57508373ffffffffffffffffffffffffffffffffffffffff166127c684610baa565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ef57506127ee8185612227565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661281882611468565b73ffffffffffffffffffffffffffffffffffffffff161461286e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286590614e9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614cbf565b60405180910390fd5b6128e9838383612da4565b6128f460008261264c565b61294581600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612da990919063ffffffff16565b5061299781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc390919063ffffffff16565b506129ae81836002612ddd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612a1e8360000183612e12565b60001c905092915050565b600080828401905083811015612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b90614c7f565b60405180910390fd5b8091505092915050565b600080831415612a915760009050612ae8565b6000828402905082848281612aa257fe5b0414612ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ada90614e3f565b60405180910390fd5b809150505b92915050565b612b08828260405180602001604052806000815250612e7f565b5050565b600080600080612b1f8660000186612eda565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612b4e929190613711565b5050565b6000612b65846000018460001b84612f5d565b60001c90509392505050565b6000612b7f82600001612fee565b9050919050565b612b918484846127f8565b612b9d84848484612fff565b612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd390614c1f565b60405180910390fd5b50505050565b600082821115612c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1e90614d1f565b60405180910390fd5b818303905092915050565b60606000821415612c7a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d74565b600082905060005b60008214612ca4578080600101915050600a8281612c9c57fe5b049150612c82565b60008167ffffffffffffffff81118015612cbd57600080fd5b506040519080825280601f01601f191660200182016040528015612cf05781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612d6c57600a8481612d1157fe5b0660300160f81b82828060019003935081518110612d2b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612d6457fe5b049350612cff565b819450505050505b919050565b6000612d8b836000018360001b613163565b905092915050565b600081600001805490509050919050565b505050565b6000612dbb836000018360001b613186565b905092915050565b6000612dd5836000018360001b61326e565b905092915050565b6000612e09846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6132de565b90509392505050565b600081836000018054905011612e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5490614bff565b60405180910390fd5b826000018281548110612e6c57fe5b9060005260206000200154905092915050565b612e8983836133ba565b612e966000848484612fff565b612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90614c1f565b60405180910390fd5b505050565b60008082846000018054905011612f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1d90614ddf565b60405180910390fd5b6000846000018481548110612f3757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb69190614bbb565b60405180910390fd5b50846000016001820381548110612fd257fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130208473ffffffffffffffffffffffffffffffffffffffff16613548565b61302d576001905061315b565b60006130f463150b7a0260e01b613042612644565b8887876040516024016130589493929190614ad2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615335603291398773ffffffffffffffffffffffffffffffffffffffff1661355b9092919063ffffffff16565b905060008180602001905181019061310c9190613b03565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461326257600060018203905060006001866000018054905003905060008660000182815481106131d157fe5b90600052602060002001549050808760000184815481106131ee57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061322657fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613268565b60009150505b92915050565b600061327a8383613573565b6132d35782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132d8565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613385578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506133b3565b8285600001600183038154811061339857fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561342a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342190614dff565b60405180910390fd5b61343381612627565b15613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90614c5f565b60405180910390fd5b61347f60008383612da4565b6134d081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc390919063ffffffff16565b506134e781836002612ddd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061356a8484600085613596565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d290614d3f565b60405180910390fd5b6135e485613548565b613623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361a90614f9f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161364c9190614a65565b60006040518083038185875af1925050503d8060008114613689576040519150601f19603f3d011682016040523d82523d6000602084013e61368e565b606091505b509150915061369e8282866136aa565b92505050949350505050565b606083156136ba5782905061370a565b6000835111156136cd5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137019190614bbb565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613747576000855561378e565b82601f1061376057805160ff191683800117855561378e565b8280016001018555821561378e579182015b8281111561378d578251825591602001919060010190613772565b5b50905061379b919061379f565b5090565b5b808211156137b85760008160009055506001016137a0565b5090565b60006137cf6137ca8461504b565b61501a565b9050828152602081018484840111156137e757600080fd5b6137f284828561526c565b509392505050565b600061380d6138088461507b565b61501a565b90508281526020810184848401111561382557600080fd5b61383084828561526c565b509392505050565b600081359050613847816152c1565b92915050565b60008135905061385c816152d8565b92915050565b600081519050613871816152ef565b92915050565b60008135905061388681615306565b92915050565b60008151905061389b81615306565b92915050565b600082601f8301126138b257600080fd5b81356138c28482602086016137bc565b91505092915050565b600082601f8301126138dc57600080fd5b81356138ec8482602086016137fa565b91505092915050565b6000813590506139048161531d565b92915050565b60006020828403121561391c57600080fd5b600061392a84828501613838565b91505092915050565b6000806040838503121561394657600080fd5b600061395485828601613838565b925050602061396585828601613838565b9150509250929050565b60008060006060848603121561398457600080fd5b600061399286828701613838565b93505060206139a386828701613838565b92505060406139b4868287016138f5565b9150509250925092565b600080600080608085870312156139d457600080fd5b60006139e287828801613838565b94505060206139f387828801613838565b9350506040613a04878288016138f5565b925050606085013567ffffffffffffffff811115613a2157600080fd5b613a2d878288016138a1565b91505092959194509250565b60008060408385031215613a4c57600080fd5b6000613a5a85828601613838565b9250506020613a6b8582860161384d565b9150509250929050565b60008060408385031215613a8857600080fd5b6000613a9685828601613838565b9250506020613aa7858286016138f5565b9150509250929050565b600060208284031215613ac357600080fd5b6000613ad184828501613862565b91505092915050565b600060208284031215613aec57600080fd5b6000613afa84828501613877565b91505092915050565b600060208284031215613b1557600080fd5b6000613b238482850161388c565b91505092915050565b600060208284031215613b3e57600080fd5b600082013567ffffffffffffffff811115613b5857600080fd5b613b64848285016138cb565b91505092915050565b600060208284031215613b7f57600080fd5b6000613b8d848285016138f5565b91505092915050565b60008060408385031215613ba957600080fd5b6000613bb7858286016138f5565b925050602083013567ffffffffffffffff811115613bd457600080fd5b613be0858286016138cb565b9150509250929050565b6000613bf68383613e1d565b905092915050565b6000613c0a8383614a47565b60208301905092915050565b613c1f81615236565b82525050565b613c2e816151b8565b82525050565b613c3d816151a6565b82525050565b6000613c4e826150f5565b613c58818561513b565b935083602082028501613c6a856150ab565b8060005b85811015613ca65784840389528151613c878582613bea565b9450613c9283615121565b925060208a01995050600181019050613c6e565b50829750879550505050505092915050565b6000613cc382615100565b613ccd818561514c565b9350613cd8836150bb565b8060005b83811015613d09578151613cf08882613bfe565b9750613cfb8361512e565b925050600181019050613cdc565b5085935050505092915050565b613d1f816151ca565b82525050565b6000613d308261510b565b613d3a818561515d565b9350613d4a81856020860161527b565b613d53816152b0565b840191505092915050565b6000613d698261510b565b613d73818561516e565b9350613d8381856020860161527b565b80840191505092915050565b600081546001811660008114613dac5760018114613dd157613e15565b607f6002830416613dbd818761516e565b955060ff1983168652808601935050613e15565b60028204613ddf818761516e565b9550613dea856150cb565b60005b82811015613e0c57815481890152600182019150602081019050613ded565b82880195505050505b505092915050565b6000613e2882615116565b613e328185615179565b9350613e4281856020860161527b565b613e4b816152b0565b840191505092915050565b6000613e6182615116565b613e6b818561518a565b9350613e7b81856020860161527b565b613e84816152b0565b840191505092915050565b6000613e9a82615116565b613ea4818561519b565b9350613eb481856020860161527b565b80840191505092915050565b600081546001811660008114613edd5760018114613f0357613f47565b607f6002830416613eee818761518a565b955060ff198316865260208601935050613f47565b60028204613f11818761518a565b9550613f1c856150e0565b60005b82811015613f3e57815481890152600182019150602081019050613f1f565b80880195505050505b505092915050565b6000613f5c60228361518a565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc260328361518a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061402860268361518a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061408e601c8361518a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006140ce601b8361518a565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061410e60208361518a565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b600061414e60248361518a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b460198361518a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006141f4601f8361518a565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614234601e8361518a565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061427460268361518a565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142da602c8361518a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061434060218361518a565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a660388361518a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061440c602a8361518a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061447260228361518a565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144d860208361518a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061451860288361518a565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f732072756c6572210000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457e60218361518a565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e4602c8361518a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061464a60208361518a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061468a60298361518a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146f0602f8361518a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061475660238361518a565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147bc601b8361518a565b91507f43686f6f736520612072756c65722077697468696e2072616e676500000000006000830152602082019050919050565b60006147fc60218361518a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061486260228361518a565b91507f53616c65206d7573742062652061637469766520746f206d696e742042616e6160008301527f6e610000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148c860168361518a565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b600061490860318361518a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061496e601d8361518a565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006149ae601b8361518a565b91507f43484f4f534520412052554c45522057495448494e2052414e474500000000006000830152602082019050919050565b60006149ee602a8361518a565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662052756c657273000000000000000000000000000000000000000000006020830152604082019050919050565b614a508161522c565b82525050565b614a5f8161522c565b82525050565b6000614a718284613d5e565b915081905092915050565b6000614a888284613d8f565b915081905092915050565b6000614a9f8285613e8f565b9150614aab8284613e8f565b91508190509392505050565b6000602082019050614acc6000830184613c34565b92915050565b6000608082019050614ae76000830187613c25565b614af46020830186613c34565b614b016040830185614a56565b8181036060830152614b138184613d25565b905095945050505050565b6000606082019050614b336000830186613c16565b614b406020830185614a56565b8181036040830152614b528184613e56565b9050949350505050565b60006020820190508181036000830152614b768184613c43565b905092915050565b60006020820190508181036000830152614b988184613cb8565b905092915050565b6000602082019050614bb56000830184613d16565b92915050565b60006020820190508181036000830152614bd58184613e56565b905092915050565b60006020820190508181036000830152614bf78184613ec0565b905092915050565b60006020820190508181036000830152614c1881613f4f565b9050919050565b60006020820190508181036000830152614c3881613fb5565b9050919050565b60006020820190508181036000830152614c588161401b565b9050919050565b60006020820190508181036000830152614c7881614081565b9050919050565b60006020820190508181036000830152614c98816140c1565b9050919050565b60006020820190508181036000830152614cb881614101565b9050919050565b60006020820190508181036000830152614cd881614141565b9050919050565b60006020820190508181036000830152614cf8816141a7565b9050919050565b60006020820190508181036000830152614d18816141e7565b9050919050565b60006020820190508181036000830152614d3881614227565b9050919050565b60006020820190508181036000830152614d5881614267565b9050919050565b60006020820190508181036000830152614d78816142cd565b9050919050565b60006020820190508181036000830152614d9881614333565b9050919050565b60006020820190508181036000830152614db881614399565b9050919050565b60006020820190508181036000830152614dd8816143ff565b9050919050565b60006020820190508181036000830152614df881614465565b9050919050565b60006020820190508181036000830152614e18816144cb565b9050919050565b60006020820190508181036000830152614e388161450b565b9050919050565b60006020820190508181036000830152614e5881614571565b9050919050565b60006020820190508181036000830152614e78816145d7565b9050919050565b60006020820190508181036000830152614e988161463d565b9050919050565b60006020820190508181036000830152614eb88161467d565b9050919050565b60006020820190508181036000830152614ed8816146e3565b9050919050565b60006020820190508181036000830152614ef881614749565b9050919050565b60006020820190508181036000830152614f18816147af565b9050919050565b60006020820190508181036000830152614f38816147ef565b9050919050565b60006020820190508181036000830152614f5881614855565b9050919050565b60006020820190508181036000830152614f78816148bb565b9050919050565b60006020820190508181036000830152614f98816148fb565b9050919050565b60006020820190508181036000830152614fb881614961565b9050919050565b60006020820190508181036000830152614fd8816149a1565b9050919050565b60006020820190508181036000830152614ff8816149e1565b9050919050565b60006020820190506150146000830184614a56565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615041576150406152ae565b5b8060405250919050565b600067ffffffffffffffff821115615066576150656152ae565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615096576150956152ae565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006151b18261520c565b9050919050565b60006151c38261520c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061524182615248565b9050919050565b60006152538261525a565b9050919050565b60006152658261520c565b9050919050565b82818337600083830152505050565b60005b8381101561529957808201518184015260208101905061527e565b838111156152a8576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6152ca816151a6565b81146152d557600080fd5b50565b6152e1816151ca565b81146152ec57600080fd5b50565b6152f8816151d6565b811461530357600080fd5b50565b61530f816151e0565b811461531a57600080fd5b50565b6153268161522c565b811461533157600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220995c538bdd90292ce737a04183a666895aebae0eaba37a338221f232d3049ac864736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636c0360eb11610139578063b09904b5116100b6578063d9b137b21161007a578063d9b137b21461086d578063dc7c9566146108aa578063e985e9c5146108d5578063eb8d244414610912578063f2fde38b1461093d578063f6a20be31461096657610246565b8063b09904b51461079e578063b88d4fde146107c7578063ba0ae34d146107f0578063bf4702fc14610819578063c87b56dd1461083057610246565b80638da5cb5b116100fd5780638da5cb5b146106b757806395d89b41146106e25780639c3e72bd1461070d578063a22cb46514610738578063aefd4fb01461076157610246565b80636c0360eb146105d057806370a08231146105fb578063715018a6146106385780638462151c1461064f5780638ad085031461068c57610246565b80632f745c59116101c757806347cc7ba01161018b57806347cc7ba0146104e65780634f6ccce71461050257806355f804b31461053f5780636352211e1461056857806369000b0d146105a557610246565b80632f745c591461042757806334918dfd1461046457806339ad2ea31461047b5780633ccfd60b146104a657806342842e0e146104bd57610246565b80630c7900391161020e5780630c79003914610356578063109695231461037f57806318160ddd146103a857806323598a4b146103d357806323b872dd146103fe57610246565b806301ffc9a71461024b578063058f53eb1461028857806306fdde03146102c5578063081812fc146102f0578063095ea7b31461032d575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613ada565b6109a3565b60405161027f9190614ba0565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613b6d565b610a0a565b6040516102bc9190614bbb565b60405180910390f35b3480156102d157600080fd5b506102da610b08565b6040516102e79190614bbb565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613b6d565b610baa565b6040516103249190614ab7565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613a75565b610c2f565b005b34801561036257600080fd5b5061037d60048036038101906103789190613b96565b610d47565b005b34801561038b57600080fd5b506103a660048036038101906103a19190613b2c565b610f17565b005b3480156103b457600080fd5b506103bd610fad565b6040516103ca9190614fff565b60405180910390f35b3480156103df57600080fd5b506103e8610fbe565b6040516103f59190614fff565b60405180910390f35b34801561040a57600080fd5b506104256004803603810190610420919061396f565b610fca565b005b34801561043357600080fd5b5061044e60048036038101906104499190613a75565b61102a565b60405161045b9190614fff565b60405180910390f35b34801561047057600080fd5b50610479611085565b005b34801561048757600080fd5b5061049061112d565b60405161049d9190614fff565b60405180910390f35b3480156104b257600080fd5b506104bb611133565b005b3480156104c957600080fd5b506104e460048036038101906104df919061396f565b6111fe565b005b61050060048036038101906104fb9190613b6d565b61121e565b005b34801561050e57600080fd5b5061052960048036038101906105249190613b6d565b6113bd565b6040516105369190614fff565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613b2c565b6113e0565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613b6d565b611468565b60405161059c9190614ab7565b60405180910390f35b3480156105b157600080fd5b506105ba61149f565b6040516105c79190614fff565b60405180910390f35b3480156105dc57600080fd5b506105e56114a4565b6040516105f29190614bbb565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d919061390a565b611546565b60405161062f9190614fff565b60405180910390f35b34801561064457600080fd5b5061064d611605565b005b34801561065b57600080fd5b506106766004803603810190610671919061390a565b611742565b6040516106839190614b7e565b60405180910390f35b34801561069857600080fd5b506106a161183b565b6040516106ae9190614bbb565b60405180910390f35b3480156106c357600080fd5b506106cc6118d9565b6040516106d99190614ab7565b60405180910390f35b3480156106ee57600080fd5b506106f7611903565b6040516107049190614bbb565b60405180910390f35b34801561071957600080fd5b506107226119a5565b60405161072f9190614bbb565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a9190613a39565b611a43565b005b34801561076d57600080fd5b5061078860048036038101906107839190613b6d565b611bc4565b6040516107959190614bbb565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613b2c565b611c74565b005b3480156107d357600080fd5b506107ee60048036038101906107e991906139be565b611d60565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613a75565b611dc2565b005b34801561082557600080fd5b5061082e611ee0565b005b34801561083c57600080fd5b5061085760048036038101906108529190613b6d565b611fb1565b6040516108649190614bbb565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613b6d565b612134565b6040516108a19190614bbb565b60405180910390f35b3480156108b657600080fd5b506108bf612221565b6040516108cc9190614fff565b60405180910390f35b3480156108e157600080fd5b506108fc60048036038101906108f79190613933565b612227565b6040516109099190614ba0565b60405180910390f35b34801561091e57600080fd5b506109276122bb565b6040516109349190614ba0565b60405180910390f35b34801561094957600080fd5b50610964600480360381019061095f919061390a565b6122ce565b005b34801561097257600080fd5b5061098d6004803603810190610988919061390a565b61247a565b60405161099a9190614b5c565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060610a14610fad565b8210610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90614eff565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b50505050509050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ba05780601f10610b7557610100808354040283529160200191610ba0565b820191906000526020600020905b815481529060010190602001808311610b8357829003601f168201915b5050505050905090565b6000610bb582612627565b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614e5f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3a82611468565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca290614f1f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cca612644565b73ffffffffffffffffffffffffffffffffffffffff161480610cf95750610cf881610cf3612644565b612227565b5b610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90614d9f565b60405180910390fd5b610d42838361264c565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610d6783611468565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db490614e1f565b60405180910390fd5b6002600e6000848152602001908152602001600020604051610ddf9190614a7c565b602060405180830381855afa158015610dfc573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e1f9190613ab1565b600282604051610e2f9190614a65565b602060405180830381855afa158015610e4c573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e6f9190613ab1565b1415610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614edf565b60405180910390fd5b80600e60008481526020019081526020016000209080519060200190610ed7929190613711565b507fb3a8f30651af6ebb5a3a7e6c4615c33c539192877ac3be9d8079812f1663d453338383604051610f0b93929190614b1e565b60405180910390a15050565b610f1f612644565b73ffffffffffffffffffffffffffffffffffffffff16610f3d6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614e7f565b60405180910390fd5b80600b9080519060200190610fa9929190613711565b5050565b6000610fb96002612705565b905090565b67011c37937e08000081565b610fdb610fd5612644565b8261271a565b61101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190614f7f565b60405180910390fd5b6110258383836127f8565b505050565b600061107d82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a0f90919063ffffffff16565b905092915050565b61108d612644565b73ffffffffffffffffffffffffffffffffffffffff166110ab6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890614e7f565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b600f5481565b61113b612644565b73ffffffffffffffffffffffffffffffffffffffff166111596118d9565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690614e7f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111fa573d6000803e3d6000fd5b5050565b61121983838360405180602001604052806000815250611d60565b505050565b600d60019054906101000a900460ff1661126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490614f3f565b60405180910390fd5b60008111801561127e575060148111155b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490614d7f565b60405180910390fd5b6127106112da826112cc610fad565b612a2990919063ffffffff16565b111561131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131290614fdf565b60405180910390fd5b6113368167011c37937e080000612a7e90919063ffffffff16565b341015611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90614cff565b60405180910390fd5b60005b818110156113b957600061138d610fad565b905061271061139a610fad565b10156113ab576113aa3382612aee565b5b50808060010191505061137b565b5050565b6000806113d4836002612b0c90919063ffffffff16565b50905080915050919050565b6113e8612644565b73ffffffffffffffffffffffffffffffffffffffff166114066118d9565b73ffffffffffffffffffffffffffffffffffffffff161461145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390614e7f565b60405180910390fd5b61146581612b38565b50565b600061149882604051806060016040528060298152602001615367602991396002612b529092919063ffffffff16565b9050919050565b601481565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561153c5780601f106115115761010080835404028352916020019161153c565b820191906000526020600020905b81548152906001019060200180831161151f57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614dbf565b60405180910390fd5b6115fe600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b71565b9050919050565b61160d612644565b73ffffffffffffffffffffffffffffffffffffffff1661162b6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614e7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061174f83611546565b905060008114156117aa57600067ffffffffffffffff8111801561177257600080fd5b506040519080825280602002602001820160405280156117a15781602001602082028036833780820191505090505b50915050611836565b60008167ffffffffffffffff811180156117c357600080fd5b506040519080825280602002602001820160405280156117f25781602001602082028036833780820191505090505b50905060005b8281101561182f5761180a858261102a565b82828151811061181657fe5b60200260200101818152505080806001019150506117f8565b8193505050505b919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118d15780601f106118a6576101008083540402835291602001916118d1565b820191906000526020600020905b8154815290600101906020018083116118b457829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561199b5780601f106119705761010080835404028352916020019161199b565b820191906000526020600020905b81548152906001019060200180831161197e57829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a3b5780601f10611a1057610100808354040283529160200191611a3b565b820191906000526020600020905b815481529060010190602001808311611a1e57829003601f168201915b505050505081565b611a4b612644565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090614cdf565b60405180910390fd5b8060056000611ac6612644565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b73612644565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bb89190614ba0565b60405180910390a35050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c6c5780601f10611c4157610100808354040283529160200191611c6c565b820191906000526020600020905b815481529060010190602001808311611c4f57829003601f168201915b505050505081565b611c7c612644565b73ffffffffffffffffffffffffffffffffffffffff16611c9a6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790614e7f565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614f5f565b60405180910390fd5b80600c9080519060200190611d5c929190613711565b5050565b611d71611d6b612644565b8361271a565b611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da790614f7f565b60405180910390fd5b611dbc84848484612b86565b50505050565b611dca612644565b73ffffffffffffffffffffffffffffffffffffffff16611de86118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590614e7f565b60405180910390fd5b6000611e48610fad565b9050600082118015611e5c5750600f548211155b611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290614c9f565b60405180910390fd5b60005b82811015611ebf57611eb284828401612aee565b8080600101915050611e9e565b50611ed582600f54612be290919063ffffffff16565b600f81905550505050565b611ee8612644565b73ffffffffffffffffffffffffffffffffffffffff16611f066118d9565b73ffffffffffffffffffffffffffffffffffffffff1614611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390614e7f565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611fa79190614bdd565b60405180910390a1565b6060611fbc82612627565b611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff290614ebf565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120a45780601f10612079576101008083540402835291602001916120a4565b820191906000526020600020905b81548152906001019060200180831161208757829003601f168201915b5050505050905060006120b56114a4565b90506000815114156120cb57819250505061212f565b6000825111156121005780826040516020016120e8929190614a93565b6040516020818303038152906040529250505061212f565b8061210a85612c32565b60405160200161211b929190614a93565b604051602081830303815290604052925050505b919050565b606061213e610fad565b821061217f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217690614fbf565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122155780601f106121ea57610100808354040283529160200191612215565b820191906000526020600020905b8154815290600101906020018083116121f857829003601f168201915b50505050509050919050565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b6122d6612644565b73ffffffffffffffffffffffffffffffffffffffff166122f46118d9565b73ffffffffffffffffffffffffffffffffffffffff161461234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614e7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b190614c3f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600061248783611546565b905060008114156124e757600067ffffffffffffffff811180156124aa57600080fd5b506040519080825280602002602001820160405280156124de57816020015b60608152602001906001900390816124c95790505b50915050612622565b60008167ffffffffffffffff8111801561250057600080fd5b5060405190808252806020026020018201604052801561253457816020015b606081526020019060019003908161251f5790505b50905060005b8281101561261b57600e6000612550878461102a565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125f25780601f106125c7576101008083540402835291602001916125f2565b820191906000526020600020905b8154815290600101906020018083116125d557829003601f168201915b505050505082828151811061260357fe5b6020026020010181905250808060010191505061253a565b8193505050505b919050565b600061263d826002612d7990919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126bf83611468565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061271382600001612d93565b9050919050565b600061272582612627565b612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90614d5f565b60405180910390fd5b600061276f83611468565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127de57508373ffffffffffffffffffffffffffffffffffffffff166127c684610baa565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ef57506127ee8185612227565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661281882611468565b73ffffffffffffffffffffffffffffffffffffffff161461286e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286590614e9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614cbf565b60405180910390fd5b6128e9838383612da4565b6128f460008261264c565b61294581600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612da990919063ffffffff16565b5061299781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc390919063ffffffff16565b506129ae81836002612ddd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612a1e8360000183612e12565b60001c905092915050565b600080828401905083811015612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b90614c7f565b60405180910390fd5b8091505092915050565b600080831415612a915760009050612ae8565b6000828402905082848281612aa257fe5b0414612ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ada90614e3f565b60405180910390fd5b809150505b92915050565b612b08828260405180602001604052806000815250612e7f565b5050565b600080600080612b1f8660000186612eda565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612b4e929190613711565b5050565b6000612b65846000018460001b84612f5d565b60001c90509392505050565b6000612b7f82600001612fee565b9050919050565b612b918484846127f8565b612b9d84848484612fff565b612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd390614c1f565b60405180910390fd5b50505050565b600082821115612c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1e90614d1f565b60405180910390fd5b818303905092915050565b60606000821415612c7a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d74565b600082905060005b60008214612ca4578080600101915050600a8281612c9c57fe5b049150612c82565b60008167ffffffffffffffff81118015612cbd57600080fd5b506040519080825280601f01601f191660200182016040528015612cf05781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612d6c57600a8481612d1157fe5b0660300160f81b82828060019003935081518110612d2b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612d6457fe5b049350612cff565b819450505050505b919050565b6000612d8b836000018360001b613163565b905092915050565b600081600001805490509050919050565b505050565b6000612dbb836000018360001b613186565b905092915050565b6000612dd5836000018360001b61326e565b905092915050565b6000612e09846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6132de565b90509392505050565b600081836000018054905011612e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5490614bff565b60405180910390fd5b826000018281548110612e6c57fe5b9060005260206000200154905092915050565b612e8983836133ba565b612e966000848484612fff565b612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90614c1f565b60405180910390fd5b505050565b60008082846000018054905011612f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1d90614ddf565b60405180910390fd5b6000846000018481548110612f3757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb69190614bbb565b60405180910390fd5b50846000016001820381548110612fd257fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130208473ffffffffffffffffffffffffffffffffffffffff16613548565b61302d576001905061315b565b60006130f463150b7a0260e01b613042612644565b8887876040516024016130589493929190614ad2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615335603291398773ffffffffffffffffffffffffffffffffffffffff1661355b9092919063ffffffff16565b905060008180602001905181019061310c9190613b03565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461326257600060018203905060006001866000018054905003905060008660000182815481106131d157fe5b90600052602060002001549050808760000184815481106131ee57fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061322657fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613268565b60009150505b92915050565b600061327a8383613573565b6132d35782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506132d8565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613385578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506133b3565b8285600001600183038154811061339857fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561342a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342190614dff565b60405180910390fd5b61343381612627565b15613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90614c5f565b60405180910390fd5b61347f60008383612da4565b6134d081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dc390919063ffffffff16565b506134e781836002612ddd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061356a8484600085613596565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156135db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d290614d3f565b60405180910390fd5b6135e485613548565b613623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361a90614f9f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161364c9190614a65565b60006040518083038185875af1925050503d8060008114613689576040519150601f19603f3d011682016040523d82523d6000602084013e61368e565b606091505b509150915061369e8282866136aa565b92505050949350505050565b606083156136ba5782905061370a565b6000835111156136cd5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137019190614bbb565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613747576000855561378e565b82601f1061376057805160ff191683800117855561378e565b8280016001018555821561378e579182015b8281111561378d578251825591602001919060010190613772565b5b50905061379b919061379f565b5090565b5b808211156137b85760008160009055506001016137a0565b5090565b60006137cf6137ca8461504b565b61501a565b9050828152602081018484840111156137e757600080fd5b6137f284828561526c565b509392505050565b600061380d6138088461507b565b61501a565b90508281526020810184848401111561382557600080fd5b61383084828561526c565b509392505050565b600081359050613847816152c1565b92915050565b60008135905061385c816152d8565b92915050565b600081519050613871816152ef565b92915050565b60008135905061388681615306565b92915050565b60008151905061389b81615306565b92915050565b600082601f8301126138b257600080fd5b81356138c28482602086016137bc565b91505092915050565b600082601f8301126138dc57600080fd5b81356138ec8482602086016137fa565b91505092915050565b6000813590506139048161531d565b92915050565b60006020828403121561391c57600080fd5b600061392a84828501613838565b91505092915050565b6000806040838503121561394657600080fd5b600061395485828601613838565b925050602061396585828601613838565b9150509250929050565b60008060006060848603121561398457600080fd5b600061399286828701613838565b93505060206139a386828701613838565b92505060406139b4868287016138f5565b9150509250925092565b600080600080608085870312156139d457600080fd5b60006139e287828801613838565b94505060206139f387828801613838565b9350506040613a04878288016138f5565b925050606085013567ffffffffffffffff811115613a2157600080fd5b613a2d878288016138a1565b91505092959194509250565b60008060408385031215613a4c57600080fd5b6000613a5a85828601613838565b9250506020613a6b8582860161384d565b9150509250929050565b60008060408385031215613a8857600080fd5b6000613a9685828601613838565b9250506020613aa7858286016138f5565b9150509250929050565b600060208284031215613ac357600080fd5b6000613ad184828501613862565b91505092915050565b600060208284031215613aec57600080fd5b6000613afa84828501613877565b91505092915050565b600060208284031215613b1557600080fd5b6000613b238482850161388c565b91505092915050565b600060208284031215613b3e57600080fd5b600082013567ffffffffffffffff811115613b5857600080fd5b613b64848285016138cb565b91505092915050565b600060208284031215613b7f57600080fd5b6000613b8d848285016138f5565b91505092915050565b60008060408385031215613ba957600080fd5b6000613bb7858286016138f5565b925050602083013567ffffffffffffffff811115613bd457600080fd5b613be0858286016138cb565b9150509250929050565b6000613bf68383613e1d565b905092915050565b6000613c0a8383614a47565b60208301905092915050565b613c1f81615236565b82525050565b613c2e816151b8565b82525050565b613c3d816151a6565b82525050565b6000613c4e826150f5565b613c58818561513b565b935083602082028501613c6a856150ab565b8060005b85811015613ca65784840389528151613c878582613bea565b9450613c9283615121565b925060208a01995050600181019050613c6e565b50829750879550505050505092915050565b6000613cc382615100565b613ccd818561514c565b9350613cd8836150bb565b8060005b83811015613d09578151613cf08882613bfe565b9750613cfb8361512e565b925050600181019050613cdc565b5085935050505092915050565b613d1f816151ca565b82525050565b6000613d308261510b565b613d3a818561515d565b9350613d4a81856020860161527b565b613d53816152b0565b840191505092915050565b6000613d698261510b565b613d73818561516e565b9350613d8381856020860161527b565b80840191505092915050565b600081546001811660008114613dac5760018114613dd157613e15565b607f6002830416613dbd818761516e565b955060ff1983168652808601935050613e15565b60028204613ddf818761516e565b9550613dea856150cb565b60005b82811015613e0c57815481890152600182019150602081019050613ded565b82880195505050505b505092915050565b6000613e2882615116565b613e328185615179565b9350613e4281856020860161527b565b613e4b816152b0565b840191505092915050565b6000613e6182615116565b613e6b818561518a565b9350613e7b81856020860161527b565b613e84816152b0565b840191505092915050565b6000613e9a82615116565b613ea4818561519b565b9350613eb481856020860161527b565b80840191505092915050565b600081546001811660008114613edd5760018114613f0357613f47565b607f6002830416613eee818761518a565b955060ff198316865260208601935050613f47565b60028204613f11818761518a565b9550613f1c856150e0565b60005b82811015613f3e57815481890152600182019150602081019050613f1f565b80880195505050505b505092915050565b6000613f5c60228361518a565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc260328361518a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061402860268361518a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061408e601c8361518a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006140ce601b8361518a565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061410e60208361518a565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b600061414e60248361518a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b460198361518a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006141f4601f8361518a565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614234601e8361518a565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061427460268361518a565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142da602c8361518a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061434060218361518a565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a660388361518a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061440c602a8361518a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061447260228361518a565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144d860208361518a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061451860288361518a565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f732072756c6572210000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457e60218361518a565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e4602c8361518a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061464a60208361518a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061468a60298361518a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146f0602f8361518a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061475660238361518a565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147bc601b8361518a565b91507f43686f6f736520612072756c65722077697468696e2072616e676500000000006000830152602082019050919050565b60006147fc60218361518a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061486260228361518a565b91507f53616c65206d7573742062652061637469766520746f206d696e742042616e6160008301527f6e610000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148c860168361518a565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b600061490860318361518a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061496e601d8361518a565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006149ae601b8361518a565b91507f43484f4f534520412052554c45522057495448494e2052414e474500000000006000830152602082019050919050565b60006149ee602a8361518a565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662052756c657273000000000000000000000000000000000000000000006020830152604082019050919050565b614a508161522c565b82525050565b614a5f8161522c565b82525050565b6000614a718284613d5e565b915081905092915050565b6000614a888284613d8f565b915081905092915050565b6000614a9f8285613e8f565b9150614aab8284613e8f565b91508190509392505050565b6000602082019050614acc6000830184613c34565b92915050565b6000608082019050614ae76000830187613c25565b614af46020830186613c34565b614b016040830185614a56565b8181036060830152614b138184613d25565b905095945050505050565b6000606082019050614b336000830186613c16565b614b406020830185614a56565b8181036040830152614b528184613e56565b9050949350505050565b60006020820190508181036000830152614b768184613c43565b905092915050565b60006020820190508181036000830152614b988184613cb8565b905092915050565b6000602082019050614bb56000830184613d16565b92915050565b60006020820190508181036000830152614bd58184613e56565b905092915050565b60006020820190508181036000830152614bf78184613ec0565b905092915050565b60006020820190508181036000830152614c1881613f4f565b9050919050565b60006020820190508181036000830152614c3881613fb5565b9050919050565b60006020820190508181036000830152614c588161401b565b9050919050565b60006020820190508181036000830152614c7881614081565b9050919050565b60006020820190508181036000830152614c98816140c1565b9050919050565b60006020820190508181036000830152614cb881614101565b9050919050565b60006020820190508181036000830152614cd881614141565b9050919050565b60006020820190508181036000830152614cf8816141a7565b9050919050565b60006020820190508181036000830152614d18816141e7565b9050919050565b60006020820190508181036000830152614d3881614227565b9050919050565b60006020820190508181036000830152614d5881614267565b9050919050565b60006020820190508181036000830152614d78816142cd565b9050919050565b60006020820190508181036000830152614d9881614333565b9050919050565b60006020820190508181036000830152614db881614399565b9050919050565b60006020820190508181036000830152614dd8816143ff565b9050919050565b60006020820190508181036000830152614df881614465565b9050919050565b60006020820190508181036000830152614e18816144cb565b9050919050565b60006020820190508181036000830152614e388161450b565b9050919050565b60006020820190508181036000830152614e5881614571565b9050919050565b60006020820190508181036000830152614e78816145d7565b9050919050565b60006020820190508181036000830152614e988161463d565b9050919050565b60006020820190508181036000830152614eb88161467d565b9050919050565b60006020820190508181036000830152614ed8816146e3565b9050919050565b60006020820190508181036000830152614ef881614749565b9050919050565b60006020820190508181036000830152614f18816147af565b9050919050565b60006020820190508181036000830152614f38816147ef565b9050919050565b60006020820190508181036000830152614f5881614855565b9050919050565b60006020820190508181036000830152614f78816148bb565b9050919050565b60006020820190508181036000830152614f98816148fb565b9050919050565b60006020820190508181036000830152614fb881614961565b9050919050565b60006020820190508181036000830152614fd8816149a1565b9050919050565b60006020820190508181036000830152614ff8816149e1565b9050919050565b60006020820190506150146000830184614a56565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615041576150406152ae565b5b8060405250919050565b600067ffffffffffffffff821115615066576150656152ae565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115615096576150956152ae565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006151b18261520c565b9050919050565b60006151c38261520c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061524182615248565b9050919050565b60006152538261525a565b9050919050565b60006152658261520c565b9050919050565b82818337600083830152505050565b60005b8381101561529957808201518184015260208101905061527e565b838111156152a8576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6152ca816151a6565b81146152d557600080fd5b50565b6152e1816151ca565b81146152ec57600080fd5b50565b6152f8816151d6565b811461530357600080fd5b50565b61530f816151e0565b811461531a57600080fd5b50565b6153268161522c565b811461533157600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220995c538bdd90292ce737a04183a666895aebae0eaba37a338221f232d3049ac864736f6c63430007060033

Deployed Bytecode Sourcemap

66838:5032:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10238:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70967:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51523:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54309:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53839:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70547:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68306:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53317:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67186:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55199:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53079:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68549:89;;;;;;;;;;;;;:::i;:::-;;67521:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67751:131;;;;;;;;;;;;;:::i;:::-;;55575:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69844:690;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53605:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68440:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51279:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67262:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52898:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50996:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66234:148;;;;;;;;;;;;;:::i;:::-;;68656:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66929:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65583:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51692:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67033:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54602:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67409:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69652:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55797:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67894:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69488:125;;;;;;;;;;;;;:::i;:::-;;51867:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69247:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67313:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54968:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67364:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66537:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71306:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10238:150;10323:4;10347:20;:33;10368:11;10347:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10340:40;;10238:150;;;:::o;70967:197::-;71026:13;71072;:11;:13::i;:::-;71061:8;:24;71052:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71136:10;:20;71147:8;71136:20;;;;;;;;;;;71129:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70967:197;;;:::o;51523:100::-;51577:13;51610:5;51603:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51523:100;:::o;54309:221::-;54385:7;54413:16;54421:7;54413;:16::i;:::-;54405:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54498:15;:24;54514:7;54498:24;;;;;;;;;;;;;;;;;;;;;54491:31;;54309:221;;;:::o;53839:404::-;53920:13;53936:23;53951:7;53936:14;:23::i;:::-;53920:39;;53984:5;53978:11;;:2;:11;;;;53970:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54064:5;54048:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54073:44;54097:5;54104:12;:10;:12::i;:::-;54073:23;:44::i;:::-;54048:69;54040:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54214:21;54223:2;54227:7;54214:8;:21::i;:::-;53839:404;;;:::o;70547:408::-;70655:10;70634:31;;:17;70642:8;70634:7;:17::i;:::-;:31;;;70626:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;70753:35;70766:10;:20;70777:8;70766:20;;;;;;;;;;;70753:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70729:20;70742:5;70729:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;70721:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;70862:5;70839:10;:20;70850:8;70839:20;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;70893:44;70909:10;70921:8;70931:5;70893:44;;;;;;;;:::i;:::-;;;;;;;;70547:408;;:::o;68306:126::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68410:14:::1;68391:16;:33;;;;;;;;;;;;:::i;:::-;;68306:126:::0;:::o;53317:211::-;53378:7;53499:21;:12;:19;:21::i;:::-;53492:28;;53317:211;:::o;67186:54::-;67223:17;67186:54;:::o;55199:305::-;55360:41;55379:12;:10;:12::i;:::-;55393:7;55360:18;:41::i;:::-;55352:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55468:28;55478:4;55484:2;55488:7;55468:9;:28::i;:::-;55199:305;;;:::o;53079:162::-;53176:7;53203:30;53227:5;53203:13;:20;53217:5;53203:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53196:37;;53079:162;;;;:::o;68549:89::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68618:12:::1;;;;;;;;;;;68617:13;68602:12;;:28;;;;;;;;;;;;;;;;;;68549:89::o:0;67521:29::-;;;;:::o;67751:131::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67799:12:::1;67814:21;67799:36;;67846:10;:19;;:28;67866:7;67846:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65874:1;67751:131::o:0;55575:151::-;55679:39;55696:4;55702:2;55706:7;55679:39;;;;;;;;;;;;:16;:39::i;:::-;55575:151;;;:::o;69844:690::-;69918:12;;;;;;;;;;;69910:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;70005:1;69988:14;:18;:56;;;;;67302:2;70010:14;:34;;69988:56;69980:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;67350:5;70101:33;70119:14;70101:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;70093:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;70227:30;70242:14;67223:17;70227:14;;:30;;;;:::i;:::-;70214:9;:43;;70206:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;70318:6;70314:211;70334:14;70330:1;:18;70314:211;;;70370:14;70387:13;:11;:13::i;:::-;70370:30;;67350:5;70419:13;:11;:13::i;:::-;:26;70415:99;;;70466:32;70476:10;70488:9;70466;:32::i;:::-;70415:99;70314:211;70350:3;;;;;;;70314:211;;;;69844:690;:::o;53605:172::-;53680:7;53701:15;53722:22;53738:5;53722:12;:15;;:22;;;;:::i;:::-;53700:44;;;53762:7;53755:14;;;53605:172;;;:::o;68440:99::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68511:20:::1;68523:7;68511:11;:20::i;:::-;68440:99:::0;:::o;51279:177::-;51351:7;51378:70;51395:7;51378:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51371:77;;51279:177;;;:::o;67262:42::-;67302:2;67262:42;:::o;52898:97::-;52946:13;52979:8;52972:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52898:97;:::o;50996:221::-;51068:7;51113:1;51096:19;;:5;:19;;;;51088:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51180:29;:13;:20;51194:5;51180:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51173:36;;50996:221;;;:::o;66234:148::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66341:1:::1;66304:40;;66325:6;;;;;;;;;;;66304:40;;;;;;;;;;;;66372:1;66355:6;;:19;;;;;;;;;;;;;;;;;;66234:148::o:0;68656:540::-;68717:16;68747:18;68768:17;68778:6;68768:9;:17::i;:::-;68747:38;;68814:1;68800:10;:15;68796:393;;;68891:1;68877:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68870:23;;;;;68796:393;68926:23;68966:10;68952:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68926:51;;68992:13;69020:130;69044:10;69036:5;:18;69020:130;;;69100:34;69120:6;69128:5;69100:19;:34::i;:::-;69084:6;69091:5;69084:13;;;;;;;;;;;;;:50;;;;;69056:7;;;;;;;69020:130;;;69171:6;69164:13;;;;;68656:540;;;;:::o;66929:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65583:87::-;65629:7;65656:6;;;;;;;;;;;65649:13;;65583:87;:::o;51692:104::-;51748:13;51781:7;51774:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51692:104;:::o;67033:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54602:295::-;54717:12;:10;:12::i;:::-;54705:24;;:8;:24;;;;54697:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54817:8;54772:18;:32;54791:12;:10;:12::i;:::-;54772:32;;;;;;;;;;;;;;;:42;54805:8;54772:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54870:8;54841:48;;54856:12;:10;:12::i;:::-;54841:48;;;54880:8;54841:48;;;;;;:::i;:::-;;;;;;;;54602:295;;:::o;67409:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69652:174::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69752:5:::1;69735:22;;:13;;;;;;;;;;;:22;;;69727:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69810:8;69795:12;:23;;;;;;;;;;;;:::i;:::-;;69652:174:::0;:::o;55797:285::-;55929:41;55948:12;:10;:12::i;:::-;55962:7;55929:18;:41::i;:::-;55921:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56035:39;56049:4;56055:2;56059:7;56068:5;56035:13;:39::i;:::-;55797:285;;;;:::o;67894:402::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67990:11:::1;68004:13;:11;:13::i;:::-;67990:27;;68053:1;68036:14;:18;:52;;;;;68076:12;;68058:14;:30;;68036:52;68028:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;68141:6;68136:95;68157:14;68153:1;:18;68136:95;;;68193:26;68203:3;68217:1;68208:6;:10;68193:9;:26::i;:::-;68173:3;;;;;;;68136:95;;;;68256:32;68273:14;68256:12;;:16;;:32;;;;:::i;:::-;68241:12;:47;;;;65874:1;67894:402:::0;;:::o;69488:125::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69556:4:::1;69539:13;;:21;;;;;;;;;;;;;;;;;;69576:29;69592:12;69576:29;;;;;;:::i;:::-;;;;;;;;69488:125::o:0;51867:792::-;51940:13;51974:16;51982:7;51974;:16::i;:::-;51966:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52055:23;52081:10;:19;52092:7;52081:19;;;;;;;;;;;52055:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52111:18;52132:9;:7;:9::i;:::-;52111:30;;52239:1;52223:4;52217:18;:23;52213:72;;;52264:9;52257:16;;;;;;52213:72;52415:1;52395:9;52389:23;:27;52385:108;;;52464:4;52470:9;52447:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52433:48;;;;;;52385:108;52625:4;52631:18;:7;:16;:18::i;:::-;52608:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52594:57;;;;51867:792;;;;:::o;69247:175::-;69299:13;69339;:11;:13::i;:::-;69333:3;:19;69325:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;69402:12;69395:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69247:175;;;:::o;67313:42::-;67350:5;67313:42;:::o;54968:164::-;55065:4;55089:18;:25;55108:5;55089:25;;;;;;;;;;;;;;;:35;55115:8;55089:35;;;;;;;;;;;;;;;;;;;;;;;;;55082:42;;54968:164;;;;:::o;67364:32::-;;;;;;;;;;;;;:::o;66537:244::-;65814:12;:10;:12::i;:::-;65803:23;;:7;:5;:7::i;:::-;:23;;;65795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66646:1:::1;66626:22;;:8;:22;;;;66618:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66736:8;66707:38;;66728:6;;;;;;;;;;;66707:38;;;;;;;;;;;;66765:8;66756:6;;:17;;;;;;;;;;;;;;;;;;66537:244:::0;:::o;71306:555::-;71371:15;71400:18;71421:17;71431:6;71421:9;:17::i;:::-;71400:38;;71467:1;71453:10;:15;71449:405;;;71543:1;71530:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71523:22;;;;;71449:405;71578:22;71616:10;71603:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71578:49;;71642:13;71670:145;71694:10;71686:5;:18;71670:145;;;71750:10;:48;71762:34;71782:6;71790:5;71762:19;:34::i;:::-;71750:48;;;;;;;;;;;71734:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;71741:5;71734:13;;;;;;;;;;;;;:64;;;;71706:7;;;;;;;71670:145;;;71836:6;71829:13;;;;;71306:555;;;;:::o;57549:127::-;57614:4;57638:30;57660:7;57638:12;:21;;:30;;;;:::i;:::-;57631:37;;57549:127;;;:::o;670:106::-;723:15;758:10;751:17;;670:106;:::o;63567:192::-;63669:2;63642:15;:24;63658:7;63642:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63725:7;63721:2;63687:46;;63696:23;63711:7;63696:14;:23::i;:::-;63687:46;;;;;;;;;;;;63567:192;;:::o;44281:123::-;44350:7;44377:19;44385:3;:10;;44377:7;:19::i;:::-;44370:26;;44281:123;;;:::o;57843:355::-;57936:4;57961:16;57969:7;57961;:16::i;:::-;57953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58037:13;58053:23;58068:7;58053:14;:23::i;:::-;58037:39;;58106:5;58095:16;;:7;:16;;;:51;;;;58139:7;58115:31;;:20;58127:7;58115:11;:20::i;:::-;:31;;;58095:51;:94;;;;58150:39;58174:5;58181:7;58150:23;:39::i;:::-;58095:94;58087:103;;;57843:355;;;;:::o;60979:599::-;61104:4;61077:31;;:23;61092:7;61077:14;:23::i;:::-;:31;;;61069:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61205:1;61191:16;;:2;:16;;;;61183:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61261:39;61282:4;61288:2;61292:7;61261:20;:39::i;:::-;61365:29;61382:1;61386:7;61365:8;:29::i;:::-;61407:35;61434:7;61407:13;:19;61421:4;61407:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61453:30;61475:7;61453:13;:17;61467:2;61453:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61496:29;61513:7;61522:2;61496:12;:16;;:29;;;;;:::i;:::-;;61562:7;61558:2;61543:27;;61552:4;61543:27;;;;;;;;;;;;60979:599;;;:::o;36072:137::-;36143:7;36178:22;36182:3;:10;;36194:5;36178:3;:22::i;:::-;36170:31;;36163:38;;36072:137;;;;:::o;13800:179::-;13858:7;13878:9;13894:1;13890;:5;13878:17;;13919:1;13914;:6;;13906:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;13970:1;13963:8;;;13800:179;;;;:::o;14679:220::-;14737:7;14766:1;14761;:6;14757:20;;;14776:1;14769:8;;;;14757:20;14788:9;14804:1;14800;:5;14788:17;;14833:1;14828;14824;:5;;;;;;:10;14816:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14890:1;14883:8;;;14679:220;;;;;:::o;58541:110::-;58617:26;58627:2;58631:7;58617:26;;;;;;;;;;;;:9;:26::i;:::-;58541:110;;:::o;44743:236::-;44823:7;44832;44853:11;44866:13;44883:22;44887:3;:10;;44899:5;44883:3;:22::i;:::-;44852:53;;;;44932:3;44924:12;;44962:5;44954:14;;44916:55;;;;;;44743:236;;;;;:::o;62179:100::-;62263:8;62252;:19;;;;;;;;;;;;:::i;:::-;;62179:100;:::o;46029:213::-;46136:7;46187:44;46192:3;:10;;46212:3;46204:12;;46218;46187:4;:44::i;:::-;46179:53;;46156:78;;46029:213;;;;;:::o;35614:114::-;35674:7;35701:19;35709:3;:10;;35701:7;:19::i;:::-;35694:26;;35614:114;;;:::o;56964:272::-;57078:28;57088:4;57094:2;57098:7;57078:9;:28::i;:::-;57125:48;57148:4;57154:2;57158:7;57167:5;57125:22;:48::i;:::-;57117:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56964:272;;;;:::o;14262:158::-;14320:7;14353:1;14348;:6;;14340:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14411:1;14407;:5;14400:12;;14262:158;;;;:::o;46493:746::-;46549:13;46779:1;46770:5;:10;46766:53;;;46797:10;;;;;;;;;;;;;;;;;;;;;46766:53;46829:12;46844:5;46829:20;;46860:14;46885:78;46900:1;46892:4;:9;46885:78;;46918:8;;;;;;;46949:2;46941:10;;;;;;;;;46885:78;;;46973:19;47005:6;46995:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46973:39;;47023:13;47048:1;47039:6;:10;47023:26;;47067:5;47060:12;;47083:117;47098:1;47090:4;:9;47083:117;;47159:2;47152:4;:9;;;;;;47147:2;:14;47134:29;;47116:6;47123:7;;;;;;;47116:15;;;;;;;;;;;:47;;;;;;;;;;;47186:2;47178:10;;;;;;;;;47083:117;;;47224:6;47210:21;;;;;;46493:746;;;;:::o;44042:151::-;44126:4;44150:35;44160:3;:10;;44180:3;44172:12;;44150:9;:35::i;:::-;44143:42;;44042:151;;;;:::o;40860:110::-;40916:7;40943:3;:12;;:19;;;;40936:26;;40860:110;;;:::o;64372:93::-;;;;:::o;35159:137::-;35229:4;35253:35;35261:3;:10;;35281:5;35273:14;;35253:7;:35::i;:::-;35246:42;;35159:137;;;;:::o;34852:131::-;34919:4;34943:32;34948:3;:10;;34968:5;34960:14;;34943:4;:32::i;:::-;34936:39;;34852:131;;;;:::o;43465:185::-;43554:4;43578:64;43583:3;:10;;43603:3;43595:12;;43633:5;43617:23;;43609:32;;43578:4;:64::i;:::-;43571:71;;43465:185;;;;;:::o;31110:204::-;31177:7;31226:5;31205:3;:11;;:18;;;;:26;31197:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31288:3;:11;;31300:5;31288:18;;;;;;;;;;;;;;;;31281:25;;31110:204;;;;:::o;58878:250::-;58974:18;58980:2;58984:7;58974:5;:18::i;:::-;59011:54;59042:1;59046:2;59050:7;59059:5;59011:22;:54::i;:::-;59003:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58878:250;;;:::o;41325:279::-;41392:7;41401;41451:5;41429:3;:12;;:19;;;;:27;41421:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41508:22;41533:3;:12;;41546:5;41533:19;;;;;;;;;;;;;;;;;;41508:44;;41571:5;:10;;;41583:5;:12;;;41563:33;;;;;41325:279;;;;;:::o;42822:319::-;42916:7;42936:16;42955:3;:12;;:17;42968:3;42955:17;;;;;;;;;;;;42936:36;;43003:1;42991:8;:13;;43006:12;42983:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43073:3;:12;;43097:1;43086:8;:12;43073:26;;;;;;;;;;;;;;;;;;:33;;;43066:40;;;42822:319;;;;;:::o;30657:109::-;30713:7;30740:3;:11;;:18;;;;30733:25;;30657:109;;;:::o;62844:604::-;62965:4;62992:15;:2;:13;;;:15::i;:::-;62987:60;;63031:4;63024:11;;;;62987:60;63057:23;63083:252;63136:45;;;63196:12;:10;:12::i;:::-;63223:4;63242:7;63264:5;63099:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63083:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63057:278;;63346:13;63373:10;63362:32;;;;;;;;;;;;:::i;:::-;63346:48;;47993:10;63423:16;;63413:26;;;:6;:26;;;;63405:35;;;;62844:604;;;;;;;:::o;40640:125::-;40711:4;40756:1;40735:3;:12;;:17;40748:3;40735:17;;;;;;;;;;;;:22;;40728:29;;40640:125;;;;:::o;28812:1544::-;28878:4;28996:18;29017:3;:12;;:19;29030:5;29017:19;;;;;;;;;;;;28996:40;;29067:1;29053:10;:15;29049:1300;;29415:21;29452:1;29439:10;:14;29415:38;;29468:17;29509:1;29488:3;:11;;:18;;;;:22;29468:42;;29755:17;29775:3;:11;;29787:9;29775:22;;;;;;;;;;;;;;;;29755:42;;29921:9;29892:3;:11;;29904:13;29892:26;;;;;;;;;;;;;;;:38;;;;30040:1;30024:13;:17;29998:3;:12;;:23;30011:9;29998:23;;;;;;;;;;;:43;;;;30150:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30245:3;:12;;:19;30258:5;30245:19;;;;;;;;;;;30238:26;;;30288:4;30281:11;;;;;;;;29049:1300;30332:5;30325:12;;;28812:1544;;;;;:::o;28222:414::-;28285:4;28307:21;28317:3;28322:5;28307:9;:21::i;:::-;28302:327;;28345:3;:11;;28362:5;28345:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28528:3;:11;;:18;;;;28506:3;:12;;:19;28519:5;28506:19;;;;;;;;;;;:40;;;;28568:4;28561:11;;;;28302:327;28612:5;28605:12;;28222:414;;;;;:::o;38140:692::-;38216:4;38332:16;38351:3;:12;;:17;38364:3;38351:17;;;;;;;;;;;;38332:36;;38397:1;38385:8;:13;38381:444;;;38452:3;:12;;38470:38;;;;;;;;38487:3;38470:38;;;;38500:5;38470:38;;;38452:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38667:3;:12;;:19;;;;38647:3;:12;;:17;38660:3;38647:17;;;;;;;;;;;:39;;;;38708:4;38701:11;;;;;38381:444;38781:5;38745:3;:12;;38769:1;38758:8;:12;38745:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38808:5;38801:12;;;38140:692;;;;;;:::o;59464:404::-;59558:1;59544:16;;:2;:16;;;;59536:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59617:16;59625:7;59617;:16::i;:::-;59616:17;59608:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59679:45;59708:1;59712:2;59716:7;59679:20;:45::i;:::-;59737:30;59759:7;59737:13;:17;59751:2;59737:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59780:29;59797:7;59806:2;59780:12;:16;;:29;;;;;:::i;:::-;;59852:7;59848:2;59827:33;;59844:1;59827:33;;;;;;;;;;;;59464:404;;:::o;19241:422::-;19301:4;19509:12;19620:7;19608:20;19600:28;;19654:1;19647:4;:8;19640:15;;;19241:422;;;:::o;22159:195::-;22262:12;22294:52;22316:6;22324:4;22330:1;22333:12;22294:21;:52::i;:::-;22287:59;;22159:195;;;;;:::o;30442:129::-;30515:4;30562:1;30539:3;:12;;:19;30552:5;30539:19;;;;;;;;;;;;:24;;30532:31;;30442:129;;;;:::o;23211:530::-;23338:12;23396:5;23371:21;:30;;23363:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23463:18;23474:6;23463:10;:18::i;:::-;23455:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23589:12;23603:23;23630:6;:11;;23650:5;23658:4;23630:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23588:75;;;;23681:52;23699:7;23708:10;23720:12;23681:17;:52::i;:::-;23674:59;;;;23211:530;;;;;;:::o;25751:742::-;25866:12;25895:7;25891:595;;;25926:10;25919:17;;;;25891:595;26060:1;26040:10;:17;:21;26036:439;;;26303:10;26297:17;26364:15;26351:10;26347:2;26343:19;26336:44;26251:148;26446:12;26439:20;;;;;;;;;;;:::i;:::-;;;;;;;;25751:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:143::-;;1077:6;1071:13;1062:22;;1093:33;1120:5;1093:33;:::i;:::-;1052:80;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1732:273::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:79;1995:3;1987:6;1980:4;1972:6;1968:17;1920:79;:::i;:::-;1911:88;;1794:211;;;;;:::o;2011:139::-;;2095:6;2082:20;2073:29;;2111:33;2138:5;2111:33;:::i;:::-;2063:87;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:284::-;;5149:2;5137:9;5128:7;5124:23;5120:32;5117:2;;;5165:1;5162;5155:12;5117:2;5208:1;5233:64;5289:7;5280:6;5269:9;5265:22;5233:64;:::i;:::-;5223:74;;5179:128;5107:207;;;;:::o;5320:260::-;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;5443:1;5440;5433:12;5395:2;5486:1;5511:52;5555:7;5546:6;5535:9;5531:22;5511:52;:::i;:::-;5501:62;;5457:116;5385:195;;;;:::o;5586:282::-;;5704:2;5692:9;5683:7;5679:23;5675:32;5672:2;;;5720:1;5717;5710:12;5672:2;5763:1;5788:63;5843:7;5834:6;5823:9;5819:22;5788:63;:::i;:::-;5778:73;;5734:127;5662:206;;;;:::o;5874:375::-;;5992:2;5980:9;5971:7;5967:23;5963:32;5960:2;;;6008:1;6005;5998:12;5960:2;6079:1;6068:9;6064:17;6051:31;6109:18;6101:6;6098:30;6095:2;;;6141:1;6138;6131:12;6095:2;6169:63;6224:7;6215:6;6204:9;6200:22;6169:63;:::i;:::-;6159:73;;6022:220;5950:299;;;;:::o;6255:262::-;;6363:2;6351:9;6342:7;6338:23;6334:32;6331:2;;;6379:1;6376;6369:12;6331:2;6422:1;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6393:117;6321:196;;;;:::o;6523:520::-;;;6658:2;6646:9;6637:7;6633:23;6629:32;6626:2;;;6674:1;6671;6664:12;6626:2;6717:1;6742:53;6787:7;6778:6;6767:9;6763:22;6742:53;:::i;:::-;6732:63;;6688:117;6872:2;6861:9;6857:18;6844:32;6903:18;6895:6;6892:30;6889:2;;;6935:1;6932;6925:12;6889:2;6963:63;7018:7;7009:6;6998:9;6994:22;6963:63;:::i;:::-;6953:73;;6815:221;6616:427;;;;;:::o;7049:196::-;;7173:66;7235:3;7227:6;7173:66;:::i;:::-;7159:80;;7149:96;;;;:::o;7251:179::-;;7341:46;7383:3;7375:6;7341:46;:::i;:::-;7419:4;7414:3;7410:14;7396:28;;7331:99;;;;:::o;7436:147::-;7531:45;7570:5;7531:45;:::i;:::-;7526:3;7519:58;7509:74;;:::o;7589:142::-;7692:32;7718:5;7692:32;:::i;:::-;7687:3;7680:45;7670:61;;:::o;7737:118::-;7824:24;7842:5;7824:24;:::i;:::-;7819:3;7812:37;7802:53;;:::o;7889:991::-;;8057:64;8115:5;8057:64;:::i;:::-;8137:96;8226:6;8221:3;8137:96;:::i;:::-;8130:103;;8259:3;8304:4;8296:6;8292:17;8287:3;8283:27;8334:66;8394:5;8334:66;:::i;:::-;8423:7;8454:1;8439:396;8464:6;8461:1;8458:13;8439:396;;;8535:9;8529:4;8525:20;8520:3;8513:33;8586:6;8580:13;8614:84;8693:4;8678:13;8614:84;:::i;:::-;8606:92;;8721:70;8784:6;8721:70;:::i;:::-;8711:80;;8820:4;8815:3;8811:14;8804:21;;8499:336;8486:1;8483;8479:9;8474:14;;8439:396;;;8443:14;8851:4;8844:11;;8871:3;8864:10;;8033:847;;;;;;;;;:::o;8916:732::-;;9064:54;9112:5;9064:54;:::i;:::-;9134:86;9213:6;9208:3;9134:86;:::i;:::-;9127:93;;9244:56;9294:5;9244:56;:::i;:::-;9323:7;9354:1;9339:284;9364:6;9361:1;9358:13;9339:284;;;9440:6;9434:13;9467:63;9526:3;9511:13;9467:63;:::i;:::-;9460:70;;9553:60;9606:6;9553:60;:::i;:::-;9543:70;;9399:224;9386:1;9383;9379:9;9374:14;;9339:284;;;9343:14;9639:3;9632:10;;9040:608;;;;;;;:::o;9654:109::-;9735:21;9750:5;9735:21;:::i;:::-;9730:3;9723:34;9713:50;;:::o;9769:360::-;;9883:38;9915:5;9883:38;:::i;:::-;9937:70;10000:6;9995:3;9937:70;:::i;:::-;9930:77;;10016:52;10061:6;10056:3;10049:4;10042:5;10038:16;10016:52;:::i;:::-;10093:29;10115:6;10093:29;:::i;:::-;10088:3;10084:39;10077:46;;9859:270;;;;;:::o;10135:373::-;;10267:38;10299:5;10267:38;:::i;:::-;10321:88;10402:6;10397:3;10321:88;:::i;:::-;10314:95;;10418:52;10463:6;10458:3;10451:4;10444:5;10440:16;10418:52;:::i;:::-;10495:6;10490:3;10486:16;10479:23;;10243:265;;;;;:::o;10536:1001::-;;10678:5;10672:12;10715:1;10704:9;10700:17;10731:1;10726:300;;;;11040:1;11035:496;;;;10693:838;;10726:300;10816:4;10812:1;10801:9;10797:17;10793:28;10841:88;10922:6;10917:3;10841:88;:::i;:::-;10834:95;;10973:4;10969:9;10958;10954:25;10949:3;10942:38;11009:6;11004:3;11000:16;10993:23;;10733:293;10726:300;;11035:496;11116:1;11105:9;11101:17;11138:88;11219:6;11214:3;11138:88;:::i;:::-;11131:95;;11254:41;11289:5;11254:41;:::i;:::-;11317:1;11331:154;11345:6;11342:1;11339:13;11331:154;;;11419:7;11413:14;11409:1;11404:3;11400:11;11393:35;11469:1;11460:7;11456:15;11445:26;;11367:4;11364:1;11360:12;11355:17;;11331:154;;;11514:6;11509:3;11505:16;11498:23;;11042:489;;;10693:838;;10645:892;;;;;:::o;11543:344::-;;11649:39;11682:5;11649:39;:::i;:::-;11704:61;11758:6;11753:3;11704:61;:::i;:::-;11697:68;;11774:52;11819:6;11814:3;11807:4;11800:5;11796:16;11774:52;:::i;:::-;11851:29;11873:6;11851:29;:::i;:::-;11846:3;11842:39;11835:46;;11625:262;;;;;:::o;11893:364::-;;12009:39;12042:5;12009:39;:::i;:::-;12064:71;12128:6;12123:3;12064:71;:::i;:::-;12057:78;;12144:52;12189:6;12184:3;12177:4;12170:5;12166:16;12144:52;:::i;:::-;12221:29;12243:6;12221:29;:::i;:::-;12216:3;12212:39;12205:46;;11985:272;;;;;:::o;12263:377::-;;12397:39;12430:5;12397:39;:::i;:::-;12452:89;12534:6;12529:3;12452:89;:::i;:::-;12445:96;;12550:52;12595:6;12590:3;12583:4;12576:5;12572:16;12550:52;:::i;:::-;12627:6;12622:3;12618:16;12611:23;;12373:267;;;;;:::o;12670:937::-;;12792:5;12786:12;12829:1;12818:9;12814:17;12845:1;12840:281;;;;13135:1;13130:471;;;;12807:794;;12840:281;12930:4;12926:1;12915:9;12911:17;12907:28;12955:71;13019:6;13014:3;12955:71;:::i;:::-;12948:78;;13070:4;13066:9;13055;13051:25;13046:3;13039:38;13106:4;13101:3;13097:14;13090:21;;12847:274;12840:281;;13130:471;13211:1;13200:9;13196:17;13233:71;13297:6;13292:3;13233:71;:::i;:::-;13226:78;;13332:38;13364:5;13332:38;:::i;:::-;13392:1;13406:154;13420:6;13417:1;13414:13;13406:154;;;13494:7;13488:14;13484:1;13479:3;13475:11;13468:35;13544:1;13535:7;13531:15;13520:26;;13442:4;13439:1;13435:12;13430:17;;13406:154;;;13589:1;13584:3;13580:11;13573:18;;13137:464;;;12807:794;;12759:848;;;;;:::o;13613:366::-;;13776:67;13840:2;13835:3;13776:67;:::i;:::-;13769:74;;13873:34;13869:1;13864:3;13860:11;13853:55;13939:4;13934:2;13929:3;13925:12;13918:26;13970:2;13965:3;13961:12;13954:19;;13759:220;;;:::o;13985:382::-;;14148:67;14212:2;14207:3;14148:67;:::i;:::-;14141:74;;14245:34;14241:1;14236:3;14232:11;14225:55;14311:20;14306:2;14301:3;14297:12;14290:42;14358:2;14353:3;14349:12;14342:19;;14131:236;;;:::o;14373:370::-;;14536:67;14600:2;14595:3;14536:67;:::i;:::-;14529:74;;14633:34;14629:1;14624:3;14620:11;14613:55;14699:8;14694:2;14689:3;14685:12;14678:30;14734:2;14729:3;14725:12;14718:19;;14519:224;;;:::o;14749:326::-;;14912:67;14976:2;14971:3;14912:67;:::i;:::-;14905:74;;15009:30;15005:1;15000:3;14996:11;14989:51;15066:2;15061:3;15057:12;15050:19;;14895:180;;;:::o;15081:325::-;;15244:67;15308:2;15303:3;15244:67;:::i;:::-;15237:74;;15341:29;15337:1;15332:3;15328:11;15321:50;15397:2;15392:3;15388:12;15381:19;;15227:179;;;:::o;15412:330::-;;15575:67;15639:2;15634:3;15575:67;:::i;:::-;15568:74;;15672:34;15668:1;15663:3;15659:11;15652:55;15733:2;15728:3;15724:12;15717:19;;15558:184;;;:::o;15748:368::-;;15911:67;15975:2;15970:3;15911:67;:::i;:::-;15904:74;;16008:34;16004:1;15999:3;15995:11;15988:55;16074:6;16069:2;16064:3;16060:12;16053:28;16107:2;16102:3;16098:12;16091:19;;15894:222;;;:::o;16122:323::-;;16285:67;16349:2;16344:3;16285:67;:::i;:::-;16278:74;;16382:27;16378:1;16373:3;16369:11;16362:48;16436:2;16431:3;16427:12;16420:19;;16268:177;;;:::o;16451:329::-;;16614:67;16678:2;16673:3;16614:67;:::i;:::-;16607:74;;16711:33;16707:1;16702:3;16698:11;16691:54;16771:2;16766:3;16762:12;16755:19;;16597:183;;;:::o;16786:328::-;;16949:67;17013:2;17008:3;16949:67;:::i;:::-;16942:74;;17046:32;17042:1;17037:3;17033:11;17026:53;17105:2;17100:3;17096:12;17089:19;;16932:182;;;:::o;17120:370::-;;17283:67;17347:2;17342:3;17283:67;:::i;:::-;17276:74;;17380:34;17376:1;17371:3;17367:11;17360:55;17446:8;17441:2;17436:3;17432:12;17425:30;17481:2;17476:3;17472:12;17465:19;;17266:224;;;:::o;17496:376::-;;17659:67;17723:2;17718:3;17659:67;:::i;:::-;17652:74;;17756:34;17752:1;17747:3;17743:11;17736:55;17822:14;17817:2;17812:3;17808:12;17801:36;17863:2;17858:3;17854:12;17847:19;;17642:230;;;:::o;17878:365::-;;18041:67;18105:2;18100:3;18041:67;:::i;:::-;18034:74;;18138:34;18134:1;18129:3;18125:11;18118:55;18204:3;18199:2;18194:3;18190:12;18183:25;18234:2;18229:3;18225:12;18218:19;;18024:219;;;:::o;18249:388::-;;18412:67;18476:2;18471:3;18412:67;:::i;:::-;18405:74;;18509:34;18505:1;18500:3;18496:11;18489:55;18575:26;18570:2;18565:3;18561:12;18554:48;18628:2;18623:3;18619:12;18612:19;;18395:242;;;:::o;18643:374::-;;18806:67;18870:2;18865:3;18806:67;:::i;:::-;18799:74;;18903:34;18899:1;18894:3;18890:11;18883:55;18969:12;18964:2;18959:3;18955:12;18948:34;19008:2;19003:3;18999:12;18992:19;;18789:228;;;:::o;19023:366::-;;19186:67;19250:2;19245:3;19186:67;:::i;:::-;19179:74;;19283:34;19279:1;19274:3;19270:11;19263:55;19349:4;19344:2;19339:3;19335:12;19328:26;19380:2;19375:3;19371:12;19364:19;;19169:220;;;:::o;19395:330::-;;19558:67;19622:2;19617:3;19558:67;:::i;:::-;19551:74;;19655:34;19651:1;19646:3;19642:11;19635:55;19716:2;19711:3;19707:12;19700:19;;19541:184;;;:::o;19731:372::-;;19894:67;19958:2;19953:3;19894:67;:::i;:::-;19887:74;;19991:34;19987:1;19982:3;19978:11;19971:55;20057:10;20052:2;20047:3;20043:12;20036:32;20094:2;20089:3;20085:12;20078:19;;19877:226;;;:::o;20109:365::-;;20272:67;20336:2;20331:3;20272:67;:::i;:::-;20265:74;;20369:34;20365:1;20360:3;20356:11;20349:55;20435:3;20430:2;20425:3;20421:12;20414:25;20465:2;20460:3;20456:12;20449:19;;20255:219;;;:::o;20480:376::-;;20643:67;20707:2;20702:3;20643:67;:::i;:::-;20636:74;;20740:34;20736:1;20731:3;20727:11;20720:55;20806:14;20801:2;20796:3;20792:12;20785:36;20847:2;20842:3;20838:12;20831:19;;20626:230;;;:::o;20862:330::-;;21025:67;21089:2;21084:3;21025:67;:::i;:::-;21018:74;;21122:34;21118:1;21113:3;21109:11;21102:55;21183:2;21178:3;21174:12;21167:19;;21008:184;;;:::o;21198:373::-;;21361:67;21425:2;21420:3;21361:67;:::i;:::-;21354:74;;21458:34;21454:1;21449:3;21445:11;21438:55;21524:11;21519:2;21514:3;21510:12;21503:33;21562:2;21557:3;21553:12;21546:19;;21344:227;;;:::o;21577:379::-;;21740:67;21804:2;21799:3;21740:67;:::i;:::-;21733:74;;21837:34;21833:1;21828:3;21824:11;21817:55;21903:17;21898:2;21893:3;21889:12;21882:39;21947:2;21942:3;21938:12;21931:19;;21723:233;;;:::o;21962:367::-;;22125:67;22189:2;22184:3;22125:67;:::i;:::-;22118:74;;22222:34;22218:1;22213:3;22209:11;22202:55;22288:5;22283:2;22278:3;22274:12;22267:27;22320:2;22315:3;22311:12;22304:19;;22108:221;;;:::o;22335:325::-;;22498:67;22562:2;22557:3;22498:67;:::i;:::-;22491:74;;22595:29;22591:1;22586:3;22582:11;22575:50;22651:2;22646:3;22642:12;22635:19;;22481:179;;;:::o;22666:365::-;;22829:67;22893:2;22888:3;22829:67;:::i;:::-;22822:74;;22926:34;22922:1;22917:3;22913:11;22906:55;22992:3;22987:2;22982:3;22978:12;22971:25;23022:2;23017:3;23013:12;23006:19;;22812:219;;;:::o;23037:366::-;;23200:67;23264:2;23259:3;23200:67;:::i;:::-;23193:74;;23297:34;23293:1;23288:3;23284:11;23277:55;23363:4;23358:2;23353:3;23349:12;23342:26;23394:2;23389:3;23385:12;23378:19;;23183:220;;;:::o;23409:320::-;;23572:67;23636:2;23631:3;23572:67;:::i;:::-;23565:74;;23669:24;23665:1;23660:3;23656:11;23649:45;23720:2;23715:3;23711:12;23704:19;;23555:174;;;:::o;23735:381::-;;23898:67;23962:2;23957:3;23898:67;:::i;:::-;23891:74;;23995:34;23991:1;23986:3;23982:11;23975:55;24061:19;24056:2;24051:3;24047:12;24040:41;24107:2;24102:3;24098:12;24091:19;;23881:235;;;:::o;24122:327::-;;24285:67;24349:2;24344:3;24285:67;:::i;:::-;24278:74;;24382:31;24378:1;24373:3;24369:11;24362:52;24440:2;24435:3;24431:12;24424:19;;24268:181;;;:::o;24455:325::-;;24618:67;24682:2;24677:3;24618:67;:::i;:::-;24611:74;;24715:29;24711:1;24706:3;24702:11;24695:50;24771:2;24766:3;24762:12;24755:19;;24601:179;;;:::o;24786:374::-;;24949:67;25013:2;25008:3;24949:67;:::i;:::-;24942:74;;25046:34;25042:1;25037:3;25033:11;25026:55;25112:12;25107:2;25102:3;25098:12;25091:34;25151:2;25146:3;25142:12;25135:19;;24932:228;;;:::o;25166:108::-;25243:24;25261:5;25243:24;:::i;:::-;25238:3;25231:37;25221:53;;:::o;25280:118::-;25367:24;25385:5;25367:24;:::i;:::-;25362:3;25355:37;25345:53;;:::o;25404:271::-;;25556:93;25645:3;25636:6;25556:93;:::i;:::-;25549:100;;25666:3;25659:10;;25538:137;;;;:::o;25681:273::-;;25834:94;25924:3;25915:6;25834:94;:::i;:::-;25827:101;;25945:3;25938:10;;25816:138;;;;:::o;25960:435::-;;26162:95;26253:3;26244:6;26162:95;:::i;:::-;26155:102;;26274:95;26365:3;26356:6;26274:95;:::i;:::-;26267:102;;26386:3;26379:10;;26144:251;;;;;:::o;26401:222::-;;26532:2;26521:9;26517:18;26509:26;;26545:71;26613:1;26602:9;26598:17;26589:6;26545:71;:::i;:::-;26499:124;;;;:::o;26629:672::-;;26878:3;26867:9;26863:19;26855:27;;26892:87;26976:1;26965:9;26961:17;26952:6;26892:87;:::i;:::-;26989:72;27057:2;27046:9;27042:18;27033:6;26989:72;:::i;:::-;27071;27139:2;27128:9;27124:18;27115:6;27071:72;:::i;:::-;27190:9;27184:4;27180:20;27175:2;27164:9;27160:18;27153:48;27218:76;27289:4;27280:6;27218:76;:::i;:::-;27210:84;;26845:456;;;;;;;:::o;27307:549::-;;27522:2;27511:9;27507:18;27499:26;;27535:79;27611:1;27600:9;27596:17;27587:6;27535:79;:::i;:::-;27624:72;27692:2;27681:9;27677:18;27668:6;27624:72;:::i;:::-;27743:9;27737:4;27733:20;27728:2;27717:9;27713:18;27706:48;27771:78;27844:4;27835:6;27771:78;:::i;:::-;27763:86;;27489:367;;;;;;:::o;27862:413::-;;28063:2;28052:9;28048:18;28040:26;;28112:9;28106:4;28102:20;28098:1;28087:9;28083:17;28076:47;28140:128;28263:4;28254:6;28140:128;:::i;:::-;28132:136;;28030:245;;;;:::o;28281:373::-;;28462:2;28451:9;28447:18;28439:26;;28511:9;28505:4;28501:20;28497:1;28486:9;28482:17;28475:47;28539:108;28642:4;28633:6;28539:108;:::i;:::-;28531:116;;28429:225;;;;:::o;28660:210::-;;28785:2;28774:9;28770:18;28762:26;;28798:65;28860:1;28849:9;28845:17;28836:6;28798:65;:::i;:::-;28752:118;;;;:::o;28876:313::-;;29027:2;29016:9;29012:18;29004:26;;29076:9;29070:4;29066:20;29062:1;29051:9;29047:17;29040:47;29104:78;29177:4;29168:6;29104:78;:::i;:::-;29096:86;;28994:195;;;;:::o;29195:307::-;;29343:2;29332:9;29328:18;29320:26;;29392:9;29386:4;29382:20;29378:1;29367:9;29363:17;29356:47;29420:75;29490:4;29481:6;29420:75;:::i;:::-;29412:83;;29310:192;;;;:::o;29508:419::-;;29712:2;29701:9;29697:18;29689:26;;29761:9;29755:4;29751:20;29747:1;29736:9;29732:17;29725:47;29789:131;29915:4;29789:131;:::i;:::-;29781:139;;29679:248;;;:::o;29933:419::-;;30137:2;30126:9;30122:18;30114:26;;30186:9;30180:4;30176:20;30172:1;30161:9;30157:17;30150:47;30214:131;30340:4;30214:131;:::i;:::-;30206:139;;30104:248;;;:::o;30358:419::-;;30562:2;30551:9;30547:18;30539:26;;30611:9;30605:4;30601:20;30597:1;30586:9;30582:17;30575:47;30639:131;30765:4;30639:131;:::i;:::-;30631:139;;30529:248;;;:::o;30783:419::-;;30987:2;30976:9;30972:18;30964:26;;31036:9;31030:4;31026:20;31022:1;31011:9;31007:17;31000:47;31064:131;31190:4;31064:131;:::i;:::-;31056:139;;30954:248;;;:::o;31208:419::-;;31412:2;31401:9;31397:18;31389:26;;31461:9;31455:4;31451:20;31447:1;31436:9;31432:17;31425:47;31489:131;31615:4;31489:131;:::i;:::-;31481:139;;31379:248;;;:::o;31633:419::-;;31837:2;31826:9;31822:18;31814:26;;31886:9;31880:4;31876:20;31872:1;31861:9;31857:17;31850:47;31914:131;32040:4;31914:131;:::i;:::-;31906:139;;31804:248;;;:::o;32058:419::-;;32262:2;32251:9;32247:18;32239:26;;32311:9;32305:4;32301:20;32297:1;32286:9;32282:17;32275:47;32339:131;32465:4;32339:131;:::i;:::-;32331:139;;32229:248;;;:::o;32483:419::-;;32687:2;32676:9;32672:18;32664:26;;32736:9;32730:4;32726:20;32722:1;32711:9;32707:17;32700:47;32764:131;32890:4;32764:131;:::i;:::-;32756:139;;32654:248;;;:::o;32908:419::-;;33112:2;33101:9;33097:18;33089:26;;33161:9;33155:4;33151:20;33147:1;33136:9;33132:17;33125:47;33189:131;33315:4;33189:131;:::i;:::-;33181:139;;33079:248;;;:::o;33333:419::-;;33537:2;33526:9;33522:18;33514:26;;33586:9;33580:4;33576:20;33572:1;33561:9;33557:17;33550:47;33614:131;33740:4;33614:131;:::i;:::-;33606:139;;33504:248;;;:::o;33758:419::-;;33962:2;33951:9;33947:18;33939:26;;34011:9;34005:4;34001:20;33997:1;33986:9;33982:17;33975:47;34039:131;34165:4;34039:131;:::i;:::-;34031:139;;33929:248;;;:::o;34183:419::-;;34387:2;34376:9;34372:18;34364:26;;34436:9;34430:4;34426:20;34422:1;34411:9;34407:17;34400:47;34464:131;34590:4;34464:131;:::i;:::-;34456:139;;34354:248;;;:::o;34608:419::-;;34812:2;34801:9;34797:18;34789:26;;34861:9;34855:4;34851:20;34847:1;34836:9;34832:17;34825:47;34889:131;35015:4;34889:131;:::i;:::-;34881:139;;34779:248;;;:::o;35033:419::-;;35237:2;35226:9;35222:18;35214:26;;35286:9;35280:4;35276:20;35272:1;35261:9;35257:17;35250:47;35314:131;35440:4;35314:131;:::i;:::-;35306:139;;35204:248;;;:::o;35458:419::-;;35662:2;35651:9;35647:18;35639:26;;35711:9;35705:4;35701:20;35697:1;35686:9;35682:17;35675:47;35739:131;35865:4;35739:131;:::i;:::-;35731:139;;35629:248;;;:::o;35883:419::-;;36087:2;36076:9;36072:18;36064:26;;36136:9;36130:4;36126:20;36122:1;36111:9;36107:17;36100:47;36164:131;36290:4;36164:131;:::i;:::-;36156:139;;36054:248;;;:::o;36308:419::-;;36512:2;36501:9;36497:18;36489:26;;36561:9;36555:4;36551:20;36547:1;36536:9;36532:17;36525:47;36589:131;36715:4;36589:131;:::i;:::-;36581:139;;36479:248;;;:::o;36733:419::-;;36937:2;36926:9;36922:18;36914:26;;36986:9;36980:4;36976:20;36972:1;36961:9;36957:17;36950:47;37014:131;37140:4;37014:131;:::i;:::-;37006:139;;36904:248;;;:::o;37158:419::-;;37362:2;37351:9;37347:18;37339:26;;37411:9;37405:4;37401:20;37397:1;37386:9;37382:17;37375:47;37439:131;37565:4;37439:131;:::i;:::-;37431:139;;37329:248;;;:::o;37583:419::-;;37787:2;37776:9;37772:18;37764:26;;37836:9;37830:4;37826:20;37822:1;37811:9;37807:17;37800:47;37864:131;37990:4;37864:131;:::i;:::-;37856:139;;37754:248;;;:::o;38008:419::-;;38212:2;38201:9;38197:18;38189:26;;38261:9;38255:4;38251:20;38247:1;38236:9;38232:17;38225:47;38289:131;38415:4;38289:131;:::i;:::-;38281:139;;38179:248;;;:::o;38433:419::-;;38637:2;38626:9;38622:18;38614:26;;38686:9;38680:4;38676:20;38672:1;38661:9;38657:17;38650:47;38714:131;38840:4;38714:131;:::i;:::-;38706:139;;38604:248;;;:::o;38858:419::-;;39062:2;39051:9;39047:18;39039:26;;39111:9;39105:4;39101:20;39097:1;39086:9;39082:17;39075:47;39139:131;39265:4;39139:131;:::i;:::-;39131:139;;39029:248;;;:::o;39283:419::-;;39487:2;39476:9;39472:18;39464:26;;39536:9;39530:4;39526:20;39522:1;39511:9;39507:17;39500:47;39564:131;39690:4;39564:131;:::i;:::-;39556:139;;39454:248;;;:::o;39708:419::-;;39912:2;39901:9;39897:18;39889:26;;39961:9;39955:4;39951:20;39947:1;39936:9;39932:17;39925:47;39989:131;40115:4;39989:131;:::i;:::-;39981:139;;39879:248;;;:::o;40133:419::-;;40337:2;40326:9;40322:18;40314:26;;40386:9;40380:4;40376:20;40372:1;40361:9;40357:17;40350:47;40414:131;40540:4;40414:131;:::i;:::-;40406:139;;40304:248;;;:::o;40558:419::-;;40762:2;40751:9;40747:18;40739:26;;40811:9;40805:4;40801:20;40797:1;40786:9;40782:17;40775:47;40839:131;40965:4;40839:131;:::i;:::-;40831:139;;40729:248;;;:::o;40983:419::-;;41187:2;41176:9;41172:18;41164:26;;41236:9;41230:4;41226:20;41222:1;41211:9;41207:17;41200:47;41264:131;41390:4;41264:131;:::i;:::-;41256:139;;41154:248;;;:::o;41408:419::-;;41612:2;41601:9;41597:18;41589:26;;41661:9;41655:4;41651:20;41647:1;41636:9;41632:17;41625:47;41689:131;41815:4;41689:131;:::i;:::-;41681:139;;41579:248;;;:::o;41833:419::-;;42037:2;42026:9;42022:18;42014:26;;42086:9;42080:4;42076:20;42072:1;42061:9;42057:17;42050:47;42114:131;42240:4;42114:131;:::i;:::-;42106:139;;42004:248;;;:::o;42258:419::-;;42462:2;42451:9;42447:18;42439:26;;42511:9;42505:4;42501:20;42497:1;42486:9;42482:17;42475:47;42539:131;42665:4;42539:131;:::i;:::-;42531:139;;42429:248;;;:::o;42683:419::-;;42887:2;42876:9;42872:18;42864:26;;42936:9;42930:4;42926:20;42922:1;42911:9;42907:17;42900:47;42964:131;43090:4;42964:131;:::i;:::-;42956:139;;42854:248;;;:::o;43108:222::-;;43239:2;43228:9;43224:18;43216:26;;43252:71;43320:1;43309:9;43305:17;43296:6;43252:71;:::i;:::-;43206:124;;;;:::o;43336:278::-;;43402:2;43396:9;43386:19;;43444:4;43436:6;43432:17;43551:6;43539:10;43536:22;43515:18;43503:10;43500:34;43497:62;43494:2;;;43562:13;;:::i;:::-;43494:2;43597:10;43593:2;43586:22;43376:238;;;;:::o;43620:326::-;;43771:18;43763:6;43760:30;43757:2;;;43793:13;;:::i;:::-;43757:2;43873:4;43869:9;43862:4;43854:6;43850:17;43846:33;43838:41;;43934:4;43928;43924:15;43916:23;;43686:260;;;:::o;43952:327::-;;44104:18;44096:6;44093:30;44090:2;;;44126:13;;:::i;:::-;44090:2;44206:4;44202:9;44195:4;44187:6;44183:17;44179:33;44171:41;;44267:4;44261;44257:15;44249:23;;44019:260;;;:::o;44285:142::-;;44385:3;44377:11;;44415:4;44410:3;44406:14;44398:22;;44367:60;;;:::o;44433:132::-;;44523:3;44515:11;;44553:4;44548:3;44544:14;44536:22;;44505:60;;;:::o;44571:144::-;;44646:3;44638:11;;44669:3;44666:1;44659:14;44703:4;44700:1;44690:18;44682:26;;44628:87;;;:::o;44721:141::-;;44793:3;44785:11;;44816:3;44813:1;44806:14;44850:4;44847:1;44837:18;44829:26;;44775:87;;;:::o;44868:124::-;;44979:5;44973:12;44963:22;;44952:40;;;:::o;44998:114::-;;45099:5;45093:12;45083:22;;45072:40;;;:::o;45118:98::-;;45203:5;45197:12;45187:22;;45176:40;;;:::o;45222:99::-;;45308:5;45302:12;45292:22;;45281:40;;;:::o;45327:123::-;;45439:4;45434:3;45430:14;45422:22;;45412:38;;;:::o;45456:113::-;;45558:4;45553:3;45549:14;45541:22;;45531:38;;;:::o;45575:194::-;;45718:6;45713:3;45706:19;45758:4;45753:3;45749:14;45734:29;;45696:73;;;;:::o;45775:184::-;;45908:6;45903:3;45896:19;45948:4;45943:3;45939:14;45924:29;;45886:73;;;;:::o;45965:168::-;;46082:6;46077:3;46070:19;46122:4;46117:3;46113:14;46098:29;;46060:73;;;;:::o;46139:147::-;;46277:3;46262:18;;46252:34;;;;:::o;46292:159::-;;46400:6;46395:3;46388:19;46440:4;46435:3;46431:14;46416:29;;46378:73;;;;:::o;46457:169::-;;46575:6;46570:3;46563:19;46615:4;46610:3;46606:14;46591:29;;46553:73;;;;:::o;46632:148::-;;46771:3;46756:18;;46746:34;;;;:::o;46786:96::-;;46852:24;46870:5;46852:24;:::i;:::-;46841:35;;46831:51;;;:::o;46888:104::-;;46962:24;46980:5;46962:24;:::i;:::-;46951:35;;46941:51;;;:::o;46998:90::-;;47075:5;47068:13;47061:21;47050:32;;47040:48;;;:::o;47094:77::-;;47160:5;47149:16;;47139:32;;;:::o;47177:149::-;;47253:66;47246:5;47242:78;47231:89;;47221:105;;;:::o;47332:126::-;;47409:42;47402:5;47398:54;47387:65;;47377:81;;;:::o;47464:77::-;;47530:5;47519:16;;47509:32;;;:::o;47547:134::-;;47638:37;47669:5;47638:37;:::i;:::-;47625:50;;47615:66;;;:::o;47687:126::-;;47770:37;47801:5;47770:37;:::i;:::-;47757:50;;47747:66;;;:::o;47819:113::-;;47902:24;47920:5;47902:24;:::i;:::-;47889:37;;47879:53;;;:::o;47938:154::-;48022:6;48017:3;48012;47999:30;48084:1;48075:6;48070:3;48066:16;48059:27;47989:103;;;:::o;48098:307::-;48166:1;48176:113;48190:6;48187:1;48184:13;48176:113;;;48275:1;48270:3;48266:11;48260:18;48256:1;48251:3;48247:11;48240:39;48212:2;48209:1;48205:10;48200:15;;48176:113;;;48307:6;48304:1;48301:13;48298:2;;;48387:1;48378:6;48373:3;48369:16;48362:27;48298:2;48147:258;;;;:::o;48411:48::-;48444:9;48465:102;;48557:2;48553:7;48548:2;48541:5;48537:14;48533:28;48523:38;;48513:54;;;:::o;48573:122::-;48646:24;48664:5;48646:24;:::i;:::-;48639:5;48636:35;48626:2;;48685:1;48682;48675:12;48626:2;48616:79;:::o;48701:116::-;48771:21;48786:5;48771:21;:::i;:::-;48764:5;48761:32;48751:2;;48807:1;48804;48797:12;48751:2;48741:76;:::o;48823:122::-;48896:24;48914:5;48896:24;:::i;:::-;48889:5;48886:35;48876:2;;48935:1;48932;48925:12;48876:2;48866:79;:::o;48951:120::-;49023:23;49040:5;49023:23;:::i;:::-;49016:5;49013:34;49003:2;;49061:1;49058;49051:12;49003:2;48993:78;:::o;49077:122::-;49150:24;49168:5;49150:24;:::i;:::-;49143:5;49140:35;49130:2;;49189:1;49186;49179:12;49130:2;49120:79;:::o

Swarm Source

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