ETH Price: $3,297.96 (-3.34%)
Gas: 19 Gwei

Token

HydraBlobs (BLOB)
 

Overview

Max Total Supply

544 BLOB

Holders

172

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 BLOB
0xe65ba2667f6cdab2e3f9f202972be47c3737811d
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:
HydraBlobs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT


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



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: contracts/HydraBlobs.sol


pragma solidity ^0.8.0;






/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

contract HydraBlobs is ERC721, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdTracker;
    Counters.Counter private _burnedTracker;

    string[] private _paths;

    uint256 public constant MAX_STEALTH_ELEMENTS = 500;    
    uint256 public constant MAX_GENESIS_ELEMENTS = 5555;
    uint256 public constant MAX_ELEMENTS         = 20000;    
    uint256 public constant MINT_GENESIS_PRICE   = 55000000000000000; // 0.055 ETH
    uint256 public constant BASE_BURN_PRICE      = 55000000000000000; // 0.055 ETH, grows over time

string[] private blobColors = [
    "rgba(255, 0, 102, 1)",
    "rgba(138, 63, 252, 1)",
    "rgba(250, 77, 86, 1)",
    "rgba(241, 194, 27, 1)",
    "rgba(8, 189, 186, 1)",
    "rgba(15, 98, 254, 1)",
    "rgba(36, 161, 72, 1)"
];

string[] private blobBackgrounds = [
    "rgb(167, 240, 186, 1)",
    "rgb(158, 240, 240, 1)",
    "rgb(186, 230, 255, 1)",
    "rgb(208, 226, 255, 1)",
    "rgb(232, 218, 255, 1)",
    "rgb(255, 214, 232, 1)",
    "rgb(242, 244, 248, 1)"
];

string[] private transforms = [
    "0.3",
    "0.4",
    "0.5",
    "0.6",
    "0.7",
    "0.8",
    "0.9",
    "1",
    "1.1",
    "1.2",
    "1.3"
];

string[] private durSecs = [
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
];
    
    event CreateHydraBlobs(uint256 indexed id);

    constructor() public ERC721("HydraBlobs", "BLOB") {}

    function totalSupply() public view returns (uint256) {
        return  _totalSupply() - _totalBurned();
    }

    function _totalSupply() internal view returns (uint256) {
        return _tokenIdTracker.current();
    }
    
    function _totalBurned() internal view returns (uint256) {
        return _burnedTracker.current();
    }
    
    function totalBurned() public view returns (uint256) {
        return _totalBurned();
    }

    function totalMint() public view returns (uint256) {
        return _totalSupply();
    }

    function mintStealth(string memory _path) public payable {
        uint256 total = _totalSupply();
        require(total + 1 <= MAX_STEALTH_ELEMENTS, "Max stealth limit");
        require(total <= MAX_STEALTH_ELEMENTS, "Stealth sale end");

        _paths.push(_path);
        _mintAnElement(msg.sender);
    }

    function mintGenesis(string memory _path) public payable {
        uint256 total = _totalSupply();
        require(total + 1 <= MAX_GENESIS_ELEMENTS, "Max genesis limit");
        require(total <= MAX_GENESIS_ELEMENTS, "Genesis sale end");
        require(msg.value >= MINT_GENESIS_PRICE, "Value below price");

        _paths.push(_path);
        _mintAnElement(msg.sender);
    }

    function _mintAnElement(address _to) private {
        uint256 id = _totalSupply();
        _tokenIdTracker.increment();
        _safeMint(_to, id);
        emit CreateHydraBlobs(id);
    }

    /**
     * @dev Returns an URI for a given token ID
     */
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
      require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

      string memory colorOne = getRandomColor(_tokenId, "BLOB COLOR ONE", blobColors);
      string memory colorTwo = getRandomColor(_tokenId, "BLOB COLOR TWO", blobColors);
      address tokenOwner = ERC721.ownerOf(_tokenId);
      // burned blobs turn red
      if (tokenOwner == 0x000000000000000000000000000000000000dEaD) {
        colorOne = 'red';
        colorTwo = 'red';
      }

      string[19] memory parts;
      parts[0] = '<svg viewBox="0 0 100 100" style="background-color:';
      parts[1] = getRandomColor(_tokenId, "BLOB BACKGROUND", blobBackgrounds);
      parts[2] = '" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="sw-gradient" x1="0" x2="1" y1="1" y2="0"><stop id="stop1" stop-color="';
      parts[3] = colorOne;
      parts[4] = '" offset="0%"></stop><stop id="stop2" stop-color="';
      parts[5] = colorTwo;
      parts[6] = '" offset="100%"></stop></linearGradient></defs><path fill="url(#sw-gradient)" d="';
      parts[7] = _paths[_tokenId];
      parts[8] = '" width="100%" height="100%" transform="translate(50 50)" stroke-width="0" style="transition: all 0.3s ease 0s;"><animateTransform attributeName="transform" type="scale" additive="sum"  from="';
      parts[9] = getRandom(_tokenId, "TRANSFORMS TO 1", transforms);
      parts[10] = ' ';
      parts[11] = getRandom(_tokenId, "TRANSFORMS TO 2", transforms);
      parts[12] = '" to="';
      parts[13] = getRandom(_tokenId, "TRANSFORMS FROM 1", transforms);
      parts[14] = ' ';
      parts[15] = getRandom(_tokenId, "TRANSFORMS FROM 2", transforms);
      parts[16] = '" begin="0s" dur="';
      parts[17] = getRandom(_tokenId, "ANIMATION DURATION", durSecs);
      parts[18] = 's" repeatCount="indefinite"/></path></svg>';

      string memory isStealth = 'NO';
      string memory isGenesis = 'NO';
      if (_tokenId <= MAX_STEALTH_ELEMENTS) {
          isStealth = 'YES';
      }
      if (_tokenId <= MAX_GENESIS_ELEMENTS) {
          isGenesis = 'YES';
      }

      string memory svg = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
      svg = string(abi.encodePacked(svg, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16], parts[17], parts[18]));
      string memory svgUri  = string(abi.encodePacked('data:image/svg+xml;base64,', Base64.encode(abi.encodePacked(svg))));
      string memory json    = Base64.encode(abi.encodePacked('{"name":"Blob #', Strings.toString(_tokenId), '", "description": "Animated blobs generated and stored on-chain.",  "image":"', svgUri, '"', ', "attributes":[{"trait_type":"background","value":"',parts[1],'"},{"trait_type":"color one","value":"',parts[3],'"},{"trait_type":"color two","value":"',parts[5],'"},{"trait_type":"animation duration","value":"',parts[17],'"},{"trait_type":"stealth","value":"',isStealth,'"},{"trait_type":"genesis","value":"',isGenesis,'"}]}'));
      string memory jsonUri = string(abi.encodePacked("data:application/json;base64,", json));

      return jsonUri;
    }

    function getRandom(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal pure returns (string memory) {
        uint256 rand = uint256(keccak256(abi.encodePacked(keyPrefix, Strings.toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        return output;
    }
    
    function getRandomColor(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal pure returns (string memory) {
        uint256 rand = uint256(keccak256(abi.encodePacked(keyPrefix, Strings.toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 1000;
        if (greatness == 69) {
            output = "rgb(0, 0, 0)";
        }
        if (greatness == 420) {
            output = "rgb(0, 0, 0)";
        }
        if (greatness == 33) {
            output = "rgb(255, 255, 255)";
        }
        return output;
    }

    function getBurnPrice() public view returns (uint256) {
        return BASE_BURN_PRICE * ((_totalBurned() / 50) + 1);
    }

    /**
     * @dev Burns one and get two. A random genesis token holder will be sent the ETH it takes to burns.
     * @param _tokenId The token to burn.
     */
    function burn(uint256 _tokenId) public payable {
        uint256 total = _totalSupply();
        require(total + 1 <= MAX_ELEMENTS, "Max burn limit");
        require(total <= MAX_ELEMENTS, "Burn end");
        require(ownerOf(_tokenId) == msg.sender);
        require(msg.value >= getBurnPrice(), "Value below price");

        //Burn token
        _transfer(
            msg.sender,
            0x000000000000000000000000000000000000dEaD,
            _tokenId
        );
        
        // increment burn
        _burnedTracker.increment();

        // find the bounty winner
        uint256 rand = uint256(keccak256(abi.encodePacked(Strings.toString(_tokenId))));
        uint256 randWinner = rand % MAX_GENESIS_ELEMENTS;
        uint256 bountyWinnerTokenId = randWinner % _totalSupply();
        address bountyWinner = ERC721.ownerOf(bountyWinnerTokenId);
        if (bountyWinner != 0x000000000000000000000000000000000000dEaD) {
            _widthdraw(bountyWinner, msg.value);
        }

        // mint two new elements
        _paths.push(_paths[_tokenId]);
        _mintAnElement(msg.sender);

        _paths.push(_paths[bountyWinnerTokenId]);
        _mintAnElement(msg.sender);
    }

    function withdrawAll() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        _widthdraw(msg.sender, address(this).balance);
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CreateHydraBlobs","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_BURN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GENESIS_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STEALTH_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_GENESIS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_path","type":"string"}],"name":"mintGenesis","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_path","type":"string"}],"name":"mintStealth","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","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":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060e001604052806040518060400160405280601481526020017f72676261283235352c20302c203130322c20312900000000000000000000000081525081526020016040518060400160405280601581526020017f72676261283133382c2036332c203235322c203129000000000000000000000081525081526020016040518060400160405280601481526020017f72676261283235302c2037372c2038362c20312900000000000000000000000081525081526020016040518060400160405280601581526020017f72676261283234312c203139342c2032372c203129000000000000000000000081525081526020016040518060400160405280601481526020017f7267626128382c203138392c203138362c20312900000000000000000000000081525081526020016040518060400160405280601481526020017f726762612831352c2039382c203235342c20312900000000000000000000000081525081526020016040518060400160405280601481526020017f726762612833362c203136312c2037322c203129000000000000000000000000815250815250600a906007620001bc9291906200093c565b506040518060e001604052806040518060400160405280601581526020017f726762283136372c203234302c203138362c203129000000000000000000000081525081526020016040518060400160405280601581526020017f726762283135382c203234302c203234302c203129000000000000000000000081525081526020016040518060400160405280601581526020017f726762283138362c203233302c203235352c203129000000000000000000000081525081526020016040518060400160405280601581526020017f726762283230382c203232362c203235352c203129000000000000000000000081525081526020016040518060400160405280601581526020017f726762283233322c203231382c203235352c203129000000000000000000000081525081526020016040518060400160405280601581526020017f726762283235352c203231342c203233322c203129000000000000000000000081525081526020016040518060400160405280601581526020017f726762283234322c203234342c203234382c2031290000000000000000000000815250815250600b906007620003759291906200093c565b506040518061016001604052806040518060400160405280600381526020017f302e33000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f302e34000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f302e35000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f302e36000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f302e37000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f302e38000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f302e39000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f312e31000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f312e32000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f312e330000000000000000000000000000000000000000000000000000000000815250815250600c90600b6200061b929190620009a3565b506040518060c001604052806040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f360000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f370000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f3130000000000000000000000000000000000000000000000000000000000000815250815250600d9060066200079992919062000a0a565b50348015620007a757600080fd5b506040518060400160405280600a81526020017f4879647261426c6f6273000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f424c4f420000000000000000000000000000000000000000000000000000000081525081600090805190602001906200082c92919062000a71565b5080600190805190602001906200084592919062000a71565b505050620008686200085c6200086e60201b60201c565b6200087660201b60201c565b62000bf4565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000990579160200282015b828111156200098f5782518290805190602001906200097e92919062000a71565b50916020019190600101906200095d565b5b5090506200099f919062000b02565b5090565b828054828255906000526020600020908101928215620009f7579160200282015b82811115620009f6578251829080519060200190620009e592919062000a71565b5091602001919060010190620009c4565b5b50905062000a06919062000b02565b5090565b82805482825590600052602060002090810192821562000a5e579160200282015b8281111562000a5d57825182908051906020019062000a4c92919062000a71565b509160200191906001019062000a2b565b5b50905062000a6d919062000b02565b5090565b82805462000a7f9062000b8f565b90600052602060002090601f01602090048101928262000aa3576000855562000aef565b82601f1062000abe57805160ff191683800117855562000aef565b8280016001018555821562000aef579182015b8281111562000aee57825182559160200191906001019062000ad1565b5b50905062000afe919062000b2a565b5090565b5b8082111562000b26576000818162000b1c919062000b49565b5060010162000b03565b5090565b5b8082111562000b4557600081600090555060010162000b2b565b5090565b50805462000b579062000b8f565b6000825580601f1062000b6b575062000b8c565b601f01602090049060005260206000209081019062000b8b919062000b2a565b5b50565b6000600282049050600182168062000ba857607f821691505b6020821081141562000bbf5762000bbe62000bc5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6159e48062000c046000396000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063b88d4fde11610095578063e7806f1511610064578063e7806f15146105f7578063e985e9c514610613578063f2fde38b14610650578063ffa7264f14610679576101c2565b8063b88d4fde1461053b578063c87b56dd14610564578063d89135cd146105a1578063e659c647146105cc576101c2565b80638da5cb5b116100d15780638da5cb5b1461049157806395d89b41146104bc578063a22cb465146104e7578063b0cd807914610510576101c2565b806370a0823114610433578063715018a614610470578063853828b614610487576101c2565b806323cbe1cb1161016457806342842e0e1161013e57806342842e0e1461038657806342966c68146103af57806359a7715a146103cb5780636352211e146103f6576101c2565b806323cbe1cb146103145780632ae6218d146103305780633502a7161461035b576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806318b45b85146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613ca7565b6106a4565b6040516101fb9190614649565b60405180910390f35b34801561021057600080fd5b50610219610786565b6040516102269190614664565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613d4a565b610818565b60405161026391906145e2565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613c67565b61089d565b005b3480156102a157600080fd5b506102aa6109b5565b6040516102b79190614986565b60405180910390f35b3480156102cc57600080fd5b506102d56109d6565b6040516102e29190614986565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190613b51565b6109e1565b005b61032e60048036038101906103299190613d01565b610a41565b005b34801561033c57600080fd5b50610345610b76565b6040516103529190614986565b60405180910390f35b34801561036757600080fd5b50610370610baf565b60405161037d9190614986565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613b51565b610bb5565b005b6103c960048036038101906103c49190613d4a565b610bd5565b005b3480156103d757600080fd5b506103e0610e96565b6040516103ed9190614986565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190613d4a565b610ea5565b60405161042a91906145e2565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613ae4565b610f57565b6040516104679190614986565b60405180910390f35b34801561047c57600080fd5b5061048561100f565b005b61048f611097565b005b34801561049d57600080fd5b506104a6611132565b6040516104b391906145e2565b60405180910390f35b3480156104c857600080fd5b506104d161115c565b6040516104de9190614664565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613c27565b6111ee565b005b34801561051c57600080fd5b5061052561136f565b6040516105329190614986565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190613ba4565b611375565b005b34801561057057600080fd5b5061058b60048036038101906105869190613d4a565b6113d7565b6040516105989190614664565b60405180910390f35b3480156105ad57600080fd5b506105b66125e5565b6040516105c39190614986565b60405180910390f35b3480156105d857600080fd5b506105e16125f4565b6040516105ee9190614986565b60405180910390f35b610611600480360381019061060c9190613d01565b6125ff565b005b34801561061f57600080fd5b5061063a60048036038101906106359190613b11565b6126ea565b6040516106479190614649565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190613ae4565b61277e565b005b34801561068557600080fd5b5061068e612876565b60405161069b9190614986565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061077f575061077e8261287c565b5b9050919050565b60606000805461079590614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190614c41565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b6000610823826128e6565b610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990614826565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a882610ea5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091090614926565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610938612952565b73ffffffffffffffffffffffffffffffffffffffff161480610967575061096681610961612952565b6126ea565b5b6109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d906147a6565b60405180910390fd5b6109b0838361295a565b505050565b60006109bf612a13565b6109c7612a24565b6109d19190614b57565b905090565b66c3663566a5800081565b6109f26109ec612952565b82612a35565b610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2890614966565b60405180910390fd5b610a3c838383612b13565b505050565b6000610a4b612a24565b90506115b3600182610a5d9190614a76565b1115610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590614786565b60405180910390fd5b6115b3811115610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada906148c6565b60405180910390fd5b66c3663566a58000341015610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906148e6565b60405180910390fd5b600982908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610b68929190613843565b50610b7233612d6f565b5050565b600060016032610b84612a13565b610b8e9190614acc565b610b989190614a76565b66c3663566a58000610baa9190614afd565b905090565b614e2081565b610bd083838360405180602001604052806000815250611375565b505050565b6000610bdf612a24565b9050614e20600182610bf19190614a76565b1115610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990614746565b60405180910390fd5b614e20811115610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e906146e6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610c9783610ea5565b73ffffffffffffffffffffffffffffffffffffffff1614610cb757600080fd5b610cbf610b76565b341015610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906148e6565b60405180910390fd5b610d0e3361dead84612b13565b610d186008612dc0565b6000610d2383612dd6565b604051602001610d339190614356565b6040516020818303038152906040528051906020012060001c905060006115b382610d5e9190614ced565b90506000610d6a612a24565b82610d759190614ced565b90506000610d8282610ea5565b905061dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dc457610dc38134612f37565b5b6009808781548110610dd957610dd8614dab565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e1490614c41565b610e1f9291906138c9565b50610e2933612d6f565b6009808381548110610e3e57610e3d614dab565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e7990614c41565b610e849291906138c9565b50610e8e33612d6f565b505050505050565b6000610ea0612a24565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906147e6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf906147c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611017612952565b73ffffffffffffffffffffffffffffffffffffffff16611035611132565b73ffffffffffffffffffffffffffffffffffffffff161461108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290614846565b60405180910390fd5b6110956000612fe8565b565b61109f612952565b73ffffffffffffffffffffffffffffffffffffffff166110bd611132565b73ffffffffffffffffffffffffffffffffffffffff1614611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90614846565b60405180910390fd5b60004790506000811161112557600080fd5b61112f3347612f37565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116b90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461119790614c41565b80156111e45780601f106111b9576101008083540402835291602001916111e4565b820191906000526020600020905b8154815290600101906020018083116111c757829003601f168201915b5050505050905090565b6111f6612952565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614726565b60405180910390fd5b8060056000611271612952565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661131e612952565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113639190614649565b60405180910390a35050565b6101f481565b611386611380612952565b83612a35565b6113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc90614966565b60405180910390fd5b6113d1848484846130ae565b50505050565b60606113e2826128e6565b611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890614886565b60405180910390fd5b6000611534836040518060400160405280600e81526020017f424c4f4220434f4c4f52204f4e45000000000000000000000000000000000000815250600a805480602002602001604051908101604052809291908181526020016000905b8282101561152b57838290600052602060002001805461149e90614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca90614c41565b80156115175780601f106114ec57610100808354040283529160200191611517565b820191906000526020600020905b8154815290600101906020018083116114fa57829003601f168201915b50505050508152602001906001019061147f565b5050505061310a565b90506000611649846040518060400160405280600e81526020017f424c4f4220434f4c4f522054574f000000000000000000000000000000000000815250600a805480602002602001604051908101604052809291908181526020016000905b828210156116405783829060005260206000200180546115b390614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546115df90614c41565b801561162c5780601f106116015761010080835404028352916020019161162c565b820191906000526020600020905b81548152906001019060200180831161160f57829003601f168201915b505050505081526020019060010190611594565b5050505061310a565b9050600061165685610ea5565b905061dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ff576040518060400160405280600381526020017f726564000000000000000000000000000000000000000000000000000000000081525092506040518060400160405280600381526020017f726564000000000000000000000000000000000000000000000000000000000081525091505b611707613956565b6040518060600160405280603381526020016158e0603391398160006013811061173457611733614dab565b5b602002018190525061184d866040518060400160405280600f81526020017f424c4f42204241434b47524f554e440000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b828210156118445783829060005260206000200180546117b790614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546117e390614c41565b80156118305780601f1061180557610100808354040283529160200191611830565b820191906000526020600020905b81548152906001019060200180831161181357829003601f168201915b505050505081526020019060010190611798565b5050505061310a565b8160016013811061186157611860614dab565b5b60200201819052506040518060c001604052806085815260200161574a608591398160026013811061189657611895614dab565b5b602002018190525083816003601381106118b3576118b2614dab565b5b602002018190525060405180606001604052806032815260200161595360329139816004601381106118e8576118e7614dab565b5b6020020181905250828160056013811061190557611904614dab565b5b60200201819052506040518060800160405280605181526020016157cf605191398160066013811061193a57611939614dab565b5b60200201819052506009868154811061195657611955614dab565b5b90600052602060002001805461196b90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461199790614c41565b80156119e45780601f106119b9576101008083540402835291602001916119e4565b820191906000526020600020905b8154815290600101906020018083116119c757829003601f168201915b5050505050816007601381106119fd576119fc614dab565b5b60200201819052506040518060e0016040528060c0815260200161582060c0913981600860138110611a3257611a31614dab565b5b6020020181905250611b4b866040518060400160405280600f81526020017f5452414e53464f524d5320544f20310000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611b42578382906000526020600020018054611ab590614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae190614c41565b8015611b2e5780601f10611b0357610100808354040283529160200191611b2e565b820191906000526020600020905b815481529060010190602001808311611b1157829003601f168201915b505050505081526020019060010190611a96565b50505050613255565b81600960138110611b5f57611b5e614dab565b5b60200201819052506040518060400160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525081600a60138110611bb157611bb0614dab565b5b6020020181905250611cca866040518060400160405280600f81526020017f5452414e53464f524d5320544f20320000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611cc1578382906000526020600020018054611c3490614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6090614c41565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b505050505081526020019060010190611c15565b50505050613255565b81600b60138110611cde57611cdd614dab565b5b60200201819052506040518060400160405280600681526020017f2220746f3d22000000000000000000000000000000000000000000000000000081525081600c60138110611d3057611d2f614dab565b5b6020020181905250611e49866040518060400160405280601181526020017f5452414e53464f524d532046524f4d2031000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611e40578382906000526020600020018054611db390614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611ddf90614c41565b8015611e2c5780601f10611e0157610100808354040283529160200191611e2c565b820191906000526020600020905b815481529060010190602001808311611e0f57829003601f168201915b505050505081526020019060010190611d94565b50505050613255565b81600d60138110611e5d57611e5c614dab565b5b60200201819052506040518060400160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525081600e60138110611eaf57611eae614dab565b5b6020020181905250611fc8866040518060400160405280601181526020017f5452414e53464f524d532046524f4d2032000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611fbf578382906000526020600020018054611f3290614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5e90614c41565b8015611fab5780601f10611f8057610100808354040283529160200191611fab565b820191906000526020600020905b815481529060010190602001808311611f8e57829003601f168201915b505050505081526020019060010190611f13565b50505050613255565b81600f60138110611fdc57611fdb614dab565b5b60200201819052506040518060400160405280601281526020017f2220626567696e3d22307322206475723d2200000000000000000000000000008152508160106013811061202e5761202d614dab565b5b6020020181905250612147866040518060400160405280601281526020017f414e494d4154494f4e204455524154494f4e0000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561213e5783829060005260206000200180546120b190614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546120dd90614c41565b801561212a5780601f106120ff5761010080835404028352916020019161212a565b820191906000526020600020905b81548152906001019060200180831161210d57829003601f168201915b505050505081526020019060010190612092565b50505050613255565b8160116013811061215b5761215a614dab565b5b60200201819052506040518060600160405280602a8152602001615985602a9139816012601381106121905761218f614dab565b5b602002018190525060006040518060400160405280600281526020017f4e4f000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280600281526020017f4e4f00000000000000000000000000000000000000000000000000000000000081525090506101f4881161224e576040518060400160405280600381526020017f594553000000000000000000000000000000000000000000000000000000000081525091505b6115b38811612290576040518060400160405280600381526020017f594553000000000000000000000000000000000000000000000000000000000081525090505b6000836000601381106122a6576122a5614dab565b5b6020020151846001601381106122bf576122be614dab565b5b6020020151856002601381106122d8576122d7614dab565b5b6020020151866003601381106122f1576122f0614dab565b5b60200201518760046013811061230a57612309614dab565b5b60200201518860056013811061232357612322614dab565b5b60200201518960066013811061233c5761233b614dab565b5b60200201518a60076013811061235557612354614dab565b5b60200201518b60086013811061236e5761236d614dab565b5b602002015160405160200161238b99989796959493929190614391565b604051602081830303815290604052905080846009601381106123b1576123b0614dab565b5b602002015185600a601381106123ca576123c9614dab565b5b602002015186600b601381106123e3576123e2614dab565b5b602002015187600c601381106123fc576123fb614dab565b5b602002015188600d6013811061241557612414614dab565b5b602002015189600e6013811061242e5761242d614dab565b5b60200201518a600f6013811061244757612446614dab565b5b60200201518b6010601381106124605761245f614dab565b5b60200201518c60116013811061247957612478614dab565b5b60200201518d60126013811061249257612491614dab565b5b60200201516040516020016124b19b9a99989796959493929190614410565b604051602081830303815290604052905060006124ec826040516020016124d89190614356565b6040516020818303038152906040526132c6565b6040516020016124fc91906145c0565b604051602081830303815290604052905060006125ad61251b8c612dd6565b83886001601381106125305761252f614dab565b5b60200201518960036013811061254957612548614dab565b5b60200201518a60056013811061256257612561614dab565b5b60200201518b60116013811061257b5761257a614dab565b5b60200201518b8b6040516020016125999897969594939291906144e0565b6040516020818303038152906040526132c6565b90506000816040516020016125c291906144a9565b6040516020818303038152906040529050809a5050505050505050505050919050565b60006125ef612a13565b905090565b66c3663566a5800081565b6000612609612a24565b90506101f460018261261b9190614a76565b111561265c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265390614906565b60405180910390fd5b6101f48111156126a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612698906148a6565b60405180910390fd5b6009829080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906126dc929190613843565b506126e633612d6f565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612786612952565b73ffffffffffffffffffffffffffffffffffffffff166127a4611132565b73ffffffffffffffffffffffffffffffffffffffff16146127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190614846565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612861906146a6565b60405180910390fd5b61287381612fe8565b50565b6115b381565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129cd83610ea5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a1f600861343f565b905090565b6000612a30600761343f565b905090565b6000612a40826128e6565b612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614766565b60405180910390fd5b6000612a8a83610ea5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612af957508373ffffffffffffffffffffffffffffffffffffffff16612ae184610818565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b0a5750612b0981856126ea565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b3382610ea5565b73ffffffffffffffffffffffffffffffffffffffff1614612b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8090614866565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090614706565b60405180910390fd5b612c0483838361344d565b612c0f60008261295a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c5f9190614b57565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb69190614a76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612d79612a24565b9050612d856007612dc0565b612d8f8282613452565b807f9650690416bdabe38208d212288e69fc5764a203d8645837b17885c82949ba8e60405160405180910390a25050565b6001816000016000828254019250508190555050565b60606000821415612e1e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f32565b600082905060005b60008214612e50578080612e3990614ca4565b915050600a82612e499190614acc565b9150612e26565b60008167ffffffffffffffff811115612e6c57612e6b614dda565b5b6040519080825280601f01601f191660200182016040528015612e9e5781602001600182028036833780820191505090505b5090505b60008514612f2b57600182612eb79190614b57565b9150600a85612ec69190614ced565b6030612ed29190614a76565b60f81b818381518110612ee857612ee7614dab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f249190614acc565b9450612ea2565b8093505050505b919050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612f5d906144cb565b60006040518083038185875af1925050503d8060008114612f9a576040519150601f19603f3d011682016040523d82523d6000602084013e612f9f565b606091505b5050905080612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90614946565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130b9848484612b13565b6130c584848484613470565b613104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fb90614686565b60405180910390fd5b50505050565b606060008361311886612dd6565b60405160200161312992919061436d565b6040516020818303038152906040528051906020012060001c90506000838451836131549190614ced565b8151811061316557613164614dab565b5b6020026020010151905060006103e88361317f9190614ced565b905060458114156131c3576040518060400160405280600c81526020017f72676228302c20302c203029000000000000000000000000000000000000000081525091505b6101a4811415613206576040518060400160405280600c81526020017f72676228302c20302c203029000000000000000000000000000000000000000081525091505b6021811415613248576040518060400160405280601281526020017f726762283235352c203235352c2032353529000000000000000000000000000081525091505b8193505050509392505050565b606060008361326386612dd6565b60405160200161327492919061436d565b6040516020818303038152906040528051906020012060001c905060008384518361329f9190614ced565b815181106132b0576132af614dab565b5b6020026020010151905080925050509392505050565b60606000825114156132e95760405180602001604052806000815250905061343a565b600060405180606001604052806040815260200161591360409139905060006003600285516133189190614a76565b6133229190614acc565b600461332e9190614afd565b9050600060208261333f9190614a76565b67ffffffffffffffff81111561335857613357614dda565b5b6040519080825280601f01601f19166020018201604052801561338a5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156133f9576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182536001820191505061339e565b60038951066001811461341357600281146134235761342e565b613d3d60f01b600283035261342e565b603d60f81b60018303525b50505050508093505050505b919050565b600081600001549050919050565b505050565b61346c828260405180602001604052806000815250613607565b5050565b60006134918473ffffffffffffffffffffffffffffffffffffffff16613662565b156135fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134ba612952565b8786866040518563ffffffff1660e01b81526004016134dc94939291906145fd565b602060405180830381600087803b1580156134f657600080fd5b505af192505050801561352757506040513d601f19601f820116820180604052508101906135249190613cd4565b60015b6135aa573d8060008114613557576040519150601f19603f3d011682016040523d82523d6000602084013e61355c565b606091505b506000815114156135a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359990614686565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135ff565b600190505b949350505050565b6136118383613675565b61361e6000848484613470565b61365d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365490614686565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dc90614806565b60405180910390fd5b6136ee816128e6565b1561372e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613725906146c6565b60405180910390fd5b61373a6000838361344d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461378a9190614a76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461384f90614c41565b90600052602060002090601f01602090048101928261387157600085556138b8565b82601f1061388a57805160ff19168380011785556138b8565b828001600101855582156138b8579182015b828111156138b757825182559160200191906001019061389c565b5b5090506138c5919061397e565b5090565b8280546138d590614c41565b90600052602060002090601f0160209004810192826138f75760008555613945565b82601f106139085780548555613945565b8280016001018555821561394557600052602060002091601f016020900482015b82811115613944578254825591600101919060010190613929565b5b509050613952919061397e565b5090565b6040518061026001604052806013905b60608152602001906001900390816139665790505090565b5b8082111561399757600081600090555060010161397f565b5090565b60006139ae6139a9846149c6565b6149a1565b9050828152602081018484840111156139ca576139c9614e0e565b5b6139d5848285614bff565b509392505050565b60006139f06139eb846149f7565b6149a1565b905082815260208101848484011115613a0c57613a0b614e0e565b5b613a17848285614bff565b509392505050565b600081359050613a2e816156ed565b92915050565b600081359050613a4381615704565b92915050565b600081359050613a588161571b565b92915050565b600081519050613a6d8161571b565b92915050565b600082601f830112613a8857613a87614e09565b5b8135613a9884826020860161399b565b91505092915050565b600082601f830112613ab657613ab5614e09565b5b8135613ac68482602086016139dd565b91505092915050565b600081359050613ade81615732565b92915050565b600060208284031215613afa57613af9614e18565b5b6000613b0884828501613a1f565b91505092915050565b60008060408385031215613b2857613b27614e18565b5b6000613b3685828601613a1f565b9250506020613b4785828601613a1f565b9150509250929050565b600080600060608486031215613b6a57613b69614e18565b5b6000613b7886828701613a1f565b9350506020613b8986828701613a1f565b9250506040613b9a86828701613acf565b9150509250925092565b60008060008060808587031215613bbe57613bbd614e18565b5b6000613bcc87828801613a1f565b9450506020613bdd87828801613a1f565b9350506040613bee87828801613acf565b925050606085013567ffffffffffffffff811115613c0f57613c0e614e13565b5b613c1b87828801613a73565b91505092959194509250565b60008060408385031215613c3e57613c3d614e18565b5b6000613c4c85828601613a1f565b9250506020613c5d85828601613a34565b9150509250929050565b60008060408385031215613c7e57613c7d614e18565b5b6000613c8c85828601613a1f565b9250506020613c9d85828601613acf565b9150509250929050565b600060208284031215613cbd57613cbc614e18565b5b6000613ccb84828501613a49565b91505092915050565b600060208284031215613cea57613ce9614e18565b5b6000613cf884828501613a5e565b91505092915050565b600060208284031215613d1757613d16614e18565b5b600082013567ffffffffffffffff811115613d3557613d34614e13565b5b613d4184828501613aa1565b91505092915050565b600060208284031215613d6057613d5f614e18565b5b6000613d6e84828501613acf565b91505092915050565b613d8081614b8b565b82525050565b613d8f81614b9d565b82525050565b6000613da082614a28565b613daa8185614a3e565b9350613dba818560208601614c0e565b613dc381614e1d565b840191505092915050565b6000613dd982614a33565b613de38185614a5a565b9350613df3818560208601614c0e565b613dfc81614e1d565b840191505092915050565b6000613e1282614a33565b613e1c8185614a6b565b9350613e2c818560208601614c0e565b80840191505092915050565b6000613e45602f83614a6b565b9150613e5082614e2e565b602f82019050919050565b6000613e68603283614a5a565b9150613e7382614e7d565b604082019050919050565b6000613e8b602683614a5a565b9150613e9682614ecc565b604082019050919050565b6000613eae601c83614a5a565b9150613eb982614f1b565b602082019050919050565b6000613ed1602483614a6b565b9150613edc82614f44565b602482019050919050565b6000613ef4600883614a5a565b9150613eff82614f93565b602082019050919050565b6000613f17602483614a5a565b9150613f2282614fbc565b604082019050919050565b6000613f3a601983614a5a565b9150613f458261500b565b602082019050919050565b6000613f5d603483614a6b565b9150613f6882615034565b603482019050919050565b6000613f80600e83614a5a565b9150613f8b82615083565b602082019050919050565b6000613fa3602c83614a5a565b9150613fae826150ac565b604082019050919050565b6000613fc6601183614a5a565b9150613fd1826150fb565b602082019050919050565b6000613fe9602683614a6b565b9150613ff482615124565b602682019050919050565b600061400c603883614a5a565b915061401782615173565b604082019050919050565b600061402f600183614a6b565b915061403a826151c2565b600182019050919050565b6000614052602a83614a5a565b915061405d826151eb565b604082019050919050565b6000614075602983614a5a565b91506140808261523a565b604082019050919050565b6000614098602083614a5a565b91506140a382615289565b602082019050919050565b60006140bb602483614a6b565b91506140c6826152b2565b602482019050919050565b60006140de602c83614a5a565b91506140e982615301565b604082019050919050565b6000614101602083614a5a565b915061410c82615350565b602082019050919050565b6000614124602983614a5a565b915061412f82615379565b604082019050919050565b6000614147602f83614a5a565b9150614152826153c8565b604082019050919050565b600061416a601083614a5a565b915061417582615417565b602082019050919050565b600061418d601083614a5a565b915061419882615440565b602082019050919050565b60006141b0601183614a5a565b91506141bb82615469565b602082019050919050565b60006141d3601183614a5a565b91506141de82615492565b602082019050919050565b60006141f6602183614a5a565b9150614201826154bb565b604082019050919050565b6000614219601d83614a6b565b91506142248261550a565b601d82019050919050565b600061423c600083614a4f565b915061424782615533565b600082019050919050565b600061425f601083614a5a565b915061426a82615536565b602082019050919050565b6000614282603183614a5a565b915061428d8261555f565b604082019050919050565b60006142a5602683614a6b565b91506142b0826155ae565b602682019050919050565b60006142c8604d83614a6b565b91506142d3826155fd565b604d82019050919050565b60006142eb600f83614a6b565b91506142f682615672565b600f82019050919050565b600061430e600483614a6b565b91506143198261569b565b600482019050919050565b6000614331601a83614a6b565b915061433c826156c4565b601a82019050919050565b61435081614bf5565b82525050565b60006143628284613e07565b915081905092915050565b60006143798285613e07565b91506143858284613e07565b91508190509392505050565b600061439d828c613e07565b91506143a9828b613e07565b91506143b5828a613e07565b91506143c18289613e07565b91506143cd8288613e07565b91506143d98287613e07565b91506143e58286613e07565b91506143f18285613e07565b91506143fd8284613e07565b91508190509a9950505050505050505050565b600061441c828e613e07565b9150614428828d613e07565b9150614434828c613e07565b9150614440828b613e07565b915061444c828a613e07565b91506144588289613e07565b91506144648288613e07565b91506144708287613e07565b915061447c8286613e07565b91506144888285613e07565b91506144948284613e07565b91508190509c9b505050505050505050505050565b60006144b48261420c565b91506144c08284613e07565b915081905092915050565b60006144d68261422f565b9150819050919050565b60006144eb826142de565b91506144f7828b613e07565b9150614502826142bb565b915061450e828a613e07565b915061451982614022565b915061452482613f50565b91506145308289613e07565b915061453b82613fdc565b91506145478288613e07565b915061455282614298565b915061455e8287613e07565b915061456982613e38565b91506145758286613e07565b9150614580826140ae565b915061458c8285613e07565b915061459782613ec4565b91506145a38284613e07565b91506145ae82614301565b91508190509998505050505050505050565b60006145cb82614324565b91506145d78284613e07565b915081905092915050565b60006020820190506145f76000830184613d77565b92915050565b60006080820190506146126000830187613d77565b61461f6020830186613d77565b61462c6040830185614347565b818103606083015261463e8184613d95565b905095945050505050565b600060208201905061465e6000830184613d86565b92915050565b6000602082019050818103600083015261467e8184613dce565b905092915050565b6000602082019050818103600083015261469f81613e5b565b9050919050565b600060208201905081810360008301526146bf81613e7e565b9050919050565b600060208201905081810360008301526146df81613ea1565b9050919050565b600060208201905081810360008301526146ff81613ee7565b9050919050565b6000602082019050818103600083015261471f81613f0a565b9050919050565b6000602082019050818103600083015261473f81613f2d565b9050919050565b6000602082019050818103600083015261475f81613f73565b9050919050565b6000602082019050818103600083015261477f81613f96565b9050919050565b6000602082019050818103600083015261479f81613fb9565b9050919050565b600060208201905081810360008301526147bf81613fff565b9050919050565b600060208201905081810360008301526147df81614045565b9050919050565b600060208201905081810360008301526147ff81614068565b9050919050565b6000602082019050818103600083015261481f8161408b565b9050919050565b6000602082019050818103600083015261483f816140d1565b9050919050565b6000602082019050818103600083015261485f816140f4565b9050919050565b6000602082019050818103600083015261487f81614117565b9050919050565b6000602082019050818103600083015261489f8161413a565b9050919050565b600060208201905081810360008301526148bf8161415d565b9050919050565b600060208201905081810360008301526148df81614180565b9050919050565b600060208201905081810360008301526148ff816141a3565b9050919050565b6000602082019050818103600083015261491f816141c6565b9050919050565b6000602082019050818103600083015261493f816141e9565b9050919050565b6000602082019050818103600083015261495f81614252565b9050919050565b6000602082019050818103600083015261497f81614275565b9050919050565b600060208201905061499b6000830184614347565b92915050565b60006149ab6149bc565b90506149b78282614c73565b919050565b6000604051905090565b600067ffffffffffffffff8211156149e1576149e0614dda565b5b6149ea82614e1d565b9050602081019050919050565b600067ffffffffffffffff821115614a1257614a11614dda565b5b614a1b82614e1d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a8182614bf5565b9150614a8c83614bf5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ac157614ac0614d1e565b5b828201905092915050565b6000614ad782614bf5565b9150614ae283614bf5565b925082614af257614af1614d4d565b5b828204905092915050565b6000614b0882614bf5565b9150614b1383614bf5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b4c57614b4b614d1e565b5b828202905092915050565b6000614b6282614bf5565b9150614b6d83614bf5565b925082821015614b8057614b7f614d1e565b5b828203905092915050565b6000614b9682614bd5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c2c578082015181840152602081019050614c11565b83811115614c3b576000848401525b50505050565b60006002820490506001821680614c5957607f821691505b60208210811415614c6d57614c6c614d7c565b5b50919050565b614c7c82614e1d565b810181811067ffffffffffffffff82111715614c9b57614c9a614dda565b5b80604052505050565b6000614caf82614bf5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce257614ce1614d1e565b5b600182019050919050565b6000614cf882614bf5565b9150614d0383614bf5565b925082614d1357614d12614d4d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f227d2c7b2274726169745f74797065223a22616e696d6174696f6e206475726160008201527f74696f6e222c2276616c7565223a220000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f227d2c7b2274726169745f74797065223a2267656e65736973222c2276616c7560008201527f65223a2200000000000000000000000000000000000000000000000000000000602082015250565b7f4275726e20656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f2c202261747472696275746573223a5b7b2274726169745f74797065223a226260008201527f61636b67726f756e64222c2276616c7565223a22000000000000000000000000602082015250565b7f4d6178206275726e206c696d6974000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d61782067656e65736973206c696d6974000000000000000000000000000000600082015250565b7f227d2c7b2274726169745f74797065223a22636f6c6f72206f6e65222c22766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f227d2c7b2274726169745f74797065223a22737465616c7468222c2276616c7560008201527f65223a2200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f537465616c74682073616c6520656e6400000000000000000000000000000000600082015250565b7f47656e657369732073616c6520656e6400000000000000000000000000000000600082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4d617820737465616c7468206c696d6974000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a22636f6c6f722074776f222c22766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022416e696d6174656420626c6f6260008201527f732067656e65726174656420616e642073746f726564206f6e2d636861696e2e60208201527f222c202022696d616765223a2200000000000000000000000000000000000000604082015250565b7f7b226e616d65223a22426c6f6220230000000000000000000000000000000000600082015250565b7f227d5d7d00000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6156f681614b8b565b811461570157600080fd5b50565b61570d81614b9d565b811461571857600080fd5b50565b61572481614ba9565b811461572f57600080fd5b50565b61573b81614bf5565b811461574657600080fd5b5056fe2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c646566733e3c6c696e6561724772616469656e742069643d2273772d6772616469656e74222078313d2230222078323d2231222079313d2231222079323d2230223e3c73746f702069643d2273746f7031222073746f702d636f6c6f723d2222206f66667365743d2231303025223e3c2f73746f703e3c2f6c696e6561724772616469656e743e3c2f646566733e3c706174682066696c6c3d2275726c282373772d6772616469656e74292220643d22222077696474683d223130302522206865696768743d223130302522207472616e73666f726d3d227472616e736c6174652835302035302922207374726f6b652d77696474683d223022207374796c653d227472616e736974696f6e3a20616c6c20302e337320656173652030733b223e3c616e696d6174655472616e73666f726d206174747269627574654e616d653d227472616e73666f726d2220747970653d227363616c65222061646469746976653d2273756d22202066726f6d3d223c7376672076696577426f783d22302030203130302031303022207374796c653d226261636b67726f756e642d636f6c6f723a4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f22206f66667365743d223025223e3c2f73746f703e3c73746f702069643d2273746f7032222073746f702d636f6c6f723d22732220726570656174436f756e743d22696e646566696e697465222f3e3c2f706174683e3c2f7376673ea2646970667358221220b74e12028b9762345296c88348ee7ec93b98c9a401d494abb0e2a6c61a5a623264736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806370a08231116100f7578063b88d4fde11610095578063e7806f1511610064578063e7806f15146105f7578063e985e9c514610613578063f2fde38b14610650578063ffa7264f14610679576101c2565b8063b88d4fde1461053b578063c87b56dd14610564578063d89135cd146105a1578063e659c647146105cc576101c2565b80638da5cb5b116100d15780638da5cb5b1461049157806395d89b41146104bc578063a22cb465146104e7578063b0cd807914610510576101c2565b806370a0823114610433578063715018a614610470578063853828b614610487576101c2565b806323cbe1cb1161016457806342842e0e1161013e57806342842e0e1461038657806342966c68146103af57806359a7715a146103cb5780636352211e146103f6576101c2565b806323cbe1cb146103145780632ae6218d146103305780633502a7161461035b576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806318b45b85146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613ca7565b6106a4565b6040516101fb9190614649565b60405180910390f35b34801561021057600080fd5b50610219610786565b6040516102269190614664565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613d4a565b610818565b60405161026391906145e2565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613c67565b61089d565b005b3480156102a157600080fd5b506102aa6109b5565b6040516102b79190614986565b60405180910390f35b3480156102cc57600080fd5b506102d56109d6565b6040516102e29190614986565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190613b51565b6109e1565b005b61032e60048036038101906103299190613d01565b610a41565b005b34801561033c57600080fd5b50610345610b76565b6040516103529190614986565b60405180910390f35b34801561036757600080fd5b50610370610baf565b60405161037d9190614986565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613b51565b610bb5565b005b6103c960048036038101906103c49190613d4a565b610bd5565b005b3480156103d757600080fd5b506103e0610e96565b6040516103ed9190614986565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190613d4a565b610ea5565b60405161042a91906145e2565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613ae4565b610f57565b6040516104679190614986565b60405180910390f35b34801561047c57600080fd5b5061048561100f565b005b61048f611097565b005b34801561049d57600080fd5b506104a6611132565b6040516104b391906145e2565b60405180910390f35b3480156104c857600080fd5b506104d161115c565b6040516104de9190614664565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613c27565b6111ee565b005b34801561051c57600080fd5b5061052561136f565b6040516105329190614986565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190613ba4565b611375565b005b34801561057057600080fd5b5061058b60048036038101906105869190613d4a565b6113d7565b6040516105989190614664565b60405180910390f35b3480156105ad57600080fd5b506105b66125e5565b6040516105c39190614986565b60405180910390f35b3480156105d857600080fd5b506105e16125f4565b6040516105ee9190614986565b60405180910390f35b610611600480360381019061060c9190613d01565b6125ff565b005b34801561061f57600080fd5b5061063a60048036038101906106359190613b11565b6126ea565b6040516106479190614649565b60405180910390f35b34801561065c57600080fd5b5061067760048036038101906106729190613ae4565b61277e565b005b34801561068557600080fd5b5061068e612876565b60405161069b9190614986565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061077f575061077e8261287c565b5b9050919050565b60606000805461079590614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190614c41565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b6000610823826128e6565b610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990614826565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a882610ea5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091090614926565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610938612952565b73ffffffffffffffffffffffffffffffffffffffff161480610967575061096681610961612952565b6126ea565b5b6109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d906147a6565b60405180910390fd5b6109b0838361295a565b505050565b60006109bf612a13565b6109c7612a24565b6109d19190614b57565b905090565b66c3663566a5800081565b6109f26109ec612952565b82612a35565b610a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2890614966565b60405180910390fd5b610a3c838383612b13565b505050565b6000610a4b612a24565b90506115b3600182610a5d9190614a76565b1115610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590614786565b60405180910390fd5b6115b3811115610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada906148c6565b60405180910390fd5b66c3663566a58000341015610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906148e6565b60405180910390fd5b600982908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610b68929190613843565b50610b7233612d6f565b5050565b600060016032610b84612a13565b610b8e9190614acc565b610b989190614a76565b66c3663566a58000610baa9190614afd565b905090565b614e2081565b610bd083838360405180602001604052806000815250611375565b505050565b6000610bdf612a24565b9050614e20600182610bf19190614a76565b1115610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990614746565b60405180910390fd5b614e20811115610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e906146e6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610c9783610ea5565b73ffffffffffffffffffffffffffffffffffffffff1614610cb757600080fd5b610cbf610b76565b341015610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906148e6565b60405180910390fd5b610d0e3361dead84612b13565b610d186008612dc0565b6000610d2383612dd6565b604051602001610d339190614356565b6040516020818303038152906040528051906020012060001c905060006115b382610d5e9190614ced565b90506000610d6a612a24565b82610d759190614ced565b90506000610d8282610ea5565b905061dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dc457610dc38134612f37565b5b6009808781548110610dd957610dd8614dab565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e1490614c41565b610e1f9291906138c9565b50610e2933612d6f565b6009808381548110610e3e57610e3d614dab565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e7990614c41565b610e849291906138c9565b50610e8e33612d6f565b505050505050565b6000610ea0612a24565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f45906147e6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf906147c6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611017612952565b73ffffffffffffffffffffffffffffffffffffffff16611035611132565b73ffffffffffffffffffffffffffffffffffffffff161461108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290614846565b60405180910390fd5b6110956000612fe8565b565b61109f612952565b73ffffffffffffffffffffffffffffffffffffffff166110bd611132565b73ffffffffffffffffffffffffffffffffffffffff1614611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90614846565b60405180910390fd5b60004790506000811161112557600080fd5b61112f3347612f37565b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116b90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461119790614c41565b80156111e45780601f106111b9576101008083540402835291602001916111e4565b820191906000526020600020905b8154815290600101906020018083116111c757829003601f168201915b5050505050905090565b6111f6612952565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90614726565b60405180910390fd5b8060056000611271612952565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661131e612952565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113639190614649565b60405180910390a35050565b6101f481565b611386611380612952565b83612a35565b6113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc90614966565b60405180910390fd5b6113d1848484846130ae565b50505050565b60606113e2826128e6565b611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890614886565b60405180910390fd5b6000611534836040518060400160405280600e81526020017f424c4f4220434f4c4f52204f4e45000000000000000000000000000000000000815250600a805480602002602001604051908101604052809291908181526020016000905b8282101561152b57838290600052602060002001805461149e90614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca90614c41565b80156115175780601f106114ec57610100808354040283529160200191611517565b820191906000526020600020905b8154815290600101906020018083116114fa57829003601f168201915b50505050508152602001906001019061147f565b5050505061310a565b90506000611649846040518060400160405280600e81526020017f424c4f4220434f4c4f522054574f000000000000000000000000000000000000815250600a805480602002602001604051908101604052809291908181526020016000905b828210156116405783829060005260206000200180546115b390614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546115df90614c41565b801561162c5780601f106116015761010080835404028352916020019161162c565b820191906000526020600020905b81548152906001019060200180831161160f57829003601f168201915b505050505081526020019060010190611594565b5050505061310a565b9050600061165685610ea5565b905061dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ff576040518060400160405280600381526020017f726564000000000000000000000000000000000000000000000000000000000081525092506040518060400160405280600381526020017f726564000000000000000000000000000000000000000000000000000000000081525091505b611707613956565b6040518060600160405280603381526020016158e0603391398160006013811061173457611733614dab565b5b602002018190525061184d866040518060400160405280600f81526020017f424c4f42204241434b47524f554e440000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b828210156118445783829060005260206000200180546117b790614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546117e390614c41565b80156118305780601f1061180557610100808354040283529160200191611830565b820191906000526020600020905b81548152906001019060200180831161181357829003601f168201915b505050505081526020019060010190611798565b5050505061310a565b8160016013811061186157611860614dab565b5b60200201819052506040518060c001604052806085815260200161574a608591398160026013811061189657611895614dab565b5b602002018190525083816003601381106118b3576118b2614dab565b5b602002018190525060405180606001604052806032815260200161595360329139816004601381106118e8576118e7614dab565b5b6020020181905250828160056013811061190557611904614dab565b5b60200201819052506040518060800160405280605181526020016157cf605191398160066013811061193a57611939614dab565b5b60200201819052506009868154811061195657611955614dab565b5b90600052602060002001805461196b90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461199790614c41565b80156119e45780601f106119b9576101008083540402835291602001916119e4565b820191906000526020600020905b8154815290600101906020018083116119c757829003601f168201915b5050505050816007601381106119fd576119fc614dab565b5b60200201819052506040518060e0016040528060c0815260200161582060c0913981600860138110611a3257611a31614dab565b5b6020020181905250611b4b866040518060400160405280600f81526020017f5452414e53464f524d5320544f20310000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611b42578382906000526020600020018054611ab590614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae190614c41565b8015611b2e5780601f10611b0357610100808354040283529160200191611b2e565b820191906000526020600020905b815481529060010190602001808311611b1157829003601f168201915b505050505081526020019060010190611a96565b50505050613255565b81600960138110611b5f57611b5e614dab565b5b60200201819052506040518060400160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525081600a60138110611bb157611bb0614dab565b5b6020020181905250611cca866040518060400160405280600f81526020017f5452414e53464f524d5320544f20320000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611cc1578382906000526020600020018054611c3490614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6090614c41565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b505050505081526020019060010190611c15565b50505050613255565b81600b60138110611cde57611cdd614dab565b5b60200201819052506040518060400160405280600681526020017f2220746f3d22000000000000000000000000000000000000000000000000000081525081600c60138110611d3057611d2f614dab565b5b6020020181905250611e49866040518060400160405280601181526020017f5452414e53464f524d532046524f4d2031000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611e40578382906000526020600020018054611db390614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611ddf90614c41565b8015611e2c5780601f10611e0157610100808354040283529160200191611e2c565b820191906000526020600020905b815481529060010190602001808311611e0f57829003601f168201915b505050505081526020019060010190611d94565b50505050613255565b81600d60138110611e5d57611e5c614dab565b5b60200201819052506040518060400160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525081600e60138110611eaf57611eae614dab565b5b6020020181905250611fc8866040518060400160405280601181526020017f5452414e53464f524d532046524f4d2032000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b82821015611fbf578382906000526020600020018054611f3290614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5e90614c41565b8015611fab5780601f10611f8057610100808354040283529160200191611fab565b820191906000526020600020905b815481529060010190602001808311611f8e57829003601f168201915b505050505081526020019060010190611f13565b50505050613255565b81600f60138110611fdc57611fdb614dab565b5b60200201819052506040518060400160405280601281526020017f2220626567696e3d22307322206475723d2200000000000000000000000000008152508160106013811061202e5761202d614dab565b5b6020020181905250612147866040518060400160405280601281526020017f414e494d4154494f4e204455524154494f4e0000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561213e5783829060005260206000200180546120b190614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546120dd90614c41565b801561212a5780601f106120ff5761010080835404028352916020019161212a565b820191906000526020600020905b81548152906001019060200180831161210d57829003601f168201915b505050505081526020019060010190612092565b50505050613255565b8160116013811061215b5761215a614dab565b5b60200201819052506040518060600160405280602a8152602001615985602a9139816012601381106121905761218f614dab565b5b602002018190525060006040518060400160405280600281526020017f4e4f000000000000000000000000000000000000000000000000000000000000815250905060006040518060400160405280600281526020017f4e4f00000000000000000000000000000000000000000000000000000000000081525090506101f4881161224e576040518060400160405280600381526020017f594553000000000000000000000000000000000000000000000000000000000081525091505b6115b38811612290576040518060400160405280600381526020017f594553000000000000000000000000000000000000000000000000000000000081525090505b6000836000601381106122a6576122a5614dab565b5b6020020151846001601381106122bf576122be614dab565b5b6020020151856002601381106122d8576122d7614dab565b5b6020020151866003601381106122f1576122f0614dab565b5b60200201518760046013811061230a57612309614dab565b5b60200201518860056013811061232357612322614dab565b5b60200201518960066013811061233c5761233b614dab565b5b60200201518a60076013811061235557612354614dab565b5b60200201518b60086013811061236e5761236d614dab565b5b602002015160405160200161238b99989796959493929190614391565b604051602081830303815290604052905080846009601381106123b1576123b0614dab565b5b602002015185600a601381106123ca576123c9614dab565b5b602002015186600b601381106123e3576123e2614dab565b5b602002015187600c601381106123fc576123fb614dab565b5b602002015188600d6013811061241557612414614dab565b5b602002015189600e6013811061242e5761242d614dab565b5b60200201518a600f6013811061244757612446614dab565b5b60200201518b6010601381106124605761245f614dab565b5b60200201518c60116013811061247957612478614dab565b5b60200201518d60126013811061249257612491614dab565b5b60200201516040516020016124b19b9a99989796959493929190614410565b604051602081830303815290604052905060006124ec826040516020016124d89190614356565b6040516020818303038152906040526132c6565b6040516020016124fc91906145c0565b604051602081830303815290604052905060006125ad61251b8c612dd6565b83886001601381106125305761252f614dab565b5b60200201518960036013811061254957612548614dab565b5b60200201518a60056013811061256257612561614dab565b5b60200201518b60116013811061257b5761257a614dab565b5b60200201518b8b6040516020016125999897969594939291906144e0565b6040516020818303038152906040526132c6565b90506000816040516020016125c291906144a9565b6040516020818303038152906040529050809a5050505050505050505050919050565b60006125ef612a13565b905090565b66c3663566a5800081565b6000612609612a24565b90506101f460018261261b9190614a76565b111561265c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265390614906565b60405180910390fd5b6101f48111156126a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612698906148a6565b60405180910390fd5b6009829080600181540180825580915050600190039060005260206000200160009091909190915090805190602001906126dc929190613843565b506126e633612d6f565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612786612952565b73ffffffffffffffffffffffffffffffffffffffff166127a4611132565b73ffffffffffffffffffffffffffffffffffffffff16146127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190614846565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612861906146a6565b60405180910390fd5b61287381612fe8565b50565b6115b381565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129cd83610ea5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a1f600861343f565b905090565b6000612a30600761343f565b905090565b6000612a40826128e6565b612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614766565b60405180910390fd5b6000612a8a83610ea5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612af957508373ffffffffffffffffffffffffffffffffffffffff16612ae184610818565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b0a5750612b0981856126ea565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b3382610ea5565b73ffffffffffffffffffffffffffffffffffffffff1614612b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8090614866565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090614706565b60405180910390fd5b612c0483838361344d565b612c0f60008261295a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c5f9190614b57565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb69190614a76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612d79612a24565b9050612d856007612dc0565b612d8f8282613452565b807f9650690416bdabe38208d212288e69fc5764a203d8645837b17885c82949ba8e60405160405180910390a25050565b6001816000016000828254019250508190555050565b60606000821415612e1e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f32565b600082905060005b60008214612e50578080612e3990614ca4565b915050600a82612e499190614acc565b9150612e26565b60008167ffffffffffffffff811115612e6c57612e6b614dda565b5b6040519080825280601f01601f191660200182016040528015612e9e5781602001600182028036833780820191505090505b5090505b60008514612f2b57600182612eb79190614b57565b9150600a85612ec69190614ced565b6030612ed29190614a76565b60f81b818381518110612ee857612ee7614dab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f249190614acc565b9450612ea2565b8093505050505b919050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612f5d906144cb565b60006040518083038185875af1925050503d8060008114612f9a576040519150601f19603f3d011682016040523d82523d6000602084013e612f9f565b606091505b5050905080612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90614946565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130b9848484612b13565b6130c584848484613470565b613104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fb90614686565b60405180910390fd5b50505050565b606060008361311886612dd6565b60405160200161312992919061436d565b6040516020818303038152906040528051906020012060001c90506000838451836131549190614ced565b8151811061316557613164614dab565b5b6020026020010151905060006103e88361317f9190614ced565b905060458114156131c3576040518060400160405280600c81526020017f72676228302c20302c203029000000000000000000000000000000000000000081525091505b6101a4811415613206576040518060400160405280600c81526020017f72676228302c20302c203029000000000000000000000000000000000000000081525091505b6021811415613248576040518060400160405280601281526020017f726762283235352c203235352c2032353529000000000000000000000000000081525091505b8193505050509392505050565b606060008361326386612dd6565b60405160200161327492919061436d565b6040516020818303038152906040528051906020012060001c905060008384518361329f9190614ced565b815181106132b0576132af614dab565b5b6020026020010151905080925050509392505050565b60606000825114156132e95760405180602001604052806000815250905061343a565b600060405180606001604052806040815260200161591360409139905060006003600285516133189190614a76565b6133229190614acc565b600461332e9190614afd565b9050600060208261333f9190614a76565b67ffffffffffffffff81111561335857613357614dda565b5b6040519080825280601f01601f19166020018201604052801561338a5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156133f9576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182536001820191505061339e565b60038951066001811461341357600281146134235761342e565b613d3d60f01b600283035261342e565b603d60f81b60018303525b50505050508093505050505b919050565b600081600001549050919050565b505050565b61346c828260405180602001604052806000815250613607565b5050565b60006134918473ffffffffffffffffffffffffffffffffffffffff16613662565b156135fa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134ba612952565b8786866040518563ffffffff1660e01b81526004016134dc94939291906145fd565b602060405180830381600087803b1580156134f657600080fd5b505af192505050801561352757506040513d601f19601f820116820180604052508101906135249190613cd4565b60015b6135aa573d8060008114613557576040519150601f19603f3d011682016040523d82523d6000602084013e61355c565b606091505b506000815114156135a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359990614686565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135ff565b600190505b949350505050565b6136118383613675565b61361e6000848484613470565b61365d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365490614686565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dc90614806565b60405180910390fd5b6136ee816128e6565b1561372e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613725906146c6565b60405180910390fd5b61373a6000838361344d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461378a9190614a76565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461384f90614c41565b90600052602060002090601f01602090048101928261387157600085556138b8565b82601f1061388a57805160ff19168380011785556138b8565b828001600101855582156138b8579182015b828111156138b757825182559160200191906001019061389c565b5b5090506138c5919061397e565b5090565b8280546138d590614c41565b90600052602060002090601f0160209004810192826138f75760008555613945565b82601f106139085780548555613945565b8280016001018555821561394557600052602060002091601f016020900482015b82811115613944578254825591600101919060010190613929565b5b509050613952919061397e565b5090565b6040518061026001604052806013905b60608152602001906001900390816139665790505090565b5b8082111561399757600081600090555060010161397f565b5090565b60006139ae6139a9846149c6565b6149a1565b9050828152602081018484840111156139ca576139c9614e0e565b5b6139d5848285614bff565b509392505050565b60006139f06139eb846149f7565b6149a1565b905082815260208101848484011115613a0c57613a0b614e0e565b5b613a17848285614bff565b509392505050565b600081359050613a2e816156ed565b92915050565b600081359050613a4381615704565b92915050565b600081359050613a588161571b565b92915050565b600081519050613a6d8161571b565b92915050565b600082601f830112613a8857613a87614e09565b5b8135613a9884826020860161399b565b91505092915050565b600082601f830112613ab657613ab5614e09565b5b8135613ac68482602086016139dd565b91505092915050565b600081359050613ade81615732565b92915050565b600060208284031215613afa57613af9614e18565b5b6000613b0884828501613a1f565b91505092915050565b60008060408385031215613b2857613b27614e18565b5b6000613b3685828601613a1f565b9250506020613b4785828601613a1f565b9150509250929050565b600080600060608486031215613b6a57613b69614e18565b5b6000613b7886828701613a1f565b9350506020613b8986828701613a1f565b9250506040613b9a86828701613acf565b9150509250925092565b60008060008060808587031215613bbe57613bbd614e18565b5b6000613bcc87828801613a1f565b9450506020613bdd87828801613a1f565b9350506040613bee87828801613acf565b925050606085013567ffffffffffffffff811115613c0f57613c0e614e13565b5b613c1b87828801613a73565b91505092959194509250565b60008060408385031215613c3e57613c3d614e18565b5b6000613c4c85828601613a1f565b9250506020613c5d85828601613a34565b9150509250929050565b60008060408385031215613c7e57613c7d614e18565b5b6000613c8c85828601613a1f565b9250506020613c9d85828601613acf565b9150509250929050565b600060208284031215613cbd57613cbc614e18565b5b6000613ccb84828501613a49565b91505092915050565b600060208284031215613cea57613ce9614e18565b5b6000613cf884828501613a5e565b91505092915050565b600060208284031215613d1757613d16614e18565b5b600082013567ffffffffffffffff811115613d3557613d34614e13565b5b613d4184828501613aa1565b91505092915050565b600060208284031215613d6057613d5f614e18565b5b6000613d6e84828501613acf565b91505092915050565b613d8081614b8b565b82525050565b613d8f81614b9d565b82525050565b6000613da082614a28565b613daa8185614a3e565b9350613dba818560208601614c0e565b613dc381614e1d565b840191505092915050565b6000613dd982614a33565b613de38185614a5a565b9350613df3818560208601614c0e565b613dfc81614e1d565b840191505092915050565b6000613e1282614a33565b613e1c8185614a6b565b9350613e2c818560208601614c0e565b80840191505092915050565b6000613e45602f83614a6b565b9150613e5082614e2e565b602f82019050919050565b6000613e68603283614a5a565b9150613e7382614e7d565b604082019050919050565b6000613e8b602683614a5a565b9150613e9682614ecc565b604082019050919050565b6000613eae601c83614a5a565b9150613eb982614f1b565b602082019050919050565b6000613ed1602483614a6b565b9150613edc82614f44565b602482019050919050565b6000613ef4600883614a5a565b9150613eff82614f93565b602082019050919050565b6000613f17602483614a5a565b9150613f2282614fbc565b604082019050919050565b6000613f3a601983614a5a565b9150613f458261500b565b602082019050919050565b6000613f5d603483614a6b565b9150613f6882615034565b603482019050919050565b6000613f80600e83614a5a565b9150613f8b82615083565b602082019050919050565b6000613fa3602c83614a5a565b9150613fae826150ac565b604082019050919050565b6000613fc6601183614a5a565b9150613fd1826150fb565b602082019050919050565b6000613fe9602683614a6b565b9150613ff482615124565b602682019050919050565b600061400c603883614a5a565b915061401782615173565b604082019050919050565b600061402f600183614a6b565b915061403a826151c2565b600182019050919050565b6000614052602a83614a5a565b915061405d826151eb565b604082019050919050565b6000614075602983614a5a565b91506140808261523a565b604082019050919050565b6000614098602083614a5a565b91506140a382615289565b602082019050919050565b60006140bb602483614a6b565b91506140c6826152b2565b602482019050919050565b60006140de602c83614a5a565b91506140e982615301565b604082019050919050565b6000614101602083614a5a565b915061410c82615350565b602082019050919050565b6000614124602983614a5a565b915061412f82615379565b604082019050919050565b6000614147602f83614a5a565b9150614152826153c8565b604082019050919050565b600061416a601083614a5a565b915061417582615417565b602082019050919050565b600061418d601083614a5a565b915061419882615440565b602082019050919050565b60006141b0601183614a5a565b91506141bb82615469565b602082019050919050565b60006141d3601183614a5a565b91506141de82615492565b602082019050919050565b60006141f6602183614a5a565b9150614201826154bb565b604082019050919050565b6000614219601d83614a6b565b91506142248261550a565b601d82019050919050565b600061423c600083614a4f565b915061424782615533565b600082019050919050565b600061425f601083614a5a565b915061426a82615536565b602082019050919050565b6000614282603183614a5a565b915061428d8261555f565b604082019050919050565b60006142a5602683614a6b565b91506142b0826155ae565b602682019050919050565b60006142c8604d83614a6b565b91506142d3826155fd565b604d82019050919050565b60006142eb600f83614a6b565b91506142f682615672565b600f82019050919050565b600061430e600483614a6b565b91506143198261569b565b600482019050919050565b6000614331601a83614a6b565b915061433c826156c4565b601a82019050919050565b61435081614bf5565b82525050565b60006143628284613e07565b915081905092915050565b60006143798285613e07565b91506143858284613e07565b91508190509392505050565b600061439d828c613e07565b91506143a9828b613e07565b91506143b5828a613e07565b91506143c18289613e07565b91506143cd8288613e07565b91506143d98287613e07565b91506143e58286613e07565b91506143f18285613e07565b91506143fd8284613e07565b91508190509a9950505050505050505050565b600061441c828e613e07565b9150614428828d613e07565b9150614434828c613e07565b9150614440828b613e07565b915061444c828a613e07565b91506144588289613e07565b91506144648288613e07565b91506144708287613e07565b915061447c8286613e07565b91506144888285613e07565b91506144948284613e07565b91508190509c9b505050505050505050505050565b60006144b48261420c565b91506144c08284613e07565b915081905092915050565b60006144d68261422f565b9150819050919050565b60006144eb826142de565b91506144f7828b613e07565b9150614502826142bb565b915061450e828a613e07565b915061451982614022565b915061452482613f50565b91506145308289613e07565b915061453b82613fdc565b91506145478288613e07565b915061455282614298565b915061455e8287613e07565b915061456982613e38565b91506145758286613e07565b9150614580826140ae565b915061458c8285613e07565b915061459782613ec4565b91506145a38284613e07565b91506145ae82614301565b91508190509998505050505050505050565b60006145cb82614324565b91506145d78284613e07565b915081905092915050565b60006020820190506145f76000830184613d77565b92915050565b60006080820190506146126000830187613d77565b61461f6020830186613d77565b61462c6040830185614347565b818103606083015261463e8184613d95565b905095945050505050565b600060208201905061465e6000830184613d86565b92915050565b6000602082019050818103600083015261467e8184613dce565b905092915050565b6000602082019050818103600083015261469f81613e5b565b9050919050565b600060208201905081810360008301526146bf81613e7e565b9050919050565b600060208201905081810360008301526146df81613ea1565b9050919050565b600060208201905081810360008301526146ff81613ee7565b9050919050565b6000602082019050818103600083015261471f81613f0a565b9050919050565b6000602082019050818103600083015261473f81613f2d565b9050919050565b6000602082019050818103600083015261475f81613f73565b9050919050565b6000602082019050818103600083015261477f81613f96565b9050919050565b6000602082019050818103600083015261479f81613fb9565b9050919050565b600060208201905081810360008301526147bf81613fff565b9050919050565b600060208201905081810360008301526147df81614045565b9050919050565b600060208201905081810360008301526147ff81614068565b9050919050565b6000602082019050818103600083015261481f8161408b565b9050919050565b6000602082019050818103600083015261483f816140d1565b9050919050565b6000602082019050818103600083015261485f816140f4565b9050919050565b6000602082019050818103600083015261487f81614117565b9050919050565b6000602082019050818103600083015261489f8161413a565b9050919050565b600060208201905081810360008301526148bf8161415d565b9050919050565b600060208201905081810360008301526148df81614180565b9050919050565b600060208201905081810360008301526148ff816141a3565b9050919050565b6000602082019050818103600083015261491f816141c6565b9050919050565b6000602082019050818103600083015261493f816141e9565b9050919050565b6000602082019050818103600083015261495f81614252565b9050919050565b6000602082019050818103600083015261497f81614275565b9050919050565b600060208201905061499b6000830184614347565b92915050565b60006149ab6149bc565b90506149b78282614c73565b919050565b6000604051905090565b600067ffffffffffffffff8211156149e1576149e0614dda565b5b6149ea82614e1d565b9050602081019050919050565b600067ffffffffffffffff821115614a1257614a11614dda565b5b614a1b82614e1d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a8182614bf5565b9150614a8c83614bf5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ac157614ac0614d1e565b5b828201905092915050565b6000614ad782614bf5565b9150614ae283614bf5565b925082614af257614af1614d4d565b5b828204905092915050565b6000614b0882614bf5565b9150614b1383614bf5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b4c57614b4b614d1e565b5b828202905092915050565b6000614b6282614bf5565b9150614b6d83614bf5565b925082821015614b8057614b7f614d1e565b5b828203905092915050565b6000614b9682614bd5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c2c578082015181840152602081019050614c11565b83811115614c3b576000848401525b50505050565b60006002820490506001821680614c5957607f821691505b60208210811415614c6d57614c6c614d7c565b5b50919050565b614c7c82614e1d565b810181811067ffffffffffffffff82111715614c9b57614c9a614dda565b5b80604052505050565b6000614caf82614bf5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce257614ce1614d1e565b5b600182019050919050565b6000614cf882614bf5565b9150614d0383614bf5565b925082614d1357614d12614d4d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f227d2c7b2274726169745f74797065223a22616e696d6174696f6e206475726160008201527f74696f6e222c2276616c7565223a220000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f227d2c7b2274726169745f74797065223a2267656e65736973222c2276616c7560008201527f65223a2200000000000000000000000000000000000000000000000000000000602082015250565b7f4275726e20656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f2c202261747472696275746573223a5b7b2274726169745f74797065223a226260008201527f61636b67726f756e64222c2276616c7565223a22000000000000000000000000602082015250565b7f4d6178206275726e206c696d6974000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d61782067656e65736973206c696d6974000000000000000000000000000000600082015250565b7f227d2c7b2274726169745f74797065223a22636f6c6f72206f6e65222c22766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f227d2c7b2274726169745f74797065223a22737465616c7468222c2276616c7560008201527f65223a2200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f537465616c74682073616c6520656e6400000000000000000000000000000000600082015250565b7f47656e657369732073616c6520656e6400000000000000000000000000000000600082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4d617820737465616c7468206c696d6974000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f227d2c7b2274726169745f74797065223a22636f6c6f722074776f222c22766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022416e696d6174656420626c6f6260008201527f732067656e65726174656420616e642073746f726564206f6e2d636861696e2e60208201527f222c202022696d616765223a2200000000000000000000000000000000000000604082015250565b7f7b226e616d65223a22426c6f6220230000000000000000000000000000000000600082015250565b7f227d5d7d00000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6156f681614b8b565b811461570157600080fd5b50565b61570d81614b9d565b811461571857600080fd5b50565b61572481614ba9565b811461572f57600080fd5b50565b61573b81614bf5565b811461574657600080fd5b5056fe2220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c646566733e3c6c696e6561724772616469656e742069643d2273772d6772616469656e74222078313d2230222078323d2231222079313d2231222079323d2230223e3c73746f702069643d2273746f7031222073746f702d636f6c6f723d2222206f66667365743d2231303025223e3c2f73746f703e3c2f6c696e6561724772616469656e743e3c2f646566733e3c706174682066696c6c3d2275726c282373772d6772616469656e74292220643d22222077696474683d223130302522206865696768743d223130302522207472616e73666f726d3d227472616e736c6174652835302035302922207374726f6b652d77696474683d223022207374796c653d227472616e736974696f6e3a20616c6c20302e337320656173652030733b223e3c616e696d6174655472616e73666f726d206174747269627574654e616d653d227472616e73666f726d2220747970653d227363616c65222061646469746976653d2273756d22202066726f6d3d223c7376672076696577426f783d22302030203130302031303022207374796c653d226261636b67726f756e642d636f6c6f723a4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f22206f66667365743d223025223e3c2f73746f703e3c73746f702069643d2273746f7032222073746f702d636f6c6f723d22732220726570656174436f756e743d22696e646566696e697465222f3e3c2f706174683e3c2f7376673ea2646970667358221220b74e12028b9762345296c88348ee7ec93b98c9a401d494abb0e2a6c61a5a623264736f6c63430008070033

Deployed Bytecode Sourcemap

48420:9250:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31327:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32272:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33831:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33354:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49946:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48884:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34721:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50827:389;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55750:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48821:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35131:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56050:1227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50403:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31966:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31696:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12962:94;;;;;;;;;;;;;:::i;:::-;;57285:193;;;:::i;:::-;;12311:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32441:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34124:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48702:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35387:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51493:3268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50302:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48968:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50502:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34490:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13211:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48763:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31327:305;31429:4;31481:25;31466:40;;;:11;:40;;;;:105;;;;31538:33;31523:48;;;:11;:48;;;;31466:105;:158;;;;31588:36;31612:11;31588:23;:36::i;:::-;31466:158;31446:178;;31327:305;;;:::o;32272:100::-;32326:13;32359:5;32352:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32272:100;:::o;33831:221::-;33907:7;33935:16;33943:7;33935;:16::i;:::-;33927:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34020:15;:24;34036:7;34020:24;;;;;;;;;;;;;;;;;;;;;34013:31;;33831:221;;;:::o;33354:411::-;33435:13;33451:23;33466:7;33451:14;:23::i;:::-;33435:39;;33499:5;33493:11;;:2;:11;;;;33485:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33593:5;33577:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33602:37;33619:5;33626:12;:10;:12::i;:::-;33602:16;:37::i;:::-;33577:62;33555:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33736:21;33745:2;33749:7;33736:8;:21::i;:::-;33424:341;33354:411;;:::o;49946:111::-;49990:7;50035:14;:12;:14::i;:::-;50018;:12;:14::i;:::-;:31;;;;:::i;:::-;50010:39;;49946:111;:::o;48884:64::-;48931:17;48884:64;:::o;34721:339::-;34916:41;34935:12;:10;:12::i;:::-;34949:7;34916:18;:41::i;:::-;34908:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35024:28;35034:4;35040:2;35044:7;35024:9;:28::i;:::-;34721:339;;;:::o;50827:389::-;50895:13;50911:14;:12;:14::i;:::-;50895:30;;48810:4;50952:1;50944:5;:9;;;;:::i;:::-;:33;;50936:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48810:4;51018:5;:29;;51010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48931:17;51087:9;:31;;51079:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51153:6;51165:5;51153:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51182:26;51197:10;51182:14;:26::i;:::-;50884:332;50827:389;:::o;55750:125::-;55795:7;55865:1;55859:2;55842:14;:12;:14::i;:::-;:19;;;;:::i;:::-;55841:25;;;;:::i;:::-;49015:17;55822:45;;;;:::i;:::-;55815:52;;55750:125;:::o;48821:52::-;48868:5;48821:52;:::o;35131:185::-;35269:39;35286:4;35292:2;35296:7;35269:39;;;;;;;;;;;;:16;:39::i;:::-;35131:185;;;:::o;56050:1227::-;56108:13;56124:14;:12;:14::i;:::-;56108:30;;48868:5;56165:1;56157:5;:9;;;;:::i;:::-;:25;;56149:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;48868:5;56220;:21;;56212:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;56294:10;56273:31;;:17;56281:8;56273:7;:17::i;:::-;:31;;;56265:40;;;;;;56337:14;:12;:14::i;:::-;56324:9;:27;;56316:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56408:125;56432:10;56457:42;56514:8;56408:9;:125::i;:::-;56581:26;:14;:24;:26::i;:::-;56655:12;56705:26;56722:8;56705:16;:26::i;:::-;56688:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;56678:55;;;;;;56670:64;;56655:79;;56745:18;48810:4;56766;:27;;;;:::i;:::-;56745:48;;56804:27;56847:14;:12;:14::i;:::-;56834:10;:27;;;;:::i;:::-;56804:57;;56872:20;56895:35;56910:19;56895:14;:35::i;:::-;56872:58;;56961:42;56945:58;;:12;:58;;;56941:126;;57020:35;57031:12;57045:9;57020:10;:35::i;:::-;56941:126;57113:6;57125;57132:8;57125:16;;;;;;;;:::i;:::-;;;;;;;;;57113:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;57153:26;57168:10;57153:14;:26::i;:::-;57192:6;57204;57211:19;57204:27;;;;;;;;:::i;:::-;;;;;;;;;57192:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;57243:26;57258:10;57243:14;:26::i;:::-;56097:1180;;;;;56050:1227;:::o;50403:91::-;50445:7;50472:14;:12;:14::i;:::-;50465:21;;50403:91;:::o;31966:239::-;32038:7;32058:13;32074:7;:16;32082:7;32074:16;;;;;;;;;;;;;;;;;;;;;32058:32;;32126:1;32109:19;;:5;:19;;;;32101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32192:5;32185:12;;;31966:239;;;:::o;31696:208::-;31768:7;31813:1;31796:19;;:5;:19;;;;31788:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31880:9;:16;31890:5;31880:16;;;;;;;;;;;;;;;;31873:23;;31696:208;;;:::o;12962:94::-;12542:12;:10;:12::i;:::-;12531:23;;:7;:5;:7::i;:::-;:23;;;12523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13027:21:::1;13045:1;13027:9;:21::i;:::-;12962:94::o:0;57285:193::-;12542:12;:10;:12::i;:::-;12531:23;;:7;:5;:7::i;:::-;:23;;;12523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57344:15:::1;57362:21;57344:39;;57412:1;57402:7;:11;57394:20;;;::::0;::::1;;57425:45;57436:10;57448:21;57425:10;:45::i;:::-;57333:145;57285:193::o:0;12311:87::-;12357:7;12384:6;;;;;;;;;;;12377:13;;12311:87;:::o;32441:104::-;32497:13;32530:7;32523:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32441:104;:::o;34124:295::-;34239:12;:10;:12::i;:::-;34227:24;;:8;:24;;;;34219:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34339:8;34294:18;:32;34313:12;:10;:12::i;:::-;34294:32;;;;;;;;;;;;;;;:42;34327:8;34294:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34392:8;34363:48;;34378:12;:10;:12::i;:::-;34363:48;;;34402:8;34363:48;;;;;;:::i;:::-;;;;;;;;34124:295;;:::o;48702:50::-;48749:3;48702:50;:::o;35387:328::-;35562:41;35581:12;:10;:12::i;:::-;35595:7;35562:18;:41::i;:::-;35554:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35668:39;35682:4;35688:2;35692:7;35701:5;35668:13;:39::i;:::-;35387:328;;;;:::o;51493:3268::-;51559:13;51591:17;51599:8;51591:7;:17::i;:::-;51583:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;51671:22;51696:54;51711:8;51696:54;;;;;;;;;;;;;;;;;51739:10;51696:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:54::i;:::-;51671:79;;51759:22;51784:54;51799:8;51784:54;;;;;;;;;;;;;;;;;51827:10;51784:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:54::i;:::-;51759:79;;51847:18;51868:24;51883:8;51868:14;:24::i;:::-;51847:45;;51951:42;51937:56;;:10;:56;;;51933:126;;;52006:16;;;;;;;;;;;;;;;;;;;52033;;;;;;;;;;;;;;;;;;;51933:126;52069:23;;:::i;:::-;52101:64;;;;;;;;;;;;;;;;;:5;52107:1;52101:8;;;;;;;:::i;:::-;;;;;:64;;;;52185:60;52200:8;52185:60;;;;;;;;;;;;;;;;;52229:15;52185:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:60::i;:::-;52174:5;52180:1;52174:8;;;;;;;:::i;:::-;;;;;:71;;;;52254:146;;;;;;;;;;;;;;;;;:5;52260:1;52254:8;;;;;;;:::i;:::-;;;;;:146;;;;52420:8;52409:5;52415:1;52409:8;;;;;;;:::i;:::-;;;;;:19;;;;52437:63;;;;;;;;;;;;;;;;;:5;52443:1;52437:8;;;;;;;:::i;:::-;;;;;:63;;;;52520:8;52509:5;52515:1;52509:8;;;;;;;:::i;:::-;;;;;:19;;;;52537:94;;;;;;;;;;;;;;;;;:5;52543:1;52537:8;;;;;;;:::i;:::-;;;;;:94;;;;52651:6;52658:8;52651:16;;;;;;;;:::i;:::-;;;;;;;;;52640:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;52646:1;52640:8;;;;;;;:::i;:::-;;;;;:27;;;;52676:205;;;;;;;;;;;;;;;;;:5;52682:1;52676:8;;;;;;;:::i;:::-;;;;;:205;;;;52901:50;52911:8;52901:50;;;;;;;;;;;;;;;;;52940:10;52901:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:50::i;:::-;52890:5;52896:1;52890:8;;;;;;;:::i;:::-;;;;;:61;;;;52960:15;;;;;;;;;;;;;;;;;:5;52966:2;52960:9;;;;;;;:::i;:::-;;;;;:15;;;;52996:50;53006:8;52996:50;;;;;;;;;;;;;;;;;53035:10;52996:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:50::i;:::-;52984:5;52990:2;52984:9;;;;;;;:::i;:::-;;;;;:62;;;;53055:20;;;;;;;;;;;;;;;;;:5;53061:2;53055:9;;;;;;;:::i;:::-;;;;;:20;;;;53096:52;53106:8;53096:52;;;;;;;;;;;;;;;;;53137:10;53096:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:52::i;:::-;53084:5;53090:2;53084:9;;;;;;;:::i;:::-;;;;;:64;;;;53157:15;;;;;;;;;;;;;;;;;:5;53163:2;53157:9;;;;;;;:::i;:::-;;;;;:15;;;;53193:52;53203:8;53193:52;;;;;;;;;;;;;;;;;53234:10;53193:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:52::i;:::-;53181:5;53187:2;53181:9;;;;;;;:::i;:::-;;;;;:64;;;;53254:32;;;;;;;;;;;;;;;;;:5;53260:2;53254:9;;;;;;;:::i;:::-;;;;;:32;;;;53307:50;53317:8;53307:50;;;;;;;;;;;;;;;;;53349:7;53307:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:50::i;:::-;53295:5;53301:2;53295:9;;;;;;;:::i;:::-;;;;;:62;;;;53366:56;;;;;;;;;;;;;;;;;:5;53372:2;53366:9;;;;;;;:::i;:::-;;;;;:56;;;;53433:23;:30;;;;;;;;;;;;;;;;;;;53472:23;:30;;;;;;;;;;;;;;;;;;;48749:3;53515:8;:32;53511:78;;53562:17;;;;;;;;;;;;;;;;;;;53511:78;48810:4;53601:8;:32;53597:78;;53648:17;;;;;;;;;;;;;;;;;;;53597:78;53685:17;53729:5;53735:1;53729:8;;;;;;;:::i;:::-;;;;;;53739:5;53745:1;53739:8;;;;;;;:::i;:::-;;;;;;53749:5;53755:1;53749:8;;;;;;;:::i;:::-;;;;;;53759:5;53765:1;53759:8;;;;;;;:::i;:::-;;;;;;53769:5;53775:1;53769:8;;;;;;;:::i;:::-;;;;;;53779:5;53785:1;53779:8;;;;;;;:::i;:::-;;;;;;53789:5;53795:1;53789:8;;;;;;;:::i;:::-;;;;;;53799:5;53805:1;53799:8;;;;;;;:::i;:::-;;;;;;53809:5;53815:1;53809:8;;;;;;;:::i;:::-;;;;;;53712:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53685:134;;53858:3;53863:5;53869:1;53863:8;;;;;;;:::i;:::-;;;;;;53873:5;53879:2;53873:9;;;;;;;:::i;:::-;;;;;;53884:5;53890:2;53884:9;;;;;;;:::i;:::-;;;;;;53895:5;53901:2;53895:9;;;;;;;:::i;:::-;;;;;;53906:5;53912:2;53906:9;;;;;;;:::i;:::-;;;;;;53917:5;53923:2;53917:9;;;;;;;:::i;:::-;;;;;;53928:5;53934:2;53928:9;;;;;;;:::i;:::-;;;;;;53939:5;53945:2;53939:9;;;;;;;:::i;:::-;;;;;;53950:5;53956:2;53950:9;;;;;;;:::i;:::-;;;;;;53961:5;53967:2;53961:9;;;;;;;:::i;:::-;;;;;;53841:130;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53828:144;;53981:20;54059:36;54090:3;54073:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;54059:13;:36::i;:::-;54012:84;;;;;;;;:::i;:::-;;;;;;;;;;;;;53981:116;;54106:18;54130:502;54180:26;54197:8;54180:16;:26::i;:::-;54289:6;54357:5;54363:1;54357:8;;;;;;;:::i;:::-;;;;;;54407:5;54413:1;54407:8;;;;;;;:::i;:::-;;;;;;54457:5;54463:1;54457:8;;;;;;;:::i;:::-;;;;;;54516:5;54522:2;54516:9;;;;;;;:::i;:::-;;;;;;54565;54614;54144:487;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54130:13;:502::i;:::-;54106:526;;54641:21;54722:4;54672:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;54641:87;;54746:7;54739:14;;;;;;;;;;;;51493:3268;;;:::o;50302:93::-;50346:7;50373:14;:12;:14::i;:::-;50366:21;;50302:93;:::o;48968:64::-;49015:17;48968:64;:::o;50502:317::-;50570:13;50586:14;:12;:14::i;:::-;50570:30;;48749:3;50627:1;50619:5;:9;;;;:::i;:::-;:33;;50611:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48749:3;50693:5;:29;;50685:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50756:6;50768:5;50756:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50785:26;50800:10;50785:14;:26::i;:::-;50559:260;50502:317;:::o;34490:164::-;34587:4;34611:18;:25;34630:5;34611:25;;;;;;;;;;;;;;;:35;34637:8;34611:35;;;;;;;;;;;;;;;;;;;;;;;;;34604:42;;34490:164;;;;:::o;13211:192::-;12542:12;:10;:12::i;:::-;12531:23;;:7;:5;:7::i;:::-;:23;;;12523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13320:1:::1;13300:22;;:8;:22;;;;13292:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13376:19;13386:8;13376:9;:19::i;:::-;13211:192:::0;:::o;48763:51::-;48810:4;48763:51;:::o;24297:157::-;24382:4;24421:25;24406:40;;;:11;:40;;;;24399:47;;24297:157;;;:::o;37225:127::-;37290:4;37342:1;37314:30;;:7;:16;37322:7;37314:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37307:37;;37225:127;;;:::o;11099:98::-;11152:7;11179:10;11172:17;;11099:98;:::o;41207:174::-;41309:2;41282:15;:24;41298:7;41282:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41365:7;41361:2;41327:46;;41336:23;41351:7;41336:14;:23::i;:::-;41327:46;;;;;;;;;;;;41207:174;;:::o;50184:106::-;50231:7;50258:24;:14;:22;:24::i;:::-;50251:31;;50184:106;:::o;50065:107::-;50112:7;50139:25;:15;:23;:25::i;:::-;50132:32;;50065:107;:::o;37519:348::-;37612:4;37637:16;37645:7;37637;:16::i;:::-;37629:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37713:13;37729:23;37744:7;37729:14;:23::i;:::-;37713:39;;37782:5;37771:16;;:7;:16;;;:51;;;;37815:7;37791:31;;:20;37803:7;37791:11;:20::i;:::-;:31;;;37771:51;:87;;;;37826:32;37843:5;37850:7;37826:16;:32::i;:::-;37771:87;37763:96;;;37519:348;;;;:::o;40511:578::-;40670:4;40643:31;;:23;40658:7;40643:14;:23::i;:::-;:31;;;40635:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40753:1;40739:16;;:2;:16;;;;40731:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40809:39;40830:4;40836:2;40840:7;40809:20;:39::i;:::-;40913:29;40930:1;40934:7;40913:8;:29::i;:::-;40974:1;40955:9;:15;40965:4;40955:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41003:1;40986:9;:13;40996:2;40986:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41034:2;41015:7;:16;41023:7;41015:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41073:7;41069:2;41054:27;;41063:4;41054:27;;;;;;;;;;;;40511:578;;;:::o;51224:194::-;51280:10;51293:14;:12;:14::i;:::-;51280:27;;51318;:15;:25;:27::i;:::-;51356:18;51366:3;51371:2;51356:9;:18::i;:::-;51407:2;51390:20;;;;;;;;;;51269:149;51224:194;:::o;976:127::-;1083:1;1065:7;:14;;;:19;;;;;;;;;;;976:127;:::o;8715:723::-;8771:13;9001:1;8992:5;:10;8988:53;;;9019:10;;;;;;;;;;;;;;;;;;;;;8988:53;9051:12;9066:5;9051:20;;9082:14;9107:78;9122:1;9114:4;:9;9107:78;;9140:8;;;;;:::i;:::-;;;;9171:2;9163:10;;;;;:::i;:::-;;;9107:78;;;9195:19;9227:6;9217:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9195:39;;9245:154;9261:1;9252:5;:10;9245:154;;9289:1;9279:11;;;;;:::i;:::-;;;9356:2;9348:5;:10;;;;:::i;:::-;9335:2;:24;;;;:::i;:::-;9322:39;;9305:6;9312;9305:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9385:2;9376:11;;;;;:::i;:::-;;;9245:154;;;9423:6;9409:21;;;;;8715:723;;;;:::o;57486:181::-;57561:12;57579:8;:13;;57600:7;57579:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57560:52;;;57631:7;57623:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;57549:118;57486:181;;:::o;13411:173::-;13467:16;13486:6;;;;;;;;;;;13467:25;;13512:8;13503:6;;:17;;;;;;;;;;;;;;;;;;13567:8;13536:40;;13557:8;13536:40;;;;;;;;;;;;13456:128;13411:173;:::o;36597:315::-;36754:28;36764:4;36770:2;36774:7;36754:9;:28::i;:::-;36801:48;36824:4;36830:2;36834:7;36843:5;36801:22;:48::i;:::-;36793:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36597:315;;;;:::o;55113:629::-;55231:13;55257:12;55307:9;55318:25;55335:7;55318:16;:25::i;:::-;55290:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55280:65;;;;;;55272:74;;55257:89;;55357:20;55380:11;55399;:18;55392:4;:25;;;;:::i;:::-;55380:38;;;;;;;;:::i;:::-;;;;;;;;55357:61;;55429:17;55456:4;55449;:11;;;;:::i;:::-;55429:31;;55488:2;55475:9;:15;55471:71;;;55507:23;;;;;;;;;;;;;;;;;;;55471:71;55569:3;55556:9;:16;55552:72;;;55589:23;;;;;;;;;;;;;;;;;;;55552:72;55651:2;55638:9;:15;55634:77;;;55670:29;;;;;;;;;;;;;;;;;;;55634:77;55728:6;55721:13;;;;;55113:629;;;;;:::o;54769:332::-;54882:13;54908:12;54958:9;54969:25;54986:7;54969:16;:25::i;:::-;54941:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54931:65;;;;;;54923:74;;54908:89;;55008:20;55031:11;55050;:18;55043:4;:25;;;;:::i;:::-;55031:38;;;;;;;;:::i;:::-;;;;;;;;55008:61;;55087:6;55080:13;;;;54769:332;;;;;:::o;44254:1912::-;44312:13;44357:1;44342:4;:11;:16;44338:31;;;44360:9;;;;;;;;;;;;;;;;44338:31;44421:19;44443:12;;;;;;;;;;;;;;;;;44421:34;;44507:18;44553:1;44548;44534:4;:11;:15;;;;:::i;:::-;44533:21;;;;:::i;:::-;44528:1;:27;;;;:::i;:::-;44507:48;;44638:20;44685:2;44672:10;:15;;;;:::i;:::-;44661:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44638:50;;44785:10;44777:6;44770:26;44880:1;44873:5;44869:13;44939:4;44990;44984:11;44975:7;44971:25;45086:2;45078:6;45074:15;45159:754;45178:6;45169:7;45166:19;45159:754;;;45278:1;45269:7;45265:15;45254:26;;45317:7;45311:14;45443:4;45435:5;45431:2;45427:14;45423:25;45413:8;45409:40;45403:47;45392:9;45384:67;45497:1;45486:9;45482:17;45469:30;;45576:4;45568:5;45564:2;45560:14;45556:25;45546:8;45542:40;45536:47;45525:9;45517:67;45630:1;45619:9;45615:17;45602:30;;45709:4;45701:5;45698:1;45693:14;45689:25;45679:8;45675:40;45669:47;45658:9;45650:67;45763:1;45752:9;45748:17;45735:30;;45842:4;45834:5;45822:25;45812:8;45808:40;45802:47;45791:9;45783:67;45896:1;45885:9;45881:17;45868:30;;45202:711;45159:754;;;45986:1;45979:4;45973:11;45969:19;46007:1;46002:54;;;;46075:1;46070:52;;;;45962:160;;46002:54;46046:6;46041:3;46037:16;46033:1;46022:9;46018:17;46011:43;46002:54;;46070:52;46114:4;46109:3;46105:14;46101:1;46090:9;46086:17;46079:41;45962:160;;44710:1423;;;;46152:6;46145:13;;;;;44254:1912;;;;:::o;854:114::-;919:7;946;:14;;;939:21;;854:114;;;:::o;43317:126::-;;;;:::o;38209:110::-;38285:26;38295:2;38299:7;38285:26;;;;;;;;;;;;:9;:26::i;:::-;38209:110;;:::o;41946:799::-;42101:4;42122:15;:2;:13;;;:15::i;:::-;42118:620;;;42174:2;42158:36;;;42195:12;:10;:12::i;:::-;42209:4;42215:7;42224:5;42158:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42154:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42417:1;42400:6;:13;:18;42396:272;;;42443:60;;;;;;;;;;:::i;:::-;;;;;;;;42396:272;42618:6;42612:13;42603:6;42599:2;42595:15;42588:38;42154:529;42291:41;;;42281:51;;;:6;:51;;;;42274:58;;;;;42118:620;42722:4;42715:11;;41946:799;;;;;;;:::o;38546:321::-;38676:18;38682:2;38686:7;38676:5;:18::i;:::-;38727:54;38758:1;38762:2;38766:7;38775:5;38727:22;:54::i;:::-;38705:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38546:321;;;:::o;14357:387::-;14417:4;14625:12;14692:7;14680:20;14672:28;;14735:1;14728:4;:8;14721:15;;;14357:387;;;:::o;39203:382::-;39297:1;39283:16;;:2;:16;;;;39275:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39356:16;39364:7;39356;:16::i;:::-;39355:17;39347:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39418:45;39447:1;39451:2;39455:7;39418:20;:45::i;:::-;39493:1;39476:9;:13;39486:2;39476:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39524:2;39505:7;:16;39513:7;39505:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39569:7;39565:2;39544:33;;39561:1;39544:33;;;;;;;;;;;;39203:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:402::-;8676:3;8697:85;8779:2;8774:3;8697:85;:::i;:::-;8690:92;;8791:93;8880:3;8791:93;:::i;:::-;8909:2;8904:3;8900:12;8893:19;;8516:402;;;:::o;8924:366::-;9066:3;9087:67;9151:2;9146:3;9087:67;:::i;:::-;9080:74;;9163:93;9252:3;9163:93;:::i;:::-;9281:2;9276:3;9272:12;9265:19;;8924:366;;;:::o;9296:::-;9438:3;9459:67;9523:2;9518:3;9459:67;:::i;:::-;9452:74;;9535:93;9624:3;9535:93;:::i;:::-;9653:2;9648:3;9644:12;9637:19;;9296:366;;;:::o;9668:::-;9810:3;9831:67;9895:2;9890:3;9831:67;:::i;:::-;9824:74;;9907:93;9996:3;9907:93;:::i;:::-;10025:2;10020:3;10016:12;10009:19;;9668:366;;;:::o;10040:402::-;10200:3;10221:85;10303:2;10298:3;10221:85;:::i;:::-;10214:92;;10315:93;10404:3;10315:93;:::i;:::-;10433:2;10428:3;10424:12;10417:19;;10040:402;;;:::o;10448:365::-;10590:3;10611:66;10675:1;10670:3;10611:66;:::i;:::-;10604:73;;10686:93;10775:3;10686:93;:::i;:::-;10804:2;10799:3;10795:12;10788:19;;10448:365;;;:::o;10819:366::-;10961:3;10982:67;11046:2;11041:3;10982:67;:::i;:::-;10975:74;;11058:93;11147:3;11058:93;:::i;:::-;11176:2;11171:3;11167:12;11160:19;;10819:366;;;:::o;11191:::-;11333:3;11354:67;11418:2;11413:3;11354:67;:::i;:::-;11347:74;;11430:93;11519:3;11430:93;:::i;:::-;11548:2;11543:3;11539:12;11532:19;;11191:366;;;:::o;11563:402::-;11723:3;11744:85;11826:2;11821:3;11744:85;:::i;:::-;11737:92;;11838:93;11927:3;11838:93;:::i;:::-;11956:2;11951:3;11947:12;11940:19;;11563:402;;;:::o;11971:366::-;12113:3;12134:67;12198:2;12193:3;12134:67;:::i;:::-;12127:74;;12210:93;12299:3;12210:93;:::i;:::-;12328:2;12323:3;12319:12;12312:19;;11971:366;;;:::o;12343:::-;12485:3;12506:67;12570:2;12565:3;12506:67;:::i;:::-;12499:74;;12582:93;12671:3;12582:93;:::i;:::-;12700:2;12695:3;12691:12;12684:19;;12343:366;;;:::o;12715:::-;12857:3;12878:67;12942:2;12937:3;12878:67;:::i;:::-;12871:74;;12954:93;13043:3;12954:93;:::i;:::-;13072:2;13067:3;13063:12;13056:19;;12715:366;;;:::o;13087:402::-;13247:3;13268:85;13350:2;13345:3;13268:85;:::i;:::-;13261:92;;13362:93;13451:3;13362:93;:::i;:::-;13480:2;13475:3;13471:12;13464:19;;13087:402;;;:::o;13495:366::-;13637:3;13658:67;13722:2;13717:3;13658:67;:::i;:::-;13651:74;;13734:93;13823:3;13734:93;:::i;:::-;13852:2;13847:3;13843:12;13836:19;;13495:366;;;:::o;13867:400::-;14027:3;14048:84;14130:1;14125:3;14048:84;:::i;:::-;14041:91;;14141:93;14230:3;14141:93;:::i;:::-;14259:1;14254:3;14250:11;14243:18;;13867:400;;;:::o;14273:366::-;14415:3;14436:67;14500:2;14495:3;14436:67;:::i;:::-;14429:74;;14512:93;14601:3;14512:93;:::i;:::-;14630:2;14625:3;14621:12;14614:19;;14273:366;;;:::o;14645:::-;14787:3;14808:67;14872:2;14867:3;14808:67;:::i;:::-;14801:74;;14884:93;14973:3;14884:93;:::i;:::-;15002:2;14997:3;14993:12;14986:19;;14645:366;;;:::o;15017:::-;15159:3;15180:67;15244:2;15239:3;15180:67;:::i;:::-;15173:74;;15256:93;15345:3;15256:93;:::i;:::-;15374:2;15369:3;15365:12;15358:19;;15017:366;;;:::o;15389:402::-;15549:3;15570:85;15652:2;15647:3;15570:85;:::i;:::-;15563:92;;15664:93;15753:3;15664:93;:::i;:::-;15782:2;15777:3;15773:12;15766:19;;15389:402;;;:::o;15797:366::-;15939:3;15960:67;16024:2;16019:3;15960:67;:::i;:::-;15953:74;;16036:93;16125:3;16036:93;:::i;:::-;16154:2;16149:3;16145:12;16138:19;;15797:366;;;:::o;16169:::-;16311:3;16332:67;16396:2;16391:3;16332:67;:::i;:::-;16325:74;;16408:93;16497:3;16408:93;:::i;:::-;16526:2;16521:3;16517:12;16510:19;;16169:366;;;:::o;16541:::-;16683:3;16704:67;16768:2;16763:3;16704:67;:::i;:::-;16697:74;;16780:93;16869:3;16780:93;:::i;:::-;16898:2;16893:3;16889:12;16882:19;;16541:366;;;:::o;16913:::-;17055:3;17076:67;17140:2;17135:3;17076:67;:::i;:::-;17069:74;;17152:93;17241:3;17152:93;:::i;:::-;17270:2;17265:3;17261:12;17254:19;;16913:366;;;:::o;17285:::-;17427:3;17448:67;17512:2;17507:3;17448:67;:::i;:::-;17441:74;;17524:93;17613:3;17524:93;:::i;:::-;17642:2;17637:3;17633:12;17626:19;;17285:366;;;:::o;17657:::-;17799:3;17820:67;17884:2;17879:3;17820:67;:::i;:::-;17813:74;;17896:93;17985:3;17896:93;:::i;:::-;18014:2;18009:3;18005:12;17998:19;;17657:366;;;:::o;18029:::-;18171:3;18192:67;18256:2;18251:3;18192:67;:::i;:::-;18185:74;;18268:93;18357:3;18268:93;:::i;:::-;18386:2;18381:3;18377:12;18370:19;;18029:366;;;:::o;18401:::-;18543:3;18564:67;18628:2;18623:3;18564:67;:::i;:::-;18557:74;;18640:93;18729:3;18640:93;:::i;:::-;18758:2;18753:3;18749:12;18742:19;;18401:366;;;:::o;18773:::-;18915:3;18936:67;19000:2;18995:3;18936:67;:::i;:::-;18929:74;;19012:93;19101:3;19012:93;:::i;:::-;19130:2;19125:3;19121:12;19114:19;;18773:366;;;:::o;19145:402::-;19305:3;19326:85;19408:2;19403:3;19326:85;:::i;:::-;19319:92;;19420:93;19509:3;19420:93;:::i;:::-;19538:2;19533:3;19529:12;19522:19;;19145:402;;;:::o;19553:398::-;19712:3;19733:83;19814:1;19809:3;19733:83;:::i;:::-;19726:90;;19825:93;19914:3;19825:93;:::i;:::-;19943:1;19938:3;19934:11;19927:18;;19553:398;;;:::o;19957:366::-;20099:3;20120:67;20184:2;20179:3;20120:67;:::i;:::-;20113:74;;20196:93;20285:3;20196:93;:::i;:::-;20314:2;20309:3;20305:12;20298:19;;19957:366;;;:::o;20329:::-;20471:3;20492:67;20556:2;20551:3;20492:67;:::i;:::-;20485:74;;20568:93;20657:3;20568:93;:::i;:::-;20686:2;20681:3;20677:12;20670:19;;20329:366;;;:::o;20701:402::-;20861:3;20882:85;20964:2;20959:3;20882:85;:::i;:::-;20875:92;;20976:93;21065:3;20976:93;:::i;:::-;21094:2;21089:3;21085:12;21078:19;;20701:402;;;:::o;21109:::-;21269:3;21290:85;21372:2;21367:3;21290:85;:::i;:::-;21283:92;;21384:93;21473:3;21384:93;:::i;:::-;21502:2;21497:3;21493:12;21486:19;;21109:402;;;:::o;21517:::-;21677:3;21698:85;21780:2;21775:3;21698:85;:::i;:::-;21691:92;;21792:93;21881:3;21792:93;:::i;:::-;21910:2;21905:3;21901:12;21894:19;;21517:402;;;:::o;21925:400::-;22085:3;22106:84;22188:1;22183:3;22106:84;:::i;:::-;22099:91;;22199:93;22288:3;22199:93;:::i;:::-;22317:1;22312:3;22308:11;22301:18;;21925:400;;;:::o;22331:402::-;22491:3;22512:85;22594:2;22589:3;22512:85;:::i;:::-;22505:92;;22606:93;22695:3;22606:93;:::i;:::-;22724:2;22719:3;22715:12;22708:19;;22331:402;;;:::o;22739:118::-;22826:24;22844:5;22826:24;:::i;:::-;22821:3;22814:37;22739:118;;:::o;22863:275::-;22995:3;23017:95;23108:3;23099:6;23017:95;:::i;:::-;23010:102;;23129:3;23122:10;;22863:275;;;;:::o;23144:435::-;23324:3;23346:95;23437:3;23428:6;23346:95;:::i;:::-;23339:102;;23458:95;23549:3;23540:6;23458:95;:::i;:::-;23451:102;;23570:3;23563:10;;23144:435;;;;;:::o;23585:1555::-;24101:3;24123:95;24214:3;24205:6;24123:95;:::i;:::-;24116:102;;24235:95;24326:3;24317:6;24235:95;:::i;:::-;24228:102;;24347:95;24438:3;24429:6;24347:95;:::i;:::-;24340:102;;24459:95;24550:3;24541:6;24459:95;:::i;:::-;24452:102;;24571:95;24662:3;24653:6;24571:95;:::i;:::-;24564:102;;24683:95;24774:3;24765:6;24683:95;:::i;:::-;24676:102;;24795:95;24886:3;24877:6;24795:95;:::i;:::-;24788:102;;24907:95;24998:3;24989:6;24907:95;:::i;:::-;24900:102;;25019:95;25110:3;25101:6;25019:95;:::i;:::-;25012:102;;25131:3;25124:10;;23585:1555;;;;;;;;;;;;:::o;25146:1877::-;25759:3;25781:95;25872:3;25863:6;25781:95;:::i;:::-;25774:102;;25893:95;25984:3;25975:6;25893:95;:::i;:::-;25886:102;;26005:95;26096:3;26087:6;26005:95;:::i;:::-;25998:102;;26117:95;26208:3;26199:6;26117:95;:::i;:::-;26110:102;;26229:95;26320:3;26311:6;26229:95;:::i;:::-;26222:102;;26341:95;26432:3;26423:6;26341:95;:::i;:::-;26334:102;;26453:95;26544:3;26535:6;26453:95;:::i;:::-;26446:102;;26565:95;26656:3;26647:6;26565:95;:::i;:::-;26558:102;;26677:95;26768:3;26759:6;26677:95;:::i;:::-;26670:102;;26789:95;26880:3;26871:6;26789:95;:::i;:::-;26782:102;;26901:96;26993:3;26983:7;26901:96;:::i;:::-;26894:103;;27014:3;27007:10;;25146:1877;;;;;;;;;;;;;;:::o;27029:541::-;27262:3;27284:148;27428:3;27284:148;:::i;:::-;27277:155;;27449:95;27540:3;27531:6;27449:95;:::i;:::-;27442:102;;27561:3;27554:10;;27029:541;;;;:::o;27576:379::-;27760:3;27782:147;27925:3;27782:147;:::i;:::-;27775:154;;27946:3;27939:10;;27576:379;;;:::o;27961:4055::-;29439:3;29461:148;29605:3;29461:148;:::i;:::-;29454:155;;29626:95;29717:3;29708:6;29626:95;:::i;:::-;29619:102;;29738:148;29882:3;29738:148;:::i;:::-;29731:155;;29903:95;29994:3;29985:6;29903:95;:::i;:::-;29896:102;;30015:148;30159:3;30015:148;:::i;:::-;30008:155;;30180:148;30324:3;30180:148;:::i;:::-;30173:155;;30345:95;30436:3;30427:6;30345:95;:::i;:::-;30338:102;;30457:148;30601:3;30457:148;:::i;:::-;30450:155;;30622:95;30713:3;30704:6;30622:95;:::i;:::-;30615:102;;30734:148;30878:3;30734:148;:::i;:::-;30727:155;;30899:95;30990:3;30981:6;30899:95;:::i;:::-;30892:102;;31011:148;31155:3;31011:148;:::i;:::-;31004:155;;31176:95;31267:3;31258:6;31176:95;:::i;:::-;31169:102;;31288:148;31432:3;31288:148;:::i;:::-;31281:155;;31453:95;31544:3;31535:6;31453:95;:::i;:::-;31446:102;;31565:148;31709:3;31565:148;:::i;:::-;31558:155;;31730:95;31821:3;31812:6;31730:95;:::i;:::-;31723:102;;31842:148;31986:3;31842:148;:::i;:::-;31835:155;;32007:3;32000:10;;27961:4055;;;;;;;;;;;:::o;32022:541::-;32255:3;32277:148;32421:3;32277:148;:::i;:::-;32270:155;;32442:95;32533:3;32524:6;32442:95;:::i;:::-;32435:102;;32554:3;32547:10;;32022:541;;;;:::o;32569:222::-;32662:4;32700:2;32689:9;32685:18;32677:26;;32713:71;32781:1;32770:9;32766:17;32757:6;32713:71;:::i;:::-;32569:222;;;;:::o;32797:640::-;32992:4;33030:3;33019:9;33015:19;33007:27;;33044:71;33112:1;33101:9;33097:17;33088:6;33044:71;:::i;:::-;33125:72;33193:2;33182:9;33178:18;33169:6;33125:72;:::i;:::-;33207;33275:2;33264:9;33260:18;33251:6;33207:72;:::i;:::-;33326:9;33320:4;33316:20;33311:2;33300:9;33296:18;33289:48;33354:76;33425:4;33416:6;33354:76;:::i;:::-;33346:84;;32797:640;;;;;;;:::o;33443:210::-;33530:4;33568:2;33557:9;33553:18;33545:26;;33581:65;33643:1;33632:9;33628:17;33619:6;33581:65;:::i;:::-;33443:210;;;;:::o;33659:313::-;33772:4;33810:2;33799:9;33795:18;33787:26;;33859:9;33853:4;33849:20;33845:1;33834:9;33830:17;33823:47;33887:78;33960:4;33951:6;33887:78;:::i;:::-;33879:86;;33659:313;;;;:::o;33978:419::-;34144:4;34182:2;34171:9;34167:18;34159:26;;34231:9;34225:4;34221:20;34217:1;34206:9;34202:17;34195:47;34259:131;34385:4;34259:131;:::i;:::-;34251:139;;33978:419;;;:::o;34403:::-;34569:4;34607:2;34596:9;34592:18;34584:26;;34656:9;34650:4;34646:20;34642:1;34631:9;34627:17;34620:47;34684:131;34810:4;34684:131;:::i;:::-;34676:139;;34403:419;;;:::o;34828:::-;34994:4;35032:2;35021:9;35017:18;35009:26;;35081:9;35075:4;35071:20;35067:1;35056:9;35052:17;35045:47;35109:131;35235:4;35109:131;:::i;:::-;35101:139;;34828:419;;;:::o;35253:::-;35419:4;35457:2;35446:9;35442:18;35434:26;;35506:9;35500:4;35496:20;35492:1;35481:9;35477:17;35470:47;35534:131;35660:4;35534:131;:::i;:::-;35526:139;;35253:419;;;:::o;35678:::-;35844:4;35882:2;35871:9;35867:18;35859:26;;35931:9;35925:4;35921:20;35917:1;35906:9;35902:17;35895:47;35959:131;36085:4;35959:131;:::i;:::-;35951:139;;35678:419;;;:::o;36103:::-;36269:4;36307:2;36296:9;36292:18;36284:26;;36356:9;36350:4;36346:20;36342:1;36331:9;36327:17;36320:47;36384:131;36510:4;36384:131;:::i;:::-;36376:139;;36103:419;;;:::o;36528:::-;36694:4;36732:2;36721:9;36717:18;36709:26;;36781:9;36775:4;36771:20;36767:1;36756:9;36752:17;36745:47;36809:131;36935:4;36809:131;:::i;:::-;36801:139;;36528:419;;;:::o;36953:::-;37119:4;37157:2;37146:9;37142:18;37134:26;;37206:9;37200:4;37196:20;37192:1;37181:9;37177:17;37170:47;37234:131;37360:4;37234:131;:::i;:::-;37226:139;;36953:419;;;:::o;37378:::-;37544:4;37582:2;37571:9;37567:18;37559:26;;37631:9;37625:4;37621:20;37617:1;37606:9;37602:17;37595:47;37659:131;37785:4;37659:131;:::i;:::-;37651:139;;37378:419;;;:::o;37803:::-;37969:4;38007:2;37996:9;37992:18;37984:26;;38056:9;38050:4;38046:20;38042:1;38031:9;38027:17;38020:47;38084:131;38210:4;38084:131;:::i;:::-;38076:139;;37803:419;;;:::o;38228:::-;38394:4;38432:2;38421:9;38417:18;38409:26;;38481:9;38475:4;38471:20;38467:1;38456:9;38452:17;38445:47;38509:131;38635:4;38509:131;:::i;:::-;38501:139;;38228:419;;;:::o;38653:::-;38819:4;38857:2;38846:9;38842:18;38834:26;;38906:9;38900:4;38896:20;38892:1;38881:9;38877:17;38870:47;38934:131;39060:4;38934:131;:::i;:::-;38926:139;;38653:419;;;:::o;39078:::-;39244:4;39282:2;39271:9;39267:18;39259:26;;39331:9;39325:4;39321:20;39317:1;39306:9;39302:17;39295:47;39359:131;39485:4;39359:131;:::i;:::-;39351:139;;39078:419;;;:::o;39503:::-;39669:4;39707:2;39696:9;39692:18;39684:26;;39756:9;39750:4;39746:20;39742:1;39731:9;39727:17;39720:47;39784:131;39910:4;39784:131;:::i;:::-;39776:139;;39503:419;;;:::o;39928:::-;40094:4;40132:2;40121:9;40117:18;40109:26;;40181:9;40175:4;40171:20;40167:1;40156:9;40152:17;40145:47;40209:131;40335:4;40209:131;:::i;:::-;40201:139;;39928:419;;;:::o;40353:::-;40519:4;40557:2;40546:9;40542:18;40534:26;;40606:9;40600:4;40596:20;40592:1;40581:9;40577:17;40570:47;40634:131;40760:4;40634:131;:::i;:::-;40626:139;;40353:419;;;:::o;40778:::-;40944:4;40982:2;40971:9;40967:18;40959:26;;41031:9;41025:4;41021:20;41017:1;41006:9;41002:17;40995:47;41059:131;41185:4;41059:131;:::i;:::-;41051:139;;40778:419;;;:::o;41203:::-;41369:4;41407:2;41396:9;41392:18;41384:26;;41456:9;41450:4;41446:20;41442:1;41431:9;41427:17;41420:47;41484:131;41610:4;41484:131;:::i;:::-;41476:139;;41203:419;;;:::o;41628:::-;41794:4;41832:2;41821:9;41817:18;41809:26;;41881:9;41875:4;41871:20;41867:1;41856:9;41852:17;41845:47;41909:131;42035:4;41909:131;:::i;:::-;41901:139;;41628:419;;;:::o;42053:::-;42219:4;42257:2;42246:9;42242:18;42234:26;;42306:9;42300:4;42296:20;42292:1;42281:9;42277:17;42270:47;42334:131;42460:4;42334:131;:::i;:::-;42326:139;;42053:419;;;:::o;42478:::-;42644:4;42682:2;42671:9;42667:18;42659:26;;42731:9;42725:4;42721:20;42717:1;42706:9;42702:17;42695:47;42759:131;42885:4;42759:131;:::i;:::-;42751:139;;42478:419;;;:::o;42903:::-;43069:4;43107:2;43096:9;43092:18;43084:26;;43156:9;43150:4;43146:20;43142:1;43131:9;43127:17;43120:47;43184:131;43310:4;43184:131;:::i;:::-;43176:139;;42903:419;;;:::o;43328:::-;43494:4;43532:2;43521:9;43517:18;43509:26;;43581:9;43575:4;43571:20;43567:1;43556:9;43552:17;43545:47;43609:131;43735:4;43609:131;:::i;:::-;43601:139;;43328:419;;;:::o;43753:::-;43919:4;43957:2;43946:9;43942:18;43934:26;;44006:9;44000:4;43996:20;43992:1;43981:9;43977:17;43970:47;44034:131;44160:4;44034:131;:::i;:::-;44026:139;;43753:419;;;:::o;44178:222::-;44271:4;44309:2;44298:9;44294:18;44286:26;;44322:71;44390:1;44379:9;44375:17;44366:6;44322:71;:::i;:::-;44178:222;;;;:::o;44406:129::-;44440:6;44467:20;;:::i;:::-;44457:30;;44496:33;44524:4;44516:6;44496:33;:::i;:::-;44406:129;;;:::o;44541:75::-;44574:6;44607:2;44601:9;44591:19;;44541:75;:::o;44622:307::-;44683:4;44773:18;44765:6;44762:30;44759:56;;;44795:18;;:::i;:::-;44759:56;44833:29;44855:6;44833:29;:::i;:::-;44825:37;;44917:4;44911;44907:15;44899:23;;44622:307;;;:::o;44935:308::-;44997:4;45087:18;45079:6;45076:30;45073:56;;;45109:18;;:::i;:::-;45073:56;45147:29;45169:6;45147:29;:::i;:::-;45139:37;;45231:4;45225;45221:15;45213:23;;44935:308;;;:::o;45249:98::-;45300:6;45334:5;45328:12;45318:22;;45249:98;;;:::o;45353:99::-;45405:6;45439:5;45433:12;45423:22;;45353:99;;;:::o;45458:168::-;45541:11;45575:6;45570:3;45563:19;45615:4;45610:3;45606:14;45591:29;;45458:168;;;;:::o;45632:147::-;45733:11;45770:3;45755:18;;45632:147;;;;:::o;45785:169::-;45869:11;45903:6;45898:3;45891:19;45943:4;45938:3;45934:14;45919:29;;45785:169;;;;:::o;45960:148::-;46062:11;46099:3;46084:18;;45960:148;;;;:::o;46114:305::-;46154:3;46173:20;46191:1;46173:20;:::i;:::-;46168:25;;46207:20;46225:1;46207:20;:::i;:::-;46202:25;;46361:1;46293:66;46289:74;46286:1;46283:81;46280:107;;;46367:18;;:::i;:::-;46280:107;46411:1;46408;46404:9;46397:16;;46114:305;;;;:::o;46425:185::-;46465:1;46482:20;46500:1;46482:20;:::i;:::-;46477:25;;46516:20;46534:1;46516:20;:::i;:::-;46511:25;;46555:1;46545:35;;46560:18;;:::i;:::-;46545:35;46602:1;46599;46595:9;46590:14;;46425:185;;;;:::o;46616:348::-;46656:7;46679:20;46697:1;46679:20;:::i;:::-;46674:25;;46713:20;46731:1;46713:20;:::i;:::-;46708:25;;46901:1;46833:66;46829:74;46826:1;46823:81;46818:1;46811:9;46804:17;46800:105;46797:131;;;46908:18;;:::i;:::-;46797:131;46956:1;46953;46949:9;46938:20;;46616:348;;;;:::o;46970:191::-;47010:4;47030:20;47048:1;47030:20;:::i;:::-;47025:25;;47064:20;47082:1;47064:20;:::i;:::-;47059:25;;47103:1;47100;47097:8;47094:34;;;47108:18;;:::i;:::-;47094:34;47153:1;47150;47146:9;47138:17;;46970:191;;;;:::o;47167:96::-;47204:7;47233:24;47251:5;47233:24;:::i;:::-;47222:35;;47167:96;;;:::o;47269:90::-;47303:7;47346:5;47339:13;47332:21;47321:32;;47269:90;;;:::o;47365:149::-;47401:7;47441:66;47434:5;47430:78;47419:89;;47365:149;;;:::o;47520:126::-;47557:7;47597:42;47590:5;47586:54;47575:65;;47520:126;;;:::o;47652:77::-;47689:7;47718:5;47707:16;;47652:77;;;:::o;47735:154::-;47819:6;47814:3;47809;47796:30;47881:1;47872:6;47867:3;47863:16;47856:27;47735:154;;;:::o;47895:307::-;47963:1;47973:113;47987:6;47984:1;47981:13;47973:113;;;48072:1;48067:3;48063:11;48057:18;48053:1;48048:3;48044:11;48037:39;48009:2;48006:1;48002:10;47997:15;;47973:113;;;48104:6;48101:1;48098:13;48095:101;;;48184:1;48175:6;48170:3;48166:16;48159:27;48095:101;47944:258;47895:307;;;:::o;48208:320::-;48252:6;48289:1;48283:4;48279:12;48269:22;;48336:1;48330:4;48326:12;48357:18;48347:81;;48413:4;48405:6;48401:17;48391:27;;48347:81;48475:2;48467:6;48464:14;48444:18;48441:38;48438:84;;;48494:18;;:::i;:::-;48438:84;48259:269;48208:320;;;:::o;48534:281::-;48617:27;48639:4;48617:27;:::i;:::-;48609:6;48605:40;48747:6;48735:10;48732:22;48711:18;48699:10;48696:34;48693:62;48690:88;;;48758:18;;:::i;:::-;48690:88;48798:10;48794:2;48787:22;48577:238;48534:281;;:::o;48821:233::-;48860:3;48883:24;48901:5;48883:24;:::i;:::-;48874:33;;48929:66;48922:5;48919:77;48916:103;;;48999:18;;:::i;:::-;48916:103;49046:1;49039:5;49035:13;49028:20;;48821:233;;;:::o;49060:176::-;49092:1;49109:20;49127:1;49109:20;:::i;:::-;49104:25;;49143:20;49161:1;49143:20;:::i;:::-;49138:25;;49182:1;49172:35;;49187:18;;:::i;:::-;49172:35;49228:1;49225;49221:9;49216:14;;49060:176;;;;:::o;49242:180::-;49290:77;49287:1;49280:88;49387:4;49384:1;49377:15;49411:4;49408:1;49401:15;49428:180;49476:77;49473:1;49466:88;49573:4;49570:1;49563:15;49597:4;49594:1;49587:15;49614:180;49662:77;49659:1;49652:88;49759:4;49756:1;49749:15;49783:4;49780:1;49773:15;49800:180;49848:77;49845:1;49838:88;49945:4;49942:1;49935:15;49969:4;49966:1;49959:15;49986:180;50034:77;50031:1;50024:88;50131:4;50128:1;50121:15;50155:4;50152:1;50145:15;50172:117;50281:1;50278;50271:12;50295:117;50404:1;50401;50394:12;50418:117;50527:1;50524;50517:12;50541:117;50650:1;50647;50640:12;50664:102;50705:6;50756:2;50752:7;50747:2;50740:5;50736:14;50732:28;50722:38;;50664:102;;;:::o;50772:315::-;50912:66;50908:1;50900:6;50896:14;50889:90;51013:66;51008:2;51000:6;50996:15;50989:91;50772:315;:::o;51093:237::-;51233:34;51229:1;51221:6;51217:14;51210:58;51302:20;51297:2;51289:6;51285:15;51278:45;51093:237;:::o;51336:225::-;51476:34;51472:1;51464:6;51460:14;51453:58;51545:8;51540:2;51532:6;51528:15;51521:33;51336:225;:::o;51567:178::-;51707:30;51703:1;51695:6;51691:14;51684:54;51567:178;:::o;51751:315::-;51891:66;51887:1;51879:6;51875:14;51868:90;51992:66;51987:2;51979:6;51975:15;51968:91;51751:315;:::o;52072:158::-;52212:10;52208:1;52200:6;52196:14;52189:34;52072:158;:::o;52236:223::-;52376:34;52372:1;52364:6;52360:14;52353:58;52445:6;52440:2;52432:6;52428:15;52421:31;52236:223;:::o;52465:175::-;52605:27;52601:1;52593:6;52589:14;52582:51;52465:175;:::o;52646:315::-;52786:66;52782:1;52774:6;52770:14;52763:90;52887:66;52882:2;52874:6;52870:15;52863:91;52646:315;:::o;52967:164::-;53107:16;53103:1;53095:6;53091:14;53084:40;52967:164;:::o;53137:231::-;53277:34;53273:1;53265:6;53261:14;53254:58;53346:14;53341:2;53333:6;53329:15;53322:39;53137:231;:::o;53374:167::-;53514:19;53510:1;53502:6;53498:14;53491:43;53374:167;:::o;53547:315::-;53687:66;53683:1;53675:6;53671:14;53664:90;53788:66;53783:2;53775:6;53771:15;53764:91;53547:315;:::o;53868:243::-;54008:34;54004:1;53996:6;53992:14;53985:58;54077:26;54072:2;54064:6;54060:15;54053:51;53868:243;:::o;54117:214::-;54257:66;54253:1;54245:6;54241:14;54234:90;54117:214;:::o;54337:229::-;54477:34;54473:1;54465:6;54461:14;54454:58;54546:12;54541:2;54533:6;54529:15;54522:37;54337:229;:::o;54572:228::-;54712:34;54708:1;54700:6;54696:14;54689:58;54781:11;54776:2;54768:6;54764:15;54757:36;54572:228;:::o;54806:182::-;54946:34;54942:1;54934:6;54930:14;54923:58;54806:182;:::o;54994:315::-;55134:66;55130:1;55122:6;55118:14;55111:90;55235:66;55230:2;55222:6;55218:15;55211:91;54994:315;:::o;55315:231::-;55455:34;55451:1;55443:6;55439:14;55432:58;55524:14;55519:2;55511:6;55507:15;55500:39;55315:231;:::o;55552:182::-;55692:34;55688:1;55680:6;55676:14;55669:58;55552:182;:::o;55740:228::-;55880:34;55876:1;55868:6;55864:14;55857:58;55949:11;55944:2;55936:6;55932:15;55925:36;55740:228;:::o;55974:234::-;56114:34;56110:1;56102:6;56098:14;56091:58;56183:17;56178:2;56170:6;56166:15;56159:42;55974:234;:::o;56214:166::-;56354:18;56350:1;56342:6;56338:14;56331:42;56214:166;:::o;56386:::-;56526:18;56522:1;56514:6;56510:14;56503:42;56386:166;:::o;56558:167::-;56698:19;56694:1;56686:6;56682:14;56675:43;56558:167;:::o;56731:::-;56871:19;56867:1;56859:6;56855:14;56848:43;56731:167;:::o;56904:220::-;57044:34;57040:1;57032:6;57028:14;57021:58;57113:3;57108:2;57100:6;57096:15;57089:28;56904:220;:::o;57130:179::-;57270:31;57266:1;57258:6;57254:14;57247:55;57130:179;:::o;57315:114::-;;:::o;57435:166::-;57575:18;57571:1;57563:6;57559:14;57552:42;57435:166;:::o;57607:236::-;57747:34;57743:1;57735:6;57731:14;57724:58;57816:19;57811:2;57803:6;57799:15;57792:44;57607:236;:::o;57849:315::-;57989:66;57985:1;57977:6;57973:14;57966:90;58090:66;58085:2;58077:6;58073:15;58066:91;57849:315;:::o;58170:384::-;58310:66;58306:1;58298:6;58294:14;58287:90;58411:34;58406:2;58398:6;58394:15;58387:59;58480:66;58475:2;58467:6;58463:15;58456:91;58170:384;:::o;58560:214::-;58700:66;58696:1;58688:6;58684:14;58677:90;58560:214;:::o;58780:::-;58920:66;58916:1;58908:6;58904:14;58897:90;58780:214;:::o;59000:176::-;59140:28;59136:1;59128:6;59124:14;59117:52;59000:176;:::o;59182:122::-;59255:24;59273:5;59255:24;:::i;:::-;59248:5;59245:35;59235:63;;59294:1;59291;59284:12;59235:63;59182:122;:::o;59310:116::-;59380:21;59395:5;59380:21;:::i;:::-;59373:5;59370:32;59360:60;;59416:1;59413;59406:12;59360:60;59310:116;:::o;59432:120::-;59504:23;59521:5;59504:23;:::i;:::-;59497:5;59494:34;59484:62;;59542:1;59539;59532:12;59484:62;59432:120;:::o;59558:122::-;59631:24;59649:5;59631:24;:::i;:::-;59624:5;59621:35;59611:63;;59670:1;59667;59660:12;59611:63;59558:122;:::o

Swarm Source

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